Files
qipai/docs/devlogs/2026-06-25-M08-B-保洁端.md
T
2026-07-02 08:10:37 +08:00

285 lines
28 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-B 保洁端
## 本次工程增量
- 新增 `2026062525_m08b_cleaner_tasks` 迁移,建立 `qipai_cleaning_tasks``qipai_cleaning_task_events`,覆盖 WAITING、CLAIMED、STARTED、SUBMITTED、COMPLETED、REJECTED、EXEMPT、SETTLED、CANCELLED 状态和事件追踪。
- 权限补齐 `cleaning.task.write``cleaning.statistics.read``CLEANER`、门店管理员、租户管理员和平台管理员可获得保洁任务读写与统计能力。
- 新增 `CleaningTaskRepository``/app-api/cleaning/*` 路由:任务大厅、我的任务、接单、开始、提交验收和个人统计均要求登录态与保洁权限。
- 生产 `server.ts` 注入真实保洁仓储,迁移 runner 纳入 M08-B 数据库迁移。
- 小程序新增 `pages/cleaner/tasks`,调用真实 app-api 展示任务大厅、我的任务、待结算统计,并支持接单、开始和提交照片 URL 验收。
- `scripts/check-miniapp-m08-a.mjs` 扩展为同时检查 M08-A 顾客端与 M08-B 保洁端页面注册和真实接口调用。
## 2026-06-26 增量
- `/app-api/cleaning/tasks/:taskId/photos` 接入受控图片上传:保洁员必须登录且拥有当前任务,任务状态必须为 `STARTED``REJECTED`,上传后复用 `MediaStorage` 压缩为 WebP 并返回固定 `https://api.txyundm.cn/uploads/...` URL。
- `/app-api/cleaning/tasks/:taskId/submit` 改为必须提交至少一张照片;`REJECTED` 任务允许再次提交,提交后清空驳回原因并记录事件。
- 新增 `/app-api/cleaning/tasks/:taskId/rework`,保洁员可将本人 `REJECTED` 任务重新转为 `STARTED`,清空旧照片和驳回原因,进入补做流程。
- `OrderStateRepository` 在订单状态进入 `FINISHED` 时通过同一事务调用 `CleaningTaskRepository.createForFinishedOrder`,按 `order_id` 唯一键幂等创建 `WAITING` 保洁任务并写入 `AUTO_CREATE` 事件。
- 小程序保洁端将手工照片 URL 文本框改为相机/相册选择图片,上传成功后再提交验收;驳回任务显示原因并提供“重做”入口。
- 修复 `marketing-benefit-service.test.mjs` 中固定订单时间导致 2026-06-26 后自然过期的问题,改为相对未来时间,避免测试随日期漂移失效。
## 2026-06-26 继续增量
- 新增管理侧保洁任务查询 `/admin-api/cleaning/tasks`,按管理员门店范围和状态筛选任务。
- 新增管理侧指派 `/admin-api/cleaning/tasks/:taskId/assign`,指派前校验被指派用户为有效 `CLEANER` 且拥有任务门店范围。
- 新增管理侧验收 `/admin-api/cleaning/tasks/:taskId/complete`,将 `SUBMITTED` 任务转为 `COMPLETED` 并记录事件。
- 新增管理侧驳回 `/admin-api/cleaning/tasks/:taskId/reject`,写入驳回原因并允许保洁端进入补做链路。
- 新增 `/admin-api/cleaning/settlement-candidates`,返回 `COMPLETED` 且未结算的任务,作为后续结算单生成前置。
## 2026-06-26 结算增量
- 新增 `2026062626_m08b_cleaning_settlements` 迁移,建立保洁结算单主表和明细表,任务明细唯一进入一个结算单。
- 新增 `cleaning.settlement.read``cleaning.settlement.write` 权限,保洁员可读本人结算相关能力,门店/租户/平台管理员可生成和确认结算。
- 新增 `GET /admin-api/cleaning/settlements``POST /admin-api/cleaning/settlements``POST /admin-api/cleaning/settlements/:id/confirm`,支持从已完成未结算任务生成 `DRAFT` 结算单并确认到 `CONFIRMED`
- 结算生成会锁定当前候选任务,写入结算明细,固化任务奖励金额,并把任务转为 `SETTLED`,避免同一任务重复结算。
- 新增 `POST /admin-api/cleaning/reclaim-timeouts`,可按分钟阈值和数量限制回收超时停留在 `CLAIMED`/`STARTED` 的任务,恢复到任务大厅。
## 2026-06-26 多人协作增量
- 新增 `2026062627_m08b_cleaning_collaboration` 迁移,建立 `qipai_cleaning_task_members`,支持 `LEAD` 负责人和 `ASSIST` 协作者、成员分账金额、移除和成员维度结算时间。
- 调整 `qipai_cleaning_settlement_items`,新增 `cleaner_user_id`,唯一键从“任务唯一”升级为“任务 + 保洁员唯一”,允许同一协作任务按成员分别进入不同保洁员结算单。
- `CleaningTaskRepository` 在接单、指派和验收时自动维护负责人成员;重新指派会撤掉旧未结算负责人,避免同一任务出现多个有效 `LEAD`
- 新增管理侧成员接口:查看成员、添加/更新协作者、移除未结算协作者。协作者必须拥有 `CLEANER` 角色和任务门店范围,协作者分账总额不能超过任务奖励。
- `GET /app-api/cleaning/tasks/mine``GET /app-api/cleaning/stats` 扩展为负责人/协作者视角;待结算金额按成员分账金额统计。
- 结算生成改为按成员 `reward_cents` 生成明细,单个成员结算后只标记该成员 `settled_at`;所有有效成员均结清后任务才整体转为 `SETTLED`
## 2026-06-27 发放闭环增量
- 新增 `2026062728_m08b_cleaning_payouts` 迁移,为 `qipai_cleaning_settlements` 增加 `paid_by``payout_channel``payout_reference``payout_error`,记录保洁结算发放操作人、渠道、外部流水号和失败原因。
- 新增 `POST /admin-api/cleaning/settlements/:settlementId/paid`,仅允许管理员将 `CONFIRMED` 结算单标记为 `PAID`,写入发放渠道、流水号、发放人和 `paid_at`,并清空旧失败原因。
- 新增 `POST /admin-api/cleaning/settlements/:settlementId/payout-failure`,仅允许对 `CONFIRMED` 结算单记录发放失败原因,保留 `CONFIRMED` 状态,支持修复外部付款后重试。
- 结算单查询返回新增发放字段,管理端后续可以直接展示发放状态、渠道流水和失败原因。
## 2026-06-27 微信转账适配增量
- `WechatPayClient` 新增微信支付商家转账请求能力,按商户转账单号、转账场景、openid、金额、备注、通知地址和场景报备信息发起 `POST /v3/fund-app/mch-transfer/transfer-bills`,并解析微信转账单号、状态、失败原因和 `package_info`
- 新增 `CleaningPayoutService`,从结算单解析租户、门店、保洁员、金额和状态,复用门店/全局微信收款账户与环境凭据,校验商户号一致、收款账户已授权、保洁员存在微信 openid,再执行真实微信转账或测试 Mock。
- 新增 `QIPAI_CLEANING_PAYOUT_MOCK_ENABLED`,仅非生产环境允许 Mock 发放;生产环境不会因为误配打开 Mock。
- 新增 `2026062729_m08b_cleaning_transfer_state` 迁移,为保洁结算单增加 `payout_state``payout_package_info`,记录 `SUCCESS``FAIL``WAIT_USER_CONFIRM``PROCESSING` 等微信转账中间态。
- 新增 `POST /admin-api/cleaning/settlements/:settlementId/wechat-transfer`,管理员可对 `CONFIRMED` 结算单发起微信转账;成功直接落 `PAID`,失败记录失败原因,待用户确认/处理中则保留 `CONFIRMED` 并写入中间态和微信 package 信息,便于后续查询或回调闭环。
## 2026-06-29 微信转账回调与轮询增量
- `WechatPayClient` 新增商户单号查询微信商家转账接口,按 `out_bill_no` 调用微信查询 API 并解析商户号、微信转账单号、状态、失败原因和转账金额。
- `CleaningPayoutService.syncWechatTransfer` 新增主动轮询闭环:管理员可对已发起微信转账的 `CONFIRMED` 结算单同步微信状态;`SUCCESS` 自动标记 `PAID``FAIL` 记录失败原因,其它中间态继续保留 `CONFIRMED` 并更新 `payout_state`
- `CleaningPayoutService.processWechatTransferNotification` 新增微信转账通知处理:按微信平台证书序列号选择凭据、验签解密原始通知、校验商户号,再通过商户单号或微信转账单号定位结算单并写回成功、失败或中间态。
- 新增 `POST /admin-api/cleaning/settlements/:settlementId/wechat-transfer/sync`,用于后台手动同步或后续定时轮询调用。
- 新增 `POST /app-api/cleaning/wechat-transfer/notify`,免登录接收微信转账回调,使用流式 `preParsing` 捕获原始 body,避免验签因 JSON 重序列化失效。
## 2026-06-29 保洁管理后台增量
- `admin/` 从空目录升级为 Vue3 + Vite + TypeScript + Element Plus 后台工程,构建基址固定为 `/admin/`,生产后台 API 固定为 `https://api.txyundm.cn/admin-api`
- 新增保洁运营首屏,支持后台访问令牌本地保存、任务/结算双标签、待验收/完成/待发放/本页金额概览,并适配桌面、平板和手机浏览器。
- 新增保洁任务管理面板:按状态筛选任务,查看门店/房间/保洁员/成员/奖励/照片数量,支持指派、验收、驳回和超时回收。
- 新增保洁结算管理面板:按状态筛选结算单,支持生成结算单、确认结算、发起微信转账、同步微信转账状态和记录发放失败。
- 新增 `scripts/check-admin-m08-b.mjs` 并接入 Windows `test-all.ps1`,静态检查后台依赖、固定域名、构建基址、M08-B API 封装和关键控件。
## 2026-06-29 微信转账预检增量
- `CleaningPayoutService` 新增 `preflightWechatTransfer`,不触发真实转账,仅读取结算单、收款账户、微信支付凭据元数据和保洁员 openid,返回脱敏商户号、凭据引用、场景 ID、报备项数量、通知地址、平台证书数量和逐项 PASS/WARN/FAIL。
- 新增 `GET /admin-api/cleaning/settlements/:settlementId/wechat-transfer/preflight`,管理员可在真实商户转账前检查结算单状态、金额、收款账户授权、商户号匹配、场景报备配置、通知证书和保洁员 openid。
- 后台结算面板新增“预检”操作和结果弹窗,展示真实转账前置条件是否满足,帮助现场联调前明确缺失项。
- `scripts/check-admin-m08-b.mjs` 扩展检查微信转账预检 API 封装和后台控件。
## 2026-06-30 后台协作与结算详情增量
- 新增 `GET /admin-api/cleaning/settlements/:settlementId`,按租户和门店数据范围返回结算单主信息与固化结算明细,包含任务号、订单号、门店、房间、保洁员、成员分账金额和完成时间。
- 后台任务面板新增“成员”入口,可查看负责人/协作者、分账金额和结算状态,并支持添加/更新协作者与移除未结算协作者。
- 后台结算面板新增“详情”入口,可查看结算单任务明细、转账状态、外部流水、失败原因和备注,避免管理员只能从列表猜测结算口径。
- `scripts/check-admin-m08-b.mjs` 扩展检查协作者管理、结算详情和对应 API 封装。
## 2026-06-30 统计明细增量
- 新增 `GET /admin-api/cleaning/statistics`,支持按开始日期、结束日期和门店 ID 筛选,按登录管理员的租户与门店数据范围裁剪统计。
- 管理侧统计返回任务状态分布、门店任务明细、结算状态金额和成员分账排行,明确待验收、待结算、待发放、已发放和成员分账口径。
- 后台新增“统计”标签页,展示任务状态、结算口径、门店明细和成员分账;首屏四个指标改为使用管理侧统计接口,不再依赖当前分页粗略汇总。
- `scripts/check-admin-m08-b.mjs` 扩展检查统计标签页、统计 API 封装和关键统计展示控件。
## 2026-06-30 保洁员资料管理增量
- `/admin-api/users` 新增 `role` 查询参数,支持后台按 `CLEANER``STAFF``STORE_ADMIN``TENANT_ADMIN` 筛选员工,继续复用员工管理权限和门店数据范围。
- 后台统计页新增“今日/近7天/本月”快捷周期,自动生成闭区间起始日和次日/次月结束日并刷新管理统计。
- 后台新增“保洁员”标签页,支持按状态和关键词筛选保洁员,查看门店范围、备注、最近登录和脱敏 IP。
- 后台保洁员资料管理接入已有员工 API,支持创建 `CLEANER`、编辑姓名/门店范围/备注、启用/停用和重置会话。
## 2026-06-30 统计趋势增量
- 管理侧 `GET /admin-api/cleaning/statistics` 在原有状态分布、门店明细、结算口径和成员分账排行基础上追加 `trend`,按任务创建日期聚合每日任务总数、待验收、完成、驳回、奖励和已发放金额。
- 后台统计页新增“每日趋势”区块,使用响应式条形行展示每日任务量,并并列呈现待验、完成、驳回、奖励和发放金额,方便运营按周期筛选后查看波动。
- `scripts/check-admin-m08-b.mjs` 扩展检查每日趋势控件和发放金额字段,避免后续后台改动丢失趋势展示。
## 2026-06-30 保洁员资料细节增量
- `/admin-api/users` 列表返回新增 `avatarUrl``wechatMiniappBound`,后台可判断保洁员是否已绑定微信小程序 openid,为真实微信转账资料预检提供更直观的人员资料状态。
- 后台“保洁员”列表新增资料标签,展示“已绑微信/未绑微信”和“资料完整/待补资料”,资料完整度按微信绑定、门店范围和姓名综合判断。
- 后台保洁员编辑弹窗补手机号维护,提交时透传 `phone` 到既有员工更新接口,继续保留 `CLEANER` 角色和门店范围约束。
- `scripts/check-admin-m08-b.mjs` 扩展检查微信绑定、资料完整度和保洁员资料标签,`backend/tests/user-management.test.mjs` 覆盖手机号更新透传。
## 2026-06-30 保洁员选择器增量
- 后台任务指派弹窗从手填“保洁员用户 ID”升级为可搜索保洁员选择器,选项展示姓名、用户 ID、脱敏手机号、门店范围和微信绑定状态,降低现场运营输错 ID 的风险。
- 后台任务协作者管理同样接入保洁员选择器,添加/更新协作者前先拦截空选择,并继续保留成员分账金额和备注录入。
- 后台生成保洁结算单接入保洁员选择器,管理员从已加载的 `CLEANER` 列表选择人员后生成结算单,门店 ID 仍作为可选过滤条件。
- `scripts/check-admin-m08-b.mjs` 扩展检查任务、结算组件中的 `el-select``cleanerLabel` 以及选择器样式,避免后续回退到纯 ID 输入。
## 2026-06-30 任务结算筛选增量
- 管理侧 `GET /admin-api/cleaning/tasks` 新增 `storeId``cleanerUserId` 查询参数;保洁员筛选同时匹配负责人和未移除协作者,继续受管理员门店数据范围裁剪。
- 管理侧 `GET /admin-api/cleaning/settlements` 新增 `storeId``cleanerUserId` 查询参数,便于财务按门店、保洁员和结算状态定位待确认、待发放或异常结算单。
- 后台任务列表和结算列表新增门店 ID 输入、保洁员下拉和筛选按钮,筛选条件会随分页、状态切换和刷新进入真实 admin-api 请求。
- `backend/tests/cleaning-route.test.mjs` 覆盖任务/结算筛选参数透传;`scripts/check-admin-m08-b.mjs` 扩展检查筛选控件、API 参数和样式。
## 2026-06-30 任务详情照片预览增量
- 后台任务列表新增“详情”入口,管理员可在弹窗中查看任务号、状态、奖励、保洁员、门店房间、订单、保洁要求和驳回原因。
- 任务详情弹窗新增领取、开始、提交和完成时间线,减少验收/驳回时在列表列之间来回查找。
- 任务详情弹窗支持保洁照片缩略图与大图预览;无照片时显示空状态,便于待验收任务快速确认现场材料。
- `scripts/check-admin-m08-b.mjs` 扩展检查任务详情弹窗、照片预览和时间线控件。
## 验收结果
- `npm run build``backend/`):PASS。
- `node scripts/check-miniapp-m08-a.mjs`PASS。
- `node tests/cleaning-route.test.mjs`PASS。
- `node tests/migration-contract.test.mjs`PASS。
- `node tests/migration-runner.test.mjs`PASS。
- `npm test``backend/`):PASS。
- 2026-06-26 追加验证:
- `node tests/cleaning-route.test.mjs`PASS,覆盖 `rework` 和照片上传路由。
- `npm test -- --runInBand``backend/`):PASS。
- `node scripts/check-miniapp-m08-a.mjs`PASS。
- 继续增量后 `npm test -- --runInBand``backend/`):PASS,覆盖管理侧指派、验收、驳回和待结算候选路由。
- 结算增量后 `npm test -- --runInBand``backend/`):PASS,覆盖结算迁移、结算单路由和超时回收路由。
- 结算增量后 `node scripts/check-miniapp-m08-a.mjs`PASS。
- 多人协作增量后 `npm run build``backend/`):PASS。
- 多人协作增量后 `node tests/migration-contract.test.mjs`PASS。
- 多人协作增量后 `node tests/migration-runner.test.mjs`PASS。
- 多人协作增量后 `node tests/cleaning-route.test.mjs`:PASS,覆盖成员查看、添加和移除路由。
- 发放闭环增量后 `npm run build``backend/`):PASS。
- 发放闭环增量后 `node tests/migration-contract.test.mjs`PASS。
- 发放闭环增量后 `node tests/migration-runner.test.mjs`PASS。
- 发放闭环增量后 `node tests/cleaning-route.test.mjs`:PASS,覆盖结算发放成功和发放失败记录路由。
- 微信转账适配增量后 `npm run build``backend/`):PASS。
- 微信转账适配增量后 `node tests/wechat-pay.test.mjs`:PASS,覆盖商家转账请求签名与载荷。
- 微信转账适配增量后 `node tests/cleaning-payout-service.test.mjs`:PASS,覆盖真实 API 成功、失败、待确认和 Mock 门禁。
- 微信转账适配增量后 `node tests/cleaning-route.test.mjs`PASS,覆盖微信转账路由。
- 微信转账适配增量后 `node tests/migration-contract.test.mjs`PASS。
- 微信转账适配增量后 `node tests/migration-runner.test.mjs`PASS。
- 微信转账适配增量后 `node scripts/check-miniapp-m08-a.mjs`PASS。
- 微信转账适配增量后 `npm test``backend/`):PASS。
- 微信转账回调与轮询增量后 `npm run build``backend/`):PASS。
- 微信转账回调与轮询增量后 `node tests/wechat-pay.test.mjs`:PASS,覆盖商户单号查询转账单请求。
- 微信转账回调与轮询增量后 `node tests/cleaning-payout-service.test.mjs`:PASS,覆盖主动同步成功/失败/处理中和微信通知成功落库。
- 微信转账回调与轮询增量后 `node tests/cleaning-route.test.mjs`:PASS,覆盖后台同步路由和免登录微信通知路由。
- 微信转账回调与轮询增量后 `npm test``backend/`):PASS。
- 保洁管理后台增量后 `npm run build``admin/`):PASS。
- 保洁管理后台增量后 `npm audit --omit=dev``admin/`):PASS0 vulnerabilities。
- 保洁管理后台增量后 `node scripts/check-admin-m08-b.mjs`PASS。
- 微信转账预检增量后 `npm run build``backend/`):PASS。
- 微信转账预检增量后 `node tests/cleaning-payout-service.test.mjs`:PASS,覆盖配置齐全、缺场景报备和缺 openid 的预检结果。
- 微信转账预检增量后 `node tests/cleaning-route.test.mjs`PASS,覆盖后台预检路由。
- 微信转账预检增量后 `node scripts/check-admin-m08-b.mjs`PASS。
- 微信转账预检增量后 `npm run build``admin/`):PASS。
- 后台协作与结算详情增量后 `npm run build``backend/`):PASS。
- 后台协作与结算详情增量后 `npm run build``admin/`):PASS。
- 后台协作与结算详情增量后 `node tests/cleaning-route.test.mjs`PASS,覆盖结算单详情路由。
- 后台协作与结算详情增量后 `node scripts/check-admin-m08-b.mjs`PASS。
- 后台协作与结算详情增量后 `npm test``backend/`):PASS。
- 统计明细增量后 `npm run build``backend/`):PASS。
- 统计明细增量后 `npm run build``admin/`):PASS。
- 统计明细增量后 `node tests/cleaning-route.test.mjs`PASS,覆盖管理侧统计路由。
- 统计明细增量后 `node scripts/check-admin-m08-b.mjs`PASS。
- 统计明细增量后 `npm test``backend/`):PASS。
- 保洁员资料管理增量后 `npm run build``backend/`):PASS。
- 保洁员资料管理增量后 `npm run build``admin/`):PASS。
- 保洁员资料管理增量后 `node tests/user-management.test.mjs`PASS,覆盖 `role=CLEANER` 员工筛选。
- 保洁员资料管理增量后 `node scripts/check-admin-m08-b.mjs`PASS。
- 统计趋势增量后 `npm run build``backend/`):PASS。
- 统计趋势增量后 `npm run build``admin/`):PASS。
- 统计趋势增量后 `node tests/cleaning-route.test.mjs`:PASS,覆盖管理统计趋势字段透传。
- 统计趋势增量后 `node scripts/check-admin-m08-b.mjs`PASS。
- 保洁员资料细节增量后 `npm run build``backend/`):PASS。
- 保洁员资料细节增量后 `npm run build``admin/`):PASS。
- 保洁员资料细节增量后 `node tests/user-management.test.mjs`PASS,覆盖手机号更新透传。
- 保洁员资料细节增量后 `node scripts/check-admin-m08-b.mjs`PASS。
- 保洁员选择器增量后 `npm run build``admin/`):PASS。
- 保洁员选择器增量后 `node scripts/check-admin-m08-b.mjs`PASS。
- 任务结算筛选增量后 `npm run build``backend/`):PASS。
- 任务结算筛选增量后 `npm run build``admin/`):PASS。
- 任务结算筛选增量后 `node tests/cleaning-route.test.mjs`:PASS,覆盖任务/结算筛选参数透传。
- 任务结算筛选增量后 `node scripts/check-admin-m08-b.mjs`PASS。
- 任务详情照片预览增量后 `npm run build``admin/`):PASS。
- 任务详情照片预览增量后 `node scripts/check-admin-m08-b.mjs`PASS。
- 统计按保洁员筛选增量后 `npm run build``backend/`):PASS。
- 统计按保洁员筛选增量后 `npm run build``admin/`):PASS。
- 统计按保洁员筛选增量后 `node backend/tests/cleaning-route.test.mjs`PASS,覆盖管理统计 `cleanerUserId` 参数透传。
- 统计按保洁员筛选增量后 `node scripts/check-admin-m08-b.mjs`PASS。
- 待结算候选预览增量后 `npm run build``backend/`):PASS。
- 待结算候选预览增量后 `npm run build``admin/`):PASS。
- 待结算候选预览增量后 `node backend/tests/cleaning-route.test.mjs`:PASS,覆盖候选接口门店/保洁员筛选参数透传。
- 待结算候选预览增量后 `node scripts/check-admin-m08-b.mjs`PASS。
- 结算候选导出增量后 `npm run build``admin/`):PASS。
- 结算候选导出增量后 `node scripts/check-admin-m08-b.mjs`PASS。
- 任务事件流水增量后 `npm run build``backend/`):PASS。
- 任务事件流水增量后 `npm run build``admin/`):PASS。
- 任务事件流水增量后 `node backend/tests/cleaning-route.test.mjs`PASS,覆盖任务事件流水路由。
- 任务事件流水增量后 `node scripts/check-admin-m08-b.mjs`PASS。
## 2026-06-30 统计按保洁员筛选增量
- 后端 `GET /admin-api/cleaning/statistics` 新增 `cleanerUserId` 查询参数,任务统计按负责人或有效协作者过滤,结算统计和每日已发放金额按结算单保洁员过滤。
- 后台统计页新增可搜索保洁员选择器,与任务列表和结算列表的筛选口径保持一致,支持按单个保洁员定位待验收、待结算、已发放和每日趋势。
- `backend/tests/cleaning-route.test.mjs` 补充管理统计筛选参数透传断言,`scripts/check-admin-m08-b.mjs` 补充统计页保洁员筛选控件检查。
## 2026-06-30 待结算候选预览增量
- 后端 `GET /admin-api/cleaning/settlement-candidates` 新增 `storeId``cleanerUserId` 查询参数,候选任务继续限定为 `COMPLETED` 且未结算,保洁员筛选覆盖负责人和未移除、未结算协作者。
- 后台结算页新增“候选”入口,可按当前门店/保洁员筛选预览待结算任务、当前页金额、房间、负责人和完成时间,并可将当前筛选带入生成结算单弹窗。
- `backend/tests/cleaning-route.test.mjs` 补充候选接口筛选参数透传断言,`scripts/check-admin-m08-b.mjs` 补充后台候选预览控件检查。
## 2026-06-30 结算候选导出增量
- 后台结算页新增当前结算列表 CSV 导出,包含结算单号、状态、保洁员、门店、任务数、金额、转账状态、外部流水、失败原因和创建时间。
- 待结算候选弹窗新增当前页候选任务 CSV 导出,包含任务号、订单号、门店、房间、保洁员 ID、金额和完成时间,便于财务或线下核对。
- 导出实现使用浏览器 Blob 和 UTF-8 BOM,未新增第三方依赖;`scripts/check-admin-m08-b.mjs` 补充导出入口检查。
## 2026-06-30 任务事件流水增量
- 后端新增 `GET /admin-api/cleaning/tasks/:taskId/events`,按租户和管理员门店范围返回任务最近 50 条事件流水,覆盖动作、from/to 状态、操作人、traceId、备注和创建时间。
- 后台任务详情弹窗新增“操作流水”表格,验收、驳回、回收、协作者变更、结算成员等操作可从任务详情直接追溯。
- `backend/tests/cleaning-route.test.mjs` 补充任务事件流水路由断言,`scripts/check-admin-m08-b.mjs` 补充后台任务详情流水检查。
## 2026-07-02 批量验收驳回增量
- 后台任务列表新增多选列,仅允许选择 `SUBMITTED` 待验收任务,避免把进行中、已完成或已结算任务误纳入批量处理。
- 后台任务工具栏新增“批量验收”和“批量驳回”;批量验收复用现有单任务验收 API 顺序执行,批量驳回要求管理员输入统一驳回原因后再提交。
- 父级工作台新增 `handleCompleteMany``handleRejectMany`,批量处理完成后同步刷新任务列表和统计概览,保持待验收、完成、待结算金额实时更新。
- `scripts/check-admin-m08-b.mjs` 扩展检查批量验收、批量驳回、已选择待验收任务过滤和父子组件事件,避免后续后台改动丢失批量运营能力。
## 2026-07-02 任务详情协作分账增量
- 后台任务详情弹窗新增“协作分账”区块,直接展示负责人和协作者、成员角色、分账金额与结算状态。
- 打开任务详情时并行加载任务事件流水和成员列表,管理员验收或驳回前可以在同一弹窗核对照片、操作历史和成员分账口径。
- 该增量复用既有 `GET /admin-api/cleaning/tasks/:taskId/members`,未新增数据库表或后端路由。
- `scripts/check-admin-m08-b.mjs` 扩展检查协作分账展示、成员列表加载和 loading 状态,避免详情页回退为只看流水与照片。
## 2026-07-02 结算批量同步增量
- 后台结算列表新增多选列,仅允许选择 `CONFIRMED` 待发放结算单,避免误同步草稿、已发放或已取消单据。
- 结算工具栏新增“批量同步”,对已选择结算单顺序调用既有微信转账同步 API,批量完成后刷新结算列表和统计概览。
- 父级工作台新增 `handleSyncTransferMany`,复用单笔同步流程和错误处理,不新增后端路由或数据库字段。
- `scripts/check-admin-m08-b.mjs` 扩展检查批量同步按钮、可同步结算单过滤和父子组件事件,防止后续结算面板回退到只能逐行同步。
## 状态
M08-B 保持 `PARTIAL`。当前已完成保洁端任务大厅、我的任务、接单、开始、照片上传、提交验收、驳回补做、订单结束自动建保洁任务、统计、管理员任务查询、指派、验收、驳回、批量验收、批量驳回、超时回收、任务事件流水、多人协作分账、任务详情协作分账展示、待结算候选与后台预览/导出、正式结算单生成、确认、结算列表导出、结算批量同步微信状态、发放成功标记、发放失败记录、微信商家转账 API 适配、转账中间态落库、主动轮询同步、微信转账通知回调、微信转账预检、非生产 Mock 门禁、后台任务成员协作管理、任务详情照片预览、操作流水、结算单详情、统计明细、保洁员资料管理界面、手机号维护、微信绑定状态、每日统计趋势、任务/结算/统计/候选门店和保洁员筛选以及任务/协作者/结算/统计保洁员选择器;真实商户现场联调和更完整的后台/小程序管理界面仍待继续。M08-A 的真机合法域名、真实微信支付和实物开门验证按外部条件阻塞保留,不阻断 M08-B 工程推进。
## 提交
- 工程提交:`M08-B结算批量同步增量`
- 远端校验:待本轮 push 后执行 `HEAD == origin/main`