| | |
| | | # 页颿 é¢
|
| | | VITE_APP_TITLE = è¯å¯¼äºï¼ç®¡çä¿¡æ¯ç³»ç»ï¼
|
| | | VITE_APP_TITLE = è¯å¯¼-ç¯ä¿é¨ç¦ç³»ç»
|
| | |
|
| | | # å¼åç¯å¢é
ç½®
|
| | | VITE_APP_ENV = 'development'
|
| | |
| | | # 页颿 é¢
|
| | | VITE_APP_TITLE = MISï¼ç®¡çä¿¡æ¯ç³»ç»ï¼
|
| | | VITE_APP_TITLE = è¯å¯¼-ç¯ä¿é¨ç¦ç³»ç»
|
| | |
|
| | | # ç产ç¯å¢é
ç½®
|
| | | VITE_APP_ENV = 'production'
|
| | |
| | | <p align="center">
|
| | | <img alt="logo" src="https://oscimg.oschina.net/oscnet/up-d3d0a9303e11d522a06cd263f3079027715.png">
|
| | | </p>
|
| | | <h1 align="center" style="margin: 30px 0 30px; font-weight: bold;">RuoYi v3.8.9</h1>
|
| | | <h4 align="center">åºäºSpringBoot+Vue3åå端å离çJavaå¿«éå¼åæ¡æ¶</h4>
|
| | | <p align="center">
|
| | | <a href="https://gitee.com/y_project/RuoYi-Vue/stargazers"><img src="https://gitee.com/y_project/RuoYi-Vue/badge/star.svg?theme=dark"></a>
|
| | | <a href="https://gitee.com/y_project/RuoYi-Vue"><img src="https://img.shields.io/badge/RuoYi-v3.8.9-brightgreen.svg"></a>
|
| | | <a href="https://gitee.com/y_project/RuoYi-Vue/blob/master/LICENSE"><img src="https://img.shields.io/github/license/mashape/apistatus.svg"></a>
|
| | | </p>
|
| | |
|
| | | ## å¹³å°ç®ä»
|
| | |
|
| | | * æ¬ä»åºä¸ºåç«¯ææ¯æ [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)
|
| | |
|
| | | ## å端è¿è¡
|
| | |
|
| | | ```bash
|
| | | # å
é项ç®
|
| | | git clone https://github.com/yangzongzhuan/RuoYi-Vue3.git
|
| | |
|
| | | # è¿å
¥é¡¹ç®ç®å½
|
| | | cd RuoYi-Vue3
|
| | |
|
| | | # å®è£
ä¾èµ
|
| | | yarn --registry=https://registry.npmmirror.com
|
| | |
|
| | | # å¯å¨æå¡
|
| | | yarn dev
|
| | |
|
| | | # æå»ºæµè¯ç¯å¢ yarn build:stage
|
| | | # æå»ºç产ç¯å¢ yarn build:prod
|
| | | # å端访é®å°å http://localhost:80
|
| | | ```
|
| | |
|
| | | ## å
ç½®åè½
|
| | |
|
| | | 1. ç¨æ·ç®¡çï¼ç¨æ·æ¯ç³»ç»æä½è
ï¼è¯¥åè½ä¸»è¦å®æç³»ç»ç¨æ·é
ç½®ã
|
| | | 2. é¨é¨ç®¡çï¼é
置系ç»ç»ç»æºæï¼å
¬å¸ãé¨é¨ãå°ç»ï¼ï¼æ ç»æå±ç°æ¯ææ°æ®æéã
|
| | | 3. å²ä½ç®¡çï¼é
置系ç»ç¨æ·æå±æ
ä»»èå¡ã
|
| | | 4. èå管çï¼é
置系ç»èåï¼æä½æéï¼æé®æéæ è¯çã
|
| | | 5. è§è²ç®¡çï¼è§è²èåæéåé
ã设置è§è²ææºæè¿è¡æ°æ®èå´æéååã
|
| | | 6. åå
¸ç®¡çï¼å¯¹ç³»ç»ä¸ç»å¸¸ä½¿ç¨çä¸äºè¾ä¸ºåºå®çæ°æ®è¿è¡ç»´æ¤ã
|
| | | 7. åæ°ç®¡çï¼å¯¹ç³»ç»å¨æé
置常ç¨åæ°ã
|
| | | 8. éç¥å
¬åï¼ç³»ç»éç¥å
¬åä¿¡æ¯åå¸ç»´æ¤ã
|
| | | 9. æä½æ¥å¿ï¼ç³»ç»æ£å¸¸æä½æ¥å¿è®°å½åæ¥è¯¢ï¼ç³»ç»å¼å¸¸ä¿¡æ¯æ¥å¿è®°å½åæ¥è¯¢ã
|
| | | 10. ç»å½æ¥å¿ï¼ç³»ç»ç»å½æ¥å¿è®°å½æ¥è¯¢å
å«ç»å½å¼å¸¸ã
|
| | | 11. å¨çº¿ç¨æ·ï¼å½åç³»ç»ä¸æ´»è·ç¨æ·ç¶æçæ§ã
|
| | | 12. 宿¶ä»»å¡ï¼å¨çº¿ï¼æ·»å ãä¿®æ¹ãå é¤)ä»»å¡è°åº¦å
嫿§è¡ç»ææ¥å¿ã
|
| | | 13. 代ç çæï¼åå端代ç ççæï¼javaãhtmlãxmlãsqlï¼æ¯æCRUDä¸è½½ ã
|
| | | 14. ç³»ç»æ¥å£ï¼æ ¹æ®ä¸å¡ä»£ç èªå¨çæç¸å
³çapiæ¥å£ææ¡£ã
|
| | | 15. æå¡çæ§ï¼çè§å½åç³»ç»CPUãå
åãç£çãå æ çç¸å
³ä¿¡æ¯ã
|
| | | 16. ç¼åçæ§ï¼å¯¹ç³»ç»çç¼åä¿¡æ¯æ¥è¯¢ï¼å½ä»¤ç»è®¡çã
|
| | | 17. å¨çº¿æå»ºå¨ï¼æå¨è¡¨åå
ç´ çæç¸åºçHTML代ç ã
|
| | | 18. è¿æ¥æ± çè§ï¼çè§å½åç³»ç»æ°æ®åºè¿æ¥æ± ç¶æï¼å¯è¿è¡åæSQLæ¾åºç³»ç»æ§è½ç¶é¢ã
|
| | |
|
| | | ## å¨çº¿ä½éª
|
| | |
|
| | | - admin/admin123 |
| | | - ééç»ç»æ¶å°ä¸äºæèµï¼ä¸ºäºæ´å¥½çä½éªå·²ç¨äºæ¼ç¤ºæå¡å¨å级ã谢谢åä½å°ä¼ä¼´ã
|
| | |
|
| | | æ¼ç¤ºå°åï¼http://vue.ruoyi.vip |
| | | ææ¡£å°åï¼http://doc.ruoyi.vip
|
| | |
|
| | | ## æ¼ç¤ºå¾
|
| | |
|
| | | <table>
|
| | | <tr>
|
| | | <td><img src="https://oscimg.oschina.net/oscnet/cd1f90be5f2684f4560c9519c0f2a232ee8.jpg"/></td>
|
| | | <td><img src="https://oscimg.oschina.net/oscnet/1cbcf0e6f257c7d3a063c0e3f2ff989e4b3.jpg"/></td>
|
| | | </tr>
|
| | | <tr>
|
| | | <td><img src="https://oscimg.oschina.net/oscnet/up-8074972883b5ba0622e13246738ebba237a.png"/></td>
|
| | | <td><img src="https://oscimg.oschina.net/oscnet/up-9f88719cdfca9af2e58b352a20e23d43b12.png"/></td>
|
| | | </tr>
|
| | | <tr>
|
| | | <td><img src="https://oscimg.oschina.net/oscnet/up-39bf2584ec3a529b0d5a3b70d15c9b37646.png"/></td>
|
| | | <td><img src="https://oscimg.oschina.net/oscnet/up-936ec82d1f4872e1bc980927654b6007307.png"/></td>
|
| | | </tr>
|
| | | <tr>
|
| | | <td><img src="https://oscimg.oschina.net/oscnet/up-b2d62ceb95d2dd9b3fbe157bb70d26001e9.png"/></td>
|
| | | <td><img src="https://oscimg.oschina.net/oscnet/up-d67451d308b7a79ad6819723396f7c3d77a.png"/></td>
|
| | | </tr> |
| | | <tr>
|
| | | <td><img src="https://oscimg.oschina.net/oscnet/5e8c387724954459291aafd5eb52b456f53.jpg"/></td>
|
| | | <td><img src="https://oscimg.oschina.net/oscnet/644e78da53c2e92a95dfda4f76e6d117c4b.jpg"/></td>
|
| | | </tr>
|
| | | <tr>
|
| | | <td><img src="https://oscimg.oschina.net/oscnet/up-8370a0d02977eebf6dbf854c8450293c937.png"/></td>
|
| | | <td><img src="https://oscimg.oschina.net/oscnet/up-49003ed83f60f633e7153609a53a2b644f7.png"/></td>
|
| | | </tr>
|
| | | <tr>
|
| | | <td><img src="https://oscimg.oschina.net/oscnet/up-d4fe726319ece268d4746602c39cffc0621.png"/></td>
|
| | | <td><img src="https://oscimg.oschina.net/oscnet/up-c195234bbcd30be6927f037a6755e6ab69c.png"/></td>
|
| | | </tr>
|
| | | <tr>
|
| | | <td><img src="https://oscimg.oschina.net/oscnet/b6115bc8c31de52951982e509930b20684a.jpg"/></td>
|
| | | <td><img src="https://oscimg.oschina.net/oscnet/up-5e4daac0bb59612c5038448acbcef235e3a.png"/></td>
|
| | | </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) ç¹å»æé®å
¥ç¾¤ã |
| | | ## ç¯ä¿é¨ç¦ç³»ç»-è¯å¯¼
|
| | |
| | | <meta name="renderer" content="webkit">
|
| | | <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
|
| | | <link rel="icon" href="/favicon.ico">
|
| | | <title>MISï¼ç®¡çä¿¡æ¯ç³»ç»ï¼</title>
|
| | | <title>è¯å¯¼-ç¯ä¿é¨ç¦ç³»ç»</title>
|
| | | <!--[if lt IE 11]><script>window.location.href='/html/ie.html';</script><![endif]-->
|
| | | <style>
|
| | | html,
|
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form :model="filters" :inline="true"> |
| | | <el-form-item label="é¨ç¦åç§°"> |
| | | <div class="search_form"> |
| | | <div> |
| | | <span class="search_title">é¨ç¦åç§°ï¼</span> |
| | | <el-input |
| | | v-model="filters.name" |
| | | style="width: 240px" |
| | | placeholder="请è¾å
¥é¨ç¦åç§°" |
| | | clearable |
| | | :prefix-icon="Search" |
| | | @change="getTableData" |
| | | v-model="searchForm.customerName" |
| | | style="width: 240px" |
| | | placeholder="请è¾å
¥" |
| | | @change="handleQuery" |
| | | clearable |
| | | :prefix-icon="Search" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="é¨ç¦ç¶æ"> |
| | | <el-select |
| | | v-model="filters.status" |
| | | style="width: 240px" |
| | | placeholder="è¯·éæ©é¨ç¦ç¶æ" |
| | | clearable |
| | | @change="getTableData" |
| | | <el-button type="primary" @click="handleQuery" style="margin-left: 10px" |
| | | >æç´¢</el-button |
| | | > |
| | | <el-option label="æ£å¸¸" value="1"></el-option> |
| | | <el-option label="å¼å¸¸" value="0"></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="åºå"> |
| | | <el-input |
| | | v-model="filters.area" |
| | | 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 @click="resetFilters">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | <div class="table_list"> |
| | | <div class="actions"> |
| | | <div></div> |
| | | <div> |
| | | <el-button type="primary" @click="add" icon="Plus"> æ°å¢ </el-button> |
| | | <el-button type="danger" icon="Delete" :disabled="multipleList.length <= 0" @click="batchDelete">æ¹éå é¤</el-button> |
| | | </div> |
| | | </div> |
| | | <PIMTable |
| | | rowKey="id" |
| | | isSelection |
| | | :column="columns" |
| | | :tableData="dataList" |
| | | :page="{ |
| | | current: pagination.currentPage, |
| | | size: pagination.pageSize, |
| | | total: pagination.total, |
| | | }" |
| | | @selection-change="handleSelectionChange" |
| | | @pagination="changePage" |
| | | > |
| | | </PIMTable> |
| | | <div> |
| | | <el-button type="primary" @click="openForm('add')">æ°å¢</el-button> |
| | | <el-button type="danger" plain @click="handleDelete">å é¤</el-button> |
| | | </div> |
| | | </div> |
| | | <!-- æ°å¢ç¼è¾å¼¹çª --> |
| | | <el-dialog v-model="dialogVisible" :title="dialogTitle" width="600px"> |
| | | <el-form :model="formData" label-width="100px"> |
| | | <el-form-item label="é¨ç¦åç§°" required> |
| | | <el-input v-model="formData.name" placeholder="请è¾å
¥é¨ç¦åç§°"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="åºå" required> |
| | | <el-input v-model="formData.area" placeholder="请è¾å
¥åºå"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="ä½ç½®" required> |
| | | <el-input v-model="formData.location" placeholder="请è¾å
¥å
·ä½ä½ç½®"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="ç¶æ" required> |
| | | <el-select v-model="formData.status" placeholder="è¯·éæ©ç¶æ"> |
| | | <el-option label="æ£å¸¸" value="1"></el-option> |
| | | <el-option label="å¼å¸¸" value="0"></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="æè¿°"> |
| | | <el-input v-model="formData.description" type="textarea" rows="3" placeholder="请è¾å
¥æè¿°ä¿¡æ¯"></el-input> |
| | | </el-form-item> |
| | | <div class="table_list"> |
| | | <PIMTable |
| | | rowKey="id" |
| | | :column="tableColumn" |
| | | :tableData="tableData" |
| | | :page="page" |
| | | :isSelection="true" |
| | | @selection-change="handleSelectionChange" |
| | | :tableLoading="tableLoading" |
| | | @pagination="pagination" |
| | | ></PIMTable> |
| | | </div> |
| | | <el-dialog |
| | | v-model="dialogFormVisible" |
| | | :title="operationType === 'add' ? 'æ°å¢é¨ç¦ä¿¡æ¯' : 'ç¼è¾é¨ç¦ä¿¡æ¯'" |
| | | width="70%" |
| | | @close="closeDia" |
| | | > |
| | | <el-form |
| | | :model="form" |
| | | label-width="140px" |
| | | label-position="top" |
| | | :rules="rules" |
| | | ref="formRef" |
| | | > |
| | | <el-row :gutter="30"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="é¨ç¦åç§°ï¼" prop="customerName"> |
| | | <el-input |
| | | v-model="form.customerName" |
| | | placeholder="请è¾å
¥" |
| | | clearable |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item |
| | | label="åºåï¼" |
| | | prop="taxpayerIdentificationNumber" |
| | | > |
| | | <el-input |
| | | v-model="form.taxpayerIdentificationNumber" |
| | | placeholder="请è¾å
¥" |
| | | clearable |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="30"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="ä½ç½®ï¼" prop="companyAddress"> |
| | | <el-input |
| | | v-model="form.companyAddress" |
| | | placeholder="请è¾å
¥" |
| | | clearable |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="30"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="ç»´æ¤äººï¼" prop="maintainer"> |
| | | <el-select |
| | | v-model="form.maintainer" |
| | | placeholder="è¯·éæ©" |
| | | clearable |
| | | disabled |
| | | > |
| | | <el-option |
| | | v-for="item in userList" |
| | | :key="item.nickName" |
| | | :label="item.nickName" |
| | | :value="item.nickName" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="ç»´æ¤æ¶é´ï¼" prop="maintenanceTime"> |
| | | <el-date-picker |
| | | style="width: 100%" |
| | | v-model="form.maintenanceTime" |
| | | value-format="YYYY-MM-DD" |
| | | format="YYYY-MM-DD" |
| | | type="date" |
| | | placeholder="è¯·éæ©" |
| | | clearable |
| | | disabled |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | </el-form> |
| | | <template #footer> |
| | | <span class="dialog-footer"> |
| | | <el-button @click="dialogVisible = false">åæ¶</el-button> |
| | | <el-button type="primary" @click="saveData">ç¡®å®</el-button> |
| | | </span> |
| | | <div class="dialog-footer"> |
| | | <el-button type="primary" @click="submitForm">确认</el-button> |
| | | <el-button @click="closeDia">åæ¶</el-button> |
| | | </div> |
| | | </template> |
| | | </el-dialog> |
| | | <!-- ç¨æ·å¯¼å
¥å¯¹è¯æ¡ --> |
| | | <el-dialog |
| | | :title="upload.title" |
| | | v-model="upload.open" |
| | | width="400px" |
| | | append-to-body |
| | | > |
| | | <el-upload |
| | | ref="uploadRef" |
| | | :limit="1" |
| | | accept=".xlsx, .xls" |
| | | :headers="upload.headers" |
| | | :action="upload.url + '?updateSupport=' + upload.updateSupport" |
| | | :disabled="upload.isUploading" |
| | | :before-upload="upload.beforeUpload" |
| | | :on-progress="upload.onProgress" |
| | | :on-success="upload.onSuccess" |
| | | :on-error="upload.onError" |
| | | :on-change="upload.onChange" |
| | | :auto-upload="false" |
| | | drag |
| | | > |
| | | <el-icon class="el-icon--upload"><upload-filled /></el-icon> |
| | | <div class="el-upload__text">å°æä»¶æå°æ¤å¤ï¼æ<em>ç¹å»ä¸ä¼ </em></div> |
| | | <template #tip> |
| | | <div class="el-upload__tip text-center"> |
| | | <span>ä»
å
许导å
¥xlsãxlsxæ ¼å¼æä»¶ã</span> |
| | | <!-- <el-link--> |
| | | <!-- type="primary"--> |
| | | <!-- :underline="false"--> |
| | | <!-- style="font-size: 12px; vertical-align: baseline"--> |
| | | <!-- @click="importTemplate"--> |
| | | <!-- >ä¸è½½æ¨¡æ¿</el-link--> |
| | | <!-- >--> |
| | | </div> |
| | | </template> |
| | | </el-upload> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button type="primary" @click="submitFileForm">ç¡® å®</el-button> |
| | | <el-button @click="upload.open = false">å æ¶</el-button> |
| | | </div> |
| | | </template> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref, reactive, computed, onMounted } from 'vue'; |
| | | import { Search, Plus, Delete } from '@element-plus/icons-vue'; |
| | | import { ElMessage, ElMessageBox } from 'element-plus'; |
| | | import dayjs from 'dayjs'; |
| | | import {onMounted, ref} from "vue"; |
| | | import { Search } from "@element-plus/icons-vue"; |
| | | import { |
| | | addCustomer, |
| | | delCustomer, |
| | | getCustomer, |
| | | listCustomer, |
| | | updateCustomer, |
| | | } from "@/api/basicData/customerFile.js"; |
| | | import { ElMessageBox } from "element-plus"; |
| | | import { userListNoPage } from "@/api/system/user.js"; |
| | | import useUserStore from "@/store/modules/user"; |
| | | import { getToken } from "@/utils/auth.js"; |
| | | const { proxy } = getCurrentInstance(); |
| | | const userStore = useUserStore(); |
| | | |
| | | // å®ä¹åæ°æ® |
| | | const mockData = [ |
| | | { id: 1, name: 'ä¸é¨é¨ç¦', area: 'ç产åº', location: 'ä¸é¨å
¥å£', status: '1', lastUpdate: '2025-12-30 08:30:00', description: '主è¦ç¨äºåå·¥ä¸ä¸çéè¡' }, |
| | | { id: 2, name: '西é¨é¨ç¦', area: 'ä»å¨åº', location: '西é¨å
¥å£', status: '1', lastUpdate: '2025-12-30 09:15:00', description: '主è¦ç¨äºç©æµè½¦è¾éè¡' }, |
| | | { id: 3, name: 'åé¨é¨ç¦', area: 'åå
¬åº', location: 'åé¨å
¥å£', status: '0', lastUpdate: '2025-12-30 10:20:00', description: '主è¦ç¨äºè®¿å®¢éè¡ï¼å½åæ
é' }, |
| | | { id: 4, name: 'åé¨é¨ç¦', area: 'ç产åº', location: 'åé¨å
¥å£', status: '1', lastUpdate: '2025-12-30 11:45:00', description: '主è¦ç¨äºåææè¿è¾è½¦è¾éè¡' }, |
| | | { id: 5, name: '䏿§å®¤é¨ç¦', area: '䏿§åº', location: '䏿§å®¤é¨å£', status: '1', lastUpdate: '2025-12-30 13:20:00', description: 'ä»
éææäººåè¿å
¥' }, |
| | | ]; |
| | | |
| | | // ååºå¼æ°æ® |
| | | const filters = reactive({ |
| | | name: '', |
| | | status: '', |
| | | area: '' |
| | | }); |
| | | |
| | | const dataList = ref([]); |
| | | const pagination = reactive({ |
| | | currentPage: 1, |
| | | pageSize: 10, |
| | | total: 0 |
| | | }); |
| | | |
| | | const multipleList = ref([]); |
| | | const dialogVisible = ref(false); |
| | | const dialogTitle = ref('æ°å¢é¨ç¦'); |
| | | const formData = reactive({ |
| | | id: '', |
| | | name: '', |
| | | area: '', |
| | | location: '', |
| | | status: '1', |
| | | description: '' |
| | | }); |
| | | |
| | | // è¡¨æ ¼åé
ç½® |
| | | const columns = [ |
| | | const tableColumn = ref([ |
| | | { |
| | | label: 'é¨ç¦åç§°', |
| | | align: 'center', |
| | | prop: 'name', |
| | | label: "é¨ç¦åç§°", |
| | | prop: "customerName", |
| | | width: 220, |
| | | }, |
| | | { |
| | | label: 'åºå', |
| | | align: 'center', |
| | | prop: 'area', |
| | | label: "åºå", |
| | | prop: "taxpayerIdentificationNumber", |
| | | width: 220, |
| | | }, |
| | | { |
| | | label: 'ä½ç½®', |
| | | align: 'center', |
| | | prop: 'location', |
| | | label: "ä½ç½®", |
| | | prop: "companyAddress", |
| | | width: 220, |
| | | }, |
| | | { |
| | | label: 'ç¶æ', |
| | | align: 'center', |
| | | prop: 'status', |
| | | formatter: (row) => { |
| | | return row.status === '1' ? '<el-tag type="success">æ£å¸¸</el-tag>' : '<el-tag type="danger">å¼å¸¸</el-tag>'; |
| | | } |
| | | label: "ç»´æ¤äºº", |
| | | prop: "maintainer", |
| | | }, |
| | | { |
| | | label: 'æåæ´æ°', |
| | | align: 'center', |
| | | prop: 'lastUpdate', |
| | | label: "ç»´æ¤æ¶é´", |
| | | prop: "maintenanceTime", |
| | | width: 100, |
| | | }, |
| | | { |
| | | label: 'æè¿°', |
| | | align: 'center', |
| | | prop: 'description', |
| | | }, |
| | | { |
| | | dataType: 'action', |
| | | label: 'æä½', |
| | | align: 'center', |
| | | dataType: "action", |
| | | label: "æä½", |
| | | align: "center", |
| | | fixed: 'right', |
| | | width: 140, |
| | | operation: [ |
| | | { |
| | | name: 'ç¼è¾', |
| | | type: 'text', |
| | | name: "ç¼è¾", |
| | | type: "text", |
| | | clickFun: (row) => { |
| | | edit(row); |
| | | openForm("edit", row); |
| | | }, |
| | | }, |
| | | { |
| | | name: 'å é¤', |
| | | type: 'text', |
| | | clickFun: (row) => { |
| | | deleteRow(row.id); |
| | | }, |
| | | disabled: (row) => { |
| | | return row.maintainer !== userStore.nickName |
| | | } |
| | | }, |
| | | ], |
| | | }, |
| | | ]; |
| | | |
| | | // è¿æ»¤åçæ°æ® |
| | | const filteredData = computed(() => { |
| | | return mockData.filter(item => { |
| | | const nameMatch = !filters.name || item.name.includes(filters.name); |
| | | const statusMatch = !filters.status || item.status === filters.status; |
| | | const areaMatch = !filters.area || item.area.includes(filters.area); |
| | | return nameMatch && statusMatch && areaMatch; |
| | | }); |
| | | ]); |
| | | const tableData = ref([]); |
| | | const selectedRows = ref([]); |
| | | const userList = ref([]); |
| | | const tableLoading = ref(false); |
| | | const page = reactive({ |
| | | current: 1, |
| | | size: 100, |
| | | total: 0, |
| | | }); |
| | | const total = ref(0); |
| | | |
| | | // è·åè¡¨æ ¼æ°æ® |
| | | const getTableData = () => { |
| | | pagination.total = filteredData.value.length; |
| | | const start = (pagination.currentPage - 1) * pagination.pageSize; |
| | | const end = start + pagination.pageSize; |
| | | dataList.value = filteredData.value.slice(start, end); |
| | | }; |
| | | |
| | | // éç½®è¿æ»¤å¨ |
| | | const resetFilters = () => { |
| | | filters.name = ''; |
| | | filters.status = ''; |
| | | filters.area = ''; |
| | | pagination.currentPage = 1; |
| | | getTableData(); |
| | | }; |
| | | |
| | | // å页åå |
| | | const changePage = ({ page, limit }) => { |
| | | pagination.currentPage = page; |
| | | pagination.pageSize = limit; |
| | | getTableData(); |
| | | }; |
| | | |
| | | // å¤éå¤ç |
| | | const handleSelectionChange = (selectionList) => { |
| | | multipleList.value = selectionList; |
| | | }; |
| | | |
| | | // æ°å¢ |
| | | const add = () => { |
| | | dialogTitle.value = 'æ°å¢é¨ç¦'; |
| | | formData.id = ''; |
| | | formData.name = ''; |
| | | formData.area = ''; |
| | | formData.location = ''; |
| | | formData.status = '1'; |
| | | formData.description = ''; |
| | | dialogVisible.value = true; |
| | | }; |
| | | |
| | | // ç¼è¾ |
| | | const edit = (row) => { |
| | | dialogTitle.value = 'ç¼è¾é¨ç¦'; |
| | | formData.id = row.id; |
| | | formData.name = row.name; |
| | | formData.area = row.area; |
| | | formData.location = row.location; |
| | | formData.status = row.status; |
| | | formData.description = row.description; |
| | | dialogVisible.value = true; |
| | | }; |
| | | |
| | | // ä¿åæ°æ® |
| | | const saveData = () => { |
| | | if (!formData.name || !formData.area || !formData.location) { |
| | | ElMessage.warning('请填åå¿
å¡«åæ®µ'); |
| | | return; |
| | | } |
| | | |
| | | const currentTime = dayjs().format('YYYY-MM-DD HH:mm:ss'); |
| | | if (formData.id) { |
| | | // ç¼è¾ |
| | | const index = mockData.findIndex(item => item.id === formData.id); |
| | | if (index !== -1) { |
| | | mockData[index] = { |
| | | ...formData, |
| | | lastUpdate: currentTime |
| | | }; |
| | | ElMessage.success('ç¼è¾æå'); |
| | | // ç¨æ·ä¿¡æ¯è¡¨åå¼¹æ¡æ°æ® |
| | | const operationType = ref(""); |
| | | const dialogFormVisible = ref(false); |
| | | const formYYs = ref({ // å
¶ä»å段... |
| | | contactList: [ |
| | | { |
| | | contactPerson: "", |
| | | contactPhone: "" |
| | | } |
| | | } else { |
| | | // æ°å¢ |
| | | const newId = Math.max(...mockData.map(item => item.id), 0) + 1; |
| | | mockData.unshift({ |
| | | ...formData, |
| | | id: newId, |
| | | lastUpdate: currentTime |
| | | ] |
| | | }); |
| | | const data = reactive({ |
| | | searchForm: { |
| | | customerName: "", |
| | | }, |
| | | form: { |
| | | customerName: "", |
| | | taxpayerIdentificationNumber: "", |
| | | companyAddress: "", |
| | | companyPhone: "", |
| | | contactPerson: "", |
| | | contactPhone: "", |
| | | maintainer: "", |
| | | maintenanceTime: "", |
| | | basicBankAccount: "", |
| | | bankAccount: "", |
| | | bankCode: "", |
| | | }, |
| | | rules: { |
| | | customerName: [{ required: true, message: "请è¾å
¥", trigger: "blur" }], |
| | | taxpayerIdentificationNumber: [ |
| | | { required: true, message: "请è¾å
¥", trigger: "blur" }, |
| | | ], |
| | | companyAddress: [{ required: true, message: "请è¾å
¥", trigger: "blur" }], |
| | | companyPhone: [{ required: true, message: "请è¾å
¥", trigger: "blur" }], |
| | | // contactPerson: [{ required: true, message: "请è¾å
¥", trigger: "blur" }], |
| | | // contactPhone: [{ required: true, message: "请è¾å
¥", trigger: "blur" }], |
| | | maintainer: [{ required: false, message: "è¯·éæ©", trigger: "change" }], |
| | | maintenanceTime: [ |
| | | { required: false, message: "è¯·éæ©", trigger: "change" }, |
| | | ], |
| | | basicBankAccount: [{ required: true, message: "请è¾å
¥", trigger: "blur" }], |
| | | bankAccount: [{ required: true, message: "请è¾å
¥", trigger: "blur" }], |
| | | bankCode: [{ required: true, message: "请è¾å
¥", trigger: "blur" }], |
| | | }, |
| | | }); |
| | | const upload = reactive({ |
| | | // æ¯å¦æ¾ç¤ºå¼¹åºå±ï¼å®¢æ·å¯¼å
¥ï¼ |
| | | open: false, |
| | | // å¼¹åºå±æ é¢ï¼å®¢æ·å¯¼å
¥ï¼ |
| | | title: "", |
| | | // æ¯å¦ç¦ç¨ä¸ä¼ |
| | | isUploading: false, |
| | | // 设置ä¸ä¼ ç请æ±å¤´é¨ |
| | | headers: { Authorization: "Bearer " + getToken() }, |
| | | // ä¸ä¼ çå°å |
| | | url: import.meta.env.VITE_APP_BASE_API + "/basic/customer/importData", |
| | | // æä»¶ä¸ä¼ åçåè° |
| | | beforeUpload: (file) => { |
| | | console.log('æä»¶å³å°ä¸ä¼ ', file); |
| | | // å¯ä»¥å¨æ¤å¤åæä»¶ç±»åæå¤§å°æ ¡éª |
| | | const isValid = file.type === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' || file.name.endsWith('.xlsx') || file.name.endsWith('.xls'); |
| | | if (!isValid) { |
| | | proxy.$modal.msgError("åªè½ä¸ä¼ Excel æä»¶"); |
| | | } |
| | | return isValid; |
| | | }, |
| | | // æä»¶ç¶ææ¹åæ¶çåè° |
| | | onChange: (file, fileList) => { |
| | | console.log('æä»¶ç¶ææ¹å', file, fileList); |
| | | }, |
| | | // æä»¶ä¸ä¼ æåæ¶çåè° |
| | | onSuccess: (response, file, fileList) => { |
| | | console.log('ä¸ä¼ æå', response, file, fileList); |
| | | if(response.code === 200){ |
| | | proxy.$modal.msgSuccess("æä»¶ä¸ä¼ æå"); |
| | | }else if(response.code === 500){ |
| | | proxy.$modal.msgError(response.msg); |
| | | }else{ |
| | | proxy.$modal.msgWarning(response.msg); |
| | | } |
| | | }, |
| | | // æä»¶ä¸ä¼ 失败æ¶çåè° |
| | | onError: (error, file, fileList) => { |
| | | console.error('ä¸ä¼ 失败', error, file, fileList); |
| | | proxy.$modal.msgError("æä»¶ä¸ä¼ 失败"); |
| | | }, |
| | | // æä»¶ä¸ä¼ è¿åº¦åè° |
| | | onProgress: (event, file, fileList) => { |
| | | console.log('ä¸ä¼ ä¸...', event.percent); |
| | | } |
| | | }); |
| | | const { searchForm, form, rules } = toRefs(data); |
| | | const addNewContact = () => { |
| | | formYYs.value.contactList.push({ |
| | | contactPerson: "", |
| | | contactPhone: "" |
| | | }); |
| | | }; |
| | | |
| | | const removeContact = (index) => { |
| | | if (formYYs.value.contactList.length > 1) { |
| | | formYYs.value.contactList.splice(index, 1); |
| | | } |
| | | }; |
| | | // æ¥è¯¢å表 |
| | | /** æç´¢æé®æä½ */ |
| | | const handleQuery = () => { |
| | | page.current = 1; |
| | | getList(); |
| | | }; |
| | | const pagination = (obj) => { |
| | | page.current = obj.page; |
| | | page.size = obj.limit; |
| | | getList(); |
| | | }; |
| | | const getList = () => { |
| | | tableLoading.value = true; |
| | | listCustomer({ ...searchForm.value, ...page }).then((res) => { |
| | | tableLoading.value = false; |
| | | tableData.value = res.records; |
| | | page.total = res.total; |
| | | }); |
| | | }; |
| | | // è¡¨æ ¼éæ©æ°æ® |
| | | const handleSelectionChange = (selection) => { |
| | | selectedRows.value = selection; |
| | | }; |
| | | /** æäº¤ä¸ä¼ æä»¶ */ |
| | | function submitFileForm() { |
| | | proxy.$refs["uploadRef"].submit(); |
| | | } |
| | | /** 导å
¥æé®æä½ */ |
| | | function handleImport() { |
| | | upload.title = "客æ·å¯¼å
¥"; |
| | | upload.open = true; |
| | | } |
| | | // æå¼å¼¹æ¡ |
| | | const openForm = (type, row) => { |
| | | operationType.value = type; |
| | | form.value = {}; |
| | | form.value.maintainer = userStore.nickName; |
| | | formYYs.value.contactList = [ |
| | | { |
| | | contactPerson: "", |
| | | contactPhone: "" |
| | | } |
| | | ]; |
| | | form.value.maintenanceTime = getCurrentDate(); |
| | | userListNoPage().then((res) => { |
| | | userList.value = res.data; |
| | | }); |
| | | if (type === "edit") { |
| | | getCustomer(row.id).then((res) => { |
| | | form.value = { ...res.data }; |
| | | formYYs.value.contactList = res.data.contactPerson.split(",").map((item, index) => { |
| | | return { |
| | | contactPerson: item, |
| | | contactPhone: res.data.contactPhone.split(",")[index] |
| | | } |
| | | }); |
| | | |
| | | }); |
| | | ElMessage.success('æ°å¢æå'); |
| | | } |
| | | dialogVisible.value = false; |
| | | getTableData(); |
| | | dialogFormVisible.value = true; |
| | | }; |
| | | |
| | | // å é¤ |
| | | const deleteRow = (id) => { |
| | | ElMessageBox.confirm('æ¤æä½å°æ°¸ä¹
å é¤è¯¥é¨ç¦è®°å½, æ¯å¦ç»§ç»?', 'æç¤º', { |
| | | confirmButtonText: 'ç¡®å®', |
| | | cancelButtonText: 'åæ¶', |
| | | type: 'warning', |
| | | }).then(() => { |
| | | const index = mockData.findIndex(item => item.id === id); |
| | | if (index !== -1) { |
| | | mockData.splice(index, 1); |
| | | ElMessage.success('å 餿å'); |
| | | getTableData(); |
| | | } |
| | | }).catch(() => {}); |
| | | }; |
| | | |
| | | // æ¹éå é¤ |
| | | const batchDelete = () => { |
| | | if (multipleList.value.length === 0) { |
| | | ElMessage.warning('è¯·éæ©è¦å é¤çæ°æ®'); |
| | | return; |
| | | } |
| | | |
| | | ElMessageBox.confirm('æ¤æä½å°æ°¸ä¹
å 餿éé¨ç¦è®°å½, æ¯å¦ç»§ç»?', 'æç¤º', { |
| | | confirmButtonText: 'ç¡®å®', |
| | | cancelButtonText: 'åæ¶', |
| | | type: 'warning', |
| | | }).then(() => { |
| | | const ids = multipleList.value.map(item => item.id); |
| | | mockData.forEach((item, index) => { |
| | | if (ids.includes(item.id)) { |
| | | mockData.splice(index, 1); |
| | | // æäº¤è¡¨å |
| | | const submitForm = () => { |
| | | proxy.$refs["formRef"].validate((valid) => { |
| | | if (valid) { |
| | | if (operationType.value === "edit") { |
| | | submitEdit(); |
| | | } else { |
| | | submitAdd(); |
| | | } |
| | | }); |
| | | ElMessage.success('å 餿å'); |
| | | getTableData(); |
| | | multipleList.value = []; |
| | | }).catch(() => {}); |
| | | } |
| | | }); |
| | | }; |
| | | // æäº¤æ°å¢ |
| | | const submitAdd = () => { |
| | | if(formYYs.value.contactList.length < 1){ |
| | | return proxy.$modal.msgWarning("请è³å°æ·»å ä¸ä¸ªè系人"); |
| | | } |
| | | form.value.contactPerson = formYYs.value.contactList.map(item => item.contactPerson).join(","); |
| | | form.value.contactPhone = formYYs.value.contactList.map(item => item.contactPhone).join(","); |
| | | addCustomer(form.value).then((res) => { |
| | | proxy.$modal.msgSuccess("æäº¤æå"); |
| | | closeDia(); |
| | | getList(); |
| | | }); |
| | | }; |
| | | // æäº¤ä¿®æ¹ |
| | | const submitEdit = () => { |
| | | form.value.contactPerson = formYYs.value.contactList.map(item => item.contactPerson).join(","); |
| | | form.value.contactPhone = formYYs.value.contactList.map(item => item.contactPhone).join(","); |
| | | updateCustomer(form.value).then((res) => { |
| | | proxy.$modal.msgSuccess("æäº¤æå"); |
| | | closeDia(); |
| | | getList(); |
| | | }); |
| | | }; |
| | | // å
³éå¼¹æ¡ |
| | | const closeDia = () => { |
| | | proxy.resetForm("formRef"); |
| | | dialogFormVisible.value = false; |
| | | }; |
| | | // å¯¼åº |
| | | const handleOut = () => { |
| | | ElMessageBox.confirm("éä¸çå
容å°è¢«å¯¼åºï¼æ¯å¦ç¡®è®¤å¯¼åºï¼", "导åº", { |
| | | confirmButtonText: "确认", |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning", |
| | | }) |
| | | .then(() => { |
| | | proxy.download("/basic/customer/export", {}, "å®¢æ·æ¡£æ¡.xlsx"); |
| | | }) |
| | | .catch(() => { |
| | | proxy.$modal.msg("已忶"); |
| | | }); |
| | | }; |
| | | // å é¤ |
| | | const handleDelete = () => { |
| | | let ids = []; |
| | | if (selectedRows.value.length > 0) { |
| | | // æ£æ¥æ¯å¦æä»äººç»´æ¤çæ°æ® |
| | | const unauthorizedData = selectedRows.value.filter(item => item.maintainer !== userStore.nickName); |
| | | if (unauthorizedData.length > 0) { |
| | | proxy.$modal.msgWarning("ä¸å¯å é¤ä»äººç»´æ¤çæ°æ®"); |
| | | return; |
| | | } |
| | | ids = selectedRows.value.map((item) => item.id); |
| | | } else { |
| | | proxy.$modal.msgWarning("è¯·éæ©æ°æ®"); |
| | | return; |
| | | } |
| | | ElMessageBox.confirm("éä¸çå
容å°è¢«å é¤ï¼æ¯å¦ç¡®è®¤å é¤ï¼", "å é¤æç¤º", { |
| | | confirmButtonText: "确认", |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning", |
| | | }) |
| | | .then(() => { |
| | | tableLoading.value = true; |
| | | delCustomer(ids) |
| | | .then((res) => { |
| | | proxy.$modal.msgSuccess("å 餿å"); |
| | | getList(); |
| | | }) |
| | | .finally(() => { |
| | | tableLoading.value = false; |
| | | }); |
| | | }) |
| | | .catch(() => { |
| | | proxy.$modal.msg("已忶"); |
| | | }); |
| | | }; |
| | | |
| | | // åå§åæ°æ® |
| | | // è·åå½åæ¥æå¹¶æ ¼å¼å为 YYYY-MM-DD |
| | | function getCurrentDate() { |
| | | const today = new Date(); |
| | | const year = today.getFullYear(); |
| | | const month = String(today.getMonth() + 1).padStart(2, "0"); // æä»½ä»0å¼å§ |
| | | const day = String(today.getDate()).padStart(2, "0"); |
| | | return `${year}-${month}-${day}`; |
| | | } |
| | | |
| | | onMounted(() => { |
| | | getTableData(); |
| | | getList(); |
| | | }); |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | .table_list { |
| | | margin-top: unset; |
| | | } |
| | | .actions { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | margin-bottom: 10px; |
| | | } |
| | | </style> |
| | | <style scoped lang="scss"></style> |
| | |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form :model="filters" :inline="true"> |
| | | <el-form-item label="å·¡æ£åç§°"> |
| | | <div class="search_form"> |
| | | <div> |
| | | <span class="search_title">å·¡æ£åç§°ï¼</span> |
| | | <el-input |
| | | v-model="filters.name" |
| | | style="width: 240px" |
| | | placeholder="请è¾å
¥å·¡æ£åç§°" |
| | | clearable |
| | | :prefix-icon="Search" |
| | | @change="getTableData" |
| | | v-model="searchForm.supplierName" |
| | | style="width: 240px" |
| | | placeholder="è¾å
¥å·¡æ£åç§°æç´¢" |
| | | @change="handleQuery" |
| | | clearable |
| | | :prefix-icon="Search" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="å·¡æ£ç¶æ"> |
| | | <el-select |
| | | v-model="filters.status" |
| | | style="width: 240px" |
| | | placeholder="è¯·éæ©å·¡æ£ç¶æ" |
| | | clearable |
| | | @change="getTableData" |
| | | <el-button type="primary" @click="handleQuery" style="margin-left: 10px" |
| | | >æç´¢</el-button |
| | | > |
| | | <el-option label="å¾
æ§è¡" value="0"></el-option> |
| | | <el-option label="æ§è¡ä¸" value="1"></el-option> |
| | | <el-option label="已宿" value="2"></el-option> |
| | | <el-option label="已忶" value="3"></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="å·¡æ£ç±»å"> |
| | | <el-select |
| | | v-model="filters.type" |
| | | style="width: 240px" |
| | | placeholder="è¯·éæ©å·¡æ£ç±»å" |
| | | clearable |
| | | @change="getTableData" |
| | | > |
| | | <el-option label="宿巡æ£" value="0"></el-option> |
| | | <el-option label="临æ¶å·¡æ£" value="1"></el-option> |
| | | <el-option label="æ
éå·¡æ£" value="2"></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" @click="getTableData">æç´¢</el-button> |
| | | <el-button @click="resetFilters">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | <div class="table_list"> |
| | | <div class="actions"> |
| | | <div></div> |
| | | <div> |
| | | <el-button type="primary" @click="add" icon="Plus"> æ°å¢ </el-button> |
| | | <el-button |
| | | type="danger" |
| | | icon="Delete" |
| | | :disabled="multipleList.length <= 0" |
| | | @click="batchDelete" |
| | | >æ¹éå é¤</el-button |
| | | > |
| | | </div> |
| | | </div> |
| | | <PIMTable |
| | | rowKey="id" |
| | | isSelection |
| | | :column="columns" |
| | | :tableData="dataList" |
| | | :page="{ |
| | | current: pagination.currentPage, |
| | | size: pagination.pageSize, |
| | | total: pagination.total, |
| | | }" |
| | | @selection-change="handleSelectionChange" |
| | | @pagination="changePage" |
| | | > |
| | | </PIMTable> |
| | | <div> |
| | | <el-button type="primary" @click="openForm('add')" |
| | | >æ°å¢</el-button> |
| | | <el-button type="danger" plain @click="handleDelete">å é¤</el-button> |
| | | </div> |
| | | </div> |
| | | <!-- æ°å¢ç¼è¾å¼¹çª --> |
| | | <el-dialog v-model="dialogVisible" :title="dialogTitle" width="600px"> |
| | | <el-form :model="formData" label-width="100px"> |
| | | <el-form-item label="å·¡æ£åç§°" required> |
| | | <el-input |
| | | v-model="formData.name" |
| | | placeholder="请è¾å
¥å·¡æ£åç§°" |
| | | ></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="å·¡æ£ç±»å" required> |
| | | <el-select v-model="formData.type" placeholder="è¯·éæ©å·¡æ£ç±»å"> |
| | | <el-option label="宿巡æ£" value="0"></el-option> |
| | | <el-option label="临æ¶å·¡æ£" value="1"></el-option> |
| | | <el-option label="æ
éå·¡æ£" value="2"></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="å·¡æ£åºå" required> |
| | | <el-input |
| | | v-model="formData.area" |
| | | placeholder="请è¾å
¥å·¡æ£åºå" |
| | | ></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="å·¡æ£äººå" required> |
| | | <el-input |
| | | v-model="formData.inspector" |
| | | placeholder="请è¾å
¥å·¡æ£äººå" |
| | | ></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="计åå¼å§æ¶é´" required> |
| | | <el-date-picker |
| | | v-model="formData.planStartTime" |
| | | type="datetime" |
| | | placeholder="è¯·éæ©è®¡åå¼å§æ¶é´" |
| | | style="width: 100%" |
| | | ></el-date-picker> |
| | | </el-form-item> |
| | | <el-form-item label="计åç»ææ¶é´" required> |
| | | <el-date-picker |
| | | v-model="formData.planEndTime" |
| | | type="datetime" |
| | | placeholder="è¯·éæ©è®¡åç»ææ¶é´" |
| | | style="width: 100%" |
| | | ></el-date-picker> |
| | | </el-form-item> |
| | | <el-form-item label="å·¡æ£å
容"> |
| | | <el-input |
| | | v-model="formData.content" |
| | | type="textarea" |
| | | rows="3" |
| | | placeholder="请è¾å
¥å·¡æ£å
容" |
| | | ></el-input> |
| | | </el-form-item> |
| | | <div class="table_list"> |
| | | <PIMTable |
| | | rowKey="id" |
| | | :column="tableColumn" |
| | | :tableData="tableData" |
| | | :page="page" |
| | | :isSelection="true" |
| | | @selection-change="handleSelectionChange" |
| | | :tableLoading="tableLoading" |
| | | @pagination="pagination" |
| | | ></PIMTable> |
| | | </div> |
| | | <el-dialog |
| | | v-model="dialogFormVisible" |
| | | :title="operationType === 'add' ? 'æ°å¢å·¡æ£ä¿¡æ¯' : 'ç¼è¾å·¡æ£ä¿¡æ¯'" |
| | | width="70%" |
| | | @close="closeDia" |
| | | > |
| | | <el-form |
| | | :model="form" |
| | | label-width="140px" |
| | | label-position="top" |
| | | :rules="rules" |
| | | ref="formRef" |
| | | > |
| | | <el-row :gutter="30"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="å·¡æ£åç§°ï¼" prop="supplierName"> |
| | | <el-input |
| | | v-model="form.supplierName" |
| | | placeholder="请è¾å
¥" |
| | | clearable |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item |
| | | label="å·¡æ£ç±»åï¼" |
| | | prop="taxpayerIdentificationNum" |
| | | > |
| | | <el-select style="width:100%" v-model="form.taxpayerIdentificationNum" clearable> |
| | | <el-option v-for="(item,index) in typeList" :key="index" :label="item.label" :value="item.value"/> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="30"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="å·¡æ£åºåï¼" prop="companyAddress"> |
| | | <el-input |
| | | v-model="form.companyAddress" |
| | | placeholder="请è¾å
¥" |
| | | clearable |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="计åå¼å§æ¶é´ï¼" prop="companyPhone"> |
| | | <el-date-picker style="width:100%" clearable value-format="YYYY-MM-DD" type="date" placeholder="éæ©æ¥ææ¶é´" v-model="form.companyPhone"></el-date-picker> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="30"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="计åç»ææ¶é´ï¼" prop="bankAccountName"> |
| | | <el-date-picker style="width:100%" clearable value-format="YYYY-MM-DD" type="date" placeholder="éæ©æ¥ææ¶é´" v-model="form.bankAccountName"></el-date-picker> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="å®é
å¼å§æ¶é´ï¼" prop="bankAccountNum"> |
| | | <el-date-picker style="width:100%" clearable value-format="YYYY-MM-DD" type="date" placeholder="éæ©æ¥ææ¶é´" v-model="form.bankAccountNum"></el-date-picker> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="30"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="å®é
ç»ææ¶é´ï¼" prop="contactUserName"> |
| | | <el-date-picker style="width:100%" clearable value-format="YYYY-MM-DD" type="date" placeholder="éæ©æ¥ææ¶é´" v-model="form.contactUserName"></el-date-picker> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="å·¡æ£äººåï¼" prop="contactUserPhone"> |
| | | <el-input |
| | | v-model="form.contactUserPhone" |
| | | placeholder="请è¾å
¥" |
| | | clearable |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | </el-form> |
| | | <template #footer> |
| | | <span class="dialog-footer"> |
| | | <el-button @click="dialogVisible = false">åæ¶</el-button> |
| | | <el-button type="primary" @click="saveData">ç¡®å®</el-button> |
| | | </span> |
| | | <div class="dialog-footer"> |
| | | <el-button type="primary" @click="submitForm">确认</el-button> |
| | | <el-button @click="closeDia">åæ¶</el-button> |
| | | </div> |
| | | </template> |
| | | </el-dialog> |
| | | |
| | | <!-- ä¾åºå导å
¥å¯¹è¯æ¡ --> |
| | | <el-dialog |
| | | :title="upload.title" |
| | | v-model="upload.open" |
| | | width="400px" |
| | | append-to-body |
| | | > |
| | | <el-upload |
| | | ref="uploadRef" |
| | | :limit="1" |
| | | accept=".xlsx, .xls" |
| | | :headers="upload.headers" |
| | | :action="upload.url + '?updateSupport=' + upload.updateSupport" |
| | | :disabled="upload.isUploading" |
| | | :on-progress="handleFileUploadProgress" |
| | | :on-success="handleFileSuccess" |
| | | :auto-upload="false" |
| | | drag |
| | | > |
| | | <el-icon class="el-icon--upload"><upload-filled /></el-icon> |
| | | <div class="el-upload__text">å°æä»¶æå°æ¤å¤ï¼æ<em>ç¹å»ä¸ä¼ </em></div> |
| | | <template #tip> |
| | | <div class="el-upload__tip text-center"> |
| | | <span>ä»
å
许导å
¥xlsãxlsxæ ¼å¼æä»¶ã</span> |
| | | <!-- <el-link |
| | | type="primary" |
| | | :underline="false" |
| | | style="font-size: 12px; vertical-align: baseline" |
| | | @click="importTemplate" |
| | | >ä¸è½½æ¨¡æ¿</el-link |
| | | > --> |
| | | </div> |
| | | </template> |
| | | </el-upload> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button type="primary" @click="submitFileForm">ç¡® å®</el-button> |
| | | <el-button @click="upload.open = false">å æ¶</el-button> |
| | | </div> |
| | | </template> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref, reactive, computed, onMounted } from "vue"; |
| | | import { Search, Plus, Delete } from "@element-plus/icons-vue"; |
| | | import { ElMessage, ElMessageBox } from "element-plus"; |
| | | import dayjs from "dayjs"; |
| | | import { onMounted, ref } from "vue"; |
| | | import { Search } from "@element-plus/icons-vue"; |
| | | import { delSupplier } from "@/api/basicData/supplierManageFile.js"; |
| | | import { ElMessageBox } from "element-plus"; |
| | | import { userListNoPage } from "@/api/system/user.js"; |
| | | import { |
| | | addSupplier, |
| | | getSupplier, |
| | | listSupplier, |
| | | updateSupplier, |
| | | } from "@/api/basicData/supplierManageFile.js"; |
| | | import useUserStore from "@/store/modules/user"; |
| | | import { getToken } from "@/utils/auth.js"; |
| | | const { proxy } = getCurrentInstance(); |
| | | const userStore = useUserStore(); |
| | | |
| | | // å®ä¹åæ°æ® |
| | | const mockData = [ |
| | | { |
| | | id: 1, |
| | | name: "ä¸é¨åºåæ¥å¸¸å·¡æ£", |
| | | type: "0", |
| | | status: "2", |
| | | planStartTime: "2025-12-30 08:00:00", |
| | | planEndTime: "2025-12-30 09:00:00", |
| | | actualStartTime: "2025-12-30 08:05:00", |
| | | actualEndTime: "2025-12-30 08:55:00", |
| | | inspector: "å¼ ä¸", |
| | | area: "ä¸é¨åºå", |
| | | content: "æ£æ¥é¨ç¦è®¾å¤è¿è¡ç¶æãç¯å¢çæµè®¾å¤æ°æ®", |
| | | }, |
| | | { |
| | | id: 2, |
| | | name: "西é¨åºå临æ¶å·¡æ£", |
| | | type: "1", |
| | | status: "2", |
| | | planStartTime: "2025-12-30 10:00:00", |
| | | planEndTime: "2025-12-30 11:00:00", |
| | | actualStartTime: "2025-12-30 10:00:00", |
| | | actualEndTime: "2025-12-30 10:45:00", |
| | | inspector: "æå", |
| | | area: "西é¨åºå", |
| | | content: "æ£æ¥å¼å¸¸æ¥è¦è®¾å¤", |
| | | }, |
| | | { |
| | | id: 3, |
| | | name: "åé¨é¨ç¦æ
éå·¡æ£", |
| | | type: "2", |
| | | status: "1", |
| | | planStartTime: "2025-12-30 13:00:00", |
| | | planEndTime: "2025-12-30 14:00:00", |
| | | actualStartTime: "2025-12-30 13:10:00", |
| | | actualEndTime: "", |
| | | inspector: "çäº", |
| | | area: "åé¨åºå", |
| | | content: "ä¿®å¤é¨ç¦æ
é", |
| | | }, |
| | | { |
| | | id: 4, |
| | | name: "䏿§å®¤å®æå·¡æ£", |
| | | type: "0", |
| | | status: "0", |
| | | planStartTime: "2025-12-31 09:00:00", |
| | | planEndTime: "2025-12-31 10:00:00", |
| | | actualStartTime: "", |
| | | actualEndTime: "", |
| | | inspector: "èµµå
", |
| | | area: "䏿§åºå", |
| | | content: "æ£æ¥çæ§è®¾å¤ãæå¡å¨è¿è¡ç¶æ", |
| | | }, |
| | | { |
| | | id: 5, |
| | | name: "åé¨åºåæ¥å¸¸å·¡æ£", |
| | | type: "0", |
| | | status: "2", |
| | | planStartTime: "2025-12-30 15:00:00", |
| | | planEndTime: "2025-12-30 16:00:00", |
| | | actualStartTime: "2025-12-30 15:00:00", |
| | | actualEndTime: "2025-12-30 15:50:00", |
| | | inspector: "å¼ ä¸", |
| | | area: "åé¨åºå", |
| | | content: "æ£æ¥è½¦è¾è¯å«è®¾å¤ãéé¸è¿è¡ç¶æ", |
| | | }, |
| | | ]; |
| | | |
| | | // ååºå¼æ°æ® |
| | | const filters = reactive({ |
| | | name: "", |
| | | status: "", |
| | | type: "", |
| | | }); |
| | | |
| | | const dataList = ref([]); |
| | | const pagination = reactive({ |
| | | currentPage: 1, |
| | | pageSize: 10, |
| | | total: 0, |
| | | }); |
| | | |
| | | const multipleList = ref([]); |
| | | const dialogVisible = ref(false); |
| | | const dialogTitle = ref("æ°å¢å·¡æ£"); |
| | | const formData = reactive({ |
| | | id: "", |
| | | name: "", |
| | | type: "0", |
| | | status: "0", |
| | | planStartTime: "", |
| | | planEndTime: "", |
| | | actualStartTime: "", |
| | | actualEndTime: "", |
| | | inspector: "", |
| | | area: "", |
| | | content: "", |
| | | }); |
| | | |
| | | // ç¶ææ å° |
| | | const statusMap = { |
| | | '0': '<el-tag type="warning">å¾
æ§è¡</el-tag>', |
| | | '1': '<el-tag type="primary">æ§è¡ä¸</el-tag>', |
| | | '2': '<el-tag type="success">已宿</el-tag>', |
| | | '3': '<el-tag type="danger">已忶</el-tag>', |
| | | }; |
| | | |
| | | // ç±»åæ å° |
| | | const typeMap = { |
| | | 0: "宿巡æ£", |
| | | 1: "临æ¶å·¡æ£", |
| | | 2: "æ
éå·¡æ£", |
| | | }; |
| | | |
| | | // è¡¨æ ¼åé
ç½® |
| | | const columns = [ |
| | | const tableColumn = ref([ |
| | | { |
| | | label: "å·¡æ£åç§°", |
| | | align: "center", |
| | | prop: "name", |
| | | prop: "supplierName", |
| | | width: 250, |
| | | }, |
| | | { |
| | | label: "å·¡æ£ç±»å", |
| | | align: "center", |
| | | prop: "type", |
| | | formatter: (row) => { |
| | | return typeMap[row.type]; |
| | | }, |
| | | }, |
| | | { |
| | | label: "å·¡æ£ç¶æ", |
| | | align: "center", |
| | | prop: "status", |
| | | formatter: (row) => { |
| | | return statusMap[row.status]; |
| | | }, |
| | | prop: "taxpayerIdentificationNum", |
| | | width: 230, |
| | | }, |
| | | { |
| | | label: "计åå¼å§æ¶é´", |
| | | align: "center", |
| | | prop: "planStartTime", |
| | | prop: "companyPhone", |
| | | width:150 |
| | | }, |
| | | { |
| | | label: "计åç»ææ¶é´", |
| | | align: "center", |
| | | prop: "planEndTime", |
| | | prop: "bankAccountName", |
| | | width: 220, |
| | | }, |
| | | { |
| | | label: "å®é
å¼å§æ¶é´", |
| | | align: "center", |
| | | prop: "actualStartTime", |
| | | formatter: (row) => { |
| | | return row.actualStartTime || "-"; |
| | | }, |
| | | prop: "bankAccountNum", |
| | | width: 220, |
| | | }, |
| | | { |
| | | label: "å®é
ç»ææ¶é´", |
| | | align: "center", |
| | | prop: "actualEndTime", |
| | | formatter: (row) => { |
| | | return row.actualEndTime || "-"; |
| | | }, |
| | | prop: "contactUserName", |
| | | }, |
| | | { |
| | | label: "å·¡æ£äººå", |
| | | align: "center", |
| | | prop: "inspector", |
| | | prop: "contactUserPhone", |
| | | width: 150, |
| | | }, |
| | | { |
| | | label: "å·¡æ£åºå", |
| | | align: "center", |
| | | prop: "area", |
| | | prop: "companyAddress", |
| | | }, |
| | | { |
| | | dataType: "action", |
| | | label: "æä½", |
| | | align: "center", |
| | | fixed: "right", |
| | | width: 180, |
| | | fixed: 'right', |
| | | operation: [ |
| | | { |
| | | name: "ç¼è¾", |
| | | type: "text", |
| | | clickFun: (row) => { |
| | | edit(row); |
| | | openForm("edit", row); |
| | | }, |
| | | }, |
| | | { |
| | | name: "å¼å§æ§è¡", |
| | | type: "text", |
| | | clickFun: (row) => { |
| | | startInspection(row); |
| | | }, |
| | | visible: (row) => { |
| | | return row.status === "0"; |
| | | }, |
| | | }, |
| | | { |
| | | name: "宿巡æ£", |
| | | type: "text", |
| | | clickFun: (row) => { |
| | | completeInspection(row); |
| | | }, |
| | | visible: (row) => { |
| | | return row.status === "1"; |
| | | }, |
| | | }, |
| | | { |
| | | name: "åæ¶å·¡æ£", |
| | | type: "text", |
| | | clickFun: (row) => { |
| | | cancelInspection(row); |
| | | }, |
| | | visible: (row) => { |
| | | return ["0", "1"].includes(row.status); |
| | | }, |
| | | }, |
| | | { |
| | | name: "å é¤", |
| | | type: "text", |
| | | clickFun: (row) => { |
| | | deleteRow(row.id); |
| | | }, |
| | | disabled: (row) => { |
| | | return row.maintainUserName !== userStore.nickName |
| | | } |
| | | }, |
| | | ], |
| | | }, |
| | | ]; |
| | | |
| | | // è¿æ»¤åçæ°æ® |
| | | const filteredData = computed(() => { |
| | | return mockData.filter((item) => { |
| | | const nameMatch = !filters.name || item.name.includes(filters.name); |
| | | const statusMatch = !filters.status || item.status === filters.status; |
| | | const typeMatch = !filters.type || item.type === filters.type; |
| | | return nameMatch && statusMatch && typeMatch; |
| | | }); |
| | | ]); |
| | | const tableData = ref([]); |
| | | const selectedRows = ref([]); |
| | | const userList = ref([]); |
| | | const tableLoading = ref(false); |
| | | const page = reactive({ |
| | | current: 1, |
| | | size: 100, |
| | | total: 0, |
| | | }); |
| | | const typeList = ref([ |
| | | { label: "æ¥å¸¸å·¡æ£", value: "æ¥å¸¸å·¡æ£" }, |
| | | { label: "ä¸é¡¹å·¡æ£", value: "ä¸é¡¹å·¡æ£" }, |
| | | { label: "临æ¶å·¡æ£", value: "临æ¶å·¡æ£" }, |
| | | ]); |
| | | |
| | | // è·åè¡¨æ ¼æ°æ® |
| | | const getTableData = () => { |
| | | pagination.total = filteredData.value.length; |
| | | const start = (pagination.currentPage - 1) * pagination.pageSize; |
| | | const end = start + pagination.pageSize; |
| | | dataList.value = filteredData.value.slice(start, end); |
| | | // ç¨æ·ä¿¡æ¯è¡¨åå¼¹æ¡æ°æ® |
| | | const operationType = ref(""); |
| | | const dialogFormVisible = ref(false); |
| | | const data = reactive({ |
| | | searchForm: { |
| | | supplierName: "", |
| | | }, |
| | | form: { |
| | | supplierName: "", |
| | | taxpayerIdentificationNum: "", |
| | | companyAddress: "", |
| | | companyPhone: "", |
| | | bankAccountName: "", |
| | | bankAccountNum: "", |
| | | contactUserName: "", |
| | | contactUserPhone: "", |
| | | maintainUserId: "", |
| | | maintainTime: "", |
| | | }, |
| | | rules: { |
| | | supplierName: [{ required: true, message: "请è¾å
¥", trigger: "blur" }], |
| | | taxpayerIdentificationNum: [ |
| | | { required: true, message: "请è¾å
¥", trigger: "blur" }, |
| | | ], |
| | | companyAddress: [{ required: true, message: "请è¾å
¥", trigger: "blur" }], |
| | | companyPhone: [{ required: true, message: "请è¾å
¥", trigger: "blur" }], |
| | | bankAccountName: [{ required: true, message: "请è¾å
¥", trigger: "blur" }], |
| | | bankAccountNum: [{ required: true, message: "请è¾å
¥", trigger: "blur" }], |
| | | contactUserName: [{ required: false, message: "请è¾å
¥", trigger: "blur" }], |
| | | contactUserPhone: [{ required: false, message: "请è¾å
¥", trigger: "blur" }], |
| | | maintainUserId: [{ required: false, message: "è¯·éæ©", trigger: "change" }], |
| | | maintainTime: [{ required: false, message: "è¯·éæ©", trigger: "change" }], |
| | | }, |
| | | }); |
| | | const { searchForm, form, rules } = toRefs(data); |
| | | |
| | | // æ¥è¯¢å表 |
| | | /** æç´¢æé®æä½ */ |
| | | const handleQuery = () => { |
| | | page.current = 1; |
| | | getList(); |
| | | }; |
| | | const pagination = (obj) => { |
| | | page.current = obj.page; |
| | | page.size = obj.limit; |
| | | getList(); |
| | | }; |
| | | /** æäº¤ä¸ä¼ æä»¶ */ |
| | | function submitFileForm() { |
| | | console.log(upload.url + '?updateSupport=' + upload.updateSupport) |
| | | proxy.$refs["uploadRef"].submit(); |
| | | } |
| | | const getList = () => { |
| | | tableLoading.value = true; |
| | | listSupplier({ ...searchForm.value, ...page }).then((res) => { |
| | | tableLoading.value = false; |
| | | tableData.value = res.data.records; |
| | | page.total = res.data.total; |
| | | }); |
| | | }; |
| | | const upload = reactive({ |
| | | // æ¯å¦æ¾ç¤ºå¼¹åºå±ï¼ä¾åºå导å
¥ï¼ |
| | | open: false, |
| | | // å¼¹åºå±æ é¢ï¼ä¾åºå导å
¥ï¼ |
| | | title: "", |
| | | // æ¯å¦ç¦ç¨ä¸ä¼ |
| | | isUploading: false, |
| | | // æ¯å¦æ´æ°å·²ç»åå¨çç¨æ·æ°æ® |
| | | updateSupport: 1, |
| | | // 设置ä¸ä¼ ç请æ±å¤´é¨ |
| | | headers: { Authorization: "Bearer " + getToken() }, |
| | | // ä¸ä¼ çå°å |
| | | url: import.meta.env.VITE_APP_BASE_API + "/system/supplier/import", |
| | | }); |
| | | /** 导å
¥æé®æä½ */ |
| | | function handleImport() { |
| | | upload.title = "ä¾åºå导å
¥"; |
| | | upload.open = true; |
| | | } |
| | | |
| | | /**æä»¶ä¸ä¼ ä¸å¤ç */ |
| | | const handleFileUploadProgress = (event, file, fileList) => { |
| | | upload.isUploading = true; |
| | | }; |
| | | |
| | | // éç½®è¿æ»¤å¨ |
| | | const resetFilters = () => { |
| | | filters.name = ""; |
| | | filters.status = ""; |
| | | filters.type = ""; |
| | | pagination.currentPage = 1; |
| | | getTableData(); |
| | | /** æä»¶ä¸ä¼ æåå¤ç */ |
| | | const handleFileSuccess = (response, file, fileList) => { |
| | | upload.open = false; |
| | | upload.isUploading = false; |
| | | proxy.$refs["uploadRef"].handleRemove(file); |
| | | getList(); |
| | | }; |
| | | |
| | | // å页åå |
| | | const changePage = ({ page, limit }) => { |
| | | pagination.currentPage = page; |
| | | pagination.pageSize = limit; |
| | | getTableData(); |
| | | // è¡¨æ ¼éæ©æ°æ® |
| | | const handleSelectionChange = (selection) => { |
| | | selectedRows.value = selection; |
| | | }; |
| | | |
| | | // å¤éå¤ç |
| | | const handleSelectionChange = (selectionList) => { |
| | | multipleList.value = selectionList; |
| | | }; |
| | | |
| | | // æ°å¢ |
| | | const add = () => { |
| | | dialogTitle.value = "æ°å¢å·¡æ£"; |
| | | formData.id = ""; |
| | | formData.name = ""; |
| | | formData.type = "0"; |
| | | formData.status = "0"; |
| | | formData.planStartTime = ""; |
| | | formData.planEndTime = ""; |
| | | formData.actualStartTime = ""; |
| | | formData.actualEndTime = ""; |
| | | formData.inspector = ""; |
| | | formData.area = ""; |
| | | formData.content = ""; |
| | | dialogVisible.value = true; |
| | | }; |
| | | |
| | | // ç¼è¾ |
| | | const edit = (row) => { |
| | | dialogTitle.value = "ç¼è¾å·¡æ£"; |
| | | formData.id = row.id; |
| | | formData.name = row.name; |
| | | formData.type = row.type; |
| | | formData.status = row.status; |
| | | formData.planStartTime = row.planStartTime; |
| | | formData.planEndTime = row.planEndTime; |
| | | formData.actualStartTime = row.actualStartTime; |
| | | formData.actualEndTime = row.actualEndTime; |
| | | formData.inspector = row.inspector; |
| | | formData.area = row.area; |
| | | formData.content = row.content; |
| | | dialogVisible.value = true; |
| | | }; |
| | | |
| | | // ä¿åæ°æ® |
| | | const saveData = () => { |
| | | if ( |
| | | !formData.name || |
| | | !formData.planStartTime || |
| | | !formData.planEndTime || |
| | | !formData.inspector || |
| | | !formData.area |
| | | ) { |
| | | ElMessage.warning("请填åå¿
å¡«åæ®µ"); |
| | | return; |
| | | } |
| | | |
| | | if (formData.id) { |
| | | // ç¼è¾ |
| | | const index = mockData.findIndex((item) => item.id === formData.id); |
| | | if (index !== -1) { |
| | | mockData[index] = { |
| | | ...mockData[index], |
| | | ...formData, |
| | | }; |
| | | ElMessage.success("ç¼è¾æå"); |
| | | } |
| | | } else { |
| | | // æ°å¢ |
| | | const newId = Math.max(...mockData.map((item) => item.id), 0) + 1; |
| | | mockData.unshift({ |
| | | ...formData, |
| | | id: newId, |
| | | // æå¼å¼¹æ¡ |
| | | const openForm = (type, row) => { |
| | | operationType.value = type; |
| | | form.value = {}; |
| | | form.value.maintainUserId = userStore.id; |
| | | form.value.maintainTime = getCurrentDate(); |
| | | userListNoPage().then((res) => { |
| | | userList.value = res.data; |
| | | }); |
| | | if (type === "edit") { |
| | | getSupplier(row.id).then((res) => { |
| | | form.value = { ...res.data }; |
| | | }); |
| | | ElMessage.success("æ°å¢æå"); |
| | | } |
| | | dialogVisible.value = false; |
| | | getTableData(); |
| | | dialogFormVisible.value = true; |
| | | }; |
| | | |
| | | // å¼å§å·¡æ£ |
| | | const startInspection = (row) => { |
| | | const index = mockData.findIndex((item) => item.id === row.id); |
| | | if (index !== -1) { |
| | | mockData[index].status = "1"; |
| | | mockData[index].actualStartTime = dayjs().format("YYYY-MM-DD HH:mm:ss"); |
| | | ElMessage.success("å·¡æ£å·²å¼å§"); |
| | | getTableData(); |
| | | } |
| | | // æäº¤è¡¨å |
| | | const submitForm = () => { |
| | | proxy.$refs["formRef"].validate((valid) => { |
| | | if (valid) { |
| | | if (operationType.value === "edit") { |
| | | submitEdit(); |
| | | } else { |
| | | submitAdd(); |
| | | } |
| | | } |
| | | }); |
| | | }; |
| | | |
| | | // å®æå·¡æ£ |
| | | const completeInspection = (row) => { |
| | | const index = mockData.findIndex((item) => item.id === row.id); |
| | | if (index !== -1) { |
| | | mockData[index].status = "2"; |
| | | mockData[index].actualEndTime = dayjs().format("YYYY-MM-DD HH:mm:ss"); |
| | | ElMessage.success("å·¡æ£å·²å®æ"); |
| | | getTableData(); |
| | | } |
| | | // æäº¤æ°å¢ |
| | | const submitAdd = () => { |
| | | addSupplier(form.value).then((res) => { |
| | | proxy.$modal.msgSuccess("æäº¤æå"); |
| | | closeDia(); |
| | | getList(); |
| | | }); |
| | | }; |
| | | |
| | | // åæ¶å·¡æ£ |
| | | const cancelInspection = (row) => { |
| | | ElMessageBox.confirm("ç¡®å®è¦åæ¶è¯¥å·¡æ£å?", "æç¤º", { |
| | | confirmButtonText: "ç¡®å®", |
| | | // æäº¤ä¿®æ¹ |
| | | const submitEdit = () => { |
| | | updateSupplier(form.value).then((res) => { |
| | | proxy.$modal.msgSuccess("æäº¤æå"); |
| | | closeDia(); |
| | | getList(); |
| | | }); |
| | | }; |
| | | // å
³éå¼¹æ¡ |
| | | const closeDia = () => { |
| | | proxy.resetForm("formRef"); |
| | | dialogFormVisible.value = false; |
| | | }; |
| | | // å¯¼åº |
| | | const handleOut = () => { |
| | | ElMessageBox.confirm("éä¸çå
容å°è¢«å¯¼åºï¼æ¯å¦ç¡®è®¤å¯¼åºï¼", "导åº", { |
| | | confirmButtonText: "确认", |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning", |
| | | }) |
| | | .then(() => { |
| | | const index = mockData.findIndex((item) => item.id === row.id); |
| | | if (index !== -1) { |
| | | mockData[index].status = "3"; |
| | | ElMessage.success("å·¡æ£å·²åæ¶"); |
| | | getTableData(); |
| | | } |
| | | }) |
| | | .catch(() => {}); |
| | | .then(() => { |
| | | proxy.download("/system/supplier/export", {}, "ä¾åºåæ¡£æ¡.xlsx"); |
| | | }) |
| | | .catch(() => { |
| | | proxy.$modal.msg("已忶"); |
| | | }); |
| | | }; |
| | | |
| | | // å é¤ |
| | | const deleteRow = (id) => { |
| | | ElMessageBox.confirm("æ¤æä½å°æ°¸ä¹
å é¤è¯¥å·¡æ£è®°å½, æ¯å¦ç»§ç»?", "æç¤º", { |
| | | confirmButtonText: "ç¡®å®", |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning", |
| | | }) |
| | | .then(() => { |
| | | const index = mockData.findIndex((item) => item.id === id); |
| | | if (index !== -1) { |
| | | mockData.splice(index, 1); |
| | | ElMessage.success("å 餿å"); |
| | | getTableData(); |
| | | } |
| | | }) |
| | | .catch(() => {}); |
| | | }; |
| | | |
| | | // æ¹éå é¤ |
| | | const batchDelete = () => { |
| | | if (multipleList.value.length === 0) { |
| | | ElMessage.warning("è¯·éæ©è¦å é¤çæ°æ®"); |
| | | const handleDelete = () => { |
| | | let ids = []; |
| | | if (selectedRows.value.length > 0) { |
| | | // æ£æ¥æ¯å¦æä»äººç»´æ¤çæ°æ® |
| | | const unauthorizedData = selectedRows.value.filter(item => item.maintainUserName !== userStore.nickName); |
| | | if (unauthorizedData.length > 0) { |
| | | proxy.$modal.msgWarning("ä¸å¯å é¤ä»äººç»´æ¤çæ°æ®"); |
| | | return; |
| | | } |
| | | ids = selectedRows.value.map((item) => item.id); |
| | | } else { |
| | | proxy.$modal.msgWarning("è¯·éæ©æ°æ®"); |
| | | return; |
| | | } |
| | | |
| | | ElMessageBox.confirm("æ¤æä½å°æ°¸ä¹
å 餿éå·¡æ£è®°å½, æ¯å¦ç»§ç»?", "æç¤º", { |
| | | confirmButtonText: "ç¡®å®", |
| | | ElMessageBox.confirm("éä¸çå
容å°è¢«å é¤ï¼æ¯å¦ç¡®è®¤å é¤ï¼", "å é¤æç¤º", { |
| | | confirmButtonText: "确认", |
| | | cancelButtonText: "åæ¶", |
| | | type: "warning", |
| | | }) |
| | | .then(() => { |
| | | const ids = multipleList.value.map((item) => item.id); |
| | | mockData.forEach((item, index) => { |
| | | if (ids.includes(item.id)) { |
| | | mockData.splice(index, 1); |
| | | } |
| | | .then(() => { |
| | | tableLoading.value = true; |
| | | delSupplier(ids) |
| | | .then((res) => { |
| | | proxy.$modal.msgSuccess("å 餿å"); |
| | | getList(); |
| | | }) |
| | | .finally(() => { |
| | | tableLoading.value = false; |
| | | }); |
| | | }) |
| | | .catch(() => { |
| | | proxy.$modal.msg("已忶"); |
| | | }); |
| | | ElMessage.success("å 餿å"); |
| | | getTableData(); |
| | | multipleList.value = []; |
| | | }) |
| | | .catch(() => {}); |
| | | }; |
| | | |
| | | // åå§åæ°æ® |
| | | // è·åå½åæ¥æå¹¶æ ¼å¼å为 YYYY-MM-DD |
| | | function getCurrentDate() { |
| | | const today = new Date(); |
| | | const year = today.getFullYear(); |
| | | const month = String(today.getMonth() + 1).padStart(2, "0"); // æä»½ä»0å¼å§ |
| | | const day = String(today.getDate()).padStart(2, "0"); |
| | | return `${year}-${month}-${day}`; |
| | | } |
| | | |
| | | onMounted(() => { |
| | | getTableData(); |
| | | getList(); |
| | | }); |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | .table_list { |
| | | margin-top: unset; |
| | | } |
| | | .actions { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | margin-bottom: 10px; |
| | | } |
| | | </style> |
| | | <style scoped lang="scss"></style> |
| | |
| | | const { VITE_APP_ENV } = env;
|
| | | const baseUrl =
|
| | | VITE_APP_ENV == "development"
|
| | | ? "http://10.136.12.71:7003" // å¼åç¯å¢å端æ¥å£
|
| | | : "http://10.136.12.71:7003"; // ç产ç¯å¢å端æ¥å£
|
| | | ? "http://127.0.0.1:7003" // å¼åç¯å¢å端æ¥å£
|
| | | : "http://10.136.58.73:7003"; // ç产ç¯å¢å端æ¥å£
|
| | |
|
| | | return {
|
| | | // é¨ç½²ç产ç¯å¢åå¼åç¯å¢ä¸çURLã
|