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({
+ ## 特殊:主子表专属逻辑
+ #if ( $table.templateType == 10 || $table.templateType == 12 )
+
+
+ #foreach ($subTable in $subTables)
+ #set ($index = $foreach.count - 1)
+ #set ($subClassNameVar = $subClassNameVars.get($index))
+ #set ($subSimpleClassName = $subSimpleClassNames.get($index))
+ #set ($subJoinColumn_strikeCase = $subJoinColumn_strikeCases.get($index))
+
+ <${subSimpleClassName}Form ref="${subClassNameVar}FormRef" :${subJoinColumn_strikeCase}="formData.id" />
+
+ #end
+
+ #end
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)})##首字母大写
+
+#if ( $subTable.subJoinMany )## 情况一:一对多,table + form
+
+
+
+#foreach($column in $subColumns)
+ #if ($column.createOperation || $column.updateOperation)
+ #set ($dictType = $column.dictType)
+ #set ($javaField = $column.javaField)
+ #set ($javaType = $column.javaType)
+ #set ($AttrName = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
+ #set ($comment = $column.columnComment)
+ #set ($dictMethod = "getDictOptions")## 计算使用哪个 dict 字典方法
+ #if ($javaType == "Integer" || $javaType == "Long" || $javaType == "Byte" || $javaType == "Short")
+ #set ($dictMethod = "getIntDictOptions")
+ #elseif ($javaType == "String")
+ #set ($dictMethod = "getStrDictOptions")
+ #elseif ($javaType == "Boolean")
+ #set ($dictMethod = "getBoolDictOptions")
+ #end
+ #if ( $column.id == $subJoinColumn.id) ## 特殊:忽略主子表的 join 字段,不用填写
+ #elseif ($column.htmlType == "input" && !$column.primaryKey)## 忽略主键,不用在表单里
+
+
+
+
+
+
+
+ #elseif($column.htmlType == "imageUpload")## 图片上传
+
+
+
+
+
+
+
+ #elseif($column.htmlType == "fileUpload")## 文件上传
+
+
+
+
+
+
+
+ #elseif($column.htmlType == "editor")## 文本编辑器
+
+
+
+
+
+
+
+ #elseif($column.htmlType == "select")## 下拉框
+
+
+
+
+ #if ("" != $dictType)## 有数据字典
+
+ #else##没数据字典
+
+ #end
+
+
+
+
+ #elseif($column.htmlType == "checkbox")## 多选框
+
+
+
+
+ #if ("" != $dictType)## 有数据字典
+
+ #else##没数据字典
+
+ #end
+
+
+
+
+ #elseif($column.htmlType == "radio")## 单选框
+
+
+
+
+ #if ("" != $dictType)## 有数据字典
+
+ {{ dict.label }}
+
+ #else##没数据字典
+ 请选择字典生成
+ #end
+
+
+
+
+ #elseif($column.htmlType == "datetime")## 时间框
+
+
+
+
+
+
+
+ #elseif($column.htmlType == "textarea")## 文本框
+
+
+
+
+
+
+
+ #end
+ #end
+#end
+
+
+ —
+
+
+
+
+
+ + 添加${subTable.classComment}
+
+#else## 情况二:一对一,form
+
+#foreach($column in $subColumns)
+ #if ($column.createOperation || $column.updateOperation)
+ #set ($dictType = $column.dictType)
+ #set ($javaField = $column.javaField)
+ #set ($javaType = $column.javaType)
+ #set ($AttrName = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
+ #set ($comment = $column.columnComment)
+ #set ($dictMethod = "getDictOptions")## 计算使用哪个 dict 字典方法
+ #if ($javaType == "Integer" || $javaType == "Long" || $javaType == "Byte" || $javaType == "Short")
+ #set ($dictMethod = "getIntDictOptions")
+ #elseif ($javaType == "String")
+ #set ($dictMethod = "getStrDictOptions")
+ #elseif ($javaType == "Boolean")
+ #set ($dictMethod = "getBoolDictOptions")
+ #end
+ #if ( $column.id == $subJoinColumn.id) ## 特殊:忽略主子表的 join 字段,不用填写
+ #elseif ($column.htmlType == "input" && !$column.primaryKey)## 忽略主键,不用在表单里
+
+
+
+ #elseif($column.htmlType == "imageUpload")## 图片上传
+
+
+
+ #elseif($column.htmlType == "fileUpload")## 文件上传
+
+
+
+ #elseif($column.htmlType == "editor")## 文本编辑器
+
+
+
+ #elseif($column.htmlType == "select")## 下拉框
+
+
+ #if ("" != $dictType)## 有数据字典
+
+ #else##没数据字典
+
+ #end
+
+
+ #elseif($column.htmlType == "checkbox")## 多选框
+
+
+ #if ("" != $dictType)## 有数据字典
+
+ #else##没数据字典
+
+ #end
+
+
+ #elseif($column.htmlType == "radio")## 单选框
+
+
+ #if ("" != $dictType)## 有数据字典
+
+ {{ dict.label }}
+
+ #else##没数据字典
+ 请选择字典生成
+ #end
+
+
+ #elseif($column.htmlType == "datetime")## 时间框
+
+
+
+ #elseif($column.htmlType == "textarea")## 文本框
+
+
+
+ #end
+ #end
+#end
+
+#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/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)})##首字母大写
+
+
+
+#if ($table.templateType == 11)
+
+ 新增
+
+#end
+
+ #foreach($column in $subColumns)
+ #if ($column.listOperationResult)
+ #set ($dictType=$column.dictType)
+ #set ($javaField = $column.javaField)
+ #set ($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
+ #set ($comment=$column.columnComment)
+ #if ( $column.id == $subJoinColumn.id) ## 特殊:忽略主子表的 join 字段,不用填写
+ #elseif ($column.javaType == "LocalDateTime")## 时间类型
+
+ #elseif($column.dictType && "" != $column.dictType)## 数据字典
+
+
+
+
+
+ #else
+
+ #end
+ #end
+ #end
+ #if ($table.templateType == 11)
+
+
+
+ 编辑
+
+
+ 删除
+
+
+
+ #end
+
+ #if ($table.templateType == 11)
+
+
+ #end
+
+#if ($table.templateType == 11)
+
+ <${subSimpleClassName}Form ref="formRef" @success="getList" />
+#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/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