From 43525a12afaf7368decbed730f0240a6709d8355 Mon Sep 17 00:00:00 2001
From: chen.llin <1442464845@qq.comm>
Date: 星期三, 24 十二月 2025 12:05:58 +0800
Subject: [PATCH] 月结

---
 src/main/java/com/zy/asrs/service/impl/MonthlySettleServiceImpl.java |  130 +++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 124 insertions(+), 6 deletions(-)

diff --git a/src/main/java/com/zy/asrs/service/impl/MonthlySettleServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/MonthlySettleServiceImpl.java
index 4dd63c1..79921c6 100644
--- a/src/main/java/com/zy/asrs/service/impl/MonthlySettleServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/MonthlySettleServiceImpl.java
@@ -7,6 +7,7 @@
 import com.core.exception.CoolException;
 import com.zy.asrs.entity.MonthlySettle;
 import com.zy.asrs.entity.MonthlySettleDetail;
+import com.zy.asrs.entity.result.MaterialInOutRawDTO;
 import com.zy.asrs.entity.result.MaterialInOutStatDTO;
 import com.zy.asrs.entity.result.MonthlySettleResultVO;
 import com.zy.asrs.entity.result.MonthlySettleStatisticsVO;
@@ -139,21 +140,84 @@
             throw new CoolException("鏈堢粨鏃堕棿鑼冨洿鍐呭瓨鍦ㄦ湭瀹屾垚鐨勮鍗曪紝鏃犳硶杩涜鏈堢粨");
         }
 
-        // 缁熻鐗╂枡鍑哄叆搴撴暟閲忥紙鍚堝苟鍏ュ簱鍜屽嚭搴擄級
+        // 缁熻鐗╂枡鍑哄叆搴撴暟閲忥紙鍒嗗埆鏌ヨ涓や釜琛紝鍦↗ava浠g爜涓悎骞讹級
         SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
         SimpleDateFormat dateTimeFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
         String startDateStr = dateFormat.format(startDate);
         String endDateStr = dateTimeFormat.format(endDate);
-        List<MaterialInOutStatDTO> materialStats = this.baseMapper.statisticsMaterialInOut(startDateStr, endDateStr);
+        
+        // 鍒嗗埆鏌ヨ鍏ュ簱琛ㄥ拰鍑哄簱琛�
+        List<MaterialInOutRawDTO> pakinDataList = this.baseMapper.statisticsMaterialInOutFromPakin(startDateStr, endDateStr);
+        List<MaterialInOutRawDTO> pakoutDataList = this.baseMapper.statisticsMaterialInOutFromPakout(startDateStr, endDateStr);
+        
+        // 鍚堝苟涓や釜琛ㄧ殑鏁版嵁
+        List<MaterialInOutRawDTO> rawDataList = new java.util.ArrayList<>();
+        if (pakinDataList != null && !pakinDataList.isEmpty()) {
+            rawDataList.addAll(pakinDataList);
+        }
+        if (pakoutDataList != null && !pakoutDataList.isEmpty()) {
+            rawDataList.addAll(pakoutDataList);
+        }
         
         // 妫�鏌ユ槸鍚︽湁鍑哄叆搴撳巻鍙茶鍗�
-        if (materialStats == null || materialStats.isEmpty()) {
+        if (rawDataList == null || rawDataList.isEmpty()) {
             throw new CoolException("鏈堢粨鏃堕棿鑼冨洿鍐呮病鏈夊嚭鍏ュ簱鍘嗗彶璁㈠崟锛屾棤娉曡繘琛屾湀缁�");
         }
+        
+        // 鍦↗ava浠g爜涓鐞嗗垎绫荤粺璁¢�昏緫
+        // 1. 澶勭悊NULL鍊硷紙batch銆乥rand銆乵aktx锛�
+        // 2. 鏍规嵁鐗╂枡缂栫爜銆佹壒娆°�佸搧鐗屽垎缁�
+        // 3. 鏍规嵁 pakin_pakout_status 鍖哄垎鍏ュ簱鍜屽嚭搴�
+        Map<String, MaterialInOutStatDTO> materialStatsMap = new HashMap<>();
+        Map<String, String> maktxMap = new HashMap<>(); // 瀛樺偍鐗╂枡鍚嶇О锛堝彇绗竴涓潪绌哄�硷級
+        
+        for (MaterialInOutRawDTO raw : rawDataList) {
+            // 澶勭悊NULL鍊�
+            String matnr = raw.getMatnr();
+            String batch = raw.getBatch() != null ? raw.getBatch() : "";
+            String brand = raw.getBrand() != null ? raw.getBrand() : "";
+            String maktx = raw.getMaktx() != null ? raw.getMaktx() : "";
+            String key = matnr + "_" + batch + "_" + brand;
+            
+            // 淇濆瓨鐗╂枡鍚嶇О锛堝彇绗竴涓潪绌哄�硷級
+            if (maktx != null && !maktx.isEmpty() && !maktxMap.containsKey(key)) {
+                maktxMap.put(key, maktx);
+            }
+            
+            MaterialInOutStatDTO stat = materialStatsMap.get(key);
+            if (stat == null) {
+                stat = new MaterialInOutStatDTO();
+                stat.setMatnr(matnr);
+                stat.setMaktx(maktxMap.getOrDefault(key, ""));
+                stat.setBatch(batch);
+                stat.setBrand(brand);
+                stat.setInQty(BigDecimal.ZERO);
+                stat.setOutQty(BigDecimal.ZERO);
+                materialStatsMap.put(key, stat);
+            }
+            
+            // 鏍规嵁 pakin_pakout_status 鍒嗙被缁熻
+            // 1 = 鍏ュ簱锛�2 = 鍑哄簱锛�0 = 鏈煡锛堝凡鍦⊿QL涓繃婊わ級
+            BigDecimal qty = raw.getQty() != null ? raw.getQty() : BigDecimal.ZERO;
+            Integer status = raw.getPakinPakoutStatus();
+            if (status != null && qty.compareTo(BigDecimal.ZERO) > 0) {
+                if (status == 1) {
+                    // 鍏ュ簱
+                    stat.setInQty(stat.getInQty().add(qty));
+                } else if (status == 2) {
+                    // 鍑哄簱
+                    stat.setOutQty(stat.getOutQty().add(qty));
+                }
+            }
+        }
+        
+        // 杞崲涓篖ist
+        List<MaterialInOutStatDTO> materialStats = new java.util.ArrayList<>(materialStatsMap.values());
 
-        // 鑾峰彇涓婁竴涓湀缁撹褰曪紙鐢ㄤ簬璁$畻鏈熷垵搴撳瓨锛�
-        MonthlySettle previousSettle = getLatestSettle();
+        // 鑾峰彇涓婁竴涓湀缁撹褰曪紙鐢ㄤ簬璁$畻鏈熷垵搴撳瓨鍜屾壙鎺ヤ笂涓�鏈熺殑鐗╂枡锛�
+        MonthlySettle   previousSettle = getLatestSettle();
         Map<String, BigDecimal> previousEndingQtyMap = new HashMap<>();
+        Map<String, PreviousSettleEndingQtyDTO> previousDetailMap = new HashMap<>(); // 瀛樺偍涓婁竴鏈熺殑瀹屾暣鏄庣粏淇℃伅
         if (previousSettle != null) {
             List<PreviousSettleEndingQtyDTO> previousDetails = this.baseMapper.getPreviousSettleEndingQty(previousSettle.getId());
             for (PreviousSettleEndingQtyDTO detail : previousDetails) {
@@ -162,6 +226,7 @@
                             (detail.getBrand() != null ? detail.getBrand() : "");
                 BigDecimal endingQty = detail.getEndingQty() != null ? detail.getEndingQty() : BigDecimal.ZERO;
                 previousEndingQtyMap.put(key, endingQty);
+                previousDetailMap.put(key, detail); // 淇濆瓨瀹屾暣淇℃伅锛岀敤浜庡悗缁垱寤烘槑缁�
             }
         }
 
@@ -184,7 +249,17 @@
         BigDecimal totalOutQty = BigDecimal.ZERO;
         int materialCount = 0;
 
-        // 鍒涘缓鏈堢粨鏄庣粏
+        // 鍒涘缓 Map 瀛樺偍鏈湡鏈夊嚭鍏ュ簱鐨勭墿鏂欙紙鐢ㄤ簬鍒ゆ柇鏄惁闇�瑕佷粠涓婁竴鏈熺户鎵匡級
+        Map<String, MaterialInOutStatDTO> currentMaterialMap = new HashMap<>();
+        for (MaterialInOutStatDTO stat : materialStats) {
+            String matnr = stat.getMatnr();
+            String batch = stat.getBatch() != null ? stat.getBatch() : "";
+            String brand = stat.getBrand() != null ? stat.getBrand() : "";
+            String key = matnr + "_" + batch + "_" + brand;
+            currentMaterialMap.put(key, stat);
+        }
+
+        // 1. 澶勭悊鏈湡鏈夊嚭鍏ュ簱鐨勭墿鏂�
         for (MaterialInOutStatDTO stat : materialStats) {
             // 1. 鎻愬彇鍩虹淇℃伅
             String matnr = stat.getMatnr();
@@ -216,6 +291,49 @@
             materialCount++;
         }
 
+        // 2. 澶勭悊涓婁竴鏈熷瓨鍦ㄤ絾鏈湡娌℃湁鍑哄叆搴撶殑鐗╂枡锛堥渶瑕佹壙鎺ユ樉绀猴級
+        if (previousSettle != null && !previousDetailMap.isEmpty()) {
+            for (Map.Entry<String, PreviousSettleEndingQtyDTO> entry : previousDetailMap.entrySet()) {
+                String key = entry.getKey();
+                // 濡傛灉鏈湡娌℃湁鍑哄叆搴擄紝浣嗕笂涓�鏈熸湁鏈熸湯搴撳瓨锛堜笖涓嶄负0锛夛紝鍒欓渶瑕佸垱寤轰竴鏉¤褰�
+                if (!currentMaterialMap.containsKey(key)) {
+                    PreviousSettleEndingQtyDTO previousDetail = entry.getValue();
+                    BigDecimal previousEndingQty = previousDetail.getEndingQty() != null ? previousDetail.getEndingQty() : BigDecimal.ZERO;
+                    
+                    // 濡傛灉涓婁竴鏈熺殑鏈熸湯搴撳瓨涓嶄负0锛屾垨鑰呭嵆浣夸负0涔熻鏄剧ず锛堢敤浜庡姣旓級
+                    // 杩欓噷鎴戜滑鎬绘槸鍒涘缓璁板綍锛屽嵆浣夸笂涓�鏈熸湡鏈簱瀛樹负0锛屽洜涓虹敤鎴疯姹�"濡傛灉涓婁竴鏈熷瓨鍦ㄨ繃锛屾湰鏈熷簱瀛樺綊闆朵篃瑕佹樉绀轰竴鏉′负0鐨勮褰�"
+                    String matnr = previousDetail.getMatnr();
+                    String batch = previousDetail.getBatch() != null ? previousDetail.getBatch() : "";
+                    String brand = previousDetail.getBrand() != null ? previousDetail.getBrand() : "";
+                    String maktx = previousDetail.getMaktx() != null ? previousDetail.getMaktx() : "";
+                    
+                    // 鏈湡娌℃湁鍑哄叆搴擄紝鎵�浠ュ叆搴撳拰鍑哄簱鏁伴噺閮戒负0
+                    BigDecimal inQty = BigDecimal.ZERO;
+                    BigDecimal outQty = BigDecimal.ZERO;
+                    
+                    // 鏈熷垵搴撳瓨 = 涓婁竴鏈熺殑鏈熸湯搴撳瓨
+                    BigDecimal beginningQty = previousEndingQty;
+                    // 鏈熸湯搴撳瓨 = 鏈熷垵 + 鍏ュ簱 - 鍑哄簱 = 鏈熷垵锛堝洜涓烘湰鏈熸病鏈夊嚭鍏ュ簱锛�
+                    BigDecimal endingQty = beginningQty;
+                    // 鑾峰彇褰撳墠瀹為檯搴撳瓨
+                    BigDecimal stockQtyDecimal = getCurrentStockQty(matnr, batch);
+                    // 璁$畻宸紓
+                    BigDecimal diffQty = calculateDiffQty(stockQtyDecimal, endingQty);
+                    
+                    // 鍒涘缓骞朵繚瀛樻槑缁嗚褰�
+                    MonthlySettleDetail detail = buildMonthlySettleDetail(
+                        monthlySettle.getId(), settleNo, matnr, batch, maktx, brand,
+                        beginningQty, inQty, outQty, endingQty, stockQtyDecimal, diffQty
+                    );
+                    detail.setIsDeleted(0); // 鏈垹闄�
+                    monthlySettleDetailMapper.insert(detail);
+                    
+                    // 绱缁熻锛堣櫧鐒跺叆搴撳拰鍑哄簱涓�0锛屼絾涔熻璁″叆鐗╂枡绉嶇被鏁帮級
+                    materialCount++;
+                }
+            }
+        }
+
         // 鏇存柊鏈堢粨涓昏褰�
         monthlySettle.setTotalInQty(totalInQty);
         monthlySettle.setTotalOutQty(totalOutQty);

--
Gitblit v1.9.1