From d68ac810c00007e54a23b71dc9dda8ebb7b7cd7b Mon Sep 17 00:00:00 2001 From: HuangHuiKang Date: Thu, 9 Jul 2026 16:11:45 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E4=BF=AE=E6=94=B9=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E8=AE=BE=E5=A4=87=E6=A8=A1=E5=9D=97=E5=8F=8A=E6=A8=A1=E5=85=B7?= =?UTF-8?q?=E6=A8=A1=E5=9D=97-=E7=BB=B4=E4=BF=AE=E5=8D=95=E3=80=81?= =?UTF-8?q?=E5=B7=A5=E5=8D=95=E7=AE=A1=E7=90=86=E6=8E=A8=E9=80=81=E7=AB=99?= =?UTF-8?q?=E5=86=85=E4=BF=A1=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mold/MoldPressureNetRecordController.java | 14 +- .../admin/device/enums/TaskTypeEnum.java | 7 +- .../scheduler/TaskSchedulerManager.java | 26 ++- .../MoldTaskManagementController.java | 8 + .../coretask/GenerateMoldWorkOrderTask.java | 151 ++++++++++++++++++ .../MoldTaskManagementUpdateEnabledReqVO.java | 19 +++ .../coretask/GenerateWorkOrderTask.java | 29 +++- .../service/dvrepair/DvRepairServiceImpl.java | 27 +--- .../moldrepair/MoldRepairServiceImpl.java | 25 +++ .../MoldTaskManagementService.java | 2 + .../MoldTaskManagementServiceImpl.java | 129 +++++++++++++++ .../notify/MesNotifyMessageService.java | 61 +++++++ .../TaskManagementServiceImpl.java | 27 +++- 13 files changed, 490 insertions(+), 35 deletions(-) create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/moldtaskmanagement/scheduled/coretask/GenerateMoldWorkOrderTask.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/moldtaskmanagement/vo/MoldTaskManagementUpdateEnabledReqVO.java create mode 100644 yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/notify/MesNotifyMessageService.java diff --git a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/mold/MoldPressureNetRecordController.java b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/mold/MoldPressureNetRecordController.java index 3d4d8484c..3300392e4 100644 --- a/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/mold/MoldPressureNetRecordController.java +++ b/yudao-module-erp/yudao-module-erp-biz/src/main/java/cn/iocoder/yudao/module/erp/controller/admin/mold/MoldPressureNetRecordController.java @@ -45,14 +45,14 @@ public class MoldPressureNetRecordController { @PostMapping("/create") @Operation(summary = "创建子模具压网记录") - @PreAuthorize("@ss.hasPermission('erp:mold-brand:create')") + @PreAuthorize("@ss.hasPermission('erp:mold-pressure-net-record:create')") public CommonResult createMoldPressureNetRecord(@Valid @RequestBody MoldPressureNetRecordSaveReqVO createReqVO) { return success(moldPressureNetRecordService.createMoldPressureNetRecord(createReqVO)); } @PostMapping("/batch-create") @Operation(summary = "批量创建子模具压网记录") - @PreAuthorize("@ss.hasPermission('erp:mold-brand:create')") + @PreAuthorize("@ss.hasPermission('erp:mold-pressure-net-record:create')") public CommonResult createMoldPressureNetRecordBatch(@Valid @RequestBody List createReqVOList) { moldPressureNetRecordService.createBatchMoldPressureNetRecord(createReqVOList); return success(true); @@ -60,7 +60,7 @@ public class MoldPressureNetRecordController { @PutMapping("/update") @Operation(summary = "更新子模具压网记录") - @PreAuthorize("@ss.hasPermission('erp:mold-brand:update')") + @PreAuthorize("@ss.hasPermission('erp:mold-pressure-net-record:update')") public CommonResult updateMoldPressureNetRecord(@Valid @RequestBody MoldPressureNetRecordSaveReqVO updateReqVO) { moldPressureNetRecordService.updateMoldPressureNetRecord(updateReqVO); return success(true); @@ -69,7 +69,7 @@ public class MoldPressureNetRecordController { @DeleteMapping("/delete") @Operation(summary = "删除子模具压网记录") @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('erp:mold-brand:delete')") + @PreAuthorize("@ss.hasPermission('erp:mold-pressure-net-record:delete')") public CommonResult deleteMoldPressureNetRecord(@RequestParam("id") Long id) { moldPressureNetRecordService.deleteMoldPressureNetRecord(id); return success(true); @@ -78,7 +78,7 @@ public class MoldPressureNetRecordController { @GetMapping("/get") @Operation(summary = "获得子模具压网记录") @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('erp:mold-brand:query')") + @PreAuthorize("@ss.hasPermission('erp:mold-pressure-net-record:query')") public CommonResult getMoldPressureNetRecord(@RequestParam("id") Long id) { MoldPressureNetRecordDO record = moldPressureNetRecordService.getMoldPressureNetRecord(id); return success(BeanUtils.toBean(record, MoldPressureNetRecordRespVO.class)); @@ -86,7 +86,7 @@ public class MoldPressureNetRecordController { @GetMapping("/page") @Operation(summary = "获得子模具压网记录分页") - @PreAuthorize("@ss.hasPermission('erp:mold-brand:query')") + @PreAuthorize("@ss.hasPermission('erp:mold-pressure-net-record:query')") public CommonResult> getMoldPressureNetRecordPage(@Valid MoldPressureNetRecordPageReqVO pageReqVO) { PageResult pageResult = moldPressureNetRecordService.getMoldPressureNetRecordPage(pageReqVO); return success(BeanUtils.toBean(pageResult, MoldPressureNetRecordRespVO.class)); @@ -94,7 +94,7 @@ public class MoldPressureNetRecordController { @GetMapping("/export-excel") @Operation(summary = "导出子模具压网记录 Excel") - @PreAuthorize("@ss.hasPermission('erp:mold-brand:query')") + @PreAuthorize("@ss.hasPermission('erp:mold-pressure-net-record:export')") @ApiAccessLog(operateType = EXPORT) public void exportMoldPressureNetRecordExcel(@Valid MoldPressureNetRecordPageReqVO pageReqVO, HttpServletResponse response) throws IOException { diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/enums/TaskTypeEnum.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/enums/TaskTypeEnum.java index 1642fddd2..2d36a2458 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/enums/TaskTypeEnum.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/enums/TaskTypeEnum.java @@ -9,7 +9,8 @@ import lombok.Getter; public enum TaskTypeEnum { DEVICE("DEVICE", "设备数据采集"), - WORK_ORDER("WORK_ORDER", "工单生成"); + WORK_ORDER("WORK_ORDER", "工单生成"), + MOLD_WORK_ORDER("MOLD_WORK_ORDER", "模具工单生成"); /** * 任务类型编码 @@ -53,8 +54,10 @@ public enum TaskTypeEnum { return 1000000L + baseId; case WORK_ORDER: return 2000000L + baseId; + case MOLD_WORK_ORDER: + return 3000000L + baseId; default: return 9000000L + baseId; } } -} \ No newline at end of file +} diff --git a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/scheduled/scheduler/TaskSchedulerManager.java b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/scheduled/scheduler/TaskSchedulerManager.java index 37b7bde87..5a9e857fc 100644 --- a/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/scheduled/scheduler/TaskSchedulerManager.java +++ b/yudao-module-iot/yudao-module-iot-biz/src/main/java/cn/iocoder/yudao/module/iot/controller/admin/device/scheduled/scheduler/TaskSchedulerManager.java @@ -278,4 +278,28 @@ public class TaskSchedulerManager { return stopTask(taskId); } -} \ No newline at end of file + + /** + * 启动模具工单任务 + */ + public boolean startMoldWorkOrderTask(Long configId, String cronExpression) { + Long taskId = TaskTypeEnum.MOLD_WORK_ORDER.generateTaskId(configId); + return startCronTask(taskId, TaskTypeEnum.MOLD_WORK_ORDER.getCode(), + "moldWorkOrder:" + configId, cronExpression); + } + + /** + * 停止模具工单任务 + */ + public boolean stopMoldWorkOrderTask(Long configId) { + if (configId == null) { + logger.warn("模具工单配置ID不能为空"); + return false; + } + + Long taskId = TaskTypeEnum.MOLD_WORK_ORDER.generateTaskId(configId); + logger.info("停止模具工单任务,配置ID: {}, 生成的任务ID: {}", configId, taskId); + + return stopTask(taskId); + } +} diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/moldtaskmanagement/MoldTaskManagementController.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/moldtaskmanagement/MoldTaskManagementController.java index 5bc683ab3..8dc9d51e4 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/moldtaskmanagement/MoldTaskManagementController.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/moldtaskmanagement/MoldTaskManagementController.java @@ -145,6 +145,14 @@ public class MoldTaskManagementController { return success(true); } + @PutMapping("/update-enabled") + @Operation(summary = "更新模具任务管理启用状态") + @PreAuthorize("@ss.hasPermission('mes:mold-task-management:update')") + public CommonResult updateMoldTaskManagementEnabled(@Valid @RequestBody MoldTaskManagementUpdateEnabledReqVO updateEnabledReqVO) { + moldtaskManagementService.updateMoldTaskManagementEnabled(updateEnabledReqVO); + return success(true); + } + private PageResult buildPageCreatorName(PageResult planMaintenanceRespVOPageResult) { for (MoldTaskManagementRespVO planMaintenanceRespVO : planMaintenanceRespVOPageResult.getList()) { diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/moldtaskmanagement/scheduled/coretask/GenerateMoldWorkOrderTask.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/moldtaskmanagement/scheduled/coretask/GenerateMoldWorkOrderTask.java new file mode 100644 index 000000000..25e932ff1 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/moldtaskmanagement/scheduled/coretask/GenerateMoldWorkOrderTask.java @@ -0,0 +1,151 @@ +package cn.iocoder.yudao.module.mes.controller.admin.moldtaskmanagement.scheduled.coretask; + +import cn.iocoder.yudao.module.common.dal.dataobject.mold.MoldBrandDO; +import cn.iocoder.yudao.module.common.dal.dataobject.moldticketmanagement.MoldTicketManagementDO; +import cn.iocoder.yudao.module.common.dal.dataobject.moldticketresults.MoldTicketResultsDO; +import cn.iocoder.yudao.module.common.dal.mysql.mold.MoldBrandMapper; +import cn.iocoder.yudao.module.common.dal.mysql.moldticketmanagement.MoldTicketManagementMapper; +import cn.iocoder.yudao.module.common.dal.mysql.moldticketresults.MoldTicketResultsMapper; +import cn.iocoder.yudao.module.iot.controller.admin.device.enums.TaskTypeEnum; +import cn.iocoder.yudao.module.iot.controller.admin.device.scheduled.core.Task; +import cn.iocoder.yudao.module.mes.dal.dataobject.moldsubject.MoldSubjectDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.moldtaskmanagement.MoldTaskManagementDO; +import cn.iocoder.yudao.module.mes.dal.dataobject.subjectmoldplan.SubjectMoldPlanDO; +import cn.iocoder.yudao.module.mes.dal.mysql.moldsubject.MoldSubjectMapper; +import cn.iocoder.yudao.module.mes.dal.mysql.moldtaskmanagement.MoldTaskManagementMapper; +import cn.iocoder.yudao.module.mes.dal.mysql.subjectmoldplan.SubjectMoldPlanMapper; +import cn.iocoder.yudao.module.mes.service.notify.MesNotifyMessageService; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.SimpleDateFormat; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.Arrays; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Random; +import java.util.stream.Collectors; + +@Component +public class GenerateMoldWorkOrderTask implements Task { + + private static final Logger logger = LoggerFactory.getLogger(GenerateMoldWorkOrderTask.class); + private static final String MOLD_TASK_TICKET_CREATE_NOTIFY_TEMPLATE_CODE = "mes_mold_task_ticket_create"; + + @Resource + private MoldTaskManagementMapper moldTaskManagementMapper; + @Resource + private MoldBrandMapper moldBrandMapper; + @Resource + private MoldTicketManagementMapper moldTicketManagementMapper; + @Resource + private SubjectMoldPlanMapper subjectMoldPlanMapper; + @Resource + private MoldSubjectMapper moldSubjectMapper; + @Resource + private MoldTicketResultsMapper moldTicketResultsMapper; + @Resource + private MesNotifyMessageService mesNotifyMessageService; + + @Override + public String getTaskType() { + return TaskTypeEnum.MOLD_WORK_ORDER.getCode(); + } + + @Override + public void execute(Long taskId, String taskParam) { + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + logger.info("执行模具工单生成任务,任务ID: {}, 参数: {}, 时间: {}", + taskId, taskParam, sdf.format(new Date())); + generateMoldWorkOrder(taskId); + } catch (Exception e) { + logger.error("执行模具工单生成任务异常,任务ID: {}", taskId, e); + } + } + + private void generateMoldWorkOrder(Long taskId) { + Long id = taskId - 3000000L; + MoldTaskManagementDO moldTaskManagementDO = moldTaskManagementMapper.selectById(id); + if (moldTaskManagementDO == null) { + return; + } + + List moldIds = Arrays.stream(moldTaskManagementDO.getMoldList().split(",")) + .map(String::trim) + .map(Long::valueOf) + .collect(Collectors.toList()); + + List subjectMoldPlanDOList = subjectMoldPlanMapper.selectList( + Wrappers.lambdaQuery().eq(SubjectMoldPlanDO::getPlanId, moldTaskManagementDO.getProjectForm())); + List moldSubjectDOList = subjectMoldPlanDOList.stream() + .map(subjectMoldPlanDO -> moldSubjectMapper.selectById(subjectMoldPlanDO.getSubjectId())) + .filter(Objects::nonNull) + .collect(Collectors.toList()); + + for (Long moldId : moldIds) { + MoldBrandDO moldDO = moldBrandMapper.selectById(moldId); + if (moldDO == null) { + continue; + } + + MoldTicketManagementDO moldTicketManagementDO = new MoldTicketManagementDO(); + moldTicketManagementDO.setTaskId(moldTaskManagementDO.getId()); + moldTicketManagementDO.setPlanNo(generatePrefixedOrderNo()); + moldTicketManagementDO.setPlanId(moldTaskManagementDO.getProjectForm()); + moldTicketManagementDO.setMoldName(moldDO.getName()); + moldTicketManagementDO.setPlanType(moldTaskManagementDO.getTaskType()); + moldTicketManagementDO.setConfigName(moldTaskManagementDO.getName()); + moldTicketManagementDO.setTaskEndTime(moldTaskManagementDO.getEndDate() != null + ? moldTaskManagementDO.getEndDate().atStartOfDay() : null); + moldTicketManagementDO.setCreator("1"); + moldTicketManagementDO.setUpdater("1"); + moldTicketManagementMapper.insert(moldTicketManagementDO); + sendMoldTicketCreateNotifyMessage(moldTaskManagementDO, moldTicketManagementDO); + + for (MoldSubjectDO moldSubjectDO : moldSubjectDOList) { + MoldTicketResultsDO moldTicketResultsDO = new MoldTicketResultsDO(); + moldTicketResultsDO.setInspectionItemName(moldSubjectDO.getSubjectName()); + moldTicketResultsDO.setInspectionMethod(moldSubjectDO.getInspectionMethod()); + moldTicketResultsDO.setJudgmentCriteria(moldSubjectDO.getJudgmentCriteria()); + moldTicketResultsDO.setManagementId(moldTicketManagementDO.getId()); + moldTicketResultsDO.setMoldId(moldId); + moldTicketResultsDO.setValueType(moldSubjectDO.getValueType()); + moldTicketResultsDO.setCreator("1"); + moldTicketResultsDO.setUpdater("1"); + moldTicketResultsMapper.insert(moldTicketResultsDO); + } + } + } + + private void sendMoldTicketCreateNotifyMessage(MoldTaskManagementDO moldTaskManagementDO, + MoldTicketManagementDO moldTicketManagementDO) { + Map templateParams = new HashMap<>(); + templateParams.put("ticketId", moldTicketManagementDO.getId()); + templateParams.put("planNo", Objects.toString(moldTicketManagementDO.getPlanNo(), "")); + templateParams.put("configName", Objects.toString(moldTicketManagementDO.getConfigName(), "")); + templateParams.put("moldName", Objects.toString(moldTicketManagementDO.getMoldName(), "")); + templateParams.put("taskEndTime", formatNotifyDateTime(moldTicketManagementDO.getTaskEndTime())); + + mesNotifyMessageService.sendToAdmins(moldTaskManagementDO.getOperableUsers(), MOLD_TASK_TICKET_CREATE_NOTIFY_TEMPLATE_CODE, + templateParams, "模具工单", moldTicketManagementDO.getId()); + } + + private String formatNotifyDateTime(LocalDateTime dateTime) { + return dateTime == null ? "" : dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + } + + public static String generatePrefixedOrderNo() { + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); + String date = sdf.format(new Date()); + String randomNum = String.format("%06d", new Random().nextInt(1000000)); + return "E" + date + randomNum; + } +} diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/moldtaskmanagement/vo/MoldTaskManagementUpdateEnabledReqVO.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/moldtaskmanagement/vo/MoldTaskManagementUpdateEnabledReqVO.java new file mode 100644 index 000000000..02cb097fb --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/moldtaskmanagement/vo/MoldTaskManagementUpdateEnabledReqVO.java @@ -0,0 +1,19 @@ +package cn.iocoder.yudao.module.mes.controller.admin.moldtaskmanagement.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +@Schema(description = "模具任务管理 - 更新启用状态 Request VO") +@Data +public class MoldTaskManagementUpdateEnabledReqVO { + + @Schema(description = "任务ID", required = true, example = "1024") + @NotNull(message = "任务ID不能为空") + private Long id; + + @Schema(description = "是否启用", required = true, example = "true") + @NotNull(message = "启用状态不能为空") + private Boolean enabled; +} diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/taskmanagement/scheduled/coretask/GenerateWorkOrderTask.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/taskmanagement/scheduled/coretask/GenerateWorkOrderTask.java index 1d23529cb..524006bb2 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/taskmanagement/scheduled/coretask/GenerateWorkOrderTask.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/taskmanagement/scheduled/coretask/GenerateWorkOrderTask.java @@ -15,6 +15,7 @@ import cn.iocoder.yudao.module.mes.dal.mysql.subjectplan.SubjectPlanMapper; import cn.iocoder.yudao.module.mes.dal.mysql.taskmanagement.TaskManagementMapper; import cn.iocoder.yudao.module.mes.dal.mysql.ticketmanagement.TicketManagementMapper; import cn.iocoder.yudao.module.mes.dal.mysql.ticketresults.TicketResultsMapper; +import cn.iocoder.yudao.module.mes.service.notify.MesNotifyMessageService; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -22,9 +23,14 @@ import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.text.SimpleDateFormat; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; import java.util.Arrays; import java.util.Date; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.Objects; import java.util.Random; import java.util.stream.Collectors; @@ -33,6 +39,7 @@ import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionU @Component public class GenerateWorkOrderTask implements Task { private static final Logger logger = LoggerFactory.getLogger(GenerateWorkOrderTask.class); + private static final String TASK_TICKET_CREATE_NOTIFY_TEMPLATE_CODE = "mes_task_ticket_create"; @Resource private TaskManagementMapper taskManagementMapper; @@ -52,6 +59,9 @@ public class GenerateWorkOrderTask implements Task { @Resource private TicketResultsMapper ticketResultsMapper; + @Resource + private MesNotifyMessageService mesNotifyMessageService; + @Override public String getTaskType() { @@ -109,6 +119,7 @@ public class GenerateWorkOrderTask implements Task { ticketManagementDO.setCreator("1"); ticketManagementDO.setUpdater("1"); ticketManagementMapper.insert(ticketManagementDO); + sendTicketCreateNotifyMessage(taskManagementDO, ticketManagementDO); List subjectPlanDOList = subjectPlanMapper.selectList(Wrappers.lambdaQuery().eq(SubjectPlanDO::getPlanId, ticketManagementDO.getPlanId())); for (SubjectPlanDO subjectPlanDO : subjectPlanDOList) { @@ -130,6 +141,22 @@ public class GenerateWorkOrderTask implements Task { } } + private void sendTicketCreateNotifyMessage(TaskManagementDO taskManagementDO, TicketManagementDO ticketManagementDO) { + Map templateParams = new HashMap<>(); + templateParams.put("ticketId", ticketManagementDO.getId()); + templateParams.put("planNo", Objects.toString(ticketManagementDO.getPlanNo(), "")); + templateParams.put("configName", Objects.toString(ticketManagementDO.getConfigName(), "")); + templateParams.put("deviceName", Objects.toString(ticketManagementDO.getDeviceName(), "")); + templateParams.put("taskEndTime", formatNotifyDateTime(ticketManagementDO.getTaskEndTime())); + + mesNotifyMessageService.sendToAdmins(taskManagementDO.getOperableUsers(), TASK_TICKET_CREATE_NOTIFY_TEMPLATE_CODE, + templateParams, "设备工单", ticketManagementDO.getId()); + } + + private String formatNotifyDateTime(LocalDateTime dateTime) { + return dateTime == null ? "" : dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + } + /** * 带前缀的时间戳单号 */ @@ -140,4 +167,4 @@ public class GenerateWorkOrderTask implements Task { return "E" + date + randomNum; } -} \ No newline at end of file +} diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/dvrepair/DvRepairServiceImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/dvrepair/DvRepairServiceImpl.java index bbd8b1431..5c789bd18 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/dvrepair/DvRepairServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/dvrepair/DvRepairServiceImpl.java @@ -16,8 +16,7 @@ import cn.iocoder.yudao.module.mes.dal.dataobject.dvrepair.DvRepairLineDO; import cn.iocoder.yudao.module.mes.dal.mysql.deviceledger.DeviceLedgerMapper; import cn.iocoder.yudao.module.mes.dal.mysql.dvrepair.DvRepairLineMapper; import cn.iocoder.yudao.module.mes.dal.mysql.dvrepair.DvRepairMapper; -import cn.iocoder.yudao.module.system.api.notify.NotifyMessageSendApi; -import cn.iocoder.yudao.module.system.api.notify.dto.NotifySendSingleToUserReqDTO; +import cn.iocoder.yudao.module.mes.service.notify.MesNotifyMessageService; import com.alibaba.excel.util.StringUtils; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; @@ -56,7 +55,7 @@ public class DvRepairServiceImpl implements DvRepairService { @Resource private DvRepairLineMapper dvRepairLineMapper; @Resource - private NotifyMessageSendApi notifyMessageSendApi; + private MesNotifyMessageService mesNotifyMessageService; @Resource @@ -90,17 +89,6 @@ public class DvRepairServiceImpl implements DvRepairService { } private void sendCreateNotifyMessage(DvRepairDO dvRepair) { - if (StringUtils.isBlank(dvRepair.getAcceptedBy())) { - return; - } - Long acceptedUserId; - try { - acceptedUserId = Long.valueOf(dvRepair.getAcceptedBy().trim()); - } catch (NumberFormatException ex) { - log.warn("[sendCreateNotifyMessage][维修人员({})不是有效用户编号,跳过站内信发送]", dvRepair.getAcceptedBy()); - return; - } - Map templateParams = new HashMap<>(); templateParams.put("repairId", dvRepair.getId()); templateParams.put("repairCode", Objects.toString(dvRepair.getRepairCode(), "")); @@ -111,15 +99,8 @@ public class DvRepairServiceImpl implements DvRepairService { templateParams.put("faultDescription", Objects.toString(dvRepair.getFaultDescription(), "")); templateParams.put("requireDate", formatNotifyDateTime(dvRepair.getRequireDate())); - NotifySendSingleToUserReqDTO reqDTO = new NotifySendSingleToUserReqDTO(); - reqDTO.setUserId(acceptedUserId); - reqDTO.setTemplateCode(DV_REPAIR_CREATE_NOTIFY_TEMPLATE_CODE); - reqDTO.setTemplateParams(templateParams); - try { - notifyMessageSendApi.sendSingleMessageToAdmin(reqDTO); - } catch (Exception ex) { - log.warn("[sendCreateNotifyMessage][维修单({})站内信发送失败,跳过通知]", dvRepair.getId(), ex); - } + mesNotifyMessageService.sendToAdmin(dvRepair.getAcceptedBy(), DV_REPAIR_CREATE_NOTIFY_TEMPLATE_CODE, + templateParams, "设备维修单", dvRepair.getId()); } private String formatNotifyDateTime(LocalDateTime dateTime) { diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/moldrepair/MoldRepairServiceImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/moldrepair/MoldRepairServiceImpl.java index 65dd42f03..7d5bfb403 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/moldrepair/MoldRepairServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/moldrepair/MoldRepairServiceImpl.java @@ -20,6 +20,7 @@ import cn.iocoder.yudao.module.common.dal.dataobject.moldrepair.MoldRepairLineDO import cn.iocoder.yudao.module.common.dal.mysql.moldrepair.MoldRepairLineMapper; import cn.iocoder.yudao.module.common.dal.mysql.moldrepair.MoldRepairMapper; import cn.iocoder.yudao.module.common.dal.mysql.mold.MoldMapper; +import cn.iocoder.yudao.module.mes.service.notify.MesNotifyMessageService; import com.alibaba.excel.util.StringUtils; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; @@ -55,6 +56,8 @@ import cn.iocoder.yudao.framework.common.exception.ServiceException; @Validated public class MoldRepairServiceImpl implements MoldRepairService { + private static final String MOLD_REPAIR_CREATE_NOTIFY_TEMPLATE_CODE = "mes_mold_repair_create"; + @Resource private MoldRepairMapper moldRepairMapper; @Resource @@ -65,6 +68,8 @@ public class MoldRepairServiceImpl implements MoldRepairService { private MoldBrandMapper moldBrandMapper; @Resource private AutoCodeUtil autoCodeUtil; + @Resource + private MesNotifyMessageService mesNotifyMessageService; @Override @Transactional(rollbackFor = Exception.class) @@ -84,6 +89,7 @@ public class MoldRepairServiceImpl implements MoldRepairService { // 插入 MoldRepairDO moldRepair = BeanUtils.toBean(createReqVO, MoldRepairDO.class); moldRepairMapper.insert(moldRepair); + sendCreateNotifyMessage(moldRepair); // 插入子表 createMoldRepairLineList(moldRepair.getId(), createReqVO.getMoldRepairLines()); @@ -91,6 +97,25 @@ public class MoldRepairServiceImpl implements MoldRepairService { return moldRepair.getId(); } + private void sendCreateNotifyMessage(MoldRepairDO moldRepair) { + Map templateParams = new HashMap<>(); + templateParams.put("repairId", moldRepair.getId()); + templateParams.put("repairCode", Objects.toString(moldRepair.getRepairCode(), "")); + templateParams.put("repairName", Objects.toString(moldRepair.getRepairName(), "")); + templateParams.put("moldCode", Objects.toString(moldRepair.getMoldCode(), "")); + templateParams.put("moldName", Objects.toString(moldRepair.getMoldName(), "")); + templateParams.put("faultPhenomenon", Objects.toString(moldRepair.getFaultPhenomenon(), "")); + templateParams.put("faultDescription", Objects.toString(moldRepair.getFaultDescription(), "")); + templateParams.put("requireDate", formatNotifyDateTime(moldRepair.getRequireDate())); + + mesNotifyMessageService.sendToAdmin(moldRepair.getAcceptedBy(), MOLD_REPAIR_CREATE_NOTIFY_TEMPLATE_CODE, + templateParams, "模具维修单", moldRepair.getId()); + } + + private String formatNotifyDateTime(LocalDateTime dateTime) { + return dateTime == null ? "" : dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + } + @Override @Transactional(rollbackFor = Exception.class) public void updateMoldRepair(MoldRepairSaveReqVO updateReqVO) { diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/moldtaskmanagement/MoldTaskManagementService.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/moldtaskmanagement/MoldTaskManagementService.java index 29de0db19..9f82ada26 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/moldtaskmanagement/MoldTaskManagementService.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/moldtaskmanagement/MoldTaskManagementService.java @@ -55,4 +55,6 @@ public interface MoldTaskManagementService { void createMoldTicket(Long id); void createMoldTicketDirect(@Valid MoldTaskManagementCreateTicketReqVO createReqVO); + + void updateMoldTaskManagementEnabled(@Valid MoldTaskManagementUpdateEnabledReqVO updateEnabledReqVO); } diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/moldtaskmanagement/MoldTaskManagementServiceImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/moldtaskmanagement/MoldTaskManagementServiceImpl.java index 74b5e10e6..baa472c01 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/moldtaskmanagement/MoldTaskManagementServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/moldtaskmanagement/MoldTaskManagementServiceImpl.java @@ -4,6 +4,7 @@ import cn.iocoder.yudao.framework.security.core.LoginUser; import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import cn.iocoder.yudao.module.iot.controller.admin.device.scheduled.scheduler.TaskSchedulerManager; import cn.iocoder.yudao.module.common.controller.admin.moldticketresults.vo.MoldTicketResultsSaveReqVO; import cn.iocoder.yudao.module.common.dal.dataobject.mold.MoldBrandDO; import cn.iocoder.yudao.module.common.dal.dataobject.moldticketmanagement.MoldTicketManagementDO; @@ -14,6 +15,7 @@ import cn.iocoder.yudao.module.common.dal.mysql.moldticketresults.MoldTicketResu import cn.iocoder.yudao.module.mes.controller.admin.moldtaskmanagement.vo.MoldTaskManagementCreateTicketReqVO; import cn.iocoder.yudao.module.mes.controller.admin.moldtaskmanagement.vo.MoldTaskManagementPageReqVO; import cn.iocoder.yudao.module.mes.controller.admin.moldtaskmanagement.vo.MoldTaskManagementSaveReqVO; +import cn.iocoder.yudao.module.mes.controller.admin.moldtaskmanagement.vo.MoldTaskManagementUpdateEnabledReqVO; import cn.iocoder.yudao.module.mes.controller.admin.moldticketresults.enums.MoldJobResultEnum; import cn.iocoder.yudao.module.mes.dal.dataobject.moldplanmaintenance.MoldPlanMaintenanceDO; import cn.iocoder.yudao.module.mes.dal.dataobject.moldsubject.MoldSubjectDO; @@ -23,7 +25,14 @@ import cn.iocoder.yudao.module.mes.dal.mysql.moldplanmaintenance.MoldPlanMainten import cn.iocoder.yudao.module.mes.dal.mysql.moldsubject.MoldSubjectMapper; import cn.iocoder.yudao.module.mes.dal.mysql.moldtaskmanagement.MoldTaskManagementMapper; import cn.iocoder.yudao.module.mes.dal.mysql.subjectmoldplan.SubjectMoldPlanMapper; +import cn.iocoder.yudao.module.mes.service.notify.MesNotifyMessageService; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.cronutils.model.Cron; +import com.cronutils.model.CronType; +import com.cronutils.model.definition.CronDefinitionBuilder; +import com.cronutils.model.time.ExecutionTime; +import com.cronutils.parser.CronParser; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; @@ -31,17 +40,24 @@ import org.springframework.validation.annotation.Validated; import javax.annotation.Resource; import java.text.SimpleDateFormat; +import java.time.Duration; import java.time.LocalDate; import java.time.LocalDateTime; +import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Objects; import java.util.Random; import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.TASK_CORN_NOT_EXISTS; +import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.TASK_CORN_NOT_LE_HOUR; import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.TASK_MANAGEMENT_NOT_EXISTS; @Service @@ -49,6 +65,8 @@ import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.TASK_MANAGEME @Validated public class MoldTaskManagementServiceImpl implements MoldTaskManagementService { + private static final String MOLD_TASK_TICKET_CREATE_NOTIFY_TEMPLATE_CODE = "mes_mold_task_ticket_create"; + @Resource private MoldTaskManagementMapper moldtaskManagementMapper; @Resource @@ -64,13 +82,44 @@ public class MoldTaskManagementServiceImpl implements MoldTaskManagementService @Resource private MoldSubjectMapper moldSubjectMapper; + @Resource + private TaskSchedulerManager taskSchedulerManager; + + @Resource + private MesNotifyMessageService mesNotifyMessageService; + @Override public Long createMoldTaskManagement(MoldTaskManagementSaveReqVO createReqVO) { + isCronIntervalAtLeastOneHour(createReqVO.getCronExpression()); MoldTaskManagementDO moldtaskManagement = BeanUtils.toBean(createReqVO, MoldTaskManagementDO.class); moldtaskManagementMapper.insert(moldtaskManagement); return moldtaskManagement.getId(); } + private void isCronIntervalAtLeastOneHour(String cronExpr) { + try { + if (StringUtils.isBlank(cronExpr)) { + return; + } + + CronParser parser = new CronParser(CronDefinitionBuilder.instanceDefinitionFor(CronType.QUARTZ)); + Cron cron = parser.parse(cronExpr); + cron.validate(); + + ExecutionTime executionTime = ExecutionTime.forCron(cron); + ZonedDateTime now = ZonedDateTime.now(); + ZonedDateTime next1 = executionTime.nextExecution(now).get(); + ZonedDateTime next2 = executionTime.nextExecution(next1).get(); + + Duration duration = Duration.between(next1, next2); + if (duration.toHours() < 1) { + throw exception(TASK_CORN_NOT_LE_HOUR); + } + } catch (Exception e) { + throw exception(TASK_CORN_NOT_LE_HOUR); + } + } + @Override public void updateMoldTaskManagement(MoldTaskManagementSaveReqVO updateReqVO) { validateMoldTaskManagementExists(updateReqVO.getId()); @@ -170,6 +219,7 @@ public class MoldTaskManagementServiceImpl implements MoldTaskManagementService moldticketManagementDO.setConfigName(configName); moldticketManagementDO.setTaskEndTime(endDate !=null ? endDate.atStartOfDay(): null); moldticketManagementMapper.insert(moldticketManagementDO); + sendMoldTicketCreateNotifyMessage(taskId, moldticketManagementDO); List createdResults = new ArrayList<>(); for (int index = 0; index < moldSubjectDOList.size(); index++) { @@ -191,6 +241,85 @@ public class MoldTaskManagementServiceImpl implements MoldTaskManagementService } } + private void sendMoldTicketCreateNotifyMessage(Long taskId, MoldTicketManagementDO moldticketManagementDO) { + MoldTaskManagementDO moldtaskManagementDO = moldtaskManagementMapper.selectById(taskId); + if (moldtaskManagementDO == null) { + return; + } + Map templateParams = new HashMap<>(); + templateParams.put("ticketId", moldticketManagementDO.getId()); + templateParams.put("planNo", Objects.toString(moldticketManagementDO.getPlanNo(), "")); + templateParams.put("configName", Objects.toString(moldticketManagementDO.getConfigName(), "")); + templateParams.put("moldName", Objects.toString(moldticketManagementDO.getMoldName(), "")); + templateParams.put("taskEndTime", formatNotifyDateTime(moldticketManagementDO.getTaskEndTime())); + + mesNotifyMessageService.sendToAdmins(moldtaskManagementDO.getOperableUsers(), MOLD_TASK_TICKET_CREATE_NOTIFY_TEMPLATE_CODE, + templateParams, "模具工单", moldticketManagementDO.getId()); + } + + private String formatNotifyDateTime(LocalDateTime dateTime) { + return dateTime == null ? "" : dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + } + + @Override + public void updateMoldTaskManagementEnabled(MoldTaskManagementUpdateEnabledReqVO updateEnabledReqVO) { + MoldTaskManagementDO task = moldtaskManagementMapper.selectById(updateEnabledReqVO.getId()); + if (task == null) { + throw exception(TASK_MANAGEMENT_NOT_EXISTS); + } + if (StringUtils.isBlank(task.getCronExpression())) { + throw exception(TASK_CORN_NOT_EXISTS); + } + + if (Objects.equals(task.getEnabled(), updateEnabledReqVO.getEnabled())) { + return; + } + + updateMoldTaskStatusInDB(task.getId(), updateEnabledReqVO.getEnabled()); + if (updateEnabledReqVO.getEnabled()) { + enableMoldTaskSchedule(task); + } else { + disableMoldTaskSchedule(task); + } + } + + private void enableMoldTaskSchedule(MoldTaskManagementDO task) { + if (StringUtils.isBlank(task.getCronExpression())) { + log.warn("模具任务{}没有配置Cron表达式,无法启用调度", task.getId()); + return; + } + try { + boolean success = taskSchedulerManager.startMoldWorkOrderTask(task.getId(), task.getCronExpression()); + if (success) { + log.info("模具任务{}调度启动成功", task.getId()); + } else { + log.error("模具任务{}调度启动失败", task.getId()); + } + } catch (Exception e) { + log.error("模具任务{}调度启动异常", task.getId(), e); + } + } + + private void disableMoldTaskSchedule(MoldTaskManagementDO task) { + try { + boolean success = taskSchedulerManager.stopMoldWorkOrderTask(task.getId()); + if (success) { + log.info("模具任务{}调度停止成功", task.getId()); + } else { + log.warn("模具任务{}调度停止失败,可能任务不存在或已停止", task.getId()); + } + } catch (Exception e) { + log.error("模具任务{}调度停止异常", task.getId(), e); + } + } + + private void updateMoldTaskStatusInDB(Long taskId, Boolean enabled) { + MoldTaskManagementDO updateObj = new MoldTaskManagementDO(); + updateObj.setId(taskId); + updateObj.setEnabled(enabled); + moldtaskManagementMapper.updateById(updateObj); + } + private MoldTicketResultsSaveReqVO findMatchedTicketResult(List ticketResultsList, String subjectName, int index) { if (CollectionUtils.isEmpty(ticketResultsList)) { diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/notify/MesNotifyMessageService.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/notify/MesNotifyMessageService.java new file mode 100644 index 000000000..67c0540f0 --- /dev/null +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/notify/MesNotifyMessageService.java @@ -0,0 +1,61 @@ +package cn.iocoder.yudao.module.mes.service.notify; + +import cn.hutool.core.util.StrUtil; +import cn.iocoder.yudao.module.system.api.notify.NotifyMessageSendApi; +import cn.iocoder.yudao.module.system.api.notify.dto.NotifySendSingleToUserReqDTO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Arrays; +import java.util.Map; + +@Service +@Slf4j +public class MesNotifyMessageService { + + @Resource + private NotifyMessageSendApi notifyMessageSendApi; + + public void sendToAdmins(String userIds, String templateCode, Map templateParams, + String businessName, Object businessId) { + if (StrUtil.isBlank(userIds)) { + return; + } + Arrays.stream(userIds.split(",")) + .map(String::trim) + .filter(StrUtil::isNotBlank) + .distinct() + .forEach(userId -> sendToAdmin(userId, templateCode, templateParams, businessName, businessId)); + } + + public void sendToAdmin(String userId, String templateCode, Map templateParams, + String businessName, Object businessId) { + if (StrUtil.isBlank(userId)) { + return; + } + if (StrUtil.isBlank(templateCode)) { + log.warn("[sendToAdmin][{}({})站内信模板编码为空,跳过通知]", businessName, businessId); + return; + } + + Long adminUserId; + try { + adminUserId = Long.valueOf(userId.trim()); + } catch (NumberFormatException ex) { + log.warn("[sendToAdmin][{}({})接收人({})不是有效用户编号,跳过通知]", businessName, businessId, userId); + return; + } + + NotifySendSingleToUserReqDTO reqDTO = new NotifySendSingleToUserReqDTO(); + reqDTO.setUserId(adminUserId); + reqDTO.setTemplateCode(templateCode); + reqDTO.setTemplateParams(templateParams); + try { + notifyMessageSendApi.sendSingleMessageToAdmin(reqDTO); + } catch (Exception ex) { + log.warn("[sendToAdmin][{}({})站内信发送失败,跳过通知]", businessName, businessId, ex); + } + } + +} diff --git a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/taskmanagement/TaskManagementServiceImpl.java b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/taskmanagement/TaskManagementServiceImpl.java index 6550ef51d..32568ceb0 100644 --- a/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/taskmanagement/TaskManagementServiceImpl.java +++ b/yudao-module-mes/yudao-module-mes-biz/src/main/java/cn/iocoder/yudao/module/mes/service/taskmanagement/TaskManagementServiceImpl.java @@ -16,6 +16,7 @@ import cn.iocoder.yudao.module.mes.dal.mysql.planmaintenance.PlanMaintenanceMapp import cn.iocoder.yudao.module.mes.dal.mysql.subjectplan.SubjectPlanMapper; import cn.iocoder.yudao.module.mes.dal.mysql.ticketmanagement.TicketManagementMapper; import cn.iocoder.yudao.module.mes.dal.mysql.ticketresults.TicketResultsMapper; +import cn.iocoder.yudao.module.mes.service.notify.MesNotifyMessageService; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.cronutils.model.Cron; @@ -31,7 +32,9 @@ import org.springframework.transaction.annotation.Transactional; import java.text.SimpleDateFormat; import java.time.Duration; +import java.time.LocalDateTime; import java.time.ZonedDateTime; +import java.time.format.DateTimeFormatter; import java.util.*; import java.util.stream.Collectors; @@ -56,6 +59,8 @@ import static cn.iocoder.yudao.module.mes.enums.ErrorCodeConstants.*; @Slf4j public class TaskManagementServiceImpl implements TaskManagementService { + private static final String TASK_TICKET_CREATE_NOTIFY_TEMPLATE_CODE = "mes_task_ticket_create"; + @Resource private TaskManagementMapper taskManagementMapper; @@ -80,6 +85,9 @@ public class TaskManagementServiceImpl implements TaskManagementService { @Resource private TaskSchedulerManager taskSchedulerManager; + @Resource + private MesNotifyMessageService mesNotifyMessageService; + @Override public Long createTaskManagement(TaskManagementSaveReqVO createReqVO) { String cronExpr = createReqVO.getCronExpression(); @@ -215,6 +223,7 @@ public class TaskManagementServiceImpl implements TaskManagementService { ticketManagementDO.setConfigName(taskManagementDO.getName()); ticketManagementDO.setTaskEndTime(taskManagementDO.getEndDate().atStartOfDay()); ticketManagementMapper.insert(ticketManagementDO); + sendTicketCreateNotifyMessage(taskManagementDO, ticketManagementDO); List subjectPlanDOList = subjectPlanMapper.selectList(Wrappers.lambdaQuery().eq(SubjectPlanDO::getPlanId, ticketManagementDO.getPlanId())); for (SubjectPlanDO subjectPlanDO : subjectPlanDOList) { @@ -234,6 +243,22 @@ public class TaskManagementServiceImpl implements TaskManagementService { } + private void sendTicketCreateNotifyMessage(TaskManagementDO taskManagementDO, TicketManagementDO ticketManagementDO) { + Map templateParams = new HashMap<>(); + templateParams.put("ticketId", ticketManagementDO.getId()); + templateParams.put("planNo", Objects.toString(ticketManagementDO.getPlanNo(), "")); + templateParams.put("configName", Objects.toString(ticketManagementDO.getConfigName(), "")); + templateParams.put("deviceName", Objects.toString(ticketManagementDO.getDeviceName(), "")); + templateParams.put("taskEndTime", formatNotifyDateTime(ticketManagementDO.getTaskEndTime())); + + mesNotifyMessageService.sendToAdmins(taskManagementDO.getOperableUsers(), TASK_TICKET_CREATE_NOTIFY_TEMPLATE_CODE, + templateParams, "设备工单", ticketManagementDO.getId()); + } + + private String formatNotifyDateTime(LocalDateTime dateTime) { + return dateTime == null ? "" : dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + } + @Override public void updateTaskManagementEnabled(TaskManagementUpdateEnabledReqVO updateEnabledReqVO) { // 1. 校验任务是否存在 @@ -336,4 +361,4 @@ public class TaskManagementServiceImpl implements TaskManagementService { String randomNum = String.format("%06d", new Random().nextInt(1000000)); return "E" + date + randomNum; } -} \ No newline at end of file +}