From 5d81fcc5768741323a2e343fc01f44e17e68b65b Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期四, 25 六月 2026 14:59:38 +0800
Subject: [PATCH] 1.库存入库新增质检流程 2.销售相关查询返回总合同号 3.采购相关查询返回总合同号

---
 src/main/java/com/ruoyi/production/bean/dto/ProductionPlanDto.java             |    3 
 src/main/resources/mapper/basic/SupplierManageMapper.xml                       |    1 
 src/main/java/com/ruoyi/production/bean/dto/ProductionProductMainDto.java      |    3 
 src/main/java/com/ruoyi/production/bean/vo/ProductionOrderVo.java              |    3 
 src/main/java/com/ruoyi/sales/vo/ShippingInfoForReturnVo.java                  |    3 
 src/main/resources/mapper/purchase/PurchaseReturnOrdersMapper.xml              |    6 
 src/main/java/com/ruoyi/sales/vo/CustomerTransactionsDetailsVo.java            |    3 
 src/main/java/com/ruoyi/procurementrecord/bean/dto/ProcurementPageDtoCopy.java |    5 
 doc/20260625_stock_inspect_feature.md                                          |  228 +++++++++++++
 src/main/java/com/ruoyi/sales/vo/CustomerTransactionsShipmentVo.java           |    3 
 doc/20260625_stock_inspect_feature.sql                                         |   11 
 src/main/java/com/ruoyi/production/bean/vo/ProductionPlanVo.java               |    3 
 src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java      |   79 ++++
 src/main/java/com/ruoyi/quality/dto/QualityInspectDto.java                     |    1 
 src/main/java/com/ruoyi/account/bean/vo/sales/SalesOutboundVo.java             |    4 
 src/main/java/com/ruoyi/account/bean/vo/purchase/PurchaseInboundVo.java        |    4 
 src/main/java/com/ruoyi/stock/dto/StockInventoryDto.java                       |    6 
 src/main/resources/mapper/procurementrecord/ReturnManagementMapper.xml         |    8 
 src/main/resources/mapper/stock/StockOutRecordMapper.xml                       |    3 
 src/main/java/com/ruoyi/account/bean/vo/sales/SalesReturnVo.java               |    4 
 src/main/resources/mapper/production/ProductionOrderMapper.xml                 |    3 
 src/main/resources/mapper/sales/ShippingInfoMapper.xml                         |    5 
 src/main/resources/mapper/stock/StockInRecordMapper.xml                        |    3 
 src/main/java/com/ruoyi/purchase/dto/PurchaseReturnOrderHasAllInfoDto.java     |    3 
 src/main/java/com/ruoyi/sales/pojo/ShippingInfo.java                           |    5 
 doc/20260625_master_contract_no_sync.md                                        |  531 +++++++++++++++++++++++++++++++
 src/main/java/com/ruoyi/procurementrecord/bean/dto/ProcurementPageDto.java     |    5 
 src/main/java/com/ruoyi/account/bean/vo/purchase/PurchaseReturnVo.java         |    4 
 src/main/resources/mapper/production/ProductionProductMainMapper.xml           |    5 
 src/main/java/com/ruoyi/purchase/vo/SupplierTransactionsDetailsVo.java         |    3 
 src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml        |    4 
 src/main/resources/mapper/production/ProductionPlanMapper.xml                  |    5 
 src/main/java/com/ruoyi/procurementrecord/bean/dto/ReturnManagementDto.java    |    3 
 src/main/java/com/ruoyi/sales/vo/CustomerTransactionsProductVo.java            |    3 
 34 files changed, 956 insertions(+), 7 deletions(-)

diff --git a/doc/20260625_master_contract_no_sync.md b/doc/20260625_master_contract_no_sync.md
new file mode 100644
index 0000000..c02c6c0
--- /dev/null
+++ b/doc/20260625_master_contract_no_sync.md
@@ -0,0 +1,531 @@
+# 鎬诲悎鍚屽彿瀛楁鍚屾娣诲姞
+
+## 娑夊強椤甸潰
+
+### 閿�鍞浉鍏�
+- 鐢熶骇璁㈠崟绠$悊椤甸潰
+- 鐢熶骇鎶ュ伐绠$悊椤甸潰
+- 鐢熶骇璁″垝绠$悊椤甸潰
+- 鍙戣揣绠$悊椤甸潰
+- 閿�鍞��璐х鐞嗛〉闈�
+- 瀹㈡埛寰�鏉ラ〉闈紙鍙戣揣鏄庣粏銆佷骇鍝佹槑缁嗐�佸悎鍚屾槑缁嗭級
+- 璐ㄦ绠$悊椤甸潰
+- 璐㈠姟绠$悊-閿�鍞嚭搴撳彴璐�
+- 璐㈠姟绠$悊-閿�鍞��璐у彴璐�
+
+### 閲囪喘鐩稿叧
+- 閲囪喘鍏ュ簱绠$悊椤甸潰
+- 閲囪喘閫�璐х鐞嗛〉闈�
+- 渚涘簲鍟嗗線鏉ラ〉闈紙閲囪喘鏄庣粏锛�
+- 璐㈠姟绠$悊-閲囪喘鍏ュ簱鍙拌处
+- 璐㈠姟绠$悊-閲囪喘閫�璐у彴璐�
+
+## 鏂板瀛楁璇存槑
+
+| 瀛楁鍚� | 绫诲瀷 | 璇存槑 |
+|--------|------|------|
+| masterContractNo | String | 鎬诲悎鍚屽彿 |
+
+## 娑夊強鎺ュ彛
+
+### 1. 鐢熶骇璁㈠崟鎺ュ彛
+
+**GET /productionOrder/pageProductionOrder**
+
+**鍝嶅簲鏂板瀛楁锛�**
+
+```json
+{
+  "code": 200,
+  "data": {
+    "records": [
+      {
+        "id": 1,
+        "salesContractNo": "XS202601001",
+        "masterContractNo": "ZHT202601001",
+        "customerName": "瀹㈡埛鍚嶇О"
+      }
+    ]
+  }
+}
+```
+
+### 2. 鐢熶骇鎶ュ伐鎺ュ彛
+
+**GET /productionProductMain/listPage**
+
+**鍝嶅簲鏂板瀛楁锛�**
+
+```json
+{
+  "code": 200,
+  "data": {
+    "records": [
+      {
+        "id": 1,
+        "salesContractNo": "XS202601001",
+        "masterContractNo": "ZHT202601001"
+      }
+    ]
+  }
+}
+```
+
+### 3. 鐢熶骇璁″垝鎺ュ彛
+
+**GET /productionPlan/listPage**
+
+**鍝嶅簲鏂板瀛楁锛�**
+
+```json
+{
+  "code": 200,
+  "data": {
+    "records": [
+      {
+        "id": 1,
+        "salesContractNo": "XS202601001",
+        "masterContractNo": "ZHT202601001"
+      }
+    ]
+  }
+}
+```
+
+### 4. 鍙戣揣绠$悊鎺ュ彛
+
+**GET /shippingInfo/listPage**
+
+**鍝嶅簲鏂板瀛楁锛�**
+
+```json
+{
+  "code": 200,
+  "data": {
+    "records": [
+      {
+        "id": 1,
+        "salesContractNo": "XS202601001",
+        "masterContractNo": "ZHT202601001"
+      }
+    ]
+  }
+}
+```
+
+**鏌ヨ鍙傛暟鏂板锛�**
+
+| 鍙傛暟 | 绫诲瀷 | 璇存槑 |
+|------|------|------|
+| masterContractNo | String | 鎬诲悎鍚屽彿锛堟ā绯婃煡璇級 |
+
+### 5. 閿�鍞��璐ф帴鍙�
+
+**GET /returnManagement/listPage**
+
+**鍝嶅簲鏂板瀛楁锛�**
+
+```json
+{
+  "code": 200,
+  "data": {
+    "records": [
+      {
+        "id": 1,
+        "returnNo": "TH202601001",
+        "salesContractNo": "XS202601001",
+        "masterContractNo": "ZHT202601001",
+        "shippingNo": "FH202601001"
+      }
+    ]
+  }
+}
+```
+
+**鏌ヨ鍙傛暟鏂板锛�**
+
+| 鍙傛暟 | 绫诲瀷 | 璇存槑 |
+|------|------|------|
+| masterContractNo | String | 鎬诲悎鍚屽彿锛堟ā绯婃煡璇級 |
+
+### 6. 閿�鍞��璐у彂璐т俊鎭帴鍙�
+
+**GET /shippingInfo/getShippingInfoForReturn**
+
+**鍝嶅簲鏂板瀛楁锛�**
+
+```json
+{
+  "code": 200,
+  "data": [
+    {
+      "shippingId": 1,
+      "shippingNo": "FH202601001",
+      "salesContractNo": "XS202601001",
+      "masterContractNo": "ZHT202601001",
+      "customerName": "瀹㈡埛鍚嶇О"
+    }
+  ]
+}
+```
+
+### 7. 璐㈠姟-閿�鍞嚭搴撳彴璐︽帴鍙�
+
+**GET /stockOutRecord/listPageAccountSales**
+
+**鍝嶅簲鏂板瀛楁锛�**
+
+```json
+{
+  "code": 200,
+  "data": {
+    "records": [
+      {
+        "id": 1,
+        "outboundBatches": "CK202601001",
+        "salesContractNo": "XS202601001",
+        "masterContractNo": "ZHT202601001",
+        "customerName": "瀹㈡埛鍚嶇О"
+      }
+    ]
+  }
+}
+```
+
+### 8. 璐㈠姟-閿�鍞��璐у彴璐︽帴鍙�
+
+**GET /returnManagement/listPageAccountSalesReturn**
+
+**鍝嶅簲鏂板瀛楁锛�**
+
+```json
+{
+  "code": 200,
+  "data": {
+    "records": [
+      {
+        "id": 1,
+        "returnNo": "TH202601001",
+        "salesContractNo": "XS202601001",
+        "masterContractNo": "ZHT202601001",
+        "customerName": "瀹㈡埛鍚嶇О"
+      }
+    ]
+  }
+}
+```
+
+### 9. 閲囪喘鍏ュ簱绠$悊鎺ュ彛
+
+**GET /stockin/listPage**
+
+**鍝嶅簲鏂板瀛楁锛�**
+
+```json
+{
+  "code": 200,
+  "data": {
+    "records": [
+      {
+        "id": 1,
+        "inboundBatches": "RK202601001",
+        "purchaseContractNumber": "CG202601001",
+        "masterContractNo": "ZHT202601001",
+        "supplierName": "渚涘簲鍟嗗悕绉�"
+      }
+    ]
+  }
+}
+```
+
+**GET /stockin/listPageCopy**
+
+**鍝嶅簲鏂板瀛楁锛�**
+
+```json
+{
+  "code": 200,
+  "data": {
+    "records": [
+      {
+        "id": 1,
+        "inboundBatches": "RK202601001",
+        "purchaseContractNumber": "CG202601001",
+        "masterContractNo": "ZHT202601001",
+        "supplierName": "渚涘簲鍟嗗悕绉�"
+      }
+    ]
+  }
+}
+```
+
+### 10. 閲囪喘閫�璐ф帴鍙�
+
+**GET /purchaseReturnOrders/listPage**
+
+**鍝嶅簲鏂板瀛楁锛�**
+
+```json
+{
+  "code": 200,
+  "data": {
+    "records": [
+      {
+        "id": 1,
+        "no": "CT202601001",
+        "purchaseContractNumber": "CG202601001",
+        "masterContractNo": "ZHT202601001",
+        "supplierName": "渚涘簲鍟嗗悕绉�"
+      }
+    ]
+  }
+}
+```
+
+### 11. 渚涘簲鍟嗗線鏉ユ槑缁嗘帴鍙�
+
+**GET /supplierManage/supplierTransactionsDetails**
+
+**鍝嶅簲鏂板瀛楁锛�**
+
+```json
+{
+  "code": 200,
+  "data": [
+    {
+      "purchaseLedgerId": 1,
+      "purchaseContractNumber": "CG202601001",
+      "masterContractNo": "ZHT202601001",
+      "executionDate": "2026-01-01",
+      "contractAmount": 10000.00
+    }
+  ]
+}
+```
+
+### 12. 璐㈠姟-閲囪喘鍏ュ簱鍙拌处鎺ュ彛
+
+**GET /stockInRecord/listPageAccountPurchase**
+
+**鍝嶅簲鏂板瀛楁锛�**
+
+```json
+{
+  "code": 200,
+  "data": {
+    "records": [
+      {
+        "id": 1,
+        "inboundBatches": "RK202601001",
+        "purchaseContractNumber": "CG202601001",
+        "masterContractNo": "ZHT202601001",
+        "supplierName": "渚涘簲鍟嗗悕绉�"
+      }
+    ]
+  }
+}
+```
+
+### 13. 璐㈠姟-閲囪喘閫�璐у彴璐︽帴鍙�
+
+**GET /purchaseReturnOrders/listPageAccountPurchaseReturn**
+
+**鍝嶅簲鏂板瀛楁锛�**
+
+```json
+{
+  "code": 200,
+  "data": {
+    "records": [
+      {
+        "id": 1,
+        "returnNo": "CT202601001",
+        "purchaseContractNumber": "CG202601001",
+        "masterContractNo": "ZHT202601001",
+        "supplierName": "渚涘簲鍟嗗悕绉�"
+      }
+    ]
+  }
+}
+```
+
+## 鍓嶇淇敼鐐�
+
+### 1. 琛ㄦ牸鍒楁坊鍔�
+
+鍦ㄥ悇椤甸潰鐨勮〃鏍间腑娣诲姞鎬诲悎鍚屽彿鍒楋細
+
+```html
+<el-table-column prop="masterContractNo" label="鎬诲悎鍚屽彿" min-width="120" />
+```
+
+### 2. 鏌ヨ鏉′欢娣诲姞
+
+鍦ㄩ渶瑕佹敮鎸佹�诲悎鍚屽彿鏌ヨ鐨勯〉闈㈡坊鍔犳悳绱㈡锛�
+
+```html
+<el-form-item label="鎬诲悎鍚屽彿">
+  <el-input v-model="queryParams.masterContractNo" placeholder="璇疯緭鍏ユ�诲悎鍚屽彿" clearable />
+</el-form-item>
+```
+
+### 3. 璇︾粏椤甸潰绀轰緥
+
+#### 鍙戣揣绠$悊椤甸潰
+
+```html
+<!-- 鏌ヨ鏉′欢 -->
+<el-form :model="queryParams" ref="queryForm" :inline="true">
+  <el-form-item label="閿�鍞悎鍚屽彿">
+    <el-input v-model="queryParams.salesContractNo" placeholder="璇疯緭鍏ラ攢鍞悎鍚屽彿" clearable />
+  </el-form-item>
+  <el-form-item label="鎬诲悎鍚屽彿">
+    <el-input v-model="queryParams.masterContractNo" placeholder="璇疯緭鍏ユ�诲悎鍚屽彿" clearable />
+  </el-form-item>
+</el-form>
+
+<!-- 琛ㄦ牸 -->
+<el-table :data="tableData" border>
+  <el-table-column prop="shippingNo" label="鍙戣揣鍗曞彿" width="150" />
+  <el-table-column prop="salesContractNo" label="閿�鍞悎鍚屽彿" width="150" />
+  <el-table-column prop="masterContractNo" label="鎬诲悎鍚屽彿" width="150" />
+  <el-table-column prop="customerName" label="瀹㈡埛鍚嶇О" width="150" />
+</el-table>
+```
+
+#### 閿�鍞��璐ч〉闈�
+
+```html
+<!-- 鏌ヨ鏉′欢 -->
+<el-form :model="queryParams" ref="queryForm" :inline="true">
+  <el-form-item label="閫�璐у崟鍙�">
+    <el-input v-model="queryParams.returnNo" placeholder="璇疯緭鍏ラ��璐у崟鍙�" clearable />
+  </el-form-item>
+  <el-form-item label="閿�鍞悎鍚屽彿">
+    <el-input v-model="queryParams.salesContractNo" placeholder="璇疯緭鍏ラ攢鍞悎鍚屽彿" clearable />
+  </el-form-item>
+  <el-form-item label="鎬诲悎鍚屽彿">
+    <el-input v-model="queryParams.masterContractNo" placeholder="璇疯緭鍏ユ�诲悎鍚屽彿" clearable />
+  </el-form-item>
+</el-form>
+
+<!-- 琛ㄦ牸 -->
+<el-table :data="tableData" border>
+  <el-table-column prop="returnNo" label="閫�璐у崟鍙�" width="150" />
+  <el-table-column prop="shippingNo" label="鍙戣揣鍗曞彿" width="150" />
+  <el-table-column prop="salesContractNo" label="閿�鍞悎鍚屽彿" width="150" />
+  <el-table-column prop="masterContractNo" label="鎬诲悎鍚屽彿" width="150" />
+  <el-table-column prop="customerName" label="瀹㈡埛鍚嶇О" width="150" />
+</el-table>
+```
+
+#### 閲囪喘鍏ュ簱绠$悊椤甸潰
+
+```html
+<!-- 琛ㄦ牸 -->
+<el-table :data="tableData" border>
+  <el-table-column prop="inboundBatches" label="鍏ュ簱鎵规" width="150" />
+  <el-table-column prop="purchaseContractNumber" label="閲囪喘鍚堝悓鍙�" width="150" />
+  <el-table-column prop="masterContractNo" label="鎬诲悎鍚屽彿" width="150" />
+  <el-table-column prop="supplierName" label="渚涘簲鍟嗗悕绉�" width="150" />
+  <el-table-column prop="productCategory" label="浜у搧澶х被" width="120" />
+  <el-table-column prop="specificationModel" label="瑙勬牸鍨嬪彿" width="120" />
+  <el-table-column prop="inboundNum" label="鍏ュ簱鏁伴噺" width="100" />
+</el-table>
+```
+
+#### 閲囪喘閫�璐ч〉闈�
+
+```html
+<!-- 琛ㄦ牸 -->
+<el-table :data="tableData" border>
+  <el-table-column prop="no" label="閫�璐у崟鍙�" width="150" />
+  <el-table-column prop="purchaseContractNumber" label="閲囪喘鍚堝悓鍙�" width="150" />
+  <el-table-column prop="masterContractNo" label="鎬诲悎鍚屽彿" width="150" />
+  <el-table-column prop="supplierName" label="渚涘簲鍟嗗悕绉�" width="150" />
+</el-table>
+```
+
+#### 渚涘簲鍟嗗線鏉ユ槑缁�
+
+```html
+<!-- 琛ㄦ牸 -->
+<el-table :data="tableData" border>
+  <el-table-column prop="purchaseContractNumber" label="閲囪喘鍚堝悓鍙�" width="150" />
+  <el-table-column prop="masterContractNo" label="鎬诲悎鍚屽彿" width="150" />
+  <el-table-column prop="executionDate" label="绛捐鏃ユ湡" width="120" />
+  <el-table-column prop="contractAmount" label="鍚堝悓閲戦" width="120" />
+</el-table>
+```
+
+#### 璐㈠姟-閲囪喘鍏ュ簱鍙拌处
+
+```html
+<!-- 琛ㄦ牸 -->
+<el-table :data="tableData" border>
+  <el-table-column prop="inboundBatches" label="鍏ュ簱鍗曞彿" width="150" />
+  <el-table-column prop="purchaseContractNumber" label="閲囪喘鍚堝悓鍙�" width="150" />
+  <el-table-column prop="masterContractNo" label="鎬诲悎鍚屽彿" width="150" />
+  <el-table-column prop="supplierName" label="渚涘簲鍟嗗悕绉�" width="150" />
+</el-table>
+```
+
+#### 璐㈠姟-閲囪喘閫�璐у彴璐�
+
+```html
+<!-- 琛ㄦ牸 -->
+<el-table :data="tableData" border>
+  <el-table-column prop="returnNo" label="閫�璐у崟鍙�" width="150" />
+  <el-table-column prop="purchaseContractNumber" label="閲囪喘鍚堝悓鍙�" width="150" />
+  <el-table-column prop="masterContractNo" label="鎬诲悎鍚屽彿" width="150" />
+  <el-table-column prop="supplierName" label="渚涘簲鍟嗗悕绉�" width="150" />
+</el-table>
+```
+
+### 4. data 鏁版嵁淇敼
+
+```js
+data() {
+  return {
+    queryParams: {
+      pageNum: 1,
+      pageSize: 10,
+      salesContractNo: '',
+      masterContractNo: '',  // 鏂板
+      // ... 鍏朵粬鏌ヨ鍙傛暟
+    }
+  }
+}
+```
+
+### 5. 瀵煎嚭鍔熻兘
+
+濡傞渶瀵煎嚭鍔熻兘锛岄渶鍦ㄥ鍑哄瓧娈典腑娣诲姞鎬诲悎鍚屽彿锛�
+
+```js
+// 瀵煎嚭鍒楅厤缃�
+const exportColumns = [
+  { prop: 'salesContractNo', label: '閿�鍞悎鍚屽彿' },
+  { prop: 'purchaseContractNumber', label: '閲囪喘鍚堝悓鍙�' },
+  { prop: 'masterContractNo', label: '鎬诲悎鍚屽彿' },
+  // ... 鍏朵粬鍒�
+];
+```
+
+## 娉ㄦ剰浜嬮」
+
+1. **瀛楁浣嶇疆**锛氬缓璁皢鎬诲悎鍚屽彿鍒楁斁鍦ㄩ攢鍞悎鍚屽彿/閲囪喘鍚堝悓鍙峰垪鍚庨潰锛屼繚鎸佷竴鑷存�с��
+
+2. **鏌ヨ閫昏緫**锛氭�诲悎鍚屽彿鏀寔妯$硦鏌ヨ锛屼笌鍚堝悓鍙锋煡璇㈡柟寮忎竴鑷淬��
+
+3. **鏁版嵁鍏宠仈**锛�
+   - 閿�鍞浉鍏筹細鎬诲悎鍚屽彿鏉ユ簮浜庨攢鍞彴璐︼紙sales_ledger锛夎〃鐨� master_contract_no 瀛楁
+   - 閲囪喘鐩稿叧锛氭�诲悎鍚屽彿鏉ユ簮浜庨噰璐彴璐︼紙purchase_ledger锛夎〃鐨� master_contract_no 瀛楁
+
+4. **澶氬�煎鐞�**锛氶儴鍒嗘煡璇紙濡傜敓浜ц鍗曪級鍙兘鍏宠仈澶氫釜閿�鍞彴璐︼紝姝ゆ椂鎬诲悎鍚屽彿浼氫互閫楀彿鍒嗛殧鏄剧ず澶氫釜鍊笺��
+
+5. **绌哄�煎鐞�**锛氬鏋滃彴璐︽湭濉啓鎬诲悎鍚屽彿锛岃瀛楁鍙兘涓虹┖锛屽墠绔渶鍋氬ソ绌哄�兼樉绀哄鐞嗐��
+
+6. **閿�鍞��璐ч�夋嫨鍙戣揣**锛氬湪閿�鍞��璐ч�夋嫨鍙戣揣淇℃伅鏃讹紝鎬诲悎鍚屽彿浼氫竴骞惰繑鍥烇紝渚夸簬璇嗗埆銆�
+
+7. **閲囪喘閫�璐ч�夋嫨鍏ュ簱**锛氬湪閲囪喘閫�璐ч�夋嫨鍏ュ簱淇℃伅鏃讹紝鎬诲悎鍚屽彿浼氫竴骞惰繑鍥烇紝渚夸簬璇嗗埆銆�
\ No newline at end of file
diff --git a/doc/20260625_stock_inspect_feature.md b/doc/20260625_stock_inspect_feature.md
new file mode 100644
index 0000000..ef666a2
--- /dev/null
+++ b/doc/20260625_stock_inspect_feature.md
@@ -0,0 +1,228 @@
+# 搴撳瓨娣诲姞璐ㄦ閫夋嫨鍔熻兘
+
+## 娑夊強椤甸潰
+
+- 搴撳瓨绠$悊椤甸潰锛堟柊澧炲簱瀛樺脊绐楋級
+
+## API
+
+| 鏂规硶 | 璺緞 | 璇存槑 |
+|------|------|------|
+| POST | /stockInventory/addStockInRecordOnly | 鏂板鍏ュ簱璁板綍锛堟敮鎸佽川妫�閫夋嫨锛� |
+
+**璇锋眰鍙傛暟锛�**
+
+| 鍙傛暟 | 绫诲瀷 | 蹇呭~ | 璇存槑 |
+|------|------|------|------|
+| productModelId | Long | 鏄� | 浜у搧瑙勬牸ID |
+| qualitity | BigDecimal | 鏄� | 鏁伴噺 |
+| batchNo | String | 鍚� | 鎵瑰彿锛堜笉濉嚜鍔ㄧ敓鎴愶級 |
+| warehouse | String | 鍚� | 浠撳簱 |
+| remark | String | 鍚� | 澶囨敞 |
+| warnNum | BigDecimal | 鍚� | 棰勮鏁伴噺 |
+| **needInspect** | Boolean | 鍚� | 鏄惁闇�瑕佽川妫�锛堥粯璁alse锛� |
+| **inspectType** | Integer | 鍚� | 璐ㄦ绫诲瀷锛�0-鍘熸潗鏂欐楠岋紙榛樿锛夛紝1-杩囩▼妫�楠� |
+
+**鍝嶅簲锛�**
+
+```json
+{
+  "code": 200,
+  "msg": "鎿嶄綔鎴愬姛"
+}
+```
+
+## 涓氬姟閫昏緫璇存槑
+
+### 涓嶉渶瑕佽川妫�锛坣eedInspect = false 鎴栦笉浼狅級
+- 鐩存帴鍒涘缓鍏ュ簱璁板綍
+- 鍘熸湁娴佺▼涓嶅彉
+
+### 闇�瑕佽川妫�锛坣eedInspect = true锛�
+- 鍒涘缓璐ㄦ鍗曪紙quality_inspect 琛級
+- 璐ㄦ鍗曠姸鎬佷负"鏈彁浜�"锛坕nspectState = 0锛�
+- **涓嶅垱寤哄叆搴撹褰�**锛岀瓑寰呰川妫�鍚堟牸鍚庣敱璐ㄦ娴佺▼鍏ュ簱
+- 璐ㄦ绫诲瀷鐢� inspectType 鍐冲畾锛�
+  - **inspectType = 0**锛氬師鏉愭枡妫�楠�
+  - **inspectType = 1**锛氳繃绋嬫楠岋紙閫傜敤浜庢垚鍝侊級
+
+## 鍓嶇淇敼鐐�
+
+### 1. 鏂板搴撳瓨寮圭獥 - 娣诲姞璐ㄦ閫夋嫨
+
+```html
+<el-dialog title="鏂板搴撳瓨" :visible.sync="dialogVisible">
+  <el-form :model="form" :rules="rules" ref="formRef">
+    <!-- 鍘熸湁瀛楁 -->
+    <el-form-item label="浜у搧瑙勬牸" prop="productModelId">
+      <el-select v-model="form.productModelId" placeholder="璇烽�夋嫨浜у搧瑙勬牸">
+        <!-- ... -->
+      </el-select>
+    </el-form-item>
+    
+    <el-form-item label="鏁伴噺" prop="qualitity">
+      <el-input-number v-model="form.qualitity" :min="0" />
+    </el-form-item>
+    
+    <el-form-item label="鎵瑰彿">
+      <el-input v-model="form.batchNo" placeholder="涓嶅~鑷姩鐢熸垚" />
+    </el-form-item>
+    
+    <el-form-item label="浠撳簱">
+      <el-select v-model="form.warehouse" placeholder="璇烽�夋嫨浠撳簱">
+        <!-- ... -->
+      </el-select>
+    </el-form-item>
+    
+    <el-form-item label="澶囨敞">
+      <el-input v-model="form.remark" type="textarea" />
+    </el-form-item>
+    
+    <!-- 鏂板锛氳川妫�閫夋嫨 -->
+    <el-form-item label="鏄惁璐ㄦ">
+      <el-switch 
+        v-model="form.needInspect"
+        active-text="闇�瑕佽川妫�"
+        inactive-text="鐩存帴鍏ュ簱"
+      />
+    </el-form-item>
+    
+    <!-- 鏂板锛氳川妫�绫诲瀷閫夋嫨锛堝綋闇�瑕佽川妫�鏃舵樉绀猴級 -->
+    <el-form-item label="璐ㄦ绫诲瀷" v-if="form.needInspect">
+      <el-radio-group v-model="form.inspectType">
+        <el-radio :label="0">鍘熸潗鏂欐楠�</el-radio>
+        <el-radio :label="1">杩囩▼妫�楠岋紙鎴愬搧锛�</el-radio>
+      </el-radio-group>
+    </el-form-item>
+  </el-form>
+  
+  <div slot="footer">
+    <el-button @click="dialogVisible = false">鍙栨秷</el-button>
+    <el-button type="primary" @click="handleSubmit">纭畾</el-button>
+  </div>
+</el-dialog>
+```
+
+### 2. data 鏁版嵁
+
+```js
+data() {
+  return {
+    dialogVisible: false,
+    form: {
+      productModelId: null,
+      qualitity: 0,
+      batchNo: '',
+      warehouse: '',
+      remark: '',
+      warnNum: null,
+      // 鏂板瀛楁
+      needInspect: false,
+      inspectType: 0,  // 榛樿鍘熸潗鏂欐楠�
+    },
+    rules: {
+      productModelId: [{ required: true, message: '璇烽�夋嫨浜у搧瑙勬牸', trigger: 'change' }],
+      qualitity: [{ required: true, message: '璇疯緭鍏ユ暟閲�', trigger: 'blur' }],
+    }
+  }
+}
+```
+
+### 3. 鏂规硶
+
+```js
+methods: {
+  // 鎵撳紑鏂板寮圭獥
+  handleAdd() {
+    this.dialogVisible = true;
+    this.form = {
+      productModelId: null,
+      qualitity: 0,
+      batchNo: '',
+      warehouse: '',
+      remark: '',
+      warnNum: null,
+      needInspect: false,
+      inspectType: 0,
+    };
+    if (this.$refs.formRef) {
+      this.$refs.formRef.resetFields();
+    }
+  },
+  
+  // 鎻愪氦鏂板搴撳瓨
+  handleSubmit() {
+    this.$refs.formRef.validate(async (valid) => {
+      if (!valid) return;
+      
+      try {
+        // 鏋勫缓璇锋眰鍙傛暟
+        const params = {
+          ...this.form,
+          // 濡傛灉涓嶉渶瑕佽川妫�锛屼笉浼� inspectType
+          inspectType: this.form.needInspect ? this.form.inspectType : undefined,
+        };
+        
+        const res = await this.$http.post('/stockInventory/addStockInRecordOnly', params);
+        if (res.code === 200) {
+          this.$message.success(
+            this.form.needInspect 
+              ? '宸插垱寤鸿川妫�鍗曪紝璇峰墠寰�璐ㄦ妯″潡澶勭悊' 
+              : '鏂板搴撳瓨鎴愬姛'
+          );
+          this.dialogVisible = false;
+          this.loadData();  // 鍒锋柊鍒楄〃
+        } else {
+          this.$message.error(res.msg || '鎿嶄綔澶辫触');
+        }
+      } catch (error) {
+        this.$message.error('璇锋眰澶辫触');
+      }
+    });
+  },
+  
+  // 璐ㄦ绫诲瀷鍒囨崲鏃剁殑鎻愮ず
+  handleInspectTypeChange(value) {
+    if (value === 0) {
+      this.form.inspectTypeTip = '閫傜敤浜庡師鏉愭枡鍏ュ簱妫�楠�';
+    } else if (value === 1) {
+      this.form.inspectTypeTip = '閫傜敤浜庢垚鍝佽繃绋嬫楠�';
+    }
+  }
+}
+```
+
+### 4. 鏍峰紡浼樺寲锛堝彲閫夛級
+
+```css
+/* 璐ㄦ閫夋嫨鍖哄煙鏍峰紡 */
+.quality-inspect-section {
+  margin-top: 20px;
+  padding-top: 15px;
+  border-top: 1px dashed #eee;
+}
+
+.inspect-type-tip {
+  margin-left: 10px;
+  font-size: 12px;
+  color: #909399;
+}
+```
+
+## 娉ㄦ剰浜嬮」
+
+1. **璐ㄦ鍚庡叆搴撴祦绋�**锛氬綋閫夋嫨璐ㄦ鍚庯紝涓嶄細鍒涘缓鍏ュ簱璁板綍锛岄渶瑕佽川妫�浜哄憳鍦ㄨ川妫�妯″潡瀹屾垚妫�楠屽苟鎻愪氦锛屽悎鏍兼暟閲忔墠浼氳嚜鍔ㄥ叆搴撱��
+
+2. **璐ㄦ鍗曟煡鐪�**锛氶�夋嫨璐ㄦ鍚庡垱寤虹殑璐ㄦ鍗曞彲浠ュ湪浠ヤ笅浣嶇疆鏌ョ湅锛�
+   - 鍘熸潗鏂欐楠岋細`/quality/rawMaterialInspect` 鎴栬川妫�绠$悊-鍘熸潗鏂欐楠�
+   - 杩囩▼妫�楠岋細`/quality/processInspect` 鎴栬川妫�绠$悊-杩囩▼妫�楠�
+
+3. **璐ㄦ绫诲瀷閫夋嫨寤鸿**锛�
+   - 鍘熸潗鏂�/閲囪喘鍏ュ簱 鈫� 閫夋嫨"鍘熸潗鏂欐楠�"锛坕nspectType=0锛�
+   - 鐢熶骇鎴愬搧鍏ュ簱 鈫� 閫夋嫨"杩囩▼妫�楠�"锛坕nspectType=1锛�
+
+4. **鎵瑰彿澶勭悊**锛氬鏋滀紶浜嗘壒鍙凤紝璐ㄦ鍗曞叧鑱旂殑鍏ュ簱璁板綍浼氫娇鐢ㄨ鎵瑰彿锛涘鏋滄湭浼犳壒鍙凤紝绯荤粺浼氳嚜鍔ㄧ敓鎴愭壒鍙枫��
+
+5. **鐢ㄦ埛浣撻獙浼樺寲寤鸿**锛�
+   - 褰撳垏鎹�"闇�瑕佽川妫�"寮�鍏虫椂锛屽彲浠ユ樉绀轰竴涓彁绀轰俊鎭鏄庡悗缁祦绋�
+   - 璐ㄦ绫诲瀷鍙互鏍规嵁浜у搧绫诲瀷鑷姩鎺ㄨ崘锛堝鏋滃墠绔兘鑾峰彇浜у搧绫诲瀷淇℃伅锛�
\ No newline at end of file
diff --git a/doc/20260625_stock_inspect_feature.sql b/doc/20260625_stock_inspect_feature.sql
new file mode 100644
index 0000000..807438a
--- /dev/null
+++ b/doc/20260625_stock_inspect_feature.sql
@@ -0,0 +1,11 @@
+-- 搴撳瓨娣诲姞璐ㄦ閫夋嫨鍔熻兘
+-- 鏃ユ湡锛�2026-06-25
+-- 璇存槑锛氭柊澧炲簱瀛樻椂鏀寔閫夋嫨鏄惁闇�瑕佽川妫�锛屽師鏉愭枡瀵瑰簲鍘熸枡妫�楠岋紝鎴愬搧瀵瑰簲杩囩▼妫�楠�
+
+-- 娉ㄦ剰锛氭湰鍔熻兘涓嶉渶瑕佷慨鏀规暟鎹簱琛ㄧ粨鏋�
+-- needInspect 鍜� inspectType 涓烘帴鍙h姹傚弬鏁帮紝鐢ㄤ簬鎺у埗涓氬姟閫昏緫
+-- 璐ㄦ鍗曞垱寤哄悗锛岃川妫�鍚堟牸閫氳繃鍚庝細鑷姩鍏ュ簱鍒� stock_inventory 琛�
+
+-- 璐ㄦ绫诲瀷璇存槑锛�
+-- inspectType = 0: 鍘熸潗鏂欐楠岋紙榛樿锛�
+-- inspectType = 1: 杩囩▼妫�楠岋紙鎴愬搧锛�
diff --git a/src/main/java/com/ruoyi/account/bean/vo/purchase/PurchaseInboundVo.java b/src/main/java/com/ruoyi/account/bean/vo/purchase/PurchaseInboundVo.java
index 48831e1..c4a50d7 100644
--- a/src/main/java/com/ruoyi/account/bean/vo/purchase/PurchaseInboundVo.java
+++ b/src/main/java/com/ruoyi/account/bean/vo/purchase/PurchaseInboundVo.java
@@ -45,4 +45,8 @@
     @Schema(description = "閲囪喘璁㈠崟鍙�")
     @Excel(name = "閲囪喘璁㈠崟鍙�")
     private String purchaseContractNumber;
+
+    @Schema(description = "鎬诲悎鍚屽彿")
+    @Excel(name = "鎬诲悎鍚屽彿")
+    private String masterContractNo;
 }
diff --git a/src/main/java/com/ruoyi/account/bean/vo/purchase/PurchaseReturnVo.java b/src/main/java/com/ruoyi/account/bean/vo/purchase/PurchaseReturnVo.java
index 82a90a3..ccd1168 100644
--- a/src/main/java/com/ruoyi/account/bean/vo/purchase/PurchaseReturnVo.java
+++ b/src/main/java/com/ruoyi/account/bean/vo/purchase/PurchaseReturnVo.java
@@ -45,4 +45,8 @@
     @Schema(description = "閲囪喘璁㈠崟鍙�")
     @Excel(name = "閲囪喘璁㈠崟鍙�")
     private String purchaseContractNumber;
+
+    @Schema(description = "鎬诲悎鍚屽彿")
+    @Excel(name = "鎬诲悎鍚屽彿")
+    private String masterContractNo;
 }
diff --git a/src/main/java/com/ruoyi/account/bean/vo/sales/SalesOutboundVo.java b/src/main/java/com/ruoyi/account/bean/vo/sales/SalesOutboundVo.java
index 13c1b27..c8121a3 100644
--- a/src/main/java/com/ruoyi/account/bean/vo/sales/SalesOutboundVo.java
+++ b/src/main/java/com/ruoyi/account/bean/vo/sales/SalesOutboundVo.java
@@ -52,4 +52,8 @@
     @Schema(description = "閿�鍞鍗曞彿")
     @Excel(name = "閿�鍞鍗曞彿")
     private String salesContractNo;
+
+    @Schema(description = "鎬诲悎鍚屽彿")
+    @Excel(name = "鎬诲悎鍚屽彿")
+    private String masterContractNo;
 }
diff --git a/src/main/java/com/ruoyi/account/bean/vo/sales/SalesReturnVo.java b/src/main/java/com/ruoyi/account/bean/vo/sales/SalesReturnVo.java
index 980d7f8..e91d27b 100644
--- a/src/main/java/com/ruoyi/account/bean/vo/sales/SalesReturnVo.java
+++ b/src/main/java/com/ruoyi/account/bean/vo/sales/SalesReturnVo.java
@@ -45,4 +45,8 @@
     @Schema(description = "閿�鍞鍗曞彿")
     @Excel(name = "閿�鍞鍗曞彿")
     private String salesContractNo;
+
+    @Schema(description = "鎬诲悎鍚屽彿")
+    @Excel(name = "鎬诲悎鍚屽彿")
+    private String masterContractNo;
 }
diff --git a/src/main/java/com/ruoyi/procurementrecord/bean/dto/ProcurementPageDto.java b/src/main/java/com/ruoyi/procurementrecord/bean/dto/ProcurementPageDto.java
index fa3e337..5198787 100644
--- a/src/main/java/com/ruoyi/procurementrecord/bean/dto/ProcurementPageDto.java
+++ b/src/main/java/com/ruoyi/procurementrecord/bean/dto/ProcurementPageDto.java
@@ -39,6 +39,11 @@
     private String purchaseContractNumber;
 
     /**
+     * 鎬诲悎鍚屽彿
+     */
+    private String masterContractNo;
+
+    /**
      * 閿�鍞悎鍚屽彿
      */
     private String salesContractNo;
diff --git a/src/main/java/com/ruoyi/procurementrecord/bean/dto/ProcurementPageDtoCopy.java b/src/main/java/com/ruoyi/procurementrecord/bean/dto/ProcurementPageDtoCopy.java
index 8e89c2f..a41dd7f 100644
--- a/src/main/java/com/ruoyi/procurementrecord/bean/dto/ProcurementPageDtoCopy.java
+++ b/src/main/java/com/ruoyi/procurementrecord/bean/dto/ProcurementPageDtoCopy.java
@@ -33,6 +33,11 @@
      */
     private String purchaseContractNumber;
 
+    /**
+     * 鎬诲悎鍚屽彿
+     */
+    private String masterContractNo;
+
 
     /**
      * 閿�鍞悎鍚屽彿
diff --git a/src/main/java/com/ruoyi/procurementrecord/bean/dto/ReturnManagementDto.java b/src/main/java/com/ruoyi/procurementrecord/bean/dto/ReturnManagementDto.java
index 5db9ad9..078c6a8 100644
--- a/src/main/java/com/ruoyi/procurementrecord/bean/dto/ReturnManagementDto.java
+++ b/src/main/java/com/ruoyi/procurementrecord/bean/dto/ReturnManagementDto.java
@@ -21,6 +21,9 @@
     @Schema(description = "閿�鍞崟鍙�")
     private String salesContractNo;
 
+    @Schema(description = "鎬诲悎鍚屽彿")
+    private String masterContractNo;
+
     @Schema(description = "涓氬姟鍛�")
     private String salesman;
 
diff --git a/src/main/java/com/ruoyi/production/bean/dto/ProductionPlanDto.java b/src/main/java/com/ruoyi/production/bean/dto/ProductionPlanDto.java
index c4363a8..fa3ab81 100644
--- a/src/main/java/com/ruoyi/production/bean/dto/ProductionPlanDto.java
+++ b/src/main/java/com/ruoyi/production/bean/dto/ProductionPlanDto.java
@@ -55,4 +55,7 @@
     @Schema(description = "閿�鍞悎鍚屽彿")
     private String salesContractNo;
 
+    @Schema(description = "鎬诲悎鍚屽彿")
+    private String masterContractNo;
+
 }
diff --git a/src/main/java/com/ruoyi/production/bean/dto/ProductionProductMainDto.java b/src/main/java/com/ruoyi/production/bean/dto/ProductionProductMainDto.java
index cbac4b5..935c020 100644
--- a/src/main/java/com/ruoyi/production/bean/dto/ProductionProductMainDto.java
+++ b/src/main/java/com/ruoyi/production/bean/dto/ProductionProductMainDto.java
@@ -51,6 +51,9 @@
     @Schema(description = "閿�鍞悎鍚屽彿")
     private String salesContractNo;
 
+    @Schema(description = "鎬诲悎鍚屽彿")
+    private String masterContractNo;
+
     @Schema(description = "鎺掍骇鏃ユ湡")
     private LocalDate schedulingDate;
 
diff --git a/src/main/java/com/ruoyi/production/bean/vo/ProductionOrderVo.java b/src/main/java/com/ruoyi/production/bean/vo/ProductionOrderVo.java
index 01ef33a..5b5419d 100644
--- a/src/main/java/com/ruoyi/production/bean/vo/ProductionOrderVo.java
+++ b/src/main/java/com/ruoyi/production/bean/vo/ProductionOrderVo.java
@@ -17,6 +17,9 @@
     @Schema(description = "閿�鍞悎鍚屽彿")
     private String salesContractNo;
 
+    @Schema(description = "鎬诲悎鍚屽彿")
+    private String masterContractNo;
+
     @Schema(description = "瀹㈡埛鍚嶇О")
     private String customerName;
 
diff --git a/src/main/java/com/ruoyi/production/bean/vo/ProductionPlanVo.java b/src/main/java/com/ruoyi/production/bean/vo/ProductionPlanVo.java
index a39c83a..17cb9de 100644
--- a/src/main/java/com/ruoyi/production/bean/vo/ProductionPlanVo.java
+++ b/src/main/java/com/ruoyi/production/bean/vo/ProductionPlanVo.java
@@ -25,6 +25,9 @@
     @Schema(description = "閿�鍞悎鍚屽彿")
     private String salesContractNo;
 
+    @Schema(description = "鎬诲悎鍚屽彿")
+    private String masterContractNo;
+
     @Schema(description = "瀹㈡埛鍚嶇О")
     private String customerName;
 
diff --git a/src/main/java/com/ruoyi/purchase/dto/PurchaseReturnOrderHasAllInfoDto.java b/src/main/java/com/ruoyi/purchase/dto/PurchaseReturnOrderHasAllInfoDto.java
index 68ef597..7a80883 100644
--- a/src/main/java/com/ruoyi/purchase/dto/PurchaseReturnOrderHasAllInfoDto.java
+++ b/src/main/java/com/ruoyi/purchase/dto/PurchaseReturnOrderHasAllInfoDto.java
@@ -15,6 +15,9 @@
     // 閲囪喘鍚堝悓鍙�
     private String purchaseContractNumber;
 
+    // 鎬诲悎鍚屽彿
+    private String masterContractNo;
+
     //閫�鏂欎汉濮撳悕
     private String returnUserName;
 
diff --git a/src/main/java/com/ruoyi/purchase/vo/SupplierTransactionsDetailsVo.java b/src/main/java/com/ruoyi/purchase/vo/SupplierTransactionsDetailsVo.java
index 3533e6e..0704ee8 100644
--- a/src/main/java/com/ruoyi/purchase/vo/SupplierTransactionsDetailsVo.java
+++ b/src/main/java/com/ruoyi/purchase/vo/SupplierTransactionsDetailsVo.java
@@ -17,6 +17,9 @@
     @Schema(description = "閲囪喘鍚堝悓鍙�")
     private String purchaseContractNumber;
 
+    @Schema(description = "鎬诲悎鍚屽彿")
+    private String masterContractNo;
+
     @Schema(description = "閲囪喘鍚堝悓绛捐鏃ユ湡")
     @JsonFormat(pattern = "yyyy-MM-dd")
     private Date executionDate;
diff --git a/src/main/java/com/ruoyi/quality/dto/QualityInspectDto.java b/src/main/java/com/ruoyi/quality/dto/QualityInspectDto.java
index 0a51a19..bc82f52 100644
--- a/src/main/java/com/ruoyi/quality/dto/QualityInspectDto.java
+++ b/src/main/java/com/ruoyi/quality/dto/QualityInspectDto.java
@@ -25,6 +25,7 @@
 
     private String salesContractNo;
 
+    private String masterContractNo;
 
     private String workOrderNo;
     private String purchaseContractNo;
diff --git a/src/main/java/com/ruoyi/sales/pojo/ShippingInfo.java b/src/main/java/com/ruoyi/sales/pojo/ShippingInfo.java
index 3e06782..6b7ac52 100644
--- a/src/main/java/com/ruoyi/sales/pojo/ShippingInfo.java
+++ b/src/main/java/com/ruoyi/sales/pojo/ShippingInfo.java
@@ -24,6 +24,11 @@
     private String salesContractNo;
 
     @TableField(exist = false)
+    @Schema(description = "鎬诲悎鍚屽彿")
+    @Excel(name = "鎬诲悎鍚屽彿")
+    private String masterContractNo;
+
+    @TableField(exist = false)
     @Schema(description = "瀹㈡埛鍚嶇О")
     @Excel(name = "瀹㈡埛鍚嶇О")
     private String customerName;
diff --git a/src/main/java/com/ruoyi/sales/vo/CustomerTransactionsDetailsVo.java b/src/main/java/com/ruoyi/sales/vo/CustomerTransactionsDetailsVo.java
index 3771647..18c98d5 100644
--- a/src/main/java/com/ruoyi/sales/vo/CustomerTransactionsDetailsVo.java
+++ b/src/main/java/com/ruoyi/sales/vo/CustomerTransactionsDetailsVo.java
@@ -17,6 +17,9 @@
     @Schema(description = "閿�鍞悎鍚屽彿")
     private String salesContractNo;
 
+    @Schema(description = "鎬诲悎鍚屽彿")
+    private String masterContractNo;
+
     @Schema(description = "閿�鍞悎鍚岀璁㈡棩鏈�")
     @JsonFormat(pattern = "yyyy-MM-dd")
     private LocalDate executionDate;
diff --git a/src/main/java/com/ruoyi/sales/vo/CustomerTransactionsProductVo.java b/src/main/java/com/ruoyi/sales/vo/CustomerTransactionsProductVo.java
index 9b0452b..89943e2 100644
--- a/src/main/java/com/ruoyi/sales/vo/CustomerTransactionsProductVo.java
+++ b/src/main/java/com/ruoyi/sales/vo/CustomerTransactionsProductVo.java
@@ -18,6 +18,9 @@
     @Schema(description = "閿�鍞悎鍚屽彿")
     private String salesContractNo;
 
+    @Schema(description = "鎬诲悎鍚屽彿")
+    private String masterContractNo;
+
     @Schema(description = "浜у搧ID")
     private Long productId;
 
diff --git a/src/main/java/com/ruoyi/sales/vo/CustomerTransactionsShipmentVo.java b/src/main/java/com/ruoyi/sales/vo/CustomerTransactionsShipmentVo.java
index e9ef8ea..44d1e45 100644
--- a/src/main/java/com/ruoyi/sales/vo/CustomerTransactionsShipmentVo.java
+++ b/src/main/java/com/ruoyi/sales/vo/CustomerTransactionsShipmentVo.java
@@ -20,6 +20,9 @@
     @Schema(description = "閿�鍞悎鍚屽彿")
     private String salesContractNo;
 
+    @Schema(description = "鎬诲悎鍚屽彿")
+    private String masterContractNo;
+
     @Schema(description = "鍙戣揣鍗旾D")
     private Long shippingId;
 
diff --git a/src/main/java/com/ruoyi/sales/vo/ShippingInfoForReturnVo.java b/src/main/java/com/ruoyi/sales/vo/ShippingInfoForReturnVo.java
index 0d670ea..2d69e94 100644
--- a/src/main/java/com/ruoyi/sales/vo/ShippingInfoForReturnVo.java
+++ b/src/main/java/com/ruoyi/sales/vo/ShippingInfoForReturnVo.java
@@ -23,6 +23,9 @@
     @Schema(description = "閿�鍞悎鍚屽彿")
     private String salesContractNo;
 
+    @Schema(description = "鎬诲悎鍚屽彿")
+    private String masterContractNo;
+
     @Schema(description = "瀹㈡埛鍚嶇О")
     private String customerName;
 
diff --git a/src/main/java/com/ruoyi/stock/dto/StockInventoryDto.java b/src/main/java/com/ruoyi/stock/dto/StockInventoryDto.java
index 756d28e..34b0141 100644
--- a/src/main/java/com/ruoyi/stock/dto/StockInventoryDto.java
+++ b/src/main/java/com/ruoyi/stock/dto/StockInventoryDto.java
@@ -83,4 +83,10 @@
 
     @Schema(description = "鍑哄簱鎵瑰彿")
     private String outboundBatches;
+
+    @Schema(description = "鏄惁闇�瑕佽川妫�")
+    private Boolean needInspect;
+
+    @Schema(description = "璐ㄦ绫诲瀷锛�0-鍘熸潗鏂欐楠岋紝1-杩囩▼妫�楠�")
+    private Integer inspectType;
 }
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 48f39f1..afa8098 100644
--- a/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
+++ b/src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
@@ -15,6 +15,8 @@
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.framework.web.domain.R;
 import com.ruoyi.project.system.service.ISysDictDataService;
+import com.ruoyi.quality.dto.QualityInspectDto;
+import com.ruoyi.quality.service.IQualityInspectService;
 import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
 import com.ruoyi.sales.pojo.SalesLedgerProduct;
 import com.ruoyi.stock.dto.StockInRecordDto;
@@ -30,7 +32,8 @@
 import com.ruoyi.stock.service.StockOutRecordService;
 import com.ruoyi.stock.service.StockUninventoryService;
 import jakarta.servlet.http.HttpServletResponse;
-import lombok.RequiredArgsConstructor;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
@@ -52,7 +55,6 @@
  * @since 2026-01-21 04:16:36
  */
 @Service
-@RequiredArgsConstructor
 public class StockInventoryServiceImpl extends ServiceImpl<StockInventoryMapper, StockInventory> implements StockInventoryService {
 
     private final StockInventoryMapper stockInventoryMapper;
@@ -62,6 +64,26 @@
     private final SalesLedgerProductMapper salesLedgerProductMapper;
     private final ProductModelMapper productModelMapper;
     private final ISysDictDataService sysDictDataService;
+    private final IQualityInspectService qualityInspectService;
+
+    public StockInventoryServiceImpl(
+            StockInventoryMapper stockInventoryMapper,
+            StockInRecordService stockInRecordService,
+            StockOutRecordService stockOutRecordService,
+            StockUninventoryService stockUninventoryService,
+            SalesLedgerProductMapper salesLedgerProductMapper,
+            ProductModelMapper productModelMapper,
+            ISysDictDataService sysDictDataService,
+            @Lazy IQualityInspectService qualityInspectService) {
+        this.stockInventoryMapper = stockInventoryMapper;
+        this.stockInRecordService = stockInRecordService;
+        this.stockOutRecordService = stockOutRecordService;
+        this.stockUninventoryService = stockUninventoryService;
+        this.salesLedgerProductMapper = salesLedgerProductMapper;
+        this.productModelMapper = productModelMapper;
+        this.sysDictDataService = sysDictDataService;
+        this.qualityInspectService = qualityInspectService;
+    }
 
     @Override
     public IPage<StockInventoryDto> pagestockInventory(Page page, StockInventoryDto stockInventoryDto) {
@@ -122,6 +144,51 @@
         return true;
     }
 
+    /**
+     * 鍒涘缓璐ㄦ鍗�
+     * 鏍规嵁 inspectType 鍐冲畾璐ㄦ绫诲瀷锛�
+     * - 0: 鍘熸潗鏂欐楠�
+     * - 1: 杩囩▼妫�楠�
+     * 濡傛灉鏈寚瀹� inspectType锛屽垯鏍规嵁浜у搧淇℃伅鑷姩鍒ゆ柇
+     */
+    private void createQualityInspect(StockInventoryDto stockInventoryDto) {
+        // 鏌ヨ浜у搧淇℃伅
+        ProductModel productModel = productModelMapper.selectById(stockInventoryDto.getProductModelId());
+        if (productModel == null) {
+            throw new ServiceException("浜у搧瑙勬牸涓嶅瓨鍦�");
+        }
+
+        // 纭畾 inspectType
+        Integer inspectType = stockInventoryDto.getInspectType();
+        if (inspectType == null) {
+            // 榛樿浣跨敤鍘熸潗鏂欐楠�
+            inspectType = 0;
+        }
+
+        // 鏋勫缓璐ㄦ鍗�
+        QualityInspectDto qualityInspectDto = new QualityInspectDto();
+        qualityInspectDto.setInspectType(inspectType);
+        qualityInspectDto.setProductModelId(stockInventoryDto.getProductModelId());
+        qualityInspectDto.setProductId(productModel.getProductId());
+        qualityInspectDto.setProductName(stockInventoryDto.getProductName());
+        qualityInspectDto.setQuantity(stockInventoryDto.getQualitity());
+        qualityInspectDto.setInspectState(0); // 鏈彁浜�
+//        qualityInspectDto.setRemark(stockInventoryDto.getRemark());
+
+        // 璁剧疆浜у搧淇℃伅
+        if (productModel.getProductName() != null) {
+            qualityInspectDto.setProductName(productModel.getProductName());
+        }
+        qualityInspectDto.setModel(productModel.getModel());
+        qualityInspectDto.setUnit(productModel.getUnit());
+
+        // 鍒濆鍖栫┖鐨勬楠屽弬鏁板垪琛�
+        qualityInspectDto.setQualityInspectParams(new ArrayList<>());
+
+        // 淇濆瓨璐ㄦ鍗�
+        qualityInspectService.add(qualityInspectDto);
+    }
+
     //鍑哄簱璋冪敤
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -171,6 +238,14 @@
         }
         stockInventoryDto.setBatchNo(batchNo);
 
+        // 鍒ゆ柇鏄惁闇�瑕佽川妫�
+        if (Boolean.TRUE.equals(stockInventoryDto.getNeedInspect())) {
+            // 鍒涘缓璐ㄦ鍗�
+            createQualityInspect(stockInventoryDto);
+            return true;
+        }
+
+        // 涓嶉渶瑕佽川妫�锛岀洿鎺ュ垱寤哄叆搴撹褰�
         StockInRecordDto stockInRecordDto = new StockInRecordDto();
         stockInRecordDto.setRecordId(stockInventoryDto.getRecordId());
         stockInRecordDto.setRecordType(stockInventoryDto.getRecordType());
diff --git a/src/main/resources/mapper/basic/SupplierManageMapper.xml b/src/main/resources/mapper/basic/SupplierManageMapper.xml
index 299274c..7680b68 100644
--- a/src/main/resources/mapper/basic/SupplierManageMapper.xml
+++ b/src/main/resources/mapper/basic/SupplierManageMapper.xml
@@ -113,6 +113,7 @@
             resultType="com.ruoyi.purchase.vo.SupplierTransactionsDetailsVo">
        select pl.id  purchaseLedgerId,
               pl.purchase_contract_number,
+              pl.master_contract_no,
               pl.execution_date,
               pl.contract_amount,
               IFNULL(T1.paymentAmount, 0) AS paymentAmount,
diff --git a/src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml b/src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml
index f1a87ca..149e815 100644
--- a/src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml
+++ b/src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml
@@ -32,6 +32,7 @@
         select
         t3.supplier_name,
         t3.purchase_contract_number,
+        t3.master_contract_no,
         t2.product_category,
         t1.id,
         t1.sales_ledger_product_id,
@@ -72,6 +73,7 @@
         select
             t3.supplier_name,
             t3.purchase_contract_number,
+            t3.master_contract_no,
             t2.product_category,
             t1.id,
             t2.specification_model,
@@ -121,6 +123,7 @@
         select
         t3.supplier_name,
         t3.purchase_contract_number,
+        t3.master_contract_no,
         t2.product_category,
         t1.id,
         t1.sales_ledger_product_id,
@@ -179,6 +182,7 @@
         select
             t3.supplier_name,
             t3.purchase_contract_number,
+            t3.master_contract_no,
             t2.product_category,
             t1.id,
             t1.sales_ledger_product_id,
diff --git a/src/main/resources/mapper/procurementrecord/ReturnManagementMapper.xml b/src/main/resources/mapper/procurementrecord/ReturnManagementMapper.xml
index 100830d..4598fdf 100644
--- a/src/main/resources/mapper/procurementrecord/ReturnManagementMapper.xml
+++ b/src/main/resources/mapper/procurementrecord/ReturnManagementMapper.xml
@@ -8,6 +8,7 @@
                si.shipping_no,
                sl.project_name,
                sl.sales_contract_no,
+               sl.master_contract_no,
                sl.salesman,
                IFNULL(sq.shipping_qty, 0) AS shippingQuantity,
                IFNULL(rs.total_return_num, 0) AS returnedQuantity,
@@ -58,6 +59,9 @@
             <if test="req.salesContractNo != null and req.salesContractNo != ''">
                 and sl.sales_contract_no like concat('%',#{req.salesContractNo},'%')
             </if>
+            <if test="req.masterContractNo != null and req.masterContractNo != ''">
+                and sl.master_contract_no like concat('%',#{req.masterContractNo},'%')
+            </if>
         </where>
         order by rm.id desc
     </select>
@@ -67,6 +71,7 @@
                si.shipping_no,
                sl.project_name,
                sl.sales_contract_no,
+               sl.master_contract_no,
                sl.salesman
         from return_management rm
                  left join shipping_info si on rm.shipping_id = si.id
@@ -83,7 +88,8 @@
                 rm.refund_amount,
                 rm.return_reason,
                 rm.make_time,
-                sl.sales_contract_no
+                sl.sales_contract_no,
+                sl.master_contract_no
         from return_management rm
                  left join shipping_info si on rm.shipping_id = si.id
                  left join customer c on rm.customer_id = c.id
diff --git a/src/main/resources/mapper/production/ProductionOrderMapper.xml b/src/main/resources/mapper/production/ProductionOrderMapper.xml
index 8e64413..7326fe4 100644
--- a/src/main/resources/mapper/production/ProductionOrderMapper.xml
+++ b/src/main/resources/mapper/production/ProductionOrderMapper.xml
@@ -23,6 +23,7 @@
 
     <resultMap id="ProductionOrderVoResultMap" type="com.ruoyi.production.bean.vo.ProductionOrderVo" extends="BaseResultMap">
         <result column="salesContractNo" property="salesContractNo" />
+        <result column="masterContractNo" property="masterContractNo" />
         <result column="customerName" property="customerName" />
         <result column="productName" property="productName" />
         <result column="model" property="model" />
@@ -47,6 +48,7 @@
         po.plan_complete_time,
         po.status,
         po_sales.salesContractNo,
+        po_sales.masterContractNo,
         po_sales.customerName,
         p.product_name as productName,
         pm.model as model,
@@ -62,6 +64,7 @@
                  left join (
             select po2.id as orderId,
                    group_concat(distinct sl2.sales_contract_no order by sl2.sales_contract_no separator ',') as salesContractNo,
+                   group_concat(distinct sl2.master_contract_no order by sl2.master_contract_no separator ',') as masterContractNo,
                    group_concat(distinct sl2.customer_name order by sl2.customer_name separator ',') as customerName,
                    group_concat(distinct sl2.project_name order by sl2.project_name separator ',') as projectName,
                    min(sl2.delivery_date) as deliveryDate
diff --git a/src/main/resources/mapper/production/ProductionPlanMapper.xml b/src/main/resources/mapper/production/ProductionPlanMapper.xml
index 69ccd36..d4b4691 100644
--- a/src/main/resources/mapper/production/ProductionPlanMapper.xml
+++ b/src/main/resources/mapper/production/ProductionPlanMapper.xml
@@ -27,6 +27,7 @@
         p.product_name AS productName,
         pm.unit,
         sl.sales_contract_no,
+        sl.master_contract_no,
         sl.customer_name,
         sl.project_name
         FROM production_plan pp
@@ -55,6 +56,9 @@
                 </if>
                 <if test="c.salesContractNo != null and c.salesContractNo != ''">
                     and sl.sales_contract_no like concat('%', #{c.salesContractNo}, '%')
+                </if>
+                <if test="c.masterContractNo != null and c.masterContractNo != ''">
+                    and sl.master_contract_no like concat('%', #{c.masterContractNo}, '%')
                 </if>
             </if>
         </where>
@@ -94,6 +98,7 @@
         p.product_name AS productName,
         pm.unit,
         sl.sales_contract_no,
+        sl.master_contract_no,
         sl.customer_name,
         sl.project_name
         FROM production_plan pp
diff --git a/src/main/resources/mapper/production/ProductionProductMainMapper.xml b/src/main/resources/mapper/production/ProductionProductMainMapper.xml
index df585f9..1b5f92d 100644
--- a/src/main/resources/mapper/production/ProductionProductMainMapper.xml
+++ b/src/main/resources/mapper/production/ProductionProductMainMapper.xml
@@ -31,6 +31,7 @@
                pm.model as productModelName,
                pm.unit,
                po_sales.salesContractNo,
+               po_sales.masterContractNo,
                date(ppm.create_time) as schedulingDate,
                su.nick_name as schedulingUserName,
                po_sales.customerName,
@@ -42,6 +43,7 @@
                  left join (
             select po2.id as orderId,
                    group_concat(distinct sl2.sales_contract_no order by sl2.sales_contract_no separator ',') as salesContractNo,
+                   group_concat(distinct sl2.master_contract_no order by sl2.master_contract_no separator ',') as masterContractNo,
                    group_concat(distinct sl2.customer_name order by sl2.customer_name separator ',') as customerName
             from production_order po2
                      left join production_plan pp2
@@ -63,6 +65,9 @@
             <if test="c.salesContractNo != null and c.salesContractNo != ''">
                 and po_sales.salesContractNo like concat('%', #{c.salesContractNo}, '%')
             </if>
+            <if test="c.masterContractNo != null and c.masterContractNo != ''">
+                and po_sales.masterContractNo like concat('%', #{c.masterContractNo}, '%')
+            </if>
             <if test="c.customerName != null and c.customerName != ''">
                 and po_sales.customerName like concat('%', #{c.customerName}, '%')
             </if>
diff --git a/src/main/resources/mapper/purchase/PurchaseReturnOrdersMapper.xml b/src/main/resources/mapper/purchase/PurchaseReturnOrdersMapper.xml
index 2f782ff..b7c9a1f 100644
--- a/src/main/resources/mapper/purchase/PurchaseReturnOrdersMapper.xml
+++ b/src/main/resources/mapper/purchase/PurchaseReturnOrdersMapper.xml
@@ -22,7 +22,8 @@
         SELECT
             pro.*,
             sm.supplier_name as supplier_name,
-            pl.purchase_contract_number as purchase_contract_number
+            pl.purchase_contract_number as purchase_contract_number,
+            pl.master_contract_no as master_contract_no
         FROM purchase_return_orders pro
                  LEFT JOIN supplier_manage sm ON pro.supplier_id = sm.id
                  LEFT JOIN purchase_ledger pl ON pl.id = pro.purchase_ledger_id
@@ -62,7 +63,8 @@
                 pro.prepared_at,
                 pro.total_amount,
                 CASE pro.return_type WHEN 0 THEN '閫�璐ч��娆�' WHEN 1 THEN '鎷掓敹' END AS returnType,
-                pl.purchase_contract_number
+                pl.purchase_contract_number,
+                pl.master_contract_no
         from purchase_return_orders pro
         left join
             (select prop.purchase_return_order_id,
diff --git a/src/main/resources/mapper/sales/ShippingInfoMapper.xml b/src/main/resources/mapper/sales/ShippingInfoMapper.xml
index 0d2dae7..9222b40 100644
--- a/src/main/resources/mapper/sales/ShippingInfoMapper.xml
+++ b/src/main/resources/mapper/sales/ShippingInfoMapper.xml
@@ -19,6 +19,7 @@
         s.update_user,
         s.tenant_id,
         sl.sales_contract_no,
+        sl.master_contract_no,
         s.outbound_batches,
         pm.model as specification_model,
         pm.unit,
@@ -57,6 +58,9 @@
         WHERE 1=1
         <if test="req.salesContractNo != null and req.salesContractNo != ''">
             AND sl.sales_contract_no LIKE CONCAT('%',#{req.salesContractNo},'%')
+        </if>
+        <if test="req.masterContractNo != null and req.masterContractNo != ''">
+            AND sl.master_contract_no LIKE CONCAT('%',#{req.masterContractNo},'%')
         </if>
         <if test="req.shippingCarNumber != null and req.shippingCarNumber != ''">
             AND s.shipping_car_number LIKE CONCAT('%',#{req.shippingCarNumber},'%')
@@ -134,6 +138,7 @@
             si.id AS shippingId,
             si.shipping_no AS shippingNo,
             sl.sales_contract_no AS salesContractNo,
+            sl.master_contract_no AS masterContractNo,
             sl.customer_name AS customerName,
             IFNULL(p.product_name, slp.product_category) AS productName,
             IFNULL(pm.model, slp.specification_model) AS model,
diff --git a/src/main/resources/mapper/stock/StockInRecordMapper.xml b/src/main/resources/mapper/stock/StockInRecordMapper.xml
index a3bf3f9..35c24c4 100644
--- a/src/main/resources/mapper/stock/StockInRecordMapper.xml
+++ b/src/main/resources/mapper/stock/StockInRecordMapper.xml
@@ -170,7 +170,8 @@
             p.product_name,
             pm.model as specification_model,
             sir.stock_in_num * slp.tax_inclusive_unit_price AS InboundAmount,
-            pl.purchase_contract_number
+            pl.purchase_contract_number,
+            pl.master_contract_no
             FROM stock_in_record sir
             -- 10 绫诲瀷鎵嶅叧鑱旇川妫�琛�
             LEFT JOIN quality_inspect qi ON sir.record_type = 10 AND sir.record_id = qi.id
diff --git a/src/main/resources/mapper/stock/StockOutRecordMapper.xml b/src/main/resources/mapper/stock/StockOutRecordMapper.xml
index ad5976f..76b2664 100644
--- a/src/main/resources/mapper/stock/StockOutRecordMapper.xml
+++ b/src/main/resources/mapper/stock/StockOutRecordMapper.xml
@@ -103,7 +103,8 @@
         slp.tax_rate,
         sor.stock_out_num * slp.tax_inclusive_unit_price as outboundAmount,
         s.shipping_no,
-        sl.sales_contract_no
+        sl.sales_contract_no,
+        sl.master_contract_no
         FROM stock_out_record sor
         left join shipping_info s on sor.record_id = s.id
         LEFT JOIN sales_ledger sl ON s.sales_ledger_id = sl.id

--
Gitblit v1.9.3