diff --git a/src/api/form/design/index.ts b/src/api/form/design/index.ts index 387277d..a6e1d0f 100644 --- a/src/api/form/design/index.ts +++ b/src/api/form/design/index.ts @@ -112,6 +112,21 @@ export async function getFormTemplate(id: string, mode: ErrorMessageMode = 'moda ); } +/** + * @description: 获取模板详情信息-优先从缓存获取 + */ +export async function getFormTemplateUsingCache(id: string, mode: ErrorMessageMode = 'modal') { + return defHttp.get( + { + url: Api.Info, + params: {id,useCache:1}, + }, + { + errorMessageMode: mode, + }, + ); +} + /** * @description: 更新模板状态 */ diff --git a/src/components/CreateCodeStep/src/EntireConfigStep.vue b/src/components/CreateCodeStep/src/EntireConfigStep.vue index b6be60e..d80d7a9 100644 --- a/src/components/CreateCodeStep/src/EntireConfigStep.vue +++ b/src/components/CreateCodeStep/src/EntireConfigStep.vue @@ -1,60 +1,173 @@ diff --git a/src/hooks/web/useFormConfig.ts b/src/hooks/web/useFormConfig.ts new file mode 100644 index 0000000..ef97409 --- /dev/null +++ b/src/hooks/web/useFormConfig.ts @@ -0,0 +1,72 @@ + +import { FormSchema } from '/@/components/Form'; +import { BasicColumn } from "/@/components/Table"; +import { getFormTemplateUsingCache } from '/@/api/form/design'; +import { deepMerge } from '/@/utils'; + + + +export function useFormConfig() { + async function mergeFormSchemas(formSchema: FormSchema[],formId:String){ + const formProps=await queryConfig(formId,'formProps'); + let fschemas=formProps?.schemas; + if(fschemas&&fschemas.length>0){ + return deepMerge(formSchema,fschemas); + }else{ + return formSchema; + } + } + + async function mergeColumns(columns: BasicColumn[],formId:String){ + const cols=await queryConfig(formId,'columns'); + if(cols&&cols.length>0){ + const filteredCol = cols.filter(colItem => + columns.some(column => column.dataIndex === colItem.dataIndex) + ); + return filteredCol; + }else{ + return columns; + } + } + + async function mergeSearchFormSchema(searchFormSchema: FormSchema[],formId:String){ + const sFormSchema=await queryConfig(formId,'searchFormSchema'); + if(sFormSchema&&sFormSchema.length>0){ + const filteredsFormSchema = sFormSchema.filter(sItem => + searchFormSchema.some( searchItem => searchItem.field === sItem.field) + ); + return filteredsFormSchema; + }else{ + return searchFormSchema; + } + } + + + async function queryConfig(formId:String,configName:String){ + const formTemplate = await getFormTemplateUsingCache(formId); + const renderConfig=formTemplate.renderConfig; + const exportMatches = renderConfig.matchAll(/export\s+const\s+(\w+)\s*(?::\s*\w+(?:\[\])?)?\s*=\s*([\s\S]*?)(?=\n\s*export\s+const|\n\s*const|\n\s*export\s+function|\n\s*function|$)/g); + for (const match of exportMatches) { + const varName = match[1]; + const valueCode = match[2].trim(); + const cleanCode = valueCode.endsWith(';') ? valueCode.slice(0, -1) : valueCode; + if(varName==configName) { + try { + const value = new Function(`return ${cleanCode}`)(); + // console.log(value); + return value; + } catch (e) { + console.error(`Failed to parse ${varName}:`, e); + throw new Error('解析表单渲染覆盖配置出错,请联系管理员处理'); + } + } + } + return null; + } + + return { + mergeFormSchemas, + mergeColumns, + mergeSearchFormSchema + }; +} diff --git a/src/utils/helper/generatorHelper.ts b/src/utils/helper/generatorHelper.ts index f9f5d1c..093fd07 100644 --- a/src/utils/helper/generatorHelper.ts +++ b/src/utils/helper/generatorHelper.ts @@ -643,6 +643,7 @@ ${hasTemplatePrint ? ' reactive ' : ''} import { useMessage } from '/@/hooks/web/useMessage'; import { useI18n } from '/@/hooks/web/useI18n'; import { usePermission } from '/@/hooks/web/usePermission'; + import { useFormConfig } from '/@/hooks/web/useFormConfig'; import { useRouter } from 'vue-router'; import { get${pascalMainTableName} } from '/@/api/${ model.outputConfig.outputValue @@ -710,7 +711,7 @@ ${hasTemplatePrint ? ' reactive ' : ''} : '' } ${componentArray.includes('money-chinese') ? `import nzhcn from 'nzh/cn';` : ''} - import { searchFormSchema, columns } from './components/config'; + import {formConfig, searchFormSchema, columns } from './components/config'; ${ model.listConfig.buttonConfigs.filter((x) => x.isUse).length > 0 || model.listConfig.leftMenuConfig?.childIcon || @@ -746,15 +747,20 @@ ${hasTemplatePrint ? ' reactive ' : ''} } import useEventBus from '/@/hooks/event/useEventBus'; - + import { cloneDeep } from 'lodash-es'; + const { bus, CREATE_FLOW, FLOW_PROCESSED, FORM_LIST_MODIFIED } = useEventBus(); const { notification } = useMessage(); const { t } = useI18n(); defineEmits(['register']); const { filterColumnAuth, filterButtonAuth } = usePermission(); + const { mergeColumns,mergeSearchFormSchema } = useFormConfig(); - const filterColumns = filterColumnAuth(columns); + const filterColumns = cloneDeep(filterColumnAuth(columns)); + const customConfigColums =ref(filterColumns); + const customSearchFormSchema =ref(searchFormSchema); + const tableRef = ref(); ${ hasFilterButton @@ -868,12 +874,12 @@ ${hasTemplatePrint ? ' reactive ' : ''} title: '${model.listConfig?.listTitle||''}' || (formName + '列表'), api: get${pascalMainTableName}Page, rowKey: '${camelCaseString(mainTable.pkField)}', - columns: filterColumns, + columns: customConfigColums, formConfig: { rowProps: { gutter: 16, }, - schemas: searchFormSchema, + schemas: customSearchFormSchema, fieldMapToTime: [${ model.listConfig.queryConfigs .filter((item) => { @@ -961,7 +967,8 @@ ${hasTemplatePrint ? ' reactive ' : ''} path: '/flow/' + schemaId + '/' + (processId || '') + '/approveFlow', query: { taskId: taskIds[0], - formName: formName + formName: formName, + formId:currentRoute.value.meta.formId } }); } else if (schemaId && !taskIds && processId) { @@ -970,7 +977,8 @@ ${hasTemplatePrint ? ' reactive ' : ''} query: { readonly: 1, taskId: '', - formName: formName + formName: formName, + formId:currentRoute.value.meta.formId } }); } else { @@ -978,7 +986,8 @@ ${hasTemplatePrint ? ' reactive ' : ''} path: '/form/${lowerClassName}/' + record.id + '/viewForm', query: { formPath: '${model.outputConfig.outputValue}/${lowerClassName}', - formName: formName + formName: formName, + formId:currentRoute.value.meta.formId } }); } @@ -1007,7 +1016,8 @@ ${hasTemplatePrint ? ' reactive ' : ''} path: '/form/${lowerClassName}/0/createForm', query: { formPath: '${model.outputConfig.outputValue}/${lowerClassName}', - formName: formName + formName: formName, + formId:currentRoute.value.meta.formId } }); } @@ -1025,7 +1035,8 @@ ${hasTemplatePrint ? ' reactive ' : ''} path: '/form/${lowerClassName}/' + record.id + '/updateForm', query: { formPath: '${model.outputConfig.outputValue}/${lowerClassName}', - formName: formName + formName: formName, + formId:currentRoute.value.meta.formId } });` : ` @@ -1440,6 +1451,8 @@ ${hasTemplatePrint ? ' reactive ' : ''} } else { bus.on(FORM_LIST_MODIFIED, handleRefresh); } + setCustomConfigColumns(); + setCustomSearchFormSchema(); }); onUnmounted(() => { if (schemaIdComputedRef.value) { @@ -1587,6 +1600,20 @@ ${hasTemplatePrint ? ' reactive ' : ''} ` : '' } + + async function setCustomConfigColumns(){ + if (formConfig.useCustomConfig) { + const cols= await mergeColumns(customConfigColums.value,currentRoute.value.meta.formId); + customConfigColums.value=cols; + } + }; + + async function setCustomSearchFormSchema(){ + if (formConfig.useCustomConfig) { + const cols= await mergeSearchFormSchema(customSearchFormSchema.value,currentRoute.value.meta.formId); + customSearchFormSchema.value=cols; + } + }; `; - return code; + return code.replace(/(\n\s*\n\s*\n)+/g, '\n'); } /** * 构建SimpleForm页面 @@ -1640,8 +1667,8 @@ export function buildSimpleFormCode(model: GeneratorConfig, _tableInfo: TableInf />