Compare commits
2 Commits
3a4c0669ef
...
abfe04f2b9
| Author | SHA1 | Date |
|---|---|---|
|
|
abfe04f2b9 | |
|
|
5cf3b4313c |
Binary file not shown.
103
票据理赔自动化/main.py
103
票据理赔自动化/main.py
|
|
@ -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,
|
||||||
|
|
@ -1087,7 +1080,7 @@ if __name__ == "__main__":
|
||||||
):
|
):
|
||||||
raise RuntimeError("请求深圳快瞳增值税发票识别接口发生异常")
|
raise RuntimeError("请求深圳快瞳增值税发票识别接口发生异常")
|
||||||
|
|
||||||
match receipt_type := query_value(response["data"], "发票类型"):
|
match query_value(response["data"], "发票类型"):
|
||||||
case "电子发票(普通发票)":
|
case "电子发票(普通发票)":
|
||||||
# noinspection PyTypeChecker
|
# noinspection PyTypeChecker
|
||||||
receipt.update(
|
receipt.update(
|
||||||
|
|
@ -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,13 +1447,14 @@ if __name__ == "__main__":
|
||||||
"明细项": items.to_dict("records"),
|
"明细项": items.to_dict("records"),
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
# TODO: 后续完善
|
|
||||||
|
# TODO: 后续完善就购药及就医类型为门诊就诊(私立医院)处理
|
||||||
case ("增值税发票", "私立医院"):
|
case ("增值税发票", "私立医院"):
|
||||||
receipt["购药及就医类型"] = "门诊就医"
|
receipt["购药及就医类型"] = "门诊就医"
|
||||||
# TODO: 后续完善
|
# TODO: 后续完善就购药及就医类型为门诊就诊(公立医院)处理
|
||||||
case ("医疗门诊收费票据", "公立医院"):
|
case ("医疗门诊收费票据", "公立医院"):
|
||||||
receipt["购药及就医类型"] = "门诊就医"
|
receipt["购药及就医类型"] = "门诊就医"
|
||||||
# TODO: 后续完善
|
# TODO: 后续完善就购药及就医类型为住院治疗处理
|
||||||
case ("医疗住院收费票据", "公立医院"):
|
case ("医疗住院收费票据", "公立医院"):
|
||||||
receipt["购药及就医类型"] = "住院治疗"
|
receipt["购药及就医类型"] = "住院治疗"
|
||||||
# TODO: 若根据影像件类型和购药及就医机构类型匹配购药及就医类型发生异常则流转至人工处理
|
# TODO: 若根据影像件类型和购药及就医机构类型匹配购药及就医类型发生异常则流转至人工处理
|
||||||
|
|
@ -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,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -11,6 +11,55 @@ from pathlib import Path
|
||||||
|
|
||||||
import edge_tts
|
import edge_tts
|
||||||
|
|
||||||
|
task = {
|
||||||
|
"video_path": "", # 视频路径
|
||||||
|
"video_cover_path": "", # 视频首帧图片路径,可空
|
||||||
|
"pictures": [
|
||||||
|
{
|
||||||
|
"position": (0.0, 0.0), # 图片左上角X和Y位置,于视频宽度百分比
|
||||||
|
"size_ratio": "", # 图片尺寸比例,于视频百分比
|
||||||
|
"picture_path": "", # 图片尺寸比例,于视频百分比
|
||||||
|
}, # 图片
|
||||||
|
],
|
||||||
|
"texts": [
|
||||||
|
{
|
||||||
|
"content": "", # 文字内容
|
||||||
|
"start": "", # 文字显示开始时间
|
||||||
|
"duration": "", # 文字展示时长,若为空值则默认为视频播放时长
|
||||||
|
"background_position": (0.0, 0.0), # 背景左上角X和Y位置
|
||||||
|
"background_color": "", # 背景颜色
|
||||||
|
"background_opacity": "", # 背景透明度
|
||||||
|
"stroke_color": "", # 边框颜色
|
||||||
|
"stroke_width": "", # 边框线宽
|
||||||
|
"font_size": "", # 字体大小
|
||||||
|
"font_color": "", # 字体颜色
|
||||||
|
},
|
||||||
|
],
|
||||||
|
}
|
||||||
|
|
||||||
|
from pycapcut import DraftFolder
|
||||||
|
|
||||||
|
import sys
|
||||||
|
|
||||||
|
|
||||||
|
# 指定剪映草稿文件夹地址
|
||||||
|
folder_path = {
|
||||||
|
"win32": r"C:\Users\admin\AppData\Local\JianyingPro\User Data\Projects\com.lveditor.draft".replace(
|
||||||
|
"\\", "/"
|
||||||
|
), # 若当前系统为windows则将剪映草稿文件夹原始字符串(避免转义问题)中反斜杠"\"转为正斜杠“/”
|
||||||
|
"darwin": None,
|
||||||
|
}.get(sys.platform)
|
||||||
|
|
||||||
|
if not folder_path:
|
||||||
|
raise RuntimeError("未指定剪映草稿文件夹地址")
|
||||||
|
|
||||||
|
# 初始化剪映草稿文件夹
|
||||||
|
folder = DraftFolder(folder_path)
|
||||||
|
|
||||||
|
print(folder)
|
||||||
|
|
||||||
|
exit()
|
||||||
|
|
||||||
|
|
||||||
async def audio_gen(
|
async def audio_gen(
|
||||||
text: str, output_path: Path, voice_name: str = "zh-CN-XiaoxiaoNeural"
|
text: str, output_path: Path, voice_name: str = "zh-CN-XiaoxiaoNeural"
|
||||||
|
|
|
||||||
Binary file not shown.
Loading…
Reference in New Issue