package jnpf.cultivate.mapper;


import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import jnpf.model.cultivate.dto.learn.BatchCommonCountDto;
import jnpf.model.cultivate.dto.statistics.InnerCultivateStatisticsDTO;
import jnpf.model.cultivate.dto.statistics.InnerExamStatisticsForOrgDTO;
import jnpf.model.cultivate.dto.statistics.InnerExamStatisticsForPersonDTO;
import jnpf.model.cultivate.po.exam.FtbCultivateExamUser;
import jnpf.model.cultivate.req.exam.*;
import jnpf.model.cultivate.resp.*;
import jnpf.model.cultivate.v2.exam.req.V2ExamStatisticsForOrgReq;
import jnpf.model.cultivate.v2.exam.req.V2ExamStatisticsForPersonReq;
import jnpf.model.cultivate.v2.exam.vo.*;
import jnpf.model.cultivate.v2.course.vo.UserLearningStatusVo;
import org.apache.ibatis.annotations.Param;

import java.util.List;
/**
 * 用户考试记录表mapper
 *
 * @author xgl
 * @create 2024-09-29
 */
public interface FtbCultivateExamUserMapper extends BaseMapper<FtbCultivateExamUser> {
    /**
     * 查询我的考试列表
     *
     * @param page
     * @param params
     * @return
     */
    Page<AppExamListVo> pagingQueryMyExamList(@Param("page") Page<FtbCultivateExamUser> page
            , @Param("params") QueryMyExamListReq params);
    /**
     * 查询需要提醒的岗位考试的列表
     * @userId 用户ID
     * @return
     */
    List<AppExamListVo> queryAlertPostionIdentify(@Param("userId") String userId);

    /**
     * 根据用户ID 查询考试列表
     * @param userId 用户ID
     * @param page
     * @return
     */
    Page<AppExamListVo> pagingQueryExamListForUserId(@Param("page") Page<FtbCultivateExamUser> page
            , @Param("userId") String userId);

    /**
     * 查询待我批阅的考试列表
     *
     * @param page
     * @param params
     * @return
     */
    Page<AppExamListVo> pagingQueryWaitMyExamList(@Param("page") Page<FtbCultivateExamUser> page
            , @Param("params") QueryWaitMyExamListReq params,@Param("managerUserIds") List<String> managerUserIds);

    /**
     * 查询我已经完成的批阅
     *
     * @param page
     * @param params
     * @return
     */
    Page<AppExamListVo> pagingQueryMyCompleteExamList(@Param("page") Page<FtbCultivateExamUser> page
            , @Param("params") QueryMyCompleteExamListReq params);


    /**
     * 查询过期的考试列表
     *
     * @param page
     * @param params
     * @return
     */
    Page<AppExamListVo> pagingQueryExpireExamList(@Param("page") Page<FtbCultivateExamUser> page
            , @Param("params") QueryExpireExamListReq params,@Param("managerUserIds") List<String> managerUserIds);


    /**
     * 根据用户ID和岗位ID 过滤考试列表
     *
     * @param page
     * @param params
     * @return
     */
    Page<PositionExamDto> pagingQueryExamList(@Param("page") Page<FtbCultivateExamUser> page
            , @Param("params") QueryUserExamListDto params);

    /**
     * 根据用户ID和岗位ID 过滤考试列表
     *
     * @param page
     * @param params
     * @return
     */
    Page<PositionExamDto> pagingQueryExamListByPosition(@Param("page") Page<FtbCultivateExamUser> page
            , @Param("params") QueryUserExamListDto params);


    /**
     * 查询待我批阅的考试列表
     *
     * @param params
     * @return
     */
    int queryWaitMyExamNum(@Param("params") QueryWaitMyExamListReq params);

    /**
     * 查询我已经完成的批阅
     *
     * @param params
     * @return
     */
    int queryMyCompleteExamNum(@Param("params") QueryMyCompleteExamListReq params);


    /**
     * 查询过期的考试列表
     *
     * @param params
     * @return
     */
    int queryExpireExamNum(@Param("params") QueryExpireExamListReq params);

    /**
     * 查询一段时间的内的平均分数排行榜
     * @param dto
     * @return
     */
    List<UserRankingVo> queryAvgScore(@Param("dto") InnerCultivateStatisticsDTO dto);

    /**
     * 查询一个考试下面的 按照分数最高排序
     *
     * @param page
     * @param params
     * @return
     */
    Page<UserRankingVo> pagingQueryRankingExamList(@Param("page") Page<FtbCultivateExamUser> page
            , @Param("params") QueryExamRankListReq params, @Param("examId") String examId);

    /**
     * 查询用户一个考试的列表
     * @param examId 考试id
     * @param userId 用户id
     * @return
     */
    List<UserRankingVo> queryMyRank(@Param("examId") String examId, @Param("userId") String userId);

    /**
     * 考试个人统计分析列表
     * @param page
     * @param params
     * @return
     */
    Page<ExamStatisticsForPersonVo> queryExamStatisticsForPerson(@Param("page") Page<FtbCultivateExamUser> page, @Param("params") InnerExamStatisticsForPersonDTO params);

    /**
     * 考试组织统计分析列表
     * @param dto
     * @return
     */
    List<AppExamListVo> countForOrg(@Param("dto") InnerExamStatisticsForOrgDTO dto);

    /**
     * 考试组织统计分析列表
     * @param dto
     * @return
     */
    List<FtbCultivateExamUser> webStatisticsForOrg(@Param("dto") InnerCultivateStatisticsDTO dto);
    /**
     * 根据考试ID查询待考试的列表
     * @param examId 考试ID
     * @return
     */
    List<WaitReadOverNumVo> queryWaitReadOverNum(@Param("examId") String examId);

    /**
     * 批量查询一个岗位的指定人员的考试信息
     * @param userIds 用户id集合
     * @param positionId 岗位id
     * @param exmIds 考试id
     * @return
     */
    FtbCultivateExamUser queryTheListOfQualifiedPersons(@Param("userIds") List<String> userIds, @Param("positionId") String positionId,@Param("exmIds") List<String> exmIds);

    /**
     * 批量查询一个岗位的指定人员的考试信息
     * @param userIdsByGradesId 用户id集合
     * @param positionId 岗位ID
     * @return
     */
    List<FtbCultivateExamUser> queryTheListOfQualifiedPersonsNew(@Param("userIds")List<String> userIdsByGradesId, @Param("positionId")  String positionId);

    /**
     * 统计通过的任务考试数量
     * @param taskIds 任务集合ID
     * @return
     */
    List<BatchCommonCountDto> groupPassCountNum(@Param("taskIds") List<String> taskIds);
    /**
     * 批量统计所有的任务考试数量
     * @param taskIds 任务id集合
     * @return
     */
    List<BatchCommonCountDto> groupAllCountNum(@Param("taskIds") List<String> taskIds);

    List<AppExamListVo> storeMyExamList(@Param("userId") String userId);

    /**
     * 查询我的待考试的数量
     * @param userId
     * @return
     */
    Long queryMyWaitingExamNum(@Param("userId") String userId);

    /**
     * 查询我批阅的 的数量
     * @param userId 用户ID
     * @return
     */
    Long queryAllMyReadOver(@Param("userId") String userId);

    /**
     * 查询我通过批阅的 的数量
     * @param userId 用户ID
     * @return
     */
    Long queryPassMyReadOver(@Param("userId") String userId);

    List<BatchCommonCountDto> groupAllCountNumV2(@Param("taskIds") List<String> taskIds);

    /**
     * 考试组织统计分析列表
     *
     * @param params 请求参数
     * @return 考试组织统计分析列表
     */
    List<AppExamListVo> countForOrgV2(@Param("params") V2ExamStatisticsForOrgReq params,
                                      @Param("userIds") List<String> userIds);

    /**
     * 考试个人统计分析列表
     * @param page
     * @param params
     * @return
     */
    Page<V2ExamStatisticsForPersonVo> queryExamStatisticsForPersonV2(@Param("page") Page<V2ExamStatisticsForPersonVo> page, @Param("params") V2ExamStatisticsForPersonReq params,
                                                                     @Param("innerUserIds") List<String> userIds, @Param("innerStatus") List<Integer> innerStatus);


    /**
     * 统计通过的任务考试数量
     * @param taskIds 任务集合ID
     * @return 统计通过的任务考试数量
     */
    List<BatchCommonCountDto> groupPassCountNumV2(@Param("taskIds") List<String> taskIds);


    /**
     * 查询用户考试列表
     * @param id 考试id
     * @param userIds 用户过滤
     * @param scoreSort 得分排序(1: 升序, 0: 降序) 为空时不排序
     * @return java.util.List<jnpf.model.cultivate.v2.exam.vo.V2TestPaperVo>
     */
    List<V2TestPaperVo> getExamUserList(@Param("id") String id, @Param("versionBatch") String versionBatch,
                                        @Param("userIds") List<String> userIds, @Param("scoreSort") Integer scoreSort);

    /**
     * 查询我的考试列表
     * @param status 考试状态(0: 待考试, 1: 待批阅, 2: 已逾期, 3: 合格, 4: 不合格, 5: 优秀)
     * @param userId 用户id
     * @return java.util.List<jnpf.model.cultivate.v2.exam.vo.MyExamVo>
     */
    List<MyExamVo> getMyExamList(@Param("status") Integer status, @Param("userId") String userId);

    /**
     * 根据状态查询用户考试数
     * @param examStatus 考试状态(0: 待考试, 1: 待批阅, 2: 已逾期, 3: 合格, 4: 不合格, 5: 优秀)
     * @param userId 用户id
     * @return java.lang.Integer
     */
    Integer getStatusCount(@Param("examStatus") Integer examStatus, @Param("userId") String userId);

    /**
     * 查询用户考试详情 - 基础信息
     * @param userExamId 用户考试id
     * @return jnpf.model.cultivate.v2.exam.vo.MyExamDetailVo
     */
    MyExamDetailVo getMyExamDetail(@Param("userExamId") String userExamId);

    /**
     * 查询用户考试详情 - 考试结果
     * @param userExamId 用户考试id
     * @return jnpf.model.cultivate.v2.exam.vo.ExamResultVo
     */
    ExamResultVo getExamResult(@Param("userExamId") String userExamId);

    /**
     * 批阅考试 - 考试列表
     * @param keyword 关键字(考试名称)
     * @param status 审批状态(1: 待批阅, 2: 已批阅, 3: 逾期未考)
     * @param userIds 用户过滤, 无则忽略
     * @return java.util.List<jnpf.model.cultivate.v2.exam.vo.ReadOverExamVo>
     */
    List<ReadOverExamVo> readOverExamList(@Param("keyword") String keyword, @Param("status") Integer status, @Param("userIds") List<String> userIds);

    /** 
     * 查询考试下用户排名列表
     * @param examId 考试id
     * @param userIds 用户ids
     * @return java.util.List<jnpf.model.cultivate.v2.exam.vo.V2AppExamRankingVo>
     */
    List<V2AppExamRankingVo> getUserExamRankList(@Param("examId") String examId, @Param("userIds") List<String> userIds);

    /**
     * 批量更新旧版本用户考试
     * @param examList 考试列表
     */
    void updateOldExamUserBatch(@Param("examList") List<ExamPaperVo> examList);

    /**
     * 查询待批阅数量
     * @param examStatus 考试状态
     * @param userIds 用户ids
     * @return java.lang.Integer
     */
    Integer getWaitCheckCount(@Param("examStatus") Integer examStatus, @Param("userIds") List<String> userIds);

    /**
     * 根据考试ID统计考试数据
     * @param examId 考试ID
     * @return jnpf.model.cultivate.v2.exam.vo.ExamStatisticsVo
     */
    AiHelperExamStatisticsVo getExamStatistics(@Param("examId") String examId);

    /**
     * 查询用户已完成的考试列表（关联查询考试信息）
     * @param userId 用户ID
     * @return 已完成考试列表
     */
    List<UserLearningStatusVo.ExamInfo> queryCompletedExamsWithInfo(@Param("userId") String userId);
}