package jnpf.attendance.service; import jnpf.base.service.SuperService; import jnpf.entity.AttendanceGroup; import jnpf.entity.AttendanceGroupUser; import jnpf.entity.attendance.*; import jnpf.enums.attendance.AttendanceTypeEnum; import jnpf.enums.attendance.v2.ClockOutHandleParam; import jnpf.exception.HandleException; import jnpf.model.attendance.dto.LineDrawingSchedulesConfigDto; import jnpf.model.attendance.dto.PeriodConfig; import jnpf.model.attendance.dto.SchedulesImportDto; import jnpf.model.attendance.dto.SchedulesSetDto; import jnpf.model.attendance.dto.UnifiedSchedulesDto; import jnpf.model.attendance.model.DayClockRange; import jnpf.model.attendance.vo.*; import jnpf.model.attendance.vo.attendance.OutOrBusApproveVo; import org.jetbrains.annotations.Nullable; import java.io.IOException; import java.math.BigDecimal; import java.time.LocalDate; import java.util.Date; import java.util.List; import java.util.Map; /** *

* 考勤组-每日出勤规则 服务类 *

* * @author ahua * @since 2023-11-22 */ public interface AttendanceDailyRuleService extends SuperService { /** * 导出指定月份的调度信息 * * @param groupId 调度组ID,用于标识一组调度信息 * @param realName 用户真实姓名,用于过滤特定用户的调度信息 * @param month 指定的月份,格式为"YYYY-MM",用于获取该月的调度信息 * @param userIdList 用户ID列表,用于过滤需要导出调度信息的用户 * @param isSchedules 是否包含调度信息的标志,用于指示是否需要导出调度详情 */ void schedulesExport(String groupId, String workGroupId, String realName, String month, List userIdList, Integer isSchedules); void hisDailyRule(Map group2orgMap, Map org2groupMap, Map> usersMap); void clockOutHandle(ClockOutHandleParam param); FtbAttendanceDailyRule workOvertimeNotApprove(ClockOutHandleParam param); /** * 根据条件获取排班列表V2版本。 * * @param groupId 考勤组ID * @param realName 真实姓名 * @param month 月份 * @param userIdList 用户ID列表 * @param isSchedules 是否排班标识 * @return 排班列表V2版本 */ List getSchedulesListV2(String groupId, String workGroupId, String realName, String month, List userIdList, Integer isSchedules); /** * 根据条件获取排班列表 V2(按开始日期、结束日期,其它与 {@link #getSchedulesListV2} 一致) * * @param startDate 开始日期(yyyy-MM-dd) * @param endDate 结束日期(yyyy-MM-dd) */ List getSchedulesListV2ByDateRange(String groupId, String workGroupId, String realName, String startDate, String endDate, List userIdList, Integer isSchedules); /** * 按预排班 Redis 草稿({@link jnpf.attendance.schedule.ShiftPlanAssignmentResult#getByEmployee()} JSON,key 为租户 + 草稿 id) * 转换为排班列表 V2 结构;草稿不存在或为空返回空列表。 * * @param groupId 考勤组 id * @param startDate 开始日期 yyyy-MM-dd * @param endDate 结束日期 yyyy-MM-dd * @param draftId 草稿 id(Redis key 第二段) */ List getSchedulesListV2ByPreScheduleDraft( String groupId, String startDate, String endDate, String draftId); /** * 根据班次ID列表获取班次名称实体映射。 * * @param shiftIds 班次ID列表 * @return 班次ID与班次名称实体的映射 */ Map getShiftByShiftIds(List shiftIds); /** * 检查指定日期用户是否存在。 * * @param users 考勤组用户列表 * @param date 日期 * @return 用户存在标识(- 1离组 0未加入 1存在 2借调) */ Integer findUserIsExistsStatusByDay(List users, Date date); /** * 检查指定日期用户是否存在。 * * @param users 考勤组用户列表 * @param date 日期 * @return 用户存在标识(1存在,0不存在) */ Integer findUserIsExistsByDay(List users, Date date); /** * 检查指定日期范围内用户是否存在。 * * @param users 考勤组用户列表 * @param start 开始日期 * @param end 结束日期 * @return 用户存在标识(1存在,0不存在) */ Integer findUserIsExistsByDay(List users, Date start, Date end); /** * 检查指定日期范围内用户是否存在。 * * @param users 考勤组用户列表 * @param start 开始日期 * @param end 结束日期 * @return 用户存在标识(1存在,0不存在) */ Map findUserIsExistsByUserList(List users, Date start, Date end); /** * 判断当天内用户的状态, -1为已离 0为未入 1正常 2为全天被借调 3部分被借调 4借调 * * @param users 考勤组用户列表 * @param date 日期 * @return -1为已离 0为未入 1正常 2为全天被借调 3部分被借调 4借调 */ Integer isExistStatus(List users, Date date); /** * 判断时间范围内用户的状态, -1为已离 0为未入 1正常 2为全天被借调 3部分被借调 4借调 * @param users * @param start * @param end * @return */ Integer isExistStatus(List users, Date start, Date end); /** * 是否借调,不管借调还是被借调,只要命中借调时间,则返回true * * @param users 考勤组用户列表 * @param start 开始日期 * @param end 结束日期 * @return 是否在借调状态 */ Boolean isInSecondment(List users, Date start, Date end); /** * 获取排班规则详情。 * * @param id 排班规则ID * @return 排班规则详情 * @throws HandleException 处理异常 */ ScheduleRuleDetailVo getDetail(String id) throws HandleException; /** * 修改固定周期班次设置。 * * @param groupIds 考勤组ID列表 * @param periodList 周期班次设置列表 * @param enableTime 生效时间 */ void fixedPeriodChange(List groupIds, AttendanceShiftSettingVo periodList, Date enableTime); /** * 添加用户的固定班次规则处理。 * * @param groupId 考勤组ID * @param userIds 用户ID列表 */ void addUserFixedHandle(String groupId, List userIds); /** * 添加用户的固定班次规则处理,包含租户ID。 * * @param groupId 考勤组ID * @param tenantId 租户ID * @param userIds 用户ID列表 */ void addUserFixedHandle(String groupId, String tenantId, List userIds); /** * 添加节假日日常规则。 * * @param start 开始日期 * @param end 结束 * @param attendanceGroupVos 考勤组列表 * @param festivalSetting 节假日设置映射 * @param hisFestivalSetting 历史节假日设置实体 **/ void addHolidayDailyRule(Date start, Date end, List attendanceGroupVos, AttendanceFestivalRules festivalSetting, AttendanceFestivalRules hisFestivalSetting, List newUserIds, List oldUserIds); /** * 为自助调度设置时间表 * * @param shiftId 班次ID,用于标识特定的班次 * @return 如果设置成功,返回确认信息;否则返回错误信息 * @throws HandleException 如果设置过程中发生错误,则抛出此异常 */ String setSchedulesForSelfSchedules(String shiftId) throws HandleException; /** * 更新班次配置时设置时间表 * * @param groupId 组ID,用于标识需要更新配置的组 * @param mark 标记,用于指示更新的版本或状态 * @param periodConfigs 时段配置列表,包含需要更新的班次配置信息 * @return 如果设置成功,返回受影响的行数或状态码;否则返回错误信息 * @throws HandleException 如果设置过程中发生错误,则抛出此异常 */ Integer setSchedulesForShiftConfigUpdate(String groupId, Integer mark, List periodConfigs, List periodEntities) throws HandleException; /** * 设置排班 * * @param schedulesSets 排班设置列表 * @return 排班结果字符串 * @throws HandleException 处理异常 **/ String setSchedules(List schedulesSets) throws HandleException; /** * 初始化固定排班规则。 * * @param tenantId 租户ID */ void initFixedScheduleRule(String tenantId); void clearGroupRule(String groupId, List userIds); /** * 清除考勤组用户集合的考勤规则 * * @param groupId 考勤组ID * @param userIds userId集合 */ void clearGroupRule(String groupId, List userIds, Date departTime, String tenantId); /** * 申请验证的日规则处理 * * @param applyParam 申请参数类 */ List applyVerifyHandle(ApplyParam applyParam) throws HandleException; /** * 申请的日规则处理 * * @param applyParam 申请参数类 */ String applyDailyRuleHandle(ApplyParam applyParam) throws HandleException; /** * 借调申请日规则处理 * * @param userIds 借调用户id集合 * @param fromGroupId 原考勤组id * @param toGroupId 借调考勤组id * @param start 开始时间 * @param end 结束时间 * @param departureTime 离岗时间 * @param backTime 回岗时间 * @param tenantId */ List secondmentDailyRuleHandle(List userIds, String fromGroupId, String toGroupId, Date start, Date end, Date departureTime, Date backTime, String tenantId) throws HandleException; /** * 查询用户当日排班信息 * * @param groupId 群组ID,用于识别哪个群组的考勤规则需要查询 * @param userId 用户ID,指定查询考勤规则的用户 * @param day 日期,指定查询考勤规则的具体日期 * @return 返回一个包含考勤规则的列表,这些规则适用于指定用户和日期 */ List getAttendanceDayRulesForStatistic(String groupId, String userId, Date day); /** * 获取用户当日可打卡时间范围 * 开始时间:如果前一天有夸日班次,开始时间就是夸日班次的下班缺卡时间,没有就是当日的00:00:00 * 结束时间:当日最后一个班次的下班缺卡时间 * * @param userId 用户ID,指定查询考勤规则的用户 * @param day 日期,指定查询考勤规则的具体日期 * @return 返回一个包含开始时间和结束时间的对象 */ DayClockRange getDayClockRange(String userId, Date day); /** * 获取当天最后一个班次的下班缺卡时间 * * @param userId 用户ID,指定查询考勤规则的用户 * @param day 日期,指定查询考勤规则的具体日期 * @return 返回一个Date对象,表示当天最后一个班次的下班缺卡时间 */ Date getDayEndRuleDeletionDate(String userId, Date day); List userIsSchedulingOrdinary(List organizeIds); boolean hasRuleByUserIdAndTime(String userId, Date start, Date end); /** * 获取用户当天外出/出差批次号 * * @param userId 用户ID,指定查询考勤规则的用户 * @param groupId 考勤组ID * @param day 日期,指定查询考勤规则的具体日期 * @param typeEnumList 出勤类型 * @return 返回一个包含外出/出差批次号的列表 */ List getUserDayBusAndOutInfo(String userId, String groupId, Date day, List typeEnumList); /** * 获取用户外出出差次数 * * @param userIds 用户ID,指定查询考勤规则的用户 * @param groupIdList 考勤组ID集合 * @param startDate 开始时间 * @param endDate 结束时间 * @param businessTrip 出勤类型 * @return Integer */ Map getUserBusAndOutCount(List userIds, List groupIdList, Date startDate, Date endDate, AttendanceTypeEnum businessTrip); /** * 用户是否排班 * * @param userId 用户ID * @return boolean true: 是 false: 否 */ boolean userIsScheduling(String userId); List schedulesImport(SchedulesImportDto schedulesImportDto) throws IOException; Map getUserPublicHoliday(String yearMonth, List userIds); /** * 获取最早排班时间 * * @return Date */ Date getEarliestSchedulingDate(Date start); boolean hasLinearRulesByPeriod(String userId, Date start, Date end); /** * 设置划线排班 * * @param configDto 划线排班配置DTO * @return 处理结果 * @throws HandleException 处理异常 */ String setLineDrawingSchedules(LineDrawingSchedulesConfigDto configDto) throws HandleException; boolean queryLineSchedulingExist(LineDrawingSchedulesConfigDto configDto); void lineSchedulesExport(String groupId, String workGroupId, String month, List userIdList); void lineSchedulesImport(SchedulesImportDto schedulesImportDto) throws IOException; List getLineSchedulesList(String groupId, String workGroupId, List dayList, List finalUserIdList); /** * 查询单个用户是否划线排班 * @param userId * @param start * @param end * @return */ boolean isLineScheduleByUserId(String userId, Date start, Date end); FtbAttendanceLineSchedulingConfig lineSchedulesConfigFilter(String groupId, List userIds); @Nullable FtbAttendanceLineSchedulingConfig getFtbAttendanceLineSchedulingConfig(List userIds, FtbAttendanceLineSchedulingConfig lineSchedulingConfig); /** * 获取排班 * @param finalStartDate 开始日期 * @param finalEndDate 结束日期 * @return 排班列表 */ List getDayRuleByMonth(LocalDate finalStartDate, LocalDate finalEndDate); /** * 查询指定用户指定日期的班次信息,合并展示普班和请假时段 * 请假信息作为班次信息的补充,当班次被请假覆盖时,根据覆盖情况展示时段 * * @param userId 用户ID * @param queryDate 查询日期 * @return 用户指定日期时段信息(包含普班和请假) */ UserDayShiftInfoVo getUserDayShiftInfo(String userId, Date queryDate); /** * 统一排班接口(支持固定排班和划线排班) * * @param dto 统一排班DTO * @return 处理结果消息 * @throws HandleException 处理异常 */ String setUnifiedSchedules(UnifiedSchedulesDto dto) throws HandleException; /** * 查询考勤组近 90 天历史排班:按自然日返回班次及岗位人数;划线排班一人一条,人数为 1 * * @param groupId 考勤组 id * @return 每日营业额(预留)、班次及岗位人数列表 */ List getGroupShiftHistory90Days(String groupId); /** * 按自然日查询考勤组所属门店营业额预估 * * @param groupId 考勤组 id * @param startTime 开始日期(含) * @param endTime 结束日期(含) * @return 按日营业额预估列表 */ List listReceivableRevenueByDay(String groupId, Date startTime, Date endTime); }