运动员证书
{{ 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;
+ }
+ }
}
}
}