diff --git a/src/views/gxmu/declare/components/declareEdit.vue b/src/views/gxmu/declare/components/declareEdit.vue index 54a07b8..c5f29d6 100644 --- a/src/views/gxmu/declare/components/declareEdit.vue +++ b/src/views/gxmu/declare/components/declareEdit.vue @@ -182,6 +182,10 @@ import { storeToRefs } from 'pinia'; import { FormInstance } from 'ant-design-vue/es/form'; import { DECLARE_MODULE_OPTIONS } from '../moduleOptions'; + import { + TZBCY_PROJECT_GROUP_OPTIONS, + TZBCY_PROJECT_TYPE_OPTIONS + } from '../../TZBCYForm/options'; import { normalizeDeclareRecord, stringifyDeclareMultiValueField @@ -273,29 +277,68 @@ const { resetFields } = useForm(form, rules); const isTzbcyModule = computed(() => form.module === 'gxmu_tzbcy_form'); + /** + * 挑战杯模块的默认配置 + * 与挑战杯申报表共用 TZBCYForm/options 中的同一份常量,避免两处维护产生漂移 + */ + type ChallengeCupConfigKey = + | 'formProjectType' + | 'formProjectGroup' + | 'publicProjectType' + | 'publicProjectGroup'; + + const CHALLENGE_CUP_CONFIG_KEYS: ChallengeCupConfigKey[] = [ + 'formProjectType', + 'formProjectGroup', + 'publicProjectType', + 'publicProjectGroup' + ]; + + const toOptionValues = (options: readonly { value: string }[]) => + options.map((item) => item.value); + + const getChallengeCupDefaultConfig = ( + key: ChallengeCupConfigKey + ): string[] => { + switch (key) { + case 'formProjectType': + case 'publicProjectType': + return toOptionValues(TZBCY_PROJECT_TYPE_OPTIONS); + default: + return toOptionValues(TZBCY_PROJECT_GROUP_OPTIONS); + } + }; + + // 列表是否为空(没有任意一个有效值,空行不算) + const isBlankConfigList = (list?: string[]) => + !(list || []).some((item) => !!item?.trim()); + + // 仅填充空配置,已有的配置(含用户手动编辑过的内容)保持不变 + const fillBlankConfigWithDefault = () => { + CHALLENGE_CUP_CONFIG_KEYS.forEach((key) => { + if (isBlankConfigList(form[key])) { + form[key] = getChallengeCupDefaultConfig(key); + } + }); + }; + + // 选中挑战杯模块时套用默认配置 + const applyChallengeCupPreset = () => { + if (isTzbcyModule.value) { + fillBlankConfigWithDefault(); + } + }; + const normalizeEditableList = (list?: string[]) => { const values = (list || []).map((item) => item?.trim() || '').filter(Boolean); return values.length ? values : ['']; }; - const addConfigRow = ( - key: - | 'formProjectType' - | 'formProjectGroup' - | 'publicProjectType' - | 'publicProjectGroup' - ) => { + const addConfigRow = (key: ChallengeCupConfigKey) => { form[key].push(''); }; - const removeConfigRow = ( - key: - | 'formProjectType' - | 'formProjectGroup' - | 'publicProjectType' - | 'publicProjectGroup', - index: number - ) => { + const removeConfigRow = (key: ChallengeCupConfigKey, index: number) => { form[key].splice(index, 1); if (!form[key].length) { form[key].push(''); @@ -418,6 +461,8 @@ ); yearValue.value = props.data.year ? String(props.data.year) : undefined; isUpdate.value = true; + // 历史记录若未配置过挑战杯配置,补上默认值;已配置的记录保持原样 + applyChallengeCupPreset(); } else { Object.assign(form, createDefaultForm()); isUpdate.value = false; @@ -435,14 +480,15 @@ watch( () => form.module, (value) => { - if (value !== 'gxmu_tzbcy_form') { - form.projectType = []; - form.projectGroup = []; - form.formProjectType = ['']; - form.formProjectGroup = ['']; - form.publicProjectType = ['']; - form.publicProjectGroup = ['']; + if (value === 'gxmu_tzbcy_form') { + // 选中挑战杯模块时预填项目申报表 / 公开展示信息表的默认配置 + applyChallengeCupPreset(); + return; } + // 切到其他模块时不清空配置,避免用户手滑切换后已编辑的内容丢失 + // (非挑战杯模块不会展示也不会提交这些字段) + form.projectType = []; + form.projectGroup = []; } );