自动化立体仓库 - WMS系统
cl
2026-04-07 506143eb6dcc42105854e73c8527e6ac1193cd02
src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
@@ -97,6 +97,8 @@
    private WorkService workService;
    @Autowired
    private BasCrnpService basCrnpService;
    @Autowired
    private ApiLogService apiLogService;
    @Override
    @Transactional
@@ -415,7 +417,7 @@
            return R.ok(confirmedCount == 0 ? "任务已确认执行" : "ERP确认执行出库成功").add(result);
        }
        if (Objects.equals(param.getExecute(), 2)) {
            // ERP请求取消任务:直接收集任务号,按 taskList 格式发送给 WCS。
            // ERP请求取消任务:按 plt_type 从大到小先 WCS 再 WMS;失败或异常则停止后续,接口仍返回原成功结构。
            Map<String, Object> result = new HashMap<>();
            result.put("orderNo", param.getOrderId());
            result.put("execute", param.getExecute());
@@ -423,20 +425,42 @@
            if (activeTasks.isEmpty()) {
                return R.ok("无有效出库任务").add(result);
            }
            List<HashMap<String,Object>> taskList = new ArrayList<>();
            for (WrkMast wrkMast : activeTasks) {
                HashMap<String,Object> hashMap = new HashMap<>();
                hashMap.put("taskNo", wrkMast.getWrkNo());
                if (!Cools.isEmpty(wrkMast) && wrkMast.getWrkSts() ==11L) {
                    workService.cancelWrkMast(wrkMast.getWrkNo()+"", 9955L);
                    continue;
            List<WrkMast> sorted = new ArrayList<>(activeTasks);
            sorted.sort(Comparator.comparing(WrkMast::getPltType, Comparator.nullsLast(Comparator.reverseOrder())));
            for (WrkMast wrkMast : sorted) {
                try {
                    if (!Cools.isEmpty(wrkMast) && wrkMast.getWrkSts() == 11L) {
                        workService.cancelWrkMast(wrkMast.getWrkNo() + "", 9955L);
                    }else{
                    HashMap<String, Object> hashMap = new HashMap<>();
                    hashMap.put("taskNo", wrkMast.getWrkNo());
                    List<HashMap<String, Object>> one = new ArrayList<>();
                    one.add(hashMap);
                    R wcsR = wcsApiService.pauseOutTasks(one);
                    requireWcsPauseOk(wcsR);
                    workService.cancelWrkMast(wrkMast.getWrkNo() + "", 9955L);
                    }
                } catch (Exception e) {
                    log.warn("[pakoutOrderPause] execute=2 取消中止, orderNo={}, err={}", param.getOrderId(), e.getMessage());
                    break;
                }
                taskList.add(hashMap);
            }
            wcsApiService.pauseOutTasks(taskList);
            return R.ok("取消任务已发送至WCS").add(result);
        }
        throw new CoolException("reason仅支持1或2");
    }
    /** WCS 返回非成功码时抛错 */
    private void requireWcsPauseOk(R wcsR) {
        if (wcsR == null) {
            throw new CoolException("WCS取消出库任务无返回");
        }
        Object codeObj = wcsR.get("code");
        int code = codeObj instanceof Number ? ((Number) codeObj).intValue() : -1;
        if (code != 200) {
            Object msgObj = wcsR.get("msg");
            throw new CoolException(msgObj == null ? "WCS取消出库任务失败" : String.valueOf(msgObj));
        }
    }
    @Override
@@ -1224,7 +1248,10 @@
                stationParams.add(stationParam);
            }
        }
        String requestJson = JSON.toJSONString(stationParams);
        String response = "";
        boolean pushOk = false;
        String pushUrl = buildMesStationRequestUrl();
        try {
            //获取Cookie值
            HashMap<String, Object> headers = new HashMap<>();
@@ -1234,19 +1261,50 @@
                    .setHeaders(headers)
                    .setUri(mesUrl)
                    .setPath(stationAddress)
                    .setJson(JSON.toJSONString(stationParams))
                    .setJson(requestJson)
                    .build()
                    .doPost();
            JSONObject jsonResponse = JSON.parseObject(response);
            if (jsonResponse.getInteger("code") == 200) {
            if (jsonResponse != null && Integer.valueOf(200).equals(jsonResponse.getInteger("code"))) {
                pushOk = true;
            } else {
                return R.error();
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                apiLogService.save(
                        "推ERP-站点同步",
                        pushUrl,
                        null,
                        "127.0.0.1",
                        requestJson,
                        response,
                        pushOk,
                        "站点同步推对方"
                );
            } catch (Exception logEx) {
                log.error("save station sync api log failed", logEx);
            }
        }
        return R.ok();
    }
    private String buildMesStationRequestUrl() {
        if (Cools.isEmpty(mesUrl)) {
            return stationAddress;
        }
        if (stationAddress == null) {
            return mesUrl;
        }
        if (mesUrl.endsWith("/") && stationAddress.startsWith("/")) {
            return mesUrl + stationAddress.substring(1);
        }
        if (!mesUrl.endsWith("/") && !stationAddress.startsWith("/")) {
            return mesUrl + "/" + stationAddress;
        }
        return mesUrl + stationAddress;
    }
    @Override
@@ -1377,6 +1435,19 @@
        }
        return R.ok().add(Cools.add("wrkNo", workNo).add("orderId", param.getOrderId()));
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public R outOrderBatch(List<OutTaskParam> params) {
        int n = params.size();
        for (OutTaskParam outTaskParam : params) {
            R r = outOrder(outTaskParam, n);
            if (!Objects.equals(r.get("code"), 200)) {
                throw new CoolException("出库建单失败");
            }
        }
        return R.ok();
    }
}