From eb9b1c936460d4cd13cdd81b116eedabd80c5a4c Mon Sep 17 00:00:00 2001 From: YunaiV Date: Fri, 26 Jun 2026 17:30:58 -0700 Subject: [PATCH] =?UTF-8?q?fix(vben):=20=E4=BF=AE=E5=A4=8D=20antdv-next=20?= =?UTF-8?q?=E4=B8=8E=20ele=20=E7=AB=AF=E5=B7=AE=E5=BC=82=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 修复 pay 收银台二维码展示:ele 使用 useQRCode 渲染协议串二维码,并补齐两端 QR 弹窗打开逻辑 - 修复 ele 端 mp 消息语音、视频播放器组件对调问题 - 修复 ele 端 ERP 库存单据商品、仓库下拉选项不渲染问题 - 修复 ele 端系统菜单组件路径搜索过滤逻辑 - 修复 ele 端 IM 表情包抽屉打开后不加载表情列表问题 - 修复 ele 端文件配置 loading 关闭路径,避免成功或异常后持续转圈 - 修复 ele 端客户公海、合同配置等 CRM 表单文案不可见问题,并保持两端数字校验一致 - 修复 BPM、商城、字典等页面的组件适配和条件判断差异 - 启用 web-antdv-next typecheck 脚本,保持与 web-ele 一致 --- apps/web-antdv-next/package.json | 2 +- .../nodes-config/trigger-node-config.vue | 4 +- .../bpm/model/form/modules/basic-info.vue | 1 + .../src/views/crm/business/detail/index.vue | 54 ++++++----- .../src/views/crm/contract/config/data.ts | 8 +- .../src/views/crm/customer/poolConfig/data.ts | 20 ++-- .../components/mobile/product-card/index.vue | 2 +- .../views/mp/components/wx-msg/msg-event.vue | 3 + .../src/views/pay/cashier/index.vue | 1 + .../penal/task/task-components/UserTask.vue | 96 ++++++++++--------- .../child-process-node-config.vue | 24 ++++- .../nodes-config/trigger-node-config.vue | 4 +- .../form/modules/custom-print-template.vue | 2 +- .../detail/modules/signature.vue | 1 + .../detail/modules/task-list.vue | 1 + .../erp/stock/check/modules/item-form.vue | 24 +++-- .../views/erp/stock/in/modules/item-form.vue | 24 +++-- .../erp/stock/move/modules/item-form.vue | 35 +++++-- .../views/erp/stock/out/modules/item-form.vue | 24 +++-- .../manager/face/pack/modules/item-drawer.vue | 2 +- .../src/views/infra/fileConfig/index.vue | 7 +- .../product/category/components/select.vue | 2 +- .../mobile/coupon-card/property.vue | 2 + .../mobile/promotion-point/property.vue | 1 + .../components/mobile/title-bar/property.vue | 1 + .../promotion/components/diy-editor/index.vue | 1 + .../promotion/components/draggable/index.vue | 5 +- .../promotion/diy/template/decorate/index.vue | 2 +- .../statistics/trade/modules/trend-card.vue | 2 +- .../brokerage/user/modules/create-form.vue | 1 + .../brokerage/user/modules/update-form.vue | 1 + .../src/views/mall/trade/order/index.vue | 3 +- .../views/mes/md/workstation/modules/form.vue | 6 +- .../src/views/mp/components/wx-msg/msg.vue | 4 +- .../mp/components/wx-reply/tab-music.vue | 24 ++++- .../views/mp/components/wx-reply/tab-text.vue | 8 +- .../mp/components/wx-reply/tab-video.vue | 10 +- .../views/mp/components/wx-reply/wx-reply.vue | 2 +- apps/web-ele/src/views/pay/cashier/index.vue | 41 +++++--- apps/web-ele/src/views/system/dept/index.vue | 1 + apps/web-ele/src/views/system/dict/data.ts | 2 + .../views/system/dict/modules/data-grid.vue | 8 +- apps/web-ele/src/views/system/menu/data.ts | 2 +- 43 files changed, 303 insertions(+), 165 deletions(-) diff --git a/apps/web-antdv-next/package.json b/apps/web-antdv-next/package.json index 89894ed58..257e584dc 100644 --- a/apps/web-antdv-next/package.json +++ b/apps/web-antdv-next/package.json @@ -20,7 +20,7 @@ "build:analyze": "pnpm vite build --mode analyze", "dev": "pnpm vite --mode development", "preview": "vite preview", - "#typecheck": "cross-env NODE_OPTIONS=--max-old-space-size=8192 vue-tsc --noEmit --skipLibCheck --incremental --tsBuildInfoFile node_modules/.cache/vue-tsc/tsconfig.tsbuildinfo" + "typecheck": "cross-env NODE_OPTIONS=--max-old-space-size=8192 vue-tsc --noEmit --skipLibCheck --incremental --tsBuildInfoFile node_modules/.cache/vue-tsc/tsconfig.tsbuildinfo" }, "imports": { "#/*": "./src/*" diff --git a/apps/web-antdv-next/src/views/bpm/components/simple-process-design/components/nodes-config/trigger-node-config.vue b/apps/web-antdv-next/src/views/bpm/components/simple-process-design/components/nodes-config/trigger-node-config.vue index 2bb33304e..84f9e0d23 100644 --- a/apps/web-antdv-next/src/views/bpm/components/simple-process-design/components/nodes-config/trigger-node-config.vue +++ b/apps/web-antdv-next/src/views/bpm/components/simple-process-design/components/nodes-config/trigger-node-config.vue @@ -258,14 +258,14 @@ function updateFormFieldKey( ) { if (!formSetting?.updateFormFields || !newKey) return; const value = formSetting.updateFormFields[oldKey]; - delete formSetting.updateFormFields.oldKey; + delete formSetting.updateFormFields[oldKey]; formSetting.updateFormFields[String(newKey)] = value; } /** 删除修改字段设置项 */ function deleteFormFieldSetting(formSetting: FormTriggerSetting, key: string) { if (!formSetting?.updateFormFields) return; - delete formSetting.updateFormFields.key; + delete formSetting.updateFormFields[key]; } /** 保存配置 */ diff --git a/apps/web-antdv-next/src/views/bpm/model/form/modules/basic-info.vue b/apps/web-antdv-next/src/views/bpm/model/form/modules/basic-info.vue index 35139a19d..82ca508f9 100644 --- a/apps/web-antdv-next/src/views/bpm/model/form/modules/basic-info.vue +++ b/apps/web-antdv-next/src/views/bpm/model/form/modules/basic-info.vue @@ -135,6 +135,7 @@ function openStartDeptSelect() { /** 处理部门选择确认 */ function handleDeptSelectConfirm(depts: SystemDeptApi.Dept[]) { + selectedStartDepts.value = depts; modelData.value = { ...modelData.value, startDeptIds: depts.map((d) => d.id), diff --git a/apps/web-antdv-next/src/views/crm/business/detail/index.vue b/apps/web-antdv-next/src/views/crm/business/detail/index.vue index 166d897f7..00260c353 100644 --- a/apps/web-antdv-next/src/views/crm/business/detail/index.vue +++ b/apps/web-antdv-next/src/views/crm/business/detail/index.vue @@ -8,13 +8,14 @@ import { useRoute, useRouter } from 'vue-router'; import { Page, useVbenModal } from '@vben/common-ui'; import { useTabs } from '@vben/hooks'; -import { Button, Card, TabPane, Tabs } from 'antdv-next'; +import { Card, TabPane, Tabs } from 'antdv-next'; import { getBusiness } from '#/api/crm/business'; import { getOperateLogPage } from '#/api/crm/operateLog'; import { BizTypeEnum } from '#/api/crm/permission'; import { useDescription } from '#/components/description'; import { OperateLog } from '#/components/operate-log'; +import { ACTION_ICON, TableAction } from '#/components/table-action'; import { $t } from '#/locales'; import { ContactDetailsList } from '#/views/crm/contact/components'; import { ContractDetailsList } from '#/views/crm/contract/components'; @@ -108,27 +109,36 @@ onMounted(() => { diff --git a/apps/web-antdv-next/src/views/crm/contract/config/data.ts b/apps/web-antdv-next/src/views/crm/contract/config/data.ts index ad6b5642c..0cd005495 100644 --- a/apps/web-antdv-next/src/views/crm/contract/config/data.ts +++ b/apps/web-antdv-next/src/views/crm/contract/config/data.ts @@ -1,5 +1,7 @@ import type { VbenFormSchema } from '#/adapter/form'; +import { z } from '#/adapter/form'; + export const schema: VbenFormSchema[] = [ { component: 'RadioGroup', @@ -14,17 +16,17 @@ export const schema: VbenFormSchema[] = [ defaultValue: true, }, { - component: 'InputNumber', + component: 'Input', fieldName: 'notifyDays', componentProps: { + placeholder: '请输入天数', class: '!w-full', - min: 0, - precision: 0, }, renderComponentContent: () => ({ addonBefore: () => '提前', addonAfter: () => '天提醒', }), + rules: z.coerce.number().int().min(0, '天数不能小于 0'), dependencies: { triggerFields: ['notifyEnabled'], show: (values) => values.notifyEnabled, diff --git a/apps/web-antdv-next/src/views/crm/customer/poolConfig/data.ts b/apps/web-antdv-next/src/views/crm/customer/poolConfig/data.ts index 8c5bbadf6..e36ab0339 100644 --- a/apps/web-antdv-next/src/views/crm/customer/poolConfig/data.ts +++ b/apps/web-antdv-next/src/views/crm/customer/poolConfig/data.ts @@ -1,5 +1,7 @@ import type { VbenFormSchema } from '#/adapter/form'; +import { z } from '#/adapter/form'; + export const schema: VbenFormSchema[] = [ { component: 'RadioGroup', @@ -13,33 +15,33 @@ export const schema: VbenFormSchema[] = [ }, }, { - component: 'InputNumber', + component: 'Input', fieldName: 'contactExpireDays', componentProps: { + placeholder: '请输入天数', class: '!w-full', - min: 0, - precision: 0, }, renderComponentContent: () => ({ addonAfter: () => '天不跟进或', }), + rules: z.coerce.number().int().min(0, '天数不能小于 0'), dependencies: { triggerFields: ['enabled'], show: (value) => value.enabled, }, }, { - component: 'InputNumber', + component: 'Input', fieldName: 'dealExpireDays', renderComponentContent: () => ({ addonBefore: () => '或', addonAfter: () => '天未成交', }), componentProps: { + placeholder: '请输入天数', class: '!w-full', - min: 0, - precision: 0, }, + rules: z.coerce.number().int().min(0, '天数不能小于 0'), dependencies: { triggerFields: ['enabled'], show: (value) => value.enabled, @@ -62,17 +64,17 @@ export const schema: VbenFormSchema[] = [ defaultValue: false, }, { - component: 'InputNumber', + component: 'Input', fieldName: 'notifyDays', componentProps: { + placeholder: '请输入天数', class: '!w-full', - min: 0, - precision: 0, }, renderComponentContent: () => ({ addonBefore: () => '提前', addonAfter: () => '天提醒', }), + rules: z.coerce.number().int().min(0, '天数不能小于 0'), dependencies: { triggerFields: ['notifyEnabled'], show: (value) => value.enabled && value.notifyEnabled, diff --git a/apps/web-antdv-next/src/views/mall/promotion/components/diy-editor/components/mobile/product-card/index.vue b/apps/web-antdv-next/src/views/mall/promotion/components/diy-editor/components/mobile/product-card/index.vue index 256570049..fcfbde3f2 100644 --- a/apps/web-antdv-next/src/views/mall/promotion/components/diy-editor/components/mobile/product-card/index.vue +++ b/apps/web-antdv-next/src/views/mall/promotion/components/diy-editor/components/mobile/product-card/index.vue @@ -99,7 +99,7 @@ function calculateWidth() { :class="[ { 'w-full': property.layoutType !== 'oneColSmallImg', - 'w-[calc(100vh-140px-16px)]': + 'w-[calc(100%-140px-16px)]': property.layoutType === 'oneColSmallImg', }, ]" diff --git a/apps/web-antdv-next/src/views/mp/components/wx-msg/msg-event.vue b/apps/web-antdv-next/src/views/mp/components/wx-msg/msg-event.vue index e94736e0c..bfe3b1f4b 100644 --- a/apps/web-antdv-next/src/views/mp/components/wx-msg/msg-event.vue +++ b/apps/web-antdv-next/src/views/mp/components/wx-msg/msg-event.vue @@ -44,6 +44,9 @@ defineProps<{
选择地理位置
+
+ 扫码 +
未知事件类型
diff --git a/apps/web-antdv-next/src/views/pay/cashier/index.vue b/apps/web-antdv-next/src/views/pay/cashier/index.vue index 0c409d8f0..7d7a12e65 100644 --- a/apps/web-antdv-next/src/views/pay/cashier/index.vue +++ b/apps/web-antdv-next/src/views/pay/cashier/index.vue @@ -213,6 +213,7 @@ function displayQrCode(channelCode: string, data: any) { url: data.displayContent, visible: true, }; + modalApi.open(); } /** 提交支付后(App) */ diff --git a/apps/web-ele/src/views/bpm/components/bpmn-process-designer/package/penal/task/task-components/UserTask.vue b/apps/web-ele/src/views/bpm/components/bpmn-process-designer/package/penal/task/task-components/UserTask.vue index d9f8fd7fc..066c04759 100644 --- a/apps/web-ele/src/views/bpm/components/bpmn-process-designer/package/penal/task/task-components/UserTask.vue +++ b/apps/web-ele/src/views/bpm/components/bpmn-process-designer/package/penal/task/task-components/UserTask.vue @@ -126,51 +126,56 @@ const resetTaskForm = () => { (ex: any) => ex.$type === `${prefix}:CandidateParam`, )?.value; if (candidateParamStr && candidateParamStr.length > 0) { - if (userTaskForm.value.candidateStrategy === CandidateStrategy.EXPRESSION) { - // 特殊:流程表达式,只有一个 input 输入框 - // @ts-expect-error: expression strategy stores a scalar in an array-shaped field - userTaskForm.value.candidateParam = [candidateParamStr]; - } else if ( - userTaskForm.value.candidateStrategy === - CandidateStrategy.MULTI_LEVEL_DEPT_LEADER - ) { - // 特殊:多级不部门负责人,需要通过'|'分割 - userTaskForm.value.candidateParam = candidateParamStr - .split('|')[0] - .split(',') - .map((item: any) => { - // 如果数字超出了最大安全整数范围,则将其作为字符串处理 - const num = Number(item); - return num > Number.MAX_SAFE_INTEGER || num < -Number.MAX_SAFE_INTEGER - ? item - : num; - }); - deptLevel.value = +candidateParamStr.split('|')[1]; - } else if ( - userTaskForm.value.candidateStrategy === - CandidateStrategy.START_USER_DEPT_LEADER || - userTaskForm.value.candidateStrategy === - CandidateStrategy.START_USER_MULTI_LEVEL_DEPT_LEADER - ) { - // @ts-expect-error: dynamic candidate param shape varies by strategy - userTaskForm.value.candidateParam = +candidateParamStr; - deptLevel.value = +candidateParamStr; - } else if ( - userTaskForm.value.candidateStrategy === - CandidateStrategy.FORM_DEPT_LEADER - ) { - userTaskForm.value.candidateParam = candidateParamStr.split('|')[0]; - deptLevel.value = +candidateParamStr.split('|')[1]; - } else { - userTaskForm.value.candidateParam = candidateParamStr - .split(',') - .map((item: any) => { - // 如果数字超出了最大安全整数范围,则将其作为字符串处理 - const num = Number(item); - return num > Number.MAX_SAFE_INTEGER || num < -Number.MAX_SAFE_INTEGER - ? item - : num; - }); + const candidateStrategy = userTaskForm.value.candidateStrategy as + | CandidateStrategy + | undefined; + switch (candidateStrategy) { + case CandidateStrategy.EXPRESSION: { + // 特殊:流程表达式,只有一个 input 输入框 + // @ts-expect-error: expression strategy stores a scalar in an array-shaped field + userTaskForm.value.candidateParam = [candidateParamStr]; + break; + } + case CandidateStrategy.FORM_DEPT_LEADER: { + userTaskForm.value.candidateParam = candidateParamStr.split('|')[0]; + deptLevel.value = +candidateParamStr.split('|')[1]; + break; + } + case CandidateStrategy.MULTI_LEVEL_DEPT_LEADER: { + // 特殊:多级不部门负责人,需要通过'|'分割 + userTaskForm.value.candidateParam = candidateParamStr + .split('|')[0] + .split(',') + .map((item: any) => { + // 如果数字超出了最大安全整数范围,则将其作为字符串处理 + const num = Number(item); + return num > Number.MAX_SAFE_INTEGER || + num < -Number.MAX_SAFE_INTEGER + ? item + : num; + }); + deptLevel.value = +candidateParamStr.split('|')[1]; + break; + } + case CandidateStrategy.START_USER_DEPT_LEADER: + case CandidateStrategy.START_USER_MULTI_LEVEL_DEPT_LEADER: { + // @ts-expect-error: dynamic candidate param shape varies by strategy + userTaskForm.value.candidateParam = +candidateParamStr; + deptLevel.value = +candidateParamStr; + break; + } + default: { + userTaskForm.value.candidateParam = candidateParamStr + .split(',') + .map((item: any) => { + // 如果数字超出了最大安全整数范围,则将其作为字符串处理 + const num = Number(item); + return num > Number.MAX_SAFE_INTEGER || + num < -Number.MAX_SAFE_INTEGER + ? item + : num; + }); + } } } else { userTaskForm.value.candidateParam = []; @@ -402,7 +407,6 @@ onBeforeUnmount(() => { :props="defaultProps" placeholder="加载中,请稍后" multiple - check-strictly show-checkbox @change="updateElementTask" /> diff --git a/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/child-process-node-config.vue b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/child-process-node-config.vue index a23f97c19..e08e63a83 100644 --- a/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/child-process-node-config.vue +++ b/apps/web-ele/src/views/bpm/components/simple-process-design/components/nodes-config/child-process-node-config.vue @@ -9,6 +9,22 @@ import { useVbenDrawer } from '@vben/common-ui'; import { BpmNodeTypeEnum } from '@vben/constants'; import { IconifyIcon } from '@vben/icons'; +import { + ElButton, + ElDatePicker, + ElDivider, + ElForm, + ElFormItem, + ElInput, + ElInputNumber, + ElOption, + ElRadio, + ElRadioButton, + ElRadioGroup, + ElSelect, + ElSwitch, +} from 'element-plus'; + import { getForm } from '#/api/bpm/form'; import { getModelList } from '#/api/bpm/model'; @@ -442,7 +458,7 @@ onMounted(async () => { >
diff --git a/apps/web-ele/src/views/bpm/processInstance/detail/modules/signature.vue b/apps/web-ele/src/views/bpm/processInstance/detail/modules/signature.vue index c89cbbcb9..e670c801d 100644 --- a/apps/web-ele/src/views/bpm/processInstance/detail/modules/signature.vue +++ b/apps/web-ele/src/views/bpm/processInstance/detail/modules/signature.vue @@ -5,6 +5,7 @@ import { useVbenModal } from '@vben/common-ui'; import { IconifyIcon } from '@vben/icons'; import { base64ToFile } from '@vben/utils'; +import { ElButton, ElTooltip } from 'element-plus'; import Vue3Signature from 'vue3-signature'; import { uploadFile } from '#/api/infra/file'; diff --git a/apps/web-ele/src/views/bpm/processInstance/detail/modules/task-list.vue b/apps/web-ele/src/views/bpm/processInstance/detail/modules/task-list.vue index b522d119d..af0b2d5fe 100644 --- a/apps/web-ele/src/views/bpm/processInstance/detail/modules/task-list.vue +++ b/apps/web-ele/src/views/bpm/processInstance/detail/modules/task-list.vue @@ -9,6 +9,7 @@ import { DICT_TYPE } from '@vben/constants'; import { IconifyIcon } from '@vben/icons'; import FormCreate from '@form-create/element-ui'; +import { ElButton } from 'element-plus'; import { useVbenVxeGrid } from '#/adapter/vxe-table'; import { getTaskListByProcessInstanceId } from '#/api/bpm/task'; diff --git a/apps/web-ele/src/views/erp/stock/check/modules/item-form.vue b/apps/web-ele/src/views/erp/stock/check/modules/item-form.vue index 545c1a6f3..0474714cf 100644 --- a/apps/web-ele/src/views/erp/stock/check/modules/item-form.vue +++ b/apps/web-ele/src/views/erp/stock/check/modules/item-form.vue @@ -10,7 +10,7 @@ import { erpPriceMultiply, } from '@vben/utils'; -import { ElInput, ElInputNumber, ElSelect } from 'element-plus'; +import { ElInput, ElInputNumber, ElOption, ElSelect } from 'element-plus'; import { TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; import { getProductSimpleList } from '#/api/erp/product/product'; @@ -219,26 +219,36 @@ onMounted(async () => {