package com.ssj.mapper.knowledge;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ssj.bean.kmt.kmt.model.KmtKnowledgeModel;
import com.ssj.bean.weixin.zyb.domain.ZuoybKnowHowDetailsSort;
import com.ssj.service.conch.parents.v2.dto.WrongBookKnowledgeDTO2;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @Author: chchen
 * @Description
 * @Date Create in 17:43 2019/10/17
 * @Modified By
 */
@Mapper
public interface KmtKnowledgeMapper {

    /**
     * 查询sort记录
     * @param howDetailIds
     * @param grade
     * @param semester
     * @param type
     * @return
     */
    List<ZuoybKnowHowDetailsSort> findByHowDetailIdAndTypeAndGradeAndSemester (@Param("howDetailIds") List<String> howDetailIds,
                                                                               @Param("grade") String grade,
                                                                               @Param("semester") int semester,
                                                                               @Param("type") int type);

    /**
     * 根据知识点id查询知识点版本
     * @param howDetailId 知识点id
     * @param type 版本
     */
    ZuoybKnowHowDetailsSort findHowDetailsSortByHowDetailIdAndType(@Param("howDetailId") String howDetailId, @Param("type") int type);

    /**
     * 根据单元id查询单元版本
     * @param howId 单元id
     * @param type 版本
     */
    ZuoybKnowHowDetailsSort findHowSortByHowIdAndType(@Param("howId") String howId, @Param("type") int type);

    /**
     * 根据知识点id和版本查询知识点信息
     * @param howDetailIdSet 知识点id
     * @param type 版本
     */
    List<Map<String, Object>> findKnowledgeInfoByHowDetailIdAndType(@Param("howDetailIdSet") Set<String> howDetailIdSet, @Param("type") int type);

    /**
     * 查询指定维度下的知识点
     * @param page 分页
     * @param subject 科目
     * @param grade 年级
     * @param semester 上下册
     * @param version 版本
     * @param module 维度
     * @return 知识点列表
     */
    Page<WrongBookKnowledgeDTO2> findKnowledgeListByModule(@Param("page") IPage<WrongBookKnowledgeDTO2> page, @Param("subject") String subject, @Param("grade") String grade, @Param("semester") Integer semester, @Param("version") int version, @Param("module") String module);


    /**
     * 查询单元，知识点， 考点 zyb_know_how_details_sort， zyb_know_how_details
     * @param grade
     * @param courseName
     * @param versionType
     * @param semester
     * @param moduleType
     * @param searchKey
     * @return
     */
    List<KmtKnowledgeModel> findKmtKnowledgeByGradeCourseNameTypeSemester (@Param("grade") String grade,
                                                                           @Param("courseName") String courseName,
                                                                           @Param("versionType") int versionType,
                                                                           @Param("semester") int semester,
                                                                           @Param("moduleType") Integer moduleType,
                                                                           @Param("searchKey") String searchKey);

    /**
     * 查询知识点下的考点id，  zyb_know_how_details_sort
     * @param detailIds sort表知识点记录的id
     * @return
     */
    List<KmtKnowledgeModel> findDetailsListWithKd (@Param("detailIds") List<String> detailIds);

    /**
     * 查询所有的知识点维度
     * @param grade 知识点所属年级
     * @param semester 知识点所属上下册
     * @param subject 知识点所属科目
     * @param version 知识点版本
     * @return 维度列表
     */
    List<Map<String, Object>> findAllModule(@Param("grade") String grade, @Param("semester") Integer semester, @Param("subject") String subject, @Param("version") int version);

    /**
     * 根据知识点id和版本查询知识点信息
     * @param howDetailId 知识点id
     * @param version 版本
     * @param grade 年级
     * @param semester 学期（1上学期  2下学期）
     * @return 知识点信息
     */
    Map<String, Object> findKnowledgeInfoByHowDetailIdAndTypeAndGradeAndSemester(@Param("howDetailId") String howDetailId,
                                                                                 @Param("version") int version,
                                                                                 @Param("grade") String grade,
                                                                                 @Param("semester") int semester);

    /**
     * 查询知识点id、名称、维度
     * @param subject 科目
     * @param grade 年级
     * @param semester 学期
     * @param version 版本
     * @return 知识点id、名称、维度列表
     */
    List<Map<String,Object>> findKnowledgeIdAndNameAndModule(@Param("subject") String subject, @Param("grade") String grade,
                                                             @Param("semester") Integer semester, @Param("version") int version);

    /**
     * 统计知识点涉及的错题数和总题数
     * @param vipId 学生id
     * @param subject 科目
     * @param grade 年级
     * @param semester 学期
     * @param version 版本
     * @param knowledgeIdList 知识点id列表
     * @param homeworkDate 作业日期（如：2020-02-23，统计昨日作业数据时传入）
     * @return 知识点涉及的错题数和总题数统计列表
     */
    List<Map<String,Object>> countKnowledgeWrongAndTotalQuestion(@Param("vipId") String vipId,
                                                                 @Param("subject") String subject,
                                                                 @Param("grade") String grade,
                                                                 @Param("semester") Integer semester,
                                                                 @Param("version") int version,
                                                                 @Param("knowledgeIdList") List<String> knowledgeIdList,
                                                                 @Param("homeworkDate") String homeworkDate);

    /**
     * 统计知识点涉及的练习册批改的正确题目数（这种数据不会生成错题知识点，所以需单独统计）
     * @param vipId 学生id
     * @param subject 科目
     * @param grade 年级
     * @param semester 学期
     * @param version 版本
     * @param knowledgeIdList 知识点id列表
     * @param homeworkDate 作业日期（如：2020-02-23，统计昨日作业数据时传入）
     * @return 知识点涉及的练习册批改的正确题目数
     */
    List<Map<String,Object>> countKnowledgeRightQuestionWithExercise(@Param("vipId") String vipId,
                                                                     @Param("subject") String subject,
                                                                     @Param("grade") String grade,
                                                                     @Param("semester") Integer semester,
                                                                     @Param("version") int version,
                                                                     @Param("knowledgeIdList") List<String> knowledgeIdList,
                                                                     @Param("homeworkDate") String homeworkDate);

    /**
     * 查询所有lib_id='SSJ'的知识点版本记录
     * @param offset 从哪一条开始
     * @param pageSize 每次查询多少条
     * @return 知识点版本记录列表
     */
    List<Map<String, Object>> findKnowHowDetailsSortMap(@Param("offset") int offset, @Param("pageSize") int pageSize);

    /**
     * 统计知识点与练习册题目的关联记录
     * @param howDetailsId 知识点id
     * @return 关联记录数量
     */
    int countExerciseQuestionKnow(@Param("howDetailsId") String howDetailsId);
}
