日常更新

from NUC
This commit is contained in:
liubiren 2025-12-24 12:52:51 +08:00
parent 5cf3b4313c
commit abfe04f2b9
2 changed files with 47 additions and 48 deletions

Binary file not shown.

View File

@ -73,33 +73,31 @@ if __name__ == "__main__":
# 初始化在保被保险人表TPA作业系统包括团单、个单和被保险人表此处直接整合为宽表 # 初始化在保被保险人表TPA作业系统包括团单、个单和被保险人表此处直接整合为宽表
self._execute( self._execute(
sql=""" sql="""
CREATE TABLE IF NOT EXISTS insured_person_policies CREATE TABLE IF NOT EXISTS insured_persons
( (
--被保险人
insured_person TEXT NOT NULL,
--被保险人的证件类型
identity_type TEXT NOT NULL,
--被保险人的证件号码
identity_number TEXT NOT NULL,
--与主被保险人关系包括本人和附属配偶父母和子女
relationship TEXT NOT NULL,
--个单号
person_policy TEXT NOT NULL,
--主被保险人
master_insured_person TEXT NOT NULL,
--保险起期取个单和团单起期最大值
commencement_date REAL NOT NULL,
--保险止期取个单和团单止期最小值
termination_date REAL NOT NULL,
--团单号 --团单号
group_policy TEXT NOT NULL, group_policy TEXT NOT NULL,
--投保公司 --个单号
insurance_company TEXT NOT NULL, person_policy TEXT NOT NULL,
--保险分公司 --保险分公司
insurer_company TEXT NOT NULL, insurer_company TEXT NOT NULL,
--联合主键投保公司+保险分公司+被保险人+被保险人的证件类型+被保险人的证件号码 --主被保险人
PRIMARY KEY (insurance_company, insurer_company, insured_person, identity_type, master_insured_person TEXT NOT NULL,
identity_number) --被保险人
insured_person TEXT NOT NULL,
--证件类型
identity_type TEXT NOT NULL,
--证件号码
identity_number TEXT NOT NULL,
--与主被保险人关系包括本人和附属附属包括配偶父母和子女等
relationship TEXT NOT NULL,
--保险起期取个单和团单起期最大值
commencement_date TEXT NOT NULL,
--保险止期取个单和团单止期最小值
termination_date TEXT NOT NULL,
--联合主键被保险人+证件类型+证件号码+保险分公司
PRIMARY KEY (insured_person, identity_type,
identity_number, insurer_company)
) )
""" """
) )
@ -160,22 +158,20 @@ if __name__ == "__main__":
raise RuntimeError("查询并获取单条购药及就医机构类型发生异常") raise RuntimeError("查询并获取单条购药及就医机构类型发生异常")
# noinspection PyShadowingNames # noinspection PyShadowingNames
def query_insured_person_records( def query_insured_persons(
self, self,
insurance_company: str,
insurer_company: str, insurer_company: str,
insured_person: str, insured_person: str,
identity_type: str, identity_type: str,
identity_number: str, identity_number: str,
) -> Optional[List[Dict[str, Any]]]: ) -> Optional[List[Dict[str, Any]]]:
""" """
查询并获取多条被保险人记录例如若夫妻同在投保公司则互为附加被保险人一方被保险人记录包括本人和配偶两条 根据保险分公司被保险人证件类型和证件号码查询被保险人备注若夫妻同在投保公司则互为附加被保险人一方被保险人记录包括本人和配偶两条
:param insurance_company: 投保公司
:param insurer_company: 保险分公司 :param insurer_company: 保险分公司
:param insured_person: 被保险人 :param insured_person: 被保险人
:param identity_type: 被保险人的证件类型 :param identity_type: 证件类型
:param identity_number: 被保险人的证件号码 :param identity_number: 证件号码
:return: 被保险人记录 :return: 被保险人列表包括被被保险人个单号主被保险人与主被保险人关系保险起期和保险止期
""" """
# noinspection PyBroadException # noinspection PyBroadException
try: try:
@ -183,21 +179,20 @@ if __name__ == "__main__":
# noinspection SqlResolve # noinspection SqlResolve
result = self._query_all( result = self._query_all(
sql=""" sql="""
SELECT insured_person AS "被保险人", SELECT group_policy AS "团单号",
relationship AS "与主被保险人关系",
person_policy AS "个单号", person_policy AS "个单号",
master_insured_person AS "主被保险人", master_insured_person AS "主被保险人",
insured_person AS "被保险人",
relationship AS "与主被保险人关系",
commencement_date AS "保险起期", commencement_date AS "保险起期",
termination_date AS "保险止期" termination_date AS "保险止期"
FROM insured_person_policies FROM insured_persons
WHERE insurance_company = ? WHERE insurer_company = ?
AND insurer_company = ?
AND insured_person = ? AND insured_person = ?
AND identity_type = ? AND identity_type = ?
AND identity_number = ? AND identity_number = ?
""", """,
parameters=( parameters=(
insurance_company,
insurer_company, insurer_company,
insured_person, insured_person,
identity_type, identity_type,
@ -208,7 +203,7 @@ if __name__ == "__main__":
return [ return [
{ {
k: ( k: (
datetime.fromtimestamp(v) datetime.strptime(v, "%Y-%m-%d") # 保险
if k in ["保险起期", "保险止期"] if k in ["保险起期", "保险止期"]
else v else v
) )
@ -217,9 +212,11 @@ if __name__ == "__main__":
for e in result for e in result
] # 将保险起期和保险止期由时间戳转为datetime对象 ] # 将保险起期和保险止期由时间戳转为datetime对象
raise raise
# TODO: 若查询并获取多条个单和被保险人记录发生异常则流转至主数据人工处理 # TODO: 若根据保险分公司、被保险人、证件类型和证件号码查询被保险人发生异常则流转至主数据人工处理
except Exception: except Exception:
raise RuntimeError("查询并获取多条个单和被保险人记录发生异常") raise RuntimeError(
"根据保险分公司、被保险人、证件类型和证件号码查询被保险人发生异常"
)
# noinspection PyShadowingNames # noinspection PyShadowingNames
def query_medicine( def query_medicine(
@ -462,24 +459,21 @@ if __name__ == "__main__":
# noinspection PyShadowingNames # noinspection PyShadowingNames
def image_recognize( def image_recognize(
image, image,
insurance_company,
insurer_company, insurer_company,
) -> None: ) -> None:
""" """
影像件识别并整合至赔案档案 影像件识别并整合至赔案档案
:param image: 影像件 :param image: 影像件
:param insurance_company: 投保公司
:param insurer_company: 保险分公司 :param insurer_company: 保险分公司
:return: :return:
""" """
# TODO: 后续添加居民身份证(国徽面)和居民身份证(头像面)合并 # TODO: 后续添加居民身份证(国徽面)和居民身份证(头像面)合并
# noinspection PyShadowingNames # noinspection PyShadowingNames
def identity_card_recognize(image, insurance_company, insurer_company) -> None: def identity_card_recognize(image, insurer_company) -> None:
""" """
居民身份证识别并整合至赔案档案 居民身份证识别并整合至赔案档案
:param image: 影像件 :param image: 影像件
:param insurance_company: 投保公司
:param insurer_company: 保险分公司 :param insurer_company: 保险分公司
:return: :return:
""" """
@ -574,8 +568,7 @@ if __name__ == "__main__":
) )
# 查询并获取多条被保险人记录 # 查询并获取多条被保险人记录
dossier["被保险人层"] = master_data.query_insured_person_records( dossier["被保险人层"] = master_data.query_insured_persons(
insurance_company,
insurer_company, insurer_company,
insured_person, # 出险人和被保险人为同一人,视角不同:出险人为理赔,被保险人为承保/保全 insured_person, # 出险人和被保险人为同一人,视角不同:出险人为理赔,被保险人为承保/保全
identity_type, identity_type,
@ -1388,8 +1381,6 @@ if __name__ == "__main__":
match (image["影像件类型"], receipt["购药及就医机构类型"]): match (image["影像件类型"], receipt["购药及就医机构类型"]):
# 就增值税发票且药店扣除不合理费用、增值税发票且私立医院解析个人自费、个人自付、医保支付、不合理金额和合理金额 # 就增值税发票且药店扣除不合理费用、增值税发票且私立医院解析个人自费、个人自付、医保支付、不合理金额和合理金额
case ("增值税发票", "药店"): case ("增值税发票", "药店"):
receipt["购药及就医类型"] = "药店购药"
items = ( items = (
pandas.DataFrame(receipt["明细项"]) pandas.DataFrame(receipt["明细项"])
.groupby("名称") # 就相同明细项名称合并数量和金额 .groupby("名称") # 就相同明细项名称合并数量和金额
@ -1432,6 +1423,14 @@ if __name__ == "__main__":
receipt.update( receipt.update(
{ {
"起期": receipt["开票日期"],
"止期": receipt["开票日期"],
"姓名": (
dossier["出险人层"]["姓名"]
if dossier["出险人层"]["姓名"] in receipt["姓名"]
else receipt["姓名"]
),
"购药及就医类型": "药店购药",
"个人自费": Decimal("0.00"), "个人自费": Decimal("0.00"),
"个人自付": Decimal("0.00"), "个人自付": Decimal("0.00"),
"医保支付": Decimal("0.00"), "医保支付": Decimal("0.00"),
@ -1448,6 +1447,7 @@ if __name__ == "__main__":
"明细项": items.to_dict("records"), "明细项": items.to_dict("records"),
} }
) )
# TODO: 后续完善就购药及就医类型为门诊就诊(私立医院)处理 # TODO: 后续完善就购药及就医类型为门诊就诊(私立医院)处理
case ("增值税发票", "私立医院"): case ("增值税发票", "私立医院"):
receipt["购药及就医类型"] = "门诊就医" receipt["购药及就医类型"] = "门诊就医"
@ -1522,7 +1522,7 @@ if __name__ == "__main__":
"居民身份证(国徽、头像面)" | "居民身份证(国徽面)" | "居民身份证(头像面)" "居民身份证(国徽、头像面)" | "居民身份证(国徽面)" | "居民身份证(头像面)"
): ):
# 居民身份证识别并整合至赔案档案 # 居民身份证识别并整合至赔案档案
identity_card_recognize(image, insurance_company, insurer_company) identity_card_recognize(image, insurer_company)
# TODO: 后续添加居民户口簿识别和整合方法 # TODO: 后续添加居民户口簿识别和整合方法
case "中国港澳台地区及境外护照": case "中国港澳台地区及境外护照":
raise RuntimeError("暂不支持中国港澳台地区及境外护照") raise RuntimeError("暂不支持中国港澳台地区及境外护照")
@ -1618,7 +1618,6 @@ if __name__ == "__main__":
# 影像件识别并整合至赔案档案 # 影像件识别并整合至赔案档案
image_recognize( image_recognize(
image, image,
insurance_company,
insurer_company, insurer_company,
) )