From bbd9823e935293b4815963647fecf48e3ba7ee1b Mon Sep 17 00:00:00 2001
From: gongchunyi <deslre0381@gmail.com>
Date: 星期五, 22 五月 2026 17:30:41 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev_New_pro' into dev_New_pro

---
 doc/20260522_采购台账入库状态_销售产品入库审核状态前端联调文档.md                                    |  127 ++++++++
 src/main/java/com/ruoyi/home/dto/StatisticsReceivablePayableDto.java         |    4 
 src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerDto.java                  |    2 
 src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java |    7 
 src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java                   |    4 
 doc/20260522_StockInRecord列表源单号前端联调文档_276补充.md                               |   65 ++++
 doc/20260522_StockInRecord列表源单号前端联调文档.md                                     |   75 +++++
 src/main/resources/mapper/purchase/PurchaseLedgerMapper.xml                  |  162 +++++++---
 src/main/resources/mapper/stock/StockInRecordMapper.xml                      |   87 +++++
 src/main/java/com/ruoyi/stock/service/StockInRecordService.java              |    2 
 src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java     |   99 +++++-
 src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java               |  123 +++++--
 src/main/java/com/ruoyi/stock/dto/StockInRecordDto.java                      |    3 
 src/main/java/com/ruoyi/stock/controller/StockInRecordController.java        |   11 
 src/main/resources/mapper/sales/SalesLedgerProductMapper.xml                 |   41 ++
 src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java       |   52 ++
 src/main/resources/application.yml                                           |    2 
 17 files changed, 735 insertions(+), 131 deletions(-)

diff --git "a/doc/20260522_StockInRecord\345\210\227\350\241\250\346\272\220\345\215\225\345\217\267\345\211\215\347\253\257\350\201\224\350\260\203\346\226\207\346\241\243.md" "b/doc/20260522_StockInRecord\345\210\227\350\241\250\346\272\220\345\215\225\345\217\267\345\211\215\347\253\257\350\201\224\350\260\203\346\226\207\346\241\243.md"
new file mode 100644
index 0000000..56d1570
--- /dev/null
+++ "b/doc/20260522_StockInRecord\345\210\227\350\241\250\346\272\220\345\215\225\345\217\267\345\211\215\347\253\257\350\201\224\350\260\203\346\226\207\346\241\243.md"
@@ -0,0 +1,75 @@
+# StockInRecord 鍒楄〃婧愬崟鍙峰墠绔仈璋冩枃妗�
+
+鏇存柊鏃堕棿锛�2026-05-22  
+閫傜敤鎺ュ彛锛歚GET /stockInRecord/listPage`
+
+## 1. 鍙樻洿璇存槑
+
+鏈瀵瑰叆搴撶鐞嗗垪琛ㄦ帴鍙e鍔犺繑鍥炲瓧娈� `sourceOrderNo`锛堟簮鍗曞彿锛夛紝鐢ㄤ簬鍘熸潗鏂欏満鏅睍绀洪噰璐潵婧愬崟鍙枫��
+
+鐢熸晥鏉′欢锛�
+
+- 褰撹姹傚弬鏁� `topParentProductId = 278` 鏃讹紝鍚庣杩斿洖 `sourceOrderNo`銆�
+- 鍏朵粬 `topParentProductId` 鍦烘櫙涓嬶紝璇ュ瓧娈佃繑鍥� `null`锛堟垨涓嶅睍绀猴級銆�
+
+## 2. 瀛楁瀹氫箟
+
+鏂板瀛楁锛�
+
+- `sourceOrderNo`锛歚string`锛屾簮鍗曞彿锛堥噰璐悎鍚屽彿锛夈��
+
+## 3. 鍙栧�艰鍒�
+
+浠呭湪 `topParentProductId = 278` 鏃舵寜鈥滄潵婧愨�濊绠楋細
+
+1. 鏉ユ簮 = `閲囪喘-鍏ュ簱`锛坄recordType = 7`锛�  
+   - 鍏堟寜 `recordId` 鏌ラ噰璐骇鍝佽〃 `sales_ledger_product`锛坄type=2`锛夛紱
+   - 鍐嶉�氳繃 `sales_ledger_product.sales_ledger_id` 鏌ラ噰璐彴璐﹁〃 `purchase_ledger`锛�
+   - 杩斿洖 `purchase_ledger.purchase_contract_number` 浣滀负 `sourceOrderNo`銆�
+   - 鍏煎鍏滃簳锛氳嫢鏈懡涓噰璐骇鍝侀摼璺紝鍒欐寜 `recordId` 鐩存帴鏌� `purchase_ledger.id` 鍙栧崟鍙枫��
+
+2. 鏉ユ簮 = `閲囪喘-璐ㄦ-鍚堟牸鍏ュ簱`锛坄recordType = 10`锛�  
+   - 鍏堟寜 `recordId` 鏌ヨ川妫�琛� `quality_inspect`锛�
+   - 鍐嶉�氳繃 `quality_inspect.purchase_ledger_id` 鏌ラ噰璐彴璐﹁〃 `purchase_ledger`锛�
+   - 杩斿洖 `purchase_ledger.purchase_contract_number` 浣滀负 `sourceOrderNo`銆�
+
+## 4. 杩斿洖绀轰緥
+
+```json
+{
+  "code": 200,
+  "msg": "鎿嶄綔鎴愬姛",
+  "data": {
+    "records": [
+      {
+        "id": 1024,
+        "recordType": "7",
+        "productName": "閾滄帓",
+        "model": "T2-30x3",
+        "sourceOrderNo": "CG-2026-00128"
+      },
+      {
+        "id": 1025,
+        "recordType": "10",
+        "productName": "閾滄帓",
+        "model": "T2-30x3",
+        "sourceOrderNo": "CG-2026-00131"
+      }
+    ],
+    "total": 2
+  }
+}
+```
+
+## 5. 鍓嶇鑱旇皟寤鸿
+
+1. 鍒楄〃鍒楁柊澧炩�滄簮鍗曞彿鈥濓紝璇诲彇瀛楁 `sourceOrderNo`銆�
+2. 寤鸿浠呭湪 `topParentProductId = 278` 鐨勯〉闈�/绛涢�夋潯浠朵笅灞曠ず璇ュ垪銆�
+3. 褰� `sourceOrderNo` 涓虹┖鏃跺睍绀� `--`锛岄伩鍏嶇┖鐧姐��
+
+## 6. 鍥炲綊娓呭崟
+
+1. `topParentProductId=278` + `recordType=7`锛氬簲杩斿洖閲囪喘鍚堝悓鍙枫��
+2. `topParentProductId=278` + `recordType=10`锛氬簲杩斿洖閲囪喘鍚堝悓鍙凤紙缁忚川妫�閾捐矾锛夈��
+3. `topParentProductId!=278`锛歚sourceOrderNo` 搴斾负 `null` 鎴栧墠绔笉灞曠ず銆�
+4. 鍘熸湁瀛楁锛坄productName/model/unit/createBy` 绛夛級涓嶅彈褰卞搷銆�
diff --git "a/doc/20260522_StockInRecord\345\210\227\350\241\250\346\272\220\345\215\225\345\217\267\345\211\215\347\253\257\350\201\224\350\260\203\346\226\207\346\241\243_276\350\241\245\345\205\205.md" "b/doc/20260522_StockInRecord\345\210\227\350\241\250\346\272\220\345\215\225\345\217\267\345\211\215\347\253\257\350\201\224\350\260\203\346\226\207\346\241\243_276\350\241\245\345\205\205.md"
new file mode 100644
index 0000000..93d9b25
--- /dev/null
+++ "b/doc/20260522_StockInRecord\345\210\227\350\241\250\346\272\220\345\215\225\345\217\267\345\211\215\347\253\257\350\201\224\350\260\203\346\226\207\346\241\243_276\350\241\245\345\205\205.md"
@@ -0,0 +1,65 @@
+# StockInRecord 鍒楄〃婧愬崟鍙峰墠绔仈璋冩枃妗o紙`topParentProductId=276`琛ュ厖锛�
+
+鏇存柊鏃堕棿锛�2026-05-22  
+閫傜敤鎺ュ彛锛歚GET /stockInRecord/listPage`
+
+## 1. 鍙樻洿璇存槑
+
+鍦ㄥ凡鏈� `sourceOrderNo` 鍩虹涓婏紝鏂板 `topParentProductId = 276` 鐨勬簮鍗曞彿婧簮閫昏緫锛�
+
+- 鏍规嵁鈥滄潵婧愶紙recordType锛�+ recordId鈥濇函婧愶紱
+- 浼樺厛杩斿洖閿�鍞崟鍙凤紙閿�鍞悎鍚屽彿锛夛紱
+- 鑻ラ攢鍞崟鍙蜂负绌猴紝鍒欏洖閫�杩斿洖鐢熶骇璁㈠崟鍙凤紱
+- 涓嶈�冭檻鑷畾涔夊叆搴擄紙`recordType=0/9`锛夈��
+
+## 2. 杩斿洖瀛楁
+
+瀛楁鏃犳柊澧烇紝缁х画浣跨敤锛�
+
+- `sourceOrderNo`锛歚string`锛屾簮鍗曞彿銆�
+
+## 3. 276 鍦烘櫙鍙栧�艰鍒�
+
+璇锋眰鍙傛暟婊¤冻 `topParentProductId = 276` 鏃讹細
+
+1. `recordType = 14/15`锛堥攢鍞��璐�-鍚堟牸/涓嶅悎鏍煎叆搴擄級  
+   - `stock_in_record.record_id -> return_sale_product.id -> return_management.shipping_id -> shipping_info.sales_ledger_id -> sales_ledger.sales_contract_no`
+   - 杩斿洖閿�鍞悎鍚屽彿銆�
+
+2. `recordType = 2/5`锛堢敓浜ф姤宸�-鍏ュ簱/鎶ュ簾锛�  
+   - `stock_in_record.record_id -> production_product_main.id -> production_operation_task.production_order_id -> production_order`
+   - 鍏堝彇璇ョ敓浜ц鍗曞叧鑱旈攢鍞悎鍚屽彿锛堢敱鐢熶骇璁″垝鍏宠仈閿�鍞彴璐﹁仛鍚堬級锛�
+   - 閿�鍞悎鍚屽彿涓虹┖鏃讹紝杩斿洖 `production_order.nps_no`銆�
+
+3. `recordType = 6`锛堣川妫�-鍚堟牸鍏ュ簱锛�  
+   - `stock_in_record.record_id -> quality_inspect.id -> quality_inspect.product_main_id -> production_product_main -> production_operation_task -> production_order`
+   - 鍏堝彇閿�鍞悎鍚屽彿锛岀┖鍒欏洖閫� `production_order.nps_no`銆�
+
+4. `recordType = 4/11`锛堜笉鍚堟牸澶勭悊-鎶ュ簾/璁╂鏀捐锛�  
+   - `stock_in_record.record_id -> quality_unqualified.id -> quality_unqualified.inspect_id -> quality_inspect -> production_product_main -> production_operation_task -> production_order`
+   - 鍏堝彇閿�鍞悎鍚屽彿锛岀┖鍒欏洖閫� `production_order.nps_no`銆�
+
+5. `recordType = 20/22`锛堥鏂欓��鏂�/鐢熶骇閫�鏂�-鍚堟牸鍏ュ簱锛�  
+   - `stock_in_record.record_id -> production_order_pick.id -> production_order`
+   - 鍏堝彇閿�鍞悎鍚屽彿锛岀┖鍒欏洖閫� `production_order.nps_no`銆�
+
+6. `recordType = 0/9`锛堣嚜瀹氫箟鍏ュ簱锛�  
+   - 涓嶅弬涓庢函婧愶紝`sourceOrderNo = null`銆�
+
+## 4. 鍏朵粬鍦烘櫙璇存槑
+
+- `topParentProductId = 278` 鐨勯噰璐摼璺簮鍗曞彿閫昏緫淇濇寔涓嶅彉銆�
+- 鍏朵粬 `topParentProductId` 涓嶈Е鍙戞湰娆� 276 瑙勫垯锛宍sourceOrderNo` 涓虹┖銆�
+
+## 5. 鍓嶇鑱旇皟寤鸿
+
+1. 鍦� `topParentProductId=276` 鐨勫垪琛ㄥ満鏅睍绀衡�滄簮鍗曞彿鈥濆垪锛岃鍙� `sourceOrderNo`銆�
+2. 寤鸿绌哄�肩粺涓�灞曠ず `--`銆�
+3. 涓嶉渶瑕佹柊澧炶姹傚弬鏁帮紝娌跨敤鐜版湁 `/stockInRecord/listPage`銆�
+
+## 6. 鍥炲綊娓呭崟
+
+1. `topParentProductId=276` + `recordType=14/15`锛氬簲杩斿洖閿�鍞悎鍚屽彿銆�  
+2. `topParentProductId=276` + `recordType=2/5/6/4/11/20/22`锛氫紭鍏堥攢鍞悎鍚屽彿锛岀己澶辨椂杩斿洖鐢熶骇璁㈠崟鍙枫��  
+3. `topParentProductId=276` + `recordType=0/9`锛歚sourceOrderNo` 涓虹┖銆�  
+4. `topParentProductId=278`锛氫粛鎸夐噰璐摼璺繑鍥為噰璐悎鍚屽彿銆�  
diff --git "a/doc/20260522_\351\207\207\350\264\255\345\217\260\350\264\246\345\205\245\345\272\223\347\212\266\346\200\201_\351\224\200\345\224\256\344\272\247\345\223\201\345\205\245\345\272\223\345\256\241\346\240\270\347\212\266\346\200\201\345\211\215\347\253\257\350\201\224\350\260\203\346\226\207\346\241\243.md" "b/doc/20260522_\351\207\207\350\264\255\345\217\260\350\264\246\345\205\245\345\272\223\347\212\266\346\200\201_\351\224\200\345\224\256\344\272\247\345\223\201\345\205\245\345\272\223\345\256\241\346\240\270\347\212\266\346\200\201\345\211\215\347\253\257\350\201\224\350\260\203\346\226\207\346\241\243.md"
new file mode 100644
index 0000000..ae212fc
--- /dev/null
+++ "b/doc/20260522_\351\207\207\350\264\255\345\217\260\350\264\246\345\205\245\345\272\223\347\212\266\346\200\201_\351\224\200\345\224\256\344\272\247\345\223\201\345\205\245\345\272\223\345\256\241\346\240\270\347\212\266\346\200\201\345\211\215\347\253\257\350\201\224\350\260\203\346\226\207\346\241\243.md"
@@ -0,0 +1,127 @@
+# 閲囪喘鍏ュ簱鐘舵�佸墠绔仈璋冩枃妗�
+鏇存柊鏃堕棿锛�2026-05-22  
+閫傜敤鐗堟湰锛氭湰娆″悗绔彉鏇村悗
+
+## 1. 鍙樻洿鑼冨洿
+
+1. `GET /purchaseLedger/listPage`  
+   - 鏂板鏌ヨ鏉′欢锛歚stockInStatus`锛堝叆搴撶姸鎬侊級
+   - 鏂板杩斿洖瀛楁锛歚stockInStatus`锛堝叆搴撶姸鎬侊級
+2. `GET /salesLedgerProduct/list`  
+   - 鏂板杩斿洖瀛楁锛歚stockInApprovalStatus`锛堟瘡涓骇鍝佺殑鍏ュ簱瀹℃牳鐘舵�侊級
+
+---
+
+## 2. 鍏ュ簱鐘舵�佹灇涓撅紙涓ゆ帴鍙d竴鑷达級
+
+- `寰呭叆搴揱
+- `鍏ュ簱涓璥
+- `瀹屽叏鍏ュ簱`
+
+璇存槑锛氬墠绔瓫閫夊�艰鐩存帴浣跨敤浠ヤ笂涓枃鏋氫妇鍊笺��
+
+---
+
+## 3. 鎺ュ彛涓�锛歚GET /purchaseLedger/listPage`
+
+### 3.1 鏂板璇锋眰鍙傛暟
+
+- `stockInStatus`锛歚string`锛屽彲閫�  
+  鍙紶鍊硷細`寰呭叆搴揱 / `鍏ュ簱涓璥 / `瀹屽叏鍏ュ簱`
+
+### 3.2 鏂板杩斿洖瀛楁
+
+- `stockInStatus`锛歚string`锛岄噰璐彴璐︾淮搴﹀叆搴撶姸鎬�
+
+### 3.3 鐘舵�佽绠楄鍒欙紙閲囪喘鍙拌处缁村害锛�
+
+浠ヨ閲囪喘鍙拌处涓� `sales_ledger_product.type = 2` 鐨勯噰璐骇鍝佷负璁$畻鑼冨洿锛�
+
+1. 鍏ㄩ儴浜у搧閮借揪鍒扳�滃畬鍏ㄥ叆搴撯�� => 鍙拌处鐘舵�� `瀹屽叏鍏ュ簱`
+2. 鑷冲皯鏈変竴涓骇鍝佸瓨鍦ㄢ�滃鏍搁�氳繃鍏ュ簱鈥濓紝浣嗘湭鍏ㄩ儴瀹屽叏鍏ュ簱 => 鍙拌处鐘舵�� `鍏ュ簱涓璥
+3. 娌℃湁浠讳綍浜у搧瀛樺湪鈥滃鏍搁�氳繃鍏ュ簱鈥� => 鍙拌处鐘舵�� `寰呭叆搴揱
+
+鈥滃鏍搁�氳繃鍏ュ簱鈥濈粺璁″彛寰勶細`stock_in_record.approval_status = 1`锛屽苟鎸変互涓嬫潵婧愭函婧愶細
+- `record_type = 7`锛堥噰璐�-鍏ュ簱锛夛細鎸夐噰璐彴璐�+浜у搧鍏宠仈缁熻
+- `record_type = 10`锛堥噰璐�-璐ㄦ-鍚堟牸鍏ュ簱锛夛細閫氳繃 `quality_inspect` 鍥炴函鍒伴噰璐彴璐�+浜у搧缁熻
+
+### 3.4 杩斿洖绀轰緥锛堣妭閫夛級
+
+```json
+{
+  "code": 200,
+  "msg": "鎿嶄綔鎴愬姛",
+  "data": {
+    "records": [
+      {
+        "id": 1201,
+        "purchaseContractNumber": "CG20260522001",
+        "supplierName": "XX渚涘簲鍟�",
+        "stockInStatus": "鍏ュ簱涓�"
+      }
+    ],
+    "total": 1
+  }
+}
+```
+
+---
+
+## 4. 鎺ュ彛浜岋細`GET /salesLedgerProduct/list`
+
+### 4.1 鏂板杩斿洖瀛楁
+
+- `stockInApprovalStatus`锛歚string`锛屽綋鍓嶄骇鍝佽鐨勫叆搴撳鏍哥姸鎬�
+
+### 4.2 鐘舵�佽绠楄鍒欙紙浜у搧缁村害锛�
+
+浠呭綋浜у搧 `type = 2`锛堥噰璐骇鍝侊級鏃惰绠楀苟杩斿洖锛�
+
+1. 瀹℃牳閫氳繃鍏ュ簱鏁伴噺 `<= 0` => `寰呭叆搴揱
+2. 瀹℃牳閫氳繃鍏ュ簱鏁伴噺 `>= 浜у搧閲囪喘鏁伴噺` => `瀹屽叏鍏ュ簱`
+3. 鍏朵粬鎯呭喌 => `鍏ュ簱涓璥
+
+鍏朵腑鈥滃鏍搁�氳繃鍏ュ簱鏁伴噺鈥濈粺璁″悓鏍峰熀浜庯細
+- `stock_in_record.approval_status = 1`
+- 鏉ユ簮 `record_type = 7 / 10` 鐨勬函婧愬叧鑱旈�昏緫
+
+`type != 2` 鐨勪骇鍝侊紝璇ュ瓧娈佃繑鍥� `null`銆�
+
+### 4.3 杩斿洖绀轰緥锛堣妭閫夛級
+
+```json
+{
+  "code": 200,
+  "msg": "鎿嶄綔鎴愬姛",
+  "data": [
+    {
+      "id": 5566,
+      "type": 2,
+      "productCategory": "閾滄潗",
+      "specificationModel": "T2-30x3",
+      "quantity": 100,
+      "stockInApprovalStatus": "寰呭叆搴�"
+    }
+  ]
+}
+```
+
+---
+
+## 5. 鍓嶇鏀归�犲缓璁�
+
+1. 閲囪喘鍙拌处鍒楄〃鏂板鈥滃叆搴撶姸鎬佲�濈瓫閫夐」锛屽�煎浐瀹氾細`寰呭叆搴�/鍏ュ簱涓�/瀹屽叏鍏ュ簱`銆�
+2. 閲囪喘鍙拌处鍒楄〃鏂板鈥滃叆搴撶姸鎬佲�濆垪锛屽睍绀� `stockInStatus`銆�
+3. 閲囪喘浜у搧鍒楄〃鏂板鈥滃叆搴撳鏍哥姸鎬佲�濆垪锛屽睍绀� `stockInApprovalStatus`銆�
+4. 绌哄�硷紙濡� `type != 2`锛夊缓璁睍绀轰负 `--`銆�
+
+---
+
+## 6. 鑱旇皟妫�鏌ユ竻鍗�
+
+1. `/purchaseLedger/listPage` 涓嶄紶 `stockInStatus`锛氬簲姝e父杩斿洖鍏ㄩ儴鏁版嵁锛屽苟甯� `stockInStatus`銆�
+2. `/purchaseLedger/listPage?stockInStatus=寰呭叆搴揱锛氫粎杩斿洖寰呭叆搴撳彴璐︺��
+3. `/purchaseLedger/listPage?stockInStatus=鍏ュ簱涓璥锛氫粎杩斿洖鍏ュ簱涓彴璐︺��
+4. `/purchaseLedger/listPage?stockInStatus=瀹屽叏鍏ュ簱`锛氫粎杩斿洖瀹屽叏鍏ュ簱鍙拌处銆�
+5. `/salesLedgerProduct/list` 鍦ㄩ噰璐骇鍝侊紙`type=2`锛変笅杩斿洖 `stockInApprovalStatus`銆�
+6. `/salesLedgerProduct/list` 鍦ㄩ潪閲囪喘浜у搧锛坄type!=2`锛変笅 `stockInApprovalStatus` 涓� `null`銆�
diff --git a/src/main/java/com/ruoyi/home/dto/StatisticsReceivablePayableDto.java b/src/main/java/com/ruoyi/home/dto/StatisticsReceivablePayableDto.java
index a16390c..4f1509b 100644
--- a/src/main/java/com/ruoyi/home/dto/StatisticsReceivablePayableDto.java
+++ b/src/main/java/com/ruoyi/home/dto/StatisticsReceivablePayableDto.java
@@ -19,10 +19,10 @@
     @Schema(description = "搴斾粯閲戦")
     private BigDecimal payableMoney;
 
-    @Schema(description = "棰勬敹閲戦")
+    @Schema(description = "鏀舵閲戦")
     private BigDecimal advanceMoney;
 
-    @Schema(description = "棰勪粯閲戦")
+    @Schema(description = "浠樻閲戦")
     private BigDecimal prepayMoney;
 
 }
diff --git a/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java b/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
index e4e8888..d3c21a2 100644
--- a/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
+++ b/src/main/java/com/ruoyi/home/service/impl/HomeServiceImpl.java
@@ -3,10 +3,18 @@
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.ruoyi.account.bean.dto.purchase.PurchaseInboundDto;
+import com.ruoyi.account.bean.dto.purchase.PurchaseReturnDto;
+import com.ruoyi.account.bean.dto.sales.SalesOutboundDto;
+import com.ruoyi.account.bean.dto.sales.SalesReturnDto;
+import com.ruoyi.account.bean.vo.purchase.PurchaseInboundVo;
+import com.ruoyi.account.bean.vo.purchase.PurchaseReturnVo;
+import com.ruoyi.account.bean.vo.sales.SalesOutboundVo;
+import com.ruoyi.account.bean.vo.sales.SalesReturnVo;
 import com.ruoyi.account.mapper.AccountStatementMapper;
 import com.ruoyi.account.mapper.purchase.AccountPurchasePaymentMapper;
 import com.ruoyi.account.mapper.sales.AccountSalesCollectionMapper;
-import com.ruoyi.account.pojo.AccountStatement;
 import com.ruoyi.account.pojo.purchase.AccountPurchasePayment;
 import com.ruoyi.account.pojo.sales.AccountSalesCollection;
 import com.ruoyi.approve.mapper.ApproveProcessMapper;
@@ -29,11 +37,13 @@
 import com.ruoyi.home.dto.*;
 import com.ruoyi.home.mapper.HomeMapper;
 import com.ruoyi.home.service.HomeService;
+import com.ruoyi.procurementrecord.mapper.ReturnManagementMapper;
 import com.ruoyi.production.bean.dto.ProductionProductOutputDto;
 import com.ruoyi.production.mapper.*;
 import com.ruoyi.project.system.domain.SysDept;
 import com.ruoyi.project.system.mapper.SysDeptMapper;
 import com.ruoyi.purchase.mapper.PurchaseLedgerMapper;
+import com.ruoyi.purchase.mapper.PurchaseReturnOrdersMapper;
 import com.ruoyi.purchase.pojo.PurchaseLedger;
 import com.ruoyi.quality.mapper.QualityInspectMapper;
 import com.ruoyi.quality.mapper.QualityUnqualifiedMapper;
@@ -45,7 +55,9 @@
 import com.ruoyi.sales.pojo.SalesLedgerProduct;
 import com.ruoyi.staff.mapper.StaffOnJobMapper;
 import com.ruoyi.staff.pojo.StaffOnJob;
+import com.ruoyi.stock.mapper.StockInRecordMapper;
 import com.ruoyi.stock.mapper.StockInventoryMapper;
+import com.ruoyi.stock.mapper.StockOutRecordMapper;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
@@ -71,6 +83,10 @@
 public class HomeServiceImpl implements HomeService {
 
     private final SalesLedgerMapper salesLedgerMapper;
+    private final StockOutRecordMapper stockOutRecordMapper;
+    private final ReturnManagementMapper returnManagementMapper;
+    private final StockInRecordMapper stockInRecordMapper;
+    private final PurchaseReturnOrdersMapper purchaseReturnOrdersMapper;
 
     private final PurchaseLedgerMapper purchaseLedgerMapper;
 
@@ -417,14 +433,26 @@
         LocalDate startDate = range[0];
         LocalDate endDate = range[1];
 
+        //閿�鍞嚭搴�
         BigDecimal receivableBase = sumSalesContractAmount(startDate, endDate);
+        //閿�鍞��璐�
+        BigDecimal salesReturnAmount = sumSalesReturnAmount(startDate, endDate);
+        //閲囪喘鍏ュ簱
         BigDecimal payableBase = sumPurchaseContractAmount(startDate, endDate);
+        //閲囪喘閫�璐�
+        BigDecimal purchaseReturnAmount = sumPurchaseReturnAmount(startDate, endDate);
+        //鏀舵
         BigDecimal advanceMoney = sumCollectionAmount(startDate, endDate);
+        //浠樻
         BigDecimal prepayMoney = sumPaymentAmount(startDate, endDate);
 
-        dto.setReceivableMoney(scaleMoney(maxZero(receivableBase.subtract(advanceMoney))));
-        dto.setPayableMoney(scaleMoney(maxZero(payableBase.subtract(prepayMoney))));
+        //搴旀敹閲戦=閿�鍞嚭搴�-閿�鍞��璐�
+        dto.setReceivableMoney(scaleMoney(maxZero(receivableBase.subtract(salesReturnAmount))));
+        //搴斾粯閲戦=閲囪喘鍏ュ簱-閲囪喘閫�璐�
+        dto.setPayableMoney(scaleMoney(maxZero(payableBase.subtract(purchaseReturnAmount))));
+        //鏀舵閲戦=鏀舵鍗�
         dto.setAdvanceMoney(scaleMoney(advanceMoney));
+        //浠樻閲戦=浠樻鍗�
         dto.setPrepayMoney(scaleMoney(prepayMoney));
         return dto;
     }
@@ -1239,33 +1267,21 @@
         YearMonth currentMonth = YearMonth.from(today);
         LocalDate startDate = currentMonth.atDay(1);
         LocalDate endDate = currentMonth.atEndOfMonth();
-
+        //鏀舵
         BigDecimal monthlyIncome = sumCollectionAmount(startDate, endDate);
+        //閿�鍞嚭搴�
         BigDecimal receivableBase = sumSalesContractAmount(startDate, endDate);
-        String collectionRate = toRateString(monthlyIncome, receivableBase);
-
-        String currentMonthText = currentMonth.toString();
-        List<AccountStatement> receivableStatements = defaultList(accountStatementMapper.selectList(
-                new LambdaQueryWrapper<AccountStatement>()
-                        .eq(AccountStatement::getAccountType, 1)
-                        .le(AccountStatement::getStatementMonth, currentMonthText)));
-
-        long overdueNum = receivableStatements.stream()
-                .filter(item -> item.getStatementMonth() != null && item.getStatementMonth().compareTo(currentMonthText) < 0)
-                .filter(item -> defaultDecimal(item.getClosingBalance()).compareTo(BigDecimal.ZERO) > 0)
-                .count();
-
-        long totalReceivableCount = receivableStatements.size();
-        String overdueRate = totalReceivableCount == 0
-                ? "0.00"
-                : BigDecimal.valueOf(overdueNum)
-                .multiply(BigDecimal.valueOf(100))
-                .divide(BigDecimal.valueOf(totalReceivableCount), 2, RoundingMode.HALF_UP)
-                .toString();
-
+        //閿�鍞��璐�
+        BigDecimal salesReturnAmount = sumSalesReturnAmount(startDate, endDate);
+        //鍥炴鐜�=鏀舵/(閿�鍞嚭搴�-閿�鍞��璐�)搴旀敹
+        String collectionRate = toRateString(monthlyIncome, receivableBase.subtract(salesReturnAmount));
+        //閫炬湡鏁�=(閿�鍞嚭搴撻噾棰�-閿�鍞��璐ч噾棰�)搴旀敹閲戦-鏀舵閲戦
+        BigDecimal overdueAmount = receivableBase.subtract(salesReturnAmount).subtract(monthlyIncome);
+        //閫炬湡鐜�=閫炬湡鏁�/搴旀敹閲戦
+        String overdueRate = toRateString(overdueAmount, receivableBase);
         dto.setMonthlyIncome(scaleMoney(monthlyIncome));
         dto.setCollectionRate(collectionRate);
-        dto.setOverdueNum(BigDecimal.valueOf(overdueNum));
+        dto.setOverdueNum(overdueAmount);
         dto.setOverdueRate(overdueRate);
         return dto;
     }
@@ -1277,16 +1293,25 @@
         YearMonth currentMonth = YearMonth.from(today);
         LocalDate startDate = currentMonth.atDay(1);
         LocalDate endDate = currentMonth.atEndOfMonth();
-
+        //鏀嚭
         BigDecimal monthlyExpenditure = sumPaymentAmount(startDate, endDate);
+        //閲囪喘鍏ュ簱
         BigDecimal payableBase = sumPurchaseContractAmount(startDate, endDate);
+        //閲囪喘閫�璐�
+        BigDecimal purchaseReturnAmount = sumPurchaseReturnAmount(startDate, endDate);
+        //浠樻鐜�=浠樻/(閲囪喘鍏ュ簱-閲囪喘閫�璐�)搴斾粯
+        String paymentRate = toRateString(monthlyExpenditure, payableBase.subtract(purchaseReturnAmount));
+        //鏀舵
         BigDecimal monthlyIncome = sumCollectionAmount(startDate, endDate);
+        //姣涘埄娑�= 鏀舵-鏀嚭
         BigDecimal grossProfit = monthlyIncome.subtract(monthlyExpenditure);
+        //鍒╂鼎鐜�=姣涘埄娑�/鏀舵
+        String profitMarginRate = toRateString(grossProfit, monthlyIncome);
 
         dto.setMonthlyExpenditure(scaleMoney(monthlyExpenditure));
-        dto.setPaymentRate(toRateString(monthlyExpenditure, payableBase));
+        dto.setPaymentRate(paymentRate);
         dto.setGrossProfit(scaleMoney(grossProfit));
-        dto.setProfitMarginRate(toRateString(grossProfit, monthlyIncome));
+        dto.setProfitMarginRate(profitMarginRate);
         return dto;
     }
 
@@ -2317,20 +2342,43 @@
         return new LocalDate[]{startDate, endDate};
     }
 
+    //璁$畻鏃ユ湡鍐呯殑閿�鍞嚭搴撻噾棰�
     private BigDecimal sumSalesContractAmount(LocalDate startDate, LocalDate endDate) {
-        List<SalesLedger> salesLedgers = defaultList(salesLedgerMapper.selectList(new LambdaQueryWrapper<SalesLedger>()
-                .ge(SalesLedger::getEntryDate, toDate(startDate))
-                .lt(SalesLedger::getEntryDate, toExclusiveEndDate(endDate))));
-        return sumAmount(salesLedgers, SalesLedger::getContractAmount);
+        SalesOutboundDto salesOutboundDto = new SalesOutboundDto();
+        salesOutboundDto.setStartDate(startDate);
+        salesOutboundDto.setEndDate(endDate);
+        List<SalesOutboundVo> salesOutboundVos = stockOutRecordMapper.listPageAccountSales(new Page(1, -1), salesOutboundDto).getRecords();
+        return sumAmount(salesOutboundVos, SalesOutboundVo::getOutboundAmount);
     }
 
+    //璁$畻鏃ユ湡鍐呯殑閿�鍞��璐ч噾棰�
+    private BigDecimal sumSalesReturnAmount(LocalDate startDate, LocalDate endDate) {
+        SalesReturnDto salesReturnDto = new SalesReturnDto();
+        salesReturnDto.setStartDate(startDate);
+        salesReturnDto.setEndDate(endDate);
+        List<SalesReturnVo> salesReturnVos = returnManagementMapper.listPageAccountSalesReturn(new Page(1, -1), salesReturnDto).getRecords();
+        return sumAmount(salesReturnVos, SalesReturnVo::getRefundAmount);
+    }
+
+    //璁$畻鏃ユ湡鍐呯殑閲囪喘鍏ュ簱閲戦
     private BigDecimal sumPurchaseContractAmount(LocalDate startDate, LocalDate endDate) {
-        List<PurchaseLedger> purchaseLedgers = defaultList(purchaseLedgerMapper.selectList(new LambdaQueryWrapper<PurchaseLedger>()
-                .ge(PurchaseLedger::getEntryDate, toDate(startDate))
-                .lt(PurchaseLedger::getEntryDate, toExclusiveEndDate(endDate))));
-        return sumAmount(purchaseLedgers, PurchaseLedger::getContractAmount);
+        PurchaseInboundDto purchaseInboundDto = new PurchaseInboundDto();
+        purchaseInboundDto.setStartDate(startDate);
+        purchaseInboundDto.setEndDate(endDate);
+        List<PurchaseInboundVo> purchaseInboundVos = stockInRecordMapper.listPageAccountPurchase(new Page(1, -1), purchaseInboundDto).getRecords();
+        return sumAmount(purchaseInboundVos, PurchaseInboundVo::getInboundAmount);
     }
 
+    //璁$畻鏃ユ湡鍐呯殑閲囪喘閫�璐ч噾棰�
+    private BigDecimal sumPurchaseReturnAmount(LocalDate startDate, LocalDate endDate) {
+        PurchaseReturnDto purchaseReturnDto = new PurchaseReturnDto();
+        purchaseReturnDto.setStartDate(startDate);
+        purchaseReturnDto.setEndDate(endDate);
+        List<PurchaseReturnVo> purchaseReturnVos = purchaseReturnOrdersMapper.listPageAccountPurchaseReturn(new Page(1, -1), purchaseReturnDto).getRecords();
+        return sumAmount(purchaseReturnVos, PurchaseReturnVo::getTotalAmount);
+    }
+
+    //璁$畻鏃ユ湡鍐呯殑鎬绘敹娆鹃噾棰�
     private BigDecimal sumCollectionAmount(LocalDate startDate, LocalDate endDate) {
         List<AccountSalesCollection> collections = defaultList(accountSalesCollectionMapper.selectList(
                 new LambdaQueryWrapper<AccountSalesCollection>()
@@ -2339,6 +2387,7 @@
         return sumAmount(collections, AccountSalesCollection::getCollectionAmount);
     }
 
+    //璁$畻鏃ユ湡鍐呯殑鎬讳粯娆鹃噾棰�
     private BigDecimal sumPaymentAmount(LocalDate startDate, LocalDate endDate) {
         List<AccountPurchasePayment> payments = defaultList(accountPurchasePaymentMapper.selectList(
                 new LambdaQueryWrapper<AccountPurchasePayment>()
diff --git a/src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerDto.java b/src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerDto.java
index cd3b9fd..22faea3 100644
--- a/src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerDto.java
+++ b/src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerDto.java
@@ -27,6 +27,8 @@
 
     private String entryDateStart;
     private String entryDateEnd;
+    @Schema(description = "鍏ュ簱鐘舵��")
+    private String stockInStatus;
 
     private Long id;
 
diff --git a/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java b/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
index 2568511..09d5d20 100644
--- a/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
@@ -451,12 +451,7 @@
 
     @Override
     public IPage<PurchaseLedgerDto> selectPurchaseLedgerListPage(IPage ipage, PurchaseLedgerDto purchaseLedger) {
-        IPage<PurchaseLedgerDto> purchaseLedgerDtoIPage = purchaseLedgerMapper.selectPurchaseLedgerListPage(ipage, purchaseLedger);
-        purchaseLedgerDtoIPage.getRecords().forEach(purchaseLedgerDto -> {
-            List<CommonFile> commonFiles = commonFileMapper.selectList(new LambdaQueryWrapper<CommonFile>().eq(CommonFile::getCommonId, purchaseLedgerDto.getId()).eq(CommonFile::getType, FileNameType.PURCHASE.getValue()));
-            purchaseLedgerDto.setSalesLedgerFiles(commonFiles);
-        });
-        return purchaseLedgerDtoIPage;
+        return purchaseLedgerMapper.selectPurchaseLedgerListPage(ipage, purchaseLedger);
     }
 
     @Override
diff --git a/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java b/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
index 08bb128..f4a42d6 100644
--- a/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
+++ b/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
@@ -149,6 +149,10 @@
     /**
      * 浜у搧鐘舵��
      */
+    @TableField(exist = false)
+    @Schema(description = "鍏ュ簱瀹℃牳鐘舵��")
+    private String stockInApprovalStatus;
+
 //    @TableField(exist = false)
     @Schema(description = "浜у搧鐘舵�侊細1-鍏呰冻")
     private Integer approveStatus;
diff --git a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
index a76b149..fe385f1 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -8,6 +8,10 @@
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.account.mapper.sales.AccountInvoiceApplicationMapper;
+import com.ruoyi.account.mapper.sales.AccountSalesCollectionMapper;
+import com.ruoyi.account.pojo.sales.AccountInvoiceApplication;
+import com.ruoyi.account.pojo.sales.AccountSalesCollection;
 import com.ruoyi.basic.enums.ApplicationTypeEnum;
 import com.ruoyi.basic.enums.RecordTypeEnum;
 import com.ruoyi.basic.mapper.CustomerMapper;
@@ -26,7 +30,9 @@
 import com.ruoyi.framework.security.LoginUser;
 import com.ruoyi.framework.web.domain.AjaxResult;
 import com.ruoyi.other.mapper.TempFileMapper;
-import com.ruoyi.production.mapper.*;
+import com.ruoyi.production.mapper.ProductionProductInputMapper;
+import com.ruoyi.production.mapper.ProductionProductMainMapper;
+import com.ruoyi.production.mapper.ProductionProductOutputMapper;
 import com.ruoyi.production.service.ProductionProductMainService;
 import com.ruoyi.project.system.domain.SysDept;
 import com.ruoyi.project.system.domain.SysUser;
@@ -36,8 +42,14 @@
 import com.ruoyi.purchase.mapper.PurchaseReturnOrderProductsMapper;
 import com.ruoyi.quality.mapper.QualityInspectMapper;
 import com.ruoyi.sales.dto.*;
-import com.ruoyi.sales.mapper.*;
-import com.ruoyi.sales.pojo.*;
+import com.ruoyi.sales.mapper.CommonFileMapper;
+import com.ruoyi.sales.mapper.SalesLedgerMapper;
+import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
+import com.ruoyi.sales.mapper.ShippingInfoMapper;
+import com.ruoyi.sales.pojo.CommonFile;
+import com.ruoyi.sales.pojo.SalesLedger;
+import com.ruoyi.sales.pojo.SalesLedgerProduct;
+import com.ruoyi.sales.pojo.ShippingInfo;
 import com.ruoyi.sales.service.ISalesLedgerService;
 import com.ruoyi.sales.vo.SalesLedgerVo;
 import lombok.RequiredArgsConstructor;
@@ -93,6 +105,8 @@
     private final QualityInspectMapper qualityInspectMapper;
     private final RedisTemplate<String, String> redisTemplate;
     private final FileUtil fileUtil;
+    private final AccountInvoiceApplicationMapper accountInvoiceApplicationMapper;
+    private final AccountSalesCollectionMapper accountSalesCollectionMapper;
 
     @Autowired
     private SysDeptMapper sysDeptMapper;
@@ -263,23 +277,37 @@
 
     @Override
     public List<MonthlyAmountDto> getAmountHalfYear(Integer type) {
-
         LocalDate now = LocalDate.now();
         List<MonthlyAmountDto> result = new ArrayList<>();
-
         for (int i = 5; i >= 0; i--) {
             YearMonth yearMonth = YearMonth.from(now.minusMonths(i));
-            LocalDateTime startTime = yearMonth.atDay(1).atStartOfDay();
-            LocalDateTime endTime = yearMonth.atEndOfMonth().atTime(23, 59, 59);
-
+            LocalDate startTime = yearMonth.atDay(1);
+            LocalDate endTime = yearMonth.atEndOfMonth();
             MonthlyAmountDto dto = new MonthlyAmountDto();
             dto.setMonth(yearMonth.format(DateTimeFormatter.ofPattern("yyyy-MM")));
-            dto.setReceiptAmount(BigDecimal.ZERO);
-            dto.setInvoiceAmount(BigDecimal.ZERO);
-
+            //鍥炴閲戦
+            List<AccountSalesCollection> accountSalesCollections = accountSalesCollectionMapper.selectList(new LambdaQueryWrapper<AccountSalesCollection>()
+                    .between(AccountSalesCollection::getCollectionDate, startTime, endTime));
+            BigDecimal totalIncome = Optional.of(
+                    accountSalesCollections.stream()
+                            .map(AccountSalesCollection::getCollectionAmount)
+                            .filter(Objects::nonNull)
+                            .reduce(BigDecimal.ZERO, BigDecimal::add)
+            ).orElse(BigDecimal.ZERO);
+            dto.setReceiptAmount(totalIncome);
+            //寮�绁ㄩ噾棰�
+            List<AccountInvoiceApplication> accountInvoiceApplications = accountInvoiceApplicationMapper.selectList(new LambdaQueryWrapper<AccountInvoiceApplication>()
+                            .eq(AccountInvoiceApplication::getStatus,1)
+                    .between(AccountInvoiceApplication::getApplyDate, startTime, endTime));
+            BigDecimal totalInvoiceAmount = Optional.of(
+                    accountInvoiceApplications.stream()
+                            .map(AccountInvoiceApplication::getInvoiceAmount)
+                            .filter(Objects::nonNull)
+                            .reduce(BigDecimal.ZERO, BigDecimal::add)
+            ).orElse(BigDecimal.ZERO);
+            dto.setInvoiceAmount(totalInvoiceAmount);
             result.add(dto);
         }
-
         return result;
     }
 
diff --git a/src/main/java/com/ruoyi/stock/controller/StockInRecordController.java b/src/main/java/com/ruoyi/stock/controller/StockInRecordController.java
index 1887b27..f4ca0cc 100644
--- a/src/main/java/com/ruoyi/stock/controller/StockInRecordController.java
+++ b/src/main/java/com/ruoyi/stock/controller/StockInRecordController.java
@@ -70,4 +70,15 @@
         return AjaxResult.success();
     }
 
+    @PostMapping("/reAudit")
+    @Log(title = "鍏ュ簱绠$悊-鍙嶅鍏ュ簱", businessType = BusinessType.UPDATE)
+    @Operation(summary = "鎵归噺鍙嶅鍏ュ簱璁板綍")
+    public AjaxResult reAudit(@RequestBody StockInRecordDto approveDto) {
+        if(CollectionUtils.isEmpty(approveDto.getIds())){
+            return AjaxResult.error("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
+        }
+        stockInRecordService.batchReAudit(approveDto.getIds());
+        return AjaxResult.success();
+    }
+
 }
diff --git a/src/main/java/com/ruoyi/stock/dto/StockInRecordDto.java b/src/main/java/com/ruoyi/stock/dto/StockInRecordDto.java
index 17d7e77..f4f03ba 100644
--- a/src/main/java/com/ruoyi/stock/dto/StockInRecordDto.java
+++ b/src/main/java/com/ruoyi/stock/dto/StockInRecordDto.java
@@ -40,4 +40,7 @@
     @Schema(description = "璁板綍ID鍒楄〃")
     private List<Long> ids;
 
+    @Schema(description = "婧愬崟鍙�")
+    private String sourceOrderNo;
+
 }
diff --git a/src/main/java/com/ruoyi/stock/service/StockInRecordService.java b/src/main/java/com/ruoyi/stock/service/StockInRecordService.java
index 249f261..117b70f 100644
--- a/src/main/java/com/ruoyi/stock/service/StockInRecordService.java
+++ b/src/main/java/com/ruoyi/stock/service/StockInRecordService.java
@@ -23,4 +23,6 @@
     void exportStockInRecord(HttpServletResponse response, StockInRecordDto stockInRecordDto);
 
     int batchApprove(List<Long> ids, Integer approvalStatus);
+
+    int batchReAudit(List<Long> ids);
 }
diff --git a/src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java b/src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java
index 91bce0d..e718611 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java
+++ b/src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java
@@ -156,6 +156,32 @@
         return stockUninventoryMapper.selectOne(eq);
     }
 
+    /**
+     * 鍥炴粴鐢熶骇閫�鏂欏叆搴撶殑棰嗘枡璁板綍閫�鏂欐暟閲�
+     * @param stockInRecord 鍏ュ簱璁板綍
+     */
+    private void rollbackFeedReturnQty(StockInRecord stockInRecord) {
+        ProductionOrderPick productionOrderPick = productionOrderPickMapper.selectById(stockInRecord.getRecordId());
+        if (productionOrderPick != null) {
+            BigDecimal returnQty = productionOrderPick.getReturnQty();
+            if (returnQty == null) {
+                returnQty = BigDecimal.ZERO;
+            }
+            BigDecimal newReturnQty = returnQty.subtract(stockInRecord.getStockInNum());
+            if (newReturnQty.compareTo(BigDecimal.ZERO) < 0) {
+                newReturnQty = BigDecimal.ZERO;
+            }
+            productionOrderPick.setReturnQty(newReturnQty);
+            // 閲嶆柊璁$畻瀹為檯鐢ㄩ噺
+            BigDecimal actualQty = productionOrderPick.getQuantity().add(
+                productionOrderPick.getFeedingQty() != null ? productionOrderPick.getFeedingQty() : BigDecimal.ZERO)
+                .subtract(newReturnQty);
+            productionOrderPick.setActualQty(actualQty);
+            productionOrderPick.setReturned(newReturnQty.compareTo(BigDecimal.ZERO) > 0);
+            productionOrderPickMapper.updateById(productionOrderPick);
+        }
+    }
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public int batchDeletePending(List<Long> ids) {
@@ -166,6 +192,11 @@
             }
             if (stockInRecord.getApprovalStatus() != null && !ReviewStatusEnum.PENDING_REVIEW.getCode().equals(stockInRecord.getApprovalStatus())) {
                 throw new BaseException("鍙湁寰呭鎵圭姸鎬佺殑璁板綍鎵嶈兘鍒犻櫎,鍏ュ簱鎵规:" + stockInRecord.getInboundBatches());
+            }
+
+            // 濡傛灉鏄敓浜ч��鏂欏叆搴擄紝鍒犻櫎鏃堕渶瑕佸洖婊氶鏂欒褰曠殑閫�鏂欐暟閲�
+            if (StockInQualifiedRecordTypeEnum.FEED_RETURN_IN.getCode().equals(stockInRecord.getRecordType())) {
+                rollbackFeedReturnQty(stockInRecord);
             }
         }
         return stockInRecordMapper.deleteBatchIds(ids);
@@ -194,27 +225,7 @@
             // 瀹℃壒椹冲洖鏃讹紝濡傛灉鏄敓浜ч��鏂欏叆搴擄紝闇�瑕佸洖婊氶鏂欒褰曠殑閫�鏂欐暟閲�
             if (ReviewStatusEnum.REJECTED.getCode().equals(approvalStatus) &&
                 StockInQualifiedRecordTypeEnum.FEED_RETURN_IN.getCode().equals(stockInRecord.getRecordType())) {
-                // 鎵惧埌瀵瑰簲鐨勯鏂欒褰�
-                ProductionOrderPick productionOrderPick = productionOrderPickMapper.selectById(stockInRecord.getRecordId());
-                if (productionOrderPick != null) {
-                    // 鍥炴粴閫�鏂欐暟閲�
-                    BigDecimal returnQty = productionOrderPick.getReturnQty();
-                    if (returnQty == null) {
-                        returnQty = BigDecimal.ZERO;
-                    }
-                    BigDecimal newReturnQty = returnQty.subtract(stockInRecord.getStockInNum());
-                    if (newReturnQty.compareTo(BigDecimal.ZERO) < 0) {
-                        newReturnQty = BigDecimal.ZERO;
-                    }
-                    productionOrderPick.setReturnQty(newReturnQty);
-                    // 閲嶆柊璁$畻瀹為檯鐢ㄩ噺
-                    BigDecimal actualQty = productionOrderPick.getQuantity().add(
-                        productionOrderPick.getFeedingQty() != null ? productionOrderPick.getFeedingQty() : BigDecimal.ZERO)
-                        .subtract(newReturnQty);
-                    productionOrderPick.setActualQty(actualQty);
-                    productionOrderPick.setReturned(newReturnQty.compareTo(BigDecimal.ZERO) > 0);
-                    productionOrderPickMapper.updateById(productionOrderPick);
-                }
+                rollbackFeedReturnQty(stockInRecord);
             }
 
             // 瀹℃壒閫氳繃鏃讹紝搴撳瓨澧炲姞
@@ -262,4 +273,50 @@
         }
         return ids.size();
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public int batchReAudit(List<Long> ids) {
+        if (CollectionUtils.isEmpty(ids)) {
+            throw new BaseException("璇烽�夋嫨鑷冲皯涓�鏉℃暟鎹�");
+        }
+
+        for (Long id : ids) {
+            StockInRecord stockInRecord = stockInRecordMapper.selectById(id);
+            if (stockInRecord == null) {
+                throw new BaseException("鍏ュ簱璁板綍涓嶅瓨鍦�,鏃犳硶閲嶆柊瀹℃牳!!!");
+            }
+            // 鍙湁椹冲洖鐘舵�佹墠鑳介噸鏂板鏍�
+            if (!ReviewStatusEnum.REJECTED.getCode().equals(stockInRecord.getApprovalStatus())) {
+                throw new BaseException("鍙湁椹冲洖鐘舵�佺殑璁板綍鎵嶈兘閲嶆柊瀹℃牳,鍏ュ簱鎵规:" + stockInRecord.getInboundBatches());
+            }
+
+            // 濡傛灉鏄敓浜ч��鏂欏叆搴擄紝鎭㈠閫�鏂欐暟閲忥紙鍥犱负椹冲洖鏃跺凡鎵e噺锛�
+            if (StockInQualifiedRecordTypeEnum.FEED_RETURN_IN.getCode().equals(stockInRecord.getRecordType())) {
+                ProductionOrderPick productionOrderPick = productionOrderPickMapper.selectById(stockInRecord.getRecordId());
+                if (productionOrderPick != null) {
+                    BigDecimal returnQty = productionOrderPick.getReturnQty();
+                    if (returnQty == null) {
+                        returnQty = BigDecimal.ZERO;
+                    }
+                    // 閲嶆柊瀹℃牳鏃舵仮澶嶉��鏂欐暟閲�
+                    BigDecimal newReturnQty = returnQty.add(stockInRecord.getStockInNum());
+                    productionOrderPick.setReturnQty(newReturnQty);
+                    // 閲嶆柊璁$畻瀹為檯鐢ㄩ噺
+                    BigDecimal actualQty = productionOrderPick.getQuantity().add(
+                        productionOrderPick.getFeedingQty() != null ? productionOrderPick.getFeedingQty() : BigDecimal.ZERO)
+                        .subtract(newReturnQty);
+                    productionOrderPick.setActualQty(actualQty);
+                    productionOrderPick.setReturned(newReturnQty.compareTo(BigDecimal.ZERO) > 0);
+                    productionOrderPickMapper.updateById(productionOrderPick);
+                }
+            }
+
+            // 灏嗙姸鎬佹敼涓哄緟瀹℃牳
+            stockInRecord.setApprovalStatus(ReviewStatusEnum.PENDING_REVIEW.getCode());
+            stockInRecordMapper.updateById(stockInRecord);
+        }
+
+        return ids.size();
+    }
 }
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index ad66a65..70324c6 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -3,7 +3,7 @@
   main:
     allow-circular-references: true
   profiles:
-    active: dev-pro
+    active: dev
 langchain4j:
   mcp:
     # MCP 鏈嶅姟绔湴鍧�锛堟牴鎹疄闄呴儴缃茬殑 MCP 鏈嶅姟璋冩暣锛�
diff --git a/src/main/resources/mapper/purchase/PurchaseLedgerMapper.xml b/src/main/resources/mapper/purchase/PurchaseLedgerMapper.xml
index ecdd1f3..a818160 100644
--- a/src/main/resources/mapper/purchase/PurchaseLedgerMapper.xml
+++ b/src/main/resources/mapper/purchase/PurchaseLedgerMapper.xml
@@ -17,56 +17,118 @@
     </select>
 
     <select id="selectPurchaseLedgerListPage" resultType="com.ruoyi.purchase.dto.PurchaseLedgerDto">
-        SELECT
-        pl.id,
-        pl.purchase_contract_number,
-        pl.sales_contract_no,
-        pl.supplier_id,
-        pl.supplier_name,
-        pl.project_name,
-        pl.contract_amount,
-        pl.entry_date,
-        pl.execution_date,
-        pl.recorder_id,
-        pl.recorder_name,
-        pl.template_name,
-        pl.approve_user_ids,
-        sm.is_white,
-        pl.approval_status,
-        pl.payment_method,
-        pl.remarks
-        FROM purchase_ledger pl
-        LEFT JOIN supplier_manage sm ON pl.supplier_id = sm.id
-        <where>
-            <if test="c.purchaseContractNumber != null and c.purchaseContractNumber != ''">
-                AND pl.purchase_contract_number LIKE CONCAT('%', #{c.purchaseContractNumber}, '%')
-            </if>
-            <if test="c.approvalStatus != null and c.approvalStatus != ''">
-                AND pl.approval_status = #{c.approvalStatus}
-            </if>
-            <if test="c.supplierName != null and c.supplierName != ''">
-                AND pl.supplier_name LIKE CONCAT('%', #{c.supplierName}, '%')
-            </if>
-            <if test="c.salesContractNo != null and c.salesContractNo != ''">
-                AND pl.sales_contract_no LIKE CONCAT('%', #{c.salesContractNo}, '%')
-            </if>
-            <if test="c.projectName != null and c.projectName != ''">
-                AND pl.project_name LIKE CONCAT('%', #{c.projectName}, '%')
-            </if>
-            <if test="c.entryDateStart != null and c.entryDateStart != ''">
-                AND pl.entry_date &gt;= #{c.entryDateStart}
-            </if>
-            <if test="c.entryDateEnd != null and c.entryDateEnd != ''">
-                AND pl.entry_date &lt;= #{c.entryDateEnd}
-            </if>
-            <if test="c.supplierId != null">
-                AND pl.supplier_id = #{c.supplierId}
-            </if>
-            <if test="c.approvalStatus != null">
-                AND pl.approval_status = #{c.approvalStatus}
-            </if>
-        </where>
-        ORDER BY pl.entry_date DESC
+        SELECT result.*
+        FROM (
+            SELECT
+                pl.id,
+                pl.purchase_contract_number,
+                pl.sales_contract_no,
+                pl.supplier_id,
+                pl.supplier_name,
+                pl.project_name,
+                pl.contract_amount,
+                pl.entry_date,
+                pl.execution_date,
+                pl.recorder_id,
+                pl.recorder_name,
+                pl.template_name,
+                pl.approve_user_ids,
+                sm.is_white,
+                pl.approval_status,
+                pl.payment_method,
+                pl.remarks,
+                CASE
+                    WHEN IFNULL(ls.total_product_count, 0) = 0 THEN '寰呭叆搴�'
+                    WHEN IFNULL(ls.full_product_count, 0) &gt;= IFNULL(ls.total_product_count, 0) THEN '瀹屽叏鍏ュ簱'
+                    WHEN IFNULL(ls.approved_product_count, 0) &gt; 0 THEN '鍏ュ簱涓�'
+                    ELSE '寰呭叆搴�'
+                END AS stock_in_status
+            FROM purchase_ledger pl
+            LEFT JOIN supplier_manage sm ON pl.supplier_id = sm.id
+            LEFT JOIN (
+                SELECT
+                    product_status.sales_ledger_id,
+                    COUNT(1) AS total_product_count,
+                    SUM(CASE WHEN product_status.approved_stock_in_num &gt; 0 THEN 1 ELSE 0 END) AS approved_product_count,
+                    SUM(CASE WHEN product_status.approved_stock_in_num &gt;= product_status.product_quantity THEN 1 ELSE 0 END) AS full_product_count
+                FROM (
+                    SELECT
+                        slp.id AS sales_ledger_product_id,
+                        slp.sales_ledger_id,
+                        IFNULL(slp.quantity, 0) AS product_quantity,
+                        IFNULL(approved_qty.approved_stock_in_num, 0) AS approved_stock_in_num
+                    FROM sales_ledger_product slp
+                    LEFT JOIN (
+                        SELECT rel.sales_ledger_product_id,
+                               IFNULL(SUM(rel.stock_in_num), 0) AS approved_stock_in_num
+                        FROM (
+                            SELECT slp.id AS sales_ledger_product_id,
+                                   sir.stock_in_num
+                            FROM stock_in_record sir
+                            INNER JOIN sales_ledger_product slp
+                                ON slp.type = 2
+                                AND TRIM(sir.record_type) = '7'
+                                AND sir.record_id = slp.sales_ledger_id
+                                AND (
+                                    (sir.batch_no IS NOT NULL AND sir.batch_no LIKE CONCAT('%-', slp.id))
+                                    OR (sir.batch_no IS NULL AND sir.product_model_id = slp.product_model_id)
+                                )
+                            WHERE sir.approval_status = 1
+
+                            UNION ALL
+
+                            SELECT slp.id AS sales_ledger_product_id,
+                                   sir.stock_in_num
+                            FROM stock_in_record sir
+                            INNER JOIN quality_inspect qi
+                                ON TRIM(sir.record_type) = '10'
+                                AND sir.record_id = qi.id
+                            INNER JOIN sales_ledger_product slp
+                                ON slp.type = 2
+                                AND slp.sales_ledger_id = qi.purchase_ledger_id
+                                AND slp.product_model_id = qi.product_model_id
+                            WHERE sir.approval_status = 1
+                        ) rel
+                        GROUP BY rel.sales_ledger_product_id
+                    ) approved_qty ON approved_qty.sales_ledger_product_id = slp.id
+                    WHERE slp.type = 2
+                ) product_status
+                GROUP BY product_status.sales_ledger_id
+            ) ls ON ls.sales_ledger_id = pl.id
+            <where>
+                <if test="c.purchaseContractNumber != null and c.purchaseContractNumber != ''">
+                    AND pl.purchase_contract_number LIKE CONCAT('%', #{c.purchaseContractNumber}, '%')
+                </if>
+                <if test="c.approvalStatus != null and c.approvalStatus != ''">
+                    AND pl.approval_status = #{c.approvalStatus}
+                </if>
+                <if test="c.supplierName != null and c.supplierName != ''">
+                    AND pl.supplier_name LIKE CONCAT('%', #{c.supplierName}, '%')
+                </if>
+                <if test="c.salesContractNo != null and c.salesContractNo != ''">
+                    AND pl.sales_contract_no LIKE CONCAT('%', #{c.salesContractNo}, '%')
+                </if>
+                <if test="c.projectName != null and c.projectName != ''">
+                    AND pl.project_name LIKE CONCAT('%', #{c.projectName}, '%')
+                </if>
+                <if test="c.entryDateStart != null and c.entryDateStart != ''">
+                    AND pl.entry_date &gt;= #{c.entryDateStart}
+                </if>
+                <if test="c.entryDateEnd != null and c.entryDateEnd != ''">
+                    AND pl.entry_date &lt;= #{c.entryDateEnd}
+                </if>
+                <if test="c.supplierId != null">
+                    AND pl.supplier_id = #{c.supplierId}
+                </if>
+                <if test="c.approvalStatus != null">
+                    AND pl.approval_status = #{c.approvalStatus}
+                </if>
+            </where>
+        ) result
+        <if test="c.stockInStatus != null and c.stockInStatus != ''">
+            WHERE result.stock_in_status = #{c.stockInStatus}
+        </if>
+        ORDER BY result.entry_date DESC
     </select>
 
     <select id="selectTotalPurchaseAmount" resultType="java.math.BigDecimal">
diff --git a/src/main/resources/mapper/sales/SalesLedgerProductMapper.xml b/src/main/resources/mapper/sales/SalesLedgerProductMapper.xml
index 7eb7b79..49569de 100644
--- a/src/main/resources/mapper/sales/SalesLedgerProductMapper.xml
+++ b/src/main/resources/mapper/sales/SalesLedgerProductMapper.xml
@@ -38,7 +38,13 @@
          WHEN IFNULL(t3.shipped_quantity, 0) = 0 THEN '寰呭彂璐�'
          WHEN (IFNULL(T1.quantity, 0) - IFNULL(t3.shipped_quantity, 0)) > 0 THEN '閮ㄥ垎鍙戣揣'
         ELSE '宸插彂璐�'
-        END as shippingStatus
+        END as shippingStatus,
+        CASE
+         WHEN T1.type != 2 THEN NULL
+         WHEN IFNULL(t4.approved_stock_in_num, 0) &lt;= 0 THEN '寰呭叆搴�'
+         WHEN IFNULL(t4.approved_stock_in_num, 0) &gt;= IFNULL(T1.quantity, 0) THEN '瀹屽叏鍏ュ簱'
+        ELSE '鍏ュ簱涓�'
+        END AS stock_in_approval_status
         FROM
         sales_ledger_product T1
         LEFT JOIN (
@@ -53,6 +59,39 @@
         where si.status != '瀹℃牳鎷掔粷'
         GROUP BY sales_ledger_product_id
         ) t3 ON t3.sales_ledger_product_id = T1.id
+        LEFT JOIN (
+        SELECT rel.sales_ledger_product_id,
+               IFNULL(SUM(rel.stock_in_num), 0) AS approved_stock_in_num
+        FROM (
+            SELECT slp.id AS sales_ledger_product_id,
+                   sir.stock_in_num
+            FROM stock_in_record sir
+            INNER JOIN sales_ledger_product slp
+                ON slp.type = 2
+                AND TRIM(sir.record_type) = '7'
+                AND sir.record_id = slp.sales_ledger_id
+                AND (
+                    (sir.batch_no IS NOT NULL AND sir.batch_no LIKE CONCAT('%-', slp.id))
+                    OR (sir.batch_no IS NULL AND sir.product_model_id = slp.product_model_id)
+                )
+            WHERE sir.approval_status = 1
+
+            UNION ALL
+
+            SELECT slp.id AS sales_ledger_product_id,
+                   sir.stock_in_num
+            FROM stock_in_record sir
+            INNER JOIN quality_inspect qi
+                ON TRIM(sir.record_type) = '10'
+                AND sir.record_id = qi.id
+            INNER JOIN sales_ledger_product slp
+                ON slp.type = 2
+                AND slp.sales_ledger_id = qi.purchase_ledger_id
+                AND slp.product_model_id = qi.product_model_id
+            WHERE sir.approval_status = 1
+        ) rel
+        GROUP BY rel.sales_ledger_product_id
+        ) t4 ON t4.sales_ledger_product_id = T1.id
         left join product_model pm ON T1.product_model_id = pm.id
         left join product p ON pm.product_id = p.id
         <where>
diff --git a/src/main/resources/mapper/stock/StockInRecordMapper.xml b/src/main/resources/mapper/stock/StockInRecordMapper.xml
index 5545c1e..a3bf3f9 100644
--- a/src/main/resources/mapper/stock/StockInRecordMapper.xml
+++ b/src/main/resources/mapper/stock/StockInRecordMapper.xml
@@ -19,11 +19,96 @@
         p.product_name as product_name,
         pm.model,
         pm.unit,
-        u.nick_name as createBy
+        u.nick_name as createBy,
+        CASE
+            WHEN #{params.topParentProductId} = 278 AND TRIM(sir.record_type) = '7' THEN
+                COALESCE(pl_by_product.purchase_contract_number, pl_direct.purchase_contract_number)
+            WHEN #{params.topParentProductId} = 278 AND TRIM(sir.record_type) = '10' THEN
+                pl_by_quality.purchase_contract_number
+            WHEN #{params.topParentProductId} = 276 THEN
+                CASE
+                    WHEN TRIM(sir.record_type) IN ('14', '15') THEN
+                        sl_return.sales_contract_no
+                    WHEN TRIM(sir.record_type) IN ('2', '5') THEN
+                        COALESCE(po_sales_main.sales_contract_no, po_main.nps_no)
+                    WHEN TRIM(sir.record_type) = '6' THEN
+                        COALESCE(po_sales_qi.sales_contract_no, po_qi.nps_no)
+                    WHEN TRIM(sir.record_type) IN ('4', '11') THEN
+                        COALESCE(po_sales_uq.sales_contract_no, po_uq.nps_no)
+                    WHEN TRIM(sir.record_type) IN ('20', '22') THEN
+                        COALESCE(po_sales_pick.sales_contract_no, po_pick.nps_no)
+                    ELSE NULL
+                END
+            ELSE NULL
+        END AS sourceOrderNo
         FROM stock_in_record as sir
         LEFT JOIN product_model as pm on sir.product_model_id = pm.id
         LEFT JOIN product as p on pm.product_id = p.id
         LEFT JOIN sys_user as u on sir.create_user = u.user_id
+        LEFT JOIN quality_inspect as qi_purchase on TRIM(sir.record_type) = '10' and sir.record_id = qi_purchase.id
+        LEFT JOIN sales_ledger_product as slp on TRIM(sir.record_type) = '7' and slp.id = sir.record_id and slp.type = 2
+        LEFT JOIN purchase_ledger as pl_by_product on TRIM(sir.record_type) = '7' and pl_by_product.id = slp.sales_ledger_id
+        LEFT JOIN purchase_ledger as pl_direct on TRIM(sir.record_type) = '7' and pl_direct.id = sir.record_id
+        LEFT JOIN purchase_ledger as pl_by_quality on TRIM(sir.record_type) = '10' and pl_by_quality.id = qi_purchase.purchase_ledger_id
+
+        LEFT JOIN production_product_main as ppm_main on TRIM(sir.record_type) IN ('2', '5') and sir.record_id = ppm_main.id
+        LEFT JOIN production_operation_task as pot_main on ppm_main.production_operation_task_id = pot_main.id
+        LEFT JOIN production_order as po_main on pot_main.production_order_id = po_main.id
+        LEFT JOIN (
+            select po2.id as production_order_id,
+                   group_concat(distinct sl2.sales_contract_no order by sl2.sales_contract_no separator ',') as sales_contract_no
+            from production_order po2
+                     left join production_plan pp2
+                               on find_in_set(pp2.id, replace(replace(replace(po2.production_plan_ids, '[', ''), ']', ''), ' ', '')) > 0
+                     left join sales_ledger sl2 on sl2.id = pp2.sales_ledger_id
+            group by po2.id
+        ) as po_sales_main on po_sales_main.production_order_id = po_main.id
+
+        LEFT JOIN quality_inspect as qi_prod on TRIM(sir.record_type) = '6' and sir.record_id = qi_prod.id
+        LEFT JOIN production_product_main as ppm_qi on qi_prod.product_main_id = ppm_qi.id
+        LEFT JOIN production_operation_task as pot_qi on ppm_qi.production_operation_task_id = pot_qi.id
+        LEFT JOIN production_order as po_qi on pot_qi.production_order_id = po_qi.id
+        LEFT JOIN (
+            select po2.id as production_order_id,
+                   group_concat(distinct sl2.sales_contract_no order by sl2.sales_contract_no separator ',') as sales_contract_no
+            from production_order po2
+                     left join production_plan pp2
+                               on find_in_set(pp2.id, replace(replace(replace(po2.production_plan_ids, '[', ''), ']', ''), ' ', '')) > 0
+                     left join sales_ledger sl2 on sl2.id = pp2.sales_ledger_id
+            group by po2.id
+        ) as po_sales_qi on po_sales_qi.production_order_id = po_qi.id
+
+        LEFT JOIN quality_unqualified as qu on TRIM(sir.record_type) IN ('4', '11') and sir.record_id = qu.id
+        LEFT JOIN quality_inspect as qi_uq on qu.inspect_id = qi_uq.id
+        LEFT JOIN production_product_main as ppm_uq on qi_uq.product_main_id = ppm_uq.id
+        LEFT JOIN production_operation_task as pot_uq on ppm_uq.production_operation_task_id = pot_uq.id
+        LEFT JOIN production_order as po_uq on pot_uq.production_order_id = po_uq.id
+        LEFT JOIN (
+            select po2.id as production_order_id,
+                   group_concat(distinct sl2.sales_contract_no order by sl2.sales_contract_no separator ',') as sales_contract_no
+            from production_order po2
+                     left join production_plan pp2
+                               on find_in_set(pp2.id, replace(replace(replace(po2.production_plan_ids, '[', ''), ']', ''), ' ', '')) > 0
+                     left join sales_ledger sl2 on sl2.id = pp2.sales_ledger_id
+            group by po2.id
+        ) as po_sales_uq on po_sales_uq.production_order_id = po_uq.id
+
+        LEFT JOIN production_order_pick as pop on TRIM(sir.record_type) IN ('20', '22') and sir.record_id = pop.id
+        LEFT JOIN production_order as po_pick on pop.production_order_id = po_pick.id
+        LEFT JOIN (
+            select po2.id as production_order_id,
+                   group_concat(distinct sl2.sales_contract_no order by sl2.sales_contract_no separator ',') as sales_contract_no
+            from production_order po2
+                     left join production_plan pp2
+                               on find_in_set(pp2.id, replace(replace(replace(po2.production_plan_ids, '[', ''), ']', ''), ' ', '')) > 0
+                     left join sales_ledger sl2 on sl2.id = pp2.sales_ledger_id
+            group by po2.id
+        ) as po_sales_pick on po_sales_pick.production_order_id = po_pick.id
+
+        LEFT JOIN return_sale_product as rsp on TRIM(sir.record_type) IN ('14', '15') and sir.record_id = rsp.id
+        LEFT JOIN return_management as rm on rsp.return_management_id = rm.id
+        LEFT JOIN shipping_info as si_return on rm.shipping_id = si_return.id
+        LEFT JOIN sales_ledger as sl_return on si_return.sales_ledger_id = sl_return.id
         <where>
             <if test="params.timeStr != null and params.timeStr != ''">
                 and sir.create_time like concat('%',#{params.timeStr},'%')

--
Gitblit v1.9.3