update:用户端查看证书

This commit is contained in:
ltx 2026-05-07 16:13:10 +08:00
parent 104ac4a931
commit 52bc6297d4

View File

@ -222,7 +222,20 @@
<!-- 按项目分组展示 -->
<div class="project-section" v-for="(projectData, projectIndex) in certificateDisplayList" :key="projectIndex">
<div class="project-title">
{{ projectData.projectName }} - {{ projectData.groupName }}
{{ projectData.projectName }} - {{ projectData.groupName }} - {{ projectData.projectTypeName }}
</div>
<!-- 个人项目运动员证书 -->
<div v-if="projectData.athleteCertificateGroups.length > 0" class="certificate-type-section">
<div class="section-title">运动员证书</div>
<div
v-for="group in projectData.athleteCertificateGroups"
:key="`${projectData.registrationItemId}_${group.participantName}`"
class="certificate-member-row"
>
<div class="names-list">{{ group.participantName }}</div>
<el-button size="small" text type="primary" @click="openCertificates(group.certificates)">查看证书</el-button>
</div>
</div>
<!-- 项目证书 -->
@ -233,7 +246,7 @@
</div>
<!-- 运动员证书 -->
<div v-if="projectData.athleteCertificates.length > 0" class="certificate-type-section">
<div v-if="projectData.athleteCertificateGroups.length === 0 && projectData.athleteCertificates.length > 0" class="certificate-type-section">
<div class="section-title">运动员证书</div>
<div class="names-list">{{ projectData.athleteCertificates.map(c => c.participantName).join('、') }}</div>
<el-button size="small" text type="primary" @click="openCertificates(projectData.athleteCertificates)">查看证书</el-button>
@ -1325,6 +1338,57 @@ const isShowCertDialog = ref(false);
const certLoading = ref(false);
const certificateDisplayList = ref([]);
const splitCertificateProjectTypes = ['个人速度', '个人花样'];
const normalizeCertificateItemId = (value) => {
const normalized = Number(value);
return Number.isFinite(normalized) ? normalized : value;
};
const shouldSplitAthleteCertificates = (projectTypeName) => splitCertificateProjectTypes.includes(projectTypeName);
const splitParticipantNames = (participantName) => {
if (!participantName) return [];
return String(participantName)
.split(/[、,,]/)
.map((name) => name.trim())
.filter(Boolean);
};
const buildAthleteCertificateGroups = (item, certificates) => {
if (!shouldSplitAthleteCertificates(item.projectTypeName)) return [];
const groups = [];
const matchedCertificateIds = new Set();
const members = Array.isArray(item.members) ? item.members : [];
for (const member of members) {
const memberCertificates = certificates.filter((cert) => {
const participantNames = splitParticipantNames(cert.participantName);
return participantNames.includes(member.name);
});
memberCertificates.forEach((cert) => matchedCertificateIds.add(cert.certificateId));
if (memberCertificates.length > 0) {
groups.push({
participantName: member.name,
certificates: memberCertificates,
});
}
}
const unmatchedCertificates = certificates.filter((cert) => !matchedCertificateIds.has(cert.certificateId));
for (const cert of unmatchedCertificates) {
groups.push({
participantName: cert.participantName || '未匹配运动员',
certificates: [cert],
});
}
return groups;
};
const openCertificateDialog = async () => {
if (!currentRow.value?.registrationId) return;
isShowCertDialog.value = true;
@ -1365,18 +1429,21 @@ const openCertificateDialog = async () => {
// 为每个项目组织证书
const result = [];
for (const item of items) {
const registrationItemId = normalizeCertificateItemId(item.registrationItemId);
const projectData = {
registrationItemId: item.registrationItemId,
registrationItemId,
projectName: item.projectName,
groupName: item.groupName,
projectTypeName: item.projectTypeName,
projectCertificates: [],
athleteCertificates: [],
athleteCertificateGroups: [],
coachCertificates: [],
leaderCertificates: []
};
// 筛选该项目的证书
const projectCerts = certificates.filter(c => c.registrationItemId === item.registrationItemId);
const projectCerts = certificates.filter((c) => normalizeCertificateItemId(c.registrationItemId) === registrationItemId);
// 根据角色分类
for (const cert of projectCerts) {
@ -1388,10 +1455,16 @@ const openCertificateDialog = async () => {
projectData.athleteCertificates.push(cert);
}
}
projectData.athleteCertificateGroups = buildAthleteCertificateGroups(item, projectData.athleteCertificates);
if (projectData.athleteCertificateGroups.length > 0) {
projectData.athleteCertificates = [];
}
// 只有该项目有证书时才添加到列表
if (projectData.projectCertificates.length > 0 ||
projectData.athleteCertificates.length > 0 ||
projectData.athleteCertificateGroups.length > 0 ||
projectData.coachCertificates.length > 0 ||
projectData.leaderCertificates.length > 0) {
result.push(projectData);
@ -1405,8 +1478,10 @@ const openCertificateDialog = async () => {
registrationItemId: 0,
projectName: '其他证书',
groupName: '',
projectTypeName: '',
projectCertificates: [],
athleteCertificates: [],
athleteCertificateGroups: [],
coachCertificates: [],
leaderCertificates: []
};
@ -2366,6 +2441,24 @@ const submitChangeMembers = async () => {
margin-bottom: 12px;
line-height: 1.6;
}
.certificate-member-row {
display: flex;
align-items: center;
justify-content: space-between;
gap: 12px;
padding: 10px 0;
border-bottom: 1px solid #e4e7ed;
&:last-child {
padding-bottom: 0;
border-bottom: none;
}
.names-list {
margin-bottom: 0;
}
}
}
}
}