自动化立体仓库 - WMS系统
zwl
3 天以前 58ca88b5008448532f19dca8bf030ceeba347bd5
src/main/java/com/zy/asrs/task/WorkMastScheduler.java
@@ -74,9 +74,10 @@
     * 调度器只负责从工作档中挑出“当前允许下发”的任务,并将其转换成 WCS 接口需要的报文结构;
     * 出库任务按 userNo -> batchSeq 分层汇总后串行下发,确保同一 userNo 下前一个 batchSeq 完成后再发下一个。
     * <p>
     * 当前批量下发的归并维度是:
     * 1. WCS接口路径(入库/出库/移库不能混发);
     * 2. 出库任务按 work_mast.user_no -> work_mast.batch_seq 分层汇总,并按 batchSeq 自然升序下发。
     * 当前下发规则是:
     * 1. 入库任务按 WCS 接口批量下发;
     * 2. 移库任务按单条任务下发;
     * 3. 出库任务按 work_mast.user_no -> work_mast.batch_seq 分层汇总,并按 batchSeq 自然升序下发。
     *
     * @author Ryan
     * @date 2026/1/10 14:42
@@ -93,6 +94,7 @@
        }
        List<WorkTaskParams> paramsList = new ArrayList<>();
        List<WorkTaskParams> moveParamsList = new ArrayList<>();
        Map<String, LinkedHashMap<String, List<WorkTaskParams>>> outboundTasksByUserNo = new LinkedHashMap<>();
        for (WrkMast wrkMast : wrkMasts) {
            // 出库类任务(ioType > 100)默认需要 ERP 确认;未确认的任务在这里直接跳过。
@@ -114,11 +116,20 @@
                        .computeIfAbsent(batchSeq, key -> new ArrayList<>())
                        .add(params);
            } else {
                paramsList.add(buildWorkTaskParams(wrkMast));
                WorkTaskParams params = buildWorkTaskParams(wrkMast);
                if (isMovePublishTask(params)) {
                    moveParamsList.add(params);
                } else {
                    paramsList.add(params);
                }
            }
        }
        if (publishTaskChunks(paramsList)) {
            return;
        }
        if (publishMoveTasksOneByOne(moveParamsList)) {
            return;
        }
@@ -191,6 +202,10 @@
        return wrkMast != null && Objects.equals(wrkMast.getIoType(), 101);
    }
    private boolean isMovePublishTask(WorkTaskParams params) {
        return params != null && "move".equalsIgnoreCase(params.getType());
    }
    private int compareBatchSeqNatural(String left, String right) {
        String safeLeft = Cools.isEmpty(left) ? "" : left;
        String safeRight = Cools.isEmpty(right) ? "" : right;
@@ -250,6 +265,21 @@
        return false;
    }
    private boolean publishMoveTasksOneByOne(List<WorkTaskParams> moveParamsList) {
        if (moveParamsList == null || moveParamsList.isEmpty()) {
            return false;
        }
        for (WorkTaskParams params : moveParamsList) {
            R r = wcsApiService.pubWrkToWcs(params);
            if (isWcsSuccess(r)) {
                return true;
            }
            log.warn("移库任务下发到WCS失败, taskNo={}, result={}",
                    params == null ? null : params.getTaskNo(), r);
        }
        return false;
    }
    private boolean publishOutboundTaskChunks(String userNo, String batchSeq, List<WorkTaskParams> batchParams) {
        if (batchParams == null || batchParams.isEmpty()) {
            return false;