From b47369fbc73269f0661ba169c6387e04fb037e87 Mon Sep 17 00:00:00 2001
From: cl <1442464845@qq.com>
Date: 星期一, 16 三月 2026 14:26:23 +0800
Subject: [PATCH] 发货通知单打印日志

---
 src/main/java/com/zy/asrs/controller/SaleOrderController.java   |   73 ++++++++++++++++++++++++------------
 src/main/java/com/zy/asrs/service/impl/OutStockServiceImpl.java |    8 +++-
 src/main/java/com/zy/common/service/erp/ErpService.java         |   10 +++--
 src/main/java/com/zy/common/service/erp/task/ErpScheduler.java  |   16 ++++++-
 src/main/java/com/zy/asrs/controller/OutStockController.java    |    6 ++
 5 files changed, 78 insertions(+), 35 deletions(-)

diff --git a/src/main/java/com/zy/asrs/controller/OutStockController.java b/src/main/java/com/zy/asrs/controller/OutStockController.java
index b9b6c03..c22a53f 100644
--- a/src/main/java/com/zy/asrs/controller/OutStockController.java
+++ b/src/main/java/com/zy/asrs/controller/OutStockController.java
@@ -19,6 +19,7 @@
 import com.zy.asrs.service.WorkService;
 import com.zy.asrs.utils.VersionUtils;
 import com.zy.common.service.erp.ErpService;
+import com.baomidou.mybatisplus.plugins.Page;
 import com.zy.common.service.erp.entity.OutStockBill;
 import com.zy.common.service.erp.entity.OutStockBillEntry;
 import com.zy.common.web.BaseController;
@@ -66,7 +67,10 @@
     public R outStockQueryList(@RequestParam(defaultValue = "1")Integer curr,
                           @RequestParam(defaultValue = "10")Integer limit,
                           @RequestParam Map<String, Object> param){
-        return R.ok(outStockService.queryOutStock(toPage(curr, limit, param, OutStockBillEntry.class)));
+        Page<OutStockBillEntry> page = outStockService.queryOutStock(toPage(curr, limit, param, OutStockBillEntry.class));
+        log.info("outStock/query/list 鏌ヨ鏉′欢 FBillNo={}, FSourceBillNo={}, curr={}, limit={}, 缁撴灉 total={}, 鏈〉鏉℃暟={}锛堟暟鎹潵婧愶細WMS搴搙tyasrs锛屾潯浠讹細Fflag_finish!=1 涓� FQty>FAmount锛�",
+                param.get("FBillNo"), param.get("FSourceBillNo"), curr, limit, page.getTotal(), page.getRecords() != null ? page.getRecords().size() : 0);
+        return R.ok(page);
     }
 
     /**
diff --git a/src/main/java/com/zy/asrs/controller/SaleOrderController.java b/src/main/java/com/zy/asrs/controller/SaleOrderController.java
index b979bd3..a0e80fc 100644
--- a/src/main/java/com/zy/asrs/controller/SaleOrderController.java
+++ b/src/main/java/com/zy/asrs/controller/SaleOrderController.java
@@ -21,6 +21,7 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.dao.DeadlockLoserDataAccessException;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
@@ -361,38 +362,60 @@
         return Math.abs(d1 - d2) < 0.0001;
     }
 
+    /** 姝婚攣閲嶈瘯娆℃暟 */
+    private static final int CUST_WAIT_PAKIN_DEADLOCK_RETRIES = 2;
+    /** 姝婚攣閲嶈瘯闂撮殧锛堟绉掞級 */
+    private static final int CUST_WAIT_PAKIN_RETRY_DELAY_MS = 80;
+
     /**
      * 閿�鍞鍗曟暟閲忔洿鏂板悗锛岄『甯︽洿鏂� cust_wait_pakin 鐨� anfme/nqty锛坢obile/bill/query 鐨� count 鍙栬嚜 anfme锛夈��
      * 浠呮寜 matnr+mnemonic 鏇存柊锛屼笉鎻掑叆锛涙棤鍖归厤鎴栧紓甯镐笉褰卞搷涓绘祦绋嬨��
+     * 鍙戠敓姝婚攣鏃惰嚜鍔ㄩ噸璇曪紝鍑忓皯骞跺彂鏇存柊瀵艰嚧鐨勬閿佺壓鐗层��
      */
     private void updateWaitPakinQuantity(Map<String, Object> data) {
-        try {
-            String invCode = data.get("invCode") != null ? String.valueOf(data.get("invCode")).trim() : null;
-            String orderCode = data.get("orderCode") != null ? String.valueOf(data.get("orderCode")).trim() : null;
-            if (Cools.isEmpty(invCode) || Cools.isEmpty(orderCode)) {
-                logger.debug("cust_wait_pakin 璺宠繃鏇存柊锛氳鍗曞彿鎴栫墿鏂欑紪鐮佷负绌猴紝orderCode={}锛宨nvCode={}", orderCode, invCode);
+        String invCode = data.get("invCode") != null ? String.valueOf(data.get("invCode")).trim() : null;
+        String orderCode = data.get("orderCode") != null ? String.valueOf(data.get("orderCode")).trim() : null;
+        if (Cools.isEmpty(invCode) || Cools.isEmpty(orderCode)) {
+            logger.debug("cust_wait_pakin 璺宠繃鏇存柊锛氳鍗曞彿鎴栫墿鏂欑紪鐮佷负绌猴紝orderCode={}锛宨nvCode={}", orderCode, invCode);
+            return;
+        }
+        Double productQty = parseDoubleSafely(data.get("productQty"));
+        if (productQty == null) {
+            productQty = parseDoubleSafely(data.get("orderQty"));
+        }
+        logger.info("cust_wait_pakin 寮�濮嬫洿鏂帮細璁㈠崟鍙�={}锛岀墿鏂欑紪鐮�={}锛屾暟閲�={}", orderCode, invCode, productQty);
+        String invName = data.get("invName") != null ? String.valueOf(data.get("invName")) : null;
+        WaitPakin updateEntity = new WaitPakin();
+        updateEntity.setMaktx(invName);
+        updateEntity.setAnfme(productQty);
+        updateEntity.setNqty(productQty);
+        updateEntity.setModiTime(new Date());
+        Wrapper<WaitPakin> wrapper = new EntityWrapper<WaitPakin>().eq("matnr", invCode).eq("mnemonic", orderCode);
+
+        for (int attempt = 0; attempt <= CUST_WAIT_PAKIN_DEADLOCK_RETRIES; attempt++) {
+            try {
+                boolean updated = waitPakinService.update(updateEntity, wrapper);
+                if (updated) {
+                    logger.info("cust_wait_pakin 鏇存柊鎴愬姛锛氳鍗曞彿={}锛岀墿鏂欑紪鐮�={}锛屾暟閲�={}", orderCode, invCode, productQty);
+                } else {
+                    logger.warn("cust_wait_pakin 鏇存柊鏈奖鍝嶈锛堝彲鑳芥棤鍖归厤璁板綍锛夛細璁㈠崟鍙�={}锛岀墿鏂欑紪鐮�={}", orderCode, invCode);
+                }
+                return;
+            } catch (Exception e) {
+                if (e instanceof DeadlockLoserDataAccessException || (e.getCause() != null && e.getCause().getClass().getSimpleName().contains("Deadlock"))) {
+                    if (attempt < CUST_WAIT_PAKIN_DEADLOCK_RETRIES) {
+                        try {
+                            Thread.sleep(CUST_WAIT_PAKIN_RETRY_DELAY_MS);
+                        } catch (InterruptedException ie) {
+                            Thread.currentThread().interrupt();
+                        }
+                        logger.warn("cust_wait_pakin 鏇存柊姝婚攣锛岀{}娆¢噸璇曪細璁㈠崟鍙�={}锛岀墿鏂欑紪鐮�={}", attempt + 1, orderCode, invCode);
+                        continue;
+                    }
+                }
+                logger.error("cust_wait_pakin 鏇存柊寮傚父锛歰rderCode={}锛宨nvCode={}锛宔rror={}", data.get("orderCode"), data.get("invCode"), e.getMessage(), e);
                 return;
             }
-            Double productQty = parseDoubleSafely(data.get("productQty"));
-            if (productQty == null) {
-                productQty = parseDoubleSafely(data.get("orderQty"));
-            }
-            logger.info("cust_wait_pakin 寮�濮嬫洿鏂帮細璁㈠崟鍙�={}锛岀墿鏂欑紪鐮�={}锛屾暟閲�={}", orderCode, invCode, productQty);
-            String invName = data.get("invName") != null ? String.valueOf(data.get("invName")) : null;
-            WaitPakin updateEntity = new WaitPakin();
-            updateEntity.setMaktx(invName);
-            updateEntity.setAnfme(productQty);
-            updateEntity.setNqty(productQty);
-            updateEntity.setModiTime(new Date());
-            Wrapper<WaitPakin> wrapper = new EntityWrapper<WaitPakin>().eq("matnr", invCode).eq("mnemonic", orderCode);
-            boolean updated = waitPakinService.update(updateEntity, wrapper);
-            if (updated) {
-                logger.info("cust_wait_pakin 鏇存柊鎴愬姛锛氳鍗曞彿={}锛岀墿鏂欑紪鐮�={}锛屾暟閲�={}", orderCode, invCode, productQty);
-            } else {
-                logger.warn("cust_wait_pakin 鏇存柊鏈奖鍝嶈锛堝彲鑳芥棤鍖归厤璁板綍锛夛細璁㈠崟鍙�={}锛岀墿鏂欑紪鐮�={}", orderCode, invCode);
-            }
-        } catch (Exception e) {
-            logger.error("cust_wait_pakin 鏇存柊寮傚父锛歰rderCode={}锛宨nvCode={}锛宔rror={}", data.get("orderCode"), data.get("invCode"), e.getMessage(), e);
         }
     }
 
diff --git a/src/main/java/com/zy/asrs/service/impl/OutStockServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/OutStockServiceImpl.java
index 4cac85d..b3fd738 100644
--- a/src/main/java/com/zy/asrs/service/impl/OutStockServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/OutStockServiceImpl.java
@@ -55,8 +55,12 @@
 
     @Override
     public Page<OutStockBillEntry> queryOutStock(Page<OutStockBillEntry> page) {
-        page.setRecords(baseMapper.queryOutStock(page.getCondition()));
-        page.setTotal(baseMapper.queryOutStockCount(page.getCondition()));
+        Map<String, Object> cond = page.getCondition();
+        page.setRecords(baseMapper.queryOutStock(cond));
+        page.setTotal(baseMapper.queryOutStockCount(cond));
+        if (log.isDebugEnabled()) {
+            log.debug("queryOutStock 鏉′欢 FBillNo={}, FSourceBillNo={}, 鏌ヨ缁撴灉 total={}", cond.get("FBillNo"), cond.get("FSourceBillNo"), page.getTotal());
+        }
         return page;
     }
 
diff --git a/src/main/java/com/zy/common/service/erp/ErpService.java b/src/main/java/com/zy/common/service/erp/ErpService.java
index 4a27748..e6ec01d 100644
--- a/src/main/java/com/zy/common/service/erp/ErpService.java
+++ b/src/main/java/com/zy/common/service/erp/ErpService.java
@@ -140,8 +140,9 @@
      * @return
      */
     public List<OutStockBill> syncOutStock() {
-        return erpSqlServer.select("SELECT * FROM  xtyasrs_dual.dbo.OutStockBill where Fflag_rw=0", OutStockBill.class);
-//        return erpSqlServer.select("SELECT * FROM  xtyasrs_dual.dbo.OutStockBill where Fflag_rw=0", OutStockBill.class);
+        List<OutStockBill> list = erpSqlServer.select("SELECT * FROM  xtyasrs_dual.dbo.OutStockBill where Fflag_rw=0", OutStockBill.class);
+        log.info("outStock鍚屾鏉ユ簮锛欵RP搴搙tyasrs_dual鏈鍑哄簱鍗曟暟={}", list != null ? list.size() : 0);
+        return list;
     }
 
     /**
@@ -165,9 +166,10 @@
      * @return
      */
     public List<OutStockBillEntry> syncOutStockDetail(Integer FInterID) {
-//        String sql = "SELECT * FROM  xtyasrs_dual.dbo.OutStockBillEntry where FSourceBillNo!='' and FAuxCommitQty=0 and FInterID=" + FInterID;
         String sql = "SELECT * FROM  xtyasrs_dual.dbo.OutStockBillEntry where FAuxCommitQty=0 and FInterID=" + FInterID;
-        return erpSqlServer.select(sql, OutStockBillEntry.class);
+        List<OutStockBillEntry> list = erpSqlServer.select(sql, OutStockBillEntry.class);
+        log.info("outStock鍚屾鏉ユ簮锛欵RP鍑哄簱鏄庣粏 FInterID={}, 鏉℃暟={}", FInterID, list != null ? list.size() : 0);
+        return list;
     }
 
     /**
diff --git a/src/main/java/com/zy/common/service/erp/task/ErpScheduler.java b/src/main/java/com/zy/common/service/erp/task/ErpScheduler.java
index a1c7963..5975b76 100644
--- a/src/main/java/com/zy/common/service/erp/task/ErpScheduler.java
+++ b/src/main/java/com/zy/common/service/erp/task/ErpScheduler.java
@@ -231,13 +231,17 @@
     @Transactional
     public void syncOutStock(){
         List<OutStockBill> outStockBills = erpService.syncOutStock();
+        log.info("鍑哄簱鍚屾寮�濮嬶紝ERP鏈鍗曟暟={}", outStockBills != null ? outStockBills.size() : 0);
+        if (outStockBills == null || outStockBills.isEmpty()) {
+            return;
+        }
         for (Integer i = 0; i < outStockBills.size(); i++) {
             OutStockBill outStockBill = outStockBills.get(i);
 
             //鍚屼竴鍗曞彿瀛樺湪鐩稿悓鐗╂枡缂栫爜鏁版嵁锛岃鍗曞彿涓嶄簣澶勭悊
             Number fnumberCount = erpService.QueryFnumberOutCount(outStockBill.getFInterID());
             if(fnumberCount.intValue() > 1){
-                log.info("鍑哄簱閫氱煡鍗曞瓨鍦ㄧ墿鏂欑浉鍚屾暟鎹甗FBillNo={},FInterID={},]", outStockBill.getFBillNo(), outStockBill.getFInterID());
+                log.info("鍑哄簱鍚屾璺宠繃锛氬悓涓�鍗曞彿瀛樺湪鐩稿悓鐗╂枡[FBillNo={},FInterID={}]锛屼笉浜堝悓姝�", outStockBill.getFBillNo(), outStockBill.getFInterID());
                 if (!erpService.haveReadOutBill(outStockBill.getFBillNo(),outStockBill.getFInterID(),-1)) {
                     log.error("鏇存柊鍑哄簱閫氱煡鍗曡鍙栫姸鎬佷负-1澶辫触[FBrNo={},FInterID={}]", outStockBill.getFBrNo(),outStockBill.getFInterID());
                 }
@@ -246,12 +250,17 @@
 
             OutStockBill main = outStockMainService.selectOne(new EntityWrapper<OutStockBill>().eq("FBillNo",outStockBill.getFBillNo()).and().eq("FInterID", outStockBill.getFInterID()));
             if (null == main) {
+                log.info("鍑哄簱鍚屾鏂板崟锛欶BillNo={}, FInterID={}锛屼粠ERP鍚屾鍒癢MS", outStockBill.getFBillNo(), outStockBill.getFInterID());
                 outStockBill.setFflag_rw(1);
                 if (!outStockMainService.insert(outStockBill)) {
-                    log.info("鍚屾鍑哄簱閫氱煡涓昏〃OutStockBill澶辫触");
+                    log.error("鍑哄簱鍚屾澶辫触锛氬悓姝ュ嚭搴撻�氱煡涓昏〃OutStockBill澶辫触[FBillNo={},FInterID={}]", outStockBill.getFBillNo(), outStockBill.getFInterID());
                     exceptionHandle("鍚屾鍑哄簱閫氱煡涓昏〃OutStockBill澶辫触[FBillNo={0},FInterID={1}]",outStockBill.getFBillNo(),outStockBill.getFInterID());
                 };
                 List<OutStockBillEntry> outStockBillEntries = erpService.syncOutStockDetail(outStockBill.getFInterID());
+                if (outStockBillEntries == null || outStockBillEntries.isEmpty()) {
+                    log.warn("鍑哄簱鍚屾锛欵RP璇ュ崟鏄庣粏鏁颁负0锛孎BillNo={}, FInterID={}锛堝彲鑳紼RP鏉′欢FAuxCommitQty=0鏃犳暟鎹級", outStockBill.getFBillNo(), outStockBill.getFInterID());
+                }
+                if (outStockBillEntries != null) {
                 for (Integer j = 0; j < outStockBillEntries.size(); j++) {
                     OutStockBillEntry outStockBillEntry = outStockBillEntries.get(j);
                     Wrapper<OutStockBillEntry> wrapper = new EntityWrapper<OutStockBillEntry>().eq("FInterID", outStockBillEntry.getFInterID()).
@@ -286,8 +295,9 @@
                         }
                     }
                 }
+                }
             } else {
-
+                log.debug("鍑哄簱鍚屾锛歐MS宸插瓨鍦ㄨ鍗曪紝璺宠繃鍚屾鏄庣粏 FBillNo={}, FInterID={}", outStockBill.getFBillNo(), outStockBill.getFInterID());
             }
 
             if (!erpService.haveReadOutBill(outStockBill.getFBillNo(),outStockBill.getFInterID(),1)) {

--
Gitblit v1.9.1