基金转换 T+1 模型:T-1~T-6 落地(DDL/数据层/语义收窄/锁/受理事务)
AIcoding 第 5 步 todo 开发(开发计划 v2.0)前半段: - T-1 3 张新表 DDL(core_convert_request 6 态 ENUM / core_trade_calendar / core_share_rule)+ 种子 + sqlite 单一事实源同步 + 列清单断言 - T-2/T-2b calc 扩展(product_round/redeem_amount/partial_qty)+ 真实净值实算回填 - T-3 convert_request_repository(6 态 + 条件 UPDATE 守卫)+ core_ro 三读方法 + share_lot_repository.available_qty_with_inflight(R-3 在途占用推导) - T-4 convert_repository.sync_mirror 成为 risk_convert_detail 唯一进度镜像写入口 (旧三方法标 Deprecated,T-7 后删) - T-5 locks.py 锁键构造器 convert_req_lock_key / convert_confirm_lock_key - T-6 convert_service.accept_convert 受理事务(八步:锁→幂等→校验→受理日顺延 →在途占用校验→落单→镜像+审计→202;不扣份额/不折算/不写流水) + tests/test_convert_accept.py(16 用例) + scripts/dev/verify_convert_accept.py(真库 36/36 一致) + trading_calendar.py 纯函数包(R-5)+ 21 用例 T-6 真库实测暴露并修复:confirm_eta 在日历数据边界抛 ValueError,会让已落库 的受理单在调用方眼里变 500;改为展示性字段容错 + 单测守护。 基线:798 passed / 10 skipped,零回归。
This commit is contained in:
@@ -130,6 +130,11 @@ CREATE TABLE core_product (
|
||||
subscribe_fee_rate DECIMAL(6,4) NOT NULL DEFAULT 0 COMMENT '申购费率(补差费计算源,价外法)。22 号文 §8 上限:指数/债券 ≤0.0030、其他混合 ≤0.0050、主动偏股 ≤0.0080、货基 0',
|
||||
fund_company VARCHAR(64) NULL COMMENT '基金管理人(同一笔转换需同管理人)',
|
||||
ta_code VARCHAR(32) NULL COMMENT '注册登记机构代码(同一笔转换需同 TA)',
|
||||
-- ===== T+1 模型扩展列 · D27/D30(T-1 新增)=====
|
||||
share_class VARCHAR(16) NULL COMMENT '份额类别(A/C 等;D30 A/C 互转判定)',
|
||||
allow_ac_convert TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否允许同基金 A/C 份额互转(D30;1 即两向放行)',
|
||||
rounding_mode VARCHAR(16) NOT NULL DEFAULT 'half_up' COMMENT '产品级舍入模式(D27;与 core_share_rule 二选一优先,见 T-14 DoD)',
|
||||
share_digits TINYINT UNSIGNED NOT NULL DEFAULT 2 COMMENT '产品级份额位数(D27;默认 2,个别指数/货基可 4)',
|
||||
is_open TINYINT(1) NOT NULL DEFAULT 1,
|
||||
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
|
||||
KEY idx_min_risk (min_risk_code),
|
||||
@@ -256,3 +261,53 @@ CREATE TABLE core_convert_lot_detail (
|
||||
KEY idx_group (convert_group_id),
|
||||
KEY idx_lot (lot_id)
|
||||
) ENGINE=InnoDB COMMENT='转换批次计费明细(Core 侧自包含,补偿数据源)';
|
||||
|
||||
-- ============================================================
|
||||
-- T+1 受理/确认分离模型新增表(T-1 · 2026-09-11 · 开发计划 v2.0)
|
||||
-- 依据:docs/PRD/PRD-基金转换交易.md §4 · 架构设计-基金转换交易.md v2.1 §9
|
||||
-- ============================================================
|
||||
|
||||
-- 基金转换受理单(6 态权威状态机 · D21):T 日受理只落单不扣份额,
|
||||
-- 在途占用由本表 left join 推导(FR-C21,不新增冻结列);T+1 确认段消费。
|
||||
CREATE TABLE core_convert_request (
|
||||
convert_group_id VARCHAR(64) NOT NULL PRIMARY KEY COMMENT '转换受理单号(= 后续确认段 convert_group_id)',
|
||||
client_request_id VARCHAR(64) NULL COMMENT '客户端幂等键(uk_idem;NULL 可多行)',
|
||||
customer_id VARCHAR(64) NOT NULL,
|
||||
from_product_id VARCHAR(64) NOT NULL COMMENT '转出产品',
|
||||
to_product_id VARCHAR(64) NOT NULL COMMENT '转入产品',
|
||||
qty DECIMAL(18,4) NOT NULL COMMENT '申请转出份额',
|
||||
actual_qty DECIMAL(18,4) NULL COMMENT '实际确认份额(部分成交 R-10;NULL=未确认)',
|
||||
status ENUM('accepted','nav_pending','confirmed','rejected','cancelled','expired') NOT NULL COMMENT '6 态权威状态机',
|
||||
cancel_before DATETIME(3) NULL COMMENT '撤单截止时刻(受理日 15:00;R-9 窗口判定)',
|
||||
requested_at DATETIME(3) NOT NULL COMMENT '受理日(非交易日/超截点顺延到下一交易日,R-5)',
|
||||
confirmed_at DATETIME(3) NULL COMMENT '确认完成时刻(T+1 批处理写入)',
|
||||
coupon DECIMAL(18,2) NULL COMMENT '补差费(确认段回填;价外法 amount_diff)',
|
||||
remark VARCHAR(128) NULL COMMENT '扩展备注(partial=部分成交等)',
|
||||
created_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
|
||||
updated_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
|
||||
UNIQUE KEY uk_idem (client_request_id),
|
||||
KEY idx_customer_status (customer_id, status),
|
||||
KEY idx_status_asof (status, requested_at),
|
||||
CONSTRAINT fk_creq_customer FOREIGN KEY (customer_id) REFERENCES core_customer(customer_id),
|
||||
CONSTRAINT fk_creq_from_product FOREIGN KEY (from_product_id) REFERENCES core_product(product_id),
|
||||
CONSTRAINT fk_creq_to_product FOREIGN KEY (to_product_id) REFERENCES core_product(product_id)
|
||||
) ENGINE=InnoDB COMMENT='基金转换受理单(6 态权威状态机;占用推导源)';
|
||||
|
||||
-- A 股交易日历(Q11 拍板:T+1 工作日确认 / 15:00 顺延均依赖本表)
|
||||
CREATE TABLE core_trade_calendar (
|
||||
cal_date DATE NOT NULL PRIMARY KEY COMMENT '日历日',
|
||||
is_open TINYINT(1) NOT NULL DEFAULT 1 COMMENT '1=交易日 0=休市',
|
||||
remark VARCHAR(64) NULL COMMENT '休市事由(周末/元旦/春节/…)'
|
||||
) ENGINE=InnoDB COMMENT='A股交易日历(依据上交所休市公告)';
|
||||
|
||||
-- 产品级份额舍入规则(D27 / R-13):business_type 维度覆盖 product 级默认;
|
||||
-- 与 core_product.share_digits 二选一优先(T-14 DoD:规则行优先)
|
||||
CREATE TABLE core_share_rule (
|
||||
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
|
||||
product_id VARCHAR(64) NOT NULL,
|
||||
business_type ENUM('subscribe','redeem','convert') NOT NULL,
|
||||
share_digits TINYINT UNSIGNED NOT NULL DEFAULT 2 COMMENT '份额位数(默认 2;个别指数/货基 4)',
|
||||
rounding_mode VARCHAR(16) NOT NULL DEFAULT 'half_up' COMMENT '舍入模式(显式 ROUND_HALF_UP)',
|
||||
UNIQUE KEY uk_product_biz (product_id, business_type),
|
||||
CONSTRAINT fk_share_rule_product FOREIGN KEY (product_id) REFERENCES core_product(product_id)
|
||||
) ENGINE=InnoDB COMMENT='产品份额舍入规则(D27)';
|
||||
|
||||
Reference in New Issue
Block a user