Files
group_xinghuo_jinrong/scripts/core/08-seed-share-lot.sql
T
GaoYiYuan_0626 c5182f1910 feat(convert): 基金转换 T-0/T-0b 门禁 + T-1 数据层 + T-2/T-2b 纯函数与实算回填
T-0 / T-0b(门禁 · 2026-09-10)
- T-0:sqlite 与 MySQL 结构对齐 —— core_holding 统一为 qty/cost_amount/as_of/pnl_pct
  + PK + UNIQUE(customer_id, product_id);补 core_product_nav;新增建库自校验
  _assert_ddl_aligned()(R-g);test_db.py 增 3 条门禁用例(含反向验证门禁失效)
- T-0b:DB 账号分离(D20)—— 新增 scripts/core/00-grant.sql(三账号逐表授权);
  settings.py 增 3 组账号;db.py 改 get_engine(db, role),缓存键改为 (库名, 角色),
  账号未配置回退单账号;core_ro→ro / gateway_repository→rw / risk·session_repository→rw;
  tests/conftest.py 四处显式 role="admin"(R-e)

T-1(数据层)
- scripts/core/01-ddl.sql:新建 core_fee_rule / core_share_lot / core_convert_lot_detail;
  core_trade 加 convert_group_id + idx_convert_group;core_product 加 8 列 + fee_rate 补 COMMENT
- 新增 07-seed-fee-rule.sql(赎回费 5 档 × 14 产品,按 22 号文 §10)/ 08-seed-share-lot.sql
  (58 行持仓 → 61 行批次,Σ remain_qty 恒等于 qty)/ 09-seed-org.sql(管理人 + TA +
  申购费率 + 最低持有余额,v1.1 按「管理人全产品线」重排)
- reset.ps1 追加 07/08/09;02-mysql-agent专用.sql 追加 risk_convert_detail
- tests/_ddl.py 同步 4 表 + 新增 REQUIRED_CONVERT_TABLES 建库门禁
- 新增 scripts/dev/verify_convert_seed.py(pymysql 等价 reset 流程 + 8 条 DoD 断言,
  含断言 ⑧「费率档 ↔ product_type 匹配」,越档即 FAIL)

T-2 / T-2b(纯函数包 + 示例实算回填)
- 新增 app/service/convert/ 7 文件:__init__ / types / calc / fee / nav / lot_bootstrap / errors
  (纯函数,不查库、不碰 SQL;所有量化显式 ROUND_HALF_UP;lot_bootstrap 用 zlib.crc32
   保证 D18 跨进程同源)
- 新增 tests/test_convert_calc.py 93 用例(12 类:HALF_UP 反向自证 / 分档边界 /
  FIFO 含同 confirmed_at 兜底 / 双口径 / 强制全转与强制赎回 / PRD §5.3 全链自证 /
  纯函数零 IO 依赖断言)
- 重写 scripts/dev/calc_convert_demo.py:去掉脚本内公式副本,改为调用生产 calc.py,
  末尾与 PRD §5.3 逐项比对(不一致即退出码 1),兼作一致性门禁

验证
- pytest 609 passed / 3 skipped(516 → +93,零回归)
- verify_convert_seed.py 8/8 PASS;calc_convert_demo.py 15/15 与 PRD §5.3 一致

文档:PRD v0.9.1(费率分类修正)· 架构 §7 签名回填 / §8.3 错误码注 / §15 T-2 完成 ·
开发计划 §1.5 新增 R-h + §4.2·§4.3 执行记录 · AGENTS.md · docs/memory
2026-09-10 14:45:55 +08:00

95 lines
9.4 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
USE jinrong_core;
-- ============================================================================
-- 08-seed-share-lot.sql · 份额批次种子
-- 版本:v1.0(2026-09-10 · T-1 新增)
-- 依据:PRD §4.1 `core_share_lot` + 架构 §5 D8/D18(批次为 FIFO 计费权威源)
-- 生成规则:
-- · 按 core_holding 逐行反推批次,**每个 (customer_id, product_id) 的
-- Σ remain_qty 恒等于 core_holding.qty**(DoD ② 可逐行 SQL 断言)。
-- · 主演示客户 CUST-9527 专门拆多批,用于跨批次 FIFO 与逐批计费演示:
-- PROD-005827 50000 = 30000 + 15000 + 5000(覆盖 ≥365 / 30-180 / <7 三档)
-- PROD-110022 80000 = 50000 + 30000 (覆盖 180-365 / 7-30 两档)
-- PROD-000001 20000 = 20000 (单批,≥365 档)
-- · 其余持仓每行 1 批,confirmed_at 按 D1→D5 循环,使整体覆盖全部 5 档。
-- 日期模板(持有天数以 as_of = 2026-09-04 为参照计算,对应 07 档位表的区间):
-- D1 = 2025-05-01 → 491 天 → [365, ∞) → rate 0.0000
-- D2 = 2026-02-15 → 201 天 → [180, 365) → rate 0.0025
-- D3 = 2026-08-01 → 34 天 → [30, 180) → rate 0.0050
-- D4 = 2026-08-25 → 10 天 → [7, 30) → rate 0.0100
-- D5 = 2026-09-01 → 3 天 → [0, 7) → rate 0.0150
-- 重要说明:静态日期会随运行日期推移而整体后移(今天跑 D5 已是 7-30 档)。
-- 因此 **分档边界单测必须用自建种子(相对 now 生成日期)**,不得依赖本文件;
-- 本文件服务于模拟库人工演示与真库集成冒烟。
-- 其他:nav 取 06-seed-nav.sql 的 2026-09-04 最新净值(模拟库近似,非逐批历史净值);
-- source_trade_id 统一 NULL —— 04/05 两个种子各自独立造数,批次不回溯流水,
-- 真实 TA 的批次由确认流水生成,模拟库不假装有这个链路。
-- ============================================================================
INSERT INTO core_share_lot (lot_id, customer_id, product_id, qty, remain_qty, nav, confirmed_at, source_trade_id) VALUES
-- ---- CUST-9527 主 demo:跨批次专项 ----
('LOT-9527-005827-01', 'CUST-9527', 'PROD-005827', 30000.0000, 30000.0000, 0.9500, '2025-05-01 10:00:00.000', NULL),
('LOT-9527-005827-02', 'CUST-9527', 'PROD-005827', 15000.0000, 15000.0000, 0.9500, '2026-08-01 10:00:00.000', NULL),
('LOT-9527-005827-03', 'CUST-9527', 'PROD-005827', 5000.0000, 5000.0000, 0.9500, '2026-09-01 10:00:00.000', NULL),
('LOT-9527-110022-01', 'CUST-9527', 'PROD-110022', 50000.0000, 50000.0000, 1.0300, '2026-02-15 10:00:00.000', NULL),
('LOT-9527-110022-02', 'CUST-9527', 'PROD-110022', 30000.0000, 30000.0000, 1.0300, '2026-08-25 10:00:00.000', NULL),
('LOT-9527-000001-01', 'CUST-9527', 'PROD-000001', 20000.0000, 20000.0000, 1.0020, '2025-05-01 10:00:00.000', NULL),
-- ---- CUST-1001 ~ 1024(单批,日期循环覆盖 5 档)----
('LOT-1001-110022-01', 'CUST-1001', 'PROD-110022', 30000.0000, 30000.0000, 1.0300, '2025-05-01 10:00:00.000', NULL),
('LOT-1001-000001-01', 'CUST-1001', 'PROD-000001', 50000.0000, 50000.0000, 1.0020, '2026-02-15 10:00:00.000', NULL),
('LOT-1002-005828-01', 'CUST-1002', 'PROD-005828', 40000.0000, 40000.0000, 1.0200, '2026-08-01 10:00:00.000', NULL),
('LOT-1002-110023-01', 'CUST-1002', 'PROD-110023', 25000.0000, 25000.0000, 1.0200, '2026-08-25 10:00:00.000', NULL),
('LOT-1003-110022-01', 'CUST-1003', 'PROD-110022', 120000.0000, 120000.0000, 1.0300, '2026-09-01 10:00:00.000', NULL),
('LOT-1003-005828-01', 'CUST-1003', 'PROD-005828', 30000.0000, 30000.0000, 1.0200, '2025-05-01 10:00:00.000', NULL),
('LOT-1004-161725-01', 'CUST-1004', 'PROD-161725', 60000.0000, 60000.0000, 1.0500, '2026-02-15 10:00:00.000', NULL),
('LOT-1004-510300-01', 'CUST-1004', 'PROD-510300', 40000.0000, 40000.0000, 1.0300, '2026-08-01 10:00:00.000', NULL),
('LOT-1005-005827-01', 'CUST-1005', 'PROD-005827', 35000.0000, 35000.0000, 0.9500, '2026-08-25 10:00:00.000', NULL),
('LOT-1005-510300-01', 'CUST-1005', 'PROD-510300', 15000.0000, 15000.0000, 1.0300, '2026-09-01 10:00:00.000', NULL),
('LOT-1006-110023-01', 'CUST-1006', 'PROD-110023', 90000.0000, 90000.0000, 1.0200, '2025-05-01 10:00:00.000', NULL),
('LOT-1006-000002-01', 'CUST-1006', 'PROD-000002', 40000.0000, 40000.0000, 1.0050, '2026-02-15 10:00:00.000', NULL),
('LOT-1007-005828-01', 'CUST-1007', 'PROD-005828', 45000.0000, 45000.0000, 1.0200, '2026-08-01 10:00:00.000', NULL),
('LOT-1008-161726-01', 'CUST-1008', 'PROD-161726', 20000.0000, 20000.0000, 1.0500, '2026-08-25 10:00:00.000', NULL),
('LOT-1008-510500-01', 'CUST-1008', 'PROD-510500', 10000.0000, 10000.0000, 0.9800, '2026-09-01 10:00:00.000', NULL),
('LOT-1009-000001-01', 'CUST-1009', 'PROD-000001', 150000.0000, 150000.0000, 1.0020, '2025-05-01 10:00:00.000', NULL),
('LOT-1009-110022-01', 'CUST-1009', 'PROD-110022', 80000.0000, 80000.0000, 1.0300, '2026-02-15 10:00:00.000', NULL),
('LOT-1010-003095-01', 'CUST-1010', 'PROD-003095', 55000.0000, 55000.0000, 0.9500, '2026-08-01 10:00:00.000', NULL),
('LOT-1010-005827-01', 'CUST-1010', 'PROD-005827', 30000.0000, 30000.0000, 0.9500, '2026-08-25 10:00:00.000', NULL),
('LOT-1011-161725-01', 'CUST-1011', 'PROD-161725', 70000.0000, 70000.0000, 1.0500, '2026-09-01 10:00:00.000', NULL),
('LOT-1012-510300-01', 'CUST-1012', 'PROD-510300', 65000.0000, 65000.0000, 1.0300, '2025-05-01 10:00:00.000', NULL),
('LOT-1012-110023-01', 'CUST-1012', 'PROD-110023', 35000.0000, 35000.0000, 1.0200, '2026-02-15 10:00:00.000', NULL),
('LOT-1013-005828-01', 'CUST-1013', 'PROD-005828', 28000.0000, 28000.0000, 1.0200, '2026-08-01 10:00:00.000', NULL),
('LOT-1014-510500-01', 'CUST-1014', 'PROD-510500', 90000.0000, 90000.0000, 0.9800, '2026-08-25 10:00:00.000', NULL),
('LOT-1014-161726-01', 'CUST-1014', 'PROD-161726', 40000.0000, 40000.0000, 1.0500, '2026-09-01 10:00:00.000', NULL),
('LOT-1015-110022-01', 'CUST-1015', 'PROD-110022', 100000.0000, 100000.0000, 1.0300, '2025-05-01 10:00:00.000', NULL),
('LOT-1016-005827-01', 'CUST-1016', 'PROD-005827', 42000.0000, 42000.0000, 0.9500, '2026-02-15 10:00:00.000', NULL),
('LOT-1016-003095-01', 'CUST-1016', 'PROD-003095', 18000.0000, 18000.0000, 0.9500, '2026-08-01 10:00:00.000', NULL),
('LOT-1017-510300-01', 'CUST-1017', 'PROD-510300', 32000.0000, 32000.0000, 1.0300, '2026-08-25 10:00:00.000', NULL),
('LOT-1018-000001-01', 'CUST-1018', 'PROD-000001', 200000.0000, 200000.0000, 1.0020, '2026-09-01 10:00:00.000', NULL),
('LOT-1019-110023-01', 'CUST-1019', 'PROD-110023', 48000.0000, 48000.0000, 1.0200, '2025-05-01 10:00:00.000', NULL),
('LOT-1019-005828-01', 'CUST-1019', 'PROD-005828', 22000.0000, 22000.0000, 1.0200, '2026-02-15 10:00:00.000', NULL),
('LOT-1020-161725-01', 'CUST-1020', 'PROD-161725', 85000.0000, 85000.0000, 1.0500, '2026-08-01 10:00:00.000', NULL),
('LOT-1020-XYZ999-01', 'CUST-1020', 'PROD-XYZ999', 15000.0000, 15000.0000, 0.9000, '2026-08-25 10:00:00.000', NULL),
('LOT-1021-005827-01', 'CUST-1021', 'PROD-005827', 15000.0000, 15000.0000, 0.9500, '2026-09-01 10:00:00.000', NULL),
('LOT-1022-510300-01', 'CUST-1022', 'PROD-510300', 72000.0000, 72000.0000, 1.0300, '2025-05-01 10:00:00.000', NULL),
('LOT-1022-110022-01', 'CUST-1022', 'PROD-110022', 48000.0000, 48000.0000, 1.0300, '2026-02-15 10:00:00.000', NULL),
('LOT-1023-005828-01', 'CUST-1023', 'PROD-005828', 38000.0000, 38000.0000, 1.0200, '2026-08-01 10:00:00.000', NULL),
('LOT-1024-161726-01', 'CUST-1024', 'PROD-161726', 95000.0000, 95000.0000, 1.0500, '2026-08-25 10:00:00.000', NULL),
-- ---- CUST-3001 / 4001 / 4002(单批)----
('LOT-3001-510300-01', 'CUST-3001', 'PROD-510300', 200000.0000, 200000.0000, 1.0300, '2026-09-01 10:00:00.000', NULL),
('LOT-3001-005827-01', 'CUST-3001', 'PROD-005827', 150000.0000, 150000.0000, 0.9500, '2025-05-01 10:00:00.000', NULL),
('LOT-4001-XYZ999-01', 'CUST-4001', 'PROD-XYZ999', 80000.0000, 80000.0000, 0.9000, '2026-02-15 10:00:00.000', NULL),
('LOT-4001-161725-01', 'CUST-4001', 'PROD-161725', 50000.0000, 50000.0000, 1.0500, '2026-08-01 10:00:00.000', NULL),
('LOT-4002-161725-01', 'CUST-4002', 'PROD-161725', 10000.0000, 10000.0000, 1.0500, '2026-08-25 10:00:00.000', NULL),
-- ---- 手册示范客户 CUST-DEMO-A ~ E(单批)----
('LOT-DEMOA-510300-01', 'CUST-DEMO-A', 'PROD-510300', 35000.0000, 35000.0000, 1.0300, '2026-09-01 10:00:00.000', NULL),
('LOT-DEMOA-510500-01', 'CUST-DEMO-A', 'PROD-510500', 25000.0000, 25000.0000, 0.9800, '2025-05-01 10:00:00.000', NULL),
('LOT-DEMOA-000001-01', 'CUST-DEMO-A', 'PROD-000001', 10000.0000, 10000.0000, 1.0020, '2026-02-15 10:00:00.000', NULL),
('LOT-DEMOB-161725-01', 'CUST-DEMO-B', 'PROD-161725', 500000.0000, 500000.0000, 1.0500, '2026-08-01 10:00:00.000', NULL),
('LOT-DEMOB-PRIV01-01', 'CUST-DEMO-B', 'PROD-PRIV01', 2500000.0000, 2500000.0000, 1.0800, '2026-08-25 10:00:00.000', NULL),
('LOT-DEMOC-110022-01', 'CUST-DEMO-C', 'PROD-110022', 400000.0000, 400000.0000, 1.0300, '2026-09-01 10:00:00.000', NULL),
('LOT-DEMOC-WMG001-01', 'CUST-DEMO-C', 'PROD-WMG001', 200000.0000, 200000.0000, 1.0150, '2025-05-01 10:00:00.000', NULL),
('LOT-DEMOD-005827-01', 'CUST-DEMO-D', 'PROD-005827', 300000.0000, 300000.0000, 0.9500, '2026-02-15 10:00:00.000', NULL),
('LOT-DEMOD-510300-01', 'CUST-DEMO-D', 'PROD-510300', 150000.0000, 150000.0000, 1.0300, '2026-08-01 10:00:00.000', NULL),
('LOT-DEMOE-161725-01', 'CUST-DEMO-E', 'PROD-161725', 120000.0000, 120000.0000, 1.0500, '2026-08-25 10:00:00.000', NULL),
('LOT-DEMOE-510500-01', 'CUST-DEMO-E', 'PROD-510500', 80000.0000, 80000.0000, 0.9800, '2026-09-01 10:00:00.000', NULL);