Compare commits

..

No commits in common. "abfe04f2b9b3a4024b3424c3924414bc8abd2f66" and "3a4c0669ef8e75addda3d1b588bbe1413c70e87a" have entirely different histories.

4 changed files with 49 additions and 97 deletions

Binary file not shown.

View File

@ -73,31 +73,33 @@ if __name__ == "__main__":
# 初始化在保被保险人表TPA作业系统包括团单、个单和被保险人表此处直接整合为宽表 # 初始化在保被保险人表TPA作业系统包括团单、个单和被保险人表此处直接整合为宽表
self._execute( self._execute(
sql=""" sql="""
CREATE TABLE IF NOT EXISTS insured_persons CREATE TABLE IF NOT EXISTS insured_person_policies
( (
--团单号
group_policy TEXT NOT NULL,
--个单号
person_policy TEXT NOT NULL,
--保险分公司
insurer_company TEXT NOT NULL,
--主被保险人
master_insured_person TEXT NOT NULL,
--被保险人 --被保险人
insured_person TEXT NOT NULL, insured_person TEXT NOT NULL,
--证件类型 --被保险人的证件类型
identity_type TEXT NOT NULL, identity_type TEXT NOT NULL,
--证件号码 --被保险人的证件号码
identity_number TEXT NOT NULL, identity_number TEXT NOT NULL,
--与主被保险人关系包括本人和附属附属包括配偶父母和子女 --与主被保险人关系包括本人和附属配偶父母和子女
relationship TEXT NOT NULL, relationship TEXT NOT NULL,
--个单号
person_policy TEXT NOT NULL,
--主被保险人
master_insured_person TEXT NOT NULL,
--保险起期取个单和团单起期最大值 --保险起期取个单和团单起期最大值
commencement_date TEXT NOT NULL, commencement_date REAL NOT NULL,
--保险止期取个单和团单止期最小值 --保险止期取个单和团单止期最小值
termination_date TEXT NOT NULL, termination_date REAL NOT NULL,
--联合主键被保险人+证件类型+证件号码+保险分公司 --团单号
PRIMARY KEY (insured_person, identity_type, group_policy TEXT NOT NULL,
identity_number, insurer_company) --投保公司
insurance_company TEXT NOT NULL,
--保险分公司
insurer_company TEXT NOT NULL,
--联合主键投保公司+保险分公司+被保险人+被保险人的证件类型+被保险人的证件号码
PRIMARY KEY (insurance_company, insurer_company, insured_person, identity_type,
identity_number)
) )
""" """
) )
@ -158,20 +160,22 @@ if __name__ == "__main__":
raise RuntimeError("查询并获取单条购药及就医机构类型发生异常") raise RuntimeError("查询并获取单条购药及就医机构类型发生异常")
# noinspection PyShadowingNames # noinspection PyShadowingNames
def query_insured_persons( def query_insured_person_records(
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:
@ -179,20 +183,21 @@ if __name__ == "__main__":
# noinspection SqlResolve # noinspection SqlResolve
result = self._query_all( result = self._query_all(
sql=""" sql="""
SELECT group_policy AS "团单号", SELECT insured_person 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_persons FROM insured_person_policies
WHERE insurer_company = ? WHERE insurance_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,
@ -203,7 +208,7 @@ if __name__ == "__main__":
return [ return [
{ {
k: ( k: (
datetime.strptime(v, "%Y-%m-%d") # 保险 datetime.fromtimestamp(v)
if k in ["保险起期", "保险止期"] if k in ["保险起期", "保险止期"]
else v else v
) )
@ -212,11 +217,9 @@ 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(
@ -459,21 +462,24 @@ 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, insurer_company) -> None: def identity_card_recognize(image, insurance_company, insurer_company) -> None:
""" """
居民身份证识别并整合至赔案档案 居民身份证识别并整合至赔案档案
:param image: 影像件 :param image: 影像件
:param insurance_company: 投保公司
:param insurer_company: 保险分公司 :param insurer_company: 保险分公司
:return: :return:
""" """
@ -568,7 +574,8 @@ if __name__ == "__main__":
) )
# 查询并获取多条被保险人记录 # 查询并获取多条被保险人记录
dossier["被保险人层"] = master_data.query_insured_persons( dossier["被保险人层"] = master_data.query_insured_person_records(
insurance_company,
insurer_company, insurer_company,
insured_person, # 出险人和被保险人为同一人,视角不同:出险人为理赔,被保险人为承保/保全 insured_person, # 出险人和被保险人为同一人,视角不同:出险人为理赔,被保险人为承保/保全
identity_type, identity_type,
@ -1080,7 +1087,7 @@ if __name__ == "__main__":
): ):
raise RuntimeError("请求深圳快瞳增值税发票识别接口发生异常") raise RuntimeError("请求深圳快瞳增值税发票识别接口发生异常")
match query_value(response["data"], "发票类型"): match receipt_type := query_value(response["data"], "发票类型"):
case "电子发票(普通发票)": case "电子发票(普通发票)":
# noinspection PyTypeChecker # noinspection PyTypeChecker
receipt.update( receipt.update(
@ -1381,6 +1388,8 @@ if __name__ == "__main__":
match (image["影像件类型"], receipt["购药及就医机构类型"]): match (image["影像件类型"], receipt["购药及就医机构类型"]):
# 就增值税发票且药店扣除不合理费用、增值税发票且私立医院解析个人自费、个人自付、医保支付、不合理金额和合理金额 # 就增值税发票且药店扣除不合理费用、增值税发票且私立医院解析个人自费、个人自付、医保支付、不合理金额和合理金额
case ("增值税发票", "药店"): case ("增值税发票", "药店"):
receipt["购药及就医类型"] = "药店购药"
items = ( items = (
pandas.DataFrame(receipt["明细项"]) pandas.DataFrame(receipt["明细项"])
.groupby("名称") # 就相同明细项名称合并数量和金额 .groupby("名称") # 就相同明细项名称合并数量和金额
@ -1423,14 +1432,6 @@ 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"),
@ -1447,14 +1448,13 @@ 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, insurer_company) identity_card_recognize(image, insurance_company, insurer_company)
# TODO: 后续添加居民户口簿识别和整合方法 # TODO: 后续添加居民户口簿识别和整合方法
case "中国港澳台地区及境外护照": case "中国港澳台地区及境外护照":
raise RuntimeError("暂不支持中国港澳台地区及境外护照") raise RuntimeError("暂不支持中国港澳台地区及境外护照")
@ -1618,6 +1618,7 @@ if __name__ == "__main__":
# 影像件识别并整合至赔案档案 # 影像件识别并整合至赔案档案
image_recognize( image_recognize(
image, image,
insurance_company,
insurer_company, insurer_company,
) )

View File

@ -11,55 +11,6 @@ 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"