cl
2026-04-21 6d67e37ab96516f127e1635e92518109fd1c926c
rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/WcsServiceImpl.java
@@ -143,7 +143,7 @@
        // 验证设备站点
        DeviceSite deviceSite = validateDeviceSite(param);
        // 空板入库:与非空板同一入口,仅不校验组托,只做分配库位、建任务、更新库位
        // 空板入库:与非空板同一入口;createInTaskForEmptyPallet 内会拦截已组托托盘
        if (param.getIoType() != null && param.getIoType().equals(TaskType.TASK_TYPE_EMPITY_IN.type)) {
            return createInTaskForEmptyPallet(param);
        }
@@ -652,7 +652,8 @@
    }
    /**
     * 空板入库:与非空板同一流程(校验站点、分配库位、建任务、更新库位),仅不校验组托、不写任务明细、不更新组托状态。
     * 空板入库:与非空板同一流程(校验站点、分配库位、建任务、更新库位),不写任务明细、不更新组托状态。
     * 已组托(入库中/任务执行中)的托盘禁止走本流程,应使用满板入库。
     * 由 createInTask 在 ioType=空板时调用;需在设备站点中配置 type=10(空板入库)的站点路径。
     */
    private InTaskMsgDto createInTaskForEmptyPallet(TaskInParam sourceParam) {
@@ -668,6 +669,14 @@
        // 校验设备站点(需配置 type=10 空板入库的站点)
        DeviceSite deviceSite = validateDeviceSite(param);
        // 已组托:与 createInTask 满板分支一致,仅允许入库中/任务执行中的组托单参与校验
        WaitPakin palletized = waitPakinService.getOne(new LambdaQueryWrapper<WaitPakin>()
                .eq(WaitPakin::getBarcode, barcode)
                .in(WaitPakin::getIoStatus, PakinIOStatus.PAKIN_IO_STATUS_DONE.val, PakinIOStatus.PAKIN_IO_STATUS_TASK_EXCE.val));
        if (palletized != null) {
            throw new CoolException("barcode=" + barcode + ": 托盘已经组托,不能空板入库");
        }
        // 检查该托盘号是否已有空板入库任务,有则复用
        Task existingInTask = taskService.getOne(new LambdaQueryWrapper<Task>()
@@ -1019,7 +1028,8 @@
        if (Objects.isNull(task)) {
            log.error("任务不存在或已结束!任务编号:{},批次号:{}", taskNo, taskCode);
            throw new CoolException("任务不存在或已结束!!任务编号:" + taskNo + ",批次号:" + taskCode);
            // throw new CoolException("任务不存在或已结束!!任务编号:" + taskNo + ",批次号:" + taskCode);
            return R.parse("201-任务不存在或已结束!!任务编号:" + taskNo + ",批次号:" + taskCode);
        }
        // 验证批次号和任务号的关联关系
@@ -1596,20 +1606,21 @@
    @Transactional(rollbackFor = Exception.class)
    public R allocateLocation(String barcode, String staNo, Integer type, Boolean full, BigDecimal weight) {
        log.info("========== 开始申请入库任务,分配库位 ==========");
        log.info("料箱码:{},入库站点:{},入库类型:{},空板:{},重量:{}", barcode, staNo, type, full, weight);
        log.info("料箱码:{},入库站点:{},入库类型:{},满板信号:{},重量:{}", barcode, staNo, type, full, weight);
        BigDecimal weightScaled = null;
        if (weight != null) {
            weightScaled = weight.setScale(4, RoundingMode.HALF_UP);
        }
        // 统一走 createInTask:空板(full=true)仅不校验组托,仍校验站点、分配库位、建任务;非空板需组托
        // 统一走 createInTask:满板(full=true)走普通入库;空/false 走空板入库
        TaskInParam param = new TaskInParam();
        param.setBarcode(barcode);
        param.setSourceStaNo(staNo);
        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);
//        param.setIoType(Boolean.TRUE.equals(full) ? TaskType.TASK_TYPE_EMPITY_IN.type : TaskType.TASK_TYPE_IN.type);
        param.setIoType(Boolean.TRUE.equals(full) ? TaskType.TASK_TYPE_IN.type : TaskType.TASK_TYPE_EMPITY_IN.type);
        param.setWeight(weightScaled);
        InTaskMsgDto msgDto = createInTask(param);