From 8d3b1c06ed0ef0803c31085cb3e90aa6d3d622f0 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期四, 11 六月 2026 14:51:13 +0800
Subject: [PATCH] refactor(workOrder): 重构工单管理页面为父子表格结构

---
 src/api/productionManagement/workOrder.js                    |    8 
 docs/生产工单模块前端联调文档.md                                         |  505 +++++++++++++++++++++++++++++
 vite.config.js                                               |    2 
 src/views/productionManagement/workOrderManagement/index.vue |  495 ++++++++++++++++++----------
 4 files changed, 828 insertions(+), 182 deletions(-)

diff --git "a/docs/\347\224\237\344\272\247\345\267\245\345\215\225\346\250\241\345\235\227\345\211\215\347\253\257\350\201\224\350\260\203\346\226\207\346\241\243.md" "b/docs/\347\224\237\344\272\247\345\267\245\345\215\225\346\250\241\345\235\227\345\211\215\347\253\257\350\201\224\350\260\203\346\226\207\346\241\243.md"
new file mode 100644
index 0000000..02b36ac
--- /dev/null
+++ "b/docs/\347\224\237\344\272\247\345\267\245\345\215\225\346\250\241\345\235\227\345\211\215\347\253\257\350\201\224\350\260\203\346\226\207\346\241\243.md"
@@ -0,0 +1,505 @@
+# 鐢熶骇宸ュ崟妯″潡鍓嶇鑱旇皟鏂囨。
+
+> 鏂囨。鐢熸垚鏃ユ湡锛�2026-06-11
+> 閫傜敤鍒嗘敮锛歞ev_澶╂触_涓叴瀹炲己
+
+---
+
+## 鍙樻洿璁板綍
+
+| 鏃ユ湡 | 鍙樻洿鍐呭 | 褰卞搷鑼冨洿 |
+|------|----------|----------|
+| 2026-06-11 | /page鎺ュ彛鏀逛负鎸夎鍗曞垎缁勮仛鍚� | 鍒楄〃椤靛睍绀洪�昏緫璋冩暣 |
+| 2026-06-11 | 鏂板/byOrder/{orderId}鎺ュ彛 | 璁㈠崟璇︽儏椤靛伐鍗曞垪琛� |
+
+---
+
+## 涓�銆佹帴鍙e垪琛�
+
+| 鎺ュ彛鍚嶇О | 鎺ュ彛璺緞 | 璇锋眰鏂瑰紡 | 璇存槑 |
+|----------|----------|----------|------|
+| 宸ュ崟鍒嗛〉鏌ヨ | `/productionOperationTask/page` | GET | 鎸夌敓浜ц鍗曠淮搴﹀垎缁勫睍绀� |
+| 璁㈠崟宸ュ崟鍒楄〃 | `/productionOperationTask/byOrder/{orderId}` | GET | 鏍规嵁璁㈠崟ID鏌ヨ宸ュ崟鏄庣粏 |
+
+---
+
+## 浜屻�佹帴鍙h鎯�
+
+### 2.1 宸ュ崟鍒嗛〉鏌ヨ
+
+#### 鍩烘湰淇℃伅
+
+```
+GET /productionOperationTask/page
+```
+
+#### 璇锋眰鍙傛暟锛圦uery锛�
+
+| 鍙傛暟鍚� | 绫诲瀷 | 蹇呭~ | 璇存槑 |
+|--------|------|------|------|
+| current | Number | 鍚� | 褰撳墠椤电爜锛岄粯璁�1 |
+| size | Number | 鍚� | 姣忛〉鏉℃暟锛岄粯璁�10 |
+| npsNo | String | 鍚� | 鐢熶骇璁㈠崟鍙凤紝妯$硦鏌ヨ |
+| productionOrderId | Number | 鍚� | 鐢熶骇璁㈠崟ID锛岀簿纭尮閰� |
+
+#### 璇锋眰绀轰緥
+
+```javascript
+// 鍩虹鍒嗛〉鏌ヨ
+axios.get('/productionOperationTask/page', {
+  params: {
+    current: 1,
+    size: 10
+  }
+})
+
+// 鎸夎鍗曞彿绛涢��
+axios.get('/productionOperationTask/page', {
+  params: {
+    current: 1,
+    size: 10,
+    npsNo: 'SC202606'
+  }
+})
+```
+
+#### 鍝嶅簲缁撴瀯
+
+```json
+{
+  "code": 200,
+  "msg": "鎿嶄綔鎴愬姛",
+  "data": {
+    "records": [
+      {
+        "productionOrderId": 123,
+        "npsNo": "SC20260611001",
+        "endOrder": false,
+        "productName": "鐢电嚎鐢电紗",
+        "model": "RVV 3*2.5",
+        "unit": "绫�",
+        "operationName": "缁炵嚎,缁濈紭,鎴愮紗",
+        "productionTaskCount": 3,
+        "planQuantity": 1000.00,
+        "completeQuantity": 500.00,
+        "goodQuantity": 500.00,
+        "scrapQty": 10.00,
+        "completionStatus": 50.00,
+        "type": 1,
+        "workOrderType": "姝e父",
+        "workOrderNo": "GD20260611001,GD20260611002,GD20260611003",
+        "planStartTime": "2026-06-10",
+        "planEndTime": "2026-06-15",
+        "actualStartTime": "2026-06-11",
+        "actualEndTime": null,
+        "status": 3
+      }
+    ],
+    "total": 100,
+    "current": 1,
+    "size": 10
+  }
+}
+```
+
+#### 鍝嶅簲瀛楁璇存槑
+
+| 瀛楁鍚� | 绫诲瀷 | 璇存槑 | 鍓嶇灞曠ず寤鸿 |
+|--------|------|------|--------------|
+| productionOrderId | Number | 鐢熶骇璁㈠崟ID | 鐢ㄤ簬璺宠浆璁㈠崟璇︽儏 |
+| npsNo | String | 鐢熶骇璁㈠崟鍙� | 鍒楄〃涓绘爣棰� |
+| endOrder | Boolean | 鏄惁缁撴潫 | 宸茬粨鏉熸椂鏄剧ず"宸茬粨鏉�"鏍囩 |
+| productName | String | 浜у搧鍚嶇О | 鍒楄〃鍓爣棰� |
+| model | String | 瑙勬牸鍨嬪彿 | 浜у搧瑙勬牸灞曠ず |
+| unit | String | 鍗曚綅 | 鏁伴噺鍗曚綅 |
+| operationName | String | 宸ュ簭鍚嶇О锛堥�楀彿鍒嗛殧锛� | 宸ュ簭鍒楄〃灞曠ず |
+| productionTaskCount | Number | 宸ュ崟浠诲姟鏁伴噺 | 鏄剧ず"鍏盭涓伐鍗�" |
+| planQuantity | Number | 璁″垝鏁伴噺锛堣鍗曠骇锛� | 杩涘害鏉℃�绘暟 |
+| completeQuantity | Number | 瀹屾垚鏁伴噺锛堣鍗曠骇锛� | 杩涘害鏉″凡瀹屾垚 |
+| goodQuantity | Number | 鑹搧鏁伴噺 | 鑹搧缁熻 |
+| scrapQty | Number | 鎶ュ簾鏁伴噺 | 鎶ュ簾缁熻锛堢孩鑹叉爣璁帮級 |
+| completionStatus | Number | 瀹屾垚杩涘害鐧惧垎姣� | 杩涘害鏉℃暟鍊� |
+| type | Number | 宸ュ簭绫诲瀷 | 0=璁℃椂锛�1=璁′欢 |
+| workOrderType | String | 宸ュ崟绫诲瀷 | "姝e父"鎴�"杩斿伐杩斾慨" |
+| workOrderNo | String | 宸ュ崟缂栧彿锛堥�楀彿鍒嗛殧锛� | 鐐瑰嚮鍙睍寮�鏌ョ湅 |
+| planStartTime | String | 璁″垝寮�濮嬫椂闂� | 鏍煎紡锛歒YYY-MM-DD |
+| planEndTime | String | 璁″垝缁撴潫鏃堕棿 | 鏍煎紡锛歒YYY-MM-DD |
+| actualStartTime | String | 瀹為檯寮�濮嬫椂闂� | 鏍煎紡锛歒YYY-MM-DD |
+| actualEndTime | String | 瀹為檯缁撴潫鏃堕棿 | 鏍煎紡锛歒YYY-MM-DD |
+| status | Number | 鐘舵�� | 瑙佺姸鎬佹灇涓捐〃 |
+
+---
+
+### 2.2 璁㈠崟宸ュ崟鍒楄〃
+
+#### 鍩烘湰淇℃伅
+
+```
+GET /productionOperationTask/byOrder/{orderId}
+```
+
+#### 璇锋眰鍙傛暟锛圥ath锛�
+
+| 鍙傛暟鍚� | 绫诲瀷 | 蹇呭~ | 璇存槑 |
+|--------|------|------|------|
+| orderId | Number | 鏄� | 鐢熶骇璁㈠崟ID |
+
+#### 璇锋眰绀轰緥
+
+```javascript
+// 鏌ヨ璁㈠崟ID涓�123鐨勬墍鏈夊伐鍗�
+axios.get('/productionOperationTask/byOrder/123')
+```
+
+#### 鍝嶅簲缁撴瀯
+
+```json
+{
+  "code": 200,
+  "msg": "鎿嶄綔鎴愬姛",
+  "data": [
+    {
+      "id": 1,
+      "workOrderNo": "GD20260611001",
+      "planStartTime": "2026-06-10",
+      "planEndTime": "2026-06-12",
+      "actualStartTime": "2026-06-11",
+      "actualEndTime": null,
+      "status": 3,
+      "productionOrderId": 123,
+      "planQuantity": 500.00,
+      "completeQuantity": 300.00,
+      "npsNo": "SC20260611001",
+      "endOrder": false,
+      "productName": "鐢电嚎鐢电紗",
+      "model": "RVV 3*2.5",
+      "unit": "绫�",
+      "operationName": "缁炵嚎",
+      "type": 1,
+      "workOrderType": "姝e父",
+      "scrapQty": 5.00,
+      "completionStatus": 60.00,
+      "userNames": "寮犱笁,鏉庡洓"
+    },
+    {
+      "id": 2,
+      "workOrderNo": "FG20260611001",
+      "planStartTime": "2026-06-12",
+      "planEndTime": "2026-06-15",
+      "actualStartTime": "2026-06-13",
+      "actualEndTime": null,
+      "status": 3,
+      "productionOrderId": 123,
+      "planQuantity": 100.00,
+      "completeQuantity": 50.00,
+      "npsNo": "SC20260611001",
+      "endOrder": false,
+      "productName": "鐢电嚎鐢电紗",
+      "model": "RVV 3*2.5",
+      "unit": "绫�",
+      "operationName": "缁濈紭",
+      "type": 0,
+      "workOrderType": "杩斿伐杩斾慨",
+      "scrapQty": 2.00,
+      "completionStatus": 50.00,
+      "userNames": "鐜嬩簲"
+    }
+  ]
+}
+```
+
+#### 鍝嶅簲瀛楁璇存槑
+
+| 瀛楁鍚� | 绫诲瀷 | 璇存槑 | 鍓嶇灞曠ず寤鸿 |
+|--------|------|------|--------------|
+| id | Number | 宸ュ崟ID | 鐢ㄤ簬鎶ュ伐銆佽鎯呰烦杞� |
+| workOrderNo | String | 宸ュ崟缂栧彿 | 鍒楄〃涓绘爣棰� |
+| planStartTime | String | 璁″垝寮�濮嬫椂闂� | 鏃堕棿鑼冨洿灞曠ず |
+| planEndTime | String | 璁″垝缁撴潫鏃堕棿 | 鏃堕棿鑼冨洿灞曠ず |
+| actualStartTime | String | 瀹為檯寮�濮嬫椂闂� | 瀹為檯鏃堕棿灞曠ず |
+| actualEndTime | String | 瀹為檯缁撴潫鏃堕棿 | 瀹為檯鏃堕棿灞曠ず |
+| status | Number | 宸ュ崟鐘舵�� | 鐘舵�佹爣绛� |
+| productionOrderId | Number | 鐢熶骇璁㈠崟ID | 鍏宠仈璁㈠崟 |
+| planQuantity | Number | 璁″垝鏁伴噺锛堝伐鍗曠骇锛� | 杩涘害鏉℃�绘暟 |
+| completeQuantity | Number | 瀹屾垚鏁伴噺锛堝伐鍗曠骇锛� | 杩涘害鏉″凡瀹屾垚 |
+| npsNo | String | 鐢熶骇璁㈠崟鍙� | 璁㈠崟鍙峰睍绀� |
+| endOrder | Boolean | 鏄惁缁撴潫 | 缁撴潫鏍囩 |
+| productName | String | 浜у搧鍚嶇О | 浜у搧淇℃伅 |
+| model | String | 瑙勬牸鍨嬪彿 | 瑙勬牸灞曠ず |
+| unit | String | 鍗曚綅 | 鏁伴噺鍗曚綅 |
+| operationName | String | 宸ュ簭鍚嶇О | 鍗曚釜宸ュ簭 |
+| type | Number | 宸ュ簭绫诲瀷 | 0=璁℃椂锛�1=璁′欢 |
+| workOrderType | String | 宸ュ崟绫诲瀷 | 杩斿伐杩斾慨鐢ㄧ孩鑹叉爣璁� |
+| scrapQty | Number | 鎶ュ簾鏁伴噺 | 鎶ュ簾缁熻 |
+| completionStatus | Number | 瀹屾垚杩涘害鐧惧垎姣� | 杩涘害鏉℃暟鍊� |
+| userNames | String | 鎶ュ伐浜哄憳锛堥�楀彿鍒嗛殧锛� | 浜哄憳鍒楄〃 |
+
+---
+
+## 涓夈�佹灇涓惧�兼槧灏�
+
+### 3.1 宸ュ崟鐘舵��
+
+| 鐘舵�佸�� | 鏂囨 | 鏍囩棰滆壊寤鸿 |
+|--------|------|--------------|
+| 1 | 寰呯‘璁� | 鐏拌壊/榛樿 |
+| 2 | 寰呯敓浜� | 钃濊壊/info |
+| 3 | 鐢熶骇涓� | 缁胯壊/success |
+| 4 | 宸茬敓浜� | 娣辩豢鑹�/success-dark |
+
+#### 鍓嶇鐘舵�佹槧灏勭ず渚�
+
+```javascript
+const statusMap = {
+  1: { text: '寰呯‘璁�', color: 'default' },
+  2: { text: '寰呯敓浜�', color: 'info' },
+  3: { text: '鐢熶骇涓�', color: 'success' },
+  4: { text: '宸茬敓浜�', color: 'success-dark' }
+}
+
+function getStatusTag(status) {
+  return statusMap[status] || { text: '鏈煡', color: 'default' }
+}
+```
+
+### 3.2 宸ュ簭绫诲瀷
+
+| 绫诲瀷鍊� | 鏂囨 | 璇存槑 |
+|--------|------|------|
+| 0 | 璁℃椂 | 鎸夊伐鏃惰绠楀伐璧� |
+| 1 | 璁′欢 | 鎸変骇閲忚绠楀伐璧� |
+
+```javascript
+const typeMap = {
+  0: '璁℃椂',
+  1: '璁′欢'
+}
+```
+
+### 3.3 宸ュ崟绫诲瀷鍒ゆ柇
+
+| 绫诲瀷 | 鍒ゆ柇瑙勫垯 | 鏍囩棰滆壊寤鸿 |
+|------|----------|--------------|
+| 姝e父 | workOrderNo 涓嶄互 'FG' 寮�澶� | 榛樿鑹� |
+| 杩斿伐杩斾慨 | workOrderNo 浠� 'FG' 寮�澶� | 绾㈣壊/error |
+
+```javascript
+function getWorkOrderType(workOrderNo) {
+  return workOrderNo?.startsWith('FG') ? '杩斿伐杩斾慨' : '姝e父'
+}
+```
+
+---
+
+## 鍥涖�侀〉闈㈣璁″缓璁�
+
+### 4.1 宸ュ崟鍒楄〃椤碉紙浣跨敤 /page 鎺ュ彛锛�
+
+#### 琛ㄦ牸鍒楄璁�
+
+| 鍒楀悕 | 瀛楁 | 瀹藉害 | 璇存槑 |
+|------|------|------|------|
+| 鐢熶骇璁㈠崟鍙� | npsNo | 150px | 鍙偣鍑昏烦杞鎯� |
+| 浜у搧鍚嶇О | productName | 120px | - |
+| 瑙勬牸鍨嬪彿 | model | 150px | - |
+| 宸ュ簭 | operationName | 200px | 澶氫釜宸ュ簭閫楀彿鍒嗛殧 |
+| 宸ュ崟绫诲瀷 | workOrderType | 100px | 姝e父/杩斿伐杩斾慨 |
+| 璁″垝鏁伴噺 | planQuantity | 100px | 璁㈠崟绾у埆 |
+| 瀹屾垚鏁伴噺 | completeQuantity | 100px | 璁㈠崟绾у埆 |
+| 瀹屾垚杩涘害 | completionStatus | 120px | 杩涘害鏉�+鐧惧垎姣� |
+| 鎶ュ簾鏁伴噺 | scrapQty | 80px | 绾㈣壊鏍囪 |
+| 宸ュ崟鏁� | productionTaskCount | 80px | 鍏盭涓伐鍗� |
+| 鐘舵�� | status | 80px | 鐘舵�佹爣绛� |
+| 鎿嶄綔 | - | 150px | 鏌ョ湅璇︽儏銆佹姤宸ョ瓑 |
+
+#### 杩涘害鏉″睍绀�
+
+```javascript
+// 浣跨敤杩涘害鏉$粍浠�
+<Progress 
+  percent={item.completionStatus} 
+  strokeColor="#52c41a"
+  format={percent => `${percent}%`}
+/>
+```
+
+### 4.2 璁㈠崟璇︽儏椤靛伐鍗曞垪琛紙浣跨敤 /byOrder/{orderId} 鎺ュ彛锛�
+
+#### 琛ㄦ牸鍒楄璁�
+
+| 鍒楀悕 | 瀛楁 | 瀹藉害 | 璇存槑 |
+|------|------|------|------|
+| 宸ュ崟缂栧彿 | workOrderNo | 150px | 涓绘爣璇� |
+| 宸ュ簭鍚嶇О | operationName | 120px | 鍗曚釜宸ュ簭 |
+| 宸ュ崟绫诲瀷 | workOrderType | 100px | 姝e父/杩斿伐杩斾慨 |
+| 宸ュ簭绫诲瀷 | type | 80px | 璁℃椂/璁′欢 |
+| 璁″垝鏁伴噺 | planQuantity | 100px | 宸ュ崟绾у埆 |
+| 瀹屾垚鏁伴噺 | completeQuantity | 100px | 宸ュ崟绾у埆 |
+| 瀹屾垚杩涘害 | completionStatus | 120px | 杩涘害鏉� |
+| 鎶ュ簾鏁伴噺 | scrapQty | 80px | 绾㈣壊鏍囪 |
+| 鎶ュ伐浜哄憳 | userNames | 150px | 澶氫汉閫楀彿鍒嗛殧 |
+| 璁″垝鏃堕棿 | planStartTime ~ planEndTime | 180px | 鏃堕棿鑼冨洿 |
+| 瀹為檯鏃堕棿 | actualStartTime ~ actualEndTime | 180px | 鏃堕棿鑼冨洿 |
+| 鐘舵�� | status | 80px | 鐘舵�佹爣绛� |
+| 鎿嶄綔 | - | 150px | 鎶ュ伐銆佹祦杞崱绛� |
+
+---
+
+## 浜斻�佷袱涓帴鍙f暟鎹樊寮傚姣�
+
+| 瀵规瘮椤� | /page 鎺ュ彛 | /byOrder/{orderId} 鎺ュ彛 |
+|--------|------------|-------------------------|
+| 鏁版嵁缁村害 | 璁㈠崟姹囨�� | 宸ュ崟鏄庣粏 |
+| planQuantity | 璁㈠崟璁″垝鏁� | 宸ュ崟璁″垝鏁� |
+| completeQuantity | 璁㈠崟瀹屾垚鏁� | 宸ュ崟瀹屾垚鏁� |
+| completionStatus | 璁㈠崟杩涘害 | 宸ュ崟杩涘害 |
+| operationName | 澶氬伐搴忚仛鍚� | 鍗曚釜宸ュ簭 |
+| workOrderNo | 澶氬伐鍗曡仛鍚� | 鍗曚釜宸ュ崟 |
+| userNames | 鏃� | 鏈夋姤宸ヤ汉鍛� |
+| 鐢ㄩ�� | 鍒楄〃姹囨�婚〉 | 璇︽儏鏄庣粏椤� |
+
+---
+
+## 鍏�佸墠绔皟鐢ㄦ敞鎰忎簨椤�
+
+### 6.1 鍒嗛〉鍙傛暟
+
+- `/page` 鎺ュ彛鏀寔鍒嗛〉锛岄渶浼� `current` 鍜� `size`
+- `/byOrder/{orderId}` 鎺ュ彛涓嶅垎椤碉紝杩斿洖鍏ㄩ儴宸ュ崟鍒楄〃
+
+### 6.2 鏁伴噺瀛楁绮惧害
+
+- 鎵�鏈夋暟閲忓瓧娈典负 `BigDecimal` 绫诲瀷锛屽墠绔睍绀烘椂淇濈暀2浣嶅皬鏁�
+- 瀹屾垚杩涘害 `completionStatus` 宸蹭负鐧惧垎姣旀暟鍊硷紙濡�50.00琛ㄧず50%锛�
+
+### 6.3 鏃堕棿瀛楁鏍煎紡
+
+- 鎵�鏈夋椂闂村瓧娈典负 `LocalDate` 鏍煎紡锛歚YYYY-MM-DD`
+- 鏃犳椂闂村�兼椂杩斿洖 `null`锛屽墠绔渶鍋氱┖鍊煎鐞�
+
+### 6.4 宸ュ崟绫诲瀷鍒ゆ柇
+
+- 鎺ュ彛宸茶繑鍥� `workOrderType` 瀛楁锛屾棤闇�鍓嶇鍒ゆ柇
+- 杩斿伐杩斾慨宸ュ崟寤鸿浣跨敤绾㈣壊鏍囩绐佸嚭鏄剧ず
+
+### 6.5 鎶ュ伐浜哄憳瀛楁
+
+- `userNames` 涓洪�楀彿鍒嗛殧瀛楃涓诧紝鍙兘涓虹┖
+- 澶氫汉鏃跺缓璁娇鐢ㄦ爣绛炬垨澶村儚鍒楄〃灞曠ず
+
+---
+
+## 涓冦�佸父瑙侀棶棰樺鐞�
+
+### 7.1 杩涘害涓虹┖鎴栭櫎闆�
+
+- `completionStatus` 宸插湪SQL涓鐞嗛櫎闆舵儏鍐�
+- 鑻ヨ鍒掓暟閲忎负0锛岃繘搴︽樉绀轰负0
+
+### 7.2 宸ュ崟鍙蜂负绌�
+
+- `workOrderNo` 涓哄繀濉瓧娈碉紝涓嶄細涓虹┖
+- 鑻ヨ仛鍚堝睍绀烘椂澶氫釜宸ュ崟鍙风敤閫楀彿鍒嗛殧
+
+### 7.3 鎶ュ簾鏁伴噺灞曠ず
+
+- `scrapQty` 涓虹疮璁℃姤搴熸暟閲�
+- 寤鸿浣跨敤绾㈣壊瀛椾綋鎴栬鍛婂浘鏍囨爣璇�
+
+---
+
+## 鍏�丮ock鏁版嵁绀轰緥
+
+### 8.1 /page 鎺ュ彛Mock
+
+```json
+{
+  "code": 200,
+  "data": {
+    "records": [
+      {
+        "productionOrderId": 1,
+        "npsNo": "SC20260611001",
+        "endOrder": false,
+        "productName": "鐢电嚎鐢电紗",
+        "model": "RVV 3*2.5",
+        "unit": "绫�",
+        "operationName": "缁炵嚎,缁濈紭,鎴愮紗",
+        "productionTaskCount": 3,
+        "planQuantity": 1000.00,
+        "completeQuantity": 500.00,
+        "goodQuantity": 500.00,
+        "scrapQty": 10.00,
+        "completionStatus": 50.00,
+        "type": 1,
+        "workOrderType": "姝e父",
+        "workOrderNo": "GD20260611001,GD20260611002,GD20260611003",
+        "planStartTime": "2026-06-10",
+        "planEndTime": "2026-06-15",
+        "actualStartTime": "2026-06-11",
+        "actualEndTime": null,
+        "status": 3
+      }
+    ],
+    "total": 1,
+    "current": 1,
+    "size": 10
+  }
+}
+```
+
+### 8.2 /byOrder/{orderId} 鎺ュ彛Mock
+
+```json
+{
+  "code": 200,
+  "data": [
+    {
+      "id": 1,
+      "workOrderNo": "GD20260611001",
+      "planStartTime": "2026-06-10",
+      "planEndTime": "2026-06-12",
+      "actualStartTime": "2026-06-11",
+      "actualEndTime": null,
+      "status": 3,
+      "productionOrderId": 1,
+      "planQuantity": 500.00,
+      "completeQuantity": 300.00,
+      "npsNo": "SC20260611001",
+      "endOrder": false,
+      "productName": "鐢电嚎鐢电紗",
+      "model": "RVV 3*2.5",
+      "unit": "绫�",
+      "operationName": "缁炵嚎",
+      "type": 1,
+      "workOrderType": "姝e父",
+      "scrapQty": 5.00,
+      "completionStatus": 60.00,
+      "userNames": "寮犱笁,鏉庡洓"
+    },
+    {
+      "id": 2,
+      "workOrderNo": "FG20260611001",
+      "planStartTime": "2026-06-12",
+      "planEndTime": "2026-06-15",
+      "actualStartTime": "2026-06-13",
+      "actualEndTime": null,
+      "status": 3,
+      "productionOrderId": 1,
+      "planQuantity": 100.00,
+      "completeQuantity": 50.00,
+      "npsNo": "SC20260611001",
+      "endOrder": false,
+      "productName": "鐢电嚎鐢电紗",
+      "model": "RVV 3*2.5",
+      "unit": "绫�",
+      "operationName": "缁濈紭",
+      "type": 0,
+      "workOrderType": "杩斿伐杩斾慨",
+      "scrapQty": 2.00,
+      "completionStatus": 50.00,
+      "userNames": "鐜嬩簲"
+    }
+  ]
+}
+```
\ No newline at end of file
diff --git a/src/api/productionManagement/workOrder.js b/src/api/productionManagement/workOrder.js
index b3050c9..3b4052a 100644
--- a/src/api/productionManagement/workOrder.js
+++ b/src/api/productionManagement/workOrder.js
@@ -95,3 +95,11 @@
     params: query,
   });
 }
+
+// 鏍规嵁璁㈠崟ID鑾峰彇宸ュ崟鏄庣粏鍒楄〃
+export function getWorkOrderListByOrderId(orderId) {
+  return request({
+    url: `/productionOperationTask/byOrder/${orderId}`,
+    method: "get",
+  });
+}
diff --git a/src/views/productionManagement/workOrderManagement/index.vue b/src/views/productionManagement/workOrderManagement/index.vue
index 60fe511..d8433b0 100644
--- a/src/views/productionManagement/workOrderManagement/index.vue
+++ b/src/views/productionManagement/workOrderManagement/index.vue
@@ -3,15 +3,6 @@
     <div class="search_form mb20">
       <div class="search-row">
         <div class="search-item">
-          <span class="search_title">宸ュ崟缂栧彿锛�</span>
-          <el-input v-model="searchForm.workOrderNo"
-                    style="width: 240px"
-                    placeholder="璇疯緭鍏�"
-                    @change="handleQuery"
-                    clearable
-                    prefix-icon="Search" />
-        </div>
-        <div class="search-item">
           <span class="search_title">鐢熶骇璁㈠崟鍙凤細</span>
           <el-input v-model="searchForm.npsNo"
                     style="width: 240px"
@@ -27,18 +18,199 @@
       </div>
     </div>
     <div class="table_list">
-      <PIMTable rowKey="id"
-                :column="tableColumn"
-                :tableData="tableData"
-                :page="page"
-                :tableLoading="tableLoading"
-                @pagination="pagination">
-        <template #completionStatus="{ row }">
-          <el-progress :percentage="toProgressPercentage(row?.completionStatus)"
-                       :color="progressColor(toProgressPercentage(row?.completionStatus))"
-                       :status="toProgressPercentage(row?.completionStatus) >= 100 ? 'success' : ''" />
-        </template>
-      </PIMTable>
+      <el-table :data="tableData"
+                border
+                v-loading="tableLoading"
+                :expand-row-keys="expandedRowKeys"
+                :row-key="(row) => row.productionOrderId"
+                @expand-change="expandChange"
+                height="calc(100vh - 22em)">
+        <!-- 灞曞紑琛屽垪 -->
+        <el-table-column type="expand"
+                         width="60"
+                         fixed="left">
+          <template #default="props">
+            <el-table :data="props.row.children || []"
+                      border
+                      :row-class-name="({ row }) => getChildRowClassName(row)"
+                      v-loading="childLoading[props.row.productionOrderId]"
+                      style="margin: 10px 0;">
+              <el-table-column align="center"
+                               label="搴忓彿"
+                               type="index"
+                               width="60" />
+              <el-table-column label="宸ュ崟缂栧彿"
+                               prop="workOrderNo"
+                               width="140">
+                <template #default="scope">
+                  <span :class="{ 'rework-text': scope.row.workOrderNo?.startsWith('FG') }">
+                    {{ scope.row.workOrderNo }}
+                  </span>
+                </template>
+              </el-table-column>
+              <el-table-column label="宸ュ簭鍚嶇О"
+                               prop="operationName"
+                               width="100" />
+              <el-table-column label="宸ュ簭绫诲瀷"
+                               width="80"
+                               align="center">
+                <template #default="scope">
+                  <span>{{ scope.row.type === 0 ? '璁℃椂' : '璁′欢' }}</span>
+                </template>
+              </el-table-column>
+              <el-table-column label="璁″垝鏁伴噺"
+                               prop="planQuantity"
+                               width="100" />
+              <el-table-column label="瀹屾垚鏁伴噺"
+                               prop="completeQuantity"
+                               width="100" />
+              <el-table-column label="瀹屾垚杩涘害"
+                               width="140">
+                <template #default="scope">
+                  <el-progress :percentage="toProgressPercentage(scope.row?.completionStatus)"
+                               :color="progressColor(toProgressPercentage(scope.row?.completionStatus))"
+                               :status="toProgressPercentage(scope.row?.completionStatus) >= 100 ? 'success' : ''" />
+                </template>
+              </el-table-column>
+              <el-table-column label="鎶ュ簾鏁伴噺"
+                               prop="scrapQty"
+                               width="80">
+                <template #default="scope">
+                  <span :class="{ 'scrap-text': scope.row.scrapQty > 0 }">
+                    {{ scope.row.scrapQty || 0 }}
+                  </span>
+                </template>
+              </el-table-column>
+              <el-table-column label="鎶ュ伐浜哄憳"
+                               prop="userNames"
+                               width="150"
+                               show-overflow-tooltip />
+              <el-table-column label="璁″垝寮�濮嬫椂闂�"
+                               prop="planStartTime"
+                               width="120" />
+              <el-table-column label="璁″垝缁撴潫鏃堕棿"
+                               prop="planEndTime"
+                               width="120" />
+              <el-table-column label="瀹為檯寮�濮嬫椂闂�"
+                               prop="actualStartTime"
+                               width="120" />
+              <el-table-column label="瀹為檯缁撴潫鏃堕棿"
+                               prop="actualEndTime"
+                               width="120" />
+              <el-table-column label="鐘舵��"
+                               width="100"
+                               align="center">
+                <template #default="scope">
+                  <el-tag :type="getStatusTagType(scope.row.status)">
+                    {{ getStatusText(scope.row.status) }}
+                  </el-tag>
+                </template>
+              </el-table-column>
+              <el-table-column label="鎿嶄綔"
+                               width="200"
+                               align="center"
+                               fixed="right">
+                <template #default="scope">
+                  <el-button link
+                             type="primary"
+                             @click="downloadAndPrintWorkOrder(scope.row)">
+                    娴佽浆鍗�
+                  </el-button>
+                  <el-button link
+                             type="primary"
+                             @click="openWorkOrderFiles(scope.row)">
+                    闄勪欢
+                  </el-button>
+                  <el-button link
+                             type="primary"
+                             v-if="!scope.row.endOrder"
+                             :disabled="isReportDisabled(scope.row)"
+                             @click="showReportDialog(scope.row)">
+                    鎶ュ伐
+                  </el-button>
+                </template>
+              </el-table-column>
+            </el-table>
+          </template>
+        </el-table-column>
+        <!-- 涓昏〃鍒� -->
+        <el-table-column align="center"
+                         label="搴忓彿"
+                         type="index"
+                         width="60" />
+        <el-table-column label="鐢熶骇璁㈠崟鍙�"
+                         prop="npsNo"
+                         width="150" />
+        <el-table-column label="浜у搧鍚嶇О"
+                         prop="productName"
+                         width="140" />
+        <el-table-column label="瑙勬牸"
+                         prop="model"
+                         width="150" />
+        <el-table-column label="鍗曚綅"
+                         prop="unit"
+                         width="80" />
+        <el-table-column label="宸ュ簭鍚嶇О"
+                         prop="operationName"
+                         width="200"
+                         show-overflow-tooltip />
+        <el-table-column label="宸ュ崟鏁伴噺"
+                         prop="productionTaskCount"
+                         width="80">
+          <template #default="scope">
+            <span>鍏眥{ scope.row.productionTaskCount || 0 }}涓�</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="璁″垝鏁伴噺"
+                         prop="planQuantity"
+                         width="100" />
+        <el-table-column label="瀹屾垚鏁伴噺"
+                         prop="completeQuantity"
+                         width="100" />
+        <el-table-column label="瀹屾垚杩涘害"
+                         width="140">
+          <template #default="scope">
+            <el-progress :percentage="toProgressPercentage(scope.row?.completionStatus)"
+                         :color="progressColor(toProgressPercentage(scope.row?.completionStatus))"
+                         :status="toProgressPercentage(scope.row?.completionStatus) >= 100 ? 'success' : ''" />
+          </template>
+        </el-table-column>
+        <el-table-column label="鎶ュ簾鏁伴噺"
+                         prop="scrapQty"
+                         width="80">
+          <template #default="scope">
+            <span :class="{ 'scrap-text': scope.row.scrapQty > 0 }">
+              {{ scope.row.scrapQty || 0 }}
+            </span>
+          </template>
+        </el-table-column>
+        <el-table-column label="鐘舵��"
+                         width="100"
+                         align="center">
+          <template #default="scope">
+            <el-tag :type="getStatusTagType(scope.row.status)">
+              {{ getStatusText(scope.row.status) }}
+            </el-tag>
+          </template>
+        </el-table-column>
+        <el-table-column label="璁″垝寮�濮嬫椂闂�"
+                         prop="planStartTime"
+                         width="120" />
+        <el-table-column label="璁″垝缁撴潫鏃堕棿"
+                         prop="planEndTime"
+                         width="120" />
+        <el-table-column label="瀹為檯寮�濮嬫椂闂�"
+                         prop="actualStartTime"
+                         width="120" />
+        <el-table-column label="瀹為檯缁撴潫鏃堕棿"
+                         prop="actualEndTime"
+                         width="120" />
+      </el-table>
+      <PaginationComp v-show="page.total > 0"
+                  :total="page.total"
+                  :page="page.current"
+                  :limit="page.size"
+                  @pagination="pagination" />
     </div>
     <!-- 娴佽浆鍗″脊绐� -->
     <el-dialog v-model="transferCardVisible"
@@ -262,11 +434,12 @@
 </template>
 
 <script setup>
-  import { onMounted, ref, nextTick } from "vue";
+  import { onMounted, ref, nextTick, reactive, toRefs, getCurrentInstance } from "vue";
   import { ElMessageBox } from "element-plus";
   import dayjs from "dayjs";
   import {
     productWorkOrderPage,
+    getWorkOrderListByOrderId,
     addProductMain,
     downProductWorkOrder,
   } from "@/api/productionManagement/workOrder.js";
@@ -275,7 +448,7 @@
   import { getUserProfile, userListNoPageByTenantId } from "@/api/system/user.js";
   import { getDicts } from "@/api/system/dict/data";
   import QRCode from "qrcode";
-  import { getCurrentInstance, reactive, toRefs } from "vue";
+  import PaginationComp from "@/components/PIMTable/Pagination.vue";
   import MaterialDialog from "./components/MaterialDialog.vue";
   const FileList = defineAsyncComponent(() =>
     import("@/components/Dialog/FileList.vue")
@@ -285,130 +458,31 @@
   const { proxy } = getCurrentInstance();
   const userStore = useUserStore();
 
-  const tableColumn = ref([
-    {
-      label: "宸ュ崟绫诲瀷",
-      prop: "workOrderType",
-      width: "80",
-    },
-    {
-      label: "宸ュ崟缂栧彿",
-      prop: "workOrderNo",
-      width: "140",
-    },
-    {
-      label: "鐢熶骇璁㈠崟鍙�",
-      prop: "npsNo",
-      width: "140",
-    },
-    {
-      label: "浜у搧鍚嶇О",
-      prop: "productName",
-      width: "140",
-    },
-    {
-      label: "瑙勬牸",
-      prop: "model",
-    },
-    {
-      label: "鍗曚綅",
-      prop: "unit",
-    },
-    {
-      label: "宸ュ簭鍚嶇О",
-      prop: "operationName",
-      width: "100",
-    },
-    {
-      label: "闇�姹傛暟閲�",
-      prop: "planQuantity",
-      width: "140",
-    },
-    {
-      label: "瀹屾垚鏁伴噺",
-      prop: "completeQuantity",
-      width: "140",
-    },
-    {
-      label: "瀹屾垚杩涘害",
-      prop: "completionStatus",
-      dataType: "slot",
-      slot: "completionStatus",
-      width: "140",
-    },
-    {
-      label: "璁″垝寮�濮嬫椂闂�",
-      prop: "planStartTime",
-      width: "140",
-    },
-    {
-      label: "璁″垝缁撴潫鏃堕棿",
-      prop: "planEndTime",
-      width: "140",
-    },
-    {
-      label: "瀹為檯寮�濮嬫椂闂�",
-      prop: "actualStartTime",
-      width: "140",
-    },
-    {
-      label: "瀹為檯缁撴潫鏃堕棿",
-      prop: "actualEndTime",
-      width: "140",
-    },
-    {
-      label: "鎿嶄綔",
-      width: "260",
-      align: "center",
-      dataType: "action",
-      fixed: "right",
-      operation: [
-        {
-          name: "娴佽浆鍗�",
-          clickFun: row => {
-            downloadAndPrintWorkOrder(row);
-          },
-        },
-        {
-          name: "闄勪欢",
-          clickFun: row => {
-            openWorkOrderFiles(row);
-          },
-        },
-        // {
-        //   name: "鐗╂枡",
-        //   clickFun: row => {
-        //     openMaterialDialog(row);
-        //   },
-        // },
-        {
-          name: "鎶ュ伐",
-          clickFun: row => {
-            showReportDialog(row);
-          },
-          showHide: row => !row.endOrder,
-          disabled: row => {
-            if (row.planQuantity <= 0) return true;
-            if (!row.userIds) return false;
-            try {
-              const userIds =
-                typeof row.userIds === "string"
-                  ? JSON.parse(row.userIds)
-                  : row.userIds;
-              if (Array.isArray(userIds)) {
-                return !userIds.some(id => String(id) === String(userStore.id));
-              }
-              return true;
-            } catch (e) {
-              return true;
-            }
-          },
-        },
-      ],
-    },
-  ]);
+  // 鐘舵�佹灇涓炬槧灏�
+  const statusMap = {
+    1: '寰呯‘璁�',
+    2: '寰呯敓浜�',
+    3: '鐢熶骇涓�',
+    4: '宸茬敓浜�',
+  };
+
+  const getStatusText = (status) => statusMap[status] || '鏈煡';
+
+  const getStatusTagType = (status) => {
+    switch (status) {
+      case 1: return 'info';
+      case 2: return 'warning';
+      case 3: return 'primary';
+      case 4: return 'success';
+      default: return 'info';
+    }
+  };
+
   const tableData = ref([]);
   const tableLoading = ref(false);
+  const expandedRowKeys = ref([]);
+  const childLoading = ref({});
+
   const transferCardVisible = ref(false);
   const transferCardData = ref([]);
   const transferCardQrUrl = ref("");
@@ -434,7 +508,7 @@
     paramGroups: {},
   });
 
-  const params = ref({});
+  const params = ref([]);
   const dictOptions = ref({});
   const paramLoading = ref(false);
 
@@ -445,7 +519,6 @@
       return;
     }
     const num = Number(value);
-    // 鏁存暟涓斿ぇ浜庣瓑浜�1
     if (isNaN(num) || !Number.isInteger(num) || num < 0) {
       callback(new Error("鐢熶骇鍚堟牸鏁伴噺蹇呴』澶т簬绛変簬0"));
       return;
@@ -460,7 +533,6 @@
       return;
     }
     const num = Number(value);
-    // 鏁存暟涓斿ぇ浜庣瓑浜�0
     if (isNaN(num) || !Number.isInteger(num) || num < 0) {
       callback(new Error("鎶ュ簾鏁伴噺蹇呴』澶т簬绛変簬0"));
       return;
@@ -474,7 +546,7 @@
     scrapQty: [{ validator: validateScrapQty, trigger: "blur" }],
   };
 
-  // 澶勭悊鐢熶骇鍚堟牸鏁伴噺杈撳叆锛岄檺鍒跺繀椤诲ぇ浜庣瓑浜�0
+  // 澶勭悊鐢熶骇鍚堟牸鏁伴噺杈撳叆
   const handleQuantityInput = value => {
     if (value === "" || value === null || value === undefined) {
       reportForm.quantity = null;
@@ -484,15 +556,12 @@
     if (isNaN(num)) {
       return;
     }
-    // 濡傛灉灏忎簬1锛屾竻闄�
     if (num < 0) {
       reportForm.quantity = null;
       return;
     }
-    // 濡傛灉鏄皬鏁板彇鏁存暟閮ㄥ垎
     if (!Number.isInteger(num)) {
       const intValue = Math.floor(num);
-      // 濡傛灉鍙栨暣鍚庡皬浜�1锛屾竻闄�
       if (intValue < 0) {
         reportForm.quantity = null;
         return;
@@ -510,21 +579,17 @@
       return;
     }
     const num = Number(value);
-    // 濡傛灉鏄疦aN锛屼繚鎸佸師鍊�
     if (isNaN(num)) {
       return;
     }
-    // 濡傛灉鏄礋鏁帮紝娓呴櫎杈撳叆
     if (num < 0) {
       reportForm.scrapQty = null;
       return;
     }
-    // 濡傛灉鏄皬鏁帮紝鍙栨暣鏁伴儴鍒�
     if (!Number.isInteger(num)) {
       reportForm.scrapQty = Math.floor(num);
       return;
     }
-    // 鏈夋晥鐨勯潪璐熸暣鏁帮紙鍖呮嫭0锛�
     reportForm.scrapQty = num;
   };
 
@@ -539,11 +604,11 @@
 
   const data = reactive({
     searchForm: {
-      workOrderNo: "",
       npsNo: "",
     },
   });
   const { searchForm } = toRefs(data);
+
   const toProgressPercentage = val => {
     const n = Number(val);
     if (!Number.isFinite(n)) return 0;
@@ -551,6 +616,7 @@
     if (n >= 100) return 100;
     return Math.round(n);
   };
+
   const progressColor = percentage => {
     const p = toProgressPercentage(percentage);
     if (p < 30) return "#f56c6c";
@@ -560,7 +626,6 @@
   };
 
   // 鏌ヨ鍒楄〃
-  /** 鎼滅储鎸夐挳鎿嶄綔 */
   const handleQuery = () => {
     page.current = 1;
     getList();
@@ -574,11 +639,15 @@
 
   const getList = () => {
     tableLoading.value = true;
+    expandedRowKeys.value = [];
     const params = { ...searchForm.value, ...page };
     productWorkOrderPage(params)
       .then(res => {
         tableLoading.value = false;
-        tableData.value = res.data.records;
+        tableData.value = res.data.records.map(item => ({
+          ...item,
+          children: [],
+        }));
         page.total = res.data.total;
       })
       .catch(() => {
@@ -586,7 +655,67 @@
       });
   };
 
-  // 涓嬭浇骞舵墦鍗板伐鍗曟祦杞崱锛堟枃浠舵祦锛�
+  // 灞曞紑琛屾噿鍔犺浇
+  const expandChange = (row, expandedRows) => {
+    if (expandedRows.length > 0) {
+      expandedRowKeys.value = [];
+      const orderId = row.productionOrderId;
+
+      // 妫�鏌ユ槸鍚﹀凡鏈夋暟鎹�
+      if (row.children && row.children.length > 0) {
+        expandedRowKeys.value.push(orderId);
+        return;
+      }
+
+      childLoading.value[orderId] = true;
+
+      getWorkOrderListByOrderId(orderId)
+        .then(res => {
+          childLoading.value[orderId] = false;
+          const index = tableData.value.findIndex(
+            item => item.productionOrderId === orderId
+          );
+          if (index > -1) {
+            tableData.value[index].children = res.data || [];
+          }
+          expandedRowKeys.value.push(orderId);
+        })
+        .catch(error => {
+          childLoading.value[orderId] = false;
+          console.error('鍔犺浇宸ュ崟鏄庣粏澶辫触:', error);
+        });
+    } else {
+      expandedRowKeys.value = [];
+    }
+  };
+
+  // 瀛愯〃琛屾牱寮忥紙杩斿伐杩斾慨绾㈣壊鏍囪锛�
+  const getChildRowClassName = (row) => {
+    if (row.workOrderNo?.startsWith('FG')) {
+      return 'row-rework';
+    }
+    return '';
+  };
+
+  // 鎶ュ伐鎸夐挳绂佺敤閫昏緫
+  const isReportDisabled = (row) => {
+    if (row.planQuantity <= 0) return true;
+    if (!row.userIds) return false;
+    try {
+      const userIds =
+        typeof row.userIds === "string"
+          ? JSON.parse(row.userIds)
+          : row.userIds;
+      if (Array.isArray(userIds)) {
+        return !userIds.some(id => String(id) === String(userStore.id));
+      }
+      return true;
+    } catch (e) {
+      return true;
+    }
+  };
+
+  // 涓嬭浇骞舵墦鍗板伐鍗曟祦杞崱
   const downloadAndPrintWorkOrder = async row => {
     if (!row || !row.id) {
       proxy.$modal.msgError("缂哄皯宸ュ崟ID锛屾棤娉曚笅杞芥祦杞崱");
@@ -596,7 +725,6 @@
       ? `宸ュ崟娴佽浆鍗${row.workOrderNo}.xlsx`
       : "宸ュ崟娴佽浆鍗�.xlsx";
     try {
-      // 璋冪敤鎺ュ彛锛屼互 responseType: 'blob' 鑾峰彇鏂囦欢娴�
       const blob = await downProductWorkOrder(row.id);
 
       if (!blob) {
@@ -604,14 +732,12 @@
         return;
       }
 
-      // 鍒涘缓 Blob URL
       const fileBlob =
         blob instanceof Blob
           ? blob
           : new Blob([blob], { type: blob.type || "application/octet-stream" });
       const url = window.URL.createObjectURL(fileBlob);
 
-      // 鍒涘缓闅愯棌 iframe锛岀敤浜庤Е鍙戞祻瑙堝櫒鎵撳嵃
       const iframe = document.createElement("iframe");
       iframe.style.position = "fixed";
       iframe.style.right = "0";
@@ -628,7 +754,6 @@
           iframe.contentWindow?.print();
         } catch (e) {
           console.error("鑷姩璋冪敤鎵撳嵃澶辫触", e);
-          // 閫�鑰屾眰鍏舵锛屾墦寮�鏂扮獥鍙g敱鐢ㄦ埛鎵嬪姩鎵撳嵃
           window.open(url);
         }
       };
@@ -731,7 +856,6 @@
         return;
       }
 
-      // 楠岃瘉鐢熶骇鍚堟牸鏁伴噺
       if (
         reportForm.quantity === null ||
         reportForm.quantity === undefined ||
@@ -752,14 +876,6 @@
         return;
       }
 
-      // if (quantity > reportForm.planQuantity) {
-      //   ElMessageBox.alert("鏈鐢熶骇鏁伴噺涓嶈兘瓒呰繃寰呯敓浜ф暟閲�", "鎻愮ず", {
-      //     confirmButtonText: "纭畾",
-      //   });
-      //   return;
-      // }
-
-      // 楠岃瘉鎶ュ簾鏁伴噺
       const scrapQty = Number(reportForm.scrapQty);
       if (!isNaN(scrapQty) && scrapQty < 0) {
         ElMessageBox.alert("鎶ュ簾鏁伴噺涓嶈兘灏忎簬0", "鎻愮ず", {
@@ -767,13 +883,6 @@
         });
         return;
       }
-
-      // if (!isNaN(scrapQty) && scrapQty > quantity) {
-      //   ElMessageBox.alert("鎶ュ簾鏁伴噺涓嶈兘澶т簬鏈鐢熶骇鏁伴噺", "鎻愮ず", {
-      //     confirmButtonText: "纭畾",
-      //   });
-      //   return;
-      // }
 
       const productionOperationParamList = params.value.map(param => ({
         ...param,
@@ -863,7 +972,6 @@
   onMounted(() => {
     userStore.getInfo();
     getList();
-    // 鑾峰彇鐢ㄦ埛鍒楄〃
     userListNoPageByTenantId().then(res => {
       if (res.code === 200) {
         userOptions.value = res.data;
@@ -955,6 +1063,31 @@
     font-size: 12px;
     min-width: 30px;
   }
+
+  // 杩斿伐杩斾慨宸ュ崟绾㈣壊鏍囪
+  .row-rework {
+    background-color: #fef0f0 !important;
+
+    :deep(.el-table__cell) {
+      background-color: #fef0f0 !important;
+    }
+  }
+
+  .rework-text {
+    color: #f56c6c;
+    font-weight: bold;
+  }
+
+  // 鎶ュ簾鏁伴噺绾㈣壊鏍囪
+  .scrap-text {
+    color: #f56c6c;
+  }
+
+  // 瀛愯〃鏍兼牱寮�
+  :deep(.el-table__expanded-cell) {
+    padding: 10px 30px !important;
+    background-color: #fafafa;
+  }
 </style>
 
 <style  lang="scss">
diff --git a/vite.config.js b/vite.config.js
index fcc019d..474f7ac 100644
--- a/vite.config.js
+++ b/vite.config.js
@@ -8,7 +8,7 @@
   const { VITE_APP_ENV } = env;
   const baseUrl =
       env.VITE_APP_ENV === "development"
-          ? "http://1.15.17.182:9048"
+          ? "http://localhost:7005"
           : env.VITE_BASE_API;
   const javaUrl =
       env.VITE_APP_ENV === "development"

--
Gitblit v1.9.3