From aaa821fbee2bd4d42b312b3d97d6db5ef5f5206b Mon Sep 17 00:00:00 2001 From: puhui999 Date: Wed, 24 Sep 2025 11:07:34 +0800 Subject: [PATCH 1/5] =?UTF-8?q?fix:=E3=80=90antd=E3=80=91=E7=A7=BB?= =?UTF-8?q?=E9=99=A4=20bpmn-process-designer=20=E4=B8=8D=E5=BF=85=E8=A6=81?= =?UTF-8?q?=E7=9A=84=E7=BC=96=E8=AF=91=E5=99=A8=E5=AE=8F=E5=AF=BC=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../package/designer/ProcessDesigner.vue | 12 +----------- .../package/designer/ProcessViewer.vue | 2 +- .../penal/custom-config/ElementCustomConfig.vue | 2 +- .../custom-config/components/BoundaryEventTimer.vue | 10 +--------- .../penal/task/task-components/ScriptTask.vue | 10 +--------- 5 files changed, 5 insertions(+), 31 deletions(-) diff --git a/apps/web-antd/src/components/bpmn-process-designer/package/designer/ProcessDesigner.vue b/apps/web-antd/src/components/bpmn-process-designer/package/designer/ProcessDesigner.vue index fba2a575d..76d607cdb 100644 --- a/apps/web-antd/src/components/bpmn-process-designer/package/designer/ProcessDesigner.vue +++ b/apps/web-antd/src/components/bpmn-process-designer/package/designer/ProcessDesigner.vue @@ -4,17 +4,7 @@ // import 'bpmn-js/dist/assets/bpmn-font/css/bpmn-codes.css' // import 'bpmn-js/dist/assets/bpmn-font/css/bpmn-embedded.css' // import 'bpmn-js-properties-panel/dist/assets/bpmn-js-properties-panel.css' // 右侧框样式 -import { - computed, - defineEmits, - defineOptions, - defineProps, - h, - onBeforeUnmount, - onMounted, - provide, - ref, -} from 'vue'; +import { computed, h, onBeforeUnmount, onMounted, provide, ref } from 'vue'; import { AlignLeftOutlined, diff --git a/apps/web-antd/src/components/bpmn-process-designer/package/designer/ProcessViewer.vue b/apps/web-antd/src/components/bpmn-process-designer/package/designer/ProcessViewer.vue index 4fe854080..4fdca3d86 100644 --- a/apps/web-antd/src/components/bpmn-process-designer/package/designer/ProcessViewer.vue +++ b/apps/web-antd/src/components/bpmn-process-designer/package/designer/ProcessViewer.vue @@ -1,5 +1,5 @@ + + diff --git a/apps/web-antd/src/components/upload/typing.ts b/apps/web-antd/src/components/upload/typing.ts index 90134ff6f..ada73d244 100644 --- a/apps/web-antd/src/components/upload/typing.ts +++ b/apps/web-antd/src/components/upload/typing.ts @@ -21,10 +21,12 @@ export interface FileUploadProps { // 上传的目录 directory?: string; disabled?: boolean; + drag?: boolean; // 是否支持拖拽上传 helpText?: string; listType?: UploadListType; // 最大数量的文件,Infinity不限制 maxNumber?: number; + modelValue?: string | string[]; // v-model 支持 // 文件最大多少MB maxSize?: number; // 是否支持多选 -- Gitee From 510825bb49e9f7684092a70a7e469b1b7abf52ef Mon Sep 17 00:00:00 2001 From: puhui999 Date: Thu, 25 Sep 2025 11:29:10 +0800 Subject: [PATCH 4/5] =?UTF-8?q?feat:=E3=80=90antd=E3=80=91=E5=9B=BE?= =?UTF-8?q?=E7=89=87=E4=B8=8A=E4=BC=A0=E7=BB=84=E4=BB=B6=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=20modelValue=20=E5=8F=82=E6=95=B0=E9=80=82=E9=85=8D=EF=BC=8C?= =?UTF-8?q?=E5=90=8C=E6=97=B6=E6=94=AF=E6=8C=81=20modelValue=20=E5=92=8C?= =?UTF-8?q?=20value=20=E5=8F=82=E6=95=B0=EF=BC=88=E9=80=82=E9=85=8D=20Form?= =?UTF-8?q?Create=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/upload/image-upload.vue | 106 ++++++++++++++++-- 1 file changed, 95 insertions(+), 11 deletions(-) diff --git a/apps/web-antd/src/components/upload/image-upload.vue b/apps/web-antd/src/components/upload/image-upload.vue index db9928ba4..4f0e9d1bf 100644 --- a/apps/web-antd/src/components/upload/image-upload.vue +++ b/apps/web-antd/src/components/upload/image-upload.vue @@ -6,7 +6,7 @@ import type { FileUploadProps } from './typing'; import type { AxiosProgressEvent } from '#/api/infra/file'; -import { ref, toRefs, watch } from 'vue'; +import { computed, ref, toRefs, watch } from 'vue'; import { IconifyIcon } from '@vben/icons'; import { $t } from '@vben/locales'; @@ -22,6 +22,7 @@ defineOptions({ name: 'ImageUpload', inheritAttrs: false }); const props = withDefaults(defineProps(), { value: () => [], + modelValue: undefined, directory: undefined, disabled: false, listType: 'picture-card', @@ -34,7 +35,12 @@ const props = withDefaults(defineProps(), { resultField: '', showDescription: true, }); -const emit = defineEmits(['change', 'update:value', 'delete']); +const emit = defineEmits([ + 'change', + 'update:value', + 'update:modelValue', + 'delete', +]); const { accept, helpText, maxNumber, maxSize } = toRefs(props); const isInnerOperate = ref(false); const { getStringAccept } = useUploadType({ @@ -43,6 +49,16 @@ const { getStringAccept } = useUploadType({ maxNumberRef: maxNumber, maxSizeRef: maxSize, }); + +// 计算当前绑定的值,优先使用 modelValue +const currentValue = computed(() => { + return props.modelValue === undefined ? props.value : props.modelValue; +}); + +// 判断是否使用 modelValue +const isUsingModelValue = computed(() => { + return props.modelValue !== undefined; +}); const previewOpen = ref(false); // 是否展示预览 const previewImage = ref(''); // 预览图片 const previewTitle = ref(''); // 预览标题 @@ -51,9 +67,11 @@ const fileList = ref([]); const isLtMsg = ref(true); // 文件大小错误提示 const isActMsg = ref(true); // 文件类型错误提示 const isFirstRender = ref(true); // 是否第一次渲染 +const uploadNumber = ref(0); // 上传文件计数器 +const uploadList = ref([]); // 临时上传列表 watch( - () => props.value, + currentValue, async (v) => { if (isInnerOperate.value) { isInnerOperate.value = false; @@ -122,6 +140,7 @@ async function handleRemove(file: UploadFile) { const value = getValue(); isInnerOperate.value = true; emit('update:value', value); + emit('update:modelValue', value); emit('change', value); emit('delete', file); } @@ -133,6 +152,12 @@ function handleCancel() { } async function beforeUpload(file: File) { + // 检查文件数量限制 + if (fileList.value!.length >= props.maxNumber) { + message.error($t('ui.upload.maxNumber', [props.maxNumber])); + return Upload.LIST_IGNORE; + } + const { maxSize, accept } = props; const isAct = checkImgType(file, accept); if (!isAct) { @@ -140,6 +165,7 @@ async function beforeUpload(file: File) { isActMsg.value = false; // 防止弹出多个错误提示 setTimeout(() => (isActMsg.value = true), 1000); + return Upload.LIST_IGNORE; } const isLt = file.size / 1024 / 1024 > maxSize; if (isLt) { @@ -147,8 +173,12 @@ async function beforeUpload(file: File) { isLtMsg.value = false; // 防止弹出多个错误提示 setTimeout(() => (isLtMsg.value = true), 1000); + return Upload.LIST_IGNORE; } - return (isAct && !isLt) || Upload.LIST_IGNORE; + + // 只有在验证通过后才增加计数器 + uploadNumber.value++; + return true; } async function customRequest(info: UploadRequestOption) { @@ -163,20 +193,59 @@ async function customRequest(info: UploadRequestOption) { info.onProgress!({ percent }); }; const res = await api?.(info.file as File, progressEvent); + + // 处理上传成功后的逻辑 + handleUploadSuccess(res, info.file as File); + info.onSuccess!(res); message.success($t('ui.upload.uploadSuccess')); + } catch (error: any) { + console.error(error); + info.onError!(error); + handleUploadError(error); + } +} - // 更新文件 +// 处理上传成功 +function handleUploadSuccess(res: any, file: File) { + // 删除临时文件 + const index = fileList.value?.findIndex((item) => item.name === file.name); + if (index !== -1) { + fileList.value?.splice(index!, 1); + } + + // 添加到临时上传列表 + const fileUrl = res?.url || res?.data || res; + uploadList.value.push({ + name: file.name, + url: fileUrl, + status: UploadResultStatus.DONE, + uid: file.name + Date.now(), + }); + + // 检查是否所有文件都上传完成 + if (uploadList.value.length >= uploadNumber.value) { + fileList.value?.push(...uploadList.value); + uploadList.value = []; + uploadNumber.value = 0; + + // 更新值 const value = getValue(); isInnerOperate.value = true; emit('update:value', value); + emit('update:modelValue', value); emit('change', value); - } catch (error: any) { - console.error(error); - info.onError!(error); } } +// 处理上传错误 +function handleUploadError(error: any) { + console.error('上传错误:', error); + message.error($t('ui.upload.uploadError')); + // 上传失败时减少计数器 + uploadNumber.value = Math.max(0, uploadNumber.value - 1); +} + function getValue() { const list = (fileList.value || []) .filter((item) => item?.status === UploadResultStatus.DONE) @@ -186,11 +255,26 @@ function getValue() { } return item?.url || item?.response?.url || item?.response; }); - // add by 芋艿:【特殊】单个文件的情况,获取首个元素,保证返回的是 String 类型 + + // 单个文件的情况,根据输入参数类型决定返回格式 if (props.maxNumber === 1) { - return list.length > 0 ? list[0] : ''; + const singleValue = list.length > 0 ? list[0] : ''; + // 如果原始值是字符串或 modelValue 是字符串,返回字符串 + if ( + isString(props.value) || + (isUsingModelValue.value && isString(props.modelValue)) + ) { + return singleValue; + } + return singleValue; } - return list; + + // 多文件情况,根据输入参数类型决定返回格式 + if (isUsingModelValue.value) { + return Array.isArray(props.modelValue) ? list : list.join(','); + } + + return Array.isArray(props.value) ? list : list.join(','); } -- Gitee From 1f1a26bc119bce5c714094b02c0ef7bff839d820 Mon Sep 17 00:00:00 2001 From: puhui999 Date: Thu, 25 Sep 2025 11:52:26 +0800 Subject: [PATCH 5/5] =?UTF-8?q?feat:=E3=80=90antd=E3=80=91=E4=BC=98?= =?UTF-8?q?=E5=8C=96=20bpmn-process-designer=20=E7=BB=84=E4=BB=B6=E5=9B=BE?= =?UTF-8?q?=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../package/designer/ProcessDesigner.vue | 2 +- .../penal/listeners/ElementListeners.vue | 4 +-- .../penal/listeners/UserTaskListeners.vue | 6 ++--- .../multi-instance/ElementMultiInstance.vue | 6 ++--- .../package/penal/task/ElementTask.vue | 2 +- .../time-event-config/TimeEventConfig.vue | 27 +++++++++---------- packages/icons/src/iconify/index.ts | 12 --------- 7 files changed, 23 insertions(+), 36 deletions(-) diff --git a/apps/web-antd/src/components/bpmn-process-designer/package/designer/ProcessDesigner.vue b/apps/web-antd/src/components/bpmn-process-designer/package/designer/ProcessDesigner.vue index 76d607cdb..4fce9dacf 100644 --- a/apps/web-antd/src/components/bpmn-process-designer/package/designer/ProcessDesigner.vue +++ b/apps/web-antd/src/components/bpmn-process-designer/package/designer/ProcessDesigner.vue @@ -645,7 +645,7 @@ onBeforeUnmount(() => { type="file" id="files" ref="refFile" - style="display: none" + class="hidden" accept=".xml, .bpmn" @change="importLocalFile" /> diff --git a/apps/web-antd/src/components/bpmn-process-designer/package/penal/listeners/ElementListeners.vue b/apps/web-antd/src/components/bpmn-process-designer/package/penal/listeners/ElementListeners.vue index fc66c9b8d..55d3f545b 100644 --- a/apps/web-antd/src/components/bpmn-process-designer/package/penal/listeners/ElementListeners.vue +++ b/apps/web-antd/src/components/bpmn-process-designer/package/penal/listeners/ElementListeners.vue @@ -1,7 +1,7 @@