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
+
+ 导出排名表