package com.sundot.airport.personnel.mapper;

import com.sundot.airport.personnel.domain.PersonnelMonthlyAssessment;
import org.apache.ibatis.annotations.Param;

import java.util.List;

/**
 * 人员月度考核Mapper接口
 *
 * @author ruoyi
 * @date 2026-05-07
 */
public interface PersonnelMonthlyAssessmentMapper {
    /**
     * 查询人员月度考核
     *
     * @param id 人员月度考核主键
     * @return 人员月度考核
     */
    PersonnelMonthlyAssessment selectPersonnelMonthlyAssessmentById(Long id);

    /**
     * 查询人员月度考核列表
     *
     * @param personnelMonthlyAssessment 人员月度考核
     * @return 人员月度考核集合
     */
    List<PersonnelMonthlyAssessment> selectPersonnelMonthlyAssessmentList(PersonnelMonthlyAssessment personnelMonthlyAssessment);

    /**
     * 新增人员月度考核
     *
     * @param personnelMonthlyAssessment 人员月度考核
     * @return 结果
     */
    int insertPersonnelMonthlyAssessment(PersonnelMonthlyAssessment personnelMonthlyAssessment);

    /**
     * 修改人员月度考核
     *
     * @param personnelMonthlyAssessment 人员月度考核
     * @return 结果
     */
    int updatePersonnelMonthlyAssessment(PersonnelMonthlyAssessment personnelMonthlyAssessment);

    /**
     * 删除人员月度考核
     *
     * @param id 人员月度考核主键
     * @return 结果
     */
    int deletePersonnelMonthlyAssessmentById(Long id);

    /**
     * 批量删除人员月度考核
     *
     * @param ids 需要删除的数据主键集合
     * @return 结果
     */
    int deletePersonnelMonthlyAssessmentByIds(Long[] ids);

    /**
     * 根据用户ID、年份和月份查询考核记录
     *
     * @param userId 用户ID
     * @param year   年份
     * @param month  月份
     * @return 人员月度考核
     */
    PersonnelMonthlyAssessment selectByUserIdAndYearMonth(@Param("userId") Long userId, @Param("year") Integer year, @Param("month") Integer month);

    /**
     * 批量插入考核记录
     *
     * @param list 考核记录列表
     * @return 结果
     */
    int batchInsertPersonnelMonthlyAssessment(List<PersonnelMonthlyAssessment> list);

    /**
     * 查询需要考核的经理/副经理列表
     *
     * @return 经理列表
     */
    List<PersonnelMonthlyAssessment> selectManagersForAssessment();

    /**
     * 查询经理/副经理的下属用户ID列表
     *
     * @param deptIds 部门ID列表（包含当前部门及所有子部门）
     * @param workArea 工作区域（副经理有值，经理为null或空）
     * @param isManager 是否为经理（true-经理，false-副经理）
     * @return 下属用户ID列表
     */
    List<Long> selectSubordinateUserIds(@Param("deptIds") List<Long> deptIds, @Param("workArea") String workArea, @Param("isManager") boolean isManager);

    /**
     * 批量统计红线行为次数
     *
     * @param userIds 用户ID列表
     * @param year    年份
     * @param month   月份
     * @return 用户ID -> 红线次数的映射
     */
    List<java.util.HashMap<String, Object>> batchCountRedLineViolations(@Param("userIds") List<Long> userIds, @Param("year") Integer year, @Param("month") Integer month);

    /**
     * 批量查询团队SOC/品控扣分
     *
     * @param userIds 用户ID列表
     * @param year    年份
     * @param month   月份
     * @return 用户ID -> 扣分的映射
     */
    List<java.util.HashMap<String, Object>> batchGetSocQcDeductions(@Param("userIds") List<Long> userIds, @Param("year") Integer year, @Param("month") Integer month);

    /**
     * 批量查询月考成绩（用于计算通过率）
     *
     * @param userIds 用户ID列表
     * @param year    年份
     * @param month   月份
     * @return 用户ID -> (是否合格) 的映射
     */
    List<java.util.HashMap<String, Object>> batchGetExamScores(@Param("userIds") List<Long> userIds, @Param("year") Integer year, @Param("month") Integer month);
}
