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

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

View File

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