Files
XQKqueue/progress.md
2026-07-15 10:05:33 +08:00

468 lines
46 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Progress Log
## 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-11Phase 16
- 已恢复 Phase 14/15 上下文并完成首轮跨端静态审计。
- 已确认三类核心偏差:后台仍有固定批量配置和“第 N 批”兼容文案;游客端存在硬编码位置/时间/刷新频率;大屏用户层已基本转为号码语义。
- 管理端已取消“第 N 批”降级文案,当前叫号始终以实际号码表达。
- 原“每批号码数”已明确改为“预计每次叫号数(仅用于估算)”,不再暗示会控制员工当次叫号;预计方式和间隔文案同步移除“批次”。
- 游客端已将“人/张票”改为“号码”,并使用 API `people_ahead + 1` 展示真实当前位置。
- 共享叫号卡片和遗留移动端 CSS 文案已改为“本次叫号/当前叫号/待叫号码”。
- 验证通过Go 全量测试与 vet/build前端 11 个文件 25 项测试、TypeScript 类型检查和 Vite 生产构建。
- **Status:** complete
## Session: 2026-07-11Phase 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 粗略为 912 周、45 人小团队,真实硬件和外部集成另计。
- 经独立审查进一步删除 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 modulesJS 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=<value>` 传递不可预测 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.mdPhase 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/底栏与游客页均为 390pxdocument scrollWidth=390px无整页横向溢出。
- 独立尺寸审查发现 2 个 P1顶部安全区、固定栏动态预留和 1 个 P2414px 登录卡仅 382px已交由实现工作流修正。
- 完成安全区、固定栏动态预留和 414px 登录卡三项修复;底栏项目名/状态保留完整可访问文本并以单行省略防止撑高。
- 根流程再次通过 TypeScript 类型检查、9 个文件 19 项 Vitest 与 Vite 生产构建。
- 320/375/390/414px 四档真实回归通过:员工 shell 与底栏、游客页、登录卡均按 `min(100%, 390px)` 生效且没有整页横向溢出。
- 1280px 桌面复核通过:员工/游客手机画布保持 390px管理端与公屏保持桌面/大屏宽度;四端控制台无 error/warn。
- 通过真实员工页面创建 A0010受控测试手机号与“尺寸实测女士”再次验证员工/管理完整对应、游客尾号最小披露与公屏零手机号边界。
- 390px 真实数据复验通过:员工页主文档宽度 390px760px 表格仅在 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×54390px 窄屏为 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`
- 本地浏览器连接验证时无可用管理端登录会话,未代填账号密码;未登录页面正确显示管理端登录入口,页面业务布局由组件测试和构建验证覆盖。