package com.ruoyi.ccdi.project.mapper;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.ccdi.project.domain.CcdiProject;
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectAbnormalAccountQueryDTO;
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectEmployeeCreditNegativeQueryDTO;
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectExternalPersonQueryDTO;
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectExternalRiskModelPeopleQueryDTO;
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectRiskModelPeopleQueryDTO;
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectRiskPeopleQueryDTO;
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectSuspiciousTransactionQueryDTO;
import com.ruoyi.ccdi.project.domain.dto.CcdiProjectUnsubmittedAccountQueryDTO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectAbnormalAccountItemVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiBankStatementListVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectEmployeeCreditNegativeItemVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectEmployeeRiskAggregateVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectExternalRiskSummaryVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectExternalPersonWarningItemVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectPersonAnalysisBasicInfoVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectPersonAnalysisObjectRecordVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectOverviewReportModelSummaryVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectOverviewReportSuspiciousTransactionVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectOverviewReportUploadSubjectVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectRiskHitTagVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectRiskModelCardVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectRiskModelPeopleItemVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectSuspiciousTransactionItemVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectUnsubmittedAccountFlowVO;
import com.ruoyi.ccdi.project.domain.vo.CcdiProjectUnsubmittedAccountItemVO;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

/**
 * 结果总览Mapper
 */
@Mapper
public interface CcdiProjectOverviewMapper {

    /**
     * 查询仪表盘基础数据
     *
     * @param projectId 项目ID
     * @return 项目基础数据
     */
    CcdiProject selectDashboardBaseByProjectId(@Param("projectId") Long projectId);

    /**
     * 查询风险人员总览
     *
     * @param page 分页参数
     * @param query 查询条件
     * @return 风险人员聚合分页结果
     */
    Page<CcdiProjectEmployeeRiskAggregateVO> selectRiskPeopleOverviewPage(
        Page<CcdiProjectEmployeeRiskAggregateVO> page,
        @Param("query") CcdiProjectRiskPeopleQueryDTO query
    );

    /**
     * 查询风险人员总览导出列表
     *
     * @param projectId 项目ID
     * @return 风险人员聚合列表
     */
    List<CcdiProjectEmployeeRiskAggregateVO> selectRiskPeopleOverviewList(@Param("projectId") Long projectId);

    /**
     * 查询中高风险TOP10
     *
     * @param projectId 项目ID
     * @return 中高风险人员列表
     */
    List<CcdiProjectEmployeeRiskAggregateVO> selectTopRiskPeopleByProjectId(@Param("projectId") Long projectId);

    /**
     * 查询风险模型卡片
     *
     * @param projectId 项目ID
     * @return 风险模型卡片列表
     */
    List<CcdiProjectRiskModelCardVO> selectRiskModelCardsByProjectId(@Param("projectId") Long projectId);

    /**
     * 查询报告上传主体汇总
     *
     * @param projectId 项目ID
     * @return 上传主体汇总
     */
    List<CcdiProjectOverviewReportUploadSubjectVO> selectReportUploadSubjects(@Param("projectId") Long projectId);

    /**
     * 查询报告风险模型汇总
     *
     * @param projectId 项目ID
     * @return 风险模型汇总
     */
    List<CcdiProjectOverviewReportModelSummaryVO> selectReportRiskModelSummaries(@Param("projectId") Long projectId);

    /**
     * 查询报告风险人员与异常点
     *
     * @param projectId 项目ID
     * @return 风险人员与异常点
     */
    List<CcdiProjectRiskModelPeopleItemVO> selectReportRiskPeople(@Param("projectId") Long projectId);

    /**
     * 查询报告涉疑交易明细
     *
     * @param query 查询条件
     * @return 涉疑交易明细
     */
    List<CcdiProjectOverviewReportSuspiciousTransactionVO> selectReportSuspiciousTransactionList(
        @Param("query") CcdiProjectSuspiciousTransactionQueryDTO query
    );

    /**
     * 分页查询风险模型命中人员
     *
     * @param page 分页参数
     * @param query 查询条件
     * @return 命中人员分页结果
     */
    Page<CcdiProjectRiskModelPeopleItemVO> selectRiskModelPeoplePage(
        Page<CcdiProjectRiskModelPeopleItemVO> page,
        @Param("query") CcdiProjectRiskModelPeopleQueryDTO query
    );

    /**
     * 查询风险模型命中人员导出列表
     *
     * @param query 查询条件
     * @return 命中人员列表
     */
    List<CcdiProjectRiskModelPeopleItemVO> selectRiskModelPeopleList(
        @Param("query") CcdiProjectRiskModelPeopleQueryDTO query
    );

    /**
     * 分页查询外部人员预警
     *
     * @param page 分页参数
     * @param query 查询条件
     * @return 外部人员预警分页
     */
    Page<CcdiProjectExternalPersonWarningItemVO> selectExternalPersonWarningPage(
        Page<CcdiProjectExternalPersonWarningItemVO> page,
        @Param("query") CcdiProjectExternalPersonQueryDTO query
    );

    /**
     * 查询外部人员预警导出列表
     *
     * @param projectId 项目ID
     * @return 外部人员预警列表
     */
    List<CcdiProjectExternalPersonWarningItemVO> selectExternalPersonWarningList(@Param("projectId") Long projectId);

    /**
     * 查询外部人员风险等级汇总
     *
     * @param projectId 项目ID
     * @return 外部人员风险等级汇总
     */
    CcdiProjectExternalRiskSummaryVO selectExternalRiskSummaryByProjectId(@Param("projectId") Long projectId);

    /**
     * 判断项目是否存在外部人员主体
     *
     * @param projectId 项目ID
     * @return 存在时返回1，否则返回空
     */
    Integer selectExternalPersonSubjectExistsByProjectId(@Param("projectId") Long projectId);

    /**
     * 查询外部人员预警模型卡片
     *
     * @param projectId 项目ID
     * @return 模型卡片
     */
    List<CcdiProjectRiskModelCardVO> selectExternalRiskModelCardsByProjectId(@Param("projectId") Long projectId);

    /**
     * 分页查询外部人员模型命中人员
     *
     * @param page 分页参数
     * @param query 查询条件
     * @return 命中人员分页
     */
    Page<CcdiProjectRiskModelPeopleItemVO> selectExternalRiskModelPeoplePage(
        Page<CcdiProjectRiskModelPeopleItemVO> page,
        @Param("query") CcdiProjectExternalRiskModelPeopleQueryDTO query
    );

    /**
     * 查询外部人员模型命中人员导出列表
     *
     * @param query 查询条件
     * @return 命中人员列表
     */
    List<CcdiProjectRiskModelPeopleItemVO> selectExternalRiskModelPeopleList(
        @Param("query") CcdiProjectExternalRiskModelPeopleQueryDTO query
    );

    /**
     * 查询外部人员命中标签
     *
     * @param projectId 项目ID
     * @param certNo 外部人员证件号
     * @param selectedModelCodes 已选模型编码CSV，可为空
     * @return 命中标签列表
     */
    List<CcdiProjectRiskHitTagVO> selectExternalRiskHitTagsByScope(
        @Param("projectId") Long projectId,
        @Param("certNo") String certNo,
        @Param("selectedModelCodes") String selectedModelCodes
    );

    /**
     * 分页查询涉疑交易明细
     *
     * @param page 分页参数
     * @param query 查询条件
     * @return 分页结果
     */
    Page<CcdiProjectSuspiciousTransactionItemVO> selectSuspiciousTransactionPage(
        Page<CcdiProjectSuspiciousTransactionItemVO> page,
        @Param("query") CcdiProjectSuspiciousTransactionQueryDTO query
    );

    /**
     * 分页查询项目员工负面征信
     *
     * @param page 分页参数
     * @param query 查询条件
     * @return 分页结果
     */
    Page<CcdiProjectEmployeeCreditNegativeItemVO> selectEmployeeCreditNegativePage(
        Page<CcdiProjectEmployeeCreditNegativeItemVO> page,
        @Param("query") CcdiProjectEmployeeCreditNegativeQueryDTO query
    );

    /**
     * 分页查询异常账户人员信息
     *
     * @param page 分页参数
     * @param query 查询条件
     * @return 分页结果
     */
    Page<CcdiProjectAbnormalAccountItemVO> selectAbnormalAccountPage(
        Page<CcdiProjectAbnormalAccountItemVO> page,
        @Param("query") CcdiProjectAbnormalAccountQueryDTO query
    );

    /**
     * 查询异常账户人员信息导出列表
     *
     * @param projectId 项目ID
     * @return 导出列表
     */
    List<CcdiProjectAbnormalAccountItemVO> selectAbnormalAccountList(@Param("projectId") Long projectId);

    /**
     * 查询未提交账户列表
     *
     * @param query 查询条件
     * @return 未提交账户列表
     */
    List<CcdiProjectUnsubmittedAccountItemVO> selectUnsubmittedAccountList(
        @Param("query") CcdiProjectUnsubmittedAccountQueryDTO query
    );

    /**
     * 查询未提交账户流水
     *
     * @param query 查询条件
     * @return 未提交账户流水
     */
    List<CcdiProjectUnsubmittedAccountFlowVO> selectUnsubmittedAccountFlowList(
        @Param("query") CcdiProjectUnsubmittedAccountQueryDTO query
    );

    /**
     * 查询项目员工负面征信导出列表
     *
     * @param projectId 项目ID
     * @return 导出列表
     */
    List<CcdiProjectEmployeeCreditNegativeItemVO> selectEmployeeCreditNegativeList(@Param("projectId") Long projectId);

    /**
     * 查询涉疑交易导出列表
     *
     * @param query 查询条件
     * @return 导出列表
     */
    List<CcdiProjectSuspiciousTransactionItemVO> selectSuspiciousTransactionList(
        @Param("query") CcdiProjectSuspiciousTransactionQueryDTO query
    );

    /**
     * 按员工范围查询命中标签
     *
     * @param projectId 项目ID
     * @param staffIdCard 员工身份证号
     * @param selectedModelCodes 已选模型编码CSV，可为空
     * @return 命中标签列表
     */
    List<CcdiProjectRiskHitTagVO> selectRiskHitTagsByScope(
        @Param("projectId") Long projectId,
        @Param("staffIdCard") String staffIdCard,
        @Param("selectedModelCodes") String selectedModelCodes
    );

    /**
     * 查询项目分析基础信息
     *
     * @param projectId 项目ID
     * @param staffIdCard 员工身份证号
     * @return 项目分析基础信息
     */
    CcdiProjectPersonAnalysisBasicInfoVO selectPersonAnalysisBasicInfo(
        @Param("projectId") Long projectId,
        @Param("staffIdCard") String staffIdCard
    );

    /**
     * 查询项目分析流水异常明细
     *
     * @param projectId 项目ID
     * @param staffIdCard 员工身份证号
     * @return 流水异常明细
     */
    List<CcdiBankStatementListVO> selectPersonAnalysisStatementRows(
        @Param("projectId") Long projectId,
        @Param("staffIdCard") String staffIdCard
    );

    /**
     * 查询项目分析对象型异常记录
     *
     * @param projectId 项目ID
     * @param staffIdCard 员工身份证号
     * @return 对象型异常记录
     */
    List<CcdiProjectPersonAnalysisObjectRecordVO> selectPersonAnalysisObjectRows(
        @Param("projectId") Long projectId,
        @Param("staffIdCard") String staffIdCard
    );

    /**
     * 查询项目风险人数汇总
     *
     * @param projectId 项目ID
     * @return 风险人数汇总
     */
    Map<String, Object> selectRiskCountSummaryByProjectId(@Param("projectId") Long projectId);

}
