docs(pl): 拆分统计任务并记录原子建档绑定的审查与验证。

This commit is contained in:
wuzilong committed 2026-11-01 21:31:56 +08:00
1 parent 5912e9d056
commit b053c66b79
2 files changed
+20 -7

No files matched your search

@@ -49,14 +49,27 @@ Files: 新增`backend/app/services/pl_stop_legal_document.py`、`backend/tests/t
Task 2证据:提交`2dd396509`与并发当前读修复`b21618151`;核心10模块159项通过,新证明20项经独立复审通过。规格、质量审查通过。SQL仅编写未执行;MySQL锁SQL编译测试不等同真实并发验证。扩展检查中既有`test_pl_mobile_stop_meta.py`两项失败(历史SQL路径不存在、AST测试替身缺少`assert_plan_can_arrange`),未扩大修改。
## Task 3: 合同与证件统计、建档原子绑定
## Task 3A: 建档原子绑定
Files: 新增`backend/app/services/pl_quota_statistics.py`、`backend/app/services/pl_quota_cert_bindings.py`和对应tests;修改`backend/app/api/pl/quota_cert.py`,按需扩展已有schemas。
Files: 新增`backend/app/services/pl_quota_cert_bindings.py`和对应tests;修改`backend/app/api/pl/quota_cert.py`,按需扩展已有schemas及将已有证件/范围保存分为校验准备与应用。
- [ ] 写失败用例:核定300、两合同预占100/80、已用20得到共享100;无权合同不出现在列表;两证不合并;分页按合同/证件而非明细。原子保存中第二合同非法整个事务回滚,原有链接及产品ID保持、其他证件不被移除。
实施者反馈统计和原子绑定合并任务上下文过大,拆为3A、3B顺序实施,各自完成规格及质量审查后进入下一项;不并行改共享服务和路由。
- [x] 写失败用例:第二合同非法不修改证面或第一合同,原有链接及产品ID保持、其他证件不被移除;遗漏/空集合、重复/跨租户/跨父ID、引用和隐藏范围保护。
- [x] 在证件save payload增加可选`contractBindings:[{contractId,products:[{id?,contractProductId,scopeStatus?}],id?,linkStatus?}]`,get返回同字段。遗漏不修改,空集合申请清空并执行引用保护;不允许隐藏范围被静默删除。主证、购买证引用与合同绑定同事务,完整校验先于写入,维护其他证件关系和原ID,失败不commit。
- [x] 锁顺序为所有受影响证件按证种/ID排序,再按ID锁合同及关系。等待后当前读校验范围,遇新增未锁证件返回409,不能持合同锁倒序补证锁。新增证先分配稳定ID供验证,全部准备通过后再写入。
- [x] 运行原子保存、contract_scope、cert_archive、api回归及锁SQL意图测试,保留无bindings旧行为。提交并审查。
Task 3A证据:提交`71116ed69`与保存响应当前读修复`5912e9d05`;独立规格、质量审查通过,相关79项SQLite测试通过。GET返回`contractBindings`及`bindingsEditable`,不可编辑时客户端省略绑定集合可单独改证面。真实MySQL并发未验证。
## Task 3B: 合同与证件统计
Files: 新增`backend/app/services/pl_quota_statistics.py`及tests;修改`backend/app/api/pl/quota_cert.py`。
- [ ] 写失败用例:核定300、两合同预占100/80、已用20得到共享100;无权合同/计划不出现在明细或合同聚合;两证和不同单位不合并;分页按合同/证件而非明细。
- [ ] API固定为`GET /statistics/contracts`、`GET /statistics/certificates`返回分页主对象,`GET /contracts/{id}/statistics`返回合同及`certificates`,每证`certType/certId/certNo/productNames/quantityUnit/totalQty/reservedQty/usedQty/availableQty/contractReservedQty/contractUsedQty/products`;`GET /{kind}/{id}/statistics`返回证件及`contracts`及当前权限内`usageItems`。查询当前租户、软删除、CRM和PL范围;余额为授权可见证的全局缓存,合同使用聚合只取授权计划,不泄漏不可见合同明细。
- [ ] 在证件save payload增加可选`contractBindings:[{contractId,products:[{id?,contractProductId,scopeStatus?}],id?,linkStatus?}]`,get返回同字段。遗漏不修改,空集合申请清空当前证件可见范围并执行引用保护;不允许隐藏范围被静默删除。共享事务调用已有证件save与合同绑定服务;先固定完整锁序/全部验证,维护其他证件关系和原ID,失败不commit。
- [ ] 运行新统计/原子保存测试以及contract_scope、cert_archive、api回归。提交本任务。
- [ ] 期初/未归属取独立无计划流水,不从全局余额与可见明细的差额推导。主对象先过滤分页,当前页批量取数,Decimal通过_wire序列化为字符串。
- [ ] 运行统计/分页/权限、contract_scope、cert_archive、api回归。提交并审查。
## Task 4: 五Tab容器和复用统计面板