feat(gxmu): 申报管理选择挑战杯模块时预填申报表与公开展示信息表配置

- 选中挑战杯模块即按挑战杯申报表口径预填项目申报表与公开展示信息表的
  项目类型(3 项)、项目分组(5 项)
- 默认值复用 TZBCYForm/options 中的常量,避免两处维护产生漂移
- 仅在配置为空(含纯空行)时填充,用户手动编辑或已配置的记录不被覆盖
- 切到其他模块不再清空已填配置,切回挑战杯时保留用户内容
This commit is contained in:
2026-11-01 16:35:29 +08:00
parent 35e527ce53
commit fd443aced3
@@ -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 = [];
}
);
</script>