@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
package/src/views/Add.vue CHANGED
@@ -482,11 +482,11 @@ export default {
482
482
  }
483
483
  },
484
484
  init () {
485
- if (this.linkAttrs && this.linkAttrs.length > 0) {
486
- // this.$bus.off('reload')
487
- this.$bus.on('reload', () => {
485
+ if (this.linkAttrs && this.linkAttrs.length > 0 && !this._reloadHandler) {
486
+ this._reloadHandler = () => {
488
487
  this.reload = true
489
- })
488
+ }
489
+ this.$bus.on('reload', this._reloadHandler)
490
490
  }
491
491
  this.getFieldConfig()
492
492
  // 获取其级联编辑页面
@@ -671,7 +671,10 @@ export default {
671
671
  )
672
672
  },
673
673
  beforeUnmount () {
674
- // this.$bus.off('reload')
674
+ if (this._reloadHandler) {
675
+ this.$bus.off('reload', this._reloadHandler)
676
+ this._reloadHandler = null
677
+ }
675
678
  // this.$bus.off('subAddEntity')
676
679
  // this.$bus.on('reload', this.reloadMenuPage)
677
680
  }
@@ -35,6 +35,36 @@
35
35
  </div>
36
36
  </div>
37
37
 
38
+ <!-- 调用方法沿用工具绑定,不复制方法定义 -->
39
+ <div class="tool-section">
40
+ <div class="section-header">
41
+ <span class="section-title">调用方法</span>
42
+ <span class="call-method-hint">接入配置中心已启用的方法,供智能体调用</span>
43
+ </div>
44
+ <div class="tool-cards">
45
+ <div v-for="tool in callMethodTools" :key="tool.ID" class="tool-card interface-card clickable" @click="showCallMethodSettings(tool)">
46
+ <div class="card-header">
47
+ <span class="card-title">{{ tool['CALL_METHOD|NAME'] || tool.NAME }}</span>
48
+ <el-tag size="small" :type="String(tool.CONFIRM) === '1' ? 'warning' : 'info'">{{ String(tool.CONFIRM) === '1' ? '执行前确认' : '直接执行' }}</el-tag>
49
+ </div>
50
+ <div class="card-content">
51
+ <div class="card-line">方法标识:{{ tool['CALL_METHOD|CODE'] || '—' }}</div>
52
+ <div class="card-line">主对象:{{ tool['CALL_METHOD|MAIN_ENTITY#'] || '—' }}</div>
53
+ <div class="card-line">方法类型:{{ callMethodTypeName(tool['CALL_METHOD|OPERATION']) }}</div>
54
+ <div class="card-line">{{ tool['CALL_METHOD|DESCRIPTION'] || tool.DESC }}</div>
55
+ </div>
56
+ <div class="call-method-actions">
57
+ <el-button size="small" class="call-method-secondary" @click.stop="showCallMethodSettings(tool)">接入配置</el-button>
58
+ <el-button size="small" class="call-method-danger" @click.stop="removeCallMethod(tool)">解除绑定</el-button>
59
+ </div>
60
+ </div>
61
+ <div class="tool-card add-card" @click="showCallMethodDialog">
62
+ <div class="add-icon">+</div>
63
+ <div class="add-text">添加调用方法</div>
64
+ </div>
65
+ </div>
66
+ </div>
67
+
38
68
  <!-- 对象接口工具 -->
39
69
  <div class="tool-section">
40
70
  <div class="section-header">
@@ -377,7 +407,7 @@
377
407
  <div class="filter-item">
378
408
  <label>选择对象:</label>
379
409
  <epx-object
380
- v-model="selectedEntity"
410
+ :model-value="selectedEntity"
381
411
  :fieldConfigs="{
382
412
  attriLabel: '',
383
413
  codeKey: 'FM_ENTITY',
@@ -385,7 +415,7 @@
385
415
  placeholder: '请选择对象',
386
416
  isMultiple: '0'
387
417
  }"
388
- @change="handleEntityChange"
418
+ @update:modelValue="handleEntityChange"
389
419
  />
390
420
  </div>
391
421
  </div>
@@ -781,6 +811,49 @@
781
811
  </div>
782
812
  </el-dialog>
783
813
 
814
+ <el-dialog title="添加调用方法" v-model="callMethodDialogVisible" width="960px" :close-on-click-modal="false" :close-on-press-escape="!callMethodSaving" :show-close="!callMethodSaving">
815
+ <div class="call-method-toolbar">
816
+ <el-input v-model="callMethodKeyword" size="small" placeholder="搜索方法名称或标识" clearable :disabled="callMethodSaving" @keyup.enter="searchCallMethods" @clear="searchCallMethods" />
817
+ <el-button size="small" class="call-method-secondary" :disabled="callMethodSaving" @click="searchCallMethods">查询</el-button>
818
+ <span class="call-method-hint">已接入的方法不可重复选择</span>
819
+ </div>
820
+ <el-table ref="callMethodTable" v-loading="callMethodLoading" :data="callMethodList" row-key="ID" height="340" @selection-change="handleCallMethodSelectionChange">
821
+ <el-table-column type="selection" width="48" :reserve-selection="true" :selectable="canSelectCallMethod" />
822
+ <el-table-column prop="NAME" label="方法名称" min-width="160" show-overflow-tooltip />
823
+ <el-table-column prop="CODE" label="方法标识" min-width="170" show-overflow-tooltip />
824
+ <el-table-column label="方法类型" width="120"><template #default="scope">{{ callMethodTypeName(scope.row.OPERATION) }}</template></el-table-column>
825
+ <el-table-column prop="MAIN_ENTITY#" label="主对象" min-width="140" show-overflow-tooltip />
826
+ <el-table-column prop="DESCRIPTION" label="方法描述" min-width="200" show-overflow-tooltip />
827
+ </el-table>
828
+ <el-pagination :current-page="callMethodPage" :page-size="10" layout="total, prev, pager, next" :total="callMethodTotal" :disabled="callMethodSaving" @current-change="changeCallMethodPage" />
829
+ <div v-if="selectedCallMethods.length" class="call-method-selection">
830
+ <div class="call-method-selection-title">已选择 {{ selectedCallMethods.length }} 个方法 · 逐项设置执行前确认</div>
831
+ <div v-for="method in selectedCallMethods" :key="method.ID" class="call-method-selection-row">
832
+ <span>{{ method.NAME }}</span>
833
+ <el-checkbox v-model="callMethodConfirm[method.ID]" :disabled="callMethodSaving">执行前确认</el-checkbox>
834
+ </div>
835
+ </div>
836
+ <template #footer><div >
837
+ <el-button size="small" class="call-method-secondary" :disabled="callMethodSaving" @click="callMethodDialogVisible = false">取消</el-button>
838
+ <el-button size="small" type="primary" class="call-method-primary" :disabled="!selectedCallMethods.length || callMethodLoading" :loading="callMethodSaving" @click="confirmCallMethods">确认添加</el-button>
839
+ </div></template>
840
+ </el-dialog>
841
+
842
+ <el-dialog title="调用方法接入配置" v-model="callMethodSettingsVisible" width="600px" :close-on-click-modal="false" :close-on-press-escape="!callMethodSaving" :show-close="!callMethodSaving">
843
+ <el-form label-width="100px">
844
+ <el-form-item label="方法名称">{{ callMethodSetting['CALL_METHOD|NAME'] || callMethodSetting.NAME }}</el-form-item>
845
+ <el-form-item label="方法标识">{{ callMethodSetting['CALL_METHOD|CODE'] || '—' }}</el-form-item>
846
+ <el-form-item label="方法类型">{{ callMethodTypeName(callMethodSetting['CALL_METHOD|OPERATION']) }}</el-form-item>
847
+ <el-form-item label="主对象">{{ callMethodSetting['CALL_METHOD|MAIN_ENTITY#'] || '—' }}</el-form-item>
848
+ <el-form-item label="方法描述">{{ callMethodSetting['CALL_METHOD|DESCRIPTION'] || callMethodSetting.DESC }}</el-form-item>
849
+ <el-form-item label="执行前确认"><el-switch v-model="callMethodSettingConfirm" :disabled="callMethodSaving" /></el-form-item>
850
+ </el-form>
851
+ <template #footer><div >
852
+ <el-button size="small" class="call-method-secondary" :disabled="callMethodSaving" @click="callMethodSettingsVisible = false">取消</el-button>
853
+ <el-button size="small" type="primary" class="call-method-primary" :loading="callMethodSaving" @click="saveCallMethodSettings">保存</el-button>
854
+ </div></template>
855
+ </el-dialog>
856
+
784
857
  <!-- MCP选择对话框 -->
785
858
  <el-dialog
786
859
  title="添加MCP工具"
@@ -912,6 +985,21 @@ export default {
912
985
  subAgentTools: [],
913
986
  skillTools: [],
914
987
  sysTools: [],
988
+ callMethodTools: [],
989
+ callMethodDialogVisible: false,
990
+ callMethodList: [],
991
+ callMethodKeyword: '',
992
+ callMethodPage: 1,
993
+ callMethodTotal: 0,
994
+ callMethodLoading: false,
995
+ callMethodSaving: false,
996
+ callMethodRequestId: 0,
997
+ selectedCallMethods: [],
998
+ // 确认设置按方法ID保留,跨页选择不会重置用户修改。
999
+ callMethodConfirm: {},
1000
+ callMethodSettingsVisible: false,
1001
+ callMethodSetting: {},
1002
+ callMethodSettingConfirm: false,
915
1003
  dialogVisible: false,
916
1004
  dialogTitle: '新增工具',
917
1005
  isEdit: false,
@@ -1006,7 +1094,7 @@ export default {
1006
1094
  methods: {
1007
1095
  // 加载工具列表
1008
1096
  loadTools () {
1009
- this.$http.list({
1097
+ return this.$http.list({
1010
1098
  action: 'list',
1011
1099
  entityId: 'FM_AI_TOOL',
1012
1100
  'scope.AGENT': this.$query.id,
@@ -1014,7 +1102,7 @@ export default {
1014
1102
  order_mode: 'asc',
1015
1103
  columnFieldNames: 'ID,NAME#,TYPE,DESC,ORDER,ACTION,META#,API,TOKEN,MCP_URL,WORKFLOW,SKILL_FILE,ENABLE,CONFIRM,FORM_PAGE,RESULT_PAGE,USE_FORM_PAGE,USE_RESULT_PAGE,API|LABEL,API|NAME,API|ENTITY#,API|PARAM_EXPLAIN,API|FRAME_API,OUT_API|NOTICE,SUB_AGENT|NAME,SUB_AGENT|AGENT_PROMPT,SUB_AGENT|CODE,SUB_AGENT|IMAGE,SKILL,SKILL|NAME,SKILL|CODE,SKILL|DESC,MCP,MCP|NAME,MCP|CODE,MCP|TYPE,MCP|URL,MCP|COMMAND,SYS_TOOL,SYS_TOOL|NAME,SYS_TOOL|CODE,SYS_TOOL|DESC'
1016
1104
  })
1017
- .then(data => {
1105
+ .then(async data => {
1018
1106
  const tools = data.entitys || []
1019
1107
  this.interfaceTools = tools.filter(t => t.TYPE === 'function')
1020
1108
  this.externalTools = tools.filter(t => t.TYPE === 'api')
@@ -1022,12 +1110,174 @@ export default {
1022
1110
  this.subAgentTools = tools.filter(t => t.TYPE === 'subagent')
1023
1111
  this.skillTools = tools.filter(t => t.TYPE === 'skills')
1024
1112
  this.sysTools = tools.filter(t => t.TYPE === 'sys_tool')
1113
+ await this.loadCallMethodTools(tools.filter(t => t.TYPE === 'call_method'))
1025
1114
  })
1026
1115
  .catch(err => {
1027
1116
  this.$message.error(err.message || '加载工具列表失败')
1028
1117
  })
1029
1118
  },
1030
1119
 
1120
+ callMethodTypeName (operation) {
1121
+ return { CREATE: '数据新增', LIST: '列表分页查询', UPDATE: '数据编辑', DELETE: '数据删除', DETAIL: '详情', APPLY: '申请', APPROVE: '审核', PRINT: '报表打印' }[operation] || operation || '—'
1122
+ },
1123
+
1124
+ // 仅存在此类绑定时读取新增关联字段,兼容尚未接入调用方法的旧配置。
1125
+ async loadCallMethodTools (tools) {
1126
+ this.callMethodTools = tools
1127
+ if (!tools.length) return
1128
+ const result = await this.$http.list({
1129
+ entityId: this.$util.getSystemMeta('FM_AI_TOOL'),
1130
+ 'scope.AGENT': this.$query.id,
1131
+ 'scope.TYPE': 'call_method',
1132
+ limit: tools.length,
1133
+ columnFieldNames: 'ID,NAME,DESC,CONFIRM,CALL_METHOD,CALL_METHOD|NAME,CALL_METHOD|CODE,CALL_METHOD|DESCRIPTION,CALL_METHOD|OPERATION,CALL_METHOD|MAIN_ENTITY#'
1134
+ })
1135
+ this.callMethodTools = result.entitys || []
1136
+ },
1137
+
1138
+ showCallMethodDialog () {
1139
+ if (!this.$query.id) {
1140
+ this.$message.warning('请先保存智能体,再添加调用方法')
1141
+ return
1142
+ }
1143
+ this.callMethodKeyword = ''
1144
+ this.callMethodPage = 1
1145
+ this.callMethodList = []
1146
+ this.selectedCallMethods = []
1147
+ this.callMethodConfirm = {}
1148
+ this.callMethodDialogVisible = true
1149
+ this.$nextTick(() => {
1150
+ if (this.$refs.callMethodTable) this.$refs.callMethodTable.clearSelection()
1151
+ this.loadCallMethods()
1152
+ })
1153
+ },
1154
+
1155
+ async loadCallMethods () {
1156
+ const requestId = ++this.callMethodRequestId
1157
+ this.callMethodLoading = true
1158
+ try {
1159
+ // 只提供已启用的方法;list返回entitys和total,绑定仍由后端校验。
1160
+ const result = await this.$http.list({
1161
+ entityId: this.$util.getSystemMeta('FM_AI_CALL_METHOD'),
1162
+ 'scope.ENABLE': '1',
1163
+ keywordValue: this.callMethodKeyword,
1164
+ keywordFields: 'NAME,CODE',
1165
+ page: this.callMethodPage,
1166
+ limit: 10,
1167
+ columnFieldNames: 'ID,NAME,CODE,DESCRIPTION,OPERATION,MAIN_ENTITY#',
1168
+ order_field: 'CODE',
1169
+ order_mode: 'asc'
1170
+ })
1171
+ if (requestId !== this.callMethodRequestId) return
1172
+ this.callMethodList = result.entitys || []
1173
+ this.callMethodTotal = result.total || 0
1174
+ } catch (err) {
1175
+ if (requestId === this.callMethodRequestId) {
1176
+ this.callMethodList = []
1177
+ this.callMethodTotal = 0
1178
+ this.$message.error(err.msg || err.message || '加载调用方法失败')
1179
+ }
1180
+ } finally {
1181
+ if (requestId === this.callMethodRequestId) this.callMethodLoading = false
1182
+ }
1183
+ },
1184
+
1185
+ searchCallMethods () {
1186
+ this.callMethodPage = 1
1187
+ this.loadCallMethods()
1188
+ },
1189
+
1190
+ changeCallMethodPage (page) {
1191
+ this.callMethodPage = page
1192
+ this.loadCallMethods()
1193
+ },
1194
+
1195
+ canSelectCallMethod (row) {
1196
+ return !this.callMethodSaving && !this.callMethodTools.some(tool => tool.CALL_METHOD === row.ID)
1197
+ },
1198
+
1199
+ handleCallMethodSelectionChange (selection) {
1200
+ this.selectedCallMethods = selection
1201
+ selection.forEach(method => {
1202
+ if (!Object.prototype.hasOwnProperty.call(this.callMethodConfirm, method.ID)) {
1203
+ this.$set(this.callMethodConfirm, method.ID, method.OPERATION === 'CREATE')
1204
+ }
1205
+ })
1206
+ },
1207
+
1208
+ async confirmCallMethods () {
1209
+ if (this.callMethodSaving || !this.selectedCallMethods.length) return
1210
+ this.callMethodSaving = true
1211
+ let saved = 0
1212
+ try {
1213
+ // 每条保存成功即移出待选,部分失败时重试只处理未成功的绑定。
1214
+ for (const method of [...this.selectedCallMethods]) {
1215
+ await this.$http.save({
1216
+ entityId: this.$util.getSystemMeta('FM_AI_TOOL'),
1217
+ bean: {
1218
+ NAME: method.NAME,
1219
+ DESC: method.DESCRIPTION || method.NAME,
1220
+ TYPE: 'call_method',
1221
+ CALL_METHOD: method.ID,
1222
+ AGENT: this.$query.id,
1223
+ CLIENT: this.CLIENT,
1224
+ SYSTEM: this.SYSTEM,
1225
+ ENABLE: '1',
1226
+ CONFIRM: this.callMethodConfirm[method.ID] ? '1' : '0'
1227
+ }
1228
+ })
1229
+ saved++
1230
+ this.$refs.callMethodTable.toggleRowSelection(method, false)
1231
+ }
1232
+ this.callMethodDialogVisible = false
1233
+ this.$message.success(`已添加 ${saved} 个调用方法`)
1234
+ } catch (err) {
1235
+ this.$message.error(`${saved ? `已添加 ${saved} 个,其余未完成:` : ''}${err.msg || err.message || '添加调用方法失败'}`)
1236
+ } finally {
1237
+ await this.loadTools()
1238
+ this.callMethodSaving = false
1239
+ }
1240
+ },
1241
+
1242
+ showCallMethodSettings (tool) {
1243
+ this.callMethodSetting = { ...tool }
1244
+ this.callMethodSettingConfirm = String(tool.CONFIRM) === '1'
1245
+ this.callMethodSettingsVisible = true
1246
+ },
1247
+
1248
+ async saveCallMethodSettings () {
1249
+ if (this.callMethodSaving) return
1250
+ this.callMethodSaving = true
1251
+ try {
1252
+ await this.$http.update({
1253
+ entityId: this.$util.getSystemMeta('FM_AI_TOOL'),
1254
+ bean: { ID: this.callMethodSetting.ID, CONFIRM: this.callMethodSettingConfirm ? '1' : '0' }
1255
+ })
1256
+ this.callMethodSettingsVisible = false
1257
+ this.$message.success('接入配置已保存')
1258
+ await this.loadTools()
1259
+ } catch (err) {
1260
+ this.$message.error(err.msg || err.message || '保存接入配置失败')
1261
+ } finally {
1262
+ this.callMethodSaving = false
1263
+ }
1264
+ },
1265
+
1266
+ async removeCallMethod (tool) {
1267
+ try {
1268
+ await this.$confirm(`确定解除“${tool['CALL_METHOD|NAME'] || tool.NAME}”的绑定吗?方法定义会保留。`, '解除绑定', { type: 'warning' })
1269
+ } catch (cancel) {
1270
+ return
1271
+ }
1272
+ try {
1273
+ await this.$http.removeMulti({ entityId: this.$util.getSystemMeta('FM_AI_TOOL'), ids: tool.ID })
1274
+ this.$message.success('已解除绑定')
1275
+ await this.loadTools()
1276
+ } catch (err) {
1277
+ this.$message.error(err.msg || err.message || '解除绑定失败')
1278
+ }
1279
+ },
1280
+
1031
1281
  // 新增工具
1032
1282
  handleAdd (type) {
1033
1283
  if (type === 'interface') {
@@ -1861,6 +2111,78 @@ export default {
1861
2111
  color: var(--epx-text);
1862
2112
  }
1863
2113
 
2114
+ .call-method-hint {
2115
+ margin-left: 12px;
2116
+ font-size: 12px;
2117
+ color: var(--epx-text-secondary, #909399);
2118
+ }
2119
+
2120
+ .call-method-actions,
2121
+ .call-method-toolbar,
2122
+ .call-method-selection-row {
2123
+ display: flex;
2124
+ align-items: center;
2125
+ gap: 12px;
2126
+ }
2127
+
2128
+ .call-method-actions {
2129
+ margin-top: 12px;
2130
+ }
2131
+
2132
+ .call-method-toolbar {
2133
+ margin-bottom: 16px;
2134
+
2135
+ .el-input { width: 300px; }
2136
+ }
2137
+
2138
+ .call-method-selection {
2139
+ margin-top: 16px;
2140
+ padding: 12px 16px;
2141
+ background: var(--epx-bg-card, #f5f7fa);
2142
+ max-height: 180px;
2143
+ overflow-y: auto;
2144
+ }
2145
+
2146
+ .call-method-selection-title {
2147
+ margin-bottom: 8px;
2148
+ font-weight: 600;
2149
+ }
2150
+
2151
+ .call-method-selection-row {
2152
+ justify-content: space-between;
2153
+ padding: 6px 0;
2154
+ }
2155
+
2156
+ :deep(.el-button.call-method-secondary) ,
2157
+ :deep(.el-button.call-method-primary) ,
2158
+ :deep(.el-button.call-method-danger) {
2159
+ font-weight: 600;
2160
+ }
2161
+
2162
+ :deep(.el-button.call-method-secondary) {
2163
+ background: var(--epx-bg-card, #ecf5ff);
2164
+ border-color: var(--epx-border, #b3d8ff);
2165
+ color: var(--epx-text, #1670d2);
2166
+ }
2167
+
2168
+ :deep(.el-button.call-method-primary) {
2169
+ background: rgb(var(--color-primary, 8, 116, 231));
2170
+ border-color: rgb(var(--color-primary, 8, 116, 231));
2171
+ color: #fff;
2172
+
2173
+ &.is-disabled {
2174
+ background: var(--epx-bg, #d9e6f5);
2175
+ border-color: var(--epx-border, #d9e6f5);
2176
+ color: #fff;
2177
+ }
2178
+ }
2179
+
2180
+ :deep(.el-button.call-method-danger) {
2181
+ background: var(--epx-bg-card, #fef0f0);
2182
+ border-color: var(--epx-border, #fbc4c4);
2183
+ color: var(--epx-text-secondary, #d94b4b);
2184
+ }
2185
+
1864
2186
  .tool-cards {
1865
2187
  display: grid;
1866
2188
  grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
package/src/views/App.vue CHANGED
@@ -1,53 +1,4 @@
1
- <template>
2
- <!-- app入口 -->
3
- <component v-if="load" :is="component" :page="firstPage"></component>
4
- </template>
5
-
6
- <script>
7
- /**
8
- * 应用入口 获取应用配置模板
9
- */
10
- export default {
11
- name: 'epx-app',
12
- computed: {
13
- appConfig () {
14
- return this.$store.state.config.appConfig
15
- }
16
- },
17
-
18
- data () {
19
- return {
20
- load: false,
21
- component: 'epx-app-index',
22
- firstPage: {}
23
- }
24
- },
25
- methods: {
26
- getPage () {
27
- const { FIRST_PAGE, MOBILE_FIRST_PAGE } = this.appConfig
28
- this.$store.dispatch({ // 加回调
29
- type: 'ADD_PAGE',
30
- pageId: this.$isMobile ? MOBILE_FIRST_PAGE : FIRST_PAGE
31
- })
32
- .then((page = {}) => {
33
- const { pagePath } = page
34
- this.firstPage = page
35
- this.component = this.$loadComponent(pagePath, this.component)
36
- this.load = true
37
- })
38
- .catch(() => {
39
- // this.component = this.$loadComponent(null, this.component)
40
- this.load = true
41
- })
42
- }
43
- },
44
- created () {
45
- this.getPage()
46
- }
47
-
48
- }
49
- </script>
50
-
51
- <style>
52
-
53
- </style>
1
+ <script>
2
+ // 保留业务包旧路径,基础路由页统一由 core 提供。
3
+ export { default } from '@epxing/core/src/views/App.vue'
4
+ </script>