118 lines
3.8 KiB
Python
118 lines
3.8 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""通用模块"""
|
|
|
|
from typing import Any, Dict, List
|
|
from decimal import Decimal, ROUND_HALF_UP
|
|
|
|
import pandas
|
|
from common import masterdata, rules_engine
|
|
|
|
|
|
def case_adjust(dossier: Dict[str, Any]) -> None:
|
|
"""
|
|
理算赔案并整合至赔案档案
|
|
:param dossier: 赔案档案
|
|
:return: 无
|
|
"""
|
|
# 基于拒付决策规则评估
|
|
if not (result := rules_engine.evaluate(decision="拒付", inputs=dossier)):
|
|
raise RuntimeError("该保险分公司未配置拒付规则")
|
|
|
|
dossier["adjustment_layer"].update(
|
|
{
|
|
"conclusion": (conclusion := result["conclusion"]), # 理赔结论
|
|
"explanation": result["explanation"], # 结论说明
|
|
}
|
|
)
|
|
if conclusion == "拒付":
|
|
return
|
|
|
|
# 赔案理算记录
|
|
adjustments = (
|
|
pandas.DataFrame(data=dossier["receipts_layer"]).assing(
|
|
adjustments=lambda dataframe: dataframe.apply(
|
|
lambda row: receipt_adjust(
|
|
row=row, liabilities=dossier["liabilities_layer"]
|
|
),
|
|
axis="columns",
|
|
) # 票据理算
|
|
)
|
|
).explode("adjustments", ignore_index=True)
|
|
print(adjustments)
|
|
|
|
|
|
def receipt_adjust(
|
|
row: pandas.Series, liabilities: List[Dict[str, Any]]
|
|
) -> List[Dict[str, Any]]:
|
|
"""
|
|
理算票据
|
|
:param row: 一张票据数据
|
|
:param liabilities: 理算责任
|
|
:return: 理算记录
|
|
"""
|
|
# 初始化票据理算记录
|
|
adjustments = []
|
|
# 初始化剩余个人自费金额
|
|
remaining_personal_self_payment = row["personal_self_payment"]
|
|
# 初始化剩余个人自付金额
|
|
remaining_non_medical_payment = row["non_medical_payment"]
|
|
# 初始化剩余合理金额
|
|
remaining_reasonable_amount = row["reasonable_amount"]
|
|
|
|
# 出险事故
|
|
accident = row["accident"]
|
|
# 出险人
|
|
accident_person = row["payer"]
|
|
# 出险日期
|
|
accident_date = row["date"]
|
|
|
|
# 查验状态
|
|
verification = row["verification"]
|
|
|
|
# 初始化理赔责任理算金额
|
|
adjustment_amount = Decimal("0.00")
|
|
# 初始化理赔责任理赔金额
|
|
claim_amount = Decimal("0.00")
|
|
|
|
# 遍历所有理赔责任,根据出险事故、出险人、出险日期和查验状态匹配责任
|
|
for liability in liabilities:
|
|
if (
|
|
accident == liability["accident"]
|
|
and accident_person == liability["insured_person"]
|
|
and liability["commencement_date"]
|
|
<= accident_date
|
|
<= liability["termination_date"]
|
|
and verification == "真票"
|
|
):
|
|
# 理赔责任理算金额
|
|
adjustment_amount = (
|
|
row["personal_self_payment"]
|
|
* liability["personal_self_ratio"] # 个人自费金额
|
|
+ row["non_medical_payment"]
|
|
* liability["non_medical_ratio"] # 个人自付金额
|
|
+ row["reasonable_amount"] * liability["reasonable_ratio"] # 合理金额
|
|
).quantize(
|
|
Decimal("0.00"),
|
|
rounding=ROUND_HALF_UP,
|
|
)
|
|
|
|
# 据变动保单唯一标识查询最新一条保额变动记录的变动后金额(理赔责任的理赔保单余额)
|
|
remaining_amount = masterdata.query_remaining_amount(
|
|
policy_guid=liability["policy_guid"],
|
|
)
|
|
# 理赔责任理赔金额
|
|
claim_amount = min(
|
|
remaining_amount,
|
|
adjustment_amount,
|
|
)
|
|
|
|
# 初始化票据理算记录
|
|
adjustment = {
|
|
"liability": liability["liability"], # 理赔责任名称
|
|
"type": row["就诊类型"],
|
|
"amount": row["合理金额"],
|
|
"payable": 0.0,
|
|
}
|
|
|
|
return adjustments
|