From 138592155fa9633efc526793cccf99d7dd5e9b4b Mon Sep 17 00:00:00 2001 From: qubiaobiao <3294694717@qq.com> Date: Thu, 22 Oct 2026 17:25:27 +0800 Subject: [PATCH] =?UTF-8?q?feat(admin):=20=E6=88=90=E7=BB=A9=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E6=96=B0=E5=A2=9E=E3=80=8C=E5=AF=BC=E5=87=BA=E6=8E=92?= =?UTF-8?q?=E5=90=8D=E8=A1=A8=E3=80=8D=E6=8C=89=E9=92=AE=20R220?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 先请求 ?meta=1 预检再下载:未分小组人数 / 本组无数据 / 底色已降级 三类情况必须摆到管理员面前才下载,避免下完才发现要重走一遍 - api 新增 getScoreRankMeta(silent 预检,不弹通用错误)/ scoreRankExportUrl(下载交给 safeDownload 三重校验) - 仅中职·高职显示(isExamScoreGroup),复用 scoreExportGroup 的组别选择 - 与「导出Excel」「下载公示表」三者分工写进注释:内部核查表 / 对外公示表 / 排名速览表,不可互相替代 --- src/api/admin.js | 36 ++++++++++++++++++ src/views/Admin.vue | 89 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 125 insertions(+) diff --git a/src/api/admin.js b/src/api/admin.js index a2dec3d..2b5ce83 100644 --- a/src/api/admin.js +++ b/src/api/admin.js @@ -322,6 +322,42 @@ export function publicityExportUrl(group) { return `/api/admin/export-publicity/${group}` } +/** + * 成绩排名表导出前的统计预检(R220,⛔ 不下载文件,只回统计) + * + * 排名表是「一行 = 一个参赛小组」的速览表,前端在下载前需要知道三件事: + * ① 有没有人未归属小组(会各自单独占一行);② 本组是否根本没有可导出的数据; + * ③ 整行底色是否生成失败(后端会自动降级为无色版,文件名带「-无底色」)。 + * ③ 必须提示,否则管理员会以为「导出错了」而不是「降级了」。 + * + * silent: true —— 属「预检」而非用户动作,失败由调用方按业务语境提示。 + * @param {string} group - 组别标识(仅 zhongzhi / gaozhi 有效) + * @returns {Promise<{fileName:string,rowCount:number,colored:boolean,degradeReason:string, + * stats:Object,topN:number,totalContestants:number,noTeamCount:number}>} + */ +export function getScoreRankMeta(group) { + return request.get(`/admin/export-score-rank/${group}`, { + params: { meta: 1 }, + silent: true, + }) +} + +/** + * 下载成绩排名表(R220) + * + * 与另外两个导出产物的分工(⛔ 不可互相替代): + * · export-excel —— 内部核查表,全字段明细(含身份证号 / 手机号); + * · export-publicity —— 对外公示表,主办方模板、获奖等级列留空; + * · export-score-rank—— 排名速览表,一小组一行 + 区间底色 + 区间统计,无任何敏感字段。 + * + * 下载动作由 `utils/download.js#safeDownload` 发起(三重校验),故只导出 URL。 + * @param {string} group + * @returns {string} 下载 URL + */ +export function scoreRankExportUrl(group) { + return `/api/admin/export-score-rank/${group}` +} + /** * 读取赛项信息(赛项名称 / 赛项编号) * diff --git a/src/views/Admin.vue b/src/views/Admin.vue index e26a0c1..35d7619 100644 --- a/src/views/Admin.vue +++ b/src/views/Admin.vue @@ -1015,6 +1015,23 @@ 导出Excel + + 导出排名表