diff --git a/docs/superpowers/plans/2026-11-01-pl-stop-cert-management.md b/docs/superpowers/plans/2026-11-01-pl-stop-cert-management.md index 88eb91191..7ee6881b5 100644 --- a/docs/superpowers/plans/2026-11-01-pl-stop-cert-management.md +++ b/docs/superpowers/plans/2026-11-01-pl-stop-cert-management.md @@ -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容器和复用统计面板 diff --git a/openspec/changes/pl-stop-cert-management/tasks.md b/openspec/changes/pl-stop-cert-management/tasks.md index b919dca83..333ee9abf 100644 --- a/openspec/changes/pl-stop-cert-management/tasks.md +++ b/openspec/changes/pl-stop-cert-management/tasks.md @@ -7,7 +7,7 @@ ## 2. 后端与迁移 - [x] 先写新规则100+40+60=200及旧版100不变的失败回归,再扩展版本化来源提取及分配入口。 - [ ] 实现合同/证件统计查询及主对象分页,验证单位、证种、权限与期初未归属口径。 -- [ ] 实现证件+合同产品原子保存,覆盖多合同失败回滚、遗漏/空集合、身份及引用保护。 +- [x] 实现证件+合同产品原子保存,覆盖多合同失败回滚、遗漏/空集合、身份及引用保护。 - [x] 新增段产品资料模型/schema/API与MySQL5.7迁移,保留旧附件和旧账;不自动执行数据库迁移。 - [x] 校验安排、调整、释放、归档、异常补量及旧客户端不能绕过正式规则。 @@ -23,4 +23,4 @@ - [ ] 独立审查、适用数据库事务验证及迁移演练(此前用户要求暂不启MySQL容器,未完成项如实保留)。 - [ ] 记录最终版本、实际测试与缺口,再按已有授权交付;不自动部署或关闭旧工单。 -当前状态:实施阶段。Task 1分段计量`cde30287f`和Task 2段产品证明`2dd396509`/`b21618151`已通过独立规格及质量审查,SQLite专项通过;统计、原子绑定与Web界面尚在实现。未创建业务数据库表或执行迁移,MySQL真实并发验证未完成。 +当前状态:实施阶段。Task 1分段计量`cde30287f`和Task 2段产品证明`2dd396509`/`b21618151`已通过独立规格及质量审查,SQLite专项通过,Task 3A原子绑定`71116ed69`/`5912e9d05`也已通过双审及79项回归;统计与Web界面尚在实现。未创建业务数据库表或执行迁移,MySQL真实并发验证未完成。