From a95e8bf8c8b7c93cf84b38aff0a69ee3a3d75d8a Mon Sep 17 00:00:00 2001 From: Codex Date: Mon, 10 Aug 2026 10:38:10 +0800 Subject: [PATCH] =?UTF-8?q?docs(M08-C):=20=E5=9B=9E=E5=A1=AB=E4=BC=9A?= =?UTF-8?q?=E5=91=98=E6=A3=80=E7=B4=A2=E4=B8=8E=E5=91=98=E5=B7=A5=E6=A6=82?= =?UTF-8?q?=E5=86=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 +-- .../2026-08-10-M08-C-management.md | 10 +++++++ docs/current-baseline.md | 6 ++--- .../2026-08-10-M08-C-management.md | 8 ++++++ docs/devlogs/2026-08-10-M08-C-管理员员工端.md | 27 +++++++++++++++++++ docs/feature-status.md | 3 ++- docs/module-status.md | 4 +-- 7 files changed, 54 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 7a35f5c..530a7fa 100644 --- a/README.md +++ b/README.md @@ -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`。 -- 最近工程提交:`566e61b` / `M08-C管理员订单处置与代下单`,授权门店订单可筛选、受控变更状态、添加备注,并由管理员为同租户有效会员代下单且完整记录操作人。 -- 下一工程目标:继续 M08-C,补会员检索/概况与员工运营入口。 +- 最近工程提交:`1b0839e` / `M08-C会员检索与员工概况`,管理员可在授权范围内检索会员并查看钱包、订单和权益概况,员工入口仅返回 STAFF 账号及其角色、门店范围和脱敏资料。 +- 下一工程目标:继续 M08-C,补保洁任务、设备状态与临时控制入口。 ## 版本递进 diff --git a/docs/api-changelog/2026-08-10-M08-C-management.md b/docs/api-changelog/2026-08-10-M08-C-management.md index a6f3abd..f20b32f 100644 --- a/docs/api-changelog/2026-08-10-M08-C-management.md +++ b/docs/api-changelog/2026-08-10-M08-C-management.md @@ -18,3 +18,13 @@ | POST | `/app-api/management/orders/reserve-on-behalf` | 同上 | 为同租户有效会员预占授权门店房间,服务端计算价格,状态历史与审计记录真实管理员。 | 代下单请求体包含 `userId`、`roomId`、`startAt`、`endAt`、`pricingMode`;跨租户或失效用户返回 404,越权门店返回 403,只读 STAFF 返回 403。 + +## 会员检索与员工概况增量 + +| 方法 | 路径 | 权限 | 结果 | +|---|---|---|---| +| GET | `/app-api/management/members` | `user.read`,并叠加租户与授权门店范围 | 按昵称/手机号搜索会员;门店范围以该门店钱包账户或历史 OWNER 订单为准,返回脱敏手机号和聚合概况。 | +| GET | `/app-api/management/members/:id` | 同上 | 返回会员钱包、订单、优惠券、套餐和最近钱包流水;越权会员不可见。 | +| GET | `/app-api/management/staff` | `user.read`,并叠加租户与授权门店范围 | 强制仅查询 `userType=STAFF`,返回角色、门店范围、状态、备注及脱敏手机号/最近登录 IP。 | + +管理员代下单页改为调用会员检索接口选择目标会员,不再要求手工输入全局用户 ID。列表分页参数继续由服务端夹取为安全整数;MySQL 查询不再绑定 `LIMIT/OFFSET` 占位符,以兼容当前 MySQL 8.4 驱动组合。 diff --git a/docs/current-baseline.md b/docs/current-baseline.md index f6dab8e..ffb2407 100644 --- a/docs/current-baseline.md +++ b/docs/current-baseline.md @@ -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 DONE;MySQL 已验证 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/utils/api.js`、`scripts/check-miniapp-m08-a.mjs` | M08 PARTIAL;M08-A 顾客端工程闭环按外部阻塞旁路,M08-B 已支持保洁任务大厅、我的任务、接单、开始、照片上传、提交验收、驳回补做、订单结束自动建任务、统计、管理侧查询/指派/验收/驳回/免清洁、超时回收、协作者查看/添加/移除、待结算候选、正式结算单生成/确认、发放记录、微信转账预检、主动同步、通知回调、后台协作者管理、结算详情、统计明细、每日趋势、保洁员资料管理、手机号维护和微信绑定状态,仍不能标记 DONE | +| 微信小程序 | 已纳管微信原生模板,并完成顾客端订单、充值、权益明细、下单抵扣主体链路、保洁任务端照片上传/补做主体链路,以及管理员门店/房态/订单/代下单/会员/员工运营首段 | `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 PARTIAL;M08-A 顾客端工程闭环按外部阻塞旁路;M08-B 可独立工程内容已完成;M08-C 已形成授权门店房态、订单处置、管理员代下单、会员检索/概况和 STAFF 员工概况闭环,继续保洁、设备、临时控制和经营统计 | | 数据库迁移 | 已新增 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 DONE;WSL 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-B:在已完成保洁任务底表、权限、任务大厅、我的任务、接单、开始、照片上传、提交验收、驳回补做、订单结束自动建任务、统计、管理侧查询/指派/验收/驳回/免清洁/批量免清洁、免清洁统计展示、超时回收、协作者查看/添加/移除、待结算候选、正式结算单生成/确认、微信转账预检、主动同步、通知回调、后台协作者管理、结算详情、统计明细、每日趋势、保洁员资料管理、手机号维护、微信绑定状态、联调检查项搜索和联调筛选结果导出和筛选清除基础上,补更完整保洁运营管理界面。 +1. 继续 M08-C:在已完成门店概况、授权房态、订单筛选/处置/备注、管理员代下单、会员检索/概况和 STAFF 员工概况基础上,补管理员保洁任务、设备状态、临时开门/电控和经营统计。 2. 继续复用 M03 门店发现、M04 订单、M05 支付、M06 设备联动和 M07 会员营销后端能力,不重复初始化小程序。 3. M06-G 真实硬件联调仍等待生产 MQTT 账号/ACL、DeviceID 和现场实物配线。 diff --git a/docs/db-changelog/2026-08-10-M08-C-management.md b/docs/db-changelog/2026-08-10-M08-C-management.md index 3519866..77d3eb2 100644 --- a/docs/db-changelog/2026-08-10-M08-C-management.md +++ b/docs/db-changelog/2026-08-10-M08-C-management.md @@ -13,3 +13,11 @@ - 管理员代下单的 `qipai_order_status_history.actor_id/source` 记录实际管理员与 `ADMIN`;`metadata.targetUserId` 记录目标会员。 - 同事务新增 `qipai_audit_logs.action = ORDER_CREATED_ON_BEHALF`,metadata 记录目标会员、门店和房间。 - WSL MySQL 8.4.10 已验证管理员归因、审计落库、跨租户目标会员拒绝,以及完整 `up → verify → down → up → verify` 往返。 + +## 会员检索与员工概况增量 + +- 无 schema 迁移。 +- 授权门店会员范围由“该门店存在钱包账户”扩展为“该门店存在钱包账户或历史 OWNER 订单”,终态订单撤销当前访问后仍可用于历史会员归属;条件使用显式括号保持租户隔离。 +- 会员实付聚合状态改为当前订单状态 `PAID/RESERVED/IN_PROGRESS/FINISHED`,不再引用旧状态 `IN_USE/COMPLETED`。 +- 会员、员工、订单和保洁列表分页在服务端夹取整数后拼入 `LIMIT/OFFSET`,其余过滤条件继续参数化;修复 MySQL 8.4.10 与当前 Node 驱动对分页占位符的兼容错误。 +- WSL MySQL 8.4.10 已验证授权门店历史 OWNER 订单会员发现、STAFF 类型限定与完整迁移往返。 diff --git a/docs/devlogs/2026-08-10-M08-C-管理员员工端.md b/docs/devlogs/2026-08-10-M08-C-管理员员工端.md index 8565621..2f736d9 100644 --- a/docs/devlogs/2026-08-10-M08-C-管理员员工端.md +++ b/docs/devlogs/2026-08-10-M08-C-管理员员工端.md @@ -55,3 +55,30 @@ M08-C 保持 `DOING`。门店概况、授权房态、订单总览和最小房态 ### 状态 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 超过 100MB;Element Plus 产物 chunk 超过 500kB;WSL `npm ci` 报告 7 个 high audit 项及 allow-scripts 提示,未执行破坏性自动升级。 + +### 变更影响 + +- 数据库:无 schema 迁移;修正会员聚合状态与多个既有列表的 MySQL 分页兼容实现。 +- API:新增 3 个小程序管理端会员/员工读取端点;代下单写接口契约不变。 +- 部署:后端与小程序有变化,数据库无迁移;未自动部署生产。 +- 工程提交:`1b0839e`,已推送并验证 `HEAD == origin/main`。 + +### 状态 + +M08-C 保持 `DOING`。会员检索、聚合详情、STAFF 员工概况和代下单会员选择已完成;下一工程增量继续保洁任务、设备状态与临时控制,不移动到 M08-D。 diff --git a/docs/feature-status.md b/docs/feature-status.md index 1ed79c5..ea6db5b 100644 --- a/docs/feature-status.md +++ b/docs/feature-status.md @@ -8,6 +8,8 @@ > 2026-08-10 M08-C 增量:工程提交 `566e61b` 为 `ORD-001`、`AUTH-002`、`ADM-001` 补管理员订单筛选、状态处置、备注和代下单;服务端门店范围、写权限、同租户有效会员校验、管理员状态历史/审计归因及跨租户拒绝均通过 Windows 全量和 WSL MySQL 8.4.10 往返。M08-C 保持 `DOING`,继续会员与员工运营。 +> 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 继续保洁与设备运营。 + | ID | 功能 | 模块子阶段 | 状态 | 最近提交 | 测试/验收证据 | 阻塞原因 | 下一步 | |---|---|---|---|---|---|---|---| | ENV-001 | 固定 Windows 工作区 | M00-A/M00-B | DONE | 远端 HEAD | 已确认 `D:\qipai`,Git 根、main 分支、固定 origin 和 push 校验通过。 | - | 后续每模块继续复检。 | @@ -64,4 +66,3 @@ | 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。 | - diff --git a/docs/module-status.md b/docs/module-status.md index a0a80dc..3843d65 100644 --- a/docs/module-status.md +++ b/docs/module-status.md @@ -7,11 +7,11 @@ execution_cursor: stage_status: DOING last_completed_stage: M07-D next_stage: M08-C - last_engineering_commit: `566e61b` + last_engineering_commit: `1b0839e` 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:20:56+08:00 + updated_at: 2026-08-10T10:36:37+08:00 ``` | 模块 | 状态 | 最近提交 | 最近开发日志 | 备注 |