修复all模式月固定收入规则命中隔离问题
This commit is contained in:
@@ -228,6 +228,56 @@ def test_build_rule_hit_plan_should_keep_sql_aligned_target_rules_in_all_mode(mo
|
||||
assert "FIXED_COUNTERPARTY_TRANSFER" in plan["phase2_statement_hit_rules"]
|
||||
|
||||
|
||||
def test_fetch_inner_flow_should_rebalance_all_mode_records_for_monthly_fixed_income(monkeypatch):
|
||||
monkeypatch.setattr("services.file_service.settings.RULE_HIT_MODE", "all")
|
||||
service = FileService(staff_identity_repository=FakeStaffIdentityRepository())
|
||||
|
||||
monkeypatch.setattr(
|
||||
service,
|
||||
"_generate_primary_binding",
|
||||
lambda: ("全命中主体", "6222000099990001"),
|
||||
)
|
||||
|
||||
request = {
|
||||
"groupId": 1001,
|
||||
"dataChannelCode": "test_code",
|
||||
"requestDateId": 20240101,
|
||||
"dataStartDateId": 20240101,
|
||||
"dataEndDateId": 20240131,
|
||||
"uploadUserId": 902001,
|
||||
}
|
||||
|
||||
first_log_id = service.fetch_inner_flow(
|
||||
{
|
||||
**request,
|
||||
"customerNo": "customer_monthly_safe_1",
|
||||
}
|
||||
)["data"][0]
|
||||
second_log_id = service.fetch_inner_flow(
|
||||
{
|
||||
**request,
|
||||
"customerNo": "customer_monthly_safe_2",
|
||||
}
|
||||
)["data"][0]
|
||||
|
||||
first_record = service.file_records[first_log_id]
|
||||
second_record = service.file_records[second_log_id]
|
||||
|
||||
assert "MONTHLY_FIXED_INCOME" in first_record.phase2_statement_hit_rules
|
||||
assert "FIXED_COUNTERPARTY_TRANSFER" not in first_record.phase2_statement_hit_rules
|
||||
assert "SUSPICIOUS_INCOME_KEYWORD" not in first_record.phase1_hit_rules
|
||||
assert "FOREX_SELL_AMT" not in first_record.phase1_hit_rules
|
||||
assert "SINGLE_LARGE_INCOME" not in first_record.large_transaction_hit_rules
|
||||
assert "CUMULATIVE_INCOME" not in first_record.large_transaction_hit_rules
|
||||
assert "ANNUAL_TURNOVER" not in first_record.large_transaction_hit_rules
|
||||
assert "LARGE_CASH_DEPOSIT" not in first_record.large_transaction_hit_rules
|
||||
assert "FREQUENT_CASH_DEPOSIT" not in first_record.large_transaction_hit_rules
|
||||
|
||||
assert "FIXED_COUNTERPARTY_TRANSFER" in second_record.phase2_statement_hit_rules
|
||||
assert "SUSPICIOUS_INCOME_KEYWORD" in second_record.phase1_hit_rules
|
||||
assert "SINGLE_LARGE_INCOME" in second_record.large_transaction_hit_rules
|
||||
|
||||
|
||||
def test_build_rule_hit_plan_should_not_include_placeholder_rules_in_all_mode(monkeypatch):
|
||||
monkeypatch.setattr("services.file_service.settings.RULE_HIT_MODE", "all")
|
||||
service = FileService(staff_identity_repository=FakeStaffIdentityRepository())
|
||||
|
||||
@@ -258,6 +258,58 @@ def test_generate_statements_should_stay_within_single_employee_scope_per_log_id
|
||||
assert {item["cretNo"] for item in statements}.issubset(allowed_id_cards)
|
||||
|
||||
|
||||
def test_all_mode_monthly_fixed_income_log_should_keep_monthly_income_stable(monkeypatch):
|
||||
monkeypatch.setattr("services.file_service.settings.RULE_HIT_MODE", "all")
|
||||
file_service = FileService(staff_identity_repository=FakeStaffIdentityRepository())
|
||||
service = StatementService(file_service=file_service)
|
||||
|
||||
monkeypatch.setattr(
|
||||
file_service,
|
||||
"_generate_primary_binding",
|
||||
lambda: ("全命中主体", "6222000012345678"),
|
||||
)
|
||||
|
||||
request = {
|
||||
"groupId": 1001,
|
||||
"dataChannelCode": "test_code",
|
||||
"requestDateId": 20240101,
|
||||
"dataStartDateId": 20240101,
|
||||
"dataEndDateId": 20240131,
|
||||
"uploadUserId": 902001,
|
||||
}
|
||||
|
||||
first_log_id = file_service.fetch_inner_flow(
|
||||
{**request, "customerNo": "customer_monthly_income_1"}
|
||||
)["data"][0]
|
||||
file_service.fetch_inner_flow(
|
||||
{**request, "customerNo": "customer_monthly_income_2"}
|
||||
)
|
||||
record = file_service.file_records[first_log_id]
|
||||
|
||||
statements = service._generate_statements(group_id=1001, log_id=first_log_id, count=200)
|
||||
|
||||
monthly_amounts = defaultdict(float)
|
||||
for item in statements:
|
||||
if item["cretNo"] != record.staff_id_card:
|
||||
continue
|
||||
if item["crAmount"] <= 0:
|
||||
continue
|
||||
if not item["customerName"]:
|
||||
continue
|
||||
if item["leName"] == item["customerName"]:
|
||||
continue
|
||||
if item["customerName"] == "浙江兰溪农村商业银行股份有限公司" and (
|
||||
any(keyword in item["userMemo"] for keyword in ("代发", "工资", "奖金", "薪酬", "薪金", "补贴", "薪", "年终奖", "年金", "加班费", "劳务费", "劳务外包", "提成", "劳务派遣", "绩效", "酬劳", "PAYROLL", "SALA", "CPF", "directors", "批量代付"))
|
||||
or any(keyword in item["cashType"] for keyword in ("代发", "工资", "劳务费"))
|
||||
):
|
||||
continue
|
||||
monthly_amounts[item["trxDate"][:7]] += item["crAmount"]
|
||||
|
||||
assert monthly_amounts
|
||||
assert len(monthly_amounts) == 6
|
||||
assert set(monthly_amounts.values()) == {7200.0}
|
||||
|
||||
|
||||
def test_generate_statements_should_only_use_recognizable_identity_cards():
|
||||
"""命中样本和随机噪声都只能使用现库可识别的身份证号。"""
|
||||
service = StatementService()
|
||||
|
||||
Reference in New Issue
Block a user