package cn.iocoder.yudao.module.smartfactory.service.attendance;

import cn.iocoder.yudao.module.smartfactory.controller.admin.attendance.vo.StaffAttendanceRecordReqVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.attendance.vo.StaffAttendanceRecordRespVO;
import cn.iocoder.yudao.module.smartfactory.controller.admin.attendance.vo.StaffAttendanceRecordSaveReqVO;
import cn.iocoder.yudao.module.smartfactory.dal.dataobject.attendance.StaffAttendanceRecordDO;

import javax.validation.Valid;
import java.util.List;

/**
 * 厂区员工考勤记录 Service 接口
 *
 * @author 符溶馨
 */
public interface StaffAttendanceRecordService {

    /**
     * 创建厂区员工考勤记录
     *
     * @param createReqVO 创建信息
     */
    void createStaffAttendanceRecord(@Valid List<StaffAttendanceRecordSaveReqVO> createReqVO);

    /**
     * 更新厂区员工考勤记录
     *
     * @param updateReqVO 更新信息
     */
    void updateStaffAttendanceRecord(@Valid List<StaffAttendanceRecordSaveReqVO> updateReqVO);

    /**
     * 删除厂区员工考勤记录
     *
     * @param id 编号
     */
    void deleteStaffAttendanceRecord(Long id);

    /**
     * 获得厂区员工考勤记录
     *
     * @param staffId 员工编号
     * @param month 月份
     * @param type 考勤类型
     * @return 厂区员工考勤记录
     */
    List<StaffAttendanceRecordDO> getRecord(Long staffId, String month, Integer type);

    /**
     * 获取厂区考勤类型
     * @param factoryId 工厂编号
     * @param month 考勤月份
     * @return 考勤类型数据
     */
    Integer getType(Long factoryId, String month);

    /**
     * 获取厂区考勤记录列表
     * @param reqVO 查询条件
     * @return 考勤记录列表
     */
    List<StaffAttendanceRecordDO> getStaffAttendanceRecordList(StaffAttendanceRecordReqVO reqVO);

    /**
     * 获取其他厂区考勤记录列表
     * @param reqVO 查询条件
     * @return 考勤记录列表
     */
    List<StaffAttendanceRecordDO> getOtherRecord(StaffAttendanceRecordReqVO reqVO);

    /**
     * 获取指定日期的考勤记录列表
     * @param month 月份
     * @return 勤记录列表
     */
    List<StaffAttendanceRecordDO> getRecordListGroupByStaffId(String month);

    /**
     * 考勤记录审核
     * @param factoryId 工厂编号
     * @param month 考勤月份
     */
    void updateReview(Long factoryId, String month);

    /**
     * 获取考勤记录是否已审核
     * @param factoryId 工厂编号
     * @param month 考勤月份
     * @return 是否已审核
     */
    Integer getIsReview(Long factoryId, String month);

    List<StaffAttendanceRecordRespVO> convertRecord(StaffAttendanceRecordReqVO reqVO,
                                                    List<StaffAttendanceRecordDO> recordDOS,
                                                    List<StaffAttendanceRecordDO> otherRecordDOS);
}