From db1b7b324956011d418585f72549d1761feec668 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=B9=E9=B9=8F=E9=A3=9E?= Date: Thu, 14 May 2026 11:28:00 +0800 Subject: [PATCH] =?UTF-8?q?feat(schedule):=20=E4=BC=98=E5=8C=96=E5=85=A5?= =?UTF-8?q?=E5=BA=93=E6=A3=80=E9=AA=8C=E4=BB=BB=E5=8A=A1=E9=80=BE=E6=9C=9F?= =?UTF-8?q?=E5=A4=84=E7=90=86=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 BasdeSerialNumberControllerService 服务,实现序列号生成和重试机制 - 修改 IncomingInspectionTaskOverdueProcessor 处理逻辑,查询逾期任务列表后逐条处理 - 为每个逾期任务发送提醒消息给部门负责人,包含唯一序列号编码 - 完善异常及空值检查,确保质检人员、用户和部门信息完整 - 批量更新逾期任务状态为已逾期,保证数据一致性 - 增加日志打印,方便跟踪逾期任务处理流程和结果 --- ...ncomingInspectionTaskOverdueProcessor.java | 75 +++++++++++++++++-- .../BasdeSerialNumberControllerService.java | 48 ++++++++++++ 2 files changed, 118 insertions(+), 5 deletions(-) create mode 100644 nflg-wms-scheduled/src/main/java/com/nflg/wms/scheduled/service/BasdeSerialNumberControllerService.java diff --git a/nflg-wms-scheduled/src/main/java/com/nflg/wms/scheduled/processor/IncomingInspectionTaskOverdueProcessor.java b/nflg-wms-scheduled/src/main/java/com/nflg/wms/scheduled/processor/IncomingInspectionTaskOverdueProcessor.java index d13c0547..6b3add92 100644 --- a/nflg-wms-scheduled/src/main/java/com/nflg/wms/scheduled/processor/IncomingInspectionTaskOverdueProcessor.java +++ b/nflg-wms-scheduled/src/main/java/com/nflg/wms/scheduled/processor/IncomingInspectionTaskOverdueProcessor.java @@ -1,7 +1,10 @@ package com.nflg.wms.scheduled.processor; -import com.nflg.wms.repository.entity.QmsIncomingInspectionTask; -import com.nflg.wms.repository.service.IQmsIncomingInspectionTaskService; +import cn.hutool.core.collection.CollectionUtil; +import com.nflg.wms.common.util.UserUtil; +import com.nflg.wms.repository.entity.*; +import com.nflg.wms.repository.service.*; +import com.nflg.wms.scheduled.service.BasdeSerialNumberControllerService; import jakarta.annotation.Resource; import org.springframework.stereotype.Component; import tech.powerjob.worker.core.processor.ProcessResult; @@ -10,6 +13,8 @@ import tech.powerjob.worker.core.processor.sdk.BasicProcessor; import tech.powerjob.worker.log.OmsLogger; import java.time.LocalDateTime; +import java.util.List; +import java.util.Objects; @Component(value = "IncomingInspectionTaskOverdueProcessor") public class IncomingInspectionTaskOverdueProcessor implements BasicProcessor { @@ -17,17 +22,77 @@ public class IncomingInspectionTaskOverdueProcessor implements BasicProcessor { @Resource private IQmsIncomingInspectionTaskService incomingInspectionTaskService; + @Resource + private IUserInteriorService userInteriorService; + + @Resource + private IQmsQualityInspectorService qualityInspectorService; + + @Resource + private IDepartmentService departmentService; + + @Resource + private IQmsTodoItemService qmsTodoItemService; + + @Resource + private BasdeSerialNumberControllerService basdeSerialNumberControllerService; + + @Resource + private IDictionaryItemService dictionaryItemService; + @Override public ProcessResult process(TaskContext context) { OmsLogger omsLogger = context.getOmsLogger(); omsLogger.info("开始"); try { - incomingInspectionTaskService.lambdaUpdate() - .set(QmsIncomingInspectionTask::getIsOverdue, true) + List tasks = incomingInspectionTaskService.lambdaQuery() .lt(QmsIncomingInspectionTask::getInspectionStatus, 2) .eq(QmsIncomingInspectionTask::getIsOverdue, false) .lt(QmsIncomingInspectionTask::getRequiredFinishTime, LocalDateTime.now()) - .update(); + .list(); + omsLogger.info("共" + tasks.size() + "条任务过期"); + if (CollectionUtil.isNotEmpty(tasks)) { + omsLogger.info("开始更新任务过期状态"); + for (QmsIncomingInspectionTask task : tasks) { + omsLogger.info("开始处理:{}", task.getTaskNo()); + Long handlerId = Objects.isNull(task.getAgentId()) ? task.getInspectorId() : task.getAgentId(); + QmsQualityInspector qualityInspector = qualityInspectorService.getById(handlerId); + if (Objects.isNull(qualityInspector)) { + omsLogger.error("未找到质检人员:{}", handlerId); + break; + } + UserInterior userInterior = userInteriorService.lambdaQuery().eq(UserInterior::getUserId, qualityInspector.getUserId()).one(); + if (Objects.isNull(userInterior)) { + omsLogger.error("未找到用户:{}", qualityInspector.getUserId()); + break; + } + Department department = departmentService.getById(userInterior.getDeptId()); + if (Objects.isNull(department)) { + omsLogger.error("未找到部门:{}", userInterior.getDeptId()); + break; + } + if (Objects.isNull(department.getHeadUserId())) { + omsLogger.error("部门未设置负责人:{}", department.getName()); + break; + } + omsLogger.info("给部门负责人【{}】发送消息", department.getHeadUserName()); + qmsTodoItemService.save(new QmsTodoItem() + .setCode(basdeSerialNumberControllerService.generateSerialNumber(32)) + .setSourceTypeId(dictionaryItemService.getIdByCode("MessageType", "IQCDetectionTaskTimeoutReminder")) + .setSourceId(task.getId()) + .setCreateUserId(department.getHeadUserId()) + .setCreateUserName(department.getHeadUserName()) + .setCreateTime(LocalDateTime.now()) + ); + omsLogger.info("发送消息成功"); + } + incomingInspectionTaskService.lambdaUpdate() + .set(QmsIncomingInspectionTask::getIsOverdue, true) + .eq(QmsIncomingInspectionTask::getIsOverdue, false) + .in(QmsIncomingInspectionTask::getId, tasks.stream().map(QmsIncomingInspectionTask::getId).toList()) + .update(); + omsLogger.info("更新任务过期状态完成"); + } return new ProcessResult(true, "成功"); } catch (Exception e) { omsLogger.error("异常", e); diff --git a/nflg-wms-scheduled/src/main/java/com/nflg/wms/scheduled/service/BasdeSerialNumberControllerService.java b/nflg-wms-scheduled/src/main/java/com/nflg/wms/scheduled/service/BasdeSerialNumberControllerService.java new file mode 100644 index 00000000..6fcf945e --- /dev/null +++ b/nflg-wms-scheduled/src/main/java/com/nflg/wms/scheduled/service/BasdeSerialNumberControllerService.java @@ -0,0 +1,48 @@ +package com.nflg.wms.scheduled.service; + +import cn.hutool.core.util.StrUtil; +import com.nflg.wms.repository.entity.BasdeSerialNumber; +import com.nflg.wms.repository.service.IBasdeSerialNumberService; +import jakarta.annotation.Resource; +import org.springframework.retry.annotation.Backoff; +import org.springframework.retry.annotation.Retryable; +import org.springframework.stereotype.Component; + +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; +import java.util.Objects; + +@Component +public class BasdeSerialNumberControllerService { + private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd"); + private static final int MAX_RETRY = 5; // 最大重试次数 + + @Resource + private IBasdeSerialNumberService basdeSerialNumberService; + + @Retryable( + maxAttempts = 5, // 最大重试次数(包括第一次调用) + backoff = @Backoff(delay = 1000) // 重试间隔1秒 + ) + public String generateSerialNumber(Integer businessType) { + String currentDate = LocalDate.now().format(DATE_FORMATTER); + + BasdeSerialNumber serialNumber = basdeSerialNumberService.lambdaQuery() + .eq(BasdeSerialNumber::getBusinessType, businessType) + .one(); + + if (Objects.isNull(serialNumber)) { + return null; + } + int nextSerial = 0; + if (StrUtil.equals(currentDate, serialNumber.getCurrentDateStr())) { + nextSerial = serialNumber.getMaxSerial(); + } + nextSerial = nextSerial + 1; + serialNumber.setMaxSerial(nextSerial); + serialNumber.setCurrentDateStr(currentDate); + basdeSerialNumberService.updateById(serialNumber); + // 格式化为4位数字,不足补零 + return serialNumber.getBusinessPrefixNumber() + currentDate + String.format("%04d", nextSerial); + } +}