From 87ac2da670274f2c04dd460958e69201c636b379 Mon Sep 17 00:00:00 2001 From: liubiren Date: Mon, 12 Jan 2026 21:41:46 +0800 Subject: [PATCH] 1 --- utils/html_render.py | 81 + 票据理赔自动化/case.py | 270 +-- 票据理赔自动化/database.db | Bin 85553152 -> 85553152 bytes 票据理赔自动化/dossiers/254728869001.html | 2406 +++++++++++++++++++++ 票据理赔自动化/image.py | 104 +- 票据理赔自动化/main.py | 81 +- 票据理赔自动化/masterdata.py | 92 +- 票据理赔自动化/template.html | 1375 ++++++------ 8 files changed, 3533 insertions(+), 876 deletions(-) create mode 100644 utils/html_render.py diff --git a/utils/html_render.py b/utils/html_render.py new file mode 100644 index 0000000..abe3b9b --- /dev/null +++ b/utils/html_render.py @@ -0,0 +1,81 @@ +# -*- coding: utf-8 -*- +""" +HTML渲染器 +""" + +from datetime import datetime +from pathlib import Path +from typing import Any, Dict + +from jinja2 import Environment, FileSystemLoader + + +def datetime_to_str(field): + """ + 渲染模板时,若字段为datetime对象则转为字符串 + :param field: 字段 + :return: 字符串 + """ + if isinstance(field, datetime): + if field == datetime(9999, 12, 31): + return "长期" + if field.hour == 0 and field.minute == 0 and field.second == 0: + return field.strftime("%Y-%m-%d") + return field.strftime("%Y-%m-%d %H:%M:%S") + else: + return field + + +def str_to_str(field): + """ + 渲染模板时,若字段为字符串则转空字符串 + :param field: 字段 + :return: 字符串 + """ + if isinstance(field, str): + return field + return "" + + +class HTMLRenderer: + """ + HTML渲染器,支持: + 基于模板,根据数据字典渲染HTML文档 + """ + + def __init__(self, template_path: Path): + """ + 初始化HTML渲染器 + :param template_path: 模板路径 + """ + # 实例化jinja2环境 + self.environment = Environment( + loader=FileSystemLoader(searchpath=template_path.parent) + ) + # 设置过滤器 + self.environment.filters.update( + { + "datetime_to_str": datetime_to_str, + "str_to_str": str_to_str, + } + ) + # 加载指定模板 + self.template = self.environment.get_template(template_path.name) + + def render(self, obj: Dict[str, Any], output_path: Path) -> None: + """ + 根据数据字典渲染HTML文档 + :param obj: 数据字典 + :param output_path: HTML文档输出路径 + :return: 无 + """ + try: + with open( + file=output_path, + mode="w", + encoding="utf-8", + ) as file: + file.write(self.template.render(obj=obj)) # 在模板中需以obj获取键值 + + except Exception as exception: + print(f"根据数据字典渲染HTML文档发生异常:{str(exception)}") diff --git a/票据理赔自动化/case.py b/票据理赔自动化/case.py index 62ba2d9..4d229ea 100644 --- a/票据理赔自动化/case.py +++ b/票据理赔自动化/case.py @@ -3,13 +3,14 @@ from decimal import Decimal, ROUND_HALF_UP from pathlib import Path +import sys from typing import Any, Dict, List -from datetime import datetime -from jinja2 import Environment, FileSystemLoader -import pandas from common import masterdata, rules_engine +sys.path.append(Path(__file__).parent.parent.as_posix()) +from utils.html_render import HTMLRenderer + def case_adjust(dossier: Dict[str, Any]) -> None: """ @@ -30,139 +31,134 @@ def case_adjust(dossier: Dict[str, Any]) -> None: if conclusion == "拒付": return - # 赔案理算记录 - receipts_adjustments = ( - ( - pandas.DataFrame(data=dossier["receipts_layer"]).assign( - receipt_adjustments=lambda dataframe: dataframe.apply( - lambda row: receipt_adjust( - row=row, liabilities=dossier["liabilities_layer"] - ), - axis="columns", - ) # 票据理算 - ) + # 就票据层按照开票日期和票据号顺序排序 + dossier["receipts_layer"].sort(key=lambda x: (x["date"], x["number"])) + + # 遍历票据层内所有票据,票据理算并添加理算记录 + for idx, receipt in enumerate(dossier["receipts_layer"]): + # 添加理算记录 + dossier["receipts_layer"][idx]["adjustments"] = receipt_adjust( + receipt=receipt, liabilities=dossier["liabilities_layer"] ) - .explode(column="receipt_adjustments", ignore_index=True) - .pipe( - lambda dataframe: pandas.concat( + # 票据理算金额 + dossier["receipts_layer"][idx]["adjustment_amount"] = Decimal( + sum( [ - dataframe.drop( - [ - "receipt_adjustments", - ], - axis="columns", - ), - pandas.json_normalize(dataframe["receipt_adjustments"]), - ], - axis="columns", + adjustment["adjustment_amount"] + for adjustment in dossier["receipts_layer"][idx]["adjustments"] + ] ) + ).quantize( + exp=Decimal("0.00"), + rounding=ROUND_HALF_UP, ) - ) - - dossier["receipts_layer"] = receipts_adjustments.to_dict(orient="records") - - print(dossier["receipts_layer"]) # 赔案理算金额 - dossier["adjustment_layer"].update( - { - "adjustment_amount": ( - receipts_adjustments["adjustment_amount"] - .sum() - .quantize( - Decimal("0.00"), - rounding=ROUND_HALF_UP, - ) - ), # 理算金额 - } - ) - - # 实例化JINJA2 - environment = Environment( - loader=FileSystemLoader(file_path := Path(__file__).parent) - ) - # 添加过滤器 - environment.filters["DateTime"] = lambda i: ( - i.strftime("%Y-%m-%d") if i != datetime(9999, 12, 31) else "长期" - ) - # 加载赔案档案模版 - template = environment.get_template("template.html") - - with open( - file_path / f"dossiers/{dossier["report_layer"]["case_number"]}.html", - "w", - encoding="utf-8", - ) as file: - file.write(template.render(dossier=dossier)) - - -def receipt_adjust( - row: pandas.Series, liabilities: List[Dict[str, Any]] -) -> List[Dict[str, Any]]: - """ - 理算票据 - :param row: 票据数据 - :param liabilities: 理算责任 - :return: 理算记录 - """ - # 初始化票据理算记录 - receipt_adjustments = [] - - # 初始化票据剩余可理算金额 - remaining_adjustable_amount = ( - row["personal_self_payment"] - + row["non_medical_payment"] - + row["reasonable_amount"] - ).quantize( # type: ignore[reportAttributeAccessIssue] - Decimal("0.00"), + dossier["adjustment_layer"]["adjustment_amount"] = Decimal( + sum( + [ + adjustment["adjustment_amount"] + for receipt in dossier["receipts_layer"] + for adjustment in receipt["adjustments"] + ] + ) + ).quantize( + exp=Decimal("0.00"), rounding=ROUND_HALF_UP, ) - # 遍历所有理赔责任,根据出险人、出险事故、查验状态和出险日期匹配理赔责任 + # 实例化HTML渲染器 + html_renderer = HTMLRenderer(template_path=Path(__file__).parent / "template.html") + # 根据赔案档案渲染HTML文档 + html_renderer.render( + obj=dossier, + output_path=Path(__file__).parent + / "dossiers" + / f"{dossier["report_layer"]["case_number"]}.html", + ) + + +def receipt_adjust( + receipt: Dict[str, Any], liabilities: List[Dict[str, Any]] +) -> List[Dict[str, Any]]: + """ + 理算票据 + :param receipt: 票据数据字典 + :param liabilities: 理算责任 + :return: 理算记录 + """ + # 初始化理算记录 + adjustments = [] + + # 初始化票据剩余理算金额 + remaining_adjustment_amount = masterdata.query_remaining_adjustment_amount( + receipt_number=receipt["number"], + ) + if remaining_adjustment_amount is None: + remaining_adjustment_amount = ( + receipt["personal_self_payment"] # 个人自费金额 + + receipt["non_medical_payment"] # 个人自付金额 + + receipt["reasonable_amount"] # 合理金额 + ).quantize( + exp=Decimal("0.00"), + rounding=ROUND_HALF_UP, + ) + + # 遍历所有理赔责任,根据出险人、理赔类型、查验状态和出险日期匹配理赔责任 for liability in liabilities: if ( - row["payer"] in [liability["insured_person"] for liability in liabilities] - and row["accident"] == liability["accident"] - and row["verification"] in ["真票", "无法查验"] + receipt["payer"] + in [liability["insured_person"] for liability in liabilities] + and receipt["accident"] == liability["accident"] + and receipt["verification"] in ["真票", "无法查验"] and liability["commencement_date"] - <= row["date"] + <= receipt["date"] <= liability["termination_date"] ): - # 个单余额 - remaining_amount = masterdata.query_remaining_amount( + # 个单剩余保额 + remaining_coverage_amount = masterdata.query_after_change_amount( person_policy_guid=liability["person_policy_guid"], ) # 个人自费可理算金额 personal_self_adjustable_amount = ( - row["personal_self_payment"] - * liability["personal_self_ratio"] + receipt["personal_self_payment"] # 个人自费金额 + * liability["personal_self_ratio"] # 个人自费理算比例 * Decimal("0.01") + ).quantize( + exp=Decimal("0.00"), + rounding=ROUND_HALF_UP, ) # 个人自付可理算金额 non_medical_adjustable_amount = ( - row["non_medical_payment"] - * liability["non_medical_ratio"] + receipt["non_medical_payment"] # 个人自付金额 + * liability["non_medical_ratio"] # 个人自付理算比例 * Decimal("0.01") + ).quantize( + exp=Decimal("0.00"), + rounding=ROUND_HALF_UP, ) # 合理可理算金额 reasonable_adjustable_amount = ( - row["reasonable_amount"] - * liability["reasonable_ratio"] + receipt["reasonable_amount"] # 合理金额 + * liability["reasonable_ratio"] # 合理理算比例 * Decimal("0.01") + ).quantize( + exp=Decimal("0.00"), + rounding=ROUND_HALF_UP, ) # 理算金额 adjustment_amount = max( Decimal("0.00"), min( - remaining_adjustable_amount, - remaining_amount, + remaining_adjustment_amount, # 剩余理算金额 + remaining_coverage_amount, # 个单剩余保额 adjustable_amount := ( ( - personal_self_adjustable_amount - + non_medical_adjustable_amount - + reasonable_adjustable_amount + personal_self_adjustable_amount # 个人自费可理算金额 + + non_medical_adjustable_amount # 个人自付可理算金额 + + reasonable_adjustable_amount # 合理可理算金额 ).quantize( Decimal("0.00"), rounding=ROUND_HALF_UP, @@ -175,35 +171,44 @@ def receipt_adjust( if adjustment_amount > Decimal("0.00"): masterdata.add_coverage_change( person_policy_guid=liability["person_policy_guid"], - before_change_amount=remaining_amount, + before_change_amount=remaining_coverage_amount, change_amount=adjustment_amount, ) - receipt_adjustments.append( + adjustments.append( { + "group_policy": liability["group_policy"], # 团单号 "person_policy": liability["person_policy"], # 个单号 "liability": liability["liability"], # 理赔责任名称 - "personal_self_payment": row[ + "accident": liability["accident"], # 理赔类型 + "personal_self_payment": receipt[ "personal_self_payment" ], # 个人自费金额 "personal_self_ratio": liability[ "personal_self_ratio" - ], # 个人自费比例 + ], # 个人自费理算比例 "personal_self_adjustable_amount": personal_self_adjustable_amount, # 个人自费可理算金额 - "non_medical_payment": row["non_medical_payment"], # 个人自付金额 - "non_medical_ratio": liability["non_medical_ratio"], # 个人自付比例 + "non_medical_payment": receipt[ + "non_medical_payment" + ], # 个人自付金额 + "non_medical_ratio": liability[ + "non_medical_ratio" + ], # 个人自付理算比例 "non_medical_adjustable_amount": non_medical_adjustable_amount, # 个人自付可理算金额 - "reasonable_amount": row["reasonable_amount"], # 合理可理算金额 - "reasonable_ratio": liability["reasonable_ratio"], # 合理部分比例 + "reasonable_amount": receipt["reasonable_amount"], # 合理金额 + "reasonable_ratio": liability["reasonable_ratio"], # 合理理算比例 "reasonable_adjustable_amount": reasonable_adjustable_amount, # 合理可理算金额 + "remaining_adjustment_amount": remaining_adjustment_amount, # 剩余理算金额 + "remaining_coverage_amount": remaining_coverage_amount, # 个单剩余保额 + "adjustable_amount": adjustable_amount, # 可理算金额 "adjustment_amount": adjustment_amount, # 理算金额 "adjustment_explanation": f""" - 1、应理算金额:{remaining_adjustable_amount:.2f}; - 2、个单余额:{remaining_amount:.2f}; + 1、剩余理算金额:{remaining_adjustment_amount:.2f}; + 2、个单剩余保额:{remaining_coverage_amount:.2f}; 3、可理算金额:{adjustable_amount:.2f},其中: - 1)个人自费可理算金额:{personal_self_adjustable_amount:.2f}={row['personal_self_payment']:.2f}*{liability['personal_self_ratio']:.2f}%; - 2)个人自付可理算金额:{non_medical_adjustable_amount:.2f}={row['non_medical_payment']:.2f}*{liability['non_medical_ratio']:.2f}%; - 3)合理部分可理算金额:{reasonable_adjustable_amount:.2f}={row['reasonable_amount']:.2f}*{liability['reasonable_ratio']:.2f}%; + 1)个人自费可理算金额:{personal_self_adjustable_amount:.2f}={receipt['personal_self_payment']:.2f}*{liability['personal_self_ratio']:.2f}%; + 2)个人自付可理算金额:{non_medical_adjustable_amount:.2f}={receipt['non_medical_payment']:.2f}*{liability['non_medical_ratio']:.2f}%; + 3)合理部分可理算金额:{reasonable_adjustable_amount:.2f}={receipt['reasonable_amount']:.2f}*{liability['reasonable_ratio']:.2f}%; 4、理算金额:{adjustment_amount:.2f},即上述应理算金额、个人余额和可理算金额的最小值。 """.replace( "\n", "" @@ -213,28 +218,41 @@ def receipt_adjust( } ) - remaining_adjustable_amount -= adjustment_amount - # 若剩余可理算金额小于等于0则跳出循环 - if remaining_adjustable_amount <= Decimal("0.00"): + remaining_adjustment_amount -= adjustment_amount + # 若剩余理算金额小于等于0则跳出循环 + if remaining_adjustment_amount <= Decimal("0.00"): break - if not receipt_adjustments: - receipt_adjustments.append( + if not adjustments: + adjustments.append( { + "group_policy": None, # 团单号 "person_policy": None, # 个单号 "liability": None, # 理赔责任名称 - "personal_self_payment": None, # 个人自费金额 - "personal_self_ratio": None, # 个人自费比例 + "accident": None, # 理赔类型 + "personal_self_payment": receipt[ + "personal_self_payment" + ], # 个人自费金额 + "personal_self_ratio": None, # 个人自费理算比例 "personal_self_adjustable_amount": None, # 个人自费可理算金额 - "non_medical_payment": None, # 个人自付金额 - "non_medical_ratio": None, # 个人自付比例 + "non_medical_payment": receipt["non_medical_payment"], # 个人自付金额 + "non_medical_ratio": None, # 个人自付理算比例 "non_medical_adjustable_amount": None, # 个人自付可理算金额 - "reasonable_amount": None, # 合理可理算金额 - "reasonable_ratio": None, # 合理部分比例 + "reasonable_amount": receipt["reasonable_amount"], # 合理金额 + "reasonable_ratio": None, # 合理理算比例 "reasonable_adjustable_amount": None, # 合理可理算金额 - "adjustment_amount": Decimal("0.00"), # 理赔责任理算金额 + "remaining_adjustment_amount": remaining_adjustment_amount, # 剩余理算金额 + "remaining_coverage_amount": None, # 个单剩余保额 + "adjustable_amount": None, # 可理算金额 + "adjustment_amount": Decimal("0.00"), # 理算金额 "adjustment_explanation": "票据不予理算", # 理算说明 } ) - return receipt_adjustments + # 新增理算记录 + masterdata.add_ajustment( + receipt_number=receipt["number"], + remaining_adjustment_amount=remaining_adjustment_amount, + ) + + return adjustments diff --git a/票据理赔自动化/database.db b/票据理赔自动化/database.db index 8f3acbff584189b820e2eadb71faba4375fe3217..719b104d43f5e48b7b976af5154349805ee38a98 100644 GIT binary patch delta 7341 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 delta 6857 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 DuQEki diff --git a/票据理赔自动化/dossiers/254728869001.html b/票据理赔自动化/dossiers/254728869001.html index e69de29..25720aa 100644 --- a/票据理赔自动化/dossiers/254728869001.html +++ b/票据理赔自动化/dossiers/254728869001.html @@ -0,0 +1,2406 @@ + + + + + + 票据理赔自动化报告 + + + + +
+
+
+
+

票据理赔自动化报告

+
+

保险分公司: 中银保险有限公司苏州分公司

+

赔案编号: 254728869001

+

+ 报案时间: 2025-07-25 12:00:00 +

+
+
+
+
+ +
+

影像件层

+
+ 签收影像件15张,已分类15张,已识别14张: +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
影像件编号影像件路径影像件类型已识别
03c:/Users/admin/Documents/trae_projects/python/票据理赔自动化/directory/254728869001/insurant_1.jpg居民身份证(国徽、头像面)
02c:/Users/admin/Documents/trae_projects/python/票据理赔自动化/directory/254728869001/beneficiary_1.jpg银行卡否,无需识别
01c:/Users/admin/Documents/trae_projects/python/票据理赔自动化/directory/254728869001/application_1.jpg理赔申请书
04c:/Users/admin/Documents/trae_projects/python/票据理赔自动化/directory/254728869001/invoice_1.jpg增值税发票
05c:/Users/admin/Documents/trae_projects/python/票据理赔自动化/directory/254728869001/invoice_10.jpg增值税发票
06c:/Users/admin/Documents/trae_projects/python/票据理赔自动化/directory/254728869001/invoice_12.jpg增值税发票
07c:/Users/admin/Documents/trae_projects/python/票据理赔自动化/directory/254728869001/invoice_2.jpg增值税发票
08c:/Users/admin/Documents/trae_projects/python/票据理赔自动化/directory/254728869001/invoice_3.jpg增值税发票
09c:/Users/admin/Documents/trae_projects/python/票据理赔自动化/directory/254728869001/invoice_4.jpg增值税发票
10c:/Users/admin/Documents/trae_projects/python/票据理赔自动化/directory/254728869001/invoice_5.jpg增值税发票
11c:/Users/admin/Documents/trae_projects/python/票据理赔自动化/directory/254728869001/invoice_6.jpg增值税发票
12c:/Users/admin/Documents/trae_projects/python/票据理赔自动化/directory/254728869001/invoice_7.jpg增值税发票
13c:/Users/admin/Documents/trae_projects/python/票据理赔自动化/directory/254728869001/invoice_8.jpg增值税发票
14c:/Users/admin/Documents/trae_projects/python/票据理赔自动化/directory/254728869001/invoice_9.jpg增值税发票
15c:/Users/admin/Documents/trae_projects/python/票据理赔自动化/directory/254728869001/invoice_11.jpg增值税发票
+
+ +
+

赔案层

+
+
+

出险人(被保险人)信息

+
+
+
姓名
+
+ 唐敏华 +
+
+
+
出生
+
+ 1974-01-31 | 51岁 +
+
+
+
性别
+
+ 女 +
+
+
+
证件类型
+
+ 居民身份证 +
+
+
+
证件号码
+
+ 320602197401310029 +
+
+
+
证件有效期
+
+ 2016-06-28 至 2036-06-28 +
+
+
+
手机号
+
+ 13962635271 +
+
+
+
住址
+
+ 江苏省 苏州市 昆山市 +
+
+ 玉山镇许文塘新村45幢301室 +
+
+
+
+
+

领款信息

+
+
+
开户银行
+
+ 中国银行昆山市分行营业部 +
+
+
+
户名
+
+ 唐敏华 +
+
+
+
户号
+
+ 6217566101001926753 +
+
+
+
+
+

在保个单

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
团单号主被保险人被保险人与主被保险人关系保险期理赔责任
3291120253201000000001唐敏华唐敏华本人 + 2025-01-01 至 2025-12-31 + 药店购药补充
3291120253201000000001唐敏华唐敏华本人 + 2025-01-01 至 2025-12-31 + 门诊就医补充
+
+
+
+
+

结论层

+
+
+
+
理赔结论
+
+ 赔付 +
+
+
+
理算金额
+
+ 1860.94 +
+
+
+
结论说明
+
+ +
+
+
+
+
+
+

票据层

+ +
+
+
+
06413154
+ 关联影像件: + 15 +
+
+ + 无法查验 + +
+
+
+
+
出险人
+ +
唐敏华
+
+
+
票据代码
+ +
032002200307
+
+
+
校验码
+
44501452541545875292
+
+
+
开票日期
+
+ 2024-10-16 +
+
+
+
开票金额
+
53.88元
+
+
+
购药及就医机构
+
+ 药店 | 苏州雷允上国药连锁总店有限公司 +
+
+
+
医疗诊断
+
购药拟诊
+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
药品/医疗服务数量金额个人自费项个人自付项合理项
化学药品制剂 | 塞来昔布胶囊2.0053.88元0.00元0.00元53.88元
+
+
+
理赔类型
+
药店购药
+
+
+
个人自费金额
+
+ 0.00 +
+
+
+
个人自付金额
+
+ 0.00 +
+
+
+
合理金额
+
53.88
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
剩余理算金额团单号个单号个单剩余保额理赔责任个人自费可理算金额个人自付可理算金额合理可理算金额可理算金额理算金额
53.88NoneNoneNoneNoneNoneNoneNoneNone0.00
+
+ 理算金额合计: 0.00元 +
+
+ +
+
+
+
24412000000199673775
+ 关联影像件: + 06 +
+
+ + 真票 + +
+
+
+
+
出险人
+ +
唐敏华
+
+
+
票据代码
+ +
+
+
+
校验码
+
24412000000199673775
+
+
+
开票日期
+
+ 2024-11-11 +
+
+
+
开票金额
+
50.80元
+
+
+
购药及就医机构
+
+ 药店 | 荥阳市药之佳缘大药房有限公司 +
+
+
+
医疗诊断
+
购药拟诊
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
药品/医疗服务数量金额个人自费项个人自付项合理项
中成药 | 香菊感冒颗粒2.0035.00元0.00元0.00元35.00元
化学药品制剂 | 感冒灵颗粒1.0015.80元0.00元0.00元15.80元
+
+
+
理赔类型
+
药店购药
+
+
+
个人自费金额
+
+ 0.00 +
+
+
+
个人自付金额
+
+ 0.00 +
+
+
+
合理金额
+
50.80
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
剩余理算金额团单号个单号个单剩余保额理赔责任个人自费可理算金额个人自付可理算金额合理可理算金额可理算金额理算金额
50.80NoneNoneNoneNoneNoneNoneNoneNone0.00
+
+ 理算金额合计: 0.00元 +
+
+ +
+
+
+
24127200000191481229
+ 关联影像件: + 13 +
+
+ + 真票 + +
+
+
+
+
出险人
+ +
唐敏华
+
+
+
票据代码
+ +
+
+
+
校验码
+
24127200000191481229
+
+
+
开票日期
+
+ 2024-12-30 +
+
+
+
开票金额
+
69.00元
+
+
+
购药及就医机构
+
+ 药店 | 天津美团大药房有限公司 +
+
+
+
医疗诊断
+
购药拟诊
+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
药品/医疗服务数量金额个人自费项个人自付项合理项
化学药品制剂 | 塞来昔布胶囊1.0069.00元0.00元0.00元69.00元
+
+
+
理赔类型
+
药店购药
+
+
+
个人自费金额
+
+ 0.00 +
+
+
+
个人自付金额
+
+ 0.00 +
+
+
+
合理金额
+
69.00
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
剩余理算金额团单号个单号个单剩余保额理赔责任个人自费可理算金额个人自付可理算金额合理可理算金额可理算金额理算金额
69.00NoneNoneNoneNoneNoneNoneNoneNone0.00
+
+ 理算金额合计: 0.00元 +
+
+ +
+
+
+
25447200000004924953
+ 关联影像件: + 12 +
+
+ + 真票 + +
+
+
+
+
出险人
+ +
唐敏华
+
+
+
票据代码
+ +
+
+
+
校验码
+
25447200000004924953
+
+
+
开票日期
+
+ 2025-01-11 +
+
+
+
开票金额
+
607.00元
+
+
+
购药及就医机构
+
+ 药店 | 广州美团大药房有限公司 +
+
+
+
医疗诊断
+
购药拟诊
+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
药品/医疗服务数量金额个人自费项个人自付项合理项
化学药品制剂 | 吗替麦考酚酯胶囊10.00607.00元0.00元0.00元607.00元
+
+
+
理赔类型
+
药店购药
+
+
+
个人自费金额
+
+ 0.00 +
+
+
+
个人自付金额
+
+ 0.00 +
+
+
+
合理金额
+
607.00
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
剩余理算金额团单号个单号个单剩余保额理赔责任个人自费可理算金额个人自付可理算金额合理可理算金额可理算金额理算金额
607.0032911202532010000000013206021974013100295000.00药店购药补充0.0000000.000000607.000000607.00607.00
+
+ 理算金额合计: 607.00元 +
+
+ +
+
+
+
25447200000004924954
+ 关联影像件: + 11 +
+
+ + 真票 + +
+
+
+
+
出险人
+ +
唐敏华
+
+
+
票据代码
+ +
+
+
+
校验码
+
25447200000004924954
+
+
+
开票日期
+
+ 2025-01-11 +
+
+
+
开票金额
+
607.00元
+
+
+
购药及就医机构
+
+ 药店 | 广州美团大药房有限公司 +
+
+
+
医疗诊断
+
购药拟诊
+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
药品/医疗服务数量金额个人自费项个人自付项合理项
化学药品制剂 | 吗替麦考酚酯胶囊10.00607.00元0.00元0.00元607.00元
+
+
+
理赔类型
+
药店购药
+
+
+
个人自费金额
+
+ 0.00 +
+
+
+
个人自付金额
+
+ 0.00 +
+
+
+
合理金额
+
607.00
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
剩余理算金额团单号个单号个单剩余保额理赔责任个人自费可理算金额个人自付可理算金额合理可理算金额可理算金额理算金额
607.0032911202532010000000013206021974013100294393.00药店购药补充0.0000000.000000607.000000607.00607.00
+
+ 理算金额合计: 607.00元 +
+
+ +
+
+
+
25447200000045325946
+ 关联影像件: + 05 +
+
+ + 真票 + +
+
+
+
+
出险人
+ +
唐敏华
+
+
+
票据代码
+ +
+
+
+
校验码
+
25447200000045325946
+
+
+
开票日期
+
+ 2025-01-20 +
+
+
+
开票金额
+
119.56元
+
+
+
购药及就医机构
+
+ 药店 | 广州美团大药房有限公司 +
+
+
+
医疗诊断
+
购药拟诊
+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
药品/医疗服务数量金额个人自费项个人自付项合理项
化学药品制剂 | 玻璃酸钠滴眼液2.00119.56元0.00元0.00元119.56元
+
+
+
理赔类型
+
药店购药
+
+
+
个人自费金额
+
+ 0.00 +
+
+
+
个人自付金额
+
+ 0.00 +
+
+
+
合理金额
+
119.56
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
剩余理算金额团单号个单号个单剩余保额理赔责任个人自费可理算金额个人自付可理算金额合理可理算金额可理算金额理算金额
119.5632911202532010000000013206021974013100293786.00药店购药补充0.0000000.000000119.560000119.56119.56
+
+ 理算金额合计: 119.56元 +
+
+ +
+
+
+
25127200000015649326
+ 关联影像件: + 14 +
+
+ + 真票 + +
+
+
+
+
出险人
+ +
唐敏华
+
+
+
票据代码
+ +
+
+
+
校验码
+
25127200000015649326
+
+
+
开票日期
+
+ 2025-02-13 +
+
+
+
开票金额
+
123.48元
+
+
+
购药及就医机构
+
+ 药店 | 天津美团大药房有限公司 +
+
+
+
医疗诊断
+
购药拟诊
+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
药品/医疗服务数量金额个人自费项个人自付项合理项
化学药品制剂 | 玻璃酸钠滴眼液2.00123.48元0.00元0.00元123.48元
+
+
+
理赔类型
+
药店购药
+
+
+
个人自费金额
+
+ 0.00 +
+
+
+
个人自付金额
+
+ 0.00 +
+
+
+
合理金额
+
123.48
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
剩余理算金额团单号个单号个单剩余保额理赔责任个人自费可理算金额个人自付可理算金额合理可理算金额可理算金额理算金额
123.4832911202532010000000013206021974013100293666.44药店购药补充0.0000000.000000123.480000123.48123.48
+
+ 理算金额合计: 123.48元 +
+
+ +
+
+
+
25427000000241125962
+ 关联影像件: + 04 +
+
+ + 真票 + +
+
+
+
+
出险人
+ +
唐敏华
+
+
+
票据代码
+ +
+
+
+
校验码
+
25427000000241125962
+
+
+
开票日期
+
+ 2025-07-08 +
+
+
+
开票金额
+
480.80元
+
+
+
购药及就医机构
+
+ 药店 | 湖北美团大药房有限公司 +
+
+
+
医疗诊断
+
购药拟诊
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
药品/医疗服务数量金额个人自费项个人自付项合理项
医疗仪器器械 | 口腔溃疡含漱液1.0013.00元0.00元0.00元13.00元
营养保健食品 | 钙维生素D片6.00467.80元0.00元0.00元0.00元
+
+
+
理赔类型
+
药店购药
+
+
+
个人自费金额
+
+ 0.00 +
+
+
+
个人自付金额
+
+ 0.00 +
+
+
+
合理金额
+
13.00
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
剩余理算金额团单号个单号个单剩余保额理赔责任个人自费可理算金额个人自付可理算金额合理可理算金额可理算金额理算金额
13.0032911202532010000000013206021974013100293542.96药店购药补充0.0000000.00000013.00000013.0013.00
+
+ 理算金额合计: 13.00元 +
+
+ +
+
+
+
25427000000241125963
+ 关联影像件: + 07 +
+
+ + 真票 + +
+
+
+
+
出险人
+ +
唐敏华
+
+
+
票据代码
+ +
+
+
+
校验码
+
25427000000241125963
+
+
+
开票日期
+
+ 2025-07-08 +
+
+
+
开票金额
+
299.50元
+
+
+
购药及就医机构
+
+ 药店 | 湖北美团大药房有限公司 +
+
+
+
医疗诊断
+
购药拟诊
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
药品/医疗服务数量金额个人自费项个人自付项合理项
营养保健食品 | 鱼油软胶囊1.00146.90元0.00元0.00元0.00元
营养保健食品 | 钙维生素D片2.00152.60元0.00元0.00元0.00元
+
+
+
理赔类型
+
药店购药
+
+
+
个人自费金额
+
+ 0.00 +
+
+
+
个人自付金额
+
+ 0.00 +
+
+
+
合理金额
+
0.00
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
剩余理算金额团单号个单号个单剩余保额理赔责任个人自费可理算金额个人自付可理算金额合理可理算金额可理算金额理算金额
0.0032911202532010000000013206021974013100293529.96药店购药补充0.0000000.0000000.0000000.000.00
+
+ 理算金额合计: 0.00元 +
+
+ +
+
+
+
25427000000307614028
+ 关联影像件: + 09 +
+
+ + 真票 + +
+
+
+
+
出险人
+ +
唐敏华
+
+
+
票据代码
+ +
+
+
+
校验码
+
25427000000307614028
+
+
+
开票日期
+
+ 2025-07-19 +
+
+
+
开票金额
+
131.50元
+
+
+
购药及就医机构
+
+ 药店 | 湖北美团大药房有限公司 +
+
+
+
医疗诊断
+
购药拟诊
+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
药品/医疗服务数量金额个人自费项个人自付项合理项
化学药品制剂 | 骨化三醇软胶囊5.00131.50元0.00元0.00元131.50元
+
+
+
理赔类型
+
药店购药
+
+
+
个人自费金额
+
+ 0.00 +
+
+
+
个人自付金额
+
+ 0.00 +
+
+
+
合理金额
+
131.50
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
剩余理算金额团单号个单号个单剩余保额理赔责任个人自费可理算金额个人自付可理算金额合理可理算金额可理算金额理算金额
131.5032911202532010000000013206021974013100293529.96药店购药补充0.0000000.000000131.500000131.50131.50
+
+ 理算金额合计: 131.50元 +
+
+ +
+
+
+
25342000000125542290
+ 关联影像件: + 10 +
+
+ + 真票 + +
+
+
+
+
出险人
+ +
唐敏华
+
+
+
票据代码
+ +
+
+
+
校验码
+
25342000000125542290
+
+
+
开票日期
+
+ 2025-07-23 +
+
+
+
开票金额
+
156.20元
+
+
+
购药及就医机构
+
+ 药店 | 安徽国胜大药房连锁有限公司 +
+
+
+
医疗诊断
+
购药拟诊
+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
药品/医疗服务数量金额个人自费项个人自付项合理项
中成药 | 麝香痔疮栓10.00156.20元0.00元0.00元156.20元
+
+
+
理赔类型
+
药店购药
+
+
+
个人自费金额
+
+ 0.00 +
+
+
+
个人自付金额
+
+ 0.00 +
+
+
+
合理金额
+
156.20
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
剩余理算金额团单号个单号个单剩余保额理赔责任个人自费可理算金额个人自付可理算金额合理可理算金额可理算金额理算金额
156.2032911202532010000000013206021974013100293398.46药店购药补充0.0000000.000000156.200000156.20156.20
+
+ 理算金额合计: 156.20元 +
+
+ +
+
+
+
25622000000034278010
+ 关联影像件: + 08 +
+
+ + 真票 + +
+
+
+
+
出险人
+ +
唐敏华
+
+
+
票据代码
+ +
+
+
+
校验码
+
25622000000034278010
+
+
+
开票日期
+
+ 2025-07-23 +
+
+
+
开票金额
+
103.20元
+
+
+
购药及就医机构
+
+ 药店 | 德生堂医药股份有限公司 +
+
+
+
医疗诊断
+
购药拟诊
+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
药品/医疗服务数量金额个人自费项个人自付项合理项
中成药 | 麝香痔疮栓6.00103.20元0.00元0.00元103.20元
+
+
+
理赔类型
+
药店购药
+
+
+
个人自费金额
+
+ 0.00 +
+
+
+
个人自付金额
+
+ 0.00 +
+
+
+
合理金额
+
103.20
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
剩余理算金额团单号个单号个单剩余保额理赔责任个人自费可理算金额个人自付可理算金额合理可理算金额可理算金额理算金额
103.2032911202532010000000013206021974013100293242.26药店购药补充0.0000000.000000103.200000103.20103.20
+
+ 理算金额合计: 103.20元 +
+
+ +
+
+

@liubiren.cloud

+
+
+ + \ No newline at end of file diff --git a/票据理赔自动化/image.py b/票据理赔自动化/image.py index 214f3c2..9b767c7 100644 --- a/票据理赔自动化/image.py +++ b/票据理赔自动化/image.py @@ -115,18 +115,15 @@ def image_classify(image_index: int, image_path: Path, dossier: Dict[str, Any]) image_format, image_ndarray, image_size_specified=2 ) - # 将影像件添加至影像件层 - dossier["images_layer"].append( - { - "image_index": f"{image_index:02d}", # 影像件编号 - "image_path": image_path.as_posix(), # 影像件路径 - "image_name": image_path.stem, # 影像件名称 - "image_format": image_format, # 影像件格式 - "image_guid": image_guid, # 影像件唯一标识 - "image_base64": image_base64, # 影像件BASE64编码 - "image_type": image_type, # 影像件类型 - } - ) + # 将已分类影像件添加至影像件层 + dossier["images_layer"][f"{image_index:02d}"] = { + "image_path": image_path.as_posix(), # 影像件路径 + "image_relative_path": image_path.relative_to(image_path.parent.parent).as_posix(), # 影像件相对路径 + "image_format": image_format, # 影像件格式 + "image_guid": image_guid, # 影像件唯一标识 + "image_base64": image_base64, # 影像件BASE64编码 + "image_type": image_type, # 影像件类型 + } # 影像件编号作为键名 def image_read( @@ -139,7 +136,7 @@ def image_read( :return: 影像件图像数组 """ try: - # 先使用读取影像件,再解码为单通道灰度图数组对象 + # 先使用读取影像件,再解码为单通道灰度图数组对象(因在windows系统中,cv2.imread就包含中文的影像件路径兼容较差,估使用numpy.fromfile) image_ndarray = cv2.imdecode( buf=numpy.fromfile(file=image_path, dtype=numpy.uint8), flags=cv2.IMREAD_GRAYSCALE, @@ -218,13 +215,15 @@ def image_compress( def image_recognize( + image_index: str, image: Dict[str, Any], insurer_company: str, dossier: Dict[str, Any], ) -> None: """ 识别影像件并整合至赔案档案 - :param image: 影像件 + :param image_index: 影像件编号 + :param image: 影像件数据字典 :param insurer_company: 保险分公司 :param dossier: 赔案档案 :return: 无 @@ -237,19 +236,19 @@ def image_recognize( "image_type": image["image_type"], }, )["recognize_enabled"]: + dossier["images_layer"][image_index]["image_recognized"] = "否,无需识别" return # 根据影像件类型匹配影像件识别方法 match image["image_type"]: - case "居民户口簿": - raise RuntimeError("暂不支持居民户口簿") case "居民身份证(国徽、头像面)" | "居民身份证(国徽面)" | "居民身份证(头像面)": # 居民身份证识别并整合至赔案档案 identity_card_recognize( image=image, insurer_company=insurer_company, dossier=dossier ) - case "中国港澳台地区及境外护照": - raise RuntimeError("暂不支持中国港澳台地区及境外护照") + case "银行卡": + # 银行卡识别并整合至赔案档案 + bank_card_recognize(image=image, dossier=dossier) case "理赔申请书": application_recognize( image=image, insurer_company=insurer_company, dossier=dossier @@ -257,11 +256,15 @@ def image_recognize( case "增值税发票" | "医疗门诊收费票据" | "医疗住院收费票据": # 票据识别并整合至赔案档案 receipt_recognize( - image=image, insurer_company=insurer_company, dossier=dossier + image_index=image_index, + image=image, + insurer_company=insurer_company, + dossier=dossier, ) - case "银行卡": - # 银行卡识别并整合至赔案档案 - bank_card_recognize(image=image, dossier=dossier) + case _: + raise RuntimeError(f"影像件类型未配置影像件识别方法") + + dossier["images_layer"][image_index]["image_recognized"] = "是" def identity_card_recognize( @@ -327,7 +330,7 @@ def identity_card_recognize( } ) - # 根据保险分公司、被保险人、证件类型、证件号码和出险时间查询个单 + # 根据保险分公司名称、被保险人姓名、证件类型、证件号码和报案时间查询被保险人的理赔责任 dossier["liabilities_layer"] = masterdata.query_liabilities( insurer_company=insurer_company, insured_person=insured_person, @@ -577,17 +580,22 @@ def application_recognize( def receipt_recognize( - image: Dict[str, Any], insurer_company: str, dossier: Dict[str, Any] + image_index: str, + image: Dict[str, Any], + insurer_company: str, + dossier: Dict[str, Any], ) -> None: """ 识别票据并整合至赔案档案 + :param image_index: 影像件编号 :param image: 影像件 :param insurer_company: 保险分公司 :param dossier: 赔案档案 :return: 空 """ # 初始化票据数据 - receipt = {"image_index": image["image_index"]} + receipt = {"image_index": image_index, "image_path": image["image_path"]} + # 请求深圳快瞳票据查验接口(兼容增值税发票、医疗门诊/住院收费票据) response = request.post( url=(url := "https://ai.inspirvision.cn/s/api/ocr/invoiceCheckAll"), @@ -613,25 +621,29 @@ def receipt_recognize( "真票" if response["data"]["details"]["invoiceTypeNo"] == "0" else "红票" - ), # 红票为状态为失控、作废、已红冲、部分红冲和全额红冲的票据 - "number": response["data"]["details"]["number"], + ), # 查验状态,红票对应查验状态为失控、作废、已红冲、部分红冲和全额红冲 + "number": response["data"]["details"]["number"], # 票据号 "code": ( response["data"]["details"]["code"] if response["data"]["details"]["code"] else None - ), + ), # 票据代码 "date": datetime.strptime( response["data"]["details"]["date"], "%Y年%m月%d日" - ), # 转为日期时间(datetime对象) - "verification_code": response["data"]["details"]["check_code"], + ), # 开票日期 + "check_code": response["data"]["details"][ + "check_code" + ], # 校验码 "amount": Decimal( response["data"]["details"]["total"] ).quantize( Decimal("0.00"), rounding=ROUND_HALF_UP, - ), # 深圳快瞳票据查验接口中开票金额由字符串转为Decimal,保留两位小数 - "payer": response["data"]["details"]["buyer"], - "institution": response["data"]["details"]["seller"], + ), # 开票金额 + "payer": response["data"]["details"]["buyer"], # 出险人 + "institution": response["data"]["details"][ + "seller" + ], # 购药及就医机构 "items": [ { "item": item["name"], @@ -642,13 +654,13 @@ def receipt_recognize( ) if item["quantity"] else Decimal("0.00") - ), # 深圳快瞳票据查验接口中明细单位由空字符转为None,若非空字符由字符串转为Decimal,保留两位小数 + ), "amount": ( Decimal(item["total"]) + Decimal(item["tax"]) ).quantize( Decimal("0.00"), rounding=ROUND_HALF_UP, - ), # 深圳快瞳票据查验接口中明细的金额和税额由字符串转为Decimal,保留两位小数,并求和 + ), } for item in response["data"]["details"]["items"] ], @@ -689,7 +701,7 @@ def receipt_recognize( if response["data"]["hospitalizationDate"] else None ), - "verification_code": response["data"]["checkCode"], + "check_code": response["data"]["checkCode"], "amount": Decimal(response["data"]["amount"]).quantize( Decimal("0.00"), rounding=ROUND_HALF_UP, @@ -781,9 +793,7 @@ def receipt_recognize( fuzzy_match(response["data"], "开票日期"), "%Y年%m月%d日", ), - "verification_code": fuzzy_match( - response["data"], "校验码" - ), + "check_code": fuzzy_match(response["data"], "校验码"), "amount": Decimal( fuzzy_match(response["data"], "小写金额").replace( "¥", "" @@ -857,9 +867,7 @@ def receipt_recognize( fuzzy_match(response["data"], "开票日期"), "%Y-%m-%d", ), - "verification_code": fuzzy_match( - response["data"], "校验码" - ), + "check_code": fuzzy_match(response["data"], "校验码"), "amount": Decimal( fuzzy_match( response["data"], "合计金额(小写)" @@ -882,7 +890,7 @@ def receipt_recognize( "amount": Decimal(amount).quantize( Decimal("0.00"), rounding=ROUND_HALF_UP, - ), # 深圳快瞳票据识别接口中明细的金额和税额由字符串转为Decimal,保留两位小数,并求和 + ), } for name, quantity, amount in zip( [ @@ -964,7 +972,7 @@ def receipt_recognize( if isinstance(receipt["endtime"], dict) else None ), - "verification_code": fuzzy_match( + "check_code": fuzzy_match( receipt["global_detail"]["region_specific"], "校验码", ), @@ -1063,6 +1071,8 @@ def receipt_recognize( ) ) .assign( + personal_self_payment=Decimal("0.00"), # 个人自费项 + non_medical_payment=Decimal("0.00"), # 个人自付项 reasonable_amount=lambda dataframe: dataframe.apply( lambda row: Decimal( # 基于扣除明细项不合理费用决策规则评估 @@ -1080,8 +1090,8 @@ def receipt_recognize( rounding=ROUND_HALF_UP, ), axis="columns", - ) - ) # 扣除明细项不合理费用 + ), # 合理项 + ) ) receipt.update( @@ -1092,7 +1102,7 @@ def receipt_recognize( in receipt["payer"] else None ), # 出险人姓名 - "accident": "药店购药", # 出险事故 + "accident": "药店购药", # 理赔类型 "diagnosis": "购药拟诊", # 医疗诊断 "personal_self_payment": Decimal("0.00"), # 个人自费金额 "non_medical_payment": Decimal("0.00"), # 个人自付金额 diff --git a/票据理赔自动化/main.py b/票据理赔自动化/main.py index fa80064..2251cc1 100644 --- a/票据理赔自动化/main.py +++ b/票据理赔自动化/main.py @@ -7,6 +7,7 @@ https://liubiren.feishu.cn/docx/WFjTdBpzroUjQvxxrNIcKvGnneh?from=from_copylink from datetime import datetime from pathlib import Path +import re from case import case_adjust from image import image_classify, image_recognize @@ -24,15 +25,16 @@ if __name__ == "__main__": # 初始化赔案档案(推送至TPA时,保险公司会提保险分公司名称、报案时间和影像件等,TPA签收后生成赔案号) dossier = { "report_layer": { - "case_number": case_path.stem, # 默认为赔案文件夹名称 "insurer_company": ( insurer_company := "中银保险有限公司苏州分公司" - ), # 默认为中银保险有限公司苏州分公司 + ), # 保险分公司名称默认为中银保险有限公司苏州分公司 "report_time": datetime( 2025, 7, 25, 12, 0, 0 - ), # 指定报案时间,默认为 datetime对象 + ), # 报案时间默认为2025-07-25 12:00:00 + "images_counts": 15, # 影像件数默认为15 + "case_number": case_path.stem, # 赔案号默认为赔案文件夹名称 }, # 报案层 - "images_layer": [], # 影像件层 + "images_layer": {}, # 影像件层 "insured_person_layer": {}, # 出险人层 "liabilities_layer": [], # 理赔责任层 "receipts_layer": [], # 票据层 @@ -43,11 +45,11 @@ if __name__ == "__main__": for image_index, image_path in enumerate( sorted( [ - i - for i in case_path.glob(pattern="*") - if i.is_file() and i.suffix.lower() in [".jpg", ".jpeg", ".png"] + x + for x in case_path.glob(pattern="*") + if x.is_file() and x.suffix.lower() in [".jpg", ".jpeg", ".png"] ], - key=lambda i: i.stat().st_birthtime, # 根据影像件创建时间顺序排序 + key=lambda x: x.stat().st_birthtime, # 根据影像件创建时间顺序排序 ), 1, ): @@ -57,34 +59,47 @@ if __name__ == "__main__": ) # 就影像件层按照影像件类型指定排序 - dossier["images_layer"].sort( - key=lambda i: [ - "居民户口簿", - "居民身份证(国徽面)", - "居民身份证(头像面)", - "居民身份证(国徽、头像面)", - "中国港澳台地区及境外护照", - "理赔申请书", - "增值税发票", - "医疗门诊收费票据", - "医疗住院收费票据", - "医疗费用清单", - "银行卡", - "其它", - ].index(i["image_type"]) + dossier["images_layer"] = dict( + sorted( + dossier["images_layer"].items(), + key=lambda x: [ + "居民户口簿", + "居民身份证(国徽面)", + "居民身份证(头像面)", + "居民身份证(国徽、头像面)", + "中国港澳台地区及境外护照", + "银行卡", + "理赔申请书", + "其它", + "增值税发票", + "医疗门诊收费票据", + "医疗住院收费票据", + "医疗费用清单", + ].index(x[1]["image_type"]), + ), ) + # 统计已分类影像件数 + dossier["classified_images_counts"] = len(dossier["images_layer"]) - # 遍历影像件层内影像件 - for image in dossier["images_layer"]: - # 识别影像件并整合至赔案档案 - image_recognize( - image=image, - insurer_company=insurer_company, - dossier=dossier, - ) + # 遍历影像件层内所有影像件 + for image_index, image in dossier["images_layer"].items(): + if re.match(pattern=r"^\d{2}$", string=image_index): + # 识别影像件并整合至赔案档案 + image_recognize( + image_index=image_index, + image=image, + insurer_company=insurer_company, + dossier=dossier, + ) - # 就票据层按照开票日期和票据号顺序排序 - dossier["receipts_layer"].sort(key=lambda x: (x["date"], x["number"])) + # 统计已识别影像件数 + dossier["recognized_images_counts"] = len( + [ + image + for image in dossier["images_layer"].values() + if image["image_recognized"] == "是" + ] + ) # 理算赔案并整合至赔案档案 case_adjust(dossier=dossier) diff --git a/票据理赔自动化/masterdata.py b/票据理赔自动化/masterdata.py index 9ea0247..f28cd36 100644 --- a/票据理赔自动化/masterdata.py +++ b/票据理赔自动化/masterdata.py @@ -8,7 +8,7 @@ from decimal import Decimal, ROUND_HALF_UP from hashlib import md5 from pathlib import Path import sys -from typing import Any, Dict, List +from typing import Any, Dict, List, Optional sys.path.append(Path(__file__).parent.parent.as_posix()) from utils.sqlite import SQLite @@ -97,7 +97,7 @@ class MasterData(SQLite): guid TEXT PRIMARY KEY, --理赔责任名称 liability TEXT NOT NULL, - --出险事故 + --理赔类型 accident TEXT NOT NULL, --个人自费理算比例 personal_self_ratio TEXT NOT NULL, @@ -130,7 +130,7 @@ class MasterData(SQLite): --个单唯一标识 person_policy_guid TEXT NOT NULL ) - """ + """ ) # 初始化购药及就医机构表 self.execute( @@ -158,6 +158,20 @@ class MasterData(SQLite): ) """ ) + # 初始化票据理算表 + self.execute( + sql=""" + CREATE TABLE IF NOT EXISTS adjustments + ( + --票据号 + receipt_number TEXT PRIMARY KEY, + --剩余理算金额 + remaining_adjustment_amount TEXT NOT NULL, + --理算时间 + adjust_time TEXT NOT NULL + ) + """ + ) except Exception as exception: raise RuntimeError(f"初始化主数据发生异常:{str(exception)}") from exception @@ -309,7 +323,72 @@ class MasterData(SQLite): except Exception as exception: raise RuntimeError(f"{str(exception)}") from exception - def query_remaining_amount( + def query_remaining_adjustment_amount( + self, + receipt_number: str, + ) -> Optional[Decimal]: + """ + 根据票据号查询剩余理算金额 + :param receipt_number: 票据号 + :return: 剩余理算金额 + """ + try: + with self: + result = self.query_one( + sql=""" + SELECT remaining_adjustment_amount + FROM adjustments + WHERE receipt_number = ? + ORDER BY adjust_time DESC + LIMIT 1; + """, + parameters=(receipt_number,), + ) + if not result: + return None + + return Decimal(result["remaining_adjustment_amount"]).quantize( + Decimal("0.00"), + rounding=ROUND_HALF_UP, + ) + + except Exception as exception: + raise RuntimeError(f"{str(exception)}") from exception + + def add_ajustment( + self, + receipt_number: str, + remaining_adjustment_amount: Decimal, + ) -> None: + """ + 新增理算记录 + :param receipt_number: 票据号 + :param remaining_adjustment_amount: 剩余理算金额 + :return: 无 + """ + if remaining_adjustment_amount < Decimal("0.00"): + raise ValueError("剩余理算金额小于0") + + # 当前时间 + current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f") + + with self: + if not self.execute( + sql=""" + INSERT INTO adjustments + (receipt_number, remaining_adjustment_amount, adjust_time) + VALUES + (?, ?, ?) + """, + parameters=( + receipt_number, + f"{remaining_adjustment_amount:.2f}", + current_time, + ), + ): + raise RuntimeError("新增理算记录发生异常") + + def query_after_change_amount( self, person_policy_guid: str, ) -> Decimal: @@ -354,11 +433,6 @@ class MasterData(SQLite): :param change_amount: 变动金额 :return: 无 """ - if before_change_amount != self.query_remaining_amount( - person_policy_guid=person_policy_guid, - ): - raise ValueError("变动前金额不等于最新一条保额变动记录的变动后金额") - # 变动后金额 after_change_amount = (before_change_amount - change_amount).quantize( Decimal("0.00"), diff --git a/票据理赔自动化/template.html b/票据理赔自动化/template.html index 2907333..5f16412 100644 --- a/票据理赔自动化/template.html +++ b/票据理赔自动化/template.html @@ -1,692 +1,745 @@ - - + - 赔案档案 + 票据理赔自动化报告 - + - +
-
-
-
-

赔案档案

-
-

- 赔案编号: {{ dossier.report_layer.case_number }} | 保险分公司: - {{ dossier.report_layer.insurer_company }} | 报案时间: {{ - dossier.report_layer.report_time | DateTime }} -

-
-
+
+
+
+

{{ obj["report_layer"]["case_number"] }}理算报告

+
+

+ 保险分公司: {{ obj["report_layer"]["insurer_company"] }} | + 报案时间: {{ obj["report_layer"]["report_time"] | + datetime_to_str }} +

-
- -
-

影像件层

- - - - - - - - - - - {% for image in dossier.images_layer %} - - - - - - - {% endfor %} - -
影像件唯一标识影像件编号影像件名称影像件类型
{{ image.image_guid }}{{ image.image_index }}{{ image.image_name }}{{ image.image_type }}
+
- -
-

赔案层

-
-
-

出险人(被保险人)信息

-
-
-
姓名
-
- {{ dossier.insured_person_layer.insured_person }} -
-
-
-
证件类型
-
- {{ dossier.insured_person_layer.identity_type }} -
-
-
-
证件号码
-
- {{ dossier.insured_person_layer.identity_number }} -
-
-
-
证件有效期
-
- {{ dossier.insured_person_layer.commencement_date | DateTime - }} 至 {{ dossier.insured_person_layer.termination_date | - DateTime }} -
-
-
-
性别
-
- {{ dossier.insured_person_layer.gender }} -
-
- -
-
出生
-
- {{ dossier.insured_person_layer.birth_date | DateTime }} | {{ - dossier.insured_person_layer.age }}岁 -
-
-
-
手机号
-
- {{ dossier.insured_person_layer.phone_number }} -
-
-
-
住址
-
- {{ dossier.insured_person_layer.province }} {{ - dossier.insured_person_layer.city }} {{ - dossier.insured_person_layer.district }} -
-
- {{ dossier.insured_person_layer.detailed_address }} -
-
-
-
- -
-

领款信息

-
-
-
户名
-
- {{ dossier.insured_person_layer.account }} -
-
-
-
开户银行
-
- {{ dossier.insured_person_layer.account_bank }} -
-
-
-
户号
-
- {{ dossier.insured_person_layer.account_number }} -
-
-
-
- -
-

在保个单

- - - - - - - - - - - - - - {% for liability in dossier.liabilities_layer %} - - - - - - - - - - {% endfor %} - -
团单号保险分公司名称被保险人姓名主被保险人与主被保险人关系保险期理赔责任名称
{{ liability.group_policy }}{{ liability.insurer_company }}{{ liability.insured_person }}{{ liability.master_insured_person }}{{ liability.relationship }} - {{ liability.commencement_date | DateTime }} 至 {{ - liability.termination_date | DateTime }} - {{ liability.liability }}
-
-
+
+
+

影像件层

+
+ 签收影像件{{ obj["report_layer"]["images_counts"] }}张,其中:已分类{{ + obj["classified_images_counts"] }}张,已识别{{ + obj["recognized_images_counts"] }}张
- -
-

票据层

- {% for receipt in dossier.receipts_layer %} -
-
-
-
{{ receipt.receipt_number }}
- 关联影像件序号: {{ receipt.image_index }} -
-
- {% if receipt.verification == '真票' %} - {{ receipt.verification }} - {% elif receipt.verification == '无法查验' %} - {{ receipt.verification }} - {% else %} - {{ receipt.verification }} - {% endif %} -
-
- -
-
-
出险人
-
{{ receipt.payer }}
-
-
-
票据代码
-
{{ receipt.code }}
-
-
-
校验码后六位
-
{{ receipt.verification_code }}
-
-
-
开票日期
-
{{ receipt.date | DateTime }}
-
-
-
票据金额
-
{{ receipt.amount }}元
-
-
-
出险事故
-
{{ receipt.accident }}
-
-
-
购药及就医机构
-
- {{ receipt.institution }} | {{ receipt.institution_type }} -
-
-
-
医疗诊断
-
{{ receipt.diagnosis }}
-
-
- - - - - - - - - - - - {% for item in receipt.items %} - - - - - - - {% endfor %} - -
类别药品/医疗服务数量金额
{{ item.category }}{{ item.medicine }}{{ item.quantity }}{{ item.amount }}元
- - - - - - - - - - - - {% for adjustment in receipt.adjustments %} - - - - - - - {% endfor %} - -
个人自费可理算金额个人自付可理算金额合理可理算金额理算金额
- {{ adjustment.personal_self_adjustable_amount }} = {{ - adjustment.personal_self_payment }} * {{ - adjustment.personal_self_ratio }} % - - {{ adjustment.non_medical_adjustable_amount }} = {{ - adjustment.non_medical_payment }} * {{ - adjustment.non_medical_ratio }} % - - {{ adjustment.reasonable_adjustable_amount }} = {{ - adjustment.reasonable_amount }} * {{ - adjustment.reasonable_ratio }} % - {{ adjustment.adjustment_amount }}元
-
总金额: {{ receipt.amount }}元
-
+ + + + + + + + + + + {% for image_index,image in obj["images_layer"].items() %} + + + + + + {% endfor %} + +
影像件编号影像件路径影像件类型已识别
{{ image_index }}{{ image["image_relative_path"] }}{{ image["image_type"] }}{{ image["image_recognized"] }}
+
+
+

赔案层

+
+
+

出险人(即被保险人)信息

+
+
+
姓名
+
+ {{ obj["insured_person_layer"]["insured_person"] }} +
+
+
+
出生
+
+ {{ obj["insured_person_layer"]["birth_date"] | datetime_to_str + }} | {{ obj["insured_person_layer"]["age"] }}岁 +
+
+
+
性别
+
+ {{ obj["insured_person_layer"]["gender"] }} +
+
+
+
证件类型
+
+ {{ obj["insured_person_layer"]["identity_type"] }} +
+
+
+
证件号码
+
+ {{ obj["insured_person_layer"]["identity_number"] }} +
+
+
+
证件有效期
+
+ {{ obj["insured_person_layer"]["commencement_date"] | + datetime_to_str }} 至 {{ + obj["insured_person_layer"]["termination_date"] | + datetime_to_str }} +
+
+
+
手机号
+
+ {{ obj["insured_person_layer"]["phone_number"] }} +
+
+
+
住址
+
+ {{ obj["insured_person_layer"]["province"] }} {{ + obj["insured_person_layer"]["city"] }} {{ + obj["insured_person_layer"]["district"] }} +
+
+ {{ obj["insured_person_layer"]["detailed_address"] }} +
+
+
+
+
+

领款信息

+
+
+
开户银行
+
+ {{ obj["insured_person_layer"]["account_bank"] }} +
+
+
+
户名
+
+ {{ obj["insured_person_layer"]["account"] }} +
+
+
+
户号
+
+ {{ obj["insured_person_layer"]["account_number"] }} +
+
+
+
+
+

在保个单

+ + + + + + + + + + + + + {% for liability in obj["liabilities_layer"] %} + + + + + + + + + {% endfor %} + +
团单号主被保险人被保险人与主被保险人关系保险期理赔责任
{{ liability["group_policy"] }}{{ liability["master_insured_person"] }}{{ liability["insured_person"] }}{{ liability["relationship"] }} + {{ liability["commencement_date"] | datetime_to_str }} 至 {{ + liability["termination_date"] | datetime_to_str }} + {{ liability["liability"] }}
+
- -
-

@liubiren.cloud

-
+
+
+

结论层

+
+
+
+
理赔结论
+
+ {{ obj["adjustment_layer"]["conclusion"] }} +
+
+
+
理算金额
+
+ {{ obj["adjustment_layer"]["adjustment_amount"] }} +
+
+
+
结论说明
+
+ {{ obj["adjustment_layer"]["explanation"] }} +
+
+
+
+
+
+

票据层

+ {% for receipt in obj["receipts_layer"] %} +
+
+
+
{{ receipt["number"] }}
+ 关联影像件: + {{ receipt["image_index"] }} +
+
+ {% if receipt["verification"] == '真票' %} + {{ receipt["verification"] }} + {% elif receipt["verification"] == '无法查验' %} + {{ receipt["verification"] }} + {% else %} + {{ receipt["verification"] }} + {% endif %} +
+
+
+
+
出险人
+ +
{{ receipt["payer"] | str_to_str}}
+
+
+
票据代码
+ +
{{ receipt["code"] | str_to_str}}
+
+
+
校验码
+
{{ receipt["check_code"] }}
+
+
+
开票日期
+
+ {{ receipt["date"] | datetime_to_str }} +
+
+
+
开票金额
+
{{ receipt["amount"] }}元
+
+
+
购药及就医机构
+
+ {{ receipt["institution_type"] }} | {{ receipt["institution"] }} +
+
+
+
医疗诊断
+
{{ receipt["diagnosis"] }}
+
+
+ + + + + + + + + + + + + {% for item in receipt["items"] %} + + + + + + + + + {% endfor %} + +
药品/医疗服务数量金额个人自费项个人自付项合理项
{{ item["category"] }} | {{ item["medicine"] }}{{ item["quantity"] }}{{ item["amount"] }}元{{ item["personal_self_payment"] }}元{{ item["non_medical_payment"] }}元{{ item["reasonable_amount"] }}元
+
+
+
理赔类型
+
{{ receipt["accident"] }}
+
+
+
个人自费金额
+
+ {{ receipt["personal_self_payment"] }} +
+
+
+
个人自付金额
+
+ {{ receipt["non_medical_payment"] }} +
+
+
+
合理金额
+
{{ receipt["reasonable_amount"] }}
+
+
+ + + + + + + + + + + + + + + + + {% for adjustment in receipt["adjustments"] %} + + + + + + + + + + + + + {% endfor %} + +
剩余理算金额团单号个单号个单剩余保额理赔责任个人自费可理算金额个人自付可理算金额合理可理算金额可理算金额理算金额
{{ adjustment["remaining_adjustment_amount"] }}{{ adjustment["group_policy"] }}{{ adjustment["person_policy"] }}{{ adjustment["remaining_coverage_amount"] }}{{ adjustment["liability"] }}{{ adjustment["personal_self_adjustable_amount"] }}{{ adjustment["non_medical_adjustable_amount"] }}{{ adjustment["reasonable_adjustable_amount"] }}{{ adjustment["adjustable_amount"] }}{{ adjustment["adjustment_amount"] }}
+
+ 理算金额合计: {{ receipt["adjustment_amount"] }}元 +
+
+ {% endfor %} +
+
- - - \ No newline at end of file + +