From c9944fa15889ef97236960fcc9370a582cd86267 Mon Sep 17 00:00:00 2001
From: zwl <1051256694@qq.com>
Date: 星期二, 17 三月 2026 14:37:34 +0800
Subject: [PATCH] 1.wcs下发出库任务方式需更改,先采集数据再一次性下发:下发组batch和序号batch_seq 2.库位分配逻辑需优化,目前分配单个巷道 3.

---
 src/main/java/com/zy/api/service/impl/WcsApiServiceImpl.java |  315 ++++++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 278 insertions(+), 37 deletions(-)

diff --git a/src/main/java/com/zy/api/service/impl/WcsApiServiceImpl.java b/src/main/java/com/zy/api/service/impl/WcsApiServiceImpl.java
index 534fbc6..791622b 100644
--- a/src/main/java/com/zy/api/service/impl/WcsApiServiceImpl.java
+++ b/src/main/java/com/zy/api/service/impl/WcsApiServiceImpl.java
@@ -75,37 +75,24 @@
      */
     @Override
     public R pubWrkToWcs(WorkTaskParams params) {
-        if (Objects.isNull(params.getTaskNo())) {
-            return R.error("浠诲姟鍙蜂笉鑳戒负绌猴紒锛�");
+        if (params == null) {
+            return R.error("鍙傛暟涓嶈兘涓虹┖锛侊紒");
         }
-        if (Objects.isNull(params.getBarcode())) {
-            return R.error("鎵樼洏鐮佷笉鑳戒负绌猴紒锛�");
+        WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", params.getTaskNo()));
+        String validateMsg = validatePubTask(params, wrkMast);
+        if (!Cools.isEmpty(validateMsg)) {
+            return R.error(validateMsg);
         }
-        if (Objects.isNull(params.getLocNo())) {
-            return R.error("鐩爣搴撲綅涓嶈兘涓虹┖锛侊紒");
-        }
-        String url = createInTask;
-        if (!Objects.isNull(params.getType()) && params.getType().equals("out")) {
-            url = getWcs_address;
-        }else if (!Objects.isNull(params.getType()) && params.getType().equals("move")) {
-            url = createLocMoveTask;
-        }
+        String url = resolveTaskPath(params);
         String response;
         R r = R.ok();
-        WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", params.getTaskNo()));
-        if (!Objects.isNull(wrkMast) && "out".equalsIgnoreCase(params.getType())) {
-            if ("Y".equalsIgnoreCase(wrkMast.getPauseMk())) {
-                return R.error("task paused");
-            }
-            if (requiresOutboundErpConfirm(wrkMast) && !"Y".equalsIgnoreCase(wrkMast.getPdcType())) {
-                return R.error("task not confirmed by erp");
-            }
-        }
         try {
             log.info("涓嬪彂鎼繍浠诲姟缁檞cs="+JSON.toJSONString(params));
             response = new HttpHandler.Builder()
                     .setUri(wcs_address)
                     .setPath(url)
+                    .setHttps(wcs_address != null && wcs_address.startsWith("https://"))
+                    .setTimeout(10, TimeUnit.SECONDS)
                     .setJson(JSON.toJSONString(params))
                     .build()
                     .doPost();
@@ -114,21 +101,7 @@
             Integer code = jsonObject.getInteger("code");
 
             if (code==200) {
-                if (!Objects.isNull(wrkMast)) {
-                    if (wrkMast.getIoType()==1 || wrkMast.getIoType()==10) {
-                        wrkMast.setWrkSts(2L);
-                        wrkMast.setModiTime(new Date());
-                        wrkMastService.updateById(wrkMast);
-                    }else if(wrkMast.getIoType()==2){
-                        wrkMast.setWrkSts(2L);
-                        wrkMast.setModiTime(new Date());
-                        wrkMastService.updateById(wrkMast);
-                    }else if (wrkMast.getIoType()==101 || wrkMast.getIoType()==110) {
-                        wrkMast.setWrkSts(12L);
-                        wrkMast.setModiTime(new Date());
-                        wrkMastService.updateById(wrkMast);
-                    }
-                }
+                updateWrkMastAfterPublish(wrkMast);
                 //TODO 涓婃姤鏄惁鎴愬姛
             }else {
                 r =R.error();
@@ -137,6 +110,100 @@
             throw new RuntimeException(e);
         }
         return r;
+    }
+
+    @Override
+    public R pubWrksToWcs(List<WorkTaskParams> paramsList) {
+        if (paramsList == null || paramsList.isEmpty()) {
+            return R.error("浠诲姟涓嶈兘涓虹┖锛侊紒");
+        }
+
+        // 鍏堜竴娆℃�ф妸鏈壒浠诲姟瀵瑰簲鐨勫伐浣滄。鎹炲嚭鏉ワ紝閬垮厤寰幆鍐呴噸澶嶆煡搴撱��
+        Map<String, WrkMast> wrkMastMap = getWrkMastMap(paramsList);
+        Map<String, List<WorkTaskParams>> groupedTasks = new LinkedHashMap<>();
+        List<String> skipMsgs = new ArrayList<>();
+
+        for (WorkTaskParams params : paramsList) {
+            if (params == null) {
+                skipMsgs.add("浠诲姟涓嶈兘涓虹┖锛侊紒");
+                continue;
+            }
+            WrkMast wrkMast = wrkMastMap.get(params.getTaskNo());
+            String validateMsg = validatePubTask(params, wrkMast);
+            if (!Cools.isEmpty(validateMsg)) {
+                skipMsgs.add(buildTaskMsg(params, validateMsg));
+                continue;
+            }
+
+            // 鍒嗙粍涓婚敭 = 鎺ュ彛璺緞 + userNo銆�
+            // 杩欐牱鏃㈣兘淇濊瘉鍏ュ簱/鍑哄簱/绉诲簱涓嶄細娣峰彂锛屼篃鑳戒繚璇佺浉鍚� userNo 鐨勪换鍔′細鎵撳寘鍒板悓涓�娆� WCS 璇锋眰涓��
+            String groupKey = buildBatchGroupKey(params, wrkMast);
+            groupedTasks.computeIfAbsent(groupKey, key -> new ArrayList<>()).add(params);
+        }
+
+        if (groupedTasks.isEmpty()) {
+            return R.error(skipMsgs.isEmpty() ? "鏃犲彲涓嬪彂浠诲姟" : skipMsgs.get(0)).add(skipMsgs);
+        }
+
+        int successCount = 0;
+        List<String> failMsgs = new ArrayList<>();
+        for (List<WorkTaskParams> group : groupedTasks.values()) {
+            if (group == null || group.isEmpty()) {
+                continue;
+            }
+
+            // 鍚屼竴缁勫唴鐨勪换鍔$被鍨嬩竴鑷达紝鍥犳鍙栫涓�鏉″嵆鍙‘瀹氭湰缁勫簲璇ヨ皟鐢ㄥ摢涓� WCS 鎺ュ彛銆�
+            String path = resolveTaskPath(group.get(0));
+            Map<String, Object> payload = new HashMap<>();
+            // WCS 鎵归噺涓嬪彂鎶ユ枃缁熶竴浣跨敤 {"tasks":[...]} 缁撴瀯銆�
+            payload.put("tasks", buildTaskPayloads(group));
+            String response = null;
+            try {
+                log.info("鎵归噺涓嬪彂鎼繍浠诲姟缁檞cs={}", JSON.toJSONString(payload));
+                response = new HttpHandler.Builder()
+                        .setUri(wcs_address)
+                        .setPath(path)
+                        .setHttps(wcs_address != null && wcs_address.startsWith("https://"))
+                        .setTimeout(10, TimeUnit.SECONDS)
+                        .setJson(JSON.toJSONString(payload))
+                        .build()
+                        .doPost();
+                JSONObject jsonObject = JSON.parseObject(response == null ? "{}" : response);
+                log.info("鎵归噺涓嬪彂浠诲姟缁檞cs鐨勮繑鍥炲��={}", response);
+                Integer code = jsonObject.getInteger("code");
+                if (code != null && code == 200) {
+                    successCount += group.size();
+                    // 鍙湁鏁寸粍涓嬪彂鎴愬姛锛屾墠鍥炲啓鏈湴宸ヤ綔妗g姸鎬侊紝閬垮厤 WMS/WCS 鐘舵�佸垎鍙夈��
+                    for (WorkTaskParams params : group) {
+                        updateWrkMastAfterPublish(wrkMastMap.get(params.getTaskNo()));
+                    }
+                } else {
+                    String msg = jsonObject.getString("msg");
+                    failMsgs.add("path=" + path + ", msg=" + (Cools.isEmpty(msg) ? "WCS涓嬪彂浠诲姟澶辫触" : msg));
+                    log.error("鎵归噺涓嬪彂浠诲姟缁檞cs澶辫触, path:{}, request:{}, response:{}", path, JSON.toJSONString(payload), response);
+                }
+            } catch (IOException e) {
+                failMsgs.add("path=" + path + ", msg=" + e.getMessage());
+                log.error("鎵归噺涓嬪彂浠诲姟缁檞cs寮傚父, path:{}, request:{}, response:{}", path, JSON.toJSONString(payload), response, e);
+            }
+        }
+
+        Map<String, Object> result = new HashMap<>();
+        result.put("successCount", successCount);
+        result.put("skipCount", skipMsgs.size());
+        result.put("failCount", failMsgs.size());
+        if (!skipMsgs.isEmpty()) {
+            result.put("skipMsgs", skipMsgs);
+        }
+        if (!failMsgs.isEmpty()) {
+            result.put("failMsgs", failMsgs);
+        }
+
+        if (successCount == 0) {
+            String msg = !failMsgs.isEmpty() ? failMsgs.get(0) : (skipMsgs.isEmpty() ? "WCS涓嬪彂浠诲姟澶辫触" : skipMsgs.get(0));
+            return R.error(msg).add(result);
+        }
+        return R.ok(failMsgs.isEmpty() && skipMsgs.isEmpty() ? "鎿嶄綔鎴愬姛" : "閮ㄥ垎浠诲姟涓嬪彂鎴愬姛").add(result);
     }
 
     /**
@@ -206,6 +273,180 @@
         Integer ioType = wrkMast == null ? null : wrkMast.getIoType();
         return ioType != null && (ioType == 101 || ioType == 103 || ioType == 104 || ioType == 107 || ioType == 110);
     }
+
+    /**
+     * 鏍¢獙鍗曟潯浠诲姟鏄惁婊¤冻涓嬪彂鍓嶆彁銆�
+     * <p>
+     * 杩欓噷鏃㈡牎楠屾帴鍙e繀濉」锛屼篃鏍¢獙涓氬姟绾︽潫锛屼緥濡傦細
+     * 1. 鍑哄簱浠诲姟鏄惁琚殏鍋滐紱
+     * 2. 闇�瑕� ERP 纭鐨勫嚭搴撲换鍔℃槸鍚﹀凡纭銆�
+     */
+    private String validatePubTask(WorkTaskParams params, WrkMast wrkMast) {
+        if (params == null) {
+            return "鍙傛暟涓嶈兘涓虹┖锛侊紒";
+        }
+        if (Cools.isEmpty(params.getTaskNo())) {
+            return "浠诲姟鍙蜂笉鑳戒负绌猴紒锛�";
+        }
+        if (Cools.isEmpty(params.getBarcode())) {
+            return "鎵樼洏鐮佷笉鑳戒负绌猴紒锛�";
+        }
+        if (Cools.isEmpty(params.getLocNo())) {
+            return "鐩爣搴撲綅涓嶈兘涓虹┖锛侊紒";
+        }
+        if (!Objects.isNull(wrkMast) && "out".equalsIgnoreCase(params.getType())) {
+            if ("Y".equalsIgnoreCase(wrkMast.getPauseMk())) {
+                return "task paused";
+            }
+            if (requiresOutboundErpConfirm(wrkMast) && !"Y".equalsIgnoreCase(wrkMast.getPdcType())) {
+                return "task not confirmed by erp";
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 鎸変换鍔$被鍨嬮�夋嫨 WCS 鎺ュ彛鍦板潃銆�
+     * in -> 鍏ュ簱鎺ュ彛
+     * out -> 鍑哄簱鎺ュ彛
+     * move -> 绉诲簱鎺ュ彛
+     */
+    private String resolveTaskPath(WorkTaskParams params) {
+        if (!Objects.isNull(params.getType()) && params.getType().equals("out")) {
+            return getWcs_address;
+        }
+        if (!Objects.isNull(params.getType()) && params.getType().equals("move")) {
+            return createLocMoveTask;
+        }
+        return createInTask;
+    }
+
+    /**
+     * WCS 涓嬪彂鎴愬姛鍚庢帹杩涙湰鍦板伐浣滄。鐘舵�併��
+     * <p>
+     * 杩欓噷鍙鐞嗏�滃凡涓嬪彂鈥濊繖涓�灞傜姸鎬侊紝涓嶅鐞嗚澶囨墽琛屽畬鎴愮姸鎬侊紱
+     * 璁惧鎵ц瀹屾垚渚濈劧浠� WCS 鍥炲啓涓哄噯銆�
+     */
+    private void updateWrkMastAfterPublish(WrkMast wrkMast) {
+        if (Objects.isNull(wrkMast)) {
+            return;
+        }
+        if (wrkMast.getIoType()==1 || wrkMast.getIoType()==10) {
+            wrkMast.setWrkSts(2L);
+            wrkMast.setModiTime(new Date());
+            wrkMastService.updateById(wrkMast);
+        }else if(wrkMast.getIoType()==2){
+            wrkMast.setWrkSts(2L);
+            wrkMast.setModiTime(new Date());
+            wrkMastService.updateById(wrkMast);
+        }else if (wrkMast.getIoType()==101 || wrkMast.getIoType()==110) {
+            wrkMast.setWrkSts(12L);
+            wrkMast.setModiTime(new Date());
+            wrkMastService.updateById(wrkMast);
+        }
+    }
+
+    /**
+     * 鎶婃湰娆″緟涓嬪彂鐨� taskNo 鎵归噺鏄犲皠鎴愬伐浣滄。锛屼緵鍚庣画鏍¢獙銆佹寜 userNo 鍒嗙粍銆佺姸鎬佸洖鍐欏鐢ㄣ��
+     */
+    private Map<String, WrkMast> getWrkMastMap(List<WorkTaskParams> paramsList) {
+        List<String> taskNos = paramsList.stream()
+                .filter(Objects::nonNull)
+                .map(WorkTaskParams::getTaskNo)
+                .filter(taskNo -> !Cools.isEmpty(taskNo))
+                .distinct()
+                .collect(Collectors.toList());
+        if (taskNos.isEmpty()) {
+            return Collections.emptyMap();
+        }
+        List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().in("wrk_no", taskNos));
+        if (wrkMasts == null || wrkMasts.isEmpty()) {
+            return Collections.emptyMap();
+        }
+        return wrkMasts.stream()
+                .filter(Objects::nonNull)
+                .collect(Collectors.toMap(mast -> String.valueOf(mast.getWrkNo()), mast -> mast, (left, right) -> left, LinkedHashMap::new));
+    }
+
+    /**
+     * 鏋勯�犳壒閲忎笅鍙戠殑鍒嗙粍閿��
+     * <p>
+     * 鍒嗙粍瑙勫垯锛�
+     * 1. 鍏堟寜鎺ュ彛璺緞鍖哄垎锛岄伩鍏嶄笉鍚屼换鍔$被鍨嬫贩鐢ㄥ悓涓�涓� WCS 鎺ュ彛锛�
+     * 2. 鍐嶆寜 userNo 鍖哄垎锛岀‘淇濈浉鍚� userNo 鐨勪换鍔′竴璧蜂笂鎶ャ��
+     * <p>
+     * 姝e父鎯呭喌涓� userNo 鍙栬嚜 work_mast.user_no锛�
+     * 濡傛灉褰撳墠娌℃煡鍒板伐浣滄。锛屽垯鍥為��鍒拌姹傞噷鐨� batch 瀛楁锛屼繚璇佸吋瀹瑰凡鏈夎皟鐢ㄣ��
+     */
+    private String buildBatchGroupKey(WorkTaskParams params, WrkMast wrkMast) {
+        String path = resolveTaskPath(params);
+        String userNo = wrkMast == null ? null : wrkMast.getUserNo();
+        if (Cools.isEmpty(userNo)) {
+            userNo = params.getBatch();
+        }
+        if (Cools.isEmpty(userNo)) {
+            userNo = "_NO_USER_";
+        }
+        return path + "#" + userNo;
+    }
+
+    /**
+     * 灏嗕竴缁勪笟鍔″弬鏁拌浆鎹㈡垚 WCS 鎵归噺鎺ュ彛鐨� tasks 鏁扮粍銆�
+     */
+    private List<Map<String, Object>> buildTaskPayloads(List<WorkTaskParams> tasks) {
+        List<Map<String, Object>> payloads = new ArrayList<>();
+        for (WorkTaskParams task : tasks) {
+            payloads.add(buildTaskPayload(task));
+        }
+        return payloads;
+    }
+
+    /**
+     * 缁勮鍗曟潯浠诲姟鐨� WCS 璇锋眰浣撱��
+     * 鍙斁褰撳墠浠诲姟绫诲瀷瀹為檯闇�瑕佺殑瀛楁锛涚┖瀛楁涓嶉�忎紶锛岄伩鍏嶇粰 WCS 閫犳垚姝т箟銆�
+     */
+    private Map<String, Object> buildTaskPayload(WorkTaskParams params) {
+        Map<String, Object> task = new LinkedHashMap<>();
+        if (!Cools.isEmpty(params.getTaskNo())) {
+            task.put("taskNo", params.getTaskNo());
+        }
+        if (!Cools.isEmpty(params.getLocNo())) {
+            task.put("locNo", params.getLocNo());
+        }
+        if (!Cools.isEmpty(params.getSourceLocNo())) {
+            task.put("sourceLocNo", params.getSourceLocNo());
+        }
+        if (!Cools.isEmpty(params.getSourceStaNo())) {
+            task.put("sourceStaNo", params.getSourceStaNo());
+        }
+        if (!Cools.isEmpty(params.getBarcode())) {
+            task.put("barcode", params.getBarcode());
+        }
+        if (!Objects.isNull(params.getTaskPri())) {
+            task.put("taskPri", params.getTaskPri());
+        }
+        if (!Cools.isEmpty(params.getStaNo())) {
+            task.put("staNo", params.getStaNo());
+        }
+        if (!Cools.isEmpty(params.getBatch())) {
+            task.put("batch", params.getBatch());
+        }
+        if (!Objects.isNull(params.getBatchSeq())) {
+            task.put("batchSeq", params.getBatchSeq());
+        }
+        return task;
+    }
+
+    /**
+     * 鏋勯�犺烦杩�/澶辫触淇℃伅鏃剁粺涓�甯︿笂 taskNo锛屼究浜庢帓鏌ュ叿浣撴槸鍝竴鏉″伐浣滄。鏈涓嬪彂銆�
+     */
+    private String buildTaskMsg(WorkTaskParams params, String msg) {
+        if (params == null || Cools.isEmpty(params.getTaskNo())) {
+            return msg;
+        }
+        return "taskNo=" + params.getTaskNo() + ", msg=" + msg;
+    }
+
     @Override
     public R pauseOutTasks(List<HashMap<String,Object>> params) {
         if (params == null || params.size() == 0) {

--
Gitblit v1.9.1