docs(M08-C): 回填保洁与设备运营

This commit is contained in:
Codex
2026-08-10 10:53:26 +08:00
parent 65932a8000
commit 3bfccb8513
7 changed files with 55 additions and 8 deletions
+2 -2
View File
@@ -121,8 +121,8 @@ 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` 为准。
- 当前执行游标:`M08-C`DOING);`M08-B` 的可独立工程内容已完成,真实商户、微信和硬件现场验收保持 `BLOCKED_EXTERNAL`
- 最近工程提交:`1b0839e` / `M08-C会员检索与员工概况`,管理员可在授权范围内检索会员并查看钱包、订单和权益概况,员工入口仅返回 STAFF 账号及其角色、门店范围和脱敏资料
- 下一工程目标:继续 M08-C,补保洁任务、设备状态与临时控制入口
- 最近工程提交:`65932a8` / `M08-C保洁与设备运营`,管理员可查看授权门店保洁任务/统计并验收、驳回或免清洁,也可查看设备拓扑、告警、维护状态并执行带操作人审计的临时开门和电控
- 下一工程目标:继续 M08-C,补管理员验券与门店经营统计
## 版本递进
@@ -28,3 +28,15 @@
| GET | `/app-api/management/staff` | `user.read`,并叠加租户与授权门店范围 | 强制仅查询 `userType=STAFF`,返回角色、门店范围、状态、备注及脱敏手机号/最近登录 IP。 |
管理员代下单页改为调用会员检索接口选择目标会员,不再要求手工输入全局用户 ID。列表分页参数继续由服务端夹取为安全整数;MySQL 查询不再绑定 `LIMIT/OFFSET` 占位符,以兼容当前 MySQL 8.4 驱动组合。
## 保洁与设备运营增量
| 方法 | 路径 | 权限 | 结果 |
|---|---|---|---|
| GET | `/app-api/management/cleaning/tasks` | `cleaning.task.read`,并叠加租户与授权门店范围 | 按门店、状态和保洁员查询任务。 |
| GET | `/app-api/management/cleaning/statistics` | 同上 | 返回任务汇总、状态、门店、结算、人员和趋势统计。 |
| POST | `/app-api/management/cleaning/tasks/:taskId/complete``reject``exempt` | `cleaning.task.write`,任务门店在授权范围 | 复用既有验收、驳回补做和免清洁状态机/事件记录。 |
| GET | `/app-api/management/devices``device-topology` | `device.read`,并叠加租户与授权门店范围 | 返回设备在线状态、信号、固件、能力、最近心跳、告警、维护和绑定拓扑。 |
| POST | `/app-api/management/device-control/*` | `device.write`,设备门店在授权范围 | 复用既有控制箱、Sub-1G 和智能插座命令服务;小程序当前接入临时开门、全屋电控和插座开关。 |
管理端设备写操作在命令创建前写入 `DEVICE_COMMAND_REQUESTED` 审计,记录实际账号类型/ID、traceId、门店、房间、设备、命令类型和可选订单;设备离线、未绑定或跨店仍由服务端拒绝。
+3 -3
View File
@@ -2,7 +2,7 @@
> V5.0 首次核验日期:2026-06-16
> audited_commit: `4ae9296`
> next_engineering_target: 继续 M08-C 管理员/员工小程序保洁任务、设备状态与临时控制
> next_engineering_target: 继续 M08-C 管理员验券与门店经营统计
> 事实源:当前工作区、Git 历史、状态文档、Windows/WSL 检查脚本。
## 总体结论
@@ -13,7 +13,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 和门店范围 | `backend/src/auth/**``database/migrations/2026061805_m02c_rbac.*.sql``backend/tests/**` | M01、M02-A/B/C DONEMySQL 已验证 capability 和跨租户门店授权拒绝;下一阶段 M02-D |
| 后台管理端 | 已建立 Vue3 + Vite + TypeScript + Element Plus 工程,并接入 M08-B 保洁任务、免清洁标记、批量免清洁、免清洁统计展示、协作者管理、结算详情、统计明细、每日趋势、保洁员资料管理、手机号维护、微信绑定状态、微信转账预检界面和现场联调执行记录追溯 | `admin/src/App.vue``admin/src/components/CleaningTasksPanel.vue``admin/src/components/CleaningSettlementsPanel.vue``admin/src/components/CleaningStatisticsPanel.vue``admin/src/components/CleanersPanel.vue``admin/src/components/CleaningFieldHandoffPanel.vue``scripts/check-admin-m08-b.mjs` | M08-B 可独立工程内容已完成;联调检查项支持多次执行历史、搜索、快照、报告、CSV 和归档,真实商户/微信/硬件现场验收保持外部阻塞;执行游标进入 M08-C |
| 微信小程序 | 已纳管微信原生模板,并完成顾客端订单、充值、权益明细、下单抵扣主体链路、保洁任务端照片上传/补做主体链路,以及管理员门店/房态/订单/代下单/会员/员工运营首段 | `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 PARTIALM08-A 顾客端工程闭环按外部阻塞旁路;M08-B 可独立工程内容已完成;M08-C 已形成授权门店房态、订单处置、管理员代下单、会员检索/概况和 STAFF 员工概况闭环,继续保洁、设备、临时控制和经营统计 |
| 微信小程序 | 已纳管微信原生模板,并完成顾客端订单、充值、权益明细、下单抵扣主体链路、保洁任务端照片上传/补做主体链路,以及管理员门店/房态/订单/代下单/会员/员工/保洁/设备运营 | `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 PARTIALM08-A 顾客端工程闭环按外部阻塞旁路;M08-B 可独立工程内容已完成;M08-C 已形成授权门店房态、订单处置、管理员代下单、会员/员工概况、保洁验收和设备状态/临时控制闭环,继续管理员验券与经营统计 |
| 数据库迁移 | 已新增 M01-B 核心 schema up/down/verify SQL、最小脱敏 seed、旧库结构 fixture、迁移计划/执行 CLI、验证结果数量门禁和 MySQL 8 集成测试 | `database/migrations/2026061601_m01b_core_schema.*.sql``database/seeds/2026061601_m01b_minimal_seed.sql``database/fixtures/2026061801_m01b_legacy_schema.sql``backend/src/db/migration-runner.ts``backend/tests/mysql-migration-roundtrip.test.mjs` | M01-B DONEWSL MySQL 8.4.9 已验证 8 条旧库 fixture、11 条 up、3 条 verify、10 条 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 后接入 |
@@ -35,6 +35,6 @@
## 下一步
1. 继续 M08-C:在已完成门店概况、授权房态、订单筛选/处置/备注、管理员代下单、会员检索/概况和 STAFF 员工概况基础上,补管理员保洁任务、设备状态、临时开门/电控和经营统计。
1. 继续 M08-C:在已完成门店概况、授权房态、订单筛选/处置/备注、管理员代下单、会员/员工概况、保洁任务和设备临时控制基础上,补管理员验券与门店经营统计。
2. 继续复用 M03 门店发现、M04 订单、M05 支付、M06 设备联动和 M07 会员营销后端能力,不重复初始化小程序。
3. M06-G 真实硬件联调仍等待生产 MQTT 账号/ACL、DeviceID 和现场实物配线。
@@ -21,3 +21,10 @@
- 会员实付聚合状态改为当前订单状态 `PAID/RESERVED/IN_PROGRESS/FINISHED`,不再引用旧状态 `IN_USE/COMPLETED`
- 会员、员工、订单和保洁列表分页在服务端夹取整数后拼入 `LIMIT/OFFSET`,其余过滤条件继续参数化;修复 MySQL 8.4.10 与当前 Node 驱动对分页占位符的兼容错误。
- WSL MySQL 8.4.10 已验证授权门店历史 OWNER 订单会员发现、STAFF 类型限定与完整迁移往返。
## 保洁与设备运营增量
- 无 schema 迁移。
- 管理员设备命令在既有 `qipai_audit_logs` 写入 `DEVICE_COMMAND_REQUESTED`,actor 记录真实管理员/员工/顾客或系统来源,metadata 记录门店、房间、设备、设备类型、命令类型和可选订单。
- 审计发生在设备命令创建/发布前;命令最终状态继续以 `qipai_iot_commands``PUBLISHED/ACKED/FAILED/TIMEOUT` 及设备回包为准,不把“已发布”表述为“设备已执行”。
- WSL MySQL 8.4.10 已实际验证管理员临时开门的 IoT 命令落库、MQTT Mock 发布和操作人审计归因,并完成 136 up、114 verify、130 down 的完整往返。
@@ -82,3 +82,30 @@ M08-C 保持 `DOING`。订单筛选、处置、备注和代下单已形成授权
### 状态
M08-C 保持 `DOING`。会员检索、聚合详情、STAFF 员工概况和代下单会员选择已完成;下一工程增量继续保洁任务、设备状态与临时控制,不移动到 M08-D。
## 2026-08-10 保洁与设备运营
- `ENGINEERING_DELTA=YES`
- 管理员小程序新增“保洁与设备”页,按当前授权门店展示保洁任务、待验收/处理中/驳回/完成统计,并支持验收通过、驳回补做和免清洁。
- 设备区复用既有设备拓扑,展示在线/离线/故障、型号、房间、最近心跳、开放告警和未解决维护记录;写权限账号可执行控制箱临时开门、全屋通断电和智能插座通断电。
- 新增保洁任务/统计/处置、设备列表/拓扑和全部设备控制的小程序管理别名;服务端继续执行 capability、租户和门店范围校验,前端按钮隐藏不是权限边界。
- `DeviceControlService` 在命令创建/发布前写 `DEVICE_COMMAND_REQUESTED` 审计,记录实际账号与命令上下文;系统自动化和顾客订单开门也分别标记 SYSTEM/CUSTOMER 来源。
- 页面所有写动作均要求二次确认;临时开门固定非保持开启、4 秒延时。接口只返回命令发布状态,设备真实执行仍以相同 commandId 回包为准。
### 测试证据
- `powershell -ExecutionPolicy Bypass -File scripts/dev/windows/test-all.ps1`:退出码 0;仓库完整性、敏感信息、后端全量、M08-C 静态验收、迁移计划和后台生产构建全部通过。
- WSL 原生临时副本 + MySQL 8.4.10`up → verify → down → up → verify` 通过,136 条 up、114 条 verify、130 条 down;实际验证管理员开门命令、MQTT Mock 发布及 ADMIN/用户 ID 审计归因。
- 路由测试覆盖小程序保洁任务/统计/验收/驳回/免清洁别名、设备列表/拓扑别名和开门/电控别名;服务测试覆盖命令审计数量和管理账号上下文。
- 已知非阻塞提示:参考目录既有 xjar 超过 100MBElement Plus 产物 chunk 超过 500kBWSL npm 报告 allow-scripts 提示,未执行破坏性自动升级。
### 变更影响
- 数据库:无 schema 迁移;新增运行时设备命令审计数据。
- API:新增小程序管理端保洁、设备读取和设备控制别名;既有后台 API 不变。
- 部署:后端与小程序有变化,数据库无迁移;未自动部署生产。
- 工程提交:`65932a8`,已推送并验证 `HEAD == origin/main`
### 状态
M08-C 保持 `DOING`。保洁任务处置、设备运营概况和带操作人审计的临时开门/电控已完成;下一工程增量继续管理员验券与门店经营统计,不移动到 M08-D。
+2 -1
View File
@@ -10,6 +10,8 @@
> 2026-08-10 M08-C 增量:工程提交 `1b0839e` 为 `MEM-001`、`AUTH-002`、`ADM-001`、`ORD-001` 补管理员会员检索/概况、STAFF 员工概况和代下单会员选择;会员范围同时接受授权门店钱包或历史 OWNER 订单,员工接口强制 STAFF 类型并脱敏手机号/IP,MySQL 8.4 分页兼容问题同步修复。Windows 全量与 WSL MySQL 8.4.10 往返通过,M08-C 继续保洁与设备运营。
> 2026-08-10 M08-C 增量:工程提交 `65932a8` 为 `CLN-002`、`CLN-003`、`CLN-005`、`DEV-003`、`ROOM-002`、`ADM-001` 补管理员保洁与设备运营页;授权门店可查看保洁任务/统计并验收、驳回、免清洁,查看设备拓扑/告警/维护并临时开门、控制箱/插座电控。设备命令新增实际操作人审计归因,Windows 全量与 WSL MySQL 8.4.10 往返通过。M08-C 继续管理员验券与经营统计。
| ID | 功能 | 模块子阶段 | 状态 | 最近提交 | 测试/验收证据 | 阻塞原因 | 下一步 |
|---|---|---|---|---|---|---|---|
| ENV-001 | 固定 Windows 工作区 | M00-A/M00-B | DONE | 远端 HEAD | 已确认 `D:\qipai`Git 根、main 分支、固定 origin 和 push 校验通过。 | - | 后续每模块继续复检。 |
@@ -65,4 +67,3 @@
| IOT-004 | Sub-1G 门锁控制 | M06-D | PARTIAL | `d15fd3f` | `CtrlDevice` 开关门、密码/卡片和恢复出厂适配器已实现;危险清空/恢复出厂仅平台管理员加确认短语;record 内容哈希脱敏,低电量及 timeout/full/unconfirm 告警。 | 缺 701C/701G 实物及密码/卡片现场验收。 | M06-G 完成实物控制与故障场景。 |
| IOT-005 | 智慧插座接入 | M06-E | PARTIAL | `9144fa8` | `basicInfo/workInfo` 查询、`on/off``localtask/clearTask` 已通过适配器、命令持久化和后台 API 接入;本地任务限制 20 条;过载、过温、过流、过压/欠压、功率和温度阈值写入设备告警;Windows 全量后端回归通过。 | 缺 4G 智慧插座实物、DeviceID、生产 MQTT 账号/ACL 和现场负载,未执行真实计量与保护断电联调。 | M06-F 接入订单自动联动;M06-G 完成实物计量、开关、本地任务和保护事件矩阵。 |
| IOT-008 | 设备告警与离线 | M06/M10 | PARTIAL | `d01f771` | `/devicewill/{DeviceID}` 可更新离线状态;低电量、timeout/full/unconfirm、插座过载、过温、过流、过压/欠压、功率和温度阈值可写入开放告警;订单联动任务失败会进入异步任务重试/补偿;真实硬件烟测运行器可等待 ACK 并输出 JSON 报告。 | 缺真实硬件离线、保护断电、任务结束和弱信号事件矩阵。 | 取得实物和生产 MQTT 账号后执行硬件烟测矩阵;当前旁路进入 M07-A。 |
+2 -2
View File
@@ -7,11 +7,11 @@ execution_cursor:
stage_status: DOING
last_completed_stage: M07-D
next_stage: M08-C
last_engineering_commit: `1b0839e`
last_engineering_commit: `65932a8`
last_push_verified: true
base_branch: main
blocked_reason: "M08-A 真机合法域名、真实微信支付和实物开门验证缺微信后台/商户/硬件现场条件;M08-B 可独立工程内容已完成并补齐多次现场执行记录追溯,真实商户凭据、微信后台配置、生产小额转账和实物硬件结果保持 BLOCKED_EXTERNAL,已按规则旁路进入 M08-C。M06-G 真实硬件联调仍缺生产 MQTT 账号/ACL、DeviceID、控制箱、门锁、插座和现场配线。"
updated_at: 2026-08-10T10:36:37+08:00
updated_at: 2026-08-10T10:52:16+08:00
```
| 模块 | 状态 | 最近提交 | 最近开发日志 | 备注 |