From 52bc6297d4b0d0489ece025792946b50e21baed6 Mon Sep 17 00:00:00 2001 From: ltx <1006158920@qq.com> Date: Thu, 7 May 2026 16:13:10 +0800 Subject: [PATCH] =?UTF-8?q?update=EF=BC=9A=E7=94=A8=E6=88=B7=E7=AB=AF?= =?UTF-8?q?=E6=9F=A5=E7=9C=8B=E8=AF=81=E4=B9=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/user/record/index.vue | 101 ++++++++++++++++++++++++++++++-- 1 file changed, 97 insertions(+), 4 deletions(-) diff --git a/src/views/user/record/index.vue b/src/views/user/record/index.vue index 599dca9..c4bf512 100644 --- a/src/views/user/record/index.vue +++ b/src/views/user/record/index.vue @@ -222,7 +222,20 @@
- {{ projectData.projectName }} - {{ projectData.groupName }} + {{ projectData.projectName }} - {{ projectData.groupName }} - {{ projectData.projectTypeName }} +
+ + +
+
运动员证书
+
+
{{ group.participantName }}
+ 查看证书 +
@@ -233,7 +246,7 @@
-
+
运动员证书
{{ projectData.athleteCertificates.map(c => c.participantName).join('、') }}
查看证书 @@ -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; + } + } } } }