From 24aea3e30a28f9f93e33db3f743208aeafb96975 Mon Sep 17 00:00:00 2001 From: puhui999 Date: Wed, 16 Apr 2025 15:26:01 +0800 Subject: [PATCH 1/8] =?UTF-8?q?=E3=80=90=E4=BB=A3=E7=A0=81=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E3=80=91INFRA:=20vue3=5Fvben5=5Fantd=20schema=20?= =?UTF-8?q?=E5=8D=95=E8=A1=A8=E5=92=8C=E6=A0=91=E8=A1=A8=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E7=94=9F=E6=88=90=E6=A8=A1=E7=89=88=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vue3_vben_next/schema/views/data.ts.vm | 6 ++-- .../vue3_vben_next/schema/views/form.vue.vm | 32 +++---------------- .../vue3_vben_next/schema/views/index.vue.vm | 28 +++++++++------- 3 files changed, 24 insertions(+), 42 deletions(-) diff --git a/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben_next/schema/views/data.ts.vm b/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben_next/schema/views/data.ts.vm index 349bf378a5..6877e59c24 100644 --- a/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben_next/schema/views/data.ts.vm +++ b/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben_next/schema/views/data.ts.vm @@ -9,6 +9,7 @@ import { get${simpleClassName}List } from '#/api/${table.moduleName}/${simpleCla import { handleTree } from '#/utils/tree'; #end import { DICT_TYPE, getDictOptions } from '#/utils/dict'; +import { getRangePickerDefaultProps } from '#/utils/date'; import { useAccess } from '@vben/access'; const { hasAccessByCodes } = useAccess(); @@ -196,6 +197,7 @@ export function useGridFormSchema(): VbenFormSchema[] { #elseif($column.htmlType == "datetime") component: 'RangePicker', componentProps: { + ...getRangePickerDefaultProps(), allowClear: true, }, #end @@ -237,7 +239,7 @@ export function useGridColumns( field: 'operation', title: '操作', minWidth: 200, - align: 'right', + align: 'center', fixed: 'right', headerAlign: 'center', showOverflow: false, @@ -251,7 +253,7 @@ export function useGridColumns( options: [ #if (${table.templateType} == 2)## 树表特有操作 { - code: 'add_child', + code: 'append', text: '新增下级', show: hasAccessByCodes(['${table.moduleName}:${simpleClassName_strikeCase}:create']), }, diff --git a/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben_next/schema/views/form.vue.vm b/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben_next/schema/views/form.vue.vm index 9a357427ad..6d25b58a82 100644 --- a/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben_next/schema/views/form.vue.vm +++ b/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben_next/schema/views/form.vue.vm @@ -64,49 +64,25 @@ const [Modal, modalApi] = useVbenModal({ if (!isOpen) { return; } + // 加载数据 -#if (${table.templateType} == 2)## 树表处理传入的父ID let data = modalApi.getData<${simpleClassName}Api.${simpleClassName}>(); -#else## 标准表直接获取 - const data = modalApi.getData<${simpleClassName}Api.${simpleClassName}>(); -#end if (!data) { return; } -#if (${table.templateType} == 2)## 树表特有:处理新增下级的情况 - // 处理新增下级的情况 - if (!data.id && data.${treeParentColumn.javaField}) { - parentId.value = data.${treeParentColumn.javaField}; - formData.value = { ${treeParentColumn.javaField}: parentId.value } as ${simpleClassName}Api.${simpleClassName}; - await formApi.setValues(formData.value); - return; - } -#end - if (data.id) { // 编辑 modalApi.lock(); try { -#if (${table.templateType} == 2)## 树表获取数据后重新赋值 data = await get${simpleClassName}(data.id); - formData.value = data; -#else## 标准表设置表单数据 - formData.value = await get${simpleClassName}(data.id as number); -#end - await formApi.setValues(formData.value); } finally { modalApi.lock(false); } - } else { - // 新增 -#if (${table.templateType} == 2)## 树表特有:设置顶级ID - formData.value = { ${treeParentColumn.javaField}: 0 } as ${simpleClassName}Api.${simpleClassName}; -#else## 标准表:设置空值 - formData.value = data; -#end - await formApi.setValues(formData.value || {}); } + // 设置到 values + formData.value = data; + await formApi.setValues(formData.value); }, }); diff --git a/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben_next/schema/views/index.vue.vm b/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben_next/schema/views/index.vue.vm index 198e1d4c4d..43c2a3730f 100644 --- a/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben_next/schema/views/index.vue.vm +++ b/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben_next/schema/views/index.vue.vm @@ -7,7 +7,7 @@ import { Button, message } from 'ant-design-vue'; import { Download, Plus } from '@vben/icons'; import Form from './modules/form.vue'; -import { ref } from 'vue'; +import { ref, h } from 'vue'; import { $t } from '#/locales'; import { useVbenVxeGrid } from '#/adapter/vxe-table'; #if (${table.templateType} == 2)## 树表接口 @@ -56,7 +56,7 @@ function onEdit(row: ${simpleClassName}Api.${simpleClassName}) { #if (${table.templateType} == 2)## 树表特有:新增下级 /** 新增下级${table.classComment} */ -function onAddChild(row: ${simpleClassName}Api.${simpleClassName}) { +function onAppend(row: ${simpleClassName}Api.${simpleClassName}) { formModalApi.setData({ ${treeParentColumn.javaField}: row.id }).open(); } #end @@ -86,20 +86,20 @@ function onActionClick({ row, }: OnActionClickParams<${simpleClassName}Api.${simpleClassName}>) { switch (code) { - case 'edit': { - onEdit(row); + #if (${table.templateType} == 2)## 树表特有:新增下级 + case 'append': { + onAppend(row); break; } + #end case 'delete': { onDelete(row); break; } -#if (${table.templateType} == 2)## 树表特有:新增下级 - case 'add_child': { - onAddChild(row); + case 'edit': { + onEdit(row); break; } -#end } } @@ -167,12 +167,16 @@ const [Grid, gridApi] = useVbenVxeGrid({ {{ isExpanded ? '收缩' : '展开' }} #end - - From e704f4c7553e30b2c26fb9b6068936fba916c7c2 Mon Sep 17 00:00:00 2001 From: puhui999 Date: Wed, 16 Apr 2025 15:52:20 +0800 Subject: [PATCH 2/8] =?UTF-8?q?=E3=80=90=E4=BB=A3=E7=A0=81=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E3=80=91=E4=BB=A3=E7=A0=81=E7=94=9F=E6=88=90:=20vue3?= =?UTF-8?q?=5Fvben5=5Fantd=20=E6=A8=A1=E7=89=88=E7=9B=AE=E5=BD=95=E8=B0=83?= =?UTF-8?q?=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/codegen/inner/CodegenEngine.java | 16 ++++++++++------ .../general}/index.vue.vm | 0 .../schema/api/api.ts.vm | 0 .../schema/views/data.ts.vm | 0 .../schema/views/form.vue.vm | 0 .../schema/views/index.vue.vm | 0 6 files changed, 10 insertions(+), 6 deletions(-) rename yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/{vue3_vben_next/ant_design_vue => vue3_vben5_antd/general}/index.vue.vm (100%) rename yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/{vue3_vben_next => vue3_vben5_antd}/schema/api/api.ts.vm (100%) rename yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/{vue3_vben_next => vue3_vben5_antd}/schema/views/data.ts.vm (100%) rename yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/{vue3_vben_next => vue3_vben5_antd}/schema/views/form.vue.vm (100%) rename yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/{vue3_vben_next => vue3_vben5_antd}/schema/views/index.vue.vm (100%) diff --git a/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenEngine.java b/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenEngine.java index 65cf236b58..3787f616b1 100644 --- a/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenEngine.java +++ b/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenEngine.java @@ -146,13 +146,13 @@ public class CodegenEngine { vue3FilePath("api/${table.moduleName}/${table.businessName}/index.ts")) // VUE3_VBEN5_ANTD_SCHEMA // TODO @puhui999:目录改成 vue3_vben5_antd;然后里面有 schema(目前我们在写的)和 general(你微信里提的,原生的,感觉也要搞!) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_SCHEMA.getType(), vue3VbenNextSchemaTemplatePath("views/data.ts"), + .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_SCHEMA.getType(), vue3Vben5AntdSchemaTemplatePath("views/data.ts"), vue3FilePath("views/${table.moduleName}/${table.businessName}/data.ts")) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_SCHEMA.getType(), vue3VbenNextSchemaTemplatePath("views/index.vue"), + .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_SCHEMA.getType(), vue3Vben5AntdSchemaTemplatePath("views/index.vue"), vue3FilePath("views/${table.moduleName}/${table.businessName}/index.vue")) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_SCHEMA.getType(), vue3VbenNextSchemaTemplatePath("views/form.vue"), + .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_SCHEMA.getType(), vue3Vben5AntdSchemaTemplatePath("views/form.vue"), vue3FilePath("views/${table.moduleName}/${table.businessName}/modules/form.vue")) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_SCHEMA.getType(), vue3VbenNextSchemaTemplatePath("api/api.ts"), + .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_SCHEMA.getType(), vue3Vben5AntdSchemaTemplatePath("api/api.ts"), vue3FilePath("api/${table.moduleName}/${table.businessName}/index.ts")) // 主子表模板配置 - Vue3 vben5 schema 模版 //.put(CodegenFrontTypeEnum.VUE3_VBEN_NEXT_SCHEMA.getType(), vue3VbenNextSchemaTemplatePath("views/master_slave_data.ts"), @@ -515,8 +515,12 @@ public class CodegenEngine { return "codegen/vue3_vben/" + path + ".vm"; } - private static String vue3VbenNextSchemaTemplatePath(String path) { - return "codegen/vue3_vben_next/schema/" + path + ".vm"; + private static String vue3Vben5AntdSchemaTemplatePath(String path) { + return "codegen/vue3_vben5_antd/schema/" + path + ".vm"; + } + + private static String vue3Vben5AntdGeneralTemplatePath(String path) { + return "codegen/vue3_vben5_antd/general/" + path + ".vm"; } private static boolean isSubTemplate(String path) { diff --git a/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben_next/ant_design_vue/index.vue.vm b/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/general/index.vue.vm similarity index 100% rename from yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben_next/ant_design_vue/index.vue.vm rename to yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/general/index.vue.vm diff --git a/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben_next/schema/api/api.ts.vm b/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/schema/api/api.ts.vm similarity index 100% rename from yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben_next/schema/api/api.ts.vm rename to yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/schema/api/api.ts.vm diff --git a/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben_next/schema/views/data.ts.vm b/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/schema/views/data.ts.vm similarity index 100% rename from yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben_next/schema/views/data.ts.vm rename to yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/schema/views/data.ts.vm diff --git a/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben_next/schema/views/form.vue.vm b/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/schema/views/form.vue.vm similarity index 100% rename from yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben_next/schema/views/form.vue.vm rename to yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/schema/views/form.vue.vm diff --git a/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben_next/schema/views/index.vue.vm b/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/schema/views/index.vue.vm similarity index 100% rename from yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben_next/schema/views/index.vue.vm rename to yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/schema/views/index.vue.vm From 3923189887da1cf4bb8a44b7d95bee00544c818f Mon Sep 17 00:00:00 2001 From: puhui999 Date: Wed, 16 Apr 2025 18:47:47 +0800 Subject: [PATCH 3/8] =?UTF-8?q?=E3=80=90=E5=8A=9F=E8=83=BD=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E3=80=91=E4=BB=A3=E7=A0=81=E7=94=9F=E6=88=90:=20vue3?= =?UTF-8?q?=5Fvben5=5Fantd=20schema=20=E4=B8=BB=E5=AD=90=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/codegen/inner/CodegenEngine.java | 19 +- .../vue3_vben5_antd/schema/api/api.ts.vm | 32 ++ .../vue3_vben5_antd/schema/views/data.ts.vm | 164 ++++++++ .../vue3_vben5_antd/schema/views/form.vue.vm | 62 ++- .../schema/views/modules/form_sub_erp.vue.vm | 204 ++++++++++ .../views/modules/form_sub_inner.vue.vm | 2 + .../views/modules/form_sub_normal.vue.vm | 360 ++++++++++++++++++ .../schema/views/modules/list_sub_erp.vue.vm | 184 +++++++++ .../views/modules/list_sub_inner.vue.vm | 4 + 9 files changed, 1021 insertions(+), 10 deletions(-) create mode 100644 yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/schema/views/modules/form_sub_erp.vue.vm create mode 100644 yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/schema/views/modules/form_sub_inner.vue.vm create mode 100644 yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/schema/views/modules/form_sub_normal.vue.vm create mode 100644 yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/schema/views/modules/list_sub_erp.vue.vm create mode 100644 yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/schema/views/modules/list_sub_inner.vue.vm diff --git a/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenEngine.java b/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenEngine.java index 3787f616b1..3dececdf43 100644 --- a/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenEngine.java +++ b/yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenEngine.java @@ -154,15 +154,16 @@ public class CodegenEngine { vue3FilePath("views/${table.moduleName}/${table.businessName}/modules/form.vue")) .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_SCHEMA.getType(), vue3Vben5AntdSchemaTemplatePath("api/api.ts"), vue3FilePath("api/${table.moduleName}/${table.businessName}/index.ts")) - // 主子表模板配置 - Vue3 vben5 schema 模版 - //.put(CodegenFrontTypeEnum.VUE3_VBEN_NEXT_SCHEMA.getType(), vue3VbenNextSchemaTemplatePath("views/master_slave_data.ts"), - // vue3FilePath("views/${table.moduleName}/${table.businessName}/data.ts")) - //.put(CodegenFrontTypeEnum.VUE3_VBEN_NEXT_SCHEMA.getType(), vue3VbenNextSchemaTemplatePath("views/master_slave_index.vue"), - // vue3FilePath("views/${table.moduleName}/${table.businessName}/index.vue")) - //.put(CodegenFrontTypeEnum.VUE3_VBEN_NEXT_SCHEMA.getType(), vue3VbenNextSchemaTemplatePath("views/modules/master_slave_form.vue"), - // vue3FilePath("views/${table.moduleName}/${table.businessName}/modules/form.vue")) - //.put(CodegenFrontTypeEnum.VUE3_VBEN_NEXT_SCHEMA.getType(), vue3VbenNextSchemaTemplatePath("views/modules/sub_table.vue"), - // vue3FilePath("views/${table.moduleName}/${table.businessName}/modules/sub_table.vue")) + .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_SCHEMA.getType(), vue3Vben5AntdSchemaTemplatePath("views/modules/form_sub_normal.vue"), // 特殊:主子表专属逻辑 + vue3FilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName}Form.vue")) + .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_SCHEMA.getType(), vue3Vben5AntdSchemaTemplatePath("views/modules/form_sub_inner.vue"), // 特殊:主子表专属逻辑 + vue3FilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName}Form.vue")) + .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_SCHEMA.getType(), vue3Vben5AntdSchemaTemplatePath("views/modules/form_sub_erp.vue"), // 特殊:主子表专属逻辑 + vue3FilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName}Form.vue")) + .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_SCHEMA.getType(), vue3Vben5AntdSchemaTemplatePath("views/modules/list_sub_inner.vue"), // 特殊:主子表专属逻辑 + vue3FilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName}List.vue")) + .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_SCHEMA.getType(), vue3Vben5AntdSchemaTemplatePath("views/modules/list_sub_erp.vue"), // 特殊:主子表专属逻辑 + vue3FilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName}List.vue")) .build(); @Resource diff --git a/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/schema/api/api.ts.vm b/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/schema/api/api.ts.vm index b1a24af09c..843f2fd2f6 100644 --- a/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/schema/api/api.ts.vm +++ b/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/schema/api/api.ts.vm @@ -19,8 +19,40 @@ export namespace ${simpleClassName}Api { #end #if ( $table.templateType == 2 ) children?: ${simpleClassName}[]; +#end +## 特殊:主子表专属逻辑 +#if ( $table.templateType == 10 || $table.templateType == 12 ) + #foreach ($subTable in $subTables) + #set ($index = $foreach.count - 1) + #set ($subSimpleClassName = $subSimpleClassNames.get($index)) + #if ( $subTable.subJoinMany ) + ${subSimpleClassName.toLowerCase()}s?: ${subSimpleClassName}[] + #else + ${subSimpleClassName.toLowerCase()}?: ${subSimpleClassName} + #end + #end #end } +## 特殊:主子表专属逻辑 +#foreach ($subTable in $subTables) + #set ($index = $foreach.count - 1) + #set ($subSimpleClassName = $subSimpleClassNames.get($index)) + #set ($subColumns = $subColumnsList.get($index))##当前字段数组 + /** ${subTable.classComment}信息 */ + export interface ${subSimpleClassName} { + #foreach ($column in $subColumns) + #if ($column.createOperation || $column.updateOperation) + #if(${column.javaType.toLowerCase()} == "long" || ${column.javaType.toLowerCase()} == "integer" || ${column.javaType.toLowerCase()} == "short" || ${column.javaType.toLowerCase()} == "double" || ${column.javaType.toLowerCase()} == "bigdecimal") + ${column.javaField}#if($column.updateOperation && !$column.primaryKey && !$column.nullable)?#end: number; // ${column.columnComment} + #elseif(${column.javaType.toLowerCase()} == "date" || ${column.javaType.toLowerCase()} == "localdate" || ${column.javaType.toLowerCase()} == "localdatetime") + ${column.javaField}#if($column.updateOperation && !$column.primaryKey && !$column.nullable)?#end: Date; // ${column.columnComment} + #else + ${column.javaField}#if($column.updateOperation && !$column.primaryKey && !$column.nullable)?#end: ${column.javaType.toLowerCase()}; // ${column.columnComment} + #end + #end + #end + } +#end } #if ( $table.templateType != 2 ) diff --git a/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/schema/views/data.ts.vm b/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/schema/views/data.ts.vm index 6877e59c24..cda2e5c244 100644 --- a/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/schema/views/data.ts.vm +++ b/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/schema/views/data.ts.vm @@ -276,3 +276,167 @@ export function useGridColumns( }, ]; } + +// TODO @puhui999: 标准模式和内嵌模式时,主子关系一对一则生成表单schema,一对多则生成列表schema(内嵌模式时表单schema也要生成)。erp 模式时都生成 +## 特殊:主子表专属逻辑 +#foreach ($subTable in $subTables) + #set ($index = $foreach.count - 1) + #set ($subColumns = $subColumnsList.get($index))##当前字段数组 + #set ($subSimpleClassName = $subSimpleClassNames.get($index)) + #set ($subJoinColumn = $subJoinColumns.get($index))##当前 join 字段 +// ==================== 子表($subTable.classComment) ==================== +/** 新增/修改的表单 */ +export function use${subSimpleClassName}FormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + #foreach($column in $subColumns) + #if ($column.createOperation || $column.updateOperation) + #if (!$column.primaryKey && ($table.templateType != 2 || ($table.templateType == 2 && $column.id != $treeParentColumn.id)))## 树表中已经添加了父ID字段,这里排除 + #set ($dictType = $column.dictType) + #set ($javaType = $column.javaType) + #set ($javaField = $column.javaField) + #set ($comment = $column.columnComment) + #if ($javaType == "Integer" || $javaType == "Long" || $javaType == "Byte" || $javaType == "Short") + #set ($dictMethod = "number") + #elseif ($javaType == "String") + #set ($dictMethod = "string") + #elseif ($javaType == "Boolean") + #set ($dictMethod = "boolean") + #end + #if ( $column.id == $subJoinColumn.id) ## 特殊:忽略主子表的 join 字段,不用填写 + #else + { + fieldName: '${javaField}', + label: '${comment}', + #if (($column.createOperation || $column.updateOperation) && !$column.nullable && !${column.primaryKey})## 创建或者更新操作 && 要求非空 && 非主键 + rules: 'required', + #end + #if ($column.htmlType == "input") + component: 'Input', + componentProps: { + placeholder: '请输入${comment}', + }, + #elseif($column.htmlType == "imageUpload")## 图片上传 + component: 'FileUpload', + componentProps: { + fileType: 'image', + maxCount: 1, + }, + #elseif($column.htmlType == "fileUpload")## 文件上传 + component: 'FileUpload', + componentProps: { + fileType: 'file', + maxCount: 1, + }, + #elseif($column.htmlType == "editor")## 文本编辑器 + component: 'Editor', + #elseif($column.htmlType == "select")## 下拉框 + component: 'Select', + componentProps: { + #if ("" != $dictType)## 有数据字典 + options: getDictOptions(DICT_TYPE.$dictType.toUpperCase(), '$dictMethod'), + #else##没数据字典 + options: [], + #end + placeholder: '请选择${comment}', + class: 'w-full', + }, + #elseif($column.htmlType == "checkbox")## 多选框 + component: 'Checkbox', + componentProps: { + #if ("" != $dictType)## 有数据字典 + options: getDictOptions(DICT_TYPE.$dictType.toUpperCase(), '$dictMethod'), + #else##没数据字典 + options: [], + #end + }, + #elseif($column.htmlType == "radio")## 单选框 + component: 'RadioGroup', + componentProps: { + #if ("" != $dictType)## 有数据字典 + options: getDictOptions(DICT_TYPE.$dictType.toUpperCase(), '$dictMethod'), + #else##没数据字典 + options: [], + #end + buttonStyle: 'solid', + optionType: 'button', + }, + #elseif($column.htmlType == "datetime")## 时间框 + component: 'DatePicker', + componentProps: { + showTime: true, + format: 'YYYY-MM-DD HH:mm:ss', + valueFormat: 'x', + }, + #elseif($column.htmlType == "textarea")## 文本域 + component: 'Textarea', + componentProps: { + placeholder: '请输入${comment}', + }, + #elseif($column.htmlType == "inputNumber")## 数字输入框 + component: 'InputNumber', + componentProps: { + min: 0, + class: 'w-full', + controlsPosition: 'right', + placeholder: '请输入${comment}', + }, + #end + }, + #end + #end + #end + #end + ]; +} +/** 列表的字段 */ +export function use${subSimpleClassName}GridColumns( + onActionClick?: OnActionClickFn<${simpleClassName}Api.${subSimpleClassName}>, +): VxeTableGridOptions<${subSimpleClassName}Api.${subSimpleClassName}>['columns'] { + return [ + #foreach($column in $subColumns) + #if (!$column.primaryKey && $column.listOperationResult && $column.id != $subJoinColumn.id) ## 特殊:忽略主子表的 join 字段,不用填写 + #set ($dictType = $column.dictType) + #set ($javaField = $column.javaField) + #set ($comment = $column.columnComment) + { + field: '${javaField}', + title: '${comment}', + minWidth: 120, + slots: { default: '${javaField}' }, + }, + #end + #end + { + field: 'operation', + title: '操作', + minWidth: 60, + align: 'center', + fixed: 'right', + headerAlign: 'center', + showOverflow: false, + cellRender: { + attrs: { + nameField: '${columns[0].javaField}', + nameTitle: '${table.classComment}', + onClick: onActionClick, + }, + name: 'CellOperation', + options: [ + { + code: 'delete', + show: hasAccessByCodes(['${table.moduleName}:${simpleClassName_strikeCase}:delete']), + }, + ], + }, + }, + ]; +} +#end \ No newline at end of file diff --git a/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/schema/views/form.vue.vm b/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/schema/views/form.vue.vm index 6d25b58a82..427dbfb446 100644 --- a/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/schema/views/form.vue.vm +++ b/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/schema/views/form.vue.vm @@ -2,7 +2,13 @@ import type { ${simpleClassName}Api } from '#/api/${table.moduleName}/${simpleClassName_strikeCase}'; import { useVbenModal } from '@vben/common-ui'; -import { message } from 'ant-design-vue'; +import { message, Tabs } from 'ant-design-vue'; +## 特殊:主子表专属逻辑 +#if ( $table.templateType == 10 || $table.templateType == 12 ) + #foreach ($subSimpleClassName in $subSimpleClassNames) + import ${subSimpleClassName}Form from './${subSimpleClassName}Form.vue' + #end +#end import { computed, ref } from 'vue'; import { $t } from '#/locales'; @@ -32,6 +38,18 @@ const getTitle = computed(() => { }); #end +## 特殊:主子表专属逻辑 +#if ( $table.templateType == 10 || $table.templateType == 12 ) + #if ( $subTables && $subTables.size() > 0 ) + + /** 子表的表单 */ + const subTabsName = ref('$subClassNameVars.get(0)') + #foreach ($subClassNameVar in $subClassNameVars) + const ${subClassNameVar}FormRef = ref() + #end + #end +#end + const [Form, formApi] = useVbenForm({ layout: 'horizontal', schema: useFormSchema(), @@ -44,9 +62,36 @@ const [Modal, modalApi] = useVbenModal({ if (!valid) { return; } + ## 特殊:主子表专属逻辑 + #if ( $table.templateType == 10 || $table.templateType == 12 ) + #if ( $subTables && $subTables.size() > 0 ) + // 校验子表单 + #foreach ($subTable in $subTables) + #set ($index = $foreach.count - 1) + #set ($subClassNameVar = $subClassNameVars.get($index)) + try { + await ${subClassNameVar}FormRef.value.validate() + } catch (e) { + subTabsName.value = '${subClassNameVar}' + return + } + #end + #end + #end modalApi.lock(); // 提交表单 const data = (await formApi.getValues()) as ${simpleClassName}Api.${simpleClassName}; + ## 特殊:主子表专属逻辑 + #if ( $table.templateType == 10 || $table.templateType == 12 ) + #if ( $subTables && $subTables.size() > 0 ) + // 拼接子表的数据 + #foreach ($subTable in $subTables) + #set ($index = $foreach.count - 1) + #set ($subClassNameVar = $subClassNameVars.get($index)) + data.${subClassNameVar}#if ( $subTable.subJoinMany)s#end = ${subClassNameVar}FormRef.value.getData() + #end + #end + #end try { await (formData.value?.id ? update${simpleClassName}(data) : create${simpleClassName}(data)); // 关闭并提示 @@ -90,5 +135,20 @@ const [Modal, modalApi] = useVbenModal({ diff --git a/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/schema/views/modules/form_sub_erp.vue.vm b/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/schema/views/modules/form_sub_erp.vue.vm new file mode 100644 index 0000000000..81cd9775eb --- /dev/null +++ b/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/schema/views/modules/form_sub_erp.vue.vm @@ -0,0 +1,204 @@ +#set ($subColumns = $subColumnsList.get($subIndex))##当前字段数组 +#set ($subSimpleClassName = $subSimpleClassNames.get($subIndex)) +#set ($subJoinColumn = $subJoinColumns.get($subIndex))##当前 join 字段 + + \ No newline at end of file diff --git a/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/schema/views/modules/form_sub_inner.vue.vm b/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/schema/views/modules/form_sub_inner.vue.vm new file mode 100644 index 0000000000..d8542c3d5c --- /dev/null +++ b/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/schema/views/modules/form_sub_inner.vue.vm @@ -0,0 +1,2 @@ +## 主表的 normal 和 inner 使用相同的 form 表单 +#parse("codegen/vue3/views/components/form_sub_normal.vue.vm") \ No newline at end of file diff --git a/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/schema/views/modules/form_sub_normal.vue.vm b/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/schema/views/modules/form_sub_normal.vue.vm new file mode 100644 index 0000000000..3fa1effb2d --- /dev/null +++ b/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/schema/views/modules/form_sub_normal.vue.vm @@ -0,0 +1,360 @@ +#set ($subTable = $subTables.get($subIndex))##当前表 +#set ($subColumns = $subColumnsList.get($subIndex))##当前字段数组 +#set ($subJoinColumn = $subJoinColumns.get($subIndex))##当前 join 字段 +#set ($subSimpleClassName = $subSimpleClassNames.get($subIndex)) +#set ($subJoinColumn = $subJoinColumns.get($subIndex))##当前 join 字段 +#set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写 + + \ No newline at end of file diff --git a/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/schema/views/modules/list_sub_erp.vue.vm b/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/schema/views/modules/list_sub_erp.vue.vm new file mode 100644 index 0000000000..3f0710e01c --- /dev/null +++ b/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/schema/views/modules/list_sub_erp.vue.vm @@ -0,0 +1,184 @@ +#set ($subTable = $subTables.get($subIndex))##当前表 +#set ($subColumns = $subColumnsList.get($subIndex))##当前字段数组 +#set ($subJoinColumn = $subJoinColumns.get($subIndex))##当前 join 字段 +#set ($subSimpleClassName = $subSimpleClassNames.get($subIndex)) +#set ($subJoinColumn = $subJoinColumns.get($subIndex))##当前 join 字段 +#set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写 + + \ No newline at end of file diff --git a/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/schema/views/modules/list_sub_inner.vue.vm b/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/schema/views/modules/list_sub_inner.vue.vm new file mode 100644 index 0000000000..3fe648892a --- /dev/null +++ b/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/schema/views/modules/list_sub_inner.vue.vm @@ -0,0 +1,4 @@ +## 子表的 erp 和 inner 使用相似的 list 列表,差异主要两点: +## 1)inner 使用 list 不分页,erp 使用 page 分页 +## 2)erp 支持单个子表的新增、修改、删除,inner 不支持 +#parse("codegen/vue3/views/components/list_sub_erp.vue.vm") \ No newline at end of file From 1f7f06549fbafed9407f2769e3a443f1549d6c40 Mon Sep 17 00:00:00 2001 From: puhui999 Date: Wed, 16 Apr 2025 22:29:32 +0800 Subject: [PATCH 4/8] =?UTF-8?q?=E3=80=90=E4=BB=A3=E7=A0=81=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E3=80=91=E4=BB=A3=E7=A0=81=E7=94=9F=E6=88=90:=20vue3?= =?UTF-8?q?=5Fvben5=5Fantd=20schema=20=E4=B8=BB=E5=AD=90=E8=A1=A8=20api=20?= =?UTF-8?q?=E5=92=8C=20data.ts=20=E6=A8=A1=E6=9D=BF=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vue3_vben5_antd/schema/api/api.ts.vm | 12 +- .../vue3_vben5_antd/schema/views/data.ts.vm | 194 +++++++++++++++++- 2 files changed, 196 insertions(+), 10 deletions(-) diff --git a/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/schema/api/api.ts.vm b/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/schema/api/api.ts.vm index 843f2fd2f6..1565ab9cd7 100644 --- a/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/schema/api/api.ts.vm +++ b/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/schema/api/api.ts.vm @@ -108,31 +108,31 @@ export function export${simpleClassName}(params: any) { #if ( $table.templateType == 11 ) /** 获得${subTable.classComment}分页 */ export function get${subSimpleClassName}Page(params: PageParam) { - return requestClient.get>(`${baseURL}/${subSimpleClassName_strikeCase}/page`, { params }); + return requestClient.get>(`${baseURL}/${subSimpleClassName_strikeCase}/page`, { params }); } ## 情况二:非 MASTER_ERP 时,需要列表查询子表 #else #if ( $subTable.subJoinMany ) /** 获得${subTable.classComment}列表 */ export function get${subSimpleClassName}ListBy${SubJoinColumnName}(${subJoinColumn.javaField}: number) { - return requestClient.get<${simpleClassName}Api.${simpleClassName}[]>(`${baseURL}/${subSimpleClassName_strikeCase}/list-by-${subJoinColumn_strikeCase}?${subJoinColumn.javaField}=${${subJoinColumn.javaField}}`); + return requestClient.get<${simpleClassName}Api.${subSimpleClassName}[]>(`${baseURL}/${subSimpleClassName_strikeCase}/list-by-${subJoinColumn_strikeCase}?${subJoinColumn.javaField}=${${subJoinColumn.javaField}}`); } #else /** 获得${subTable.classComment} */ export function get${subSimpleClassName}By${SubJoinColumnName}(${subJoinColumn.javaField}: number) { - return requestClient.get<${simpleClassName}Api.${simpleClassName}>(`${baseURL}/${subSimpleClassName_strikeCase}/get-by-${subJoinColumn_strikeCase}?${subJoinColumn.javaField}=${${subJoinColumn.javaField}}`); + return requestClient.get<${simpleClassName}Api.${subSimpleClassName}>(`${baseURL}/${subSimpleClassName_strikeCase}/get-by-${subJoinColumn_strikeCase}?${subJoinColumn.javaField}=${${subJoinColumn.javaField}}`); } #end #end ## 特殊:MASTER_ERP 时,支持单个的新增、修改、删除操作 #if ( $table.templateType == 11 ) /** 新增${subTable.classComment} */ -export function create${subSimpleClassName}(data: ${simpleClassName}Api.${simpleClassName}) { +export function create${subSimpleClassName}(data: ${simpleClassName}Api.${subSimpleClassName}) { return requestClient.post(`${baseURL}/${subSimpleClassName_strikeCase}/create`, data); } /** 修改${subTable.classComment} */ -export function update${subSimpleClassName}(data: ${simpleClassName}Api.${simpleClassName}) { +export function update${subSimpleClassName}(data: ${simpleClassName}Api.${subSimpleClassName}) { return requestClient.put(`${baseURL}/${subSimpleClassName_strikeCase}/update`, data); } @@ -143,7 +143,7 @@ export function delete${subSimpleClassName}(id: number) { /** 获得${subTable.classComment} */ export function get${subSimpleClassName}(id: number) { - return requestClient.get<${simpleClassName}Api.${simpleClassName}>(`${baseURL}/${subSimpleClassName_strikeCase}/get?id=${id}`); + return requestClient.get<${simpleClassName}Api.${subSimpleClassName}>(`${baseURL}/${subSimpleClassName_strikeCase}/get?id=${id}`); } #end #end diff --git a/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/schema/views/data.ts.vm b/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/schema/views/data.ts.vm index cda2e5c244..c68fc9e7cc 100644 --- a/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/schema/views/data.ts.vm +++ b/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/schema/views/data.ts.vm @@ -277,7 +277,7 @@ export function useGridColumns( ]; } -// TODO @puhui999: 标准模式和内嵌模式时,主子关系一对一则生成表单schema,一对多则生成列表schema(内嵌模式时表单schema也要生成)。erp 模式时都生成 +## 标准模式和内嵌模式时,主子关系一对一则生成表单schema,一对多则生成列表schema(内嵌模式时表单schema也要生成)。erp 模式时都生成 ## 特殊:主子表专属逻辑 #foreach ($subTable in $subTables) #set ($index = $foreach.count - 1) @@ -285,6 +285,7 @@ export function useGridColumns( #set ($subSimpleClassName = $subSimpleClassNames.get($index)) #set ($subJoinColumn = $subJoinColumns.get($index))##当前 join 字段 // ==================== 子表($subTable.classComment) ==================== +#if ($table.templateType == 11) ## erp 情况 /** 新增/修改的表单 */ export function use${subSimpleClassName}FormSchema(): VbenFormSchema[] { return [ @@ -402,7 +403,7 @@ export function use${subSimpleClassName}GridColumns( ): VxeTableGridOptions<${subSimpleClassName}Api.${subSimpleClassName}>['columns'] { return [ #foreach($column in $subColumns) - #if (!$column.primaryKey && $column.listOperationResult && $column.id != $subJoinColumn.id) ## 特殊:忽略主子表的 join 字段,不用填写 + #if ($column.listOperationResult) #set ($dictType = $column.dictType) #set ($javaField = $column.javaField) #set ($comment = $column.columnComment) @@ -410,14 +411,24 @@ export function use${subSimpleClassName}GridColumns( field: '${javaField}', title: '${comment}', minWidth: 120, - slots: { default: '${javaField}' }, + #if ($column.javaType == "LocalDateTime")## 时间类型 + formatter: 'formatDateTime', + #elseif("" != $dictType)## 数据字典 + cellRender: { + name: 'CellDict', + props: { type: DICT_TYPE.$dictType.toUpperCase() }, + }, + #end + #if (${table.templateType} == 2 && $column.id == $treeNameColumn.id)## 树表特有:标记树节点列 + treeNode: true, + #end }, #end #end { field: 'operation', title: '操作', - minWidth: 60, + minWidth: 200, align: 'center', fixed: 'right', headerAlign: 'center', @@ -430,13 +441,188 @@ export function use${subSimpleClassName}GridColumns( }, name: 'CellOperation', options: [ + #if (${table.templateType} == 2)## 树表特有操作 + { + code: 'append', + text: '新增下级', + show: hasAccessByCodes(['${table.moduleName}:${simpleClassName_strikeCase}:create']), + }, + #end + { + code: 'edit', + show: hasAccessByCodes(['${table.moduleName}:${simpleClassName_strikeCase}:update']), + }, { code: 'delete', show: hasAccessByCodes(['${table.moduleName}:${simpleClassName_strikeCase}:delete']), + #if (${table.templateType} == 2)## 树表禁止删除带有子节点的数据 + disabled: (row: ${simpleClassName}Api.${simpleClassName}) => { + return !!(row.children && row.children.length > 0); + }, + #end }, ], }, }, ]; } +#else + #if ($subTable.subJoinMany) ## 一对多 + /** 列表的字段 */ + export function use${subSimpleClassName}GridColumns( + onActionClick?: OnActionClickFn<${simpleClassName}Api.${subSimpleClassName}>, + ): VxeTableGridOptions<${subSimpleClassName}Api.${subSimpleClassName}>['columns'] { + return [ + #foreach($column in $subColumns) + #if (!$column.primaryKey && $column.listOperationResult && $column.id != $subJoinColumn.id) ## 特殊:忽略主子表的 join 字段,不用填写 + #set ($dictType = $column.dictType) + #set ($javaField = $column.javaField) + #set ($comment = $column.columnComment) + { + field: '${javaField}', + title: '${comment}', + minWidth: 120, + slots: { default: '${javaField}' }, + }, + #end + #end + { + field: 'operation', + title: '操作', + minWidth: 60, + align: 'center', + fixed: 'right', + headerAlign: 'center', + showOverflow: false, + cellRender: { + attrs: { + nameField: '${columns[0].javaField}', + nameTitle: '${table.classComment}', + onClick: onActionClick, + }, + name: 'CellOperation', + options: [ + { + code: 'delete', + show: hasAccessByCodes(['${table.moduleName}:${simpleClassName_strikeCase}:delete']), + }, + ], + }, + }, + ]; + } + #else + /** 新增/修改的表单 */ + export function use${subSimpleClassName}FormSchema(): VbenFormSchema[] { + return [ + { + fieldName: 'id', + component: 'Input', + dependencies: { + triggerFields: [''], + show: () => false, + }, + }, + #foreach($column in $subColumns) + #if ($column.createOperation || $column.updateOperation) + #if (!$column.primaryKey && ($table.templateType != 2 || ($table.templateType == 2 && $column.id != $treeParentColumn.id)))## 树表中已经添加了父ID字段,这里排除 + #set ($dictType = $column.dictType) + #set ($javaType = $column.javaType) + #set ($javaField = $column.javaField) + #set ($comment = $column.columnComment) + #if ($javaType == "Integer" || $javaType == "Long" || $javaType == "Byte" || $javaType == "Short") + #set ($dictMethod = "number") + #elseif ($javaType == "String") + #set ($dictMethod = "string") + #elseif ($javaType == "Boolean") + #set ($dictMethod = "boolean") + #end + #if ( $column.id == $subJoinColumn.id) ## 特殊:忽略主子表的 join 字段,不用填写 + #else + { + fieldName: '${javaField}', + label: '${comment}', + #if (($column.createOperation || $column.updateOperation) && !$column.nullable && !${column.primaryKey})## 创建或者更新操作 && 要求非空 && 非主键 + rules: 'required', + #end + #if ($column.htmlType == "input") + component: 'Input', + componentProps: { + placeholder: '请输入${comment}', + }, + #elseif($column.htmlType == "imageUpload")## 图片上传 + component: 'FileUpload', + componentProps: { + fileType: 'image', + maxCount: 1, + }, + #elseif($column.htmlType == "fileUpload")## 文件上传 + component: 'FileUpload', + componentProps: { + fileType: 'file', + maxCount: 1, + }, + #elseif($column.htmlType == "editor")## 文本编辑器 + component: 'Editor', + #elseif($column.htmlType == "select")## 下拉框 + component: 'Select', + componentProps: { + #if ("" != $dictType)## 有数据字典 + options: getDictOptions(DICT_TYPE.$dictType.toUpperCase(), '$dictMethod'), + #else##没数据字典 + options: [], + #end + placeholder: '请选择${comment}', + class: 'w-full', + }, + #elseif($column.htmlType == "checkbox")## 多选框 + component: 'Checkbox', + componentProps: { + #if ("" != $dictType)## 有数据字典 + options: getDictOptions(DICT_TYPE.$dictType.toUpperCase(), '$dictMethod'), + #else##没数据字典 + options: [], + #end + }, + #elseif($column.htmlType == "radio")## 单选框 + component: 'RadioGroup', + componentProps: { + #if ("" != $dictType)## 有数据字典 + options: getDictOptions(DICT_TYPE.$dictType.toUpperCase(), '$dictMethod'), + #else##没数据字典 + options: [], + #end + buttonStyle: 'solid', + optionType: 'button', + }, + #elseif($column.htmlType == "datetime")## 时间框 + component: 'DatePicker', + componentProps: { + showTime: true, + format: 'YYYY-MM-DD HH:mm:ss', + valueFormat: 'x', + }, + #elseif($column.htmlType == "textarea")## 文本域 + component: 'Textarea', + componentProps: { + placeholder: '请输入${comment}', + }, + #elseif($column.htmlType == "inputNumber")## 数字输入框 + component: 'InputNumber', + componentProps: { + min: 0, + class: 'w-full', + controlsPosition: 'right', + placeholder: '请输入${comment}', + }, + #end + }, + #end + #end + #end + #end + ]; + } + #end +#end #end \ No newline at end of file From da248cd12642c7af0f22777750288aa538568e7e Mon Sep 17 00:00:00 2001 From: puhui999 Date: Wed, 16 Apr 2025 23:53:33 +0800 Subject: [PATCH 5/8] =?UTF-8?q?=E3=80=90=E4=BB=A3=E7=A0=81=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E3=80=91=E4=BB=A3=E7=A0=81=E7=94=9F=E6=88=90:=20vue3?= =?UTF-8?q?=5Fvben5=5Fantd=20schema=20=E4=B8=BB=E5=AD=90=E8=A1=A8=E6=A8=A1?= =?UTF-8?q?=E6=9D=BF=E4=BC=98=E5=8C=96=EF=BC=88=E6=A0=87=E5=87=86=E5=92=8C?= =?UTF-8?q?=E5=86=85=E5=B5=8C=E6=A8=A1=E5=BC=8F=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../vue3_vben5_antd/schema/views/data.ts.vm | 18 +++ .../vue3_vben5_antd/schema/views/form.vue.vm | 128 +++++++++++++++--- 2 files changed, 130 insertions(+), 16 deletions(-) diff --git a/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/schema/views/data.ts.vm b/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/schema/views/data.ts.vm index c68fc9e7cc..12f6de370b 100644 --- a/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/schema/views/data.ts.vm +++ b/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/schema/views/data.ts.vm @@ -478,11 +478,29 @@ export function use${subSimpleClassName}GridColumns( #set ($dictType = $column.dictType) #set ($javaField = $column.javaField) #set ($comment = $column.columnComment) + #if ($javaType == "Integer" || $javaType == "Long" || $javaType == "Byte" || $javaType == "Short") + #set ($dictMethod = "number") + #elseif ($javaType == "String") + #set ($dictMethod = "string") + #elseif ($javaType == "Boolean") + #set ($dictMethod = "boolean") + #end { field: '${javaField}', title: '${comment}', minWidth: 120, slots: { default: '${javaField}' }, + #if ($column.htmlType == "select" || $column.htmlType == "checkbox" || $column.htmlType == "radio") + #if ("" != $dictType)## 有数据字典 + params: { + options: getDictOptions(DICT_TYPE.$dictType.toUpperCase(), '$dictMethod'), + }, + #else + params: { + options: [], + }, + #end + #end }, #end #end diff --git a/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/schema/views/form.vue.vm b/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/schema/views/form.vue.vm index 427dbfb446..88156fb95e 100644 --- a/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/schema/views/form.vue.vm +++ b/yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/schema/views/form.vue.vm @@ -2,13 +2,7 @@ import type { ${simpleClassName}Api } from '#/api/${table.moduleName}/${simpleClassName_strikeCase}'; import { useVbenModal } from '@vben/common-ui'; -import { message, Tabs } from 'ant-design-vue'; -## 特殊:主子表专属逻辑 -#if ( $table.templateType == 10 || $table.templateType == 12 ) - #foreach ($subSimpleClassName in $subSimpleClassNames) - import ${subSimpleClassName}Form from './${subSimpleClassName}Form.vue' - #end -#end +import { message, Tabs, Checkbox, Input, Textarea, Select,RadioGroup,CheckboxGroup, DatePicker } from 'ant-design-vue'; import { computed, ref } from 'vue'; import { $t } from '#/locales'; @@ -16,6 +10,20 @@ import { useVbenForm } from '#/adapter/form'; import { get${simpleClassName}, create${simpleClassName}, update${simpleClassName} } from '#/api/${table.moduleName}/${simpleClassName_strikeCase}'; import { useFormSchema } from '../data'; +#if ( $table.templateType == 10 || $table.templateType == 12 ) +#if ( $subTables && $subTables.size() > 0 ) +#foreach ($subTable in $subTables) + #set ($index = $foreach.count - 1) + #set ($subSimpleClassName = $subSimpleClassNames.get($index)) + #if ($subTable.subJoinMany) ## 一对多 +import { useVbenVxeGrid } from '#/adapter/vxe-table'; +import { use${subSimpleClassName}GridColumns } from '../data'; + #else +import { use${subSimpleClassName}FormSchema } from '../data'; + #end +#end +#end +#end const emit = defineEmits(['success']); const formData = ref<${simpleClassName}Api.${simpleClassName}>(); @@ -40,15 +48,44 @@ const getTitle = computed(() => { ## 特殊:主子表专属逻辑 #if ( $table.templateType == 10 || $table.templateType == 12 ) - #if ( $subTables && $subTables.size() > 0 ) - - /** 子表的表单 */ - const subTabsName = ref('$subClassNameVars.get(0)') - #foreach ($subClassNameVar in $subClassNameVars) - const ${subClassNameVar}FormRef = ref() - #end +#if ( $subTables && $subTables.size() > 0 ) +/** 子表的表单 */ +const subTabsName = ref('$subClassNameVars.get(0)') +## 特殊:主子表专属逻辑 +#foreach ($subTable in $subTables) + #set ($index = $foreach.count - 1) + #set ($subSimpleClassName = $subSimpleClassNames.get($index)) + #set ($subClassNameVar = $subClassNameVars.get($index)) + #if ($subTable.subJoinMany) ## 一对多 +/** {$subTable.classComment}表格配置 */ +const [${subSimpleClassName}Grid, {$subClassNameVar}GridApi] = useVbenVxeGrid({ + gridOptions: { + columns: use${subSimpleClassName}GridColumns(), + border: true, + showOverflow: true, + autoResize: true, + keepSource: true, + rowConfig: { + keyField: 'id', + }, + pagerConfig: { + enabled: false, + }, + toolbarConfig: { + enabled: false, + }, + }, +}); + #else +const [${subSimpleClassName}Form, {$subClassNameVar}FormApi] = useVbenForm({ + layout: 'horizontal', + schema: useFormSchema(), + showDefaultActions: false +}); #end #end +#end +#end const [Form, formApi] = useVbenForm({ layout: 'horizontal', @@ -56,6 +93,7 @@ const [Form, formApi] = useVbenForm({ showDefaultActions: false }); +// TODO @puhui999: 处理完成主子表标准模式和内嵌模式下的表单提交 const [Modal, modalApi] = useVbenModal({ async onConfirm() { const { valid } = await formApi.validate(); @@ -143,9 +181,67 @@ const [Modal, modalApi] = useVbenModal({ #set ($index = $foreach.count - 1) #set ($subClassNameVar = $subClassNameVars.get($index)) #set ($subSimpleClassName = $subSimpleClassNames.get($index)) - #set ($subJoinColumn_strikeCase = $subJoinColumn_strikeCases.get($index)) + #set ($subColumns = $subColumnsList.get($index))##当前字段数组 + #set ($subJoinColumn = $subJoinColumns.get($index))##当前 join 字段 - <${subSimpleClassName}Form ref="${subClassNameVar}FormRef" :${subJoinColumn_strikeCase}="formData.id" /> + #if ($subTable.subJoinMany) ## 一对多 + <${subSimpleClassName}Grid class="mx-4"> + #foreach($column in $subColumns) + #if ($column.createOperation || $column.updateOperation) + #set ($javaField = $column.javaField) + #if ( $column.id == $subJoinColumn.id) ## 特殊:忽略主子表的 join 字段,不用填写 + #elseif ($column.htmlType == "input" && !$column.primaryKey)## 忽略主键,不用在表单里 + + #elseif($column.htmlType == "imageUpload")## 图片上传 + + #elseif($column.htmlType == "fileUpload")## 文件上传 + + #elseif($column.htmlType == "editor")## 文本编辑器 +