9.4 KiB
9.4 KiB
演示机数据插入规则
文档定位
本文交给演示机实施人员使用,用于准备风控模块演示所需的上游业务数据。 风控预警和通知是派生数据,必须由扫描器生成,不允许为了让页面“有数据”而直接插入。
适用前置条件:
- 演示机已完成最新 Alembic 迁移。
- 风控角色、权限和数据范围已经初始化。
- 演示环境时间口径为北京时间,数据库时间字段使用 UTC naive。
- 风控页面使用正式主项目前端。
一、固定原则
- 可以写入
sys_user、fin_customer_profile、fin_product、fin_sim_account、fin_holding、fin_sim_order、fin_transaction、fin_capital_flow、sys_login_record、biz_work_order、fin_risk_assessment。 - 禁止直接写入
fin_risk_alert和fin_risk_notification。 - 演示客户和产品使用独立号段,不覆盖真实或已有演示数据。
- 所有业务编号必须唯一,重复执行时按业务编号做幂等更新。
- 时间字段必须是 UTC naive。业务判断中的凌晨、当日、日期范围按北京时间换算。
- 客户风险等级在
sys_user.investor_type和fin_customer_profile.investor_type中必须一致。 - 预警扫描产生的结果由系统负责生成证据快照、合并规则和通知记录。
二、建议插入顺序
fin_product,并确认产品风险等级和风险揭示要求。sys_user和sys_user_role,客户绑定customer角色。fin_customer_profile,同步客户风险等级、年龄、总资产和行为分。fin_risk_assessment,保证客户画像和适当性链路完整。fin_sim_account,保证客户有模拟账户。fin_holding,保证持仓和豁免额度证据存在。biz_work_order,先建工单,再让交易引用。fin_sim_order,为每笔交易建立模拟委托。fin_transaction,写入申购或赎回成交记录。fin_capital_flow,补入金、出金和资金到账时间。sys_login_record,补交易前的成功登录和非固定设备证据。- 回到风控页面执行手动扫描,生成预警和通知。
三、字段和取值规则
sys_user
必须满足:
user_type = 'customer'。status = '正常'。fund_account_status = '已开户'。investor_type必须为C1、C2、C3、C4或C5。is_professional_investor = 0,除非该演示场景需要专业投资者身份。professional_investor_status = 'none',除非有单独的合规依据。sys_user_role必须关联customer角色,不能只建用户不建角色。
fin_customer_profile
customer_id必须与sys_user.id一致。trade_account必须与模拟账户号一致。investor_type必须与sys_user.investor_type一致。birth_date必须可计算年龄,RW-012 年龄要求不小于 65 岁。total_asset必须为正数,豁免比例场景需要它。behavior_score使用 0 至 20 分制。preferred_asset_class建议写 JSON 数组,例如["固定收益类", "权益类"]。
fin_product
product_code使用独立演示编码,不能与正式产品重复。status = '上市'。risk_level必须为R1、R2、R3、R4或R5。risk_disclosure_required、second_confirmation_required、recording_required只能为 0 或 1。- 要触发 RW-007 缺失留痕场景,相关要求字段必须为 1,且对应工单字段为空。
- C3 配置 R4、C4 配置 R5 时,还要保证
total_asset和fin_holding.current_value口径一致,才能测试豁免额度。
fin_sim_account
customer_id必须存在。currency = 'CNY'。status = '正常'。cash_balance、available_cash、initial_balance必须为合理正数。account_no建议使用稳定编号,例如FSA{客户ID}。
fin_holding
customer_id、trade_account、product_id必须有效。shares、total_quantity、available_quantity、current_value必须为正。current_value应与持仓数量和最新净值口径一致。- RW-007 豁免场景中,
current_value / fin_customer_profile.total_asset必须能够超过 20% 或 10% 的豁免上限。
fin_sim_order
- 每笔
fin_transaction必须关联一个有效order_id。 order_side使用交易接口实际口径buy或sell。status使用已成交。quote_source可以使用演示来源,但必须能让页面识别。quote_at、submitted_at、created_at、updated_at使用 UTC naive 时间。
fin_transaction
transaction_type必须使用申购或赎回,风控扫描按这两个值识别。order_side使用buy或sell,规则不依赖该字段判断方向。customer_id、account_id、product_id必须有效。amount必须为正数,且与gross_amount、net_amount的口径保持一致。confirmed_at必须非空,风控扫描按该时间计算时间窗口。- 同一笔风险场景不要生成多笔近似重复交易,以免影响历史均值。
- 需要触发工单规则时,
work_order_id必须指向有效工单。
fin_capital_flow
flow_type使用入金或对应真实业务类型。- RW-003 必须使用
flow_type = '入金'。 - RW-003 的
status必须为成功。 - RW-003 的
settled_at必须不晚于赎回交易confirmed_at。 - RW-003 的
settled_at必须处于赎回时间前 3 天内。 customer_id、account_id必须与交易一致。
sys_login_record
user_id必须为目标客户。login_result = '成功'。login_at必须早于或等于风险交易confirmed_at。- RW-012 需要
is_common_device = 0。 - 设备编号不能为空,建议使用可识别的演示设备号。
biz_work_order
work_order_no必须唯一。customer_id、product_id必须有效。channel是 RW-018 的关键字段:定投自动定投
- 要触发 RW-007 缺失留痕,按产品要求留空对应字段:
risk_disclosure_ack_atsecond_confirmation_atrecording_reference
- 要测试正常放行场景,则应把产品要求的字段全部补齐。
fin_risk_assessment
customer_id必须存在。questionnaire_version使用独立演示版本。investor_type必须与客户画像一致。assessed_at、valid_until必须有效。- 风控扫描本身不依赖该表,但客户证据和画像页面需要它。
四、规则场景矩阵
| 规则 | 客户准备 | 产品准备 | 交易准备 | 其他证据 | 预期 |
|---|---|---|---|---|---|
| RW-003 | C3 或 C4 客户 | R3 产品 | 赎回金额达到 50 万,赎回比例达到 80% | 3 天内有成功入金流水 | 高风险 |
| RW-007 | C1 客户 | R4 或 R5 产品,风险揭示或二次确认要求为 1 | 申购记录 | 工单对应留痕缺失 | 高风险 |
| RW-007 | C3 客户 | R4 产品,风险揭示要求为 1 | 申购记录 | 工单缺少风险揭示 | 中风险 |
| RW-012 | 65 岁以上客户 | 任意可赎回产品 | 赎回金额达到 30 万,且达到历史均值 3 倍 | 交易前成功登录,非固定设备 | 高风险 |
| RW-015 | 任意客户 | 任意产品 | 北京时间 00:00 至 05:59,金额不超过 1 万 | 无需额外证据 | 低风险 |
| RW-018 | 任意客户 | 任意产品 | 交易关联工单 | 工单渠道为 定投 或 自动定投 |
低风险 |
| 合并 | 任意客户 | 任意产品 | 同一交易同时满足 RW-015 和 RW-018 | 凌晨小额自动定投 | 一条合并预警 |
五、时间生成规则
演示机不要写死日期,建议按当前时间动态生成:
| 字段 | 时间关系 |
|---|---|
RW-003 入金 settled_at |
当前时间减 1 天 |
RW-003 赎回 confirmed_at |
当前时间 |
RW-012 历史交易 confirmed_at |
当前时间减 30 至 60 天 |
RW-012 登录 login_at |
当前时间减 2 小时 |
RW-012 当前赎回 confirmed_at |
当前时间 |
RW-015 交易 confirmed_at |
北京时间当天或前一天 02:00 至 05:59 |
数据库写入前必须将北京时间转换为 UTC naive。
六、插入后检查
至少执行以下检查:
sys_user.investor_type与fin_customer_profile.investor_type完全一致。- 每个客户都有有效模拟账户和至少一笔持仓。
- 每笔交易都有对应的
order_id。 - 需要触发 RW-003 的客户都有成功入金流水,且入金时间处于赎回前 3 天内。
- 需要触发 RW-012 的客户都有交易前成功登录记录,且
is_common_device = 0。 - 需要触发 RW-007 的工单留痕字段确实缺失,或豁免比例确实超过上限。
- 每个演示客户的交易数量足以支持历史均值计算,至少应有一笔历史对比交易。
- 扫描后检查
fin_risk_alert.trigger_rule_codes、alert_level和related_transaction_id是否符合预期。
七、扫描后的验收
数据插入完成后,由演示机执行风控扫描,再检查:
- 预警数量是否新增。
- 每笔交易命中的规则是否正确。
- 风险等级是否正确。
- 证据详情是否能关联到客户、产品、交易、资金、登录和工单。
- 同一交易命中多条规则时是否合并为一条预警。
- 高风险预警是否产生通知记录。
- 邮件开关和收件人配置是否符合演示要求。
如果扫描没有产生预警,首先检查源数据字段、枚举值、时间和关联关系,不要通过直接修改
fin_risk_alert 来掩盖问题。