package com.zy.asrs.task;
|
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.zy.asrs.entity.LocMast;
|
import com.zy.asrs.entity.WrkMast;
|
import com.zy.asrs.service.LocMastService;
|
import com.zy.asrs.service.WrkMastService;
|
import com.zy.core.enums.WrkStsType;
|
import com.zy.core.task.MainProcessTaskSubmitter;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.scheduling.annotation.Scheduled;
|
import org.springframework.stereotype.Component;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import java.util.Date;
|
import java.util.List;
|
|
@Component
|
@Slf4j
|
public class WrkMastScheduler {
|
|
private static final long MIN_SUBMIT_INTERVAL_MS = 0L;
|
private static final String WRK_MAST_FINALIZE_LANE_PREFIX = "wrk-mast-finalize-";
|
|
private final WrkMastService wrkMastService;
|
private final LocMastService locMastService;
|
private final MainProcessTaskSubmitter mainProcessTaskSubmitter;
|
private final WrkMastFinalizeProcessor wrkMastFinalizeProcessor;
|
|
public WrkMastScheduler(WrkMastService wrkMastService,
|
LocMastService locMastService,
|
MainProcessTaskSubmitter mainProcessTaskSubmitter,
|
WrkMastFinalizeProcessor wrkMastFinalizeProcessor) {
|
this.wrkMastService = wrkMastService;
|
this.locMastService = locMastService;
|
this.mainProcessTaskSubmitter = mainProcessTaskSubmitter;
|
this.wrkMastFinalizeProcessor = wrkMastFinalizeProcessor;
|
}
|
|
@Scheduled(cron = "0/1 * * * * ? ")
|
public void executeIn() {
|
submitByWrkNo(new QueryWrapper<WrkMast>().eq("wrk_sts", WrkStsType.COMPLETE_INBOUND.sts),
|
"executeIn",
|
wrkMastFinalizeProcessor::processCompleteInbound);
|
}
|
|
@Scheduled(cron = "0/1 * * * * ? ")
|
public void executeOut() {
|
submitByWrkNo(new QueryWrapper<WrkMast>().eq("wrk_sts", WrkStsType.COMPLETE_OUTBOUND.sts),
|
"executeOut",
|
wrkMastFinalizeProcessor::processCompleteOutbound);
|
}
|
|
@Scheduled(cron = "0/1 * * * * ? ")
|
public void executeLocMove() {
|
submitByWrkNo(new QueryWrapper<WrkMast>().eq("wrk_sts", WrkStsType.COMPLETE_LOC_MOVE.sts),
|
"executeLocMove",
|
wrkMastFinalizeProcessor::processCompleteLocMove);
|
}
|
|
@Scheduled(cron = "0/1 * * * * ? ")
|
public void executeCrnMove() {
|
submitByWrkNo(new QueryWrapper<WrkMast>().eq("wrk_sts", WrkStsType.COMPLETE_CRN_MOVE.sts),
|
"executeCrnMove",
|
wrkMastFinalizeProcessor::processCompleteCrnMove);
|
}
|
|
@Scheduled(cron = "0/1 * * * * ? ")
|
public void executeCancelTask() {
|
submitByWrkNo(new QueryWrapper<WrkMast>().in("mk", "taskCancel", "taskForceCancel"),
|
"executeCancelTask",
|
wrkMastFinalizeProcessor::processCancelTask);
|
}
|
|
@Scheduled(cron = "0/1 * * * * ? ")
|
@Transactional
|
public void processOutStationRun(){
|
List<WrkMast> wrkMasts = wrkMastService.list(new QueryWrapper<WrkMast>().eq("wrk_sts", WrkStsType.STATION_RUN.sts));
|
if (wrkMasts.isEmpty()) {
|
return;
|
}
|
|
for (WrkMast wrkMast : wrkMasts) {
|
String locNo = wrkMast.getSourceLocNo();
|
LocMast locMast = locMastService.queryByLoc(locNo);
|
if (locMast == null) {
|
log.info("[workNo={}]库位不存在", wrkMast.getWrkNo());
|
continue;
|
}
|
|
if (locMast.getLocSts().equals("O")) {
|
continue;
|
}
|
|
if (!locMast.getLocSts().equals("R")) {
|
log.info("[workNo={}]库位状态不处于R", wrkMast.getWrkNo());
|
continue;
|
}
|
|
locMast.setLocSts("O");
|
locMast.setBarcode("");
|
locMast.setModiTime(new Date());
|
boolean result = locMastService.updateById(locMast);
|
if (!result) {
|
log.info("[workNo={}]库位状态O更新失败", wrkMast.getWrkNo());
|
}
|
}
|
}
|
|
private void submitByWrkNo(QueryWrapper<WrkMast> queryWrapper, String taskNamePrefix, WrkNoHandler handler) {
|
List<WrkMast> wrkMasts = wrkMastService.list(queryWrapper);
|
if (wrkMasts.isEmpty()) {
|
return;
|
}
|
for (WrkMast wrkMast : wrkMasts) {
|
if (wrkMast == null || wrkMast.getWrkNo() == null || wrkMast.getWrkNo() <= 0) {
|
log.error("WrkMastScheduler提交任务跳过,工作档为空或工作号非法。taskNamePrefix={}, wrkMast={}", taskNamePrefix, wrkMast);
|
continue;
|
}
|
Integer wrkNo = wrkMast.getWrkNo();
|
boolean submitted = mainProcessTaskSubmitter.submitKeyedSerialTask(
|
WRK_MAST_FINALIZE_LANE_PREFIX,
|
wrkNo,
|
taskNamePrefix + "-" + wrkNo,
|
MIN_SUBMIT_INTERVAL_MS,
|
() -> handler.handle(wrkNo)
|
);
|
if (!submitted) {
|
log.error("WrkMastScheduler提交单任务处理失败。taskNamePrefix={}, wrkNo={}, lanePrefix={}",
|
taskNamePrefix, wrkNo, WRK_MAST_FINALIZE_LANE_PREFIX);
|
}
|
}
|
}
|
|
@FunctionalInterface
|
private interface WrkNoHandler {
|
void handle(Integer wrkNo);
|
}
|
}
|