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