| | |
| | | import com.zy.core.plugin.store.StoreInTaskContext; |
| | | import com.zy.core.plugin.store.StoreInTaskGenerationService; |
| | | import com.zy.core.plugin.store.StoreInTaskPolicy; |
| | | import com.zy.core.task.MainProcessAsyncTaskScheduler; |
| | | import com.zy.core.thread.StationThread; |
| | | import com.zy.core.utils.CrnOperateProcessUtils; |
| | | import com.zy.core.utils.StationOperateProcessUtils; |
| | |
| | | @Slf4j |
| | | @Component |
| | | public class GslProcess implements MainProcessPluginApi, StoreInTaskPolicy { |
| | | private static final String CRN_TASK_LANE = "crn"; |
| | | private static final String STATION_TASK_LANE = "station"; |
| | | private static final String GENERATE_STORE_TASK_LANE_PREFIX = "generate-store-"; |
| | | private static final long DISPATCH_INTERVAL_MS = 200L; |
| | | private static final long MAINTENANCE_INTERVAL_MS = 500L; |
| | | private static final long TASK_SLOW_LOG_THRESHOLD_MS = 1000L; |
| | | |
| | | @Autowired |
| | | private CrnOperateProcessUtils crnOperateUtils; |
| | |
| | | private StoreInTaskGenerationService storeInTaskGenerationService; |
| | | @Autowired |
| | | private StationCommandDispatcher stationCommandDispatcher; |
| | | @Autowired |
| | | private MainProcessAsyncTaskScheduler mainProcessAsyncTaskScheduler; |
| | | |
| | | @Override |
| | | public void run() { |
| | |
| | | //请求生成入库任务,保留按站点 lane 串行提交 |
| | | generateStoreWrkFile(); |
| | | |
| | | //堆垛机与输送站点都按单个任务提交到各自串行通道,逐个执行 |
| | | // 堆垛机执行入出库主流程 |
| | | submitCrnTask("crnIoExecute", DISPATCH_INTERVAL_MS, crnOperateUtils::crnIoExecute); |
| | | // 堆垛机收尾并推进后续状态 |
| | | submitCrnTask("crnIoExecuteFinish", DISPATCH_INTERVAL_MS, crnOperateUtils::crnIoExecuteFinish); |
| | | // 输送线执行入库任务下发 |
| | | submitStationTask("stationInExecute", DISPATCH_INTERVAL_MS, stationOperateProcessUtils::stationInExecute); |
| | | // 执行堆垛机任务 |
| | | crnOperateUtils.submitCrnIoTasks(DISPATCH_INTERVAL_MS); |
| | | // 堆垛机任务执行完成 |
| | | crnOperateUtils.submitCrnIoExecuteFinishTasks(DISPATCH_INTERVAL_MS); |
| | | // 执行输送站点入库任务 |
| | | stationOperateProcessUtils.submitStationInTasks(DISPATCH_INTERVAL_MS); |
| | | // 检测入库任务是否已经到达目标站台 |
| | | stationOperateProcessUtils.submitInboundStationArrivalTasks(DISPATCH_INTERVAL_MS); |
| | | // 输送线执行堆垛机出库后的站台流转 |
| | | submitStationTask("crnStationOutExecute", DISPATCH_INTERVAL_MS, stationOperateProcessUtils::crnStationOutExecute); |
| | | // 高频检测出库任务是否已经到达目标站台 |
| | | submitStationTask("stationOutExecuteFinish", DISPATCH_INTERVAL_MS, stationOperateProcessUtils::stationOutExecuteFinish); |
| | | // 高频检测入库任务是否已经到达目标站台 |
| | | submitStationTask("scanInboundStationArrival", DISPATCH_INTERVAL_MS, stationOperateProcessUtils::scanInboundStationArrival); |
| | | stationOperateProcessUtils.submitCrnStationOutTasks(DISPATCH_INTERVAL_MS); |
| | | // 检测出库任务是否已经到达目标站台 |
| | | stationOperateProcessUtils.submitStationOutExecuteFinishTasks(DISPATCH_INTERVAL_MS); |
| | | // 检测站台运行完成后的任务转完成 |
| | | submitStationTask("checkTaskToComplete", DISPATCH_INTERVAL_MS, stationOperateProcessUtils::checkTaskToComplete); |
| | | stationOperateProcessUtils.submitCheckTaskToCompleteTasks(DISPATCH_INTERVAL_MS); |
| | | // 检测并处理出库排序 |
| | | submitStationTask("checkStationOutOrder", MAINTENANCE_INTERVAL_MS, stationOperateProcessUtils::checkStationOutOrder); |
| | | stationOperateProcessUtils.submitCheckStationOutOrderTasks(MAINTENANCE_INTERVAL_MS); |
| | | // 监控输送线绕圈站点 |
| | | submitStationTask("watchCircleStation", MAINTENANCE_INTERVAL_MS, stationOperateProcessUtils::watchCircleStation); |
| | | stationOperateProcessUtils.submitWatchCircleStationTasks(MAINTENANCE_INTERVAL_MS); |
| | | // 检测输送线运行堵塞 |
| | | submitStationTask("checkStationRunBlock", MAINTENANCE_INTERVAL_MS, stationOperateProcessUtils::checkStationRunBlock); |
| | | stationOperateProcessUtils.submitCheckStationRunBlockTasks(MAINTENANCE_INTERVAL_MS); |
| | | // 检测站台空闲超时后的恢复处理 |
| | | submitStationTask("checkStationIdleRecover", MAINTENANCE_INTERVAL_MS, stationOperateProcessUtils::checkStationIdleRecover); |
| | | stationOperateProcessUtils.submitCheckStationIdleRecoverTasks(MAINTENANCE_INTERVAL_MS); |
| | | } |
| | | |
| | | @Override |
| | |
| | | } |
| | | } |
| | | |
| | | private void submitStationTask(String taskName, long minIntervalMs, Runnable task) { |
| | | submitProcessTask(STATION_TASK_LANE, taskName, minIntervalMs, task); |
| | | } |
| | | |
| | | private void generateStoreWrkFile() { |
| | | List<BasDevp> basDevps = basDevpService.list(new QueryWrapper<>()); |
| | | for (BasDevp basDevp : basDevps) { |
| | |
| | | if (!canRequestStoreIn(stationMap.get(stationId))) { |
| | | continue; |
| | | } |
| | | submitGenerateStoreTask(stationId, DISPATCH_INTERVAL_MS, |
| | | storeInTaskGenerationService.submitGenerateStoreTask(this, basDevp, stationObjModel, DISPATCH_INTERVAL_MS, |
| | | () -> storeInTaskGenerationService.generate(this, basDevp, stationObjModel)); |
| | | } |
| | | } |
| | |
| | | && stationProtocol.isInEnable() |
| | | && stationProtocol.getTaskNo() > 0 |
| | | && !Cools.isEmpty(stationProtocol.getBarcode()); |
| | | } |
| | | |
| | | private void submitGenerateStoreTask(Integer stationId, long minIntervalMs, Runnable task) { |
| | | submitProcessTask(GENERATE_STORE_TASK_LANE_PREFIX + stationId, "generateStoreWrkFile", minIntervalMs, task); |
| | | } |
| | | |
| | | private void submitCrnTask(String taskName, long minIntervalMs, Runnable task) { |
| | | submitProcessTask(CRN_TASK_LANE, taskName, minIntervalMs, task); |
| | | } |
| | | |
| | | private void submitProcessTask(String laneName, String taskName, long minIntervalMs, Runnable task) { |
| | | mainProcessAsyncTaskScheduler.submit( |
| | | laneName, |
| | | taskName, |
| | | minIntervalMs, |
| | | TASK_SLOW_LOG_THRESHOLD_MS, |
| | | task |
| | | ); |
| | | } |
| | | |
| | | } |