From f8b9715dfadab13e1c76024537a7fff450a5f7a6 Mon Sep 17 00:00:00 2001
From: buhuazhen <hua100783@gmail.com>
Date: 星期二, 26 五月 2026 17:44:11 +0800
Subject: [PATCH] feat: 办公用品(日常用品),领用归还。领用归还记录 完成 ps:如果pro使用直接引入该commit

---
 src/views/inventoryManagement/stockManagement/OfficeRecord.vue |  631 ++++++++++++++++++++++++++
 doc/产品领用归还模块-前端对接文档.md                                         |  694 ++++++++++++++++++++++++++++
 src/views/basicData/product/index.vue                          |    3 
 src/api/inventoryManagement/productBorrow.js                   |   86 +++
 src/views/inventoryManagement/stockManagement/index.vue        |    6 
 src/api/inventoryManagement/stockInventory.js                  |    9 
 6 files changed, 1,425 insertions(+), 4 deletions(-)

diff --git "a/doc/\344\272\247\345\223\201\351\242\206\347\224\250\345\275\222\350\277\230\346\250\241\345\235\227-\345\211\215\347\253\257\345\257\271\346\216\245\346\226\207\346\241\243.md" "b/doc/\344\272\247\345\223\201\351\242\206\347\224\250\345\275\222\350\277\230\346\250\241\345\235\227-\345\211\215\347\253\257\345\257\271\346\216\245\346\226\207\346\241\243.md"
new file mode 100644
index 0000000..bce5ac1
--- /dev/null
+++ "b/doc/\344\272\247\345\223\201\351\242\206\347\224\250\345\275\222\350\277\230\346\250\241\345\235\227-\345\211\215\347\253\257\345\257\271\346\216\245\346\226\207\346\241\243.md"
@@ -0,0 +1,694 @@
+# 浜у搧棰嗙敤褰掕繕妯″潡 - 鍓嶇瀵规帴鏂囨。
+
+## 涓�銆佹ā鍧楁杩�
+
+浜у搧棰嗙敤褰掕繕妯″潡鐢ㄤ簬绠$悊浜у搧鐨勯鐢ㄥ拰褰掕繕娴佺▼锛�
+- **棰嗙敤**锛氭柊澧為鐢ㄦ椂鑷姩瀹屾垚鍑哄簱鎿嶄綔锛岃嚜鍔ㄥ鎵归�氳繃锛屽彇娑堝鎵规祦绋�
+- **褰掕繕**锛氭柊澧炲綊杩樻椂鑷姩瀹屾垚鍏ュ簱鎿嶄綔锛岃嚜鍔ㄥ鎵归�氳繃
+
+**娉ㄦ剰**锛氭墍鏈夋帴鍙g粺涓�浣跨敤 POST 鏂瑰紡
+
+---
+
+## 浜屻�丄PI 鎺ュ彛璇存槑
+
+### 1. 浜у搧棰嗙敤鎺ュ彛
+
+#### 1.1 鍒嗛〉鏌ヨ棰嗙敤璁板綍
+
+**璇锋眰**
+```
+POST /productBorrow/listPage
+Content-Type: application/json
+```
+
+**璇锋眰浣�**
+```json
+{
+  "current": 1,                   // 褰撳墠椤电爜锛岄粯璁�1
+  "size": 10,                     // 姣忛〉鏉℃暟锛岄粯璁�10
+  "borrowNo": "LY202605260001",   // 閫夊~锛岄鐢ㄥ崟鍙凤紝妯$硦鏌ヨ
+  "productModelId": 100,          // 閫夊~锛屼骇鍝佽鏍糏D
+  "borrowerId": 1,                // 閫夊~锛岄鐢ㄤ汉ID
+  "borrowerName": "寮犱笁",          // 閫夊~锛岄鐢ㄤ汉濮撳悕锛屾ā绯婃煡璇�
+  "approvalStatus": 0,            // 閫夊~锛屽鎵圭姸鎬侊細0寰呭鎵�/1宸查�氳繃/2宸查┏鍥�
+  "status": 0                     // 閫夊~锛屽綊杩樼姸鎬侊細0鏈綊杩�/1閮ㄥ垎褰掕繕/2宸插叏閮ㄥ綊杩�
+}
+```
+
+**鍝嶅簲绀轰緥**
+```json
+{
+  "code": 200,
+  "msg": "鎿嶄綔鎴愬姛",
+  "data": {
+    "records": [
+      {
+        "id": 1,
+        "borrowNo": "LY202605260001",
+        "productModelId": 100,
+        "batchNo": "20260526-ABC001-001",
+        "borrowQuantity": 10.0000,
+        "returnedQuantity": 5.0000,
+        "borrowerId": 1,
+        "borrowerName": "寮犱笁",
+        "borrowTime": "2026-05-26 10:00:00",
+        "expectedReturnTime": "2026-06-26 10:00:00",
+        "approvalStatus": 1,
+        "approvalStatusName": "宸查�氳繃",
+        "status": 1,
+        "statusName": "閮ㄥ垎褰掕繕",
+        "remark": "椤圭洰浣跨敤",
+        "productName": "铻轰笣鍒�",
+        "model": "M6",
+        "productCode": "LSD-M6",
+        "unit": "鎶�",
+        "remainingQuantity": 5.0000,
+        "createTime": "2026-05-26 09:00:00"
+      }
+    ],
+    "total": 100,
+    "size": 10,
+    "current": 1,
+    "pages": 10
+  }
+}
+```
+
+#### 1.2 鏌ヨ棰嗙敤璁板綍璇︽儏
+
+**璇锋眰**
+```
+POST /productBorrow/getDetail
+Content-Type: application/json
+```
+
+**璇锋眰浣�**
+```json
+{
+  "id": 1    // 蹇呭~锛岄鐢ㄨ褰旾D
+}
+```
+
+**鍝嶅簲绀轰緥**
+```json
+{
+  "code": 200,
+  "msg": "鎿嶄綔鎴愬姛",
+  "data": {
+    "id": 1,
+    "borrowNo": "LY202605260001",
+    "productModelId": 100,
+    "batchNo": "20260526-ABC001-001",
+    "borrowQuantity": 10.0000,
+    "returnedQuantity": 5.0000,
+    "remainingQuantity": 5.0000,
+    "borrowerId": 1,
+    "borrowerName": "寮犱笁",
+    "borrowTime": "2026-05-26 10:00:00",
+    "expectedReturnTime": "2026-06-26 10:00:00",
+    "approvalStatus": 1,
+    "approvalStatusName": "宸查�氳繃",
+    "status": 1,
+    "statusName": "閮ㄥ垎褰掕繕",
+    "remark": "椤圭洰浣跨敤",
+    "productName": "铻轰笣鍒�",
+    "model": "M6",
+    "productCode": "LSD-M6",
+    "unit": "鎶�"
+  }
+}
+```
+
+#### 1.3 鏂板棰嗙敤璁板綍
+
+**璇锋眰**
+```
+POST /productBorrow/add
+Content-Type: application/json
+```
+
+**璇锋眰浣�**
+```json
+{
+  "productModelId": 100,          // 蹇呭~锛屼骇鍝佽鏍糏D
+  "batchNo": "20260526-ABC001-001", // 閫夊~锛屾壒鍙凤紝涓嶅~鍒欎娇鐢ㄩ粯璁ゆ壒鍙�
+  "borrowQuantity": 10.0000,      // 蹇呭~锛岄鐢ㄦ暟閲�
+  "borrowerId": 1,                // 蹇呭~锛岄鐢ㄤ汉ID锛堢郴缁熺敤鎴稩D锛�
+  "borrowerName": "寮犱笁",          // 蹇呭~锛岄鐢ㄤ汉濮撳悕
+  "expectedReturnTime": "2026-06-26 10:00:00", // 閫夊~锛岄璁″綊杩樻椂闂�
+  "remark": "椤圭洰浣跨敤"             // 閫夊~锛屽娉�
+}
+```
+
+**鍝嶅簲绀轰緥**
+```json
+{
+  "code": 200,
+  "msg": "鎿嶄綔鎴愬姛"
+}
+```
+
+**鑷姩鎵ц鐨勬搷浣�**锛�
+- 鑷姩鐢熸垚棰嗙敤鍗曞彿锛堟牸寮忥細LY + 骞存湀鏃� + 4浣嶅簭鍙凤級
+- 鑷姩鍒涘缓鍑哄簱璁板綍
+- 鑷姩瀹℃牳閫氳繃
+- 鑷姩鎵e噺搴撳瓨
+- 鐘舵�佺洿鎺ヨ涓�"宸查�氳繃"
+
+#### 1.4 淇敼棰嗙敤璁板綍
+
+**璇锋眰**
+```
+POST /productBorrow/update
+Content-Type: application/json
+```
+
+**璇锋眰浣�**
+```json
+{
+  "id": 1,                        // 蹇呭~锛岄鐢ㄨ褰旾D
+  "productModelId": 100,
+  "batchNo": "20260526-ABC001-001",
+  "borrowQuantity": 15.0000,
+  "borrowerId": 1,
+  "borrowerName": "寮犱笁",
+  "expectedReturnTime": "2026-06-26 10:00:00",
+  "remark": "椤圭洰浣跨敤"
+}
+```
+
+**娉ㄦ剰**锛氬彧鏈夊緟瀹℃壒鐘舵�侊紙approvalStatus=0锛夌殑璁板綍鎵嶈兘淇敼
+
+#### 1.5 鍒犻櫎棰嗙敤璁板綍
+
+**璇锋眰**
+```
+POST /productBorrow/delete
+Content-Type: application/json
+```
+
+**璇锋眰浣�**
+```json
+[1, 2, 3]  // 瑕佸垹闄ょ殑璁板綍ID鏁扮粍
+```
+
+**娉ㄦ剰**锛氬彧鏈夊緟瀹℃壒鐘舵�佺殑璁板綍鎵嶈兘鍒犻櫎
+
+#### 1.6 鎵归噺瀹℃壒棰嗙敤璁板綍
+
+**璇锋眰**
+```
+POST /productBorrow/approve
+Content-Type: application/json
+```
+
+**璇锋眰浣�**
+```json
+{
+  "ids": [1, 2, 3],           // 蹇呭~锛岃瀹℃壒鐨勮褰旾D鏁扮粍
+  "approvalStatusParam": 1    // 蹇呭~锛屽鎵圭姸鎬侊細1閫氳繃/2椹冲洖
+}
+```
+
+**鍝嶅簲绀轰緥**
+```json
+{
+  "code": 200,
+  "msg": "鎿嶄綔鎴愬姛"
+}
+```
+
+---
+
+### 2. 浜у搧褰掕繕鎺ュ彛
+
+#### 2.1 鍒嗛〉鏌ヨ褰掕繕璁板綍
+
+**璇锋眰**
+```
+POST /productBorrowReturn/listPage
+Content-Type: application/json
+```
+
+**璇锋眰浣�**
+```json
+{
+  "current": 1,                   // 褰撳墠椤电爜
+  "size": 10,                     // 姣忛〉鏉℃暟
+  "borrowId": 1,                  // 閫夊~锛岄鐢ㄨ褰旾D
+  "productModelId": 100,          // 閫夊~锛屼骇鍝佽鏍糏D
+  "returnerId": 2,                // 閫夊~锛屽綊杩樹汉ID
+  "returnerName": "鏉庡洓"          // 閫夊~锛屽綊杩樹汉濮撳悕
+}
+```
+
+**鍝嶅簲绀轰緥**
+```json
+{
+  "code": 200,
+  "msg": "鎿嶄綔鎴愬姛",
+  "data": {
+    "records": [
+      {
+        "id": 1,
+        "borrowId": 1,
+        "borrowNo": "LY202605260001",
+        "productModelId": 100,
+        "batchNo": "20260526-ABC001-001",
+        "returnQuantity": 5.0000,
+        "returnerId": 2,
+        "returnerName": "鏉庡洓",
+        "returnTime": "2026-05-28 14:00:00",
+        "remark": "椤圭洰缁撴潫褰掕繕",
+        "productName": "铻轰笣鍒�",
+        "model": "M6",
+        "productCode": "LSD-M6",
+        "unit": "鎶�",
+        "borrowQuantity": 10.0000,
+        "borrowerName": "寮犱笁"
+      }
+    ],
+    "total": 50,
+    "size": 10,
+    "current": 1,
+    "pages": 5
+  }
+}
+```
+
+#### 2.2 鏌ヨ鏌愪釜棰嗙敤璁板綍鐨勫綊杩樿褰�
+
+**璇锋眰**
+```
+POST /productBorrowReturn/listByBorrowId
+Content-Type: application/json
+```
+
+**璇锋眰浣�**
+```json
+{
+  "current": 1,       // 褰撳墠椤电爜
+  "size": 10,         // 姣忛〉鏉℃暟
+  "borrowId": 1       // 蹇呭~锛岄鐢ㄨ褰旾D
+}
+```
+
+**鍝嶅簲绀轰緥**
+```json
+{
+  "code": 200,
+  "msg": "鎿嶄綔鎴愬姛",
+  "data": {
+    "records": [...],
+    "total": 5,
+    "size": 10,
+    "current": 1,
+    "pages": 1
+  }
+}
+```
+
+#### 2.3 鏂板褰掕繕璁板綍
+
+**璇锋眰**
+```
+POST /productBorrowReturn/add
+Content-Type: application/json
+```
+
+**璇锋眰浣�**
+```json
+{
+  "borrowId": 1,                 // 蹇呭~锛岄鐢ㄨ褰旾D
+  "returnQuantity": 5.0000,      // 蹇呭~锛屽綊杩樻暟閲�
+  "returnerId": 2,               // 蹇呭~锛屽綊杩樹汉ID锛堢郴缁熺敤鎴稩D锛�
+  "returnerName": "鏉庡洓",         // 蹇呭~锛屽綊杩樹汉濮撳悕
+  "remark": "椤圭洰缁撴潫褰掕繕"         // 閫夊~锛屽娉�
+}
+```
+
+**鍝嶅簲绀轰緥**
+```json
+{
+  "code": 200,
+  "msg": "鎿嶄綔鎴愬姛"
+}
+```
+
+**鑷姩鎵ц鐨勬搷浣�**锛�
+- 鑷姩鍒涘缓鍏ュ簱璁板綍
+- 鑷姩瀹℃牳閫氳繃
+- 鑷姩澧炲姞搴撳瓨
+- 鑷姩鏇存柊棰嗙敤璁板綍鐨勫凡褰掕繕鏁伴噺鍜岀姸鎬�
+
+**閿欒鎯呭喌**锛�
+```json
+{
+  "code": 500,
+  "msg": "褰掕繕鏁伴噺涓嶈兘澶т簬鍓╀綑鍙綊杩樻暟閲忥細5.0000"
+}
+```
+
+---
+
+### 3. 搴撳瓨鍜岄鐢ㄩ噺鏌ヨ鎺ュ彛
+
+#### 3.1 鍒嗛〉鏌ヨ浜у搧搴撳瓨鍜岄鐢ㄩ噺
+
+**鎺ュ彛璇存槑**锛�
+- 浠�"浜у搧瑙勬牸 + 鎵瑰彿"涓轰竴鏉¤褰�
+- 鏄剧ず姣忎釜鎵瑰彿鐨勫簱瀛樻暟閲忓拰琚鐢ㄩ噺
+- 鐢ㄤ簬棰嗙敤鏃堕�夋嫨浜у搧鍜屾壒鍙凤紝鏌ョ湅鍙鐢ㄦ暟閲�
+
+**璇锋眰**
+```
+POST /stockInventory/pageStockAndBorrow
+Content-Type: application/json
+```
+
+**璇锋眰浣�**
+```json
+{
+  "current": 1,                    // 褰撳墠椤电爜
+  "size": 10,                      // 姣忛〉鏉℃暟
+  "topParentProductId": 277,       // 蹇呭~锛岄《閮ㄧ埗浜у搧ID锛堜骇鍝佸垎绫籌D锛�
+  "productName": "铻轰笣鍒�",          // 閫夊~锛屼骇鍝佸悕绉帮紝妯$硦鏌ヨ
+  "model": "M6",                   // 閫夊~锛岃鏍煎瀷鍙凤紝妯$硦鏌ヨ
+  "batchNo": "20260526"            // 閫夊~锛屾壒鍙凤紝妯$硦鏌ヨ
+}
+```
+
+**鍙傛暟璇存槑**锛�
+
+| 鍙傛暟鍚� | 绫诲瀷 | 蹇呭~ | 璇存槑 |
+|--------|------|------|------|
+| current | Integer | 鍚� | 褰撳墠椤电爜锛岄粯璁�1 |
+| size | Integer | 鍚� | 姣忛〉鏉℃暟锛岄粯璁�10 |
+| topParentProductId | Long | 鏄� | 椤堕儴鐖朵骇鍝両D锛堜骇鍝佸垎绫绘爲鏍硅妭鐐笽D锛夛紝鐢ㄤ簬绛涢�変骇鍝佸垎绫� |
+| productName | String | 鍚� | 浜у搧鍚嶇О锛屾ā绯婃煡璇� |
+| model | String | 鍚� | 瑙勬牸鍨嬪彿锛屾ā绯婃煡璇� |
+| batchNo | String | 鍚� | 鎵瑰彿锛屾ā绯婃煡璇� |
+
+**鍝嶅簲绀轰緥**
+```json
+{
+  "code": 200,
+  "msg": "鎿嶄綔鎴愬姛",
+  "data": {
+    "records": [
+      {
+        "productModelId": 100,
+        "model": "M6",
+        "productCode": "LSD-M6",
+        "unit": "鎶�",
+        "productName": "铻轰笣鍒�",
+        "productId": 50,
+        "batchNo": "20260526-ABC001-001",
+        "qualitity": 100.0000,
+        "lockedQuantity": 5.0000,
+        "borrowedQuantity": 10.0000,
+        "availableQuantity": 90.0000
+      },
+      {
+        "productModelId": 100,
+        "model": "M6",
+        "productCode": "LSD-M6",
+        "unit": "鎶�",
+        "productName": "铻轰笣鍒�",
+        "productId": 50,
+        "batchNo": "20260527-ABC001-001",
+        "qualitity": 50.0000,
+        "lockedQuantity": 0,
+        "borrowedQuantity": 0,
+        "availableQuantity": 50.0000
+      }
+    ],
+    "total": 20,
+    "size": 10,
+    "current": 1,
+    "pages": 2
+  }
+}
+```
+
+**鍝嶅簲瀛楁璇存槑**锛�
+
+| 瀛楁鍚� | 绫诲瀷 | 璇存槑 |
+|--------|------|------|
+| productModelId | Long | 浜у搧瑙勬牸ID锛堢敤浜庨鐢ㄦ椂浼犻�掞級 |
+| model | String | 瑙勬牸鍨嬪彿 |
+| productCode | String | 浜у搧缂栫爜 |
+| unit | String | 鍗曚綅 |
+| productName | String | 浜у搧鍚嶇О |
+| productId | Long | 浜у搧ID |
+| batchNo | String | 鎵瑰彿锛堢敤浜庨鐢ㄦ椂浼犻�掞紝鍙负null锛� |
+| qualitity | BigDecimal | 褰撳墠搴撳瓨鏁伴噺 |
+| lockedQuantity | BigDecimal | 鍐荤粨/閿佸畾鏁伴噺 |
+| borrowedQuantity | BigDecimal | 琚鐢ㄤ笖鏈綊杩樼殑鏁伴噺 |
+| availableQuantity | BigDecimal | 鍙鐢ㄦ暟閲� = 搴撳瓨鏁伴噺 - 琚鐢ㄦ暟閲� |
+
+**璁$畻鍏紡**锛�
+```
+鍙鐢ㄦ暟閲�(availableQuantity) = 搴撳瓨鏁伴噺(qualitity) - 琚鐢ㄩ噺(borrowedQuantity)
+```
+
+**琚鐢ㄩ噺璁$畻閫昏緫**锛�
+- 鍙粺璁″鎵归�氳繃鐨勯鐢ㄨ褰曪紙approval_status = 1锛�
+- 鍙粺璁℃湭鍏ㄩ儴褰掕繕鐨勮褰曪紙status != 2锛�
+- 璁$畻鍏紡锛氶鐢ㄦ暟閲� - 宸插綊杩樻暟閲�
+- 鎸変骇鍝佽鏍糏D + 鎵瑰彿鍒嗙粍缁熻
+
+**浣跨敤鍦烘櫙**锛�
+
+1. **棰嗙敤閫夋嫨浜у搧**锛�
+    - 璋冪敤姝ゆ帴鍙f煡璇㈠簱瀛�
+    - 鐢ㄦ埛閫夋嫨浜у搧鍜屾壒鍙�
+    - 鏄剧ず鍙鐢ㄦ暟閲忎緵鍙傝��
+    - 棰嗙敤鏃朵紶閫� `productModelId` 鍜� `batchNo`
+
+2. **鍓嶇鏄剧ず寤鸿**锛�
+    - 鍒楄〃鏄剧ず锛氫骇鍝佸悕绉般�佽鏍煎瀷鍙枫�佹壒鍙枫�佸簱瀛樻暟閲忋�佽棰嗙敤閲忋�佸彲棰嗙敤閲�
+    - 鍙鐢ㄦ暟閲忎负0鎴栬礋鏁扮殑璁板綍鍙互鏍囩孩鎴栫鐢ㄩ�夋嫨
+    - 鏀寔鎸変骇鍝佸悕绉般�佽鏍煎瀷鍙枫�佹壒鍙锋悳绱�
+
+**鍓嶇椤甸潰绀轰緥**锛�
+
+```
+鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+鈹�  浜у搧搴撳瓨鍜岄鐢ㄩ噺鏌ヨ                                                     鈹�
+鈹溾攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+鈹�  浜у搧鍒嗙被: [閫夋嫨鍒嗙被 鈻糫  浜у搧鍚嶇О: [____]  瑙勬牸鍨嬪彿: [____]  [鏌ヨ]       鈹�
+鈹溾攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+鈹�                                                                          鈹�
+鈹�  鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�   鈹�
+鈹�  鈹備骇鍝佸悕绉扳攤瑙勬牸鍨嬪彿鈹�  鎵瑰彿    鈹傚簱瀛樻暟閲忊攤琚鐢ㄩ噺鈹傚彲棰嗙敤閲忊攤  鎿嶄綔  鈹�   鈹�
+鈹�  鈹溾攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹尖攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹尖攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹尖攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹尖攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹尖攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹尖攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�   鈹�
+鈹�  鈹傝灪涓濆垁  鈹�  M6    鈹�20260526- 鈹�  100   鈹�   10   鈹�   90   鈹俒棰嗙敤] 鈹�   鈹�
+鈹�  鈹�        鈹�        鈹侫BC001-001鈹�        鈹�        鈹�        鈹�        鈹�   鈹�
+鈹�  鈹溾攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹尖攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹尖攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹尖攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹尖攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹尖攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹尖攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�   鈹�
+鈹�  鈹傝灪涓濆垁  鈹�  M6    鈹�20260527- 鈹�   50   鈹�    0   鈹�   50   鈹俒棰嗙敤] 鈹�   鈹�
+鈹�  鈹�        鈹�        鈹侫BC001-001鈹�        鈹�        鈹�        鈹�        鈹�   鈹�
+鈹�  鈹溾攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹尖攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹尖攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹尖攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹尖攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹尖攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹尖攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�   鈹�
+鈹�  鈹傛壋鎵�    鈹�  10瀵�  鈹� NULL     鈹�   30   鈹�    5   鈹�   25   鈹俒棰嗙敤] 鈹�   鈹�
+鈹�  鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹粹攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹粹攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹粹攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹粹攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹粹攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹粹攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�   鈹�
+鈹�                                                                          鈹�
+鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+```
+
+---
+
+## 涓夈�佹帴鍙f眹鎬昏〃
+
+### 浜у搧棰嗙敤鎺ュ彛
+
+| 鎺ュ彛鍚嶇О | 璇锋眰璺緞 | 璇锋眰鏂瑰紡 | 璇存槑 |
+|----------|----------|----------|------|
+| 鍒嗛〉鏌ヨ | /productBorrow/listPage | POST | 鏌ヨ棰嗙敤璁板綍鍒楄〃 |
+| 鏌ヨ璇︽儏 | /productBorrow/getDetail | POST | 鏍规嵁ID鏌ヨ璇︽儏 |
+| 鏂板棰嗙敤 | /productBorrow/add | POST | 鏂板棰嗙敤锛堣嚜鍔ㄥ嚭搴擄級 |
+| 淇敼棰嗙敤 | /productBorrow/update | POST | 淇敼棰嗙敤璁板綍 |
+| 鍒犻櫎棰嗙敤 | /productBorrow/delete | POST | 鎵归噺鍒犻櫎棰嗙敤璁板綍 |
+| 鎵归噺瀹℃壒 | /productBorrow/approve | POST | 鎵归噺瀹℃壒锛堥�氳繃/椹冲洖锛� |
+
+### 浜у搧褰掕繕鎺ュ彛
+
+| 鎺ュ彛鍚嶇О | 璇锋眰璺緞 | 璇锋眰鏂瑰紡 | 璇存槑 |
+|----------|----------|----------|------|
+| 鍒嗛〉鏌ヨ | /productBorrowReturn/listPage | POST | 鏌ヨ褰掕繕璁板綍鍒楄〃 |
+| 鎸夐鐢ㄦ煡璇� | /productBorrowReturn/listByBorrowId | POST | 鏌ヨ鏌愰鐢ㄧ殑褰掕繕璁板綍 |
+| 鏂板褰掕繕 | /productBorrowReturn/add | POST | 鏂板褰掕繕锛堣嚜鍔ㄥ叆搴擄級 |
+
+### 搴撳瓨鏌ヨ鎺ュ彛
+
+| 鎺ュ彛鍚嶇О | 璇锋眰璺緞 | 璇锋眰鏂瑰紡 | 璇存槑 |
+|----------|----------|----------|------|
+| 搴撳瓨鍜岄鐢ㄩ噺 | /stockInventory/pageStockAndBorrow | POST | 鏌ヨ搴撳瓨鍜岃棰嗙敤閲� |
+
+---
+
+## 鍥涖�佺姸鎬佽鏄�
+
+### 1. 瀹℃壒鐘舵�� (approvalStatus)
+
+| 鍊� | 鍚嶇О | 璇存槑 |
+|----|------|------|
+| 0 | 寰呭鎵� | 鏂板鍚庣殑榛樿鐘舵�侊紙浠呮壒閲忓鎵瑰満鏅娇鐢級 |
+| 1 | 宸查�氳繃 | 瀹℃壒閫氳繃锛屽凡鎵e噺搴撳瓨锛屽彲杩涜褰掕繕鎿嶄綔 |
+| 2 | 宸查┏鍥� | 瀹℃壒鏈�氳繃锛屼笉鎵e噺搴撳瓨 |
+
+**娉ㄦ剰**锛氭柊澧為鐢ㄦ椂鐩存帴鑷姩瀹℃壒閫氳繃锛岀姸鎬佷负1
+
+### 2. 褰掕繕鐘舵�� (status)
+
+| 鍊� | 鍚嶇О | 璇存槑 |
+|----|------|------|
+| 0 | 鏈綊杩� | 灏氭湭褰掕繕浠讳綍鏁伴噺 |
+| 1 | 閮ㄥ垎褰掕繕 | 宸插綊杩橀儴鍒嗘暟閲� |
+| 2 | 宸插叏閮ㄥ綊杩� | 宸插綊杩樺叏閮ㄦ暟閲忥紝涓嶈兘鍐嶅綊杩� |
+
+---
+
+## 浜斻�佷笟鍔℃祦绋嬪浘
+
+```
+鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+鈹�                      棰嗙敤娴佺▼锛堣嚜鍔ㄥ嚭搴擄級                     鈹�
+鈹溾攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+鈹�                                                             鈹�
+鈹�   鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�    鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�    鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�       鈹�
+鈹�   鈹� 鏂板棰嗙敤   鈹傗攢鈹�鈹�>鈹� 鑷姩鍑哄簱   鈹傗攢鈹�鈹�>鈹� 鐘舵�佽涓�   鈹�       鈹�
+鈹�   鈹� 璁板綍       鈹�    鈹� 鎵e噺搴撳瓨   鈹�    鈹� 宸查�氳繃     鈹�       鈹�
+鈹�   鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�    鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�    鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�       鈹�
+鈹�                           鈹�                                 鈹�
+鈹�                           鈻�                                 鈹�
+鈹�                    鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�                          鈹�
+鈹�                    鈹� 鍒涘缓鍑哄簱   鈹�                          鈹�
+鈹�                    鈹� 璁板綍       鈹�                          鈹�
+鈹�                    鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�                          鈹�
+鈹�                                                             鈹�
+鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+
+鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+鈹�                      褰掕繕娴佺▼锛堣嚜鍔ㄥ叆搴擄級                     鈹�
+鈹溾攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+鈹�                                                             鈹�
+鈹�   鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�    鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�    鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�       鈹�
+鈹�   鈹� 閫夋嫨棰嗙敤   鈹傗攢鈹�鈹�>鈹� 濉啓褰掕繕   鈹傗攢鈹�鈹�>鈹� 鑷姩鍏ュ簱   鈹�       鈹�
+鈹�   鈹� 璁板綍       鈹�    鈹� 淇℃伅       鈹�    鈹� 澧炲姞搴撳瓨   鈹�       鈹�
+鈹�   鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�    鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�    鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�       鈹�
+鈹�                                              鈹�              鈹�
+鈹�                                              鈻�              鈹�
+鈹�                                        鈹屸攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�       鈹�
+鈹�                                        鈹� 鏇存柊棰嗙敤   鈹�       鈹�
+鈹�                                        鈹� 鐘舵��       鈹�       鈹�
+鈹�                                        鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�       鈹�
+鈹�                                                             鈹�
+鈹斺攢鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�鈹�
+```
+
+---
+
+## 鍏�佹敞鎰忎簨椤�
+
+### 1. 鏁版嵁鏍¢獙
+
+**鍓嶇鏍¢獙**锛�
+- 棰嗙敤鏁伴噺蹇呴』澶т簬0
+- 褰掕繕鏁伴噺涓嶈兘瓒呰繃鍓╀綑鍙綊杩樻暟閲�
+- 棰嗙敤浜恒�佸綊杩樹汉蹇呴』閫夋嫨绯荤粺鐢ㄦ埛
+
+**鍚庣鏍¢獙**锛�
+- 棰嗙敤鏃舵鏌ュ簱瀛樻槸鍚﹀厖瓒�
+- 褰掕繕鏁伴噺涓嶈兘瓒呰繃鍓╀綑鏁伴噺
+- 宸插叏閮ㄥ綊杩樼殑璁板綍涓嶈兘鍐嶅綊杩�
+
+### 2. 鐢ㄦ埛閫夋嫨
+
+棰嗙敤浜哄拰褰掕繕浜洪渶瑕佷粠绯荤粺鐢ㄦ埛琛ㄩ�夋嫨锛岃皟鐢ㄧ郴缁熺敤鎴锋帴鍙o細
+```
+POST /system/user/list
+```
+
+### 3. 浜у搧瑙勬牸閫夋嫨
+
+閫夋嫨浜у搧瑙勬牸鏃讹紝鍙互璋冪敤浜у搧鎺ュ彛锛�
+```
+POST /basic/product/pageModel
+```
+
+### 4. 搴撳瓨鑱斿姩
+
+- **棰嗙敤**锛氭柊澧炴椂鑷姩鍑哄簱锛堣皟鐢ㄥ簱瀛樻墸鍑忔帴鍙o級
+- **褰掕繕**锛氭柊澧炴椂鑷姩鍏ュ簱锛堣皟鐢ㄥ簱瀛樺鍔犳帴鍙o級
+
+---
+
+## 涓冦�侀敊璇爜璇存槑
+
+| 閿欒淇℃伅 | 鍘熷洜 | 瑙e喅鏂规 |
+|----------|------|----------|
+| 棰嗙敤璁板綍涓嶅瓨鍦� | ID鏃犳晥 | 妫�鏌ヨ褰旾D |
+| 浜у搧搴撳瓨涓嶅瓨鍦� | 搴撳瓨涓虹┖ | 妫�鏌ュ簱瀛樻暟鎹� |
+| 搴撳瓨涓嶈冻鏃犳硶鍑哄簱 | 搴撳瓨涓嶈冻 | 妫�鏌ュ簱瀛樻暟閲� |
+| 璇ラ鐢ㄨ褰曞凡鍏ㄩ儴褰掕繕 | 褰掕繕瀹屾垚 | 鏃犻渶鍐嶆褰掕繕 |
+| 褰掕繕鏁伴噺涓嶈兘澶т簬鍓╀綑鍙綊杩樻暟閲� | 鏁伴噺瓒呴檺 | 妫�鏌ュ墿浣欏彲褰掕繕鏁伴噺 |
+
+---
+
+## 鍏�佹祴璇曠敤渚�
+
+### 1. 鏂板棰嗙敤锛堣嚜鍔ㄥ嚭搴擄級
+
+```json
+POST /productBorrow/add
+{
+  "productModelId": 1,
+  "borrowQuantity": 10,
+  "borrowerId": 1,
+  "borrowerName": "绠$悊鍛�"
+}
+```
+
+### 2. 鏌ヨ搴撳瓨鍜岄鐢ㄩ噺
+
+```json
+POST /stockInventory/pageStockAndBorrow
+{
+  "current": 1,
+  "size": 10,
+  "topParentProductId": 277
+}
+```
+
+### 3. 褰掕繕浜у搧锛堣嚜鍔ㄥ叆搴擄級
+
+```json
+POST /productBorrowReturn/add
+{
+  "borrowId": 1,
+  "returnQuantity": 5,
+  "returnerId": 1,
+  "returnerName": "绠$悊鍛�"
+}
+```
+
+### 4. 鏌ヨ棰嗙敤璇︽儏
+
+```json
+POST /productBorrow/getDetail
+{
+  "id": 1
+}
+```
+
+### 5. 鏌ヨ褰掕繕璁板綍
+
+```json
+POST /productBorrowReturn/listByBorrowId
+{
+  "borrowId": 1,
+  "current": 1,
+  "size": 10
+}
+```
diff --git a/src/api/inventoryManagement/productBorrow.js b/src/api/inventoryManagement/productBorrow.js
new file mode 100644
index 0000000..f05aca2
--- /dev/null
+++ b/src/api/inventoryManagement/productBorrow.js
@@ -0,0 +1,86 @@
+import request from "@/utils/request";
+
+// ========== 棰嗙敤鐩稿叧鎺ュ彛 ==========
+
+// 鍒嗛〉鏌ヨ棰嗙敤璁板綍
+export const getBorrowListPage = (params) => {
+  return request({
+    url: "/productBorrow/listPage",
+    method: "post",
+    data: params,
+  });
+};
+
+// 鏌ヨ棰嗙敤璁板綍璇︽儏
+export const getBorrowDetail = (params) => {
+  return request({
+    url: "/productBorrow/getDetail",
+    method: "post",
+    data: params,
+  });
+};
+
+// 鏂板棰嗙敤璁板綍
+export const addBorrow = (params) => {
+  return request({
+    url: "/productBorrow/add",
+    method: "post",
+    data: params,
+  });
+};
+
+// 淇敼棰嗙敤璁板綍
+export const updateBorrow = (params) => {
+  return request({
+    url: "/productBorrow/update",
+    method: "post",
+    data: params,
+  });
+};
+
+// 鍒犻櫎棰嗙敤璁板綍
+export const deleteBorrow = (ids) => {
+  return request({
+    url: "/productBorrow/delete",
+    method: "post",
+    data: ids,
+  });
+};
+
+// 鎵归噺瀹℃壒棰嗙敤璁板綍
+export const approveBorrow = (params) => {
+  return request({
+    url: "/productBorrow/approve",
+    method: "post",
+    data: params,
+  });
+};
+
+// ========== 褰掕繕鐩稿叧鎺ュ彛 ==========
+
+// 鍒嗛〉鏌ヨ褰掕繕璁板綍
+export const getReturnListPage = (params) => {
+  return request({
+    url: "/productBorrowReturn/listPage",
+    method: "post",
+    data: params,
+  });
+};
+
+// 鏌ヨ鏌愪釜棰嗙敤璁板綍鐨勫綊杩樿褰�
+export const getReturnListByBorrowId = (params) => {
+  return request({
+    url: "/productBorrowReturn/listByBorrowId",
+    method: "post",
+    data: params,
+  });
+};
+
+// 鏂板褰掕繕璁板綍
+export const addReturn = (params) => {
+  return request({
+    url: "/productBorrowReturn/add",
+    method: "post",
+    data: params,
+  });
+};
diff --git a/src/api/inventoryManagement/stockInventory.js b/src/api/inventoryManagement/stockInventory.js
index 539eedc..de2a919 100644
--- a/src/api/inventoryManagement/stockInventory.js
+++ b/src/api/inventoryManagement/stockInventory.js
@@ -103,3 +103,12 @@
     });
 };
 
+// 鍒嗛〉鏌ヨ浜у搧搴撳瓨鍜岄鐢ㄩ噺
+export const pageStockAndBorrow = (params) => {
+    return request({
+        url: "/stockInventory/pageStockAndBorrow",
+        method: "post",
+        data: params,
+    });
+};
+
diff --git a/src/views/basicData/product/index.vue b/src/views/basicData/product/index.vue
index b05b215..542c8a0 100644
--- a/src/views/basicData/product/index.vue
+++ b/src/views/basicData/product/index.vue
@@ -9,8 +9,7 @@
                   @clear="searchFilter"
                   clearable
                   prefix-icon="Search" />
-        <el-button v-if="false"
-                   type="primary"
+        <el-button type="primary"
                    @click="openProDia('addOne')"
                    style="margin-left: 10px">鏂板浜у搧澶х被</el-button>
       </div>
diff --git a/src/views/inventoryManagement/stockManagement/OfficeRecord.vue b/src/views/inventoryManagement/stockManagement/OfficeRecord.vue
new file mode 100644
index 0000000..f1b78b8
--- /dev/null
+++ b/src/views/inventoryManagement/stockManagement/OfficeRecord.vue
@@ -0,0 +1,631 @@
+<template>
+  <div>
+    <!-- 鎼滅储琛ㄥ崟 -->
+    <div class="search_form mb10">
+      <el-form ref="searchFormRef" :model="searchForm" class="demo-form-inline">
+        <el-row :gutter="20">
+          <el-col :span="4">
+            <el-form-item label="棰嗙敤鍗曞彿" prop="borrowNo">
+              <el-input v-model="searchForm.borrowNo" style="width: 200px" placeholder="璇疯緭鍏�" clearable />
+            </el-form-item>
+          </el-col>
+          <el-col :span="4">
+            <el-form-item label="浜у搧澶х被" prop="productName">
+              <el-input v-model="searchForm.productName" style="width: 200px" placeholder="璇疯緭鍏�" clearable />
+            </el-form-item>
+          </el-col>
+          <el-col :span="4">
+            <el-form-item label="瑙勬牸鍨嬪彿" prop="model">
+              <el-input v-model="searchForm.model" style="width: 200px" placeholder="璇疯緭鍏�" clearable />
+            </el-form-item>
+          </el-col>
+          <el-col :span="4">
+            <el-form-item label="棰嗙敤浜�" prop="borrowerName">
+              <el-input v-model="searchForm.borrowerName" style="width: 200px" placeholder="璇疯緭鍏�" clearable />
+            </el-form-item>
+          </el-col>
+          <el-col :span="4">
+            <el-form-item label="褰掕繕鐘舵��" prop="status">
+              <el-select v-model="searchForm.status" style="width: 200px" placeholder="璇烽�夋嫨" clearable>
+                <el-option label="鏈綊杩�" :value="0" />
+                <el-option label="閮ㄥ垎褰掕繕" :value="1" />
+                <el-option label="宸插叏閮ㄥ綊杩�" :value="2" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="4">
+            <el-form-item>
+              <el-button type="primary" @click="handleQuery">鎼滅储</el-button>
+              <el-button @click="resetSearch">閲嶇疆</el-button>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <div class="flex justify-end mt10">
+        <el-button type="info" @click="showStockDrawer = true">鏌ヨ搴撳瓨</el-button>
+        <el-button type="primary" @click="handleAdd">鏂板棰嗙敤</el-button>
+        <el-button type="primary" @click="isShowNewModal = true">鏂板搴撳瓨</el-button>
+      </div>
+    </div>
+
+    <!-- 鍒楄〃 -->
+    <div class="table_list">
+      <el-table :data="tableData" border v-loading="tableLoading" style="width: 100%" height="calc(100vh - 18.5em)">
+        <el-table-column align="center" type="index" label="搴忓彿" width="60" />
+        <el-table-column label="棰嗙敤鍗曞彿" prop="borrowNo" show-overflow-tooltip width="160" />
+        <el-table-column label="浜у搧鍚嶇О" prop="productName" show-overflow-tooltip />
+        <el-table-column label="瑙勬牸鍨嬪彿" prop="model" show-overflow-tooltip />
+        <el-table-column label="浜у搧缂栫爜" prop="productCode" show-overflow-tooltip />
+        <el-table-column label="鍗曚綅" prop="unit" show-overflow-tooltip width="60" />
+        <el-table-column label="鎵瑰彿" prop="batchNo" show-overflow-tooltip />
+        <el-table-column label="棰嗙敤鏁伴噺" prop="borrowQuantity" show-overflow-tooltip width="100" />
+        <el-table-column label="宸插綊杩樻暟閲�" prop="returnedQuantity" show-overflow-tooltip width="100" />
+        <el-table-column label="鍓╀綑鍙綊杩�" show-overflow-tooltip width="100">
+          <template #default="{ row }">
+            {{ formatQuantity(row.borrowQuantity - row.returnedQuantity) }}
+          </template>
+        </el-table-column>
+        <el-table-column label="棰嗙敤浜�" prop="borrowerName" show-overflow-tooltip width="80" />
+        <el-table-column label="棰嗙敤鏃堕棿" prop="borrowTime" show-overflow-tooltip width="160" />
+        <el-table-column label="棰勮褰掕繕鏃堕棿" prop="expectedReturnTime" show-overflow-tooltip width="160" />
+<!--        <el-table-column label="瀹℃壒鐘舵��" prop="approvalStatusName" show-overflow-tooltip width="90">-->
+<!--          <template #default="{ row }">-->
+<!--            <el-tag :type="getApprovalStatusType(row.approvalStatus)">{{ row.approvalStatusName }}</el-tag>-->
+<!--          </template>-->
+<!--        </el-table-column>-->
+        <el-table-column label="褰掕繕鐘舵��" prop="statusName" show-overflow-tooltip width="90">
+          <template #default="{ row }">
+            <el-tag :type="getStatusType(row.status)">{{ row.statusName }}</el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column label="澶囨敞" prop="remark" show-overflow-tooltip />
+        <el-table-column fixed="right" label="鎿嶄綔" min-width="120" align="center">
+          <template #default="scope">
+            <el-button link type="primary" @click="handleDetail(scope.row)">璇︽儏</el-button>
+            <el-button v-if="scope.row.status !== 2" link type="success" @click="handleReturn(scope.row)">褰掕繕</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination v-show="total > 0" :total="total" layout="total, sizes, prev, pager, next, jumper" :page="page.current"
+        :limit="page.size" @pagination="paginationChange" />
+    </div>
+
+    <!-- 鏂板/淇敼棰嗙敤寮圭獥 -->
+    <el-dialog v-model="borrowDialogVisible" :title="borrowDialogTitle" width="600px" destroy-on-close>
+      <el-form ref="borrowFormRef" :model="borrowForm" :rules="borrowRules" label-width="100px">
+        <el-form-item label="浜у搧鍚嶇О" prop="productModelId">
+          <el-button type="primary" @click="showProductSelectDialog = true">
+            {{ borrowForm.productName ? borrowForm.productName : '閫夋嫨浜у搧' }}
+          </el-button>
+        </el-form-item>
+        <el-form-item label="瑙勬牸鍨嬪彿">
+          <el-input v-model="borrowForm.model" disabled />
+        </el-form-item>
+        <el-form-item label="鍗曚綅">
+          <el-input v-model="borrowForm.unit" disabled />
+        </el-form-item>
+        <el-form-item label="鎵瑰彿" prop="batchNo">
+          <el-select v-model="borrowForm.batchNo" filterable placeholder="璇烽�夋嫨鎵瑰彿锛堝彲閫夛級" style="width: 100%" clearable>
+            <el-option v-for="item in batchNoList" :key="item" :label="item" :value="item" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="棰嗙敤鏁伴噺" prop="borrowQuantity">
+          <el-input-number v-model="borrowForm.borrowQuantity" :min="0.0001" :precision="4"
+            placeholder="璇疯緭鍏ラ鐢ㄦ暟閲�" style="width: 100%" />
+        </el-form-item>
+        <el-form-item label="棰嗙敤浜�" prop="borrowerId">
+          <el-select v-model="borrowForm.borrowerId" filterable placeholder="璇烽�夋嫨棰嗙敤浜�" style="width: 100%"
+            @change="handleBorrowerChange">
+            <el-option v-for="item in userList" :key="item.userId" :label="item.nickName" :value="item.userId" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="棰勮褰掕繕鏃堕棿" prop="expectedReturnTime">
+          <el-date-picker v-model="borrowForm.expectedReturnTime" type="datetime" placeholder="璇烽�夋嫨棰勮褰掕繕鏃堕棿"
+            style="width: 100%" value-format="YYYY-MM-DD HH:mm:ss" />
+        </el-form-item>
+        <el-form-item label="澶囨敞" prop="remark">
+          <el-input v-model="borrowForm.remark" type="textarea" :rows="3" placeholder="璇疯緭鍏ュ娉�" />
+        </el-form-item>
+      </el-form>
+      <!-- 浜у搧閫夋嫨寮圭獥 -->
+      <ProductSelectDialog v-model="showProductSelectDialog" @confirm="handleProductSelect"
+        :top-product-parent-id="props.productId" single />
+      <template #footer>
+        <el-button @click="borrowDialogVisible = false">鍙栨秷</el-button>
+        <el-button type="primary" @click="submitBorrowForm">纭畾</el-button>
+      </template>
+    </el-dialog>
+
+    <!-- 褰掕繕寮圭獥 -->
+    <el-dialog v-model="returnDialogVisible" title="浜у搧褰掕繕" width="500px" destroy-on-close>
+      <el-form ref="returnFormRef" :model="returnForm" :rules="returnRules" label-width="100px">
+        <el-form-item label="棰嗙敤鍗曞彿">
+          <el-input v-model="currentBorrow.borrowNo" disabled />
+        </el-form-item>
+        <el-form-item label="浜у搧淇℃伅">
+          <el-input :value="`${currentBorrow.productName} - ${currentBorrow.model}`" disabled />
+        </el-form-item>
+        <el-form-item label="棰嗙敤鏁伴噺">
+          <el-input :value="currentBorrow.borrowQuantity" disabled />
+        </el-form-item>
+        <el-form-item label="宸插綊杩樻暟閲�">
+          <el-input :value="currentBorrow.returnedQuantity" disabled />
+        </el-form-item>
+        <el-form-item label="鍓╀綑鍙綊杩�">
+          <el-input :value="formatQuantity(currentBorrow.borrowQuantity - currentBorrow.returnedQuantity)" disabled />
+        </el-form-item>
+        <el-form-item label="褰掕繕鏁伴噺" prop="returnQuantity">
+          <el-input-number v-model="returnForm.returnQuantity" :min="0.0001"
+            :max="currentBorrow.borrowQuantity - currentBorrow.returnedQuantity" :precision="4"
+            placeholder="璇疯緭鍏ュ綊杩樻暟閲�" style="width: 100%" />
+        </el-form-item>
+        <el-form-item label="褰掕繕浜�" prop="returnerId">
+          <el-select v-model="returnForm.returnerId" filterable placeholder="璇烽�夋嫨褰掕繕浜�" style="width: 100%"
+            @change="handleReturnerChange">
+            <el-option v-for="item in userList" :key="item.userId" :label="item.nickName" :value="item.userId" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="澶囨敞" prop="remark">
+          <el-input v-model="returnForm.remark" type="textarea" :rows="3" placeholder="璇疯緭鍏ュ娉�" />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <el-button @click="returnDialogVisible = false">鍙栨秷</el-button>
+        <el-button type="primary" @click="submitReturnForm">纭畾</el-button>
+      </template>
+    </el-dialog>
+
+    <!-- 璇︽儏寮圭獥 -->
+    <el-dialog v-model="detailDialogVisible" title="棰嗙敤璇︽儏" width="700px" destroy-on-close>
+      <el-descriptions :column="2" border>
+        <el-descriptions-item label="棰嗙敤鍗曞彿">{{ detailData.borrowNo }}</el-descriptions-item>
+        <el-descriptions-item label="浜у搧鍚嶇О">{{ detailData.productName }}</el-descriptions-item>
+        <el-descriptions-item label="瑙勬牸鍨嬪彿">{{ detailData.model }}</el-descriptions-item>
+        <el-descriptions-item label="浜у搧缂栫爜">{{ detailData.productCode }}</el-descriptions-item>
+        <el-descriptions-item label="鍗曚綅">{{ detailData.unit }}</el-descriptions-item>
+        <el-descriptions-item label="鎵瑰彿">{{ detailData.batchNo }}</el-descriptions-item>
+        <el-descriptions-item label="棰嗙敤鏁伴噺">{{ detailData.borrowQuantity }}</el-descriptions-item>
+        <el-descriptions-item label="宸插綊杩樻暟閲�">{{ detailData.returnedQuantity }}</el-descriptions-item>
+        <el-descriptions-item label="鍓╀綑鍙綊杩�">{{ formatQuantity(detailData.borrowQuantity - detailData.returnedQuantity) }}</el-descriptions-item>
+        <el-descriptions-item label="棰嗙敤浜�">{{ detailData.borrowerName }}</el-descriptions-item>
+        <el-descriptions-item label="棰嗙敤鏃堕棿">{{ detailData.borrowTime }}</el-descriptions-item>
+        <el-descriptions-item label="棰勮褰掕繕鏃堕棿">{{ detailData.expectedReturnTime }}</el-descriptions-item>
+        <el-descriptions-item label="瀹℃壒鐘舵��">
+          <el-tag :type="getApprovalStatusType(detailData.approvalStatus)">{{ detailData.approvalStatusName
+          }}</el-tag>
+        </el-descriptions-item>
+        <el-descriptions-item label="褰掕繕鐘舵��">
+          <el-tag :type="getStatusType(detailData.status)">{{ detailData.statusName }}</el-tag>
+        </el-descriptions-item>
+        <el-descriptions-item label="澶囨敞" :span="2">{{ detailData.remark }}</el-descriptions-item>
+        <el-descriptions-item label="鍒涘缓鏃堕棿" :span="2">{{ detailData.createTime }}</el-descriptions-item>
+      </el-descriptions>
+
+      <!-- 褰掕繕璁板綍 -->
+      <div v-if="detailData.approvalStatus === 1" class="mt20">
+        <div class="mb10 fw-bold">褰掕繕璁板綍</div>
+        <el-table :data="returnRecordList" border style="width: 100%" max-height="200">
+          <el-table-column align="center" label="搴忓彿" type="index" width="60" />
+          <el-table-column label="褰掕繕鏁伴噺" prop="returnQuantity" />
+          <el-table-column label="褰掕繕浜�" prop="returnerName" />
+          <el-table-column label="褰掕繕鏃堕棿" prop="returnTime" />
+          <el-table-column label="澶囨敞" prop="remark" />
+        </el-table>
+      </div>
+    </el-dialog>
+
+    <!-- 鏂板搴撳瓨寮圭獥 -->
+    <NewStockInventory v-if="isShowNewModal" v-model:visible="isShowNewModal" :top-product-parent-id="props.productId"
+      @completed="getList" />
+
+    <!-- 搴撳瓨鏌ヨ渚ц竟鏍� -->
+    <el-drawer v-model="showStockDrawer" title="搴撳瓨鍜岄鐢ㄩ噺鏌ヨ" size="1000px" direction="rtl" destroy-on-close
+      @open="handleStockDrawerOpen">
+      <div class="stock-drawer-content">
+        <!-- 鎼滅储琛ㄥ崟 -->
+        <el-form :inline="true" class="mb10">
+          <el-form-item label="浜у搧鍚嶇О">
+            <el-input v-model="stockSearchForm.productName" placeholder="璇疯緭鍏�" clearable style="width: 150px" />
+          </el-form-item>
+          <el-form-item label="瑙勬牸鍨嬪彿">
+            <el-input v-model="stockSearchForm.model" placeholder="璇疯緭鍏�" clearable style="width: 150px" />
+          </el-form-item>
+          <el-form-item label="鎵瑰彿">
+            <el-input v-model="stockSearchForm.batchNo" placeholder="璇疯緭鍏�" clearable style="width: 150px" />
+          </el-form-item>
+          <el-form-item>
+            <el-button type="primary" @click="getStockList">鏌ヨ</el-button>
+            <el-button @click="resetStockSearch">閲嶇疆</el-button>
+          </el-form-item>
+        </el-form>
+
+        <!-- 搴撳瓨鍒楄〃 -->
+        <el-table :data="stockTableData" border v-loading="stockTableLoading" style="width: 100%" height="calc(100vh - 200px)">
+          <el-table-column align="center" label="搴忓彿" type="index" width="60" />
+          <el-table-column label="浜у搧鍚嶇О" prop="productName" show-overflow-tooltip />
+          <el-table-column label="瑙勬牸鍨嬪彿" prop="model" show-overflow-tooltip />
+          <el-table-column label="鎵瑰彿" prop="batchNo" show-overflow-tooltip>
+            <template #default="{ row }">
+              {{ row.batchNo || '-' }}
+            </template>
+          </el-table-column>
+          <el-table-column label="搴撳瓨鏁伴噺" prop="qualitity" show-overflow-tooltip width="100" />
+          <el-table-column label="琚鐢ㄩ噺" prop="borrowedQuantity" show-overflow-tooltip width="90" />
+          <el-table-column label="鍙鐢ㄩ噺" prop="availableQuantity" show-overflow-tooltip width="90">
+            <template #default="{ row }">
+              <span :class="{ 'text-danger': row.availableQuantity <= 0 }">{{ formatQuantity(row.availableQuantity) }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="鍗曚綅" prop="unit" show-overflow-tooltip width="60" />
+        </el-table>
+        <pagination v-show="stockTotal > 0" :total="stockTotal" layout="total, sizes, prev, pager, next, jumper"
+          :page="stockPage.current" :limit="stockPage.size" @pagination="stockPaginationChange" />
+      </div>
+    </el-drawer>
+  </div>
+</template>
+
+<script setup>
+import pagination from "@/components/PIMTable/Pagination.vue";
+import ProductSelectDialog from "@/views/basicData/product/ProductSelectDialog.vue";
+import NewStockInventory from "@/views/inventoryManagement/stockManagement/New.vue";
+import { ref, reactive, toRefs, onMounted, getCurrentInstance, defineAsyncComponent } from "vue";
+import { ElMessage, ElMessageBox } from "element-plus";
+import {
+  getBorrowListPage,
+  getBorrowDetail,
+  addBorrow,
+  getReturnListByBorrowId,
+  addReturn,
+} from "@/api/inventoryManagement/productBorrow.js";
+import { pageStockAndBorrow } from "@/api/inventoryManagement/stockInventory.js";
+import { userListNoPage } from "@/api/system/user.js";
+
+const props = defineProps({
+  productId: {
+    type: Number,
+    required: true,
+    default: 0,
+  },
+});
+
+const { proxy } = getCurrentInstance();
+
+// 琛ㄦ牸鏁版嵁
+const tableData = ref([]);
+const tableLoading = ref(false);
+const page = reactive({
+  current: 1,
+  size: 100,
+});
+const total = ref(0);
+
+// 鎼滅储琛ㄥ崟
+const data = reactive({
+  searchForm: {
+    borrowNo: "",
+    productName: "",
+    model: "",
+    borrowerName: "",
+    status: null,
+  },
+});
+const { searchForm } = toRefs(data);
+const searchFormRef = ref(null);
+
+// 鐢ㄦ埛鍒楄〃
+const userList = ref([]);
+
+// 浜у搧閫夋嫨寮圭獥
+const showProductSelectDialog = ref(false);
+
+// 鎵瑰彿鍒楄〃
+const batchNoList = ref([]);
+
+// 棰嗙敤寮圭獥
+const borrowDialogVisible = ref(false);
+const borrowDialogTitle = ref("鏂板棰嗙敤");
+const borrowFormRef = ref(null);
+const borrowForm = ref({
+  id: null,
+  productModelId: null,
+  productName: "",
+  model: "",
+  unit: "",
+  batchNo: "",
+  borrowQuantity: null,
+  borrowerId: null,
+  borrowerName: "",
+  expectedReturnTime: "",
+  remark: "",
+});
+const borrowRules = {
+  productModelId: [{ required: true, message: "璇烽�夋嫨浜у搧", trigger: "change" }],
+  borrowQuantity: [{ required: true, message: "璇疯緭鍏ラ鐢ㄦ暟閲�", trigger: "blur" }],
+  borrowerId: [{ required: true, message: "璇烽�夋嫨棰嗙敤浜�", trigger: "change" }],
+};
+
+// 褰掕繕寮圭獥
+const returnDialogVisible = ref(false);
+const returnFormRef = ref(null);
+const returnForm = ref({
+  borrowId: null,
+  returnQuantity: null,
+  returnerId: null,
+  returnerName: "",
+  remark: "",
+});
+const returnRules = {
+  returnQuantity: [{ required: true, message: "璇疯緭鍏ュ綊杩樻暟閲�", trigger: "blur" }],
+  returnerId: [{ required: true, message: "璇烽�夋嫨褰掕繕浜�", trigger: "change" }],
+};
+const currentBorrow = ref({});
+
+// 璇︽儏寮圭獥
+const detailDialogVisible = ref(false);
+const detailData = ref({});
+const returnRecordList = ref([]);
+
+// 鏂板搴撳瓨寮圭獥
+const isShowNewModal = ref(false);
+
+// 搴撳瓨鏌ヨ渚ц竟鏍�
+const showStockDrawer = ref(false);
+const stockTableData = ref([]);
+const stockTableLoading = ref(false);
+const stockPage = reactive({
+  current: 1,
+  size: 10,
+});
+const stockTotal = ref(0);
+const stockSearchForm = reactive({
+  productName: "",
+  model: "",
+  batchNo: "",
+});
+
+// 鑾峰彇鐢ㄦ埛鍒楄〃
+const getUserList = async () => {
+  try {
+    const res = await userListNoPage();
+    userList.value = res.data || [];
+  } catch (error) {
+    console.error("鑾峰彇鐢ㄦ埛鍒楄〃澶辫触", error);
+  }
+};
+
+// 鏌ヨ鍒楄〃
+const getList = async () => {
+  tableLoading.value = true;
+  try {
+    const res = await getBorrowListPage({ ...searchForm.value, ...page });
+    tableData.value = res.data?.records || [];
+    total.value = res.data?.total || 0;
+  } catch (error) {
+    console.error("鏌ヨ鍒楄〃澶辫触", error);
+  } finally {
+    tableLoading.value = false;
+  }
+};
+
+const handleQuery = () => {
+  page.current = 1;
+  getList();
+};
+
+const resetSearch = () => {
+  searchFormRef.value?.resetFields();
+  page.current = 1;
+  getList();
+};
+
+const paginationChange = (obj) => {
+  page.current = obj.page;
+  page.size = obj.limit;
+  getList();
+};
+
+// 鐘舵�佹爣绛剧被鍨�
+const getApprovalStatusType = (status) => {
+  const map = { 0: "warning", 1: "success", 2: "danger" };
+  return map[status] || "";
+};
+
+const getStatusType = (status) => {
+  const map = { 0: "danger", 1: "warning", 2: "success" };
+  return map[status] || "";
+};
+
+// 鏍煎紡鍖栨暟閲忥紝鍘绘帀灏鹃儴澶氫綑鐨�0
+const formatQuantity = (num) => {
+  if (num == null) return "";
+  const fixed = Number(num).toFixed(4);
+  return parseFloat(fixed).toString();
+};
+
+// 鏂板棰嗙敤
+const handleAdd = () => {
+  borrowDialogTitle.value = "鏂板棰嗙敤";
+  borrowForm.value = {
+    id: null,
+    productModelId: null,
+    productName: "",
+    model: "",
+    unit: "",
+    batchNo: "",
+    borrowQuantity: null,
+    borrowerId: null,
+    borrowerName: "",
+    expectedReturnTime: "",
+    remark: "",
+  };
+  batchNoList.value = [];
+  borrowDialogVisible.value = true;
+};
+
+// 浜у搧閫夋嫨澶勭悊
+const handleProductSelect = (products) => {
+  if (products && products.length > 0) {
+    const product = products[0];
+    borrowForm.value.productModelId = product.id;
+    borrowForm.value.productName = product.productName;
+    borrowForm.value.model = product.model;
+    borrowForm.value.unit = product.unit;
+    borrowForm.value.batchNo = ""; // 閲嶇疆鎵瑰彿閫夋嫨
+    batchNoList.value = product.batchNoList || []; // 浠庝骇鍝佹暟鎹甫鍑烘壒鍙峰垪琛�
+    showProductSelectDialog.value = false;
+    // 瑙﹀彂琛ㄥ崟楠岃瘉鏇存柊
+    borrowFormRef.value?.validateField("productModelId");
+  }
+};
+
+// 棰嗙敤浜哄彉鏇�
+const handleBorrowerChange = (val) => {
+  const user = userList.value.find((item) => item.userId === val);
+  borrowForm.value.borrowerName = user?.nickName || "";
+};
+
+// 鎻愪氦棰嗙敤琛ㄥ崟
+const submitBorrowForm = async () => {
+  await borrowFormRef.value?.validate();
+  try {
+    await addBorrow(borrowForm.value);
+    ElMessage.success("鏂板鎴愬姛");
+    borrowDialogVisible.value = false;
+    getList();
+  } catch (error) {
+    console.error("鎻愪氦澶辫触", error);
+  }
+};
+
+// 褰掕繕
+const handleReturn = (row) => {
+  currentBorrow.value = row;
+  returnForm.value = {
+    borrowId: row.id,
+    returnQuantity: null,
+    returnerId: null,
+    returnerName: "",
+    remark: "",
+  };
+  returnDialogVisible.value = true;
+};
+
+// 褰掕繕浜哄彉鏇�
+const handleReturnerChange = (val) => {
+  const user = userList.value.find((item) => item.userId === val);
+  returnForm.value.returnerName = user?.nickName || "";
+};
+
+// 鎻愪氦褰掕繕琛ㄥ崟
+const submitReturnForm = async () => {
+  await returnFormRef.value?.validate();
+  try {
+    await addReturn(returnForm.value);
+    ElMessage.success("褰掕繕鎴愬姛");
+    returnDialogVisible.value = false;
+    getList();
+  } catch (error) {
+    console.error("褰掕繕澶辫触", error);
+  }
+};
+
+// 鏌ョ湅璇︽儏
+const handleDetail = async (row) => {
+  try {
+    const res = await getBorrowDetail({ id: row.id });
+    detailData.value = res.data || {};
+
+    // 濡傛灉宸查�氳繃锛屾煡璇㈠綊杩樿褰�
+    if (detailData.value.approvalStatus === 1) {
+      const returnRes = await getReturnListByBorrowId({ borrowId: row.id, current: 1, size: 100 });
+      returnRecordList.value = returnRes.data?.records || [];
+    } else {
+      returnRecordList.value = [];
+    }
+
+    detailDialogVisible.value = true;
+  } catch (error) {
+    console.error("鑾峰彇璇︽儏澶辫触", error);
+  }
+};
+
+// 鏌ヨ搴撳瓨鍒楄〃
+const getStockList = async () => {
+  stockTableLoading.value = true;
+  try {
+    const res = await pageStockAndBorrow({
+      ...stockSearchForm,
+      ...stockPage,
+      topParentProductId: props.productId,
+    });
+    stockTableData.value = res.data?.records || [];
+    stockTotal.value = res.data?.total || 0;
+  } catch (error) {
+    console.error("鏌ヨ搴撳瓨澶辫触", error);
+  } finally {
+    stockTableLoading.value = false;
+  }
+};
+
+// 閲嶇疆搴撳瓨鎼滅储
+const resetStockSearch = () => {
+  stockSearchForm.productName = "";
+  stockSearchForm.model = "";
+  stockSearchForm.batchNo = "";
+  stockPage.current = 1;
+  getStockList();
+};
+
+// 搴撳瓨鍒嗛〉鍙樺寲
+const stockPaginationChange = (obj) => {
+  stockPage.current = obj.page;
+  stockPage.size = obj.limit;
+  getStockList();
+};
+
+// 鐩戝惉搴撳瓨渚ц竟鏍忔墦寮�锛岃嚜鍔ㄥ姞杞芥暟鎹�
+const handleStockDrawerOpen = () => {
+  stockPage.current = 1;
+  getStockList();
+};
+
+onMounted(() => {
+  getUserList();
+  getList();
+});
+</script>
+
+<style scoped lang="scss">
+.mt10 {
+  margin-top: 10px;
+}
+
+.mt20 {
+  margin-top: 20px;
+}
+
+.mb10 {
+  margin-bottom: 10px;
+}
+
+.fw-bold {
+  font-weight: bold;
+}
+
+.stock-drawer-content {
+  padding: 0 20px;
+}
+
+.text-danger {
+  color: #f56c6c;
+}
+
+.flex {
+  display: flex;
+}
+
+.justify-end {
+  justify-content: flex-end;
+}
+</style>
diff --git a/src/views/inventoryManagement/stockManagement/index.vue b/src/views/inventoryManagement/stockManagement/index.vue
index b3aa7ee..ede182b 100644
--- a/src/views/inventoryManagement/stockManagement/index.vue
+++ b/src/views/inventoryManagement/stockManagement/index.vue
@@ -6,7 +6,8 @@
                      :label="tab.productName"
                      :name="tab.id"
                      :key="tab.id">
-          <Record :product-id="tab.id" v-if="tab.id === activeTab" />
+          <OfficeRecord :product-id="tab.id" v-if="tab.id === activeTab && tab.productName === '鍔炲叕鐢ㄥ搧'" />
+          <Record :product-id="tab.id" v-else-if="tab.id === activeTab" />
         </el-tab-pane>
       </el-tabs>
     </div>
@@ -17,6 +18,7 @@
 import { ref, onMounted } from 'vue';
 import { productTreeList } from "@/api/basicData/product.js";
 import Record from "@/views/inventoryManagement/stockManagement/Record.vue";
+import OfficeRecord from "@/views/inventoryManagement/stockManagement/OfficeRecord.vue";
 const products = ref([])
 const activeTab = ref(null)
 const loading = ref(false)
@@ -41,4 +43,4 @@
 onMounted(() => {
   fetchProducts();
 })
-</script>
\ No newline at end of file
+</script>

--
Gitblit v1.9.3