feat(0.5.1): 业务逻辑审查 9 条 P0 全修 + 自绘安装器 + 现场反馈四项
## 算分正确性(6 份只读审查 → 收敛成 5 个病根,均先复现失败再修) - 「人工名次」与「自动名次回写」互斥:原来同一份成绩**发布两次分数不同** (团体报名项 dual 通道 10/8/6 → 25/18/14),现在连发多次逐字节一致 - 删小项时在同一事务作废旧流水并推榜:原来分数**永久残留**在总榜、任何重算都打不到 - 规则包导入整体事务化:原来中途失败会清空名次表且补不回(奖牌全丢); 另加守卫「compare=none 的小项不得配 basis=result/aggregate」 - 末位归零只抹真正落在末位的那一档:原来跨末位的并列组会被整组抹 0 (7 人三人并列第 5 时第 5、6 名的分也一起没了) - 模板「分值表档位超出录取名次」现在拒绝保存:原来静默截断成 0 分 ## 现场反馈(主人实测报的) - 已发布成绩可改:行内「修改本条」+ 成绩格/状态格可点(退回草稿→改→重新发布本组), 与「作废」语义分开;取消路径不产生任何副作用 - 单位积分明细补「运动员 / 来源」列,并显示「已修订 ×N(时间·原因)」: 管理端、大屏覆盖层、xlsx 备注列三处同源 - 单位奖牌榜改为按奖牌独立排名(金→银→铜→单位编码),与积分榜解耦 - 历史孤儿积分流水清理(迁移 0022,只动 result/record_bonus,人工调整分不受影响) ## 新功能 - 团体项目聚合口径二选一:平均(默认)/ 总和(迁移 0023,通道编辑器可切) ## 安装器 - 自绘五页安装界面:无边框、自绘标题栏、DPI 自适应(4K@200% 实测)、 安装/卸载逻辑复用 electron-builder 宏不变;默认「为所有用户安装」并自动放行防火墙 19540 - 构建期校验:安装器素材里的版本号必须与 VERSION 一致,否则构建失败 自检:服务端 14 包 ×2 / 前端 vue-tsc + build + 742 例 ×2 / Console 20 文件 + 68 例 ×2,全绿。 端到端对拍:修前 vs 修后,纯团体 / 双计 / 普通个人三形态**逐字节一致**,仅出 bug 的双通道形态按要求改变。
This commit is contained in:
1 parent
78b14efaa9
commit
877ff15823
181 files changed
+8747
-371
No files matched your search
+40
-21
@@ -109,7 +109,9 @@
|
||||
| 状态 | 下拉选择:**有效**、**DNS 弃赛**、**DQ 取消**、**DNF 未完赛**、**退赛** |
|
||||
| 积分(自动) | 随成绩实时计算,仅供参考 |
|
||||
| 备注 | 自由填写,示例文本是 `可留空` |
|
||||
| 操作 | 已发布的行显示 **「作废本条」**(已作废的行改显示 **「重新录入」**);草稿行这里是 `—`(草稿本来就能直接改)。详见 4.10 |
|
||||
| 操作 | 已发布的行并排两个按钮 **「修改本条」**(退回草稿改一改,改完重新发布本组)与 **「作废本条」**(这一条不算了);已作废的行改显示 **「重新录入」**;草稿行这里是 `—`(草稿本来就能直接改)。详见 4.10 |
|
||||
|
||||
> 已发布的行里,**成绩格与状态格可以直接点**:点一下弹出确认框(写明会退回草稿、榜单先把它退下来、改完需重新发布本组),确认后才退回,点「取消」什么都不做。名次格与备注格点不动。
|
||||
|
||||
**成绩写法**:能接受的写法比过去多,中文输入法下的全角冒号 `1:06`、全角数字也认。
|
||||
|
||||
@@ -179,7 +181,7 @@
|
||||
3. 确认框会写明:`本组还有 N 人没有成绩,本次将发布已填的 M 人;其余保持未发布,补录后再发布即可。本次影响 … 个单位,最大分差变化 … 分。发布后立即上屏并重算积分榜。`——**看完再确认**,系统只发布已填的那 M 人,不会把没成绩的人当成 0 分发出去(末句在延迟结算下会换成「名次与榜单等该组全部录完后再更新」,见下面);
|
||||
4. 确认后这批成绩立即上屏;**实时结算(默认)下,名次与积分先按已发布的这部分算**,大屏立刻有内容(延迟结算下先不动,见下);
|
||||
5. 下一批跑完,回到本页补录成绩,再点一次「发布本批」——系统会把两批放在一起重算名次与积分,先发的部分自动跟着更新;
|
||||
6. 全部发完后按钮不再显示「本批」(并变为不可用),此时该组视为已全部发布。**只错一条**时不必撤销整组发布,用该行的「作废本条 → 重新录入」(见 4.10);整组都要改才走「撤销发布 → 修改 → 重新发布」(见 4.7)。
|
||||
6. 全部发完后按钮不再显示「本批」(并变为不可用),此时该组视为已全部发布。**只错一条**时不必撤销整组发布,点那一格(或该行的「修改本条」)退回草稿改完重发即可(见 4.10);整组都要改才走「撤销发布 → 修改 → 重新发布」(见 4.7)。
|
||||
|
||||
> 只有「会被算错」的写法才会挡住发布(见 4.4);空格子只是「还没录」,属于提醒,不影响发布。审核页(第 5 节)也是同一套口径:只有写错或缺名次才挡「发布整组」,空成绩只是本次跳过。
|
||||
|
||||
@@ -197,7 +199,7 @@
|
||||
2. 系统作废该组已产生的积分流水,大屏回退到发布前状态;
|
||||
3. 修改后重新发布即可。全程留痕,可在「变更历史」查看。
|
||||
|
||||
> **只错了一条成绩时**,不必撤销整组发布、把别人的成绩也一起翻下来——用该行「操作」列的「作废本条 / 重新录入」即可,见 4.10。
|
||||
> **只错了一条成绩时**,不必撤销整组发布、把别人的成绩也一起翻下来——点那一格(或该行的「修改本条」)退回草稿改完重发即可,见 4.10。
|
||||
|
||||
### 4.8 勾选与批量操作(退赛 / 恢复 / 移出报名)
|
||||
|
||||
@@ -236,33 +238,38 @@
|
||||
- **权限**:读得到成绩的人都能看到这块卡片(访客只读,输入框置灰并写明原因);**能保存的是录入员及以上**(与成绩录入同权限)。示例数据模式下不能保存;
|
||||
- 团体名次是**独立保存**的:点「保存团体名次」只提交这块卡片,不会顺手发布成绩;成绩仍然要另外「发布」。
|
||||
|
||||
### 4.10 单条作废 / 重新录入(手滑填错了怎么办)
|
||||
### 4.10 单条修改 / 作废 / 重新录入(手滑填错了怎么办)
|
||||
|
||||
已发布的成绩行在表格里仍然是**锁着的**(成绩、名次、状态、备注都改不了)——这是有意的:已发布的行已经上屏、已经计分,允许就地改会让「看到的榜单」和「改到一半的数据」对不上。要改就必须先明确地把它退回来。表格最后一列 **「操作」** 就是这件事的入口,只有已发布的行才有按钮。
|
||||
已发布的成绩行在表格里仍然是**锁着的**(名次、备注改不了)——这是有意的:已发布的行已经上屏、已经计分,允许就地改会让「看到的榜单」和「改到一半的数据」对不上。要改就必须先明确地把它退回来。入口有两个,效果一样:
|
||||
|
||||
**两个按钮,什么时候用哪个**
|
||||
- **直接点那一格**:已发布的**成绩格**与**状态格**点得动,点一下会弹出确认框,写明「这一条会退回草稿、榜单先把它退下来、改完需重新发布本组」;点「取消」**什么都不做**(成绩、榜单、大屏都不动),点确认才退回来。名次格与备注格仍然点不动;
|
||||
- **点表格最右端「操作」列的按钮**,只有已发布的行才有按钮。
|
||||
|
||||
**三个按钮,什么时候用哪个**
|
||||
|
||||
| 按钮 | 什么时候出现 | 做什么 |
|
||||
| --- | --- | --- |
|
||||
| **作废本条** | 这一行是**已发布且正常**的成绩 | 让这**一条**成绩退出名次与积分(同组其它人重新排名),但**不改**它的原始记录——需要改回来时还是用「重新录入」 |
|
||||
| **重新录入** | 这一行是**已作废**的(红徽标「已作废」) | 把这一条**退回草稿**(原来填的成绩还在格里,直接改就行)、不再计入名次与积分,之后就能像普通草稿一样编辑;改完再发布本组 |
|
||||
| **修改本条** | 这一行是**已发布且正常**的成绩 | 把这一条**退回草稿**(原来填的成绩还在格里,直接改就行),名次与积分先按「没有这条成绩」重算,改完再发布本组。**只是填错了改用这个**——它不会把这一条标成「已作废」 |
|
||||
| **作废本条** | 同上 | 让这**一条**成绩不再算数(同组其它人重新排名):成绩文字还留在格里,录入列变成红徽标「已作废」,**不计入名次与积分**。这一条确实不算了才用它 |
|
||||
| **重新录入** | 这一行是**已作废**的(红徽标「已作废」) | 把这一条**退回草稿**(同「修改本条」),改完就能像普通草稿一样重新发布 |
|
||||
|
||||
两个按钮**都必须填写原因**(确认框里的「作废原因 / 退回原因」),留空时确认键点了也不会提交——原因会写进审计日志,事后能查清是谁、什么时候、为什么动的这一条。
|
||||
三个按钮**都必须填写原因**(确认框里的「修改原因 / 作废原因 / 退回原因」),留空时确认键点了也不会提交——原因会写进审计日志,事后能查清是谁、什么时候、为什么动的这一条。
|
||||
|
||||
**点完会立刻发生什么**
|
||||
|
||||
- 服务端在同一个事务里**按当前已发布成绩重算**该小项该组的名次与积分,并**立即推送大屏**;
|
||||
- 这一步**不受**「分批发布时实时更新榜单」这个延迟结算开关影响(它改的是「这条成绩算不算数」,不是「录了多少」),不会出现「榜上还有分、成绩却已经撤了」;
|
||||
- 两者都会留痕:**审计日志**(第 13 节)里的动作分别是 `result.void` 与 `result.reopen`,含操作人、时间与填写的原因。注意「变更历史」(第 12 节)记的是**发布 / 撤销发布**这类整组版本,单条作废 / 重新录入**不会**在那里新增一个版本节点。
|
||||
- 三个动作都会留痕:**审计日志**(第 13 节)里的动作分别是 `result.void`(作废)与 `result.reopen`(修改 / 重新录入),含操作人、时间与填写的原因。注意「变更历史」(第 12 节)记的是**发布 / 撤销发布**这类整组版本,单条的修改 / 作废 / 重新录入**不会**在那里新增一个版本节点。
|
||||
|
||||
**手滑填错了怎么办:两条路**
|
||||
**手滑填错了怎么办:三条路**
|
||||
|
||||
1. **只错了一条**(最常见):在那一行点 **「作废本条」** 填原因 → 这一条退出名次与积分、大屏立刻更新 → 同一行点 **「重新录入」**(此时按钮已变成它)填原因 → 退回草稿,该行可以编辑了 → 改对成绩 → 再点页头的 **「发布」**(该组还有别的已发布成绩时显示为「发布本批」,见 4.6)。全程只动这一条,同组别人的成绩一直留在榜上;
|
||||
2. **整组都要改**(例如整组被判罚、名次口径整体调整):点页面上的 **「撤销发布」** → 修改 → 重新发布(见 4.7)。这条会把该组已产生的积分流水整体作废再重发,大屏会先回退一次。
|
||||
1. **只错了一条、要改对**(最常见):在那一行点 **成绩格**(或点 **「修改本条」**),确认框会写明后果,填「修改原因」→ 确认:这一条退回草稿、大屏按「没有这条成绩」重算 → **直接改格里的内容** → 再点页头的 **「发布」**(该组还有别的已发布成绩时显示为「发布本批」,见 4.6)。全程只动这一条,同组别人的成绩一直留在榜上;
|
||||
2. **这一条根本不该算**(成绩无效、重复录入等):同一行点 **「作废本条」** 填原因 → 这一条不再计入名次与积分(成绩文字还留在格里,录入列变成红徽标「已作废」)。以后要让它重新算数,用同一行的 **「重新录入」** 退回草稿改完再发布。**只是填错了用第 1 条**——用「作废」会在榜上留下一条作废痕迹;
|
||||
3. **整组都要改**(例如整组被判罚、名次口径整体调整):点页面上的 **「撤销发布」** → 修改 → 重新发布(见 4.7)。这条会把该组已产生的积分流水整体作废再重发,大屏会先回退一次。
|
||||
|
||||
> 只错一条时**优先用第 1 条路**:撤销发布会让整组的分数先消失再回来,大屏在中间会闪一下;作废 / 重新录入只影响这一条。
|
||||
> 只错一条时**优先用第 1、2 条路**:撤销发布会让整组的分数先消失再回来,大屏在中间会闪一下;单条修改 / 作废只影响这一条。
|
||||
|
||||
> 需要先「存草稿」再点这两个按钮:作废 / 退回会重算并整表刷新,未保存的编辑会被刷新覆盖,页面会拦下并提示。
|
||||
> 需要先「存草稿」再动这些入口:修改 / 作废 / 退回会重算并整表刷新,未保存的编辑会被刷新覆盖,页面会拦下并提示。
|
||||
|
||||
---
|
||||
|
||||
@@ -371,11 +378,15 @@
|
||||
|
||||
- 列:名次、单位、总分、金、银、铜、变化、明细;
|
||||
- 「变化」列显示名次升降(如 `↑2`、`↓1`);
|
||||
- 点「展开」下钻该单位的积分明细,右侧面板显示合计与每一条得分来源(项目、组别、运动员、成绩、名次、积分),每一分都可溯源。
|
||||
- 点「展开」下钻该单位的积分明细,右侧面板显示合计与每一条得分来源(项目 / 组别、运动员、来源、成绩、名次、积分),每一分都可溯源;
|
||||
- **「运动员」列**:团体项目、按队内平均算出的团体分、以及人工调整这几类没有单个运动员的明细,这一列显示**单位名**(单位的团体分就是该单位挣的);人工调整没有项目也没有运动员,显示 `—`;
|
||||
- **「来源」列**:这一分是怎么来的——`成绩`(正常计分)、`破纪录加分`、`人工调整`,与导出的「来源」列用词一致;
|
||||
- **被改过的成绩带一个「已修订 ×N」小角标**(N = 发布后被改过的次数),鼠标悬停在角标上会显示**最后一次修订的时间、原因与操作人**;没改过的行没有角标。
|
||||
|
||||
### 8.2 单位奖牌榜 / 个人积分榜
|
||||
|
||||
- 单位奖牌榜显示金、银、铜与合计;
|
||||
- **单位奖牌榜有自己的名次与顺序:金牌多的在前,其次比银牌、铜牌,最后按单位编码排**——它不看总分,所以「金牌多但总分低」的单位在这里排在前面,在单位总分榜上却靠后,这是口径不同,不是数据错了;
|
||||
- 个人积分榜显示运动员、单位、个人总分与奖牌数;
|
||||
- 单位奖牌榜那一列的「明细」展开的是**同一个单位积分明细面板**(见 8.1),不是奖牌专属明细;但这份榜单本身有专属的逐枚奖牌导出(见 8.3);
|
||||
- 个人积分榜**没有明细列**(不能点开下钻),但它的逐条得分来源也有专属导出(见 8.3)。
|
||||
@@ -386,7 +397,7 @@
|
||||
- **导出总明细**(单位总分榜卡片头):导出 `单位积分总明细.xlsx`——一张带「单位」列的总表,外加每个**有数据**的单位一张分表;没有积分的单位不出分表;
|
||||
- **导出奖牌明细**(单位奖牌榜卡片头):导出 `单位奖牌明细.xlsx`——第一张总表逐枚奖牌列出「单位 / 大项 / 小项 / 组别 / 名次 / 奖牌 / 运动员、队」,`奖牌` 列是 `金牌` / `银牌` / `铜牌`;其后每个**有奖牌**的单位一张分表(列同上、去掉「单位」,末尾一行小计 `金 X / 银 Y / 铜 Z`),没有奖牌的单位不出分表。口径与「单位奖牌榜」一致:同一个报名项在「个人+团体」这类双计通道下只记一枚奖牌,不会重复计数;
|
||||
- **导出个人明细**(个人积分榜卡片头):导出 `个人积分总明细.xlsx`——第一张总表逐条列出「单位 / 运动员 / 大项 / 小项 / 组别 / 名次 / 成绩 / 得分 / 来源」;其后每个**有得分**的单位一张分表(按单位分,不按人分),没有得分流水的人不出现在表里。`得分` 是记到个人的原始分,**与「个人积分榜」逐个数字一致,且不乘榜单口径里的个人项目得分折算系数**(那个系数只作用于单位总分);
|
||||
- **导出该单位明细**(右侧单位明细面板头部):先展开某个单位再点,导出 `单位积分明细.xlsx`(列:序号、大项、小项、组别、运动员、名次、成绩、来源、积分、备注,末行是「合计」)。单位奖牌榜展开的也是这个单位积分明细面板,所以想按单位逐条看时同样用它;
|
||||
- **导出该单位明细**(右侧单位明细面板头部):先展开某个单位再点,导出 `单位积分明细.xlsx`(列:序号、大项、小项、组别、运动员、名次、成绩、来源、积分、备注,末行是「合计」)。**备注列会写下修订痕迹**:被改过的成绩写「已修订 ×N;最后一次 <时间> <原因>」,没改过的行留空——与屏幕上那个角标是同一句话,事后拿表格对账不会对不上。单位奖牌榜展开的也是这个单位积分明细面板,所以想按单位逐条看时同样用它;
|
||||
- 这些导出都是只读下载(访客也能用),不需要写权限;导出过程中按钮会变成「导出中…」并禁用,避免重复下载。
|
||||
|
||||
### 8.4 推送明细到大屏
|
||||
@@ -569,8 +580,13 @@
|
||||
2. 点「新增通道」逐条配置,同一「名次范围 + 名次来源」只能有一个通道;
|
||||
3. 点「保存全部」整体替换该小项的通道配置;
|
||||
4. 标记为「不计分」的小项,通道可以保存但不参与积分计算;
|
||||
5. 「名次来源」选「按队内平均」时,把同一个单位(或个人)在该组别的成绩**取平均**后排名,并列按积分模板的并列口径处理(默认顺延);平均值分母取录入页选的「平均值口径」——`只算有效成绩`时是本单位有有效成绩的条数(一个人都没有效成绩的单位不参与团体排名、不得分),`全部报名人员都计入`时是本单位在该组别的报名条数(没成绩的按 0 计入)。报名表里 `status` 不是 `registered` 的报名项(弃赛 / 取消)既不算参与,也不进分母;
|
||||
6. 每条通道有一个「计入单位总分」开关,默认打开。关掉后该通道的分只记在个人头上,不进单位总分——「个人+团体」项目的个人通道就靠它做到只记个人;
|
||||
5. 「名次来源」选「按队内平均」时,把同一个单位(或个人)在该组别的成绩**汇总成一个值**后排名,并列按积分模板的并列口径处理(默认顺延)。汇总口径在该行的**「聚合口径」列**上选,两个按钮点一下即切换:
|
||||
- **平均**(默认):团体成绩 = 该单位成员成绩的**平均值**。分母取录入页选的「平均值口径」——`只算有效成绩`时是本单位有有效成绩的条数(一个人都没有效成绩的单位不参与团体排名、不得分),`全部报名人员都计入`时是本单位在该组别的报名条数(没成绩的按 0 计入);
|
||||
- **总和**:团体成绩 = 该单位成员成绩的**总和**(没成绩的人按 0 加与不加都一样)。
|
||||
- **各队人数相同时,两种口径排出来的名次完全相同**;人数不同时可能不同(这时按你们要的口径选,默认是「平均」)。改完点「保存全部」生效,该小项立即重算;
|
||||
- 报名表里 `status` 不是 `registered` 的报名项(弃赛 / 取消)既不算参与,也不进分母;
|
||||
- 不是「按队内平均」的通道这一列显示 `—`(对它没有意义);
|
||||
6. 每条通道有一个「计入单位总分」开关。**新建通道时的默认值按小项类型给**:**普通个人项目 / 团体项目默认勾选**;**「个人 + 团体」项目的个人通道默认不勾**(这类项目的个人分本来就只记个人榜、不并入单位总分)。关掉后该通道的分只记在个人头上,不进单位总分——「个人+团体」项目的个人通道就靠它做到只记个人;**所以现场要留意自己那一行的实际勾选状态**;
|
||||
7. 每条通道还有一个**「奖牌通道」**列,里面是两个开关(都默认打开):
|
||||
|
||||
| 开关 | 默认 | 关掉之后 |
|
||||
@@ -804,7 +820,7 @@
|
||||
1. 顶部可筛选小项,以及「全部时间 / 近 24 小时 / 近 7 天」;
|
||||
2. 左侧时间轴最新在上,节点显示动作(发布 / 撤销发布 / 编辑)、项目、操作人、时间与备注;
|
||||
3. 点节点,右侧显示操作人、影响单位与成绩前后对比(diff);
|
||||
4. 本页**不提供一键回滚**。纠错请到「成绩录入」:只错一条走「作废本条 → 重新录入 → 修改 → 重新发布」(见 4.10),整组要改才走「撤销发布 → 修改 → 重新发布」(见 4.7)。
|
||||
4. 本页**不提供一键回滚**。纠错请到「成绩录入」:只错一条走「点成绩格(或「修改本条」)→ 改 → 重新发布本组」(见 4.10),整组要改才走「撤销发布 → 修改 → 重新发布」(见 4.7)。
|
||||
|
||||
---
|
||||
|
||||
@@ -978,6 +994,9 @@
|
||||
### 17.3 明细覆盖层
|
||||
|
||||
- 管理端推送单位积分明细后,大屏右侧弹出半屏覆盖层,显示该单位每一分的来源;
|
||||
- 覆盖层的表头是**项目 / 组别、运动员、名次、成绩、积分**五列:团体项目、按队内平均算出的团体分这类没有单个运动员的明细,「运动员」列显示**单位名**(不显示 `null`、也不留空格);
|
||||
- **破纪录加分**那一类明细会在项目名后面多一个小标签 `破纪录`,一眼看出这几分不是名次分(人工调整的项目列本来就写着「人工调整」,不再重复打标签);
|
||||
- **被改过的成绩**在那一行下面多一行小字,形如 `10:42 已修订(成绩录入笔误)`——大屏不能悬停、观众也离得远,所以时间只写几点几分、原因超过十几个字会截断(完整的时间、原因与操作人在管理端明细的角标悬停里看);
|
||||
- 默认 **60 秒后自动关闭**并恢复轮播;
|
||||
- 管理端「关闭大屏明细」可立即关闭。
|
||||
|
||||
@@ -1002,7 +1021,7 @@
|
||||
草稿不会上屏。需要点「发布」(或 `Alt+Enter`),发布成功后立即更新。
|
||||
|
||||
**Q:发布后发现有错怎么办?**
|
||||
只错一条成绩:到「成绩录入」找到那一行,点「作废本条」→ 再点「重新录入」→ 改 → 重新发布,只动这一条(见 4.10)。
|
||||
只错一条成绩:到「成绩录入」找到那一行,**点那一格(或点「修改本条」)→ 填原因 → 确认 → 改对 → 重新发布本组**,只动这一条(见 4.10)。
|
||||
整组要改:点「撤销发布」→ 修改 → 重新发布。撤销会作废该组积分流水,大屏回退;全程可在「变更历史」追溯。
|
||||
|
||||
**Q:并列名次怎么显示?**
|
||||
|
||||
Reference in new issue
Block a user