@utogether/udp-core 1.0.1-beta.9 → 1.0.2

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 (168) hide show
  1. package/build/plugins.ts +37 -39
  2. package/dist/{403-BOzKHdlm.js → 403-B1rIjAAu.js} +6 -6
  3. package/dist/{404-uwgt4Nll.js → 404-mBqc2y4t.js} +4 -4
  4. package/dist/{500-4HBf6V9m.js → 500-BoI45Zdh.js} +2 -2
  5. package/dist/{AuthorityInfo-DvbIh1vT.js → AuthorityInfo-B08NBIIn.js} +1 -1
  6. package/dist/{AuthorityInfo.vue_vue_type_style_index_0_lang-BlCPvwXU.js → AuthorityInfo.vue_vue_type_style_index_0_lang-BLP1SaiH.js} +3 -3
  7. package/dist/{Company-D7Q9BFmr.js → Company-JGGyWEWH.js} +3 -3
  8. package/dist/{CompanyPanel-C0-PJlrt.js → CompanyPanel-BQ_cCmDx.js} +7 -7
  9. package/dist/{Department-h2hlXACv.js → Department-z2iO6hwM.js} +10 -10
  10. package/dist/{DepartmentPanel-B6hDEQpG.js → DepartmentPanel-BtQe7zwU.js} +108 -78
  11. package/dist/{DesignPanel-cS58-1v9.js → DesignPanel-7mhtVWas.js} +1 -1
  12. package/dist/{DesignPanel.vue_vue_type_style_index_0_lang-LdvLC8VU.js → DesignPanel.vue_vue_type_style_index_0_lang-4EsHemj_.js} +6 -6
  13. package/dist/{DictView-T3TmpBa8.js → DictView-CjchV2Yk.js} +15 -16
  14. package/dist/InvOrganization-Pn1O_XP0.js +74 -0
  15. package/dist/{Org-CnCBDGKF.js → Org-BqytV_vi.js} +1 -1
  16. package/dist/{Preview-BaktKXB1.js → Preview-CLpUUMay.js} +2 -2
  17. package/dist/{ReportDefine-5Rb0PO9A.js → ReportDefine-Cz1KtEUF.js} +1 -1
  18. package/dist/{ReportDesign-DYdkVREA.js → ReportDesign-BaORYud4.js} +13 -13
  19. package/dist/{ReportQuery-BwhzIXMt.js → ReportQuery-CPCPXiXz.js} +1 -1
  20. package/dist/{ReportQueryFrom-PHtWwlOe.js → ReportQueryFrom-C_AcrfkJ.js} +1 -1
  21. package/dist/{ReportQueryFrom.vue_vue_type_style_index_0_lang-BE5yZNPM.js → ReportQueryFrom.vue_vue_type_style_index_0_lang-Bm67ejay.js} +1 -1
  22. package/dist/{ReportTemplate-DaadVXIi.js → ReportTemplate-CFiNMz79.js} +11 -11
  23. package/dist/{Role-Dtg3nAmG.js → Role-B-XDoJd5.js} +3 -3
  24. package/dist/{RoleAssign-DEGtLssH.js → RoleAssign-BolW8YVs.js} +8 -8
  25. package/dist/{RolePanel-DpUzfE_o.js → RolePanel-2kfs5tw9.js} +1 -1
  26. package/dist/{RolePanel-CT7BTPmy.js → RolePanel-HilSuYns.js} +1 -1
  27. package/dist/{RolePanel.vue_vue_type_script_setup_true_lang-Xyo0YEI0.js → RolePanel.vue_vue_type_script_setup_true_lang-CE4gApUY.js} +7 -7
  28. package/dist/{RolePanel.vue_vue_type_script_setup_true_lang-Dg2A6DJu.js → RolePanel.vue_vue_type_script_setup_true_lang-DPzgfAyV.js} +13 -13
  29. package/dist/{ScrollPanel.vue_vue_type_style_index_0_lang-CyutzDZS.js → ScrollPanel.vue_vue_type_style_index_0_lang-CCTH4RkH.js} +4 -4
  30. package/dist/{Staff-_NlAGkrh.js → Staff-BTk3whFC.js} +3 -3
  31. package/dist/{StaffInfo-DVgUvVgd.js → StaffInfo-d3AuSzlA.js} +1 -1
  32. package/dist/{StaffInfo.vue_vue_type_script_setup_true_lang-C8hmlFgX.js → StaffInfo.vue_vue_type_script_setup_true_lang-eOL4VlfE.js} +5 -5
  33. package/dist/{StaffPanel-DKNZE3IE.js → StaffPanel-DV-D4jjz.js} +1 -1
  34. package/dist/StaffPanel.vue_vue_type_script_setup_true_lang-4sFq3CEo.js +135 -0
  35. package/dist/{SysUser-kQUf7XKz.js → SysUser-BnjYytws.js} +2 -2
  36. package/dist/{SysUserPanel-C191uX3U.js → SysUserPanel-CBoyD-Qi.js} +1 -1
  37. package/dist/SysUserPanel.vue_vue_type_script_setup_true_lang-PrTlTZR-.js +341 -0
  38. package/dist/{SystemMenu-DwuSvHnj.js → SystemMenu-kYB_ZaUt.js} +36 -36
  39. package/dist/{UserInfo-DIsInFld.js → UserInfo-4dx97VBL.js} +1 -1
  40. package/dist/{UserInfo.vue_vue_type_style_index_0_lang-CnvGdbej.js → UserInfo.vue_vue_type_style_index_0_lang-BpbC_ZDm.js} +10 -10
  41. package/dist/{childView-3Bs2UBEw.js → childView-CHPNfTEb.js} +1 -1
  42. package/dist/{childView-BawyULD7.js → childView-CKA_JgVZ.js} +1 -1
  43. package/dist/{childView.vue_vue_type_style_index_0_lang-YpWF-p2F.js → childView.vue_vue_type_style_index_0_lang-Bym2fQRd.js} +7 -7
  44. package/dist/childView.vue_vue_type_style_index_0_lang-W7bCtXeu.js +177 -0
  45. package/dist/{code-rule-DVaYcn8S.js → code-rule-CbxuZg0-.js} +40 -38
  46. package/dist/core.es.js +18 -12
  47. package/dist/{cron-task-xuzP-BpE.js → cron-task-nTOpqQYf.js} +7 -7
  48. package/dist/flow-task-B07st2aD.js +10 -0
  49. package/dist/{frameView-Cudt06qS.js → frameView-Z1tPUyCh.js} +1 -1
  50. package/dist/index-C3q8HoJM.js +4650 -0
  51. package/dist/{layoutView-BlFTV2jX.js → layoutView--MGA9zUB.js} +1766 -1760
  52. package/dist/{log-in-e7D5Ss1P.js → log-in-CSYJDA6m.js} +36 -29
  53. package/dist/log-out-DiwGCg7p.js +130 -0
  54. package/dist/login-C6Y0ajDp.js +251 -0
  55. package/dist/{login-log-kqKzKTto.js → login-log-C0V-_l3F.js} +5 -3
  56. package/dist/{lov-view-B2HaxyMs.js → lov-view-Cmv7wZZ9.js} +6 -6
  57. package/dist/{menuInfo-BxCTJ1VW.js → menuInfo-UeutJpOa.js} +1 -1
  58. package/dist/{menuInfo.vue_vue_type_style_index_0_lang-CLOPNeUW.js → menuInfo.vue_vue_type_style_index_0_lang-CWX4Mu67.js} +118 -98
  59. package/dist/{pda-app-DPsAFNiw.js → pda-app-B6w99SJo.js} +10 -10
  60. package/dist/{resource-Dibb7t8u.js → resource-BybJvUv0.js} +4 -4
  61. package/dist/{su-welcome-DejR0KkM.js → su-welcome-C1bmxHoY.js} +119 -121
  62. package/dist/sys-config-BnmIDnCj.js +370 -0
  63. package/dist/udp-core.css +1 -9
  64. package/dist/utogether-MlnyYtNS.js +4 -0
  65. package/index.ts +49 -40
  66. package/package.json +18 -18
  67. package/src/App.vue +65 -65
  68. package/src/api/http.ts +1 -4
  69. package/src/api/index.ts +4 -2
  70. package/src/api/user.ts +2 -2
  71. package/src/components/SuCharts/src/UserInfo.vue +78 -78
  72. package/src/components/SuScrollTree/ScrollPanel.vue +1 -6
  73. package/src/components/udp/content/index.vue +88 -0
  74. package/src/components/udp/{form.vue → form/form.vue} +13 -16
  75. package/src/components/udp/{grid.vue → grid/index.vue} +56 -27
  76. package/src/components/udp/index.ts +4 -9
  77. package/src/components/udp/ut-stamp-badge/index.vue +271 -0
  78. package/src/components/udp/utils.ts +66 -105
  79. package/src/layout/components/lay-navbar/index.vue +8 -6
  80. package/src/layout/components/lay-panel/index.vue +150 -150
  81. package/src/layout/components/lay-search/index.vue +25 -25
  82. package/src/layout/components/lay-select-org/index.vue +4 -9
  83. package/src/layout/components/lay-setting/index.vue +503 -510
  84. package/src/layout/components/lay-sidebar/horizontal.vue +8 -6
  85. package/src/layout/components/lay-sidebar/mixNav.vue +260 -258
  86. package/src/layout/components/lay-sidebar/sidebar-logo.vue +101 -98
  87. package/src/layout/components/lay-tag/index.vue +24 -51
  88. package/src/layout/hooks/useDataThemeChange.ts +1 -1
  89. package/src/layout/hooks/useNav.ts +176 -173
  90. package/src/layout/hooks/useTag.ts +227 -233
  91. package/src/layout/types.ts +93 -92
  92. package/src/main.ts +115 -119
  93. package/src/plugins/i18n/en.ts +302 -302
  94. package/src/plugins/i18n/module/u-workflow.ts +1 -1
  95. package/src/plugins/i18n/zh.ts +21 -6
  96. package/src/plugins/vxe-table/index.ts +116 -53
  97. package/src/plugins/vxe-table/render.tsx +945 -956
  98. package/src/router/index.ts +17 -17
  99. package/src/router/modules/flow.ts +35 -0
  100. package/src/router/modules/home.ts +32 -32
  101. package/src/router/modules/remaining.ts +58 -58
  102. package/src/router/utils.ts +420 -377
  103. package/src/store/modules/app.ts +2 -4
  104. package/src/store/modules/epTheme.ts +48 -49
  105. package/src/store/modules/multiTags.ts +15 -14
  106. package/src/store/modules/permission.ts +25 -15
  107. package/src/store/modules/system.ts +1 -3
  108. package/src/style/button.scss +85 -85
  109. package/src/style/login.css +1 -1
  110. package/src/style/vxetable.scss +61 -2
  111. package/src/utils/dataFormat/index.ts +223 -223
  112. package/src/utils/index.ts +3 -1
  113. package/src/utils/lifecycle.ts +39 -20
  114. package/src/utils/propTypes.ts +1 -6
  115. package/src/utils/storage/index.ts +2 -2
  116. package/src/utils/udp/http/index.ts +24 -11
  117. package/src/utils/udp/http/types.d.ts +3 -10
  118. package/src/views/login/login-view.vue +4 -18
  119. package/src/views/organization/company/CompanyPanel.vue +259 -259
  120. package/src/views/organization/department/Department.vue +58 -58
  121. package/src/views/organization/department/DepartmentPanel.vue +303 -283
  122. package/src/views/organization/inv-org/InvOrganization.vue +22 -7
  123. package/src/views/organization/staff/StaffInfo.vue +127 -133
  124. package/src/views/organization/staff/StaffPanel.vue +162 -145
  125. package/src/views/system/cron/cron-task.vue +2 -12
  126. package/src/views/system/menu/SystemMenu.vue +185 -183
  127. package/src/views/system/menu/menuInfo.vue +384 -363
  128. package/src/views/system/role/UserInfo.vue +195 -195
  129. package/src/views/system/role-assign/RoleAssign.vue +57 -57
  130. package/src/views/system/role-assign/RolePanel.vue +139 -139
  131. package/src/views/system/sys/sys-config.vue +69 -20
  132. package/src/views/system/sysUser/SysUserPanel.vue +97 -28
  133. package/src/views/uapp/pda/pda-app.vue +208 -208
  134. package/src/views/udev/coderule/code-rule.vue +132 -121
  135. package/src/views/udev/dict/DictView.vue +2 -2
  136. package/src/views/udev/dict/childView.vue +183 -222
  137. package/src/views/udev/lov/childView.vue +1 -7
  138. package/src/views/udev/lov/lov-view.vue +91 -91
  139. package/src/views/uhome/components/menu-favorite.vue +314 -331
  140. package/src/views/uhome/su-welcome.vue +319 -339
  141. package/src/views/ulogin/login.vue +325 -321
  142. package/src/views/upms/interface/log-in.vue +100 -106
  143. package/src/views/upms/interface/log-out.vue +104 -107
  144. package/src/views/upms/user/login-log.vue +54 -60
  145. package/src/views/urpt/design/DesignPanel.vue +507 -507
  146. package/src/views/urpt/design/Preview.vue +1 -0
  147. package/src/views/urpt/design/ReportDesign.vue +2 -4
  148. package/src/views/utask/flow-task.vue +18 -0
  149. package/types/global.d.ts +231 -236
  150. package/dist/InvOrganization-BVuOhzbt.js +0 -66
  151. package/dist/StaffPanel.vue_vue_type_script_setup_true_lang-BOOO6Cek.js +0 -111
  152. package/dist/SysUserPanel.vue_vue_type_script_setup_true_lang-SwNbAEvW.js +0 -294
  153. package/dist/childView.vue_vue_type_style_index_0_lang-DWIFCX3X.js +0 -187
  154. package/dist/index-CKnq5xIa.js +0 -2623
  155. package/dist/log-out--RRncZhN.js +0 -120
  156. package/dist/login-CpKykfdf.js +0 -253
  157. package/dist/sys-config-DiySRWns.js +0 -277
  158. package/dist/utogether-Dct_14Zk.js +0 -182
  159. package/src/components/udp/count-down.vue +0 -536
  160. package/src/components/udp/flip-down/FlipCard/flip-card.vue +0 -251
  161. package/src/components/udp/flip-down/FlipCard/interfaces.ts +0 -4
  162. package/src/components/udp/flip-down/FlipClock/flip-clock.vue +0 -113
  163. package/src/components/udp/form-upload.vue +0 -482
  164. package/src/components/udp/lov.vue +0 -388
  165. package/src/components/udp/modal-form.vue +0 -189
  166. package/src/components/udp/modal-grid.vue +0 -288
  167. package/src/components/udp/upload.vue +0 -423
  168. package/src/utils/udp/useRender.ts +0 -431
@@ -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>
@@ -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();
@@ -1,259 +1,259 @@
1
- <!--
2
- * @Author: wei.li
3
- * @Date: 2021-11-19 21:14:41
4
- * @LastEditors: levi7754 levi7754@163.com
5
- * @LastEditTime: 2025-04-08 15:48:36
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
- type="flex"
22
- justify="center"
23
- align="middle"
24
- class="w-departInfo-wrapper"
25
- >
26
- <el-card width="60%" shadow="always" class="box-card w-card-wrapper">
27
- <div class="clearfix">
28
- <span class="w-card-title" />
29
- </div>
30
- <el-row>
31
- <vxe-form ref="xForm" :data="data.record" :rules="rules" label-width="80px">
32
- <vxe-form-item
33
- :title="$t('message.udp.unitName')"
34
- field="unitName"
35
- :item-render="{ name: '$input', props: { disabled: data.dataStatus === 'detail' } }"
36
- :span="24"
37
- />
38
- <vxe-form-item
39
- :title="$t('message.udp.unitCode')"
40
- field="unitCode"
41
- :item-render="{ name: '$input', props: { disabled: data.dataStatus !== 'add' } }"
42
- :span="24"
43
- />
44
- <vxe-form-item
45
- :title="$t('message.udp.unitNote')"
46
- field="unitNote"
47
- :item-render="{ name: '$input', props: { disabled: data.dataStatus === 'detail' } }"
48
- :span="24"
49
- />
50
- </vxe-form>
51
- </el-row>
52
- <el-row type="flex" justify="center">
53
- <vxe-checkbox
54
- v-if="data.dataStatus === 'add'"
55
- v-model="data.isChecked"
56
- style="padding-top: 5px; margin-right: 8px"
57
- >{{ $t('message.udp.continueAdd') }}</vxe-checkbox
58
- >
59
- <vxe-button
60
- v-if="data.dataStatus !== 'detail'"
61
- status="primary"
62
- :content="$t('message.btn.confirm')"
63
- @click="handleComfirm"
64
- />
65
- <vxe-button
66
- v-if="data.dataStatus !== 'detail'"
67
- status="warning"
68
- :content="$t('message.btn.cancel')"
69
- @click="handleCancle"
70
- />
71
- </el-row>
72
- </el-card>
73
- </el-row>
74
- <el-row v-else class="w-noclick-wrapper">
75
- <!-- <span class="w-department-header">{{ $t('setting.deartment.organization') }}</span> -->
76
- <div class="w-content-wrapper">
77
- <ul>
78
- <li class="w-department-line">
79
- <div>● 点击新建,新建租户信息。</div>
80
- <div style="margin: 0; text-indent: 2em">
81
- 已点击树结构上的租户名称,默认创建为当前租户的下属租户
82
- </div>
83
- <div style="margin: 0; text-indent: 2em">未点击树结构上的租户名称,则创建为一级租户</div>
84
- </li>
85
- <li class="w-department-line">● 点击树结构上的租户名称,点击修改按钮,修改租户信息。</li>
86
- <li class="w-department-line">
87
- <div>● 点击树结构上的租户名称,点击删除按钮,删除租户信息。</div>
88
- <div style="text-indent: 2em">当租户下有单位存在时,不允许删除租户信息。</div>
89
- </li>
90
- </ul>
91
- </div>
92
- </el-row>
93
- </div>
94
- </template>
95
-
96
- <script setup lang="ts">
97
- import { useI18n } from 'vue-i18n';
98
- import { reactive, watch, inject } from 'vue';
99
- import { VxeUI } from 'vxe-table';
100
- import { templateRef } from '@vueuse/core';
101
- import { clone } from 'xe-utils';
102
- import { successMessage, warnMessage } from '@utogether/utils';
103
- import { getServiceApi } from '../../../api';
104
-
105
- const data = reactive<IRecord>({
106
- record: {},
107
- dataList: [],
108
- submitLoading: false,
109
- dialogFormVisible: false,
110
- isChecked: false,
111
- dataStatus: ''
112
- });
113
- const { t } = useI18n();
114
- const rules = {
115
- unitName: [
116
- {
117
- required: true,
118
- message: `${t('message.required')}${t('message.udp.unitName')}`
119
- }
120
- ],
121
- unitCode: [
122
- {
123
- required: true,
124
- message: `${t('message.required')}${t('message.udp.unitCode')}`
125
- }
126
- ]
127
- };
128
-
129
- const active: IRecord = inject('active');
130
- const scrollPanelChange: IRecord = inject('scrollPanelChange');
131
-
132
- const serviceApi = getServiceApi();
133
- const url = '/uums/unit';
134
-
135
- watch(
136
- () => active.value,
137
- (newVal, oldVal) => {
138
- data.record = active.value;
139
- newVal?.id && oldVal?.id && newVal !== oldVal && handleEdit('detail');
140
- }
141
- );
142
-
143
- // 新增子类型
144
- const handleAdd = () => {
145
- data.dataStatus = 'add';
146
- data.record = {};
147
- data.record.parentId = active.value?.id;
148
- data.isChecked = false;
149
- data.dialogFormVisible = true;
150
- };
151
- // 编辑
152
- const handleEdit = dataStatus => {
153
- data.dataStatus = dataStatus;
154
- data.record = clone(active.value, true);
155
- data.dialogFormVisible = true;
156
- };
157
-
158
- const xForm = templateRef<any>('xForm', null);
159
- const handleComfirm = () => {
160
- xForm.value.validate(async valid => {
161
- if (!valid) {
162
- const { record, dataStatus } = data;
163
- if (dataStatus === 'add') {
164
- await serviceApi.post(url, record);
165
- } else {
166
- await serviceApi.put(url, record);
167
- }
168
- actionComplete();
169
- }
170
- });
171
- };
172
-
173
- const handleDelete = async () => {
174
- const { record } = data;
175
- if (record.children?.length) return warnMessage(t('message.deletePartment'));
176
- const type = await VxeUI.modal.confirm(t('message.tip.del', { msg: 'aaaaa' }));
177
- if (type === 'confirm') {
178
- await serviceApi.delete(url, record);
179
- actionComplete();
180
- }
181
- };
182
-
183
- const actionComplete = () => {
184
- scrollPanelChange.value = true;
185
- successMessage(t('message.operateSuccess'));
186
- handleClose();
187
- };
188
-
189
- const handleCancle = () => {
190
- data.dialogFormVisible = false;
191
- data.dataStatus = '';
192
- };
193
-
194
- const handleClose = () => {
195
- data.dialogFormVisible = false;
196
- };
197
- </script>
198
- <style lang="scss" scoped>
199
- .page-content {
200
- background-color: #fff;
201
-
202
- .w-departInfo-wrapper {
203
- width: 96%;
204
- height: 75vh;
205
-
206
- .w-card-wrapper {
207
- width: 40%;
208
-
209
- .el-card__header {
210
- padding: 10px 20px;
211
-
212
- .w-card-title {
213
- position: relative;
214
- top: 5px;
215
- }
216
- }
217
- }
218
-
219
- .el-form-item {
220
- margin-bottom: 12px;
221
- }
222
- }
223
-
224
- .w-noclick-wrapper {
225
- display: flex;
226
- flex-wrap: wrap;
227
- align-items: center;
228
- justify-content: center;
229
- height: 100%;
230
-
231
- .w-content-wrapper {
232
- display: flex;
233
- align-items: center;
234
- justify-content: center;
235
- height: 75vh;
236
-
237
- ul {
238
- padding: 24px;
239
- border: 1px solid #ccc;
240
- border-radius: 10px;
241
- }
242
- }
243
-
244
- .w-department-header {
245
- padding-right: 20px;
246
- font-size: 26px;
247
- font-weight: bolder;
248
- color: #69c;
249
- }
250
-
251
- .w-department-line {
252
- font-size: 16px;
253
- line-height: 35px;
254
- color: #999;
255
- list-style: none;
256
- }
257
- }
258
- }
259
- </style>
1
+ <!--
2
+ * @Author: wei.li
3
+ * @Date: 2021-11-19 21:14:41
4
+ * @LastEditors: levi7754 levi7754@163.com
5
+ * @LastEditTime: 2025-04-08 15:48:36
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
+ type="flex"
22
+ justify="center"
23
+ align="middle"
24
+ class="w-departInfo-wrapper"
25
+ >
26
+ <el-card width="60%" shadow="always" class="box-card w-card-wrapper">
27
+ <div class="clearfix">
28
+ <span class="w-card-title" />
29
+ </div>
30
+ <el-row>
31
+ <vxe-form ref="xForm" :data="data.record" :rules="rules" label-width="80px">
32
+ <vxe-form-item
33
+ :title="$t('message.udp.unitName')"
34
+ field="unitName"
35
+ :item-render="{ name: '$input', props: { disabled: data.dataStatus === 'detail' } }"
36
+ :span="24"
37
+ />
38
+ <vxe-form-item
39
+ :title="$t('message.udp.unitCode')"
40
+ field="unitCode"
41
+ :item-render="{ name: '$input', props: { disabled: data.dataStatus !== 'add' } }"
42
+ :span="24"
43
+ />
44
+ <vxe-form-item
45
+ :title="$t('message.udp.unitNote')"
46
+ field="unitNote"
47
+ :item-render="{ name: '$input', props: { disabled: data.dataStatus === 'detail' } }"
48
+ :span="24"
49
+ />
50
+ </vxe-form>
51
+ </el-row>
52
+ <el-row type="flex" justify="center">
53
+ <vxe-checkbox
54
+ v-if="data.dataStatus === 'add'"
55
+ v-model="data.isChecked"
56
+ style="padding-top: 5px; margin-right: 8px"
57
+ >{{ $t('message.udp.continueAdd') }}</vxe-checkbox
58
+ >
59
+ <vxe-button
60
+ v-if="data.dataStatus !== 'detail'"
61
+ status="primary"
62
+ :content="$t('message.btn.confirm')"
63
+ @click="handleComfirm"
64
+ />
65
+ <vxe-button
66
+ v-if="data.dataStatus !== 'detail'"
67
+ status="warning"
68
+ :content="$t('message.btn.cancel')"
69
+ @click="handleCancle"
70
+ />
71
+ </el-row>
72
+ </el-card>
73
+ </el-row>
74
+ <el-row v-else class="w-noclick-wrapper">
75
+ <!-- <span class="w-department-header">{{ $t('setting.deartment.organization') }}</span> -->
76
+ <div class="w-content-wrapper">
77
+ <ul>
78
+ <li class="w-department-line">
79
+ <div>● 点击新建,新建租户信息。</div>
80
+ <div style="margin: 0; text-indent: 2em">
81
+ 已点击树结构上的租户名称,默认创建为当前租户的下属租户
82
+ </div>
83
+ <div style="margin: 0; text-indent: 2em">未点击树结构上的租户名称,则创建为一级租户</div>
84
+ </li>
85
+ <li class="w-department-line">● 点击树结构上的租户名称,点击修改按钮,修改租户信息。</li>
86
+ <li class="w-department-line">
87
+ <div>● 点击树结构上的租户名称,点击删除按钮,删除租户信息。</div>
88
+ <div style="text-indent: 2em">当租户下有单位存在时,不允许删除租户信息。</div>
89
+ </li>
90
+ </ul>
91
+ </div>
92
+ </el-row>
93
+ </div>
94
+ </template>
95
+
96
+ <script setup lang="ts">
97
+ import { useI18n } from 'vue-i18n';
98
+ import { reactive, watch, inject } from 'vue';
99
+ import { VxeUI } from 'vxe-table';
100
+ import { templateRef } from '@vueuse/core';
101
+ import { clone } from 'xe-utils';
102
+ import { successMessage, warnMessage } from '@utogether/utils';
103
+ import { getServiceApi } from '../../../api';
104
+
105
+ const data = reactive<IRecord>({
106
+ record: {},
107
+ dataList: [],
108
+ submitLoading: false,
109
+ dialogFormVisible: false,
110
+ isChecked: false,
111
+ dataStatus: ''
112
+ });
113
+ const { t } = useI18n();
114
+ const rules = {
115
+ unitName: [
116
+ {
117
+ required: true,
118
+ message: `${t('message.required')}${t('message.udp.unitName')}`
119
+ }
120
+ ],
121
+ unitCode: [
122
+ {
123
+ required: true,
124
+ message: `${t('message.required')}${t('message.udp.unitCode')}`
125
+ }
126
+ ]
127
+ };
128
+
129
+ const active: IRecord = inject('active');
130
+ const scrollPanelChange: IRecord = inject('scrollPanelChange');
131
+
132
+ const serviceApi = getServiceApi();
133
+ const url = '/uums/unit';
134
+
135
+ watch(
136
+ () => active.value,
137
+ (newVal, oldVal) => {
138
+ data.record = active.value;
139
+ newVal?.id && oldVal?.id && newVal !== oldVal && handleEdit('detail');
140
+ }
141
+ );
142
+
143
+ // 新增子类型
144
+ const handleAdd = () => {
145
+ data.dataStatus = 'add';
146
+ data.record = {};
147
+ data.record.parentId = active.value?.id;
148
+ data.isChecked = false;
149
+ data.dialogFormVisible = true;
150
+ };
151
+ // 编辑
152
+ const handleEdit = dataStatus => {
153
+ data.dataStatus = dataStatus;
154
+ data.record = clone(active.value, true);
155
+ data.dialogFormVisible = true;
156
+ };
157
+
158
+ const xForm = templateRef<any>('xForm', null);
159
+ const handleComfirm = () => {
160
+ xForm.value.validate(async valid => {
161
+ if (!valid) {
162
+ const { record, dataStatus } = data;
163
+ if (dataStatus === 'add') {
164
+ await serviceApi.post(url, record);
165
+ } else {
166
+ await serviceApi.put(url, record);
167
+ }
168
+ actionComplete();
169
+ }
170
+ });
171
+ };
172
+
173
+ const handleDelete = async () => {
174
+ const { record } = data;
175
+ if (record.children?.length) return warnMessage(t('message.deletePartment'));
176
+ const type = await VxeUI.modal.confirm(t('message.tip.del', { msg: 'aaaaa' }));
177
+ if (type === 'confirm') {
178
+ await serviceApi.delete(url, record);
179
+ actionComplete();
180
+ }
181
+ };
182
+
183
+ const actionComplete = () => {
184
+ scrollPanelChange.value = true;
185
+ successMessage(t('message.operateSuccess'));
186
+ handleClose();
187
+ };
188
+
189
+ const handleCancle = () => {
190
+ data.dialogFormVisible = false;
191
+ data.dataStatus = '';
192
+ };
193
+
194
+ const handleClose = () => {
195
+ data.dialogFormVisible = false;
196
+ };
197
+ </script>
198
+ <style lang="scss" scoped>
199
+ .page-content {
200
+ background-color: #fff;
201
+
202
+ .w-departInfo-wrapper {
203
+ width: 96%;
204
+ height: 75vh;
205
+
206
+ .w-card-wrapper {
207
+ width: 40%;
208
+
209
+ .el-card__header {
210
+ padding: 10px 20px;
211
+
212
+ .w-card-title {
213
+ position: relative;
214
+ top: 5px;
215
+ }
216
+ }
217
+ }
218
+
219
+ .el-form-item {
220
+ margin-bottom: 12px;
221
+ }
222
+ }
223
+
224
+ .w-noclick-wrapper {
225
+ display: flex;
226
+ flex-wrap: wrap;
227
+ align-items: center;
228
+ justify-content: center;
229
+ height: 100%;
230
+
231
+ .w-content-wrapper {
232
+ display: flex;
233
+ align-items: center;
234
+ justify-content: center;
235
+ height: 75vh;
236
+
237
+ ul {
238
+ padding: 24px;
239
+ border: 1px solid #ccc;
240
+ border-radius: 10px;
241
+ }
242
+ }
243
+
244
+ .w-department-header {
245
+ padding-right: 20px;
246
+ font-size: 26px;
247
+ font-weight: bolder;
248
+ color: #69c;
249
+ }
250
+
251
+ .w-department-line {
252
+ font-size: 16px;
253
+ line-height: 35px;
254
+ color: #999;
255
+ list-style: none;
256
+ }
257
+ }
258
+ }
259
+ </style>