patch
Build and publish Docker images / Test, build and publish (push) Successful in 14m6s

This commit is contained in:
2026-07-21 19:40:48 +08:00 Unverified
parent ca675d3226
commit 207d75696b
8 changed files with 125 additions and 81 deletions
+18 -9
View File
@@ -22,7 +22,7 @@ export function createAdmissionRoutes(context) {
if (!pathname.startsWith('/api/admission/')) return false;
const user = await requireUser(request, response, 'admission_school');
if (!user) return true;
const db = await readDb();
const db = request.authDb || await readDb();
const school = db.schools.find(item => item.id === user.schoolId && item.active && item.isAdmissionSchool);
if (!school) return sendError(response, 403, '招生学校账号未绑定有效学校');
@@ -53,16 +53,25 @@ export function createAdmissionRoutes(context) {
return sendJson(response, existing ? 200 : 201, { ok: true, plan });
}
if (request.method === 'GET' && pathname === '/api/admission/placements') {
const accountById = new Map(db.users.map(item => [item.id, item]));
const profileByUserId = new Map(db.candidateProfiles.map(item => [item.userId, item]));
const examById = new Map(db.exams.map(item => [item.id, item]));
const registrationByExamUser = new Map(db.registrations.map(item => [`${item.examId}\u0000${item.userId}`, item]));
const publishedResultsByRegistration = new Map();
for (const result of db.results) {
if (!result.published) continue;
const rows = publishedResultsByRegistration.get(result.registrationId) || [];
rows.push(result);
publishedResultsByRegistration.set(result.registrationId, rows);
}
const placements = admissionRecords(db, 'placement').filter(item => item.schoolId === school.id).map(item => {
const account = db.users.find(entry => entry.id === item.userId) || {};
const profile = db.candidateProfiles.find(entry => entry.userId === item.userId) || {};
const registration = db.registrations.find(entry => entry.examId === item.examId && entry.userId === item.userId);
const results = db.results.filter(entry => entry.registrationId === registration?.id && entry.published).map(result => {
const exam = db.exams.find(entry => entry.id === item.examId);
return { subjectName: exam?.subjects.find(subject => subject.id === result.subjectId)?.name || result.subjectId, score: result.score };
});
const account = accountById.get(item.userId) || {};
const profile = profileByUserId.get(item.userId) || {};
const exam = examById.get(item.examId);
const registration = registrationByExamUser.get(`${item.examId}\u0000${item.userId}`);
const results = (publishedResultsByRegistration.get(registration?.id) || []).map(result => ({ subjectName: exam?.subjects.find(subject => subject.id === result.subjectId)?.name || result.subjectId, score: result.score }));
const qualification = resolveProfileSpecialty(profile);
return { ...item, examName: db.exams.find(exam => exam.id === item.examId)?.name || item.examId, candidate: { registrationNumber: account.candidateNumber, name: profile.name, gender: profile.gender, idNumberMasked: maskId(profile.idNumber), specialtyCategory: qualification.category, specialtyType: qualification.type, specialtyLabel: specialtyLabel(qualification.category, qualification.type), specialtyCertificate: profile.specialtyCertificate || '', policyEligibility: profile.policyEligibility || '' }, featureScore: Number(registration?.featureScore || 0), results };
return { ...item, examName: exam?.name || item.examId, candidate: { registrationNumber: account.candidateNumber, name: profile.name, gender: profile.gender, idNumberMasked: maskId(profile.idNumber), specialtyCategory: qualification.category, specialtyType: qualification.type, specialtyLabel: specialtyLabel(qualification.category, qualification.type), specialtyCertificate: profile.specialtyCertificate || '', policyEligibility: profile.policyEligibility || '' }, featureScore: Number(registration?.featureScore || 0), results };
});
const completedExams = db.exams.filter(exam => admissionRecords(db, 'setting', exam.id).some(setting => setting.status === 'completed') && placements.some(item => item.examId === exam.id && item.status === 'final'));
return sendJson(response, 200, { ok: true, school, placements, completedExams });