@epxing/business 5.3.0-beta.2 → 5.3.0-beta.3

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 (98) hide show
  1. package/API.md +8 -4
  2. package/README.md +44 -44
  3. package/dist/src/base/AiSkillEditor.js +1 -1
  4. package/dist/src/base/AiSkillEditor.vue.js +2 -0
  5. package/dist/src/base/AppConfigFormItem.js +1 -3
  6. package/dist/src/base/AppConfigFormItem.vue.js +210 -85
  7. package/dist/src/base/CommonFieldList.js +1 -1
  8. package/dist/src/base/CommonFieldList.vue.js +2 -1
  9. package/dist/src/base/ConfigModuleIndex.js +38 -1
  10. package/dist/src/base/ManageAppNav.js +1 -1
  11. package/dist/src/base/ManageMenu.js +1 -1
  12. package/dist/src/base/RoleBindTrace.js +253 -0
  13. package/dist/src/base/RoleGroupManage.js +1037 -0
  14. package/dist/src/base/ServiceMenu.js +7 -6
  15. package/dist/src/components/AiList.js +1278 -3
  16. package/dist/src/components/EntityCheckboxFind.vue.js +14 -10
  17. package/dist/src/components/EntityRightFormItem.js +1 -5
  18. package/dist/src/components/EntityRightFormItem.vue.js +3 -1
  19. package/dist/src/components/EntitySystemEr.js +492 -0
  20. package/dist/src/components/HallNav.vue.js +7 -36
  21. package/dist/src/components/IconFontLibrary.js +22 -1
  22. package/dist/src/components/IconFontList.js +21 -1
  23. package/dist/src/components/PrintFormList.js +2 -1
  24. package/dist/src/components/PrintFormList.vue.js +3 -1
  25. package/dist/src/components/WikiWorkbench.js +153 -129
  26. package/dist/src/components/authorization/AuthorizationInterface.js +3 -1
  27. package/dist/src/components/custom-bpmn/PropertiesView.js +1991 -1942
  28. package/dist/src/components/icon-gallery/IconGallery.js +193 -0
  29. package/dist/src/components/icon-gallery/mixin.js +150 -0
  30. package/dist/src/components/wiki-workbench/WikiIntake.js +86 -93
  31. package/dist/src/components/wiki-workbench/WikiIntake.vue.js +153 -73
  32. package/dist/src/index.js +26 -20
  33. package/dist/src/public-components.js +16 -14
  34. package/dist/src/route-components.js +5 -5
  35. package/dist/src/system.component.index.js +1 -1
  36. package/dist/src/system.component.js +8 -3
  37. package/dist/src/system.component.lazy.js +1 -1
  38. package/dist/src/views/Add.js +1 -1
  39. package/dist/src/views/Add.vue.js +8 -3
  40. package/dist/src/views/AiToolManager.js +792 -317
  41. package/dist/src/views/App.js +3 -45
  42. package/dist/src/views/AppRoleSelect.js +3 -230
  43. package/dist/src/views/Error.js +3 -207
  44. package/dist/src/views/ExcelDesign.js +326 -316
  45. package/dist/src/views/JvmMemoryMonitor.js +463 -0
  46. package/dist/src/views/Module.js +3 -170
  47. package/dist/src/views/WikiBinding.js +88 -25
  48. package/dist/style.css +2867 -1487
  49. package/package.json +12 -6
  50. package/src/base/AiSkillEditor.vue +2 -0
  51. package/src/base/AppConfigFormItem.vue +211 -145
  52. package/src/base/CommonFieldList.vue +9 -6
  53. package/src/base/ConfigModuleIndex.vue +37 -1
  54. package/src/base/ManageAppNav.vue +1188 -1188
  55. package/src/base/ManageMenu.vue +933 -933
  56. package/src/base/RoleBindTrace.vue +364 -0
  57. package/src/base/RoleGroupManage.vue +1160 -0
  58. package/src/base/ServiceMenu.vue +6 -5
  59. package/src/components/AiList.vue +439 -113
  60. package/src/components/EntityCheckboxFind.vue +12 -8
  61. package/src/components/EntityRightFormItem.vue +9 -10
  62. package/src/components/EntitySystemEr.vue +517 -0
  63. package/src/components/HallNav.vue +6 -33
  64. package/src/components/IconFontLibrary.vue +27 -60
  65. package/src/components/IconFontList.vue +13 -64
  66. package/src/components/PrintFormList.vue +33 -27
  67. package/src/components/WikiWorkbench.vue +90 -60
  68. package/src/components/authorization/AuthorizationInterface.vue +2 -0
  69. package/src/components/custom-bpmn/CustomPalette.js +1 -1
  70. package/src/components/custom-bpmn/CustomRenderer.js +1 -1
  71. package/src/components/custom-bpmn/PropertiesView.vue +35 -4
  72. package/src/components/custom-bpmn/index.js +1 -1
  73. package/src/components/icon-gallery/IconGallery.vue +130 -0
  74. package/src/components/icon-gallery/mixin.jsx +109 -0
  75. package/src/components/wiki-workbench/WikiIntake.vue +178 -104
  76. package/src/index.js +24 -20
  77. package/src/public-components.js +1 -0
  78. package/src/route-components.js +4 -4
  79. package/src/system.component.index.js +1 -1
  80. package/src/views/Add.vue +8 -5
  81. package/src/views/AiToolManager.vue +326 -4
  82. package/src/views/App.vue +4 -53
  83. package/src/views/AppRoleSelect.vue +4 -334
  84. package/src/views/Error.vue +4 -63
  85. package/src/views/ExcelDesign.vue +24 -7
  86. package/src/views/JvmMemoryMonitor.vue +284 -0
  87. package/src/views/Module.vue +4 -210
  88. package/src/views/WikiBinding.vue +42 -0
  89. package/types/app.d.ts +1 -0
  90. package/types/dept-find.d.ts +1 -1
  91. package/types/index.d.ts +15 -14
  92. package/types/popup.d.ts +2 -2
  93. package/types/route-components.d.ts +1 -1
  94. package/types/user-find.d.ts +1 -1
  95. package/dist/assets/role_select-DTqRlFNz.webp +0 -0
  96. package/dist/src/components/AiList.vue.js +0 -93
  97. package/dist/src/components/IconFontLibrary.vue.js +0 -67
  98. package/dist/src/components/IconFontList.vue.js +0 -79
@@ -0,0 +1,1037 @@
1
+ import '../../style.css';
2
+ import component from "@epxing/core/src/mixins/component.js";
3
+ import { resolveComponent, resolveDirective, openBlock, createElementBlock, createElementVNode, Fragment, renderList, normalizeClass, toDisplayString, withModifiers, createTextVNode, createCommentVNode, withDirectives, vShow, vModelText, vModelCheckbox, createBlock } from "vue";
4
+ /* empty css */
5
+ import _export_sfc from "../../_virtual/_plugin-vue_export-helper.js";
6
+ const _sfc_main = {
7
+ name: "epx-role-group-manage",
8
+ mixins: [component],
9
+ data() {
10
+ return {
11
+ curGroupId: "",
12
+ // 当前查看的组
13
+ groupList: [],
14
+ // 组列表(含 roleCount / userCount 聚合)
15
+ curGroup: null,
16
+ // 当前组基本信息
17
+ detail: { sysCount: 0 },
18
+ // 组详情附加统计
19
+ groupRoles: [],
20
+ // 组内角色
21
+ groupUsers: [],
22
+ // 已授权用户
23
+ activeTab: "roles",
24
+ // 当前页签
25
+ pendingApply: [],
26
+ // 本次新增待重新应用的角色
27
+ // 弹窗开关
28
+ dlg: {
29
+ groupForm: false,
30
+ pickRole: false,
31
+ removeRole: false,
32
+ delGroup: false,
33
+ addUser: false,
34
+ removeUser: false
35
+ },
36
+ // 新建/编辑表单
37
+ formGroup: { ID: "", NAME: "", CODE: "", DESC: "", ORDER_NUM: 100 },
38
+ formErr: { name: false, code: false },
39
+ // 添加角色
40
+ selectableRoles: [],
41
+ // 按系统分组
42
+ selRoleIds: [],
43
+ // 移除角色
44
+ rmRole: { id: "", label: "", total: 0, withManual: 0 },
45
+ // 删除组
46
+ delGroupData: { ID: "", NAME: "", onlyGroup: 0, both: 0, userCount: 0 },
47
+ // 添加用户(后端分页,避免租户用户量大时全量渲染拖垮页面)
48
+ selectableUsers: [],
49
+ selUserIds: [],
50
+ addUserKeyword: "",
51
+ addUserTotal: 0,
52
+ addUserPage: 1,
53
+ addUserLimit: 50,
54
+ addUserLoading: false,
55
+ addUserTimer: null,
56
+ // 移除用户
57
+ rmUser: { id: "", label: "", total: 0, withManual: 0 },
58
+ // 轻提示
59
+ toast: { show: false, type: "success", text: "" },
60
+ toastTimer: null
61
+ };
62
+ },
63
+ computed: {
64
+ pickCountText() {
65
+ return this.selRoleIds.length ? "已选 " + this.selRoleIds.length + " 个角色" : "尚未选择角色";
66
+ },
67
+ userCountText() {
68
+ return this.selUserIds.length ? "已选 " + this.selUserIds.length + " 个用户" : "尚未选择用户";
69
+ },
70
+ toastClass() {
71
+ return { success: "v9-message--success", error: "v9-message--error", warn: "v9-message--warning", info: "v9-message--info" }[this.toast.type] || "v9-message--info";
72
+ },
73
+ toastIcon() {
74
+ return { success: "el-icon-success", error: "el-icon-error", warn: "el-icon-warning-outline", info: "el-icon-info" }[this.toast.type] || "el-icon-info";
75
+ }
76
+ },
77
+ created() {
78
+ this.getGroupList(() => {
79
+ const qid = this.$query && this.$query.groupId;
80
+ if (qid && this.groupList.some((g) => g.ID === qid)) {
81
+ this.selectGroup(qid);
82
+ } else if (this.groupList.length) {
83
+ this.selectGroup(this.groupList[0].ID);
84
+ }
85
+ });
86
+ },
87
+ methods: {
88
+ msg(type, text) {
89
+ this.toast = { show: true, type, text };
90
+ clearTimeout(this.toastTimer);
91
+ this.toastTimer = setTimeout(() => {
92
+ this.toast.show = false;
93
+ }, type === "error" ? 6e3 : 3600);
94
+ },
95
+ // ---------- 数据加载 ----------
96
+ getGroupList(cb) {
97
+ this.$http.$request({ action: "getGroupList", entityId: "FM_ROLE_GROUP" }).then((data) => {
98
+ this.groupList = data.groups || [];
99
+ cb && cb();
100
+ }).catch((err) => this.msg("error", err.message || "获取角色组列表失败"));
101
+ },
102
+ getGroupDetail() {
103
+ if (!this.curGroupId) return;
104
+ this.$http.$request({ action: "getGroupDetail", entityId: "FM_ROLE_GROUP", groupId: this.curGroupId }).then((data) => {
105
+ this.curGroup = data.group || null;
106
+ this.groupRoles = data.roles || [];
107
+ this.groupUsers = data.users || [];
108
+ this.detail.sysCount = data.stats && data.stats.sysCount || 0;
109
+ this.pendingApply = data.pendingApply || [];
110
+ }).catch((err) => this.msg("error", err.message || "获取组详情失败"));
111
+ },
112
+ selectGroup(gid) {
113
+ this.curGroupId = gid;
114
+ this.activeTab = "roles";
115
+ this.getGroupList();
116
+ this.getGroupDetail();
117
+ },
118
+ switchGroupTab(tab) {
119
+ this.activeTab = tab;
120
+ },
121
+ // ---------- 新建 / 编辑组 ----------
122
+ openGroupForm(g) {
123
+ this.formGroup = g ? { ID: g.ID, NAME: g.NAME, CODE: g.CODE, DESC: g.DESC || "", ORDER_NUM: g.ORDER_NUM } : { ID: "", NAME: "", CODE: "", DESC: "", ORDER_NUM: 100 };
124
+ this.formErr = { name: false, code: false };
125
+ this.dlg.groupForm = true;
126
+ },
127
+ saveGroupForm() {
128
+ const name = (this.formGroup.NAME || "").trim();
129
+ const code = (this.formGroup.CODE || "").trim();
130
+ this.formErr.name = !name;
131
+ this.formErr.code = !/^[A-Za-z][A-Za-z0-9_]*$/.test(code);
132
+ if (this.formErr.name || this.formErr.code) return;
133
+ this.$http.$request({
134
+ action: "saveGroup",
135
+ entityId: "FM_ROLE_GROUP",
136
+ "bean.ID": this.formGroup.ID || "",
137
+ "bean.NAME": name,
138
+ "bean.CODE": code,
139
+ "bean.DESC": (this.formGroup.DESC || "").trim(),
140
+ "bean.ORDER_NUM": parseInt(this.formGroup.ORDER_NUM, 10) || 0
141
+ }).then(() => {
142
+ const isNew = !this.formGroup.ID;
143
+ this.dlg.groupForm = false;
144
+ this.getGroupList(() => {
145
+ if (isNew) {
146
+ const created = this.groupList[this.groupList.length - 1];
147
+ if (created) this.selectGroup(created.ID);
148
+ } else {
149
+ this.getGroupDetail();
150
+ }
151
+ });
152
+ this.msg("success", "角色组「" + name + "」" + (isNew ? "已创建,接下来向组内添加角色" : "已保存"));
153
+ }).catch((err) => {
154
+ const msgText = err.message || "";
155
+ if (msgText.indexOf("名称") >= 0) this.formErr.name = true;
156
+ if (msgText.indexOf("编码") >= 0) this.formErr.code = true;
157
+ this.msg("error", msgText || "保存失败");
158
+ });
159
+ },
160
+ // ---------- 添加角色 ----------
161
+ openPickRole() {
162
+ this.selRoleIds = [];
163
+ this.$http.$request({ action: "getSelectableRoles", entityId: "FM_ROLE_GROUP", groupId: this.curGroupId }).then((data) => {
164
+ this.selectableRoles = data.systems || [];
165
+ this.dlg.pickRole = true;
166
+ }).catch((err) => this.msg("error", err.message || "获取可选角色失败"));
167
+ },
168
+ savePickRole() {
169
+ if (!this.selRoleIds.length) {
170
+ this.msg("warn", "请先勾选要加入的角色");
171
+ return;
172
+ }
173
+ this.$http.$request({
174
+ action: "addRolesToGroup",
175
+ entityId: "FM_ROLE_GROUP",
176
+ groupId: this.curGroupId,
177
+ roleIds: this.selRoleIds.join(",")
178
+ }).then((data) => {
179
+ this.dlg.pickRole = false;
180
+ this.getGroupList();
181
+ this.getGroupDetail();
182
+ this.msg("success", "已加入 " + this.selRoleIds.length + " 个角色" + (data.appliedCreated ? ",已自动补授给本组已授权用户(新建绑定 " + data.appliedCreated + " 条)" : ""));
183
+ }).catch((err) => this.msg("error", err.message || "保存被拦截(角色单组归属校验)"));
184
+ },
185
+ // ---------- 移除角色(按位收回) ----------
186
+ openRemoveRole(r) {
187
+ this.$http.$request({
188
+ action: "getRemoveRoleImpact",
189
+ entityId: "FM_ROLE_GROUP",
190
+ groupId: this.curGroupId,
191
+ roleId: r.ID
192
+ }).then((data) => {
193
+ this.rmRole = { id: r.ID, label: r.NAME + "(" + r.SYSTEM_NAME + ")", total: data.total || 0, withManual: data.withManual || 0 };
194
+ this.dlg.removeRole = true;
195
+ }).catch((err) => this.msg("error", err.message || "获取影响统计失败"));
196
+ },
197
+ doRemoveRole() {
198
+ this.$http.$request({
199
+ action: "removeRoleFromGroup",
200
+ entityId: "FM_ROLE_GROUP",
201
+ groupId: this.curGroupId,
202
+ roleId: this.rmRole.id
203
+ }).then((data) => {
204
+ this.dlg.removeRole = false;
205
+ this.getGroupList();
206
+ this.getGroupDetail();
207
+ this.msg("success", "「" + this.rmRole.label + "」已移出并收回组来源:整条删除 " + (data.removed || 0) + " 条;另有手工授予的 " + (data.kept || 0) + " 条仅清组位、绑定保留", 6e3);
208
+ }).catch((err) => this.msg("error", err.message || "移除失败"));
209
+ },
210
+ // ---------- 重新应用(差量补绑) ----------
211
+ applyGroup() {
212
+ this.$http.$request({ action: "applyGroup", entityId: "FM_ROLE_GROUP", groupId: this.curGroupId }).then((data) => {
213
+ this.getGroupDetail();
214
+ this.msg("success", "已按发起时刻的组内角色与用户快照补绑:新建 " + (data.created || 0) + " 条,判重跳过 " + (data.skipped || 0) + " 条");
215
+ }).catch((err) => this.msg("error", err.message || "重新应用失败"));
216
+ },
217
+ // ---------- 删除组(按位收回) ----------
218
+ openDelGroup(g) {
219
+ this.$http.$request({ action: "getDeleteGroupImpact", entityId: "FM_ROLE_GROUP", groupId: g.ID }).then((data) => {
220
+ this.delGroupData = {
221
+ ID: g.ID,
222
+ NAME: g.NAME,
223
+ onlyGroup: data.onlyGroup || 0,
224
+ both: data.both || 0,
225
+ userCount: data.userCount || 0
226
+ };
227
+ this.dlg.delGroup = true;
228
+ }).catch((err) => this.msg("error", err.message || "获取影响统计失败"));
229
+ },
230
+ doDelGroup() {
231
+ this.$http.$request({ action: "deleteGroup", entityId: "FM_ROLE_GROUP", groupId: this.delGroupData.ID }).then((data) => {
232
+ this.dlg.delGroup = false;
233
+ this.msg("success", "角色组「" + this.delGroupData.NAME + "」已删除:收回绑定 " + (data.removed || 0) + " 条,另有手工授予的 " + (data.kept || 0) + " 条仅清组位、记录保留", 6e3);
234
+ this.curGroupId = "";
235
+ this.curGroup = null;
236
+ this.getGroupList(() => {
237
+ if (this.groupList.length) this.selectGroup(this.groupList[0].ID);
238
+ });
239
+ }).catch((err) => this.msg("error", err.message || "删除失败"));
240
+ },
241
+ // ---------- 添加用户(物化展开) ----------
242
+ openAddUser() {
243
+ this.selUserIds = [];
244
+ this.addUserKeyword = "";
245
+ this.addUserPage = 1;
246
+ this.getSelectableUsers();
247
+ this.dlg.addUser = true;
248
+ },
249
+ getSelectableUsers() {
250
+ this.addUserLoading = true;
251
+ this.$http.$request({
252
+ action: "getSelectableUsers",
253
+ entityId: "FM_ROLE_GROUP",
254
+ groupId: this.curGroupId,
255
+ keyword: this.addUserKeyword,
256
+ page: this.addUserPage,
257
+ limit: this.addUserLimit
258
+ }).then((data) => {
259
+ this.selectableUsers = data.users || [];
260
+ this.addUserTotal = data.total || 0;
261
+ }).catch((err) => this.msg("error", err.message || "获取用户失败")).finally(() => {
262
+ this.addUserLoading = false;
263
+ });
264
+ },
265
+ filterAddUser() {
266
+ clearTimeout(this.addUserTimer);
267
+ this.addUserTimer = setTimeout(() => {
268
+ this.addUserPage = 1;
269
+ this.getSelectableUsers();
270
+ }, 300);
271
+ },
272
+ handleAddUserPage(page) {
273
+ this.addUserPage = page;
274
+ this.getSelectableUsers();
275
+ },
276
+ doAddUsers() {
277
+ if (!this.selUserIds.length) {
278
+ this.msg("warn", "请先勾选要添加的用户");
279
+ return;
280
+ }
281
+ this.$http.$request({
282
+ action: "addUsersToGroup",
283
+ entityId: "FM_ROLE_GROUP",
284
+ groupId: this.curGroupId,
285
+ userIds: this.selUserIds.join(",")
286
+ }).then((data) => {
287
+ this.dlg.addUser = false;
288
+ this.getGroupList();
289
+ this.getGroupDetail();
290
+ const both = data.both ? "其中 " + data.both + " 个角色另有手工授予,已并列保留(两来源并存)" : "";
291
+ this.msg("success", "已添加 " + this.selUserIds.length + " 个用户并展开组内角色:新建 " + (data.created || 0) + " 条,组位置为本组 " + (data.moved || 0) + " 条,判重跳过 " + (data.skipped || 0) + " 条。" + both, 6e3);
292
+ }).catch((err) => this.msg("error", err.message || "添加失败"));
293
+ },
294
+ // ---------- 移除用户(按位收回) ----------
295
+ openRemoveUser(u) {
296
+ this.$http.$request({
297
+ action: "getRemoveUserImpact",
298
+ entityId: "FM_ROLE_GROUP",
299
+ groupId: this.curGroupId,
300
+ userId: u.ID
301
+ }).then((data) => {
302
+ this.rmUser = { id: u.ID, label: u.NAME + "(" + u.USER_NO + ")", total: data.total || 0, withManual: data.withManual || 0 };
303
+ this.dlg.removeUser = true;
304
+ }).catch((err) => this.msg("error", err.message || "获取影响统计失败"));
305
+ },
306
+ doRemoveUser() {
307
+ this.$http.$request({
308
+ action: "removeUserFromGroup",
309
+ entityId: "FM_ROLE_GROUP",
310
+ groupId: this.curGroupId,
311
+ userId: this.rmUser.id
312
+ }).then((data) => {
313
+ this.dlg.removeUser = false;
314
+ this.getGroupList();
315
+ this.getGroupDetail();
316
+ this.msg("success", "已移除该用户:整条删除 " + (data.removed || 0) + " 条;另有手工授予的 " + (data.kept || 0) + " 条仅清组位、绑定保留", 6e3);
317
+ }).catch((err) => this.msg("error", err.message || "移除失败"));
318
+ }
319
+ }
320
+ };
321
+ const _hoisted_1 = { class: "rgm-page" };
322
+ const _hoisted_2 = { class: "split" };
323
+ const _hoisted_3 = { class: "split__left" };
324
+ const _hoisted_4 = { class: "v9-card" };
325
+ const _hoisted_5 = { class: "group-list" };
326
+ const _hoisted_6 = ["onClick"];
327
+ const _hoisted_7 = { class: "grp-item__body" };
328
+ const _hoisted_8 = { class: "grp-item__name" };
329
+ const _hoisted_9 = { class: "grp-item__meta" };
330
+ const _hoisted_10 = { class: "grp-item__ops" };
331
+ const _hoisted_11 = ["onClick"];
332
+ const _hoisted_12 = ["onClick"];
333
+ const _hoisted_13 = { class: "split__right" };
334
+ const _hoisted_14 = {
335
+ key: 0,
336
+ class: "v9-card"
337
+ };
338
+ const _hoisted_15 = {
339
+ key: 0,
340
+ class: "tipbar tipbar--info"
341
+ };
342
+ const _hoisted_16 = { class: "tipbar__main" };
343
+ const _hoisted_17 = { class: "v9-card" };
344
+ const _hoisted_18 = { class: "v9-desc-table" };
345
+ const _hoisted_19 = { colspan: "5" };
346
+ const _hoisted_20 = { class: "grp-edit-row" };
347
+ const _hoisted_21 = { class: "v9-figure-grid v9-figure-grid--3" };
348
+ const _hoisted_22 = { class: "v9-figure" };
349
+ const _hoisted_23 = { class: "v9-figure__value" };
350
+ const _hoisted_24 = { class: "v9-figure" };
351
+ const _hoisted_25 = { class: "v9-figure__value" };
352
+ const _hoisted_26 = { class: "v9-figure" };
353
+ const _hoisted_27 = { class: "v9-figure__value" };
354
+ const _hoisted_28 = { class: "v9-card" };
355
+ const _hoisted_29 = { class: "v9-tabs" };
356
+ const _hoisted_30 = { class: "grp-tab-body" };
357
+ const _hoisted_31 = { class: "grp-tab-toolbar" };
358
+ const _hoisted_32 = {
359
+ key: 0,
360
+ class: "v9-empty"
361
+ };
362
+ const _hoisted_33 = {
363
+ key: 1,
364
+ class: "v9-table"
365
+ };
366
+ const _hoisted_34 = { class: "v9-tag v9-tag--info" };
367
+ const _hoisted_35 = ["onClick"];
368
+ const _hoisted_36 = { class: "grp-tab-body" };
369
+ const _hoisted_37 = { class: "grp-tab-toolbar" };
370
+ const _hoisted_38 = {
371
+ key: 0,
372
+ class: "v9-empty"
373
+ };
374
+ const _hoisted_39 = { class: "v9-table" };
375
+ const _hoisted_40 = ["onClick"];
376
+ const _hoisted_41 = { class: "v9-dialog" };
377
+ const _hoisted_42 = { class: "v9-dialog__header" };
378
+ const _hoisted_43 = { class: "v9-dialog__body" };
379
+ const _hoisted_44 = { class: "v9-form-item" };
380
+ const _hoisted_45 = {
381
+ key: 0,
382
+ class: "v9-form-item__error"
383
+ };
384
+ const _hoisted_46 = { class: "v9-form-item" };
385
+ const _hoisted_47 = {
386
+ key: 0,
387
+ class: "v9-form-item__error"
388
+ };
389
+ const _hoisted_48 = { class: "v9-form-item" };
390
+ const _hoisted_49 = { class: "v9-form-item" };
391
+ const _hoisted_50 = { class: "v9-dialog__footer" };
392
+ const _hoisted_51 = { class: "v9-dialog v9-dialog--lg" };
393
+ const _hoisted_52 = { class: "v9-dialog__header" };
394
+ const _hoisted_53 = { class: "v9-dialog__body" };
395
+ const _hoisted_54 = { class: "pick-scroll" };
396
+ const _hoisted_55 = { class: "pick-group__title" };
397
+ const _hoisted_56 = ["value", "disabled"];
398
+ const _hoisted_57 = { class: "pick-item__name" };
399
+ const _hoisted_58 = { class: "v9-tag v9-tag--info" };
400
+ const _hoisted_59 = {
401
+ key: 0,
402
+ class: "v9-tag v9-tag--success"
403
+ };
404
+ const _hoisted_60 = {
405
+ key: 1,
406
+ class: "v9-tag v9-tag--warning"
407
+ };
408
+ const _hoisted_61 = { class: "v9-dialog__footer" };
409
+ const _hoisted_62 = { class: "v9-form-item__tip pick-count" };
410
+ const _hoisted_63 = { class: "v9-dialog" };
411
+ const _hoisted_64 = { class: "v9-dialog__header" };
412
+ const _hoisted_65 = { class: "v9-dialog__body" };
413
+ const _hoisted_66 = { class: "tipbar tipbar--warn" };
414
+ const _hoisted_67 = { class: "tipbar__main" };
415
+ const _hoisted_68 = { class: "v9-dialog__footer" };
416
+ const _hoisted_69 = { class: "v9-dialog" };
417
+ const _hoisted_70 = { class: "v9-dialog__header" };
418
+ const _hoisted_71 = { class: "v9-dialog__body" };
419
+ const _hoisted_72 = { class: "v9-desc-table del-impact" };
420
+ const _hoisted_73 = { class: "v9-dialog__footer" };
421
+ const _hoisted_74 = { class: "v9-dialog v9-dialog--md" };
422
+ const _hoisted_75 = { class: "v9-dialog__header" };
423
+ const _hoisted_76 = { class: "v9-dialog__body" };
424
+ const _hoisted_77 = { class: "v9-input-wrap au-search" };
425
+ const _hoisted_78 = { class: "pick-scroll au-scroll" };
426
+ const _hoisted_79 = ["value", "disabled"];
427
+ const _hoisted_80 = { class: "pick-item__name" };
428
+ const _hoisted_81 = { class: "v9-tag v9-tag--info" };
429
+ const _hoisted_82 = { class: "v9-form-item__tip grp-inline-tip" };
430
+ const _hoisted_83 = {
431
+ key: 0,
432
+ class: "v9-tag v9-tag--success"
433
+ };
434
+ const _hoisted_84 = {
435
+ key: 1,
436
+ class: "v9-empty"
437
+ };
438
+ const _hoisted_85 = { class: "v9-dialog__footer" };
439
+ const _hoisted_86 = { class: "v9-form-item__tip pick-count" };
440
+ const _hoisted_87 = { class: "v9-dialog" };
441
+ const _hoisted_88 = { class: "v9-dialog__header" };
442
+ const _hoisted_89 = { class: "v9-dialog__body" };
443
+ const _hoisted_90 = { class: "v9-desc-table ru-impact" };
444
+ const _hoisted_91 = { class: "v9-dialog__footer" };
445
+ const _hoisted_92 = { class: "toast-box" };
446
+ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
447
+ const _component_el_pagination = resolveComponent("el-pagination");
448
+ const _directive_loading = resolveDirective("loading");
449
+ return openBlock(), createElementBlock("div", _hoisted_1, [
450
+ createElementVNode("div", _hoisted_2, [
451
+ createElementVNode("div", _hoisted_3, [
452
+ createElementVNode("div", _hoisted_4, [
453
+ _cache[41] || (_cache[41] = createElementVNode("div", { class: "v9-block-title" }, "角色组", -1)),
454
+ createElementVNode("div", _hoisted_5, [
455
+ (openBlock(true), createElementBlock(Fragment, null, renderList($data.groupList, (g) => {
456
+ return openBlock(), createElementBlock("div", {
457
+ key: g.ID,
458
+ class: normalizeClass(["grp-item", { "is-active": g.ID === $data.curGroupId }]),
459
+ onClick: ($event) => $options.selectGroup(g.ID)
460
+ }, [
461
+ createElementVNode("div", _hoisted_7, [
462
+ createElementVNode("div", _hoisted_8, toDisplayString(g.NAME), 1),
463
+ createElementVNode("div", _hoisted_9, toDisplayString(g.CODE) + " · " + toDisplayString(g.roleCount) + " 个角色 · 已授 " + toDisplayString(g.userCount) + " 人", 1)
464
+ ]),
465
+ createElementVNode("div", _hoisted_10, [
466
+ createElementVNode("button", {
467
+ class: "v9-btn v9-btn--text",
468
+ onClick: withModifiers(($event) => $options.openGroupForm(g), ["stop"])
469
+ }, "编辑", 8, _hoisted_11),
470
+ createElementVNode("button", {
471
+ class: "v9-btn v9-btn--text is-danger",
472
+ onClick: withModifiers(($event) => $options.openDelGroup(g), ["stop"])
473
+ }, "删除", 8, _hoisted_12)
474
+ ])
475
+ ], 10, _hoisted_6);
476
+ }), 128))
477
+ ]),
478
+ createElementVNode("button", {
479
+ class: "v9-btn v9-btn--default grp-add-btn",
480
+ onClick: _cache[0] || (_cache[0] = ($event) => $options.openGroupForm(null))
481
+ }, [..._cache[40] || (_cache[40] = [
482
+ createElementVNode("i", { class: "el-icon-plus" }, null, -1),
483
+ createTextVNode(" 新建角色组 ", -1)
484
+ ])])
485
+ ]),
486
+ _cache[42] || (_cache[42] = createElementVNode("div", { class: "v9-form-item__tip grp-left-tip" }, "角色组为租户级定义,不属于任何业务系统;一个角色同一时间只能属于一个角色组。", -1))
487
+ ]),
488
+ createElementVNode("div", _hoisted_13, [
489
+ !$data.curGroup ? (openBlock(), createElementBlock("div", _hoisted_14, [..._cache[43] || (_cache[43] = [
490
+ createElementVNode("div", { class: "v9-empty" }, [
491
+ createElementVNode("i", { class: "el-icon-box v9-empty__icon" }),
492
+ createElementVNode("div", null, "请先新建角色组")
493
+ ], -1)
494
+ ])])) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [
495
+ $data.pendingApply && $data.pendingApply.length && $data.curGroup.userCount > 0 ? (openBlock(), createElementBlock("div", _hoisted_15, [
496
+ _cache[44] || (_cache[44] = createElementVNode("i", { class: "el-icon-info" }, null, -1)),
497
+ createElementVNode("div", _hoisted_16, "检测到 " + toDisplayString($data.pendingApply.length) + " 个角色的历史差量:已通过本组授权的 " + toDisplayString($data.curGroup.userCount) + " 个用户尚未获得这些角色,可手动补授。", 1),
498
+ createElementVNode("button", {
499
+ class: "v9-btn v9-btn--primary",
500
+ onClick: _cache[1] || (_cache[1] = (...args) => $options.applyGroup && $options.applyGroup(...args))
501
+ }, "应用到 " + toDisplayString($data.curGroup.userCount) + " 个用户", 1)
502
+ ])) : createCommentVNode("", true),
503
+ createElementVNode("div", _hoisted_17, [
504
+ _cache[50] || (_cache[50] = createElementVNode("div", { class: "v9-block-title" }, "组信息", -1)),
505
+ createElementVNode("table", _hoisted_18, [
506
+ createElementVNode("tbody", null, [
507
+ createElementVNode("tr", null, [
508
+ _cache[45] || (_cache[45] = createElementVNode("th", null, "组名称", -1)),
509
+ createElementVNode("td", null, toDisplayString($data.curGroup.NAME), 1),
510
+ _cache[46] || (_cache[46] = createElementVNode("th", null, "组编码", -1)),
511
+ createElementVNode("td", null, toDisplayString($data.curGroup.CODE), 1),
512
+ _cache[47] || (_cache[47] = createElementVNode("th", null, "排序号", -1)),
513
+ createElementVNode("td", null, toDisplayString($data.curGroup.ORDER_NUM), 1)
514
+ ]),
515
+ createElementVNode("tr", null, [
516
+ _cache[48] || (_cache[48] = createElementVNode("th", null, "描述", -1)),
517
+ createElementVNode("td", _hoisted_19, toDisplayString($data.curGroup.DESC || "—"), 1)
518
+ ])
519
+ ])
520
+ ]),
521
+ createElementVNode("div", _hoisted_20, [
522
+ createElementVNode("button", {
523
+ class: "v9-btn v9-btn--default",
524
+ onClick: _cache[2] || (_cache[2] = ($event) => $options.openGroupForm($data.curGroup))
525
+ }, [..._cache[49] || (_cache[49] = [
526
+ createElementVNode("i", { class: "el-icon-edit" }, null, -1),
527
+ createTextVNode(" 编辑", -1)
528
+ ])])
529
+ ])
530
+ ]),
531
+ createElementVNode("div", _hoisted_21, [
532
+ createElementVNode("div", _hoisted_22, [
533
+ _cache[51] || (_cache[51] = createElementVNode("div", { class: "v9-figure__label" }, "组内角色", -1)),
534
+ createElementVNode("div", _hoisted_23, toDisplayString($data.curGroup.roleCount), 1)
535
+ ]),
536
+ createElementVNode("div", _hoisted_24, [
537
+ _cache[52] || (_cache[52] = createElementVNode("div", { class: "v9-figure__label" }, "已授权用户", -1)),
538
+ createElementVNode("div", _hoisted_25, toDisplayString($data.curGroup.userCount), 1)
539
+ ]),
540
+ createElementVNode("div", _hoisted_26, [
541
+ _cache[53] || (_cache[53] = createElementVNode("div", { class: "v9-figure__label" }, "覆盖系统", -1)),
542
+ createElementVNode("div", _hoisted_27, toDisplayString($data.detail.sysCount), 1)
543
+ ])
544
+ ]),
545
+ createElementVNode("div", _hoisted_28, [
546
+ createElementVNode("div", _hoisted_29, [
547
+ createElementVNode("div", {
548
+ class: normalizeClass(["v9-tabs__item", { "is-active": $data.activeTab === "roles" }]),
549
+ onClick: _cache[3] || (_cache[3] = ($event) => $options.switchGroupTab("roles"))
550
+ }, "组内角色(" + toDisplayString($data.curGroup.roleCount) + ")", 3),
551
+ createElementVNode("div", {
552
+ class: normalizeClass(["v9-tabs__item", { "is-active": $data.activeTab === "users" }]),
553
+ onClick: _cache[4] || (_cache[4] = ($event) => $options.switchGroupTab("users"))
554
+ }, "已授权用户(" + toDisplayString($data.curGroup.userCount) + ")", 3)
555
+ ]),
556
+ withDirectives(createElementVNode("div", _hoisted_30, [
557
+ createElementVNode("div", _hoisted_31, [
558
+ createElementVNode("button", {
559
+ class: "v9-btn v9-btn--primary",
560
+ onClick: _cache[5] || (_cache[5] = (...args) => $options.openPickRole && $options.openPickRole(...args))
561
+ }, [..._cache[54] || (_cache[54] = [
562
+ createElementVNode("i", { class: "el-icon-plus" }, null, -1),
563
+ createTextVNode(" 添加角色", -1)
564
+ ])]),
565
+ _cache[55] || (_cache[55] = createElementVNode("span", { class: "v9-form-item__tip grp-inline-tip" }, "组不需要覆盖全部系统,内容按需;组内新增角色自动补授已授权用户,移除角色自动按位收回", -1))
566
+ ]),
567
+ !$data.groupRoles.length ? (openBlock(), createElementBlock("div", _hoisted_32, [..._cache[56] || (_cache[56] = [
568
+ createElementVNode("i", { class: "el-icon-box v9-empty__icon" }, null, -1),
569
+ createElementVNode("div", null, "组内暂无角色,点击「添加角色」开始", -1)
570
+ ])])) : (openBlock(), createElementBlock("table", _hoisted_33, [
571
+ _cache[57] || (_cache[57] = createElementVNode("thead", null, [
572
+ createElementVNode("tr", null, [
573
+ createElementVNode("th", { style: { "width": "60px" } }, "序号"),
574
+ createElementVNode("th", null, "角色名称"),
575
+ createElementVNode("th", null, "所属系统"),
576
+ createElementVNode("th", null, "角色编码"),
577
+ createElementVNode("th", { style: { "width": "100px" } }, "操作")
578
+ ])
579
+ ], -1)),
580
+ createElementVNode("tbody", null, [
581
+ (openBlock(true), createElementBlock(Fragment, null, renderList($data.groupRoles, (r, i) => {
582
+ return openBlock(), createElementBlock("tr", {
583
+ key: r.ID
584
+ }, [
585
+ createElementVNode("td", null, toDisplayString(i + 1), 1),
586
+ createElementVNode("td", null, toDisplayString(r.NAME), 1),
587
+ createElementVNode("td", null, [
588
+ createElementVNode("i", {
589
+ class: normalizeClass([r.systemIcon, "grp-sys-icon"])
590
+ }, null, 2),
591
+ createTextVNode(toDisplayString(r.SYSTEM_NAME), 1)
592
+ ]),
593
+ createElementVNode("td", null, [
594
+ createElementVNode("span", _hoisted_34, toDisplayString(r.CODE), 1)
595
+ ]),
596
+ createElementVNode("td", null, [
597
+ createElementVNode("button", {
598
+ class: "v9-btn v9-btn--text is-danger",
599
+ onClick: ($event) => $options.openRemoveRole(r)
600
+ }, "移除", 8, _hoisted_35)
601
+ ])
602
+ ]);
603
+ }), 128))
604
+ ])
605
+ ]))
606
+ ], 512), [
607
+ [vShow, $data.activeTab === "roles"]
608
+ ]),
609
+ withDirectives(createElementVNode("div", _hoisted_36, [
610
+ createElementVNode("div", _hoisted_37, [
611
+ createElementVNode("button", {
612
+ class: "v9-btn v9-btn--primary",
613
+ onClick: _cache[6] || (_cache[6] = (...args) => $options.openAddUser && $options.openAddUser(...args))
614
+ }, [..._cache[58] || (_cache[58] = [
615
+ createElementVNode("i", { class: "el-icon-plus" }, null, -1),
616
+ createTextVNode(" 添加用户", -1)
617
+ ])]),
618
+ _cache[59] || (_cache[59] = createElementVNode("span", { class: "v9-form-item__tip grp-inline-tip" }, "添加后用户立即获得组内全部角色;后续组内新增角色也会自动补授这些用户", -1))
619
+ ]),
620
+ !$data.groupUsers.length ? (openBlock(), createElementBlock("div", _hoisted_38, [..._cache[60] || (_cache[60] = [
621
+ createElementVNode("i", { class: "el-icon-box v9-empty__icon" }, null, -1),
622
+ createElementVNode("div", null, "暂无通过本组授权的用户,点击「添加用户」开始", -1)
623
+ ])])) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [
624
+ createElementVNode("table", _hoisted_39, [
625
+ _cache[61] || (_cache[61] = createElementVNode("thead", null, [
626
+ createElementVNode("tr", null, [
627
+ createElementVNode("th", { style: { "width": "60px" } }, "序号"),
628
+ createElementVNode("th", null, "姓名"),
629
+ createElementVNode("th", null, "工作证号"),
630
+ createElementVNode("th", null, "部门"),
631
+ createElementVNode("th", null, "持有本组角色数"),
632
+ createElementVNode("th", { style: { "width": "160px" } }, "操作")
633
+ ])
634
+ ], -1)),
635
+ createElementVNode("tbody", null, [
636
+ (openBlock(true), createElementBlock(Fragment, null, renderList($data.groupUsers, (u, i) => {
637
+ return openBlock(), createElementBlock("tr", {
638
+ key: u.ID
639
+ }, [
640
+ createElementVNode("td", null, toDisplayString(i + 1), 1),
641
+ createElementVNode("td", null, toDisplayString(u.NAME), 1),
642
+ createElementVNode("td", null, toDisplayString(u.USER_NO), 1),
643
+ createElementVNode("td", null, toDisplayString(u.DEPT_NAME), 1),
644
+ createElementVNode("td", null, toDisplayString(u.roleCount), 1),
645
+ createElementVNode("td", null, [
646
+ createElementVNode("button", {
647
+ class: "v9-btn v9-btn--text is-danger",
648
+ onClick: ($event) => $options.openRemoveUser(u)
649
+ }, "移除", 8, _hoisted_40)
650
+ ])
651
+ ]);
652
+ }), 128))
653
+ ])
654
+ ]),
655
+ _cache[62] || (_cache[62] = createElementVNode("div", { class: "v9-form-item__tip grp-table-foot-tip" }, "按组来源(SOURCE_GROUP)反查,用于影响面评估与审计。", -1))
656
+ ], 64))
657
+ ], 512), [
658
+ [vShow, $data.activeTab === "users"]
659
+ ])
660
+ ])
661
+ ], 64))
662
+ ])
663
+ ]),
664
+ $data.dlg.groupForm ? (openBlock(), createElementBlock("div", {
665
+ key: 0,
666
+ class: "v9-overlay",
667
+ onClick: _cache[14] || (_cache[14] = withModifiers(($event) => $data.dlg.groupForm = false, ["self"]))
668
+ }, [
669
+ createElementVNode("div", _hoisted_41, [
670
+ createElementVNode("div", _hoisted_42, [
671
+ createElementVNode("span", null, toDisplayString($data.formGroup.ID ? "编辑角色组" : "新建角色组"), 1),
672
+ createElementVNode("span", {
673
+ class: "v9-dialog__close",
674
+ onClick: _cache[7] || (_cache[7] = ($event) => $data.dlg.groupForm = false)
675
+ }, [..._cache[63] || (_cache[63] = [
676
+ createElementVNode("i", { class: "el-icon-close" }, null, -1)
677
+ ])])
678
+ ]),
679
+ createElementVNode("div", _hoisted_43, [
680
+ createElementVNode("div", _hoisted_44, [
681
+ _cache[64] || (_cache[64] = createElementVNode("label", { class: "v9-form-item__label is-required" }, "组名称", -1)),
682
+ withDirectives(createElementVNode("input", {
683
+ "onUpdate:modelValue": _cache[8] || (_cache[8] = ($event) => $data.formGroup.NAME = $event),
684
+ class: normalizeClass(["v9-input", { "is-error": $data.formErr.name }]),
685
+ placeholder: "租户内唯一,如:教师"
686
+ }, null, 2), [
687
+ [vModelText, $data.formGroup.NAME]
688
+ ]),
689
+ $data.formErr.name ? (openBlock(), createElementBlock("div", _hoisted_45, "组名称必填且不能与现有组重复")) : createCommentVNode("", true)
690
+ ]),
691
+ createElementVNode("div", _hoisted_46, [
692
+ _cache[65] || (_cache[65] = createElementVNode("label", { class: "v9-form-item__label is-required" }, "组编码", -1)),
693
+ withDirectives(createElementVNode("input", {
694
+ "onUpdate:modelValue": _cache[9] || (_cache[9] = ($event) => $data.formGroup.CODE = $event),
695
+ class: normalizeClass(["v9-input", { "is-error": $data.formErr.code }]),
696
+ placeholder: "大小写字母 / 下划线,如:TEACHER"
697
+ }, null, 2), [
698
+ [vModelText, $data.formGroup.CODE]
699
+ ]),
700
+ $data.formErr.code ? (openBlock(), createElementBlock("div", _hoisted_47, "编码必填,仅限大小写字母、数字与下划线,且不能重复")) : createCommentVNode("", true)
701
+ ]),
702
+ createElementVNode("div", _hoisted_48, [
703
+ _cache[66] || (_cache[66] = createElementVNode("label", { class: "v9-form-item__label" }, "描述", -1)),
704
+ withDirectives(createElementVNode("input", {
705
+ "onUpdate:modelValue": _cache[10] || (_cache[10] = ($event) => $data.formGroup.DESC = $event),
706
+ class: "v9-input",
707
+ placeholder: "组的业务含义,授权人可见"
708
+ }, null, 512), [
709
+ [vModelText, $data.formGroup.DESC]
710
+ ])
711
+ ]),
712
+ createElementVNode("div", _hoisted_49, [
713
+ _cache[67] || (_cache[67] = createElementVNode("label", { class: "v9-form-item__label" }, "排序号", -1)),
714
+ withDirectives(createElementVNode("input", {
715
+ "onUpdate:modelValue": _cache[11] || (_cache[11] = ($event) => $data.formGroup.ORDER_NUM = $event),
716
+ class: "v9-input"
717
+ }, null, 512), [
718
+ [vModelText, $data.formGroup.ORDER_NUM]
719
+ ])
720
+ ])
721
+ ]),
722
+ createElementVNode("div", _hoisted_50, [
723
+ createElementVNode("button", {
724
+ class: "v9-btn v9-btn--default",
725
+ onClick: _cache[12] || (_cache[12] = ($event) => $data.dlg.groupForm = false)
726
+ }, "取消"),
727
+ createElementVNode("button", {
728
+ class: "v9-btn v9-btn--primary",
729
+ onClick: _cache[13] || (_cache[13] = (...args) => $options.saveGroupForm && $options.saveGroupForm(...args))
730
+ }, "保存")
731
+ ])
732
+ ])
733
+ ])) : createCommentVNode("", true),
734
+ $data.dlg.pickRole ? (openBlock(), createElementBlock("div", {
735
+ key: 1,
736
+ class: "v9-overlay",
737
+ onClick: _cache[19] || (_cache[19] = withModifiers(($event) => $data.dlg.pickRole = false, ["self"]))
738
+ }, [
739
+ createElementVNode("div", _hoisted_51, [
740
+ createElementVNode("div", _hoisted_52, [
741
+ createElementVNode("span", null, "向「" + toDisplayString($data.curGroup && $data.curGroup.NAME) + "」添加角色", 1),
742
+ createElementVNode("span", {
743
+ class: "v9-dialog__close",
744
+ onClick: _cache[15] || (_cache[15] = ($event) => $data.dlg.pickRole = false)
745
+ }, [..._cache[68] || (_cache[68] = [
746
+ createElementVNode("i", { class: "el-icon-close" }, null, -1)
747
+ ])])
748
+ ]),
749
+ createElementVNode("div", _hoisted_53, [
750
+ _cache[69] || (_cache[69] = createElementVNode("div", { class: "v9-form-item__tip pick-tip" }, "按系统分组展示本租户全部可选角色(含租户公共角色),可跨系统勾选;已属于其他组的角色置灰,保存时后端同样会校验拦截(角色单组归属)。", -1)),
751
+ createElementVNode("div", _hoisted_54, [
752
+ (openBlock(true), createElementBlock(Fragment, null, renderList($data.selectableRoles, (sys) => {
753
+ return openBlock(), createElementBlock("div", {
754
+ key: sys.SYSTEM,
755
+ class: "pick-group"
756
+ }, [
757
+ createElementVNode("div", _hoisted_55, [
758
+ createElementVNode("i", {
759
+ class: normalizeClass(sys.icon)
760
+ }, null, 2),
761
+ createTextVNode(toDisplayString(sys.SYSTEM_NAME), 1)
762
+ ]),
763
+ (openBlock(true), createElementBlock(Fragment, null, renderList(sys.roles, (r) => {
764
+ return openBlock(), createElementBlock("label", {
765
+ key: r.ID,
766
+ class: normalizeClass(["pick-item", { "is-disabled": r.disabled }])
767
+ }, [
768
+ withDirectives(createElementVNode("input", {
769
+ "onUpdate:modelValue": _cache[16] || (_cache[16] = ($event) => $data.selRoleIds = $event),
770
+ type: "checkbox",
771
+ value: r.ID,
772
+ disabled: r.disabled
773
+ }, null, 8, _hoisted_56), [
774
+ [vModelCheckbox, $data.selRoleIds]
775
+ ]),
776
+ createElementVNode("span", _hoisted_57, toDisplayString(r.NAME), 1),
777
+ createElementVNode("span", _hoisted_58, toDisplayString(r.CODE), 1),
778
+ r.inGroup ? (openBlock(), createElementBlock("span", _hoisted_59, "已在组内")) : r.ownerGroupName ? (openBlock(), createElementBlock("span", _hoisted_60, "已属组 " + toDisplayString(r.ownerGroupName), 1)) : createCommentVNode("", true)
779
+ ], 2);
780
+ }), 128))
781
+ ]);
782
+ }), 128))
783
+ ])
784
+ ]),
785
+ createElementVNode("div", _hoisted_61, [
786
+ createElementVNode("span", _hoisted_62, toDisplayString($options.pickCountText), 1),
787
+ createElementVNode("button", {
788
+ class: "v9-btn v9-btn--default",
789
+ onClick: _cache[17] || (_cache[17] = ($event) => $data.dlg.pickRole = false)
790
+ }, "取消"),
791
+ createElementVNode("button", {
792
+ class: "v9-btn v9-btn--primary",
793
+ onClick: _cache[18] || (_cache[18] = (...args) => $options.savePickRole && $options.savePickRole(...args))
794
+ }, "加入组内")
795
+ ])
796
+ ])
797
+ ])) : createCommentVNode("", true),
798
+ $data.dlg.removeRole ? (openBlock(), createElementBlock("div", {
799
+ key: 2,
800
+ class: "v9-overlay",
801
+ onClick: _cache[23] || (_cache[23] = withModifiers(($event) => $data.dlg.removeRole = false, ["self"]))
802
+ }, [
803
+ createElementVNode("div", _hoisted_63, [
804
+ createElementVNode("div", _hoisted_64, [
805
+ createElementVNode("span", null, "移出并收回:「" + toDisplayString($data.rmRole.label) + "」", 1),
806
+ createElementVNode("span", {
807
+ class: "v9-dialog__close",
808
+ onClick: _cache[20] || (_cache[20] = ($event) => $data.dlg.removeRole = false)
809
+ }, [..._cache[70] || (_cache[70] = [
810
+ createElementVNode("i", { class: "el-icon-close" }, null, -1)
811
+ ])])
812
+ ]),
813
+ createElementVNode("div", _hoisted_65, [
814
+ createElementVNode("div", _hoisted_66, [
815
+ _cache[72] || (_cache[72] = createElementVNode("i", { class: "el-icon-warning-outline" }, null, -1)),
816
+ createElementVNode("div", _hoisted_67, [
817
+ _cache[71] || (_cache[71] = createTextVNode("该角色已通过本组授予 ", -1)),
818
+ createElementVNode("b", null, toDisplayString($data.rmRole.total), 1),
819
+ createTextVNode(" 个用户(" + toDisplayString($data.rmRole.total - $data.rmRole.withManual) + " 条仅组来源、" + toDisplayString($data.rmRole.withManual) + " 条另有手工授予)", 1)
820
+ ])
821
+ ]),
822
+ _cache[73] || (_cache[73] = createElementVNode("div", { class: "v9-form-item__tip" }, "移出后按位收回该角色的组来源:同时有手工授予的绑定仅清除组来源、记录保留;仅组来源的绑定整条删除、权限收回。", -1))
823
+ ]),
824
+ createElementVNode("div", _hoisted_68, [
825
+ createElementVNode("button", {
826
+ class: "v9-btn v9-btn--default",
827
+ onClick: _cache[21] || (_cache[21] = ($event) => $data.dlg.removeRole = false)
828
+ }, "取消"),
829
+ createElementVNode("button", {
830
+ class: "v9-btn v9-btn--primary",
831
+ onClick: _cache[22] || (_cache[22] = (...args) => $options.doRemoveRole && $options.doRemoveRole(...args))
832
+ }, "移出并收回")
833
+ ])
834
+ ])
835
+ ])) : createCommentVNode("", true),
836
+ $data.dlg.delGroup ? (openBlock(), createElementBlock("div", {
837
+ key: 3,
838
+ class: "v9-overlay",
839
+ onClick: _cache[27] || (_cache[27] = withModifiers(($event) => $data.dlg.delGroup = false, ["self"]))
840
+ }, [
841
+ createElementVNode("div", _hoisted_69, [
842
+ createElementVNode("div", _hoisted_70, [
843
+ createElementVNode("span", null, "删除角色组「" + toDisplayString($data.delGroupData.NAME) + "」", 1),
844
+ createElementVNode("span", {
845
+ class: "v9-dialog__close",
846
+ onClick: _cache[24] || (_cache[24] = ($event) => $data.dlg.delGroup = false)
847
+ }, [..._cache[74] || (_cache[74] = [
848
+ createElementVNode("i", { class: "el-icon-close" }, null, -1)
849
+ ])])
850
+ ]),
851
+ createElementVNode("div", _hoisted_71, [
852
+ _cache[78] || (_cache[78] = createElementVNode("div", { class: "tipbar tipbar--danger del-tipbar" }, [
853
+ createElementVNode("i", { class: "el-icon-warning-outline" }),
854
+ createElementVNode("div", { class: "tipbar__main" }, "删除组不可恢复。已通过本组授予的授权将按位收回:")
855
+ ], -1)),
856
+ createElementVNode("table", _hoisted_72, [
857
+ createElementVNode("tbody", null, [
858
+ createElementVNode("tr", null, [
859
+ _cache[75] || (_cache[75] = createElementVNode("th", null, "仅组来源绑定", -1)),
860
+ createElementVNode("td", null, toDisplayString($data.delGroupData.onlyGroup) + " 条 → 整条删除(权限收回)", 1)
861
+ ]),
862
+ createElementVNode("tr", null, [
863
+ _cache[76] || (_cache[76] = createElementVNode("th", null, "组 + 手工并存绑定", -1)),
864
+ createElementVNode("td", null, toDisplayString($data.delGroupData.both) + " 条 → 仅清除组来源,手工授权保留", 1)
865
+ ]),
866
+ createElementVNode("tr", null, [
867
+ _cache[77] || (_cache[77] = createElementVNode("th", null, "涉及用户", -1)),
868
+ createElementVNode("td", null, toDisplayString($data.delGroupData.userCount) + " 人", 1)
869
+ ])
870
+ ])
871
+ ]),
872
+ _cache[79] || (_cache[79] = createElementVNode("div", { class: "v9-form-item__tip" }, "同时持有手工授予的绑定仅清除组来源、记录保留,手工授权不受影响;仅组来源的绑定整条删除。", -1))
873
+ ]),
874
+ createElementVNode("div", _hoisted_73, [
875
+ createElementVNode("button", {
876
+ class: "v9-btn v9-btn--default",
877
+ onClick: _cache[25] || (_cache[25] = ($event) => $data.dlg.delGroup = false)
878
+ }, "取消"),
879
+ createElementVNode("button", {
880
+ class: "v9-btn v9-btn--danger",
881
+ onClick: _cache[26] || (_cache[26] = (...args) => $options.doDelGroup && $options.doDelGroup(...args))
882
+ }, [..._cache[80] || (_cache[80] = [
883
+ createElementVNode("i", { class: "el-icon-delete" }, null, -1),
884
+ createTextVNode(" 删除并收回授权", -1)
885
+ ])])
886
+ ])
887
+ ])
888
+ ])) : createCommentVNode("", true),
889
+ $data.dlg.addUser ? (openBlock(), createElementBlock("div", {
890
+ key: 4,
891
+ class: "v9-overlay",
892
+ onClick: _cache[35] || (_cache[35] = withModifiers(($event) => $data.dlg.addUser = false, ["self"]))
893
+ }, [
894
+ createElementVNode("div", _hoisted_74, [
895
+ createElementVNode("div", _hoisted_75, [
896
+ createElementVNode("span", null, "向「" + toDisplayString($data.curGroup && $data.curGroup.NAME) + "」添加用户", 1),
897
+ createElementVNode("span", {
898
+ class: "v9-dialog__close",
899
+ onClick: _cache[28] || (_cache[28] = ($event) => $data.dlg.addUser = false)
900
+ }, [..._cache[81] || (_cache[81] = [
901
+ createElementVNode("i", { class: "el-icon-close" }, null, -1)
902
+ ])])
903
+ ]),
904
+ createElementVNode("div", _hoisted_76, [
905
+ _cache[84] || (_cache[84] = createElementVNode("div", { class: "v9-form-item__tip pick-tip" }, "选中用户将立即获得组内全部角色(物化展开写入用户角色绑定,权限即时生效);已手工授予的角色会并列保留手工来源,不跳过、不覆盖。", -1)),
906
+ createElementVNode("div", _hoisted_77, [
907
+ _cache[82] || (_cache[82] = createElementVNode("span", { class: "v9-input-prefix" }, [
908
+ createElementVNode("i", { class: "el-icon-search" })
909
+ ], -1)),
910
+ withDirectives(createElementVNode("input", {
911
+ "onUpdate:modelValue": _cache[29] || (_cache[29] = ($event) => $data.addUserKeyword = $event),
912
+ class: "v9-input",
913
+ placeholder: "输入姓名、工号过滤",
914
+ onInput: _cache[30] || (_cache[30] = (...args) => $options.filterAddUser && $options.filterAddUser(...args))
915
+ }, null, 544), [
916
+ [vModelText, $data.addUserKeyword]
917
+ ])
918
+ ]),
919
+ withDirectives((openBlock(), createElementBlock("div", _hoisted_78, [
920
+ $data.selectableUsers.length ? (openBlock(true), createElementBlock(Fragment, { key: 0 }, renderList($data.selectableUsers, (u) => {
921
+ return openBlock(), createElementBlock("label", {
922
+ key: u.ID,
923
+ class: normalizeClass(["pick-item", { "is-disabled": u.inGroup }])
924
+ }, [
925
+ withDirectives(createElementVNode("input", {
926
+ "onUpdate:modelValue": _cache[31] || (_cache[31] = ($event) => $data.selUserIds = $event),
927
+ type: "checkbox",
928
+ value: u.ID,
929
+ disabled: u.inGroup
930
+ }, null, 8, _hoisted_79), [
931
+ [vModelCheckbox, $data.selUserIds]
932
+ ]),
933
+ createElementVNode("span", _hoisted_80, toDisplayString(u.NAME), 1),
934
+ createElementVNode("span", _hoisted_81, toDisplayString(u.USER_NO), 1),
935
+ createElementVNode("span", _hoisted_82, toDisplayString(u.DEPT_NAME), 1),
936
+ u.inGroup ? (openBlock(), createElementBlock("span", _hoisted_83, "已在本组")) : createCommentVNode("", true)
937
+ ], 2);
938
+ }), 128)) : (openBlock(), createElementBlock("div", _hoisted_84, [..._cache[83] || (_cache[83] = [
939
+ createElementVNode("i", { class: "el-icon-search v9-empty__icon" }, null, -1),
940
+ createElementVNode("div", null, "没有匹配的用户", -1)
941
+ ])]))
942
+ ])), [
943
+ [_directive_loading, $data.addUserLoading]
944
+ ]),
945
+ $data.addUserTotal > $data.addUserLimit ? (openBlock(), createBlock(_component_el_pagination, {
946
+ key: 0,
947
+ small: "",
948
+ layout: "prev, pager, next",
949
+ "current-page": $data.addUserPage,
950
+ "onUpdate:currentPage": _cache[32] || (_cache[32] = ($event) => $data.addUserPage = $event),
951
+ "page-size": $data.addUserLimit,
952
+ total: $data.addUserTotal,
953
+ onCurrentChange: $options.handleAddUserPage
954
+ }, null, 8, ["current-page", "page-size", "total", "onCurrentChange"])) : createCommentVNode("", true)
955
+ ]),
956
+ createElementVNode("div", _hoisted_85, [
957
+ createElementVNode("span", _hoisted_86, toDisplayString($options.userCountText), 1),
958
+ createElementVNode("button", {
959
+ class: "v9-btn v9-btn--default",
960
+ onClick: _cache[33] || (_cache[33] = ($event) => $data.dlg.addUser = false)
961
+ }, "取消"),
962
+ createElementVNode("button", {
963
+ class: "v9-btn v9-btn--primary",
964
+ onClick: _cache[34] || (_cache[34] = (...args) => $options.doAddUsers && $options.doAddUsers(...args))
965
+ }, [..._cache[85] || (_cache[85] = [
966
+ createElementVNode("i", { class: "el-icon-circle-plus" }, null, -1),
967
+ createTextVNode(" 授予组内全部角色", -1)
968
+ ])])
969
+ ])
970
+ ])
971
+ ])) : createCommentVNode("", true),
972
+ $data.dlg.removeUser ? (openBlock(), createElementBlock("div", {
973
+ key: 5,
974
+ class: "v9-overlay",
975
+ onClick: _cache[39] || (_cache[39] = withModifiers(($event) => $data.dlg.removeUser = false, ["self"]))
976
+ }, [
977
+ createElementVNode("div", _hoisted_87, [
978
+ createElementVNode("div", _hoisted_88, [
979
+ createElementVNode("span", null, "从「" + toDisplayString($data.curGroup && $data.curGroup.NAME) + "」移除「" + toDisplayString($data.rmUser.label) + "」", 1),
980
+ createElementVNode("span", {
981
+ class: "v9-dialog__close",
982
+ onClick: _cache[36] || (_cache[36] = ($event) => $data.dlg.removeUser = false)
983
+ }, [..._cache[86] || (_cache[86] = [
984
+ createElementVNode("i", { class: "el-icon-close" }, null, -1)
985
+ ])])
986
+ ]),
987
+ createElementVNode("div", _hoisted_89, [
988
+ createElementVNode("table", _hoisted_90, [
989
+ createElementVNode("tbody", null, [
990
+ createElementVNode("tr", null, [
991
+ _cache[87] || (_cache[87] = createElementVNode("th", null, "通过本组持有的角色", -1)),
992
+ createElementVNode("td", null, toDisplayString($data.rmUser.total) + " 个", 1)
993
+ ]),
994
+ createElementVNode("tr", null, [
995
+ _cache[88] || (_cache[88] = createElementVNode("th", null, "仅组来源", -1)),
996
+ createElementVNode("td", null, toDisplayString($data.rmUser.total - $data.rmUser.withManual) + " 个 → 整条删除(权限收回)", 1)
997
+ ]),
998
+ createElementVNode("tr", null, [
999
+ _cache[89] || (_cache[89] = createElementVNode("th", null, "另有手工授予", -1)),
1000
+ createElementVNode("td", null, toDisplayString($data.rmUser.withManual) + " 个 → 仅清除组来源,手工权限保留", 1)
1001
+ ])
1002
+ ])
1003
+ ]),
1004
+ _cache[90] || (_cache[90] = createElementVNode("div", { class: "v9-form-item__tip" }, "按位收回:另有手工授予的角色仅清除组来源、手工权限保留;仅组来源的角色整条删除、权限收回。", -1))
1005
+ ]),
1006
+ createElementVNode("div", _hoisted_91, [
1007
+ createElementVNode("button", {
1008
+ class: "v9-btn v9-btn--default",
1009
+ onClick: _cache[37] || (_cache[37] = ($event) => $data.dlg.removeUser = false)
1010
+ }, "取消"),
1011
+ createElementVNode("button", {
1012
+ class: "v9-btn v9-btn--danger",
1013
+ onClick: _cache[38] || (_cache[38] = (...args) => $options.doRemoveUser && $options.doRemoveUser(...args))
1014
+ }, [..._cache[91] || (_cache[91] = [
1015
+ createElementVNode("i", { class: "el-icon-delete" }, null, -1),
1016
+ createTextVNode(" 移除并收回", -1)
1017
+ ])])
1018
+ ])
1019
+ ])
1020
+ ])) : createCommentVNode("", true),
1021
+ createElementVNode("div", _hoisted_92, [
1022
+ $data.toast.show ? (openBlock(), createElementBlock("div", {
1023
+ key: 0,
1024
+ class: normalizeClass(["v9-message", $options.toastClass])
1025
+ }, [
1026
+ createElementVNode("i", {
1027
+ class: normalizeClass([$options.toastIcon, "v9-message__icon"])
1028
+ }, null, 2),
1029
+ createElementVNode("span", null, toDisplayString($data.toast.text), 1)
1030
+ ], 2)) : createCommentVNode("", true)
1031
+ ])
1032
+ ]);
1033
+ }
1034
+ const RoleGroupManage = /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-a959ecfa"]]);
1035
+ export {
1036
+ RoleGroupManage as default
1037
+ };