Files
qipai/docs/devlogs/2026-08-10-M08-C-管理员员工端.md
T
2026-08-10 11:14:06 +08:00

140 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# M08-C 管理员/员工端
## 2026-08-10 门店概况、房态与订单总览
- `ENGINEERING_DELTA=YES`
- 同一微信小程序根据 `/app-api/auth/me` 的角色动态展示“门店管理”入口;`STAFF``STORE_ADMIN``TENANT_ADMIN``PLATFORM_ADMIN` 可进入,保洁角色继续使用独立任务入口。
- 新增门店运营页,按授权门店切换,展示房间总数、空闲、占用、待处理和活跃订单,并列出完整房态和近期订单。
- 新增 `/app-api/management/stores``/app-api/management/stores/:storeId/rooms``/app-api/management/rooms/:id/status`;读取要求 `store.operation.read`,房态调整和启停要求 `store.operation.write` 或租户/平台管理权限。
- 房态写操作记录 `ROOM_STATUS_UPDATED` 审计日志,metadata 包含门店、配置状态、运营状态和操作原因。
- 新增 `2026081001_m08c_staff_management_access` up/down/verify,为既有 STAFF 角色补 `profile.read``store.operation.read` 最小只读权限;后续登录动态补权逻辑同步更新。
- 新增 `scripts/check-miniapp-m08-c.mjs` 并接入 Windows 全量门禁,覆盖角色入口、页面注册、管理 API、只读/可写按钮和迁移。
- WSL MySQL 8.4.10 往返期间发现并修复两处既有内部问题:M08-A 充值迁移验证的 5 列/2 索引期望漏项导致 M08-B 规则错位;定价仓储误读不存在的 `qipai_rooms.room_category_id`,已改为迁移真实字段 `category_id` 并补契约断言。
## 测试证据
- `powershell -ExecutionPolicy Bypass -File scripts/dev/windows/test-all.ps1`:退出码 0;后端全量测试、后台生产构建、M08-A/B/C 静态验收、迁移计划、固定域名、敏感信息、仓库完整性全部通过。
- WSL 原生临时副本 + MySQL 8.4.10`up → verify → down → up → verify` 退出码 0136 条 up、114 条 verify、130 条 down,临时库与账号自动清理。
- `GET /app-api/management/stores` 与授权门店房态读取:200;STORE_ADMIN 房态更新:200;只有 `store.operation.read` 的 STAFF 房态写入:403。
- 已知非阻塞提示:参考目录既有 xjar 超过 100MBElement Plus 产物 chunk 超过 500kBWSL npm 报告 4 个 high audit 项及 Node 26 allow-scripts 提示,未执行破坏性自动升级。
## 变更影响
- 数据库:新增 STAFF 最小只读权限迁移,可回滚。
- API:新增 3 个小程序管理端点;既有后台管理 API 不变。
- 部署:后端、小程序和数据库迁移有变化;生产更新时必须先备份,再由菜单更新流程执行迁移与后端/小程序发布,未自动部署生产。
- 工程提交:`b70ada0`,已推送并验证 `HEAD == origin/main`
## 状态
M08-C 保持 `DOING`。门店概况、授权房态、订单总览和最小房态操作已完成;下一工程增量继续订单筛选、订单处置和管理员代下单,不移动到 M08-D。
## 2026-08-10 订单处置与管理员代下单
- `ENGINEERING_DELTA=YES`
- 订单查询新增可选 `storeId` 服务端筛选,继续叠加租户、本人订单或管理员授权门店范围,不以小程序本地过滤代替数据权限。
- 管理员小程序新增订单状态筛选、受控状态动作和订单备注;STAFF 只读账号仍不显示写按钮,服务端仓储继续要求 `store.operation.write``tenant.manage` 或平台权限。
- 新增管理员代下单页,可选当前授权门店的启用房间、计价方式和起止时间;前端不提交金额,价格由服务端重新计算。
- `/app-api/management/orders/*` 复用既有后台订单状态机、续时/换房/调时/备注和代下单仓储,写操作统一以 `ADMIN` 来源进入既有门店范围校验。
- 代下单新增同租户有效用户校验,阻止仅凭全局用户 ID 关联其他租户会员;状态历史记录实际管理员,另写 `ORDER_CREATED_ON_BEHALF` 审计,metadata 保留目标会员、门店与房间。
### 测试证据
- `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,验证管理员历史/审计归因和跨租户目标会员拒绝。
- 路由测试覆盖只读账号代下单 403、STORE_ADMIN 代下单 201、管理端订单动作/备注 200、订单 `storeId` 查询参数透传。
- 已知非阻塞提示:参考目录既有 xjar 超过 100MBElement Plus 产物 chunk 超过 500kB;本次 WSL `npm ci` 报告 7 个 high audit 项及 allow-scripts 提示,未执行破坏性自动升级。
### 变更影响
- 数据库:无 schema 迁移;新增运行时 `ORDER_CREATED_ON_BEHALF` 审计数据和订单创建历史归因。
- API:新增小程序管理端订单动作/调整/备注/代下单别名;订单列表增加可选 `storeId`
- 部署:后端与小程序有变化,数据库无迁移;未自动部署生产。
- 工程提交:`566e61b`,已推送并验证 `HEAD == origin/main`
### 状态
M08-C 保持 `DOING`。订单筛选、处置、备注和代下单已形成授权闭环;下一工程增量继续会员检索/概况与员工运营,不移动到 M08-D。
## 2026-08-10 会员检索与员工概况
- `ENGINEERING_DELTA=YES`
- 新增 `/app-api/management/members``/app-api/management/members/:id`,复用既有会员聚合服务及 `user.read`、租户、门店范围校验;授权门店会员可由该店钱包账户或历史 OWNER 订单命中。
- 会员详情展示钱包、订单、优惠券、套餐和最近钱包流水;实付聚合状态修正为当前订单状态 `PAID/RESERVED/IN_PROGRESS/FINISHED`
- 新增 `/app-api/management/staff`,服务端强制 `userType=STAFF`,避免租户管理员账号混入员工列表;返回角色、门店范围、状态、备注和脱敏手机号/最近登录 IP。
- 管理员小程序新增“会员与员工”页,支持会员搜索、聚合详情和员工搜索;代下单页改为从授权会员搜索结果中选择目标会员,取消手工填写全局用户 ID。
- MySQL 8.4.10 实测发现当前 Node 驱动无法执行 `LIMIT ? OFFSET ?`;会员、员工、订单、保洁仓储统一改为夹取整数后拼接分页常量,其余查询过滤继续参数化,并新增静态防回归断言。
### 测试证据
- `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,并验证历史 OWNER 订单会员发现。
- 路由/服务测试覆盖会员列表与详情、钱包/订单门店范围、STAFF 类型限定、脱敏输出及代下单会员选择。
- 已知非阻塞提示:参考目录既有 xjar 超过 100MBElement Plus 产物 chunk 超过 500kBWSL `npm ci` 报告 7 个 high audit 项及 allow-scripts 提示,未执行破坏性自动升级。
### 变更影响
- 数据库:无 schema 迁移;修正会员聚合状态与多个既有列表的 MySQL 分页兼容实现。
- API:新增 3 个小程序管理端会员/员工读取端点;代下单写接口契约不变。
- 部署:后端与小程序有变化,数据库无迁移;未自动部署生产。
- 工程提交:`1b0839e`,已推送并验证 `HEAD == origin/main`
### 状态
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。
## 2026-08-10 管理员验券与门店经营统计
- `ENGINEERING_DELTA=YES`
- 管理员小程序新增“验券与经营”页,支持授权门店切换、近 7/30/90 日统计、平台选择、待支付订单选择、微信扫码或手输券码,以及明确标注的人工确认验券。
- 新增管理端在线验券、人工验券和第三方记录别名;在线验券的应付金额完全由服务端订单推导,人工验券金额必须与未付金额精确一致,所有写操作继续要求门店写权限。
- 核销记录按租户、授权门店、平台和状态筛选,返回券码掩码、操作人、结果和完成时间;原始券码只参与请求,数据库继续只保存 SHA-256 与掩码。
- 新增门店经营统计仓储与 `/app-api/management/statistics`,最长查询 93 天;订单、会员、成功支付渠道/每日收入、当前房态和验券汇总均使用明确时间口径与服务端门店范围。
- 实收金额只累计成功支付,不把未支付订单总价当收入;团购验券成功复用既有事务支付入账和订单状态历史,重复请求继续由 `clientRequestId` 幂等保护。
### 测试证据
- `powershell -ExecutionPolicy Bypass -File scripts/dev/windows/test-all.ps1`:64 秒退出码 0;仓库完整性、敏感信息、后端全量、M08-C 静态验收、迁移计划和 Vue 后台生产构建全部通过。
- WSL 原生临时副本 + MySQL 8.4.10:首次准确发现测试订单超过 30 天提前窗口,修正后又识别窄统计区间的会话时区边界;改为窗口内非冲突订单和跨日确定性区间后,`up → verify → down → up → verify` 通过,136 条 up、114 条 verify、130 条 down。
- MySQL 实际验证管理员验券成功、操作人/门店归因、券码掩码不泄露原值、两笔成功核销、成功支付实收与 `GROUP_BUY` 渠道聚合。
- 路由/服务测试覆盖管理端在线与人工验券、记录筛选参数透传、统计读取、最长 93 天限制和跨门店 403。
- 已知非阻塞提示:参考目录既有 xjar 超过 100MBElement Plus 产物 chunk 超过 500kBWSL `npm ci` 报告 7 个 high audit 项及 allow-scripts 提示,未执行破坏性自动升级。
### 变更影响
- 数据库:无 schema 迁移;新增运行时管理员核销、团购成功支付和统计读取行为。
- API:新增 4 个小程序管理端点,并扩展第三方记录的 `storeId/provider/status` 服务端筛选。
- 部署:后端与小程序有变化,数据库无迁移;未自动部署生产。
- 工程提交:`ce52f07`,已推送并验证 `HEAD == origin/main`
### 状态
M08-C 的可独立工程范围已完成并通过模块级回归,游标进入 `M08-D`。真实团购平台授权、微信后台与硬件现场结果继续保持 `BLOCKED_EXTERNAL`,不把 Mock/发布状态表述为真实厂商或设备执行成功。