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().eq("wrk_sts", WrkStsType.COMPLETE_INBOUND.sts), "executeIn", wrkMastFinalizeProcessor::processCompleteInbound); } @Scheduled(cron = "0/1 * * * * ? ") public void executeOut() { submitByWrkNo(new QueryWrapper().eq("wrk_sts", WrkStsType.COMPLETE_OUTBOUND.sts), "executeOut", wrkMastFinalizeProcessor::processCompleteOutbound); } @Scheduled(cron = "0/1 * * * * ? ") public void executeLocMove() { submitByWrkNo(new QueryWrapper().eq("wrk_sts", WrkStsType.COMPLETE_LOC_MOVE.sts), "executeLocMove", wrkMastFinalizeProcessor::processCompleteLocMove); } @Scheduled(cron = "0/1 * * * * ? ") public void executeCrnMove() { submitByWrkNo(new QueryWrapper().eq("wrk_sts", WrkStsType.COMPLETE_CRN_MOVE.sts), "executeCrnMove", wrkMastFinalizeProcessor::processCompleteCrnMove); } @Scheduled(cron = "0/1 * * * * ? ") public void executeCancelTask() { submitByWrkNo(new QueryWrapper().in("mk", "taskCancel", "taskForceCancel"), "executeCancelTask", wrkMastFinalizeProcessor::processCancelTask); } @Scheduled(cron = "0/1 * * * * ? ") @Transactional public void processOutStationRun(){ List wrkMasts = wrkMastService.list(new QueryWrapper().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 queryWrapper, String taskNamePrefix, WrkNoHandler handler) { List 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); } }