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) çæ¬ã * é å¥å端代ç ä»åºå°å[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)ã * é¿éäºææ£åºï¼[ç¹æè¿å ¥](http://aly.ruoyi.vip)ï¼è ¾è®¯äºç§æåºï¼[ç¹æè¿å ¥](http://txy.ruoyi.vip) - æ¬ä»åºä¸ºåç«¯ææ¯æ [Vue3](https://v3.cn.vuejs.org) + [Element Plus](https://element-plus.org/zh-CN) + [Vite](https://cn.vitejs.dev) çæ¬ã - é å¥å端代ç ä»åºå°å[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)ã - é¿éäºææ£åºï¼[ç¹æè¿å ¥](http://aly.ruoyi.vip)ï¼è ¾è®¯äºç§æåºï¼[ç¹æè¿å ¥](http://txy.ruoyi.vip) ## å端è¿è¡ @@ -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. 代ç çæï¼åå端代ç ççæï¼javaãhtmlãxmlãsqlï¼æ¯æCRUDä¸è½½ ã 14. ç³»ç»æ¥å£ï¼æ ¹æ®ä¸å¡ä»£ç èªå¨çæç¸å ³çapiæ¥å£ææ¡£ã 15. æå¡çæ§ï¼çè§å½åç³»ç»CPUãå åãç£çãå æ çç¸å ³ä¿¡æ¯ã 13. 代ç çæï¼åå端代ç ççæï¼javaãhtmlãxmlãsqlï¼æ¯æ CRUD ä¸è½½ ã 14. ç³»ç»æ¥å£ï¼æ ¹æ®ä¸å¡ä»£ç èªå¨çæç¸å ³ç api æ¥å£ææ¡£ã 15. æå¡çæ§ï¼çè§å½åç³»ç» CPUãå åãç£çãå æ çç¸å ³ä¿¡æ¯ã 16. ç¼åçæ§ï¼å¯¹ç³»ç»çç¼åä¿¡æ¯æ¥è¯¢ï¼å½ä»¤ç»è®¡çã 17. å¨çº¿æå»ºå¨ï¼æå¨è¡¨åå ç´ çæç¸åºçHTML代ç ã 18. è¿æ¥æ± çè§ï¼çè§å½åç³»ç»æ°æ®åºè¿æ¥æ± ç¶æï¼å¯è¿è¡åæSQLæ¾åºç³»ç»æ§è½ç¶é¢ã 17. å¨çº¿æå»ºå¨ï¼æå¨è¡¨åå ç´ çæç¸åºç HTML 代ç ã 18. è¿æ¥æ± çè§ï¼çè§å½åç³»ç»æ°æ®åºè¿æ¥æ± ç¶æï¼å¯è¿è¡åæ SQL æ¾åºç³»ç»æ§è½ç¶é¢ã ## å¨çº¿ä½éª - admin/admin123 - admin/admin123 - ééç»ç»æ¶å°ä¸äºæèµï¼ä¸ºäºæ´å¥½çä½éªå·²ç¨äºæ¼ç¤ºæå¡å¨å级ã谢谢åä½å°ä¼ä¼´ã æ¼ç¤ºå°åï¼http://vue.ruoyi.vip @@ -103,7 +103,6 @@ </tr> </table> ## è¥ä¾åå端å离交æµç¾¤ QQç¾¤ï¼ [](https://jq.qq.com/?_wv=1027&k=5bVB1og) [](https://jq.qq.com/?_wv=1027&k=5eiA4DH) [](https://jq.qq.com/?_wv=1027&k=5AxMKlC) [](https://jq.qq.com/?_wv=1027&k=51G72yr) [](https://jq.qq.com/?_wv=1027&k=VvjN2nvu) [](https://jq.qq.com/?_wv=1027&k=5vYAqA05) [](https://jq.qq.com/?_wv=1027&k=kOIINEb5) [](https://jq.qq.com/?_wv=1027&k=UKtX5jhs) [](https://jq.qq.com/?_wv=1027&k=EI9an8lJ) [](https://jq.qq.com/?_wv=1027&k=SWCtLnMz) [](https://jq.qq.com/?_wv=1027&k=96Dkdq0k) [](https://jq.qq.com/?_wv=1027&k=0fsNiYZt) [](https://jq.qq.com/?_wv=1027&k=7xw4xUG1) [](https://jq.qq.com/?_wv=1027&k=eCx8eyoJ) [](https://jq.qq.com/?_wv=1027&k=SpyH2875) [](https://jq.qq.com/?_wv=1027&k=tKEt51dz) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=0vBbSb0ztbBgVtn3kJS-Q4HUNYwip89G&authKey=8irq5PhutrZmWIvsUsklBxhj57l%2F1nOZqjzigkXZVoZE451GG4JHPOqW7AW6cf0T&noverify=0&group_code=143961921) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=ZFAPAbp09S2ltvwrJzp7wGlbopsc0rwi&authKey=HB2cxpxP2yspk%2Bo3WKTBfktRCccVkU26cgi5B16u0KcAYrVu7sBaE7XSEqmMdFQp&noverify=0&group_code=174951577) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=Fn2aF5IHpwsy8j6VlalNJK6qbwFLFHat&authKey=uyIT%2B97x2AXj3odyXpsSpVaPMC%2Bidw0LxG5MAtEqlrcBcWJUA%2FeS43rsF1Tg7IRJ&noverify=0&group_code=161281055) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=XIzkm_mV2xTsUtFxo63bmicYoDBA6Ifm&authKey=dDW%2F4qsmw3x9govoZY9w%2FoWAoC4wbHqGal%2BbqLzoS6VBarU8EBptIgPKN%2FviyC8j&noverify=0&group_code=138988063) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=DkugnCg68PevlycJSKSwjhFqfIgrWWwR&authKey=pR1Pa5lPIeGF%2FFtIk6d%2FGB5qFi0EdvyErtpQXULzo03zbhopBHLWcuqdpwY241R%2F&noverify=0&group_code=151450850) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=F58bgRa-Dp-rsQJThiJqIYv8t4-lWfXh&authKey=UmUs4CVG5OPA1whvsa4uSespOvyd8%2FAr9olEGaWAfdLmfKQk%2FVBp2YU3u2xXXt76&noverify=0&group_code=224622315) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=Nxb2EQ5qozWa218Wbs7zgBnjLSNk_tVT&authKey=obBKXj6SBKgrFTJZx0AqQnIYbNOvBB2kmgwWvGhzxR67RoRr84%2Bus5OadzMcdJl5&noverify=0&group_code=287842588) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=numtK1M_I4eVd2Gvg8qtbuL8JgX42qNh&authKey=giV9XWMaFZTY%2FqPlmWbkB9g3fi0Ev5CwEtT9Tgei0oUlFFCQLDp4ozWRiVIzubIm&noverify=0&group_code=187944233) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=G6r5KGCaa3pqdbUSXNIgYloyb8e0_L0D&authKey=4w8tF1eGW7%2FedWn%2FHAypQksdrML%2BDHolQSx7094Agm7Luakj9EbfPnSTxSi2T1LQ&noverify=0&group_code=228578329) ç¹å»æé®å ¥ç¾¤ã QQ ç¾¤ï¼ [](https://jq.qq.com/?_wv=1027&k=5bVB1og) [](https://jq.qq.com/?_wv=1027&k=5eiA4DH) [](https://jq.qq.com/?_wv=1027&k=5AxMKlC) [](https://jq.qq.com/?_wv=1027&k=51G72yr) [](https://jq.qq.com/?_wv=1027&k=VvjN2nvu) [](https://jq.qq.com/?_wv=1027&k=5vYAqA05) [](https://jq.qq.com/?_wv=1027&k=kOIINEb5) [](https://jq.qq.com/?_wv=1027&k=UKtX5jhs) [](https://jq.qq.com/?_wv=1027&k=EI9an8lJ) [](https://jq.qq.com/?_wv=1027&k=SWCtLnMz) [](https://jq.qq.com/?_wv=1027&k=96Dkdq0k) [](https://jq.qq.com/?_wv=1027&k=0fsNiYZt) [](https://jq.qq.com/?_wv=1027&k=7xw4xUG1) [](https://jq.qq.com/?_wv=1027&k=eCx8eyoJ) [](https://jq.qq.com/?_wv=1027&k=SpyH2875) [](https://jq.qq.com/?_wv=1027&k=tKEt51dz) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=0vBbSb0ztbBgVtn3kJS-Q4HUNYwip89G&authKey=8irq5PhutrZmWIvsUsklBxhj57l%2F1nOZqjzigkXZVoZE451GG4JHPOqW7AW6cf0T&noverify=0&group_code=143961921) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=ZFAPAbp09S2ltvwrJzp7wGlbopsc0rwi&authKey=HB2cxpxP2yspk%2Bo3WKTBfktRCccVkU26cgi5B16u0KcAYrVu7sBaE7XSEqmMdFQp&noverify=0&group_code=174951577) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=Fn2aF5IHpwsy8j6VlalNJK6qbwFLFHat&authKey=uyIT%2B97x2AXj3odyXpsSpVaPMC%2Bidw0LxG5MAtEqlrcBcWJUA%2FeS43rsF1Tg7IRJ&noverify=0&group_code=161281055) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=XIzkm_mV2xTsUtFxo63bmicYoDBA6Ifm&authKey=dDW%2F4qsmw3x9govoZY9w%2FoWAoC4wbHqGal%2BbqLzoS6VBarU8EBptIgPKN%2FviyC8j&noverify=0&group_code=138988063) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=DkugnCg68PevlycJSKSwjhFqfIgrWWwR&authKey=pR1Pa5lPIeGF%2FFtIk6d%2FGB5qFi0EdvyErtpQXULzo03zbhopBHLWcuqdpwY241R%2F&noverify=0&group_code=151450850) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=F58bgRa-Dp-rsQJThiJqIYv8t4-lWfXh&authKey=UmUs4CVG5OPA1whvsa4uSespOvyd8%2FAr9olEGaWAfdLmfKQk%2FVBp2YU3u2xXXt76&noverify=0&group_code=224622315) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=Nxb2EQ5qozWa218Wbs7zgBnjLSNk_tVT&authKey=obBKXj6SBKgrFTJZx0AqQnIYbNOvBB2kmgwWvGhzxR67RoRr84%2Bus5OadzMcdJl5&noverify=0&group_code=287842588) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=numtK1M_I4eVd2Gvg8qtbuL8JgX42qNh&authKey=giV9XWMaFZTY%2FqPlmWbkB9g3fi0Ev5CwEtT9Tgei0oUlFFCQLDp4ozWRiVIzubIm&noverify=0&group_code=187944233) [](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=G6r5KGCaa3pqdbUSXNIgYloyb8e0_L0D&authKey=4w8tF1eGW7%2FedWn%2FHAypQksdrML%2BDHolQSx7094Agm7Luakj9EbfPnSTxSi2T1LQ&noverify=0&group_code=228578329) ç¹å»æé®å ¥ç¾¤ã multiple/assets/favicon/KTHGico.ico
multiple/assets/logo/KTHGLogo.png
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", src/api/equipmentManagement/spareParts.js
@@ -20,6 +20,15 @@ }); }; // æ¥è¯¢å¤ä»¶é项 export const getSparePartsOptions = (params) => { return request({ url: "/spareParts/getByIdDeviceId", method: "get", params, }); }; /** * @desc æ°å¢ */ 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" /> 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="å£åº¦" 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) // 妿æè®¾å¤IDï¼èªå¨è®¾ç½®è®¾å¤ä¿¡æ¯ 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() } // éç½®è¡¨åæ°æ®ç¡®ä¿è®¾å¤ä¿¡æ¯æ£ç¡®éç½® 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); // 妿æè®¾å¤IDï¼èªå¨è®¾ç½®è®¾å¤ä¿¡æ¯ // 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(); } // éç½®è¡¨åæ°æ®ç¡®ä¿è®¾å¤ä¿¡æ¯æ£ç¡®éç½® 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> 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 å ³é®åçä½ç½®ï¼ä»é£éå¼å§æåç¸å¯¹è·¯å¾ const uploadsIndex = fileUrl.toLowerCase().indexOf('uploads'); if (uploadsIndex > -1) { // ä» uploads å¼å§æåè·¯å¾ï¼å¹¶å°åææ æ¿æ¢ä¸ºæ£ææ 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 å ³é®åçä½ç½®ï¼ä»é£éå¼å§æåç¸å¯¹è·¯å¾ const uploadsIndex = fileUrl.toLowerCase().indexOf("uploads"); if (uploadsIndex > -1) { // ä» uploads å¼å§æåè·¯å¾ï¼å¹¶å°åææ æ¿æ¢ä¸ºæ£ææ 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) => { // ä½¿ç¨æ£ç¡®çåæ®µåï¼commonFileListBefore, 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 => { // ä½¿ç¨æ£ç¡®çåæ®µåï¼commonFileListBefore, 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> 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: "卿¥", }; // ä½¿ç¨æ£å䏿¬¡æ§æ¿æ¢ææå¹é 项 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: "å£åº¦" // }[val] || "") formatData: params => { return params === "DAILY" ? "æ¯æ¥" : params === "WEEKLY" ? "æ¯å¨" : params === "MONTHLY" ? "æ¯æ" : params === "QUARTERLY" ? "å£åº¦" : ""; }, }, { 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; 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({ 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; }; 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> 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({ 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: "å£åº¦" }[cell] || "") }, { prop: "frequencyDetail", label: "å¼å§æ¥æä¸æ¶é´", minWidth: 150, // åæ ·æ¹ç¨ formatDataï¼PIMTable å é¨ä¼æåå æ ¼å¼ä¼ è¿æ¥ formatData: (cell) => { if (typeof cell !== 'string') return ''; let val = cell; const replacements = { MON: 'å¨ä¸', TUE: 'å¨äº', WED: 'å¨ä¸', THU: 'å¨å', FRI: 'å¨äº', SAT: 'å¨å ', SUN: '卿¥' }; // ä½¿ç¨æ£å䏿¬¡æ§æ¿æ¢ææå¹é 项 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: "å£åº¦", }[cell] || ""), }, { prop: "frequencyDetail", label: "å¼å§æ¥æä¸æ¶é´", minWidth: 150, // åæ ·æ¹ç¨ formatDataï¼PIMTable å é¨ä¼æåå æ ¼å¼ä¼ è¿æ¥ formatData: cell => { if (typeof cell !== "string") return ""; let val = cell; const replacements = { MON: "å¨ä¸", TUE: "å¨äº", WED: "å¨ä¸", THU: "å¨å", FRI: "å¨äº", SAT: "å¨å ", SUN: "卿¥", }; // ä½¿ç¨æ£å䏿¬¡æ§æ¿æ¢ææå¹é 项 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> 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" 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'); 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">