From d8cbfdcac8292522dd3c39e5cafdf19a43d15a5d Mon Sep 17 00:00:00 2001
From: cl <1442464845@qq.com>
Date: 星期四, 30 四月 2026 11:21:08 +0800
Subject: [PATCH] 强制组托单号必填

---
 rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/MobileServiceImpl.java |  258 ++++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 210 insertions(+), 48 deletions(-)

diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/MobileServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/MobileServiceImpl.java
index 1b89038..602607c 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/MobileServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/MobileServiceImpl.java
@@ -30,6 +30,7 @@
 import com.vincent.rsf.server.system.entity.*;
 import com.vincent.rsf.server.system.mapper.FieldsMapper;
 import com.vincent.rsf.server.system.mapper.TenantMapper;
+import com.vincent.rsf.server.system.entity.Config;
 import com.vincent.rsf.server.system.service.ConfigService;
 import com.vincent.rsf.server.system.service.FieldsItemService;
 import com.vincent.rsf.server.system.service.UserLoginService;
@@ -135,6 +136,8 @@
     private OutStockService outStockService;
     @Autowired
     private BasContainerService basContainerService;
+    @Autowired
+    private CusBarcodeSyncViewQueryService cusBarcodeSyncViewQueryService;
 
     /**
      * @return
@@ -260,8 +263,10 @@
         }
         //TODO /**鏀惰揣鏁伴噺绱姞锛�1. 浼氬嚭瓒呮敹鎯呭喌 2. 浼氭湁鏀惰揣涓嶈冻鎯呭喌*/
         Double rcptedQty = QuantityUtils.add(wkOrder.getQty(), receiptQty);
-        // 鏂伴『搴忥細鏈墽琛�(缁勬墭)鈫掍换鍔℃墽琛屼腑鈫掑凡瀹屾垚锛屼笉鍐嶈缃墽琛屼腑/鏀惰揣瀹屾垚
-        wkOrder.setQty(rcptedQty); // .setExceStatus(AsnExceStatus.ASN_EXCE_STATUS_EXCE_ING.val)
+        wkOrder.setQty(rcptedQty);
+        if (AsnExceStatus.ASN_EXCE_STATUS_UN_EXCE.val.equals(wkOrder.getExceStatus())) {
+            wkOrder.setExceStatus(AsnExceStatus.ASN_EXCE_STATUS_EXCE_ING.val);
+        }
         if (!asnOrderMapper.updateById(wkOrder)) {
             throw new CoolException("宸叉敹璐ф暟閲忎慨鏀瑰け璐ワ紒锛�");
         }
@@ -352,18 +357,21 @@
             if (asnOrderItemMapper.updateById(orderItem) < 1) {
                 throw new CoolException("閫氱煡鍗曟槑缁嗘暟閲忎慨鏀瑰け璐ワ紒锛�");
             }
-            // 鏀惰揣鍖哄凡鍋滅敤锛屼笉鍐嶄繚瀛樿嚦鏀惰揣鍖�
-            // extracted(loginUserId, dto, areasItem, orderItem, wkOrder, matnr);
+            // DirectWaitPakin 鍚敤鏃朵繚瀛樿嚦鏀惰揣鍖猴紝褰㈡垚闂幆锛涙湭鍚敤鏃朵笉鍐欐敹璐у尯
+            Config directPakinConfig = configService.getOne(new LambdaQueryWrapper<Config>().eq(Config::getFlag, GlobalConfigCode.DIRECT_WAIT_PAKIN));
+            if (directPakinConfig != null && Boolean.parseBoolean(directPakinConfig.getVal())) {
+                extracted(loginUserId, dto, areasItem, orderItem, wkOrder, matnr);
+            }
         }
 
-        // 鏂伴『搴忥細鏈墽琛�(缁勬墭)鈫掍换鍔℃墽琛屼腑鈫掑凡瀹屾垚锛屼笉鍐嶈缃敹璐у畬鎴�
-        // WkOrder order = asnOrderMapper.getOne(new LambdaQueryWrapper<WkOrder>().eq(WkOrder::getCode, asnCode));
-        // if (order.getQty().compareTo(order.getAnfme()) >= 0.00) {
-        //     order.setExceStatus(AsnExceStatus.ASN_EXCE_STATUS_RECEIPT_DONE.val).setRleStatus(Short.valueOf("1"));
-        //     if (!asnOrderMapper.updateById(order)) {
-        //         throw new CoolException("璁㈠崟鐘舵�佷慨鏀瑰け璐ワ紒锛�");
-        //     }
-        // }
+        // 宸叉敹鏁伴噺 >= 璁″垝鏁伴噺鏃剁疆涓烘敹璐у畬鎴�(2)
+        WkOrder order = asnOrderMapper.getOne(new LambdaQueryWrapper<WkOrder>().eq(WkOrder::getCode, asnCode));
+        if (order != null && order.getAnfme() != null && QuantityUtils.compare(order.getQty(), order.getAnfme()) >= 0) {
+            order.setExceStatus(AsnExceStatus.ASN_EXCE_STATUS_RECEIPT_DONE.val).setRleStatus(Short.valueOf("1"));
+            if (!asnOrderMapper.updateById(order)) {
+                throw new CoolException("璁㈠崟鐘舵�佷慨鏀瑰け璐ワ紒锛�");
+            }
+        }
 
         return R.ok("鏀惰揣鎴愬姛锛侊紒");
     }
@@ -379,6 +387,7 @@
         item.setTrackCode(dto.getBarcode())
                 .setAreaName(areasItem.getName())
                 .setAreaId(areasItem.getId())
+                .setPlatItemId(orderItem.getPlatItemId())
                 .setAsnItemId(orderItem.getId())
                 .setAsnCode(wkOrder.getCode())
                 .setAsnId(wkOrder.getId())
@@ -406,16 +415,8 @@
         //TODO 渚涘簲鍟嗘爣璇嗘湭璁剧疆锛屾爣璇嗙敱PO鍗曚緵搴斿晢缂栫爜杞崲
 
         LambdaQueryWrapper<WarehouseAreasItem> queryWrapper = new LambdaQueryWrapper<WarehouseAreasItem>()
-//                .eq(WarehouseAreasItem::getAsnItemId, item.getAsnItemId())
-                .eq(WarehouseAreasItem::getMatnrCode, item.getMatnrCode())
-                .eq(!Cools.isEmpty(item.getFieldsIndex()), WarehouseAreasItem::getFieldsIndex, item.getFieldsIndex())
-                .eq(WarehouseAreasItem::getAsnCode, item.getAsnCode())
-                .eq(StringUtils.isNotBlank(item.getSplrBatch()), WarehouseAreasItem::getSplrBatch, item.getSplrBatch());
-        if (Objects.isNull(orderItem.getIsptResult())) {
-            queryWrapper.isNull(WarehouseAreasItem::getIsptResult);
-        } else {
-            queryWrapper.eq(WarehouseAreasItem::getIsptResult, orderItem.getIsptResult());
-        }
+                .eq(WarehouseAreasItem::getAsnItemId, item.getAsnItemId())
+                .eq(WarehouseAreasItem::getAsnId, wkOrder.getId());
 
         WarehouseAreasItem serviceOne = warehouseAreasItemService.getOne(queryWrapper);
 
@@ -512,13 +513,16 @@
      * @description 鑾峰彇鏀惰揣鍖�
      * @time 2025/3/11 10:12
      */
-    /** 鏀惰揣鍖哄凡鍋滅敤锛岃繑鍥炵┖鍒楄〃 */
+    /** DirectWaitPakin 鍚敤鏃惰繑鍥炴敹璐у尯鍒楄〃锛屾湭鍚敤鏃惰繑鍥炵┖鍒楄〃锛堜笉褰卞搷缁勬墭涓庝簯浠撳叆搴撴祦绋嬶級 */
     @Override
     public R getReceiptAreas() {
-        // List<WarehouseAreas> areas = warehouseAreasService.list(new LambdaQueryWrapper<WarehouseAreas>()
-        //         .eq(WarehouseAreas::getType, WarehouseAreaType.WAREHOUSE_AREA_RECEIPT.type));
-        // return R.ok(areas);
-        return R.ok(Collections.emptyList());
+        Config directPakinConfig = configService.getOne(new LambdaQueryWrapper<Config>().eq(Config::getFlag, GlobalConfigCode.DIRECT_WAIT_PAKIN));
+        if (directPakinConfig == null || !Boolean.parseBoolean(directPakinConfig.getVal())) {
+            return R.ok(Collections.emptyList());
+        }
+        List<WarehouseAreas> areas = warehouseAreasService.list(new LambdaQueryWrapper<WarehouseAreas>()
+                .eq(WarehouseAreas::getType, WarehouseAreaType.WAREHOUSE_AREA_RECEIPT.type));
+        return R.ok(areas);
     }
 
     /**
@@ -535,6 +539,27 @@
                 .eq(Fields::getStatus, 1).orderByAsc(Fields::getId));
     }
 
+    @Override
+    public R getPdaPalletConfig() {
+        Map<String, Object> data = new HashMap<>(2);
+        data.put("pdaPakinAsnRequired", isPdaPakinAsnRequired());
+        return R.ok(data);
+    }
+
+    /** PDA 缁勭洏鏄惁寮哄埗浼� WMS 鍗曞彿锛堟棤閰嶇疆鎴栫己鐪佹椂鎸� true锛� */
+    private boolean isPdaPakinAsnRequired() {
+        Config c = configService.getOne(new LambdaQueryWrapper<Config>()
+                .eq(Config::getFlag, GlobalConfigCode.PDA_PAKIN_ASN_REQUIRED)
+                .eq(Config::getDeleted, 0)
+                .last("LIMIT 1"));
+        boolean required = true;
+        if (c != null && StringUtils.isNotBlank(c.getVal())) {
+            String v = c.getVal().trim();
+            required = Boolean.parseBoolean(v) || "1".equals(v);
+        }
+        return required;
+    }
+
     /**
      * @param
      * @return
@@ -547,6 +572,15 @@
         String code = params.get("code");
         String matnrCode = params.get("matnrCode");
         String asnCode = params.get("asnCode");
+        if (asnCode != null) {
+            asnCode = asnCode.trim();
+            if (asnCode.isEmpty()) {
+                asnCode = null;
+            }
+        }
+        if (isPdaPakinAsnRequired() && Cools.isEmpty(asnCode)) {
+            return R.error("璇峰厛鎵弿WMS鍗曞彿");
+        }
         String crushNo = params.get("fieldsIndex");
         String batch = params.get("batch");
 //        String barcode = params.get("barcode");
@@ -588,13 +622,14 @@
         // 濡傛灉鎵弿鐗╂枡缂栫爜涓擜SN鍗曞彿涓虹┖锛岀洿鎺ヤ粠鐗╂枡淇℃伅琛ㄨ幏鍙栵紝涓嶆煡璇㈡敹璐у尯
         if (!Cools.isEmpty(matnrCode) && Cools.isEmpty(asnCode) && Cools.isEmpty(code) 
                 && Cools.isEmpty(batch) && Objects.isNull(fieldIndex)) {
-            logger.info("=== 浠庣墿鏂欎俊鎭〃鏌ヨ鐗╂枡淇℃伅锛堜笉鏌ヨ鏀惰揣鍖猴級 ===");
+//            logger.info("=== 浠庣墿鏂欎俊鎭〃鏌ヨ鐗╂枡淇℃伅锛堜笉鏌ヨ鏀惰揣鍖猴級 ===");
             logger.info("鏌ヨ鍙傛暟 - matnrCode: {}", matnrCode);
             
-            Matnr matnr = matnrMapper.selectOne(new LambdaQueryWrapper<Matnr>()
-                    .eq(Matnr::getCode, matnrCode)
-                    .eq(Matnr::getDeleted, 0)
-                    .last("LIMIT 1"));
+            // Matnr matnr = matnrMapper.selectOne(new LambdaQueryWrapper<Matnr>()
+            //         .eq(Matnr::getCode, matnrCode)
+            //         .eq(Matnr::getDeleted, 0)
+            //         .last("LIMIT 1"));
+            Matnr matnr = getMatnrByCodePreferView(matnrCode);
             
             if (matnr == null) {
                 logger.warn("鐗╂枡淇℃伅琛ㄤ腑鏈壘鍒扮墿鏂欑紪鐮�: {}", matnrCode);
@@ -623,15 +658,56 @@
             return R.ok(resultList);
         }
         
-        // 鏀惰揣鍖哄凡鍋滅敤锛氭湁ASN鍗曞彿鏃朵粠璁㈠崟鏄庣粏鏌ュ彲缁勬墭鐗╂枡锛涘彲缁勭洏鏁伴噺 = 璁″垝鏁伴噺 - 宸茬粍鎵樻暟閲� - 宸蹭笂鏋舵暟閲�
+        // 鏈� WMS 鍗曞彿鏃讹細蹇呴』鑳界簿纭懡涓崟鎹紝鍚﹀垯鐩存帴杩斿洖绌猴紙閬垮厤钀藉叆鏃犲崟鍙峰垎鏀悗 queryWrapper 鏃犳潯浠舵煡鍏ㄨ〃鏀惰揣鍖猴級
+        WkOrder asnOrder = null;
         if (!Cools.isEmpty(asnCode)) {
-            WkOrder order = asnOrderMapper.getOne(new LambdaQueryWrapper<WkOrder>().eq(WkOrder::getCode, asnCode));
-            if (order == null) {
-                logger.info("鏈壘鍒癆SN鍗曞彿: {}", asnCode);
-                return R.ok(Collections.emptyList());
+            asnOrder = asnOrderMapper.getOne(new LambdaQueryWrapper<WkOrder>().eq(WkOrder::getCode, asnCode));
+            if (asnOrder == null) {
+                logger.info("鏈壘鍒癢MS鍗曞彿: {}锛岃繑鍥炵┖鍒楄〃", asnCode);
+                return R.ok(new ArrayList<>());
             }
-            // 鎸夋槑缁嗘眹鎬诲凡缁勬墭鏁伴噺锛堢粍鎵樻暟閲忎笉浼氬洜鏀瑰崟鑰屽彉锛�
-            List<WaitPakinItem> pakinItems = waitPakinItemService.list(new LambdaQueryWrapper<WaitPakinItem>().eq(WaitPakinItem::getAsnId, order.getId()));
+            asnCode = asnOrder.getCode();
+        }
+
+        // 鏈堿SN鍗曞彿涓斿崟鎹瓨鍦ㄦ椂锛欴irectWaitPakin 鍚敤鍒欎粠鏀惰揣鍖烘煡鍙粍鎵樼墿鏂欙紝鏈惎鐢ㄥ垯浠庤鍗曟槑缁嗘煡
+        if (!Cools.isEmpty(asnCode) && asnOrder != null) {
+            Config directPakinConfig = configService.getOne(new LambdaQueryWrapper<Config>().eq(Config::getFlag, GlobalConfigCode.DIRECT_WAIT_PAKIN));
+            if (directPakinConfig != null && Boolean.parseBoolean(directPakinConfig.getVal())) {
+                LambdaQueryWrapper<WarehouseAreasItem> receiptWrapper = new LambdaQueryWrapper<WarehouseAreasItem>().eq(WarehouseAreasItem::getAsnCode, asnCode);
+                if (!Cools.isEmpty(matnrCode)) receiptWrapper.eq(WarehouseAreasItem::getMatnrCode, matnrCode);
+                if (!Cools.isEmpty(batch)) receiptWrapper.eq(WarehouseAreasItem::getSplrBatch, batch);
+                if (!Objects.isNull(fieldIndex)) receiptWrapper.eq(WarehouseAreasItem::getFieldsIndex, fieldIndex);
+                if (!Cools.isEmpty(code)) receiptWrapper.eq(WarehouseAreasItem::getTrackCode, code);
+                receiptWrapper.orderByAsc(WarehouseAreasItem::getPlatItemId).orderByAsc(WarehouseAreasItem::getAsnItemId);
+                List<WarehouseAreasItem> receiptList = warehouseAreasItemService.list(receiptWrapper);
+                // 缁勬墭閫氱煡妗o紙WaitPakinItem锛夌殑宸茬粍鎵樻暟閲忎篃瑕佹墸鍑忥細鏀惰揣鍖� workQty 浠呭弽鏄犱粠鏀惰揣鍖虹粍鎵樼殑閮ㄥ垎锛屼粠璁㈠崟鐩存帴缁勬墭鐨勫湪姝ゆ眹鎬�
+                Map<Long, Double> waitPakinSumByItemId = new java.util.HashMap<>();
+                if (!receiptList.isEmpty() && receiptList.stream().anyMatch(e -> e.getAsnId() != null && e.getAsnItemId() != null)) {
+                    List<Long> asnItemIds = receiptList.stream().map(WarehouseAreasItem::getAsnItemId).filter(Objects::nonNull).distinct().collect(Collectors.toList());
+                    Long asnId = receiptList.get(0).getAsnId();
+                    if (asnId != null && !asnItemIds.isEmpty()) {
+                        List<WaitPakinItem> wpItems = waitPakinItemService.list(
+                                new LambdaQueryWrapper<WaitPakinItem>().eq(WaitPakinItem::getAsnId, asnId).in(WaitPakinItem::getAsnItemId, asnItemIds).eq(WaitPakinItem::getDeleted, 0));
+                        wpItems.forEach(w -> waitPakinSumByItemId.merge(w.getAsnItemId(), w.getAnfme() != null ? w.getAnfme() : 0.0, (a, b) -> (a != null ? a : 0.0) + (b != null ? b : 0.0)));
+                        waitPakinSumByItemId.replaceAll((k, v) -> QuantityUtils.roundToScale(v));
+                    }
+                }
+                // 鍙粍鎵� = 璁″垝(anfme) - 宸茬粍鎵�(waitPakinSumByItemId)锛屼笉鍙犲姞 areaWorkQty 閬垮厤涓庣粍鎵樻。姹囨�婚噸澶嶈绠�
+                receiptList.removeIf(e -> {
+                    Double anfme = e.getAnfme() != null ? e.getAnfme() : 0.0;
+                    Double qty = e.getQty() != null ? e.getQty() : 0.0;
+                    Double alreadyInWaitPakin = e.getAsnItemId() != null ? waitPakinSumByItemId.getOrDefault(e.getAsnItemId(), 0.0) : 0.0;
+                    Double totalAlready = QuantityUtils.roundToScale(alreadyInWaitPakin);
+                    Double available = QuantityUtils.roundToScale(QuantityUtils.subtract(QuantityUtils.subtract(anfme, totalAlready), qty));
+                    e.setWorkQty(totalAlready);
+                    e.setAvailablePalletQty(available);
+                    return QuantityUtils.compare(available, 0.0) <= 0;
+                });
+                logger.info("=== 浠庢敹璐у尯鏌ヨ鍙粍鎵樼墿鏂欙紙DirectWaitPakin锛塧snCode: {} 杩斿洖 {} 鏉�", asnCode, receiptList.size());
+                return R.ok(receiptList);
+            }
+            WkOrder order = asnOrder;
+            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));
@@ -640,13 +716,16 @@
             if (!Cools.isEmpty(batch)) itemWrapper.eq(WkOrderItem::getSplrBatch, batch);
             if (!Objects.isNull(fieldIndex)) itemWrapper.eq(WkOrderItem::getFieldsIndex, fieldIndex);
             if (!Cools.isEmpty(code)) itemWrapper.eq(WkOrderItem::getTrackCode, code);
+            itemWrapper.orderByAsc(WkOrderItem::getPlatItemId).orderByAsc(WkOrderItem::getId);
             List<WkOrderItem> orderItems = asnOrderItemMapper.selectList(itemWrapper);
             List<WarehouseAreasItem> list = new ArrayList<>();
             for (WkOrderItem oi : orderItems) {
                 Double anfme = QuantityUtils.roundToScale(oi.getAnfme() != null ? oi.getAnfme() : 0.0);
                 Double qty = QuantityUtils.roundToScale(oi.getQty() != null ? oi.getQty() : 0.0);
-                Double workQty = palletizedByItemId.getOrDefault(oi.getId(), 0.0); // 宸茬粍鎵樻暟閲�
-                if (QuantityUtils.compare(QuantityUtils.subtract(QuantityUtils.subtract(anfme, workQty), qty), 0.0) <= 0) continue; // 鍙粍鐩樻暟閲�<=0 涓嶈繑鍥�
+                Double workQty = palletizedByItemId.getOrDefault(oi.getId(), 0.0);
+                // 鍙粍鐩樻暟閲� = 璁″垝 - 宸茬粍鎵橈紙涓嶆墸鍑忔槑缁嗗畬鎴愭暟閲� qty锛岄伩鍏嶄簯浠撳悓姝ュ畬鎴愭暟閲�=璁″垝鍚庡鑷村彲缁勬墭琚畻鎴� 0锛�
+                Double availablePalletQty = QuantityUtils.roundToScale(QuantityUtils.subtract(anfme, workQty));
+                if (QuantityUtils.compare(availablePalletQty, 0.0) <= 0) continue;
                 WarehouseAreasItem v = new WarehouseAreasItem();
                 v.setId(oi.getId());
                 v.setAsnItemId(oi.getId());
@@ -655,6 +734,7 @@
                 v.setAnfme(anfme);
                 v.setQty(qty);
                 v.setWorkQty(QuantityUtils.roundToScale(workQty));
+                v.setAvailablePalletQty(availablePalletQty);
                 v.setMatnrCode(oi.getMatnrCode());
                 v.setMaktx(oi.getMaktx());
                 v.setSplrBatch(oi.getSplrBatch());
@@ -669,7 +749,7 @@
                 }
                 list.add(v);
             }
-            logger.info("=== 浠庤鍗曟槑缁嗘煡璇㈠彲缁勬墭鐗╂枡锛堟敹璐у尯宸插仠鐢級asnCode: {} 杩斿洖 {} 鏉�", asnCode, list.size());
+            logger.info("=== 浠庤鍗曟槑缁嗘煡璇㈠彲缁勬墭鐗╂枡 asnCode: {} 杩斿洖 {} 鏉�", asnCode, list.size());
             return R.ok(list);
         }
         
@@ -780,10 +860,11 @@
             if (!matnrCodes.isEmpty()) {
                 Map<String, Matnr> matnrMap = new HashMap<>();
                 for (String matCode : matnrCodes) {
-                    Matnr matnr = matnrMapper.selectOne(new LambdaQueryWrapper<Matnr>()
-                            .eq(Matnr::getCode, matCode)
-                            .eq(Matnr::getDeleted, 0)
-                            .last("LIMIT 1"));
+                    // Matnr matnr = matnrMapper.selectOne(new LambdaQueryWrapper<Matnr>()
+                    //         .eq(Matnr::getCode, matCode)
+                    //         .eq(Matnr::getDeleted, 0)
+                    //         .last("LIMIT 1"));
+                    Matnr matnr = getMatnrByCodePreferView(matCode);
                     if (matnr != null) {
                         matnrMap.put(matCode, matnr);
                     }
@@ -820,6 +901,87 @@
 
         logger.info("杩斿洖 {} 鏉″彲缁勬墭鐗╂枡鏁版嵁", list.size());
         return R.ok(list);
+    }
+
+    private Matnr findLocalMatnrByCode(String matnrCode) {
+        String t = StringUtils.trimToNull(matnrCode);
+        if (t == null) {
+            return null;
+        }
+        return matnrMapper.selectOne(new LambdaQueryWrapper<Matnr>()
+                .eq(Matnr::getCode, t)
+                .eq(Matnr::getDeleted, 0)
+                .last("LIMIT 1"));
+    }
+
+    /** 缁勬墭锛氬厛鏌ヨ鍥� barcode锛堢墿鏂欏彿锛夛紝鍐� man_matnr.code 绛夊�� */
+    private Matnr getMatnrByCodePreferView(String matnrCode) {
+        String code = StringUtils.trimToNull(matnrCode);
+        if (code == null) {
+            return null;
+        }
+        List<Map<String, Object>> viewItems = null;
+        try {
+            viewItems = cusBarcodeSyncViewQueryService.listByItemNos(Collections.singletonList(code));
+        } catch (Exception ignore) {
+        }
+        Map<String, Object> row = null;
+        if (viewItems != null) {
+            row = viewItems.stream()
+                    .filter(v -> CusBarcodeSyncViewQueryService.rowMatchesOrderMatnr(code, Objects.toString(v.get("barcode"), null)))
+                    .findFirst()
+                    .orElse(null);
+        }
+        if (row == null) {
+            return findLocalMatnrByCode(code);
+        }
+        String fullCode = CusBarcodeSyncViewQueryService.matnrCodeFromBarcode(Objects.toString(row.get("barcode"), null));
+        Matnr local = findLocalMatnrByCode(fullCode);
+        String viewSpec = StringUtils.trimToEmpty(Objects.toString(row.get("item_spec"), ""));
+        String viewUnit = StringUtils.trimToNull(Objects.toString(row.get("unit_no"), null));
+        String viewName = StringUtils.trimToNull(Objects.toString(row.get("item_name"), null));
+        if (local == null) {
+            Matnr matnr = new Matnr();
+            matnr.setCode(fullCode)
+                    .setBatch("")
+                    .setName(viewName != null ? viewName : fullCode)
+                    .setSpec(viewSpec)
+                    .setUnit(viewUnit)
+                    .setStockUnit(viewUnit)
+                    .setStatus(1)
+                    .setDeleted(0)
+                    .setCreateBy(1L)
+                    .setUpdateBy(1L)
+                    .setCreateTime(new Date())
+                    .setUpdateTime(new Date());
+            if (matnrMapper.insert(matnr) <= 0) {
+                throw new CoolException("鐗╂枡淇℃伅淇濆瓨澶辫触");
+            }
+            return matnr;
+        }
+        boolean specDiff = !StringUtils.equals(StringUtils.trimToEmpty(local.getSpec()), viewSpec);
+        boolean unitDiff = viewUnit != null
+                && (!StringUtils.equals(StringUtils.trimToEmpty(local.getUnit()), viewUnit)
+                || !StringUtils.equals(StringUtils.trimToEmpty(local.getStockUnit()), viewUnit));
+        if (specDiff || unitDiff) {
+            Matnr update = new Matnr();
+            update.setId(local.getId());
+            if (specDiff) {
+                update.setSpec(viewSpec);
+                local.setSpec(viewSpec);
+            }
+            if (unitDiff) {
+                update.setUnit(viewUnit);
+                update.setStockUnit(viewUnit);
+                local.setUnit(viewUnit);
+                local.setStockUnit(viewUnit);
+            }
+            update.setUpdateBy(1L).setUpdateTime(new Date());
+            if (matnrMapper.updateById(update) <= 0) {
+                throw new CoolException("鐗╂枡淇℃伅鏇存柊澶辫触");
+            }
+        }
+        return local;
     }
 
     /**
@@ -1051,7 +1213,7 @@
                 .setType(order.getType())
                 .setUpdateBy(loginUserId)
                 .setCreateBy(loginUserId)
-                .setWkType(Short.parseShort(order.getWkType()));
+                .setWkType(order.getWkType());
         if (!stockService.save(stock)) {
             throw new CoolException("搴撳瓨淇濆瓨澶辫触锛侊紒");
         }
@@ -1072,7 +1234,7 @@
                     .setUpdateBy(loginUserId)
                     .setUpdateBy(loginUserId)
                     .setOrderItemId(asnOrderItem.getId())
-                    .setWkType(Short.parseShort(order.getWkType()))
+                    .setWkType(order.getWkType())
                     .setType(order.getType());
             locItems.add(item);
         });

--
Gitblit v1.9.1