diff --git a/README.md b/README.md index c37cb36..9df4eca 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,9 @@ - **全屏公告**:推送后先全屏显示(5–120 秒),随即常驻大屏底部公告栏,直到替换或清除 - **分批发布**:一个项目分多场跑(如跑道 8 条、30 人分 4 场)时,**每跑完一批就能先发布一批**——空成绩只是提示、**不再挡发布**,未录的行自动跳过,补录后再发一次即自动重算;名次与积分先按已发布的那部分算,大屏立刻有内容 - **实时赛况大屏页**:新增「实时赛况」页,显示当前进行中项目的实时排名(名次 / 运动员·队 / 单位 / 成绩);1 个项目单栏、2 个自动左右分栏;当前项目按「人工指定 → 排期命中(开始时间前后 30 分钟)→ 最近发布过成绩的项目」判定,**下一场开始前持续显示上一场**;可在「大屏控制 → 实时赛况」卡片配置 +- **显式批次层**:组别之下可再分批(`第 1 批`、`第 2 批`…),录入页按批筛选、只在自己这一批里找人;支持手动勾选设置批次、报名表可选列 `heat`、以及按人数「一键均分」。**批次只是录入 / 展示分组,不参与算分**——名次与积分仍按「小项 + 组别」计算 +- **成绩框实时提示**:聚焦成绩格打字时旁边浮出小气泡——合法显示解析结果(`1:06` → `= 66 秒`)、可疑 / 不合法直接说原因并带出那一格原文;不挡输入、不改行高,与发布前防呆同一套口径 +- **窄屏 / 手机可用**:管理面板适配窄窗口与手机浏览器(局域网访问 `/admin`):侧栏收成抽屉、宽表格横向滑动、对话框不超出屏幕、触控目标放大 - **小项类型齐全**:个人 / 团体 / 对抗比赛 / **个人+团体**(同一个项目同时按个人与团体通道记分) - **多显示器**:支持多屏各锁一页(kiosk 全屏),也能在管理端为指定显示器单独开窗或收窗;「大屏控制」页的「在线大屏」列表实时显示每个在线实例(含局域网浏览器打开的 `/display`)当前在哪一页,可逐屏 / 逐设备单独切页 - **规则可配置**:积分规则以规则包(YAML)描述,可导入导出、跨赛事复用 diff --git a/docs/使用手册.md b/docs/使用手册.md index 58e2c6f..6d32c98 100644 --- a/docs/使用手册.md +++ b/docs/使用手册.md @@ -18,6 +18,8 @@ > 未登录也能进管理面板,只是所有写操作按钮被禁用,顶部会出现「当前为访客只读视图」提示。 +> 个别功能对身份要求更高:「大屏控制」里的**切页、公告、锁定 / 解锁、强制刷新**(走服务端指令)记录员及以上可用;**开窗 / 收窗 / 重新排布**是服务管理程序在本机执行的操作(只在从服务管理窗口打开的面板里可用),不受角色限制;同页的「**实时赛况**」配置(模式与当前项目)属于赛事设置,**只有管理员能保存**——非管理员看到的是整组置灰加一行提示条(见第 9 节)。 + ### 1.1 登录 1. 打开管理面板地址,进入登录页; @@ -45,6 +47,8 @@ 顶部栏显示:实时连接状态、服务端版本、刷新按钮、当前账号与角色、退出按钮。左侧栏底部有快捷键提示:`Ctrl+Enter` 存草稿、`Alt+Enter` 发布。 +**窄窗口 / 手机**:管理面板可以在**窄窗口与手机浏览器**里用(局域网内访问 `http://<主机IP>:19540/admin` 即可)。窄屏下左侧导航收成抽屉(点顶栏的菜单按钮展开)、宽表格可以**横向滑动**查看、对话框不会超出屏幕、按钮与分页的点击区域也放大了,触屏点得中。录入、发布、看榜这些日常操作在手机上都能完成;赛事配置这类操作条目较多,仍建议在电脑上做。 + --- ## 3. 仪表盘 @@ -60,12 +64,24 @@ ## 4. 成绩录入 -### 4.1 选择项目 +### 4.1 选择项目与批次 1. 左侧「项目」列表按大项分组,点选要录入的小项; 2. 每个小项带状态徽标:**已发布** 或 **待录入**; 3. 多个组别时,表格上方出现组别页签,切换组别分别录入; -4. 配了「按队内平均」通道的小项(例如「个人+团体」项目的团体通道),工具栏下方会出现 **「平均值口径」单选**:`只算有效成绩`(没有有效成绩的人不进分母)或 `全部报名人员都计入`(没成绩的按 0 计入平均)。点选后立即保存到该小项,不需要另外点保存;这是小项级设置,该小项的所有组别共用。 +4. 组别页签旁边有**批次下拉**(`全部` / `第 1 批` / `第 2 批` / … / `未分批`),默认 `全部`(`未分批` 只在确实还有未分批的行时才出现)。选某一批后表格只显示那一批的人,方便录入员**只在自己这一批里找名字**,不用在一大堆人里翻; +5. 配了「按队内平均」通道的小项(例如「个人+团体」项目的团体通道),工具栏下方会出现 **「平均值口径」单选**:`只算有效成绩`(没有有效成绩的人不进分母)或 `全部报名人员都计入`(没成绩的按 0 计入平均)。点选后立即保存到该小项,不需要另外点保存;这是小项级设置,该小项的所有组别共用。 + +**批次是什么**:层级是 **大项 → 小项 → 组别 → 批次**。批次只是「把一条组别里的人分成几组,方便分批录入 / 分批查找」的**录入与展示分组**——**不参与算分**:名次与积分仍然按「小项 + 组别」整体计算,分批与否不会让分数、名次发生任何变化(评审口径不会变成「按批排名」)。批次筛选也只影响这张表格显示哪些行,不影响发布、积分榜与大屏。 + +**怎么分批**(三种方式,可混用): + +1. **手动勾选**:勾选若干行 → 在「已选 N 行」工具栏里填批次号 → 点 **设为第 N 批**;批次号留空时输入框会提示推荐的**下一个批次号**(已有最大号 + 1),也可直接写新的号;点 **清除批次** 把选中的行改回 `未分批`; +2. **报名表里填**:导入报名表时用可选列 `heat`(正整数,留空 = 未分批),见[报名名单导入规范](./报名名单导入规范.md); +3. **一键均分**:在同一个工具栏里填「每批 N 人」(默认 8),点 **一键均分**——只对**未分批**的行按当前表格顺序切片,批次号接着已有最大号往后排;**已经分好批的行一个都不动**,手工编排不会被冲掉。确认框会先说明将编排多少行、共几批、从第几批到第几批。 + +> 批次号是 1–999 的整数。切换组别后批次筛选与勾选都会重置(批次是「组别之下」的概念,换组别后旧的批次号没有意义)。 +> 分项成绩表与导出**暂不**按批次分块,导出的仍是整组成绩——需要按批查看时,请在「成绩录入」页用批次下拉筛选。 > 团体成绩 = 该单位在本组别所有报名项成绩的平均值(成绩从每个人那一行读),由系统算出来:正常流程是给每个参赛人员各报一条(走 10.7 的「个人报名」),成绩照常录到每个人那一行,团体那一行(如果也报了)不用填成绩。 > 选「全部报名人员都计入」时,只报了单位、一个人都没报(或队员都没成绩)的那条报名也会按 0 进分母,会把该单位的平均成绩拉低;口径与算法见 10.2「大项 / 小项」与 10.4「计分通道」。 @@ -76,7 +92,7 @@ | 列 | 操作 | | --- | --- | -| 成绩输入 | 直接输入成绩;工具栏会提示当前单位(秒 / 米 / 次 / 分),成绩格比过去更宽,四位数也看得全 | +| 成绩输入 | 直接输入成绩;工具栏会提示当前单位(秒 / 米 / 次 / 分),成绩格比过去更宽,四位数也看得全;打字时格子旁边会浮出一个小提示(见下) | | 名次 | 自动排名项目由系统自动计算,不可编辑;手动名次项目(录入方式为「手动名次」或比较方式为「不比较」)可直接填名次 | | 状态 | 下拉选择:**有效**、**DNS 弃赛**、**DQ 取消**、**DNF 未完赛**、**退赛** | | 积分(自动) | 随成绩实时计算,仅供参考 | @@ -88,6 +104,15 @@ - 距离 / 计数 / 得分类:按工具栏提示的单位填数字,如米 `12.34`、次 `12`、分 `96.5`; - 秒位 ≥ 60 仍然拒绝(`1:70` 不是 70 秒),但报错会写明原因(见 4.4)。 +**打字时的实时提示**:光标停在某个成绩格里打字时,**这一格旁边会浮出一个小提示**,边打边告诉你系统怎么理解它——不用等发布才知道对错。提示分三种: + +- **合法** → 直接显示**解析结果**,例如打 `1:06` 显示 `= 66 秒`、打 `66.33` 显示 `= 66.33 秒`(米 / 次 / 分项目显示对应单位),让你确认系统理解的和你想的是同一个数; +- **可疑** → 例如 `成绩 ≤ 0,疑似录入错误`,放行但提个醒; +- **不合法** → 直接说明原因,并**带出那一格的实际内容**,例如 `秒位不能 ≥ 60(当前「1:70」),请写成 1:06 或 66 这类`、`成绩写法无法识别(当前「约1分06秒」),可用 66、66.33、1:06、1:06.33、1分06秒`; +- **空格子不提示**(还没录是正常状态);提示只是浮层,**不接收点击、不占布局、不会改变行高**,继续打字不受影响;靠屏幕底部时提示会自动翻到格子上面显示。 + +这个提示与发布前的「防呆校验」(见 4.4)**用的是同一套判定**,不会出现「打字时说没问题、发布时却被拦下」这种自相矛盾。 + **示例文本不是已填内容**:空格子里显示的 `例 1:06.33`(距离 `例 12.34`、计数 `例 12`、得分 `例 96.5`)是**更淡的斜体灰字**,只是告诉你大概怎么写,**不代表这一格已经有成绩**。灰字不会被提交;点发布时如果那一格还是灰字,就按「还没录」自动跳过(本次不发布这一行),不会连累其他已填成绩的发布。过去示例文本长得和真实输入一样,容易看成「我已经填了」。 右侧「实时积分预览」显示:若现在发布,各单位积分的变化、最大分差、受影响单位数。 @@ -122,6 +147,8 @@ 有**错误**时点「发布」会被拦下并提示第一处问题;只有提醒(含还没录的行)时发布会照常进行,未录的行自动跳过。 +> 这套判定与打字时格子旁的实时提示(见 4.2)**同源**:输入时看到的解析结果 / 报错原因,与这里、以及发布时的拦截口径完全一致。 + ### 4.5 存草稿与发布 1. **存草稿**:保存当前组别的成绩,草稿**不会上屏**,也不计入积分榜;有未保存修改时页面会显示「有未保存修改」徽标。 @@ -260,6 +287,8 @@ 页面顶部徽标显示当前是「轮播中」还是「已锁定」。 +> **权限**:本页的**切页、公告、锁定 / 解锁、强制刷新**(服务端指令)记录员及以上都能用;**开窗 / 收窗 / 重新排布**由服务管理程序在本机执行,不受角色限制(该卡片只在从服务管理窗口打开的面板里可用);只有「实时赛况」卡片(模式与当前项目)属于赛事设置,**仅管理员能保存**,非管理员看到的是整组置灰 + 一行提示条。 + **公告**:点「推送公告」后所有大屏先**全屏**展示这条公告,到时间后自动退回原来的页面(没锁定就继续轮播),公告正文留在底栏的「公告」槽位继续显示,直到被新公告替换或点「清除公告」。公告卡片顶部徽标显示「当前公告:有 / 无」,徽标下面那一行就是当前公告正文(没有公告时显示「暂无公告(大屏底栏显示占位)」)。公告会随赛事设置保存:新开的大屏窗口、断线重连之后,会先把当前公告再全屏播一遍(默认 15 秒)后留在底栏;点「清除公告」后底栏回到「暂无公告」占位。 **实时赛况**:「实时赛况」卡片决定大屏「实时赛况」页显示哪几个项目(**最多 2 个**)。 @@ -268,7 +297,7 @@ - **项目 1 / 项目 2** 两个下拉:从当前赛事的小项里选(选项里有「未指定」),已选的行可以「清除」;同一个项目不会重复占两个槽位; - **当前生效**:显示此刻大屏实际会显示的项目与入选原因,格式如 `男子 100 米(排期命中)`;没有可显示的项目时显示「当前没有可显示的项目」。旁边的「刷新」只重新读取,不改配置; - **保存**:改完模式或项目后点「保存」,提示「实时赛况设置已保存」后大屏按新配置显示;卡片底部注明「当前项目最多 2 个」; -- 该卡片的「保存」需要**管理员**身份(实时赛况属于赛事设置,只有管理员能改);示例数据模式下不能保存。 +- 该卡片的「保存」需要**管理员**身份(见本节开头的权限说明);示例数据模式下不能保存。 **在线大屏**:右侧「在线大屏」卡片列出的是**真实**的在线实例,直接读服务端 `GET /api/display/instances`,打开页面时每 5 秒自动刷新一次(浏览器切到后台时暂停,切回来立刻补一次)。每个实例一行,显示实例 ID、在线 / 离线徽标、「局域网浏览器」或「屏 N」标记、当前所在页、来源地址与最后心跳;服务端判定某个实例落后时还会多一个「落后」徽标(大屏可能在卡或网络差)。**本机用 Console 打开的大屏窗口、以及局域网设备打开 `/display` 连上的浏览器,都会出现在这里**——局域网浏览器没有屏号,那一栏显示「局域网浏览器」。离线实例会在服务端保留一段时间,方便排查它是什么时候掉的。 @@ -374,6 +403,8 @@ 3. 用「上移 / 下移」调整顺序,「移除」删除; 4. 点「保存全部」整体替换该小项的组别配置。**若该项目已有报名数据,服务端会拒绝替换。** +> **组别之下还有「批次」**:批次(`第 1 批`、`第 2 批`…)是在**成绩录入页**给报名行分的录入 / 展示分组,不属于这里的组别配置,也**不参与算分**——名次与积分仍按「小项 + 组别」整体计算。怎么分批见 4.1。 + ### 10.4 计分通道 通道 = 「排谁的名次 + 名次从哪来 + 用哪张积分模板」。 diff --git a/docs/常见问题.md b/docs/常见问题.md index 1506002..83e8cd4 100644 --- a/docs/常见问题.md +++ b/docs/常见问题.md @@ -472,3 +472,47 @@ Console 启动的多屏窗口默认每屏锁定一页。到「大屏控制」点 会**自动左右分栏**,每个项目一栏,最多 2 栏(一个项目时单栏铺开,不会分栏)。每栏显示该项目的名次、运动员 / 队、单位(带单位 logo)与成绩,按名次升序、最多列前 10 个名次;同一个小项分了多个组别时,栏里显示最近发布的那一组,标题旁用「另有 N 组」标注。 场地上两个项目时间撞在一起、自动判定没选中你想看的组合时,让管理员到「大屏控制 → 实时赛况」把模式切到「人工指定」,把这两个项目分别选进「项目 1」「项目 2」并保存即可(该设置只有管理员能保存)。 + +**Q81:批次是什么?和组别、名次有关系吗?** +批次是**组别之下**的一层**录入 / 展示分组**,层级是「大项 → 小项 → 组别 → 批次」。它**不参与算分**:名次与积分仍然按「小项 + 组别」整体计算,一个人分到第几批不会改变他的名次、分数,也不会变成「按批排名」。批次只影响「成绩录入」页里表格显示哪些行(批次下拉筛选)与录入时的查找,发布、积分榜与大屏都不受它影响。 + +- 批次号是 **1–999 的整数**;**留空 = 未分批**(以前导入的报名没有批次,就是未分批); +- 批次在**成绩录入页**设置(见 Q82)或由报名表的 `heat` 列带进来(见 Q83),不在「基础数据 → 组别」里配; +- 切换组别后批次筛选会重置(批次是组别之下的概念); +- 分项成绩表与导出**暂不**按批次分块,导出的仍是整组成绩。 + +**Q82:怎么把 30 个人分成每 8 人一批?** +到「成绩录入」页选中该小项与组别,工具栏里填「每批 8 人」(默认就是 8),点「一键均分」,确认框会先说明将编排多少行、共几批、从第几批到第几批,确认即可。规则是: + +- 只对**未分批**的行、按当前表格显示顺序切片; +- **已分批的行一个都不动**,手工编好的批次不会被冲掉; +- 新批次号**接着已有最大号往后排**(已有第 1、2 批时,从第 3 批开始); +- 列表里没有未分批的行时按钮不可用,鼠标停上去会说明原因。 + +也可以手动分批:勾选若干行 → 在「已选 N 行」工具栏里填批次号(留空会提示推荐的下一个号)→ 点「设为第 N 批」;点「清除批次」把选中的行改回未分批。 + +**Q83:报名表要加批次怎么填?** +报名表新增了可选列 `heat`:填 **1–999 的正整数**,同一小项 + 组别里号相同的就是同一批;**留空 = 未分批**,不报错。列的先后顺序可以随便调,列名写 `heat`(大小写不敏感)。 + +- 填了非整数、0 或超过 999(如 `第1批`、`一组`、`1000`)的行会被跳过,提示「heat 需要是 1-999 的整数(留空表示未分批)」,其余行照常导入; +- ⚠️ **重新上传同一份表会整条覆盖**:表里 `heat` 留空会把这一行原来的批次清掉,手工调整过批次的话重传前要在表里写清楚; +- 完整说明见[报名名单导入规范](./报名名单导入规范.md)。 + +**Q84:成绩格旁边那个小提示是什么?** +那是**聚焦成绩格时的实时提示**:光标停在某个成绩格里打字时,格子旁边会浮出一个小气泡,边打边告诉你系统怎么理解它。 + +- **合法** → 显示**解析结果**,例如打 `1:06` 显示 `= 66 秒`(米 / 次 / 分项目显示对应单位),让你确认系统理解的和你想的是同一个数; +- **可疑** → 例如 `成绩 ≤ 0,疑似录入错误`,放行但提个醒; +- **不合法** → 说明原因并**带出那一格的实际内容**,例如 `秒位不能 ≥ 60(当前「1:70」),请写成 1:06 或 66 这类`、`成绩写法无法识别(当前「约1分06秒」),可用 66、66.33、1:06、1:06.33、1分06秒`; +- **空格子不提示**;气泡不接收点击、不占布局、不改变行高,继续打字不受影响;靠屏幕底部时会自动翻到格子上方显示。 + +它和发布前的「防呆校验」用**同一套判定**,不会「打字时说没事、发布时被拦下」。 + +**Q85:手机上能打开管理面板吗?** +可以。管理面板已适配窄窗口与手机浏览器:在**同一局域网**内用手机浏览器打开 `http://<主机IP>:19540/admin` 即可(与电脑访问同一个地址)。窄屏下: + +- 左侧导航收成抽屉,点顶栏的**菜单按钮**展开; +- 宽表格可以**左右滑动**查看(表头保留); +- 对话框不会超出屏幕,按钮与分页的点击区域也放大了,触屏点得中。 + +录入、发布、看榜这些日常操作手机上都能做;赛事配置这类条目较多的操作仍建议在电脑上完成。如果某台手机上仍显示不全,请把**机型、浏览器与屏幕宽度**(或截图)告诉维护人员——目前适配覆盖到 390px 宽的窄屏,桌面端布局不受影响。 diff --git a/docs/报名名单导入规范.md b/docs/报名名单导入规范.md index cd84873..eb0361d 100644 --- a/docs/报名名单导入规范.md +++ b/docs/报名名单导入规范.md @@ -10,14 +10,14 @@ ## 一、先看懂三件事 1. **用什么软件做表**:Excel 或 WPS 都行,做完存成 `.xlsx` 或 `.csv` 都可以(推荐 `.csv`,系统兼容性最好,不用管编码)。 -2. **表格长什么样**:**第一行是表头**(固定的 11 个英文列名),**从第二行开始每人一行**。不要合并单元格,不要在表头上方再加标题行、说明行。 +2. **表格长什么样**:**第一行是表头**(固定的 12 个英文列名),**从第二行开始每人一行**。不要合并单元格,不要在表头上方再加标题行、说明行。 3. **编码不能自己编**:表里的「小项编码」「单位编码」「组别名称」必须是系统里已经配好的,**照抄系统里的写法**。系统里没有的编码,这一行会被跳过并报错。 --- ## 二、表头(第一行的列名) -一共 11 列。**列名请直接用下面这套英文名,不要翻译成中文**;列的**先后顺序可以随便调**,多出来的列系统会忽略。 +一共 12 列。**列名请直接用下面这套英文名,不要翻译成中文**;列的**先后顺序可以随便调**,多出来的列系统会忽略。 | 列名 | 是否必须 | 填什么 | 示例 | |---|---|---|---| @@ -30,6 +30,7 @@ | `age` | 可选 | 年龄,0–120 的整数 | `26` | | `bib` | 可选 | 号码布 | `101` | | `seed` | 可选 | 道次 / 种子,随便写或留空 | `种子1` | +| `heat` | 可选 | 批次号:1–999 的整数;**留空 = 未分批**(不参与算分,见下) | `1` | | `status` | 可选 | 报名状态:4 个英文词(大小写都行)或等价的中文别名(见下) | `registered` | | `member_names` | 可选 | 团体项目的队员名单,多人用 `/` 隔开 | `张三/李四/王五` | @@ -75,6 +76,17 @@ ### `seed` 道次 / 种子 自由填写,可以留空。系统只做记录,不参与算分、不影响名次。 +### `heat` 批次 —— 可以留空 +给同一组别的人**分批**用的号:填 **1–999 的正整数**,留空表示「未分批」。现场分批比赛(例如 100 米跑道只有 8 条、一组 30 人要分 4 场跑)时,填上批次,录入员就能在「成绩录入」页按批筛选,只在自己这一批里找人录成绩。 + +- **批次不参与算分**:名次与积分仍然按「小项 + 组别」整体计算,分批与否不会改变任何分数与名次;批次只是录入 / 展示分组; +- 同一小项、同一组别里,批次号相同的人就是同一批;批次号不要求连续,也不要求从 1 开始; +- 格子**留空**就是未分批,不报错; +- 填了不是整数、或超出 1–999(例如 `第1批`、`0`、`1000`),这一行会被跳过并提示「heat 需要是 1-999 的整数(留空表示未分批)」,其余行照常导入; +- 重新上传同一份表会把这一列**整条覆盖**:表里留空就会把这行原来的批次清掉(见第七节第 2 条)。 + +> 不想在报名表里写批次也行:导入后到「成绩录入」页勾选若干行点「设为第 N 批」,或用「一键均分」按人数自动分批(见[使用手册 · 4.1](./使用手册.md#41-选择项目与批次))。 + ### `status` 报名状态 —— 英文词或中文别名都认 **大小写不敏感**(`registered`、`Registered`、`DNS` 都认),也可以直接写中文: @@ -110,12 +122,12 @@ 表头那一行照抄,下面每人一行。假设 `M100` 是按年龄分组的男子100米,`F1`/`F2` 是两个单位: -| event_code | category | team_code | athlete_name | id_card | gender | age | bib | seed | status | member_names | -|---|---|---|---|---|---|---|---|---|---|---| -| M100 | 男子30岁以下 | F1 | 张伟 | 110101199001011234 | 男 | 26 | 101 | | registered | | -| M100 | 男子31岁以上 | F1 | 李强 | 110101198505054321 | 男 | 41 | 102 | | registered | | -| M100 | 女子组 | F2 | 王芳 | | 女 | | 202 | | registered | | -| W100 | 女子组 | F2 | 王芳 | 110101199203031234 | 女 | 34 | 202 | | registered | | +| event_code | category | team_code | athlete_name | id_card | gender | age | bib | seed | heat | status | member_names | +|---|---|---|---|---|---|---|---|---|---|---|---| +| M100 | 男子30岁以下 | F1 | 张伟 | 110101199001011234 | 男 | 26 | 101 | | 1 | registered | | +| M100 | 男子31岁以上 | F1 | 李强 | 110101198505054321 | 男 | 41 | 102 | | 1 | registered | | +| M100 | 女子组 | F2 | 王芳 | | 女 | | 202 | | 2 | registered | | +| W100 | 女子组 | F2 | 王芳 | 110101199203031234 | 女 | 34 | 202 | | 2 | registered | | 要点:**同一个人报多个项目,就写多行**(如上面的王芳报了两项);每行的 `event_code` 不同。 @@ -123,12 +135,12 @@ `BB` 是「多人抓杆蛇形跑」,七家单位各出基层组和领导组两支队伍: -| event_code | category | team_code | athlete_name | id_card | gender | age | bib | seed | status | member_names | -|---|---|---|---|---|---|---|---|---|---|---| -| BB | 基层组 | F1 | | | | | | | registered | 张三/李四/王五/赵六 | -| BB | 基层组 | F2 | | | | | | | registered | 钱七/孙八 | -| BB | 领导组 | F1 | | | | | | | registered | 周九 | -| BB | 领导组 | F3 | | | | | | | registered | | +| event_code | category | team_code | athlete_name | id_card | gender | age | bib | seed | heat | status | member_names | +|---|---|---|---|---|---|---|---|---|---|---|---| +| BB | 基层组 | F1 | | | | | | | | registered | 张三/李四/王五/赵六 | +| BB | 基层组 | F2 | | | | | | | | registered | 钱七/孙八 | +| BB | 领导组 | F1 | | | | | | | | registered | 周九 | +| BB | 领导组 | F3 | | | | | | | | registered | | 要点:`athlete_name` 一列**全部留空**;不参赛的单位**不写行**(不写就是没报名);最后一行是不写队员的纯单位报名,也是允许的。 @@ -140,13 +152,14 @@ ## 五、导入前请先检查(自检清单) -- [ ] 第一行是那 11 个英文列名,没有被翻译、没有被合并单元格 +- [ ] 第一行是那 12 个英文列名,没有被翻译、没有被合并单元格 - [ ] 表头上方没有多余的标题行或空行 - [ ] `event_code`、`team_code` 都是从系统里抄的编码,没有空格 - [ ] `category` 与系统里的组别名一字不差 - [ ] 个人行都有姓名,且都有证件号或号码布 - [ ] 一份表里没有重复的证件号、没有重复的号码布 - [ ] `status` 只用那 4 个英文词(大小写都行)或第三节列的中文别名,不写别的词;拿不准就留空 +- [ ] `heat` 要么留空,要么是 1–999 的整数(不参与算分,只是录入分组) - [ ] 全表没有因为"怕麻烦"把某些列删掉——**表头 8 个必须列一个都不能少**(哪怕整列是空的) --- @@ -165,6 +178,7 @@ | 第 N 行:填写了 athlete_name 就必须填 id_card 或 bib | 个人行缺两项唯一标识 | 补证件号或号码布;确实都没有的,请先在「运动员」里登记 | | 第 N 行:证件号 / 号码布 … 在报名表内重复出现 | 同一份表里同一个人出现了两次 | 删掉重复行(同一个人报多个项目时,`event_code` 必须不同) | | 第 N 行:status「xxx」无法识别 | `status` 填了系统不认的词(4 个标准词以外的英文,或第三节没列的中文) | 改成 `registered` / `scratched` / `dq` / `dns`(大小写都行)或第三节列的中文别名,也可以留空(= 正常参赛);改完重新上传 | +| 第 N 行:heat 需要是 1-999 的整数(留空表示未分批) | `heat` 填了非整数、0、负数或超过 999 的值(如 `第1批`、`一组`、`1000`) | 改成 1–999 的整数,或者整格留空(= 未分批);批次只影响录入分组,不参与算分 | | 提示「冲突」,人员没有写入 | 这个人在系统里已有记录,但姓名 / 性别 / 年龄 / 单位 / 号码布跟表里**对不上** | 在导入结果里逐条选「保留已有数据」或「使用新数据」,选完再提交 | | 文件传不上去 | 超过 16MB | 拆分上传,或改用 xlsx | | 只导入了第一张表 | xlsx 只读第一个工作表 | 把要导入的数据放在第一个工作表里 | @@ -178,7 +192,7 @@ - **更新**:这个人本来就有这个项目的报名,用表里的信息覆盖了(**不会产生重复报名**); - **跳过**:没能导入的行,会带着**行号**列出来,改好那几行重新上传即可。 2. **重复上传同一份表是安全的**,不会把名单变成两份。改完再传一遍就行。 - - ⚠️ 但要注意「更新」是**整条覆盖**:表里空着的格会把系统里原来的值清掉(队员名单、道次、号码布都会被清空),`status` 空着会被重置成「正常参赛」。如果之前手工调整过某些人的状态,**重传前请在表里把 `status` 写清楚**。 + - ⚠️ 但要注意「更新」是**整条覆盖**:表里空着的格会把系统里原来的值清掉(队员名单、道次、号码布、**批次**都会被清空),`status` 空着会被重置成「正常参赛」。如果之前手工调整过某些人的状态或批次,**重传前请在表里把 `status`、`heat` 写清楚**。 3. 名单导入后,到「成绩录入」里录成绩、发布,积分榜就会自动更新。 4. **被「彻底删除」的人,导入时会以新人员建档**:管理员彻底删除某个人时,他的档案连同他名下的报名与成绩会一起从库里删掉;之后表里再出现同一个证件号或号码布,系统匹配不到旧档案,会把他当作**新人员**重新建档——名单里多出一条「以前删过的人」通常就是这么来的。新档案是全新的,他以前的报名、成绩与积分不会回来,需要重新录。 5. **被「彻底删除」的单位则相反,导入时会「复活」**:管理员彻底删除某个单位,只是把它从单位列表里移除,它的报名与成绩一条都没删;表里再出现这个 `team_code`,系统按编码复用原来那条单位记录,清掉删除标记并让它重新出现在列表里,**原有的报名、成绩与积分都还在**,也不会新建第二个同名单位。 @@ -194,4 +208,5 @@ > 5. 团体项目:姓名列留空,队员写进 `member_names`,多人用 `/` 隔开; > 6. 拿不准的列**留空**,不要写「无」「/」「—」这类符号; > 7. 表里**不要合并单元格**、不要加标题行、不要插图; -> 8. 填完先对着第五节的清单自查一遍,再发给收表人。 +> 8. 填完先对着第五节的清单自查一遍,再发给收表人; +> 9. **批次(`heat`)**可以不填;要分批比赛就填 1–999 的整数,它只影响录入时怎么分组找人,**不影响成绩与名次**。 diff --git a/docs/部署指南.md b/docs/部署指南.md index 0bfb47e..b1ffd8a 100644 --- a/docs/部署指南.md +++ b/docs/部署指南.md @@ -36,7 +36,7 @@ deploy\build.bat | `dist\console\Scoreboard Console-0.1.1-x64.zip` | 免安装包 | 解压即用 | | `dist\console\win-unpacked\` | 目录 | 未压缩的运行目录,便于现场调试 | -> 版本号来自仓库根的 `VERSION` 文件:构建时由 `deploy\build.bat` 注入服务端二进制(`-ldflags -X main.version`,运行期不再读任何文件),并同步到 `console\package.json` 决定安装包/免安装包的文件名。升级版本只改 `VERSION` 一处;以 `dist\console\` 下的实际文件名为准。 +> 版本号来自仓库根的 `VERSION` 文件:构建时由 `deploy\build.bat` 注入服务端二进制(`-ldflags -X main.version`,运行期不再读任何文件),并同步到 `console\package.json` 决定安装包/免安装包的文件名。**当前版本 `dev_0.1.1`**,在管理端「关于」页与 `GET /api/health` 里都能看到(没走构建脚本直接 `go build` 时兜底显示 `dev`,不编造版本号)。升级版本只改 `VERSION` 一处;以 `dist\console\` 下的实际文件名为准。 > > 目标机器**不需要** Go / Node / pnpm,也不联网;上述工具只用于构建机。 >