feat: add party-size queueing and call modes

This commit is contained in:
wangxuming
2026-07-16 11:40:34 +08:00
parent 7f751bebae
commit 66951b4dc3
53 changed files with 3348 additions and 533 deletions

View File

@@ -1,5 +1,115 @@
# 景区排队叫号系统:调研发现与决策台账
## Phase 36 员工端取号同行人数输入修复2026-07-16
- 用户反馈员工端取号页的“同行人数”输入框存在默认值 `1` 被固定、无法顺畅改成其他人数的问题。
- 本轮只修复输入交互与相应回归测试,不改变项目配置的人数上下限、取号 API 契约或服务端校验。
- 根因已定位在受控输入的 `onChange``Number(event.target.value) || minPartySize` 会把清空产生的空字符串立即转换并回填为最小人数 `1`,导致用户无法按“删除旧值 → 输入新值”的正常方式编辑。
- 修复需要让前端表单草稿的 `party_size` 临时接受空字符串;只有提交时才收窄为整数并校验项目上下限,发给 API 的字段仍保持 `number`
- 表单草稿现使用 `number | ""`,项目切换时仍会把空值或越界值恢复到新项目最小人数;成功取号后同样恢复到项目最小人数,既修复编辑体验又保留原重置行为。
- 定向 8 项员工页测试与 TypeScript 双配置检查通过;新增断言覆盖默认 `1` 被清空后保持为空、再输入 `3` 并正常取号的完整路径。
- 前端全量 14 个测试文件、52 项测试及 Vite 生产构建通过;真实员工取号页已打开,首个快照处于正常的会话权限确认加载态,待页面完成渲染后继续输入验证。
- 真实页面首次交互中,`fill("")` 后读取输入值仍为 `1`;这与新回归测试结果矛盾,当前更可能是运行中的开发服务没有加载最新模块,或页面数据初始化存在测试未覆盖的二次回填,必须继续定位后再验收。
- `:5173` 的 Vite 转换源码已明确包含新的空字符串分支,排除旧进程/旧模块;失败后的 DOM 显示输入仍聚焦且值为 `1`,下一步改用真实键盘的全选删除路径,判断是自动化 `fill("")` 行为差异还是 React 状态仍被重置。
- 真实键盘路径验证通过:对默认 `1` 执行全选 + Backspace 后 DOM 值稳定为 `""`,继续键入 `3` 后值为 `"3"`;用户实际编辑路径已修复,未提交真实取号数据。
- 首次 `fill("")` 结果是数字输入框与浏览器自动化直接填充方法的差异,不代表 React 状态仍被回填;以实际键盘操作和组件回归测试作为交互验收依据。
- 最终 DOM 显示同行人数为 `3`,项目提示仍为 110 人;浏览器控制台无 error/warn修复后的取号页已保留供直接查看。
## Phase 35 员工端队列增量展开2026-07-16
- 前端 Vite 已监听 `:5173`Go API 已监听 `:8080``/healthz` 返回 `status: ok`;用户要求的“启动项目”当前已满足,无需重复启动占用端口。
- 当前队列默认切片 10 项,但点击“查看更多”会把接口已返回的全部等待号码一次性渲染;真实队列可达 200 项,会让页面高度瞬间大幅增长。
- 最新口径按页面空间优化处理:继续复用现有队列快照,不修改 API每次点击只把可见上限增加 10属于按需渲染而非新增服务端分页。
- 保留“收起”可让用户随时回到 10 项;切换项目或员工场景时也应重置为 10 项,避免把上一上下文的展开量带入新页面。
- 增量控制不改变 FIFO 顺序、叫号 revision、轮询刷新、队列总指标或列表行布局。
- 真实员工队列浏览器实测为 10 → 20 → 30 → 10 项;对应页面高度为 1606 → 2372 → 3079 → 1606px证明每次只追加一页且列表继续随页面自然延展。
- 第一次追加后“查看更多”和“收起”同时存在,第二次仍可继续追加;收起后只保留“查看更多”,不存在一次性渲染全部队列的回退。
- 浏览器控制台无 error/warn员工端定向 8 项、前端全量 14 个文件 52 项测试、TypeScript 检查和 Vite 生产构建全部通过。
## Phase 34 员工端批量按钮与指标分隔2026-07-15
- 最新反馈只调整员工端叫号页,不能影响正在进行的 Phase 33 管理端项目表单结构化工作,也不改叫号 API、模式参数、数量上限或禁用条件。
- 当前“按号码叫号”和“按人数叫号”按钮均使用深绿色 `button--primary`;本轮将复用现有浅色按钮体系,避免新增独立颜色 token。
- 可见按钮文案按用户指定改为“批量叫号”和“批量叫人”;模式容器与输入框仍保留精确业务语义,确保屏幕阅读器能区分号码数量与目标人数。
- 移动端指标为两列布局。全局三列规则会对第 4 项应用 `nth-child(3n+1)` 并清除左边框,现有移动端规则只清除奇数项边框、没有重新给偶数项加回边框,因此“下一个号”和“下个号人数”之间缺线。
- 修复应限定在 `max-width: 720px`:偶数项恢复左边框、奇数项继续无左边框;桌面三列首项规则保持不变。
- 390×844 真实页面中两个批量按钮均计算为白色背景、绿色边框与绿色文字;旧按钮文案计数为 0快速叫号仍是白字主操作。
- “下个号人数”卡片左边框计算宽度为 1px、颜色为 `rgb(213, 222, 216)`,与“下一个号”卡片边界零间隙衔接;页面 `scrollWidth=clientWidth=390`
- 普通 390×844 视口截图显示叫号卡宽 366px、页面壳宽 390px两个浅色按钮和指标中线均正常失真的 `fullPage` 截图属于接管旧标签后的截图合成问题,不是页面布局问题。
- 720px 边界仍为两列,第四项左边框为 1px721px 恢复三列,第四项作为新行首项左边框为 0证明修复未破坏桌面边框逻辑。
- 原始参考图、当前叫号模块、修复前指标和修复后指标已放入同一次视觉对照;最新文字需求全部体现,未发现 P0-P3 遗留问题,`design-qa.md` 最终状态为 passed。
## Phase 33 项目表单结构化2026-07-15
- 用户要求的字段已存在于共享 `ProjectForm`,新建和维护也已复用同一套草稿与提交逻辑;本轮无需修改 API 或数据模型。
- 现状把 13 个字段平铺在一个 `.settings-grid` 中,基础属性、叫号约束和展示规则没有语义层级,不利于快速扫读和维护。
- 信息架构按用户口径固定为三组:基础信息(名称、编码、格式、状态);叫号规则(支持方式、单号最少/最多人数、按号码默认/单次上限、按人数默认/单次上限);其他规则(已体验起始数、每人预计间隔、官方提示)。
- “单次山限”按上下文解读为“单次上限”;页面保留现有“按号码/按人数”精确业务文案,避免“批量叫号/批量叫人”在员工端产生歧义。
- 这是保留式后台重构,沿用现有品牌绿、圆角、原生表单控件与 CSS 变量,不新增组件库或装饰动效。
- 产品手册中的历史“项目维护”截图显示为旧版极窄布局,与当前已统一的宽屏管理端代码不一致;它仅用于确认历史问题,本轮视觉验收必须以当前运行页面为准。
- 1440×1000 真实页面中,表单宽 1376px三个分区均采用“左侧分组说明 + 右侧字段”结构,页面 `scrollWidth` 等于视口宽度,无水平溢出。
- 首次桌面实测发现,成对字段中带辅助说明的“单次上限”会因 Grid 默认拉伸,将旁边默认值输入框下移约 14px已为分组内字段增加顶部对齐约束。
- 修正后桌面实测的单号人数、批量叫号、批量叫人三组成对输入框 Y 坐标分别完全一致,基线错位已消除。
- 390×844 实测中,表单宽 358px三个主分区均收敛为单列叫号规则每行收敛为“标题说明在上、两个成对字段在下”每列 139px页面无水平溢出。
- 真实项目列表已加载 3 个“维护”入口;首个维护路由为 `/admin/projects/16f75858-8a19-4f79-bd39-eeda4a86f1ad`,可用于复验共享表单在已有数据回填场景下的结构与响应式表现。
- 真实维护页已正确回填项目名称、编码、格式、状态及全部叫号/其他规则字段DOM 中保留三处分区和四个叫号规则分组,保存入口正常出现。
- 维护页在 390×844 下 `scrollWidth=clientWidth=390`1440×1000 下三处分区均为约 `285px + 1017px` 两栏,三组成对数字输入框的 Y 坐标分别完全一致,页面 `scrollWidth=clientWidth=1440`
- 新建页与真实维护页的浏览器控制台均无 error/warn临时响应式视口已恢复验收标签页已关闭。
- 最终前端全量验证通过14 个测试文件、52 项测试全部成功,应用与 Node TypeScript 检查通过Vite 生产构建成功。
- 本轮目标文件和三份项目台账的 `git diff --check` 通过;工作树中仍保留用户已有的其他未提交改动,本轮未清理、回退或暂存。
## Phase 32 员工端叫号指标与队列展示2026-07-15
- 参考图只用于确认员工端统一叫号卡的结构与品牌语言;本轮继续沿用仓库现有 Logo、绿色主色、圆角和响应式体系不新增视觉资产。
- 用户明确要求移除的是叫号模块内部横线:标题下方分隔线和窄屏两种叫号模式之间的横线都应删除;宽屏模式之间现有竖向分隔不属于本次删除范围。
- 按号码叫号按钮当前使用次要描边样式,按人数叫号使用绿色主按钮;统一颜色应让两者都采用同一个绿色主按钮样式,输入框与禁用逻辑保持不变。
- 指标目标为六项:最新叫到、本次叫号人数、下一个号、下个号人数、剩余未叫号、剩余未叫人数;不再展示最末号数和最末号预计时长。
- 下个号人数可直接取等待队列首项 `party_size`;剩余未叫号和剩余未叫人数分别使用已有 `waiting_ticket_count``waiting_people_count`,不需要修改 API。
- 队列默认仅渲染前 10 项;超过 10 项时显示可访问的“查看更多/收起”按钮。展开只改变前端可见切片,不改变队列顺序或轮询数据。
- “不要容器、页面自适应延展”按去除队列 `ol` 的固定高度、内部滚动、边框和圆角处理;展开后由页面本身滚动,叫号吸顶与底部导航行为保持现状。
- 队列每行改为三个等宽轨道:号数左对齐、人数居中、已等待分钟右对齐,保证移动端和宽屏都具有均匀对称的扫描节奏。
- 仓库无 `.project-docs`,无需触发额外项目文档维护流程;当前工作树仍包含大量既有改动,本轮只增量修改员工页、员工页测试、样式和既有台账。
- 390×844 真实页面测量:两个叫号按钮背景均为 `rgb(11, 107, 58)`;标题下边框和第二模式横向边框均为 0旧末号指标数量为 0。
- 390px 队列首屏恰好 10 项,三列计算宽度均为 98.664px,内容中心点约为 66/195/323px左右间距对称整页 `scrollWidth=clientWidth=390`
- 队列列表计算样式为 `max-height:none``overflow-y:visible`、0 边框/0 圆角,收起时 `clientHeight=scrollHeight=701px`,不存在内部滚动容器。
- 真实“查看更多”展开后渲染接口返回的 200 项,页面高度由 1684px 增至 15104px列表自身 `clientHeight=scrollHeight=14122px`;收起后恢复 10 项和 1684px 页面高度。
- 移动端滚动到 `scrollY=840.5` 时页头底边和叫号吸顶层顶边同为 83px重叠为 0控制台无 error/warn。
- 1280px 桌面与 720px 平板均无横向溢出、默认 10 项、列表无内部滚动且三列等宽桌面保留模式间竖向分隔720px 以下不出现任何模式分隔横线。
- 参考图、390px 聚焦裁图与完整页面已在同一次对照输入中复核;按最新文字需求产生的按钮色和分隔线差异为有意变更,未发现 P0-P3 视觉问题,根级 `design-qa.md` 最终状态为 passed。
## Phase 31 员工端叫号模块与通知2026-07-15
- 本轮只调整员工端现有业务工作台,保留当前品牌、路由、叫号 API 与高密度操作语言。
- 目标文件 `StaffPage.tsx``StaffPage.test.tsx``styles.css` 已有未提交改动,必须基于当前工作树增量修改,不能回退其他在途功能。
- 当前代码已有叫号反馈状态、按号码/人数模式和 `staff-call-notice` 样式线索,需读取当前实现与工作树差异后判断哪些需求已部分落地。
- 验收口径:通知可访问地手动关闭、每条新通知从创建起 5 秒自动移除;两种叫号入口保留业务能力但共享一个主标题和一个吸顶容器。
- `notice` 当前是单条可空状态,叫号前会清空,成功或失败后写入;尚无超时 effect、关闭回调或关闭按钮。
- 通知当前渲染在叫号模块之前,并通过 `.staff-call-notice` 包裹;这适合保留为瞬时状态消息,但应避免它挤占或替代固定叫号模块的位置。
- `staff-call-actions` 内已有 `staff-call-controls`,其下按能力分别渲染两个 `staff-call-mode`,每个模式都带重复小标题;合并需求可在不改变 API 参数和输入框可访问名称的前提下重组 DOM。
- 现有员工页测试覆盖叫号成功、设备失败、人数上限和主操作,需新增假定时器测试,并调整对统一标题与删除模式标题的断言。
- 当前样式明确写着“叫号操作在文档流中”,`staff-call-actions` 没有 sticky/fixed只有通知 `.staff-call-notice` 使用 `position: sticky`,与“整个叫号模块始终置顶”相反。
- 适合的结构是新增一个统一吸顶包装层,把叫号通知和 `staff-call-actions` 作为同一层级整体置顶;通知消失后叫号卡自然回到顶部,不需要监听滚动或计算高度。
- 大标题应由 `staff-call-actions` 内唯一的 `h2` 提供,并通过 `aria-labelledby` 命名整个操作区;两个 `staff-call-mode` 可保留为业务布局容器,但删除其可见小标题和内层卡片感。
- 现有按钮与输入的可访问名称已经区分“按号码”和“按人数”,删除小标题不会损失操作辨识度。
- 员工端页头本身 `position: sticky; z-index: 20`,最终覆盖层高度为桌面 68px、窄屏 64px叫号吸顶层应使用 `z-index: 19`,并在对应断点采用 `top: 68px/64px`,避免遮挡页头。
- `.staff-motion-scope``display: contents`,叫号布局父级没有阻断 sticky 的 overflow吸顶包装层可纯 CSS 实现,不需要滚动事件。
- 当前未提交差异包含本轮之前正在开发的同行人数、按人数叫号、游客取号和大屏调整;实现必须只触碰员工叫号相关片段,不能清理或格式化整个样式文件。
- 基线全量测试中员工页相关用例通过,但已有在途游客取号/查号改动导致 `VisitorLookupPage.test.tsx` 两项断言失败;这些失败在本轮代码修改前已存在,与员工叫号需求无关。
- 浏览器验收前确认本地 Vite `:5173` 与 Go API `:8080` 均已运行API `/healthz` 返回 200可直接使用真实页面和数据验证。
- 真实员工账号登录后DOM 只呈现一个 `h2`“按号数/人数叫号”;按号码与按人数仍作为可访问的操作分组,按钮和默认数量均正常返回。
- 390x844 真实视口首轮测量显示统一叫号卡高 262px、吸顶包装层高 282px页面总高 1306px具备实际滚动空间布局未横向溢出。
- 首轮测量同时发现窄屏页头真实底边为 83px而 CSS sticky 偏移仍是 64px滚动后会有 19px 落到页头下方,需以真实页头高度修正而不是只依赖 `min-height` 声明。
- 页头高度差异来自后置品牌 Logo 规则:窄屏 Logo 框实际为 104x66px加上下各 8px padding 与边框后页头为 83px`min-height: 64px` 不代表最终盒高。
- 1280px 桌面视口同样存在偏移Logo 框 112x64px、页头真实高 85px而 sticky top 为 68px。最终偏移应按断点设置为桌面 85px、`<=720px` 83px。
- 修正后 390x844 滚动至页面底部(`scrollY=462`)时,页头底边与 sticky 顶边均为 83px重叠量为 0统一叫号卡仍完整可见下面队列内容正常从其后滚动。
- 移动端视觉截图确认:唯一大标题、快速叫号、按号码数量和按人数三项操作组成一个白色大卡;两个旧小标题和两张内层小卡已消失,底部导航未被覆盖。
- 真实叫号后通知正确显示“叫号已生效00015”“1 个号码,共 5 人”和可访问按钮“删除叫号通知”;跨步骤复查时通知已自动消失,证明真实页面的 5 秒清理链路已运行。
- 手动路径复验新通知“叫号已生效00016”出现后删除按钮从 1 个变为 0 个,通知立即移除。
- 自动路径精确复验通知“叫号已生效00017”在约 4.65 秒时仍存在,超过 5 秒后按钮计数变为 0符合从通知创建起 5 秒自动消失的口径。
- 1280x800 桌面滚动至最大 `scrollY=410.5` 后,页头底边和 sticky 顶边分别为 85px重叠量为 0页面无水平溢出统一叫号卡宽 1176px 并保持完整可操作。
- 桌面截图确认按号数和按人数操作共享同一卡片与标题,右侧人数操作通过一条轻量分隔线区分,不再形成第二张小卡。
- 断点边界复测发现 720px 页头为 87pxLogo 已进入窄屏尺寸但仍使用桌面 10px padding721px 页头为 85px需保留三档偏移默认 85px、621-720px 为 87px、<=620px 为 83px。
- 三档修正后 620/621/720/721px 四个边界的 header bottom 与 sticky top 分别精确相等83/87/87/85px四个视口重叠量均为 0。
- 浏览器验收结束前控制台 error/warn 均为空,临时响应式视口已恢复。
- 最终前端全量测试为 14 个文件、51 项全部通过;修改前曾失败的两项在最终工作树中也已恢复通过,无遗留测试失败。
- 目标文件与三份项目台账的 `git diff --check` 通过;仓库仍包含用户原有的大量未提交跨端/后端改动,本轮未清理、回退或暂存这些内容。
- 最终源码复核确认5 秒 effect 有 clearTimeout 清理;“删除”按钮为显式 `type=button` 且有可访问名称;叫号 API 参数、幂等键、禁用条件和两种按钮文案均未改变。
- 新增可见文案仅为“按号数/人数叫号”和“删除”,语义明确、无重复小标题;布局未引入滚动监听、第三方依赖或额外动画。
## Phase 28 创建项目与项目维护表单统一2026-07-15
- 创建页 `ProjectProfileForm` 当前只展示项目名称、项目编码和票号格式;项目维护页 `ProjectSettingsForm` 还展示项目状态、每次叫号数量、单号预计间隔和游客官方提示,两个页面的可见字段与布局不一致。