feat(schedule): 优化入库检验任务逾期处理逻辑
- 新增 BasdeSerialNumberControllerService 服务,实现序列号生成和重试机制 - 修改 IncomingInspectionTaskOverdueProcessor 处理逻辑,查询逾期任务列表后逐条处理 - 为每个逾期任务发送提醒消息给部门负责人,包含唯一序列号编码 - 完善异常及空值检查,确保质检人员、用户和部门信息完整 - 批量更新逾期任务状态为已逾期,保证数据一致性 - 增加日志打印,方便跟踪逾期任务处理流程和结果
This commit is contained in:
parent
8fc926f7ff
commit
db1b7b3249
|
|
@ -1,7 +1,10 @@
|
||||||
package com.nflg.wms.scheduled.processor;
|
package com.nflg.wms.scheduled.processor;
|
||||||
|
|
||||||
import com.nflg.wms.repository.entity.QmsIncomingInspectionTask;
|
import cn.hutool.core.collection.CollectionUtil;
|
||||||
import com.nflg.wms.repository.service.IQmsIncomingInspectionTaskService;
|
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 jakarta.annotation.Resource;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
import tech.powerjob.worker.core.processor.ProcessResult;
|
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 tech.powerjob.worker.log.OmsLogger;
|
||||||
|
|
||||||
import java.time.LocalDateTime;
|
import java.time.LocalDateTime;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
@Component(value = "IncomingInspectionTaskOverdueProcessor")
|
@Component(value = "IncomingInspectionTaskOverdueProcessor")
|
||||||
public class IncomingInspectionTaskOverdueProcessor implements BasicProcessor {
|
public class IncomingInspectionTaskOverdueProcessor implements BasicProcessor {
|
||||||
|
|
@ -17,17 +22,77 @@ public class IncomingInspectionTaskOverdueProcessor implements BasicProcessor {
|
||||||
@Resource
|
@Resource
|
||||||
private IQmsIncomingInspectionTaskService incomingInspectionTaskService;
|
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
|
@Override
|
||||||
public ProcessResult process(TaskContext context) {
|
public ProcessResult process(TaskContext context) {
|
||||||
OmsLogger omsLogger = context.getOmsLogger();
|
OmsLogger omsLogger = context.getOmsLogger();
|
||||||
omsLogger.info("开始");
|
omsLogger.info("开始");
|
||||||
try {
|
try {
|
||||||
incomingInspectionTaskService.lambdaUpdate()
|
List<QmsIncomingInspectionTask> tasks = incomingInspectionTaskService.lambdaQuery()
|
||||||
.set(QmsIncomingInspectionTask::getIsOverdue, true)
|
|
||||||
.lt(QmsIncomingInspectionTask::getInspectionStatus, 2)
|
.lt(QmsIncomingInspectionTask::getInspectionStatus, 2)
|
||||||
.eq(QmsIncomingInspectionTask::getIsOverdue, false)
|
.eq(QmsIncomingInspectionTask::getIsOverdue, false)
|
||||||
.lt(QmsIncomingInspectionTask::getRequiredFinishTime, LocalDateTime.now())
|
.lt(QmsIncomingInspectionTask::getRequiredFinishTime, LocalDateTime.now())
|
||||||
|
.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();
|
.update();
|
||||||
|
omsLogger.info("更新任务过期状态完成");
|
||||||
|
}
|
||||||
return new ProcessResult(true, "成功");
|
return new ProcessResult(true, "成功");
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
omsLogger.error("异常", e);
|
omsLogger.error("异常", e);
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue