# -*- 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