package com.sundot.airport.attendance.mapper;

import com.sundot.airport.attendance.domain.AttendancePostRecord;
import com.sundot.airport.common.core.domain.entity.SysUser;
import com.sundot.airport.common.dto.AttendanceWorkDurationDto;
import org.apache.ibatis.annotations.Param;

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

/**
 * 上岗记录Mapper接口
 *
 * @author wangchong
 * @date 2025-07-10
 */
public interface AttendancePostRecordMapper {
    /**
     * 查询上岗记录
     *
     * @param id 上岗记录主键
     * @return 上岗记录
     */
    public AttendancePostRecord selectAttendancePostRecordById(Long id);

    /**
     * 查询上岗记录列表
     *
     * @param attendancePostRecord 上岗记录
     * @return 上岗记录集合
     */
    public List<AttendancePostRecord> selectAttendancePostRecordList(AttendancePostRecord attendancePostRecord);

    /**
     * 新增上岗记录
     *
     * @param attendancePostRecord 上岗记录
     * @return 结果
     */
    public int insertAttendancePostRecord(AttendancePostRecord attendancePostRecord);

    /**
     * 修改上岗记录
     *
     * @param attendancePostRecord 上岗记录
     * @return 结果
     */
    public int updateAttendancePostRecord(AttendancePostRecord attendancePostRecord);

    /**
     * 删除上岗记录
     *
     * @param id 上岗记录主键
     * @return 结果
     */
    public int deleteAttendancePostRecordById(Long id);

    /**
     * 批量删除上岗记录
     *
     * @param ids 需要删除的数据主键集合
     * @return 结果
     */
    public int deleteAttendancePostRecordByIds(Long[] ids);

    /**
     * 查询指定用户当天的上岗记录
     *
     * @param createBy 创建人
     * @param userId   用户ID
     * @param today    当天日期
     * @return 上岗记录集合
     */
    public List<AttendancePostRecord> selectTodayRecordsByUserId(@Param("createBy") Long createBy, @Param("userId") Long userId, @Param("today") Date today, @Param("locked") String locked);

    /**
     * 查询指定班次代码当天的上岗记录
     *
     * @param today      当天日期
     * @param shiftCodes 班次代码列表
     * @return 上岗记录集合
     */
    public List<AttendancePostRecord> selectTodayRecordsByShiftCodes(@Param("today") Date today, @Param("shiftCodes") List<String> shiftCodes);

    /**
     * 根据指定时间获取用户的在岗位置信息
     *
     * @param userId    用户ID
     * @param queryTime 查询时间
     * @return 上岗记录集合
     */
    public List<AttendancePostRecord> selectLocationsByTime(@Param("userId") Long userId, @Param("queryTime") Date queryTime);

    /**
     * 根据通道名称和指定时间获取通道的在岗位置信息
     *
     * @param channelCodeList 通道code
     * @param queryTime       查询时间
     * @return 上岗记录集合
     */
    List<AttendancePostRecord> selectLocationsByTimeAndChannelName(@Param("channelCodeList") List<String> channelCodeList, @Param("queryTime") Date queryTime, @Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     * 查询指定班次代码的下班时间
     *
     * @param today
     * @param shiftCodes
     * @return
     */
    List<AttendancePostRecord> selectCheckOutTimeByShiftCodes(@Param("today") Date today, @Param("shiftCodes") List<Long> shiftCodes);

    /**
     * @return
     */
    List<AttendancePostRecord> selectKezhangRecordCount(@Param("userId") Long userId, @Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     * 查询指定用户指定时间最后的记录
     *
     * @param userId 用户ID
     * @return 上岗记录集合
     */
    List<AttendancePostRecord> queryLastTime(@Param("userId") Long userId);

    /**
     * 查询指定时间段内所有考勤记录的ke_id
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return
     */
    List<Long> queryKeIds(@Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     * 查询指定时间段内班组内所有考勤记录
     *
     * @param date
     * @param attendanceTeamId
     * @return
     */
    List<AttendancePostRecord> selectTeamOnList(@Param("date") Date date, @Param("attendanceTeamId") Long attendanceTeamId);

    /**
     * 查询指定用户最近的上岗记录的考勤日期
     *
     * @param createBy 创建人
     * @param userId   用户ID
     * @return 考勤日期
     */
    public Date selectMaxDateByUserId(@Param("createBy") Long createBy, @Param("userId") Long userId);

    /**
     * 根据角色标识查询今日上岗用户列表
     *
     * @param date 考勤日期
     * @param list 角色标识
     * @return 用户列表
     */
    List<SysUser> selectUserListByRoleKey(@Param("date") Date date, @Param("locked") String locked, @Param("list") List<String> list);

    /**
     * 查询指定个人在指定时间段内的总工作时长
     *
     * @param userId    用户ID
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return 个人总工作时长（分钟）
     */
    BigDecimal selectPersonalTotalWorkDurationInTimeRange(@Param("userId") Long userId, @Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     * 查询站级别指定时间段内工作时长总和最高的时长
     *
     * @param attendanceStationId 考勤站点ID
     * @param startTime           开始时间
     * @param endTime             结束时间
     * @return 包含用户ID和总工作时长的结果Map，key为userId和totalWorkDuration
     */
    BigDecimal selectTopUserWorkDurationInTimeRange(@Param("attendanceStationId") Long attendanceStationId, @Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     * 查询指定用户ID列表在指定时间段内的总工作时长
     *
     * @param list      用户ID列表
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return 总工作时长（分钟）
     */
    BigDecimal selectTotalWorkDurationInTimeRange(@Param("list") List<Long> list, @Param("startTime") Date startTime, @Param("endTime") Date endTime);

    /**
     * 批量查询多个用户在指定时间段内的总工作时长
     *
     * @param userIds   用户ID列表
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return 工作时长DTO列表
     */
    List<AttendanceWorkDurationDto> selectBatchPersonalTotalWorkDurationInTimeRange(@Param("userIds") List<Long> userIds, @Param("startTime") Date startTime, @Param("endTime") Date endTime);
}
