diff --git a/apps/web-antd/src/api/infra/file-config/index.ts b/apps/web-antd/src/api/infra/file-config/index.ts index 1a2fb7707..3b1e82e6c 100644 --- a/apps/web-antd/src/api/infra/file-config/index.ts +++ b/apps/web-antd/src/api/infra/file-config/index.ts @@ -17,6 +17,7 @@ export namespace InfraFileConfigApi { accessSecret?: string; pathStyle?: boolean; enablePublicAccess?: boolean; + region?: string; domain: string; } diff --git a/apps/web-antd/src/api/system/social/client/index.ts b/apps/web-antd/src/api/system/social/client/index.ts index 181cdf86b..55978dd14 100644 --- a/apps/web-antd/src/api/system/social/client/index.ts +++ b/apps/web-antd/src/api/system/social/client/index.ts @@ -12,6 +12,7 @@ export namespace SystemSocialClientApi { clientId: string; clientSecret: string; agentId?: string; + publicKey?: string; status: number; createTime?: Date; } diff --git a/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/designer/plugins/translate/zh.js b/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/designer/plugins/translate/zh.js index cc2a06391..4d25da7f5 100644 --- a/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/designer/plugins/translate/zh.js +++ b/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/designer/plugins/translate/zh.js @@ -11,7 +11,7 @@ export default { 'Append Gateway': '追加网关', 'Append Task': '追加任务', 'Append Intermediate/Boundary Event': '追加中间抛出事件/边界事件', - + TextAnnotation: '文本注释', 'Activate the global connect tool': '激活全局连接工具', 'Append {type}': '添加 {type}', 'Add Lane above': '在上面添加道', @@ -31,10 +31,16 @@ export default { 'Create expanded SubProcess': '创建扩展子过程', 'Create IntermediateThrowEvent/BoundaryEvent': '创建中间抛出事件/边界事件', 'Create Pool/Participant': '创建池/参与者', - 'Parallel Multi Instance': '并行多重事件', - 'Sequential Multi Instance': '时序多重事件', + 'Participant Multiplicity': '参与者多重性', + 'Empty pool/participant (removes content)': '清空池/参与者(移除内容)', + 'Empty pool/participant': '收缩池/参与者', + 'Expanded pool/participant': '展开池/参与者', + 'Parallel Multi-Instance': '并行多重事件', + 'Sequential Multi-Instance': '时序多重事件', DataObjectReference: '数据对象参考', DataStoreReference: '数据存储参考', + 'Data object reference': '数据对象引用 ', + 'Data store reference': '数据存储引用 ', Loop: '循环', 'Ad-hoc': '即席', 'Create {type}': '创建 {type}', @@ -49,6 +55,9 @@ export default { 'Call Activity': '调用活动', 'Sub-Process (collapsed)': '子流程(折叠的)', 'Sub-Process (expanded)': '子流程(展开的)', + 'Ad-hoc sub-process': '即席子流程', + 'Ad-hoc sub-process (collapsed)': '即席子流程(折叠的)', + 'Ad-hoc sub-process (expanded)': '即席子流程(展开的)', 'Start Event': '开始事件', StartEvent: '开始事件', 'Intermediate Throw Event': '中间事件', @@ -111,10 +120,10 @@ export default { 'Parallel Gateway': '并行网关', 'Inclusive Gateway': '相容网关', 'Complex Gateway': '复杂网关', - 'Event based Gateway': '事件网关', + 'Event-based Gateway': '事件网关', Transaction: '转运', - 'Sub Process': '子流程', - 'Event Sub Process': '事件子流程', + 'sub-process': '子流程', + 'Event sub-process': '事件子流程', 'Collapsed Pool': '折叠池', 'Expanded Pool': '展开池', diff --git a/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/penal/PropertiesPanel.vue b/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/penal/PropertiesPanel.vue index 5371c88d0..112b9c902 100644 --- a/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/penal/PropertiesPanel.vue +++ b/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/penal/PropertiesPanel.vue @@ -390,8 +390,9 @@ watch(() => props.businessObject, syncFromBusinessObject, { deep: true }); + diff --git a/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/penal/custom-config/components/UserTaskCustomConfig.vue b/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/penal/custom-config/components/UserTaskCustomConfig.vue index d7730e291..b1c77400b 100644 --- a/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/penal/custom-config/components/UserTaskCustomConfig.vue +++ b/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/penal/custom-config/components/UserTaskCustomConfig.vue @@ -74,9 +74,16 @@ const assignEmptyUserIdsEl = ref(); const assignEmptyUserIds = ref(); // 操作按钮 +// TODO @puhui999:这块迁移有点问题,按钮不能操作;另外,label 也没展示。 const buttonsSettingEl = ref(); -const { btnDisplayNameEdit, changeBtnDisplayName, btnDisplayNameBlurEvent } = - useButtonsSetting(); +const { btnDisplayNameEdit, changeBtnDisplayName } = useButtonsSetting(); +const btnDisplayNameBlurEvent = (index: number) => { + btnDisplayNameEdit.value[index] = false; + const buttonItem = buttonsSettingEl.value[index]; + buttonItem.displayName = + buttonItem.displayName || OPERATION_BUTTON_NAME.get(buttonItem.id)!; + updateElementExtensions(); +}; // 字段权限 const fieldsPermissionEl = ref([]); @@ -358,19 +365,10 @@ function useButtonsSetting() { const changeBtnDisplayName = (index: number) => { btnDisplayNameEdit.value[index] = true; }; - const btnDisplayNameBlurEvent = (index: number) => { - btnDisplayNameEdit.value[index] = false; - const buttonItem = buttonsSetting.value?.[index]; - if (buttonItem) { - buttonItem.displayName = - buttonItem.displayName || OPERATION_BUTTON_NAME.get(buttonItem.id)!; - } - }; return { buttonsSetting, btnDisplayNameEdit, changeBtnDisplayName, - btnDisplayNameBlurEvent, }; } @@ -532,7 +530,7 @@ onMounted(async () => {
- +
diff --git a/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/penal/listeners/ElementListeners.vue b/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/penal/listeners/ElementListeners.vue index 55d3f545b..e2b88ffdb 100644 --- a/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/penal/listeners/ElementListeners.vue +++ b/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/penal/listeners/ElementListeners.vue @@ -61,7 +61,10 @@ const bpmnInstances = () => (window as any)?.bpmnInstances; const resetListenersList = () => { bpmnElement.value = bpmnInstances().bpmnElement; - otherExtensionList.value = []; + otherExtensionList.value = + bpmnElement.value.businessObject?.extensionElements?.values?.filter( + (ex: any) => ex.$type !== `${prefix}:ExecutionListener`, + ) ?? []; // 保留非监听器类型的扩展属性,避免移除监听器时清空其他配置(如审批人等)。相关案例:https://gitee.com/yudaocode/yudao-ui-admin-vue3/issues/ICMSYC bpmnElementListeners.value = bpmnElement.value.businessObject?.extensionElements?.values?.filter( (ex: any) => ex.$type === `${prefix}:ExecutionListener`, diff --git a/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/penal/listeners/UserTaskListeners.vue b/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/penal/listeners/UserTaskListeners.vue index 6ab38bcf9..151c1ed65 100644 --- a/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/penal/listeners/UserTaskListeners.vue +++ b/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/penal/listeners/UserTaskListeners.vue @@ -77,9 +77,12 @@ const resetListenersList = () => { // 'window.bpmnInstances.bpmnElementwindow.bpmnInstances.bpmnElementwindow.bpmnInstances.bpmnElementwindow.bpmnInstances.bpmnElementwindow.bpmnInstances.bpmnElementwindow.bpmnInstances.bpmnElement', // ); bpmnElement.value = bpmnInstances()?.bpmnElement; - otherExtensionList.value = []; + otherExtensionList.value = + bpmnElement.value.businessObject?.extensionElements?.values?.filter( + (ex: any) => ex.$type !== `${prefix}:TaskListener`, + ) ?? []; // 保留非监听器类型的扩展属性,避免移除监听器时清空其他配置(如审批人等)。相关案例:https://gitee.com/yudaocode/yudao-ui-admin-vue3/issues/ICMSYC bpmnElementListeners.value = - bpmnElement.value.businessObject?.extensionElements?.values.filter( + bpmnElement.value.businessObject?.extensionElements?.values?.filter( (ex: any) => ex.$type === `${prefix}:TaskListener`, ) ?? []; elementListenersList.value = bpmnElementListeners.value.map((listener) => diff --git a/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/penal/signal-message/SignalAndMessage.vue b/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/penal/signal-message/SignalAndMessage.vue index ad28bf71f..5a410a1ee 100644 --- a/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/penal/signal-message/SignalAndMessage.vue +++ b/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/penal/signal-message/SignalAndMessage.vue @@ -5,6 +5,7 @@ import { IconifyIcon } from '@vben/icons'; import { Button, + Divider, Form, FormItem, Input, @@ -23,13 +24,31 @@ const modelObjectForm = ref({}); const rootElements = ref(); const messageIdMap = ref(); const signalIdMap = ref(); +const editingIndex = ref(-1); // 正在编辑的索引,-1 表示新建 const modelConfig = computed(() => { + const isEdit = editingIndex.value !== -1; return modelType.value === 'message' - ? { title: '创建消息', idLabel: '消息ID', nameLabel: '消息名称' } - : { title: '创建信号', idLabel: '信号ID', nameLabel: '信号名称' }; + ? { + title: isEdit ? '编辑消息' : '创建消息', + idLabel: '消息ID', + nameLabel: '消息名称', + } + : { + title: isEdit ? '编辑信号' : '创建信号', + idLabel: '信号ID', + nameLabel: '信号名称', + }; }); const bpmnInstances = () => (window as any)?.bpmnInstances; +// 生成规范化的ID +const generateStandardId = (type: string): string => { + const prefix = type === 'message' ? 'Message_' : 'Signal_'; + const timestamp = Date.now(); + const random = Math.random().toString(36).substring(2, 6).toUpperCase(); + return `${prefix}${timestamp}_${random}`; +}; + const initDataList = () => { // console.log(window, 'window'); rootElements.value = bpmnInstances().modeler.getDefinitions().rootElements; @@ -48,35 +67,104 @@ const initDataList = () => { } }); }; + const openModel = (type: any) => { modelType.value = type; - modelObjectForm.value = {}; + editingIndex.value = -1; + modelObjectForm.value = { + id: generateStandardId(type), + name: '', + }; dialogVisible.value = true; }; + +const openEditModel = (type: any, row: any, index: number) => { + modelType.value = type; + editingIndex.value = index; + modelObjectForm.value = { ...row }; + dialogVisible.value = true; +}; + const addNewObject = () => { if (modelType.value === 'message') { - if (messageIdMap.value[modelObjectForm.value.id]) { - message.error('该消息已存在,请修改id后重新保存'); + // 编辑模式 + if (editingIndex.value === -1) { + // 新建模式 + if (messageIdMap.value[modelObjectForm.value.id]) { + message.error('该消息已存在,请修改id后重新保存'); + return; + } + const messageRef = bpmnInstances().moddle.create( + 'bpmn:Message', + modelObjectForm.value, + ); + rootElements.value.push(messageRef); + } else { + const targetMessage = messageList.value[editingIndex.value]; + // 查找 rootElements 中的原始对象 + const rootMessage = rootElements.value.find( + (el: any) => el.$type === 'bpmn:Message' && el.id === targetMessage.id, + ); + if (rootMessage) { + rootMessage.id = modelObjectForm.value.id; + rootMessage.name = modelObjectForm.value.name; + } } - const messageRef = bpmnInstances().moddle.create( - 'bpmn:Message', - modelObjectForm.value, - ); - rootElements.value.push(messageRef); } else { - if (signalIdMap.value[modelObjectForm.value.id]) { - message.error('该信号已存在,请修改id后重新保存'); + // 编辑模式 + if (editingIndex.value === -1) { + // 新建模式 + if (signalIdMap.value[modelObjectForm.value.id]) { + message.error('该信号已存在,请修改id后重新保存'); + return; + } + const signalRef = bpmnInstances().moddle.create( + 'bpmn:Signal', + modelObjectForm.value, + ); + rootElements.value.push(signalRef); + } else { + const targetSignal = signalList.value[editingIndex.value]; + // 查找 rootElements 中的原始对象 + const rootSignal = rootElements.value.find( + (el: any) => el.$type === 'bpmn:Signal' && el.id === targetSignal.id, + ); + if (rootSignal) { + rootSignal.id = modelObjectForm.value.id; + rootSignal.name = modelObjectForm.value.name; + } } - const signalRef = bpmnInstances().moddle.create( - 'bpmn:Signal', - modelObjectForm.value, - ); - rootElements.value.push(signalRef); } dialogVisible.value = false; initDataList(); }; +// 补充"编辑"、"移除"功能。相关 issue:https://github.com/YunaiV/yudao-cloud/issues/270 +const removeObject = (type: any, row: any) => { + Modal.confirm({ + title: '提示', + content: `确认移除该${type === 'message' ? '消息' : '信号'}吗?`, + okText: '确 认', + cancelText: '取 消', + onOk() { + // 从 rootElements 中移除 + const targetType = type === 'message' ? 'bpmn:Message' : 'bpmn:Signal'; + const elementIndex = rootElements.value.findIndex( + (el: any) => el.$type === targetType && el.id === row.id, + ); + if (elementIndex !== -1) { + rootElements.value.splice(elementIndex, 1); + } + // 刷新列表 + initDataList(); + message.success('移除成功'); + }, + onCancel() { + // console.info('操作取消'); + }, + }); +}; + onMounted(() => { initDataList(); }); @@ -103,6 +191,26 @@ onMounted(() => { + + +
@@ -124,6 +232,26 @@ onMounted(() => { + + + +import { computed, ref, watch } from 'vue'; + +import { IconifyIcon } from '@vben/icons'; + +import { Button, Input, Modal } from 'ant-design-vue'; + +defineOptions({ name: 'HttpHeaderEditor' }); + +const props = defineProps({ + modelValue: { + type: Boolean, + default: false, + }, + headers: { + type: String, + default: '', + }, +}); + +const emit = defineEmits(['update:modelValue', 'save']); + +interface HeaderItem { + key: string; + value: string; +} + +const dialogVisible = computed({ + get: () => props.modelValue, + set: (val) => emit('update:modelValue', val), +}); + +const headerList = ref([]); + +// 解析请求头字符串为列表 +const parseHeaders = (headersStr: string): HeaderItem[] => { + if (!headersStr || !headersStr.trim()) { + return [{ key: '', value: '' }]; + } + + const lines = headersStr.split('\n').filter((line) => line.trim()); + const parsed = lines.map((line) => { + const colonIndex = line.indexOf(':'); + if (colonIndex > 0) { + return { + key: line.slice(0, Math.max(0, colonIndex)).trim(), + value: line.slice(Math.max(0, colonIndex + 1)).trim(), + }; + } + return { key: line.trim(), value: '' }; + }); + + return parsed.length > 0 ? parsed : [{ key: '', value: '' }]; +}; + +// 将列表转换为请求头字符串 +const stringifyHeaders = (headers: HeaderItem[]): string => { + return headers + .filter((item) => item.key.trim()) + .map((item) => `${item.key}: ${item.value}`) + .join('\n'); +}; + +// 添加请求头 +const addHeader = () => { + headerList.value.push({ key: '', value: '' }); +}; + +// 移除请求头 +const removeHeader = (index: number) => { + if (headerList.value.length === 1) { + // 至少保留一行 + headerList.value = [{ key: '', value: '' }]; + } else { + headerList.value.splice(index, 1); + } +}; + +// 保存 +const handleSave = () => { + const headersStr = stringifyHeaders(headerList.value); + emit('save', headersStr); + dialogVisible.value = false; +}; + +// 关闭 +const handleClose = () => { + dialogVisible.value = false; +}; + +// 监听对话框打开,初始化数据 +watch( + () => props.modelValue, + (val) => { + if (val) { + headerList.value = parseHeaders(props.headers); + } + }, + { immediate: true }, +); + + + + + diff --git a/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/penal/task/task-components/ServiceTask.vue b/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/penal/task/task-components/ServiceTask.vue index 0241d0bb6..7c2092beb 100644 --- a/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/penal/task/task-components/ServiceTask.vue +++ b/apps/web-antd/src/views/bpm/components/bpmn-process-designer/package/penal/task/task-components/ServiceTask.vue @@ -1,7 +1,21 @@