DIP1 工作日志 — QSV 报价域持久化 + 认证接口集成测试¶
DWLG 编号:DWLG-20260810-01 日期:2026-08-10 参与方:DIP1 Code Agent 关联文档:DIP1-SCH(DOC-D01-DB V2.0)、DIP1-API(DOC-D01-API V2.0 QsvQuote/QsvCreateQuoteRequest)、DIP1-SPEC(附录 A 错误码表)、DIP1-IMP(§7.1 C-B1) 关联 Issue:无 前置依据:主仓 DLG-66《三循环验证反复空转问题复盘》§六 指令 ①②(QSV 持久化集成测试 → 认证接口集成测试)
一、工作内容¶
按 DLG-66 §六 明确指令恢复推进(不重跑三循环、不动 sys.py/migration 0001~0003、不再分析种子边界):
- QsvQuote ORM 模型逐表复核对齐 DDL(DWLG-04 待办 #2「新增 ORM 操作需逐表复核」范围):
quote_id补server_default=text("app_gen_ulid('QTE')")(对齐 mds.py X5 模式);- 补齐 migration 0001 DDL 有而模型缺失的 11 列:
channel_template_id/bo_approval_status(ENUM app_enum__bo_approval_3) /bo_approved_by/bo_approved_at/confirmed_by/confirmed_at/rejected_reason/valid_until(server_default) /export_pdf_object_key/created_by(NOT NULL) 等。 - 新建 QSV Repository(
app/infrastructure/db/repositories/qsv.py):品类解析(code 或 category_id)、客户存在性校验、当前参数版本查询、报价创建(flush+refresh 回读 DB 生成字段)、按 ID 查询(排除软删除)。 - QSV Service 扩展:
create_quote(品类→客户→参数版本三重校验后复用_run_calculation落库,状态 DRAFT)+get_quote;试算与落库共用同一计算函数,消除逻辑分叉。 - API 接线:
POST /api/v1/qsv/quotes(201,权限qsv:create)+GET /api/v1/qsv/quotes/{quote_id}(权限qsv:calc);错误码对齐 SPEC 附录 A:3010(422 品类/客户不存在) / 3001(409 参数版本未配置) / 4001(404 报价不存在)。 - 集成测试 15 例:认证 7 例(登录/错误密码/未知用户/me/无 token/refresh/refresh 类型拒绝)+ QSV 8 例(试算 401/试算 200/创建落库+DB 断言/创建 401/品类 422/客户 422/详情快照/404)。
- 修复 2 个问题:
resolve_categoryENUM 比较 bug:PG ENUM 列直接与字符串参数比较时,非法枚举值触发 22P02InvalidTextRepresentation(500 而非 422);改为cast(code, String)后比较;- 清理 seed cli.py 遗留未使用的
textimport(100 步中断现场残留,ruff F401)。
二、产出物¶
| 类型 | 路径 | 说明 |
|---|---|---|
| 代码 | backend/app/infrastructure/db/models/qsv.py |
QsvQuote 对齐 DDL(+11 列 + quote_id server_default) |
| 代码 | backend/app/infrastructure/db/repositories/{__init__,qsv}.py |
QsvRepository 新建(5 方法) |
| 代码 | backend/app/application/dtos/qsv.py |
+QuoteCreateRequest / QuoteResponse / QuoteDetailResponse |
| 代码 | backend/app/application/services/qsv_service.py |
+create_quote / get_quote;抽出 _run_calculation 共用 |
| 代码 | backend/app/interfaces/api/qsv.py |
POST/GET /quotes 接线(RBAC + 错误码) |
| 代码 | backend/app/infrastructure/db/seed/cli.py |
移除未使用 import(lint F401 清零) |
| 测试 | backend/tests/conftest.py |
+db / auth_headers 夹具 |
| 测试 | backend/tests/interfaces/test_auth_api.py |
认证集成测试 7 例 |
| 测试 | backend/tests/interfaces/test_qsv_api.py |
QSV 持久化集成测试 8 例(含 DB 层断言与数据清理) |
验证结果:
- pytest tests/:24 passed(既有 9 例 + 新增 15 例),4.26s;
- ruff check app tests:All checks passed;
- 测试后 DB 抽检:qsv_quotes / qsv_param_versions / mds_cpl_customers 均 0 残留(夹具清理有效)。
三、关键决策¶
- ENUM 比较先转 TEXT:
mds_scl_categories.code是 PG 原生 ENUM,SQLAlchemy 会将字符串参数强转枚举类型,非法值直接 22P02;cast(code, String)既避免异常又保留 code/category_id 双路解析能力。 - created_by 以
str参数传入 Service:避免 application 层反向依赖 interfaces 层的CurrentUser,保持 DDD 分层方向。 - 品类/客户预校验返回 422/3010:不让 FK RESTRICT 以 IntegrityError 形式冒泡成 500,错误语义对齐 SPEC 附录 A。
- 测试数据夹具自清理:显式 ID(CUS0TEST…/QPV0TEST…)+ teardown DELETE,保证集成测试可重复执行且不污染 dev 库。
四、问题与待办¶
| # | 问题 | 状态 | 负责人 | 截止 |
|---|---|---|---|---|
| 1 | C-B1 验收标准「32 用例全绿 + recalculate P95 < 30ms」尚未完全达成(当前 QSV 相关 16 例,无性能基准) | 🟡 推进中 | Code Agent | §B 阶段内 |
| 2 | cpt/dsp/pay/ops 其余表模型未逐表复核(同 DWLG-04 待办 #2) | 🟡 持续 | Code Agent | 随各域开发 |
| 3 | DIP1-IMP §7.1 文档矩阵未同步(C-A0/C-B0/C-D1/C-D2 已 🟢 但文档仍 🟡,含本次 C-B1 进展) | 🟡 待 TL/DT 同步 | TL / DT | 下次审核 |
| 4 | 下一步:DLG-66 §六 指令 ③ RN 双端页面实现(§C 阶段,按 DIP1-PROTO V2.0) | 🟢 可启动 | Code Agent | — |
五、状态矩阵更新(DIP1-IMP §7.1)¶
- C-B1(§B QSV 报价域):🟡 0% → 🟡 ~60% — 报价持久化链路(创建/查询/RBAC/错误码)+ 持久化集成测试 8 例全绿;距验收尚差用例数补齐(16/32)与 P95 性能基准。
- 认证(关联 C-B7 移动认证前置):账密登录 + refresh + RBAC 集成测试 7 例全绿(OTP/refresh 轮换吊销仍为占位,属 C-B7 范围)。
修订记录¶
| 版本 | 日期 | 修订人 | 修订内容 |
|---|---|---|---|
| V1.0 | 2026-08-10 | DIP1 Code Agent | 创建:QSV 持久化 + 认证集成测试全程记录 |
本记录按 DLG-66 §六 指令执行,未触碰已固化的 migration/sys.py/种子边界;如遇 ≥2 个关联 bug 将按 DLG-66 §5.3 触发 SFM ESCAL 而非局部循环。