基金转换 T-3:core_ro 新增 5 个只读方法 + share_lot_repository 读侧
- core_ro 新增 get_nav_as_of(D10) / get_redeem_fee_rules / list_share_lots(S1 确定性排序) / sum_remain_qty(仅 >0) / get_holding;不动 get_latest_nav 与 list_trades_range 白名单 - 新增 share_lot_repository:core_share_lot 读侧 FIFO 贪心选批 + 汇总,排序复用 core_ro 的 ORDER BY(D18 单一副本) - 新增 tests/test_share_lot.py 15 用例;pytest 全量 624 passed / 3 skipped(基线 609,零回归) - 同步开发计划 §5.1 执行记录与交接文档 §B 状态(v1.5 / T-3 ✅ / 基线 624) Co-Authored-By: WorkBuddy <workbuddy@tencent.com>
This commit is contained in:
@@ -752,14 +752,27 @@ T-7 幂等窗口 · T-13 的 50 并发压测与性能补录 · PRD §5.3 实算
|
||||
| | 【改】**不动** | `get_latest_nav`(D10:改它会动既有调用方)· `list_trades_range` 的 `trade_type` 白名单(F-8:convert 两条流水本就是 redeem/subscribe,无需改) |
|
||||
| `app/repository/share_lot_repository.py` | 【新增】 | `core_share_lot` **读侧**:FIFO 选批 + 汇总(写侧归 `convert_core_repository`,D2) |
|
||||
|
||||
**DoD**
|
||||
- [ ] 5 个方法各有 sqlite 单测(`test_convert_calc.py` 或独立 `test_share_lot.py` 中)
|
||||
- [ ] `list_share_lots` 在**同一 `confirmed_at` 多批次**时顺序可复现(构造两行同 `confirmed_at`,断言按 `lot_id` 升序)
|
||||
- [ ] `sum_remain_qty` 只统计 `remain_qty > 0`
|
||||
- [ ] `pytest -q` 全绿(新增方法不动既有行为)
|
||||
**DoD(全部达成,见下方执行记录)**
|
||||
- [x] 5 个方法各有 sqlite 单测(落在独立 `tests/test_share_lot.py` 中)
|
||||
- [x] `list_share_lots` 在**同一 `confirmed_at` 多批次**时顺序可复现(构造两行同 `confirmed_at`,断言按 `lot_id` 升序,S1)
|
||||
- [x] `sum_remain_qty` 只统计 `remain_qty > 0`(归零批不计入)
|
||||
- [x] `pytest -q` 全绿(新增方法不动既有行为)
|
||||
|
||||
**执行记录(2026-09-10)**
|
||||
|
||||
| 项 | 内容 |
|
||||
| --- | --- |
|
||||
| 改动文件 | `app/repository/core_ro.py`【改·+5 方法】· `app/repository/share_lot_repository.py`【新增】· `tests/test_share_lot.py`【新增 15 用例】 |
|
||||
| 5 方法 | `get_nav_as_of(pid, d)`(D10:`nav_date <= :d` 降序取 1)· `get_redeem_fee_rules(pid)`(仅 `redeem` 档、按 `min_hold_days` 升序)· `list_share_lots(cid, pid, max_lots)`(`ORDER BY confirmed_at ASC, lot_id ASC`,S1)· `sum_remain_qty(cid, pid)`(仅 `remain_qty > 0`)· `get_holding(cid, pid)` |
|
||||
| 不动 | `get_latest_nav`(D10:语义不同,已并存)· `list_trades_range` 的 `trade_type` 白名单(F-8:convert 两条流水本就是 redeem/subscribe) |
|
||||
| `share_lot_repository` | `core_share_lot` **读侧**:`select_for_convert` FIFO 贪心选批 + `available_qty` 汇总(写侧归 `convert_core_repository`,D2)。**D18 单一副本**:排序规则复用 `CoreReadOnlyRepository.list_share_lots` 的 ORDER BY,不另写一份 SQL |
|
||||
| 测试踩坑(已修) | ① sqlite 不直接绑定 `Decimal` 参数 → 插入一律转 `float`(与既有 `Decimal(total)` 读回约定一致);② sqlite DATE/TIMESTAMP 读回为字符串 → 用项目内 `_as_date` / 测试内 `_as_dt` 规范化(与 MySQL 行为差异,B5 评审 P3-4 同口径) |
|
||||
| 验证结果 | `pytest -q` 全量 **624 passed / 3 skipped**(基线 609 + 本次 15,零回归) |
|
||||
|
||||
**依赖**:T-1
|
||||
|
||||
**下一步**:T-4(`convert_repository` 代理侧)/ T-5(`locks.try_lock`)可并行(并行组 A);关键路径 T-6(`apply_convert` 单事务)→ T-7(`convert_service` 编排)
|
||||
|
||||
---
|
||||
|
||||
### 5.2 T-4 · `convert_repository`(agent 侧)
|
||||
|
||||
Reference in New Issue
Block a user