package com.xinyilu.system.mapper.studentInfo;

import com.xinyilu.system.domain.dto.ImportTestProjectScoresDTO;
import com.xinyilu.system.domain.dto.StudentInfoDTO;
import com.xinyilu.system.domain.parentInfo.ParentInfo;
import com.xinyilu.system.domain.studentInfo.StudentInfo;
import com.xinyilu.system.domain.systemarea.SysArea;
import com.xinyilu.system.domain.testLevel.TestItemLevel;
import com.xinyilu.system.domain.vo.StudentInfoVO;
import com.xinyilu.system.domain.vo.StudentInforImportlVO;
import com.xinyilu.system.domain.vo.TestItemLevelScoreVO;
import com.xinyilu.system.domain.vo.childrenRanking.ChildrenRankingVO;
import com.xinyilu.system.domain.vo.childrenRanking.ItemScoreInfoVO;
import com.xinyilu.system.domain.vo.kinderPhysiqueAnalysis.StudentAndKindergartenVO;
import com.xinyilu.system.domain.vo.physiqueAnalysis.PhysiqueAnalysisVO;
import com.xinyilu.system.domain.vo.physiqueAnalysis.PhysiqueCategoryVO;
import com.xinyilu.system.domain.vo.scoreExport.ScoreExportVO;
import org.apache.ibatis.annotations.Param;

import java.math.BigDecimal;
import java.util.Collection;
import java.util.List;


/**
 * 学生信息Mapper接口
 *
 * @author jihan
 * @date 2022-08-01
 */
public interface StudentInfoMapper {
    /**
     * 查询学生信息
     *
     * @param id 学生信息主键
     * @return 学生信息
     */
    public StudentInfoVO selectStudentInfoById(Long id);

    /**
     * 查询学生信息列表
     *
     * @param studentInfo 学生信息
     * @return 学生信息集合
     */
    public List<StudentInfoVO> selectStudentInfoList(StudentInfoDTO studentInfo);

    /**
     * 查询学生数量
     *
     * @param studentInfo 学生信息
     * @return 学生信息集合
     */
    public int selectStudentInfoCount(StudentInfoDTO studentInfo);


    /**
     * 新增学生信息
     *
     * @param studentInfo 学生信息
     * @return 结果
     */
    public int insertStudentInfo(StudentInfo studentInfo);

    /**
     * 修改学生信息
     *
     * @param studentInfo 学生信息
     * @return 结果
     */
    public int updateStudentInfo(StudentInfo studentInfo);

    /**
     * 删除学生信息
     *
     * @param id 学生信息主键
     * @return 结果
     */
    public int deleteStudentInfoById(Long id);

    /**
     * 批量删除学生信息
     *
     * @param ids 需要删除的数据主键集合
     * @return 结果
     */
    public int deleteStudentInfoByIds(Long[] ids);

    /**
     * 查询家长信息
     *
     * @param studentId 学生id集合
     * @return 家长信息集合
     */
    List<ParentInfo> getParentInfoList(Long studentId);

    /**
     * 逻辑删除学生信息
     *
     * @param ids 需要删除的数据主键集合
     * @return 结果
     */
    int updateStudentInfoByIds(Long[] ids);

    /**
     * 根据区域id查询该区域下所有幼儿园中的班级信息
     *
     * @param areaId 区域id
     * @return 班级id集合
     */
    List<Long> getClassIdByArea(Long areaId);

    /**
     * 根据幼儿园园长id查询下属班级信息
     *
     * @param principalId 幼儿园园长id
     * @return List<Long> 班级id集合
     */
    List<Long> getClassIdByPrincipalId(Long principalId);

    /**
     * 根据老师用户id获取其所在的班级信息
     *
     * @param userId 用户id
     * @return 班级信息集合
     */
    List<Long> getClassIdByTeacherId(Long userId);

    /**
     * 根据家长手机号查询其对应的学生信息
     *
     * @param phone 家长用户手机号
     * @return 学生id集合
     */
    List<Long> getStudentIdByParent(String phone);

    /**
     * 根据学生id查询对应得学生信息
     *
     * @param studentId 学生id
     * @return PhysiqueAnalysisVO 学生相关信息
     */
    PhysiqueAnalysisVO getStudentInfoById(Long studentId);

    /**
     * 根据学生id和一级父id统计一级分类的成绩信息
     *
     * @param studentId 学生id
     * @param parentId  一级分类id
     * @param batchCode 批次编码
     * @param itemCode  项目编码
     * @return 一级分类成绩信息
     */
    List<PhysiqueCategoryVO> getFirstItemCategory(@Param("studentId") Long studentId, @Param("parentId") Long parentId,
                                                  @Param("batchCode") String batchCode, @Param("itemCode") String itemCode);

    /**
     * 统计每个学生项目所属分类的得分
     *
     * @param studentId 学生id
     * @param batchCode 批次编号
     * @param itemCode  项目编码
     * @return List<PhysiqueCategoryVO>
     */
    List<PhysiqueCategoryVO> getItemCategoryScore(@Param("studentId") Long studentId, @Param("batchCode") String batchCode,
                                                  @Param("itemCode") String itemCode);

    /**
     * 根据测试项目分类id查询对应得区间信息
     *
     * @param categoryIdList 分类id集合
     * @return 分类集合区间列表值
     */
    List<TestItemLevel> getTestItemLevelByCategoryId(@Param("categoryIdList") List<Long> categoryIdList);

    /**
     * 根据学生id统计该幼儿园的总人数
     *
     * @param studentId 学生id
     * @return 学生数量
     */
    int getStudentCountById(Long studentId);

    /**
     * 根据学生id和批次统计每个学生的总成绩
     *
     * @param studentId 学生id
     * @param batchCode 批次编号
     * @return 成绩集合
     */
    List<ChildrenRankingVO> getStudentItemScore(@Param("studentId") Long studentId,
                                                @Param("batchCode") String batchCode);

    /**
     * 根据学生id查询区域下所有的学校id
     *
     * @param studentId 学生id
     * @param level     区域级别
     * @return 成绩集合
     */
    List<Long> getKindergartenInfoList(@Param("studentId") Long studentId, @Param("level") int level);

    /**
     * 查询所有学校下的学生数量
     *
     * @param kindList 学校id集合
     * @return 成绩集合
     */
    BigDecimal getCountBykindList(@Param("kindList") List<Long> kindList);

    /**
     * 根据所有的学校id查询区域下所有的学生信息
     *
     * @param kindList 学校集合
     * @return 成绩集合
     */
    List<ChildrenRankingVO> getStudentItemScoreBykindList(@Param("kindList") List<Long> kindList,
                                                          @Param("batchCode") String batchCode
    );

    /**
     * 根据学生id和批次查询学生的得分信息
     *
     * @param studentId 学生id
     * @param batchCode 批次编号
     * @return 成绩集合
     */
    List<TestItemLevelScoreVO> getStudentItemScoreAndLevel(@Param("studentId") Long studentId,
                                                           @Param("batchCode") String batchCode);

    /**
     * 根据学生id查询其幼儿园各项目的总得分
     *
     * @param studentId 学生id
     * @param batchCode 批次编号
     * @return 幼儿园各项目的总成绩
     */
    List<ItemScoreInfoVO> getItemScoreList(@Param("studentId") Long studentId,
                                           @Param("batchCode") String batchCode);

    /**
     * 根据学生id查询其幼儿园所属区域项目平均得分
     *
     * @param studentId 学生id
     * @return 区域平均成绩
     */
    List<ItemScoreInfoVO> getAreaScoreByStudentId(Long studentId);


    /**
     * 获取学生的身份证号
     *
     * @param cardNumber 学生的身份证号
     * @return java.lang.Long  学生的身份证号人数
     **/
    int getStudentCardNumberInfo(@Param("cardNumber") String cardNumber);


    /**
     * 通过班级id,获取学生信息集合
     *
     * @param classId 班级id
     * @return List<ItemScoreInfoVO>  学生信息集合
     **/
    List<StudentInforImportlVO> selectStudentInfoListByClassId(Long classId);


    /**
     * 批量新增学生信息
     *
     * @param studentInfoList 学生信息集合
     * @return 数量
     */
    int insertStudentInfoList(Collection<StudentInforImportlVO> studentInfoList);

    /**
     * 根据学生id查询学生所在区域
     *
     * @param studentId 学生id
     * @return 学生数量
     */
    String getCityCode(@Param("studentId") Long studentId);

    /**
     * 根据学生id查询本市参与体侧的学生总人数
     *
     * @param code 区域编号
     * @return 学生数量
     */
    Long getCityStudentCountById(@Param("code") String code);

    /**
     * 根据学生id查询其幼儿园所属区域项目平均得分
     *
     * @param kindergartenIdList 幼儿园id集合
     * @param batchCode          批次编号
     * @return 区域平均成绩
     */
    List<ItemScoreInfoVO> getScoreByStudentId(@Param("kindergartenIdList") List<Long> kindergartenIdList,
                                              @Param("batchCode") String batchCode);

    /**
     * 根据学生id查询其所在的区域信息
     *
     * @param studentId 学生id
     * @return 区域信息
     */
    SysArea getSysAreaByStudentId(Long studentId);

    /**
     * 根据区域id查询当前区域下所有的幼儿园和学生信息
     *
     * @param areaIdList 区域id集合
     * @return 幼儿园和学生信息集合
     */
    List<StudentAndKindergartenVO> getStudentAndKindergartenInfoByAreaIds(@Param("areaIdList") List<Long> areaIdList);

    /**
     * 根据区域id查询该区域下所有幼儿园中的班级信息
     *
     * @param kindergartenIdList 幼儿园id集合
     * @return 班级id集合
     */
    List<Long> getClassIdByKindergartenIdList(@Param("kindergartenIdList") List<Long> kindergartenIdList);

    /**
     * 查询幼儿园学生信息
     *
     * @param scoreExport 幼儿园信息
     * @return ScoreExportVO
     */
    List<ScoreExportVO> selectStudentByKindergartenId(ImportTestProjectScoresDTO scoreExport);
}
