From ccfa611b6c2e128c0e8191e458302a85cbf8c4ee Mon Sep 17 00:00:00 2001
From: cl <1442464845@qq.com>
Date: 星期五, 10 四月 2026 16:41:41 +0800
Subject: [PATCH] 删除取消

---
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java |   19 -
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java     |   28 ++
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderServiceImpl.java |    4 
 rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/ReceiveMsgServiceImpl.java   |  507 +++++++++++++++++++++++++++++++++-----------------
 4 files changed, 371 insertions(+), 187 deletions(-)

diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/ReceiveMsgServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/ReceiveMsgServiceImpl.java
index d250bcf..8a7d865 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/ReceiveMsgServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/ReceiveMsgServiceImpl.java
@@ -467,126 +467,270 @@
     @Override
     @Transactional(timeout = 60, rollbackFor = Exception.class)
     public R syncCheckOrder(List<SyncOrderParams> syncOrders, Long loginUserId) {
-        if (!syncOrders.isEmpty()) {
-            syncOrders.forEach(syncOrder -> {
-                if (StringUtils.isBlank(syncOrder.getOrderInternalCode())) {
-                    throw new CoolException("鍗曟嵁鍐呯爜涓嶈兘涓虹┖锛侊紒");
-                }
-                // 鏄庣粏 lineId锛堝搴� platItemId锛変笉鑳戒负绌猴紝涓斿悓涓�璁㈠崟鍐呬笉鑳介噸澶�
-                if (syncOrder.getOrderItems() != null) {
-                    Set<String> lineIds = new HashSet<>();
-                    for (SyncOrdersItem item : syncOrder.getOrderItems()) {
-                        if (StringUtils.isBlank(item.getPlatItemId())) {
-                            throw new CoolException("鏄庣粏 lineId 涓嶈兘涓虹┖锛侊紒");
-                        }
-                        String lineId = item.getPlatItemId().trim();
-                        if (!lineIds.add(lineId)) {
-                            throw new CoolException("鍚屼竴璁㈠崟鍐呮槑缁� lineId 涓嶈兘閲嶅锛�" + lineId);
-                        }
-                    }
-                }
-                WkOrder wkOrder = new WkOrder();
-                // 鍏煎 wkType 浼犳暟瀛楋紙绫诲瀷鐮侊級鎴栦腑鏂囷紙鏄剧ず鍚嶏級锛氬厛鎸� label 鍙嶆煡 type锛屽惁鍒欐寜鍘熷�煎綋 type
-                String wkTypeInput = syncOrder.getWkType();
-                String typeCode = StringUtils.isBlank(wkTypeInput) ? null : orderWorkTypeService.getTypeByLabel(wkTypeInput);
-                if (typeCode == null) {
-                    typeCode = wkTypeInput;
-                }
-                if (StringUtils.isBlank(typeCode) || orderWorkTypeService.getLabelByType(typeCode) == null) {
-                    throw new CoolException("鍗曟嵁锛�" + syncOrder.getOrderNo() + ", 涓氬姟绫诲瀷涓嶅瓨鍦紒锛�");
-                }
-                // 璁㈠崟绫诲瀷锛氭敮鎸佹暟瀛� 1/2/3銆佷腑鏂囥�屽嚭搴撳崟銆�/銆屽叆搴撳崟銆�/銆岃皟鎷ㄥ崟銆嶆垨鍐呴儴鐮� out/in/transfer锛堟潵鑷瓧鍏革級
-                String typeInput = syncOrder.getType();
-                String resolvedOrderType = orderTypeDictService.resolveType(typeInput);
-                if (typeInput != null && !typeInput.trim().isEmpty() && resolvedOrderType == null) {
-                    throw new CoolException("鍗曟嵁锛�" + syncOrder.getOrderNo() + ", 璁㈠崟绫诲瀷涓嶅瓨鍦紒锛�");
-                }
-                Loc serviceOne = null;
-                if (!Objects.isNull(syncOrder.getOrgLoc())) {
-                    serviceOne = locService.getOne(new LambdaQueryWrapper<Loc>().eq(!Objects.isNull(syncOrder.getOrgLoc()), Loc::getCode, syncOrder.getOrgLoc()));
-                }
-                if (!Objects.isNull(serviceOne)) {
-                    //TODO 娣诲姞璋冩嫈绉诲簱鍗曞姛鑳�
-                } else {
-                    // operateType=2 瀛樺湪鍒欎慨鏀广�佷笉瀛樺湪鍒欐姤閿欙紱operateType=1 瀛樺湪鍒欎慨鏀广�佷笉瀛樺湪鍒欐柊澧�
-                    WkOrder order = asnOrderService.getOne(new LambdaQueryWrapper<WkOrder>()
-                            .eq(WkOrder::getPoCode, syncOrder.getOrderInternalCode()));
-                    if (!Objects.isNull(order)) {
-                        assertWkOrderNoLinkedTask(order.getId());
-                        assertWkOrderExceStatusUnexecuted(order, "淇敼");
-                        // 瀛樺湪鍒欎慨鏀癸紙1 鍜� 2 鍧囪蛋姝ゅ锛夛紝缁勬墭鏍¢獙鍦� mergeOrderWithPakin/updateOrderNoPakin 鍐�
-                        long pakinCount = waitPakinItemService.count(new LambdaQueryWrapper<WaitPakinItem>()
-                                .eq(WaitPakinItem::getAsnId, order.getId()).eq(WaitPakinItem::getDeleted, 0));
-                        if (pakinCount > 0) {
-                            mergeOrderWithPakin(order, syncOrder, resolvedOrderType, typeCode, loginUserId);
-                            if (isDirectWaitPakin()) {
-                                syncReceiptAreaByOrder(order.getId());
-                            }
-                            return;
-                        }
-                        updateOrderNoPakin(order, syncOrder, loginUserId);
-                        if (isDirectWaitPakin()) {
-                            syncReceiptAreaByOrder(order.getId());
-                        }
-                        return;
-                    } else if (Integer.valueOf(2).equals(syncOrder.getOperateType())) {
-                        // 浠� operateType=2 鏃惰姹傚崟鎹繀椤诲瓨鍦�
-                        throw new CoolException("鍗曟嵁涓嶅瓨鍦紝鏃犳硶淇敼锛侊紒");
-                    }
-                    String rule = SerialRuleCode.SYS_ASN_ORDER;
-                    if (resolvedOrderType != null && resolvedOrderType.equals(OrderType.ORDER_OUT.type)) {
-                        rule = SerialRuleCode.SYS_OUT_STOCK_CODE;
-                    }
-                    // 鏈� orderNo 鍒欑洿鎺ヤ綔涓� WMS 鍗曞彿 code锛屽惁鍒欐寜瑙勫垯鐢熸垚锛沺o_code 瀛樺崟鎹唴鐮侊紙orderInternalCode 宸叉牎楠岄潪绌猴級
-                    String wmsCode = StringUtils.isNotBlank(syncOrder.getOrderNo()) ? syncOrder.getOrderNo() : SerialRuleUtils.generateRuleCode(rule, null);
-                    String poCodeVal = syncOrder.getOrderInternalCode();
-                    wkOrder.setType(resolvedOrderType != null ? resolvedOrderType : syncOrder.getType())
-                            .setWkType(typeCode)
-                            .setAnfme(QuantityUtils.roundToScale(syncOrder.getAnfme()))
-                            .setPoCode(poCodeVal)
-                            .setWorkQty(0.0)
-                            .setQty(0.0)
-                            .setPoId(syncOrder.getOrderId())
-                            .setCode(wmsCode)
-                            .setArrTime(syncOrder.getArrTime())
-                            .setStationId(syncOrder.getStationId())
-                            .setId(null)
-                            .setCreateTime(syncOrder.getCreateTime() != null ? syncOrder.getCreateTime() : new Date())
-                            .setUpdateTime(new Date())
-                            .setCreateBy(loginUserId)
-                            .setUpdateBy(loginUserId);
-
-                    if (resolvedOrderType != null && resolvedOrderType.equals(OrderType.ORDER_OUT.type)) {
-                        wkOrder.setExceStatus(AsnExceStatus.OUT_STOCK_STATUS_TASK_INIT.val);
-                    }
-
-                    if (!asnOrderService.save(wkOrder)) {
-                        throw new CoolException("鍗曟嵁淇濆瓨澶辫触锛侊紒");
-                    }
-
-                    syncOrder.getOrderItems().forEach(orderItem -> {
-                        Map<String, Object> map = new ObjectMapper().convertValue(orderItem, Map.class);
-                        map.put("orderId", wkOrder.getId());
-                        map.put("poId", wkOrder.getPoId());
-                        map.put("poCode", wkOrder.getPoCode());
-                        map.put("order_code", wkOrder.getCode());
-                        map.put("matnrCode", orderItem.getMatnr());
-
-                        if (!asnOrderItemService.fieldsSave(map, loginUserId)) {
-                            throw new CoolException("鏄庣粏淇濆瓨澶辫触锛侊紒");
-                        }
-                    });
-                    List<WkOrderItem> orderItems = asnOrderItemService.list(new LambdaQueryWrapper<WkOrderItem>()
-                            .eq(WkOrderItem::getOrderId, wkOrder.getId()));
-                    Double sum = QuantityUtils.roundToScale(orderItems.stream().mapToDouble(WkOrderItem::getAnfme).sum());
-                    wkOrder.setAnfme(sum);
-                    if (!asnOrderService.updateById(wkOrder)) {
-                        throw new CoolException("璁″垝鏀惰揣鏁伴噺淇敼澶辫触锛侊紒");
-                    }
-                }
-            });
+        if (syncOrders == null || syncOrders.isEmpty()) {
+            return R.ok();
         }
-        return R.ok();
+        List<String> msgs = new ArrayList<>(syncOrders.size());
+        for (SyncOrderParams syncOrder : syncOrders) {
+            msgs.add(syncOneCheckOrder(syncOrder, loginUserId));
+        }
+        if (msgs.size() == 1) {
+            return R.ok(msgs.get(0));
+        }
+        return R.ok(String.join("锛�", msgs));
+    }
+
+    /**
+     * 鍗曟潯鍗曟嵁鍚屾锛堟柊澧�/淇敼锛夛紝杩斿洖涓庣幇鏈夋帴鍙d竴鑷寸殑 msg 鏂囨銆�
+     */
+    private String syncOneCheckOrder(SyncOrderParams syncOrder, Long loginUserId) {
+        if (StringUtils.isBlank(syncOrder.getOrderInternalCode())) {
+            throw new CoolException("鍗曟嵁鍐呯爜涓嶈兘涓虹┖锛侊紒");
+        }
+        if (syncOrder.getOrderItems() != null) {
+            Set<String> lineIds = new HashSet<>();
+            for (SyncOrdersItem item : syncOrder.getOrderItems()) {
+                if (StringUtils.isBlank(item.getPlatItemId())) {
+                    throw new CoolException("鏄庣粏 lineId 涓嶈兘涓虹┖锛侊紒");
+                }
+                String lineId = item.getPlatItemId().trim();
+                if (!lineIds.add(lineId)) {
+                    throw new CoolException("鍚屼竴璁㈠崟鍐呮槑缁� lineId 涓嶈兘閲嶅锛�" + lineId);
+                }
+            }
+        }
+        WkOrder wkOrder = new WkOrder();
+        String wkTypeInput = syncOrder.getWkType();
+        String typeCode = StringUtils.isBlank(wkTypeInput) ? null : orderWorkTypeService.getTypeByLabel(wkTypeInput);
+        if (typeCode == null) {
+            typeCode = wkTypeInput;
+        }
+        if (StringUtils.isBlank(typeCode) || orderWorkTypeService.getLabelByType(typeCode) == null) {
+            throw new CoolException("鍗曟嵁锛�" + syncOrder.getOrderNo() + ", 涓氬姟绫诲瀷涓嶅瓨鍦紒锛�");
+        }
+        String typeInput = syncOrder.getType();
+        String resolvedOrderType = orderTypeDictService.resolveType(typeInput);
+        if (typeInput != null && !typeInput.trim().isEmpty() && resolvedOrderType == null) {
+            throw new CoolException("鍗曟嵁锛�" + syncOrder.getOrderNo() + ", 璁㈠崟绫诲瀷涓嶅瓨鍦紒锛�");
+        }
+        Loc serviceOne = null;
+        if (!Objects.isNull(syncOrder.getOrgLoc())) {
+            serviceOne = locService.getOne(new LambdaQueryWrapper<Loc>().eq(!Objects.isNull(syncOrder.getOrgLoc()), Loc::getCode, syncOrder.getOrgLoc()));
+        }
+        if (!Objects.isNull(serviceOne)) {
+            //TODO 娣诲姞璋冩嫈绉诲簱鍗曞姛鑳�
+            return "Success";
+        }
+        WkOrder order = asnOrderService.getOne(new LambdaQueryWrapper<WkOrder>()
+                .eq(WkOrder::getPoCode, syncOrder.getOrderInternalCode()));
+        if (!Objects.isNull(order)) {
+            assertWkOrderNoLinkedTask(order.getId());
+            assertWkOrderExceStatusUnexecuted(order, "淇敼");
+            long pakinCount = waitPakinItemService.count(new LambdaQueryWrapper<WaitPakinItem>()
+                    .eq(WaitPakinItem::getAsnId, order.getId()).eq(WaitPakinItem::getDeleted, 0));
+            if (pakinCount > 0) {
+                String changeSummary = computeWkOrderModifyChangeSummaryOrNull(order, syncOrder, resolvedOrderType, typeCode, true);
+                if (changeSummary == null) {
+                    return "淇敼鏃犲彉鍖�";
+                }
+                mergeOrderWithPakin(order, syncOrder, resolvedOrderType, typeCode, loginUserId);
+                if (isDirectWaitPakin()) {
+                    syncReceiptAreaByOrder(order.getId());
+                }
+                return "淇敼鎴愬姛锛�" + changeSummary;
+            }
+            String changeSummary = computeWkOrderModifyChangeSummaryOrNull(order, syncOrder, resolvedOrderType, typeCode, false);
+            if (changeSummary == null) {
+                return "淇敼鏃犲彉鍖�";
+            }
+            updateOrderNoPakin(order, syncOrder, loginUserId);
+            if (isDirectWaitPakin()) {
+                syncReceiptAreaByOrder(order.getId());
+            }
+            return "淇敼鎴愬姛锛�" + changeSummary;
+        }
+        if (Integer.valueOf(2).equals(syncOrder.getOperateType())) {
+            throw new CoolException("鍗曟嵁涓嶅瓨鍦紝鏃犳硶淇敼锛侊紒");
+        }
+        String rule = SerialRuleCode.SYS_ASN_ORDER;
+        if (resolvedOrderType != null && resolvedOrderType.equals(OrderType.ORDER_OUT.type)) {
+            rule = SerialRuleCode.SYS_OUT_STOCK_CODE;
+        }
+        String wmsCode = StringUtils.isNotBlank(syncOrder.getOrderNo()) ? syncOrder.getOrderNo() : SerialRuleUtils.generateRuleCode(rule, null);
+        String poCodeVal = syncOrder.getOrderInternalCode();
+        wkOrder.setType(resolvedOrderType != null ? resolvedOrderType : syncOrder.getType())
+                .setWkType(typeCode)
+                .setAnfme(QuantityUtils.roundToScale(syncOrder.getAnfme()))
+                .setPoCode(poCodeVal)
+                .setWorkQty(0.0)
+                .setQty(0.0)
+                .setPoId(syncOrder.getOrderId())
+                .setCode(wmsCode)
+                .setArrTime(syncOrder.getArrTime())
+                .setStationId(syncOrder.getStationId())
+                .setId(null)
+                .setCreateTime(syncOrder.getCreateTime() != null ? syncOrder.getCreateTime() : new Date())
+                .setUpdateTime(new Date())
+                .setCreateBy(loginUserId)
+                .setUpdateBy(loginUserId);
+
+        if (resolvedOrderType != null && resolvedOrderType.equals(OrderType.ORDER_OUT.type)) {
+            wkOrder.setExceStatus(AsnExceStatus.OUT_STOCK_STATUS_TASK_INIT.val);
+        }
+
+        if (!asnOrderService.save(wkOrder)) {
+            throw new CoolException("鍗曟嵁淇濆瓨澶辫触锛侊紒");
+        }
+
+        syncOrder.getOrderItems().forEach(orderItem -> {
+            Map<String, Object> map = new ObjectMapper().convertValue(orderItem, Map.class);
+            map.put("orderId", wkOrder.getId());
+            map.put("poId", wkOrder.getPoId());
+            map.put("poCode", wkOrder.getPoCode());
+            map.put("order_code", wkOrder.getCode());
+            map.put("matnrCode", orderItem.getMatnr());
+
+            if (!asnOrderItemService.fieldsSave(map, loginUserId)) {
+                throw new CoolException("鏄庣粏淇濆瓨澶辫触锛侊紒");
+            }
+        });
+        List<WkOrderItem> orderItems = asnOrderItemService.list(new LambdaQueryWrapper<WkOrderItem>()
+                .eq(WkOrderItem::getOrderId, wkOrder.getId()));
+        Double sum = QuantityUtils.roundToScale(orderItems.stream().mapToDouble(WkOrderItem::getAnfme).sum());
+        wkOrder.setAnfme(sum);
+        if (!asnOrderService.updateById(wkOrder)) {
+            throw new CoolException("璁″垝鏀惰揣鏁伴噺淇敼澶辫触锛侊紒");
+        }
+        return "Success";
+    }
+
+    /** 涓� updateOrderNoPakin / mergeOrderWithPakin 鍐欏叆瑙勫垯涓�鑷达紱鏃犳湁鏁堝彉鏇存椂杩斿洖 null */
+    private String computeWkOrderModifyChangeSummaryOrNull(WkOrder order, SyncOrderParams syncOrder,
+            String resolvedOrderType, String typeCode, boolean mergeStyleAllowEmptyItems) {
+        List<String> parts = new ArrayList<>();
+        if (headerDiffForSyncModify(order, syncOrder, resolvedOrderType, typeCode)) {
+            parts.add("涓诲崟澶翠俊鎭湁璋冩暣");
+        }
+        Map<String, SyncOrdersItem> incomingByLineId = new LinkedHashMap<>();
+        if (syncOrder.getOrderItems() != null) {
+            for (SyncOrdersItem it : syncOrder.getOrderItems()) {
+                if (StringUtils.isBlank(it.getPlatItemId())) {
+                    throw new CoolException("鏄庣粏 lineId 涓嶈兘涓虹┖锛侊紒");
+                }
+                incomingByLineId.put(it.getPlatItemId().trim(), it);
+            }
+        }
+        if (!mergeStyleAllowEmptyItems && incomingByLineId.isEmpty()) {
+            throw new CoolException("淇敼鏃舵槑缁嗕笉鑳戒负绌猴紒锛�");
+        }
+        List<WkOrderItem> existingItems = asnOrderItemService.list(new LambdaQueryWrapper<WkOrderItem>().eq(WkOrderItem::getOrderId, order.getId()));
+        Set<String> existingLineIds = existingItems.stream()
+                .map(e -> StringUtils.isNotBlank(e.getPlatItemId()) ? e.getPlatItemId().trim() : null)
+                .filter(Objects::nonNull)
+                .collect(Collectors.toSet());
+
+        for (WkOrderItem existing : existingItems) {
+            String lineId = StringUtils.isNotBlank(existing.getPlatItemId()) ? existing.getPlatItemId().trim() : null;
+            if (lineId == null || !incomingByLineId.containsKey(lineId)) {
+                String m = StringUtils.defaultString(existing.getMatnrCode());
+                if (lineId != null) {
+                    parts.add("鍒犻櫎鏄庣粏 lineId=" + lineId + "锛堢墿鏂� " + m + "锛�");
+                } else {
+                    parts.add("鍒犻櫎鏄庣粏 id=" + existing.getId() + " 鏃爈ineId锛堢墿鏂� " + m + "锛�");
+                }
+                continue;
+            }
+            SyncOrdersItem inc = incomingByLineId.get(lineId);
+            Double newAnfme = QuantityUtils.roundToScale(inc.getAnfme() != null ? inc.getAnfme() : existing.getAnfme());
+            Double oldAnfme = QuantityUtils.roundToScale(existing.getAnfme() != null ? existing.getAnfme() : 0.0);
+            boolean anfmeDiff = QuantityUtils.compare(newAnfme, oldAnfme) != 0;
+            boolean other = lineNonAnfmeFieldsDifferForModify(existing, inc, newAnfme);
+            if (anfmeDiff && other) {
+                parts.add("lineId=" + lineId + " 鏁伴噺 " + oldAnfme + "鈫�" + newAnfme + "锛屽叾瀹冨瓧娈垫湁鍙樻洿");
+            } else if (anfmeDiff) {
+                parts.add("lineId=" + lineId + " 鏁伴噺 " + oldAnfme + "鈫�" + newAnfme);
+            } else if (other) {
+                parts.add("lineId=" + lineId + " 鏄庣粏鍏跺畠瀛楁鏈夊彉鏇�");
+            }
+        }
+        for (String key : incomingByLineId.keySet()) {
+            if (!existingLineIds.contains(key)) {
+                SyncOrdersItem inc = incomingByLineId.get(key);
+                String m = StringUtils.defaultString(inc.getMatnr());
+                parts.add("鏂板鏄庣粏 lineId=" + key + "锛堢墿鏂� " + m + "锛�");
+            }
+        }
+        if (parts.isEmpty()) {
+            return null;
+        }
+        return String.join("锛�", parts);
+    }
+
+    private boolean headerDiffForSyncModify(WkOrder order, SyncOrderParams syncOrder, String resolvedOrderType, String typeCode) {
+        double incAnfme = QuantityUtils.roundToScale(syncOrder.getAnfme() != null ? syncOrder.getAnfme() : 0.0);
+        double dbAnfme = QuantityUtils.roundToScale(order.getAnfme() != null ? order.getAnfme() : 0.0);
+        if (QuantityUtils.compare(incAnfme, dbAnfme) != 0) {
+            return true;
+        }
+        if (resolvedOrderType != null
+                && !Objects.equals(StringUtils.trimToNull(resolvedOrderType), StringUtils.trimToNull(order.getType()))) {
+            return true;
+        }
+        if (!Objects.equals(StringUtils.trimToNull(typeCode), StringUtils.trimToNull(order.getWkType()))) {
+            return true;
+        }
+        if (syncOrder.getArrTime() != null) {
+            Date db = order.getArrTime();
+            if (db == null || db.getTime() != syncOrder.getArrTime().getTime()) {
+                return true;
+            }
+        }
+        if (StringUtils.isNotBlank(syncOrder.getStationId())) {
+            if (!StringUtils.equals(StringUtils.trimToNull(syncOrder.getStationId()), StringUtils.trimToNull(order.getStationId()))) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /** 涓� updateOrderNoPakin 涓鏄庣粏鏇存柊鑼冨洿涓�鑷达紙涓嶅惈璁″垝鏁伴噺 anfme锛� */
+    private boolean lineNonAnfmeFieldsDifferForModify(WkOrderItem existing, SyncOrdersItem inc, Double newAnfme) {
+        if (!Objects.equals(StringUtils.trimToNull(inc.getMatnr()), StringUtils.trimToNull(existing.getMatnrCode()))) {
+            return true;
+        }
+        if (!Objects.equals(StringUtils.trimToNull(inc.getMaktx()), StringUtils.trimToNull(existing.getMaktx()))) {
+            return true;
+        }
+        if (!Objects.equals(StringUtils.trimToNull(inc.getSpec()), StringUtils.trimToNull(existing.getSpec()))) {
+            return true;
+        }
+        if (!Objects.equals(StringUtils.trimToNull(inc.getModel()), StringUtils.trimToNull(existing.getModel()))) {
+            return true;
+        }
+        if (!Objects.equals(StringUtils.trimToNull(inc.getUnit()), StringUtils.trimToNull(existing.getStockUnit()))) {
+            return true;
+        }
+        if (!Objects.equals(StringUtils.trimToNull(inc.getBatch()), StringUtils.trimToNull(existing.getBatch()))) {
+            return true;
+        }
+        if (!Objects.equals(StringUtils.trimToNull(inc.getPlanNo()), StringUtils.trimToNull(existing.getPlanNo()))) {
+            return true;
+        }
+        if (!Objects.equals(StringUtils.trimToNull(inc.getPalletId()), StringUtils.trimToNull(existing.getPalletId()))) {
+            return true;
+        }
+        Double targetQty;
+        if (inc.getQty() != null) {
+            targetQty = QuantityUtils.roundToScale(inc.getQty());
+        } else {
+            double curQty = existing.getQty() != null ? existing.getQty() : 0.0;
+            if (QuantityUtils.compare(curQty, 0.0) != 0) {
+                targetQty = newAnfme;
+            } else {
+                targetQty = QuantityUtils.roundToScale(existing.getQty());
+            }
+        }
+        return QuantityUtils.compare(targetQty, QuantityUtils.roundToScale(existing.getQty())) != 0;
     }
 
     /**
@@ -1024,60 +1168,83 @@
     @Override
     @Transactional(timeout = 60, rollbackFor = Exception.class)
     public R syncOrderDelete(List<SyncOrderParams> orders) {
-        orders.forEach(order -> {
-            // operateType=3锛氬瓨鍦ㄥ垯鍒ゆ柇鏄惁鍙互鍙栨秷锛涗富瑕佹牎楠屽崟鎹唴鐮�(orderInternalCode)锛宱rderNo 鏌ュ埌 1 鏉$户缁紝鏌ュ埌澶氭潯鍒欐姤閿欏己璋冧娇鐢� orderInternalCode
-            WkOrder wkOrder = null;
-            if (StringUtils.isNotEmpty(order.getOrderInternalCode())) {
-                wkOrder = asnOrderService.getOne(new LambdaQueryWrapper<WkOrder>()
-                        .eq(WkOrder::getPoCode, order.getOrderInternalCode()));
+        if (orders == null || orders.isEmpty()) {
+            return R.ok();
+        }
+        List<String> msgs = new ArrayList<>(orders.size());
+        for (SyncOrderParams order : orders) {
+            msgs.add(syncOneOrderDelete(order));
+        }
+        if (msgs.size() == 1) {
+            return R.ok(msgs.get(0));
+        }
+        return R.ok(String.join("锛�", msgs));
+    }
+
+    /**
+     * 鍗曟潯鍙栨秷锛氬凡鍒犳垨鏌ユ棤鍗曟嵁鏃惰繑鍥炲箓绛夋垚鍔熸枃妗堬紱鎴愬姛鍒犻櫎杩斿洖銆屽彇娑堟垚鍔熴�嶃��
+     */
+    private String syncOneOrderDelete(SyncOrderParams order) {
+        WkOrder wkOrder = null;
+        if (StringUtils.isNotEmpty(order.getOrderInternalCode())) {
+            wkOrder = asnOrderService.getOne(new LambdaQueryWrapper<WkOrder>()
+                    .eq(WkOrder::getPoCode, order.getOrderInternalCode()));
+        }
+        if (wkOrder == null && StringUtils.isNotEmpty(order.getOrderNo())) {
+            List<WkOrder> list = asnOrderService.list(new LambdaQueryWrapper<WkOrder>()
+                    .eq(WkOrder::getCode, order.getOrderNo()));
+            if (list.isEmpty()) {
+                return "鍗曟嵁宸蹭笉瀛樺湪鎴栧凡鍙栨秷";
             }
-            if (wkOrder == null && StringUtils.isNotEmpty(order.getOrderNo())) {
-                List<WkOrder> list = asnOrderService.list(new LambdaQueryWrapper<WkOrder>()
-                        .eq(WkOrder::getCode, order.getOrderNo()));
-                if (list.isEmpty()) {
-                    throw new CoolException("鍗曟嵁涓嶅瓨鍦紝鏃犳硶鍙栨秷锛侊紒");
-                }
-                if (list.size() > 1) {
-                    throw new CoolException("鍗曞彿瀵瑰簲澶氭潯鍗曟嵁锛岃浣跨敤鍗曟嵁鍐呯爜(orderInternalCode)鍞竴鎸囧畾鍚庡啀鍙栨秷锛侊紒");
-                }
-                wkOrder = list.get(0);
+            if (list.size() > 1) {
+                throw new CoolException("鍗曞彿瀵瑰簲澶氭潯鍗曟嵁锛岃浣跨敤鍗曟嵁鍐呯爜(orderInternalCode)鍞竴鎸囧畾鍚庡啀鍙栨秷锛侊紒");
             }
-            if (wkOrder == null) {
-                throw new CoolException("鍗曟嵁涓嶅瓨鍦紝鏃犳硶鍙栨秷锛侊紒璇锋彁渚涘崟鎹唴鐮�(orderInternalCode)鎴栧崟鍙�(orderNo)銆�");
+            wkOrder = list.get(0);
+        }
+        if (wkOrder == null) {
+            if (StringUtils.isEmpty(order.getOrderInternalCode()) && StringUtils.isEmpty(order.getOrderNo())) {
+                throw new CoolException("璇锋彁渚涘崟鎹唴鐮�(orderInternalCode)鎴栧崟鍙�(orderNo)銆�");
             }
-            final WkOrder finalWkOrder = wkOrder;
-            assertWkOrderNoLinkedTask(finalWkOrder.getId());
-            // 宸茬粍鎵樹笉鍙彇娑�
-            long pakinCount = waitPakinItemService.count(new LambdaQueryWrapper<WaitPakinItem>()
-                    .eq(WaitPakinItem::getAsnId, finalWkOrder.getId()));
-            if (pakinCount > 0) {
-                throw new CoolException("鍗曟嵁宸茬粍鎵橈紝浠呮湭缁勬墭鐘舵�佸彲鍙栨秷锛岃鍏堣В闄ょ粍鎵橈紒锛�");
-            }
-            assertWkOrderExceStatusForCancel(finalWkOrder);
-            order.getOrderItems().forEach(orderItem -> {
-                if (!asnOrderItemService.remove(new LambdaQueryWrapper<WkOrderItem>()
-                        .eq(WkOrderItem::getMatnrCode, orderItem.getMatnr())
-                        .eq(StringUtils.isNotEmpty(orderItem.getBatch()), WkOrderItem::getSplrBatch, orderItem.getBatch())
-                        .eq(StringUtils.isNotEmpty(orderItem.getPlatItemId()), WkOrderItem::getPlatItemId, orderItem.getPlatItemId())
-                        .eq(WkOrderItem::getOrderCode, finalWkOrder.getCode()))) {
-                    throw new CoolException("鍗曟嵁鏄庣粏鍒犻櫎澶辫触锛侊紒");
-                }
-                List<WkOrderItem> orderItems = asnOrderItemService.list(new LambdaQueryWrapper<WkOrderItem>().eq(WkOrderItem::getOrderId, finalWkOrder.getId()));
-                if (orderItems.isEmpty()) {
-                    if (!asnOrderService.removeById(finalWkOrder.getId())) {
-                        throw new CoolException("鍗曟嵁鍒犻櫎澶辫触锛侊紒");
-                    }
-                } else {
-                    Double sum = QuantityUtils.roundToScale(orderItems.stream().mapToDouble(WkOrderItem::getAnfme).sum());
-                    if (!asnOrderService.update(new LambdaUpdateWrapper<WkOrder>()
-                            .eq(WkOrder::getId, finalWkOrder.getId())
-                            .set(WkOrder::getAnfme, sum))) {
-                        throw new CoolException("涓诲崟鏁伴噺淇敼澶辫触锛侊紒");
-                    }
-                }
-            });
-        });
-        return R.ok();
+            return "鍗曟嵁宸蹭笉瀛樺湪鎴栧凡鍙栨秷";
+        }
+        final WkOrder finalWkOrder = wkOrder;
+        assertWkOrderNoLinkedTask(finalWkOrder.getId());
+        long pakinCount = waitPakinItemService.count(new LambdaQueryWrapper<WaitPakinItem>()
+                .eq(WaitPakinItem::getAsnId, finalWkOrder.getId()));
+        if (pakinCount > 0) {
+            throw new CoolException("鍗曟嵁宸茬粍鎵橈紝浠呮湭缁勬墭鐘舵�佸彲鍙栨秷锛岃鍏堣В闄ょ粍鎵橈紒锛�");
+        }
+        assertWkOrderExceStatusForCancel(finalWkOrder);
+        long itemCnt = asnOrderItemService.count(new LambdaQueryWrapper<WkOrderItem>().eq(WkOrderItem::getOrderId, finalWkOrder.getId()));
+        if (itemCnt > 0 && !asnOrderItemService.remove(new LambdaQueryWrapper<WkOrderItem>().eq(WkOrderItem::getOrderId, finalWkOrder.getId()))) {
+            throw new CoolException("鍗曟嵁鏄庣粏鍒犻櫎澶辫触锛侊紒");
+        }
+        if (!asnOrderService.removeById(finalWkOrder.getId())) {
+            return "鍗曟嵁宸蹭笉瀛樺湪鎴栧凡鍙栨秷";
+        }
+        return "鍙栨秷鎴愬姛";
+//            order.getOrderItems().forEach(orderItem -> {
+//                if (!asnOrderItemService.remove(new LambdaQueryWrapper<WkOrderItem>()
+//                        .eq(WkOrderItem::getMatnrCode, orderItem.getMatnr())
+//                        .eq(StringUtils.isNotEmpty(orderItem.getBatch()), WkOrderItem::getSplrBatch, orderItem.getBatch())
+//                        .eq(StringUtils.isNotEmpty(orderItem.getPlatItemId()), WkOrderItem::getPlatItemId, orderItem.getPlatItemId())
+//                        .eq(WkOrderItem::getOrderCode, finalWkOrder.getCode()))) {
+//                    throw new CoolException("鍗曟嵁鏄庣粏鍒犻櫎澶辫触锛侊紒");
+//                }
+//                List<WkOrderItem> orderItems = asnOrderItemService.list(new LambdaQueryWrapper<WkOrderItem>().eq(WkOrderItem::getOrderId, finalWkOrder.getId()));
+//                if (orderItems.isEmpty()) {
+//                    if (!asnOrderService.removeById(finalWkOrder.getId())) {
+//                        throw new CoolException("鍗曟嵁鍒犻櫎澶辫触锛侊紒");
+//                    }
+//                } else {
+//                    Double sum = QuantityUtils.roundToScale(orderItems.stream().mapToDouble(WkOrderItem::getAnfme).sum());
+//                    if (!asnOrderService.update(new LambdaUpdateWrapper<WkOrder>()
+//                            .eq(WkOrder::getId, finalWkOrder.getId())
+//                            .set(WkOrder::getAnfme, sum))) {
+//                        throw new CoolException("涓诲崟鏁伴噺淇敼澶辫触锛侊紒");
+//                    }
+//                }
+//            });
     }
 
     /**
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderServiceImpl.java
index 1eb0a76..a022854 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderServiceImpl.java
@@ -382,6 +382,10 @@
     @Override
     @Transactional(rollbackFor = Exception.class)
     public R removeOrders(List<Long> ids) {
+        long existOrderCnt = this.count(new LambdaQueryWrapper<WkOrder>().in(WkOrder::getId, ids));
+        if (existOrderCnt == 0) {
+            return R.ok("鍗曟嵁宸蹭笉瀛樺湪鎴栧凡鍒犻櫎");
+        }
         // 宸茬粍鎵樹笉鍙垹闄わ紝闇�鍏堣В闄ょ粍鎵�
         long palletizedCount = waitPakinItemService.count(new LambdaQueryWrapper<WaitPakinItem>()
                 .in(WaitPakinItem::getAsnId, ids).eq(WaitPakinItem::getDeleted, 0));
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java
index deec95f..a4c5f10 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java
@@ -265,7 +265,7 @@
         }
         WkOrder order = this.getById(id);
         if (Objects.isNull(order)) {
-            throw new CoolException("鍗曟嵁涓嶅瓨鍦紒锛�");
+            return R.ok("鍗曟嵁宸蹭笉瀛樺湪鎴栧凡鍙栨秷");
         }
         if (!order.getExceStatus().equals(AsnExceStatus.OUT_STOCK_STATUS_TASK_INIT.val)) {
             throw new CoolException("褰撳墠鍗曟嵁鐘舵�佷负" + AsnExceStatus.getExceStatus(order.getExceStatus()) + "锛� 涓嶅彲鎵ц鍙栨秷鎿嶄綔锛侊紒");
@@ -295,10 +295,10 @@
         }
 
         if (!this.remove(new LambdaQueryWrapper<WkOrder>().eq(WkOrder::getId, id))) {
-            throw new CoolException("涓诲崟鍒犻櫎澶辫触锛侊紒");
+            return R.ok("鍗曟嵁宸蹭笉瀛樺湪鎴栧凡鍙栨秷");
         }
         outStockItemService.remove(new LambdaQueryWrapper<WkOrderItem>().eq(WkOrderItem::getOrderId, id));
-        return R.ok("鎿嶄綔鎴愬姛");
+        return R.ok("鍙栨秷鎴愬姛");
     }
 
     /**
@@ -889,11 +889,13 @@
     @Transactional(rollbackFor = Exception.class)
     public R cancelOutOrderByItems(List<WkOrderItem> orderItems) {
         Map<Long, List<WkOrderItem>> listMap = orderItems.stream().collect(Collectors.groupingBy(WkOrderItem::getOrderId));
+        boolean anyProcessed = false;
         for (Long key : listMap.keySet()) {
             WkOrder order = this.getById(key);
             if (Objects.isNull(order)) {
-                throw new CoolException("鍗曟嵁涓嶅瓨鍦紒锛�");
+                continue;
             }
+            anyProcessed = true;
             List<WkOrderItem> items = listMap.get(key);
             if (!items.isEmpty()) {
                 for (WkOrderItem orderItem : items) {
@@ -916,14 +918,11 @@
             }
 
             if (!this.remove(new LambdaQueryWrapper<WkOrder>().eq(WkOrder::getId, key))) {
-                throw new CoolException("涓诲崟鍒犻櫎澶辫触锛侊紒");
+                continue;
             }
-            if (!outStockItemService.remove(new LambdaQueryWrapper<WkOrderItem>()
-                    .eq(WkOrderItem::getOrderId, key))) {
-                throw new CoolException("鍗曟嵁鏄庣粏鍒犻櫎澶辫触锛侊紒");
-            }
+            outStockItemService.remove(new LambdaQueryWrapper<WkOrderItem>().eq(WkOrderItem::getOrderId, key));
         }
-        return R.ok("鎿嶄綔鎴愬姛");
+        return R.ok(anyProcessed ? "鍙栨秷鎴愬姛" : "鍗曟嵁宸蹭笉瀛樺湪鎴栧凡鍙栨秷");
     }
 
 
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java
index 6745e5d..d61e7ff 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java
@@ -945,14 +945,24 @@
         List<Integer> list = Arrays.asList(TaskType.TASK_TYPE_IN.type, TaskType.TASK_TYPE_OUT.type, TaskType.TASK_TYPE_PICK_AGAIN_OUT.type,
                 TaskType.TASK_TYPE_CHECK_OUT.type, TaskType.TASK_TYPE_EMPITY_IN.type, TaskType.TASK_TYPE_LOC_MOVE.type,
                 TaskType.TASK_TYPE_EMPITY_OUT.type, TaskType.TASK_TYPE_MERGE_OUT.type);
-        List<Task> allTasks = this.list(new LambdaQueryWrapper<Task>()
-                .in(Task::getTaskType, list)
-                .in(Task::getId, (Object[]) ids));
-        
-        if (allTasks.isEmpty()) {
+        List<Task> tasksById = this.list(new LambdaQueryWrapper<Task>().in(Task::getId, (Object[]) ids));
+        if (tasksById.isEmpty()) {
             throw new CoolException("浠诲姟涓嶅瓨鍦紒锛�");
         }
-        
+        // 鎷f枡鍑哄簱/鐩樼偣鍑哄簱杩涘叆鍐嶅叆搴撻樁娈靛悗绂佹鍙栨秷锛堜换鍔$被鍨嬪凡鐢� 103/107 鍙樹负鍐嶅叆搴擄級
+        for (Task t : tasksById) {
+            if (TaskType.TASK_TYPE_PICK_IN.type.equals(t.getTaskType())
+                    || TaskType.TASK_TYPE_CHECK_IN.type.equals(t.getTaskType())) {
+                throw new CoolException("鎷f枡/鐩樼偣鍑哄簱宸茶繘鍏ュ啀鍏ュ簱闃舵锛岀姝㈠彇娑堬紒锛�");
+            }
+        }
+        List<Task> allTasks = tasksById.stream()
+                .filter(t -> list.contains(t.getTaskType()))
+                .collect(Collectors.toList());
+        if (allTasks.isEmpty()) {
+            throw new CoolException("褰撳墠浠诲姟绫诲瀷涓嶆敮鎸佸彇娑堬紒锛�");
+        }
+
         // 鏀堕泦闇�瑕佸彇娑堢殑RCS浠诲姟缂栧彿鍜屾壒娆$紪鍙凤紙涓嶉檺鍒剁姸鎬侊紝鍙宸蹭笅鍙戝埌RCS灏遍渶瑕佸彇娑堬級
         List<String> rcsTaskCodes = new ArrayList<>();
         String batchNo = null;
@@ -1029,6 +1039,10 @@
                 log.info("RCS鍙栨秷浠诲姟鍝嶅簲鐘舵�佺爜锛歿}", exchange.getStatusCode());
                 log.info("RCS鍙栨秷浠诲姟鍝嶅簲浣擄細{}", exchange.getBody());
 
+                if (!exchange.getStatusCode().is2xxSuccessful()) {
+                    throw new CoolException("RCS鍙栨秷浠诲姟澶辫触锛欻TTP " + exchange.getStatusCode().value());
+                }
+
                 if (Objects.isNull(exchange.getBody())) {
                     log.error("RCS鍙栨秷浠诲姟澶辫触锛氬搷搴斾綋涓虹┖");
                     throw new CoolException("RCS鍙栨秷浠诲姟澶辫触锛氬搷搴斾綋涓虹┖");
@@ -1058,7 +1072,7 @@
             }
         }
         
-        // 鍙彇娑堢姸鎬侊細鍘� 1/101锛堜笉鍚� 199锛夛紱鎷f枡/鐩樼偣鍑哄簱 RCS 鎵ц涓�(<198)锛涙嫞鏂�/鐩樼偣鍐嶅叆搴�(53/57)涓嶆敮鎸佸彇娑�
+        // 鍙彇娑堢姸鎬侊細鍘� 1/101锛堜笉鍚� 199锛夛紱鎷f枡/鐩樼偣鍑哄簱 RCS 鎵ц涓�(<198)锛涘啀鍏ュ簱(53/57)鍦ㄦ柟娉曞叆鍙e凡绂佹鍙栨秷
         List<Task> tasks = this.list(new LambdaQueryWrapper<Task>()
                 .in(Task::getTaskType, list)
                 .in(Task::getId, (Object[]) ids)

--
Gitblit v1.9.1