From 82065a03737fa1370eb9f4f01ab5332933baf08a Mon Sep 17 00:00:00 2001
From: chen.lin <1442464845@qq.com>
Date: 星期四, 05 三月 2026 09:23:37 +0800
Subject: [PATCH] 云仓WMS+RCS+自动入库临时方法配置

---
 rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/WcsServiceImpl.java |  116 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 116 insertions(+), 0 deletions(-)

diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/WcsServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/WcsServiceImpl.java
index 58ea573..13c551f 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/WcsServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/WcsServiceImpl.java
@@ -28,7 +28,12 @@
 import com.vincent.rsf.server.api.utils.SlaveProperties;
 import com.vincent.rsf.server.manager.entity.*;
 import com.vincent.rsf.server.manager.service.*;
+import com.vincent.rsf.server.manager.controller.params.PakinItem;
+import com.vincent.rsf.server.manager.controller.params.WaitPakinParam;
 import com.vincent.rsf.server.manager.service.impl.LocServiceImpl;
+import com.vincent.rsf.server.system.constant.GlobalConfigCode;
+import com.vincent.rsf.server.system.entity.Config;
+import com.vincent.rsf.server.system.service.ConfigService;
 import com.vincent.rsf.server.system.utils.SystemAuthUtils;
 import com.vincent.rsf.server.system.constant.SerialRuleCode;
 import com.vincent.rsf.server.manager.enums.LocStsType;
@@ -45,6 +50,7 @@
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.client.RestTemplate;
 
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.Date;
@@ -87,6 +93,16 @@
     private RestTemplate restTemplate;
     @Autowired
     private RemotesInfoProperties.RcsApi rcsApi;
+    @Autowired
+    private ConfigService configService;
+    @Autowired
+    private MatnrService matnrService;
+    @Autowired
+    private AsnOrderService asnOrderService;
+    @Autowired
+    private AsnOrderItemService asnOrderItemService;
+    @Autowired
+    private com.vincent.rsf.server.api.service.MobileService mobileService;
 
 
     @Override
@@ -306,6 +322,16 @@
 
         // 2. 鑻ユ湭鍛戒腑鎷f枡/鐩樼偣鍏ュ簱锛屽啀鏍¢獙缁勬墭骞剁户缁叾浠栧叆搴撻�昏緫
         if (pickInTask == null && checkInTask == null) {
+            waitPakin = waitPakinService.getOne(new LambdaQueryWrapper<WaitPakin>()
+                    .eq(WaitPakin::getBarcode, param.getBarcode())
+                    .in(WaitPakin::getIoStatus, PakinIOStatus.PAKIN_IO_STATUS_DONE.val, PakinIOStatus.PAKIN_IO_STATUS_TASK_EXCE.val));
+            // 绌烘墭鐩樻棤缁勬墭鏃讹細鑻ラ厤缃惎鐢ㄥ垯鎸� AUTO_FULL_OUT_MATNR_CODE 鑷姩缁勬墭骞剁敓鎴愬叆搴撳崟锛屽啀缁х画鍏ュ簱浠诲姟閫昏緫
+            if (waitPakin == null) {
+                tryAutoPakinForBarcode(param.getBarcode());
+                waitPakin = waitPakinService.getOne(new LambdaQueryWrapper<WaitPakin>()
+                        .eq(WaitPakin::getBarcode, param.getBarcode())
+                        .in(WaitPakin::getIoStatus, PakinIOStatus.PAKIN_IO_STATUS_DONE.val, PakinIOStatus.PAKIN_IO_STATUS_TASK_EXCE.val));
+            }
             waitPakin = validateWaitPakin(param.getBarcode());
             waitPakinItems = waitPakinItemService.list(
                     new LambdaQueryWrapper<WaitPakinItem>().eq(WaitPakinItem::getPakinId, waitPakin.getId()));
@@ -375,6 +401,9 @@
             throw new RuntimeException(e);
         }
 
+        if (waitPakin == null) {
+            throw new CoolException("璇锋鏌ョ粍鎷栫姸鎬佹槸鍚﹀畬鎴愶紒锛�");
+        }
         // 鍒涘缓骞朵繚瀛樹换鍔�
         Task task = createTask(ruleCode, locNo.getLocNo(), waitPakin.getBarcode(),
                 deviceSite.getDeviceSite(), param.getSourceStaNo().toString(), param.getUser());
@@ -399,6 +428,93 @@
 
 
     /**
+     * RCS 鍏ュ簱鐢宠鏃惰嫢 barcode 鏃犵粍鎵樹笖閰嶇疆鍚敤锛氭寜 AUTO_FULL_OUT_MATNR_CODE 鏃犺鍗曠粍鎵樺苟鐢熸垚鍏ュ簱鍗曪紝渚夸簬鍚庣画鐢熸垚鍏ュ簱浠诲姟銆�
+     */
+    private void tryAutoPakinForBarcode(String barcode) {
+        Config enabledConfig = configService.getOne(new LambdaQueryWrapper<Config>().eq(Config::getFlag, GlobalConfigCode.AUTO_PAKIN_ON_ASN_ENABLED));
+        if (enabledConfig == null || !Boolean.parseBoolean(enabledConfig.getVal())) {
+            return;
+        }
+        Config matnrConfig = configService.getOne(new LambdaQueryWrapper<Config>().eq(Config::getFlag, GlobalConfigCode.AUTO_FULL_OUT_MATNR_CODE));
+        if (matnrConfig == null || StringUtils.isBlank(matnrConfig.getVal())) {
+            return;
+        }
+        Config qtyConfig = configService.getOne(new LambdaQueryWrapper<Config>().eq(Config::getFlag, GlobalConfigCode.AUTO_PAKIN_QTY));
+        double autoQty = 1.0;
+        if (qtyConfig != null && StringUtils.isNotBlank(qtyConfig.getVal())) {
+            try {
+                autoQty = Double.parseDouble(qtyConfig.getVal().trim());
+                if (autoQty <= 0) autoQty = 1.0;
+            } catch (NumberFormatException e) {
+                // ignore
+            }
+        }
+        String matnrCode = matnrConfig.getVal().trim();
+        Matnr matnr = matnrService.getOne(new LambdaQueryWrapper<Matnr>().eq(Matnr::getCode, matnrCode));
+        if (matnr == null) {
+            log.warn("[RCS鍏ュ簱鐢宠-鑷姩缁勬墭] 鐗╂枡涓嶅瓨鍦�: {}", matnrCode);
+            return;
+        }
+        List<PakinItem> pakinItems = new ArrayList<>();
+        PakinItem pi = new PakinItem();
+        pi.setMatnrId(matnr.getId());
+        pi.setReceiptQty(autoQty);
+        pi.setAsnCode(null);
+        pi.setId(null);
+        pakinItems.add(pi);
+        WaitPakinParam param = new WaitPakinParam();
+        param.setBarcode(barcode);
+        param.setItems(pakinItems);
+        WaitPakin waitPakin;
+        try {
+            waitPakin = mobileService.mergeItems(param, 1L);
+        } catch (Exception e) {
+            log.warn("[RCS鍏ュ簱鐢宠-鑷姩缁勬墭] 缁勬墭澶辫触, barcode={}: {}", barcode, e.getMessage());
+            return;
+        }
+        String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_ASN_ORDER, null);
+        if (StringUtils.isBlank(ruleCode)) {
+            log.warn("[RCS鍏ュ簱鐢宠-鑷姩缁勬墭] 鍏ュ簱鍗曠紪鐮佽鍒欐湭閰嶇疆");
+            return;
+        }
+        WkOrder order = new WkOrder();
+        order.setCode(ruleCode)
+                .setType(OrderType.ORDER_IN.type)
+                .setExceStatus(AsnExceStatus.ASN_EXCE_STATUS_UN_EXCE.val)
+                .setAnfme(autoQty)
+                .setWorkQty(0.0)
+                .setQty(0.0)
+                .setCreateBy(1L)
+                .setUpdateBy(1L);
+        if (!asnOrderService.save(order)) {
+            throw new CoolException("鍏ュ簱涓诲崟淇濆瓨澶辫触");
+        }
+        WkOrderItem orderItem = new WkOrderItem();
+        orderItem.setOrderId(order.getId())
+                .setOrderCode(order.getCode())
+                .setMatnrId(matnr.getId())
+                .setMatnrCode(matnr.getCode())
+                .setMaktx(matnr.getName())
+                .setAnfme(autoQty)
+                .setWorkQty(0.0)
+                .setQty(0.0)
+                .setStockUnit(matnr.getStockUnit() != null ? matnr.getStockUnit() : "涓�")
+                .setPurUnit(matnr.getPurUnit() != null ? matnr.getPurUnit() : "涓�")
+                .setFieldsIndex(matnr.getFieldsIndex())
+                .setCreateBy(1L)
+                .setUpdateBy(1L);
+        if (!asnOrderItemService.save(orderItem)) {
+            throw new CoolException("鍏ュ簱鏄庣粏淇濆瓨澶辫触");
+        }
+        waitPakinItemService.update(new LambdaUpdateWrapper<WaitPakinItem>()
+                .eq(WaitPakinItem::getPakinId, waitPakin.getId())
+                .set(WaitPakinItem::getAsnId, order.getId())
+                .set(WaitPakinItem::getAsnCode, order.getCode())
+                .set(WaitPakinItem::getAsnItemId, orderItem.getId()));
+        log.info("[RCS鍏ュ簱鐢宠-鑷姩缁勬墭] 宸茬粍鎵樺苟鐢熸垚鍏ュ簱鍗�: {}, barcode: {}, 鐗╂枡: {}, 鏁伴噺: {}", order.getCode(), barcode, matnrCode, autoQty);
+    }
+
+    /**
      * 楠岃瘉璁惧绔欑偣
      */
     private DeviceSite validateDeviceSite(TaskInParam param) {

--
Gitblit v1.9.1