zhangjie 1 rok temu
rodzic
commit
b468c73813
40 zmienionych plików z 567 dodań i 221 usunięć
  1. 2 3
      src/api/resource-guard.js
  2. 12 0
      src/assets/icons/icon-custom-manage.svg
  3. 14 0
      src/assets/icons/icon-device-manage.svg
  4. 12 0
      src/assets/icons/icon-ding-configure.svg
  5. 12 0
      src/assets/icons/icon-level-manage.svg
  6. 13 0
      src/assets/icons/icon-log-manage.svg
  7. 12 0
      src/assets/icons/icon-notice-manage.svg
  8. 7 0
      src/assets/icons/icon-org.svg
  9. 12 0
      src/assets/icons/icon-quality-problem.svg
  10. 12 0
      src/assets/icons/icon-role-manage.svg
  11. 14 0
      src/assets/icons/icon-supplier-manage.svg
  12. 14 0
      src/assets/icons/icon-user-manage.svg
  13. 12 0
      src/assets/icons/icon-质量监控分析.svg
  14. 40 0
      src/components/common/select-enable/index.vue
  15. 51 0
      src/components/common/status-tag/config.js
  16. 22 0
      src/components/common/status-tag/index.vue
  17. 7 1
      src/config/constants.js
  18. 4 0
      src/hooks/useClearDialog.js
  19. 1 1
      src/router/modules/projectQuality.js
  20. 7 7
      src/router/modules/system.js
  21. 3 3
      src/router/modules/user.js
  22. 16 16
      src/views/project-quality/project-quality-manage/issues-feedback/index.vue
  23. 16 9
      src/views/resource-guard/person-guard/person-allocate/index.vue
  24. 1 0
      src/views/resource-guard/person-guard/person-files/add-person-file-dialog.vue
  25. 3 3
      src/views/resource-guard/person-guard/person-files/index.vue
  26. 2 17
      src/views/service-unit/service-unit-manage/unit-manage/index.vue
  27. 2 15
      src/views/sop/sop-monitor/delay-warning/index.vue
  28. 5 15
      src/views/sop/sop-monitor/violation-registration/index.vue
  29. 25 21
      src/views/system/config-manage/customer-manage/edit-customer-dialog.vue
  30. 6 8
      src/views/system/config-manage/customer-manage/index.vue
  31. 9 7
      src/views/system/config-manage/device-manage/edit-device-dialog.vue
  32. 26 23
      src/views/system/config-manage/device-manage/index.vue
  33. 12 14
      src/views/system/config-manage/service-level-manage/edit-service-level-dialog.vue
  34. 4 1
      src/views/system/config-manage/service-level-manage/index.vue
  35. 15 6
      src/views/system/config-manage/supplier-manage/edit-supplier-dialog.vue
  36. 2 2
      src/views/system/config-manage/supplier-manage/index.vue
  37. 1 1
      src/views/system/notice-log/log-manage/index.vue
  38. 81 22
      src/views/system/notice-log/notice-manage/edit-notice-dialog.vue
  39. 2 2
      src/views/system/notice-log/notice-manage/index.vue
  40. 56 24
      src/views/system/notice-log/notice-manage/notice-message-dialog.vue

+ 2 - 3
src/api/resource-guard.js

@@ -45,11 +45,10 @@ export const personAllocateStatisticsApi = (data) =>
     url: '/api/admin/user/archives/allocation/sub_total',
     params: data,
   });
-export const personAllocateBatchDeployApi = (serviceUnitId) =>
+export const personAllocateBatchDeployApi = ({ crmIdList, serviceUnitId }) =>
   request({
     url: '/api/admin/user/archives/allocation/auto_edit',
-    params: { serviceUnitId },
-    paramsSerializer,
+    data: { crmIdList, serviceUnitId },
   });
 export const personAllocateRoleDetailApi = (crmNo) =>
   request({

+ 12 - 0
src/assets/icons/icon-custom-manage.svg

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="16.2500001px" height="16.2500001px" viewBox="0 0 16.2500001 16.2500001" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>icon-客户配置</title>
+    <g id="系统管理" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="28.01-系统管理-客户配置" transform="translate(-97.875, -65.875)">
+            <g id="icon-客户配置" transform="translate(96, 64)">
+                <polygon id="Rectangle-4117" opacity="0" transform="translate(10, 10) rotate(0) translate(-10, -10)" points="3.49690833e-06 3.49691024e-06 20.0000037 3.49691024e-06 20.0000037 20.0000037 3.49690833e-06 20.0000037"></polygon>
+                <path d="M9.37500372,13.7499952 L10.6250033,13.7499952 L10.6250033,16.2499943 L9.37500372,16.2499943 Z M10.0000071,10.6250001 C7.58376112,10.6250001 5.62500674,8.66624601 5.62500674,6.24999975 C5.62500674,3.8337538 7.58376112,1.87500001 10.0000071,1.87500001 C12.416253,1.87500001 14.375007,3.8337538 14.375007,6.24999975 C14.375007,8.66624601 12.416253,10.6250001 10.0000071,10.6250001 Z M10.0000071,9.37500001 C8.27411642,9.37500001 6.87500701,7.97588951 6.87500701,6.24999975 C6.87500701,4.5241097 8.27411642,3.12499943 10.0000071,3.12499943 C11.7258965,3.12499943 13.1250071,4.5241097 13.1250071,6.24999975 C13.1250071,7.9758901 11.7258965,9.37500001 10.0000071,9.37500001 Z M18.1250071,14.6557857 L18.1250071,17.5000001 C18.1250071,17.8451778 17.8451848,18.1250001 17.5000071,18.1250001 L2.50000865,18.1250001 C2.15483066,18.1250001 1.87500701,17.8451778 1.87500701,17.5000001 L1.87500701,14.6557857 C1.87500701,14.1933204 2.12877692,13.7652827 2.54608729,13.5659684 C4.81176089,12.4838449 7.33314325,11.875 10.0000077,11.875 C12.6668715,11.875 15.1882541,12.4838449 17.453928,13.5659684 C17.871238,13.7652827 18.1250071,14.1933204 18.1250071,14.6557857 Z M16.875007,14.6747888 L16.875007,16.875 L3.12500821,16.875 L3.12500821,14.6747888 C5.21793831,13.6821593 7.5417619,13.1250001 10.0000077,13.1250001 C12.4582528,13.1250001 14.782077,13.6821593 16.875007,14.6747888 Z" id="Union" fill="#165DFF"></path>
+            </g>
+        </g>
+    </g>
+</svg>

+ 14 - 0
src/assets/icons/icon-device-manage.svg

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="15px" height="15px" viewBox="0 0 15 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>icon-设备配置</title>
+    <g id="系统管理" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="28.01-系统管理-客户配置" transform="translate(-98.4988, -146.4986)">
+            <g id="3.Navigation导航/4.Menu导航菜单/左侧导航选项/一级有图标/默认备份-13" transform="translate(80, 136)">
+                <g id="icon-设备配置" transform="translate(16, 8)">
+                    <rect id="print-(Background)" opacity="0" x="0" y="0" width="20" height="20"></rect>
+                    <path d="M4.9987793,4.99862671 L3.7487793,4.99862671 C3.05360131,4.99862671 2.4987793,5.5534488 2.4987793,6.24862671 L2.4987793,12.4986267 C2.4987793,13.1938052 3.05360131,13.7486267 3.7487793,13.7486267 L4.9987793,13.7486267 L4.9987793,17.4986267 L14.9987793,17.4986267 L14.9987793,13.7486267 L16.2487793,13.7486267 C16.9439578,13.7486267 17.4987793,13.1938052 17.4987793,12.4986267 L17.4987793,6.24862671 C17.4987793,5.5534488 16.9439578,4.99862671 16.2487793,4.99862671 L14.9987793,4.99862671 L14.9987793,2.49862671 L4.9987793,2.49862671 L4.9987793,4.99862671 Z M13.7487793,3.74862671 L6.2487793,3.74862671 L6.2487793,4.99862671 L13.7487793,4.99862671 L13.7487793,3.74862671 Z M3.7487793,12.4986267 L4.9987793,12.4986267 L4.9987793,9.99862671 L14.9987793,9.99862671 L14.9987793,12.4986267 L16.2487793,12.4986267 L16.2487793,6.24862671 L3.7487793,6.24862671 L3.7487793,12.4986267 Z M6.2487793,11.2486267 L13.7487793,11.2486267 L13.7487793,16.2486267 L6.2487793,16.2486267 L6.2487793,11.2486267 Z" id="print" fill="#262626"></path>
+                </g>
+            </g>
+        </g>
+    </g>
+</svg>

+ 12 - 0
src/assets/icons/icon-ding-configure.svg

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="17.5px" height="17.5px" viewBox="0 0 17.5 17.5" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>icon-考勤配置</title>
+    <g id="系统管理" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="28.01-系统管理-客户配置" transform="translate(-97.25, -225.25)">
+            <g id="icon-考勤配置" transform="translate(96, 224)">
+                <rect id="time-(Background)" opacity="0" x="0" y="0" width="20" height="20"></rect>
+                <path d="M9.375,10.4861557 L12.5003052,13.75 L13.3841896,12.8661156 L10.625,9.96838927 L10.625,5 L9.375,5 L9.375,10.4861557 Z M10,18.75 C5.16750842,18.75 1.25,14.8324919 1.25,10 C1.25,5.16750842 5.16750842,1.25 10,1.25 C14.8324919,1.25 18.75,5.16750842 18.75,10 C18.75,14.8324919 14.8324919,18.75 10,18.75 Z M10,17.5 C5.85786432,17.5 2.5,14.1421354 2.5,10 C2.5,5.85786432 5.85786432,2.5 10,2.5 C14.1421354,2.5 17.5,5.85786432 17.5,10 C17.5,14.1421354 14.1421354,17.5 10,17.5 Z" id="time" fill="#262626"></path>
+            </g>
+        </g>
+    </g>
+</svg>

+ 12 - 0
src/assets/icons/icon-level-manage.svg

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="15px" height="13.3216423px" viewBox="0 0 15 13.3216423" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>icon-服务档位配置</title>
+    <g id="系统管理" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="28.01-系统管理-客户配置" transform="translate(-98.5, -188.0717)">
+            <g id="icon-服务档位配置" transform="translate(96, 184)">
+                <rect id="heart-(Background)" opacity="0" x="0" y="0" width="20" height="20"></rect>
+                <path d="M8.6701411,6.10166132 C6.78690463,4.3753612 3.75,5.71130127 3.75,8.266038 C3.75,9.04474676 4.0593414,9.79156315 4.60997209,10.3421938 L10,15.7322216 L15.390029,10.3421932 C15.940659,9.79156256 16.25,9.04474705 16.25,8.2660374 C16.25,5.71130097 13.2130957,4.37536106 11.3298589,6.10166177 L10,7.3206982 L8.6701411,6.10166132 Z M2.5,8.266038 C2.5,9.37626779 2.94103771,10.4410261 3.7260887,11.2260771 L9.81786728,17.3178554 C9.91845667,17.4184442 10.0815427,17.4184453 10.1821321,17.3178566 L16.2739122,11.2260765 C17.0589638,10.4410255 17.5,9.37626719 17.5,8.2660374 C17.5,4.62366819 13.170191,2.71898016 10.4852033,5.18021882 L10,5.62498823 L9.51479673,5.18021874 C6.82980925,2.71897994 2.5,4.62366879 2.5,8.266038 Z" id="heart" fill="#262626"></path>
+            </g>
+        </g>
+    </g>
+</svg>

+ 13 - 0
src/assets/icons/icon-log-manage.svg

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="16.25px" height="15px" viewBox="0 0 16.25 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>icon-日志查询</title>
+    <g id="系统管理" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="28.01-系统管理-客户配置" transform="translate(-97.875, -346.5)">
+            <g id="root.list" transform="translate(96, 344)">
+                <rect id="root.list-(Background)" opacity="0" x="0" y="0" width="20" height="20"></rect>
+                <rect id="矩形" opacity="0" x="0" y="0" width="20" height="20"></rect>
+                <path d="M18.125,16.25 C18.125,16.9403563 17.5653553,17.5 16.875,17.5 L3.125,17.5 C2.43464403,17.5 1.875,16.9403563 1.875,16.25 L1.875,3.5 C1.875,2.94771525 2.32271525,2.5 2.875,2.5 L17.125,2.5 C17.6772847,2.5 18.125,2.94771525 18.125,3.5 L18.125,16.25 L18.125,16.25 Z M3.125,3.75 L3.125,16.25 L16.875,16.25 L16.875,3.75 L3.125,3.75 Z M5,5.625 L5,6.875 L15,6.875 L15,5.625 L5,5.625 Z M5,8.75 L5,10 L12.5,10 L12.5,8.75 L5,8.75 Z" id="root-list" fill-opacity="0.9" fill="#262626"></path>
+            </g>
+        </g>
+    </g>
+</svg>

+ 12 - 0
src/assets/icons/icon-notice-manage.svg

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="16.8745783px" height="14.0441929px" viewBox="0 0 16.8745783 14.0441929" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>icon-通知公告管理</title>
+    <g id="系统管理" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="28.01-系统管理-客户配置" transform="translate(-97.8753, -306.9779)">
+            <g id="icon-通知公告管理" transform="translate(96, 304)">
+                <rect id="sound-(Background)" opacity="0" x="0" y="0" width="20" height="20"></rect>
+                <path d="M10.3033233,16.9320655 C10.7199007,17.1820128 11.2498832,16.8819427 11.2498832,16.3961327 L11.2498832,3.60387027 C11.2498832,3.11806124 10.7199007,2.81799084 10.3033227,3.06793755 L4.99988317,6.25000119 L2.63091035,6.25000119 C2.21697122,6.25000119 1.88129723,6.58535987 1.88091055,6.99930072 L1.87530518,12.9992998 C1.87491827,13.4137869 2.21081741,13.7500012 2.62530521,13.7500012 L4.99988317,13.7500012 L10.3033233,16.9320655 Z M6.24988317,13.042264 L9.99988317,15.2922642 L9.99988317,4.7077392 L6.24988317,6.95773929 L6.24988317,13.042264 Z M4.99988317,7.50000119 L3.13044339,7.50000119 L3.12577248,12.5000012 L4.99988317,12.5000012 L4.99988317,7.50000119 Z M15.1511109,4.72663581 L16.0040092,3.81281674 C16.8745601,4.62533116 17.5651169,5.58992445 18.0362535,6.65152133 C18.5073924,7.71312118 18.7498832,8.85093629 18.7498832,10.0000012 C18.7498832,11.1490661 18.5073924,12.2868812 18.0362535,13.3484817 C17.5651169,14.4100785 16.8745601,15.3746712 16.0040092,16.1871862 L15.1511109,15.273366 C15.9019208,14.5726109 16.4925289,13.7454057 16.8937159,12.8414226 C17.294786,11.9377065 17.4998832,10.9724677 17.4998832,10.0000012 C17.4998832,9.02753472 17.294786,8.06229591 16.8937159,7.15857923 C16.4925289,6.25459671 15.9019208,5.42739183 15.1511109,4.72663581 Z M13.0342937,6.93297774 L13.9102805,6.04126781 C15.0287712,7.14003682 15.6261909,8.55799317 15.6249547,10.0014114 C15.6237185,11.4448643 15.0238407,12.862094 13.9033651,13.9593756 L13.0287743,13.0662954 C13.9215171,12.1920341 14.3740213,11.091547 14.3749547,10.0003409 C14.3758893,8.90918434 13.9253175,7.80829072 13.0342937,6.93297774 Z" id="sound" fill="#262626"></path>
+            </g>
+        </g>
+    </g>
+</svg>

Plik diff jest za duży
+ 7 - 0
src/assets/icons/icon-org.svg


+ 12 - 0
src/assets/icons/icon-quality-problem.svg

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="15px" height="13.3250764px" viewBox="0 0 15 13.3250764" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>icon-质量问题反馈</title>
+    <g id="项目质量管理" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="24.01-项目质量管理" transform="translate(-98.5, -27.75)">
+            <g id="icon-质量问题反馈" transform="translate(96, 24)">
+                <rect id="chat-(Background)" opacity="0" x="0" y="0" width="20" height="20"></rect>
+                <path d="M16.25,13.125 L16.25,5 L3.75,5 L3.75,14.8311985 L5.79743773,13.125 L16.25,13.125 Z M2.5,16.6993594 L2.5,4.99999963 C2.5,4.30964373 3.0596441,3.75 3.75,3.75 L16.25,3.75 C16.9403565,3.75 17.5,4.3096441 17.5,5 L17.5,13.125 C17.5,13.8153565 16.9403565,14.375 16.25,14.375 L6.25,14.375 L3.11506853,16.987443 C2.87082091,17.1909821 2.5,17.0172989 2.5,16.6993594 Z" id="chat" fill="#165DFF"></path>
+            </g>
+        </g>
+    </g>
+</svg>

+ 12 - 0
src/assets/icons/icon-role-manage.svg

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="16.25px" height="16.25px" viewBox="0 0 16.25 16.25" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>icon-角色管理</title>
+    <g id="用户管理" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="25.01-用户管理-组织架构管理" transform="translate(-97.875, -185.875)">
+            <g id="icon-角色管理" transform="translate(96, 184)">
+                <rect id="user-avatar-(Background)" opacity="0" x="0" y="0" width="20" height="20"></rect>
+                <path d="M14.375,14.2244053 L14.375,15.625 L15.625,15.624994 L15.625,14.1979527 C15.625,13.7632895 15.4015887,13.3551991 15.0181198,13.1505442 C13.4865642,12.3331618 11.7906517,11.875 10,11.875 C8.20934832,11.875 6.51343584,12.3331618 4.98188019,13.1505442 C4.59841192,13.3551991 4.375,13.7632895 4.375,14.1979516 L4.375,15.624994 L5.625,15.624994 L5.625,14.2244053 C6.97242439,13.5157359 8.4484458,13.125 10,13.125 C11.5515536,13.125 13.027575,13.5157359 14.375,14.2244053 Z M10,10.625 C8.27410996,10.625 6.875,9.22589004 6.875,7.5 C6.875,5.77410996 8.27410996,4.375 10,4.375 C11.72589,4.375 13.125,5.77410996 13.125,7.5 C13.125,9.22589004 11.72589,10.625 10,10.625 Z M10,9.375 C8.96446586,9.375 8.125,8.53553414 8.125,7.5 C8.125,6.46446586 8.96446586,5.625 10,5.625 C11.0355341,5.625 11.875,6.46446586 11.875,7.5 C11.875,8.53553414 11.0355341,9.375 10,9.375 Z M1.875,3.12499993 L1.875,16.875 C1.875,17.5653553 2.43464403,18.125 3.12499993,18.125 L16.875,18.125 C17.5653553,18.125 18.125,17.5653565 18.125,16.875 L18.125,3.125 C18.125,2.4346441 17.5653565,1.875 16.875,1.875 L3.125,1.875 C2.4346441,1.875 1.875,2.43464403 1.875,3.12499993 Z M3.125,3.125 L3.12499993,16.875 L16.875,16.875 L16.875,3.125 L3.125,3.125 Z" id="user-avatar" fill="#262626"></path>
+            </g>
+        </g>
+    </g>
+</svg>

+ 14 - 0
src/assets/icons/icon-supplier-manage.svg

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="17.3428506px" height="15.625px" viewBox="0 0 17.3428506 15.625" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>icon-供应商配置</title>
+    <g id="系统管理" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="28.01-系统管理-客户配置" transform="translate(-97.25, -106.5)">
+            <g id="3.Navigation导航/4.Menu导航菜单/左侧导航选项/一级有图标/默认备份-17" transform="translate(80, 96)">
+                <g id="icon-供应商配置" transform="translate(16, 8)">
+                    <rect id="cart-(Background)" opacity="0" x="0" y="0" width="20" height="20"></rect>
+                    <path d="M3.2205455,3.75 L4.9562788,14.1643989 C5.03664345,14.6465874 5.45383364,15 5.94267279,15 L17.5,15 L17.5,13.75 L6.15445465,13.75 L5.73778778,11.25 L16.5298581,11.25 C16.9887257,11.25 17.3887086,10.9377033 17.5,10.4925358 L18.5625005,6.24253571 C18.7202871,5.61138928 18.242929,5 17.5923586,5 L4.69612092,5 L4.4187212,3.33560109 C4.33835655,2.85341315 3.92116666,2.5 3.43232736,2.5 L1.25,2.5 L1.25,3.75 L3.2205455,3.75 Z M5.52945435,10 L4.90445435,6.25 L17.2721636,6.25 L16.3346636,10 L5.52945435,10 Z M6.875,17.1875 C6.875,16.6697335 6.45526707,16.25 5.9375,16.25 C5.41973293,16.25 5,16.6697335 5,17.1875 C5,17.7052665 5.41973293,18.125 5.9375,18.125 C6.45526707,18.125 6.875,17.7052665 6.875,17.1875 Z M16.9536948,17.1875 C16.9536948,16.6697335 16.5339613,16.25 16.0161948,16.25 C15.4984283,16.25 15.0786948,16.6697335 15.0786948,17.1875 C15.0786948,17.7052665 15.4984283,18.125 16.0161948,18.125 C16.5339613,18.125 16.9536948,17.7052665 16.9536948,17.1875 Z" id="cart" fill="#262626"></path>
+                </g>
+            </g>
+        </g>
+    </g>
+</svg>

+ 14 - 0
src/assets/icons/icon-user-manage.svg

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="16.25px" height="16.25px" viewBox="0 0 16.25 16.25" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>icon-用户管理</title>
+    <g id="用户管理" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="25.01-用户管理-组织架构管理" transform="translate(-97.875, -145.875)">
+            <g id="3.Navigation导航/4.Menu导航菜单/左侧导航选项/一级有图标/默认备份-13" transform="translate(80, 136)">
+                <g id="icon-用户管理" transform="translate(16, 8)">
+                    <polygon id="Rectangle-4117" opacity="0" transform="translate(10, 10) rotate(0) translate(-10, -10)" points="3.49691086e-06 3.49691086e-06 20.0000035 3.49691086e-06 20.0000035 20.0000035 3.49691086e-06 20.0000035"></polygon>
+                    <path d="M10.000007,10.625 C7.58376106,10.625 5.6250067,8.66624594 5.6250067,6.2499997 C5.6250067,3.83375376 7.58376106,1.875 10.000007,1.875 C12.4162529,1.875 14.375007,3.83375376 14.375007,6.2499997 C14.375007,8.66624594 12.4162529,10.625 10.000007,10.625 Z M10.000007,9.375 C8.27411636,9.375 6.87500699,7.97588944 6.87500699,6.2499997 C6.87500699,4.52410966 8.27411636,3.1249994 10.000007,3.1249994 C11.7258964,3.1249994 13.125007,4.52410966 13.125007,6.2499997 C13.125007,7.97589004 11.7258964,9.375 10.000007,9.375 Z M18.125007,14.6557856 L18.125007,17.5 C18.125007,17.8451777 17.8451846,18.125 17.500007,18.125 L2.50000863,18.125 C2.15483065,18.125 1.87500699,17.8451777 1.87500699,17.5 L1.87500699,14.6557856 C1.87500699,14.1933203 2.1287769,13.7652826 2.54608727,13.5659683 C4.81176085,12.4838448 7.33314319,11.875 10.0000076,11.875 C12.6668714,11.875 15.188254,12.4838448 17.4539278,13.5659683 C17.8712378,13.7652826 18.125007,14.1933203 18.125007,14.6557856 Z M16.875007,14.6747887 L16.875007,16.875 L3.12500819,16.875 L3.12500819,14.6747887 C5.21793826,13.6821592 7.54176184,13.125 10.0000076,13.125 C12.4582527,13.125 14.7820769,13.6821592 16.875007,14.6747887 Z" id="Union" fill="#262626"></path>
+                </g>
+            </g>
+        </g>
+    </g>
+</svg>

+ 12 - 0
src/assets/icons/icon-质量监控分析.svg

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="17.5px" height="17.5px" viewBox="0 0 17.5 17.5" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <title>icon-质量监控分析</title>
+    <g id="项目质量管理" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="24.01-项目质量管理" transform="translate(-97.25, -65.25)">
+            <g id="icon-质量监控分析" transform="translate(96, 64)">
+                <rect id="chart-pie-(Background)" opacity="0" x="0" y="0" width="20" height="20"></rect>
+                <path d="M10,18.75 C5.16750842,18.75 1.25,14.8324919 1.25,10 C1.25,5.16750842 5.16750842,1.25 10,1.25 C14.8324919,1.25 18.75,5.16750842 18.75,10 C18.75,14.8324919 14.8324919,18.75 10,18.75 Z M10,17.5 C5.85786432,17.5 2.5,14.1421354 2.5,10 C2.5,6.06833518 5.52529335,2.84326538 9.375,2.52567112 L9.375,10.625 L17.4743295,10.625 C17.1567357,14.4747066 13.9316642,17.5 10,17.5 Z M10.625,9.375 L10.625,2.52567112 C14.2686236,2.8262639 17.1737361,5.73137671 17.4743295,9.375 L10.625,9.375 Z" id="chart-pie" fill="#262626"></path>
+            </g>
+        </g>
+    </g>
+</svg>

+ 40 - 0
src/components/common/select-enable/index.vue

@@ -0,0 +1,40 @@
+<template>
+  <t-radio-group
+    v-model="selected"
+    allow-uncheck
+    :options="optionList"
+    @change="onChange"
+  ></t-radio-group>
+</template>
+
+<script setup name="SelectEnable">
+import { ref, watch } from 'vue';
+import { ABLE_TYPE } from '@/config/constants';
+
+let optionList = ref([]);
+let selected = ref('');
+
+optionList.value = Object.keys(ABLE_TYPE).map((k) => {
+  return { value: k === 'true', label: ABLE_TYPE[k] };
+});
+
+const emit = defineEmits(['update:modelValue', 'change']);
+const props = defineProps({
+  modelValue: { type: [Boolean, String], default: '' },
+});
+
+const onChange = () => {
+  emit('update:modelValue', selected.value);
+  emit('change', selected.value);
+};
+
+watch(
+  () => props.modelValue,
+  (val) => {
+    selected.value = val;
+  },
+  {
+    immediate: true,
+  }
+);
+</script>

+ 51 - 0
src/components/common/status-tag/config.js

@@ -0,0 +1,51 @@
+import {
+  enableFilter,
+  serviceUnitStatusFilter,
+  warnFlowStatusFilter,
+  violationFlowStatusFilter,
+  publishStatusFilter,
+} from '@/utils/filter';
+
+const configs = {
+  enable: {
+    themeDict: { true: 'success', false: 'danger' },
+    valFilter: enableFilter,
+  },
+  serviceUnit: {
+    themeDict: {
+      NEW: 'primary',
+      PUBLISH: 'success',
+      FINISH: 'danger',
+      CANCEL: 'danger',
+    },
+    valFilter: serviceUnitStatusFilter,
+  },
+  warnFlow: {
+    themeDict: {
+      NOT_START: 'warning',
+      FOLLOW: 'success',
+      CLOSE: 'default',
+      RESTART: 'primary',
+    },
+    valFilter: warnFlowStatusFilter,
+  },
+  violationFlow: {
+    themeDict: {
+      NOT_START: 'warning',
+      FOLLOW: 'success',
+      CLOSE: 'default',
+      RESTART: 'primary',
+    },
+    valFilter: violationFlowStatusFilter,
+  },
+  notice: {
+    themeDict: {
+      PUBLISH: 'success',
+      UN_PUBLISH: 'danger',
+    },
+    valFilter: publishStatusFilter,
+  },
+};
+export function getConfig(type) {
+  return configs[type] || { themeDict: {}, valFilter: (val) => val };
+}

+ 22 - 0
src/components/common/status-tag/index.vue

@@ -0,0 +1,22 @@
+<template>
+  <t-tag :theme="theme" variant="light">{{ label }}</t-tag>
+</template>
+
+<script setup name="StatusTag">
+import { computed } from 'vue';
+import { getConfig } from './config';
+
+const props = defineProps({
+  value: { type: [Boolean, String, Number], default: '' },
+  type: { type: String },
+});
+
+const { themeDict, valFilter } = getConfig(props.type);
+
+const theme = computed(() => {
+  return themeDict[props.value];
+});
+const label = computed(() => {
+  return valFilter(props.value);
+});
+</script>

+ 7 - 1
src/config/constants.js

@@ -23,8 +23,8 @@ export const EDUCATION_TYPE = {
 };
 // 启用/禁用
 export const ABLE_TYPE = {
-  false: '禁用',
   true: '启用',
+  false: '禁用',
 };
 // 审核结果
 export const AUDITING_RESULT = {
@@ -144,6 +144,12 @@ export const DEVICE_USAGE_TYPE = {
   PROJECT: '项目',
   OTHER: '其他',
 };
+// 派单发布状态
+export const CRM_STATUS = {
+  UN_PUBLISH: '未发布',
+  PUBLISH: '已发布',
+  FINISH: '已完成',
+};
 
 // SOP
 export const FLOW_STATUS = {

+ 4 - 0
src/hooks/useClearDialog.js

@@ -23,6 +23,10 @@ export default function useClearDialog(data, props, formRef, getDetail) {
     (visible) => {
       if (!visible) {
         // formRef?.value?.clearValidate();
+        let cloneData = cloneDeep(data);
+        for (let key in cloneData) {
+          formData[key] = cloneData[key];
+        }
       } else {
         !!props.curRow && getDetail && getDetail();
         setTimeout(() => {

+ 1 - 1
src/router/modules/projectQuality.js

@@ -31,7 +31,7 @@ export default {
             title: '质量问题反馈',
             sort: 1,
             alias: 'qualityProblem',
-            icon: 'service-crm',
+            icon: 'quality-problem',
           },
         },
         {

+ 7 - 7
src/router/modules/system.js

@@ -29,7 +29,7 @@ export default {
             title: '客户配置',
             sort: 1,
             alias: 'custom',
-            icon: 'service-crm',
+            icon: 'custom-manage',
           },
         },
         {
@@ -41,7 +41,7 @@ export default {
             title: '供应商配置',
             sort: 1,
             alias: 'supplier',
-            icon: 'service-crm',
+            icon: 'supplier-manage',
           },
         },
         {
@@ -53,7 +53,7 @@ export default {
             title: '设备配置',
             sort: 1,
             alias: 'device',
-            icon: 'service-crm',
+            icon: 'device-manage',
           },
         },
         {
@@ -67,7 +67,7 @@ export default {
             title: '服务档位配置',
             sort: 1,
             alias: 'level',
-            icon: 'service-crm',
+            icon: 'level-manage',
           },
         },
         {
@@ -79,7 +79,7 @@ export default {
             title: '考勤配置',
             sort: 1,
             alias: 'dingConfigure',
-            icon: 'service-crm',
+            icon: 'ding-configure',
           },
         },
       ],
@@ -103,7 +103,7 @@ export default {
             title: '通知公告管理',
             sort: 1,
             alias: 'noticeManage',
-            icon: 'service-crm',
+            icon: 'notice-manage',
           },
         },
         {
@@ -115,7 +115,7 @@ export default {
             title: '日志查询',
             sort: 2,
             alias: 'log',
-            icon: 'service-crm',
+            icon: 'log-manage',
           },
         },
       ],

+ 3 - 3
src/router/modules/user.js

@@ -29,7 +29,7 @@ export default {
             title: '组织架构管理',
             sort: 1,
             alias: 'org',
-            icon: 'service-crm',
+            icon: 'org',
           },
         },
       ],
@@ -53,7 +53,7 @@ export default {
             title: '用户管理',
             sort: 1,
             alias: 'user',
-            icon: 'service-crm',
+            icon: 'user-manage',
           },
         },
         {
@@ -65,7 +65,7 @@ export default {
             title: '角色管理',
             sort: 2,
             alias: 'role',
-            icon: 'service-crm',
+            icon: 'role-manage',
           },
         },
         {

+ 16 - 16
src/views/project-quality/project-quality-manage/issues-feedback/index.vue

@@ -2,11 +2,11 @@
   <div class="flex flex-col h-full">
     <div class="page-action">
       <t-button
-        variant="outline"
+        theme="primary"
         :disabled="!selectedRowKeys.length"
         @click="handleDestroy"
       >
-        <template #icon><svg-icon name="delete" color="#262626" /></template>
+        <template #icon><svg-icon name="delete" color="#fff" /></template>
         作废
       </t-button>
     </div>
@@ -92,7 +92,7 @@ const fields = ref([
     label: '服务单元',
     type: 'select',
     labelWidth: 100,
-    colSpan: 5,
+    colSpan: 6,
     cell: 'service',
   },
   {
@@ -100,14 +100,14 @@ const fields = ref([
     label: '责任人',
     type: 'select',
     labelWidth: 100,
-    colSpan: 5,
+    colSpan: 6,
   },
   {
     prop: 'type',
     label: '问题类型',
     type: 'select',
     labelWidth: 100,
-    colSpan: 5,
+    colSpan: 6,
     options: dictToOptionList(ISSUES_TYPE),
     attrs: {
       clearable: true,
@@ -118,7 +118,7 @@ const fields = ref([
     label: '问题归因',
     type: 'select',
     labelWidth: 100,
-    colSpan: 5,
+    colSpan: 6,
     options: dictToOptionList(ISSUES_REASON_TYPE),
     attrs: {
       clearable: true,
@@ -142,7 +142,7 @@ const fields = ref([
     label: '影响度',
     type: 'select',
     labelWidth: 100,
-    colSpan: 5,
+    colSpan: 6,
     options: ISSUES_INFLUENCE_DEGREE.map((item) => {
       return {
         label: item,
@@ -157,7 +157,7 @@ const fields = ref([
     prop: 'custom',
     label: '客户名称',
     labelWidth: 100,
-    colSpan: 5,
+    colSpan: 6,
     attrs: {
       clearable: true,
     },
@@ -166,7 +166,7 @@ const fields = ref([
     prop: 'problemNo',
     label: '质量问题编号',
     labelWidth: 100,
-    colSpan: 5,
+    colSpan: 12,
     attrs: {
       clearable: true,
     },
@@ -176,7 +176,7 @@ const fields = ref([
     label: '提交时间',
     type: 'daterange',
     labelWidth: 100,
-    colSpan: 9,
+    colSpan: 12,
     attrs: {
       clearable: true,
       valueType: 'time-stamp',
@@ -207,15 +207,15 @@ const columns = [
     width: 50,
     fixed: 'left',
   },
-  { colKey: 'problemNo', title: '质量问题编号', minWidth: 120 },
-  { colKey: 'crmNo', title: '项目单号', minWidth: 120 },
+  { colKey: 'problemNo', title: '质量问题编号', width: 200 },
+  { colKey: 'crmNo', title: '项目单号', width: 200 },
   { colKey: 'customType', title: '客户类型', cell: 'type', width: 120 },
   { colKey: 'custom', title: '客户名称', width: 140 },
   { colKey: 'sopType', title: '实施产品' },
   { colKey: 'summary', title: '问题简要' },
-  { colKey: 'userNames', title: '责任人' },
+  { colKey: 'userNames', title: '责任人', width: 140 },
   { colKey: 'type', title: '问题类型', cell: 'issues-type', width: 120 },
-  { colKey: 'reason', title: '问题归因', cell: 'issues-reason', width: 120 },
+  { colKey: 'reason', title: '问题归因', cell: 'issues-reason', width: 160 },
   { colKey: 'influenceDegree', title: '影响度', width: 100 },
   { colKey: 'submitter', title: '提交人', width: 140 },
   {
@@ -231,8 +231,8 @@ const columns = [
     width: 180,
   },
   { colKey: 'status', title: '流程状态', cell: 'flow-status', width: 120 },
-  { colKey: 'setup', title: '当前节点' },
-  { colKey: 'pendApproveUsers', title: '当前负责人', width: 120 },
+  { colKey: 'setup', title: '当前节点', minWidth: 160 },
+  { colKey: 'pendApproveUsers', title: '当前负责人', width: 140 },
 ];
 
 const { pagination, tableData, fetchData, search, onChange } = useFetchTable(

+ 16 - 9
src/views/resource-guard/person-guard/person-allocate/index.vue

@@ -13,6 +13,7 @@
         <select-service-unit
           v-model="params[item.prop]"
           default-select
+          :clearable="false"
           @default-selected="initData"
         ></select-service-unit>
       </template>
@@ -83,11 +84,16 @@
         </template>
         <template #operate="{ row }">
           <div class="table-operations">
-            <t-link theme="primary" hover="color" @click="handleDeploy(row)">
+            <t-link
+              v-if="row.crmStatus === 'UN_PUBLISH'"
+              theme="primary"
+              hover="color"
+              @click="handleDeploy(row)"
+            >
               调配
             </t-link>
             <t-link
-              v-if="!row.publish"
+              v-if="row.crmStatus === 'UN_PUBLISH'"
               theme="primary"
               hover="color"
               @click="handleSubmitSop(row)"
@@ -95,7 +101,7 @@
               发布SOP
             </t-link>
             <t-link
-              v-if="row.publish"
+              v-if="row.crmStatus === 'PUBLISH'"
               theme="danger"
               hover="color"
               @click="handleCancelSubmitSop(row)"
@@ -153,7 +159,7 @@ const fields = ref([
     label: '服务单元',
     type: 'select',
     labelWidth: 100,
-    colSpan: 4,
+    colSpan: 6,
     cell: 'service',
   },
   {
@@ -161,14 +167,14 @@ const fields = ref([
     label: '服务区域',
     type: 'select',
     labelWidth: 100,
-    colSpan: 8,
+    colSpan: 7,
     cell: 'area',
   },
   {
     prop: 'customName',
     label: '客户名称',
     labelWidth: 100,
-    colSpan: 4,
+    colSpan: 5,
   },
   {
     prop: 'gap',
@@ -299,9 +305,10 @@ const handleBatchDeploy = () => {
     cancelBtn: '取消',
     onConfirm: async () => {
       confirmDia.hide();
-      const res = await personAllocateBatchDeployApi(
-        selectedRowKeys.value
-      ).catch(() => {});
+      const res = await personAllocateBatchDeployApi({
+        crmIdList: selectedRowKeys.value,
+        serviceUnitId: params.serviceUnitId,
+      }).catch(() => {});
       if (!res) return;
       MessagePlugin.success('操作成功');
       fetchData();

+ 1 - 0
src/views/resource-guard/person-guard/person-files/add-person-file-dialog.vue

@@ -214,6 +214,7 @@ const { formData, isEdit } = useClearDialog(
     for (let key in formData) {
       formData[key] = props.curRow[key];
     }
+    formData.id = formData.userArchivesId;
     formData.roleIds = props.curRow.roleInfoList.map((item) => item.roleId);
   }
 );

+ 3 - 3
src/views/resource-guard/person-guard/person-files/index.vue

@@ -44,8 +44,8 @@
           <span>
             <ErrorCircleFilledIcon /> 在册:{{ statisticsInfo.totalCount }}人
           </span>
-          <span>无效:{{ statisticsInfo.validCount }}人</span>
-          <span>有效:{{ statisticsInfo.invalidCount }}人</span>
+          <span>无效:{{ statisticsInfo.invalidCount }}人</span>
+          <span>有效:{{ statisticsInfo.validCount }}人</span>
           <span>
             实施工程师有效:{{ statisticsInfo.effectEngineerCount }}人
           </span>
@@ -267,7 +267,7 @@ const columns = [
     width: 50,
     fixed: 'left',
   },
-  { colKey: 'userArchivesId', title: '档案流水号', width: 200 },
+  { colKey: 'code', title: '档案流水号', width: 200 },
   { colKey: 'name', title: '姓名', width: 120 },
   { colKey: 'province', title: '省份' },
   { colKey: 'city', title: '城市' },

+ 2 - 17
src/views/service-unit/service-unit-manage/unit-manage/index.vue

@@ -36,11 +36,7 @@
           {{ customerTypeFilter(row[col.colKey]) }}
         </template>
         <template #status="{ col, row }">
-          <t-tag
-            :theme="serviceUnitStatusTheme[row[col.colKey]]"
-            variant="light"
-            >{{ serviceUnitStatusFilter(row[col.colKey]) }}</t-tag
-          >
+          <status-tag :value="row[col.colKey]" type="serviceUnit"></status-tag>
         </template>
         <template #start-time="{ col, row }">
           {{ timestampFilter(row[col.colKey]) }}
@@ -120,11 +116,7 @@ import { omit } from 'lodash';
 import { DialogPlugin, MessagePlugin } from 'tdesign-vue-next';
 import useFetchTable from '@/hooks/useFetchTable';
 import AddUnitDialog from './add-unit-dialog.vue';
-import {
-  timestampFilter,
-  customerTypeFilter,
-  serviceUnitStatusFilter,
-} from '@/utils/filter';
+import { timestampFilter, customerTypeFilter } from '@/utils/filter';
 import { SERVICE_UNIT_STATUS, CUSTOMER_TYPE } from '@/config/constants';
 import { dictToOptionList } from '@/utils/tool';
 import {
@@ -213,13 +205,6 @@ const params = reactive({
   serviceUnitName: '',
 });
 
-const serviceUnitStatusTheme = {
-  NEW: 'primary',
-  PUBLISH: 'success',
-  FINISH: 'danger',
-  CANCEL: 'danger',
-};
-
 const computedParams = computed(() => {
   let data = omit(params, ['createTime']);
   data.createStartTime = params.createTime[0];

+ 2 - 15
src/views/sop/sop-monitor/delay-warning/index.vue

@@ -29,9 +29,7 @@
           {{ warnTypeFilter(row[col.colKey]) }}
         </template>
         <template #status="{ col, row }">
-          <t-tag :theme="statusTheme[row[col.colKey]]" variant="light">{{
-            warnFlowStatusFilter(row[col.colKey])
-          }}</t-tag>
+          <status-tag :value="row[col.colKey]" type="warnFlow"></status-tag>
         </template>
         <template #warnTime="{ col, row }">
           {{ timestampFilter(row[col.colKey]) }}
@@ -84,23 +82,12 @@ import { dictToOptionList } from '@/utils/tool';
 import { WARN_TYPE, WARN_FLOW_STATUS } from '@/config/constants';
 import { omit } from 'lodash';
 import { DialogPlugin, MessagePlugin } from 'tdesign-vue-next';
-import {
-  warnTypeFilter,
-  warnFlowStatusFilter,
-  timestampFilter,
-} from '@/utils/filter';
+import { warnTypeFilter, timestampFilter } from '@/utils/filter';
 import DelayWarnFlowDialog from './flow-dialog';
 
 const showDelayWarnFlowDialog = ref(false);
 const curRow = ref({});
 
-const statusTheme = {
-  NOT_START: 'warning',
-  FOLLOW: 'success',
-  CLOSE: 'default',
-  RESTART: 'primary',
-};
-
 const handleFollow = (row) => {
   curRow.value = row;
   showDelayWarnFlowDialog.value = true;

+ 5 - 15
src/views/sop/sop-monitor/violation-registration/index.vue

@@ -41,9 +41,10 @@
           {{ violationTypeFilter(row[col.colKey]) }}
         </template>
         <template #status="{ col, row }">
-          <t-tag :theme="statusTheme[row[col.colKey]]" variant="light">{{
-            violationFlowStatusFilter(row[col.colKey])
-          }}</t-tag>
+          <status-tag
+            :value="row[col.colKey]"
+            type="violationFlow"
+          ></status-tag>
         </template>
         <template #createTime="{ col, row }">
           {{ timestampFilter(row[col.colKey]) }}
@@ -97,23 +98,12 @@ import { dictToOptionList } from '@/utils/tool';
 import { VIOLATION_TYPE, VIOLATION_FLOW_STATUS } from '@/config/constants';
 import { omit } from 'lodash';
 import { DialogPlugin, MessagePlugin } from 'tdesign-vue-next';
-import {
-  violationTypeFilter,
-  violationFlowStatusFilter,
-  timestampFilter,
-} from '@/utils/filter';
+import { violationTypeFilter, timestampFilter } from '@/utils/filter';
 import ViolationFlowDialog from './flow-dialog.vue';
 
 const showViolationFlowDialog = ref(false);
 const curRow = ref({});
 
-const statusTheme = {
-  NOT_START: 'warning',
-  FOLLOW: 'success',
-  CLOSE: 'default',
-  RESTART: 'primary',
-};
-
 const handleFollow = (row) => {
   curRow.value = row;
   showViolationFlowDialog.value = true;

+ 25 - 21
src/views/system/config-manage/customer-manage/edit-customer-dialog.vue

@@ -2,15 +2,15 @@
   <my-dialog
     :visible="visible"
     :header="title"
-    :width="800"
+    :width="600"
     attach="body"
     :closeOnOverlayClick="false"
     @close="emit('update:visible', false)"
     @opened="dialogOpened"
   >
-    <t-form ref="formRef" :data="formData" :rules="rules" :labelWidth="100">
-      <t-row :gutter="[0, 20]">
-        <t-col :span="6">
+    <t-form ref="formRef" :data="formData" :rules="rules" labelAlign="top">
+      <t-row :gutter="[20, 20]">
+        <t-col :span="12">
           <t-form-item label="客户名称" name="name">
             <t-input v-model="formData.name" clearable />
           </t-form-item>
@@ -27,23 +27,6 @@
             </t-select>
           </t-form-item>
         </t-col>
-        <t-col :span="12">
-          <t-form-item label="客户地址" name="province" required-mark>
-            <select-area
-              v-model="pca"
-              value-type="full"
-              placeholder="请选择省市区"
-              @change="areaChagne"
-            ></select-area>
-          </t-form-item>
-          <t-form-item name="address" :required-mark="false">
-            <t-input
-              v-model="formData.address"
-              clearable
-              placeholder="请输入详细地址"
-            />
-          </t-form-item>
-        </t-col>
         <t-col :span="6">
           <t-form-item label="客户经理" name="managerId">
             <select-type-user
@@ -69,6 +52,27 @@
               v-model="formData.peoperDay"
               :decimalPlaces="0"
               :min="1"
+              theme="column"
+              style="width: 100%"
+            />
+          </t-form-item>
+        </t-col>
+        <t-col :span="12">
+          <t-form-item label="区域" name="province" required-mark>
+            <select-area
+              v-model="pca"
+              value-type="full"
+              placeholder="请选择省市区"
+              @change="areaChagne"
+            ></select-area>
+          </t-form-item>
+        </t-col>
+        <t-col :span="12">
+          <t-form-item label="详细地址" name="address" required-mark>
+            <t-input
+              v-model="formData.address"
+              clearable
+              placeholder="请输入详细地址"
             />
           </t-form-item>
         </t-col>

+ 6 - 8
src/views/system/config-manage/customer-manage/index.vue

@@ -49,18 +49,16 @@
           {{ timestampFilter(row[col.colKey]) }}
         </template>
         <template #role-list="{ col, row }">
-          {{
-            row[col.colKey]
-              .map((item) => `${item.roleName}(${item.quota})`)
-              .join(',')
-          }}
+          <p v-for="(item, index) in row[col.colKey]" :key="index"
+            >{{ item.roleName }}({{ item.quota }})</p
+          >
         </template>
         <template #operate="{ row }">
           <div class="table-operations">
             <t-link theme="primary" hover="color" @click="handleEdit(row)">
               修改
             </t-link>
-            <t-link theme="danger" hover="color" @click="handleDelete(row)">
+            <t-link theme="primary" hover="color" @click="handleDelete(row)">
               删除
             </t-link>
           </div>
@@ -159,7 +157,7 @@ const columns = [
     colKey: 'roleList',
     title: '项目角色配置',
     cell: 'role-list',
-    minWidth: 200,
+    width: 140,
   },
   { colKey: 'peoperDay', title: '标准人天', width: 100 },
   { colKey: 'createName', title: '创建人', width: 120 },
@@ -188,7 +186,7 @@ const handleAdd = () => {
 const handleDelete = (row) => {
   const confirmDia = DialogPlugin({
     header: '操作提示',
-    body: `确定要删除当前记录吗`,
+    body: `是否删除该客户?`,
     confirmBtn: '确定',
     cancelBtn: '取消',
     theme: 'warning',

+ 9 - 7
src/views/system/config-manage/device-manage/edit-device-dialog.vue

@@ -2,13 +2,13 @@
   <my-dialog
     :visible="visible"
     :header="title"
-    :width="800"
+    :width="600"
     attach="body"
     :closeOnOverlayClick="false"
     @close="emit('update:visible', false)"
   >
-    <t-form ref="formRef" :data="formData" :rules="rules" :labelWidth="100">
-      <t-row :gutter="[0, 20]">
+    <t-form ref="formRef" :data="formData" :rules="rules" labelAlign="top">
+      <t-row :gutter="[20, 20]">
         <t-col :span="6">
           <t-form-item label="设备编号" name="deviceCode">
             <t-input v-model="formData.deviceCode" clearable />
@@ -39,7 +39,7 @@
           </t-form-item>
         </t-col>
         <t-col :span="6">
-          <t-form-item label="购买时间" name="buyTime">
+          <t-form-item label="购买时间">
             <t-date-picker
               v-model="formData.buyTime"
               mode="date"
@@ -71,11 +71,13 @@
               v-model="formData.scanCount"
               :decimalPlaces="0"
               :min="1"
+              theme="column"
+              style="width: 100%"
             />
           </t-form-item>
         </t-col>
         <t-col :span="12">
-          <t-form-item label="当前所在地">
+          <t-form-item label="当前所在地" name="location">
             <t-input v-model="formData.location" clearable />
           </t-form-item>
         </t-col>
@@ -175,10 +177,10 @@ const rules = {
   model: [
     { required: true, message: '型号必选', type: 'error', trigger: 'change' },
   ],
-  buyTime: [
+  location: [
     {
       required: true,
-      message: '购买时间必填',
+      message: '所在地必填',
       type: 'error',
       trigger: 'change',
     },

+ 26 - 23
src/views/system/config-manage/device-manage/index.vue

@@ -10,28 +10,32 @@
           variant="outline"
           :disabled="!selectedRowKeys.length"
           @click="handleDestroy"
-          >批量作废</t-button
         >
+          <template #icon><svg-icon name="delete" color="#262626" /></template>
+          批量作废
+        </t-button>
         <t-button
           variant="outline"
           :disabled="!selectedRowKeys.length"
           @click="handleEable(selectedRowKeys, true)"
-          >批量启用</t-button
         >
+          <template #icon><svg-icon name="delete" color="#262626" /></template>
+          批量启用
+        </t-button>
         <t-button
           variant="outline"
           :disabled="!selectedRowKeys.length"
           @click="handleEable(selectedRowKeys, false)"
-          >批量禁用</t-button
         >
-        <upload-button
-          upload-url="/api/sys/device/import"
-          :button-props="{
-            content: '批量导入',
-            variant: 'outline',
-            theme: 'default',
-          }"
-        ></upload-button>
+          <template #icon><svg-icon name="delete" color="#262626" /></template>
+          批量禁用
+        </t-button>
+        <upload-button upload-url="/api/sys/device/import">
+          <t-button variant="outline">
+            <template #icon><svg-icon name="import" color="#262626" /></template
+            >批量导入
+          </t-button>
+        </upload-button>
       </t-space>
     </div>
     <SearchForm :fields="fields" :params="params">
@@ -78,7 +82,7 @@
         @select-change="selectChange"
       >
         <template #enable="{ col, row }">
-          {{ enableFilter(row[col.colKey]) }}
+          <status-tag :value="row[col.colKey]" type="enable"></status-tag>
         </template>
         <template #buy-time="{ col, row }">
           {{ timestampFilter(row[col.colKey]) }}
@@ -129,7 +133,6 @@ import {
 import {
   runningStatusFilter,
   timestampFilter,
-  enableFilter,
   inoutTypeFilter,
 } from '@/utils/filter';
 import { dictToOptionList } from '@/utils/tool';
@@ -185,14 +188,14 @@ const fields = ref([
     prop: 'brand',
     label: '品牌',
     type: 'select',
-    labelWidth: 60,
+    labelWidth: 100,
     colSpan: 5,
   },
   {
     prop: 'model',
     label: '型号',
     type: 'select',
-    labelWidth: 60,
+    labelWidth: 100,
     colSpan: 5,
   },
   {
@@ -263,13 +266,13 @@ const params = reactive({
 
 const columns = [
   { colKey: 'row-select', type: 'multiple', width: 50 },
-  { colKey: 'deviceCode', title: '设备编号' },
-  { colKey: 'serialNo', title: '序列号' },
-  { colKey: 'brand', title: '品牌' },
-  { colKey: 'model', title: '型号' },
+  { colKey: 'deviceCode', title: '设备编号', width: 200 },
+  { colKey: 'serialNo', title: '序列号', width: 200 },
+  { colKey: 'brand', title: '品牌', width: 200 },
+  { colKey: 'model', title: '型号', width: 200 },
   { colKey: 'buyTime', title: '购买时间', cell: 'buy-time', width: 180 },
   { colKey: 'supplier', title: '设备供应商', width: 140 },
-  { colKey: 'status', title: '运行状态', cell: 'status', width: 100 },
+  { colKey: 'status', title: '运行状态', cell: 'status', width: 120 },
   { colKey: 'location', title: '当前所在地', width: 140 },
   { colKey: 'scanCount', title: '总扫描量', width: 100 },
   { colKey: 'bound', title: '出库/入库', width: 120 },
@@ -305,8 +308,8 @@ const handleDestroy = () => {
   }
 
   const confirmDia = DialogPlugin({
-    header: '操作提示',
-    body: `确定要作废选中的记录吗`,
+    header: '系统通知',
+    body: `是否作废该设备?`,
     confirmBtn: '确定',
     cancelBtn: '取消',
     onConfirm: async () => {
@@ -328,7 +331,7 @@ const handleEable = (selectedIds, enable) => {
 
   const confirmDia = DialogPlugin({
     header: `${name}提示`,
-    body: `确定要${name}选中的记录吗`,
+    body: `是否${name}该设备?`,
     confirmBtn: '确定',
     cancelBtn: '取消',
     onConfirm: async () => {

+ 12 - 14
src/views/system/config-manage/service-level-manage/edit-service-level-dialog.vue

@@ -8,14 +8,14 @@
     @close="emit('update:visible', false)"
     @opened="dialogOpened"
   >
-    <t-form ref="formRef" :data="formData" :rules="rules" :labelWidth="120">
-      <t-row :gutter="[0, 20]">
-        <t-col :span="12">
+    <t-form ref="formRef" :data="formData" :rules="rules" labelAlign="top">
+      <t-row :gutter="[20, 20]">
+        <t-col :span="6">
           <t-form-item label="服务档位名称" name="level">
             <t-input v-model="formData.level" clearable />
           </t-form-item>
         </t-col>
-        <t-col :span="12">
+        <t-col :span="6">
           <t-form-item label="业务类型" name="type">
             <t-select v-model="formData.type">
               <t-option
@@ -49,14 +49,13 @@
                 </template>
                 <template #operate="{ row }">
                   <div class="table-operations">
-                    <t-button
-                      theme="danger"
-                      shape="square"
-                      variant="text"
+                    <t-link
+                      theme="primary"
+                      hover="color"
                       @click="handleDelete(row)"
                     >
-                      <template #icon> <MinusCircleFilledIcon /></template>
-                    </t-button>
+                      删除
+                    </t-link>
                   </div>
                 </template>
               </t-table>
@@ -87,7 +86,7 @@
             </div>
           </t-form-item>
         </t-col>
-        <t-col :span="12">
+        <t-col :span="6">
           <t-form-item label="设备配额">
             <t-input-number
               v-model="formData.devices"
@@ -95,7 +94,7 @@
               :decimalPlaces="0"
               :max="1000"
               :min="1"
-              style="width: 140px"
+              style="width: 100%"
             />
           </t-form-item>
         </t-col>
@@ -112,7 +111,6 @@
 <script setup name="EditServiceLevelDialog">
 import { ref, computed } from 'vue';
 import { MessagePlugin } from 'tdesign-vue-next';
-import { MinusCircleFilledIcon } from 'tdesign-icons-vue-next';
 import useClearDialog from '@/hooks/useClearDialog';
 import useAuthenRole from '@/hooks/useAuthenRole';
 import { CUSTOMER_TYPE } from '@/config/constants';
@@ -198,7 +196,7 @@ const rules = {
 const roleColumns = [
   { colKey: 'roleName', title: '项目角色' },
   { colKey: 'quota', title: '配额', cell: 'quota', width: 130 },
-  { colKey: 'operate', title: '', cell: 'operate', width: 60 },
+  { colKey: 'operate', title: '管理', cell: 'operate', width: 60 },
 ];
 
 const dialogOpened = () => {

+ 4 - 1
src/views/system/config-manage/service-level-manage/index.vue

@@ -30,6 +30,9 @@
           {{ timestampFilter(row[col.colKey]) }}
         </template>
         <template #role-list="{ col, row }">
+          <!-- <p v-for="(item, index) in row[col.colKey]" :key="index"
+            >{{ item.roleName }}({{ item.quota }})</p
+          > -->
           {{
             row[col.colKey]
               .map((item) => `${item.roleName}(${item.quota})`)
@@ -41,7 +44,7 @@
             <t-link theme="primary" hover="color" @click="handleEdit(row)">
               修改
             </t-link>
-            <t-link theme="danger" hover="color" @click="handleDelete(row)">
+            <t-link theme="primary" hover="color" @click="handleDelete(row)">
               删除
             </t-link>
           </div>

+ 15 - 6
src/views/system/config-manage/supplier-manage/edit-supplier-dialog.vue

@@ -7,19 +7,19 @@
     :closeOnOverlayClick="false"
     @close="emit('update:visible', false)"
   >
-    <t-form ref="formRef" :data="formData" :rules="rules" :labelWidth="100">
-      <t-row :gutter="[0, 20]">
-        <t-col :span="12">
+    <t-form ref="formRef" :data="formData" :rules="rules" labelAlign="top">
+      <t-row :gutter="[20, 20]">
+        <t-col :span="6">
           <t-form-item label="供应商编号" name="code">
             <t-input v-model="formData.code" clearable />
           </t-form-item>
         </t-col>
-        <t-col :span="12">
+        <t-col :span="6">
           <t-form-item label="供应商名称" name="name">
             <t-input v-model="formData.name" clearable />
           </t-form-item>
         </t-col>
-        <t-col :span="12">
+        <t-col :span="6">
           <t-form-item label="类型" name="type">
             <t-select v-model="formData.type">
               <t-option
@@ -31,9 +31,18 @@
             </t-select>
           </t-form-item>
         </t-col>
+        <t-col :span="6">
+          <t-form-item label="启用/禁用" name="enable">
+            <select-enable v-model="formData.enable"></select-enable>
+          </t-form-item>
+        </t-col>
         <t-col :span="12">
           <t-form-item label="备注">
-            <t-input v-model="formData.remark" clearable />
+            <t-textarea
+              v-model="formData.remark"
+              :autosize="{ minRows: 3, maxRows: 5 }"
+              :maxlength="50"
+            />
           </t-form-item>
         </t-col>
       </t-row>

+ 2 - 2
src/views/system/config-manage/supplier-manage/index.vue

@@ -26,8 +26,8 @@
         <template #type="{ row }">
           {{ supplierTypeFilter(row.type) }}
         </template>
-        <template #enable="{ row }">
-          {{ enableFilter(row.enable) }}
+        <template #enable="{ col, row }">
+          <status-tag :value="row[col.colKey]" type="enable"></status-tag>
         </template>
         <template #operate="{ row }">
           <div class="table-operations">

+ 1 - 1
src/views/system/notice-log/log-manage/index.vue

@@ -82,7 +82,7 @@ const computedParams = computed(() => {
 });
 
 const columns = [
-  { colKey: 'createTime', title: '时间', cell: 'create-time', width: 180 },
+  { colKey: 'createTime', title: '发布时间', cell: 'create-time', width: 180 },
   { colKey: 'content', title: '内容' },
 ];
 const {

+ 81 - 22
src/views/system/notice-log/notice-manage/edit-notice-dialog.vue

@@ -1,15 +1,22 @@
 <template>
-  <my-dialog
+  <my-drawer
     :visible="visible"
     :header="title"
-    :width="800"
+    size="80%"
     attach="body"
     :closeOnOverlayClick="false"
+    :close-btn="true"
     @close="emit('update:visible', false)"
   >
-    <t-form ref="formRef" :data="formData" :rules="rules" :labelWidth="100">
-      <t-row :gutter="[0, 20]">
-        <t-col :span="6">
+    <t-form
+      class="notice-form"
+      ref="formRef"
+      :data="formData"
+      :rules="rules"
+      labelAlign="top"
+    >
+      <t-row class="notice-info" :gutter="[20, 20]">
+        <t-col :span="4">
           <t-form-item label="类型" name="type">
             <t-select v-model="formData.type">
               <t-option
@@ -21,38 +28,54 @@
             </t-select>
           </t-form-item>
         </t-col>
-        <t-col :span="6">
+        <t-col :span="4">
           <t-form-item label="服务单元" name="serviceId">
             <select-service-unit v-model="formData.serviceId">
             </select-service-unit>
           </t-form-item>
         </t-col>
-        <t-col :span="12">
+        <t-col :span="8">
           <t-form-item label="通知名称" name="title">
             <t-input v-model="formData.title" clearable />
           </t-form-item>
         </t-col>
         <t-col :span="12">
-          <t-form-item label="通知正文" name="content">
-            <t-textarea
-              v-model="formData.content"
-              placeholder="请输入通知正文"
-              :maxlength="9999"
-              :autosize="{ minRows: 5, maxRows: 10 }"
-            /> </t-form-item
-        ></t-col>
+          <t-form-item
+            class="content-label"
+            label="通知正文"
+            required-mark
+          ></t-form-item>
+        </t-col>
       </t-row>
+      <div class="notice-content">
+        <t-form-item name="content" :required-mark="false">
+          <t-textarea
+            v-model="formData.content"
+            placeholder="请输入通知正文"
+            :maxlength="9999"
+            :autosize="{ minRows: 10, maxRows: 15 }"
+          />
+        </t-form-item>
+      </div>
     </t-form>
     <template #foot>
-      <t-button theme="default" @click="emit('update:visible', false)"
-        >取消</t-button
-      >
-      <t-button theme="primary" @click="onPreview">预览</t-button>
-      <t-button theme="primary" @click="save">保存</t-button>
-      <t-button theme="primary" @click="save(true)">保存并发布</t-button>
+      <div class="box-justify">
+        <t-button
+          theme="default"
+          variant="outline"
+          @click="emit('update:visible', false)"
+          >返回</t-button
+        >
+        <div>
+          <t-button theme="default" @click="save">保存草稿</t-button>
+          <t-button theme="primary" ghost @click="onPreview">预览</t-button>
+          <t-button theme="primary" @click="save(true)">保存并发布</t-button>
+        </div>
+      </div>
     </template>
-  </my-dialog>
+  </my-drawer>
 </template>
+
 <script setup name="EditNoticeDialog">
 import { ref, computed } from 'vue';
 import { MessagePlugin } from 'tdesign-vue-next';
@@ -141,3 +164,39 @@ const save = async (isPublish) => {
   emit('success');
 };
 </script>
+
+<style lang="less" scoped>
+.notice-form {
+  display: flex;
+  height: 100%;
+  flex-direction: column;
+  justify-content: space-between;
+
+  .notice-info {
+    flex-grow: 0;
+    flex-shrink: 0;
+  }
+  .notice-content {
+    flex-grow: 2;
+    margin-bottom: 20px;
+    :deep(.t-form__item) {
+      height: 100%;
+    }
+    :deep(.t-form__controls) {
+      height: 100%;
+    }
+    :deep(.t-form__controls-content) {
+      height: 100%;
+    }
+    :deep(.t-textarea) {
+      height: 100%;
+    }
+    :deep(.t-textarea__inner) {
+      height: 100% !important;
+    }
+  }
+  .content-label :deep(.t-form__controls) {
+    display: none;
+  }
+}
+</style>

+ 2 - 2
src/views/system/notice-log/notice-manage/index.vue

@@ -3,7 +3,7 @@
     <div class="page-action">
       <t-button theme="primary" @click="handleAdd">
         <template #icon><svg-icon name="add-circle" color="#fff" /></template
-        >新增通知
+        >新增通知公告
       </t-button>
       <t-button
         variant="outline"
@@ -50,7 +50,7 @@
           </span>
         </template>
         <template #status="{ col, row }">
-          {{ publishStatusFilter(row[col.colKey]) }}
+          <status-tag :value="row[col.colKey]" type="notice"></status-tag>
         </template>
         <template #operate="{ col, row }">
           <div class="table-operations">

+ 56 - 24
src/views/system/notice-log/notice-manage/notice-message-dialog.vue

@@ -1,35 +1,30 @@
 <template>
-  <my-dialog
+  <my-drawer
     :visible="visible"
     header="回执查询"
-    mode="full-screen"
+    size="80%"
     attach="body"
-    class="t-layout"
     :closeOnOverlayClick="false"
-    :top="0"
+    :close-btn="true"
+    class="notice-dialog"
     @close="emit('update:visible', false)"
-    @opened="onOpened"
   >
+    <div class="page-action">
+      <t-button variant="outline" @click="onExport">
+        <template #icon><svg-icon name="export" color="#262626" /></template>
+        导出回执明细
+      </t-button>
+      <span style="margin-left: 16px"
+        >已阅/全部:{{ messageCount.reviewed }}/{{ messageCount.total }}</span
+      >
+    </div>
     <SearchForm :fields="fields" :params="params">
       <template #supplier="{ item, params }">
         <select-supplier v-model="params[item.prop]"> </select-supplier>
       </template>
     </SearchForm>
 
-    <div class="flex-1">
-      <div class="flex justify-between items-center">
-        <div>
-          <span
-            >已阅/全部:{{ messageCount.reviewed }}/{{
-              messageCount.total
-            }}</span
-          >
-        </div>
-        <div class="btn-group">
-          <t-button theme="success" @click="onExport">导出回执明细</t-button>
-        </div>
-      </div>
-
+    <div class="flex-1 page-wrap">
       <t-table
         size="small"
         row-key="id"
@@ -54,16 +49,27 @@
           {{ timestampFilter(row[col.colKey]) }}
         </template>
         <template #status="{ col, row }">
-          {{ row[col.colKey] ? '已阅' : '未阅' }}
+          <t-tag
+            :theme="row[col.colKey] ? 'success' : 'danger'"
+            variant="light"
+            >{{ row[col.colKey] ? '已阅' : '未阅' }}</t-tag
+          >
         </template>
       </t-table>
     </div>
 
-    <template #foot> </template>
-  </my-dialog>
+    <template #foot>
+      <t-button
+        theme="default"
+        variant="outline"
+        @click="emit('update:visible', false)"
+        >返回</t-button
+      ></template
+    >
+  </my-drawer>
 </template>
 <script setup name="NoticeMessageDialog">
-import { ref, reactive } from 'vue';
+import { ref, reactive, watch } from 'vue';
 import { MessagePlugin, DialogPlugin } from 'tdesign-vue-next';
 import {
   noticeMessageQueryApi,
@@ -156,7 +162,12 @@ const columns = [
     width: 180,
   },
   { colKey: 'mobileNumber', title: '联系电话', width: 120 },
-  { colKey: 'status', title: '回执状态', cell: 'status', width: 80 },
+  {
+    colKey: 'status',
+    title: '回执状态',
+    fixed: 'right',
+    width: 100,
+  },
 ];
 const {
   loading: tableLoading,
@@ -191,4 +202,25 @@ async function onExport() {
     },
   });
 }
+
+watch(
+  () => props.visible,
+  (val) => {
+    if (val) onOpened();
+  }
+);
 </script>
+
+<style lang="less">
+.notice-dialog {
+  .t-drawer__header {
+    border-bottom: none;
+  }
+  .t-drawer__body {
+    padding: 0;
+  }
+  .page-action {
+    padding-top: 0;
+  }
+}
+</style>

Niektóre pliki nie zostały wyświetlone z powodu dużej ilości zmienionych plików