feat(M09-D3): 完成商品寄存与安全取出闭环
This commit is contained in:
@@ -0,0 +1,30 @@
|
||||
# 2026-08-11 M09-D3 商品寄存 API
|
||||
|
||||
## 顾客接口
|
||||
|
||||
- `POST /app-api/product-storages`
|
||||
- `GET /app-api/product-storages`
|
||||
- `GET /app-api/product-storages/:storageId`
|
||||
- `POST /app-api/product-storages/:storageId/retrieve`
|
||||
- `POST /app-api/product-storages/:storageId/credential/rotate`
|
||||
- `POST /app-api/product-storages/:storageId/cancel`
|
||||
|
||||
顾客创建时提交已完成商品订单、到期时间及可选订单项数量;列表、详情和动作只允许寄存本人访问。领取请求包含一次性凭证和逐项数量,部分领取成功后响应新的领取凭证。幂等重放返回当前视图,但不会再次返回任何已经签发的原始凭证。
|
||||
|
||||
## 管理接口
|
||||
|
||||
以下接口同时提供 `/admin-api` 与 `/app-api/management` 前缀:
|
||||
|
||||
- `POST /product-storages`
|
||||
- `GET /product-storages?storeId=...`
|
||||
- `GET /product-storages/:storageId`
|
||||
- `POST /product-storages/:storageId/retrieve`
|
||||
- `POST /product-storages/:storageId/credential/rotate`
|
||||
- `POST /product-storages/:storageId/cancel`
|
||||
- `POST /product-storages/expire-due`
|
||||
|
||||
读取要求 `goods.storage.read`,写入要求 `goods.storage.manage`;管理动作重复校验授权门店。手工创建必须绑定同租户有效顾客、有效门店上架 SKU 和未来到期时间。过期批处理显式限定当前租户与门店,内部 worker 另有全局 `SKIP LOCKED` 批处理入口。
|
||||
|
||||
## 返回与错误边界
|
||||
|
||||
详情包含寄存快照、当前剩余数量、状态事件和逐项取出流水,不包含凭证哈希。未找到或非本人资源返回 404 语义,权限/门店范围返回 403,状态、版本、同源或幂等冲突返回 409,凭证、数量、来源订单或到期时间不合法返回 400 语义错误码。
|
||||
@@ -1,10 +1,10 @@
|
||||
# 当前开发成果基线
|
||||
|
||||
> V5.0 首次核验日期:2026-06-16
|
||||
> audited_commit: `93af128`
|
||||
> audited_worktree: M09-D2 当前工作树(待本次中文工程提交)
|
||||
> audited_at: `2026-08-11T06:58:52+08:00`
|
||||
> next_engineering_target: 按 V5.7 固定队列执行 M09-D3,建立安全寄存、分次取出、并发防超领和通知 outbox
|
||||
> audited_commit: `1a3ea7b`
|
||||
> audited_worktree: M09-D3 当前工作树(待本次中文工程提交)
|
||||
> audited_at: `2026-08-11T09:30:00+08:00`
|
||||
> next_engineering_target: 按 V5.7 固定队列执行 M09-D4,接入商品、库存、订单与寄存取出的顾客和运营界面
|
||||
> 事实源:当前工作区、Git 历史、状态文档、Windows/WSL 检查脚本。
|
||||
|
||||
## 总体结论
|
||||
@@ -13,10 +13,10 @@
|
||||
|---|---|---|---|
|
||||
| 总纲版本 | V5.7 已成为当前权威总纲,V5.6 及更早版本仅作历史基线 | 根目录 `V5.7.md` 的增量控制层与第 30 章固定队列 | 必须按 V5.7 游标开发,不得回退到历史队列 |
|
||||
| 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;M09-A/B/C 已完成保洁收口,M09-D1/D2 已完成商品目录、库存、订单项快照、支付/退款衔接和库存占用生命周期 | `backend/src/products/**`、`backend/src/inventory/**`、`backend/src/routes/{products,inventory,product-orders}.ts`、`database/migrations/202608110{7,8}_m09d*`、`backend/tests/product-*.test.mjs`、`backend/tests/inventory-*.test.mjs`、`backend/tests/mysql-migration-roundtrip.test.mjs` | M09-D2 当前工作树的 build、全测、静态门禁和真实 MySQL 门禁通过,游标进入 M09-D3;提交 SHA 待本次中文工程提交取得 |
|
||||
| 正式后端 | 已完成 Fastify、迁移兼容、outbox/worker、多应用租户、身份/RBAC/门店范围及 M03-M08 业务 API;M09-A/B/C 已完成保洁收口,M09-D1/D2/D3 已完成商品目录、库存、订单支付和寄存取出安全生命周期 | `backend/src/products/**`、`backend/src/inventory/**`、`backend/src/routes/{products,inventory,product-orders,product-storages}.ts`、`database/migrations/202608110{7,8,9}_m09d*`、`backend/tests/product-*.test.mjs`、`backend/tests/inventory-*.test.mjs`、`backend/tests/mysql-migration-roundtrip.test.mjs` | M09-D3 当前工作树的 build、全测、静态门禁和真实 MySQL 门禁通过,游标进入 M09-D4;提交 SHA 待本次中文工程提交取得 |
|
||||
| 后台管理端 | 已建立 Vue3 + Vite + TypeScript + Element Plus 权限路由工程;12 个业务入口按路由懒加载;保洁工作台覆盖规则、任务、版本验收、同源结算导出、冲正历史、状态事件和人工付款;商品/库存/商品订单菜单能力由服务端 capability 控制 | `admin/src/router.ts`、`admin/src/components/CleaningWorkspace.vue`、`backend/src/routes/admin-auth.ts` | M09-D2 管理 API 与权限边界通过;商品、库存、订单和寄存专用运营页面统一归入 M09-D4 |
|
||||
| 微信小程序 | 已纳管微信原生模板,并完成顾客端订单、充值、权益明细、下单抵扣主体链路、保洁任务端照片上传/补做主体链路,以及管理员门店/房态/订单/代下单/验券/会员/员工/保洁/设备/经营统计 | `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 至 M09-D2 连续 up/down/verify 计划;M09-D2 新增 7 张商品订单、订单项/事件、支付、退款/回调表和不可变触发器;M09-D1 崩溃重试会先按依赖撤销 D2,迁移 runner 继续按 marker/checksum 增量执行并由数据库命名锁串行化 | `database/migrations/2026081108_m09d2_product_order_payment_inventory.{up,down,verify}.sql`、`backend/src/db/migration-runner.ts`、`backend/tests/mysql-migration-roundtrip.test.mjs` | WSL MySQL 8.4.10 已完成 201 up、150 verify、187 down 的 up/verify/down/up/verify;并发支付回调单次扣减、取消/超时释放、退款返库、不可变事件及跨阶段迁移重试通过 |
|
||||
| 数据库迁移 | 已形成 M01-B 至 M09-D3 连续 up/down/verify 计划;M09-D3 新增 4 张寄存记录、明细、事件与事件项流水表及 4 个不可变触发器;M09-D1 崩溃重试会先按依赖撤销 D3/D2,迁移 runner 继续按 marker/checksum 增量执行并由数据库命名锁串行化 | `database/migrations/2026081109_m09d3_product_storage.{up,down,verify}.sql`、`backend/src/db/migration-runner.ts`、`backend/tests/mysql-migration-roundtrip.test.mjs` | WSL MySQL 8.4.10 已完成 217 up、159 verify、199 down 的 up/verify/down/up/verify;一次性凭证、部分取出、并发全量取出单赢家、取消/过期、隔离和不可变流水通过 |
|
||||
| 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 后接入 |
|
||||
| 参考资料 | 已有清单、脱敏日志、页面/接口/表结构摘要 | `docs/reference-*`、`docs/db-schema-inventory.md` | PARTIAL,仍需按模块迁移正式实现 |
|
||||
@@ -26,7 +26,7 @@
|
||||
## 状态校准
|
||||
|
||||
- `docs/module-status.md` 中 M00 仍为 `PARTIAL` 是正确的:生产 Ubuntu 初始化、部署与运维验收尚未执行;后端、后台和小程序源码已在后续模块建立。
|
||||
- M01-M04 与 M07 已具备模块工程验收;M05、M06、M08 因真实厂商/硬件/生产条件保持 `PARTIAL`;M09-A/B/C/D1/D2、M06-C/E-R1、M06-R-REGRESSION 与 M08-D-R1 已完成,当前按 V5.7 执行 M09-D3,M10 尚未进入。
|
||||
- M01-M04 与 M07 已具备模块工程验收;M05、M06、M08 因真实厂商/硬件/生产条件保持 `PARTIAL`;M09-A/B/C/D1/D2/D3、M06-C/E-R1、M06-R-REGRESSION 与 M08-D-R1 已完成,当前按 V5.7 执行 M09-D4,M10 尚未进入。
|
||||
- 任何“目录存在”只能证明骨架存在,不能证明模块完成。
|
||||
|
||||
## Git 历史敏感信息核验
|
||||
@@ -37,6 +37,6 @@
|
||||
|
||||
## 下一步
|
||||
|
||||
1. 执行 M09-D3:建立寄存单、寄存明细和数量流水,支持 `STORED/PARTIALLY_RETRIEVED/RETRIEVED/EXPIRED/CANCELLED` 状态机。
|
||||
1. 执行 M09-D4:在顾客小程序和运营后台接入商品目录、商品订单、库存与寄存/取出工作台,复用服务端权限、状态机与幂等契约。
|
||||
2. 领取凭证只保存哈希,限制本人或授权门店员工领取;分次取出以事务行锁、稳定 requestId 和剩余数量条件阻止重复、超量与并发超领。
|
||||
3. 寄存、取出、取消和过期同事务写审计与通知 outbox;M06-G 真实硬件联调继续等待外部条件,不阻断内部主队列。
|
||||
|
||||
@@ -0,0 +1,12 @@
|
||||
# 2026-08-11 M09-D3 商品寄存与取出流水
|
||||
|
||||
- 版本:`2026081109_m09d3_product_storage`。
|
||||
- 新增 `qipai_product_storage_records`、`qipai_product_storage_items`、`qipai_product_storage_events`、`qipai_product_storage_event_items` 4 张表。
|
||||
- 寄存记录保存租户、门店、寄存人、可选来源商品订单、状态、总量/余量、到期时间、领取凭证 SHA-256、凭证版本、消费时间、创建来源和乐观版本;不保存原始领取凭证。
|
||||
- 寄存明细保存来源订单项、商品/SKU 代码和名称、规格、单位、总量及余量快照;订单来源用复合外键保持租户、门店、订单和订单项一致。
|
||||
- 寄存事件保存幂等请求指纹、状态转换、动作、数量、操作人、凭证版本和资源版本;事件项逐行保存 SKU、本次取出量与取出后余量。
|
||||
- 事件与事件项各有 UPDATE/DELETE 禁止触发器;客户端请求、订单来源、事件请求、事件版本和来源订单项使用唯一键防重。
|
||||
- 新增 `goods.storage.read`、`goods.storage.manage` 并授予活动 STAFF、STORE_ADMIN、TENANT_ADMIN、PLATFORM_ADMIN;新租户通过认证/RBAC 初始化路径取得相同权限。
|
||||
- down 先删除触发器和角色权限,再按事件项、事件、明细、主记录的依赖逆序删除表,最后删除商品订单项新增索引与 marker。
|
||||
- verify 校验 4 张表、30 个关键列、17 个索引、14 个外键、16 个 CHECK、4 个触发器、2 项权限、角色授权和 migration marker。
|
||||
- MySQL 8.4.10 已完成 217 up、159 verify、199 down 的完整往返;迁移中断恢复、并发取出、凭证轮换和不可变流水均通过。
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
## 工程结果
|
||||
|
||||
- 工程状态:当前工作树已完成,待以 `feat(M09-D2): 完成商品订单与库存占用生命周期` 中文标题提交并取得 SHA。
|
||||
- 工程状态:已由 `1a3ea7bdf0bc55f85a87ef3c251fc7bbeb7d1620` 以 `feat(M09-D2): 完成商品订单与库存占用生命周期` 中文标题提交并推送,且 `HEAD == origin/main` 校验通过。
|
||||
- 新增独立的商品订单、订单项快照、订单事件、支付、退款、支付回调和退款事件领域;商品订单不复用房间订单或支付单状态,订单项固化商品/SKU 名称、规格、单价、数量、小计和备注。
|
||||
- 顾客创建订单时由服务端读取有效门店上架、售价、销售开关和跨日营业时段并复算金额;`DELIVERY` 必须绑定本人当前有效房间订单,`SELF_SERVICE` 明确禁止伪造房间绑定。
|
||||
- 下单按稳定订单业务号批量锁定库存;支付成功回调在同一事务扣减并推进 `PAID`,取消和待支付超时释放,退款按履约状态选择 `RESTOCK` 或 `NO_RESTOCK`。重复请求、重复回调和指纹冲突分别重放或明确拒绝。
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
# 2026-08-11 M09-D3 商品寄存与安全取出
|
||||
|
||||
## 工程结果
|
||||
|
||||
- 工程状态:当前工作树已完成,待以 `feat(M09-D3): 完成商品寄存与安全取出闭环` 中文标题提交并取得 SHA。
|
||||
- 寄存来源限定为本人已完成商品订单或具备 `goods.storage.manage` 且拥有门店范围的员工手工创建;订单来源最多创建一张寄存单,手工来源必须绑定同租户有效顾客和当前门店有效上架 SKU。
|
||||
- 状态机覆盖 `STORED`、`PARTIALLY_RETRIEVED`、`RETRIEVED`、`EXPIRED`、`CANCELLED`。每次取出锁定寄存单与明细、校验剩余数量和版本,逐项扣减后写不可变事件项流水。
|
||||
- 领取凭证原文只在创建、主动轮换或部分取出后的响应中返回;数据库仅保存 SHA-256。部分取出自动产生下一版凭证,旧凭证立即失效;全量取出、取消和过期会消费凭证。
|
||||
- 顾客只能查询和操作本人的寄存;管理端同时校验租户、`goods.storage.read/manage` 和授权门店范围。创建重放不会再次返回原始凭证,动作重放不会泄露轮换后的凭证。
|
||||
- 寄存、取出、凭证轮换、取消和过期均在同一事务写审计与 `PRODUCT_STORAGE` outbox;死锁和锁等待超时进行最多 3 次完整事务重试。
|
||||
|
||||
## 数据库结果
|
||||
|
||||
`2026081109_m09d3_product_storage` 新增 4 张表:
|
||||
|
||||
1. `qipai_product_storage_records`
|
||||
2. `qipai_product_storage_items`
|
||||
3. `qipai_product_storage_events`
|
||||
4. `qipai_product_storage_event_items`
|
||||
|
||||
迁移同时为商品订单项补充租户/门店/订单/主键复合唯一键,以支持寄存明细来源复合外键。寄存来源订单、客户端请求、事件请求、事件版本和订单项来源均有唯一约束;4 个触发器拒绝修改或删除寄存事件和逐项数量流水。
|
||||
|
||||
## 验证证据
|
||||
|
||||
- `node scripts/check-m09-d3-product-storage.mjs`:PASS。
|
||||
- 后端 `npm run build` 与全量 `npm test`:PASS;新增服务测试覆盖凭证摘要、取出状态转换和输入边界,路由测试覆盖顾客归属、管理权限与门店范围。
|
||||
- WSL 原生临时副本 + MySQL 8.4.10:完成 `up → verify → down → up → verify`,217 条 up、159 条 verify、199 条 down;M09-D1 interrupted up/down 重试会按依赖先撤销 D3/D2并完整恢复。
|
||||
- 真实 MySQL 业务用例覆盖订单寄存、手工寄存、创建幂等与指纹冲突、同源重复拒绝、跨租户/跨寄存人拒绝、超量拒绝、部分取出与旧凭证失效、并发全量取出单赢家、员工领取、主动轮换、取消、过期、outbox、审计和不可变触发器。
|
||||
|
||||
## 阶段结论
|
||||
|
||||
`M09-D3=DONE`。唯一执行游标进入 `M09-D4`,下一阶段在顾客小程序和运营后台接入商品目录、订单、库存与寄存/取出工作台。
|
||||
@@ -50,7 +50,9 @@
|
||||
|
||||
> 2026-08-11 M09-D1:工程提交 `93af128` 为 `PRD-001`、`INV-001` 建立租户/门店隔离的商品目录和库存底座;9 张表覆盖分类、商品、SKU、门店上架、销售设置、跨日时段、库存、幂等请求和不可变流水。增量迁移可跳过历史 marker,interrupted up/down DDL 可原地重试,同库发布由数据库命名锁串行化;触发器生产前置、API/RBAC、并发库存、幂等冲突、负库存拒绝和流水 UPDATE/DELETE 拒绝已通过。WSL MySQL 8.4.10 完成 179 up、141 verify、171 down 往返及 cleanup probe,游标进入 M09-D2。
|
||||
|
||||
> 2026-08-11 M09-D2:当前工作树为 `GOODS-102` 建立商品订单与支付库存闭环;7 张表分离商品订单、快照项、状态事件、支付、退款、支付回调和退款事件。下单按服务端目录/价格快照锁库存,支付回调在死锁/锁等待时有限重试并仅扣一次,取消/超时释放锁定,退款按订单履约状态决定返库且重复回调幂等。房间配送校验本人有效房间订单,自助场景不绑定房间;顾客和管理员/员工 API 复用租户、门店范围与 `goods.order.read/manage`。WSL MySQL 8.4.10 完成 201 up、150 verify、187 down 往返,游标进入 M09-D3;结果随本次中文工程提交固化。
|
||||
> 2026-08-11 M09-D2:工程提交 `1a3ea7b` 为 `GOODS-102` 建立商品订单与支付库存闭环;7 张表分离商品订单、快照项、状态事件、支付、退款、支付回调和退款事件。下单按服务端目录/价格快照锁库存,支付回调在死锁/锁等待时有限重试并仅扣一次,取消/超时释放锁定,退款按订单履约状态决定返库且重复回调幂等。房间配送校验本人有效房间订单,自助场景不绑定房间;顾客和管理员/员工 API 复用租户、门店范围与 `goods.order.read/manage`。WSL MySQL 8.4.10 完成 201 up、150 verify、187 down 往返,游标进入 M09-D3。
|
||||
|
||||
> 2026-08-11 M09-D3:当前工作树为 `GOODS-104` 建立商品寄存与安全取出闭环;4 张表保存寄存记录、商品快照、不可变状态事件和逐项数量流水。已完成商品订单或受控员工可创建寄存,本人/授权员工可分次取出;领取凭证只保存 SHA-256、部分取出后单次轮换、终态消费,原文仅在创建/轮换响应出现。取消、过期和取出同事务写审计与 outbox。WSL MySQL 8.4.10 完成 217 up、159 verify、199 down 往返,并验证跨租户/跨寄存人拒绝、超量拒绝和并发全量取出单赢家,游标进入 M09-D4。
|
||||
|
||||
| ID | 功能 | 模块子阶段 | 状态 | 最近提交 | 测试/验收证据 | 阻塞原因 | 下一步 |
|
||||
|---|---|---|---|---|---|---|---|
|
||||
@@ -78,8 +80,9 @@
|
||||
| CLN-004 | 保洁结算 | M09-C | PARTIAL | `1f10715` | 同一任务成员份额由数据库生成唯一键保证最多一条有效结算明细,并发生成只有一个赢家;活动结算冻结成员奖励。取消保留原单/明细并生成负向冲正和状态事件,可重新生成;出款前 CAS、稳定请求号、商户隔离回调、成功重放、失败重试、人工已付、同源列表/导出和整数分均已闭环。协作任务按收款人分别付款,全部有效份额 PAID 后任务才进入 SETTLED。 | 真实微信商户凭据、生产小额转账和回调仍为 BLOCKED_EXTERNAL。 | 取得生产商户条件后执行小额转账、迟到回调和账单对账验收;内部工程不阻断 M09-D1。 |
|
||||
| CLN-005 | 保洁驳回/免清洁 | M08-B/M09 | PARTIAL | `eb838f5` | 已支持管理侧驳回、批量驳回和保洁员驳回补做;已新增 `POST /admin-api/cleaning/tasks/:taskId/exempt`,后台任务列表提供免清洁按钮、批量免清洁和 `EXEMPT` 筛选,仓储将可处理任务置为 `EXEMPT`、奖励归零并移除未结算协作者;待结算候选继续只取 `COMPLETED` 且未结算任务,免清洁任务不进入结算;管理统计 summary、门店明细、每日趋势和统计导出均新增免清洁数量,便于核对不结算口径。 | 真实商户现场执行仍待继续。 | 继续 M08-B/M09,补现场验收记录和更完整运营管理界面。 |
|
||||
| PRD-001 | 商品目录与门店售卖 | M09-D1 | DONE | `93af128` | 分类、商品、SKU、门店上架、履约方式、销售开关/人工暂停及最多 8 段每周营业时段已实现;代码/条码软删除后可复用,写操作用 expectedVersion CAS,跨日营业判断和租户/门店/角色越权拒绝有路由、仓储和真实 MySQL 证据。 | - | M09-D4 在顾客端和运营端复用同一目录,不重建第二套商品主数据。 |
|
||||
| INV-001 | 库存策略与不可变流水 | M09-D1/M09-D2 | DONE | `93af128` + M09-D2 当前工作树 | TRACKED/UNLIMITED 策略、入库、调整、盘点、损耗、批量锁定/释放/扣减已实现;M09-D2 已把订单创建、支付、取消、超时和退款接入稳定业务号与同事务库存变更。请求指纹、版本 CAS、数量边界和不可变流水保证并发回调只扣一次、重复释放/返库幂等且不出现负库存。 | - | M09-D3 的寄存数量独立记账,不回写已完成订单项快照。 |
|
||||
| GOODS-102 | 商品订单与支付库存闭环 | M09-D2 | DONE | M09-D2 当前工作树(待本次中文工程提交) | 商品订单与支付单分离;订单项固化商品、SKU、规格、单价、数量和金额快照,状态事件不可变。顾客可下单、查询、取消,授权 STAFF/管理员可接单、配送/待取、完成、取消/退款;房间配送验证本人有效房间订单,自助订单不绑定房间。支付成功扣减、取消/超时释放、退款按履约状态返库均有回调幂等、事务重试、审计和 MySQL 8.4 并发证据。 | - | M09-D3 仅允许从符合条件的已完成商品订单创建寄存来源,并写通知 outbox。 |
|
||||
| INV-001 | 库存策略与不可变流水 | M09-D1/M09-D2 | DONE | `93af128`、`1a3ea7b` | TRACKED/UNLIMITED 策略、入库、调整、盘点、损耗、批量锁定/释放/扣减已实现;M09-D2 已把订单创建、支付、取消、超时和退款接入稳定业务号与同事务库存变更。请求指纹、版本 CAS、数量边界和不可变流水保证并发回调只扣一次、重复释放/返库幂等且不出现负库存。 | - | M09-D3 寄存数量已使用独立账本,不回写已完成订单项快照。 |
|
||||
| GOODS-102 | 商品订单与支付库存闭环 | M09-D2 | DONE | `1a3ea7b` | 商品订单与支付单分离;订单项固化商品、SKU、规格、单价、数量和金额快照,状态事件不可变。顾客可下单、查询、取消,授权 STAFF/管理员可接单、配送/待取、完成、取消/退款;房间配送验证本人有效房间订单,自助订单不绑定房间。支付成功扣减、取消/超时释放、退款按履约状态返库均有回调幂等、事务重试、审计和 MySQL 8.4 并发证据。 | - | M09-D4 接入顾客和运营端商品订单界面。 |
|
||||
| GOODS-104 | 商品寄存与安全取出 | M09-D3 | DONE | M09-D3 当前工作树(待本次中文工程提交) | 支持已完成商品订单或授权员工手工创建寄存,状态覆盖 STORED、PARTIALLY_RETRIEVED、RETRIEVED、EXPIRED、CANCELLED;商品/SKU/数量/会员/门店/到期时间固化。领取凭证仅存 SHA-256,部分取出自动轮换且旧凭证失效;本人或授权员工可领取,逐项数量流水不可变。并发领取行锁、版本 CAS、幂等事件和事务重试保证不超领,所有状态动作写审计与 outbox。 | - | M09-D4 接入顾客寄存详情、凭证操作与运营领取工作台。 |
|
||||
| STAFF-001 | 员工账号 | M02-D/M08 | PARTIAL | `93f06d2` | 已实现创建员工、分配角色/门店、禁用、备注、重置会话和审计;管理员小程序已展示员工概况,Vue 后台可按角色/状态搜索并完成完整生命周期管理,权限变化即时撤销活动会话。 | 真实员工微信绑定和生产账号生命周期验收待补。 | M10 以真实员工账号验证绑定、门店切换、禁用和重新登录。 |
|
||||
| BKG-002 | 后台用户管理 | M02-D/M08 | PARTIAL | `0511008` | 已实现分页筛选、注册/登录时间、状态、角色、门店范围、手机号/IP 脱敏及会员/STAFF 分栏;租户管理员可为同租户有效 STAFF 设置唯一登录名和强密码,更新凭据会撤销其活动会话且不返回密码哈希。 | 尚缺平台级跨租户用户视图和真实生产数据验收。 | M10 以生产平台/租户账号复验跨租户用户视图、凭据重置和审计。 |
|
||||
| TEN-001 | 多门店支持 | M02/M03 | PARTIAL | `15139b3` | 门店 CRUD 与门店管理员数据范围已实现;跨门店写操作在 Windows 和 WSL MySQL 实测被拒绝。 | 地图选店、前端切换与完整订单数据范围待后续阶段。 | M03-C 接入地图选店,M04 起业务资源继承门店范围。 |
|
||||
|
||||
@@ -3,16 +3,16 @@
|
||||
```yaml
|
||||
execution_cursor:
|
||||
current_module: M09
|
||||
current_stage: M09-D3
|
||||
current_stage: M09-D4
|
||||
stage_status: TODO
|
||||
last_completed_stage: M09-D2
|
||||
next_stage: M09-D4
|
||||
last_engineering_commit: `93af128`
|
||||
pending_engineering_commit: "M09-D2 当前工作树(待本次中文工程提交)"
|
||||
last_completed_stage: M09-D3
|
||||
next_stage: M09-REGRESSION
|
||||
last_engineering_commit: `1a3ea7b`
|
||||
pending_engineering_commit: "M09-D3 当前工作树(待本次中文工程提交)"
|
||||
last_push_verified: true
|
||||
base_branch: main
|
||||
blocked_reason: "M08-A 真机合法域名、真实微信支付和实物开门验证缺微信后台/商户/硬件现场条件;M08-B 可独立工程内容已完成,真实商户凭据、微信后台配置、生产小额转账和实物硬件结果保持 BLOCKED_EXTERNAL;M08-C 可独立工程内容已完成,真实美团/抖音/快手商家授权与真机验券保持 BLOCKED_EXTERNAL,已按规则旁路进入 M08-D。M06-G 真实硬件联调仍缺生产 MQTT 账号/ACL、DeviceID、控制箱、门锁、插座和现场配线。"
|
||||
updated_at: 2026-08-11T06:58:52+08:00
|
||||
updated_at: 2026-08-11T09:30:00+08:00
|
||||
```
|
||||
|
||||
| 模块 | 状态 | 最近提交 | 最近开发日志 | 备注 |
|
||||
@@ -26,6 +26,6 @@ execution_cursor:
|
||||
| M06 设备、MQTT 与真实硬件联动 | PARTIAL | `da5751f` | docs/devlogs/2026-06-24-M06-E-智慧插座.md | M06-C/E-R1 已按原件校正控制箱、Sub-1G 与智慧插座 Wire/事件/脱敏;M06-R 已通过 Windows 后端全量、MQTT fixture、四项静态检查的中文/空格路径回归及 WSL MySQL 8.4.10 完整往返。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 已完成会员画像、订单、消费、余额、充值、优惠券和套餐聚合查询。 |
|
||||
| M08 微信原生小程序完整业务 | PARTIAL | `3faf868` | docs/devlogs/2026-08-10-M08-D-Vue平台后台.md | M08-A/B/C/D 功能切片与 M08-D-R1 架构返工已完成;12 个权限路由按领域懒加载,最大 JS 分块 217,195 B,三档响应式门禁通过。真实微信、团购和硬件现场验收按 BLOCKED_EXTERNAL 保持 PARTIAL。 |
|
||||
| M09 保洁任务、结算、商品和库存 | DOING | M09-D2 当前工作树(待本次中文工程提交) | docs/devlogs/2026-08-11-M09-D2-商品订单与库存生命周期.md | M09-A/B/C 已完成保洁收口;M09-D1 完成商品/库存底座,M09-D2 完成 7 张订单/支付/退款表、服务端快照、订单状态机、支付库存扣减、取消/超时释放、退款返库、顾客与管理 API、RBAC 和真实 MySQL 并发回归。当前进入 M09-D3,建设寄存/取出安全闭环。 |
|
||||
| M09 保洁任务、结算、商品和库存 | DOING | M09-D3 当前工作树(待本次中文工程提交) | docs/devlogs/2026-08-11-M09-D3-商品寄存与安全取出.md | M09-A/B/C 已完成保洁收口;M09-D1/D2 完成商品、库存、订单和支付库存生命周期,M09-D3 完成寄存单、分次取出流水、一次性哈希凭证、本人/授权员工领取、取消/过期 outbox、RBAC 和真实 MySQL 并发防超领回归。当前进入 M09-D4,接入顾客与运营界面。 |
|
||||
| M10 部署、域名、验收和运维闭环 | TODO | - | - | - |
|
||||
|
||||
|
||||
Reference in New Issue
Block a user