From c1ffed6e2ded21050ab59fea59b72e9cd9242b91 Mon Sep 17 00:00:00 2001 From: zhouz <> Date: Wed, 15 Jul 2026 17:43:47 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=BC=96=E7=A0=81?= =?UTF-8?q?=E8=A7=84=E5=88=99=E8=A1=A8=E5=8D=95=E4=BA=A4=E4=BA=92=E9=97=AE?= =?UTF-8?q?=E9=A2=98=EF=BC=8C=E6=96=B0=E5=A2=9E=E5=88=86=E6=AE=B5=E7=BC=96?= =?UTF-8?q?=E8=BE=91=E5=99=A8=E7=BB=84=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Textarea组件名修正为 Input + type:textarea - 新增 SegmentEditor 交互式分段配置组件(选择类型、配置参数、拖拽排序) - 修复搜索表单 query 回调缺失 formValues 参数 - 移除不支持的 help schema 属性 --- .../base/codegen/components/SegmentEditor.vue | 303 ++++++++++++++++++ .../src/views/base/codegen/data.ts | 34 +- .../src/views/base/codegen/index.vue | 18 +- .../src/views/base/codegen/modules/form.vue | 44 ++- 4 files changed, 355 insertions(+), 44 deletions(-) create mode 100644 nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/base/codegen/components/SegmentEditor.vue diff --git a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/base/codegen/components/SegmentEditor.vue b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/base/codegen/components/SegmentEditor.vue new file mode 100644 index 00000000..0ccd0a6a --- /dev/null +++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/base/codegen/components/SegmentEditor.vue @@ -0,0 +1,303 @@ + + + + + + + + + + {{ seg.type }} + + + {{ getSegmentSummary(seg) }} + + + + + ↑ + + + ↓ + + 编辑 + 删除 + + + + + + + + + 选择段类型: + + {{ opt.label }} + + + + + + + {{ isNewSegment ? '新增' : '编辑' }} + {{ typeOptions.find((t) => t.value === editingType.value)?.label }} + + + + + + 固定前缀值 + + + + + + + + 日期格式 + + + + + + + + + 重置维度 + + + + 起始值 + + + + 补位长度 + + + + 补位字符 + + + + 最大值上限 + + + + + + + + {{ isNewSegment ? '添加' : '保存' }} + + 取消 + + + + + + + + 添加分段 + + + + + diff --git a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/base/codegen/data.ts b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/base/codegen/data.ts index c79735dd..3dfd9382 100644 --- a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/base/codegen/data.ts +++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/base/codegen/data.ts @@ -23,7 +23,7 @@ const STATUS_OPTIONS = [ { label: '禁用', value: 1 }, ]; -/** 新增/修改的表单 */ +/** 新增/修改的表单(不含 segments,segments 使用自定义组件) */ export function useFormSchema(): VbenFormSchema[] { return [ { @@ -52,18 +52,6 @@ export function useFormSchema(): VbenFormSchema[] { placeholder: '请输入规则编码(唯一标识)', }, }, - { - fieldName: 'segments', - label: '分段配置', - rules: 'required', - component: 'Textarea', - componentProps: { - placeholder: - 'JSON数组格式,例如:\n[{"type":"PREFIX","value":"ORD"},{"type":"DATE","format":"yyyyMMdd"},{"type":"SEQUENCE","resetBy":"DAY","startAt":1,"paddingLen":4,"paddingChar":"0","maxValue":9999}]', - rows: 6, - }, - help: 'JSON数组格式。type: PREFIX/DATE/SEQUENCE', - }, { fieldName: 'separator', label: '分隔符', @@ -115,8 +103,9 @@ export function useFormSchema(): VbenFormSchema[] { { fieldName: 'remark', label: '备注', - component: 'Textarea', + component: 'Input', componentProps: { + type: 'textarea', placeholder: '请输入备注', rows: 3, }, @@ -184,10 +173,23 @@ export function useGridColumns(): VxeTableGridOptions[ { field: 'segmentConfig', title: '分段配置', - minWidth: 200, + minWidth: 240, formatter: ({ cellValue }: { cellValue: BaseCodeRuleApi.SegmentConfig[] }) => { if (!cellValue || cellValue.length === 0) return '-'; - return cellValue.map((s) => s.type).join(' + '); + return cellValue + .map((s) => { + switch (s.type) { + case 'PREFIX': + return `前缀:${s.value || ''}`; + case 'DATE': + return `日期(${s.format || 'yyyyMMdd'})`; + case 'SEQUENCE': + return `序号(${s.resetBy || 'DAY'}/${s.paddingLen || 4}位)`; + default: + return s.type; + } + }) + .join(' + '); }, }, { diff --git a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/base/codegen/index.vue b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/base/codegen/index.vue index 8a9b5679..f9e0740f 100644 --- a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/base/codegen/index.vue +++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/base/codegen/index.vue @@ -59,7 +59,6 @@ async function handleDeleteBatch() { duration: 0, }); try { - // 逐个删除 for (const id of checkedIds.value) { await deleteCodeRule(id); } @@ -81,6 +80,9 @@ function handleRowCheckboxChange({ } const [Grid, gridApi] = useVbenVxeGrid({ + formOptions: { + schema: useGridFormSchema(), + }, gridOptions: { columns: useGridColumns(), height: 'auto', @@ -89,13 +91,12 @@ const [Grid, gridApi] = useVbenVxeGrid({ }, proxyConfig: { ajax: { - query: async ({ page }) => { - const params = { + query: async ({ page }, formValues) => { + return await getCodeRulePage({ pageNo: page.currentPage, pageSize: page.pageSize, - ...formData.value, - }; - return await getCodeRulePage(params); + ...formValues, + }); }, }, }, @@ -112,12 +113,7 @@ const [Grid, gridApi] = useVbenVxeGrid({ checkboxAll: handleRowCheckboxChange, checkboxChange: handleRowCheckboxChange, }, - formOptions: { - schema: useGridFormSchema(), - }, }); - -const formData = ref>({}); diff --git a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/base/codegen/modules/form.vue b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/base/codegen/modules/form.vue index 1ed0251b..ac5d92bd 100644 --- a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/base/codegen/modules/form.vue +++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/base/codegen/modules/form.vue @@ -15,6 +15,7 @@ import { } from '#/api/base/codegen'; import { $t } from '#/locales'; +import SegmentEditor from '../components/SegmentEditor.vue'; import { useFormSchema } from '../data'; const emit = defineEmits(['success']); @@ -25,6 +26,9 @@ const getTitle = computed(() => { : $t('ui.actionTitle.create', ['编码规则']); }); +/** segments 独立管理(不在 form schema 中) */ +const segmentsValue = ref([]); + const [Form, formApi] = useVbenForm({ commonConfig: { componentProps: { @@ -44,19 +48,18 @@ const [Modal, modalApi] = useVbenModal({ if (!valid) { return; } + // 校验 segments + if (!segmentsValue.value || segmentsValue.value.length === 0) { + message.error('请至少添加一个分段配置'); + return; + } + modalApi.lock(); const data = (await formApi.getValues()) as Record; - // 处理 segments JSON 字符串 - const submitData: Record = { ...data }; - if (typeof submitData.segments === 'string') { - try { - submitData.segments = JSON.parse(submitData.segments as string); - } catch { - message.error('分段配置 JSON 格式不正确'); - modalApi.unlock(); - return; - } - } + const submitData: Record = { + ...data, + segments: segmentsValue.value, + }; try { await (formData.value?.id ? updateCodeRule(submitData as BaseCodeRuleApi.CodeRule) @@ -71,24 +74,24 @@ const [Modal, modalApi] = useVbenModal({ async onOpenChange(isOpen: boolean) { if (!isOpen) { formData.value = undefined; + segmentsValue.value = []; return; } const data = modalApi.getData(); if (!data || !data.id) { await formApi.setValues(data); + segmentsValue.value = []; return; } modalApi.lock(); try { formData.value = await getCodeRule(data.id); - // segments 数组转 JSON 字符串用于表单展示 - const values = { + const values: Record = { ...formData.value, - segments: formData.value?.segments - ? JSON.stringify(formData.value.segments) - : '', }; + delete values.segments; await formApi.setValues(values); + segmentsValue.value = formData.value?.segments || []; } finally { modalApi.unlock(); } @@ -98,6 +101,13 @@ const [Modal, modalApi] = useVbenModal({ - + + + + + 分段配置 * + + +