535d97a70c
17-table PostgreSQL schema with full Chinese column comments, FastAPI project structure (admin/common/modules), DSL rule files, and schema migration scripts.
323 lines
13 KiB
YAML
323 lines
13 KiB
YAML
# ═════════════════════════════════════════════════════════════════
|
||
# 借款合同 · 回归测试用例
|
||
# ═════════════════════════════════════════════════════════════════
|
||
# 配套文件:contract_loan.yaml
|
||
# 重点展示:multi_entity / derived fields / external 数据源 mock
|
||
|
||
target: contract_loan.yaml
|
||
|
||
# 外部数据源的 mock 值(替代真实 API 调用)
|
||
external_mocks:
|
||
lpr_lookup:
|
||
"1y": 0.0345 # 当前 1 年 LPR = 3.45%
|
||
# 推导:LPR_4x = 0.0345 * 4 = 0.138
|
||
|
||
fixtures:
|
||
|
||
# ═════════════════════════════════════════════════════════════
|
||
# JK-001 · 借款主体合法性
|
||
# ═════════════════════════════════════════════════════════════
|
||
JK-001:
|
||
- name: 已执行-借贷双方合法
|
||
phase: executed
|
||
extract:
|
||
借款人姓名: 张三
|
||
借款人身份证: "110101197001011234"
|
||
出借人姓名: 李四
|
||
出借人身份证: "310102198505051234"
|
||
expected: pass
|
||
|
||
- name: 已执行-借款人身份证校验失败
|
||
phase: executed
|
||
extract:
|
||
借款人姓名: 张三
|
||
借款人身份证: "110101197001011230" # 末位错
|
||
出借人姓名: 李四
|
||
出借人身份证: "310102198505051234"
|
||
expected: fail
|
||
|
||
- name: 草稿-只有姓名
|
||
phase: draft
|
||
extract:
|
||
借款人姓名: 张三
|
||
出借人姓名: 李四
|
||
expected: pass # 草稿阶段身份证待补
|
||
|
||
# ═════════════════════════════════════════════════════════════
|
||
# JK-002 · 利率不超过 LPR × 4(核心规则)
|
||
# 依赖 external.lpr_lookup mock:LPR_4x = 0.138
|
||
# ═════════════════════════════════════════════════════════════
|
||
JK-002:
|
||
- name: 年利率 10% 合规
|
||
phase: executed
|
||
extract:
|
||
年利率: 0.10
|
||
# derived.LPR_4x = 0.138(mock 值)
|
||
expected: pass
|
||
|
||
- name: 年利率 20% 超限
|
||
phase: executed
|
||
extract:
|
||
年利率: 0.20
|
||
expected: fail
|
||
|
||
- name: 年利率正好等于 LPR×4(边界)
|
||
phase: executed
|
||
extract:
|
||
年利率: 0.138
|
||
expected: fail # money.lt 严格小于
|
||
|
||
- name: 年利率 0.137 边界内
|
||
phase: executed
|
||
extract:
|
||
年利率: 0.137
|
||
expected: pass
|
||
|
||
# ═════════════════════════════════════════════════════════════
|
||
# JK-003 · 所有担保人身份合法(multi-entity 核心测试)
|
||
# ═════════════════════════════════════════════════════════════
|
||
JK-003:
|
||
- name: 三担保人全合法
|
||
phase: executed
|
||
extract:
|
||
担保人:
|
||
- {姓名: 张三, 身份证号: "110101197001011234", 担保金额: 500000, 担保方式: 连带责任保证}
|
||
- {姓名: 李四, 身份证号: "310102198505051234", 担保金额: 800000, 担保方式: 连带责任保证}
|
||
- {姓名: 王五, 身份证号: "440103199212121234", 担保金额: 300000, 担保方式: 一般保证}
|
||
expected: pass
|
||
|
||
- name: 第二个担保人身份证校验失败
|
||
phase: executed
|
||
extract:
|
||
担保人:
|
||
- {姓名: 张三, 身份证号: "110101197001011234", 担保金额: 500000, 担保方式: 连带责任保证}
|
||
- {姓名: 李四, 身份证号: "310102198505051230", 担保金额: 800000, 担保方式: 连带责任保证} # 末位错
|
||
- {姓名: 王五, 身份证号: "440103199212121234", 担保金额: 300000, 担保方式: 一般保证}
|
||
expected: fail # [*] 遍历,任一失败整体 fail
|
||
|
||
- name: 第一个担保人姓名缺失
|
||
phase: executed
|
||
extract:
|
||
担保人:
|
||
- {姓名: null, 身份证号: "110101197001011234", 担保金额: 500000, 担保方式: 连带责任保证}
|
||
- {姓名: 李四, 身份证号: "310102198505051234", 担保金额: 800000, 担保方式: 连带责任保证}
|
||
expected: fail
|
||
|
||
- name: 无担保人(规则跳过)
|
||
phase: executed
|
||
extract:
|
||
担保人: []
|
||
expected: skipped # activate_if 条件不满足
|
||
|
||
# ═════════════════════════════════════════════════════════════
|
||
# JK-004 · 担保总额覆盖借款本金(sum_ge 聚合)
|
||
# ═════════════════════════════════════════════════════════════
|
||
JK-004:
|
||
- name: 担保覆盖
|
||
phase: executed
|
||
extract:
|
||
借款本金: 1500000
|
||
担保人:
|
||
- {姓名: 张三, 担保金额: 500000, 担保方式: 连带责任保证}
|
||
- {姓名: 李四, 担保金额: 800000, 担保方式: 连带责任保证}
|
||
- {姓名: 王五, 担保金额: 300000, 担保方式: 一般保证}
|
||
# derived.担保总额 = 1600000 >= 借款本金 1500000
|
||
expected: pass
|
||
|
||
- name: 担保不足
|
||
phase: executed
|
||
extract:
|
||
借款本金: 2000000
|
||
担保人:
|
||
- {姓名: 张三, 担保金额: 500000, 担保方式: 连带责任保证}
|
||
- {姓名: 李四, 担保金额: 800000, 担保方式: 连带责任保证}
|
||
# derived.担保总额 = 1300000 < 借款本金 2000000
|
||
expected: fail
|
||
|
||
- name: 担保恰好等于本金
|
||
phase: executed
|
||
extract:
|
||
借款本金: 1000000
|
||
担保人:
|
||
- {姓名: 张三, 担保金额: 1000000, 担保方式: 连带责任保证}
|
||
expected: pass
|
||
|
||
# ═════════════════════════════════════════════════════════════
|
||
# JK-005 · 禁止利滚利
|
||
# ═════════════════════════════════════════════════════════════
|
||
JK-005:
|
||
- name: 正常违约条款
|
||
phase: executed
|
||
extract:
|
||
违约责任: 借款人逾期还款的,按每日 0.05% 支付违约金,违约金不超过借款本金 30%
|
||
借款用途: 企业日常经营周转
|
||
expected: pass
|
||
|
||
- name: 出现利滚利字样
|
||
phase: executed
|
||
extract:
|
||
违约责任: 借款人违约的,利息计入本金后继续计息,利滚利
|
||
借款用途: 企业日常经营周转
|
||
expected: fail
|
||
|
||
- name: 借款用途违法
|
||
phase: executed
|
||
extract:
|
||
违约责任: 正常违约金条款
|
||
借款用途: 用于赌博和非法经营活动
|
||
expected: fail
|
||
|
||
- name: 出现砍头息
|
||
phase: executed
|
||
extract:
|
||
违约责任: 出借人有权预扣利息,砍头息为借款的 10%
|
||
借款用途: 经营周转
|
||
expected: fail
|
||
|
||
# ═════════════════════════════════════════════════════════════
|
||
# JK-006 · 违约金不超过 30%(ratio_within)
|
||
# ═════════════════════════════════════════════════════════════
|
||
JK-006:
|
||
- name: 违约金 20%(合规)
|
||
phase: executed
|
||
extract:
|
||
借款本金: 1000000
|
||
违约金金额: 200000
|
||
# derived.违约金比例 = 0.20
|
||
expected: pass
|
||
|
||
- name: 违约金 35%(超限)
|
||
phase: executed
|
||
extract:
|
||
借款本金: 1000000
|
||
违约金金额: 350000
|
||
expected: fail
|
||
|
||
- name: 违约金 30%(边界,恰好到上限)
|
||
phase: executed
|
||
extract:
|
||
借款本金: 1000000
|
||
违约金金额: 300000
|
||
expected: pass # ratio_within max=0.30 是闭区间
|
||
|
||
# ═════════════════════════════════════════════════════════════
|
||
# JK-007 · 借款本金大小写一致性
|
||
# ═════════════════════════════════════════════════════════════
|
||
JK-007:
|
||
- name: 大小写一致
|
||
phase: executed
|
||
extract:
|
||
借款本金: 1000000
|
||
借款本金大写: 壹佰万元整
|
||
expected: pass
|
||
|
||
- name: 大小写不一致
|
||
phase: executed
|
||
extract:
|
||
借款本金: 1000000
|
||
借款本金大写: 壹拾万元整 # 差一位
|
||
expected: fail
|
||
|
||
# ═════════════════════════════════════════════════════════════
|
||
# JK-008 · 借款期限合理性(带 depends_on)
|
||
# ═════════════════════════════════════════════════════════════
|
||
JK-008:
|
||
- name: 正常期限
|
||
phase: executed
|
||
extract:
|
||
借款人姓名: 张三
|
||
借款人身份证: "110101197001011234"
|
||
出借人姓名: 李四
|
||
出借人身份证: "310102198505051234"
|
||
借款日期: "2024-01-01"
|
||
还款日期: "2025-01-01"
|
||
签订日期: "2024-01-01"
|
||
expected: pass
|
||
|
||
- name: 借款日期晚于还款日期
|
||
phase: executed
|
||
extract:
|
||
借款人姓名: 张三
|
||
借款人身份证: "110101197001011234"
|
||
出借人姓名: 李四
|
||
出借人身份证: "310102198505051234"
|
||
借款日期: "2024-06-01"
|
||
还款日期: "2024-01-01" # ← 颠倒
|
||
签订日期: "2024-01-01"
|
||
expected: fail
|
||
|
||
- name: 依赖规则失败时本规则被跳过
|
||
phase: executed
|
||
extract:
|
||
借款人姓名: 张三
|
||
借款人身份证: "110101197001011230" # JK-001 会失败
|
||
出借人姓名: 李四
|
||
出借人身份证: "310102198505051234"
|
||
借款日期: "2024-01-01"
|
||
还款日期: "2025-01-01"
|
||
expected: skipped_dependency # JK-001 失败 → 本规则跳过
|
||
|
||
# ═════════════════════════════════════════════════════════════
|
||
# JK-SEAL-001 · 双方签章
|
||
# ═════════════════════════════════════════════════════════════
|
||
JK-SEAL-001:
|
||
- name: 双方签章齐全
|
||
phase: executed
|
||
extract:
|
||
借款人姓名: 张三
|
||
出借人姓名: 李四
|
||
visual_manifest:
|
||
seals:
|
||
- id: 借款人签章
|
||
detection_score: 0.94
|
||
ocr_text: 张三
|
||
- id: 出借人签章
|
||
detection_score: 0.92
|
||
ocr_text: 李四
|
||
expected: pass
|
||
|
||
- name: 缺出借人签章
|
||
phase: executed
|
||
extract:
|
||
借款人姓名: 张三
|
||
出借人姓名: 李四
|
||
visual_manifest:
|
||
seals:
|
||
- id: 借款人签章
|
||
detection_score: 0.94
|
||
ocr_text: 张三
|
||
expected: fail
|
||
|
||
- name: 草稿阶段无签章(规则跳过)
|
||
phase: draft
|
||
extract:
|
||
借款人姓名: 张三
|
||
出借人姓名: 李四
|
||
visual_manifest:
|
||
seals: []
|
||
expected: skipped_phase
|
||
|
||
# ═════════════════════════════════════════════════════════════
|
||
# JK-GROUP-INTEREST · 利率合规总判定(规则组)
|
||
# ═════════════════════════════════════════════════════════════
|
||
JK-GROUP-INTEREST:
|
||
- name: 全部子规则通过
|
||
phase: executed
|
||
extract:
|
||
年利率: 0.10
|
||
违约责任: 正常违约金条款
|
||
借款用途: 经营周转
|
||
借款本金: 1000000
|
||
违约金金额: 200000
|
||
expected: pass
|
||
|
||
- name: 子规则 JK-002 失败导致组失败
|
||
phase: executed
|
||
extract:
|
||
年利率: 0.25 # 超限
|
||
违约责任: 正常违约金条款
|
||
借款用途: 经营周转
|
||
借款本金: 1000000
|
||
违约金金额: 200000
|
||
expected: fail
|