@utogether/udp-core 1.0.1-beta.2 → 1.0.1-beta.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (159) hide show
  1. package/build/plugins.ts +8 -1
  2. package/dist/{403-BBQoJwTM.js → 403-B_l9Q9w_.js} +1 -1
  3. package/dist/{404-BbJPSIWM.js → 404-33KZO3Vz.js} +1 -1
  4. package/dist/{500-BtFL9R4M.js → 500-oI74ZkQH.js} +1 -1
  5. package/dist/{AuthorityInfo-DhiwCeLN.js → AuthorityInfo-CNoxrmPS.js} +1 -1
  6. package/dist/AuthorityInfo.vue_vue_type_style_index_0_lang-CO01EWKQ.js +100 -0
  7. package/dist/{Company-CGqmslx-.js → Company-DOCRUvUs.js} +3 -3
  8. package/dist/{CompanyPanel-hlDsxD-6.js → CompanyPanel-Do2JlJ3U.js} +26 -26
  9. package/dist/{Department-BZyJtacc.js → Department-BAlx8Am2.js} +3 -3
  10. package/dist/{DepartmentPanel-D-a_EBFt.js → DepartmentPanel-BvQUkRaM.js} +25 -25
  11. package/dist/{DesignPanel-Bl4luWDV.js → DesignPanel-BMr-c76z.js} +1 -1
  12. package/dist/{DesignPanel.vue_vue_type_style_index_0_lang-I8C3iGvz.js → DesignPanel.vue_vue_type_style_index_0_lang-COERxrYp.js} +28 -30
  13. package/dist/DictView-DkG5lo6m.js +109 -0
  14. package/dist/InvOrganization-D_PuTpPt.js +74 -0
  15. package/dist/Org-CtVfZAjI.js +39 -0
  16. package/dist/{Preview-pHD84xqI.js → Preview-Cuj_akRk.js} +2 -2
  17. package/dist/{ReportDefine-DnnCNQWS.js → ReportDefine-CM2aNEVp.js} +1 -1
  18. package/dist/{ReportDesign-BnI_Q4pg.js → ReportDesign-B1y79NKM.js} +43 -43
  19. package/dist/{ReportQuery-Dby2MmtM.js → ReportQuery-CZEfKCWP.js} +1 -1
  20. package/dist/{ReportQueryFrom-Blm1N8P1.js → ReportQueryFrom-C_cUB8bs.js} +1 -1
  21. package/dist/{ReportQueryFrom.vue_vue_type_style_index_0_lang-CnG_Ybnt.js → ReportQueryFrom.vue_vue_type_style_index_0_lang-DBqJnvTQ.js} +1 -1
  22. package/dist/{ReportTemplate-D65RXRY_.js → ReportTemplate-BprAuCb1.js} +28 -28
  23. package/dist/{Role-eFZoTpXc.js → Role-CAaLVGNy.js} +6 -6
  24. package/dist/{RoleAssign-D9-Y3UNz.js → RoleAssign-DuFp2Ty7.js} +9 -9
  25. package/dist/{RolePanel-DlFw6HSf.js → RolePanel-BRStoO0e.js} +1 -1
  26. package/dist/{RolePanel-CoUOc3sX.js → RolePanel-FnyN7LiS.js} +1 -1
  27. package/dist/RolePanel.vue_vue_type_script_setup_true_lang-CNIA7zdk.js +132 -0
  28. package/dist/{RolePanel.vue_vue_type_script_setup_true_lang-Clwk-MHw.js → RolePanel.vue_vue_type_script_setup_true_lang-CS7drFhn.js} +44 -38
  29. package/dist/{ScrollPanel.vue_vue_type_style_index_0_lang-M2FQJwPU.js → ScrollPanel.vue_vue_type_style_index_0_lang-CEnqhlSE.js} +23 -23
  30. package/dist/{Staff-DFBLCsAd.js → Staff-D493jHwR.js} +3 -3
  31. package/dist/{StaffInfo-d2CK0oBA.js → StaffInfo-suU_pcyD.js} +1 -1
  32. package/dist/{StaffInfo.vue_vue_type_script_setup_true_lang-4m8wK9tq.js → StaffInfo.vue_vue_type_script_setup_true_lang-DV16a2Nz.js} +16 -16
  33. package/dist/{StaffPanel-D6aWLKN3.js → StaffPanel-BbYWu-xZ.js} +1 -1
  34. package/dist/{StaffPanel.vue_vue_type_script_setup_true_lang-C7YT2CVb.js → StaffPanel.vue_vue_type_script_setup_true_lang-CfRIanr5.js} +2 -2
  35. package/dist/{SysUser-BdZvYxQH.js → SysUser-YXOsIVpJ.js} +2 -2
  36. package/dist/{SysUserPanel-BIVa6LLr.js → SysUserPanel-C1tQzih_.js} +1 -1
  37. package/dist/SysUserPanel.vue_vue_type_script_setup_true_lang-BfT40pDr.js +298 -0
  38. package/dist/{SystemMenu-C-5VKlHK.js → SystemMenu-DzKl8RAz.js} +33 -33
  39. package/dist/{UserInfo-DqXCRZts.js → UserInfo-CYeYQNq8.js} +1 -1
  40. package/dist/{UserInfo.vue_vue_type_style_index_0_lang-N3TwfpPx.js → UserInfo.vue_vue_type_style_index_0_lang-DYVdi2Ck.js} +41 -39
  41. package/dist/{childView-B2lSsqS3.js → childView-BNYdfnMx.js} +1 -1
  42. package/dist/{childView-DRUNqgjI.js → childView-C6rHVrT6.js} +1 -1
  43. package/dist/{childView.vue_vue_type_style_index_0_lang-B9XBDDU_.js → childView.vue_vue_type_style_index_0_lang-6o00J0a7.js} +1 -1
  44. package/dist/{childView.vue_vue_type_style_index_0_lang-oGriyFTv.js → childView.vue_vue_type_style_index_0_lang-O_zWFjYY.js} +43 -43
  45. package/dist/{code-rule-DZC9T6cl.js → code-rule-MxcRbYZR.js} +13 -15
  46. package/dist/core.es.js +18 -10
  47. package/dist/{cron-task-BJwPeA5F.js → cron-task-B0yfTtm6.js} +11 -11
  48. package/dist/{frameView-C6wkvok-.js → frameView-DtHY5dLd.js} +1 -1
  49. package/dist/img/l_img.svg +1 -1
  50. package/dist/img/minicolors.png +0 -0
  51. package/dist/img/v_img.svg +1 -1
  52. package/dist/index-BWtOrjW2.js +4603 -0
  53. package/dist/{layoutView-CeJBpZb_.js → layoutView-D0Q7EG0u.js} +1564 -1559
  54. package/dist/{log-in-e7D5Ss1P.js → log-in-CpGqc33f.js} +5 -4
  55. package/dist/{log-out--RRncZhN.js → log-out-D1b4VRMZ.js} +30 -24
  56. package/dist/login-CuO8YgN1.js +249 -0
  57. package/dist/{login-log-CvVnyGi3.js → login-log-BNRXLeMi.js} +4 -3
  58. package/dist/{lov-view-DRF-99U4.js → lov-view-DcRVGqsD.js} +5 -5
  59. package/dist/{menuInfo-3Sjvs9nM.js → menuInfo-ccOqhCC8.js} +1 -1
  60. package/dist/{menuInfo.vue_vue_type_style_index_0_lang-DrQ560nm.js → menuInfo.vue_vue_type_style_index_0_lang-DTBPgTe_.js} +34 -32
  61. package/dist/{pda-app-B9tn7jdv.js → pda-app-D7n4oxyn.js} +202 -188
  62. package/dist/{resource-BqnxbQNe.js → resource-_h2OtsKS.js} +18 -18
  63. package/dist/{su-welcome-VwifUK_O.js → su-welcome-Co6e4akE.js} +118 -120
  64. package/dist/sys-config-C6Es9vZl.js +355 -0
  65. package/dist/udp-core.css +1 -9
  66. package/dist/utogether-MlnyYtNS.js +4 -0
  67. package/index.ts +17 -5
  68. package/package.json +1 -1
  69. package/src/App.vue +2 -7
  70. package/src/api/http.ts +1 -4
  71. package/src/api/index.ts +5 -3
  72. package/src/api/user.ts +2 -2
  73. package/src/components/SuCharts/src/UserInfo.vue +3 -3
  74. package/src/components/SuScrollTree/ScrollPanel.vue +170 -175
  75. package/src/components/udp/form/form.vue +109 -0
  76. package/src/components/udp/grid/index.vue +509 -0
  77. package/src/components/udp/index.ts +4 -4
  78. package/src/components/udp/utils.ts +405 -40
  79. package/src/directives/permission/index.ts +1 -1
  80. package/src/layout/components/lay-navbar/index.vue +9 -7
  81. package/src/layout/components/lay-panel/index.vue +3 -3
  82. package/src/layout/components/lay-search/index.vue +1 -1
  83. package/src/layout/components/lay-select-org/index.vue +4 -9
  84. package/src/layout/components/lay-sidebar/breadCrumb.vue +1 -1
  85. package/src/layout/components/lay-sidebar/horizontal.vue +4 -5
  86. package/src/layout/components/lay-sidebar/mixNav.vue +6 -4
  87. package/src/layout/components/lay-sidebar/sidebar-logo.vue +94 -98
  88. package/src/layout/components/lay-tag/index.vue +596 -625
  89. package/src/layout/hooks/useTag.ts +223 -233
  90. package/src/layout/layoutView.vue +215 -215
  91. package/src/layout/types.ts +3 -2
  92. package/src/main.ts +39 -31
  93. package/src/plugins/i18n/en.ts +26 -13
  94. package/src/plugins/i18n/zh.ts +35 -16
  95. package/src/plugins/vxe-table/index.ts +65 -2
  96. package/src/plugins/vxe-table/render.tsx +945 -817
  97. package/src/router/index.ts +186 -183
  98. package/src/router/modules/remaining.ts +1 -26
  99. package/src/router/utils.ts +393 -377
  100. package/src/store/modules/app.ts +1 -3
  101. package/src/store/modules/multiTags.ts +110 -109
  102. package/src/store/modules/permission.ts +113 -103
  103. package/src/store/modules/system.ts +1 -3
  104. package/src/style/button.scss +10 -3
  105. package/src/style/login.css +1 -1
  106. package/src/style/tailwind.css +1 -68
  107. package/src/style/vxetable.scss +348 -256
  108. package/src/utils/authority/index.ts +1 -1
  109. package/src/utils/index.ts +3 -1
  110. package/src/utils/propTypes.ts +1 -6
  111. package/src/views/login/login-view.vue +6 -20
  112. package/src/views/organization/company/CompanyPanel.vue +2 -2
  113. package/src/views/organization/department/DepartmentPanel.vue +269 -283
  114. package/src/views/organization/inv-org/InvOrganization.vue +23 -9
  115. package/src/views/organization/org/Org.vue +9 -5
  116. package/src/views/system/menu/SystemMenu.vue +183 -197
  117. package/src/views/system/menu/menuInfo.vue +8 -18
  118. package/src/views/system/role/AuthorityInfo.vue +19 -15
  119. package/src/views/system/role/Role.vue +1 -5
  120. package/src/views/system/role/RolePanel.vue +11 -2
  121. package/src/views/system/role/UserInfo.vue +11 -9
  122. package/src/views/system/role-assign/RoleAssign.vue +2 -2
  123. package/src/views/system/role-assign/RolePanel.vue +12 -9
  124. package/src/views/system/sys/sys-config.vue +66 -21
  125. package/src/views/system/sysUser/SysUserPanel.vue +44 -43
  126. package/src/views/uapp/pda/pda-app.vue +48 -16
  127. package/src/views/udev/coderule/code-rule.vue +120 -121
  128. package/src/views/udev/dict/DictView.vue +16 -4
  129. package/src/views/udev/dict/childView.vue +8 -8
  130. package/src/views/ufile/aggregation/File.vue +5 -5
  131. package/src/views/ufile/file/water-mark.vue +14 -14
  132. package/src/views/uhome/components/menu-favorite.vue +314 -331
  133. package/src/views/uhome/su-welcome.vue +3 -3
  134. package/src/views/ulogin/login.vue +19 -12
  135. package/src/views/upms/interface/log-in.vue +100 -106
  136. package/src/views/upms/interface/log-out.vue +2 -8
  137. package/src/views/upms/user/login-log.vue +54 -60
  138. package/src/views/urpt/design/DesignPanel.vue +16 -35
  139. package/src/views/urpt/design/Preview.vue +1 -0
  140. package/src/views/urpt/design/ReportDesign.vue +17 -23
  141. package/src/views/urpt/static-resource/resource.vue +3 -3
  142. package/src/views/urpt/template/ReportTemplate.vue +7 -7
  143. package/types/global.d.ts +4 -9
  144. package/vite.config.ts +6 -2
  145. package/dist/AuthorityInfo.vue_vue_type_style_index_0_lang-Duyweh89.js +0 -102
  146. package/dist/DictView-B4a7Hs1X.js +0 -95
  147. package/dist/InvOrganization-q4T3y8dQ.js +0 -260
  148. package/dist/Org-BTGTrAVz.js +0 -35
  149. package/dist/RolePanel.vue_vue_type_script_setup_true_lang-DKHgNWQP.js +0 -126
  150. package/dist/SysUserPanel.vue_vue_type_script_setup_true_lang-BsBKpYR7.js +0 -288
  151. package/dist/index-DZc3qRTx.js +0 -2650
  152. package/dist/login-BOxwzwdB.js +0 -252
  153. package/dist/sys-config-C0-gSBFO.js +0 -277
  154. package/dist/utogether-Di1byIum.js +0 -182
  155. package/src/components/udp/form-upload.vue +0 -183
  156. package/src/components/udp/modal-form.vue +0 -180
  157. package/src/utils/http/index.ts +0 -297
  158. package/src/utils/http/types.d.ts +0 -46
  159. package/src/utils/udp/useRender.ts +0 -420
@@ -1,6 +1,6 @@
1
1
  <template>
2
2
  <div class="select-none">
3
- <div class="absolute flex-c right-5 top-3">
3
+ <div class="absolute flex justify-center items-center right-5 top-3">
4
4
  <!-- 主题 -->
5
5
  <!-- <el-switch
6
6
  v-model="dataTheme"
@@ -55,23 +55,13 @@
55
55
  :rules="[{ required: true, message: $t('message.username'), trigger: 'blur' }]"
56
56
  prop="username"
57
57
  >
58
- <el-input
59
- v-model.trim="ruleForm.username"
60
- autofocus
61
- clearable
62
- :prefix-icon="useRenderIcon(User)"
63
- />
58
+ <el-input v-model.trim="ruleForm.username" autofocus clearable :prefix-icon="useRenderIcon(User)" />
64
59
  </el-form-item>
65
60
  </Motion>
66
61
 
67
62
  <Motion :delay="150">
68
63
  <el-form-item prop="passWord">
69
- <el-input
70
- v-model="ruleForm.passWord"
71
- clearable
72
- show-password
73
- :prefix-icon="useRenderIcon(Lock)"
74
- />
64
+ <el-input v-model="ruleForm.passWord" clearable show-password :prefix-icon="useRenderIcon(Lock)" />
75
65
  </el-form-item>
76
66
  </Motion>
77
67
  <Motion :delay="250">
@@ -89,9 +79,7 @@
89
79
  </Motion>
90
80
  </el-form>
91
81
  </div>
92
- <div class="fixed text-xs text-gray-500 bottom-4">
93
- Copyright ©2021{{ sysConfig['copyright'] }}版权所有
94
- </div>
82
+ <div class="fixed text-xs text-gray-500 bottom-4">Copyright ©2021{{ sysConfig['copyright'] }}版权所有</div>
95
83
  </div>
96
84
  </div>
97
85
  </div>
@@ -229,7 +217,7 @@ const insertLoginInfo = username => {
229
217
  browserVersion,
230
218
  operatingSystem: getPlatform(userAgent)
231
219
  };
232
- serviceApi.post('/upms/v1/userMonitor', obj);
220
+ serviceApi.post('/upfm/v1/userMonitor', obj);
233
221
  };
234
222
 
235
223
  /** 使用公共函数,避免`removeEventListener`失效 */
@@ -261,9 +249,7 @@ const getSysConfig = async () => {
261
249
  }
262
250
  });
263
251
  const env = process.env.NODE_ENV;
264
- const title = data.list?.find(
265
- f => f.configCode === `${env}Title` || f.configCode === 'title'
266
- )?.configValue;
252
+ const title = data.list?.find(f => f.configCode === `${env}Title` || f.configCode === 'title')?.configValue;
267
253
  config['title'] = title || 'U-DP';
268
254
  sysConfig.value = config;
269
255
  setFavicon();
@@ -96,7 +96,7 @@
96
96
  <script setup lang="ts">
97
97
  import { useI18n } from 'vue-i18n';
98
98
  import { reactive, watch, inject } from 'vue';
99
- import { VxeUI, VxeFormPropTypes } from 'vxe-table';
99
+ import { VxeUI } from 'vxe-table';
100
100
  import { templateRef } from '@vueuse/core';
101
101
  import { clone } from 'xe-utils';
102
102
  import { successMessage, warnMessage } from '@utogether/utils';
@@ -111,7 +111,7 @@ const data = reactive<IRecord>({
111
111
  dataStatus: ''
112
112
  });
113
113
  const { t } = useI18n();
114
- const rules: VxeFormPropTypes.Rules = {
114
+ const rules = {
115
115
  unitName: [
116
116
  {
117
117
  required: true,
@@ -1,283 +1,269 @@
1
- <!--
2
- * @Author: wei.li
3
- * @Date: 2021-11-17 16:42:14
4
- * @LastEditors: levi7754 levi7754@163.com
5
- * @LastEditTime: 2025-04-29 09:02:32
6
- * @Description: 部门管理
7
- -->
8
-
9
- <template>
10
- <div class="page-content">
11
- <!-- 工具栏 -->
12
- <vxe-toolbar perfect class="">
13
- <template #buttons>
14
- <ut-button status="u-cyan" icon="ri-add-line" content="add" @tap="handleAdd()" />
15
- <ut-button status="primary" icon="ri-edit-box-line" content="edit" @tap="handleEdit('update')" />
16
- <ut-button status="danger" icon="ri-close-fill" content="delete" @tap="handleDelete()" />
17
- </template>
18
- </vxe-toolbar>
19
- <el-row
20
- v-if="data.dialogFormVisible"
21
- v-spinning="data.loading"
22
- type="flex"
23
- justify="center"
24
- align="middle"
25
- class="w-departInfo-wrapper"
26
- >
27
- <el-card width="60%" shadow="always" class="box-card w-card-wrapper">
28
- <div class="clearfix">
29
- <span class="w-card-title" />
30
- </div>
31
- <el-row>
32
- <vxe-form ref="xForm" :data="data.record" :rules="rules" label-width="90px">
33
- <vxe-form-item
34
- :title="$t('message.deptName')"
35
- field="deptName"
36
- :item-render="{ name: '$input', props: { disabled: data.dataStatus === 'detail' } }"
37
- :span="24"
38
- />
39
- <vxe-form-item
40
- :title="$t('message.deptCode')"
41
- field="deptCode"
42
- :item-render="{ name: '$input', props: { disabled: data.dataStatus !== 'add' } }"
43
- :span="24"
44
- />
45
- <vxe-form-item
46
- :title="$t('message.deptType')"
47
- field="deptType"
48
- :item-render="{
49
- name: '$select',
50
- options: dataDict['SU.DEPARTMENT.TYPE']?.children,
51
- optionProps: { label: 'dictName', value: 'dictCode' },
52
- props: { disabled: data.dataStatus === 'detail' }
53
- }"
54
- :span="24"
55
- />
56
- </vxe-form>
57
- </el-row>
58
- <el-row type="flex" justify="center">
59
- <vxe-checkbox
60
- v-if="data.dataStatus === 'add'"
61
- v-model="data.isChecked"
62
- style="padding-top: 5px; margin-right: 8px"
63
- >{{ $t('message.udp.continueAdd') }}</vxe-checkbox
64
- >
65
- <ut-button
66
- v-if="data.dataStatus !== 'detail'"
67
- status="primary"
68
- content="confirm"
69
- @tap="handleComfirm"
70
- />
71
- <ut-button
72
- v-if="data.dataStatus !== 'detail'"
73
- status="warning"
74
- content="cancel"
75
- @click="handleCancle"
76
- />
77
- </el-row>
78
- </el-card>
79
- </el-row>
80
- <el-row v-else class="w-noclick-wrapper">
81
- <!-- <span class="w-department-header">{{ $t('setting.deartment.organization') }}</span> -->
82
- <div class="w-content-wrapper">
83
- <ul>
84
- <li class="w-department-line">
85
- <div>● 点击新建,新建部门信息。</div>
86
- <div style="margin: 0; text-indent: 2em">
87
- 已点击树结构上的部门名称,默认创建为当前部门的下属部门
88
- </div>
89
- <div style="margin: 0; text-indent: 2em">未点击树结构上的部门名称,则创建为一级部门</div>
90
- </li>
91
- <li class="w-department-line">● 点击树结构上的部门名称,点击修改按钮,修改部门信息。</li>
92
- <li class="w-department-line">
93
- <div>● 点击树结构上的部门名称,点击删除按钮,删除部门信息。</div>
94
- <div style="text-indent: 2em">当部门下有人员存在时,不允许删除部门信息。</div>
95
- </li>
96
- </ul>
97
- </div>
98
- </el-row>
99
- </div>
100
- </template>
101
-
102
- <script setup lang="ts">
103
- import { useI18n } from 'vue-i18n';
104
- import { reactive, watch, inject } from 'vue';
105
- import { templateRef } from '@vueuse/core';
106
- import { clone } from 'xe-utils';
107
- import to from 'await-to-js';
108
- import { VXETable, VxeFormPropTypes } from 'vxe-table';
109
- import { successMessage, warnMessage } from '@utogether/utils';
110
- import { useSystemStoreHook } from '../../../store/modules/system';
111
- import { getServiceApi } from '../../../api';
112
-
113
- const data = reactive<IRecord>({
114
- record: {},
115
- dataList: [],
116
- loading: false,
117
- dialogFormVisible: false,
118
- isChecked: false,
119
- dataStatus: ''
120
- });
121
-
122
- const dataDict = useSystemStoreHook().getDataDict;
123
- const { t } = useI18n();
124
- const serviceApi = getServiceApi();
125
-
126
- const rules: VxeFormPropTypes.Rules = {
127
- deptName: [
128
- {
129
- required: true,
130
- message: `${t('message.required')}${t('message.deptName')}`
131
- }
132
- ],
133
- deptCode: [
134
- {
135
- required: true,
136
- message: `${t('message.required')}${t('message.deptCode')}`
137
- }
138
- ],
139
- deptType: [
140
- {
141
- required: true,
142
- message: `${t('message.required')}${t('message.deptType')}`
143
- }
144
- ]
145
- };
146
-
147
- const active: IRecord = inject('active');
148
- // const treeList = inject('treeList');
149
- const scrollPanelChange: IRecord = inject('scrollPanelChange');
150
-
151
- const url = '/uums/department';
152
-
153
- watch(
154
- () => active.value,
155
- (newVal, oldVal) => {
156
- data.record = active.value;
157
- newVal?.id && oldVal?.id && newVal !== oldVal && handleEdit('detail');
158
- }
159
- );
160
-
161
- // 新增子类型
162
- const handleAdd = () => {
163
- data.dataStatus = 'add';
164
- data.record = {};
165
- data.record.parentId = active.value?.id;
166
- data.isChecked = false;
167
- data.dialogFormVisible = true;
168
- };
169
- // 编辑
170
- const handleEdit = dataStatus => {
171
- data.dataStatus = dataStatus;
172
- data.record = clone(active.value, true);
173
- data.dialogFormVisible = true;
174
- };
175
-
176
- const xForm = templateRef<any>('xForm', null);
177
- const handleComfirm = () => {
178
- xForm.value.validate(async valid => {
179
- if (!valid) {
180
- const { record, dataStatus } = data;
181
- data.loading = true;
182
- const [err] =
183
- dataStatus === 'add'
184
- ? await to(serviceApi.post(url, record))
185
- : await to(serviceApi.put(url, record));
186
- data.loading = false;
187
- if (!err) {
188
- actionComplete();
189
- }
190
- }
191
- });
192
- };
193
-
194
- const handleDelete = async () => {
195
- const { record } = data;
196
- if (record.children.length) return warnMessage(t('message.deletePartment'));
197
- const type = await VXETable.modal.confirm(t('message.tip.del'));
198
- if (type === 'confirm') {
199
- await serviceApi.delete(url, record);
200
- actionComplete();
201
- }
202
- };
203
-
204
- const actionComplete = () => {
205
- scrollPanelChange.value = true;
206
- successMessage(t('message.operateSuccess'));
207
- handleClose();
208
- // scrollPanelChange.value = false;
209
- };
210
-
211
- const handleCancle = () => {
212
- if (data.dataStatus === 'add') {
213
- data.dialogFormVisible = false;
214
- }
215
- data.dataStatus = '';
216
- };
217
-
218
- const handleClose = () => {
219
- data.dialogFormVisible = false;
220
- };
221
- </script>
222
- <style lang="scss" scoped>
223
- .page-content {
224
- background-color: #fff;
225
-
226
- .w-departInfo-wrapper {
227
- width: 96%;
228
- height: 75vh;
229
-
230
- .w-card-wrapper {
231
- width: 40%;
232
-
233
- .el-card__header {
234
- padding: 10px 20px;
235
-
236
- .w-card-title {
237
- position: relative;
238
- top: 5px;
239
- }
240
- }
241
- }
242
-
243
- .el-form-item {
244
- margin-bottom: 12px;
245
- }
246
- }
247
-
248
- .w-noclick-wrapper {
249
- display: flex;
250
- flex-wrap: wrap;
251
- align-items: center;
252
- justify-content: center;
253
- height: 100%;
254
-
255
- .w-content-wrapper {
256
- display: flex;
257
- align-items: center;
258
- justify-content: center;
259
- height: 75vh;
260
-
261
- ul {
262
- padding: 24px;
263
- border: 1px solid #ccc;
264
- border-radius: 10px;
265
- }
266
- }
267
-
268
- .w-department-header {
269
- padding-right: 20px;
270
- font-size: 26px;
271
- font-weight: bolder;
272
- color: #69c;
273
- }
274
-
275
- .w-department-line {
276
- font-size: 16px;
277
- line-height: 35px;
278
- color: #999;
279
- list-style: none;
280
- }
281
- }
282
- }
283
- </style>
1
+ <!--
2
+ * @Author: wei.li
3
+ * @Date: 2021-11-17 16:42:14
4
+ * @LastEditors: levi7754 levi7754@163.com
5
+ * @LastEditTime: 2025-04-29 09:02:32
6
+ * @Description: 部门管理
7
+ -->
8
+
9
+ <template>
10
+ <div class="page-content">
11
+ <!-- 工具栏 -->
12
+ <vxe-toolbar perfect class="">
13
+ <template #buttons>
14
+ <ut-button status="u-cyan" icon="ri-add-line" content="add" @tap="handleAdd()" />
15
+ <ut-button status="primary" icon="ri-edit-box-line" content="edit" @tap="handleEdit('update')" />
16
+ <ut-button status="danger" icon="ri-close-fill" content="delete" @tap="handleDelete()" />
17
+ </template>
18
+ </vxe-toolbar>
19
+ <el-row
20
+ v-if="data.dialogFormVisible"
21
+ v-spinning="data.loading"
22
+ type="flex"
23
+ justify="center"
24
+ align="middle"
25
+ class="w-departInfo-wrapper"
26
+ >
27
+ <el-card width="60%" shadow="always" class="box-card w-card-wrapper">
28
+ <div class="clearfix">
29
+ <span class="w-card-title" />
30
+ </div>
31
+ <el-row>
32
+ <vxe-form ref="xForm" :data="data.record" :rules="rules" label-width="90px">
33
+ <vxe-form-item
34
+ :title="$t('message.deptName')"
35
+ field="deptName"
36
+ :item-render="{ name: '$input', props: { disabled: data.dataStatus === 'detail' } }"
37
+ :span="24"
38
+ />
39
+ <vxe-form-item
40
+ :title="$t('message.deptCode')"
41
+ field="deptCode"
42
+ :item-render="{ name: '$input', props: { disabled: data.dataStatus !== 'add' } }"
43
+ :span="24"
44
+ />
45
+ <vxe-form-item
46
+ :title="$t('message.deptType')"
47
+ field="deptType"
48
+ :item-render="{
49
+ name: '$select',
50
+ options: dataDict['SU.DEPARTMENT.TYPE']?.children,
51
+ optionProps: { label: 'dictName', value: 'dictCode' },
52
+ props: { disabled: data.dataStatus === 'detail' }
53
+ }"
54
+ :span="24"
55
+ />
56
+ </vxe-form>
57
+ </el-row>
58
+ <el-row type="flex" justify="center">
59
+ <vxe-checkbox
60
+ v-if="data.dataStatus === 'add'"
61
+ v-model="data.isChecked"
62
+ style="padding-top: 5px; margin-right: 8px"
63
+ >{{ $t('message.udp.continueAdd') }}</vxe-checkbox
64
+ >
65
+ <ut-button v-if="data.dataStatus !== 'detail'" status="primary" content="confirm" @tap="handleComfirm" />
66
+ <ut-button v-if="data.dataStatus !== 'detail'" status="warning" content="cancel" @click="handleCancle" />
67
+ </el-row>
68
+ </el-card>
69
+ </el-row>
70
+ <el-row v-else class="w-noclick-wrapper">
71
+ <!-- <span class="w-department-header">{{ $t('setting.deartment.organization') }}</span> -->
72
+ <div class="w-content-wrapper">
73
+ <ul>
74
+ <li class="w-department-line">
75
+ <div>● 点击新建,新建部门信息。</div>
76
+ <div style="margin: 0; text-indent: 2em">已点击树结构上的部门名称,默认创建为当前部门的下属部门</div>
77
+ <div style="margin: 0; text-indent: 2em">未点击树结构上的部门名称,则创建为一级部门</div>
78
+ </li>
79
+ <li class="w-department-line">● 点击树结构上的部门名称,点击修改按钮,修改部门信息。</li>
80
+ <li class="w-department-line">
81
+ <div>● 点击树结构上的部门名称,点击删除按钮,删除部门信息。</div>
82
+ <div style="text-indent: 2em">当部门下有人员存在时,不允许删除部门信息。</div>
83
+ </li>
84
+ </ul>
85
+ </div>
86
+ </el-row>
87
+ </div>
88
+ </template>
89
+
90
+ <script setup lang="ts">
91
+ import { useI18n } from 'vue-i18n';
92
+ import { reactive, watch, inject } from 'vue';
93
+ import { templateRef } from '@vueuse/core';
94
+ import { clone } from 'xe-utils';
95
+ import to from 'await-to-js';
96
+ import { VXETable } from 'vxe-table';
97
+ import { successMessage, warnMessage } from '@utogether/utils';
98
+ import { useSystemStoreHook } from '../../../store/modules/system';
99
+ import { getServiceApi } from '../../../api';
100
+
101
+ const data = reactive<IRecord>({
102
+ record: {},
103
+ dataList: [],
104
+ loading: false,
105
+ dialogFormVisible: false,
106
+ isChecked: false,
107
+ dataStatus: ''
108
+ });
109
+
110
+ const dataDict = useSystemStoreHook().getDataDict;
111
+ const { t } = useI18n();
112
+ const serviceApi = getServiceApi();
113
+
114
+ const rules = {
115
+ deptName: [
116
+ {
117
+ required: true,
118
+ message: `${t('message.required')}${t('message.deptName')}`
119
+ }
120
+ ],
121
+ deptCode: [
122
+ {
123
+ required: true,
124
+ message: `${t('message.required')}${t('message.deptCode')}`
125
+ }
126
+ ],
127
+ deptType: [
128
+ {
129
+ required: true,
130
+ message: `${t('message.required')}${t('message.deptType')}`
131
+ }
132
+ ]
133
+ };
134
+
135
+ const active: IRecord = inject('active');
136
+ // const treeList = inject('treeList');
137
+ const scrollPanelChange: IRecord = inject('scrollPanelChange');
138
+
139
+ const url = '/uums/department';
140
+
141
+ watch(
142
+ () => active.value,
143
+ (newVal, oldVal) => {
144
+ data.record = active.value;
145
+ newVal?.id && oldVal?.id && newVal !== oldVal && handleEdit('detail');
146
+ }
147
+ );
148
+
149
+ // 新增子类型
150
+ const handleAdd = () => {
151
+ data.dataStatus = 'add';
152
+ data.record = {};
153
+ data.record.parentId = active.value?.id;
154
+ data.isChecked = false;
155
+ data.dialogFormVisible = true;
156
+ };
157
+ // 编辑
158
+ const handleEdit = dataStatus => {
159
+ data.dataStatus = dataStatus;
160
+ data.record = clone(active.value, true);
161
+ data.dialogFormVisible = true;
162
+ };
163
+
164
+ const xForm = templateRef<any>('xForm', null);
165
+ const handleComfirm = () => {
166
+ xForm.value.validate(async valid => {
167
+ if (!valid) {
168
+ const { record, dataStatus } = data;
169
+ data.loading = true;
170
+ const [err] =
171
+ dataStatus === 'add' ? await to(serviceApi.post(url, record)) : await to(serviceApi.put(url, record));
172
+ data.loading = false;
173
+ if (!err) {
174
+ actionComplete();
175
+ }
176
+ }
177
+ });
178
+ };
179
+
180
+ const handleDelete = async () => {
181
+ const { record } = data;
182
+ if (record.children.length) return warnMessage(t('message.deletePartment'));
183
+ const type = await VXETable.modal.confirm(t('message.tip.del'));
184
+ if (type === 'confirm') {
185
+ await serviceApi.delete(url, record);
186
+ actionComplete();
187
+ }
188
+ };
189
+
190
+ const actionComplete = () => {
191
+ scrollPanelChange.value = true;
192
+ successMessage(t('message.operateSuccess'));
193
+ handleClose();
194
+ // scrollPanelChange.value = false;
195
+ };
196
+
197
+ const handleCancle = () => {
198
+ if (data.dataStatus === 'add') {
199
+ data.dialogFormVisible = false;
200
+ }
201
+ data.dataStatus = '';
202
+ };
203
+
204
+ const handleClose = () => {
205
+ data.dialogFormVisible = false;
206
+ };
207
+ </script>
208
+ <style lang="scss" scoped>
209
+ .page-content {
210
+ background-color: #fff;
211
+
212
+ .w-departInfo-wrapper {
213
+ width: 96%;
214
+ height: 75vh;
215
+
216
+ .w-card-wrapper {
217
+ width: 40%;
218
+
219
+ .el-card__header {
220
+ padding: 10px 20px;
221
+
222
+ .w-card-title {
223
+ position: relative;
224
+ top: 5px;
225
+ }
226
+ }
227
+ }
228
+
229
+ .el-form-item {
230
+ margin-bottom: 12px;
231
+ }
232
+ }
233
+
234
+ .w-noclick-wrapper {
235
+ display: flex;
236
+ flex-wrap: wrap;
237
+ align-items: center;
238
+ justify-content: center;
239
+ height: 100%;
240
+
241
+ .w-content-wrapper {
242
+ display: flex;
243
+ align-items: center;
244
+ justify-content: center;
245
+ height: 75vh;
246
+
247
+ ul {
248
+ padding: 24px;
249
+ border: 1px solid #ccc;
250
+ border-radius: 10px;
251
+ }
252
+ }
253
+
254
+ .w-department-header {
255
+ padding-right: 20px;
256
+ font-size: 26px;
257
+ font-weight: bolder;
258
+ color: #69c;
259
+ }
260
+
261
+ .w-department-line {
262
+ font-size: 16px;
263
+ line-height: 35px;
264
+ color: #999;
265
+ list-style: none;
266
+ }
267
+ }
268
+ }
269
+ </style>