From aaf2e90e8f2967dde6f3bd5351523234881e2c98 Mon Sep 17 00:00:00 2001
From: ZN <zhang_12370@163.com>
Date: 星期二, 03 三月 2026 14:57:36 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev_KTHG' into dev_KTHG

---
 multiple/assets/favicon/KTHGico.ico                                         |    0 
 src/views/equipmentManagement/upkeep/index.vue                              | 1177 +++++++++++++------------
 src/views/inventoryManagement/stockManagement/New.vue                       |   30 
 src/views/basicData/product/ProductSelectDialog.vue                         |    1 
 src/views/equipmentManagement/spareParts/index.vue                          |   13 
 src/views/equipmentManagement/upkeep/Form/DetailDialog.vue                  |  219 ++++
 src/views/equipmentManagement/repair/Modal/MaintainModal.vue                |   34 
 multiple/config.json                                                        |   14 
 src/views/equipmentManagement/inspectionManagement/components/formDia.vue   |  573 +++++++-----
 src/views/inventoryManagement/stockManagement/Qualified.vue                 |    2 
 src/views/equipmentManagement/inspectionManagement/index.vue                |  137 ++
 README.md                                                                   |   25 
 src/views/equipmentManagement/inspectionManagement/components/viewFiles.vue |  462 ++++-----
 src/api/equipmentManagement/spareParts.js                                   |    9 
 multiple/assets/logo/KTHGLogo.png                                           |    0 
 src/views/equipmentManagement/upkeep/Form/MaintenanceModal.vue              |   34 
 src/views/inventoryManagement/receiptManagement/Record.vue                  |    4 
 17 files changed, 1,639 insertions(+), 1,095 deletions(-)

diff --git a/README.md b/README.md
index 073e101..b3d1c1b 100644
--- a/README.md
+++ b/README.md
@@ -11,10 +11,10 @@
 
 ## 骞冲彴绠�浠�
 
-* 鏈粨搴撲负鍓嶇鎶�鏈爤 [Vue3](https://v3.cn.vuejs.org) + [Element Plus](https://element-plus.org/zh-CN) + [Vite](https://cn.vitejs.dev) 鐗堟湰銆�
-* 閰嶅鍚庣浠g爜浠撳簱鍦板潃[RuoYi-Vue](https://gitee.com/y_project/RuoYi-Vue) 鎴� [RuoYi-Vue-fast](https://gitcode.com/yangzongzhuan/RuoYi-Vue-fast) 鐗堟湰銆�
-* 鍓嶇鎶�鏈爤锛圼Vue2](https://cn.vuejs.org) + [Element](https://github.com/ElemeFE/element) + [Vue CLI](https://cli.vuejs.org/zh)锛夛紝璇风Щ姝RuoYi-Vue](https://gitee.com/y_project/RuoYi-Vue/tree/master/ruoyi-ui)銆�
-* 闃块噷浜戞姌鎵e満锛歔鐐规垜杩涘叆](http://aly.ruoyi.vip)锛岃吘璁簯绉掓潃鍦猴細[鐐规垜杩涘叆](http://txy.ruoyi.vip)&nbsp;&nbsp;
+- 鏈粨搴撲负鍓嶇鎶�鏈爤 [Vue3](https://v3.cn.vuejs.org) + [Element Plus](https://element-plus.org/zh-CN) + [Vite](https://cn.vitejs.dev) 鐗堟湰銆�
+- 閰嶅鍚庣浠g爜浠撳簱鍦板潃[RuoYi-Vue](https://gitee.com/y_project/RuoYi-Vue) 鎴� [RuoYi-Vue-fast](https://gitcode.com/yangzongzhuan/RuoYi-Vue-fast) 鐗堟湰銆�
+- 鍓嶇鎶�鏈爤锛圼Vue2](https://cn.vuejs.org) + [Element](https://github.com/ElemeFE/element) + [Vue CLI](https://cli.vuejs.org/zh)锛夛紝璇风Щ姝RuoYi-Vue](https://gitee.com/y_project/RuoYi-Vue/tree/master/ruoyi-ui)銆�
+- 闃块噷浜戞姌鎵e満锛歔鐐规垜杩涘叆](http://aly.ruoyi.vip)锛岃吘璁簯绉掓潃鍦猴細[鐐规垜杩涘叆](http://txy.ruoyi.vip)&nbsp;&nbsp;
 
 ## 鍓嶇杩愯
 
@@ -33,7 +33,7 @@
 
 # 鏋勫缓娴嬭瘯鐜 yarn build:stage
 # 鏋勫缓鐢熶骇鐜 yarn build:prod
-# 鏋勫缓鐢熶骇鐜 yarn build:prod -- --company="AAA"
+# 鏋勫缓鐢熶骇鐜 yarn build:prod -- --company="KTHG"
 # 鍓嶇璁块棶鍦板潃 http://localhost:80
 ```
 
@@ -51,16 +51,16 @@
 10. 鐧诲綍鏃ュ織锛氱郴缁熺櫥褰曟棩蹇楄褰曟煡璇㈠寘鍚櫥褰曞紓甯搞��
 11. 鍦ㄧ嚎鐢ㄦ埛锛氬綋鍓嶇郴缁熶腑娲昏穬鐢ㄦ埛鐘舵�佺洃鎺с��
 12. 瀹氭椂浠诲姟锛氬湪绾匡紙娣诲姞銆佷慨鏀广�佸垹闄�)浠诲姟璋冨害鍖呭惈鎵ц缁撴灉鏃ュ織銆�
-13. 浠g爜鐢熸垚锛氬墠鍚庣浠g爜鐨勭敓鎴愶紙java銆乭tml銆亁ml銆乻ql锛夋敮鎸丆RUD涓嬭浇 銆�
-14. 绯荤粺鎺ュ彛锛氭牴鎹笟鍔′唬鐮佽嚜鍔ㄧ敓鎴愮浉鍏崇殑api鎺ュ彛鏂囨。銆�
-15. 鏈嶅姟鐩戞帶锛氱洃瑙嗗綋鍓嶇郴缁烠PU銆佸唴瀛樸�佺鐩樸�佸爢鏍堢瓑鐩稿叧淇℃伅銆�
+13. 浠g爜鐢熸垚锛氬墠鍚庣浠g爜鐨勭敓鎴愶紙java銆乭tml銆亁ml銆乻ql锛夋敮鎸� CRUD 涓嬭浇 銆�
+14. 绯荤粺鎺ュ彛锛氭牴鎹笟鍔′唬鐮佽嚜鍔ㄧ敓鎴愮浉鍏崇殑 api 鎺ュ彛鏂囨。銆�
+15. 鏈嶅姟鐩戞帶锛氱洃瑙嗗綋鍓嶇郴缁� CPU銆佸唴瀛樸�佺鐩樸�佸爢鏍堢瓑鐩稿叧淇℃伅銆�
 16. 缂撳瓨鐩戞帶锛氬绯荤粺鐨勭紦瀛樹俊鎭煡璇紝鍛戒护缁熻绛夈��
-17. 鍦ㄧ嚎鏋勫缓鍣細鎷栧姩琛ㄥ崟鍏冪礌鐢熸垚鐩稿簲鐨凥TML浠g爜銆�
-18. 杩炴帴姹犵洃瑙嗭細鐩戣褰撳墠绯荤粺鏁版嵁搴撹繛鎺ユ睜鐘舵�侊紝鍙繘琛屽垎鏋怱QL鎵惧嚭绯荤粺鎬ц兘鐡堕銆�
+17. 鍦ㄧ嚎鏋勫缓鍣細鎷栧姩琛ㄥ崟鍏冪礌鐢熸垚鐩稿簲鐨� HTML 浠g爜銆�
+18. 杩炴帴姹犵洃瑙嗭細鐩戣褰撳墠绯荤粺鏁版嵁搴撹繛鎺ユ睜鐘舵�侊紝鍙繘琛屽垎鏋� SQL 鎵惧嚭绯荤粺鎬ц兘鐡堕銆�
 
 ## 鍦ㄧ嚎浣撻獙
 
-- admin/admin123  
+- admin/admin123
 - 闄嗛檰缁画鏀跺埌涓�浜涙墦璧忥紝涓轰簡鏇村ソ鐨勪綋楠屽凡鐢ㄤ簬婕旂ず鏈嶅姟鍣ㄥ崌绾с�傝阿璋㈠悇浣嶅皬浼欎即銆�
 
 婕旂ず鍦板潃锛歨ttp://vue.ruoyi.vip  
@@ -103,7 +103,6 @@
     </tr>
 </table>
 
-
 ## 鑻ヤ緷鍓嶅悗绔垎绂讳氦娴佺兢
 
-QQ缇わ細 [![鍔犲叆QQ缇(https://img.shields.io/badge/宸叉弧-937441-blue.svg)](https://jq.qq.com/?_wv=1027&k=5bVB1og) [![鍔犲叆QQ缇(https://img.shields.io/badge/宸叉弧-887144332-blue.svg)](https://jq.qq.com/?_wv=1027&k=5eiA4DH) [![鍔犲叆QQ缇(https://img.shields.io/badge/宸叉弧-180251782-blue.svg)](https://jq.qq.com/?_wv=1027&k=5AxMKlC) [![鍔犲叆QQ缇(https://img.shields.io/badge/宸叉弧-104180207-blue.svg)](https://jq.qq.com/?_wv=1027&k=51G72yr) [![鍔犲叆QQ缇(https://img.shields.io/badge/宸叉弧-186866453-blue.svg)](https://jq.qq.com/?_wv=1027&k=VvjN2nvu) [![鍔犲叆QQ缇(https://img.shields.io/badge/宸叉弧-201396349-blue.svg)](https://jq.qq.com/?_wv=1027&k=5vYAqA05) [![鍔犲叆QQ缇(https://img.shields.io/badge/宸叉弧-101456076-blue.svg)](https://jq.qq.com/?_wv=1027&k=kOIINEb5) [![鍔犲叆QQ缇(https://img.shields.io/badge/宸叉弧-101539465-blue.svg)](https://jq.qq.com/?_wv=1027&k=UKtX5jhs) [![鍔犲叆QQ缇(https://img.shields.io/badge/宸叉弧-264312783-blue.svg)](https://jq.qq.com/?_wv=1027&k=EI9an8lJ) [![鍔犲叆QQ缇(https://img.shields.io/badge/宸叉弧-167385320-blue.svg)](https://jq.qq.com/?_wv=1027&k=SWCtLnMz) [![鍔犲叆QQ缇(https://img.shields.io/badge/宸叉弧-104748341-blue.svg)](https://jq.qq.com/?_wv=1027&k=96Dkdq0k) [![鍔犲叆QQ缇(https://img.shields.io/badge/宸叉弧-160110482-blue.svg)](https://jq.qq.com/?_wv=1027&k=0fsNiYZt) [![鍔犲叆QQ缇(https://img.shields.io/badge/宸叉弧-170801498-blue.svg)](https://jq.qq.com/?_wv=1027&k=7xw4xUG1) [![鍔犲叆QQ缇(https://img.shields.io/badge/宸叉弧-108482800-blue.svg)](https://jq.qq.com/?_wv=1027&k=eCx8eyoJ) [![鍔犲叆QQ缇(https://img.shields.io/badge/宸叉弧-101046199-blue.svg)](https://jq.qq.com/?_wv=1027&k=SpyH2875) [![鍔犲叆QQ缇(https://img.shields.io/badge/宸叉弧-136919097-blue.svg)](https://jq.qq.com/?_wv=1027&k=tKEt51dz) [![鍔犲叆QQ缇(https://img.shields.io/badge/宸叉弧-143961921-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=0vBbSb0ztbBgVtn3kJS-Q4HUNYwip89G&authKey=8irq5PhutrZmWIvsUsklBxhj57l%2F1nOZqjzigkXZVoZE451GG4JHPOqW7AW6cf0T&noverify=0&group_code=143961921) [![鍔犲叆QQ缇(https://img.shields.io/badge/宸叉弧-174951577-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=ZFAPAbp09S2ltvwrJzp7wGlbopsc0rwi&authKey=HB2cxpxP2yspk%2Bo3WKTBfktRCccVkU26cgi5B16u0KcAYrVu7sBaE7XSEqmMdFQp&noverify=0&group_code=174951577) [![鍔犲叆QQ缇(https://img.shields.io/badge/宸叉弧-161281055-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=Fn2aF5IHpwsy8j6VlalNJK6qbwFLFHat&authKey=uyIT%2B97x2AXj3odyXpsSpVaPMC%2Bidw0LxG5MAtEqlrcBcWJUA%2FeS43rsF1Tg7IRJ&noverify=0&group_code=161281055) [![鍔犲叆QQ缇(https://img.shields.io/badge/宸叉弧-138988063-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=XIzkm_mV2xTsUtFxo63bmicYoDBA6Ifm&authKey=dDW%2F4qsmw3x9govoZY9w%2FoWAoC4wbHqGal%2BbqLzoS6VBarU8EBptIgPKN%2FviyC8j&noverify=0&group_code=138988063) [![鍔犲叆QQ缇(https://img.shields.io/badge/宸叉弧-151450850-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=DkugnCg68PevlycJSKSwjhFqfIgrWWwR&authKey=pR1Pa5lPIeGF%2FFtIk6d%2FGB5qFi0EdvyErtpQXULzo03zbhopBHLWcuqdpwY241R%2F&noverify=0&group_code=151450850) [![鍔犲叆QQ缇(https://img.shields.io/badge/宸叉弧-224622315-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=F58bgRa-Dp-rsQJThiJqIYv8t4-lWfXh&authKey=UmUs4CVG5OPA1whvsa4uSespOvyd8%2FAr9olEGaWAfdLmfKQk%2FVBp2YU3u2xXXt76&noverify=0&group_code=224622315) [![鍔犲叆QQ缇(https://img.shields.io/badge/宸叉弧-287842588-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=Nxb2EQ5qozWa218Wbs7zgBnjLSNk_tVT&authKey=obBKXj6SBKgrFTJZx0AqQnIYbNOvBB2kmgwWvGhzxR67RoRr84%2Bus5OadzMcdJl5&noverify=0&group_code=287842588) [![鍔犲叆QQ缇(https://img.shields.io/badge/宸叉弧-187944233-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=numtK1M_I4eVd2Gvg8qtbuL8JgX42qNh&authKey=giV9XWMaFZTY%2FqPlmWbkB9g3fi0Ev5CwEtT9Tgei0oUlFFCQLDp4ozWRiVIzubIm&noverify=0&group_code=187944233) [![鍔犲叆QQ缇(https://img.shields.io/badge/228578329-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=G6r5KGCaa3pqdbUSXNIgYloyb8e0_L0D&authKey=4w8tF1eGW7%2FedWn%2FHAypQksdrML%2BDHolQSx7094Agm7Luakj9EbfPnSTxSi2T1LQ&noverify=0&group_code=228578329) 鐐瑰嚮鎸夐挳鍏ョ兢銆�
\ No newline at end of file
+QQ 缇わ細 [![鍔犲叆QQ缇(https://img.shields.io/badge/宸叉弧-937441-blue.svg)](https://jq.qq.com/?_wv=1027&k=5bVB1og) [![鍔犲叆QQ缇(https://img.shields.io/badge/宸叉弧-887144332-blue.svg)](https://jq.qq.com/?_wv=1027&k=5eiA4DH) [![鍔犲叆QQ缇(https://img.shields.io/badge/宸叉弧-180251782-blue.svg)](https://jq.qq.com/?_wv=1027&k=5AxMKlC) [![鍔犲叆QQ缇(https://img.shields.io/badge/宸叉弧-104180207-blue.svg)](https://jq.qq.com/?_wv=1027&k=51G72yr) [![鍔犲叆QQ缇(https://img.shields.io/badge/宸叉弧-186866453-blue.svg)](https://jq.qq.com/?_wv=1027&k=VvjN2nvu) [![鍔犲叆QQ缇(https://img.shields.io/badge/宸叉弧-201396349-blue.svg)](https://jq.qq.com/?_wv=1027&k=5vYAqA05) [![鍔犲叆QQ缇(https://img.shields.io/badge/宸叉弧-101456076-blue.svg)](https://jq.qq.com/?_wv=1027&k=kOIINEb5) [![鍔犲叆QQ缇(https://img.shields.io/badge/宸叉弧-101539465-blue.svg)](https://jq.qq.com/?_wv=1027&k=UKtX5jhs) [![鍔犲叆QQ缇(https://img.shields.io/badge/宸叉弧-264312783-blue.svg)](https://jq.qq.com/?_wv=1027&k=EI9an8lJ) [![鍔犲叆QQ缇(https://img.shields.io/badge/宸叉弧-167385320-blue.svg)](https://jq.qq.com/?_wv=1027&k=SWCtLnMz) [![鍔犲叆QQ缇(https://img.shields.io/badge/宸叉弧-104748341-blue.svg)](https://jq.qq.com/?_wv=1027&k=96Dkdq0k) [![鍔犲叆QQ缇(https://img.shields.io/badge/宸叉弧-160110482-blue.svg)](https://jq.qq.com/?_wv=1027&k=0fsNiYZt) [![鍔犲叆QQ缇(https://img.shields.io/badge/宸叉弧-170801498-blue.svg)](https://jq.qq.com/?_wv=1027&k=7xw4xUG1) [![鍔犲叆QQ缇(https://img.shields.io/badge/宸叉弧-108482800-blue.svg)](https://jq.qq.com/?_wv=1027&k=eCx8eyoJ) [![鍔犲叆QQ缇(https://img.shields.io/badge/宸叉弧-101046199-blue.svg)](https://jq.qq.com/?_wv=1027&k=SpyH2875) [![鍔犲叆QQ缇(https://img.shields.io/badge/宸叉弧-136919097-blue.svg)](https://jq.qq.com/?_wv=1027&k=tKEt51dz) [![鍔犲叆QQ缇(https://img.shields.io/badge/宸叉弧-143961921-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=0vBbSb0ztbBgVtn3kJS-Q4HUNYwip89G&authKey=8irq5PhutrZmWIvsUsklBxhj57l%2F1nOZqjzigkXZVoZE451GG4JHPOqW7AW6cf0T&noverify=0&group_code=143961921) [![鍔犲叆QQ缇(https://img.shields.io/badge/宸叉弧-174951577-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=ZFAPAbp09S2ltvwrJzp7wGlbopsc0rwi&authKey=HB2cxpxP2yspk%2Bo3WKTBfktRCccVkU26cgi5B16u0KcAYrVu7sBaE7XSEqmMdFQp&noverify=0&group_code=174951577) [![鍔犲叆QQ缇(https://img.shields.io/badge/宸叉弧-161281055-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=Fn2aF5IHpwsy8j6VlalNJK6qbwFLFHat&authKey=uyIT%2B97x2AXj3odyXpsSpVaPMC%2Bidw0LxG5MAtEqlrcBcWJUA%2FeS43rsF1Tg7IRJ&noverify=0&group_code=161281055) [![鍔犲叆QQ缇(https://img.shields.io/badge/宸叉弧-138988063-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=XIzkm_mV2xTsUtFxo63bmicYoDBA6Ifm&authKey=dDW%2F4qsmw3x9govoZY9w%2FoWAoC4wbHqGal%2BbqLzoS6VBarU8EBptIgPKN%2FviyC8j&noverify=0&group_code=138988063) [![鍔犲叆QQ缇(https://img.shields.io/badge/宸叉弧-151450850-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=DkugnCg68PevlycJSKSwjhFqfIgrWWwR&authKey=pR1Pa5lPIeGF%2FFtIk6d%2FGB5qFi0EdvyErtpQXULzo03zbhopBHLWcuqdpwY241R%2F&noverify=0&group_code=151450850) [![鍔犲叆QQ缇(https://img.shields.io/badge/宸叉弧-224622315-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=F58bgRa-Dp-rsQJThiJqIYv8t4-lWfXh&authKey=UmUs4CVG5OPA1whvsa4uSespOvyd8%2FAr9olEGaWAfdLmfKQk%2FVBp2YU3u2xXXt76&noverify=0&group_code=224622315) [![鍔犲叆QQ缇(https://img.shields.io/badge/宸叉弧-287842588-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=Nxb2EQ5qozWa218Wbs7zgBnjLSNk_tVT&authKey=obBKXj6SBKgrFTJZx0AqQnIYbNOvBB2kmgwWvGhzxR67RoRr84%2Bus5OadzMcdJl5&noverify=0&group_code=287842588) [![鍔犲叆QQ缇(https://img.shields.io/badge/宸叉弧-187944233-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=numtK1M_I4eVd2Gvg8qtbuL8JgX42qNh&authKey=giV9XWMaFZTY%2FqPlmWbkB9g3fi0Ev5CwEtT9Tgei0oUlFFCQLDp4ozWRiVIzubIm&noverify=0&group_code=187944233) [![鍔犲叆QQ缇(https://img.shields.io/badge/228578329-blue.svg)](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=G6r5KGCaa3pqdbUSXNIgYloyb8e0_L0D&authKey=4w8tF1eGW7%2FedWn%2FHAypQksdrML%2BDHolQSx7094Agm7Luakj9EbfPnSTxSi2T1LQ&noverify=0&group_code=228578329) 鐐瑰嚮鎸夐挳鍏ョ兢銆�
diff --git a/multiple/assets/favicon/KTHGico.ico b/multiple/assets/favicon/KTHGico.ico
new file mode 100644
index 0000000..e6fa7bb
--- /dev/null
+++ b/multiple/assets/favicon/KTHGico.ico
Binary files differ
diff --git a/multiple/assets/logo/KTHGLogo.png b/multiple/assets/logo/KTHGLogo.png
new file mode 100644
index 0000000..891c1b6
--- /dev/null
+++ b/multiple/assets/logo/KTHGLogo.png
Binary files differ
diff --git a/multiple/config.json b/multiple/config.json
index 7ad6795..23e4ddd 100644
--- a/multiple/config.json
+++ b/multiple/config.json
@@ -7,15 +7,15 @@
     "logo": "logo/HYSNLogo.png",
     "favicon": "favicon/HYSNico.ico"
   },
-  "TEST": {
+  "KTHG": {
     "env": {
-      "VITE_APP_TITLE": "涓皬浼佷笟鏁板瓧鍖栬浆鍨嬩簩绾у椁愬寘",
-      "VITE_BASE_API": "http://1.15.17.182:9003",
-      "VITE_JAVA_API": "http://1.15.17.182:9002"
+      "VITE_APP_TITLE": "鍧ゆ嘲鍖栧伐淇℃伅绠$悊",
+      "VITE_BASE_API": "http://1.15.17.182:9011",
+      "VITE_JAVA_API": "http://1.15.17.182:9010"
     },
-    "screen": "screen/HYSNView.png",
-    "logo": "logo/ZGLTLogo.png",
-    "favicon": "favicon/favicon.ico"
+    "screen": "screen/DHDCView.png",
+    "logo": "logo/KTHGLogo.png",
+    "favicon": "favicon/KTHGico.ico"
   },
   "screen": "/src/assets/images/login-background.png",
   "logo": "/src/assets/logo/logo.png",
diff --git a/src/api/equipmentManagement/spareParts.js b/src/api/equipmentManagement/spareParts.js
index 2b64689..4d3fd88 100644
--- a/src/api/equipmentManagement/spareParts.js
+++ b/src/api/equipmentManagement/spareParts.js
@@ -20,6 +20,15 @@
   });
 };
 
+// 鏌ヨ澶囦欢閫夐」
+export const getSparePartsOptions = (params) => {
+  return request({
+    url: "/spareParts/getByIdDeviceId",
+    method: "get",
+    params,
+  });
+};
+
 /**
  * @desc 鏂板
  */
diff --git a/src/views/basicData/product/ProductSelectDialog.vue b/src/views/basicData/product/ProductSelectDialog.vue
index 70dbb16..229cf87 100644
--- a/src/views/basicData/product/ProductSelectDialog.vue
+++ b/src/views/basicData/product/ProductSelectDialog.vue
@@ -20,6 +20,7 @@
       @selection-change="handleSelectionChange" @select="handleSelect">
       <el-table-column type="selection" width="55" />
       <el-table-column type="index" label="搴忓彿" width="60" />
+      <el-table-column prop="parentName" label="绫诲瀷" min-width="160" />
       <el-table-column prop="productName" label="浜у搧澶х被" min-width="160" />
       <el-table-column prop="model" label="鍨嬪彿鍚嶇О" min-width="200" />
       <el-table-column prop="unit" label="鍗曚綅" min-width="160" />
diff --git a/src/views/equipmentManagement/inspectionManagement/components/formDia.vue b/src/views/equipmentManagement/inspectionManagement/components/formDia.vue
index b048a9c..fa2d810 100644
--- a/src/views/equipmentManagement/inspectionManagement/components/formDia.vue
+++ b/src/views/equipmentManagement/inspectionManagement/components/formDia.vue
@@ -1,90 +1,185 @@
 <template>
   <div>
     <el-dialog :title="operationType === 'add' ? '鏂板宸℃浠诲姟' : '缂栬緫宸℃浠诲姟'"
-               v-model="dialogVisitable" width="800px" @close="cancel">
-      <el-form ref="formRef" :model="form" :rules="rules" label-width="120px">
+               v-model="dialogVisitable"
+               width="900px"
+               @close="cancel">
+      <el-form ref="formRef"
+               :model="form"
+               :rules="rules"
+               label-width="180px">
         <el-row>
           <el-col :span="12">
-            <el-form-item label="璁惧鍚嶇О" prop="taskId">
-              <el-select v-model="form.taskId" @change="setDeviceModel">
-                <el-option
-                  v-for="(item, index) in deviceOptions"
-                  :key="index"
-                  :label="item.deviceName"
-                  :value="item.id"
-                ></el-option>
-              </el-select>
+            <el-form-item label="宸℃浠诲姟鍚嶇О"
+                          prop="taskName">
+              <el-input v-model="form.taskName"
+                        placeholder="璇疯緭鍏ュ贰妫�浠诲姟鍚嶇О"
+                        type="textarea" />
+              <!-- <el-select v-model="form.taskId"
+                         @change="setDeviceModel">
+                <el-option v-for="(item, index) in deviceOptions"
+                           :key="index"
+                           :label="item.deviceName"
+                           :value="item.id"></el-option>
+              </el-select> -->
             </el-form-item>
           </el-col>
           <el-col :span="12">
-            <el-form-item label="宸℃浜�" prop="inspector">
-              <el-select v-model="form.inspector" placeholder="璇烽�夋嫨" multiple clearable>
-                <el-option v-for="item in userList" :label="item.nickName" :value="item.userId" :key="item.userId"/>
+            <el-form-item label="宸℃浜�"
+                          prop="inspector">
+              <el-select v-model="form.inspector"
+                         placeholder="璇烽�夋嫨"
+                         multiple
+                         clearable>
+                <el-option v-for="item in userList"
+                           :label="item.nickName"
+                           :value="item.userId"
+                           :key="item.userId" />
               </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row v-show="false">
+          <el-col :span="12">
+            <el-form-item label="蹇呴』鎷嶇収瑙嗕负宸℃鎴愬姛"
+                          prop="takePhone">
+              <el-radio-group v-model="form.takePhone">
+                <el-radio :label="true">鏄�</el-radio>
+                <el-radio :label="false">鍚�</el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="涓婁紶鐩稿唽鐓х墖"
+                          prop="takeAlbum">
+              <el-radio-group v-model="form.takeAlbum">
+                <el-radio :label="false">涓嶅彲</el-radio>
+                <el-radio :label="true">鍙�</el-radio>
+              </el-radio-group>
             </el-form-item>
           </el-col>
         </el-row>
         <el-row>
           <el-col :span="12">
-            <el-form-item label="澶囨敞" prop="remarks">
-              <el-input v-model="form.remarks" placeholder="璇疯緭鍏ュ娉�" type="textarea" />
+            <el-form-item label="澶囨敞"
+                          prop="remarks">
+              <el-input v-model="form.remarks"
+                        placeholder="璇疯緭鍏ュ娉�"
+                        type="textarea" />
             </el-form-item>
           </el-col>
         </el-row>
         <el-row>
           <el-col :span="12">
-            <el-form-item label="浠诲姟棰戠巼" prop="frequencyType">
-              <el-select v-model="form.frequencyType" placeholder="璇烽�夋嫨" clearable>
-                <el-option label="姣忔棩" value="DAILY"/>
-                <el-option label="姣忓懆" value="WEEKLY"/>
-                <el-option label="姣忔湀" value="MONTHLY"/>
+            <el-form-item label="浠诲姟棰戠巼"
+                          prop="frequencyType">
+              <el-select v-model="form.frequencyType"
+                         placeholder="璇烽�夋嫨"
+                         clearable>
+                <el-option label="姣忔棩"
+                           value="DAILY" />
+                <el-option label="姣忓懆"
+                           value="WEEKLY" />
+                <el-option label="姣忔湀"
+                           value="MONTHLY" />
                 <!-- <el-option label="瀛e害" value="QUARTERLY"/> -->
               </el-select>
             </el-form-item>
           </el-col>
-          <el-col :span="12" v-if="form.frequencyType === 'DAILY' && form.frequencyType">
-            <el-form-item label="鏃ユ湡" prop="frequencyDetail">
-              <el-time-picker v-model="form.frequencyDetail" placeholder="閫夋嫨鏃堕棿" format="HH:mm"
+          <el-col :span="12"
+                  v-if="form.frequencyType === 'DAILY' && form.frequencyType">
+            <el-form-item label="鏃ユ湡"
+                          prop="frequencyDetail">
+              <el-time-picker v-model="form.frequencyDetail"
+                              placeholder="閫夋嫨鏃堕棿"
+                              format="HH:mm"
                               value-format="HH:mm" />
             </el-form-item>
           </el-col>
-          <el-col :span="12" v-if="form.frequencyType === 'WEEKLY' && form.frequencyType">
-            <el-form-item label="鏃ユ湡" prop="frequencyDetail">
-              <el-select v-model="form.week" placeholder="璇烽�夋嫨" clearable style="width: 50%">
-                <el-option label="鍛ㄤ竴" value="MON"/>
-                <el-option label="鍛ㄤ簩" value="TUE"/>
-                <el-option label="鍛ㄤ笁" value="WED"/>
-                <el-option label="鍛ㄥ洓" value="THU"/>
-                <el-option label="鍛ㄤ簲" value="FRI"/>
-                <el-option label="鍛ㄥ叚" value="SAT"/>
-                <el-option label="鍛ㄦ棩" value="SUN"/>
+          <el-col :span="12"
+                  v-if="form.frequencyType === 'WEEKLY' && form.frequencyType">
+            <el-form-item label="鏃ユ湡"
+                          prop="frequencyDetail">
+              <el-select v-model="form.week"
+                         placeholder="璇烽�夋嫨"
+                         clearable
+                         style="width: 50%">
+                <el-option label="鍛ㄤ竴"
+                           value="MON" />
+                <el-option label="鍛ㄤ簩"
+                           value="TUE" />
+                <el-option label="鍛ㄤ笁"
+                           value="WED" />
+                <el-option label="鍛ㄥ洓"
+                           value="THU" />
+                <el-option label="鍛ㄤ簲"
+                           value="FRI" />
+                <el-option label="鍛ㄥ叚"
+                           value="SAT" />
+                <el-option label="鍛ㄦ棩"
+                           value="SUN" />
               </el-select>
-              <el-time-picker v-model="form.time" placeholder="閫夋嫨鏃堕棿" format="HH:mm"
-                              value-format="HH:mm"  style="width: 50%"/>
+              <el-time-picker v-model="form.time"
+                              placeholder="閫夋嫨鏃堕棿"
+                              format="HH:mm"
+                              value-format="HH:mm"
+                              style="width: 50%" />
             </el-form-item>
           </el-col>
-          <el-col :span="12" v-if="form.frequencyType === 'MONTHLY' && form.frequencyType">
-            <el-form-item label="鏃ユ湡" prop="frequencyDetail">
-              <el-date-picker
-                  v-model="form.frequencyDetail"
-                  type="datetime"
-                  clearable
-                  placeholder="閫夋嫨寮�濮嬫棩鏈�"
-                  format="DD,HH:mm"
-                  value-format="DD,HH:mm"
-              />
+          <el-col :span="12"
+                  v-if="form.frequencyType === 'MONTHLY' && form.frequencyType">
+            <el-form-item label="鏃ユ湡"
+                          prop="frequencyDetail">
+              <el-date-picker v-model="form.frequencyDetail"
+                              type="datetime"
+                              clearable
+                              placeholder="閫夋嫨寮�濮嬫棩鏈�"
+                              format="DD,HH:mm"
+                              value-format="DD,HH:mm" />
             </el-form-item>
           </el-col>
-          <el-col :span="12" v-if="form.frequencyType === 'QUARTERLY' && form.frequencyType">
-            <el-form-item label="鏃ユ湡" prop="frequencyDetail">
-              <el-date-picker
-                  v-model="form.frequencyDetail"
-                  type="datetime"
-                  clearable
-                  placeholder="閫夋嫨寮�濮嬫棩鏈�"
-                  format="MM,DD,HH:mm"
-                  value-format="MM,DD,HH:mm"
-              />
+          <el-col :span="12"
+                  v-if="form.frequencyType === 'QUARTERLY' && form.frequencyType">
+            <el-form-item label="鏃ユ湡"
+                          prop="frequencyDetail">
+              <el-date-picker v-model="form.frequencyDetail"
+                              type="datetime"
+                              clearable
+                              placeholder="閫夋嫨寮�濮嬫棩鏈�"
+                              format="MM,DD,HH:mm"
+                              value-format="MM,DD,HH:mm" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="12"
+                  v-if="form.frequencyType === 'DAILY' && form.frequencyType">
+            <el-form-item label="鏃堕檺(灏忔椂)"
+                          prop="inspectionDeadline">
+              <el-input v-model="form.inspectionDeadline"
+                        type="number"
+                        placeholder="璇疯緭鍏ュ娉�">
+              </el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12"
+                  v-if="form.frequencyType === 'WEEKLY' && form.frequencyType">
+            <el-form-item label="鏃堕檺(澶�)"
+                          prop="inspectionDeadline">
+              <el-input v-model="form.inspectionDeadline"
+                        placeholder="璇疯緭鍏ュ娉�"
+                        type="number">
+              </el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12"
+                  v-if="form.frequencyType === 'MONTHLY' && form.frequencyType">
+            <el-form-item label="鏃堕檺(澶�)"
+                          prop="inspectionDeadline">
+              <el-input v-model="form.inspectionDeadline"
+                        placeholder="璇疯緭鍏ュ娉�"
+                        type="number">
+              </el-input>
             </el-form-item>
           </el-col>
         </el-row>
@@ -92,7 +187,8 @@
       <template #footer>
         <div class="dialog-footer">
           <el-button @click="cancel">鍙栨秷</el-button>
-          <el-button type="primary" @click="submitForm">淇濆瓨</el-button>
+          <el-button type="primary"
+                     @click="submitForm">淇濆瓨</el-button>
         </div>
       </template>
     </el-dialog>
@@ -100,188 +196,205 @@
 </template>
 
 <script setup>
-import {reactive, ref, getCurrentInstance, toRefs} from "vue";
-import useUserStore from '@/store/modules/user'
-import {addOrEditTimingTask} from "@/api/inspectionManagement/index.js";
-import {userListNoPageByTenantId} from "@/api/system/user.js";
-import { getDeviceLedger } from "@/api/equipmentManagement/ledger";
+  import { reactive, ref, getCurrentInstance, toRefs } from "vue";
+  import useUserStore from "@/store/modules/user";
+  import { addOrEditTimingTask } from "@/api/inspectionManagement/index.js";
+  import { userListNoPageByTenantId } from "@/api/system/user.js";
+  import { getDeviceLedger } from "@/api/equipmentManagement/ledger";
 
-const { proxy } = getCurrentInstance()
-const emit = defineEmits()
-const userStore = useUserStore()
-const dialogVisitable = ref(false);
-const operationType = ref('add');
-const deviceOptions = ref([]);
-const data = reactive({
-  form: {
-    taskId: undefined,
-    taskName: undefined,
-    inspector: '',
-    inspectorIds: '',
-    remarks: '',
-    frequencyType: '',
-    frequencyDetail: '',
-    week: '',
-    time: ''
-  },
-	rules: {
-		taskId: [{ required: true, message: "璇烽�夋嫨璁惧", trigger: "change" },],
-		inspector: [{ required: true, message: "璇疯緭鍏ュ贰妫�浜�", trigger: "blur" },],
-		dateStr: [{ required: true, message: "璇烽�夋嫨鐧昏鏃堕棿", trigger: "change" }],
-		frequencyType: [{ required: true, message: "璇烽�夋嫨浠诲姟棰戠巼", trigger: "change" }],
-		frequencyDetail: [
-			{
-				required: true,
-				message: "璇烽�夋嫨鏃ユ湡",
-				trigger: "change",
-				validator: (rule, value, callback) => {
-					if (!form.value.frequencyType) {
-						callback()
-						return
-					}
-					if (form.value.frequencyType === 'WEEKLY') {
-						if (!form.value.week || !form.value.time) {
-							callback(new Error("璇烽�夋嫨鏃ユ湡鍜屾椂闂�"))
-						} else {
-							callback()
-						}
-					} else {
-						if (!value) {
-							callback(new Error("璇烽�夋嫨鏃ユ湡"))
-						} else {
-							callback()
-						}
-					}
-				}
-			}
-		],
-		week: [
-			{
-				required: true,
-				message: "璇烽�夋嫨鏄熸湡",
-				trigger: "change",
-				validator: (rule, value, callback) => {
-					if (form.value.frequencyType === 'WEEKLY' && !value) {
-						callback(new Error("璇烽�夋嫨鏄熸湡"))
-					} else {
-						callback()
-					}
-				}
-			}
-		],
-		time: [
-			{
-				required: true,
-				message: "璇烽�夋嫨鏃堕棿",
-				trigger: "change",
-				validator: (rule, value, callback) => {
-					if (form.value.frequencyType === 'WEEKLY' && !value) {
-						callback(new Error("璇烽�夋嫨鏃堕棿"))
-					} else {
-						callback()
-					}
-				}
-			}
-		]
-	}
-})
-const { form, rules } = toRefs(data)
-const userList = ref([])
-
-const loadDeviceName = async () => {
-  const { data } = await getDeviceLedger();
-  deviceOptions.value = data;
-};
-
-const setDeviceModel = (id) => {
-  const option = deviceOptions.value.find((item) => item.id === id);
-  if (option) {
-    form.value.taskName = option.deviceName;
-  }
-}
-
-// 鎵撳紑寮规
-const openDialog = async (type, row) => {
-  dialogVisitable.value = true
-  operationType.value = type
-  
-  // 閲嶇疆琛ㄥ崟
-  resetForm();
-  
-  // 鍔犺浇鐢ㄦ埛鍒楄〃
-  userListNoPageByTenantId().then((res) => {
-    userList.value = res.data;
+  const { proxy } = getCurrentInstance();
+  const emit = defineEmits();
+  const userStore = useUserStore();
+  const dialogVisitable = ref(false);
+  const operationType = ref("add");
+  const deviceOptions = ref([]);
+  const data = reactive({
+    form: {
+      taskId: undefined,
+      taskName: undefined,
+      inspector: "",
+      inspectorIds: "",
+      remarks: "",
+      frequencyType: "",
+      frequencyDetail: "",
+      week: "",
+      time: "",
+      takePhone: true,
+      takeAlbum: false,
+      inspectionDeadline: "",
+    },
+    rules: {
+      // taskId: [{ required: true, message: "璇烽�夋嫨璁惧", trigger: "change" }],
+      taskName: [
+        { required: true, message: "璇疯緭鍏ュ贰妫�浠诲姟鍚嶇О", trigger: "blur" },
+      ],
+      inspector: [{ required: true, message: "璇疯緭鍏ュ贰妫�浜�", trigger: "blur" }],
+      dateStr: [{ required: true, message: "璇烽�夋嫨鐧昏鏃堕棿", trigger: "change" }],
+      frequencyType: [
+        { required: true, message: "璇烽�夋嫨浠诲姟棰戠巼", trigger: "change" },
+      ],
+      frequencyDetail: [
+        {
+          required: true,
+          message: "璇烽�夋嫨鏃ユ湡",
+          trigger: "change",
+          validator: (rule, value, callback) => {
+            if (!form.value.frequencyType) {
+              callback();
+              return;
+            }
+            if (form.value.frequencyType === "WEEKLY") {
+              if (!form.value.week || !form.value.time) {
+                callback(new Error("璇烽�夋嫨鏃ユ湡鍜屾椂闂�"));
+              } else {
+                callback();
+              }
+            } else {
+              if (!value) {
+                callback(new Error("璇烽�夋嫨鏃ユ湡"));
+              } else {
+                callback();
+              }
+            }
+          },
+        },
+      ],
+      inspectionDeadline: [
+        {
+          required: true,
+          message: "璇疯緭鍏ユ椂闄�",
+          trigger: "blur",
+        },
+      ],
+      week: [
+        {
+          required: true,
+          message: "璇烽�夋嫨鏄熸湡",
+          trigger: "change",
+          validator: (rule, value, callback) => {
+            if (form.value.frequencyType === "WEEKLY" && !value) {
+              callback(new Error("璇烽�夋嫨鏄熸湡"));
+            } else {
+              callback();
+            }
+          },
+        },
+      ],
+      time: [
+        {
+          required: true,
+          message: "璇烽�夋嫨鏃堕棿",
+          trigger: "change",
+          validator: (rule, value, callback) => {
+            if (form.value.frequencyType === "WEEKLY" && !value) {
+              callback(new Error("璇烽�夋嫨鏃堕棿"));
+            } else {
+              callback();
+            }
+          },
+        },
+      ],
+    },
   });
-  
-  // 鍔犺浇璁惧鍒楄〃
-  await loadDeviceName();
-  
-  if (type === 'edit' && row) {
-    form.value = {...row}
-    form.value.inspector = form.value.inspectorIds.split(',').map(Number)
-    
-    // 濡傛灉鏈夎澶嘔D锛岃嚜鍔ㄨ缃澶囦俊鎭�
-    if (form.value.taskId) {
-      setDeviceModel(form.value.taskId);
+  const { form, rules } = toRefs(data);
+  const userList = ref([]);
+
+  const loadDeviceName = async () => {
+    const { data } = await getDeviceLedger();
+    deviceOptions.value = data;
+  };
+
+  const setDeviceModel = id => {
+    const option = deviceOptions.value.find(item => item.id === id);
+    if (option) {
+      form.value.taskName = option.deviceName;
     }
-  }
-}
+  };
 
-// 鍏抽棴瀵硅瘽妗�
-const cancel = () => {
-  resetForm()
-  dialogVisitable.value = false
-  emit('closeDia')
-}
+  // 鎵撳紑寮规
+  const openDialog = async (type, row) => {
+    dialogVisitable.value = true;
+    operationType.value = type;
 
-// 閲嶇疆琛ㄥ崟鍑芥暟
-const resetForm = () => {
-  if (proxy.$refs.formRef) {
-    proxy.$refs.formRef.resetFields()
-  }
-  // 閲嶇疆琛ㄥ崟鏁版嵁纭繚璁惧淇℃伅姝g‘閲嶇疆
-  form.value = {
-    taskId: undefined,
-    taskName: undefined,
-    inspector: '',
-    inspectorIds: '',
-    remarks: '',
-    frequencyType: '',
-    frequencyDetail: '',
-    week: '',
-    time: ''
-  }
-}
+    // 閲嶇疆琛ㄥ崟
+    resetForm();
 
-// 鎻愪氦琛ㄥ崟
-const submitForm = () => {
-  proxy.$refs["formRef"].validate(async valid => {
-    if (valid) {
-      try {
-        form.value.inspectorIds = form.value.inspector.join(',')
-        delete form.value.inspector
-        
-        if (form.value.frequencyType === 'WEEKLY') {
-          let frequencyDetail = ''
-          frequencyDetail = form.value.week + ',' + form.value.time
-          form.value.frequencyDetail = frequencyDetail
+    // 鍔犺浇鐢ㄦ埛鍒楄〃
+    userListNoPageByTenantId().then(res => {
+      userList.value = res.data;
+    });
+
+    // 鍔犺浇璁惧鍒楄〃
+    await loadDeviceName();
+
+    if (type === "edit" && row) {
+      form.value = { ...row };
+      form.value.inspector = form.value.inspectorIds.split(",").map(Number);
+
+      // 濡傛灉鏈夎澶嘔D锛岃嚜鍔ㄨ缃澶囦俊鎭�
+      // if (form.value.taskId) {
+      //   setDeviceModel(form.value.taskId);
+      // }
+    }
+  };
+
+  // 鍏抽棴瀵硅瘽妗�
+  const cancel = () => {
+    resetForm();
+    dialogVisitable.value = false;
+    emit("closeDia");
+  };
+
+  // 閲嶇疆琛ㄥ崟鍑芥暟
+  const resetForm = () => {
+    if (proxy.$refs.formRef) {
+      proxy.$refs.formRef.resetFields();
+    }
+    // 閲嶇疆琛ㄥ崟鏁版嵁纭繚璁惧淇℃伅姝g‘閲嶇疆
+    form.value = {
+      taskId: undefined,
+      taskName: undefined,
+      inspector: "",
+      inspectorIds: "",
+      remarks: "",
+      frequencyType: "",
+      frequencyDetail: "",
+      week: "",
+      time: "",
+      takePhone: true,
+      takeAlbum: false,
+      inspectionDeadline: "",
+    };
+  };
+
+  // 鎻愪氦琛ㄥ崟
+  const submitForm = () => {
+    proxy.$refs["formRef"].validate(async valid => {
+      if (valid) {
+        try {
+          form.value.inspectorIds = form.value.inspector.join(",");
+          delete form.value.inspector;
+
+          if (form.value.frequencyType === "WEEKLY") {
+            let frequencyDetail = "";
+            frequencyDetail = form.value.week + "," + form.value.time;
+            form.value.frequencyDetail = frequencyDetail;
+          }
+
+          let res = await userStore.getInfo();
+          form.value.registrantId = res.user.userId;
+
+          await addOrEditTimingTask(form.value);
+          cancel();
+          proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
+        } catch (error) {
+          proxy.$modal.msgError("鎻愪氦澶辫触锛岃閲嶈瘯");
         }
-        
-        let res = await userStore.getInfo()
-        form.value.registrantId = res.user.userId
-        
-        await addOrEditTimingTask(form.value)
-        cancel()
-        proxy.$modal.msgSuccess('鎻愪氦鎴愬姛')
-      } catch (error) {
-        proxy.$modal.msgError('鎻愪氦澶辫触锛岃閲嶈瘯')
       }
-    }
-  })
-}
-defineExpose({ openDialog })
+    });
+  };
+  defineExpose({ openDialog });
 </script>
 
 <style scoped>
-
 </style>
\ No newline at end of file
diff --git a/src/views/equipmentManagement/inspectionManagement/components/viewFiles.vue b/src/views/equipmentManagement/inspectionManagement/components/viewFiles.vue
index 27b4a59..5a45338 100644
--- a/src/views/equipmentManagement/inspectionManagement/components/viewFiles.vue
+++ b/src/views/equipmentManagement/inspectionManagement/components/viewFiles.vue
@@ -1,83 +1,32 @@
 <template>
   <div>
     <el-dialog title="鏌ョ湅闄勪欢"
-               v-model="dialogVisitable" width="800px" @close="cancel">
+               v-model="dialogVisitable"
+               width="800px"
+               @close="cancel">
       <div class="upload-container">
         <!-- 鐢熶骇鍓� -->
         <div class="form-container">
-          <div class="title">鐢熶骇鍓�</div>
-          
+          <div class="title">闄勪欢鍒楄〃</div>
           <!-- 鍥剧墖鍒楄〃 -->
           <div style="display: flex; flex-wrap: wrap;">
-            <img v-for="(item, index) in beforeProductionImgs" :key="index"
+            <img v-for="(item, index) in beforeProductionImgs"
+                 :key="index"
                  @click="showMedia(beforeProductionImgs, index, 'image')"
-                 :src="item" style="max-width: 100px; height: 100px; margin: 5px;" alt="">
+                 :src="item"
+                 style="max-width: 100px; height: 100px; margin: 5px;"
+                 alt="">
           </div>
-          
           <!-- 瑙嗛鍒楄〃 -->
           <div style="display: flex; flex-wrap: wrap;">
-            <div
-                v-for="(videoUrl, index) in beforeProductionVideos"
-                :key="index"
-                @click="showMedia(beforeProductionVideos, index, 'video')"
-                style="position: relative; margin: 10px; cursor: pointer;"
-            >
+            <div v-for="(videoUrl, index) in beforeProductionVideos"
+                 :key="index"
+                 @click="showMedia(beforeProductionVideos, index, 'video')"
+                 style="position: relative; margin: 10px; cursor: pointer;">
               <div style="width: 160px; height: 90px; background-color: #333; display: flex; align-items: center; justify-content: center;">
-                <img src="@/assets/images/video.png" alt="鎾斁" style="width: 30px; height: 30px; opacity: 0.8;" />
-              </div>
-              <div style="text-align: center; font-size: 12px; color: #666;">鐐瑰嚮鎾斁</div>
-            </div>
-          </div>
-        </div>
-        
-        <!-- 鐢熶骇鍚� -->
-        <div class="form-container">
-          <div class="title">鐢熶骇鍚�</div>
-          
-          <!-- 鍥剧墖鍒楄〃 -->
-          <div style="display: flex; flex-wrap: wrap;">
-            <img v-for="(item, index) in afterProductionImgs" :key="index"
-                 @click="showMedia(afterProductionImgs, index, 'image')"
-                 :src="item" style="max-width: 100px; height: 100px; margin: 5px;" alt="">
-          </div>
-          
-          <!-- 瑙嗛鍒楄〃 -->
-          <div style="display: flex; flex-wrap: wrap;">
-            <div
-                v-for="(videoUrl, index) in afterProductionVideos"
-                :key="index"
-                @click="showMedia(afterProductionVideos, index, 'video')"
-                style="position: relative; margin: 10px; cursor: pointer;"
-            >
-              <div style="width: 160px; height: 90px; background-color: #333; display: flex; align-items: center; justify-content: center;">
-                <img src="@/assets/images/video.png" alt="鎾斁" style="width: 30px; height: 30px; opacity: 0.8;" />
-              </div>
-              <div style="text-align: center; font-size: 12px; color: #666;">鐐瑰嚮鎾斁</div>
-            </div>
-          </div>
-        </div>
-        
-        <!-- 鐢熶骇闂 -->
-        <div class="form-container">
-          <div class="title">鐢熶骇闂</div>
-          
-          <!-- 鍥剧墖鍒楄〃 -->
-          <div style="display: flex; flex-wrap: wrap;">
-            <img v-for="(item, index) in productionIssuesImgs" :key="index"
-                 @click="showMedia(productionIssuesImgs, index, 'image')"
-                 :src="item" style="max-width: 100px; height: 100px; margin: 5px;" alt="">
-          </div>
-          
-          <!-- 瑙嗛鍒楄〃 -->
-          <div style="display: flex; flex-wrap: wrap;">
-            <div
-                v-for="(videoUrl, index) in productionIssuesVideos"
-                :key="index"
-                @click="showMedia(productionIssuesVideos, index, 'video')"
-                style="position: relative; margin: 10px; cursor: pointer;"
-            >
-              <div style="width: 160px; height: 90px; background-color: #333; display: flex; align-items: center; justify-content: center;">
-                <img src="@/assets/images/video.png" alt="鎾斁" style="width: 30px; height: 30px; opacity: 0.8;" />
+                <img src="@/assets/images/video.png"
+                     alt="鎾斁"
+                     style="width: 30px; height: 30px; opacity: 0.8;" />
               </div>
               <div style="text-align: center; font-size: 12px; color: #666;">鐐瑰嚮鎾斁</div>
             </div>
@@ -85,220 +34,225 @@
         </div>
       </div>
     </el-dialog>
-    
     <!-- 缁熶竴濯掍綋鏌ョ湅鍣� -->
-    <div v-if="isMediaViewerVisible" class="media-viewer-overlay" @click.self="closeMediaViewer">
-      <div class="media-viewer-content" @click.stop>
+    <div v-if="isMediaViewerVisible"
+         class="media-viewer-overlay"
+         @click.self="closeMediaViewer">
+      <div class="media-viewer-content"
+           @click.stop>
         <!-- 鍥剧墖 -->
-        <vue-easy-lightbox
-            v-if="mediaType === 'image'"
-            :visible="isMediaViewerVisible"
-            :imgs="mediaList"
-            :index="currentMediaIndex"
-            @hide="closeMediaViewer"
-        ></vue-easy-lightbox>
-        
+        <vue-easy-lightbox v-if="mediaType === 'image'"
+                           :visible="isMediaViewerVisible"
+                           :imgs="mediaList"
+                           :index="currentMediaIndex"
+                           @hide="closeMediaViewer"></vue-easy-lightbox>
         <!-- 瑙嗛 -->
-        <div v-else-if="mediaType === 'video'" style="position: relative;">
-          <video
-              :src="mediaList[currentMediaIndex]"
-              autoplay
-              controls
-              style="max-width: 90vw; max-height: 80vh;"
-          />
+        <div v-else-if="mediaType === 'video'"
+             style="position: relative;">
+          <video :src="mediaList[currentMediaIndex]"
+                 autoplay
+                 controls
+                 style="max-width: 90vw; max-height: 80vh;" />
         </div>
       </div>
     </div>
   </div>
 </template>
 <script setup>
-import { ref } from 'vue';
-import VueEasyLightbox from 'vue-easy-lightbox';
-const { proxy } = getCurrentInstance();
+  import { ref } from "vue";
+  import VueEasyLightbox from "vue-easy-lightbox";
+  const { proxy } = getCurrentInstance();
 
-// 鎺у埗寮圭獥鏄剧ず
-const dialogVisitable = ref(false);
+  // 鎺у埗寮圭獥鏄剧ず
+  const dialogVisitable = ref(false);
 
-// 鍥剧墖鏁扮粍
-const beforeProductionImgs = ref([]);
-const afterProductionImgs = ref([]);
-const productionIssuesImgs = ref([]);
+  // 鍥剧墖鏁扮粍
+  const beforeProductionImgs = ref([]);
+  const afterProductionImgs = ref([]);
+  const productionIssuesImgs = ref([]);
 
-// 瑙嗛鏁扮粍
-const beforeProductionVideos = ref([]);
-const afterProductionVideos = ref([]);
-const productionIssuesVideos = ref([]);
+  // 瑙嗛鏁扮粍
+  const beforeProductionVideos = ref([]);
+  const afterProductionVideos = ref([]);
+  const productionIssuesVideos = ref([]);
 
-// 濯掍綋鏌ョ湅鍣ㄧ姸鎬�
-const isMediaViewerVisible = ref(false);
-const currentMediaIndex = ref(0);
-const mediaList = ref([]); // 瀛樺偍褰撳墠瑕佹煡鐪嬬殑濯掍綋鍒楄〃锛堝惈鍥剧墖鍜岃棰戝璞★級
-const mediaType = ref('image'); // image | video
-const javaApi = proxy.javaApi;
+  // 濯掍綋鏌ョ湅鍣ㄧ姸鎬�
+  const isMediaViewerVisible = ref(false);
+  const currentMediaIndex = ref(0);
+  const mediaList = ref([]); // 瀛樺偍褰撳墠瑕佹煡鐪嬬殑濯掍綋鍒楄〃锛堝惈鍥剧墖鍜岃棰戝璞★級
+  const mediaType = ref("image"); // image | video
+  const javaApi = proxy.javaApi;
 
-// 澶勭悊 URL锛氬皢 Windows 璺緞杞崲涓哄彲璁块棶鐨� URL
-function processFileUrl(fileUrl) {
-  if (!fileUrl) return '';
-  
-  // 濡傛灉 URL 鏄� Windows 璺緞鏍煎紡锛堝寘鍚弽鏂滄潬锛夛紝闇�瑕佽浆鎹�
-  if (fileUrl && fileUrl.indexOf('\\') > -1) {
-    // 鏌ユ壘 uploads 鍏抽敭瀛楃殑浣嶇疆锛屼粠閭i噷寮�濮嬫彁鍙栫浉瀵硅矾寰�
-    const uploadsIndex = fileUrl.toLowerCase().indexOf('uploads');
-    if (uploadsIndex > -1) {
-      // 浠� uploads 寮�濮嬫彁鍙栬矾寰勶紝骞跺皢鍙嶆枩鏉犳浛鎹负姝f枩鏉�
-      const relativePath = fileUrl.substring(uploadsIndex).replace(/\\/g, '/');
-      fileUrl = '/' + relativePath;
-    } else {
-      // 濡傛灉娌℃湁鎵惧埌 uploads锛屾彁鍙栨渶鍚庝竴涓洰褰曞拰鏂囦欢鍚�
-      const parts = fileUrl.split('\\');
-      const fileName = parts[parts.length - 1];
-      fileUrl = '/uploads/' + fileName;
-    }
-  }
-  
-  // 纭繚鎵�鏈夐潪 http 寮�澶寸殑 URL 閮芥嫾鎺� baseUrl
-  if (fileUrl && !fileUrl.startsWith('http')) {
-    // 纭繚璺緞浠� / 寮�澶�
-    if (!fileUrl.startsWith('/')) {
-      fileUrl = '/' + fileUrl;
-    }
-    // 鎷兼帴 baseUrl
-    fileUrl = javaApi + fileUrl;
-  }
-  
-  return fileUrl;
-}
+  // 澶勭悊 URL锛氬皢 Windows 璺緞杞崲涓哄彲璁块棶鐨� URL
+  function processFileUrl(fileUrl) {
+    if (!fileUrl) return "";
 
-// 澶勭悊姣忎竴绫绘暟鎹細鍒嗙鍥剧墖鍜岃棰�
-function processItems(items) {
-  const images = [];
-  const videos = [];
-  
-  // 妫�鏌� items 鏄惁瀛樺湪涓斾负鏁扮粍
-  if (!items || !Array.isArray(items)) {
-    return { images, videos };
-  }
-  
-  items.forEach(item => {
-    if (!item || !item.url) return;
-    
-    // 澶勭悊鏂囦欢 URL
-    const fileUrl = processFileUrl(item.url);
-    
-    // 鏍规嵁鏂囦欢鎵╁睍鍚嶅垽鏂槸鍥剧墖杩樻槸瑙嗛
-    const urlLower = fileUrl.toLowerCase();
-    if (urlLower.match(/\.(jpg|jpeg|png|gif|bmp|webp)$/)) {
-      images.push(fileUrl);
-    } else if (urlLower.match(/\.(mp4|avi|mov|wmv|flv|mkv|webm)$/)) {
-      videos.push(fileUrl);
-    } else if (item.contentType) {
-      // 濡傛灉鏈� contentType锛屼娇鐢� contentType 鍒ゆ柇
-      if (item.contentType.startsWith('image/')) {
-        images.push(fileUrl);
-      } else if (item.contentType.startsWith('video/')) {
-        videos.push(fileUrl);
+    // 濡傛灉 URL 鏄� Windows 璺緞鏍煎紡锛堝寘鍚弽鏂滄潬锛夛紝闇�瑕佽浆鎹�
+    if (fileUrl && fileUrl.indexOf("\\") > -1) {
+      // 鏌ユ壘 uploads 鍏抽敭瀛楃殑浣嶇疆锛屼粠閭i噷寮�濮嬫彁鍙栫浉瀵硅矾寰�
+      const uploadsIndex = fileUrl.toLowerCase().indexOf("uploads");
+      if (uploadsIndex > -1) {
+        // 浠� uploads 寮�濮嬫彁鍙栬矾寰勶紝骞跺皢鍙嶆枩鏉犳浛鎹负姝f枩鏉�
+        const relativePath = fileUrl.substring(uploadsIndex).replace(/\\/g, "/");
+        fileUrl = "/" + relativePath;
+      } else {
+        // 濡傛灉娌℃湁鎵惧埌 uploads锛屾彁鍙栨渶鍚庝竴涓洰褰曞拰鏂囦欢鍚�
+        const parts = fileUrl.split("\\");
+        const fileName = parts[parts.length - 1];
+        fileUrl = "/uploads/" + fileName;
       }
     }
-  });
-  
-  return { images, videos };
-}
 
-// 鎵撳紑寮圭獥骞跺姞杞芥暟鎹�
-const openDialog = async (row) => {
-  // 浣跨敤姝g‘鐨勫瓧娈靛悕锛歝ommonFileListBefore, commonFileListAfter
-  // productionIssues 鍙兘涓嶅瓨鍦紝浣跨敤绌烘暟缁�
-  const { images: beforeImgs, videos: beforeVids } = processItems(row.commonFileListBefore || []);
-  const { images: afterImgs, videos: afterVids } = processItems(row.commonFileListAfter || []);
-  const { images: issueImgs, videos: issueVids } = processItems(row.productionIssues || []);
-  
-  beforeProductionImgs.value = beforeImgs;
-  beforeProductionVideos.value = beforeVids;
-  
-  afterProductionImgs.value = afterImgs;
-  afterProductionVideos.value = afterVids;
-  
-  productionIssuesImgs.value = issueImgs;
-  productionIssuesVideos.value = issueVids;
-  
-  dialogVisitable.value = true;
-};
+    // 纭繚鎵�鏈夐潪 http 寮�澶寸殑 URL 閮芥嫾鎺� baseUrl
+    if (fileUrl && !fileUrl.startsWith("http")) {
+      // 纭繚璺緞浠� / 寮�澶�
+      if (!fileUrl.startsWith("/")) {
+        fileUrl = "/" + fileUrl;
+      }
+      // 鎷兼帴 baseUrl
+      fileUrl = javaApi + fileUrl;
+    }
 
-// 鏄剧ず濯掍綋锛堝浘鐗� or 瑙嗛锛�
-function showMedia(mediaArray, index, type) {
-  mediaList.value = mediaArray;
-  currentMediaIndex.value = index;
-  mediaType.value = type;
-  isMediaViewerVisible.value = true;
-}
+    return fileUrl;
+  }
 
-// 鍏抽棴濯掍綋鏌ョ湅鍣�
-function closeMediaViewer() {
-  isMediaViewerVisible.value = false;
-  mediaList.value = [];
-  mediaType.value = 'image';
-}
+  // 澶勭悊姣忎竴绫绘暟鎹細鍒嗙鍥剧墖鍜岃棰�
+  function processItems(items) {
+    const images = [];
+    const videos = [];
 
-// 琛ㄥ崟鍏抽棴鏂规硶
-const cancel = () => {
-  dialogVisitable.value = false;
-};
+    // 妫�鏌� items 鏄惁瀛樺湪涓斾负鏁扮粍
+    if (!items || !Array.isArray(items)) {
+      return { images, videos };
+    }
 
-defineExpose({ openDialog });
+    items.forEach(item => {
+      if (!item || !item.url) return;
+
+      // 澶勭悊鏂囦欢 URL
+      const fileUrl = processFileUrl(item.url);
+
+      // 鏍规嵁鏂囦欢鎵╁睍鍚嶅垽鏂槸鍥剧墖杩樻槸瑙嗛
+      const urlLower = fileUrl.toLowerCase();
+      if (urlLower.match(/\.(jpg|jpeg|png|gif|bmp|webp)$/)) {
+        images.push(fileUrl);
+      } else if (urlLower.match(/\.(mp4|avi|mov|wmv|flv|mkv|webm)$/)) {
+        videos.push(fileUrl);
+      } else if (item.contentType) {
+        // 濡傛灉鏈� contentType锛屼娇鐢� contentType 鍒ゆ柇
+        if (item.contentType.startsWith("image/")) {
+          images.push(fileUrl);
+        } else if (item.contentType.startsWith("video/")) {
+          videos.push(fileUrl);
+        }
+      }
+    });
+
+    return { images, videos };
+  }
+
+  // 鎵撳紑寮圭獥骞跺姞杞芥暟鎹�
+  const openDialog = async row => {
+    // 浣跨敤姝g‘鐨勫瓧娈靛悕锛歝ommonFileListBefore, commonFileListAfter
+    // productionIssues 鍙兘涓嶅瓨鍦紝浣跨敤绌烘暟缁�
+    const { images: beforeImgs, videos: beforeVids } = processItems(
+      row.commonFileListBefore || []
+    );
+    const { images: afterImgs, videos: afterVids } = processItems(
+      row.commonFileListAfter || []
+    );
+    const { images: issueImgs, videos: issueVids } = processItems(
+      row.productionIssues || []
+    );
+
+    beforeProductionImgs.value = beforeImgs;
+    beforeProductionVideos.value = beforeVids;
+
+    afterProductionImgs.value = afterImgs;
+    afterProductionVideos.value = afterVids;
+
+    productionIssuesImgs.value = issueImgs;
+    productionIssuesVideos.value = issueVids;
+
+    dialogVisitable.value = true;
+  };
+
+  // 鏄剧ず濯掍綋锛堝浘鐗� or 瑙嗛锛�
+  function showMedia(mediaArray, index, type) {
+    mediaList.value = mediaArray;
+    currentMediaIndex.value = index;
+    mediaType.value = type;
+    isMediaViewerVisible.value = true;
+  }
+
+  // 鍏抽棴濯掍綋鏌ョ湅鍣�
+  function closeMediaViewer() {
+    isMediaViewerVisible.value = false;
+    mediaList.value = [];
+    mediaType.value = "image";
+  }
+
+  // 琛ㄥ崟鍏抽棴鏂规硶
+  const cancel = () => {
+    dialogVisitable.value = false;
+  };
+
+  defineExpose({ openDialog });
 </script>
 <style scoped lang="scss">
-.upload-container {
-  display: flex;
-  flex-direction: column;
-  align-items: center;
-  padding: 20px;
-  border: 1px solid #dcdfe6;
-  box-sizing: border-box;
-  
-  .form-container {
-    flex: 1;
-    width: 100%;
+  .upload-container {
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    padding: 20px;
+    border: 1px solid #dcdfe6;
+    box-sizing: border-box;
     margin-bottom: 20px;
-  }
-}
 
-.title {
-  font-size: 14px;
-  color: #165dff;
-  line-height: 20px;
-  font-weight: 600;
-  padding-left: 10px;
-  position: relative;
-  margin: 6px 0;
-  
-  &::before {
-    content: "";
-    position: absolute;
+    .form-container {
+      flex: 1;
+      width: 100%;
+      margin-bottom: 20px;
+    }
+  }
+
+  .title {
+    font-size: 14px;
+    color: #165dff;
+    line-height: 20px;
+    font-weight: 600;
+    padding-left: 10px;
+    position: relative;
+    margin: 6px 0;
+
+    &::before {
+      content: "";
+      position: absolute;
+      left: 0;
+      top: 3px;
+      width: 4px;
+      height: 14px;
+      background-color: #165dff;
+    }
+  }
+
+  .media-viewer-overlay {
+    position: fixed;
+    top: 0;
     left: 0;
-    top: 3px;
-    width: 4px;
-    height: 14px;
-    background-color: #165dff;
+    right: 0;
+    bottom: 0;
+    background-color: rgba(0, 0, 0, 0.8);
+    z-index: 9999;
+    display: flex;
+    align-items: center;
+    justify-content: center;
   }
-}
 
-.media-viewer-overlay {
-  position: fixed;
-  top: 0;
-  left: 0;
-  right: 0;
-  bottom: 0;
-  background-color: rgba(0, 0, 0, 0.8);
-  z-index: 9999;
-  display: flex;
-  align-items: center;
-  justify-content: center;
-}
-
-.media-viewer-content {
-  position: relative;
-  max-width: 90vw;
-  max-height: 90vh;
-  overflow: hidden;
-}
+  .media-viewer-content {
+    position: relative;
+    max-width: 90vw;
+    max-height: 90vh;
+    overflow: hidden;
+  }
 </style>
\ No newline at end of file
diff --git a/src/views/equipmentManagement/inspectionManagement/index.vue b/src/views/equipmentManagement/inspectionManagement/index.vue
index 35f82d5..53f9345 100644
--- a/src/views/equipmentManagement/inspectionManagement/index.vue
+++ b/src/views/equipmentManagement/inspectionManagement/index.vue
@@ -151,6 +151,78 @@
       },
     },
     {
+      prop: "inspectionDeadlinetxt",
+      label: "鏈熼檺",
+      minWidth: 150,
+    },
+    {
+      prop: "inspectionStatus",
+      label: "宸℃鐘舵��",
+      minWidth: 150,
+      dataType: "tag",
+      formatType: params => {
+        const typeMap = {
+          宸插畬鎴�: "info",
+          鏈贰妫�: "warning",
+          瓒呮湡: "danger",
+        };
+        return typeMap[params] || "info";
+      },
+    },
+    {
+      prop: "frequencyDetail",
+      label: "寮�濮嬫棩鏈熶笌鏃堕棿",
+      minWidth: 150,
+      formatter: (row, column, cellValue) => {
+        // 鍏堝垽鏂槸鍚︽槸瀛楃涓�
+        if (typeof cellValue !== "string") return "";
+        let val = cellValue;
+        const replacements = {
+          MON: "鍛ㄤ竴",
+          TUE: "鍛ㄤ簩",
+          WED: "鍛ㄤ笁",
+          THU: "鍛ㄥ洓",
+          FRI: "鍛ㄤ簲",
+          SAT: "鍛ㄥ叚",
+          SUN: "鍛ㄦ棩",
+        };
+        // 浣跨敤姝e垯涓�娆℃�ф浛鎹㈡墍鏈夊尮閰嶉」
+        return val.replace(
+          /MON|TUE|WED|THU|FRI|SAT|SUN/g,
+          match => replacements[match]
+        );
+      },
+    },
+    { prop: "registrant", label: "鐧昏浜�", minWidth: 100 },
+    { prop: "createTime", label: "鐧昏鏃ユ湡", minWidth: 100 },
+  ]);
+  const columns1 = ref([
+    { prop: "taskName", label: "宸℃浠诲姟鍚嶇О", minWidth: 160 },
+    { prop: "remarks", label: "澶囨敞", minWidth: 150 },
+    { prop: "inspector", label: "鎵ц宸℃浜�", minWidth: 150, slot: "inspector" },
+    {
+      prop: "frequencyType",
+      label: "棰戞",
+      minWidth: 150,
+      // formatter: (_, __, val) => ({
+      //   DAILY: "姣忔棩",
+      //   WEEKLY: "姣忓懆",
+      //   MONTHLY: "姣忔湀",
+      //   QUARTERLY: "瀛e害"
+      // }[val] || "")
+      formatData: params => {
+        return params === "DAILY"
+          ? "姣忔棩"
+          : params === "WEEKLY"
+          ? "姣忓懆"
+          : params === "MONTHLY"
+          ? "姣忔湀"
+          : params === "QUARTERLY"
+          ? "瀛e害"
+          : "";
+      },
+    },
+    {
       prop: "frequencyDetail",
       label: "寮�濮嬫棩鏈熶笌鏃堕棿",
       minWidth: 150,
@@ -221,7 +293,7 @@
     if (value === "taskManage") {
       const operationColumn = getOperationColumn(["edit"]);
       tableColumns.value = [
-        ...columns.value,
+        ...columns1.value,
         ...(operationColumn ? [operationColumn] : []),
       ];
       operationsArr.value = ["edit"];
@@ -293,6 +365,13 @@
 
           return processedItem;
         });
+        tableData.value.forEach(item => {
+          item.inspectionStatus = getFileStatus(item);
+          item.inspectionDeadlinetxt =
+            item.frequencyType === "DAILY"
+              ? item.inspectionDeadline + "灏忔椂"
+              : item.inspectionDeadline + "澶�";
+        });
         total.value = res.data.total || 0;
       })
       .finally(() => {
@@ -345,7 +424,61 @@
       })
       .catch(() => {});
   };
-
+  const getFileStatus = record => {
+    console.log(record);
+    if (record.takePhone) {
+      if (record.commonFileListBefore && record.commonFileListBefore.length) {
+        return "宸插畬鎴�";
+      }
+      if (record.frequencyType == "DAILY") {
+        if (Number(record.inspectionDeadline) && record.createTime) {
+          // 璁$畻鏃堕棿宸紙灏忔椂锛�
+          const now = new Date().getTime();
+          const createTime = new Date(record.createTime).getTime();
+          const hoursDiff = (now - createTime) / (1000 * 60 * 60);
+          if (hoursDiff > Number(record.inspectionDeadline)) {
+            return "瓒呮湡";
+          }
+        }
+      } else {
+        if (Number(record.inspectionDeadline) && record.createTime) {
+          // 璁$畻鏃堕棿宸紙澶╋級
+          const now = new Date().getTime();
+          const createTime = new Date(record.createTime).getTime();
+          const daysDiff = (now - createTime) / (1000 * 60 * 60 * 24);
+          if (daysDiff > Number(record.inspectionDeadline)) {
+            return "瓒呮湡";
+          }
+        }
+      }
+      return "鏈贰妫�";
+    } else if (record.inspectionSubmitted) {
+      return "宸插畬鎴�";
+    } else {
+      if (record.frequencyType == "DAILY") {
+        if (Number(record.inspectionDeadline) && record.createTime) {
+          // 璁$畻鏃堕棿宸紙灏忔椂锛�
+          const now = new Date().getTime();
+          const createTime = new Date(record.createTime).getTime();
+          const hoursDiff = (now - createTime) / (1000 * 60 * 60);
+          if (hoursDiff > Number(record.inspectionDeadline)) {
+            return "瓒呮湡";
+          }
+        }
+      } else {
+        if (Number(record.inspectionDeadline) && record.createTime) {
+          // 璁$畻鏃堕棿宸紙澶╋級
+          const now = new Date().getTime();
+          const createTime = new Date(record.createTime).getTime();
+          const daysDiff = (now - createTime) / (1000 * 60 * 60 * 24);
+          if (daysDiff > Number(record.inspectionDeadline)) {
+            return "瓒呮湡";
+          }
+        }
+      }
+      return "鏈贰妫�";
+    }
+  };
   // 澶氶�夊彉鏇�
   const handleSelectionChange = selection => {
     selectedRows.value = selection;
diff --git a/src/views/equipmentManagement/repair/Modal/MaintainModal.vue b/src/views/equipmentManagement/repair/Modal/MaintainModal.vue
index 496b072..983b316 100644
--- a/src/views/equipmentManagement/repair/Modal/MaintainModal.vue
+++ b/src/views/equipmentManagement/repair/Modal/MaintainModal.vue
@@ -32,6 +32,16 @@
           style="width: 100%"
         />
       </el-form-item>
+      <el-form-item label="璁惧澶囦欢">
+        <el-select v-model="form.sparePartsIds" :loading="loadingSparePartOptions" placeholder="璇烽�夋嫨璁惧澶囦欢" multiple filterable>
+          <el-option
+              v-for="item in sparePartOptions"
+              :key="item.id"
+              :label="item.name"
+              :value="item.id"
+          />
+        </el-select>
+      </el-form-item>
     </el-form>
   </FormDialog>
 </template>
@@ -43,6 +53,7 @@
 import useUserStore from "@/store/modules/user";
 import dayjs from "dayjs";
 import { ElMessage } from "element-plus";
+import {getSparePartsOptions} from "@/api/equipmentManagement/spareParts.js";
 
 defineOptions({
   name: "缁翠慨妯℃�佹",
@@ -61,7 +72,10 @@
   maintenanceResult: undefined, // 缁翠慨缁撴灉
   maintenanceTime: undefined, // 缁翠慨鏃ユ湡
   status: 0,
+  sparePartsIds: undefined,
 });
+const sparePartOptions = ref([])
+const loadingSparePartOptions = ref(true)
 
 const setForm = (data) => {
   form.maintenanceName = data.maintenanceName ?? userStore.nickName;
@@ -71,12 +85,18 @@
       ? dayjs(data.maintenanceTime).format("YYYY-MM-DD HH:mm:ss")
       : dayjs().format("YYYY-MM-DD HH:mm:ss");
   form.status = 1; // 榛樿鐘舵�佷负瀹岀粨
+  form.sparePartsIds = data.sparePartsIds;
 };
 
 const sendForm = async () => {
   loading.value = true;
   try {
-    const { code } = await addMaintain({ id: repairId.value, ...form });
+    const data = {
+      id: repairId.value,
+      ...form,
+      sparePartsIds: form.sparePartsIds ? form.sparePartsIds.join(",") : "",
+    }
+    const { code } = await addMaintain(data);
     if (code == 200) {
       ElMessage.success("缁翠慨鎴愬姛");
       emits("ok");
@@ -87,6 +107,17 @@
     loading.value = false;
   }
 };
+
+const fetchSparePartOptions = (deviceLedgerId) => {
+  loadingSparePartOptions.value = true;
+  getSparePartsOptions({ deviceLedgerId: deviceLedgerId }).then((res) => {
+    if (res.code == 200) {
+      sparePartOptions.value = res.data || [];
+    }
+  }).finally(() => {
+    loadingSparePartOptions.value = false;
+  })
+}
 
 const handleCancel = () => {
   resetForm();
@@ -103,6 +134,7 @@
   visible.value = true;
   await nextTick();
   setForm(row);
+  fetchSparePartOptions(row.deviceLedgerId)
 };
 
 defineExpose({
diff --git a/src/views/equipmentManagement/spareParts/index.vue b/src/views/equipmentManagement/spareParts/index.vue
index 0b0dae2..db82a7d 100644
--- a/src/views/equipmentManagement/spareParts/index.vue
+++ b/src/views/equipmentManagement/spareParts/index.vue
@@ -36,7 +36,6 @@
             <el-tag type="success" size="small">{{ row.status }}</el-tag>
           </template>
         </el-table-column>
-        <el-table-column prop="price" label="浠锋牸" width="140"></el-table-column>
         <el-table-column prop="quantity" label="鏁伴噺" width="140"></el-table-column>
         <el-table-column prop="description" label="鎻忚堪"></el-table-column>
         <el-table-column label="鎿嶄綔" width="150" fixed="right" align="center">
@@ -111,16 +110,6 @@
         <el-form-item label="鎻忚堪" prop="description">
           <el-input v-model="form.description"></el-input>
         </el-form-item>
-        <el-form-item label="浠锋牸" prop="price">
-          <el-input-number
-            v-model="form.price"
-            placeholder="璇疯緭鍏ヤ环鏍�"
-            :min="0"
-            :step="0.01"
-            :precision="2"
-            style="width: 100%"
-          ></el-input-number>
-        </el-form-item>
       </el-form>
       <template #footer>
         <span class="dialog-footer">
@@ -173,7 +162,6 @@
   status: '',
   description: '',
   deviceLedgerIds: [],
-  price: null
 });
 
 // 琛ㄥ崟楠岃瘉瑙勫垯
@@ -298,7 +286,6 @@
   form.status = '';
   form.description = '';
   form.deviceLedgerIds = [];
-  form.price = null;
   operationType.value = 'add'
   dialogVisible.value = true;
 };
diff --git a/src/views/equipmentManagement/upkeep/Form/DetailDialog.vue b/src/views/equipmentManagement/upkeep/Form/DetailDialog.vue
new file mode 100644
index 0000000..2c56dd4
--- /dev/null
+++ b/src/views/equipmentManagement/upkeep/Form/DetailDialog.vue
@@ -0,0 +1,219 @@
+<template>
+  <el-dialog v-model="dialogVisible"
+             title="淇濆吇浠诲姟璇︽儏"
+             width="600px"
+             :close-on-click-modal="false"
+             @close="handleClose">
+    <el-form :model="formData"
+             label-width="120px"
+             class="detail-form">
+      <el-form-item label="璁惧鍚嶇О">
+        <el-input v-model="formData.deviceName"
+                  disabled />
+      </el-form-item>
+      <el-form-item label="瑙勬牸鍨嬪彿">
+        <el-input v-model="formData.deviceModel"
+                  disabled />
+      </el-form-item>
+      <el-form-item label="璁″垝淇濆吇鏃ユ湡">
+        <el-input v-model="formData.maintenancePlanTime"
+                  disabled />
+      </el-form-item>
+      <el-form-item label="褰曞叆浜�">
+        <el-input v-model="formData.createUserName"
+                  disabled />
+      </el-form-item>
+      <el-form-item label="瀹為檯淇濆吇浜�">
+        <el-input v-model="formData.maintenanceActuallyName"
+                  disabled />
+      </el-form-item>
+      <el-form-item label="瀹為檯淇濆吇鏃ユ湡">
+        <el-input v-model="formData.maintenanceActuallyTime"
+                  disabled />
+      </el-form-item>
+      <el-form-item label="淇濆吇缁撴灉">
+        <el-input v-model="formData.maintenanceResult"
+                  type="textarea"
+                  :rows="3"
+                  disabled />
+      </el-form-item>
+      <el-form-item label="鐘舵��">
+        <el-tag v-if="formData.status === 2"
+                type="danger">澶辫触</el-tag>
+        <el-tag v-else-if="formData.status === 1"
+                type="success">瀹岀粨</el-tag>
+        <el-tag v-else-if="formData.status === 0"
+                type="warning">寰呬繚鍏�</el-tag>
+        <span v-else>-</span>
+      </el-form-item>
+      <el-form-item label="璁惧澶囦欢">
+        <span>{{formData.sparePartsNames}}</span>
+      </el-form-item>
+      <el-form-item label="鍥剧墖鍒楄〃">
+        <div v-if="imageList.length > 0"
+             class="image-list">
+          <el-image v-for="(image, index) in imagesFile"
+                    :key="index"
+                    :src="image.url"
+                    fit="cover"
+                    class="image-item" />
+        </div>
+        <span v-else>-</span>
+      </el-form-item>
+    </el-form>
+    <template #footer>
+      <span class="dialog-footer">
+        <el-button @click="handleClose">鍏抽棴</el-button>
+      </span>
+    </template>
+  </el-dialog>
+</template>
+
+<script setup>
+  import { ref, watch, computed } from "vue";
+  import dayjs from "dayjs";
+
+  const props = defineProps({
+    visible: {
+      type: Boolean,
+      default: false,
+    },
+    row: {
+      type: Object,
+      default: () => ({}),
+    },
+  });
+
+  const emit = defineEmits(["update:visible", "close"]);
+
+  const dialogVisible = ref(false);
+  const formData = ref({
+    deviceName: "",
+    deviceModel: "",
+    maintenancePlanTime: "",
+    createUserName: "",
+    maintenanceActuallyName: "",
+    maintenanceActuallyTime: "",
+    maintenanceResult: "",
+    status: "",
+    sparePartsNames: "",
+  });
+  const imageList = ref([]);
+  const sparePartsList = ref([]);
+
+  // 棰勮鍥剧墖鍒楄〃
+  const previewImageList = computed(() => {
+    return imageList.value.map(image => image.url || image.fileUrl);
+  });
+
+  watch(
+    () => props.visible,
+    newVal => {
+      dialogVisible.value = newVal;
+    }
+  );
+
+  // 鐩戝惉 dialogVisible 鍙樺寲锛岄�氱煡鐖剁粍浠�
+  watch(
+    () => dialogVisible.value,
+    newVal => {
+      emit("update:visible", newVal);
+    }
+  );
+
+  watch(
+    () => props.row,
+    newRow => {
+      if (newRow) {
+        fillFormData(newRow);
+      }
+    },
+    { deep: true }
+  );
+
+  const fillFormData = row => {
+    formData.value = {
+      deviceName: row.deviceName || "",
+      deviceModel: row.deviceModel || "",
+      maintenancePlanTime: row.maintenancePlanTime
+        ? dayjs(row.maintenancePlanTime).format("YYYY-MM-DD")
+        : "",
+      createUserName: row.createUserName || "",
+      maintenanceActuallyName: row.maintenanceActuallyName || "",
+      maintenanceActuallyTime: row.maintenanceActuallyTime
+        ? dayjs(row.maintenanceActuallyTime).format("YYYY-MM-DD HH:mm:ss")
+        : "",
+      maintenanceResult: row.maintenanceResult || "",
+      status: row.status || 0,
+      sparePartsNames: row.sparePartsNames || "",
+    };
+
+    // 澶勭悊鍥剧墖鍒楄〃
+    if (row.imagesFile) {
+      if (Array.isArray(row.imagesFile)) {
+        imageList.value = row.imagesFile;
+      } else if (typeof row.imagesFile === "string") {
+        try {
+          imageList.value = JSON.parse(row.imagesFile);
+        } catch (error) {
+          imageList.value = [];
+        }
+      } else {
+        imageList.value = [];
+      }
+    } else {
+      imageList.value = [];
+    }
+    console.log(imageList.value, "imageList");
+
+    // 澶勭悊璁惧澶囦欢鍒楄〃
+    if (row.spareParts) {
+      if (Array.isArray(row.spareParts)) {
+        sparePartsList.value = row.spareParts;
+      } else if (typeof row.spareParts === "string") {
+        try {
+          sparePartsList.value = JSON.parse(row.spareParts);
+        } catch (error) {
+          sparePartsList.value = [];
+        }
+      } else {
+        sparePartsList.value = [];
+      }
+    } else {
+      sparePartsList.value = [];
+    }
+  };
+
+  const handleClose = () => {
+    dialogVisible.value = false;
+    emit("update:visible", false);
+    emit("close");
+  };
+</script>
+
+<style scoped>
+  .detail-form {
+    margin-top: 20px;
+  }
+
+  .dialog-footer {
+    text-align: center;
+  }
+
+  .image-list {
+    display: flex;
+    flex-wrap: wrap;
+    gap: 10px;
+    margin-top: 5px;
+  }
+
+  .image-item {
+    width: 100px;
+    height: 100px;
+    cursor: pointer;
+  }
+
+  .el-table {
+    margin-top: 5px;
+  }
+</style>
\ No newline at end of file
diff --git a/src/views/equipmentManagement/upkeep/Form/MaintenanceModal.vue b/src/views/equipmentManagement/upkeep/Form/MaintenanceModal.vue
index c660840..09f6ff1 100644
--- a/src/views/equipmentManagement/upkeep/Form/MaintenanceModal.vue
+++ b/src/views/equipmentManagement/upkeep/Form/MaintenanceModal.vue
@@ -38,6 +38,16 @@
           placeholder="璇疯緭鍏ヤ繚鍏荤粨鏋�"
           type="text" />
       </el-form-item>
+      <el-form-item label="璁惧澶囦欢">
+        <el-select v-model="form.sparePartsIds" :loading="loadingSparePartOptions" placeholder="璇烽�夋嫨璁惧澶囦欢" multiple filterable>
+          <el-option
+              v-for="item in sparePartOptions"
+              :key="item.id"
+              :label="item.name"
+              :value="item.id"
+          />
+        </el-select>
+      </el-form-item>
     </el-form>
   </FormDialog>
 </template>
@@ -45,6 +55,7 @@
 <script setup>
 import FormDialog from "@/components/Dialog/FormDialog.vue";
 import { addMaintenance } from "@/api/equipmentManagement/upkeep";
+import {getSparePartsOptions} from "@/api/equipmentManagement/spareParts.js";
 import useFormData from "@/hooks/useFormData";
 import dayjs from "dayjs";
 import useUserStore from "@/store/modules/user";
@@ -67,7 +78,10 @@
   maintenanceActuallyTime: undefined, // 瀹為檯淇濆吇鏃ユ湡
   maintenanceResult: undefined, // 淇濆吇缁撴灉
   status: 0, // 淇濆吇鐘舵��
+  sparePartsIds: undefined,
 });
+const sparePartOptions = ref([])
+const loadingSparePartOptions = ref(true)
 
 const setForm = (data) => {
   form.maintenanceActuallyName =
@@ -78,7 +92,19 @@
       : dayjs().format("YYYY-MM-DD HH:mm:ss");
   form.maintenanceResult = data.maintenanceResult;
   form.status = 1; // 榛樿鐘舵�佷负瀹岀粨
+  form.sparePartsIds = data.sparePartsIds;
 };
+
+const fetchSparePartOptions = (deviceLedgerId) => {
+  loadingSparePartOptions.value = true;
+  getSparePartsOptions({ deviceLedgerId: deviceLedgerId }).then((res) => {
+    if (res.code == 200) {
+      sparePartOptions.value = res.data || [];
+    }
+  }).finally(() => {
+    loadingSparePartOptions.value = false;
+  })
+}
 
 /**
  * @desc 淇濆瓨淇濆吇
@@ -86,7 +112,12 @@
 const sendForm = async () => {
   loading.value = true;
   try {
-    const { code } = await addMaintenance({ id: planId.value, ...form });
+    const data = {
+      id: planId.value,
+      ...form,
+      sparePartsIds: form.sparePartsIds ? form.sparePartsIds.join(",") : "",
+    }
+    const { code } = await addMaintenance(data);
     if (code == 200) {
       ElMessage.success("淇濆吇鎴愬姛");
       emits("ok");
@@ -113,6 +144,7 @@
   visible.value = true;
   await nextTick();
   setForm(row);
+  fetchSparePartOptions(row.deviceLedgerId)
 };
 
 defineExpose({
diff --git a/src/views/equipmentManagement/upkeep/index.vue b/src/views/equipmentManagement/upkeep/index.vue
index 543e37b..a016819 100644
--- a/src/views/equipmentManagement/upkeep/index.vue
+++ b/src/views/equipmentManagement/upkeep/index.vue
@@ -1,694 +1,723 @@
 <template>
   <div class="app-container">
-    <el-tabs v-model="activeTab" @tab-change="handleTabChange">
+    <el-tabs v-model="activeTab"
+             @tab-change="handleTabChange">
       <!-- 瀹氭椂浠诲姟绠$悊tab -->
-      <el-tab-pane label="瀹氭椂浠诲姟绠$悊" name="scheduled">
+      <el-tab-pane label="瀹氭椂浠诲姟绠$悊"
+                   name="scheduled">
         <div class="search_form">
-          <el-form :model="scheduledFilters" :inline="true">
+          <el-form :model="scheduledFilters"
+                   :inline="true">
             <el-form-item label="浠诲姟鍚嶇О">
-              <el-input
-                  v-model="scheduledFilters.taskName"
-                  style="width: 240px"
-                  placeholder="璇疯緭鍏ヤ换鍔″悕绉�"
-                  clearable
-                  :prefix-icon="Search"
-                  @change="getScheduledTableData"
-              />
+              <el-input v-model="scheduledFilters.taskName"
+                        style="width: 240px"
+                        placeholder="璇疯緭鍏ヤ换鍔″悕绉�"
+                        clearable
+                        :prefix-icon="Search"
+                        @change="getScheduledTableData" />
             </el-form-item>
             <el-form-item label="浠诲姟鐘舵��">
-              <el-select v-model="scheduledFilters.status" placeholder="璇烽�夋嫨浠诲姟鐘舵��" clearable style="width: 200px">
-                <el-option label="鍚敤" value="1" />
-                <el-option label="鍋滅敤" value="0" />
+              <el-select v-model="scheduledFilters.status"
+                         placeholder="璇烽�夋嫨浠诲姟鐘舵��"
+                         clearable
+                         style="width: 200px">
+                <el-option label="鍚敤"
+                           value="1" />
+                <el-option label="鍋滅敤"
+                           value="0" />
               </el-select>
             </el-form-item>
             <el-form-item>
-              <el-button type="primary" @click="getScheduledTableData">鎼滅储</el-button>
+              <el-button type="primary"
+                         @click="getScheduledTableData">鎼滅储</el-button>
               <el-button @click="resetScheduledFilters">閲嶇疆</el-button>
             </el-form-item>
           </el-form>
         </div>
         <div class="table_list">
           <div class="actions">
-            <el-text class="mx-1" size="large">瀹氭椂浠诲姟绠$悊</el-text>
+            <el-text class="mx-1"
+                     size="large">瀹氭椂浠诲姟绠$悊</el-text>
             <div>
-              <el-button type="primary" icon="Plus" @click="addScheduledTask">
+              <el-button type="primary"
+                         icon="Plus"
+                         @click="addScheduledTask">
                 鏂板浠诲姟
               </el-button>
-              <el-button
-                type="danger"
-                icon="Delete"
-                :disabled="scheduledMultipleList.length <= 0"
-                @click="delScheduledTaskByIds(scheduledMultipleList.map((item) => item.id))"
-              >
+              <el-button type="danger"
+                         icon="Delete"
+                         :disabled="scheduledMultipleList.length <= 0"
+                         @click="delScheduledTaskByIds(scheduledMultipleList.map((item) => item.id))">
                 鎵归噺鍒犻櫎
               </el-button>
             </div>
           </div>
-          <PIMTable
-            rowKey="id"
-            isSelection
-            :column="scheduledColumns"
-            :tableData="scheduledDataList"
-            :page="{
+          <PIMTable rowKey="id"
+                    isSelection
+                    :column="scheduledColumns"
+                    :tableData="scheduledDataList"
+                    :page="{
               current: scheduledPagination.currentPage,
               size: scheduledPagination.pageSize,
               total: scheduledPagination.total,
             }"
-            @selection-change="handleScheduledSelectionChange"
-            @pagination="changeScheduledPage"
-          >
+                    @selection-change="handleScheduledSelectionChange"
+                    @pagination="changeScheduledPage">
             <template #statusRef="{ row }">
-              <el-tag v-if="row.status === 1" type="success">鍚敤</el-tag>
-              <el-tag v-if="row.status === 0" type="danger">鍋滅敤</el-tag>
+              <el-tag v-if="row.status === 1"
+                      type="success">鍚敤</el-tag>
+              <el-tag v-if="row.status === 0"
+                      type="danger">鍋滅敤</el-tag>
             </template>
             <template #operation="{ row }">
-              <el-button
-                type="primary"
-                link
-                @click="editScheduledTask(row)"
-              >
+              <el-button type="primary"
+                         link
+                         @click="editScheduledTask(row)">
                 缂栬緫
               </el-button>
-              <el-button
-                type="danger"
-                link
-                @click="delScheduledTaskByIds(row.id)"
-              >
+              <el-button type="danger"
+                         link
+                         @click="delScheduledTaskByIds(row.id)">
                 鍒犻櫎
               </el-button>
             </template>
           </PIMTable>
         </div>
       </el-tab-pane>
-
       <!-- 浠诲姟璁板綍tab锛堝師璁惧淇濆吇椤甸潰锛� -->
-      <el-tab-pane label="浠诲姟璁板綍" name="record">
+      <el-tab-pane label="浠诲姟璁板綍"
+                   name="record">
         <div class="search_form">
-          <el-form :model="filters" :inline="true">
+          <el-form :model="filters"
+                   :inline="true">
             <el-form-item label="璁惧鍚嶇О">
-              <el-input
-                  v-model="filters.deviceName"
-                  style="width: 240px"
-                  placeholder="璇疯緭鍏ヨ澶囧悕绉�"
-                  clearable
-                  :prefix-icon="Search"
-                  @change="getTableData"
-              />
+              <el-input v-model="filters.deviceName"
+                        style="width: 240px"
+                        placeholder="璇疯緭鍏ヨ澶囧悕绉�"
+                        clearable
+                        :prefix-icon="Search"
+                        @change="getTableData" />
             </el-form-item>
             <el-form-item label="璁″垝淇濆吇鏃ユ湡">
-              <el-date-picker
-                  v-model="filters.maintenancePlanTime"
-                  type="date"
-                  placeholder="璇烽�夋嫨璁″垝淇濆吇鏃ユ湡"
-                  size="default"
-                  @change="(date) => handleDateChange(date,2)"
-              />
+              <el-date-picker v-model="filters.maintenancePlanTime"
+                              type="date"
+                              placeholder="璇烽�夋嫨璁″垝淇濆吇鏃ユ湡"
+                              size="default"
+                              @change="(date) => handleDateChange(date,2)" />
             </el-form-item>
             <el-form-item label="瀹為檯淇濆吇鏃ユ湡">
-              <el-date-picker
-                  v-model="filters.maintenanceActuallyTime"
-                  type="date"
-                  placeholder="璇烽�夋嫨瀹為檯淇濆吇鏃ユ湡"
-                  size="default"
-                  @change="(date) => handleDateChange(date,1)"
-              />
+              <el-date-picker v-model="filters.maintenanceActuallyTime"
+                              type="date"
+                              placeholder="璇烽�夋嫨瀹為檯淇濆吇鏃ユ湡"
+                              size="default"
+                              @change="(date) => handleDateChange(date,1)" />
             </el-form-item>
             <el-form-item label="瀹為檯淇濆吇浜�">
-              <el-input
-                  v-model="filters.maintenanceActuallyName"
-                  style="width: 240px"
-                  placeholder="璇疯緭鍏ュ疄闄呬繚鍏讳汉"
-                  clearable
-                  :prefix-icon="Search"
-                  @change="getTableData"
-              />
+              <el-input v-model="filters.maintenanceActuallyName"
+                        style="width: 240px"
+                        placeholder="璇疯緭鍏ュ疄闄呬繚鍏讳汉"
+                        clearable
+                        :prefix-icon="Search"
+                        @change="getTableData" />
             </el-form-item>
             <el-form-item>
-              <el-button type="primary" @click="getTableData">鎼滅储</el-button>
+              <el-button type="primary"
+                         @click="getTableData">鎼滅储</el-button>
               <el-button @click="resetFilters">閲嶇疆</el-button>
             </el-form-item>
           </el-form>
         </div>
         <div class="table_list">
           <div class="actions">
-            <el-text class="mx-1" size="large">浠诲姟璁板綍</el-text>
+            <el-text class="mx-1"
+                     size="large">浠诲姟璁板綍</el-text>
             <div>
-              <el-button type="success" icon="Van" @click="addPlan">
+              <el-button type="success"
+                         icon="Van"
+                         @click="addPlan">
                 鏂板璁″垝
               </el-button>
               <el-button @click="handleOut">
                 瀵煎嚭
               </el-button>
-              <el-button
-                type="danger"
-                icon="Delete"
-                :disabled="multipleList.length <= 0 || hasFinishedStatus"
-                @click="delRepairByIds(multipleList.map((item) => item.id))"
-              >
+              <el-button type="danger"
+                         icon="Delete"
+                         :disabled="multipleList.length <= 0 || hasFinishedStatus"
+                         @click="delRepairByIds(multipleList.map((item) => item.id))">
                 鎵归噺鍒犻櫎
               </el-button>
             </div>
           </div>
-         <PIMTable
-        rowKey="id"
-        isSelection
-        :column="columns"
-        :tableData="dataList"
-        :page="{
+          <PIMTable rowKey="id"
+                    isSelection
+                    :column="columns"
+                    :tableData="dataList"
+                    :page="{
           current: pagination.currentPage,
           size: pagination.pageSize,
           total: pagination.total,
         }"
-        @selection-change="handleSelectionChange"
-        @pagination="changePage"
-      >
-        <template #maintenanceResultRef="{ row }">
-          <div>{{ row.maintenanceResult || '-' }}</div>
-        </template>
-        <template #statusRef="{ row }">
-          <el-tag v-if="row.status === 2" type="danger">澶辫触</el-tag>
-          <el-tag v-if="row.status === 1" type="success">瀹岀粨</el-tag>
-          <el-tag v-if="row.status === 0" type="warning">寰呬繚鍏�</el-tag>
-        </template>
-        <template #operation="{ row }">
-          <!-- 杩欎釜鍔熻兘璺熸柊澧炰繚鍏诲姛鑳戒竴妯′竴鏍凤紝鏈夊暐鎰忎箟锛� -->
-          <!-- <el-button
+                    @selection-change="handleSelectionChange"
+                    @pagination="changePage">
+            <template #maintenanceResultRef="{ row }">
+              <div>{{ row.maintenanceResult || '-' }}</div>
+            </template>
+            <template #statusRef="{ row }">
+              <el-tag v-if="row.status === 2"
+                      type="danger">澶辫触</el-tag>
+              <el-tag v-if="row.status === 1"
+                      type="success">瀹岀粨</el-tag>
+              <el-tag v-if="row.status === 0"
+                      type="warning">寰呬繚鍏�</el-tag>
+            </template>
+            <template #operation="{ row }">
+              <!-- 杩欎釜鍔熻兘璺熸柊澧炰繚鍏诲姛鑳戒竴妯′竴鏍凤紝鏈夊暐鎰忎箟锛� -->
+              <!-- <el-button
               type="primary"
               text
               @click="addMaintain(row)"
           >
             鏂板淇濆吇
           </el-button> -->
-          <el-button
-            type="primary"
-            link
-            :disabled="row.status === 1"
-            @click="editPlan(row.id)"
-          >
-            缂栬緫
-          </el-button>
-          <el-button
-            type="success"
-            link
-            :disabled="row.status === 1"
-            @click="addMaintain(row)"
-          >
-            淇濆吇
-          </el-button>
-          <el-button
-            type="danger"
-            link
-            :disabled="row.status === 1"
-            @click="delRepairByIds(row.id)"
-          >
-            鍒犻櫎
-          </el-button>
-          <el-button
-            type="primary"
-            link
-            @click="openFileDialog(row)"
-          >
-            闄勪欢
-          </el-button>
-        </template>
-      </PIMTable>
+              <el-button type="primary"
+                         link
+                         :disabled="row.status === 1"
+                         @click="editPlan(row.id)">
+                缂栬緫
+              </el-button>
+              <!-- <el-button type="success"
+                         link
+                         :disabled="row.status === 1"
+                         @click="addMaintain(row)">
+                淇濆吇
+              </el-button> -->
+              <el-button type="danger"
+                         link
+                         :disabled="row.status === 1"
+                         @click="delRepairByIds(row.id)">
+                鍒犻櫎
+              </el-button>
+              <el-button type="primary"
+                         link
+                         @click="openFileDialog(row)">
+                璇︽儏
+              </el-button>
+              <!-- <el-button type="primary"
+                         link
+                         @click="openAttachmentDialog(row)">
+                闄勪欢
+              </el-button> -->
+            </template>
+          </PIMTable>
         </div>
       </el-tab-pane>
     </el-tabs>
-    <PlanModal ref="planModalRef" @ok="getTableData" />
-        <MaintenanceModal ref="maintainModalRef" @ok="getTableData" />
-        <FormDia ref="formDiaRef" @closeDia="getScheduledTableData" />
-    <FileListDialog 
-      ref="fileListDialogRef"
-      v-model="fileDialogVisible"
-      :show-upload-button="true"
-      :show-delete-button="true"
-      :delete-method="handleAttachmentDelete"
-      :name-column-label="'闄勪欢鍚嶇О'"
-      :rulesRegulationsManagementId="currentMaintenanceTaskId"
-      @upload="handleAttachmentUpload" />
+    <PlanModal ref="planModalRef"
+               @ok="getTableData" />
+    <MaintenanceModal ref="maintainModalRef"
+                      @ok="getTableData" />
+    <FormDia ref="formDiaRef"
+             @closeDia="getScheduledTableData" />
+    <DetailDialog ref="detailDialogRef"
+                  v-model:visible="detailDialogVisible"
+                  :row="currentDetailRow" />
+    <FileListDialog ref="fileListDialogRef"
+                    v-model="fileDialogVisible"
+                    :show-upload-button="true"
+                    :show-delete-button="true"
+                    :delete-method="handleAttachmentDelete"
+                    :name-column-label="'闄勪欢鍚嶇О'"
+                    :rulesRegulationsManagementId="currentMaintenanceTaskId"
+                    @upload="handleAttachmentUpload" />
   </div>
 </template>
 
 <script setup>
-import { ref, onMounted, reactive, getCurrentInstance, nextTick, computed } from 'vue'
-import { Search } from '@element-plus/icons-vue'
-import { ElMessage, ElMessageBox } from 'element-plus'
-import PlanModal from './Form/PlanModal.vue'
-import MaintenanceModal from './Form/MaintenanceModal.vue'
-import FormDia from './Form/formDia.vue'
-import FileListDialog from '@/components/Dialog/FileListDialog.vue'
-import {
-  getUpkeepPage,
-  delUpkeep,
-  deviceMaintenanceTaskList,
-  deviceMaintenanceTaskDel,
-} from '@/api/equipmentManagement/upkeep'
-import {
-  listMaintenanceTaskFiles,
-  addMaintenanceTaskFile,
-  delMaintenanceTaskFile,
-} from '@/api/equipmentManagement/maintenanceTaskFile'
-import dayjs from 'dayjs'
+  import {
+    ref,
+    onMounted,
+    reactive,
+    getCurrentInstance,
+    nextTick,
+    computed,
+  } from "vue";
+  import { Search } from "@element-plus/icons-vue";
+  import { ElMessage, ElMessageBox } from "element-plus";
+  import PlanModal from "./Form/PlanModal.vue";
+  import MaintenanceModal from "./Form/MaintenanceModal.vue";
+  import FormDia from "./Form/formDia.vue";
+  import DetailDialog from "./Form/DetailDialog.vue";
+  import FileListDialog from "@/components/Dialog/FileListDialog.vue";
+  import {
+    getUpkeepPage,
+    delUpkeep,
+    deviceMaintenanceTaskList,
+    deviceMaintenanceTaskDel,
+  } from "@/api/equipmentManagement/upkeep";
+  import {
+    listMaintenanceTaskFiles,
+    addMaintenanceTaskFile,
+    delMaintenanceTaskFile,
+  } from "@/api/equipmentManagement/maintenanceTaskFile";
+  import dayjs from "dayjs";
 
-const { proxy } = getCurrentInstance()
+  const { proxy } = getCurrentInstance();
 
-// Tab鐩稿叧
-const activeTab = ref('scheduled')
+  // Tab鐩稿叧
+  const activeTab = ref("scheduled");
 
-// 璁″垝寮圭獥鎺у埗鍣�
-const planModalRef = ref()
-// 淇濆吇寮圭獥鎺у埗鍣�
-const maintainModalRef = ref()
-// 瀹氭椂浠诲姟寮圭獥鎺у埗鍣�
-const formDiaRef = ref()
-// 闄勪欢寮圭獥
-const fileListDialogRef = ref(null)
-const fileDialogVisible = ref(false)
-const currentMaintenanceTaskId = ref(null)
+  // 璁″垝寮圭獥鎺у埗鍣�
+  const planModalRef = ref();
+  // 淇濆吇寮圭獥鎺у埗鍣�
+  const maintainModalRef = ref();
+  // 瀹氭椂浠诲姟寮圭獥鎺у埗鍣�
+  const formDiaRef = ref();
+  // 璇︽儏寮圭獥
+  const detailDialogRef = ref();
+  const detailDialogVisible = ref(false);
+  const currentDetailRow = ref(null);
+  // 闄勪欢寮圭獥
+  const fileListDialogRef = ref(null);
+  const fileDialogVisible = ref(false);
+  const currentMaintenanceTaskId = ref(null);
 
-// 浠诲姟璁板綍tab锛堝師璁惧淇濆吇椤甸潰锛夌浉鍏冲彉閲�
-const filters = reactive({
-  deviceName: '',
-  maintenancePlanTime: '',
-  maintenanceActuallyTime: '',
-  maintenanceActuallyName: '',
-})
+  // 浠诲姟璁板綍tab锛堝師璁惧淇濆吇椤甸潰锛夌浉鍏冲彉閲�
+  const filters = reactive({
+    deviceName: "",
+    maintenancePlanTime: "",
+    maintenanceActuallyTime: "",
+    maintenanceActuallyName: "",
+  });
 
-const dataList = ref([])
-const pagination = ref({
-  currentPage: 1,
-  pageSize: 10,
-  total: 0,
-})
-const multipleList = ref([])
+  const dataList = ref([]);
+  const pagination = ref({
+    currentPage: 1,
+    pageSize: 10,
+    total: 0,
+  });
+  const multipleList = ref([]);
 
-// 瀹氭椂浠诲姟绠$悊tab鐩稿叧鍙橀噺
-const scheduledFilters = reactive({
-  taskName: '',
-  status: '',
-})
+  // 瀹氭椂浠诲姟绠$悊tab鐩稿叧鍙橀噺
+  const scheduledFilters = reactive({
+    taskName: "",
+    status: "",
+  });
 
-const scheduledDataList = ref([])
-const scheduledPagination = reactive({
-  currentPage: 1,
-  pageSize: 10,
-  total: 0,
-})
-const scheduledMultipleList = ref([])
+  const scheduledDataList = ref([]);
+  const scheduledPagination = reactive({
+    currentPage: 1,
+    pageSize: 10,
+    total: 0,
+  });
+  const scheduledMultipleList = ref([]);
 
-// 瀹氭椂浠诲姟绠$悊琛ㄦ牸鍒楅厤缃�
-const scheduledColumns = ref([
-	{ prop: "taskName", label: "璁惧鍚嶇О"},
-	{
-		label: "瑙勬牸鍨嬪彿",
-		prop: "deviceModel",
-	},
-	{
-		prop: "frequencyType",
-		label: "棰戞",
-		minWidth: 150,
-		// PIMTable 浣跨敤鐨勬槸 formatData锛岃�屼笉鏄� Element-Plus 鐨� formatter
-		formatData: (cell) => ({
-			DAILY: "姣忔棩",
-			WEEKLY: "姣忓懆",
-			MONTHLY: "姣忔湀",
-			QUARTERLY: "瀛e害"
-		}[cell] || "")
-	},
-	{
-		prop: "frequencyDetail",
-		label: "寮�濮嬫棩鏈熶笌鏃堕棿",
-		minWidth: 150,
-		// 鍚屾牱鏀圭敤 formatData锛孭IMTable 鍐呴儴浼氭妸鍗曞厓鏍煎�间紶杩涙潵
-		formatData: (cell) => {
-			if (typeof cell !== 'string') return '';
-			let val = cell;
-			const replacements = {
-				MON: '鍛ㄤ竴',
-				TUE: '鍛ㄤ簩',
-				WED: '鍛ㄤ笁',
-				THU: '鍛ㄥ洓',
-				FRI: '鍛ㄤ簲',
-				SAT: '鍛ㄥ叚',
-				SUN: '鍛ㄦ棩'
-			};
-			// 浣跨敤姝e垯涓�娆℃�ф浛鎹㈡墍鏈夊尮閰嶉」
-			return val.replace(/MON|TUE|WED|THU|FRI|SAT|SUN/g, match => replacements[match]);
-		}
-	},
-	{ prop: "registrant", label: "鐧昏浜�", minWidth: 100 },
-	{ prop: "registrationDate", label: "鐧昏鏃ユ湡", minWidth: 100 },
-	{
-		fixed: "right",
-		label: "鎿嶄綔",
-		dataType: "slot",
-		slot: "operation",
-		align: "center",
-		width: "200px",
-	},
-])
+  // 瀹氭椂浠诲姟绠$悊琛ㄦ牸鍒楅厤缃�
+  const scheduledColumns = ref([
+    { prop: "taskName", label: "璁惧鍚嶇О" },
+    {
+      label: "瑙勬牸鍨嬪彿",
+      prop: "deviceModel",
+    },
+    {
+      prop: "frequencyType",
+      label: "棰戞",
+      minWidth: 150,
+      // PIMTable 浣跨敤鐨勬槸 formatData锛岃�屼笉鏄� Element-Plus 鐨� formatter
+      formatData: cell =>
+        ({
+          DAILY: "姣忔棩",
+          WEEKLY: "姣忓懆",
+          MONTHLY: "姣忔湀",
+          QUARTERLY: "瀛e害",
+        }[cell] || ""),
+    },
+    {
+      prop: "frequencyDetail",
+      label: "寮�濮嬫棩鏈熶笌鏃堕棿",
+      minWidth: 150,
+      // 鍚屾牱鏀圭敤 formatData锛孭IMTable 鍐呴儴浼氭妸鍗曞厓鏍煎�间紶杩涙潵
+      formatData: cell => {
+        if (typeof cell !== "string") return "";
+        let val = cell;
+        const replacements = {
+          MON: "鍛ㄤ竴",
+          TUE: "鍛ㄤ簩",
+          WED: "鍛ㄤ笁",
+          THU: "鍛ㄥ洓",
+          FRI: "鍛ㄤ簲",
+          SAT: "鍛ㄥ叚",
+          SUN: "鍛ㄦ棩",
+        };
+        // 浣跨敤姝e垯涓�娆℃�ф浛鎹㈡墍鏈夊尮閰嶉」
+        return val.replace(
+          /MON|TUE|WED|THU|FRI|SAT|SUN/g,
+          match => replacements[match]
+        );
+      },
+    },
+    { prop: "registrant", label: "鐧昏浜�", minWidth: 100 },
+    { prop: "registrationDate", label: "鐧昏鏃ユ湡", minWidth: 100 },
+    {
+      fixed: "right",
+      label: "鎿嶄綔",
+      dataType: "slot",
+      slot: "operation",
+      align: "center",
+      width: "200px",
+    },
+  ]);
 
-// 浠诲姟璁板綍琛ㄦ牸鍒楅厤缃紙鍘熻澶囦繚鍏昏〃鏍煎垪锛�
-const columns = ref([
-	{
-		label: "璁惧鍚嶇О",
-		align: "center",
-		prop: "deviceName",
-	},
-	{
-		label: "瑙勬牸鍨嬪彿",
-		align: "center",
-		prop: "deviceModel",
-	},
-	{
-		label: "璁″垝淇濆吇鏃ユ湡",
-		align: "center",
-		prop: "maintenancePlanTime",
-		formatData: (cell) => dayjs(cell).format("YYYY-MM-DD"),
-	},
-	{
-		label: "褰曞叆浜�",
-		align: "center",
-		prop: "createUserName",
-	},
-	// {
-	//   label: "褰曞叆鏃ユ湡",
-	//   align: "center",
-	//   prop: "createTime",
-	//   formatData: (cell) => dayjs(cell).format("YYYY-MM-DD HH:mm:ss"),
-	//   width: 200,
-	// },
-	{
-		label: "瀹為檯淇濆吇浜�",
-		align: "center",
-		prop: "maintenanceActuallyName",
-	},
-	{
-		label: "瀹為檯淇濆吇鏃ユ湡",
-		align: "center",
-		prop: "maintenanceActuallyTime",
-		formatData: (cell) =>
-			cell ? dayjs(cell).format("YYYY-MM-DD HH:mm:ss") : "-",
-	},
-	{
-		label: "淇濆吇缁撴灉",
-		align: "center",
-		prop: "maintenanceResult",
-		dataType: "slot",
-		slot: "maintenanceResultRef",
-	},
-	{
-		label: "鐘舵��",
-		align: "center",
-		prop: "status",
-		dataType: "slot",
-		slot: "statusRef",
-	},
-	{
-		fixed: "right",
-		label: "鎿嶄綔",
-		dataType: "slot",
-		slot: "operation",
-		align: "center",
-		width: "350px",
-	},
-])
+  // 浠诲姟璁板綍琛ㄦ牸鍒楅厤缃紙鍘熻澶囦繚鍏昏〃鏍煎垪锛�
+  const columns = ref([
+    {
+      label: "璁惧鍚嶇О",
+      align: "center",
+      prop: "deviceName",
+    },
+    {
+      label: "瑙勬牸鍨嬪彿",
+      align: "center",
+      prop: "deviceModel",
+    },
+    {
+      label: "璁″垝淇濆吇鏃ユ湡",
+      align: "center",
+      prop: "maintenancePlanTime",
+      formatData: cell => dayjs(cell).format("YYYY-MM-DD"),
+    },
+    {
+      label: "褰曞叆浜�",
+      align: "center",
+      prop: "createUserName",
+    },
+    // {
+    //   label: "褰曞叆鏃ユ湡",
+    //   align: "center",
+    //   prop: "createTime",
+    //   formatData: (cell) => dayjs(cell).format("YYYY-MM-DD HH:mm:ss"),
+    //   width: 200,
+    // },
+    {
+      label: "瀹為檯淇濆吇浜�",
+      align: "center",
+      prop: "maintenanceActuallyName",
+    },
+    {
+      label: "瀹為檯淇濆吇鏃ユ湡",
+      align: "center",
+      prop: "maintenanceActuallyTime",
+      formatData: cell =>
+        cell ? dayjs(cell).format("YYYY-MM-DD HH:mm:ss") : "-",
+    },
+    {
+      label: "淇濆吇缁撴灉",
+      align: "center",
+      prop: "maintenanceResult",
+      dataType: "slot",
+      slot: "maintenanceResultRef",
+    },
+    {
+      label: "鐘舵��",
+      align: "center",
+      prop: "status",
+      dataType: "slot",
+      slot: "statusRef",
+    },
+    {
+      fixed: "right",
+      label: "鎿嶄綔",
+      dataType: "slot",
+      slot: "operation",
+      align: "center",
+      width: "350px",
+    },
+  ]);
 
-// Tab鍒囨崲澶勭悊
-const handleTabChange = (tabName) => {
-  if (tabName === 'record') {
-    getTableData()
-  } else if (tabName === 'scheduled') {
-    getScheduledTableData()
-  }
-}
-
-// 瀹氭椂浠诲姟绠$悊鐩稿叧鏂规硶
-const getScheduledTableData = async () => {
-  try {
-    const params = {
-      current: scheduledPagination.currentPage,
-      size: scheduledPagination.pageSize,
-      taskName: scheduledFilters.taskName || undefined,
-      status: scheduledFilters.status || undefined,
+  // Tab鍒囨崲澶勭悊
+  const handleTabChange = tabName => {
+    if (tabName === "record") {
+      getTableData();
+    } else if (tabName === "scheduled") {
+      getScheduledTableData();
     }
-    const { code, data } = await deviceMaintenanceTaskList(params)
-    if (code === 200) {
-      scheduledDataList.value = data?.records || []
-      scheduledPagination.total = data?.total || 0
+  };
+
+  // 瀹氭椂浠诲姟绠$悊鐩稿叧鏂规硶
+  const getScheduledTableData = async () => {
+    try {
+      const params = {
+        current: scheduledPagination.currentPage,
+        size: scheduledPagination.pageSize,
+        taskName: scheduledFilters.taskName || undefined,
+        status: scheduledFilters.status || undefined,
+      };
+      const { code, data } = await deviceMaintenanceTaskList(params);
+      if (code === 200) {
+        scheduledDataList.value = data?.records || [];
+        scheduledPagination.total = data?.total || 0;
+      }
+    } catch (error) {
+      ElMessage.error("鑾峰彇瀹氭椂浠诲姟鍒楄〃澶辫触");
     }
-  } catch (error) {
-    ElMessage.error('鑾峰彇瀹氭椂浠诲姟鍒楄〃澶辫触')
-  }
-}
+  };
 
-const resetScheduledFilters = () => {
-  scheduledFilters.taskName = ''
-  scheduledFilters.status = ''
-  getScheduledTableData()
-}
+  const resetScheduledFilters = () => {
+    scheduledFilters.taskName = "";
+    scheduledFilters.status = "";
+    getScheduledTableData();
+  };
 
-const handleScheduledSelectionChange = (selection) => {
-  scheduledMultipleList.value = selection
-}
+  const handleScheduledSelectionChange = selection => {
+    scheduledMultipleList.value = selection;
+  };
 
-const changeScheduledPage = (page) => {
-  scheduledPagination.currentPage = page.page
-  scheduledPagination.pageSize = page.limit
-  getScheduledTableData()
-}
+  const changeScheduledPage = page => {
+    scheduledPagination.currentPage = page.page;
+    scheduledPagination.pageSize = page.limit;
+    getScheduledTableData();
+  };
 
-const addScheduledTask = () => {
-  nextTick(() => {
-		formDiaRef.value?.openDialog('add');
-	});
-}
+  const addScheduledTask = () => {
+    nextTick(() => {
+      formDiaRef.value?.openDialog("add");
+    });
+  };
 
-const editScheduledTask = (row) => {
-  if (row) {
-		nextTick(() => {
-			formDiaRef.value?.openDialog('edit', row);
-		});
-  }
-}
+  const editScheduledTask = row => {
+    if (row) {
+      nextTick(() => {
+        formDiaRef.value?.openDialog("edit", row);
+      });
+    }
+  };
 
-const delScheduledTaskByIds = async (ids) => {
-  try {
-    await ElMessageBox.confirm('纭畾鍒犻櫎閫変腑鐨勫畾鏃朵换鍔″悧锛�', '鎻愮ず', {
-      type: 'warning',
+  const delScheduledTaskByIds = async ids => {
+    try {
+      await ElMessageBox.confirm("纭畾鍒犻櫎閫変腑鐨勫畾鏃朵换鍔″悧锛�", "鎻愮ず", {
+        type: "warning",
+      });
+      const payload = Array.isArray(ids) ? ids : [ids];
+      await deviceMaintenanceTaskDel(payload);
+      ElMessage.success("鍒犻櫎瀹氭椂浠诲姟鎴愬姛");
+      getScheduledTableData();
+    } catch (error) {
+      // 鐢ㄦ埛鍙栨秷鍒犻櫎
+    }
+  };
+
+  const handleScheduledOut = () => {
+    ElMessage.info("瀵煎嚭瀹氭椂浠诲姟鍔熻兘寰呭疄鐜�");
+  };
+
+  // 浠诲姟璁板綍鐩稿叧鏂规硶锛堝師璁惧淇濆吇椤甸潰鏂规硶锛�
+  const getTableData = async () => {
+    try {
+      const params = {
+        current: pagination.value.currentPage,
+        size: pagination.value.pageSize,
+        deviceName: filters.deviceName || undefined,
+        maintenancePlanTime: filters.maintenancePlanTime
+          ? dayjs(filters.maintenancePlanTime).format("YYYY-MM-DD")
+          : undefined,
+        maintenanceActuallyTime: filters.maintenanceActuallyTime
+          ? dayjs(filters.maintenanceActuallyTime).format("YYYY-MM-DD")
+          : undefined,
+        maintenanceActuallyName: filters.maintenanceActuallyName || undefined,
+      };
+
+      const { code, data } = await getUpkeepPage(params);
+      if (code === 200) {
+        dataList.value = data.records;
+        pagination.value.total = data.total;
+      }
+    } catch (error) {
+      console.log(error);
+    }
+  };
+
+  const resetFilters = () => {
+    filters.deviceName = "";
+    filters.maintenancePlanTime = "";
+    filters.maintenanceActuallyTime = "";
+    filters.maintenanceActuallyName = "";
+    getTableData();
+  };
+
+  const handleSelectionChange = selection => {
+    multipleList.value = selection;
+  };
+
+  // 妫�鏌ラ�変腑鐨勮褰曚腑鏄惁鏈夊畬缁撶姸鎬佺殑
+  const hasFinishedStatus = computed(() => {
+    return multipleList.value.some(item => item.status === 1);
+  });
+
+  const changePage = page => {
+    pagination.value.currentPage = page.page;
+    pagination.value.pageSize = page.limit;
+    getTableData();
+  };
+
+  const addMaintain = row => {
+    maintainModalRef.value.open(row.id, row);
+  };
+
+  const addPlan = () => {
+    planModalRef.value.openModal();
+  };
+
+  const editPlan = id => {
+    planModalRef.value.openEdit(id);
+  };
+
+  const delRepairByIds = async ids => {
+    // 妫�鏌ユ槸鍚︽湁瀹岀粨鐘舵�佺殑璁板綍
+    const hasFinished = multipleList.value.some(item => item.status === 1);
+    if (hasFinished) {
+      ElMessage.warning("涓嶈兘鍒犻櫎鐘舵�佷负瀹岀粨鐨勮褰�");
+      return;
+    }
+
+    try {
+      await ElMessageBox.confirm("纭鍒犻櫎淇濆吇鏁版嵁, 姝ゆ搷浣滀笉鍙��?", "璀﹀憡", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning",
+      });
+
+      const { code } = await delUpkeep(ids);
+      if (code === 200) {
+        ElMessage.success("鍒犻櫎鎴愬姛");
+        getTableData();
+      }
+    } catch (error) {
+      // 鐢ㄦ埛鍙栨秷鍒犻櫎
+    }
+  };
+
+  const handleOut = () => {
+    ElMessageBox.confirm("閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�", "瀵煎嚭", {
+      confirmButtonText: "纭",
+      cancelButtonText: "鍙栨秷",
+      type: "warning",
     })
-    const payload = Array.isArray(ids) ? ids : [ids]
-    await deviceMaintenanceTaskDel(payload)
-    ElMessage.success('鍒犻櫎瀹氭椂浠诲姟鎴愬姛')
-    getScheduledTableData()
-  } catch (error) {
-    // 鐢ㄦ埛鍙栨秷鍒犻櫎
-  }
-}
+      .then(() => {
+        proxy.download("/device/maintenance/export", {}, "璁惧淇濆吇.xlsx");
+      })
+      .catch(() => {
+        ElMessage.info("宸插彇娑�");
+      });
+  };
 
-const handleScheduledOut = () => {
-  ElMessage.info('瀵煎嚭瀹氭椂浠诲姟鍔熻兘寰呭疄鐜�')
-}
-
-// 浠诲姟璁板綍鐩稿叧鏂规硶锛堝師璁惧淇濆吇椤甸潰鏂规硶锛�
-const getTableData = async () => {
-  try {
-    const params = {
-      current: pagination.value.currentPage,
-      size: pagination.value.pageSize,
-      deviceName: filters.deviceName || undefined,
-      maintenancePlanTime: filters.maintenancePlanTime ? dayjs(filters.maintenancePlanTime).format('YYYY-MM-DD') : undefined,
-      maintenanceActuallyTime: filters.maintenanceActuallyTime ? dayjs(filters.maintenanceActuallyTime).format('YYYY-MM-DD') : undefined,
-      maintenanceActuallyName: filters.maintenanceActuallyName || undefined,
+  const handleDateChange = (date, type) => {
+    if (type === 1) {
+      filters.maintenanceActuallyTime = date
+        ? dayjs(date).format("YYYY-MM-DD")
+        : "";
+    } else {
+      filters.maintenancePlanTime = date ? dayjs(date).format("YYYY-MM-DD") : "";
     }
+    getTableData();
+  };
 
-    const { code, data } = await getUpkeepPage(params)
-    if (code === 200) {
-      dataList.value = data.records
-      pagination.value.total = data.total
+  // 闄勪欢鐩稿叧鏂规硶
+  // 鏌ヨ闄勪欢鍒楄〃
+  const fetchMaintenanceTaskFiles = async deviceMaintenanceId => {
+    try {
+      const params = {
+        current: 1,
+        size: 100,
+        deviceMaintenanceId,
+        rulesRegulationsManagementId: deviceMaintenanceId,
+      };
+      const res = await listMaintenanceTaskFiles(params);
+      const records = res?.data?.records || [];
+      const mapped = records.map(item => ({
+        id: item.id,
+        name: item.fileName || item.name,
+        url: item.fileUrl || item.url,
+        raw: item,
+      }));
+      fileListDialogRef.value?.setList(mapped);
+    } catch (error) {
+      ElMessage.error("鑾峰彇闄勪欢鍒楄〃澶辫触");
     }
-  } catch (error) {
-    console.log(error);
-    
-  }
-}
+  };
 
-const resetFilters = () => {
-  filters.deviceName = ''
-  filters.maintenancePlanTime = ''
-  filters.maintenanceActuallyTime = ''
-  filters.maintenanceActuallyName = ''
-  getTableData()
-}
+  // 鎵撳紑璇︽儏寮圭獥
+  const openFileDialog = row => {
+    currentDetailRow.value = row;
+    detailDialogVisible.value = true;
+  };
 
-const handleSelectionChange = (selection) => {
-  multipleList.value = selection
-}
+  // 鎵撳紑闄勪欢寮圭獥
+  const openAttachmentDialog = async row => {
+    currentMaintenanceTaskId.value = row.id;
+    fileDialogVisible.value = true;
+    await fetchMaintenanceTaskFiles(row.id);
+  };
 
-// 妫�鏌ラ�変腑鐨勮褰曚腑鏄惁鏈夊畬缁撶姸鎬佺殑
-const hasFinishedStatus = computed(() => {
-  return multipleList.value.some(item => item.status === 1)
-})
+  // 鍒锋柊闄勪欢鍒楄〃
+  const refreshFileList = async () => {
+    if (!currentMaintenanceTaskId.value) return;
+    await fetchMaintenanceTaskFiles(currentMaintenanceTaskId.value);
+  };
 
-const changePage = (page) => {
-  pagination.value.currentPage = page.page
-  pagination.value.pageSize = page.limit
-  getTableData()
-}
-
-const addMaintain = (row) => {
-  maintainModalRef.value.open(row.id, row)
-}
-
-const addPlan = () => {
-  planModalRef.value.openModal()
-}
-
-const editPlan = (id) => {
-  planModalRef.value.openEdit(id)
-}
-
-const delRepairByIds = async (ids) => {
-  // 妫�鏌ユ槸鍚︽湁瀹岀粨鐘舵�佺殑璁板綍
-  const hasFinished = multipleList.value.some(item => item.status === 1)
-  if (hasFinished) {
-    ElMessage.warning('涓嶈兘鍒犻櫎鐘舵�佷负瀹岀粨鐨勮褰�')
-    return
-  }
-  
-  try {
-    await ElMessageBox.confirm('纭鍒犻櫎淇濆吇鏁版嵁, 姝ゆ搷浣滀笉鍙��?', '璀﹀憡', {
-      confirmButtonText: '纭畾',
-      cancelButtonText: '鍙栨秷',
-      type: 'warning',
-    })
-    
-    const { code } = await delUpkeep(ids)
-    if (code === 200) {
-      ElMessage.success('鍒犻櫎鎴愬姛')
-      getTableData()
+  // 涓婁紶闄勪欢
+  const handleAttachmentUpload = async filePayload => {
+    if (!currentMaintenanceTaskId.value) return;
+    try {
+      const payload = {
+        name: filePayload?.fileName || filePayload?.name,
+        url: filePayload?.fileUrl || filePayload?.url,
+        deviceMaintenanceId: currentMaintenanceTaskId.value,
+      };
+      await addMaintenanceTaskFile(payload);
+      ElMessage.success("鏂囦欢涓婁紶鎴愬姛");
+      await refreshFileList();
+    } catch (error) {
+      ElMessage.error("鏂囦欢涓婁紶澶辫触");
     }
-  } catch (error) {
-    // 鐢ㄦ埛鍙栨秷鍒犻櫎
-  }
-}
+  };
 
-const handleOut = () => {
-  ElMessageBox.confirm('閫変腑鐨勫唴瀹瑰皢琚鍑猴紝鏄惁纭瀵煎嚭锛�', '瀵煎嚭', {
-    confirmButtonText: '纭',
-    cancelButtonText: '鍙栨秷',
-    type: 'warning',
-  })
-    .then(() => {
-      proxy.download('/device/maintenance/export', {}, '璁惧淇濆吇.xlsx')
-    })
-    .catch(() => {
-      ElMessage.info('宸插彇娑�')
-    })
-}
-
-const handleDateChange = (date, type) => {
-  if (type === 1) {
-    filters.maintenanceActuallyTime = date ? dayjs(date).format('YYYY-MM-DD') : ''
-  } else {
-    filters.maintenancePlanTime = date ? dayjs(date).format('YYYY-MM-DD') : ''
-  }
-  getTableData()
-}
-
-// 闄勪欢鐩稿叧鏂规硶
-// 鏌ヨ闄勪欢鍒楄〃
-const fetchMaintenanceTaskFiles = async (deviceMaintenanceId) => {
-  try {
-    const params = {
-      current: 1,
-      size: 100,
-      deviceMaintenanceId,
-      rulesRegulationsManagementId:deviceMaintenanceId
+  // 鍒犻櫎闄勪欢
+  const handleAttachmentDelete = async row => {
+    if (!row?.id) return false;
+    try {
+      await ElMessageBox.confirm("纭鍒犻櫎璇ラ檮浠讹紵", "鎻愮ず", { type: "warning" });
+    } catch {
+      return false;
     }
-    const res = await listMaintenanceTaskFiles(params)
-    const records = res?.data?.records || []
-    const mapped = records.map(item => ({
-      id: item.id,
-      name: item.fileName || item.name,
-      url: item.fileUrl || item.url,
-      raw: item,
-    }))
-    fileListDialogRef.value?.setList(mapped)
-  } catch (error) {
-    ElMessage.error('鑾峰彇闄勪欢鍒楄〃澶辫触')
-  }
-}
-
-// 鎵撳紑闄勪欢寮圭獥
-const openFileDialog = async (row) => {
-  currentMaintenanceTaskId.value = row.id
-  fileDialogVisible.value = true
-  await fetchMaintenanceTaskFiles(row.id)
-}
-
-// 鍒锋柊闄勪欢鍒楄〃
-const refreshFileList = async () => {
-  if (!currentMaintenanceTaskId.value) return
-  await fetchMaintenanceTaskFiles(currentMaintenanceTaskId.value)
-}
-
-// 涓婁紶闄勪欢
-const handleAttachmentUpload = async (filePayload) => {
-  if (!currentMaintenanceTaskId.value) return
-  try {
-    const payload = {
-      name: filePayload?.fileName || filePayload?.name,
-      url: filePayload?.fileUrl || filePayload?.url,
-      deviceMaintenanceId: currentMaintenanceTaskId.value,
+    try {
+      await delMaintenanceTaskFile(row.id);
+      ElMessage.success("鍒犻櫎鎴愬姛");
+      await refreshFileList();
+      return true;
+    } catch (error) {
+      ElMessage.error("鍒犻櫎澶辫触");
+      return false;
     }
-    await addMaintenanceTaskFile(payload)
-    ElMessage.success('鏂囦欢涓婁紶鎴愬姛')
-    await refreshFileList()
-  } catch (error) {
-    ElMessage.error('鏂囦欢涓婁紶澶辫触')
-  }
-}
+  };
 
-// 鍒犻櫎闄勪欢
-const handleAttachmentDelete = async (row) => {
-  if (!row?.id) return false
-  try {
-    await ElMessageBox.confirm('纭鍒犻櫎璇ラ檮浠讹紵', '鎻愮ず', { type: 'warning' })
-  } catch {
-    return false
-  }
-  try {
-    await delMaintenanceTaskFile(row.id)
-    ElMessage.success('鍒犻櫎鎴愬姛')
-    await refreshFileList()
-    return true
-  } catch (error) {
-    ElMessage.error('鍒犻櫎澶辫触')
-    return false
-  }
-}
-
-onMounted(() => {
-  // 鏍规嵁榛樿婵�娲荤殑 Tab 璋冪敤瀵瑰簲鐨勬煡璇㈡帴鍙�
-  if (activeTab.value === 'scheduled') {
-    getScheduledTableData()
-  } else {
-    getTableData()
-  }
-})
+  onMounted(() => {
+    // 鏍规嵁榛樿婵�娲荤殑 Tab 璋冪敤瀵瑰簲鐨勬煡璇㈡帴鍙�
+    if (activeTab.value === "scheduled") {
+      getScheduledTableData();
+    } else {
+      getTableData();
+    }
+  });
 </script>
 
 <style lang="scss" scoped>
-.table_list {
-  margin-top: unset;
-}
-.actions {
-  display: flex;
-  justify-content: space-between;
-  margin-bottom: 10px;
-}
+  .table_list {
+    margin-top: unset;
+  }
+  .actions {
+    display: flex;
+    justify-content: space-between;
+    margin-bottom: 10px;
+  }
 </style>
 
 
diff --git a/src/views/inventoryManagement/receiptManagement/Record.vue b/src/views/inventoryManagement/receiptManagement/Record.vue
index cd103ea..c38012d 100644
--- a/src/views/inventoryManagement/receiptManagement/Record.vue
+++ b/src/views/inventoryManagement/receiptManagement/Record.vue
@@ -83,6 +83,10 @@
             {{ getRecordType(scope.row.recordType) }}
           </template>
         </el-table-column>
+        <el-table-column label="杩囩鏃ユ湡"
+                         prop="weighingDate"
+                         v-if="type === '0'"
+                         show-overflow-tooltip/>
       </el-table>
       <pagination v-show="total > 0"
                   :total="total"
diff --git a/src/views/inventoryManagement/stockManagement/New.vue b/src/views/inventoryManagement/stockManagement/New.vue
index 1f86fd6..5d3ac53 100644
--- a/src/views/inventoryManagement/stockManagement/New.vue
+++ b/src/views/inventoryManagement/stockManagement/New.vue
@@ -51,6 +51,30 @@
         >
           <el-input-number v-model="formState.warnNum" :step="1" :min="0" :max="formState.qualitity" style="width: 100%" />
         </el-form-item>
+        <!-- productType === 0锛氬師鏉愭枡 -->
+        <el-form-item
+            v-if="type === 'qualified' && formState.productType === 0"
+            label="杩囩鏃ユ湡"
+            prop="weighingDate"
+        >
+          <el-date-picker
+              style="width: 100%"
+              v-model="formState.weighingDate"
+              value-format="YYYY-MM-DD HH:mm:ss"
+              format="YYYY-MM-DD HH:mm:ss"
+              type="datetime"
+              placeholder="璇烽�夋嫨杩囩鏃ユ湡"
+              clearable
+          />
+        </el-form-item>
+
+        <el-form-item
+            v-if="type === 'qualified' && formState.productType === 0"
+            label="鍑�閲�(鍚�)"
+            prop="netWeight"
+        >
+          <el-input-number v-model="formState.netWeight" :step="0.01" :min="0" style="width: 100%" />
+        </el-form-item>
 
         <el-form-item label="澶囨敞" prop="remark">
           <el-input v-model="formState.remark" type="textarea" />
@@ -101,8 +125,11 @@
   productName: "",
   productModelName: "",
   unit: "",
+  weighingDate: undefined,
+  productType: undefined,
   qualitity: 0,
   warnNum: 0,
+  netWeight: undefined,
   remark: '',
 });
 
@@ -133,6 +160,8 @@
 
 // 浜у搧閫夋嫨澶勭悊
 const handleProductSelect = async (products) => {
+  formState.value.weighingDate = undefined;
+  formState.value.netWeight = undefined;
   if (products && products.length > 0) {
     const product = products[0];
     formState.value.productId = product.productId;
@@ -140,6 +169,7 @@
     formState.value.productModelName = product.model;
     formState.value.productModelId = product.id;
     formState.value.unit = product.unit;
+    formState.value.productType = product.productType;
     showProductSelectDialog.value = false;
     // 瑙﹀彂琛ㄥ崟楠岃瘉鏇存柊
     proxy.$refs["formRef"]?.validateField('productModelId');
diff --git a/src/views/inventoryManagement/stockManagement/Qualified.vue b/src/views/inventoryManagement/stockManagement/Qualified.vue
index 8b15db1..d463b5e 100644
--- a/src/views/inventoryManagement/stockManagement/Qualified.vue
+++ b/src/views/inventoryManagement/stockManagement/Qualified.vue
@@ -23,12 +23,14 @@
         :row-class-name="tableRowClassName" height="calc(100vh - 18.5em)">
         <el-table-column align="center" type="selection" width="55" />
         <el-table-column align="center" label="搴忓彿" type="index" width="60" />
+        <el-table-column label="浜у搧绫诲瀷" prop="parentName" show-overflow-tooltip />
         <el-table-column label="浜у搧澶х被" prop="productName" show-overflow-tooltip />
         <el-table-column label="瑙勬牸鍨嬪彿" prop="model" show-overflow-tooltip />
         <el-table-column label="鍗曚綅" prop="unit" show-overflow-tooltip />
         <el-table-column label="搴撳瓨鏁伴噺" prop="qualitity" show-overflow-tooltip />
         <el-table-column label="鍐荤粨鏁伴噺" prop="lockedQuantity" show-overflow-tooltip />
         <el-table-column label="搴撳瓨棰勮鏁伴噺" prop="warnNum"  show-overflow-tooltip />
+        <el-table-column label="鍑�閲�(鍚�)" prop="netWeight"  show-overflow-tooltip />
         <el-table-column label="澶囨敞" prop="remark"  show-overflow-tooltip />
         <el-table-column label="鏈�杩戞洿鏂版椂闂�" prop="updateTime" show-overflow-tooltip />
         <el-table-column fixed="right" label="鎿嶄綔" min-width="60" align="center">

--
Gitblit v1.9.3