docs(M09-A): 回填事务收口与V5.6游标

This commit is contained in:
Codex
2026-08-10 14:58:50 +08:00
parent 9b2f055ecd
commit b71b48b3d0
9 changed files with 6795 additions and 34 deletions
+9 -8
View File
@@ -1,10 +1,10 @@
# 自助棋牌室系统 # 自助棋牌室系统
本仓库是 `panda/qipai.git` 的单一 Monorepo 工作区。Windows 固定开发路径为 `D:\qipai`,当前权威开发总纲为 [`V5.4.md`](./V5.4.md)。详细功能、模块顺序、验收标准和 Codex 纪律以总纲及 `docs/` 为准。 本仓库是 `panda/qipai.git` 的单一 Monorepo 工作区。Windows 固定开发路径为 `D:\qipai`,当前权威开发总纲为 [`V5.6.md`](./V5.6.md)。详细功能、模块顺序、验收标准和 Codex 纪律以总纲及 `docs/` 为准。
## 固定约束 ## 固定约束
- 当前权威总纲:`V5.4.md` - 当前权威总纲:`V5.6.md`
- 固定远端:`ssh://git@git.txyundm.cn:2222/panda/qipai.git` - 固定远端:`ssh://git@git.txyundm.cn:2222/panda/qipai.git`
- 默认分支:`main` - 默认分支:`main`
- 生产 API`https://api.txyundm.cn` - 生产 API`https://api.txyundm.cn`
@@ -35,7 +35,7 @@
| 用途 | 位置 | | 用途 | 位置 |
|---|---| |---|---|
| 项目入口 | `D:\qipai\README.md` | | 项目入口 | `D:\qipai\README.md` |
| 当前总纲 | `D:\qipai\V5.4.md` | | 当前总纲 | `D:\qipai\V5.6.md` |
| 完整配置索引 | `D:\qipai\docs\configuration.md` | | 完整配置索引 | `D:\qipai\docs\configuration.md` |
| 仓库目录映射 | `D:\qipai\docs\repository-map.md` | | 仓库目录映射 | `D:\qipai\docs\repository-map.md` |
| 后端开发配置 | `D:\qipai\backend\.env.development` | | 后端开发配置 | `D:\qipai\backend\.env.development` |
@@ -113,16 +113,16 @@ WSL 已验证:EMQX `5.8.9`、MQTTX CLI `1.13.0`、EMQX 服务 `active (running
- 一个 commit 只完成一个子阶段;同一次 Codex 会话可连续完成多个相邻子阶段。 - 一个 commit 只完成一个子阶段;同一次 Codex 会话可连续完成多个相邻子阶段。
- 每个子阶段必须完成工程编码、真实测试、增量文档、commit、push,并验证 `HEAD == origin/main` - 每个子阶段必须完成工程编码、真实测试、增量文档、commit、push,并验证 `HEAD == origin/main`
- 完成一个子阶段后,在会话资源允许时自动继续下一子阶段,不询问“是否继续”。 - 完成一个子阶段后,在会话资源允许时自动继续下一子阶段,不询问“是否继续”。
- 纯 Markdown 变更不计业务进度;V5.4 文档提交后的下一次普通开发必须产生工程增量。 - 纯 Markdown 变更不计业务进度;V5.6 文档提交后的下一次普通开发必须产生工程增量。
- 当前游标、最近工程提交和下一工程目标以 `docs/module-status.md``docs/current-baseline.md` 为准,不在 README 中猜测。 - 当前游标、最近工程提交和下一工程目标以 `docs/module-status.md``docs/current-baseline.md` 为准,不在 README 中猜测。
## 当前进度 ## 当前进度
项目已开发部分模块。具体完成度不得从 README 猜测,必须以现有代码、测试、数据库迁移、Git 历史以及 `docs/current-baseline.md``docs/module-status.md``docs/feature-status.md` 为准。 项目已开发部分模块。具体完成度不得从 README 猜测,必须以现有代码、测试、数据库迁移、Git 历史以及 `docs/current-baseline.md``docs/module-status.md``docs/feature-status.md` 为准。
- 当前执行游标:`M09-A`DOING);`M08-D` 可独立工程内容已完成,真实团购商家授权、微信和硬件现场验收保持 `BLOCKED_EXTERNAL` - 当前执行游标:`M06-C-R1`DOING);`M09-A-RECOVERY` 已完成,真实团购商家授权、微信和硬件现场验收保持 `BLOCKED_EXTERNAL`
- 最近工程提交:`0511008` / `M08-D后台登录与可撤销会话`,Vue 后台已使用正式密码登录、轮换刷新令牌、当前会话、401 自动续期/清理和服务端权限菜单 - 最近工程提交:`9b2f055` / `M09-A保洁任务事务与并发收口`,真实 MySQL 8.4.10 已验证并发 claim 单赢家、事件失败回滚、重指派清理、`SKIP LOCKED` 批量回收和订单唯一建任务
- 下一工程目标:进入 M09-A,复核并补齐保洁任务状态机、订单结束自动建任务、事务抢单、管理员指派和超时回收 - 下一工程目标:按 V5.6 固定队列执行 M06-C-R1,依据智慧插座协议原件修正 wire schema、fixture、标准化字段和消息落库
## 版本递进 ## 版本递进
@@ -130,11 +130,12 @@ WSL 已验证:EMQX `5.8.9`、MQTTX CLI `1.13.0`、EMQX 服务 `active (running
- **V5.2**:增加工程编码优先、反文档循环、增量审计和工程完成证据。 - **V5.2**:增加工程编码优先、反文档循环、增量审计和工程完成证据。
- **V5.3**:增加固定模块队列、执行游标、会话内自动推进、可中断恢复和跨模块回归检查点。 - **V5.3**:增加固定模块队列、执行游标、会话内自动推进、可中断恢复和跨模块回归检查点。
- **V5.4**:固化 WSL/生产 MySQL 账号密码、配置位置、真实登录检测和特殊字符处理规则。 - **V5.4**:固化 WSL/生产 MySQL 账号密码、配置位置、真实登录检测和特殊字符处理规则。
- **V5.6**:接管最新源码与在制 M09-A,固化协议返工、后台架构返工、M09/M10 收口队列和 `CODE_COMPLETE` 门禁。
## Codex 入口 ## Codex 入口
```text ```text
请阅读 V5.4.md,按当前进度继续开发。 请阅读 V5.6.md,按当前进度继续开发。
``` ```
+6738
View File
File diff suppressed because it is too large Load Diff
+5 -4
View File
@@ -1,8 +1,8 @@
# 配置总表 # 配置总表
> 当前总纲:V5.4.md > 当前总纲:V5.6.md
> 最后更新:2026-06-22 > 最后更新:2026-08-10
> 维护规则:任何配置路径、账号、密码、域名、端口或加载顺序变化,必须与 `README.md`、`V5.4.md` 和实际配置在同一提交中更新。 > 维护规则:任何配置路径、账号、密码、域名、端口或加载顺序变化,必须与 `README.md`、`V5.6.md` 和实际配置在同一提交中更新。
## 当前已知凭据 ## 当前已知凭据
@@ -102,7 +102,7 @@ MYSQL_DATABASE=<以项目实际数据库名为准>
## 文件位置 ## 文件位置
完整位置表见根目录 `README.md` 的“配置文件位置”章节,以及 `V5.4.md` 的“0.6 README、配置文件与明文凭据同步规则”。 完整位置表见根目录 `README.md` 的“配置文件位置”章节,以及 `V5.6.md` 继承的“0.6 README、配置文件与明文凭据同步规则”。
## 变更记录 ## 变更记录
@@ -112,3 +112,4 @@ MYSQL_DATABASE=<以项目实际数据库名为准>
- 2026-06-22M05-B 增加 `QIPAI_WECHAT_PAY_CREDENTIALS` 凭据映射、微信支付/退款回调地址和私钥证书隔离规则。 - 2026-06-22M05-B 增加 `QIPAI_WECHAT_PAY_CREDENTIALS` 凭据映射、微信支付/退款回调地址和私钥证书隔离规则。
- 2026-06-22M05-C 增加 `QIPAI_THIRD_PARTY_CREDENTIALS`、人工/Mock/API 模式、回调 HMAC 和券码哈希规则。 - 2026-06-22M05-C 增加 `QIPAI_THIRD_PARTY_CREDENTIALS`、人工/Mock/API 模式、回调 HMAC 和券码哈希规则。
- 2026-06-22M05-D 增加门店收款账户、`profitShareReceivers` 环境映射、分账授权状态和非生产 Mock 门禁。 - 2026-06-22M05-D 增加门店收款账户、`profitShareReceivers` 环境映射、分账授权状态和非生产 Mock 门禁。
- 2026-08-10:总纲升级为 V5.6;同步最新源码接管、M09-A-RECOVERY 完成证据和 M06-C-R1 固定执行游标,既有凭据与配置位置不变。
+9 -9
View File
@@ -1,20 +1,20 @@
# 当前开发成果基线 # 当前开发成果基线
> V5.0 首次核验日期:2026-06-16 > V5.0 首次核验日期:2026-06-16
> audited_commit: `0511008` > audited_commit: `9b2f055`
> next_engineering_target: 进入 M09-A,复核并补齐保洁任务状态机、自动建任务、事务抢单、指派和超时回收 > next_engineering_target: 按 V5.6 固定队列进入 M06-C-R1,依据智慧插座协议原件返工 wire schema、fixture 与消息落库
> 事实源:当前工作区、Git 历史、状态文档、Windows/WSL 检查脚本。 > 事实源:当前工作区、Git 历史、状态文档、Windows/WSL 检查脚本。
## 总体结论 ## 总体结论
| 范围 | 当前状态 | 证据 | 结论 | | 范围 | 当前状态 | 证据 | 结论 |
|---|---|---|---| |---|---|---|---|
| 总纲版本 | V5.4 已成为当前权威总纲,旧版已保留为历史备份 | 根目录存在 `V5.4.md` 及旧版总纲 | 可继续按 V5.4 的执行游标开发 | | 总纲版本 | V5.6 已成为当前权威总纲,V5.4 及更早版本仅作历史备份 | 根目录 `V5.6.md` 的第 29 章固定队列 | 必须按 V5.6 游标开发,不得回退到历史队列 |
| Git 远端 | `origin=ssh://git@git.txyundm.cn:2222/panda/qipai.git`,分支 `main` | `git rev-list main...origin/main``0 0` | 本地与远端同步 | | Git 远端 | `origin=ssh://git@git.txyundm.cn:2222/panda/qipai.git`,分支 `main` | `git rev-list main...origin/main``0 0` | 本地与远端同步 |
| 正式后端 | 已完成 Fastify、迁移兼容、outbox/worker、多应用租户、微信与后台密码身份/可撤销会话、六角色 RBAC、门店范围,以及 M03-M08 业务 API | `backend/src/**``database/migrations/**``backend/tests/**` | M01-M04、M07 已完成;M05/M06/M08 可独立工程内容完成但外部联调保持 PARTIAL;当前进入 M09-A | | 正式后端 | 已完成 Fastify、迁移兼容、outbox/worker、多应用租户、微信与后台密码身份/可撤销会话、六角色 RBAC、门店范围,以及 M03-M08 业务 API;M09-A 已完成保洁任务事务与并发收口 | `backend/src/**``database/migrations/**``backend/tests/**`、工程提交 `9b2f055` | M01-M04、M07 已完成;M05/M06/M08 可独立工程内容完成但外部联调保持 PARTIAL;M09-A-RECOVERY 已完成,当前进入 M06-C-R1 协议返工 |
| 后台管理端 | 已建立 Vue3 + Vite + TypeScript + Element Plus 工程,完成正式租户账号登录、短期访问令牌、轮换刷新令牌、当前会话、注销、401 自动续期/清理和服务端权限菜单,并覆盖 M08-D 计划内运营工作区;应用页按平台/租户权限分层,敏感审计 metadata 递归脱敏且不读写 AppSecret | `admin/src/App.vue``admin/src/components/AdminLoginPanel.vue``admin/src/api.ts``backend/src/routes/admin-auth.ts``backend/src/auth/admin-auth-repository.ts``scripts/check-admin-m08-d.mjs` | M08-D 可独立工程内容完成;真实外部联调仍使 M08 保持 PARTIAL,游标进入 M09-A | | 后台管理端 | 已建立 Vue3 + Vite + TypeScript + Element Plus 工程,完成正式租户账号登录、短期访问令牌、轮换刷新令牌、当前会话、注销、401 自动续期/清理和服务端权限菜单,并覆盖 M08-D 计划内运营工作区;应用页按平台/租户权限分层,敏感审计 metadata 递归脱敏且不读写 AppSecret | `admin/src/App.vue``admin/src/components/AdminLoginPanel.vue``admin/src/api.ts``backend/src/routes/admin-auth.ts``backend/src/auth/admin-auth-repository.ts``scripts/check-admin-m08-d.mjs` | M08-D 可独立工程内容完成;真实外部联调仍使 M08 保持 PARTIAL,游标进入 M09-A |
| 微信小程序 | 已纳管微信原生模板,并完成顾客端订单、充值、权益明细、下单抵扣主体链路、保洁任务端照片上传/补做主体链路,以及管理员门店/房态/订单/代下单/验券/会员/员工/保洁/设备/经营统计 | `miniapp/pages/index``miniapp/pages/store/detail``miniapp/pages/room/detail``miniapp/pages/orders/*``miniapp/pages/recharge/*``miniapp/pages/profile/*``miniapp/pages/cleaner/*``miniapp/pages/manager/*``miniapp/utils/api.js``scripts/check-miniapp-m08-a.mjs``scripts/check-miniapp-m08-c.mjs` | M08-A/B/C/D 可独立工程内容完成,执行游标进入 M09-A;真实团购、微信和硬件现场验收保持外部阻塞,M08 维持 PARTIAL | | 微信小程序 | 已纳管微信原生模板,并完成顾客端订单、充值、权益明细、下单抵扣主体链路、保洁任务端照片上传/补做主体链路,以及管理员门店/房态/订单/代下单/验券/会员/员工/保洁/设备/经营统计 | `miniapp/pages/index``miniapp/pages/store/detail``miniapp/pages/room/detail``miniapp/pages/orders/*``miniapp/pages/recharge/*``miniapp/pages/profile/*``miniapp/pages/cleaner/*``miniapp/pages/manager/*``miniapp/utils/api.js``scripts/check-miniapp-m08-a.mjs``scripts/check-miniapp-m08-c.mjs` | M08-A/B/C/D 可独立工程内容完成,执行游标进入 M09-A;真实团购、微信和硬件现场验收保持外部阻塞,M08 维持 PARTIAL |
| 数据库迁移 | 已形成 M01-B 至 M08-D 连续 up/down/verify 计划、最小脱敏 seed、旧库 fixture、执行 CLI、验证结果门禁和 MySQL 8 集成测试;最新迁移新增后台凭据及刷新令牌哈希 | `database/migrations/**``database/seeds/2026061601_m01b_minimal_seed.sql``backend/src/db/migration-runner.ts``backend/tests/mysql-migration-roundtrip.test.mjs` | WSL MySQL 8.4.10 已完成 144 up、124 verify、140 down 往返并实测 scrypt 登录、刷新轮换与无明文密码 | | 数据库迁移 | 已形成 M01-B 至 M08-D 连续 up/down/verify 计划、最小脱敏 seed、旧库 fixture、执行 CLI、验证结果门禁和 MySQL 8 集成测试;M09-A 将真实保洁并发与事务场景纳入同一往返测试 | `database/migrations/**``database/seeds/2026061601_m01b_minimal_seed.sql``backend/src/db/migration-runner.ts``backend/tests/mysql-migration-roundtrip.test.mjs` | WSL MySQL 8.4.10 已完成 144 up、124 verify、140 down 往返并实测并发 claim 单赢家、事件失败回滚、三种重指派、`SKIP LOCKED` 批量回收、已结算成员保护和订单 FINISHED 唯一建任务 |
| M00 部署脚本 | 已有菜单、状态、HTTPS、Certbot、EMQX、备份检查模板 | `setup.sh``scripts/setup/``deploy/` | PARTIAL,生产未执行 | | M00 部署脚本 | 已有菜单、状态、HTTPS、Certbot、EMQX、备份检查模板 | `setup.sh``scripts/setup/``deploy/` | PARTIAL,生产未执行 |
| 发布清单 dry-run | 可基于当前 HEAD 输出 `deployed=false` 的 release manifest,记录后端/后台/迁移尚未生成而跳过 | `scripts/setup/deploy-business.sh --dry-run .``scripts/dev/windows/check-release-manifest.ps1` | 可在 M00 验证结构;真实构建与生产发布待 M01/M09 后接入 | | 发布清单 dry-run | 可基于当前 HEAD 输出 `deployed=false` 的 release manifest,记录后端/后台/迁移尚未生成而跳过 | `scripts/setup/deploy-business.sh --dry-run .``scripts/dev/windows/check-release-manifest.ps1` | 可在 M00 验证结构;真实构建与生产发布待 M01/M09 后接入 |
| 参考资料 | 已有清单、脱敏日志、页面/接口/表结构摘要 | `docs/reference-*``docs/db-schema-inventory.md` | PARTIAL,仍需按模块迁移正式实现 | | 参考资料 | 已有清单、脱敏日志、页面/接口/表结构摘要 | `docs/reference-*``docs/db-schema-inventory.md` | PARTIAL,仍需按模块迁移正式实现 |
@@ -24,7 +24,7 @@
## 状态校准 ## 状态校准
- `docs/module-status.md` 中 M00 仍为 `PARTIAL` 是正确的:生产 Ubuntu 初始化、部署与运维验收尚未执行;后端、后台和小程序源码已在后续模块建立。 - `docs/module-status.md` 中 M00 仍为 `PARTIAL` 是正确的:生产 Ubuntu 初始化、部署与运维验收尚未执行;后端、后台和小程序源码已在后续模块建立。
- M01-M04 与 M07 已具备模块工程验收;M05、M06、M08 因真实厂商/硬件/生产条件保持 `PARTIAL`M09-A 正在开发M10 尚未进入。 - M01-M04 与 M07 已具备模块工程验收;M05、M06、M08 因真实厂商/硬件/生产条件保持 `PARTIAL`M09-A-RECOVERY 已完成,当前按 V5.6 返回 M06-C-R1 内部协议返工M10 尚未进入。
- 任何“目录存在”只能证明骨架存在,不能证明模块完成。 - 任何“目录存在”只能证明骨架存在,不能证明模块完成。
## Git 历史敏感信息核验 ## Git 历史敏感信息核验
@@ -35,6 +35,6 @@
## 下一步 ## 下一步
1. 进入 M09-A:对照 V5.4 复核并补齐订单结束自动建保洁任务、完整状态机、事务抢单、管理员指派和超时回收 1. 进入 M06-C-R1:依据智慧插座协议原件修正 `workInfo`、本地任务、保护参数、特殊事件和遗嘱 payload 的 wire schema、fixture 与标准化落库
2. 复用 M08-B 已有保洁任务、协作与后台工作台,不重复建立状态模型;先以代码、迁移和真实 MySQL 测试确认缺口 2. 随后执行 M06-E-R1 控制箱/门锁结果码与字段返工,再进入 M06-R-REGRESSION;四个 `check-*.mjs` 的中文/空格路径修复归入该回归阶段
3. M06-G 真实硬件联调仍等待生产 MQTT 账号/ACL、DeviceID 和现场实物配线。 3. M06-G 真实硬件联调仍等待生产 MQTT 账号/ACL、DeviceID 和现场实物配线;该外部阻塞不阻断内部 R1 队列
@@ -74,3 +74,10 @@
- 新增 `payout_package_info`,保存微信待用户确认等场景返回的 package 信息。 - 新增 `payout_package_info`,保存微信待用户确认等场景返回的 package 信息。
- 新增 `idx_qipai_cleaning_settlement_transfer_state`,支持按租户、转账状态和更新时间筛选待跟进结算单。 - 新增 `idx_qipai_cleaning_settlement_transfer_state`,支持按租户、转账状态和更新时间筛选待跟进结算单。
- 既有 `payout_channel``payout_reference``payout_error` 继续保存发放渠道、外部流水和最近失败原因;`PAID` 时同步将 `payout_state` 标记为 `SUCCESS` - 既有 `payout_channel``payout_reference``payout_error` 继续保存发放渠道、外部流水和最近失败原因;`PAID` 时同步将 `payout_state` 标记为 `SUCCESS`
## 2026-08-10 M09-A-RECOVERY 事务行为收口
- 本阶段没有新增或修改表结构,继续使用保洁任务、事件、成员和订单唯一键。
- 保洁状态更新、负责人/成员同步和事件插入改为同一 InnoDB 事务;事件唯一键冲突会触发整体回滚,不再留下“状态已变、事件缺失”的半完成记录。
- claim 通过 `FOR UPDATE` 保证同一任务单赢家;超时回收通过 `FOR UPDATE SKIP LOCKED` 跳过其它事务持有的任务行,并只更新本批实际返回的 ID。
- WSL MySQL 8.4.10 可丢弃库完成 144 up、124 verify、140 down 的 `up → verify → down → up → verify`;实测重指派清理、事件失败回滚、已结算成员保护和订单 FINISHED 唯一建任务。
@@ -644,6 +644,18 @@ M08-B 可独立工程内容已完成,并新增可追溯的多次现场执行
- 最近工程提交:`90e230c` / `M08-B现场执行记录追溯` - 最近工程提交:`90e230c` / `M08-B现场执行记录追溯`
- 上次远端校验:`90e230c153fce98c4c32fcae9f130074a89cc200` - 上次远端校验:`90e230c153fce98c4c32fcae9f130074a89cc200`
## 2026-08-10 M09-A-RECOVERY 事务与并发收口
- `ENGINEERING_DELTA=YES`,工程提交 `9b2f055` 已推送并验证 `HEAD == origin/main`
- `claim``assign``submit``reject``complete` 与通用状态迁移统一使用数据库事务;状态、负责人、未结算成员和事件同提交或同回滚。完成验收时的负责人补全也已移入同一事务。
- claim 使用 `SELECT ... FOR UPDATE` 串行化同一任务的竞争;两个真实并发连接只有一个成功,失败方返回 `CLEANING_TASK_NOT_CLAIMABLE`
- 重指派覆盖 WAITING、CLAIMED、REJECTED 三种入口,进入 CLAIMED 时重建负责人关系并清空旧照片、驳回原因以及 started/submitted/completed/settled/cancelled 等过期字段。
- 超时回收使用 `LIMIT <夹取整数> FOR UPDATE SKIP LOCKED`;真实 MySQL 测试以独立事务占用最老任务行,证明回收器会跳过已锁行、只返回实际批次 ID,并清理未结算成员而不修改已结算任务/成员。
- 事件写入不再静默忽略冲突;测试预置相同 trace 事件制造插入失败,确认任务状态、负责人和成员整体回滚。相同 complete trace 重试不会增加事件,也不会把 COMPLETED 退回。
- 订单 FINISHED 场景在同一事务内重复调用自动建任务,仍只有一个 WAITING 任务和一个 AUTO_CREATE 事件。
- 验证:`npm test``backend/`)退出码 0;WSL 原生临时副本、MySQL 8.4.10 完成 `up → verify → down → up → verify`144 条 up、124 条 verify、140 条 down,临时数据库和账号由脚本自动清理。
- 阶段结论:`UNIT_CONTRACT_TEST=PASS``MYSQL_8_4_CONCURRENCY=PASS``MIGRATION_ROUNDTRIP=PASS``GIT_PUSH_VERIFIED=PASS``M09-A-RECOVERY=DONE`,下一游标为 `M06-C-R1`
+2
View File
@@ -38,6 +38,8 @@
> 2026-08-10 M08-D 增量:工程提交 `0511008` 为 `AUTH-001`、`AUTH-002`、`BKG-002` 建立正式后台密码登录和可撤销会话入口;密码使用 scrypt,连续失败锁定,刷新令牌仅存 SHA-256 并单次轮换,凭据重置撤销旧会话。Vue 后台替换手工粘贴令牌,401 单飞续期失败后清理本地会话,菜单从服务端权限生成。Windows 全量主体、敏感信息/完整性门禁与 WSL MySQL 8.4.10 的 144 up、124 verify、140 down 往返通过;M08-D 可独立工程内容完成,游标进入 M09-A。 > 2026-08-10 M08-D 增量:工程提交 `0511008` 为 `AUTH-001`、`AUTH-002`、`BKG-002` 建立正式后台密码登录和可撤销会话入口;密码使用 scrypt,连续失败锁定,刷新令牌仅存 SHA-256 并单次轮换,凭据重置撤销旧会话。Vue 后台替换手工粘贴令牌,401 单飞续期失败后清理本地会话,菜单从服务端权限生成。Windows 全量主体、敏感信息/完整性门禁与 WSL MySQL 8.4.10 的 144 up、124 verify、140 down 往返通过;M08-D 可独立工程内容完成,游标进入 M09-A。
> 2026-08-10 M09-A-RECOVERY:工程提交 `9b2f055` 为 `CLN-002`、`CLN-005` 完成保洁任务事务与并发收口。claim/assign/submit/reject/complete 将状态、负责人/成员与事件纳入同一事务,事件冲突会整体回滚;重指派覆盖 WAITING/CLAIMED/REJECTED 并清理旧照片、驳回原因和过期时间字段;超时回收使用 MySQL `FOR UPDATE SKIP LOCKED`、只处理本批并保护已结算成员。Windows 后端全量测试和 WSL MySQL 8.4.10 的 144 up、124 verify、140 down 往返通过,实测并发 claim 单赢家、相同 trace 不重复事件、订单 FINISHED 唯一建任务。M09-A-RECOVERY 完成,按 V5.6 固定队列进入 M06-C-R1CLN-002/CLN-005 因后续 M09 收口与外部现场验收仍保持 `PARTIAL`。
| ID | 功能 | 模块子阶段 | 状态 | 最近提交 | 测试/验收证据 | 阻塞原因 | 下一步 | | ID | 功能 | 模块子阶段 | 状态 | 最近提交 | 测试/验收证据 | 阻塞原因 | 下一步 |
|---|---|---|---|---|---|---|---| |---|---|---|---|---|---|---|---|
| ENV-001 | 固定 Windows 工作区 | M00-A/M00-B | DONE | 远端 HEAD | 已确认 `D:\qipai`Git 根、main 分支、固定 origin 和 push 校验通过。 | - | 后续每模块继续复检。 | | ENV-001 | 固定 Windows 工作区 | M00-A/M00-B | DONE | 远端 HEAD | 已确认 `D:\qipai`Git 根、main 分支、固定 origin 和 push 校验通过。 | - | 后续每模块继续复检。 |
+8 -8
View File
@@ -2,16 +2,16 @@
```yaml ```yaml
execution_cursor: execution_cursor:
current_module: M09 current_module: M06
current_stage: M09-A current_stage: M06-C-R1
stage_status: DOING stage_status: DOING
last_completed_stage: M08-D last_completed_stage: M09-A-RECOVERY
next_stage: M09-A next_stage: M06-E-R1
last_engineering_commit: `0511008` last_engineering_commit: `9b2f055`
last_push_verified: true last_push_verified: true
base_branch: main base_branch: main
blocked_reason: "M08-A 真机合法域名、真实微信支付和实物开门验证缺微信后台/商户/硬件现场条件;M08-B 可独立工程内容已完成,真实商户凭据、微信后台配置、生产小额转账和实物硬件结果保持 BLOCKED_EXTERNALM08-C 可独立工程内容已完成,真实美团/抖音/快手商家授权与真机验券保持 BLOCKED_EXTERNAL,已按规则旁路进入 M08-D。M06-G 真实硬件联调仍缺生产 MQTT 账号/ACL、DeviceID、控制箱、门锁、插座和现场配线。" blocked_reason: "M08-A 真机合法域名、真实微信支付和实物开门验证缺微信后台/商户/硬件现场条件;M08-B 可独立工程内容已完成,真实商户凭据、微信后台配置、生产小额转账和实物硬件结果保持 BLOCKED_EXTERNALM08-C 可独立工程内容已完成,真实美团/抖音/快手商家授权与真机验券保持 BLOCKED_EXTERNAL,已按规则旁路进入 M08-D。M06-G 真实硬件联调仍缺生产 MQTT 账号/ACL、DeviceID、控制箱、门锁、插座和现场配线。"
updated_at: 2026-08-10T13:55:05+08:00 updated_at: 2026-08-10T14:48:36+08:00
``` ```
| 模块 | 状态 | 最近提交 | 最近开发日志 | 备注 | | 模块 | 状态 | 最近提交 | 最近开发日志 | 备注 |
@@ -22,9 +22,9 @@ execution_cursor:
| M03 门店、房间、价格、营业时间 | DONE | `d563078` | docs/devlogs/2026-06-18-M03-D-场景码NFC与WiFi.md | M03-A/B/C/D 已完成门店房间、装修广告、媒体、地图选店、场景码/NFC 页面导航和受控 Wi-Fi;真实微信小程序码图片生成留待 M08 真机联调。 | | M03 门店、房间、价格、营业时间 | DONE | `d563078` | docs/devlogs/2026-06-18-M03-D-场景码NFC与WiFi.md | M03-A/B/C/D 已完成门店房间、装修广告、媒体、地图选店、场景码/NFC 页面导航和受控 Wi-Fi;真实微信小程序码图片生成留待 M08 真机联调。 |
| M04 订单、时段锁定、支付闭环 | DONE | `91801fe` | docs/devlogs/2026-06-20-M04-D-订单分享.md | M04-A/B/C/D 已完成可信定价、并发预占、订单状态机、续费取消换房、管理员调整、代下单和最小权限分享;Windows 全量回归与 WSL MySQL 8.4.9 模块回归通过。 | | M04 订单、时段锁定、支付闭环 | DONE | `91801fe` | docs/devlogs/2026-06-20-M04-D-订单分享.md | M04-A/B/C/D 已完成可信定价、并发预占、订单状态机、续费取消换房、管理员调整、代下单和最小权限分享;Windows 全量回归与 WSL MySQL 8.4.9 模块回归通过。 |
| M05 会员、余额、套餐、优惠券 | PARTIAL | `1680d73` | docs/devlogs/2026-06-22-M05-D-分账与收款配置.md | M05-A/B/C/D 工程闭环已完成:统一支付、微信支付退款、团购直订、门店收款账户、分账接收方、比例策略、授权门禁、幂等分账和对账查询均通过 Windows 与 WSL MySQL 回归;真实微信/团购/分账权限未提供,模块保持 PARTIAL/BLOCKED_EXTERNAL。 | | M05 会员、余额、套餐、优惠券 | PARTIAL | `1680d73` | docs/devlogs/2026-06-22-M05-D-分账与收款配置.md | M05-A/B/C/D 工程闭环已完成:统一支付、微信支付退款、团购直订、门店收款账户、分账接收方、比例策略、授权门禁、幂等分账和对账查询均通过 Windows 与 WSL MySQL 回归;真实微信/团购/分账权限未提供,模块保持 PARTIAL/BLOCKED_EXTERNAL。 |
| M06 设备、MQTT 与真实硬件联动 | PARTIAL | `d01f771` | docs/devlogs/2026-06-24-M06-G-真实硬件联调.md | M06-A 至 F 已完成 MQTT、拓扑、协议幂等、控制箱、Sub-1G 门锁、智慧插座和订单自动联动任务;M06-G 已补真实硬件烟测运行器,缺生产 MQTT 账号/ACL、DeviceID 和实物配线,保持 BLOCKED_EXTERNAL。 | | M06 设备、MQTT 与真实硬件联动 | PARTIAL | `d01f771` | docs/devlogs/2026-06-24-M06-G-真实硬件联调.md | M06-A 至 F 原工程存在,但 V5.6 审计确认协议 fixture/映射与两份厂商原件不一致;当前进入 M06-C-R1/M06-E-R1 内部返工。M06-G 仍缺生产 MQTT 账号/ACL、DeviceID 和实物配线,保持 BLOCKED_EXTERNAL。 |
| M07 会员、余额、充值、优惠券和套餐营销 | DONE | `ed0d455` | docs/devlogs/2026-06-24-M07-D-会员管理.md | M07-A 已完成现金/赠送双余额账本;M07-B 已完成充值优惠;M07-C 已完成优惠券/套餐权益底表和冻结、确认、退回的可靠补偿核销服务;M07-D 已完成会员画像、订单、消费、余额、充值、优惠券和套餐聚合查询。 | | M07 会员、余额、充值、优惠券和套餐营销 | DONE | `ed0d455` | docs/devlogs/2026-06-24-M07-D-会员管理.md | M07-A 已完成现金/赠送双余额账本;M07-B 已完成充值优惠;M07-C 已完成优惠券/套餐权益底表和冻结、确认、退回的可靠补偿核销服务;M07-D 已完成会员画像、订单、消费、余额、充值、优惠券和套餐聚合查询。 |
| M08 微信原生小程序完整业务 | PARTIAL | `0511008` | docs/devlogs/2026-08-10-M08-D-Vue平台后台.md | M08-A/B/C/D 可独立工程内容已完成;Vue 后台已覆盖正式密码登录、短期访问令牌、轮换刷新令牌、401 清理、服务端权限菜单及计划内运营工作区。真实微信、团购和硬件现场验收按 BLOCKED_EXTERNAL 保持 PARTIAL,执行游标已旁路进入 M09-A。 | | M08 微信原生小程序完整业务 | PARTIAL | `0511008` | docs/devlogs/2026-08-10-M08-D-Vue平台后台.md | M08-A/B/C/D 可独立工程内容已完成;Vue 后台已覆盖正式密码登录、短期访问令牌、轮换刷新令牌、401 清理、服务端权限菜单及计划内运营工作区。真实微信、团购和硬件现场验收按 BLOCKED_EXTERNAL 保持 PARTIAL,执行游标已旁路进入 M09-A。 |
| M09 保洁任务、结算、商品和库存 | DOING | `0511008` | - | 游标已进入 M09-A;先对照 V5.4 复核既有保洁任务状态机、订单结束自动建任务、抢单事务锁、指派和超时回收,再补齐缺口。 | | M09 保洁任务、结算、商品和库存 | DOING | `9b2f055` | docs/devlogs/2026-06-25-M08-B-保洁端.md | M09-A-RECOVERY 已完成:状态、负责人/成员和事件同事务;真实 MySQL 8.4.10 已验证 claim 单赢家、失败回滚、重指派清理、`SKIP LOCKED` 回收和订单唯一建任务。按 V5.6 固定队列暂返 M06-R1,完成后再进入 M08-D-R1/M09-B。 |
| M10 部署、域名、验收和运维闭环 | TODO | - | - | - | | M10 部署、域名、验收和运维闭环 | TODO | - | - | - |
+5 -5
View File
@@ -3,7 +3,7 @@ $ErrorActionPreference = "Stop"
$readmePath = "README.md" $readmePath = "README.md"
$configPath = "docs/configuration.md" $configPath = "docs/configuration.md"
$baselinePath = "docs/current-baseline.md" $baselinePath = "docs/current-baseline.md"
$expectedSpec = "V5.4.md" $expectedSpec = "V5.6.md"
$expectedOrigin = "ssh://git@git.txyundm.cn:2222/panda/qipai.git" $expectedOrigin = "ssh://git@git.txyundm.cn:2222/panda/qipai.git"
foreach ($path in @($readmePath, $configPath, $baselinePath, $expectedSpec)) { foreach ($path in @($readmePath, $configPath, $baselinePath, $expectedSpec)) {
@@ -28,7 +28,7 @@ $nextEngineeringLabel = [regex]::Unescape("\u4e0b\u4e00\u5de5\u7a0b\u76ee\u6807"
$pendingWord = [regex]::Unescape("\u5f85") $pendingWord = [regex]::Unescape("\u5f85")
$requiredSharedValues = @( $requiredSharedValues = @(
"V5.4.md", $expectedSpec,
"D:\qipai", "D:\qipai",
"/mnt/d/qipai", "/mnt/d/qipai",
$expectedOrigin, $expectedOrigin,
@@ -48,11 +48,11 @@ foreach ($value in $requiredSharedValues) {
throw "README missing required value: $value" throw "README missing required value: $value"
} }
if (-not $spec.Contains($value)) { if (-not $spec.Contains($value)) {
throw "V5.4 missing required value: $value" throw "$expectedSpec missing required value: $value"
} }
} }
foreach ($value in @("V5.4.md", $expectedOrigin, "admin123", "root123", "101.42.38.246:1883")) { foreach ($value in @($expectedSpec, $expectedOrigin, "admin123", "root123", "101.42.38.246:1883")) {
if (-not $config.Contains($value)) { if (-not $config.Contains($value)) {
throw "configuration.md missing required value: $value" throw "configuration.md missing required value: $value"
} }
@@ -98,4 +98,4 @@ if ($baseline -notmatch '(?m)^>\s*next_engineering_target:\s*\S') {
throw "current-baseline.md must record next_engineering_target" throw "current-baseline.md must record next_engineering_target"
} }
Write-Host "PASS: README, V5.4 and configuration index are consistent." Write-Host "PASS: README, $expectedSpec and configuration index are consistent."