GaoYiYuan_0626
048f1a9e1e
基金转换 T+1 模型:T-7 确认段落地(confirm_service 三段编排 + T+1 批处理)
【新增】
- app/service/convert/confirm_service.py:confirm_one(8 步确认)+ confirm_batch
(按业务日捞单 / 整批锁 / 串行 / 单笔容错)。关键裁定:
· T 日净值用 get_nav_on 精确匹配,缺则 nav_pending(绝不回退旧净值);
· 扣批次 + 2 条流水 + 转入批次 + 两端持仓 + 明细 + 受理单置 confirmed
同处一个 Core 单库事务,状态被抢(rowcount!=1)→ 整事务回滚;
· 引擎在事务 commit 后跑,异常不阻断已成立的交易(FR-C28);
· 部分成交 actual=min(申请,可用),被抢部分占用自然释放(R-10)。
- app/service/convert/format.py / audit.py / engine_call.py:展示规格、审计、
引擎调用三处共用出口抽出(受理/确认两段不再各写一份,避免口径漂移)。
- scripts/dev/verify_convert_confirm.py:真库验证 81 项断言,含 PRD §5.3.2
示例在真库上逐字节重放(68020.00/612.18/67407.82/333.36/67074.46/34945.54/-0.0049)。
【修复 · 受理-确认接口契约缺口】
强制全转是**受理段决策**(受理时 qty 已收敛为实际全转量),确认段拿不到原始
申请量、无法复现该判定。修法:
- 受理段把 forced_full_transfer 落受理单 remark(新增 REMARK_FULL_TRANSFER);
- 确认段改为**继承受理决策、不再重判最低持有**(plan_lots 不传 min_hold_qty)
—— 重判会因 T→T+1 可用份额变化得出与受理承诺不一致的结论(擅自扩大客户指令);
- remark 支持多标记 `;` 连接(full_transfer;partial)。
- MySQL rowcount=changed rows 陷阱:nav_pending 重试不得复用 transition_status
的冲突判定,改为 status 未变时不迁移、返回 transitioned=False。
【其他】
- convert_service:新增 cancel_convert(T 日撤单,两道闸门)、_t1_t2_dates
(日历边界 None 容错);受理响应改为 PRD §5.3.1 字段;convert_fund 标 Deprecated。
- convert_core_repository:ConvertApplyInput 加 convert_request_id/diff_fee/
request_remark;_apply_convert_once 末步 _confirm_request 事务内置状态守卫。
- convert_request_repository:_end_of_day 统一闭区间语义;新增 reject()。
- 测试:新增 tests/test_convert_confirm.py(24 例);全量 827 passed / 10 skipped。
2026-09-11 19:35:37 +08:00
..
2026-09-10 18:00:20 +08:00
2026-09-11 19:21:15 +08:00
2026-09-11 19:35:37 +08:00
2026-09-07 19:05:02 +08:00
2026-09-11 19:35:37 +08:00
2026-09-11 19:35:37 +08:00
2026-09-10 18:40:27 +08:00
2026-09-10 18:00:20 +08:00
2026-09-05 17:09:21 +08:00
2026-09-10 18:00:20 +08:00