diff --git a/README.md b/README.md index ccc93f4..610ee9b 100644 --- a/README.md +++ b/README.md @@ -120,9 +120,9 @@ WSL 已验证:EMQX `5.8.9`、MQTTX CLI `1.13.0`、EMQX 服务 `active (running 项目已开发部分模块。具体完成度不得从 README 猜测,必须以现有代码、测试、数据库迁移、Git 历史以及 `docs/current-baseline.md`、`docs/module-status.md`、`docs/feature-status.md` 为准。 -- 当前执行游标:`M09-C`(DOING);`M09-A-RECOVERY`、`M06-C-R1`、`M06-E-R1`、`M06-R-REGRESSION`、`M08-D-R1` 与 `M09-B` 已完成,真实团购商家授权、微信和硬件现场验收保持 `BLOCKED_EXTERNAL`。 -- 最近工程提交:`bc7cb8f`,保洁三级规则快照、图片安全与租户隔离、返工照片版本、到期清理、免清洁策略和新订单安全断电已完成;Windows 全量和 WSL MySQL 8.4 往返通过。 -- 下一工程目标:执行 M09-C,统一负责人/协作者、免清洁、驳回、完成与结算统计口径,补并发结算唯一性、撤销反向记录和 API/CSV 同源查询。 +- 当前执行游标:`M09-D1`(DOING);`M09-A-RECOVERY`、`M06-C-R1`、`M06-E-R1`、`M06-R-REGRESSION`、`M08-D-R1` 与 `M09-B/C` 已完成,真实团购商家授权、微信和硬件现场验收保持 `BLOCKED_EXTERNAL`。 +- 最近工程提交:`1f10715`,协作成员份额统计/结算唯一性、负向冲正、出款前 CAS、商户隔离回调、人工付款和 API/CSV 同源查询已完成;Windows 全量和 WSL MySQL 8.4.10 往返通过。 +- 下一工程目标:执行 M09-D1,建立分类、商品、SKU、门店售卖、营业时段、库存策略、可用/锁定库存与不可变库存流水底座。 ## 版本递进 diff --git a/V5.6.md b/V5.6.md index 5b1c4f4..d033ef2 100644 --- a/V5.6.md +++ b/V5.6.md @@ -2,9 +2,9 @@ > 文档版本:V5.6(最新源码接管 + 漏项纠偏 + M09/M10 连续收口 + 全量测试版) -> 更新日期:2026-08-10(Asia/Shanghai) -> 当前工程证据基线:`b35af9037f256657f38f922e7b8a9bed9eb9aee9` -> 当前执行起点:保护并完成工作区中的 `M09-A` 在制事务化修改;随后补做被跳过的 `M06-C-R1 → M06-E-R1 → M06-R-REGRESSION`,再完成 `M08-D-R1 → M09-B/C/D → M10 → RC1`。 +> 更新日期:2026-08-11(Asia/Shanghai) +> 当前工程证据基线:`1f1071501f4954ad0440d79c2a38e7210393e928` +> 当前执行起点:`M09-A/B/C` 与强制返工队列均已闭环;从 `M09-D1` 继续完成 `M09-D1/D2/D3/D4 → M09-REGRESSION → M10 → RC1`。 > 目标:Codex 只阅读这一份 `V5.6.md`,即可从现有仓库和未提交工作继续编码、测试、提交、推送、校验并自动进入下一阶段,直到所有可独立完成项达到 `CODE_COMPLETE`,再在外部条件具备后达到 `PRODUCTION_ACCEPTED`。 > **V5.6 最高优先级说明:** 本章和文末“V5.6 最终固定队列”优先于本文后续继承的 V5.5/V5.4 历史游标、历史“当前进度”和示例命令。后文仍完整保留旧版功能、架构、协议、部署、安全、测试和验收要求,但凡与本章的新 HEAD、新工作区状态、新队列或新缺陷结论冲突,必须以 V5.6 为准。不得因后文出现 `M08-C` 旧游标而回退;不得因 README 仍写 V5.4 而忽略本文件。 @@ -171,16 +171,16 @@ M09-A-RECOVERY ```yaml execution_cursor_v56: - evidence_head: bc7cb8fab9ec1770b0b5b292f1031c4b08ef1dbb + evidence_head: 1f1071501f4954ad0440d79c2a38e7210393e928 base_branch: main remote: ssh://git@git.txyundm.cn:2222/panda/qipai.git current_module: M09 - current_stage: M09-C + current_stage: M09-D1 stage_status: DOING - last_completed_functional_stage: M09-B - last_engineering_commit: bc7cb8f - last_docs_commit: b507e87 - next_stage_after_current: M09-D1 + last_completed_functional_stage: M09-C + last_engineering_commit: 1f10715 + last_docs_commit: 5e0f5e3 + next_stage_after_current: M09-D2 frozen_stages: M08-B: PARTIAL_BLOCKED_EXTERNAL_SCOPE_FROZEN internal_blockers: [] @@ -6717,11 +6717,11 @@ M09-A-RECOVERY ```text DOCUMENT_VERSION=V5.6 -EVIDENCE_HEAD=bc7cb8fab9ec1770b0b5b292f1031c4b08ef1dbb +EVIDENCE_HEAD=1f1071501f4954ad0440d79c2a38e7210393e928 WORKTREE_PROTECTED=true -CURRENT_STAGE=M09-C +CURRENT_STAGE=M09-D1 STAGE_RESULT=DOING -NEXT_STAGE=M09-D1 +NEXT_STAGE=M09-D2 TARGET=CODE_COMPLETE_THEN_RELEASE_CANDIDATE_THEN_PRODUCTION_ACCEPTED ``` diff --git a/docs/api-changelog/2026-08-11-M09-C-cleaning-settlement-integrity.md b/docs/api-changelog/2026-08-11-M09-C-cleaning-settlement-integrity.md new file mode 100644 index 0000000..fc1fd04 --- /dev/null +++ b/docs/api-changelog/2026-08-11-M09-C-cleaning-settlement-integrity.md @@ -0,0 +1,26 @@ +# 2026-08-11 M09-C 保洁统计与结算 API + +## 新增管理接口 + +- `GET /admin-api/cleaning/settlements/export` + - 与结算分页列表共用状态、转账状态、门店、保洁员筛选和稳定排序。 + - 最多返回 5000 条,并返回 `total`、`exported`、`truncated`,由客户端明确提示截断。 +- `POST /admin-api/cleaning/settlements/:settlementId/cancel` + - 请求体必填 `reason`。 + - 只允许取消 `DRAFT` / `CONFIRMED` 且转账未进入 `PROCESSING`、`WAIT_USER_CONFIRM`、`SUCCESS` 的结算单。 + - 原单不删除;返回 `CANCELLED` 结算单并保留冲正与事件审计。 + +## 既有接口收口 + +- `GET /admin-api/cleaning/settlements/:settlementId` 新增: + - 结算单 `cancelledBy`、`cancelledAt`、`payoutRequestNo`。 + - 明细 `reversedAt`。 + - `reversals[]` 负向冲正和 `events[]` 状态历史,事件包含 `actorType`、`actorId`、`traceId`。 +- `POST /admin-api/cleaning/settlements/:settlementId/paid` 明确为人工付款入口:金额始终读取结算单,客户端只传 `payoutChannel`、必填 `payoutReference` 和可选 `note`;仅允许未发起或已明确失败的 `CONFIRMED` 结算。 +- 微信转账在调用供应商前固化请求号并进入处理中;网络异常不再写成失败,成功通知重放返回幂等成功。 +- 结算列表与导出只返回调用人租户/门店范围内数据;微信通知使用已验签商户号关联收款账户后再匹配请求号或外部流水。 +- 保洁员与管理端统计中的待结算金额覆盖所有尚未 `PAID` 的有效成员份额,已结算金额只累计已付款份额。 + +## 领域口径 + +多人协作任务按收款成员分别付款,因此唯一键定义为“任务 × 收款成员份额”,而不是把多个收款人强行并入一张单收款人记录。同一份额不能同时进入两张有效结算单;任务只有在全部有效奖励份额付款后才进入 `SETTLED`。 diff --git a/docs/current-baseline.md b/docs/current-baseline.md index 0c0bdb0..cfd4b88 100644 --- a/docs/current-baseline.md +++ b/docs/current-baseline.md @@ -1,8 +1,9 @@ # 当前开发成果基线 > V5.0 首次核验日期:2026-06-16 -> audited_commit: `bc7cb8f` -> next_engineering_target: 按 V5.6 固定队列执行 M09-C,统一保洁统计与结算口径、并发唯一性和撤销反向记录 +> audited_commit: `1f10715` +> audited_at: `2026-08-11T02:08:40+08:00` +> next_engineering_target: 按 V5.6 固定队列执行 M09-D1,建立分类、商品、SKU、门店售卖、营业时段与不可变库存流水底座 > 事实源:当前工作区、Git 历史、状态文档、Windows/WSL 检查脚本。 ## 总体结论 @@ -11,10 +12,10 @@ |---|---|---|---| | 总纲版本 | 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` | 本地与远端同步 | -| 正式后端 | 已完成 Fastify、迁移兼容、outbox/worker、多应用租户、身份/RBAC/门店范围及 M03-M08 业务 API;M09-A/B 已完成保洁事务并发、三级模板快照、照片安全/隔离/清理、版本化验收、免清洁策略与新订单安全断电 | `backend/src/**`、`database/migrations/**`、`backend/tests/**`、工程提交 `9b2f055`、`bc7cb8f` | M01-M04、M07 已完成;M05/M06/M08 可独立工程内容完成但外部联调保持 PARTIAL;当前进入 M09-C | -| 后台管理端 | 已建立 Vue3 + Vite + TypeScript + Element Plus 权限路由工程;12 个业务入口按路由懒加载;保洁工作台新增门店/房间规则配置、任务快照、返工次数与逐版照片验收追溯 | `admin/src/router.ts`、`admin/src/components/CleaningWorkspace.vue`、`admin/src/components/CleaningRulesPanel.vue`、`admin/src/components/CleaningTasksPanel.vue`、工程提交 `3faf868`、`bc7cb8f` | 最大 JS 分块 217,453 B,M09-B 全量门禁通过,进入 M09-C | +| 正式后端 | 已完成 Fastify、迁移兼容、outbox/worker、多应用租户、身份/RBAC/门店范围及 M03-M08 业务 API;M09-A/B/C 已完成保洁事务并发、规则快照与版本验收、协作成员份额统计/结算唯一性、负向冲正、出款 CAS、商户隔离回调和人工付款 | `backend/src/**`、`database/migrations/**`、`backend/tests/**`、工程提交 `9b2f055`、`bc7cb8f`、`1f10715` | M01-M04、M07 已完成;M05/M06/M08 可独立工程内容完成但外部联调保持 PARTIAL;当前进入 M09-D1 | +| 后台管理端 | 已建立 Vue3 + Vite + TypeScript + Element Plus 权限路由工程;12 个业务入口按路由懒加载;保洁工作台覆盖规则、任务、版本验收、同源结算导出、冲正历史、状态事件和人工付款 | `admin/src/router.ts`、`admin/src/components/CleaningWorkspace.vue`、`admin/src/components/CleaningSettlementsPanel.vue`、`admin/src/components/CleaningStatisticsPanel.vue`、工程提交 `3faf868`、`bc7cb8f`、`1f10715` | 最大 JS 分块 218,014 B,M09-C 全量门禁通过,进入 M09-D1 | | 微信小程序 | 已纳管微信原生模板,并完成顾客端订单、充值、权益明细、下单抵扣主体链路、保洁任务端照片上传/补做主体链路,以及管理员门店/房态/订单/代下单/验券/会员/员工/保洁/设备/经营统计 | `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-B 连续 up/down/verify 计划、最小脱敏 seed、旧库 fixture、执行 CLI、验证结果门禁和 MySQL 8 集成测试;保洁规则快照、照片资产和提交版本已纳入同一往返测试 | `database/migrations/**`、`backend/src/db/migration-runner.ts`、`backend/tests/mysql-migration-roundtrip.test.mjs` | WSL MySQL 8.4 已完成 149 up、128 verify、145 down;模板快照、照片版本、到期清理和免清洁策略实测通过 | +| 数据库迁移 | 已形成 M01-B 至 M09-C 连续 up/down/verify 计划、最小脱敏 seed、旧库 fixture、执行 CLI、验证结果门禁和 MySQL 8 集成测试;结算冲正、状态事件、活动成员份额唯一键和稳定出款请求号已纳入往返 | `database/migrations/**`、`backend/src/db/migration-runner.ts`、`backend/tests/mysql-migration-roundtrip.test.mjs` | WSL MySQL 8.4.10 已完成 160 up、132 verify、154 down;历史取消回填、并发单赢家、冲正重生成与协作任务最终结算实测通过 | | 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,仍需按模块迁移正式实现 | @@ -24,7 +25,7 @@ ## 状态校准 - `docs/module-status.md` 中 M00 仍为 `PARTIAL` 是正确的:生产 Ubuntu 初始化、部署与运维验收尚未执行;后端、后台和小程序源码已在后续模块建立。 -- M01-M04 与 M07 已具备模块工程验收;M05、M06、M08 因真实厂商/硬件/生产条件保持 `PARTIAL`;M09-A/B、M06-C/E-R1、M06-R-REGRESSION 与 M08-D-R1 已完成,当前按 V5.6 执行 M09-C,M10 尚未进入。 +- M01-M04 与 M07 已具备模块工程验收;M05、M06、M08 因真实厂商/硬件/生产条件保持 `PARTIAL`;M09-A/B/C、M06-C/E-R1、M06-R-REGRESSION 与 M08-D-R1 已完成,当前按 V5.6 执行 M09-D1,M10 尚未进入。 - 任何“目录存在”只能证明骨架存在,不能证明模块完成。 ## Git 历史敏感信息核验 @@ -35,6 +36,6 @@ ## 下一步 -1. 执行 M09-C:统一任务、负责人、协作者、免清洁、驳回、完成、待结算和已结算统计口径。 -2. 保证同一任务不可进入两张有效结算单,并发生成单赢家;结算撤销生成反向记录和明确状态历史,不物理删除。 -3. 页面、CSV 与 API 复用同一查询口径;M06-G 真实硬件联调继续等待外部条件,不阻断内部主队列。 +1. 执行 M09-D1:建立租户隔离的分类、商品、SKU、门店售卖、营业时段和库存策略底表。 +2. 建立可用/锁定库存与不可变库存流水,使用版本号和事务条件更新禁止负库存,并补齐金额/数量边界。 +3. 补 migration down/verify、真实 MySQL 并发库存测试和 API/管理端最小闭环;M06-G 真实硬件联调继续等待外部条件,不阻断内部主队列。 diff --git a/docs/db-changelog/2026-08-11-M09-C-cleaning-settlement-integrity.md b/docs/db-changelog/2026-08-11-M09-C-cleaning-settlement-integrity.md new file mode 100644 index 0000000..41c330a --- /dev/null +++ b/docs/db-changelog/2026-08-11-M09-C-cleaning-settlement-integrity.md @@ -0,0 +1,11 @@ +# 2026-08-11 M09-C 保洁结算完整性 + +- 版本:`2026081006_m09c_cleaning_settlement_integrity`。 +- 新增 `qipai_cleaning_settlement_reversals`:按结算单保存唯一冲正号、`BIGINT` 有符号整数分变动、原因、操作人和时间;零元历史取消单允许基线变动为 0。 +- 新增 `qipai_cleaning_settlement_events`:保存结算状态迁移、动作、`USER` / `SYSTEM` 操作类型、操作人、traceId、备注和 JSON 元数据。 +- 扩展 `qipai_cleaning_settlements`:新增取消人/时间、稳定 `payout_request_no` 和生成请求键;租户、渠道、请求号建立唯一约束。 +- 扩展 `qipai_cleaning_settlement_items`:新增冲正关联和时间;生成 `active_share_key=task_id:cleaner_user_id`,只对未冲正明细生效,同一租户同一任务成员份额最多一条有效明细。 +- 历史 `CANCELLED` 结算自动建立基线冲正、标记明细已冲正、清空未付款成员的 `settled_at` 并把没有已付款份额的任务回退为 `COMPLETED`。 +- down:先消解同一份额可能存在的多条冲正历史,优先保留当前有效明细,否则保留最新历史明细;再恢复旧成员份额唯一键,移除新列、索引、事件/冲正表和迁移版本。 +- `2026062627_m08b_cleaning_collaboration.down.sql` 在移除成员列前按任务去重,保证协作数据可完整执行全量 down;对应 verify 同时接受 M09-C 活动份额唯一键。 +- MySQL 8.4.10 原生临时副本已完成 160 up、132 verify、154 down 的往返,并覆盖历史取消、历史多次冲正、活动份额并发唯一和再次应用迁移。 diff --git a/docs/devlogs/2026-08-11-M09-C-统计与结算收口.md b/docs/devlogs/2026-08-11-M09-C-统计与结算收口.md new file mode 100644 index 0000000..7a28fc5 --- /dev/null +++ b/docs/devlogs/2026-08-11-M09-C-统计与结算收口.md @@ -0,0 +1,25 @@ +# 2026-08-11 M09-C 统计与结算收口 + +## 工程结果 + +- 工程提交:`1f10715`,已推送并验证远端 `main` 与本地 HEAD 一致。 +- 统一保洁任务、负责人、协作者、免清洁、驳回、完成、待结算、结算中和已结算口径;生成草稿或确认单后金额仍计入未付款口径,只有 `PAID` 才计入已结算。 +- 协作任务以“任务 × 收款成员份额”为结算原子:同一份额最多存在一条有效结算明细,并发生成只有一个赢家;不同收款人分别形成付款单,任务仅在所有有效奖励份额均付款后进入 `SETTLED`。 +- 活动结算明细存在期间冻结成员新增、移除和奖励调整,避免旧快照与任务奖励错配;跨门店且无租户级权限的生成请求必须明确门店。 +- 取消草稿或已确认结算单时保留原单和明细,创建不可变负向冲正记录、标记原明细已冲正并释放成员份额;冲正后可重新生成新有效结算。 +- 新增结算状态事件,区分 `USER` / `SYSTEM` 操作人;详情页和 CSV 可追溯确认、出款、失败、冲正、付款及 traceId。 +- 微信转账在外部请求前先以数据库 CAS 进入 `PROCESSING` 并固化 `CLP{settlementId}` 请求号;网络不确定结果保持处理中,只有供应商明确失败后才允许冲正,成功回调可幂等重放。 +- 微信回调按已验签商户号和收款账户定位结算,避免跨租户裸查流水;人工已付只允许未发起或明确失败的已确认结算,并要求可对账流水号。 +- 页面和服务端 CSV 导出复用结算列表同一查询方法、同一已提交筛选和同一排序;保洁任务、统计、运营队列与结算 CSV 的金额统一输出整数分。 + +## 验证证据 + +- Windows `scripts/dev/windows/test-all.ps1`:105.5 秒,退出码 0;仓库完整性、敏感信息、状态文档、后端全测、迁移计划、管理端构建/测试、懒加载体积和 M09-C 静态门禁全部通过。 +- 管理端生产构建最大 JS 分块 `218,014 B`,低于 `500 KiB`;仅保留第三方 `@vueuse/core` PURE 注释位置警告。 +- WSL 原生临时副本 + MySQL 8.4.10 完成 `up → verify → down → up → verify`:160 条 up、132 条 verify、154 条 down,临时数据库与账号均已清理。 +- MySQL 业务用例实测协作份额并发生成单赢家、活动明细唯一、成员冻结、冲正释放与重生成、处理中禁止取消、明确失败后取消、全部成员付款后任务最终结算,以及列表/导出同筛选同顺序。 +- 历史 `CANCELLED` 结算迁移会生成基线冲正并释放成员;带“历史已冲正 + 当前有效”和“多条历史冲正”数据的 down/up 往返通过。 + +## 阶段结论 + +`M09-C=DONE`。唯一执行游标进入 `M09-D1`;真实微信商户转账仍为 `BLOCKED_EXTERNAL`,但内部结算、对账、失败重试、冲正和人工付款链路已经闭环。 diff --git a/docs/feature-status.md b/docs/feature-status.md index 546b61d..6fb5d20 100644 --- a/docs/feature-status.md +++ b/docs/feature-status.md @@ -46,6 +46,8 @@ > 2026-08-10 M09-B:工程提交 `bc7cb8f` 为 `CLN-002`、`CLN-005` 补齐租户/门店/房间清洁模板与任务快照、照片格式/大小/数量和租户路径隔离、EXIF 移除、到期清理、返工版本与旧新照片追溯、任务级免清洁策略;订单结束/取消/换房断电前读取房间最新有效订单,避免新订单被旧任务关电。Windows 全量与 WSL MySQL 8.4 的 149 up、128 verify、145 down 往返通过,游标进入 M09-C。 +> 2026-08-11 M09-C:工程提交 `1f10715` 为 `CLN-003`、`CLN-004` 统一协作成员份额的待结算/已结算口径,补活动份额数据库唯一键、并发生成单赢家、成员奖励冻结、不可变负向冲正与状态事件;微信转账在出站前 CAS 为处理中,回调按商户隔离且成功重放幂等,并支持失败后的人工付款。列表/API/CSV 共用查询,所有保洁 CSV 金额输出整数分。Windows 全量与 WSL MySQL 8.4.10 的 160 up、132 verify、154 down 往返通过,游标进入 M09-D1。 + | ID | 功能 | 模块子阶段 | 状态 | 最近提交 | 测试/验收证据 | 阻塞原因 | 下一步 | |---|---|---|---|---|---|---|---| | ENV-001 | 固定 Windows 工作区 | M00-A/M00-B | DONE | 远端 HEAD | 已确认 `D:\qipai`,Git 根、main 分支、固定 origin 和 push 校验通过。 | - | 后续每模块继续复检。 | @@ -68,7 +70,8 @@ | AUTH-002 | 多级权限 | M02-B/M02-C/M08 | PARTIAL | `0511008` | 已建立六类角色、权限目录、用户角色和门店范围;管理接口执行 capability、租户和门店范围校验,后台菜单由服务端 access profile 生成,401 续期失败清理会话,关键写操作记录审计。 | 真实生产角色矩阵和跨租户平台账号尚未验收。 | M09 继续复用权限边界;M10 用生产角色矩阵复验菜单与服务端越权拒绝。 | | CLN-001 | 保洁人员管理 | M08-B/M09 | PARTIAL | `M08-B保洁员待补资料导出增量` | `CLEANER` 角色已接入 `cleaning.task.read/write` 和 `cleaning.statistics.read`,保洁接口按登录态、capability 和门店范围裁剪任务大厅;后台已可按 `CLEANER` 角色筛选员工,创建保洁员,编辑姓名/手机号/门店范围/备注,启停账号并重置会话;员工列表返回头像 URL 和微信小程序 openid 绑定状态,后台展示“已绑微信/未绑微信”和资料完整度标签,并复用该列表作为任务指派、协作者管理和生成结算单的可搜索保洁员选择源;保洁员管理页可导出当前筛选页 CSV,带出资料完整度、微信绑定、门店范围、脱敏手机号、最近登录/IP 和备注,也可单独导出待补资料清单,列出未绑定微信、未配置门店范围和缺姓名等缺口。 | 真实商户现场联调和更完整管理界面仍待继续。 | 继续 M08-B/M09,补更完整保洁运营管理界面。 | | CLN-002 | 保洁任务大厅 | M08-B/M09 | PARTIAL | `96c5fa4` | 新增 `qipai_cleaning_tasks`、`qipai_cleaning_task_events`、`GET /app-api/cleaning/tasks/hall`、`GET /app-api/cleaning/tasks/mine`、接单、开始、照片上传、提交验收、驳回补做接口;订单 `FINISHED` 时同事务幂等创建 `WAITING` 保洁任务;管理侧已支持任务查询、按状态/门店/负责人或协作者筛选、任务详情、照片预览、任务事件流水、任务详情协作分账、指派、验收、驳回、免清洁、批量验收、批量驳回、批量免清洁、超时回收、协作者查看/添加/移除、待结算候选筛选与后台预览/导出、正式结算单生成/确认、发放成功标记、发放失败记录、微信转账发放、转账预检、主动同步、批量同步、微信通知回调、结算单详情、结算详情导出、结算转账状态筛选、微信确认参数展示与导出、管理统计、每日趋势、统计按保洁员筛选和保洁员资料管理;小程序 `pages/cleaner/tasks` 已调用真实 app-api 并支持相机/相册上传;后台 `admin/` 已提供任务筛选、当前任务列表导出、单任务详情导出、单任务流水导出、单任务成员导出、待验收任务多选批量验收/驳回、可免清洁任务多选批量标记、保洁员选择器指派、验收、驳回、免清洁、超时回收、任务成员协作管理、任务详情操作流水和协作分账、结算详情、结算详情导出、待结算候选预览导出、结算列表导出、结算批量同步微信状态、转账状态筛选、微信确认参数展示与导出、统计明细、每日趋势、保洁员绩效排行、保洁员端统计看板、统计保洁员筛选、保洁员资料、待补资料导出、手机号维护、微信绑定状态、结算微信转账预检资料展示导出和转账前自动拦截界面、运营待处理快捷入口、运营待处理导出、真实商户/微信/转账/硬件现场联调清单、联调检查项搜索、联调筛选结果导出与筛选清除、联调状态筛选、联调负责人筛选、联调负责人看板、联调执行阶段看板、联调期限记录、联调逾期清单、联调批量标记、联调阻断摘要复制、联调场次信息记录、联调 JSON 快照导入导出、联调分类进度、联调验收结论复制、联调更新时间、联调证据记录、待补证据清单、联调交接报告、联调风险清单导出、联调归档包导出、收口签署字段和收口归档门禁。 | 真实商户现场执行和更完整管理界面仍待继续。 | 继续 M08-B,补更完整保洁运营管理界面。 | -| CLN-003 | 保洁统计 | M08-B/M09 | PARTIAL | `642659c` | 新增 `GET /app-api/cleaning/stats`,返回当前保洁员负责人/协作者任务状态计数、任务总数、完成数、驳回数、完成率、待结算金额和已结算金额,小程序展示已抢、进行、待验、完成、任务总数、完成率、驳回、待结算和已结算金额;管理侧新增 `GET /admin-api/cleaning/statistics`,按租户、门店范围、日期、门店和保洁员筛选返回状态分布、门店明细、免清洁统计、结算口径、成员分账排行和每日趋势,保洁员筛选同时覆盖负责人/协作者任务口径、结算单口径和每日已发放金额;后台首屏汇总改为使用管理侧统计接口,统计页支持今日、近7天、本月快捷周期、每日趋势条形展示、免清洁汇总/门店/趋势展示和可搜索保洁员筛选,任务/结算/统计列表支持门店和保洁员筛选以辅助定位统计异常,并可导出当前筛选条件下的汇总、任务状态、结算口径、每日趋势、门店明细、免清洁数量和成员分账 CSV。 | 真实商户现场联调和更完整管理界面待继续。 | M08-B/M09-C 补更完整管理界面。 | +| CLN-003 | 保洁统计 | M08-B/M09 | DONE | `1f10715` | 保洁员与管理端统计统一按有效成员份额复算:免清洁不计奖励,DRAFT/CONFIRMED 仍计未付款,只有 PAID 计已结算;负责人/协作者、任务状态、结算状态、门店、日期和每日趋势口径一致。统计页、任务/结算明细和整数分 CSV 可相互校验;真实 MySQL 覆盖协作成员分步付款和最终任务结算。 | - | M10 以生产数据抽样复算,不重开统计状态机。 | +| 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,补现场验收记录和更完整运营管理界面。 | | STAFF-001 | 员工账号 | M02-D/M08 | PARTIAL | `93f06d2` | 已实现创建员工、分配角色/门店、禁用、备注、重置会话和审计;管理员小程序已展示员工概况,Vue 后台可按角色/状态搜索并完成完整生命周期管理,权限变化即时撤销活动会话。 | 真实员工微信绑定和生产账号生命周期验收待补。 | M10 以真实员工账号验证绑定、门店切换、禁用和重新登录。 | | BKG-002 | 后台用户管理 | M02-D/M08 | PARTIAL | `0511008` | 已实现分页筛选、注册/登录时间、状态、角色、门店范围、手机号/IP 脱敏及会员/STAFF 分栏;租户管理员可为同租户有效 STAFF 设置唯一登录名和强密码,更新凭据会撤销其活动会话且不返回密码哈希。 | 尚缺平台级跨租户用户视图和真实生产数据验收。 | M10 以生产平台/租户账号复验跨租户用户视图、凭据重置和审计。 | diff --git a/docs/module-status.md b/docs/module-status.md index c0c15c0..f894078 100644 --- a/docs/module-status.md +++ b/docs/module-status.md @@ -3,15 +3,15 @@ ```yaml execution_cursor: current_module: M09 - current_stage: M09-C + current_stage: M09-D1 stage_status: DOING - last_completed_stage: M09-B - next_stage: M09-D1 - last_engineering_commit: `bc7cb8f` + last_completed_stage: M09-C + next_stage: M09-D2 + last_engineering_commit: `1f10715` 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-10T21:50:38+08:00 + updated_at: 2026-08-11T02:08:40+08:00 ``` | 模块 | 状态 | 最近提交 | 最近开发日志 | 备注 | @@ -25,6 +25,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 | `bc7cb8f` | docs/devlogs/2026-08-10-M09-B-清洁规则与照片验收.md | M09-A/B 已完成任务事务并发、三级模板与任务快照、图片安全/隔离/清理、版本化验收、免清洁策略和新订单安全断电;当前进入 M09-C,统一统计与结算口径、并发唯一性和撤销反向记录。 | +| M09 保洁任务、结算、商品和库存 | DOING | `1f10715` | docs/devlogs/2026-08-11-M09-C-统计与结算收口.md | M09-A/B/C 已完成任务事务并发、规则与验收、协作份额统计与结算唯一性、负向冲正、出款竞态与同源导出;当前进入 M09-D1,建设商品/SKU/库存底座。 | | M10 部署、域名、验收和运维闭环 | TODO | - | - | - |