# Progress Log ## 2026-07-16 - Phase 42 运营统计模块标题区呼吸空间优化 - 已读取用户提供的看板截图,并按 Product Design Audit 规范完成证据定位:四个模块的标题、副标题与卡片边框距离过小,标题区与首个数据区缺少缓冲。 - 已冻结本轮范围:只调整卡片内边距、标题区垂直节奏和内容分隔,不改数据、模块顺序、项目下钻或接口。 - 已在看板样式末尾增加统一标题区规则:桌面卡片使用 24px 上下、32px 水平内边距;标题区增加顶部缓冲、标题/副标题间距和 24px 内容前留白;移动端收敛为 20px 卡片内边距。 - 已同步增加项目行、峰值列表和状态列表的内容间距,保证四个模块的标题区和数据区具有一致呼吸空间。 - 验收通过:历史页定向测试、全量 `make test`(15 个文件/53 项)、`make build`、类型检查、API `/healthz`、前端 `:5175` HTTP 200 和 `git diff --check` 均通过。 ## 2026-07-16 - Phase 41 运营统计页视觉层级与排版精修 - 已读取并执行 `design-taste-frontend` 与 `ui-ux-pro-max`,完成保留式视觉审计、设计读法和参数设定。 - 已确认本轮不改历史数据业务契约,只处理统计页及其共享历史筛选/空值文案的视觉与排版细节。 - 已记录改版方向:视图感知筛选网格、统一 KPI 指标轨道、明确主次卡片层级、修复小时条文字 token 和缺省文案。 - 已将 `HistoryFiltersBar` 按视图添加统计页专用网格,避免隐藏状态/关键词字段后留下空列;历史页标题、Tabs 和筛选控件的圆角、背景、焦点与 hover 层级保持统一。 - 已将五个 KPI 从独立白卡合并为一张指标轨道,桌面使用内部分隔线,窄屏按两列折行并保持最后一项完整分隔。 - 已为趋势、项目对比和运营节奏卡设置明确的主次边界;项目行增加轻量 hover 和固定下钻按钮宽度,小时分布文字改用 `--color-ink`。 - 已完成页面可见缺省文案自检,移除破折号式空值表达,统一使用“暂无”“未提供”“日期至日期”等语义化文案。 - 已补充历史页回归断言,覆盖统计筛选布局类名、短日期日卡片、关注模块不存在和项目下钻;业务数据、路由、导出、权限契约未改变。 - 全量验收完成:`make test`(15 个文件/53 项)、`make check`、`make build`、API `/healthz`、前端 `:5175` HTTP 200 和 `git diff --check` 均通过。 ## 2026-07-16 - Phase 40 运营统计看板布局与 UI/UX 收敛 - 已读取当前工作树、Phase 39 运营统计实现和既有测试,确认本轮以增量方式调整历史运营统计页,不清理其他在途改动。 - 已使用 `ui-ux-pro-max` 生成数据密集型看板设计系统,并检索响应式、可访问性、层级和图表建议。 - 已冻结改版口径:删除“需要关注”模块,改为 KPI、趋势、项目对比、状态/时段节奏四层结构;少于 4 天用日卡片,避免单点趋势图。 - 已将趋势卡片改为全宽;项目对比改为独立宽卡;高峰时段与小时分布合并为运营节奏卡片;移动端项目行调整为四列,避免下钻按钮隐式换列。 - 已删除“需要关注”卡片、异常引导语和对应前端样式;API 仍保留 `alerts` 字段以兼容已有后端响应,但当前页面不消费、不展示该字段。 - 已为少于 4 个营业日的日期范围增加日卡片摘要;4 天及以上继续使用 SVG 趋势图,并用虚线区分完成量序列。 - 已补充回归断言:关注模块不存在、短日期范围不渲染单点趋势图、项目下钻仍切换到排队记录并保留项目筛选。 - 全量验收完成:`make test`(15 个文件/53 项)、`make check`、`make build`、API `/healthz`、前端 `:5175` HTTP 200 和 `git diff --check` 均通过。 ## 2026-07-16 - Phase 39 运营统计经营复盘看板优化 - 已完成需求确认:本轮目标是历史经营复盘,不改变实时运营概览职责。 - 已核对当前统计接口和页面:现有数据支持汇总、状态分布、按小时聚合,但缺少每日趋势、项目对比、峰值排名和异常摘要。 - 已确定沿用现有管理端绿色/中性 token 与原生 CSS,不引入图表依赖;已完成统计聚合接口扩展与运营统计视图重构。 - 已扩展 `/api/admin/history/summary`:新增 `daily` 每日趋势、`projects` 项目对比、`peak_hours` 峰值时段和 `alerts` 关注摘要,继续复用项目/日期筛选与权限校验。 - 已将运营统计重构为经营复盘看板:核心 KPI、每日 SVG 趋势、项目排行/下钻、关注摘要、高峰时段、状态分布和小时节奏。 - 已补充前端页面回归、后端关注阈值单元测试和真实 PostgreSQL 看板聚合集成断言;定向前后端测试与 `make test-db` 已通过。 - 已校正小时统计口径:取号按 `joined_at`、叫号按 `called_at` 分桶,并验证两个事件落在不同本地小时的场景。 - 全量验收完成:`make test`、`make check`、`make build`、`make test-db` 通过;API `:8080/healthz` 返回 `status: ok`,前端 `:5175` 返回 200。 ## 2026-07-16 - Phase 38 后台历史数据管理功能实施 - 已实现 `/api/admin/history/tickets`、号码详情、叫号批次列表/详情、运营统计和 CSV 导出接口;统一支持项目、营业日、状态、号码/手机号筛选与分页。 - 已复用现有 `queue_sessions`、`queue_tickets`、`call_batches` 和 `call_batch_tickets`,新增历史查询索引迁移 `000013`。 - 已新增 `history_anonymized_at` 及 `000014` 迁移;数据库维护任务在终态记录超过 90 天时标记业务明细匿名化,保留号码、状态、时间和统计字段。 - 已实现历史号码列表默认脱敏、详情审计查看联系方式、匿名化后不可按手机号检索,以及 CSV 10000 行上限和导出审计。 - 管理端新增 `/admin/history` 与“历史数据”导航,完成排队记录、叫号记录、运营统计、筛选、详情抽屉和 CSV 下载页面。 - 已新增前端 HistoryPage 回归测试、Go 历史筛选/脱敏单元测试和 PostgreSQL 历史接口集成测试。 - 90 天匿名化维护任务会物理清除手机号、姓氏、称谓和检索摘要,并保留业务号码、状态、时间、批次关系与统计字段;历史页面默认不返回称谓,明文查看仍需审计。 - 列表已补齐上一页/下一页操作,筛选提示改为实时筛选语义。 - `make test`、`make check`、`make build`、`make test-db` 全部通过;前端 15 个测试文件、53 项测试通过,真实 PostgreSQL 验证包含匿名化字段清除。 ## 2026-07-16 - Phase 37 后台历史数据管理功能规划 - 已读取当前项目计划、产品规划、数据库模型、初始迁移、后台 API、维护任务和管理端页面,确认历史功能可以复用现有事实表。 - 已登记当前数据基础:按项目/营业日的队列场次、排队单状态时间线、叫号批次成员关系、管理员登录和基础审计。 - 已形成 `docs/history-data-management-plan.md`,覆盖页面信息架构、查询字段、统计口径、导出、权限、隐私、接口、索引、分阶段范围和验收标准。 - 已明确首期建议:P0 查询与追溯,P1 统计与 CSV 导出,P2 审计查询、可配置留存、异步导出和冷归档。 - 已发现并记录一个待决策差异:文档要求原始业务事件 90 天匿名化,当前维护代码主要清理终态记录的个人字段;在实现前需确认最终留存/匿名化动作。 - 用户已确认最终口径:90 天后保留匿名明细与统计,删除个人关联信息且不可恢复;Phase 37 规划阶段完成。 - 真实 PostgreSQL 维护验证首次发现匿名化条件的参数类型推断错误,已记录并改为显式 `timestamptz` 转换,准备重跑验证。 - 本轮未修改业务代码、数据库迁移或运行数据。 ## 2026-07-16 - Phase 36 员工端取号同行人数输入修复 - 已恢复文件化计划上下文并确认工作树包含用户既有在途修改;本轮只对员工取号人数输入相关代码做增量修复。 - 已登记复现、状态更新修正、边界校验、自动化与真实页面验收项。 - 已定位问题为人数输入清空时被 `Number("") || minPartySize` 同步回填 `1`,现有测试直接从 1 改成 3,未覆盖先清空再输入的真实操作。 - 已新增“默认 1 → 清空 → 输入 3”的回归步骤;旧实现按预期失败并收到值 `1`,缺陷已由自动化稳定复现。 - 已将本地表单人数类型调整为 `number | ""`,清空时保留空值,提交时再收窄并执行整数与项目上下限校验;API 请求仍严格使用数字。 - 员工页定向 8 项测试全部通过,TypeScript 应用与 Node 配置检查通过。 - 前端全量 14 个文件、52 项测试全部通过,包含类型检查的 Vite 生产构建成功。 - 已打开真实员工取号页准备交互验收;页面首个快照处于正常的访问权限确认加载态。 - 真实页面首次清空验证仍读到 `1`;已暂停验收并登记差异,下一步核对当前 Vite 实例与浏览器加载源码,不重复同一失败操作。 - 已确认运行中 Vite 直接返回的新模块含空字符串处理分支,页面不是旧构建;失败后输入仍为聚焦状态,准备改用全选 + 删除的真实键盘路径复测。 - 真实键盘实测通过:默认 `1` 全选删除后保持空值,再输入 `3` 正常显示;全程未点击创建按钮、未写入取号数据。 - 最终 DOM 与控制台复核通过:同行人数稳定显示 `3`,原项目范围提示保留,控制台无 error/warn;Phase 36 全部验收项完成。 ## 2026-07-16 - Phase 35 员工端队列增量展开 - 已读取文件化计划规范并恢复上一阶段上下文;本轮只调整员工队列的前端可见数量控制。 - 已确认项目无需重复启动:Vite `:5173` 和 API `:8080` 均在监听,API 健康检查通过。 - 已冻结交互:默认 10 项;每次“查看更多”追加最多 10 项;展开后保留“收起”;项目或场景切换恢复 10 项。 - 已将布尔式“全部展开”状态改为可见数量上限:每次点击增加 10,最后不足 10 时只补齐剩余项。 - 已保留独立“收起”按钮,并将两个队列控制放入居中的紧凑操作组;列表仍由页面自然延展。 - 已把测试队列扩展到 25 项,新增 10 → 20 → 25 → 10 的完整增量与收起断言。 - 员工页定向 8 项测试、TypeScript 双配置检查、前端全量 14 个文件 52 项测试和生产构建全部通过。 - 已使用本地演示员工登录真实页面,连续点击验证队列按 10 → 20 → 30 项增量展示;“收起”恢复到 10 项。 - 页面高度随可见项从 1606px 增至 2372px、3079px,收起后恢复 1606px;列表没有内部滚动容器或一次展开全部的行为。 - 真实页面控制台无 error/warn,员工端预览已保留;Phase 35 全部验收项完成。 ## 2026-07-15 - Phase 34 员工端批量按钮与指标分隔 - 已读取截图到代码、设计上下文、设计 QA 与文件化计划规范;目标与用户结果明确,无需补问。 - 已运行 Product Design 用户上下文预检,结果仍为无已保存上下文;继续使用当前项目、既有参考图和真实页面作为视觉依据。 - 已检查脏工作树与当前计划,确认 Phase 33 管理端表单工作仍在进行;本轮只增量修改员工页、员工页测试、样式和验收记录。 - 已定位按钮文案/颜色的精确 DOM,以及第 4 个指标在移动端缺少左边框的 CSS 级联原因。 - 已将两个批量操作改为现有浅色描边按钮,并按要求更新为“批量叫号 / 批量叫人”;快速叫下一个号继续保留深绿色主操作层级。 - 已在 720px 以下明确恢复偶数指标的左边框,使“下一个号 / 下个号人数”以及每行两项都保持完整中线。 - 已同步更新员工端按钮文案、浅色样式和人数上限交互断言,等待执行验证。 - 员工页定向 8 项测试与 TypeScript 双配置检查通过;前端全量 14 个文件、52 项测试和生产构建也全部通过。 - 已在 390×844 真实页面确认两个浅色按钮、两项新文案、指标中线、无横向溢出和零控制台告警。 - 接管旧预览标签后的全页截图出现一次合成压缩;实际 DOM 尺寸与普通视口截图均正常,已改用普通 390×844 截图作为视觉证据。 - 已完成 720/721px 边界复测:移动两列中线存在,桌面三列新行首项无多余左边框,两端均无横向溢出。 - 已将原始参考、当前叫号模块和指标修复前后裁图放入同一次视觉对照;无 P0-P3 遗留项。 - 已追加 Phase 34 `design-qa.md` passed 记录并保留历史验收内容;本阶段全部验收项完成。 ## 2026-07-15 - Phase 32 员工端叫号指标与队列展示 - 已读取并执行截图到代码、设计上下文、设计 QA 与文件化计划规范;目标和用户结果明确,无需补问。 - 已打开用户参考图,确认本轮是现有员工端的局部视觉与信息架构调整,不需要生成新资产。 - 已运行用户上下文预检;首次使用错误脚本路径失败,定位技能目录内实际路径后成功,结果为无已保存上下文。 - 已检查工作树和员工端现有实现:按号码按钮颜色不一致、旧末号指标仍存在、队列为固定高度内部滚动容器。 - 已冻结实现口径:两类叫号按钮统一绿色;六项指标使用既有队列字段;队列前 10 项摘要加展开/收起,并随页面自然增长。 - 已确认仓库无 `.project-docs`,且不回退、清理或格式化用户的其他在途改动。 - 已完成展示实现:删除叫号标题下和窄屏模式间的横线,按号码按钮改为与按人数一致的绿色主操作。 - 已将末号数/末号预计时长替换为下个号人数、剩余未叫号、剩余未叫人数三项独立指标。 - 已将队列改为三等分列,移除固定高度、内部滚动与外框,默认渲染 10 项并提供可访问的查看更多/收起控制。 - 员工页定向 8 项测试与 TypeScript 双配置检查通过。 - 前端全量 14 个测试文件、52 项测试全部通过;生产构建与构建内类型检查通过。 - 已在 390×844 真实员工页面确认六项新指标、两个同色主按钮、叫号卡内部无横线、队列默认 10 项和三列对称布局。 - 已实测“查看更多”把 200 项队列展开到页面流,整页高度增长且列表无内部滚动;“收起”恢复 10 项。 - 已复测移动端吸顶零重叠、无横向溢出、控制台零告警,并通过 720px 平板和 1280px 桌面响应式测量。 - 桌面预览刷新曾出现一次页面重新挂载超时;按浏览器故障指引保留连接并新建标签后验收恢复,未影响应用或测试结果。 - 已将参考图、聚焦裁图和完整页面放入同一视觉对照,完成字体、间距、色彩、布局、响应式、交互和可访问性检查;无 P0-P3 遗留项。 - 已更新根级 `design-qa.md` 为本轮 passed 结果,并保留旧任务的历史 blocked 记录。 - Phase 32 全部验收项完成。 ## 2026-07-15 - Phase 31 员工端叫号模块与通知 - 已读取前端与文件化计划技能,明确本轮是现有员工工作台的局部保留式调整。 - 已确认仓库存在大量在途修改,目标前端文件也已被修改;后续仅做增量补丁。 - 已登记通知 5 秒消失、手动关闭、模块合并、统一标题和滚动置顶的验收标准。 - 发现根目录已有长期台账后,已恢复原内容并改为只追加本轮记录;业务代码未受影响。 - 已完成 `StaffPage` 状态与测试首轮审计:确认通知尚无生命周期控制,两个叫号模式仍各自带小标题,业务调用可原样保留。 - 已完成目标 DOM/CSS 审计:确认应新增统一 sticky 包装层,并将两种操作在一个有唯一主标题的卡片中扁平合并。 - 已核对页头层级和响应式高度,确定吸顶模块使用 68px/64px 顶部偏移及低于页头的层级,无需 JavaScript 滚动监听。 - 修改前基线执行误跑全量测试:员工页用例通过,另有 2 个既有游客查询页测试失败;已登记并改用精确 Vitest 文件命令。 - 精确基线 `StaffPage.test.tsx` 共 6 项全部通过,现可进入增量实现阶段。 - 已实现叫号通知 5 秒定时清理与“删除”按钮,手动删除会通过 effect 清理未完成定时器。 - 已将通知和叫号操作放入统一 `.staff-call-sticky` 吸顶层,并以页头下方 68px/64px 偏移固定。 - 已合并两种叫号操作为一个卡片,增加唯一标题“按号数/人数叫号”,删除两个内部小标题和内层卡片视觉。 - 已新增结构、手动删除和 5 秒自动消失回归断言,等待执行验证。 - 员工页 7 项定向测试全部通过;TypeScript 双配置检查和 Vite 生产构建通过。 - 本地前后端服务健康,已进入真实浏览器滚动与通知验收。 - 已使用真实员工账号进入叫号页,确认统一标题、两种操作和队列数据均正常渲染;准备进行 390px 视口滚动测量。 - 390px 首轮视觉测量发现吸顶偏移与真实页头高度不一致(64px 对 83px);已暂停验收,先修复遮挡风险后再复测。 - 已定位偏移根因是后置 Logo 尺寸覆盖使窄屏页头增高到 83px,不是 sticky 失效。 - 桌面页头实测为 85px,确定用 85px/83px 两档真实偏移修复吸顶遮挡。 - 已修正 sticky 偏移并完成 390x844 滚动复测:页头与叫号层零重叠,模块在最大滚动位置仍固定且完整可操作。 - 已在真实队列触发通知并观察到 5 秒自动消失;手动删除将用同一次调用内的即时操作补验。 - 真实浏览器已分别通过手动立即删除与 5 秒前后计时复验,两条通知清理路径均符合需求。 - 已完成 1280x800 桌面最大滚动复测:吸顶零重叠、无横向溢出、两种叫号入口均可见。 - 断点边界检查发现 621-720px 的页头比手机端多 4px,正在补充分段偏移并复测 620/621/720/721px。 - 三档偏移已完成,620/621/720/721px 边界复测全部零重叠。 - 浏览器最终控制台无 error/warn,响应式视口已复原并完成验收清理。 - 最终员工页 7 项测试、TypeScript 检查和 Vite 生产构建再次全部通过。 - 最终前端全量 14 个测试文件、51 项测试全部通过。 - 目标差异格式检查通过;已再次确认其余大量脏工作树内容保持原状。 - 已完成最终源码与文案预检,未发现计时器泄漏、业务调用回归、可访问性或响应式问题。 - Phase 31 全部验收项完成。 - 最终 `git diff --check` 再次通过;交付文件为员工页、员工页测试、全局样式及既有三份项目台账。 ## Session: 2026-07-12(生产后端与数据库基础交接) - 用户确认:独立 PostgreSQL、Kubernetes 业务服务、全景区一次上线、峰值 3000 人同时在线;RPO ≤ 5 分钟、RTO ≤ 30 分钟作为运维目标。 - 收敛本轮范围:只完善后端/数据库基础,Kubernetes、托管 Redis、Secret/KMS、备份恢复由运维后续接入。 - 修复 `make smoke-real`:适配 seed 输出、独立管理员 Cookie、项目级活动号码筛选、手动 `count` 叫号、长 display token 和 smoke 专用空队列。 - 新增 `000007_personal_data_purge`:个人字段可安全置空、保留业务事实,并增加清理索引;新增 `000008_super_admin_password_rotation`,允许专用命令轮换受保护管理员密码。 - 新增 `database.RunMaintenanceOnce`/`StartMaintenance`:使用 PostgreSQL advisory lock,批量清理个人关联、幂等键、会话和到期审计记录;状态终结时重新计算个人数据清理时间。 - 生产配置现在要求 PostgreSQL TLS、`MIGRATE_ON_START=false`,并支持连接池/清理周期环境变量;`/readyz` 同时检查数据库迁移版本。 - 新增 `/usr/local/bin/migrate`、`/usr/local/bin/bootstrap-admin` 和 `docs/backend-production-handoff.md`,明确迁移 Job、密码轮换和禁止生产 seed 的交接边界。 - 新增临时 PostgreSQL 集成测试:迁移重复执行、schema readiness、清理事务、受保护管理员密码轮换;`make test-db` 已通过。 ## Session: 2026-07-11(项目管理/规则配置拆分) - 已完成现状审计:当前项目管理只是按项目选择的规则表单,且后端缺少项目创建和基础信息维护接口。 - 已确定拆分边界:项目管理维护项目档案,规则配置继续按项目维护状态与预计等待规则。 - 记录一次计划文件组合补丁失败:`findings.md` 实际标题与预期不同;读取真实标题后已用精确上下文修正。 - 新增 `POST /api/admin/projects` 和 `PUT /api/admin/projects/{id}`,支持创建项目并维护名称、编码、时区和票号前缀,同时写入审计记录。 - 管理端新增项目列表、创建项目和维护项目页;原项目设置移至独立“规则配置”导航,并可从项目列表直接进入对应项目规则。 - 规则仍保存在所属项目记录中,不引入全局规则或额外继承层。 - 验证通过:前端 11 个测试文件共 34 项测试、TypeScript 检查和生产构建;Go 全量测试、vet 和 build。 - 记录一次验证命令路径错误:已在 `server/` 目录下执行但仍使用根目录相对路径;改为从项目根目录执行后通过。 - 根据用户反馈取消独立“规则配置”导航和路由,规则表单改为项目维护页的组成部分。 - 项目创建/维护不再展示时区,票号前缀手填改为票号格式下拉选择,当前唯一选项为 `00000`。 - 调整后再次通过前端 34 项测试、类型检查、生产构建以及 Go 全量测试/vet/build。 - 按最新反馈重排项目维护页:名称、编码、票号格式、状态和所有预计等待参数进入同一字段网格和同一表单,删除“基础信息/规则配置”标题分隔,统一为一个“保存项目”操作。 - 重排后前端 34 项测试、TypeScript 检查和生产构建通过。 - 项目维护页左上角改为仅显示当前项目名称,删除“维护项目”标题和重复项目名副标题。 - 保存成功反馈移到页面底部操作区,与保存按钮同屏显示“项目保存成功 / 项目维护内容已更新”;失败时仍展示服务端具体错误。 - 本次调整后前端 34 项测试、类型检查和生产构建通过。 ## Session: 2026-07-11(当前叫号号段统一) - 后台、大屏中心、游客公屏和员工端现统一使用同一号码格式化规则:单号直接显示,多号显示“起始号 至 结束号”。 - 当前叫号、员工成功提示和最近叫号都不再逐个罗列号码。 - 前端 11 个测试文件共 27 项测试、TypeScript 检查和生产构建通过。 ## Session: 2026-07-11(员工端 GSAP UX 子规划) - 审计 `StaffPage`、`AppShell`、反馈组件、测试和员工端相关 CSS。 - 明确 GSAP/CSS 职责边界,规划叫号、取号、队列、导航、项目切换和离线恢复六类反馈。 - 定义 reduced motion、revision 去重、可中断、性能和验收标准。 - 创建 `docs/staff-h5-gsap-ux-plan.md`;本轮未修改业务 UI。 - 用户确认执行后,新增统一 GSAP 注册与 motion tokens。 - 实现员工端场景进入、叫号结果与指标强调、队列 Flip、取号号码确认、项目切换弹层和 reduced-motion 降级。 - 增加叫号不可操作原因、取号成功无障碍播报、Escape 关闭弹层和焦点返回。 - 前端 26 项测试、类型检查、生产构建、390px 本地浏览器宽度与控制台验证通过。 ## Session: 2026-07-11(Phase 16) - 已恢复 Phase 14/15 上下文并完成首轮跨端静态审计。 - 已确认三类核心偏差:后台仍有固定批量配置和“第 N 批”兼容文案;游客端存在硬编码位置/时间/刷新频率;大屏用户层已基本转为号码语义。 - 管理端已取消“第 N 批”降级文案,当前叫号始终以实际号码表达。 - 原“每批号码数”已明确改为“预计每次叫号数(仅用于估算)”,不再暗示会控制员工当次叫号;预计方式和间隔文案同步移除“批次”。 - 游客端已将“人/张票”改为“号码”,并使用 API `people_ahead + 1` 展示真实当前位置。 - 共享叫号卡片和遗留移动端 CSS 文案已改为“本次叫号/当前叫号/待叫号码”。 - 验证通过:Go 全量测试与 vet/build,前端 11 个文件 25 项测试、TypeScript 类型检查和 Vite 生产构建。 - **Status:** complete ## Session: 2026-07-11(Phase 15) - 将游客公屏右侧“队列概况”改为后续号码区间及分段预计等待时间,等待总数降为底部辅助信息。 - 删除大屏中心项目卡片中的设备状态。 - 取消全项目监控墙整体全屏,改为每个项目卡片独立“全屏展示”。 - 公屏日期由硬编码改为当前本地日期与星期。 - 更新公屏与管理端测试,并通过类型检查、单元测试和生产构建。 ## Session: 2026-07-10 ### Phase 1: 需求盘点与案例调研 - **Status:** complete - **Started:** 2026-07-10 - Actions taken: - 检查工作区,确认当前没有既有项目文件。 - 读取 planning-with-files 与 grilling 工作规范。 - 建立调研计划、发现记录和进度日志。 - 记录用户明确需求、当前假设、关键歧义和初始风险。 - 并行分派景区案例、排队厂商、合规与 ETA 算法三路资料核验。 - 核验 WebUSB/Web Serial/Local Network Access 等浏览器硬件能力和限制。 - 初步确定“本地设备网关为主、浏览器直连为辅”的硬件集成方向。 - 核验 Waitwhile 的 Visit 状态、Webhooks、审计、公开大屏、游客状态页与批量 API。 - 提炼客户/排队单分离、资源模型、独立批次叫号和读模型隔离等领域设计原则。 - 核验梵净山红云金顶、长江索道、陶然亭游船三个国内成熟案例。 - 识别连续服务、批次放行、资源/班次调度三类 ETA 与叫号容量模型。 - 汇总 Disney、Universal、Europa-Park、USJ、Volcano Bay 等官方虚拟排队资料。 - 验证同行组/门票凭证、return window、动态容量、迟到策略和硬件抽象等共性。 - 完成 Waitwhile、Qmatic、Wavetec、Qtrac、QLess 能力与证据强度对照。 - 核验中国个人信息最小必要、公开展示、未成年人、日志/评估留存要求。 - 核验 Little's Law 的适用边界、批次队列 ETA 公式和区间预测方法。 - 创建 docs/scenic-queue-system-plan.md 完整评审稿。 - Files created/modified: - task_plan.md(创建) - findings.md(创建) - progress.md(创建) ### Phase 2: 领域模型与业务规则 - **Status:** complete - Actions taken: - 定义访客、同行组、排队单、队列场次、资源、叫号批次、ETA 快照和设备命令。 - 形成排队单/项目状态机、批量叫号事务、容量装箱、过号与闭园建议。 ### Phase 3: 产品范围与体验规划 - **Status:** complete - Actions taken: - 规划员工 H5、游客 H5、大屏 Web、管理 Web 页面与权限。 - 定义 MVP/P1/P2、指标、验收和现场试点路线。 ### Phase 4: 技术与集成规划 - **Status:** complete - Actions taken: - 形成模块化单体、事实库、Outbox、实时投影和设备网关架构。 - 规划硬件命令/回执、隐私、安全、性能、灾备和部署分支。 ### Phase 5: 交付与确认门槛 - **Status:** complete - Actions taken: - 创建并复核 21 章完整评审稿。 - 交叉审查并修正并发锁定顺序、严格 FIFO ETA、叫号批次生命周期和设备事件方向。 - 准备按影响优先级逐项确认关键业务决策。 - 用户确认新增约束:操作简单、逻辑不过度复杂、系统轻量;运营数据看板并入管理端;一个系统支持多个项目。 - 将界面术语统一为“预计等待时间/预计叫号时间”,英文 ETA 只保留在技术说明中。 - 架构收敛为一个模块化单体应用、一个 PostgreSQL、内置 SSE/轮询和同库后台任务;Redis、消息中间件、微服务和设备网关均不作为 MVP 前提。 - 预计时间收敛为每项目二选一的简单模板,且一个项目只启用一种;管理端只保存少量参数、上一版和修改日志。 - 运营看板并入管理端首页;公示屏暂按原需求保留为绑定单项目的独立只读路由。 - 多项目采用同库同表 `project_id` 隔离:项目队列、票号、预计参数、权限、设备和统计分别管理,不做每项目独立部署或多租户继承。 - 简化员工主流程为“选项目—取号—叫下一批—到场/完成”,异常操作折叠到“更多”。 - 重新校准阶段范围:轻量 MVP 粗略为 9–12 周、4–5 人小团队,真实硬件和外部集成另计。 - 经独立审查进一步删除 MVP 残留复杂度:项目状态缩为 4 种,批量叫号固定唯一 `CALL_NEXT`,严格 FIFO、不拆不跳、欠载,手选/预叫/撤回移入 P1。 - 将 `project_id` 扩展为完整服务端安全契约,覆盖所有项目记录、查询/索引、SSE、接口授权、设备命令和跨项目越权测试。 - 将硬件首期范围收敛为统一接口、模拟成功/失败和测试记录;注册、配对、心跳、完整 ACK、设备上行和本地网关均在型号确认后实施。 - 两轮轻量化独立复核完成,4 个初始 P1 已全部修正,未发现新的 P1。 - 用户确认员工端和管理端(含运营看板)必须账号登录;已将其设为已确认的访问边界。 - 明确内部用户使用可追溯个人账号 + 角色 + 项目范围授权;游客状态页采用私密查询令牌,公示屏采用设备绑定,只读且不作为后台账号入口。 ### Phase 6: UI/UX 设计范式调研与定稿 - **Status:** complete - Actions taken: - 读取 Product Design 路由、上下文门槛与沟通规范。 - 读取 design-taste-frontend、ui-ux-pro-max、GSAP 与 planning-with-files 完整规范。 - 运行 Product Design 用户上下文预检,确认尚无既有品牌/设计资产。 - 确定绿地、公共服务优先的 Design Read 与四端差异。 - 运行 UI/UX 设计库的综合设计系统与 style/product/color/typography/ux/chart 专项检索。 - 核验 GOV.UK、USWDS、NHS、WCAG 2.2、TfL、英国交通部、GB/T 37668 与 W3C 中文排版等一手资料。 - 完成公共服务导视、远距大屏与动效/可访问性并行专项调研,方向收敛为“公共服务导视式界面”。 - 明确 GSAP 仅用于少量可中断的大屏时间线;批量叫号禁止逐号动画,业务与硬件状态不得依赖动画完成。 - 新建 `docs/scenic-queue-design-paradigm.md`,完成四端视觉/交互、批量叫号、大屏、硬件、动效、无障碍、图表、文案和验收规范初稿。 - 对文档执行结构检查:27 个一级章节顺序完整、代码围栏成对、53 个链接、50 条可执行验收项、24 张表列数一致,无占位符或替换字符。 - 完成两轮独立内容审查并修正全部 P1:排队单/叫号批次状态、可读票号与私密 token、MVP/P1 分期、完整设备 ACK/上行事件、管理端设备/隐私、MVP 无障碍和技术中立动效。 - 补入运营状态与数据新鲜度矩阵、配置化提前返回/大屏保留规则,以及设备命令与业务状态生命周期正交约束;复核未发现剩余 P1。 - 排除 App Store 落地页、奢华衬线、玻璃拟态等错误匹配,保留 Swiss Modernism、可访问公共服务和实时运营模式。 - 核验 GOV.UK、USWDS、WCAG 2.2 与 TfL 的公共服务、可访问性和导视原则。 - Files created/modified: - task_plan.md(新增 Phase 6) - findings.md(新增 Design Brief) - progress.md(新增设计阶段日志) - docs/scenic-queue-design-paradigm.md(设计范式 v0.9) ## Test Results | Test | Expected | Actual | Status | |------|----------|--------|--------| | 工作区检查 | 识别现有约束 | 未发现现有代码/文档,按绿地项目处理 | ✓ | | 规划完整性检查 | 四端、批量叫号、ETA、硬件、管理、合规、验收均有覆盖 | 21 章评审稿完整覆盖,含来源与决策台账 | ✓ | | Markdown 结构检查 | 无内部搜索引用/占位符,代码围栏成对 | 无占位符或内部引用;6 个围栏对应 3 个 Mermaid 图 | ✓ | | 独立交叉审查 | 识别并修正会误导实现的模型问题 | 已修正锁定顺序、ETA 装箱、批次生命周期、设备上下行与字段分支 | ✓ | | 设计范式结构检查 | 章节、围栏、表格与链接机械完整 | 27 章顺序完整;10 个围栏成对;24 张表列数一致;53 个链接;无占位符/替换字符 | ✓ | | 设计范式独立审查 | 无会误导实现的 P1 | 两轮审查修正 QueueTicket/CallBatch、ACK、分期、隐私、设备、无障碍等问题;复核无剩余 P1 | ✓ | | 轻量化结构检查 | 规划与设计文档无机械损坏,轻量边界与多项目约束一致 | 两份文档代码围栏成对、共 33 张表列数一致;明确单体/单库、管理端看板和 `project_id` 隔离 | ✓ | | 轻量化独立复核 | 新约束进入已确认台账,MVP 无残留重型能力 | 四种状态、唯一 CALL_NEXT、硬件接口占位、服务端项目边界均通过复核;无剩余 P1 | ✓ | | Go 单元与竞态测试 | 领域、HTTP、配置和安全测试通过且无竞态 | `go test -race ./...` 全部通过 | ✓ | | Go 静态检查与构建 | 无 vet 问题且 API/seed 可构建 | `go vet ./...`、`go build ./...` 通过 | ✓ | | React 类型检查 | TypeScript 无错误 | `pnpm --dir web typecheck` 通过 | ✓ | | React 单元测试 | API、轮询资源、格式、状态组件、员工/管理/游客手机号展示和公屏回归测试通过 | 9 个文件、19 项测试全部通过 | ✓ | | React 生产构建 | Vite 可生成生产资源 | 54 modules;JS gzip 85.03 kB | ✓ | | PostgreSQL 迁移与种子 | 版本化迁移可执行,种子可重复运行 | v1/v2 迁移完成;`make seed` 重复执行通过 | ✓ | | API 端到端烟测 | 登录、幂等、重复确认、revision、固定 N、过号重发、隐私和看板贯通 | `make smoke` 通过,输出 `status: ok` | ✓ | | 浏览器真实页面验收 | 四端主流程、跨端同步、响应式和控制台无错误 | 登录/取号/二次确认/到场/完成/叫号、游客页、公屏、管理看板通过;390px 无横向溢出;最终控制台零告警 | ✓ | | 手机号真实投影烟测 | 不使用 mock;真实迁移、加密落库、全响应连续性与四端隐私边界均可重复 | `make smoke-real` 连续两次 `status: ok`,每次结束临时数据库数为 0 | ✓ | ## Error Log | Timestamp | Error | Attempt | Resolution | |-----------|-------|---------|------------| | 2026-07-10 | 仓库为空,缺少现有业务资料 | 1 | 显式记录为绿地假设,后续向用户确认 | | 2026-07-10 | 组合补丁上下文匹配失败 | 3 | 读取当前片段并拆成更小补丁成功修改 | | 2026-07-10 | `git status` 报告当前目录不是 Git 仓库 | 1 | 不创建仓库;改用文件级检查核验本次文档 | | 2026-07-10 | in-app Browser 打开 Waitwhile 帮助页两次超时 | 2 | 按 3-strike/不重复失败原则停止重试,保留来源边界并采用官方文本资料 | | 2026-07-10 | 轻量化 ETA 大段补丁上下文不匹配 | 1 | 改为读取精确段落并分小节应用 | | 2026-07-10 | 公屏把业务记录未变化误判为连接延迟 | 1 | 新鲜度改为最近成功轮询时间,重跑类型、测试、构建和浏览器复验 | | 2026-07-10 | 公屏公开批次无内部 ID 导致 React key 告警 | 1 | 改用公开稳定组合键,新增组件测试,刷新新页面确认控制台为空 | | 2026-07-10 | 应用角色 `queue` 创建隔离烟测数据库被 PostgreSQL 拒绝 | 1 | 保持最小数据库权限,由本机所有者创建、`queue` 仅作为测试库 owner/运行账号 | | 2026-07-10 | 随机公屏 token 以连字符开头时 `smoke-real` 参数解析失败 | 1 | 使用 `--display-token=` 传递不可预测 token,避免被 argparse 识别为选项 | | 2026-07-10 | 四端页面并行刷新时内置浏览器连接页面视图超时 | 1 | 停止并行刷新,按故障指引改为单标签顺序核验 | | 2026-07-10 | `smoke-real` 通过后遗留临时测试数据库 | 1 | 改用受控临时 API 二进制并强制删除测试库连接;清理历史遗留库后重跑 | | 2026-07-10 | 响应式视口恢复后旧浏览器标签句柄无法交付 | 1 | 新建四个最终真实页面并使用新句柄保留,未影响页面或测试数据 | | 2026-07-10 | 新标签创建前的 viewport 覆盖未即时传播 | 1 | 改为先创建测试标签、再设置 390×844 并在同一标签读取实际视口 | ## 5-Question Reboot Check | Question | Answer | |----------|--------| | Where am I? | Phase 7 已完成,首个可运行纵向切片可本地启动 | | Where am I going? | 进入真实硬件型号确认、现场试点和后续管理配置扩展 | | What's the goal? | 交付轻量、可验证的景区多项目排队叫号首期闭环 | | What have I learned? | 公开投影、提交意图幂等和连接新鲜度都必须独立建模,不能只依赖前端表象或业务更新时间 | | What have I done? | 完成产品基线、Go/GORM/PostgreSQL 后端、React 四端、设备模拟器、自动化测试与真实浏览器验收 | ### Phase 7: 首个可运行纵向切片 - **Status:** complete - **Started:** 2026-07-10 - Actions taken: - 完成逐项需求确认并在最新摘要后收到用户明确“确认,可以执行”。 - 冻结一人一号、固定 N 连续叫号、过号重新取号、最小必要身份字段、双预计时间模板等核心规则。 - 冻结 React + Go + GORM + PostgreSQL 技术栈、中心写入、内置账号密码和硬件模拟器边界。 - 更新文件化计划,进入首个可运行纵向切片开发阶段。 - 初始化 `main` 分支 Git 仓库。 - 新增基础忽略规则、编辑器规范和可选 PostgreSQL 17 Compose 配置。 - 启动 Go 1.26 与 PostgreSQL 17 本机开发依赖安装。 - 并行启动产品文档同步、Go/GORM 后端和 React 四端前端三条工作流;目录职责互不重叠。 - 完成 Go 1.26.5 与 PostgreSQL 17.10 安装,启动本地 PostgreSQL,并创建 `queue` 开发角色与数据库。 - 首次契约巡视发现并反馈两项草稿问题:后端示例密钥长度错误;前端仍残留同行组字段且缺少幂等键/revision。 - 新增根级 Makefile 与 API/种子启动脚本,统一安装、数据库、开发、测试、构建和静态检查入口。 - 使用 `queue` 角色通过 TCP 成功连接本地 PostgreSQL 17.10,数据库运行链路已验证。 - 后端示例密钥已修正为 32 字节;创建了被 Git 忽略的本地随机开发密钥配置。 - 产品规划与 UI/UX 范式升为 v1.0 已确认开发基线,清除本项目同行组/party_size/欠载装载等旧规则冲突。 - 对齐本地与 Compose 数据库凭据,新增幂等的数据库初始化脚本和根 README;`make db-init` 已实测成功。 - React 前端已完成类型检查、3 个 Vitest 文件/8 个测试和生产构建;集成巡视要求修正 API 代理端口并清理构建产物。 - React 端口/构建产物问题修正后再次独立验证:typecheck、8 项测试和 Vite 生产构建全部通过。 - 真实数据库联调发现种子命令重复运行唯一键冲突;已将当日队列初始化改为显式幂等查询/创建。 - 独立只读审查识别 4 个 P1:公示字段/状态过滤、过号新号闭环、管理项目真实指标、客户端重试幂等键复用;已并行进入修复。 - 新增可重复的 Python API 烟测脚本,覆盖登录、取号幂等、重复手机号确认、固定 N 叫号、活动批次冲突、过号重发、公共/大屏隐私和管理真实指标。 - 完成公开白名单 DTO、可追溯重新取号、管理端真实项目指标和按提交意图复用幂等键四项 P1 修复。 - 使用真实 PostgreSQL 完成迁移、种子幂等和增强 API 烟测;最终烟测返回 `status: ok`。 - 使用 in-app Browser 完成登录、代取号、重复手机号二次确认、到场/完成、固定 N 叫号及游客/公屏跨端同步验收。 - 在 390×844 视口验证游客页与员工端无横向溢出,并检查登录、员工、游客、公屏、管理端控制台。 - 浏览器验收发现并修复公屏错误新鲜度告警与缺失 React key;新增公屏组件测试后控制台复验为零告警。 - 最终执行 `make test check build smoke` 与 `go test -race ./...`,Go、TypeScript、13 项 Vitest、生产构建和端到端链路全部通过。 - Files created/modified: - task_plan.md(Phase 5 完成,新增 Phase 7 与最终决策) - findings.md(新增实施冻结决策) - progress.md(新增 Phase 7 进度) - .gitignore(新增) - .editorconfig(新增) - compose.yaml(新增) - Makefile(新增) - scripts/run-api.sh、scripts/seed.sh、scripts/init-db.sh、scripts/smoke.py(新增) - server/(Go API、GORM 模型、迁移、种子与测试) - web/(React 四端路由、设计系统、API 客户端与测试) - README.md(本地运行与质量检查说明) ### Phase 8: 真实手机号对应与跨端实库验收 - **Status:** complete - **Started:** 2026-07-10 - Actions taken: - 用户新增确认:管理端和员工端需看到手机号与票号/游客信息对应,游客私密状态页至少显示手机号尾号。 - 冻结展示边界:内部授权页面显示完整手机号;游客私密页显示尾四位;公示屏继续零手机号字段。 - 冻结验收口径:使用真实 PostgreSQL、Go API 和 React 浏览器页面,不以 mock 响应作为联调证据。 - 核验真实数据库:现有票号均保存 AES-GCM 手机号密文、12 字节 nonce 和 64 字符 HMAC,不存在为展示新增明文字段的必要。 - 更新产品与设计基线:员工/管理授权列表直接展示完整手机号;游客私密页仅尾四位;公屏零手机号;敏感导出仍维持更高权限与审计。 - 扩展 `scripts/smoke.py` 契约,准备在真实 API 中断言 staff/full phone、visitor/last4、admin/full phone 以及 display/zero phone。 - Go 授权读模型完成:员工完整手机号/姓氏、管理活动号码、游客尾四位及公屏独立白名单已落地;手机号继续只以密文存储。 - React 三端展示完成:员工等待/当前批次/队首预览、管理活动号码表、游客尾四位;公屏默认不渲染联系方式。 - 后端 `gofmt`、单测、vet、竞态测试和构建通过;前端 typecheck、9 个文件 19 项测试和生产构建通过。 - 重启新版 Go API 后,使用真实员工页面写入 PostgreSQL 记录 A0009(受控测试手机号、姓氏“实测”、称谓“女士”)。 - 真实浏览器跨端核对:员工等待表/队首预览显示完整对应;游客页显示 A0009 与尾号 8042;管理活动号码表显示完整对应;公屏无手机号标签或完整测试值。 - 独立隐私审查确认路由授权、字段白名单和响应式展示总体通过,同时发现 1 个事务一致性 P1 与 2 个烟测覆盖/可重复性 P2,已进入修复。 - P1 已修复并补坏密文回归测试;烟测已覆盖所有票号响应路径,并新增 `make smoke-real` 临时实库编排。 - 浏览器连接恢复后逐端复验:员工 A0009/完整手机号/实测女士均命中;游客 A0009/尾号 8042 命中且完整手机号未出现。 - 管理端逐端复验命中 A0009/完整手机号/实测女士;公屏逐端复验既无完整测试手机号,也无“手机号”标签。 - `make smoke-real` 在两个独立临时 PostgreSQL 数据库上连续执行成功,均完成迁移、真实 API 写入、全响应连续性与隐私断言,并自动清理数据库。 - 390×844 响应式实测:员工页可访问 A0009 完整对应且整页无横向溢出;游客页显示尾号 8042、不含完整手机号,整页同样无横向溢出。 - 修复烟测临时数据库清理竞态:改为运行直接控制 PID 的临时 API 二进制并使用 `dropdb --force`;全部遗留测试库已清理。 - 最终全量检查通过:Go 测试/vet/race/build、前端 9 文件 19 项测试/typecheck/build、真实 smoke、四端控制台和响应式浏览器验收均成功。 - 四个最新真实页面已重新打开并作为 deliverable 保留:员工 A0009、游客 A0009/尾号 8042、管理活动号码、公屏公开投影。 ### Phase 9: 手机端固定 390px 设计宽度 - **Status:** complete - **Started:** 2026-07-10 - Actions taken: - 用户要求固定手机端尺寸。 - 采用 390px 参考宽度:员工/游客 H5 固定设计宽度,窄屏缩至 100%,高度自适应;管理端和公屏维持原尺寸。 - AppShell 新增仅 StaffPage 使用的 mobile variant,显式覆盖桌面 header、双列 staff-layout、表单、批次卡和固定底栏。 - VisitorPage 与内部登录卡同步固定 390px;产品与设计文档已写入宽度、窄屏降级和高度自适应规则。 - 前端 typecheck、9 个文件 19 项测试和生产构建由实现工作流验证通过。 - 独立根流程再次通过 typecheck、19 项测试与生产构建;已接管上一阶段保留的员工、游客、管理、公屏四个真实页面进行尺寸对照。 - 1280px 桌面视口:员工/游客各 390px,管理端/公屏各 1265px;桌面路由隔离通过。 - 390×844 设备视口:员工 shell/底栏与游客页均为 390px,document scrollWidth=390px,无整页横向溢出。 - 独立尺寸审查发现 2 个 P1(顶部安全区、固定栏动态预留)和 1 个 P2(414px 登录卡仅 382px),已交由实现工作流修正。 - 完成安全区、固定栏动态预留和 414px 登录卡三项修复;底栏项目名/状态保留完整可访问文本并以单行省略防止撑高。 - 根流程再次通过 TypeScript 类型检查、9 个文件 19 项 Vitest 与 Vite 生产构建。 - 320/375/390/414px 四档真实回归通过:员工 shell 与底栏、游客页、登录卡均按 `min(100%, 390px)` 生效且没有整页横向溢出。 - 1280px 桌面复核通过:员工/游客手机画布保持 390px,管理端与公屏保持桌面/大屏宽度;四端控制台无 error/warn。 - 通过真实员工页面创建 A0010(受控测试手机号与“尺寸实测女士”),再次验证员工/管理完整对应、游客尾号最小披露与公屏零手机号边界。 - 390px 真实数据复验通过:员工页主文档宽度 390px,760px 表格仅在 322px 局部容器内横向滚动;游客页 A0010/尾号 8042 同宽且不暴露完整手机号。 ### Phase 10: 管理端与大屏整合、员工 H5 场景化重构 - **Status:** complete - **Started:** 2026-07-10 - 用户确认:管理端与大屏统一为 PC 管理端;员工端为独立 H5;本轮只重构现有前端能力。 - 已完成当前路由、权限、项目参数接口与视觉基线核对;下一步重构 React 路由、页面层级与样式,并进行类型、测试、构建和浏览器回归。 - 验证中发现两项环境/路由问题:已有 API 占用 8080、已有 Vite 占用 5173,因此使用 5174 预览;管理员登录可继承员工页的来源路由,已收敛为管理员只保留管理端来源路径,否则进入 `/admin`,并将补充回归验证。 - 管理端已改为固定侧边导航:运营概览、项目管理、大屏中心。项目管理复用既有 `PUT /api/admin/projects/{id}/settings`,可维护项目状态、批量号码数、宽限与预计等待参数。 - 大屏中心作为管理员监控墙,按项目展示公开票号语义、等待量、预计等待和设备状态,并支持浏览器全屏;实体公示屏继续使用既有绑定的只读 URL,未新增令牌读取或个人信息投影。 - 员工端已拆为 `/staff`、`/staff/tickets`、`/staff/verify`;叫号页保留唯一固定底部主操作,取号页展示等待队列,核验页只处理当前批次。所有既有写入、项目授权与隐私展示边界均保留。 - README、产品规划和设计范式已同步新端结构。 - 最终前端验证通过:TypeScript 类型检查、9 个 Vitest 文件共 23 项测试、Vite 生产构建;本地浏览器验证了管理三页、390px 员工三场景、管理员默认登录入口、无横向溢出及零控制台 error/warn。 ### Phase 11: 全平台功能文案极简化 - **Status:** complete - **Started:** 2026-07-11 - 用户要求全平台删除非必要标题、说明、备注、副标题、思考与约束表达,只保留最直接的按钮和功能信息。 - 已启动员工端、管理/游客/公屏/登录端与测试影响三条只读审计;本轮保留必要的操作标签、关键状态、反馈、空态和无障碍名称。 - 本机 PostgreSQL、Go API 与 Vite 已启动并通过健康检查,后续浏览器验收继续使用真实开发数据库。 - 完成三条独立审计与根流程复核:识别所有重复 page heading、eyebrow、解释性详情、健康状态备注及受影响的 aria 引用和测试断言。 - 冻结改造边界:不改路由/API/权限/字段顺序;可见层仅保留导航、控件、表头、业务数据、文字状态、必要反馈/空态及最小隐私信息。 - 公共壳层已删除品牌副标题和内部角色副行;连接/延迟、加载、空态组件已压缩为短状态,健康连接不再常驻显示更新时间。 - 新增公共反馈极简回归测试,锁定加载/空态短文案、健康状态静默以及离线恢复入口,防止纸号/广播等设计约束说明重新进入界面。 - 员工固定底栏预留由 180px 收紧到 100px,登录卡纵向间距同步收紧,并新增通用 `.sr-only` 供删除可见标题后维持语义结构。 - 公共反馈组件 2 项聚焦测试已通过。 - 页面精简与布局收口完成后,TypeScript、11 个文件 26 项 Vitest 和 Vite 生产构建全部通过。 - 浏览器验收前发现技能缓存版本已切换;已定位当前版本路径,代码与运行服务不受影响。 - 真实浏览器已开始验收;未登录访问员工端正确跳转到精简登录页,DOM 中仅保留品牌和三个登录控件。 - 使用真实管理员会话进入运营概览,A0010、完整手机号与“尺寸实测女士”仍在活动号码表中正确对应;首屏视觉结构紧凑,无冗余介绍块。 - 员工叫号页真实数据核验通过:A0010/完整手机号/游客仍可见,页面只剩项目、三任务导航、等待数、下一批列表和主叫号按钮。 - 390px 视觉验收发现一项布局残留:无当前批次时空态仍过高;已进入 CSS 定点压缩,其他宽度/底栏/真实数据均通过。 - 空态高度已由 180px 压至 88px;员工取号页同时通过真实 DOM 核验,字段、按钮、表头和 A0010 数据完整。 - 员工取号与核验两场景的 390px 视觉/DOM 回归完成,未发现空标题容器或整页溢出。 - 游客真实私密链接完成 390px 复验:A0010 与尾号 8042 正确,完整手机号不可见,页面已压缩为票卡和刷新按钮。 - 项目管理页 DOM 验收通过;截图通道单次超时后按规则不重复,改以已读取的控件树继续验收。 - 管理端大屏中心 DOM 验收通过;旧公示 token 已失效,正在定位当前开发环境的绑定 token 后复验公开页。 - 重新生成开发公示 token 并完成真实页面验收;公示屏精简布局、公开字段白名单和空队列状态均正常。 - 完成最终静态扫描、TypeScript、11 文件 26 项 Vitest、Vite 生产构建与 API 健康检查;全部通过。 - 登录、员工三场景、管理三页、游客 A0010 与真实公示屏均完成浏览器验收,控制台零 error/warn。 ### Phase 12: 移除核验流程并自动轮换叫号批次 - **Status:** complete - **Started:** 2026-07-11 - 用户确认删除核验逻辑,并批准“新叫号自动结束上一批”的替代流程。 - 已冻结实施范围:前端删除核验入口/路由/动作,后端事务自动轮换批次,保留 FIFO/幂等/revision/审计/设备与隐私边界。 - 完成现状审计:确认活动批次冲突发生在 `callNext` 事务内,状态动作与重发号另有路由;已确定自动完成必须与新批次创建同事务提交。 - Go `callNext` 已改为原子轮换:确认存在下一批等待号码后,锁定并完成活动批次及其中 `CALLED/ARRIVED` 号码,再创建新的 FIFO 固定 N 批次;revision 只增加一次,审计记录自动完成批次与号码数。 - 到场/完成/过号/重新取号 HTTP 路由已移除;员工 React 只保留叫号/取号,删除核验页、行操作和对应 API 客户端,旧 `/staff/verify` 地址重定向到 `/staff`。 - 管理端删除到场宽限输入,公屏空态改为“暂无当前叫号”;历史数据库字段与状态值保留,避免破坏既有记录和迁移。 - 验证通过:Go 全量测试、前端 11 文件 24 项 Vitest、TypeScript、Vite 生产构建、Python 烟测语法及真实 PostgreSQL `make smoke-real`。 - 真实烟测成功创建两批:第二次叫号自动结束第一批,第一批游客状态为 COMPLETED,第二批成为唯一 current batch,管理端/游客手机号隐私投影保持正确。 - 8080 API 已重启为新版本;5173 Vite 热更新正常。真实浏览器确认员工端只有“叫号/取号”,旧核验地址自动回到员工首页。 ### Phase 13: 小七孔品牌化四端重绘 - **Status:** in_progress - **Started:** 2026-07-11 - 已按 product-prototype-design skill 完成只读审计和需求确认门槛。 - 已确认用户提供的小七孔文旅集团图为产品正式 Logo,哈希为 `ac1b8b07954ee5ce706e6cd053e99b00275ee0516a5c0c21d1d576b5a059909d`。 - 已初始化 `.prototype-run/xiaoqikong-redesign-20260711`,产品契约和三候选提示词均校验通过。 - 已用 built-in ImageGen 产出三个结构独立的 1487×1058 候选图,实际宽高比偏差低于 2%,按 skill 规则自动接受。 - 当前等待用户选择确切候选,未开始实现。 # Phase 14: 账号/项目归属与无批次叫号改造 - **Status:** in_progress - **Started:** 2026-07-11 - 已定位现状:后端已有 `users`、`user_projects` 和项目设置,但缺少账号管理 API/UI;叫号数量固定取项目 `call_batch_size`;前端及 DTO 仍公开批次号;票号仍使用项目前缀加四位数字。 - 已实现账号列表/创建/更新与项目归属维护 API,并在管理端增加“账号管理”。 - 已实现员工端快速叫下一个号、手动数量批量叫号;服务端按请求数量严格 FIFO 叫号。 - 已将新号码改为每日会话内五位纯数字格式。 - 校验错误:在仓库根目录运行 `go test ./...`,因 Go 模块位于 `server/` 而失败;改为进入 `server/` 验证。 - Go 全量测试通过;前端类型检查发现 `api.test.ts` 仍按旧 `callNext` 参数顺序调用,已更新测试传入批量数量。 - 更新员工端、管理监控与公示屏用户可见文案,不再显示批次序号;后端仍保留不可见的事务分组表以保证一次批量叫号原子性和审计能力。 - 最终验证通过:`go test ./...`、`go vet ./...`、前端 TypeScript 类型检查、11 个测试文件共 24 项测试、Vite 生产构建。 - **Status:** complete # 2026-07-11 Phase 17 - 根据员工 H5 登录后进入管理后台的截图完成路由、前端认证与 Go 会话审计。 - 确认根因是单登录页按角色分流,且员工端与管理端共用一枚会话 Cookie。 - 已拆分 `/staff/login` 与 `/admin/login`,旧 `/login` 仅导向员工端。 - 已拆分两组认证 API 和 `queue_session_staff` / `queue_session_admin` Cookie,后端按端强制角色校验。 - 已更新 API 契约测试、Cookie 隔离测试、烟测脚本与 README。 - 验证:Go 全量测试通过;Vitest 11 个文件/28 项测试通过;TypeScript 类型检查与 Vite 生产构建通过。 # Session: 2026-07-11(维护账号 UI 优化) - 根据用户截图定位到 `EditAccount` 的原生 `fieldset/legend` 布局与对应 CSS。 - 确认本次保留现有即时保存行为,主要修正宽屏空白、突兀边框和项目选择层级。 - 将角色与账号状态并列,账号状态改为带说明的开关;所属项目改为自适应两列选择卡。 - 首轮回归的新断言误用截图项目名“云梦观光车”,已按测试夹具修正为“东门观光车”。 - 前端 11 个测试文件共 34 项测试、TypeScript 类型检查和 Vite 生产构建全部通过。 - 真实页面验收:1280px 下项目卡为 2 列,390px 下收敛为 1 列;两种视口均无水平溢出,控制台无错误或警告。 - 真实页面全页截图曾超时一次,按不重复失败原则改用计算样式和 DOM 几何数据完成验收。 # Session: 2026-07-11(页头 Logo 修正) - 根据用户截图定位 `AppShell` 页头 Logo 重复文字和图片比例异常。 - 检查原图确认其为带中英文公司名的 640×640 完整品牌图,将改为 CSS 窗口裁切纯图形。 - 页头现仅裁切显示绿色山水图形,右侧默认改为“景区排队叫号系统 / 小七孔文旅集团”,不再与图片内容重复。 - 前端 34 项测试、TypeScript 检查和生产构建通过。 - 真实页面检查确认:桌面端图形窗口 112×54,390px 窄屏为 88×44;两者裁切位置稳定,控制台无错误或警告。 # Session: 2026-07-11(页头完整 Logo 与去重) - 用户明确要求完整保留 Logo,删除右侧重复名称。 - `AppShell` 无具体项目时现仅显示完整品牌图;有具体项目时仍保留项目名和系统类型,避免上下文丢失。 - 完整 Logo 使用 `object-fit: contain` 缩放,不再裁切原图;桌面和窄屏分别使用 96×64 与 78×52 显示区。 - 前端 11 个测试文件共 34 项测试、TypeScript 检查和 Vite 生产构建通过。 - 根据进一步反馈明确页头层级:左侧完整 Logo,右侧仅删除重复的“小七孔文旅集团”,保留“景区排队叫号系统”。 # Session: 2026-07-11(管理端列表与账号维护布局) - 根据两张截图确认项目表格右侧对齐与账号维护页基础设置层级问题。 - 确认角色下拉的主要交互问题来自原生系统弹层,将替换为两项分段选择。 - 项目列表将状态与操作收紧为固定列,操作列统一右对齐;1280px 真实页面下维护按钮距表格右边缘 17px。 - 账号角色改为带 `radiogroup/radio` 语义的员工/管理员分段选择,不再调用原生下拉弹层。 - 基础设置两张卡片实测等宽等高(467×131);三个项目权限卡在宽屏下同行等宽(309px),页面无水平溢出或控制台错误。 - 前端 11 个测试文件共 34 项测试、TypeScript 检查和 Vite 生产构建全部通过。 - 首轮构建发现草稿差异判断未被 TypeScript 收窄,已改为显式条件表达式。 - Go 保护逻辑测试首次误用旧模块路径,已按当前 `go.mod` 修正导入。 # Session: 2026-07-11(后台维护草稿与管理员防锁死) - 查明 `admin` 已被改成 `STAFF`,恢复为 `ADMIN`,管理端登录端点实测 HTTP 200。 - 账号维护改为草稿表单:角色、账号状态、项目权限修改仅更新本地状态,底部统一保存或放弃。 - 增加“有未保存的修改 / 当前内容已保存 / 保存成功 / 错误”状态反馈。 - 后端增加最后启用管理员保护及单元测试。 - 验证通过:前端 34 项测试、TypeScript 检查和生产构建;Go 全量测试、vet 和 build。 # Session: 2026-07-12(大屏顶部信息优化) - 已根据截图定位到管理端大屏中心的 `ProjectScreenTile` 全屏布局。 - 设计决定:全屏左上角显示实时日期时间,项目名称收紧后右对齐,删除项目状态徽标。 - 已完成实时时钟、项目名称层级和状态删除,并增加回归断言。 - 验证通过:前端 11 个测试文件共 35 项测试、TypeScript 检查和 Vite 生产构建。 - 真实管理端页面确认时间 DOM 按秒更新且项目状态已不渲染;内置自动化浏览器拒绝原生 Fullscreen API,因此全屏视觉部分以 DOM/CSS 规则和构建验证交叉检查。 # Session: 2026-07-12(大屏全屏纵向布局) - 开始将单项目全屏调整为“时间标题栏 -> 当前叫号 -> 轮播列表”的上下架构。 - 轮播列表标题改为“最新取号码”,并将总计等待号数合并到标题区。 - 全屏 CSS Grid 已改为单列三行,当前叫号和轮播列表均使用全宽容器。 - 删除底部重复等待统计,保留原有六秒自动分页轮播。 - 验证通过:前端 11 个测试文件共 35 项测试、TypeScript 检查和 Vite 生产构建。 # Session: 2026-07-12(员工端末号预计时长与轮询闪屏) - 已定位后端员工快照的 `metrics.estimated_wait` 被固定返回 `nil`,前端又错误依赖最后一张票的可选 ETA 字段。 - 已定位页面首次取得队列数据时,`Boolean(queue)` 变化会触发整页 GSAP 入场动画,形成明显闪屏。 - 员工快照现按 `waiting_count - 1`、项目 `ETAIntervalSeconds`、项目/队列运行状态调用统一 `domain.CalculateETA`,并返回 `metrics.estimated_wait`。 - 员工端改为读取快照级末号 ETA;标准服务端结果显示为“约 N 分钟”。 - 初次数据挂载和轮询更新不再播放整页入场动画,真实场景切换仍保留动效。 - 验证通过:Go 全量测试与 `go vet`;前端 11 个测试文件共 36 项测试、TypeScript 检查和 Vite 生产构建。 - 用户截图反馈仍显示不可估算后,确认本地旧 API 进程未随源码更新;已重启 API。 - 真实登录并请求员工队列接口验证成功:后台 96 秒/号配置已生效,279 个等待号码的末号预计时长为 450 分钟。 - 进一步移除健康轮询期间反复插入/删除的“更新中”布局节点;离线和更新延迟警告仍正常保留。 - 真实员工端跨两个五秒轮询周期验证:三次采样均无刷新占位节点,主面板 top=219.859375、height=633 保持一致,场景 opacity=1、visibility=visible,页面未发生布局位移或淡出。 - 前端 11 个测试文件共 36 项测试、TypeScript 检查和生产构建再次通过。 - 游客端自动轮询期间现保持页头“实时更新”和刷新按钮稳定,不再使用 `refreshing` 切换可见文案或禁用样式。 - 真实游客页面跨两个三秒轮询周期验证:三次采样的卡片 top=87、height=468.5625、opacity=1、transform 均完全一致;页头始终“实时更新”,刷新按钮始终保持稳定外观。 - 前端 36 项测试、TypeScript 检查和生产构建通过。 # Session: 2026-07-12(生产后端与数据库基础交接) - 修复真实 PostgreSQL 烟测的种子结果解析、管理员凭据和短公示 token 问题。 - 新增个人数据清理迁移、受保护管理员密码轮换迁移,以及带 advisory lock 的周期维护事务。 - 增加生产配置校验:数据库 TLS、`MIGRATE_ON_START=false`、连接池参数和维护参数;`/readyz` 现在检查数据库 schema 版本。 - 增加独立 `/usr/local/bin/migrate`、`/usr/local/bin/bootstrap-admin` 镜像命令和生产交接文档;明确 Redis/Kubernetes/Secret/备份由运维接入。 - 验证通过:Go 测试、race、vet、build;前端 37 项测试、类型检查、生产构建;临时 PostgreSQL 集成测试;真实 API/数据库烟测;shell 语法检查。 - 当前未在本机验证 Docker/Kubernetes,也未完成 3000 并发压测、PITR/RPO/RTO 演练;这些属于运维上线前的环境验证。 # Session: 2026-07-15(创建项目与项目维护表单统一) - 根据用户截图确认创建页只显示基础字段,维护页包含完整项目运行配置;后端错误来自隐藏 `Asia/Shanghai` 在 Alpine 精简环境中缺少时区数据。 - 用户已明确确认执行:创建页复用维护页完整表单,沿用合法默认时区并修复服务端时区数据加载。 - 已将 `ProjectProfileForm` 与 `ProjectSettingsForm` 合并为共享 `ProjectForm`;创建和维护现在使用同一组字段、默认值、网格布局和保存操作区。 - 创建流程保存基础信息后继续保存完整运行设置;创建页不再只提交基础字段,维护页行为保持不变。 - Go `httpapi` 包嵌入 `time/tzdata`,避免 Alpine 精简镜像因缺少系统时区文件把 `Asia/Shanghai` 判为无效。 - 补充创建页字段一致性测试和默认时区测试。 - 补充创建页移动端操作区换行规则,避免取消/创建双按钮在窄屏下挤压。 - 验证通过:前端 TypeScript、11 个文件 38 项 Vitest、Vite 生产构建、Go 全量测试、`go vet`、缺失系统时区文件场景回归测试和 `git diff --check`。 - 本地浏览器连接验证时无可用管理端登录会话,未代填账号密码;未登录页面正确显示管理端登录入口,页面业务布局由组件测试和构建验证覆盖。 # Session: 2026-07-15(游客手机号运营测试查询) - 新增 `POST /api/public/status/search`,使用现有手机号 HMAC 索引匹配所有项目当前 `WAITING/CALLED/ARRIVED` 活动号码;生产环境返回 404,后续替换为验证码或外部身份接口。 - 新增 `/visitor` 页面:手机号输入、无结果/错误/限流提示、同手机号多号码按项目/票号选择、复用游客状态卡片和自动刷新;现有 `/visitor/:token` 保持兼容。 - 增加临时内存查询限流、API/页面测试、真实烟测中的单号与重复活动号码查询,以及 README/服务端接口说明。 - 验证通过:Go 全量测试、`go vet`、前端 41 项 Vitest、TypeScript 检查、Vite 生产构建、`make test-db`、`make smoke-real`、`git diff --check`。 # Session: 2026-07-15(手机号查询后跳转号码页) - `/visitor` 现在只负责提交手机号;查询成功后 replace 导航到 `/visitor/phone`。 - 新增无手机号输入框的号码状态页,复用游客状态卡片和自动刷新;同手机号多个活动号码仍可在号码页选择。 - 增加“查询其他手机号”返回入口,保持旧的 `/visitor/:token` 私密状态页兼容。 - 验证通过:前端 13 个测试文件共 43 项测试、TypeScript 检查、Vite 生产构建和 `git diff --check`。 # Session: 2026-07-15(项目新建/维护表单结构化) - 确认新建和维护已共用 `ProjectForm`,本轮只重组表单信息架构,不改动 API 和数据字段。 - 表单已拆分为基础信息、叫号规则、其他规则三个可访问区域。 - 叫号规则已按支持方式、单号人数、批量叫号、批量叫人四行组织,默认数量与单次上限成对展示。 - 已更新项目页回归断言;前端 14 个测试文件共 52 项测试全部通过,TypeScript 类型检查通过。 - 已完成 Vite 生产构建;目标文件和三份项目台账的差异格式检查通过。 - 新建页与真实项目维护页均完成 1440×1000 和 390×844 响应式验收:三处分区、四个规则分组、既有数据回填、成对输入对齐及无横向溢出均通过。 - 浏览器控制台无 error/warn,临时视口已恢复,Phase 33 全部验收项完成。 - 台账收尾后再次执行目标差异格式检查,结果仍为通过。