From 95cc5ea4440cb0dd3a4b8961be72cdb31ffca7c5 Mon Sep 17 00:00:00 2001 From: Codex Date: Mon, 10 Aug 2026 19:15:15 +0800 Subject: [PATCH] =?UTF-8?q?docs(M06-E-R1):=20=E5=9B=9E=E5=A1=AB=E6=8F=92?= =?UTF-8?q?=E5=BA=A7=E5=8D=8F=E8=AE=AE=E4=B8=8E=E6=B8=B8=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 +++--- docs/current-baseline.md | 14 +++++++------- .../2026-06-22-M06-C-iot-messages.md | 8 ++++++++ docs/devlogs/2026-06-24-M06-E-智慧插座.md | 19 ++++++++++++++++--- docs/feature-status.md | 8 ++++---- docs/hardware-vendor.md | 2 +- docs/module-status.md | 12 ++++++------ docs/mqtt-protocol-mapping.md | 16 ++++++++++++++-- 8 files changed, 59 insertions(+), 26 deletions(-) diff --git a/README.md b/README.md index 521030b..eb8dcf7 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` 为准。 -- 当前执行游标:`M06-E-R1`(DOING);`M09-A-RECOVERY` 与 `M06-C-R1` 已完成,真实团购商家授权、微信和硬件现场验收保持 `BLOCKED_EXTERNAL`。 -- 最近工程提交:`dabc656` / `M06-C-R1控制箱与门锁协议校正`,真实 MySQL 8.4.10 已验证精确 Wire JSON、两阶段配对、结果失败状态、凭据脱敏、事件语义和原始遗嘱离线落库。 -- 下一工程目标:完成 M06-E-R1,依据智慧插座协议原件修正 `workInfo/localtask/protectOff/parameter/special` 的 wire schema、fixture、标准化字段和消息落库。 +- 当前执行游标:`M06-R-REGRESSION`(DOING);`M09-A-RECOVERY`、`M06-C-R1` 与 `M06-E-R1` 已完成,真实团购商家授权、微信和硬件现场验收保持 `BLOCKED_EXTERNAL`。 +- 最近工程提交:`aed36f0`(协议校正)+ `36b3b2f`(危险口令秘密扫描收口),真实 MySQL 8.4.10 已验证精确本地任务、十进制状态标准化、特殊断电告警、失败结果和敏感口令脱敏。 +- 下一工程目标:执行 M06-R-REGRESSION,全量验证控制箱、门锁与智慧插座协议 fixture,同时修复四个静态检查脚本的中文/空格路径处理。 ## 版本递进 diff --git a/docs/current-baseline.md b/docs/current-baseline.md index 53e91f8..0b1abf9 100644 --- a/docs/current-baseline.md +++ b/docs/current-baseline.md @@ -1,8 +1,8 @@ # 当前开发成果基线 > V5.0 首次核验日期:2026-06-16 -> audited_commit: `dabc656` -> next_engineering_target: 按 V5.6 固定队列进入 M06-E-R1,依据智慧插座协议原件返工 wire schema、fixture 与消息落库 +> audited_commit: `36b3b2f` +> next_engineering_target: 按 V5.6 固定队列执行 M06-R-REGRESSION,全量验证协议并修复四个检查脚本路径 > 事实源:当前工作区、Git 历史、状态文档、Windows/WSL 检查脚本。 ## 总体结论 @@ -11,10 +11,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 已完成事务收口,M06-C-R1 已完成控制箱与门锁协议纠偏 | `backend/src/**`、`database/migrations/**`、`backend/tests/**`、工程提交 `9b2f055`、`dabc656` | M01-M04、M07 已完成;M05/M06/M08 可独立工程内容完成但外部联调保持 PARTIAL;当前进入 M06-E-R1 智慧插座协议返工 | +| 正式后端 | 已完成 Fastify、迁移兼容、outbox/worker、多应用租户、微信与后台密码身份/可撤销会话、六角色 RBAC、门店范围,以及 M03-M08 业务 API;M09-A 已完成事务收口,M06-C/E-R1 已完成控制箱、门锁与插座协议纠偏 | `backend/src/**`、`database/migrations/**`、`backend/tests/**`、工程提交 `9b2f055`、`dabc656`、`aed36f0`、`36b3b2f` | M01-M04、M07 已完成;M05/M06/M08 可独立工程内容完成但外部联调保持 PARTIAL;当前进入 M06-R-REGRESSION | | 后台管理端 | 已建立 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 | -| 数据库迁移 | 已形成 M01-B 至 M08-D 连续 up/down/verify 计划、最小脱敏 seed、旧库 fixture、执行 CLI、验证结果门禁和 MySQL 8 集成测试;M09-A 事务并发和 M06-C-R1 协议落库均纳入同一往返测试 | `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;除 M09-A 并发外,实测两阶段配对、任务失败结果、未知结果协议死信、凭据脱敏、非 ACK 事件及裸遗嘱离线 | +| 数据库迁移 | 已形成 M01-B 至 M08-D 连续 up/down/verify 计划、最小脱敏 seed、旧库 fixture、执行 CLI、验证结果门禁和 MySQL 8 集成测试;M09-A 事务并发与 M06-C/E-R1 协议落库均纳入同一往返测试 | `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;另实测插座十进制 `workInfo`、三类失败结果、closeReason 3-7 告警、温度冲突死信和复位口令脱敏 | | 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 +24,7 @@ ## 状态校准 - `docs/module-status.md` 中 M00 仍为 `PARTIAL` 是正确的:生产 Ubuntu 初始化、部署与运维验收尚未执行;后端、后台和小程序源码已在后续模块建立。 -- M01-M04 与 M07 已具备模块工程验收;M05、M06、M08 因真实厂商/硬件/生产条件保持 `PARTIAL`;M09-A-RECOVERY 与 M06-C-R1 已完成,当前按 V5.6 执行 M06-E-R1,M10 尚未进入。 +- M01-M04 与 M07 已具备模块工程验收;M05、M06、M08 因真实厂商/硬件/生产条件保持 `PARTIAL`;M09-A-RECOVERY 与 M06-C/E-R1 已完成,当前按 V5.6 执行 M06-R-REGRESSION,M10 尚未进入。 - 任何“目录存在”只能证明骨架存在,不能证明模块完成。 ## Git 历史敏感信息核验 @@ -35,6 +35,6 @@ ## 下一步 -1. 进入 M06-E-R1:依据智慧插座协议原件修正 `workInfo`、本地任务、保护参数、特殊事件的 wire schema、fixture 与标准化落库。 -2. 随后进入 M06-R-REGRESSION;四个 `check-*.mjs` 的中文/空格路径修复归入该回归阶段,并统一关闭协议资料缺失的历史问题。 +1. 执行 M06-R-REGRESSION:按 V5.6 指令完成后端、后台、小程序、迁移、MQTT fixture 与仓库全量门禁。 +2. 修复四个 `check-*.mjs` 的中文/空格路径处理,并统一关闭协议资料缺失的历史问题;完成后进入 M08-D-R1。 3. M06-G 真实硬件联调仍等待生产 MQTT 账号/ACL、DeviceID 和现场实物配线;该外部阻塞不阻断内部 R1 队列。 diff --git a/docs/db-changelog/2026-06-22-M06-C-iot-messages.md b/docs/db-changelog/2026-06-22-M06-C-iot-messages.md index 2b76302..2a3ace1 100644 --- a/docs/db-changelog/2026-06-22-M06-C-iot-messages.md +++ b/docs/db-changelog/2026-06-22-M06-C-iot-messages.md @@ -22,3 +22,11 @@ - 门锁密码/卡号请求和 `record.content` 在写入 `request_payload/raw_payload/normalized_payload/response_payload` 前哈希与脱敏。 - `AddDevice` 首 ACK 保持命令 `PUBLISHED`,携带 `subtype/subID` 的最终 ACK 才转 `ACKED` 并创建 701C/701G 拓扑。 - WSL MySQL 8.4.10 一次性数据库已验证上述语义及裸 `devicewill=close` 离线落库;完整迁移往返仍为 144 up、124 verify、140 down。 + +## M06-E-R1 插座消息语义(2026-08-10) + +- 不新增迁移版本;`normalized_payload.payload` 新增 `switchOn/voltage/current/power/temperature/energy` 标准字段,计量值为规范十进制字符串。 +- `raw_payload` 继续保存脱敏后的厂商原字段,不能再用它覆盖适配器生成的标准化 payload。 +- `temp/temperature` 冲突写 `processing_status=PROTOCOL_ERROR`,同时写 `SOCKET_TEMPERATURE_CONFLICT` 告警和死信。 +- `special.closeReason` 3-7 分别 upsert 五类保护告警;1-2 只落设备事件。 +- `setReturnKey.old/new` 与 `returnFactory.password` 在命令持久化前哈希/脱敏,Wire 原值只存在下发内存中。 diff --git a/docs/devlogs/2026-06-24-M06-E-智慧插座.md b/docs/devlogs/2026-06-24-M06-E-智慧插座.md index 83a140b..f736ecf 100644 --- a/docs/devlogs/2026-06-24-M06-E-智慧插座.md +++ b/docs/devlogs/2026-06-24-M06-E-智慧插座.md @@ -4,7 +4,7 @@ - 起始 commit:`4863860` - 工程 commit:`9144fa8` - ENGINEERING_DELTA=YES -- 子阶段状态:PARTIAL/BLOCKED_EXTERNAL;Mock 与后端控制闭环完成,缺插座实物 +- 子阶段状态:M06-E-R1 DONE;PROTOCOL_FIXTURE_PASS,缺插座实物仍为 M06-G BLOCKED_EXTERNAL ## 工程增量 @@ -12,7 +12,20 @@ - 新增后台 API:`/admin-api/device-control/socket/read`、`/socket/switch`、`/socket/task`、`/socket/task/clear`。 - 插座命令复用设备命令状态机,先落库再发布 MQTT;返回 `PUBLISHED` 不伪造成设备执行成功。 - 插座控制复用租户、门店、房间和 `device.write` 范围校验;离线设备拒绝下发。 -- 上行 `workInfo/special` 类事件可识别过载、过温、过流、过压/欠压、功率和温度阈值,并写入设备告警。 +- 历史实现曾按协议不存在的 `powerW/overLoad` 和本地阈值推断告警;该结论已由 M06-E-R1 撤销并替换。 + +## M06-E-R1 协议纠偏(2026-08-10) + +- 工程 commit:`aed36f0` +- 秘密扫描收口 commit:`36b3b2f`(保持厂商 `password` Wire 字段,同时避免源码/测试值触发明文秘密门禁)。 +- 新增本地任务单条/全部、MQTT 配置读取;领域 `mode/time/weekdays/action` 精确转换为 `cyctype/actiontime/weekdata/tasktype`,创建任务禁止 `taskNum=0`。 +- 新增 `reboot/emptyPower/returnFactory/setReturnKey/protectOff/parameter`;额定电流从设备 model/capabilities 识别 10A/16A/63A,保护上限不再统一写死。 +- 清累计电量、恢复出厂、修改复位口令、重启和清空全部任务走平台管理员固定确认短语与审计;顾客与普通门店角色不可执行。 +- `workInfo` 将 `onOff/vol/cur/pow/temp|temperature/energy` 标准化为布尔和精确十进制字符串;原始脱敏 payload 与标准化 payload 分开持久化。 +- `special.closeReason` 3-7 写拔出、充满、超功率、超电流、超温告警,1-2 不制造保护故障;旧假字段只作为不告警的负向测试。 +- `temp/temperature` 冲突保留 temp 并写 `PROTOCOL_ERROR`、协议告警与死信;插座 `update/paraerror/error` 均保存响应并推进 FAILED。 +- Windows 后端全量 `npm test` 通过;WSL MySQL 8.4.10 原生副本完成 144 up、124 verify、140 down 往返并实测标准化、告警、冲突死信、失败结果和复位口令脱敏。 +- 两个工程提交均已 push,`HEAD == origin/main == 36b3b2fd252361cd01deafe0467d1c57ae3d8930`。 ## 验证 @@ -24,4 +37,4 @@ ## 外部阻塞与后续 -缺 4G 智慧插座实物、DeviceID、生产 MQTT 账号/ACL 和现场负载,真实计量与保护断电仍保留 `BLOCKED_EXTERNAL`。游标进入 M06-F 订单自动联动。 +缺 4G 智慧插座实物、DeviceID、生产 MQTT 账号/ACL 和现场负载,真实计量与保护断电仍保留 `BLOCKED_EXTERNAL`。资料和 fixture 已完成,游标进入 M06-R-REGRESSION。 diff --git a/docs/feature-status.md b/docs/feature-status.md index daa75e7..4f7ad1e 100644 --- a/docs/feature-status.md +++ b/docs/feature-status.md @@ -91,11 +91,11 @@ | BKG-007 | 后台微信支付配置 | M05-D/M08 | PARTIAL | `4eac99d` | 已提供收款账户、分账接收方、门店/全局比例策略和授权状态 API;Vue 后台支持环境引用配置、授权状态、脱敏接收方、比例策略、分账记录、微信退款、对账单请求和分账执行;私钥/APIv3 Key 不读取或回显。M08-B 保洁转账预检仍提供商户资料与转账前阻断。 | 真实商户与服务商授权、微信后台场景报备和生产小额退款/分账仍需现场联调。 | 授权后完成生产退款、对账与分账验收。 | | DEV-003 | 设备管理 | M06-B/M08 | PARTIAL | `5c9fd69` | 已实现并在管理员小程序/Vue 后台展示 DeviceID、IMEI/ICCID、型号、固件、信号、能力、状态快照、控制通道、Sub-1G 父子拓扑、开放告警和维护记录;后台可按授权门店入库、绑定、维护并下发门锁/控电/插座命令。 | 真实硬件在线、ACK、计量和保护断电仍需 M06-G 实物更新。 | 取得实物和生产 MQTT 条件后执行硬件矩阵并回填命令 ACK 证据。 | | BKG-004 | 后台设备管理 | M06-B/M08 | PARTIAL | `5c9fd69` | Vue 后台已接入设备入库、列表、拓扑、通道绑定、Sub-1G 绑定、告警、维护和现场控制;同一房间控制目标唯一,危险命令二次确认,并明确“发布不等于 ACK”。 | 真实设备扫码输入和现场结果未验证。 | M06-G/M10 以真实控制箱、门锁和插座完成扫码入库与控制验收。 | -| IOT-006 | MQTT 消息幂等 | M01/M06-C | DONE | `dabc656` | 上行按租户、设备、Topic 和 payload SHA-256 唯一;QoS 1 重复消息只增加 `receive_count`,不重复更新命令或设备副作用;WSL MySQL 8.4.10 实测两次 ACK 仅一条事件,裸遗嘱也走同一去重入口。 | - | M06-E-R1 继续复用同一消费链路。 | -| IOT-007 | 命令状态机 | M01/M06-C | DONE | `dabc656` | `PENDING/PUBLISHED/ACKED/FAILED/TIMEOUT/UNKNOWN/CANCELLED` 数据模型可用;结果按命令判别,未知结果持久化为 `UNKNOWN_VENDOR_RESULT` 并失败命令、写告警/死信;AddDevice 首 ACK 不提前完成。 | - | M06-E-R1 补齐插座命令结果判别。 | +| IOT-006 | MQTT 消息幂等 | M01/M06-C | DONE | `aed36f0` | 上行按租户、设备、Topic 和 payload SHA-256 唯一;QoS 1 重复消息不重复副作用;原始脱敏 payload 与标准化 payload 分开保存,使智慧插座十进制领域字段可真实落库。 | - | M06-R-REGRESSION 统一回归。 | +| IOT-007 | 命令状态机 | M01/M06-C | DONE | `aed36f0` | 结果按命令判别;未知结果失败并写协议告警/死信,AddDevice 首 ACK 不提前完成;插座 `update/paraerror/error` 也实测推进为带明确 failure_code 的 FAILED。 | - | M06-R-REGRESSION 统一回归。 | | DEV-001 | 一键开门与设备动作 | M06-D/M06-F/M08 | PARTIAL | `874b9b8` | 已提供控制箱控电、磁力锁、TTS、LED、订单任务、Sub-1G 门锁和智慧插座控制服务;M08-A 新增顾客端订单权限开门入口,按本人有效订单和时间窗口校验后下发普通开门命令,命令返回 PUBLISHED 而非假成功;顾客端续费/同门店换房入口已接入订单调整 API。 | 真实硬件属于 M06-G;小程序真机开门、续费/换房后的设备动作仍待现场联调。 | 取得硬件后执行真实开门、续费和换房设备联动矩阵。 | | IOT-002 | 控制箱接入 | M06-D | PARTIAL | `dabc656` | `PlayTTS` 已精确发送 `vol/firstPlay/loop/speaker/style/speed/intona` 并按原件范围校验;任务 busy/unconfirm/fail 均保持失败,`record/magstate/taskfinish/Poweron/connected` fixture 与 MySQL 落库通过。 | 缺控制箱实物逐路负载、门磁、TTS 和任务回包联调。 | M06-G 执行实物矩阵。 | | IOT-003 | Sub-1G 门锁绑定 | M06-D | PARTIAL | `dabc656` | `AddDevice` 已发送 `time`;首 ACK 保持 PUBLISHED,最终 subID/subtype 回包才 ACK 并自动固化 701C/701G 父子拓扑,真实 MySQL 已验证。 | 缺现场 `*789#` 与实物配对。 | M06-G 现场配对、超时和换绑验收。 | | IOT-004 | Sub-1G 门锁控制 | M06-D | PARTIAL | `dabc656` | `CtrlDevice` 强制 subtype 14/15,密码/卡片使用 `value` 并精确校验、持久化前哈希脱敏;清空全部和恢复出厂仅平台管理员加确认短语;timeout/full/unconfirm 不会成功 ACK。 | 缺 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 | `dabc656` | `/devicewill/{DeviceID}` 已兼容原始 `close` 并在 MySQL 标记 OFFLINE,不进入非法 JSON 死信;低电量、timeout/full/unconfirm 和未知结果可写开放告警。智慧插座保护告警旧字段结论已撤销,等待 M06-E-R1 按 `special.closeReason` 重建。 | 缺真实硬件离线、保护断电、任务结束和弱信号事件矩阵。 | 先完成 M06-E-R1,再由 M06-G 执行实物烟测。 | +| IOT-005 | 智慧插座接入 | M06-E | PARTIAL | `aed36f0` | 已精确支持 `basicInfo/workInfo/localtask/mqttConfig` 读取,友好任务 DTO 转 `tasktype/cyctype/weekdata/actiontime`,10A/16A/63A 保护配置、parameter canonical `KeyOff`,以及 reboot/emptyPower/returnFactory/setReturnKey 高风险服务;`workInfo` 以十进制字符串标准化。 | 缺 4G 智慧插座实物、DeviceID、生产 MQTT 账号/ACL 和现场负载,未执行真实计量与保护断电联调。 | M06-R 完成协议回归;M06-G 完成实物矩阵。 | +| IOT-008 | 设备告警与离线 | M06/M10 | PARTIAL | `aed36f0` | 裸 `devicewill=close` 可安全离线;智慧插座 `special.closeReason` 3/4/5/6/7 分别生成拔出、充满、超功率、超电流、超温告警,1/2 仅作为本地操作事件;`temp/temperature` 冲突写协议告警与死信。 | 缺真实硬件离线、保护断电、任务结束和弱信号事件矩阵。 | M06-R 完成 fixture 回归,再由 M06-G 执行实物烟测。 | diff --git a/docs/hardware-vendor.md b/docs/hardware-vendor.md index 3f313ea..5a27942 100644 --- a/docs/hardware-vendor.md +++ b/docs/hardware-vendor.md @@ -4,7 +4,7 @@ |---|---|---|---| | 4G 智能门禁控电箱 | 两份厂商协议原件的审计结论已固化到 V5.6;M06-C-R1 已校正 TTS、结果码、事件和原始遗嘱 | PROTOCOL_FIXTURE_PASS | M06-G 取得实物后验证逐路负载、TTS、门磁和任务回包。 | | Sub-1G 智能门锁 | 原件已确认 `AddDevice.time`、`CtrlDevice.subtype/subID/value` 与密码/卡号格式 | PROTOCOL_FIXTURE_PASS | M06-G 以 701C/701G 实物验证配对、开锁、凭据和故障结果。 | -| 4G 智慧插座 | 原件差异已审计并列入 V5.6;旧实现仍含不兼容本地任务和假告警字段 | M06-E-R1 DOING | 立即完成 `workInfo/localtask/protectOff/parameter/special` 校正,再由 M06-G 补实物矩阵。 | +| 4G 智慧插座 | 原件差异已完成 M06-E-R1 校正;精确任务、计量标准化、三档保护、特殊断电与危险维护命令均有 fixture/MySQL 证据 | PROTOCOL_FIXTURE_PASS | M06-G 取得 10A/16A/63A 对应实物后验证计量精度、保护阈值和断电原因。 | | EMQX Broker | 固定主机 `101.42.38.246`;已生成安装说明、ACL 模板、菜单检查和硬件烟测运行器 | PARTIAL | 生产 Ubuntu 安装、端口限制、账号 ACL、DeviceID 和实物到位后运行 `node dist/devices/hardware-smoke-runner.js`。 | 协议资料可用不等于实物验收通过。当前仅可声明 `PROTOCOL_FIXTURE_PASS`;控制箱、门锁、插座、生产 DeviceID、MQTT 账号/ACL 和现场配线仍属于 M06-G `BLOCKED_EXTERNAL`。 diff --git a/docs/module-status.md b/docs/module-status.md index e50ee97..2d3025f 100644 --- a/docs/module-status.md +++ b/docs/module-status.md @@ -3,15 +3,15 @@ ```yaml execution_cursor: current_module: M06 - current_stage: M06-E-R1 + current_stage: M06-R-REGRESSION stage_status: DOING - last_completed_stage: M06-C-R1 - next_stage: M06-R-REGRESSION - last_engineering_commit: `dabc656` + last_completed_stage: M06-E-R1 + next_stage: M08-D-R1 + last_engineering_commit: `36b3b2f` 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-10T16:02:09+08:00 + updated_at: 2026-08-10T19:11:03+08:00 ``` | 模块 | 状态 | 最近提交 | 最近开发日志 | 备注 | @@ -22,7 +22,7 @@ execution_cursor: | 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 模块回归通过。 | | 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 | `dabc656` | docs/devlogs/2026-06-22-M06-C-协议适配与消息幂等.md | M06-C-R1 已按原件校正控制箱/Sub-1G Wire JSON、结果、事件、脱敏和裸遗嘱并通过真实 MySQL;当前进入 M06-E-R1 智慧插座返工。M06-G 仍缺生产 MQTT 账号/ACL、DeviceID 和实物配线,保持 BLOCKED_EXTERNAL。 | +| M06 设备、MQTT 与真实硬件联动 | PARTIAL | `36b3b2f` | docs/devlogs/2026-06-24-M06-E-智慧插座.md | M06-C/E-R1 已按原件校正控制箱、Sub-1G 与智慧插座 Wire/事件/脱敏,并通过 Windows 全量、真实 MySQL 和仓库秘密扫描;当前进入 M06-R-REGRESSION。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 | `0511008` | docs/devlogs/2026-08-10-M08-D-Vue平台后台.md | M08-A/B/C/D 可独立工程内容已完成;Vue 后台已覆盖正式密码登录、短期访问令牌、轮换刷新令牌、401 清理、服务端权限菜单及计划内运营工作区。真实微信、团购和硬件现场验收按 BLOCKED_EXTERNAL 保持 PARTIAL,执行游标已旁路进入 M09-A。 | | 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。 | diff --git a/docs/mqtt-protocol-mapping.md b/docs/mqtt-protocol-mapping.md index e23ada8..19c9d1e 100644 --- a/docs/mqtt-protocol-mapping.md +++ b/docs/mqtt-protocol-mapping.md @@ -1,12 +1,12 @@ # MQTT 协议映射 -M06-C-R1 已依据 V5.6 中完成的两份厂商协议原件审计,校正控制箱与 Sub-1G 门锁的 Wire JSON、上行结果、事件、脱敏和离线处理。智慧插座的原件差异已识别,当前游标在 M06-E-R1,未完成前不得沿用旧 `powerW/temperature/overLoad` 假字段作为有效协议结论。 +M06-C/E-R1 已依据 V5.6 中完成的两份厂商协议原件审计,校正控制箱、Sub-1G 门锁与智慧插座的 Wire JSON、上行结果、事件、脱敏和离线处理。旧 `powerW/temperature/overLoad` 假字段已从生产告警逻辑删除,仅保留负向 fixture 证明其不会触发保护告警。 | 设备 | Topic/命令 | 方向 | 字段 | 状态 | |---|---|---|---|---| | 4G 智能门禁控电箱 | `/devicesend/{DeviceID}`、`/devicewill/{DeviceID}`、`/deviceaccept/{DeviceID}` | 双向 | `basicInfo/mqttConfig/startVoice/task/taskconfig`、`ConctolPower`、`Crldoor`、`PlayTTS/stopTTS`、`CrlLED`、`task/addtask/canceltask` | PROTOCOL_FIXTURE_PASS | | Sub-1G 智能门锁 | 经父控制箱使用相同三个 Topic | 双向 | `AddDevice`、`CtrlDevice`;`open/close/none/setkey/delkey/setcard/delcard/factoryreset` | PROTOCOL_FIXTURE_PASS | -| 4G 智慧插座 | `/devicesend/{DeviceID}`、`/devicewill/{DeviceID}`、`/deviceaccept/{DeviceID}` | 双向 | `basicInfo/workInfo/localtask/mqttConfig`、`on/off`、`localtask/clearTask`、保护配置与特殊断电事件 | M06-E-R1 DOING | +| 4G 智慧插座 | `/devicesend/{DeviceID}`、`/devicewill/{DeviceID}`、`/deviceaccept/{DeviceID}` | 双向 | `basicInfo/workInfo/localtask/mqttConfig`、`on/off`、`localtask/clearTask`、`protectOff/parameter`、危险维护动作与 `special` | PROTOCOL_FIXTURE_PASS | ## M06-A ACL 基线 @@ -37,3 +37,15 @@ M06-C-R1 已依据 V5.6 中完成的两份厂商协议原件审计,校正控 | 门锁动作 | `action=CtrlDevice,subtype,subID,order,id[,value]` | `subtype` 仅 14/15;密码按连续 6 位分组,卡号按连续 8 位十六进制分组;卡号发送大写 | `delkey/delcard value=all` 与 `factoryreset` 仅平台管理员加固定确认短语可下发;凭据管理至少要求门店管理员权限。`magstate`、`taskfinish`、`Poweron`、`connected` 和 `record` 均按事件处理,不进入命令 ACK。 + +## M06-E-R1 智慧插座精确映射 + +| 领域输入/上行 | Canonical Wire/领域字段 | 规则 | +|---|---|---| +| 读取本地任务 | `read=localtask,slotNum,taskNum` | `taskNum=0` 仅表示读取全部;另支持 canonical `read=mqttConfig` | +| `mode/time/weekdays/action` | `cyctype/actiontime/weekdata/tasktype` | once/daycyc/weekcyc;时间固定 HHmm;weekdata 固定周一至周日 7 位 0/1 | +| 保护 DTO + 设备型号/能力 | `setting=protectOff` | `maxCurrent/maxPower` 按 10A/16A/63A 分级校验;自停功率不得高于最大功率 | +| `keyOff` | `setting=parameter,...,KeyOff,id` | 接收兼容 `keyOff/KeyOff`,发送只用 `KeyOff` | +| `onOff/vol/cur/pow/temp|temperature/energy` | `switchOn/voltage/current/power/temperature/energy` | 十进制字符串规范化,不用浮点累计;temp 优先,冲突写协议告警/死信 | + +`special.closeReason` 1/2 是本地按键操作,不生成保护告警;3/4/5/6/7 分别映射 `SOCKET_PULL_OUT_STOP/SOCKET_CHARGE_FULL_STOP/SOCKET_OVERPOWER/SOCKET_OVERCURRENT/SOCKET_OVERTEMPERATURE`。`emptyPower`、`returnFactory`、清空全部任务以及其他危险维护命令要求平台管理员和固定确认短语,复位口令只保存哈希与脱敏值。