feat(schedule): 优化入库检验任务逾期处理逻辑

- 新增 BasdeSerialNumberControllerService 服务,实现序列号生成和重试机制
- 修改 IncomingInspectionTaskOverdueProcessor 处理逻辑,查询逾期任务列表后逐条处理
- 为每个逾期任务发送提醒消息给部门负责人,包含唯一序列号编码
- 完善异常及空值检查,确保质检人员、用户和部门信息完整
- 批量更新逾期任务状态为已逾期,保证数据一致性
- 增加日志打印,方便跟踪逾期任务处理流程和结果
This commit is contained in:
曹鹏飞 2026-05-14 11:28:00 +08:00
parent 8fc926f7ff
commit db1b7b3249
2 changed files with 118 additions and 5 deletions

View File

@ -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<QmsIncomingInspectionTask> 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);

View File

@ -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);
}
}