跳转至

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、不再分析种子边界):

  1. QsvQuote ORM 模型逐表复核对齐 DDL(DWLG-04 待办 #2「新增 ORM 操作需逐表复核」范围):
  2. quote_idserver_default=text("app_gen_ulid('QTE')")(对齐 mds.py X5 模式);
  3. 补齐 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) 等。
  4. 新建 QSV Repositoryapp/infrastructure/db/repositories/qsv.py):品类解析(code 或 category_id)、客户存在性校验、当前参数版本查询、报价创建(flush+refresh 回读 DB 生成字段)、按 ID 查询(排除软删除)。
  5. QSV Service 扩展create_quote(品类→客户→参数版本三重校验后复用 _run_calculation 落库,状态 DRAFT)+ get_quote;试算与落库共用同一计算函数,消除逻辑分叉。
  6. 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 报价不存在)。
  7. 集成测试 15 例:认证 7 例(登录/错误密码/未知用户/me/无 token/refresh/refresh 类型拒绝)+ QSV 8 例(试算 401/试算 200/创建落库+DB 断言/创建 401/品类 422/客户 422/详情快照/404)。
  8. 修复 2 个问题
  9. resolve_category ENUM 比较 bug:PG ENUM 列直接与字符串参数比较时,非法枚举值触发 22P02 InvalidTextRepresentation(500 而非 422);改为 cast(code, String) 后比较;
  10. 清理 seed cli.py 遗留未使用的 text import(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 比较先转 TEXTmds_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 而非局部循环。