chen.lin
6 天以前 0c497375461a8f8cb644f9dc2f4473dabb52abd2
rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/WcsServiceImpl.java
@@ -141,6 +141,11 @@
        // 验证设备站点
        DeviceSite deviceSite = validateDeviceSite(param);
        // 空板入库:与非空板同一入口,仅不校验组托,只做分配库位、建任务、更新库位
        if (param.getIoType() != null && param.getIoType().equals(TaskType.TASK_TYPE_EMPITY_IN.type)) {
            return createInTaskForEmptyPallet(param.getBarcode(), param.getSourceStaNo(), param.getLocType1());
        }
        // 提前定义 waitPakin / waitPakinItems,供后续其他入库逻辑使用
        WaitPakin waitPakin = null;
        List<WaitPakinItem> waitPakinItems = Collections.emptyList();
@@ -621,8 +626,8 @@
    }
    /**
     * 空板入库:RCS 申请时 full=true,无需组托,分配库位并创建 TASK_TYPE_EMPITY_IN 任务。
     * 需在设备站点中配置 type=10(空板入库)的站点路径。
     * 空板入库:与非空板同一流程(校验站点、分配库位、建任务、更新库位),仅不校验组托、不写任务明细、不更新组托状态。
     * 由 createInTask 在 ioType=空板时调用;需在设备站点中配置 type=10(空板入库)的站点路径。
     */
    private InTaskMsgDto createInTaskForEmptyPallet(String barcode, String staNo, Integer type) {
        TaskInParam param = new TaskInParam();
@@ -1560,36 +1565,14 @@
        log.info("========== 开始申请入库任务,分配库位 ==========");
        log.info("料箱码:{},入库站点:{},入库类型:{},空板:{}", barcode, staNo, type, full);
        // full=true 时走空板入库(无需组托);否则走普通入库(需组托或自动组托)
        if (Boolean.TRUE.equals(full)) {
            InTaskMsgDto msgDto = createInTaskForEmptyPallet(barcode, staNo, type);
            JSONObject result = new JSONObject();
            result.put("locNo", msgDto.getLocNo());
            result.put("batchNo", msgDto.getWorkNo());
            result.put("taskNo", msgDto.getWorkNo());
            return R.ok(result);
        }
        // 构建 TaskInParam 参数,与 /wcs/create/in/task 接口参数一致
        // 统一走 createInTask:空板(full=true)仅不校验组托,仍校验站点、分配库位、建任务;非空板需组托
        TaskInParam param = new TaskInParam();
        param.setBarcode(barcode);
        param.setSourceStaNo(staNo);
        param.setIoType(TaskType.TASK_TYPE_IN.type); // 入库类型
        param.setLocType1(type); // 库位类型(高低检测信号)
        param.setUser(1L); // 默认用户ID,可以根据实际需求调整
        param.setLocType1(type != null ? type : 1);
        param.setUser(1L);
        param.setIoType(Boolean.TRUE.equals(full) ? TaskType.TASK_TYPE_EMPITY_IN.type : TaskType.TASK_TYPE_IN.type);
        // 调用 createInTask 方法,创建完整的入库任务
        // 该方法会执行以下流程:
        // 1. 验证设备站点
        // 2. 验证组拖状态
        // 3. 检查是否有匹配的入库任务(拣料/盘点入库会匹配状态199并更新为2)
        // 4. 生成任务编码(如果需要创建新任务)
        // 5. 获取库位号
        // 6. 创建并保存任务(如果需要创建新任务)
        // 7. 更新库位状态
        // 8. 获取并验证组拖明细
        // 9. 创建并保存任务明细
        // 10. 更新组托状态
        InTaskMsgDto msgDto = createInTask(param);
        // 查询任务当前状态
@@ -1619,10 +1602,12 @@
                    .set(Task::getUpdateTime, new Date()));
            if (statusUpdated) {
                log.info("新创建的入库任务状态已更新为2(RCS任务已下发) - 任务编码:{}", task.getTaskCode());
                task = taskService.getById(task.getId());
                log.info("新创建的入库任务状态已更新为2(RCS任务已下发) - 任务编码:{},当前状态:{}", task.getTaskCode(), task != null ? task.getTaskStatus() : null);
            } else {
                task = taskService.getById(task.getId());
                log.warn("新创建的入库任务状态更新为2失败,可能状态已变更 - 任务编码:{},当前状态:{}",
                        task.getTaskCode(), task.getTaskStatus());
                        task.getTaskCode(), task != null ? task.getTaskStatus() : null);
            }
        } else if (taskStatus != null && taskStatus.equals(TaskStsType.WCS_EXECUTE_IN.id)) {
            log.info("入库任务状态已经是2(RCS任务已下发),无需更新 - 任务编码:{}", task.getTaskCode());