编辑赛事项目需要判断是否有报名记录

This commit is contained in:
马梓彭 2026-06-08 17:34:18 +08:00
parent da749694f5
commit 2fec32267d
2 changed files with 43 additions and 12 deletions

View File

@ -1,11 +1,18 @@
<template>
<div class="step-config">
<el-form ref="formRef" :model="localFormData" :rules="rules" label-position="top">
<!-- 提示信息:有报名记录时不能编辑项目 -->
<el-alert v-if="!canEditProject && !readonly" type="warning" show-icon style="margin-bottom: 20px">
<template #title>
当前赛事已有人员报名,不能修改项目信息。
</template>
</el-alert>
<el-card shadow="never" style="margin-bottom: 40px">
<template #header>
<div style="display: flex; justify-content: space-between; align-items: center">
<span><span style="color: red;" v-if="!readonly">*</span> 项目配置</span>
<el-button v-if="!readonly" type="primary" plain @click="addProject">选择项目</el-button>
<span><span style="color: red;" v-if="!readonly && canEditProject">*</span> 项目配置</span>
<el-button v-if="!readonly && canEditProject" type="primary" plain @click="addProject">选择项目</el-button>
</div>
</template>
<div class="project-card" v-for="(item, index) in localFormData.projects"
@ -21,16 +28,28 @@
<div v-for="(group, gIndex) in (item.groups ?? [])"
:key="group.projectGroupId ?? group.id ?? gIndex" class="group-row">
<div class="group-row__fields">
<el-input v-if="!readonly" v-model="group.groupName" class="group-row__name" placeholder="组别名称" :disabled="readonly" />
<!-- 只有在可以编辑项目时才允许编辑组别 -->
<el-input v-if="!readonly && canEditProject" v-model="group.groupName" class="group-row__name" placeholder="组别名称" />
<span v-else class="group-row__name">{{ group.groupName }}</span>
<el-date-picker value-format="YYYY-MM-DD" v-if="!readonly" class="group-row__range" type="daterange" range-separator="~"
start-placeholder="开始日期" end-placeholder="结束日期"
<el-date-picker
v-if="!readonly && canEditProject"
class="group-row__range"
type="daterange"
range-separator="~"
start-placeholder="开始日期"
end-placeholder="结束日期"
:model-value="[group.birthDateStart, group.birthDateEnd]"
@update:modelValue="(v) => { group.birthDateStart = v?.[0]; group.birthDateEnd = v?.[1]; }" :disabled="readonly" />
@update:modelValue="(v) => { group.birthDateStart = v?.[0]; group.birthDateEnd = v?.[1]; }"
/>
<span v-else class="group-row__range">{{ formatGroupDate(group) }}</span>
<el-select v-if="!readonly" v-model="group.gender" class="group-row__gender" placeholder="性别" :disabled="readonly">
<el-select
v-if="!readonly && canEditProject"
v-model="group.gender"
class="group-row__gender"
placeholder="性别"
>
<el-option label="全部" :value="3" />
<el-option label="男" :value="0" />
<el-option label="女" :value="1" />
@ -38,7 +57,8 @@
<span v-else class="group-row__gender">{{ group.gender === 0 ? '男' : group.gender === 1 ? '女' : '全部' }}</span>
</div>
<div v-if="!readonly" class="group-row__actions">
<!-- 只有在可以编辑项目时才允许删除组别 -->
<div v-if="!readonly && canEditProject" class="group-row__actions">
<el-popconfirm title="确认删除该组别吗?" @confirm="removeGroup(index, gIndex)">
<template #reference>
<el-button text type="danger" icon="ele-Delete">删除</el-button>
@ -75,12 +95,13 @@
</el-table-column>
<el-table-column label="限报数" width="220" align="center">
<template #default="{ row, $index }">
<!-- 限报数量即使有报名记录也可以编辑 -->
<el-form-item v-if="!readonly"
:prop="`projects.${$index}.limitCount`"
:rules="isOnlyIndividual ? [] : [{ required: true, message: '请填写项目限报数', trigger: 'change' }]"
style="margin: 0; justify-content: center;"
>
<el-input-number v-model="row.limitCount" :min="0" :step="1" :precision="0" :controls="true" class="project-limit-input" :disabled="readonly" />
<el-input-number v-model="row.limitCount" :min="0" :step="1" :precision="0" :controls="true" class="project-limit-input" />
</el-form-item>
<span v-else>{{ row.limitCount }}</span>
</template>
@ -95,12 +116,13 @@
<span class="required-star" v-if="!readonly">*</span>
个人项目限报数
</div>
<!-- 个人项目限报数即使有报名记录也可以编辑 -->
<el-form-item v-if="!readonly"
prop="registrationLimit.individualProjectLimit"
:rules="[{ required: true, message: '请填写个人项目限报数', trigger: 'change' }]"
style="margin: 0"
>
<el-input-number v-model="localFormData.registrationLimit.individualProjectLimit" :min="0" :step="1" :disabled="readonly" />
<el-input-number v-model="localFormData.registrationLimit.individualProjectLimit" :min="0" :step="1" />
</el-form-item>
<span v-else>{{ localFormData.registrationLimit.individualProjectLimit }}</span>
</div>
@ -109,12 +131,13 @@
<span class="required-star" v-if="!readonly">*</span>
团队项目限报数
</div>
<!-- 团队项目限报数即使有报名记录也可以编辑 -->
<el-form-item v-if="!readonly"
prop="registrationLimit.teamProjectLimit"
:rules="isOnlyIndividual ? [] : [{ required: true, message: '请填写团队项目限报数', trigger: 'change' }]"
style="margin: 0"
>
<el-input-number v-model="localFormData.registrationLimit.teamProjectLimit" :min="0" :step="1" :disabled="readonly" />
<el-input-number v-model="localFormData.registrationLimit.teamProjectLimit" :min="0" :step="1" />
</el-form-item>
<span v-else>{{ localFormData.registrationLimit.teamProjectLimit }}</span>
</div>
@ -156,6 +179,11 @@ const props = defineProps({
modelValue: { type: Object, required: true },
readonly: { type: Boolean, default: false }
});
// 是否可以编辑项目(有报名记录时不能编辑)
const canEditProject = computed(() => {
return props.modelValue?.canEditProject ?? true;
});
const emit = defineEmits(['update:modelValue']);
// 判断是否只允许个人报名

View File

@ -103,7 +103,8 @@ const currentStepData = computed(() => {
case 2:
return {
...formData.value.projectConfig,
registrationType: formData.value.basicInfo.registrationType
registrationType: formData.value.basicInfo.registrationType,
canEditProject: formData.value.projectConfig.canEditProject
};
case 3:
return {
@ -171,6 +172,7 @@ const formData = ref({
individualProjectLimit: 1,
teamProjectLimit: 1,
},
canEditProject: true, // 是否可以编辑项目(有报名记录时不能编辑)
},
// 步骤4:费用与账户配置
feeConfig: {
@ -241,6 +243,7 @@ const openDialog = async (id) => {
formData.value.projectConfig = {
projects: d.projects ?? [],
registrationLimit: d.registrationLimit ?? { individualProjectLimit: 1, teamProjectLimit: 1 },
canEditProject: d.canEditProject ?? true,
};
// 完全覆盖 feeConfig,不要保留旧数据
if (d.feeConfig) {