From 46944d762174e5b7e7a627c59928e2a3c9e03dd4 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期六, 30 五月 2026 15:23:11 +0800
Subject: [PATCH] feat(quality): 增加检验管理功能并完善库存预警

---
 src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java   |   18 ++
 src/main/resources/mapper/sales/SalesLedgerMapper.xml                         |    4 
 src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java  |   62 +++++++
 docs/检验管理-批量快速检验-联调文档.md                                                      |   85 ++++++++++
 src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java                    |    3 
 src/main/java/com/ruoyi/measuringinstrumentledger/pojo/SpareParts.java        |    4 
 src/main/resources/mapper/purchase/PurchaseLedgerMapper.xml                   |    1 
 src/main/java/com/ruoyi/sales/pojo/SalesLedger.java                           |    3 
 docs/销售台账-采购合同号-联调文档.md                                                       |   99 ++++++++++++
 src/main/java/com/ruoyi/device/service/impl/DeviceRepairServiceImpl.java      |   14 +
 src/main/resources/mapper/measuringinstrumentledger/SparePartsMapper.xml      |    3 
 src/main/java/com/ruoyi/device/service/impl/DeviceMaintenanceServiceImpl.java |   14 +
 src/main/java/com/ruoyi/sales/vo/SalesLedgerVo.java                           |    4 
 src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java     |    2 
 src/main/java/com/ruoyi/project/system/service/ISysNoticeService.java         |    1 
 src/main/java/com/ruoyi/purchase/pojo/PurchaseLedger.java                     |    3 
 docs/quality_inspect_add_sales_ledger_id.sql                                  |    4 
 src/main/java/com/ruoyi/quality/service/IQualityInspectService.java           |    6 
 src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerDto.java                   |    2 
 src/main/java/com/ruoyi/measuringinstrumentledger/dto/SparePartsDto.java      |    3 
 src/main/java/com/ruoyi/sales/dto/ShippingInfoDto.java                        |    3 
 src/main/resources/mapper/sales/ShippingInfoMapper.xml                        |    7 
 src/main/java/com/ruoyi/quality/pojo/QualityInspect.java                      |    5 
 src/main/java/com/ruoyi/sales/pojo/ShippingInfo.java                          |    4 
 docs/sales_ledger_add_purchase_ledger_id.sql                                  |   13 +
 docs/出厂检验-销售订单-联调文档.md                                                        |   94 +++++++++++
 src/main/resources/mapper/quality/QualityInspectMapper.xml                    |    6 
 src/main/java/com/ruoyi/quality/controller/QualityInspectController.java      |   10 +
 src/main/java/com/ruoyi/stock/service/impl/StockUninventoryServiceImpl.java   |    2 
 29 files changed, 473 insertions(+), 6 deletions(-)

diff --git a/docs/quality_inspect_add_sales_ledger_id.sql b/docs/quality_inspect_add_sales_ledger_id.sql
new file mode 100644
index 0000000..61973e9
--- /dev/null
+++ b/docs/quality_inspect_add_sales_ledger_id.sql
@@ -0,0 +1,4 @@
+-- 鍑哄巶妫�楠岀粦瀹氶攢鍞鍗�
+-- 鍦� quality_inspect 琛ㄦ柊澧� sales_ledger_id 瀛楁
+ALTER TABLE quality_inspect
+    ADD COLUMN sales_ledger_id BIGINT DEFAULT NULL COMMENT '閿�鍞彴璐d锛堝嚭鍘傛楠岀粦瀹氶攢鍞鍗曪級';
diff --git a/docs/sales_ledger_add_purchase_ledger_id.sql b/docs/sales_ledger_add_purchase_ledger_id.sql
new file mode 100644
index 0000000..2b99cf1
--- /dev/null
+++ b/docs/sales_ledger_add_purchase_ledger_id.sql
@@ -0,0 +1,13 @@
+-- ============================================================
+-- 閿�鍞彴璐�(sales_ledger)娣诲姞閲囪喘鍙拌处鍏宠仈瀛楁
+-- 璇存槑锛氶攢鍞彴璐﹀叧鑱旈噰璐彴璐︼紝鐢ㄤ簬鍦ㄩ攢鍞彴璐﹀垪琛ㄤ腑灞曠ず閲囪喘鍚堝悓鍙�
+-- 鎵ц鍓嶈澶囦唤鏁版嵁搴�
+-- ============================================================
+
+-- 1. 娣诲姞閲囪喘鍙拌处id瀛楁
+ALTER TABLE sales_ledger
+ADD COLUMN purchase_ledger_id BIGINT NULL COMMENT '閲囪喘鍙拌处id'
+AFTER delivery_date;
+
+-- 2. 娣诲姞绱㈠紩锛堝彲閫夛紝濡傞渶鎸夐噰璐彴璐d鏌ヨ鏃跺缓璁坊鍔狅級
+-- ALTER TABLE sales_ledger ADD INDEX idx_purchase_ledger_id (purchase_ledger_id);
\ No newline at end of file
diff --git "a/docs/\345\207\272\345\216\202\346\243\200\351\252\214-\351\224\200\345\224\256\350\256\242\345\215\225-\350\201\224\350\260\203\346\226\207\346\241\243.md" "b/docs/\345\207\272\345\216\202\346\243\200\351\252\214-\351\224\200\345\224\256\350\256\242\345\215\225-\350\201\224\350\260\203\346\226\207\346\241\243.md"
new file mode 100644
index 0000000..e90efc9
--- /dev/null
+++ "b/docs/\345\207\272\345\216\202\346\243\200\351\252\214-\351\224\200\345\224\256\350\256\242\345\215\225-\350\201\224\350\260\203\346\226\207\346\241\243.md"
@@ -0,0 +1,94 @@
+# 鍑哄巶妫�楠� - 閿�鍞鍗曠粦瀹氳仈璋冩枃妗�
+
+## 鍙樻洿姒傝堪
+
+鍑哄巶妫�楠岋紙`inspectType = 2`锛夋敮鎸佺洿鎺ョ粦瀹氶攢鍞鍗曪紝鏃犻渶閫氳繃鐢熶骇宸ュ崟閾捐矾鑾峰彇閿�鍞悎鍚屽彿銆�
+
+## 涓�銆佹暟鎹簱鍙樻洿
+
+鎵ц `docs/quality_inspect_add_sales_ledger_id.sql`锛�
+
+```sql
+ALTER TABLE quality_inspect
+    ADD COLUMN sales_ledger_id BIGINT DEFAULT NULL COMMENT '閿�鍞彴璐d锛堝嚭鍘傛楠岀粦瀹氶攢鍞鍗曪級';
+```
+
+## 浜屻�佸悗绔帴鍙e彉鏇�
+
+### 2.1 鏂板/缂栬緫鍑哄巶妫�楠�
+
+**POST** `/quality/qualityInspect/add`
+**POST** `/quality/qualityInspect/update`
+
+鏂板瀛楁锛�
+
+| 瀛楁 | 绫诲瀷 | 蹇呭~ | 璇存槑 |
+|------|------|------|------|
+| `salesLedgerId` | Long | 鍚� | 閿�鍞彴璐D锛屽嚭鍘傛楠屾椂閫夋嫨缁戝畾鐨勯攢鍞鍗� |
+
+璇锋眰浣撶ず渚嬶細
+
+```json
+{
+    "inspectType": 2,
+    "salesLedgerId": 1001,
+    "checkTime": "2026-05-30",
+    "customer": "瀹㈡埛鍚嶇О",
+    "productName": "浜у搧A",
+    ...
+}
+```
+
+### 2.2 鍒楄〃鏌ヨ
+
+**GET** `/quality/qualityInspect/listPage?inspectType=2`
+
+杩斿洖瀛楁涓嶅彉锛宍salesContractNo` 鐜板湪浼樺厛浠庣洿鎺ョ粦瀹氱殑 `sales_ledger_id` 鑾峰彇锛屼负绌烘椂鍥為��鍒扮敓浜у伐鍗曢摼璺��
+
+```json
+{
+    "records": [
+        {
+            "id": 1,
+            "inspectType": 2,
+            "salesLedgerId": 1001,
+            "salesContractNo": "XS-2026-0001",
+            "workOrderNo": "GD-2026-001",
+            ...
+        }
+    ]
+}
+```
+
+| 瀛楁 | 绫诲瀷 | 璇存槑 |
+|------|------|------|
+| `salesLedgerId` | Long | 缁戝畾鐨勯攢鍞彴璐D |
+| `salesContractNo` | String | 閿�鍞悎鍚屽彿锛堝瓧绗︿覆锛屼紭鍏堝彇鐩存帴缁戝畾锛� |
+| `workOrderNo` | String | 宸ュ崟鍙凤紙閫氳繃鎶ュ伐閾捐矾鑾峰彇锛屽嚭鍘傛楠屽彲鑳戒负绌猴級 |
+
+## 涓夈�佸墠绔鎺ヨ鐐�
+
+### 3.1 鍑哄巶妫�楠岃〃鍗�
+
+鍦ㄥ嚭鍘傛楠岋紙`inspectType = 2`锛夌殑鏂板/缂栬緫琛ㄥ崟涓紝鏂板"閿�鍞鍗�"閫夋嫨鍣細
+
+- **瀛楁鍚�**锛歚salesLedgerId`
+- **缁勪欢绫诲瀷**锛氫笅鎷夐�夋嫨 / 寮圭獥閫夋嫨
+- **鏁版嵁婧�**锛氳皟鐢ㄩ攢鍞彴璐﹀垪琛ㄦ帴鍙o紝灞曠ず `salesContractNo`锛堥攢鍞悎鍚屽彿锛�
+- **鏄剧ず鍊�**锛氶攢鍞悎鍚屽彿
+- **缁戝畾鍊�**锛氶攢鍞彴璐� `id`
+- **浜や簰寤鸿**锛氬嚭鍘傛楠屾椂锛屽厑璁哥敤鎴风洿鎺ユ悳绱�/閫夋嫨閿�鍞鍗曪紝閫変腑鍚庤嚜鍔ㄥ~鍏� `salesLedgerId`
+
+### 3.2 鍒楄〃椤�
+
+鍑哄巶妫�楠屽垪琛ㄩ〉宸叉湁 `salesContractNo` 鍒楋紝鏃犻渶棰濆鏀瑰姩銆傚悗绔凡鑷姩杩斿洖鐩存帴缁戝畾鐨勯攢鍞悎鍚屽彿銆�
+
+### 3.3 璇︽儏椤�
+
+璇︽儏鎺ュ彛 **GET** `/quality/qualityInspect/{id}` 杩斿洖鐨� `salesLedgerId` 鍙敤浜庡洖鏄惧凡缁戝畾鐨勯攢鍞鍗曘��
+
+## 鍥涖�佹敞鎰忎簨椤�
+
+1. `salesLedgerId` 浠呭湪 `inspectType = 2`锛堝嚭鍘傛楠岋級鏃朵娇鐢紝鍘熸潗鏂欐楠屽拰杩囩▼妫�楠屽拷鐣ユ瀛楁
+2. 鍑哄巶妫�楠岄�氳繃鎶ュ伐锛坄productMainId`锛夌粦瀹氱殑宸ュ崟鍙凤紙`workOrderNo`锛変粛鐒朵繚鐣欙紝涓嶅彈褰卞搷
+3. `salesContractNo` 鐨勫彇鍊间紭鍏堢骇锛氱洿鎺ョ粦瀹� > 鐢熶骇宸ュ崟閾捐矾
diff --git "a/docs/\346\243\200\351\252\214\347\256\241\347\220\206-\346\211\271\351\207\217\345\277\253\351\200\237\346\243\200\351\252\214-\350\201\224\350\260\203\346\226\207\346\241\243.md" "b/docs/\346\243\200\351\252\214\347\256\241\347\220\206-\346\211\271\351\207\217\345\277\253\351\200\237\346\243\200\351\252\214-\350\201\224\350\260\203\346\226\207\346\241\243.md"
new file mode 100644
index 0000000..7308d70
--- /dev/null
+++ "b/docs/\346\243\200\351\252\214\347\256\241\347\220\206-\346\211\271\351\207\217\345\277\253\351\200\237\346\243\200\351\252\214-\350\201\224\350\260\203\346\226\207\346\241\243.md"
@@ -0,0 +1,85 @@
+# 妫�楠岀鐞� - 鎵归噺蹇�熸楠岃仈璋冩枃妗�
+
+## 鍙樻洿姒傝堪
+
+鍘熸潗鏂欐楠屻�佽繃绋嬫楠屻�佸嚭鍘傛楠屼笁绉嶇被鍨嬪潎鏀寔"蹇�熸楠�"锛氶�変腑澶氭潯鏈彁浜ょ殑妫�楠屽崟锛屼竴閿嚜鍔ㄩ�氳繃骞舵彁浜ゃ��
+
+## 涓�銆佹帴鍙h鏄�
+
+### 鎵归噺蹇�熸楠�
+
+**POST** `/quality/qualityInspect/batchQuickInspect`
+
+璇锋眰浣擄細
+
+```json
+[1001, 1002, 1003]
+```
+
+| 鍙傛暟 | 绫诲瀷 | 蹇呭~ | 璇存槑 |
+|------|------|------|------|
+| `ids` | Long[] | 鏄� | 闇�瑕佸揩閫熸楠岀殑妫�楠屽崟ID鏁扮粍 |
+
+杩斿洖绀轰緥锛�
+
+```json
+{
+    "code": 200,
+    "msg": "蹇�熸楠屽畬鎴愶細鎴愬姛 3 鏉★紝澶辫触 0 鏉�"
+}
+```
+
+## 浜屻�佷笟鍔¢�昏緫
+
+瀵规瘡涓�変腑鐨勬楠屽崟鎵ц浠ヤ笅娴佺▼锛堝鐢� `autoSubmit` 閫昏緫锛夛細
+
+1. **鏍¢獙**锛氭楠屽崟涓嶅瓨鍦� 鈫� 璺宠繃锛岃澶辫触
+2. **璺宠繃宸叉彁浜�**锛歚inspectState == 1` 鐨勬楠屽崟鐩存帴杩斿洖鎴愬姛锛屼笉閲嶅澶勭悊
+3. **鑷姩濉厖鍚堟牸**锛�
+   - `checkResult` 涓虹┖ 鈫� 璁句负 `"鍚堟牸"`
+   - `qualifiedQuantity` 涓虹┖ 鈫� 璁句负 `quantity`锛堟�绘暟锛�
+   - `unqualifiedQuantity` 涓虹┖ 鈫� 璁句负 `0`
+4. **鎻愪氦鍏ュ簱**锛�
+   - 鍚堟牸鏁伴噺 > 0 鈫� 鍒涘缓鍏ュ簱璁板綍锛坄stock_in_record`锛�
+   - 涓嶅悎鏍兼暟閲� > 0 鈫� 鍒涘缓涓嶅悎鏍煎搧璁板綍锛坄quality_unqualified`锛�
+   - `inspectState` 鏇存柊涓� `1`锛堝凡鎻愪氦锛�
+
+杩斿洖鎴愬姛/澶辫触璁℃暟銆�
+
+## 涓夈�佸墠绔鎺ヨ鐐�
+
+### 3.1 鎸夐挳浣嶇疆
+
+鍦ㄦ楠屽垪琛ㄩ〉锛堝師鏉愭枡/杩囩▼/鍑哄巶妫�楠岋級鐨勫伐鍏锋爮澧炲姞"蹇�熸楠�"鎸夐挳銆�
+
+### 3.2 浜や簰娴佺▼
+
+```
+1. 鐢ㄦ埛鍕鹃�夊鏉℃楠屽崟锛坕nspectState = 0锛屾湭鎻愪氦鐘舵�侊級
+2. 鐐瑰嚮"蹇�熸楠�"鎸夐挳
+3. 寮瑰嚭纭妗嗭細
+   鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+   鈹�  蹇�熸楠�                      鈹�
+   鈹�                              鈹�
+   鈹�  宸查�夋嫨 X 鏉℃楠屽崟             鈹�
+   鈹�                              鈹�
+   鈹�  纭鍚庡皢鑷姩锛�                 鈹�
+   鈹�  路 妫�楠岀粨鏋滆涓�"鍚堟牸"          鈹�
+   鈹�  路 鍚堟牸鏁伴噺璁句负鎬绘暟             鈹�
+   鈹�  路 涓嶅悎鏍兼暟閲忚涓� 0            鈹�
+   鈹�  路 鎻愪氦骞跺叆搴�                  鈹�
+   鈹�                              鈹�
+   鈹�  宸叉彁浜ょ殑妫�楠屽崟灏嗚嚜鍔ㄨ烦杩�        鈹�
+   鈹�                              鈹�
+   鈹�      [鍙栨秷]    [纭]          鈹�
+   鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+4. 纭鍚庤皟鐢� /batchQuickInspect
+5. 鏍规嵁杩斿洖缁撴灉鍒锋柊鍒楄〃锛屾彁绀烘垚鍔�/澶辫触鏁伴噺
+```
+
+### 3.3 娉ㄦ剰浜嬮」
+
+- 鎵归噺蹇�熸楠屼粎瀵�**鏈彁浜�**锛坄inspectState = 0`锛夌殑妫�楠屽崟鐢熸晥
+- 宸叉彁浜ょ殑妫�楠屽崟浼氳嚜鍔ㄨ烦杩囷紝涓嶄細閲嶅澶勭悊
+- 涓夌妫�楠岀被鍨嬶紙鍘熸潗鏂�/杩囩▼/鍑哄巶锛夊叡鐢ㄥ悓涓�涓帴鍙�
+- 鍓嶇寤鸿鍦ㄥ垪琛ㄦ暟鎹腑閫氳繃 `inspectState` 瀛楁**缃伆宸叉彁浜よ**锛岄槻姝㈢敤鎴疯閫�
diff --git "a/docs/\351\224\200\345\224\256\345\217\260\350\264\246-\351\207\207\350\264\255\345\220\210\345\220\214\345\217\267-\350\201\224\350\260\203\346\226\207\346\241\243.md" "b/docs/\351\224\200\345\224\256\345\217\260\350\264\246-\351\207\207\350\264\255\345\220\210\345\220\214\345\217\267-\350\201\224\350\260\203\346\226\207\346\241\243.md"
new file mode 100644
index 0000000..27def09
--- /dev/null
+++ "b/docs/\351\224\200\345\224\256\345\217\260\350\264\246-\351\207\207\350\264\255\345\220\210\345\220\214\345\217\267-\350\201\224\350\260\203\346\226\207\346\241\243.md"
@@ -0,0 +1,99 @@
+# 閿�鍞彴璐﹀垪琛� - 鏂板閲囪喘鍚堝悓鍙峰瓧娈�
+
+## 鍙樻洿姒傝堪
+
+閿�鍞彴璐﹀垪琛ㄦ帴鍙f柊澧� **閲囪喘鍚堝悓鍙�** 瀛楁杩斿洖锛屽悓鏃� `sales_ledger` 琛ㄦ柊澧� `purchase_ledger_id` 瀛楁鐢ㄤ簬鍏宠仈閲囪喘鍙拌处銆�
+
+---
+
+## 涓�銆佹暟鎹簱鍙樻洿
+
+**鎵ц鏂囦欢**: `docs/sales_ledger_add_purchase_ledger_id.sql`
+
+| 琛ㄥ悕 | 鍙樻洿绫诲瀷 | 瀛楁 | 绫诲瀷 | 璇存槑 |
+|------|---------|------|------|------|
+| sales_ledger | 鏂板 | purchase_ledger_id | BIGINT | 鍏宠仈 purchase_ledger.id |
+
+---
+
+## 浜屻�佹帴鍙e彉鏇�
+
+### 娑夊強鎺ュ彛
+
+```
+GET /sales/ledger/listPage
+```
+
+### 璇锋眰鍙傛暟
+
+鏃犲彉鏇达紝娌跨敤鐜版湁鍙傛暟銆�
+
+### 鍝嶅簲鍙樻洿
+
+鍝嶅簲澶栧眰缁撴瀯涓嶅彉锛堜粛鏄� `IPage<SalesLedgerVo>` 鍒嗛〉鏍煎紡锛夛紝`records` 涓瘡鏉¤褰曟柊澧炰竴涓瓧娈碉細
+
+| 瀛楁鍚� | 绫诲瀷 | 璇存槑 | 绀轰緥鍊� |
+|--------|------|------|--------|
+| `purchaseContractNumber` | String | 閲囪喘鍚堝悓鍙凤紝鏈叧鑱旈噰璐彴璐︽椂涓� null | `"CG202605001"` |
+
+### 鍝嶅簲绀轰緥锛堜粎灞曠ず鏂板瀛楁锛�
+
+```json
+{
+  "records": [
+    {
+      "id": 1,
+      "salesContractNo": "XS202605001",
+      "customerName": "XX鍏徃",
+      "contractAmount": 100000.00,
+      "purchaseContractNumber": "CG202605001"
+    },
+    {
+      "id": 2,
+      "salesContractNo": "XS202605002",
+      "customerName": "YY鍏徃",
+      "contractAmount": 50000.00,
+      "purchaseContractNumber": null
+    }
+  ],
+  "total": 2,
+  "current": 1,
+  "size": 10
+}
+```
+
+### 鏁版嵁鏉ユ簮璇存槑
+
+- `purchaseContractNumber` 閫氳繃 `sales_ledger.purchase_ledger_id` 鍏宠仈 `purchase_ledger.id` 鑾峰彇
+- 鍙栬嚜 `purchase_ledger.purchase_contract_number` 瀛楁
+- 閫氳繃 LEFT JOIN 鏌ヨ锛屾湭鍏宠仈鏃朵笉闃诲鍒楄〃灞曠ず
+
+---
+
+## 涓夈�佷繚瀛�/缂栬緫鎺ュ彛璇存槑
+
+淇濆瓨閿�鍞彴璐︽椂濡傞渶鍏宠仈閲囪喘鍙拌处锛屼紶鍏ユ柊澧炲瓧娈碉細
+
+```json
+POST /sales/ledger/addOrUpdateSalesLedger
+
+{
+  "id": 1,
+  "salesContractNo": "XS202605001",
+  "purchaseLedgerId": 10,
+  "...": "..."
+}
+```
+
+| 瀛楁鍚� | 绫诲瀷 | 蹇呭~ | 璇存槑 |
+|--------|------|------|------|
+| `purchaseLedgerId` | Long | 鍚� | 閲囪喘鍙拌处id锛屽搴� purchase_ledger.id |
+
+---
+
+## 鍥涖�佸墠绔鎺ユ竻鍗�
+
+- [ ] 閿�鍞彴璐�**鍒楄〃椤�**锛氭柊澧�"閲囪喘鍚堝悓鍙�"鍒楋紝缁戝畾 `record.purchaseContractNumber`
+- [ ] 閿�鍞彴璐�**鏂板/缂栬緫琛ㄥ崟**锛氭柊澧�"鍏宠仈閲囪喘鍙拌处"涓嬫媺閫夋嫨妗嗭紝缁戝畾 `form.purchaseLedgerId`
+- [ ] 閲囪喘鍚堝悓鍙峰垪寤鸿璁剧疆涓哄彲鐐瑰嚮閾炬帴锛岃烦杞嚦瀵瑰簲閲囪喘鍙拌处璇︽儏
+- [ ] 濡傛灉 `purchaseContractNumber` 涓� null锛屽垪灞曠ず "-" 鎴栫疆绌�
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/device/service/impl/DeviceMaintenanceServiceImpl.java b/src/main/java/com/ruoyi/device/service/impl/DeviceMaintenanceServiceImpl.java
index d1a9821..803450a 100644
--- a/src/main/java/com/ruoyi/device/service/impl/DeviceMaintenanceServiceImpl.java
+++ b/src/main/java/com/ruoyi/device/service/impl/DeviceMaintenanceServiceImpl.java
@@ -19,6 +19,7 @@
 import com.ruoyi.device.vo.DeviceRepairVo;
 import com.ruoyi.framework.web.domain.AjaxResult;
 import com.ruoyi.measuringinstrumentledger.mapper.SparePartsMapper;
+import com.ruoyi.project.system.service.ISysNoticeService;
 import com.ruoyi.measuringinstrumentledger.pojo.SpareParts;
 import com.ruoyi.measuringinstrumentledger.pojo.SparePartsRequisitionRecord;
 import com.ruoyi.measuringinstrumentledger.service.SparePartsRequisitionRecordService;
@@ -42,6 +43,7 @@
     private final SparePartsMapper sparePartsMapper;
     private final SparePartsRequisitionRecordService sparePartsRequisitionRecordService;
     private final FileUtil fileUtil;
+    private final ISysNoticeService sysNoticeService;
 
     @Override
     public IPage<DeviceMaintenanceDto> queryPage(Page page, DeviceMaintenanceDto deviceMaintenanceDto) {
@@ -94,6 +96,18 @@
                         sparePartsMapper.updateById(spareParts);
                         sparePartIds.add(sparePartUse.getId());
 
+                        // 搴撳瓨棰勮閫氱煡
+                        if (spareParts.getWarnNum() != null && spareParts.getNotifyPersonId() != null
+                                && spareParts.getQuantity().compareTo(spareParts.getWarnNum()) < 0) {
+                            sysNoticeService.simpleNoticeByUser(
+                                    "澶囦欢搴撳瓨棰勮",
+                                    "澶囦欢銆�" + spareParts.getName() + "銆戝綋鍓嶅簱瀛�(" + spareParts.getQuantity()
+                                            + ")宸蹭綆浜庨璀︽暟閲�(" + spareParts.getWarnNum() + ")锛岃鍙婃椂閲囪喘琛ュ厖銆�",
+                                    List.of(spareParts.getNotifyPersonId()),
+                                    "/equipmentManagement/spareParts"
+                                    );
+                        }
+
                         // 鍒涘缓澶囦欢棰嗙敤璁板綍
                         SparePartsRequisitionRecord record = new SparePartsRequisitionRecord();
                         record.setSourceType(1); // 1 淇濆吇
diff --git a/src/main/java/com/ruoyi/device/service/impl/DeviceRepairServiceImpl.java b/src/main/java/com/ruoyi/device/service/impl/DeviceRepairServiceImpl.java
index 9a3c383..997b4a8 100644
--- a/src/main/java/com/ruoyi/device/service/impl/DeviceRepairServiceImpl.java
+++ b/src/main/java/com/ruoyi/device/service/impl/DeviceRepairServiceImpl.java
@@ -20,12 +20,14 @@
 import com.ruoyi.device.vo.DeviceRepairVo;
 import com.ruoyi.framework.web.domain.AjaxResult;
 import com.ruoyi.measuringinstrumentledger.mapper.SparePartsMapper;
+import com.ruoyi.project.system.service.ISysNoticeService;
 import com.ruoyi.measuringinstrumentledger.pojo.SpareParts;
 import com.ruoyi.measuringinstrumentledger.pojo.SparePartsRequisitionRecord;
 import com.ruoyi.measuringinstrumentledger.service.SparePartsRequisitionRecordService;
 import jakarta.servlet.http.HttpServletResponse;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.compress.utils.Lists;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -46,6 +48,7 @@
     private final SparePartsMapper sparePartsMapper;
     private final SparePartsRequisitionRecordService sparePartsRequisitionRecordService;
     private final FileUtil fileUtil;
+    private final ISysNoticeService sysNoticeService;
 
     private static final int STATUS_PENDING_REPAIR = 0;
     private static final int STATUS_COMPLETED = 1;
@@ -116,6 +119,17 @@
                         sparePartsMapper.updateById(spareParts);
                         sparePartIds.add(sparePartUse.getId());
 
+                        // 搴撳瓨棰勮閫氱煡
+                        if (spareParts.getWarnNum() != null && spareParts.getNotifyPersonId() != null
+                                && spareParts.getQuantity().compareTo(spareParts.getWarnNum()) < 0) {
+                            sysNoticeService.simpleNoticeByUser(
+                                    "澶囦欢搴撳瓨棰勮",
+                                    "澶囦欢銆�" + spareParts.getName() + "銆戝綋鍓嶅簱瀛�(" + spareParts.getQuantity()
+                                            + ")宸蹭綆浜庨璀︽暟閲�(" + spareParts.getWarnNum() + ")锛岃鍙婃椂閲囪喘琛ュ厖銆�",
+                                    List.of(spareParts.getNotifyPersonId()),
+                                    "/equipmentManagement/spareParts");
+                        }
+
                         // 鍒涘缓澶囦欢棰嗙敤璁板綍
                         SparePartsRequisitionRecord record = new SparePartsRequisitionRecord();
                         record.setSourceType(0); // 0 缁翠慨
diff --git a/src/main/java/com/ruoyi/measuringinstrumentledger/dto/SparePartsDto.java b/src/main/java/com/ruoyi/measuringinstrumentledger/dto/SparePartsDto.java
index cf9ac86..9fee3e9 100644
--- a/src/main/java/com/ruoyi/measuringinstrumentledger/dto/SparePartsDto.java
+++ b/src/main/java/com/ruoyi/measuringinstrumentledger/dto/SparePartsDto.java
@@ -1,6 +1,7 @@
 package com.ruoyi.measuringinstrumentledger.dto;
 
 import com.ruoyi.measuringinstrumentledger.pojo.SpareParts;
+import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
 import java.util.List;
@@ -11,5 +12,7 @@
      * 澶囦欢鍒嗙被鐖跺悕绉�
      */
     private String parentName;
+    @Schema(description = "棰勮閫氱煡浜烘樀绉�")
+    private String notifyPersonName;
     private List<SparePartsDto> children;
 }
diff --git a/src/main/java/com/ruoyi/measuringinstrumentledger/pojo/SpareParts.java b/src/main/java/com/ruoyi/measuringinstrumentledger/pojo/SpareParts.java
index 13a9229..c47b7d9 100644
--- a/src/main/java/com/ruoyi/measuringinstrumentledger/pojo/SpareParts.java
+++ b/src/main/java/com/ruoyi/measuringinstrumentledger/pojo/SpareParts.java
@@ -53,6 +53,10 @@
      * 澶囦欢鍒嗙被鎻忚堪
      */
     private String description;
+    @Schema(description = "搴撳瓨棰勮鏁伴噺")
+    private BigDecimal warnNum;
+    @Schema(description = "棰勮閫氱煡浜篿d")
+    private Long notifyPersonId;
     @Schema(description = "鍒涘缓鏃堕棿")
     @TableField(fill = FieldFill.INSERT)
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
diff --git a/src/main/java/com/ruoyi/project/system/service/ISysNoticeService.java b/src/main/java/com/ruoyi/project/system/service/ISysNoticeService.java
index f371744..d658d09 100644
--- a/src/main/java/com/ruoyi/project/system/service/ISysNoticeService.java
+++ b/src/main/java/com/ruoyi/project/system/service/ISysNoticeService.java
@@ -71,6 +71,7 @@
      * @param title 鏍囬
      * @param message 娑堟伅
      * @param jumpPath 璺宠浆鍦板潃
+     * @param consigneeId  鏀朵欢浜篿d
      */
     void simpleNoticeByUser(final String title, final String message, final List<Long> consigneeId,  final String jumpPath);
 
diff --git a/src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerDto.java b/src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerDto.java
index cbca6f7..31df834 100644
--- a/src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerDto.java
+++ b/src/main/java/com/ruoyi/purchase/dto/PurchaseLedgerDto.java
@@ -185,6 +185,8 @@
     private String paymentMethod;
     @Schema(description = "瀹℃壒鐘舵��")
     private Integer approvalStatus;
+    @Schema(description = "鏀惰揣鐘舵�� 1-寰呮敹璐� 2-鏀惰揣涓� 3-宸叉敹璐�")
+    private Integer status;
     @Schema(description = "妯℃澘鍚嶇О")
     private String templateName;
     @Schema(description = "瀹℃壒浜篿d")
diff --git a/src/main/java/com/ruoyi/purchase/pojo/PurchaseLedger.java b/src/main/java/com/ruoyi/purchase/pojo/PurchaseLedger.java
index e7ec1eb..d29e2fb 100644
--- a/src/main/java/com/ruoyi/purchase/pojo/PurchaseLedger.java
+++ b/src/main/java/com/ruoyi/purchase/pojo/PurchaseLedger.java
@@ -146,6 +146,9 @@
     @Excel(name = "瀹℃壒鐘舵��", readConverterExp = "1=寰呭鏍�,2=瀹℃壒涓�,3=瀹℃壒閫氳繃,4=瀹℃壒澶辫触")
     private Integer approvalStatus;
 
+    @Schema(description = "鏀惰揣鐘舵�� 1-寰呮敹璐� 2-鏀惰揣涓� 3-宸叉敹璐�")
+    private Integer status;
+
     @Schema(description = "妯℃澘鍚嶇О")
     private String templateName;
     @Schema(description = "瀹℃壒浜篿d")
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 7a70435..7f5712d 100644
--- a/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
@@ -33,6 +33,8 @@
 import com.ruoyi.framework.security.LoginUser;
 import com.ruoyi.framework.web.domain.AjaxResult;
 import com.ruoyi.framework.web.domain.R;
+import com.ruoyi.measuringinstrumentledger.mapper.SparePartsMapper;
+import com.ruoyi.measuringinstrumentledger.pojo.SpareParts;
 import com.ruoyi.other.mapper.TempFileMapper;
 import com.ruoyi.procurementrecord.mapper.ProcurementRecordMapper;
 import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage;
@@ -116,6 +118,7 @@
     private final StockInRecordService stockInRecordService;
     private final StockUtils stockUtils;
     private final ApprovalTemplateMapper approvalTemplateMapper;
+    private final SparePartsMapper sparePartsMapper;
 
     @Override
     public List<PurchaseLedger> selectPurchaseLedgerList(PurchaseLedger purchaseLedger) {
@@ -162,6 +165,9 @@
         purchaseLedger.setRecorderId(purchaseLedgerDto.getRecorderId());
 
         purchaseLedger.setApprovalStatus(1);
+        if (purchaseLedger.getId() == null) {
+            purchaseLedger.setStatus(1);
+        }
         // 3. 鏂板鎴栨洿鏂颁富琛�
         if (purchaseLedger.getId() == null) {
             purchaseLedgerMapper.insert(purchaseLedger);
@@ -329,7 +335,9 @@
                 for (SalesLedgerProduct product : products) {
                     try {
                         boolean processed;
-                        if (Boolean.TRUE.equals(product.getIsChecked())) {
+                        if (product.getProductType() != null && product.getProductType() == 2) {
+                            processed = processPurchaseSparePart(purchaseLedger, product);
+                        } else if (Boolean.TRUE.equals(product.getIsChecked())) {
                             processed = processPurchaseQualityProduct(purchaseLedger, product);
                         } else {
                             processed = processPurchaseDirectProduct(purchaseLedger, product);
@@ -359,6 +367,35 @@
                 detail.put("message", ex.getMessage());
                 details.add(detail);
                 log.error("鎵归噺鎺ㄨ繘閲囪喘鍙拌处澶辫触, purchaseLedgerId={}", id, ex);
+            }
+        }
+
+        // 鏇存柊鏀惰揣鐘舵��
+        List<Long> processedIds = details.stream()
+                .filter(d -> "SUCCESS".equals(d.get("status")) || "PARTIAL".equals(d.get("status")))
+                .map(d -> (Long) d.get("purchaseLedgerId"))
+                .filter(Objects::nonNull)
+                .collect(Collectors.toList());
+        if (!processedIds.isEmpty()) {
+            PurchaseLedgerDto statusQuery = new PurchaseLedgerDto();
+            statusQuery.setIds(processedIds);
+            IPage<PurchaseLedgerDto> statusPage = this.selectPurchaseLedgerListPage(
+                    new com.baomidou.mybatisplus.extension.plugins.pagination.Page<>(1, processedIds.size()),
+                    statusQuery
+            );
+            if (statusPage != null && CollectionUtils.isNotEmpty(statusPage.getRecords())) {
+                for (PurchaseLedgerDto dto : statusPage.getRecords()) {
+                    PurchaseLedger update = new PurchaseLedger();
+                    update.setId(dto.getId());
+                    if ("瀹屽叏鍏ュ簱".equals(dto.getStockInStatus())) {
+                        update.setStatus(3);
+                    } else if ("鍏ュ簱涓�".equals(dto.getStockInStatus())) {
+                        update.setStatus(2);
+                    } else {
+                        update.setStatus(1);
+                    }
+                    purchaseLedgerMapper.updateById(update);
+                }
             }
         }
 
@@ -517,6 +554,22 @@
         return hasApprovedStockRecord(stockRecords);
     }
 
+    private boolean processPurchaseSparePart(PurchaseLedger purchaseLedger, SalesLedgerProduct product) {
+        if (purchaseLedger == null || product == null || product.getProductModelId() == null) {
+            return false;
+        }
+        SpareParts spareParts = sparePartsMapper.selectById(product.getProductModelId());
+        if (spareParts == null) {
+            return false;
+        }
+        BigDecimal newQty = spareParts.getQuantity() != null
+                ? spareParts.getQuantity().add(product.getQuantity())
+                : product.getQuantity();
+        spareParts.setQuantity(newQty);
+        sparePartsMapper.updateById(spareParts);
+        return true;
+    }
+
     private LocalDateTime toStartOfDayPlusDays(Date date, int days) {
         if (date == null) {
             return null;
@@ -656,6 +709,13 @@
             if (productModelId != null && modelMap.containsKey(productModelId)) {
                 product.setSpecificationModel(modelMap.get(productModelId));
             }
+
+            if (product.getProductType() != null && product.getProductType() == 2) {
+                SpareParts spareParts = sparePartsMapper.selectById(productModelId);
+                if (spareParts != null) {
+                    product.setProductCategory(spareParts.getName());
+                }
+            }
         }
 
         // 鍒嗙粍澶勭悊
diff --git a/src/main/java/com/ruoyi/quality/controller/QualityInspectController.java b/src/main/java/com/ruoyi/quality/controller/QualityInspectController.java
index cc295d5..88f0576 100644
--- a/src/main/java/com/ruoyi/quality/controller/QualityInspectController.java
+++ b/src/main/java/com/ruoyi/quality/controller/QualityInspectController.java
@@ -143,6 +143,16 @@
     }
 
     /**
+     * 鎵归噺蹇�熸楠岋細涓�閿�氳繃骞舵彁浜�
+     */
+    @PostMapping("/batchQuickInspect")
+    @Operation(summary = "鎵归噺蹇�熸楠�")
+    @Log(title = "鎵归噺蹇�熸楠�", businessType = BusinessType.OTHER)
+    public R<?> batchQuickInspect(@RequestBody List<Long> ids) {
+        return qualityInspectService.batchQuickInspect(ids);
+    }
+
+    /**
      * 涓嬭浇
      *
      * @param response
diff --git a/src/main/java/com/ruoyi/quality/pojo/QualityInspect.java b/src/main/java/com/ruoyi/quality/pojo/QualityInspect.java
index bc3f60a..1d99181 100644
--- a/src/main/java/com/ruoyi/quality/pojo/QualityInspect.java
+++ b/src/main/java/com/ruoyi/quality/pojo/QualityInspect.java
@@ -148,6 +148,11 @@
     private Long purchaseLedgerId;
 
     /**
+     * 閿�鍞彴璐d锛堝嚭鍘傛楠岋級
+     */
+    private Long salesLedgerId;
+
+    /**
      * 鎶ュ伐id
      */
     private Long productMainId;
diff --git a/src/main/java/com/ruoyi/quality/service/IQualityInspectService.java b/src/main/java/com/ruoyi/quality/service/IQualityInspectService.java
index 8b42207..ee27be0 100644
--- a/src/main/java/com/ruoyi/quality/service/IQualityInspectService.java
+++ b/src/main/java/com/ruoyi/quality/service/IQualityInspectService.java
@@ -8,6 +8,7 @@
 import com.ruoyi.quality.pojo.QualityInspect;
 
 import jakarta.servlet.http.HttpServletResponse;
+import java.util.List;
 
 public interface IQualityInspectService extends IService<QualityInspect> {
 
@@ -26,5 +27,10 @@
 
     R autoSubmit(Long id);
 
+    /**
+     * 鎵归噺蹇�熸楠岋細涓�閿�氳繃骞舵彁浜�
+     */
+    R batchQuickInspect(List<Long> ids);
+
     void down(HttpServletResponse response, QualityInspect qualityInspect);
 }
diff --git a/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java b/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
index 328c358..6b38c30 100644
--- a/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
+++ b/src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
@@ -186,6 +186,24 @@
         return rows > 0 ? R.ok("妫�楠屽崟鎻愪氦鎴愬姛") : R.fail("妫�楠屽崟鎻愪氦澶辫触");
     }
 
+    @Override
+    public R batchQuickInspect(List<Long> ids) {
+        if (ids == null || ids.isEmpty()) {
+            return R.fail("璇烽�夋嫨鑷冲皯涓�鏉℃楠屽崟");
+        }
+        int success = 0;
+        int fail = 0;
+        for (Long id : ids) {
+            R result = autoSubmit(id);
+            if (R.isSuccess(result)) {
+                success++;
+            } else {
+                fail++;
+            }
+        }
+        return R.ok(String.format("蹇�熸楠屽畬鎴愶細鎴愬姛 %d 鏉★紝澶辫触 %d 鏉�", success, fail));
+    }
+
     private String resolveProductionBatchNo(Long productionProductMainId,
                                             Long qualityInspectId,
                                             Long productModelId) {
diff --git a/src/main/java/com/ruoyi/sales/dto/ShippingInfoDto.java b/src/main/java/com/ruoyi/sales/dto/ShippingInfoDto.java
index 724473a..9a68969 100644
--- a/src/main/java/com/ruoyi/sales/dto/ShippingInfoDto.java
+++ b/src/main/java/com/ruoyi/sales/dto/ShippingInfoDto.java
@@ -47,6 +47,9 @@
     //鍙戣揣鏁伴噺
     private BigDecimal totalQuantity;
 
+    //閲囪喘鍚堝悓鍙�
+    private String purchaseContractNumber;
+
     private Long templateId;
 
     private String templateName;
diff --git a/src/main/java/com/ruoyi/sales/pojo/SalesLedger.java b/src/main/java/com/ruoyi/sales/pojo/SalesLedger.java
index 00736ba..ab45b14 100644
--- a/src/main/java/com/ruoyi/sales/pojo/SalesLedger.java
+++ b/src/main/java/com/ruoyi/sales/pojo/SalesLedger.java
@@ -140,5 +140,8 @@
     @TableField(exist = false)
     private Boolean hasProductionRecord;
 
+    @Schema(description = "閲囪喘鍙拌处id")
+    private Long purchaseLedgerId;
+
 }
 
diff --git a/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java b/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
index f4a42d6..d6766e3 100644
--- a/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
+++ b/src/main/java/com/ruoyi/sales/pojo/SalesLedgerProduct.java
@@ -182,6 +182,9 @@
     //閽堝閿�鍞彴璐︼紝鏄惁鐢熶骇
     private Boolean isProduction;
 
+    @Schema(description = "浜у搧绫诲瀷 1-浜у搧 2-璁惧澶囦欢")
+    private Integer productType;
+
     @TableField(exist = false)
     @Schema(description = "寰呭彂璐ф暟閲�")
     private BigDecimal noQuantity;
diff --git a/src/main/java/com/ruoyi/sales/pojo/ShippingInfo.java b/src/main/java/com/ruoyi/sales/pojo/ShippingInfo.java
index f244453..a5616d8 100644
--- a/src/main/java/com/ruoyi/sales/pojo/ShippingInfo.java
+++ b/src/main/java/com/ruoyi/sales/pojo/ShippingInfo.java
@@ -28,6 +28,10 @@
     @Excel(name = "瀹㈡埛鍚嶇О")
     private String customerName;
 
+    @TableField(exist = false)
+    @Schema(description = "瀹㈡埛id")
+    private Long customerId;
+
     @TableId(value = "id", type = IdType.AUTO)
     private Long id;
 
diff --git a/src/main/java/com/ruoyi/sales/vo/SalesLedgerVo.java b/src/main/java/com/ruoyi/sales/vo/SalesLedgerVo.java
index fb932f8..0470abf 100644
--- a/src/main/java/com/ruoyi/sales/vo/SalesLedgerVo.java
+++ b/src/main/java/com/ruoyi/sales/vo/SalesLedgerVo.java
@@ -2,6 +2,7 @@
 
 import com.ruoyi.basic.dto.StorageBlobVO;
 import com.ruoyi.sales.pojo.SalesLedger;
+import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
 import java.util.List;
@@ -10,4 +11,7 @@
 public class SalesLedgerVo extends SalesLedger {
 
     private List<StorageBlobVO> storageBlobVOs;
+
+    @Schema(description = "閲囪喘鍚堝悓鍙�")
+    private String purchaseContractNumber;
 }
diff --git a/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java b/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
index c82ac34..a45359f 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
+++ b/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
@@ -92,6 +92,7 @@
         stockInRecordDto.setBatchNo(stockInventoryDto.getBatchNo());
         stockInRecordDto.setProductModelId(stockInventoryDto.getProductModelId());
         stockInRecordDto.setType("0");
+        stockInRecordDto.setCreateTime(stockInventoryDto.getCreateTime());
         stockInRecordService.add(stockInRecordDto);
         //鍐嶈繘琛屾柊澧炲簱瀛樻暟閲忓簱瀛�
         //鍏堟煡璇㈠簱瀛樿〃涓殑浜у搧鏄惁瀛樺湪锛屼笉瀛樺湪鏂板锛屽瓨鍦ㄦ洿鏂�
@@ -169,6 +170,7 @@
         stockInRecordDto.setType("0");
         stockInRecordDto.setRemark(stockInventoryDto.getRemark());
         stockInRecordDto.setWarnNum(stockInventoryDto.getWarnNum());
+        stockInRecordDto.setCreateTime(stockInventoryDto.getCreateTime());
         stockInRecordService.add(stockInRecordDto);
         return true;
     }
diff --git a/src/main/java/com/ruoyi/stock/service/impl/StockUninventoryServiceImpl.java b/src/main/java/com/ruoyi/stock/service/impl/StockUninventoryServiceImpl.java
index 47f7d34..427d94b 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockUninventoryServiceImpl.java
+++ b/src/main/java/com/ruoyi/stock/service/impl/StockUninventoryServiceImpl.java
@@ -79,6 +79,7 @@
         stockInRecordDto.setBatchNo(stockUninventoryDto.getBatchNo());
         stockInRecordDto.setProductModelId(stockUninventoryDto.getProductModelId());
         stockInRecordDto.setType("1");
+        stockInRecordDto.setCreateTime(stockUninventoryDto.getCreateTime());
         stockInRecordService.add(stockInRecordDto);
         //瀹℃壒鍐嶆坊鍔�
         return 1;
@@ -121,6 +122,7 @@
         stockInRecordDto.setProductModelId(stockUninventoryDto.getProductModelId());
         stockInRecordDto.setType("1");
         stockInRecordDto.setRemark(stockUninventoryDto.getRemark());
+        stockInRecordDto.setCreateTime(stockUninventoryDto.getCreateTime());
         stockInRecordService.add(stockInRecordDto);
         return 1;
     }
diff --git a/src/main/resources/mapper/measuringinstrumentledger/SparePartsMapper.xml b/src/main/resources/mapper/measuringinstrumentledger/SparePartsMapper.xml
index 301ff6f..cf89569 100644
--- a/src/main/resources/mapper/measuringinstrumentledger/SparePartsMapper.xml
+++ b/src/main/resources/mapper/measuringinstrumentledger/SparePartsMapper.xml
@@ -2,9 +2,10 @@
         "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.ruoyi.measuringinstrumentledger.mapper.SparePartsMapper">
     <select id="listPage" resultType="com.ruoyi.measuringinstrumentledger.dto.SparePartsDto">
-        select sp.*,sp1.name as parentName
+        select sp.*,sp1.name as parentName, su.nick_name as notifyPersonName
         from spare_parts sp
         left join spare_parts sp1 on sp1.id = sp.parent_id
+        left join sys_user su on su.user_id = sp.notify_person_id
         <where>
             <if test="spareParts.name != null and spareParts.name != ''">
                 and sp.name like concat('%',#{spareParts.name},'%')
diff --git a/src/main/resources/mapper/purchase/PurchaseLedgerMapper.xml b/src/main/resources/mapper/purchase/PurchaseLedgerMapper.xml
index a0a0a2d..94ed278 100644
--- a/src/main/resources/mapper/purchase/PurchaseLedgerMapper.xml
+++ b/src/main/resources/mapper/purchase/PurchaseLedgerMapper.xml
@@ -35,6 +35,7 @@
                 pl.approve_user_ids,
                 sm.is_white,
                 pl.approval_status,
+                pl.status,
                 pl.payment_method,
                 pl.remarks,
                 CASE
diff --git a/src/main/resources/mapper/quality/QualityInspectMapper.xml b/src/main/resources/mapper/quality/QualityInspectMapper.xml
index ed01cad..6086121 100644
--- a/src/main/resources/mapper/quality/QualityInspectMapper.xml
+++ b/src/main/resources/mapper/quality/QualityInspectMapper.xml
@@ -10,7 +10,7 @@
             </when>
             <otherwise>
                 pot.work_order_no,
-                po_sales.sales_contract_no
+                COALESCE(sl.sales_contract_no, po_sales.sales_contract_no) as sales_contract_no
             </otherwise>
         </choose>
         FROM
@@ -22,6 +22,7 @@
             <otherwise>
                 LEFT JOIN production_product_main ppm ON qi.product_main_id = ppm.id
                 LEFT JOIN production_operation_task pot ON ppm.production_operation_task_id = pot.id
+                LEFT JOIN sales_ledger sl ON sl.id = qi.sales_ledger_id
                 left join production_order po ON po.id = pot.production_order_id
                 left join (
                     select po2.id as order_id,
@@ -61,7 +62,8 @@
             AND pot.work_order_no like concat('%',#{qualityInspect.workOrderNo},'%')
         </if>
         <if test="qualityInspect.salesContractNo != null and qualityInspect.salesContractNo != '' ">
-            AND po_sales.sales_contract_no like concat('%',#{qualityInspect.salesContractNo},'%')
+            AND (sl.sales_contract_no like concat('%',#{qualityInspect.salesContractNo},'%')
+                OR po_sales.sales_contract_no like concat('%',#{qualityInspect.salesContractNo},'%'))
         </if>
         ORDER BY qi.check_time DESC
     </select>
diff --git a/src/main/resources/mapper/sales/SalesLedgerMapper.xml b/src/main/resources/mapper/sales/SalesLedgerMapper.xml
index a5650f9..1cd3971 100644
--- a/src/main/resources/mapper/sales/SalesLedgerMapper.xml
+++ b/src/main/resources/mapper/sales/SalesLedgerMapper.xml
@@ -62,7 +62,8 @@
         T1.payment_method,
         T1.delivery_date,
         DATEDIFF(T1.delivery_date, CURDATE()) AS delivery_days_diff,
-        IFNULL(shipping_status_counts.is_all_shipped, FALSE) AS is_fh
+        IFNULL(shipping_status_counts.is_all_shipped, FALSE) AS is_fh,
+        T3.purchase_contract_number
         FROM sales_ledger T1
         LEFT JOIN sys_user T2 ON T1.entry_person = T2.user_id
         LEFT JOIN (
@@ -74,6 +75,7 @@
         FROM shipping_info
         GROUP BY sales_ledger_id
         ) shipping_status_counts ON T1.id = shipping_status_counts.sales_ledger_id
+        LEFT JOIN purchase_ledger T3 ON T1.purchase_ledger_id = T3.id
 
         <where>
             <if test="salesLedgerDto.customerName != null and salesLedgerDto.customerName != '' ">
diff --git a/src/main/resources/mapper/sales/ShippingInfoMapper.xml b/src/main/resources/mapper/sales/ShippingInfoMapper.xml
index 762c2d4..9021eb4 100644
--- a/src/main/resources/mapper/sales/ShippingInfoMapper.xml
+++ b/src/main/resources/mapper/sales/ShippingInfoMapper.xml
@@ -24,10 +24,12 @@
         p.product_name,
         sl.customer_name,
         spd.totalQuantity,
-        sor.outboundBatches
+        sor.outboundBatches,
+        pl.purchase_contract_number
         FROM shipping_info s
         LEFT JOIN (select shipping_info_id,sum(quantity) totalQuantity from shipping_product_detail GROUP BY shipping_info_id) spd ON spd.shipping_info_id = s.id
         LEFT JOIN sales_ledger sl ON s.sales_ledger_id = sl.id
+        LEFT JOIN purchase_ledger pl ON sl.purchase_ledger_id = pl.id
         LEFT JOIN sales_ledger_product slp ON s.sales_ledger_product_id = slp.id and slp.type = 1
         left join product_model pm on slp.product_model_id = pm.id
         left join product p on pm.product_id = p.id
@@ -48,6 +50,9 @@
         <if test="req.expressNumber != null and req.expressNumber != ''">
             AND s.express_number LIKE CONCAT('%',#{req.expressNumber},'%')
         </if>
+        <if test="req.customerId != null">
+            AND sl.customer_id = #{req.customerId}
+        </if>
         order by create_time DESC
     </select>
     <select id="listAll" resultType="com.ruoyi.sales.pojo.ShippingInfo">

--
Gitblit v1.9.3