diff --git a/ruoyi-system/src/main/java/com/ruoyi/common/constants/WgzAndBgtMessageConstant.java b/ruoyi-system/src/main/java/com/ruoyi/common/constants/WgzAndBgtMessageConstant.java index 6283e82..2552f53 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/common/constants/WgzAndBgtMessageConstant.java +++ b/ruoyi-system/src/main/java/com/ruoyi/common/constants/WgzAndBgtMessageConstant.java @@ -51,6 +51,9 @@ public class WgzAndBgtMessageConstant { //【下班缺卡】15-16 public static final String WGZ_SYSTEM_HEADLINE_OFFDUTY = "您在【%s】有一次下班缺卡!"; public static final String WGZ_SYSTEM_SUBHEADING_OFFDUTY = "您在【%s】当天有一条下班缺卡,请注意核对!"; + //【请假超时】17-18 + public static final String WGZ_SYSTEM_HEADLINE_TIMEOUT = "您【%s】的请假审批已超时未审核!"; + public static final String WGZ_SYSTEM_SUBHEADING_TIMEOUT = "您在【%s】的请假审批流程未走完,现已超时取消,请注意核对!"; /** * 务工者给包工头提示 */ @@ -111,6 +114,10 @@ public class WgzAndBgtMessageConstant { return String.format(WGZ_SYSTEM_HEADLINE_OFFDUTY,mp.get("data")); case "116": return String.format(WGZ_SYSTEM_SUBHEADING_OFFDUTY, mp.get("data")); + case "117": + return String.format(WGZ_SYSTEM_HEADLINE_TIMEOUT,mp.get("data")); + case "118": + return String.format(WGZ_SYSTEM_SUBHEADING_TIMEOUT, mp.get("data")); //务工者向包工头申请报名 case "201": return String.format(WGZ_HEADLINE_APPLY, mp.get("userName"), mp.get("post")); diff --git a/ruoyi-system/src/main/java/com/ruoyi/task/BusinessTask.java b/ruoyi-system/src/main/java/com/ruoyi/task/BusinessTask.java index e9f64de..c44f120 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/task/BusinessTask.java +++ b/ruoyi-system/src/main/java/com/ruoyi/task/BusinessTask.java @@ -13,14 +13,18 @@ import com.ruoyi.common.enums.RecruitApplyStatus; import com.ruoyi.fbs.domain.FbsProjectTask; import com.ruoyi.fbs.service.IFbsProjectTaskService; import com.ruoyi.wgz.domain.WgzAttendance; +import com.ruoyi.wgz.domain.WgzLeave; import com.ruoyi.wgz.domain.WgzMessage; import com.ruoyi.wgz.service.IWgzAttendanceService; +import com.ruoyi.wgz.service.IWgzLeaveService; import com.ruoyi.wgz.service.IWgzMessageService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; @@ -53,6 +57,9 @@ public class BusinessTask @Autowired private IWgzAttendanceService iWgzAttendanceService; + @Autowired + private IWgzLeaveService iWgzLeaveService; + /** * 招工任务招工时间结束自动拒绝未选择的务工者 */ @@ -217,4 +224,115 @@ public class BusinessTask } } + + /** + * 请假 + */ + public void leave(){ + List updataList = new ArrayList<>(); + List attendanceList = new ArrayList<>(); + List messagesList = new ArrayList<>(); + LocalDate now = LocalDate.now(); + Map mp = new HashMap<>(); + mp.put("data",now.toString()); + //1、获取所有正在审核的请假消息,如果超时就批量改变状态为请假超时 + List wgzLeaveList = iWgzLeaveService.list( + Wrappers.lambdaQuery() + .in(WgzLeave::getAuditorType, new String[]{"0", "1"}) + ); + for (WgzLeave wgzLeave : wgzLeaveList) { + LocalDate startTime = wgzLeave.getStartTime().toLocalDate(); + // startTime大于等于now,那么就修改状态为请假超时 + if (startTime.isEqual(now) || startTime.isAfter(now)){ + WgzLeave st = new WgzLeave() + .setId(wgzLeave.getId()) + .setAuditorType("5"); + updataList.add(st); + //组装请假超时的消息 + WgzMessage wgzMessage = new WgzMessage(). + setSenderType(USERTYPE_SYSTEM). + setRecipientType(USERTYPE_WGZ). + setRecipientId(wgzLeave.getUserId()). + setHeadline(WgzAndBgtMessageConstant.wgzMessage(mp,"117")). + setSubheading(WgzAndBgtMessageConstant.wgzMessage(mp,"118")). + setMessageLargeType(LARGE_OTHER). + setMessageSmallType(SMALL_SYSTEM); + messagesList.add(wgzMessage); } + } + if (iWgzLeaveService.updateBatchById(updataList)){ + //3、发送请假超时的消息 + if (!iWgzMessageService.saveBatch(messagesList)){ + log.error("批量添加请假超时消息失败!"); + } + //4、获取所有审批成功的请假消息,然后批量新增请假打卡数据到考勤表(如若需要日薪就需要连表查询) + List wgzLeaveListTwo = iWgzLeaveService.list( + Wrappers.lambdaQuery() + .eq(WgzLeave::getAuditorType, "2") + ); + for (WgzLeave wgzLeave : wgzLeaveListTwo) { + //获取请假的具体天数(目前的请假是全天,没有分时间段) + List formattedDates = getFormattedDates(wgzLeave.getStartTime(), wgzLeave.getEndTime()); + //业务逻辑 + for (LocalDate formattedDate : formattedDates) { + //如果formattedDate小于当前日期,就跳过 + if (formattedDate.isBefore(now)){ + continue; + } + //查询当前人、当前项目、当前打卡时间是否存在,如若存在就跳过 + int count = iWgzAttendanceService.count( + Wrappers.lambdaQuery() + .eq(WgzAttendance::getUserId, wgzLeave.getUserId()) + .eq(WgzAttendance::getRecruitId, wgzLeave.getRecruitId()) + .eq(WgzAttendance::getDate, formattedDate) + ); + if (count > 0){ + continue; + } + //获取到请假天数 + WgzAttendance wgzAttendance = new WgzAttendance(). + setRecruitId(wgzLeave.getRecruitId()). + setUserId(wgzLeave.getUserId()). + setLeaveMarkId(wgzLeave.getId()). + setDate(formattedDate). + setExceptionType("6,"); + attendanceList.add(wgzAttendance); + } + } + if (!iWgzAttendanceService.addAMissingCardRecord(attendanceList)){ + log.error("批量添加上班缺卡信息失败!"); + } + } + } + + /** + * 获取两个LocalDateTime的年月日 + * + * 2025-02-24 17:35:20 + * 2025-02-24 17:35:20 + * 得到2025-02-24 + * 2025-02-24 17:35:20 + * 2025-02-25 17:35:20 + * 得到2025-02-24 2025-02-25 + */ + public static List getFormattedDates(LocalDateTime dateTime1, LocalDateTime dateTime2) { + // 获取两个 LocalDateTime 对象对应的 LocalDate 对象 + LocalDate localDate1 = dateTime1.toLocalDate(); + LocalDate localDate2 = dateTime2.toLocalDate(); + + // 创建一个集合来存储不同的日期 + List dates = new ArrayList<>(); + if (!dates.contains(localDate1)) { + dates.add(localDate1); + } + if (!dates.contains(localDate2)) { + dates.add(localDate2); + } + + // 定义日期格式化器 + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + // 将日期集合格式化为字符串并使用空格连接 + return dates; + } + } diff --git a/ruoyi-system/src/main/java/com/ruoyi/wgz/bo/req/WgzAppDailyRecordReq.java b/ruoyi-system/src/main/java/com/ruoyi/wgz/bo/req/WgzAppDailyRecordReq.java index 08765ea..2ec5625 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/wgz/bo/req/WgzAppDailyRecordReq.java +++ b/ruoyi-system/src/main/java/com/ruoyi/wgz/bo/req/WgzAppDailyRecordReq.java @@ -2,6 +2,7 @@ package com.ruoyi.wgz.bo.req; import com.ruoyi.common.bo.PageReq; import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.NoArgsConstructor; import lombok.experimental.Accessors; @@ -11,5 +12,6 @@ import lombok.experimental.Accessors; @Accessors(chain = true) @ApiModel("日报打卡·日报记录请求对象") public class WgzAppDailyRecordReq extends PageReq { - + @ApiModelProperty(value = "务工者Id",hidden = true) + private Long userId; } diff --git a/ruoyi-system/src/main/java/com/ruoyi/wgz/bo/res/WgzUserDailyCalendarRes.java b/ruoyi-system/src/main/java/com/ruoyi/wgz/bo/res/WgzUserDailyCalendarRes.java index bd53669..363fd1b 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/wgz/bo/res/WgzUserDailyCalendarRes.java +++ b/ruoyi-system/src/main/java/com/ruoyi/wgz/bo/res/WgzUserDailyCalendarRes.java @@ -15,6 +15,18 @@ import java.util.Map; @Accessors(chain = true) @ApiModel("日报日历结构返回对象") public class WgzUserDailyCalendarRes implements Serializable { + @ApiModelProperty("招工主题") + private String recruitName; + + @ApiModelProperty("审批人ID") + private Long userId; + + @ApiModelProperty("审批人名称") + private String username; + + @ApiModelProperty("审批人头像") + private String avatarName; + @ApiModelProperty("日报日历") private Map dailyCalendar; } diff --git a/ruoyi-system/src/main/java/com/ruoyi/wgz/mapper/WgzDailyClockMapper.java b/ruoyi-system/src/main/java/com/ruoyi/wgz/mapper/WgzDailyClockMapper.java index e16a0c7..030cc5b 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/wgz/mapper/WgzDailyClockMapper.java +++ b/ruoyi-system/src/main/java/com/ruoyi/wgz/mapper/WgzDailyClockMapper.java @@ -25,7 +25,7 @@ public interface WgzDailyClockMapper extends BaseMapperPlus { * @param page 分页对象 * @return 分页查询结果 */ - Page userDailyRecordListPage(Page page); + Page userDailyRecordListPage(Page page, @Param("req") WgzAppDailyRecordReq req); Page appQueryPageList(@Param("page") Page page, @Param("dto") BgtDailyClockListDTO dto); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/wgz/service/impl/WgzDailyClockServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/wgz/service/impl/WgzDailyClockServiceImpl.java index 40e43a8..47a0add 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/wgz/service/impl/WgzDailyClockServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/wgz/service/impl/WgzDailyClockServiceImpl.java @@ -63,6 +63,9 @@ public class WgzDailyClockServiceImpl extends ServicePlusImpl(). + eq(BgtUser::getUserId, appById.getUserId()) + ); + return new WgzUserDailyCalendarRes(). + setDailyCalendar(fh). + setRecruitName(appById.getRecruitName()). + setUserId(one.getUserId()). + setUsername(one.getUsername()). + setAvatarName(one.getAvatarName()); } @Override @@ -195,10 +210,11 @@ public class WgzDailyClockServiceImpl extends ServicePlusImpl userDailyRecord(WgzAppDailyRecordReq req) { + req.setUserId(SecurityUtils.getAppUserId()); Page pe = new Page<>(); pe.setCurrent(req.getPageNum()); pe.setSize(req.getPageSize()); - return PageUtils.buildDataInfo(baseMapper.userDailyRecordListPage(pe)); + return PageUtils.buildDataInfo(baseMapper.userDailyRecordListPage(pe,req)); } @Override diff --git a/ruoyi-system/src/main/resources/mapper/wgz/WgzDailyClockMapper.xml b/ruoyi-system/src/main/resources/mapper/wgz/WgzDailyClockMapper.xml index 68cb9a3..6e37043 100644 --- a/ruoyi-system/src/main/resources/mapper/wgz/WgzDailyClockMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/wgz/WgzDailyClockMapper.xml @@ -40,9 +40,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" a.auditor_type FROM wgz_daily_clock a - LEFT JOIN bgt_user b ON (a.user_id = b.user_id and b.del_flag = 0) + LEFT JOIN wgz_user b ON (a.user_id = b.user_id and b.del_flag = 0) WHERE - a.del_flag = 0 + a.user_id = #{req.userId} and a.del_flag = 0 ORDER BY a.id DESC