From 43d6ae86bc229a1a75637fae33be378e105016e3 Mon Sep 17 00:00:00 2001
From: cl <1442464845@qq.com>
Date: 星期日, 29 三月 2026 20:47:11 +0800
Subject: [PATCH] RCS通知

---
 rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/ReceiveMsgServiceImpl.java |  146 +++++++++++++++++++++++++++++++++++++-----------
 1 files changed, 112 insertions(+), 34 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 ca580c6..90b7bdd 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
@@ -26,7 +26,10 @@
 import com.vincent.rsf.server.manager.service.*;
 import com.vincent.rsf.server.manager.service.impl.MatnrServiceImpl;
 import com.vincent.rsf.server.system.constant.DictTypeCode;
+import com.vincent.rsf.server.system.constant.GlobalConfigCode;
 import com.vincent.rsf.server.system.constant.SerialRuleCode;
+import com.vincent.rsf.server.system.entity.Config;
+import com.vincent.rsf.server.system.service.ConfigService;
 import com.vincent.rsf.server.system.entity.DictData;
 import com.vincent.rsf.server.system.entity.DictType;
 import com.vincent.rsf.server.system.entity.Fields;
@@ -113,7 +116,36 @@
     private WaitPakinItemService waitPakinItemService;
     @Autowired
     private WarehouseAreasItemService warehouseAreasItemService;
+    @Autowired
+    private ConfigService configService;
+    @Autowired
+    private TaskItemService taskItemService;
+    @Autowired
+    private TaskService taskService;
 
+    /**
+     * 浜戜粨鏀瑰崟/鍙栨秷鍓嶏細浠诲姟鏄庣粏宸插叧鑱旇鍗曟嵁涓斾富浠诲姟鏈�昏緫鍒犻櫎鍒欎笉鍏佽
+     */
+    private void assertWkOrderNoLinkedTask(Long wkOrderId) {
+        if (wkOrderId == null) {
+            return;
+        }
+        List<TaskItem> links = taskItemService.list(new LambdaQueryWrapper<TaskItem>()
+                .select(TaskItem::getTaskId)
+                .and(w -> w.eq(TaskItem::getOrderId, wkOrderId)
+                        .or(o -> o.eq(TaskItem::getSourceId, wkOrderId)
+                                .eq(TaskItem::getOrderType, OrderType.ORDER_OUT.type))));
+        if (links.isEmpty()) {
+            return;
+        }
+        Set<Long> taskIds = links.stream().map(TaskItem::getTaskId).filter(Objects::nonNull).collect(Collectors.toSet());
+        if (taskIds.isEmpty()) {
+            return;
+        }
+        if (taskService.count(new LambdaQueryWrapper<Task>().in(Task::getId, taskIds)) > 0) {
+            throw new CoolException("璇ュ崟鎹凡鐢熸垚浠诲姟锛屼笉鍙慨鏀广�佸彇娑堟垨鍒犻櫎锛侊紒");
+        }
+    }
 
     /**
      * @author Ryan
@@ -460,23 +492,29 @@
                     WkOrder order = asnOrderService.getOne(new LambdaQueryWrapper<WkOrder>()
                             .eq(WkOrder::getPoCode, syncOrder.getOrderInternalCode()));
                     if (!Objects.isNull(order)) {
+                        assertWkOrderNoLinkedTask(order.getId());
                         // 浠呮湭鎵ц鐘舵�佸彲琚� order/add 淇敼锛堝叆搴撴湭鎵ц銆佸嚭搴撲换鍔″垵濮嬶級
-                        List<Short> editableStatus = Arrays.asList(AsnExceStatus.ASN_EXCE_STATUS_UN_EXCE.val, AsnExceStatus.OUT_STOCK_STATUS_TASK_INIT.val);
+                        List<Short> editableStatus = Arrays.asList(AsnExceStatus.ASN_EXCE_STATUS_UN_EXCE.val
+                                ,AsnExceStatus.ASN_EXCE_STATUS_UN_EXCE.val
+                                ,AsnExceStatus.ASN_EXCE_STATUS_RECEIPT_DONE.val
+                                , AsnExceStatus.OUT_STOCK_STATUS_TASK_INIT.val);
                         if (!editableStatus.contains(order.getExceStatus())) {
                             throw new CoolException("浠呮湭鎵ц鐘舵�佺殑鍗曟嵁鍙慨鏀癸紒锛�");
                         }
                         // 瀛樺湪鍒欎慨鏀癸紙1 鍜� 2 鍧囪蛋姝ゅ锛夛紝缁勬墭鏍¢獙鍦� mergeOrderWithPakin/updateOrderNoPakin 鍐�
                         long pakinCount = waitPakinItemService.count(new LambdaQueryWrapper<WaitPakinItem>()
-                                .eq(WaitPakinItem::getAsnId, order.getId()));
+                                .eq(WaitPakinItem::getAsnId, order.getId()).eq(WaitPakinItem::getDeleted, 0));
                         if (pakinCount > 0) {
-                            // 宸茬粍鎵橈細鎸� lineId锛坧latItemId锛夊悎骞讹紝鏍¢獙鏁伴噺涓庡垹闄�
                             mergeOrderWithPakin(order, syncOrder, resolvedOrderType, typeCode, loginUserId);
-                            // 鏀惰揣鍖哄凡鍋滅敤 // syncReceiptAreaByOrder(order.getId());
-                            return; // 鏈崟宸插鐞嗭紝璺宠繃涓嬫柟鈥滄柊寤轰富鍗�+鏄庣粏鈥�
+                            if (isDirectWaitPakin()) {
+                                syncReceiptAreaByOrder(order.getId());
+                            }
+                            return;
                         }
-                        // 鏈粍鎵橈細鍦ㄥ師鍗曚笂鏇存柊涓诲崟+鏄庣粏锛屼繚鐣� exceStatus/qty/workQty锛岄伩鍏嶅啀娆¤Е鍙戝畾鏃朵换鍔″鑷撮噸澶嶆敹璐�
                         updateOrderNoPakin(order, syncOrder, loginUserId);
-                        // 鏀惰揣鍖哄凡鍋滅敤 // syncReceiptAreaByOrder(order.getId());
+                        if (isDirectWaitPakin()) {
+                            syncReceiptAreaByOrder(order.getId());
+                        }
                         return;
                     } else if (Integer.valueOf(2).equals(syncOrder.getOperateType())) {
                         // 浠� operateType=2 鏃惰姹傚崟鎹繀椤诲瓨鍦�
@@ -500,7 +538,7 @@
                             .setArrTime(syncOrder.getArrTime())
                             .setStationId(syncOrder.getStationId())
                             .setId(null)
-                            .setCreateTime(new Date())
+                            .setCreateTime(syncOrder.getCreateTime() != null ? syncOrder.getCreateTime() : new Date())
                             .setUpdateTime(new Date())
                             .setCreateBy(loginUserId)
                             .setUpdateBy(loginUserId);
@@ -551,7 +589,7 @@
             }
         }
         List<WkOrderItem> existingItems = asnOrderItemService.list(new LambdaQueryWrapper<WkOrderItem>().eq(WkOrderItem::getOrderId, order.getId()));
-        List<WaitPakinItem> pakinItems = waitPakinItemService.list(new LambdaQueryWrapper<WaitPakinItem>().eq(WaitPakinItem::getAsnId, order.getId()));
+        List<WaitPakinItem> pakinItems = waitPakinItemService.list(new LambdaQueryWrapper<WaitPakinItem>().eq(WaitPakinItem::getAsnId, order.getId()).eq(WaitPakinItem::getDeleted, 0));
         Map<Long, Double> palletizedByItemId = pakinItems.stream()
                 .collect(Collectors.groupingBy(WaitPakinItem::getAsnItemId, Collectors.summingDouble(w -> w.getAnfme() != null ? w.getAnfme() : 0.0)));
         palletizedByItemId.replaceAll((k, v) -> QuantityUtils.roundToScale(v));
@@ -567,6 +605,15 @@
                 .map(e -> StringUtils.isNotBlank(e.getPlatItemId()) ? e.getPlatItemId().trim() : null)
                 .filter(Objects::nonNull)
                 .collect(Collectors.toSet());
+
+        // 宸茬粍鎵樺崟鎹慨鏀瑰彧鑳藉鍔犳暟閲忎笉鑳藉噺灏戞暟閲忥細浜戜粨涓嬪彂鐨勬�绘暟閲忎笉寰楀皬浜庡凡缁勬墭鎬婚噺
+        double totalPalletized = QuantityUtils.roundToScale(pakinItems.stream().mapToDouble(w -> w.getAnfme() != null ? w.getAnfme() : 0.0).sum());
+        double incomingTotal = syncOrder.getOrderItems() == null ? 0.0 : syncOrder.getOrderItems().stream()
+                .mapToDouble(it -> it.getAnfme() != null ? it.getAnfme() : 0.0).sum();
+        incomingTotal = QuantityUtils.roundToScale(incomingTotal);
+        if (QuantityUtils.compare(incomingTotal, totalPalletized) < 0) {
+            throw new CoolException("宸茬粍鎵樺崟鎹慨鏀瑰彧鑳藉鍔犳暟閲忎笉鑳藉噺灏戞暟閲忥紙褰撳墠宸茬粍鎵樻�婚噺 " + totalPalletized + "锛屼笅鍙戞�婚噺 " + incomingTotal + "锛夛紒锛�");
+        }
 
         for (WkOrderItem existing : existingItems) {
             String lineId = StringUtils.isNotBlank(existing.getPlatItemId()) ? existing.getPlatItemId().trim() : null;
@@ -603,7 +650,16 @@
                 continue;
             }
             SyncOrdersItem inc = incomingByLineId.get(lineId);
-            existing.setAnfme(QuantityUtils.roundToScale(inc.getAnfme() != null ? inc.getAnfme() : existing.getAnfme()));
+            Double newAnfme = QuantityUtils.roundToScale(inc.getAnfme() != null ? inc.getAnfme() : existing.getAnfme());
+            existing.setAnfme(newAnfme);
+            if (inc.getQty() != null) {
+                existing.setQty(QuantityUtils.roundToScale(inc.getQty()));
+            } else {
+                Double curQty = existing.getQty() != null ? existing.getQty() : 0.0;
+                if (QuantityUtils.compare(curQty, 0.0) != 0) {
+                    existing.setQty(QuantityUtils.roundToScale(newAnfme));
+                }
+            }
             existing.setMaktx(inc.getMaktx());
             existing.setSpec(inc.getSpec());
             existing.setModel(inc.getModel());
@@ -635,6 +691,9 @@
         Double sum = QuantityUtils.roundToScale(asnOrderItemService.list(new LambdaQueryWrapper<WkOrderItem>().eq(WkOrderItem::getOrderId, order.getId()))
                 .stream().mapToDouble(WkOrderItem::getAnfme).sum());
         order.setAnfme(sum);
+        List<WkOrderItem> afterItems = asnOrderItemService.list(new LambdaQueryWrapper<WkOrderItem>().eq(WkOrderItem::getOrderId, order.getId()));
+        double qtySum = afterItems.stream().mapToDouble(oi -> oi.getQty() != null ? oi.getQty() : 0.0).sum();
+        order.setQty(QuantityUtils.roundToScale(qtySum));
         asnOrderService.updateById(order);
     }
 
@@ -672,12 +731,23 @@
         for (WkOrderItem existing : existingItems) {
             String lineId = StringUtils.isNotBlank(existing.getPlatItemId()) ? existing.getPlatItemId().trim() : null;
             if (lineId == null || !incomingByLineId.containsKey(lineId)) {
-                // 鏀惰揣鍖哄凡鍋滅敤 // warehouseAreasItemService.remove(new LambdaQueryWrapper<WarehouseAreasItem>().eq(WarehouseAreasItem::getAsnItemId, existing.getId()));
+                if (isDirectWaitPakin()) {
+                    warehouseAreasItemService.remove(new LambdaQueryWrapper<WarehouseAreasItem>().eq(WarehouseAreasItem::getAsnItemId, existing.getId()));
+                }
                 asnOrderItemService.removeById(existing.getId());
                 continue;
             }
             SyncOrdersItem inc = incomingByLineId.get(lineId);
-            existing.setAnfme(QuantityUtils.roundToScale(inc.getAnfme() != null ? inc.getAnfme() : existing.getAnfme()));
+            Double newAnfme = QuantityUtils.roundToScale(inc.getAnfme() != null ? inc.getAnfme() : existing.getAnfme());
+            existing.setAnfme(newAnfme);
+            if (inc.getQty() != null) {
+                existing.setQty(QuantityUtils.roundToScale(inc.getQty()));
+            } else {
+                Double curQty = existing.getQty() != null ? existing.getQty() : 0.0;
+                if (QuantityUtils.compare(curQty, 0.0) != 0) {
+                    existing.setQty(QuantityUtils.roundToScale(newAnfme));
+                }
+            }
             existing.setMaktx(inc.getMaktx());
             existing.setSpec(inc.getSpec());
             existing.setModel(inc.getModel());
@@ -709,31 +779,37 @@
         Double sum = QuantityUtils.roundToScale(asnOrderItemService.list(new LambdaQueryWrapper<WkOrderItem>().eq(WkOrderItem::getOrderId, order.getId()))
                 .stream().mapToDouble(WkOrderItem::getAnfme).sum());
         order.setAnfme(sum);
+        List<WkOrderItem> afterItems = asnOrderItemService.list(new LambdaQueryWrapper<WkOrderItem>().eq(WkOrderItem::getOrderId, order.getId()));
+        double qtySum = afterItems.stream().mapToDouble(oi -> oi.getQty() != null ? oi.getQty() : 0.0).sum();
+        order.setQty(QuantityUtils.roundToScale(qtySum));
         asnOrderService.updateById(order);
     }
 
-    /** 鏀惰揣鍖哄凡鍋滅敤锛屾柟娉曟暣浣撴敞閲�
-     * 璁㈠崟淇敼鍚庡悓姝ユ敹璐у尯锛氭寜 asnItemId 灏嗘敹璐у尯璁板綍鐨� anfme 鏇存柊涓鸿鍗曟槑缁嗙殑 anfme銆�
-     */
-//    private void syncReceiptAreaByOrder(Long orderId) {
-//        List<WkOrderItem> orderItems = asnOrderItemService.list(new LambdaQueryWrapper<WkOrderItem>().eq(WkOrderItem::getOrderId, orderId));
-//        if (orderItems.isEmpty()) {
-//            return;
-//        }
-//        List<WarehouseAreasItem> areaItems = warehouseAreasItemService.list(new LambdaQueryWrapper<WarehouseAreasItem>().eq(WarehouseAreasItem::getAsnId, orderId));
-//        Map<Long, Double> itemAnfme = orderItems.stream().collect(Collectors.toMap(WkOrderItem::getId, i -> i.getAnfme() != null ? i.getAnfme() : 0.0, (a, b) -> b));
-//        for (WarehouseAreasItem area : areaItems) {
-//            if (area.getAsnItemId() == null || !itemAnfme.containsKey(area.getAsnItemId())) {
-//                continue;
-//            }
-//            Double anfme = itemAnfme.get(area.getAsnItemId());
-//            if (area.getAnfme() != null && area.getAnfme().equals(anfme)) {
-//                continue;
-//            }
-//            area.setAnfme(anfme);
-//            warehouseAreasItemService.updateById(area);
-//        }
-//    }
+    /** DirectWaitPakin 鍚敤鏃讹細璁㈠崟淇敼鍚庡悓姝ユ敹璐у尯锛屾寜 asnItemId 灏嗘敹璐у尯璁板綍鐨� anfme 鏇存柊涓鸿鍗曟槑缁嗙殑 anfme銆� */
+    private void syncReceiptAreaByOrder(Long orderId) {
+        List<WkOrderItem> orderItems = asnOrderItemService.list(new LambdaQueryWrapper<WkOrderItem>().eq(WkOrderItem::getOrderId, orderId));
+        if (orderItems.isEmpty()) {
+            return;
+        }
+        List<WarehouseAreasItem> areaItems = warehouseAreasItemService.list(new LambdaQueryWrapper<WarehouseAreasItem>().eq(WarehouseAreasItem::getAsnId, orderId));
+        Map<Long, Double> itemAnfme = orderItems.stream().collect(Collectors.toMap(WkOrderItem::getId, i -> i.getAnfme() != null ? i.getAnfme() : 0.0, (a, b) -> b));
+        for (WarehouseAreasItem area : areaItems) {
+            if (area.getAsnItemId() == null || !itemAnfme.containsKey(area.getAsnItemId())) {
+                continue;
+            }
+            Double anfme = itemAnfme.get(area.getAsnItemId());
+            if (area.getAnfme() != null && area.getAnfme().equals(anfme)) {
+                continue;
+            }
+            area.setAnfme(anfme);
+            warehouseAreasItemService.updateById(area);
+        }
+    }
+
+    private boolean isDirectWaitPakin() {
+        Config config = configService.getOne(new LambdaQueryWrapper<Config>().eq(Config::getFlag, GlobalConfigCode.DIRECT_WAIT_PAKIN));
+        return config != null && Boolean.parseBoolean(config.getVal());
+    }
 
     /**
      * @author Ryan
@@ -895,6 +971,7 @@
             if (Objects.isNull(wkOrder)) {
                 throw new CoolException("璇风‘璁ゅ崟鎹細" + order.getOrderNo() + "鏄惁宸茬粡鎵ц鎴栨槸鍚﹀悓姝ワ紒锛�");
             }
+            assertWkOrderNoLinkedTask(wkOrder.getId());
             order.getOrderItems().forEach(orderItem -> {
                 WkOrderItem wkOrderItem = asnOrderItemService.getOne(new LambdaUpdateWrapper<WkOrderItem>()
                         .eq(WkOrderItem::getMatnrCode, orderItem.getMatnr())
@@ -958,6 +1035,7 @@
                 throw new CoolException("鍗曟嵁涓嶅瓨鍦紝鏃犳硶鍙栨秷锛侊紒璇锋彁渚涘崟鎹唴鐮�(orderInternalCode)鎴栧崟鍙�(orderNo)銆�");
             }
             final WkOrder finalWkOrder = wkOrder;
+            assertWkOrderNoLinkedTask(finalWkOrder.getId());
             // 宸茬粍鎵樹笉鍙彇娑�
             long pakinCount = waitPakinItemService.count(new LambdaQueryWrapper<WaitPakinItem>()
                     .eq(WaitPakinItem::getAsnId, finalWkOrder.getId()));

--
Gitblit v1.9.1