From 63cde4db2f5cb918f4fbeb24d5215e297e7df060 Mon Sep 17 00:00:00 2001 From: wangqian <1406304305@qq.com> Date: Thu, 12 Mar 2026 23:01:30 +0800 Subject: [PATCH] 修改到期日后创建定时器 --- urbanops-framework/urbanops-common/src/main/java/com/zteits/urbanops/framework/common/util/date/DateUtils.java | 7 +++++++ urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/assigntasks/vo/AssignTasksSaveReqVO.java | 3 ++- urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/assigntasks/AssignTasksServiceImpl.java | 23 ++++++++++++++++++++++- urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/assigntasksinfo/AssignTasksInfoService.java | 10 ++++++++++ urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/assigntasksinfo/AssignTasksInfoServiceImpl.java | 76 +++++++++++++++++++++++++++++++++++++--------------------------------------- urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/assigntasksinfo/QuartzRemindService.java | 7 +++++-- 6 files changed, 83 insertions(+), 43 deletions(-) diff --git a/urbanops-framework/urbanops-common/src/main/java/com/zteits/urbanops/framework/common/util/date/DateUtils.java b/urbanops-framework/urbanops-common/src/main/java/com/zteits/urbanops/framework/common/util/date/DateUtils.java index 6446d5c..21055a3 100644 --- a/urbanops-framework/urbanops-common/src/main/java/com/zteits/urbanops/framework/common/util/date/DateUtils.java +++ b/urbanops-framework/urbanops-common/src/main/java/com/zteits/urbanops/framework/common/util/date/DateUtils.java @@ -3,6 +3,7 @@ package com.zteits.urbanops.framework.common.util.date; import cn.hutool.core.date.LocalDateTimeUtil; import java.time.*; +import java.time.format.DateTimeFormatter; import java.util.Calendar; import java.util.Date; @@ -18,6 +19,9 @@ public class DateUtils { */ public static final String TIME_ZONE_DEFAULT = "GMT+8"; + public static final ZoneId DEFAULT_ZONE = ZoneId.of("GMT+8"); // 东八区 + + /** * 秒转换成毫秒 */ @@ -27,6 +31,9 @@ public class DateUtils { public static final String FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND = "yyyy-MM-dd HH:mm:ss"; + public static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS"); + + /** * 将 LocalDateTime 转换成 Date * diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/assigntasks/vo/AssignTasksSaveReqVO.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/assigntasks/vo/AssignTasksSaveReqVO.java index e80ee92..b96ef28 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/assigntasks/vo/AssignTasksSaveReqVO.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/controller/admin/assigntasks/vo/AssignTasksSaveReqVO.java @@ -47,7 +47,8 @@ public class AssignTasksSaveReqVO { pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND, timezone = "GMT+8", shape = JsonFormat.Shape.STRING - ) private Date finishTime; + ) + private Date finishTime; @Schema(description = "任务备注(如:特殊要求、注意事项等)") private String note; diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/assigntasks/AssignTasksServiceImpl.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/assigntasks/AssignTasksServiceImpl.java index 22059a3..71c6233 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/assigntasks/AssignTasksServiceImpl.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/assigntasks/AssignTasksServiceImpl.java @@ -3,6 +3,7 @@ package com.zteits.urbanops.module.garden.service.assigntasks; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.zteits.urbanops.framework.common.pojo.PageResult; +import com.zteits.urbanops.framework.common.util.date.DateUtils; import com.zteits.urbanops.framework.common.util.object.BeanUtils; import com.zteits.urbanops.framework.security.core.util.SecurityFrameworkUtils; import com.zteits.urbanops.module.bpm.api.task.BpmProcessInstanceApi; @@ -15,11 +16,14 @@ import com.zteits.urbanops.module.garden.dal.mysql.assigntasks.AssignTasksMapper import com.zteits.urbanops.module.garden.dal.mysql.assigntasksinfo.AssignTasksInfoMapper; import com.zteits.urbanops.module.garden.enums.AssignTasksConstants; import com.zteits.urbanops.module.garden.service.assigntasksinfo.AssignTasksInfoService; +import com.zteits.urbanops.module.garden.service.assigntasksinfo.QuartzRemindService; +import com.zteits.urbanops.module.garden.service.unitintegraltotal.UnitIntegralService; import com.zteits.urbanops.module.system.api.permission.RoleApi; import com.zteits.urbanops.module.system.api.user.AdminUserApi; import com.zteits.urbanops.module.system.api.user.dto.AdminUserRespDTO; import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; +import org.quartz.SchedulerException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; @@ -68,6 +72,10 @@ public class AssignTasksServiceImpl implements AssignTasksService { @Resource private BpmProcessInstanceApi processInstanceApi; + @Resource + private UnitIntegralService unitIntegralService; + @Resource + private QuartzRemindService quartzRemindService; @Transactional(rollbackFor = Exception.class) @Override @@ -125,8 +133,21 @@ public class AssignTasksServiceImpl implements AssignTasksService { //修改派单信息 taskInfo.setTaskName(updateReqVO.getTaskName()); taskInfo.setTaskType(updateReqVO.getTaskType()); - taskInfo.setDeadline(updateReqVO.getDeadline().toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime()); + // 核心转换逻辑 + Date deadlineDate = updateReqVO.getDeadline(); + // 空值判断 + Date转LocalDateTime(绑定东八区,避免时区偏差) + LocalDateTime deadlineLdt = deadlineDate != null + ? deadlineDate.toInstant().atZone(DateUtils.DEFAULT_ZONE).toLocalDateTime() + : null; + taskInfo.setDeadline(deadlineLdt); assignTasksInfoMapper.updateById(taskInfo); + try { + //删除定时提醒 + quartzRemindService.removeRemindJob(taskInfo.getId()); + assignTasksInfoService.createRemindJob(taskInfo.getDeadline(), taskInfo.getId()); + } catch (SchedulerException exception) { + throw exception0(BAD_REQUEST.getCode(),"创建到期定时提醒异常"); + } } } } diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/assigntasksinfo/AssignTasksInfoService.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/assigntasksinfo/AssignTasksInfoService.java index 68827ff..90d5867 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/assigntasksinfo/AssignTasksInfoService.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/assigntasksinfo/AssignTasksInfoService.java @@ -9,6 +9,7 @@ import com.zteits.urbanops.module.garden.dal.dataobject.assigntasksinfo.AssignTa import com.zteits.urbanops.module.system.api.user.dto.AdminUserRespDTO; import jakarta.validation.Valid; +import java.time.LocalDateTime; import java.util.List; /** @@ -111,4 +112,13 @@ public interface AssignTasksInfoService { * @Param companyId */ List getUsersByCompanyId(Long companyId); + /** + * @Author wangqian + * @Description 创建到期提醒定时器 + * @Date 2026/3/12 20:51 + * @Param deadline + * @param id + * @Return void + */ + public void createRemindJob(LocalDateTime deadline, Long id); } diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/assigntasksinfo/AssignTasksInfoServiceImpl.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/assigntasksinfo/AssignTasksInfoServiceImpl.java index 6b999d3..8144401 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/assigntasksinfo/AssignTasksInfoServiceImpl.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/assigntasksinfo/AssignTasksInfoServiceImpl.java @@ -178,47 +178,45 @@ public class AssignTasksInfoServiceImpl implements AssignTasksInfoService { assignTasksInfoMapper.insert(assignTaskInfo); // add by 20260307 初始化单位积分 unitIntegralService.createUnitIntegral(CommonConstants.UNIT_INTEGRAL_UNIT_TYPE_01, String.valueOf(companyId), assignTaskInfo.getCompanyName()); - try { - // 1. 获取截止时间并校验非空 - LocalDateTime deadline = assignTasks.getDeadline(); - if (deadline == null) { - log.warn("创建定时任务失败:任务ID={},截止时间为空", assignTaskInfo.getId()); - // 可根据业务需求抛出异常或直接返回 - return; - } + //注册到期提醒定时器 + createRemindJob(assignTaskInfo.getDeadline(), assignTaskInfo.getId()); + } + } + } - // 2. 计算:当前时间 + 3小时 是否超过截止时间(即截止时间不足3小时) - LocalDateTime now = LocalDateTime.now(DEFAULT_ZONE); // 当前东八区时间 - LocalDateTime remindThreshold = now.plusHours(REMIND_ADVANCE_HOURS); - - // 核心判断:截止时间 <= (当前时间+3小时),不创建定时任务 - if (deadline.isBefore(remindThreshold)) { - String formattedDeadline = deadline.format(DATE_FORMATTER); - String formattedThreshold = remindThreshold.format(DATE_FORMATTER); - log.info("任务ID={} 无需创建定时任务:截止时间={},不足{}小时(阈值时间={})", - assignTaskInfo.getId(), formattedDeadline, REMIND_ADVANCE_HOURS, formattedThreshold); - return; // 直接返回,不创建定时任务 - } + public void createRemindJob(LocalDateTime deadline, Long id){ - // 3. 安全转换LocalDateTime到Date(指定东八区,避免时区问题) - Date triggerDate = Date.from( - deadline.atZone(DEFAULT_ZONE) // 绑定东八区(业务时区) - .toInstant() // 转为Instant - ); - - // 4. 规范日志输出(使用占位符,格式化时间) - String formattedDeadline = deadline.format(DATE_FORMATTER); - log.info("创建定时任务:任务ID={}, 截止时间(LocalDateTime)={}, 转换后Date时间={}", - assignTaskInfo.getId(), - formattedDeadline, - triggerDate); - - // 5. 注册定时任务 - quartzRemindService.registerRemindJob(assignTaskInfo.getId(), triggerDate); - } catch (SchedulerException exception) { - throw exception0(BAD_REQUEST.getCode(),"创建到期定时提醒异常"); - } - } + // 2. 计算:当前时间 + 3小时 是否超过截止时间(即截止时间不足3小时) + LocalDateTime now = LocalDateTime.now(DEFAULT_ZONE); // 当前东八区时间 + LocalDateTime remindThreshold = now.plusHours(REMIND_ADVANCE_HOURS); + + // 核心判断:截止时间 <= (当前时间+3小时),不创建定时任务 + if (deadline.isBefore(remindThreshold)) { + String formattedDeadline = deadline.format(DATE_FORMATTER); + String formattedThreshold = remindThreshold.format(DATE_FORMATTER); + log.info("任务ID={} 无需创建定时任务:截止时间={},不足{}小时(阈值时间={})", + id, formattedDeadline, REMIND_ADVANCE_HOURS, formattedThreshold); + return; // 直接返回,不创建定时任务 + } + + // 3. 安全转换LocalDateTime到Date(指定东八区,避免时区问题) + Date triggerDate = Date.from( + deadline.atZone(DEFAULT_ZONE) // 绑定东八区(业务时区) + .toInstant() // 转为Instant + ); + + // 4. 规范日志输出(使用占位符,格式化时间) + String formattedDeadline = deadline.format(DATE_FORMATTER); + log.info("创建定时任务:任务ID={}, 截止时间(LocalDateTime)={}, 转换后Date时间={}", + id, + formattedDeadline, + triggerDate); + + // 5. 注册定时任务 + try { + quartzRemindService.registerRemindJob(id, triggerDate); + } catch (SchedulerException e) { + throw exception0(BAD_REQUEST.getCode(),"创建到期定时提醒异常"); } } diff --git a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/assigntasksinfo/QuartzRemindService.java b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/assigntasksinfo/QuartzRemindService.java index 6a3f236..6bb168a 100644 --- a/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/assigntasksinfo/QuartzRemindService.java +++ b/urbanops-module-garden/src/main/java/com/zteits/urbanops/module/garden/service/assigntasksinfo/QuartzRemindService.java @@ -11,6 +11,7 @@ import java.text.SimpleDateFormat; import java.util.Date; import java.util.Set; + /** * 动态注册到期提醒Quartz任务的服务 */ @@ -36,8 +37,9 @@ public class QuartzRemindService { } // 2. 计算触发时间:到期时间 - 3小时 - Date triggerTime = new Date(expireTime.getTime() - 3 * 60 * 60 * 1000L); - + long expireTimeStamp = expireTime.getTime(); + long triggerTimeStamp = expireTimeStamp - 3 * 60 * 60 * 1000L; // 3小时毫秒数 + Date triggerTime = new Date(triggerTimeStamp); // 3. 定义JobKey(唯一标识:任务ID + 组名) JobKey jobKey = new JobKey("REMIND_JOB_" + jobId, REMIND_JOB_GROUP); @@ -87,4 +89,5 @@ public class QuartzRemindService { public Set listAllRemindJobs() throws SchedulerException { return scheduler.getJobKeys(GroupMatcher.jobGroupEquals(REMIND_JOB_GROUP)); } + } -- libgit2 0.21.4