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

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 +115 -111
  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,364 @@
1
+ <template>
2
+ <div class="rbt-page">
3
+ <!-- 筛选 -->
4
+ <div class="v9-card">
5
+ <div class="v9-block-title">筛选</div>
6
+ <div class="v9-filter-bar">
7
+ <select v-model="filter.userId" class="v9-select trace-user-sel" @change="renderTrace">
8
+ <option value="">全部用户</option>
9
+ <option v-for="u in userOptions" :key="u.ID" :value="u.ID">{{ u.NAME }}({{ u.USER_NO }} · {{ u.DEPT_NAME }})</option>
10
+ </select>
11
+ <select v-model="filter.systemId" class="v9-select trace-sys-sel" @change="renderTrace">
12
+ <option value="">全部系统</option>
13
+ <option v-for="s in systemOptions" :key="s.ID" :value="s.ID">{{ s.NAME }}</option>
14
+ </select>
15
+ <select v-model="filter.sourceType" class="v9-select trace-src-sel" @change="renderTrace">
16
+ <option value="">全部来源</option>
17
+ <option value="group">组来源</option>
18
+ <option value="manual">手工来源</option>
19
+ <option value="dead">死标记</option>
20
+ </select>
21
+ <button class="v9-btn v9-btn--text" title="重置" @click="resetFilter"><i class="el-icon-refresh-left"></i></button>
22
+ </div>
23
+ </div>
24
+
25
+ <!-- 绑定来源统计 -->
26
+ <div class="v9-figure-grid">
27
+ <div class="v9-figure">
28
+ <div class="v9-figure__label">绑定总数</div>
29
+ <div class="v9-figure__value">{{ stats.total }}</div>
30
+ </div>
31
+ <div class="v9-figure">
32
+ <div class="v9-figure__label">含组来源</div>
33
+ <div class="v9-figure__value">{{ stats.groupCount }}</div>
34
+ </div>
35
+ <div class="v9-figure">
36
+ <div class="v9-figure__label">含手工来源</div>
37
+ <div class="v9-figure__value">{{ stats.manualCount }}</div>
38
+ </div>
39
+ <div class="v9-figure">
40
+ <div class="v9-figure__label">死标记</div>
41
+ <div class="v9-figure__value">{{ stats.deadCount }}</div>
42
+ </div>
43
+ </div>
44
+
45
+ <!-- 角色绑定明细 -->
46
+ <div class="v9-card">
47
+ <div class="v9-block-title">角色绑定明细</div>
48
+ <div v-if="!rows.length" class="v9-empty">
49
+ <i class="el-icon-box v9-empty__icon"></i>
50
+ <div>没有符合条件的绑定</div>
51
+ </div>
52
+ <table v-else class="v9-table">
53
+ <thead>
54
+ <tr>
55
+ <th style="width:60px">序号</th>
56
+ <th>用户</th>
57
+ <th>角色</th>
58
+ <th>所属系统</th>
59
+ <th>来源</th>
60
+ <th>该去哪改</th>
61
+ </tr>
62
+ </thead>
63
+ <tbody>
64
+ <tr v-for="(b, i) in rows" :key="b.ID">
65
+ <td>{{ i + 1 }}</td>
66
+ <td>{{ b.USER_NAME }} <span class="v9-form-item__tip trace-inline-tip">{{ b.DEPT_NAME }}</span></td>
67
+ <td>{{ b.ROLE_NAME }}</td>
68
+ <td><i :class="b.systemIcon" class="trace-sys-icon"></i>{{ b.SYSTEM_NAME }}</td>
69
+ <td>
70
+ <!-- 死标记:组位存在但角色已不在组内 -->
71
+ <template v-if="b.dead">
72
+ <span class="v9-tag v9-tag--warning">来自组 {{ b.GROUP_NAME || '已删除组' }} · 角色已不在该组</span>
73
+ <div class="src-note">死标记:该角色曾被组授予,后已移出组;可在授权页手工删除该绑定</div>
74
+ <span v-if="b.manual" class="v9-tag v9-tag--info trace-ml4">另有手工授予</span>
75
+ </template>
76
+ <template v-else-if="b.GROUP_NAME">
77
+ <span class="v9-tag v9-tag--primary">来自组 {{ b.GROUP_NAME }}</span>
78
+ <span v-if="b.manual" class="v9-tag v9-tag--info trace-ml4">另有手工授予</span>
79
+ </template>
80
+ <template v-else-if="b.manual">
81
+ <span class="v9-tag v9-tag--info">手工授予</span>
82
+ </template>
83
+ </td>
84
+ <td>
85
+ <button v-if="b.GROUP_NAME && !b.dead" class="v9-btn v9-btn--text" @click="gotoGroupManage(b.GROUP)">角色组管理 → {{ b.GROUP_NAME }}</button>
86
+ <button v-else-if="b.dead" class="v9-btn v9-btn--text" @click="gotoGroupManage('')">角色组管理(处理死标记)</button>
87
+ <span v-else class="v9-btn v9-btn--text trace-no-link">角色授权(现有功能)</span>
88
+ </td>
89
+ </tr>
90
+ </tbody>
91
+ </table>
92
+ </div>
93
+
94
+ <!-- 轻提示 -->
95
+ <div class="toast-box">
96
+ <div v-if="toast.show" class="v9-message v9-message--error">
97
+ <i class="el-icon-error v9-message__icon"></i>
98
+ <span>{{ toast.text }}</span>
99
+ </div>
100
+ </div>
101
+ </div>
102
+ </template>
103
+
104
+ <script>
105
+ import component from '@epxing/core/src/mixins/component.js'
106
+
107
+ export default {
108
+ name: 'epx-role-bind-trace',
109
+ mixins: [component],
110
+ data () {
111
+ return {
112
+ filter: { userId: '', systemId: '', sourceType: '' },
113
+ userOptions: [], // 用户下拉
114
+ systemOptions: [], // 系统下拉
115
+ stats: { total: 0, groupCount: 0, manualCount: 0, deadCount: 0 },
116
+ rows: [], // 绑定明细
117
+ toast: { show: false, text: '' },
118
+ toastTimer: null
119
+ }
120
+ },
121
+ created () {
122
+ this.renderTrace()
123
+ },
124
+ methods: {
125
+ msg (text) {
126
+ this.toast = { show: true, text }
127
+ clearTimeout(this.toastTimer)
128
+ this.toastTimer = setTimeout(() => { this.toast.show = false }, 6000)
129
+ },
130
+ renderTrace () {
131
+ this.$http.$request({
132
+ action: 'getBindTrace',
133
+ entityId: 'FM_ROLE_GROUP',
134
+ userId: this.filter.userId,
135
+ systemId: this.filter.systemId,
136
+ sourceType: this.filter.sourceType
137
+ })
138
+ .then(data => {
139
+ this.userOptions = data.users || []
140
+ this.systemOptions = data.systems || []
141
+ this.stats = data.stats || { total: 0, groupCount: 0, manualCount: 0, deadCount: 0 }
142
+ this.rows = data.rows || []
143
+ })
144
+ .catch(err => this.msg(err.message || '获取绑定数据失败'))
145
+ },
146
+ resetFilter () {
147
+ this.filter = { userId: '', systemId: '', sourceType: '' }
148
+ this.renderTrace()
149
+ },
150
+ // 跳转角色组管理页(带组 ID 定位)
151
+ gotoGroupManage (groupId) {
152
+ this.$createPage({
153
+ component: 'role-group-manage',
154
+ groupId: groupId || ''
155
+ })
156
+ }
157
+ }
158
+ }
159
+ </script>
160
+
161
+ <style lang="scss" scoped>
162
+ /* ===== 以下样式值均取自原型 V9 设计系统,保持逐项一致 ===== */
163
+ .rbt-page {
164
+ min-height: 100%;
165
+ padding: 24px;
166
+ background: var(--epx-bg-card, #f2f3f7);
167
+ font-family: 'PingFang SC', 'Microsoft YaHei', 'Helvetica Neue', Arial, sans-serif;
168
+ font-size: 14px;
169
+ line-height: 22px;
170
+ color: var(--epx-text, #444);
171
+ display: flex;
172
+ flex-direction: column;
173
+ gap: 16px;
174
+ }
175
+
176
+ .v9-card {
177
+ background: var(--epx-bg-card, #fff);
178
+ border-radius: 4px;
179
+ padding: 24px;
180
+ }
181
+ .v9-block-title {
182
+ display: flex;
183
+ align-items: center;
184
+ gap: 8px;
185
+ font-size: 16px;
186
+ font-weight: 600;
187
+ color: var(--epx-text, #222);
188
+ margin-bottom: 16px;
189
+ &::before {
190
+ content: '';
191
+ width: 4px;
192
+ height: 16px;
193
+ border-radius: 2px;
194
+ background: #0874e7;
195
+ }
196
+ }
197
+
198
+ /* 筛选条 */
199
+ .v9-filter-bar {
200
+ display: flex;
201
+ flex-wrap: wrap;
202
+ align-items: center;
203
+ gap: 12px;
204
+ }
205
+ .v9-select {
206
+ height: 32px;
207
+ padding: 0 28px 0 12px;
208
+ font-size: 14px;
209
+ color: var(--epx-text, #444);
210
+ background: var(--epx-bg-card, #fff) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' fill='%23888'%3E%3Cpath d='M6 8L2 4h8z'/%3E%3C/svg%3E") no-repeat right 10px center;
211
+ border: 1px solid var(--epx-border, #dcdfe6);
212
+ border-radius: 4px;
213
+ outline: none;
214
+ font-family: inherit;
215
+ appearance: none;
216
+ transition: border-color 0.15s;
217
+ &:hover { border-color: var(--epx-border, #c0c4cc); }
218
+ &:focus { border-color: var(--epx-border, #0874e7); }
219
+ }
220
+ .trace-user-sel { width: 220px; }
221
+ .trace-sys-sel { width: 200px; }
222
+ .trace-src-sel { width: 200px; }
223
+
224
+ .v9-btn {
225
+ display: inline-flex;
226
+ align-items: center;
227
+ justify-content: center;
228
+ gap: 6px;
229
+ height: 32px;
230
+ padding: 0 16px;
231
+ font-size: 14px;
232
+ line-height: 1;
233
+ border: 1px solid transparent;
234
+ border-radius: 4px;
235
+ cursor: pointer;
236
+ user-select: none;
237
+ white-space: nowrap;
238
+ transition: all 0.15s cubic-bezier(0.4, 0, 0.2, 1);
239
+ background: var(--epx-bg-card, #fff);
240
+ color: var(--epx-text, #444);
241
+ outline: none;
242
+ font-family: inherit;
243
+ &--text {
244
+ background: transparent;
245
+ border-color: transparent;
246
+ color: var(--el-color-primary, #0874e7);
247
+ padding: 0 4px;
248
+ height: auto;
249
+ &:hover { color: var(--epx-text-secondary, #2f95f5); background: transparent; }
250
+ }
251
+ }
252
+ .trace-no-link { color: var(--el-color-primary, #0874e7); cursor: default; }
253
+
254
+ /* 数字统计卡 */
255
+ .v9-figure-grid {
256
+ display: grid;
257
+ grid-template-columns: repeat(4, minmax(0, 1fr));
258
+ gap: 12px;
259
+ }
260
+ .v9-figure {
261
+ background: var(--epx-bg-card, #f5f7fa);
262
+ border-radius: 4px;
263
+ padding: 16px;
264
+ min-width: 0;
265
+ transition: box-shadow 0.15s;
266
+ &:hover { box-shadow: 0 4px 12px rgba(17, 24, 39, 0.08), 0 2px 6px -2px rgba(17, 24, 39, 0.05); }
267
+ }
268
+ .v9-figure__label {
269
+ font-size: 12px;
270
+ color: var(--epx-text-secondary, #888);
271
+ margin-bottom: 4px;
272
+ white-space: nowrap;
273
+ overflow: hidden;
274
+ text-overflow: ellipsis;
275
+ }
276
+ .v9-figure__value {
277
+ font-size: 20px;
278
+ font-weight: 600;
279
+ color: var(--epx-text, #222);
280
+ line-height: 28px;
281
+ }
282
+ @media (max-width: 1100px) {
283
+ .v9-figure-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
284
+ }
285
+
286
+ /* 表格 */
287
+ .v9-table {
288
+ width: 100%;
289
+ border-collapse: collapse;
290
+ background: var(--epx-bg-card, #fff);
291
+ font-size: 14px;
292
+ th, td {
293
+ padding: 0 16px;
294
+ height: 48px;
295
+ text-align: left;
296
+ border-bottom: 1px solid var(--epx-border, #e4e7ed);
297
+ }
298
+ thead th {
299
+ background: var(--epx-bg-card, #f2f3f7);
300
+ color: var(--epx-text, #444);
301
+ font-weight: 500;
302
+ white-space: nowrap;
303
+ }
304
+ tbody td { color: var(--epx-text, #444); }
305
+ tbody tr:hover > td { background: var(--epx-bg, #e6f6ff); }
306
+ }
307
+
308
+ /* 标签 */
309
+ .v9-tag {
310
+ display: inline-flex;
311
+ align-items: center;
312
+ height: 22px;
313
+ padding: 0 8px;
314
+ font-size: 12px;
315
+ border-radius: 4px;
316
+ border: 1px solid transparent;
317
+ line-height: 1;
318
+ &--primary { background: var(--epx-bg, #e6f6ff); color: var(--el-color-primary, #0874e7); border-color: var(--epx-border, #82cbff); }
319
+ &--success { background: var(--epx-bg-card, #f0f9eb); color: var(--epx-text-secondary, #67c23a); border-color: var(--epx-border, #c2e7b0); }
320
+ &--warning { background: var(--epx-bg-card, #fdf6ec); color: var(--epx-text-secondary, #e6a23a); border-color: var(--epx-border, #f5dab1); }
321
+ &--info { background: var(--epx-bg-card, #f4f4f5); color: var(--epx-text-secondary, #888); border-color: var(--epx-border, #e9e9eb); }
322
+ }
323
+ .trace-ml4 { margin-left: 4px; }
324
+ .src-note { font-size: 12px; color: var(--epx-text-secondary, #888); margin-top: 2px; }
325
+
326
+ /* 空状态 */
327
+ .v9-empty {
328
+ display: flex;
329
+ flex-direction: column;
330
+ align-items: center;
331
+ justify-content: center;
332
+ padding: 40px 0;
333
+ color: var(--epx-text-secondary, #888);
334
+ gap: 12px;
335
+ }
336
+ .v9-empty__icon { font-size: 64px; color: var(--epx-text-secondary, #c0c4cc); }
337
+
338
+ .v9-form-item__tip { margin-top: 4px; font-size: 12px; color: var(--epx-text-secondary, #888); }
339
+ .trace-inline-tip { display: inline; margin-top: 0; }
340
+ .trace-sys-icon { margin-right: 4px; }
341
+
342
+ /* 轻提示 */
343
+ .toast-box {
344
+ position: fixed;
345
+ top: 76px;
346
+ left: 50%;
347
+ transform: translateX(-50%);
348
+ z-index: 3000;
349
+ max-width: 640px;
350
+ }
351
+ .v9-message {
352
+ display: inline-flex;
353
+ align-items: center;
354
+ gap: 8px;
355
+ max-width: 640px;
356
+ padding: 10px 16px;
357
+ border-radius: 4px;
358
+ font-size: 14px;
359
+ box-shadow: 0 4px 12px rgba(17, 24, 39, 0.08), 0 2px 6px -2px rgba(17, 24, 39, 0.05);
360
+ background: var(--epx-bg-card, #fef0f0);
361
+ color: var(--epx-text, #444);
362
+ .v9-message__icon { color: var(--el-color-danger, #f56c6c); }
363
+ }
364
+ </style>