3.3 KiB
3.3 KiB
Quality Backend Runbook
任务:S25 - 质检后端
完成时间:2026-06-21 21:05 +08:00
1. 目标
S25 完成质检后端最小闭环:
- 质检抽样规则管理。
- 基于规则的稳定抽样。
- 录音列表、录音详情和上下条导航。
- 保存质检结果。
- RBAC 权限和审计元数据。
本任务不做 Dashboard 聚合,不新增前端页面,不发布 B 当前 placeholder release。
2. API
质检规则:
GET /api/v2/quality/rules
GET /api/v2/quality/rules/:id
POST /api/v2/quality/rules
PATCH /api/v2/quality/rules/:id
DELETE /api/v2/quality/rules/:id
POST /api/v2/quality/rules/:id/enable
POST /api/v2/quality/rules/:id/disable
录音质检:
GET /api/v2/recordings
GET /api/v2/recordings/:id
PUT /api/v2/recordings/:id/review
S24 的播放接口继续保留:
GET /api/v2/recordings/:id/play
3. 权限
| 能力 | 权限 |
|---|---|
| 查看质检规则、录音列表、录音详情 | quality.view |
| 新增、修改、启停、删除质检规则 | quality.manage |
| 保存质检结果 | quality.manage |
| 播放录音 | recordings.play |
质检规则变更和保存质检结果都带 AuditAction 元数据,由既有审计拦截器记录。
4. 稳定抽样
当前 schema 没有单独“待质检任务表”,S25 采用计算型稳定抽样:
score = sha256(rule_id + ":" + recording_id) 的前 32 bit 映射到 [0, 100)
selected = score < ratio
规则匹配条件:
customerId为空或等于录音关联 raw CDR 的customerId。lineGroupId为空或等于录音关联 raw CDR 的lineGroupId。- 规则状态为
ENABLED。 - 当前时间在
effectiveAt与expiresAt范围内。
同一规则和同一录音的抽样结果稳定不变,列表重复查询不会抖动。
5. 数据写入
S25 不新增数据库迁移,复用 S08 已建表:
quality_sampling_rulesquality_reviewsrecordings
保存质检结果会新增一条 quality_reviews 记录,不覆盖历史结果;录音详情返回最新质检结果和历史列表。
6. 验证结果
corepack pnpm@10.33.0 exec vitest run apps/api/src/modules/quality/sampling.spec.ts apps/api/src/modules/recordings/recordings.service.spec.ts通过,2 个测试文件 6 条测试。corepack pnpm@10.33.0 typecheck通过。corepack pnpm@10.33.0 lint通过。corepack pnpm@10.33.0 build通过。
7. 当前限制
- B 当前
/opt/lisglosips/current仍是 S05 placeholder release,本次只完成本地代码与构建验证,未部署到 B 当前 API 服务。 - 录音真实数据仍依赖 S28 端到端路由、媒体、CDR 和录音闭环产生。
- Dashboard 中的待质检数量和趋势留给 S26 聚合任务。
8. 回滚
代码回滚:
- 删除或恢复
apps/api/src/modules/quality/。 - 恢复
apps/api/src/modules/recordings/到 S24 版本。 - 从
apps/api/src/modules/app.module.ts移除QualityModule。 - 重新执行
corepack pnpm@10.33.0 build。
数据回滚:
- S25 未在远端执行数据库写入验证,无需清理远端数据。
- 若后续已运行 API 并产生质检记录,不应直接删除历史
quality_reviews;应通过审计可见的更正记录或受控数据库维护窗口处理。