This commit is contained in:
liubiren 2026-01-18 21:03:43 +08:00
parent b7e227820c
commit c76dd65c7c
5 changed files with 2130 additions and 2303 deletions

View File

@ -54,7 +54,10 @@ def case_adjust(dossier: Dict[str, Any]) -> None:
)
# 赔案理算金额
dossier["adjustment_layer"]["adjustment_amount"] = Decimal(
dossier["adjustment_layer"].update(
{
"explanation": "具体请参考票据理算层",
"adjustment_amount": Decimal(
sum(
[
adjustment["adjustment_amount"]
@ -65,6 +68,8 @@ def case_adjust(dossier: Dict[str, Any]) -> None:
).quantize(
exp=Decimal("0.00"),
rounding=ROUND_HALF_UP,
),
}
)
# 实例化HTML渲染器
@ -227,7 +232,7 @@ def receipt_adjust(
adjustments.append(
{
"group_policy": None, # 团单号
"person_policy": None, # 个单号
"person_policy": "开票时个单未起保", # 个单号
"liability": None, # 理赔责任名称
"accident": None, # 理赔类型
"personal_self_payment": receipt[

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@ -1093,7 +1093,12 @@ def receipt_recognize(
axis="columns",
), # 合理项
)
.assign(
total=lambda dataframe: dataframe["reasonable_amount"], # 合计
)
)
if items["amount"].sum() != receipt["amount"]:
raise RuntimeError("明细项金额合计与开票金额不一致")
receipt.update(
{
@ -1101,7 +1106,7 @@ def receipt_recognize(
dossier["insured_person_layer"]["insured_person"]
if dossier["insured_person_layer"]["insured_person"]
in receipt["payer"]
else None
else "非被保险人"
), # 出险人姓名
"accident": "药店购药", # 理赔类型
"diagnosis": "购药拟诊", # 医疗诊断
@ -1120,6 +1125,10 @@ def receipt_recognize(
Decimal("0.00"),
rounding=ROUND_HALF_UP,
), # 合理金额
"total": Decimal(items["reasonable_amount"].sum()).quantize(
Decimal("0.00"),
rounding=ROUND_HALF_UP,
), # 合计
"items": items.to_dict("records"),
}
)

View File

@ -1,22 +1,29 @@
<!DOCTYPE html>
<!doctype html>
<!-- 文档说明:票据理赔自动化报告渲染模板
版本1.0
-->
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta
name="rendered_html_by_template"
content="width=device-width, initial-scale=1.0"
/>
<title>票据理赔自动化</title>
<style>
:root {
/* Arcoblue 极致蓝参考Palatte色彩配置 https://arco.design/palette/list */
--arcoblue-1: #e8f3ff;
--arcoblue-2: #bedaff;
--arcoblue-3: #94bfff;
--arcoblue-4: #6aa1ff;
--arcoblue-5: #4080ff;
--arcoblue-6: #165dff;
--arcoblue-6: #165dff; /* 主题颜色 */
--arcoblue-7: #0e42d2;
--arcoblue-8: #072ca6;
--arcoblue-9: #031a79;
--arcoblue-10: #000d4d;
/* Green 仙野绿 */
--green-1: #e8ffea;
--green-2: #aff0b5;
--green-3: #7be188;
@ -27,18 +34,7 @@
--green-8: #008026;
--green-9: #006622;
--green-10: #004d1c;
--red-1: #ffece8;
--red-2: #fdcdc5;
--red-3: #fbaca3;
--red-4: #f98981;
--red-5: #f76560;
--red-6: #f53f3f;
--red-7: #cb272d;
--red-8: #a1151e;
--red-9: #770611;
--red-10: #4d000a;
/* Orange 活力橙 */
--orange-1: #fff7e8;
--orange-2: #ffe4ba;
--orange-3: #ffcf8b;
@ -49,7 +45,18 @@
--orange-8: #a64500;
--orange-9: #792e00;
--orange-10: #4d1b00;
/* Red 浪漫红 */
--red-1: #ffece8;
--red-2: #fdcdc5;
--red-3: #fbaca3;
--red-4: #f98981;
--red-5: #f76560;
--red-6: #f53f3f;
--red-7: #cb272d;
--red-8: #a1151e;
--red-9: #770611;
--red-10: #4d000a;
/* Gray 中性灰 */
--gray-1: #f7f8fa;
--gray-2: #f2f3f5;
--gray-3: #e5e6eb;
@ -60,336 +67,302 @@
--gray-8: #4e5969;
--gray-9: #272e3b;
--gray-10: #1d2129;
/* 白 */
--white: #ffffff;
--color-primary: var(--arcoblue-6);
--color-primary-light: var(--arcoblue-1);
--color-success: var(--green-6);
--color-warning: var(--orange-6);
--color-danger: var(--red-6);
--color-text: var(--gray-9);
--color-text-secondary: var(--gray-7);
--color-border: var(--gray-3);
--color-background: var(--gray-1);
--color-background-secondary: #ffffff;
/* 样式配置 */
--color-text: var(--gray-8); /* 文本颜色 */
--color-text-secondary: var(--gray-6); /* 二级文本颜色 */
--color-text-emphasise: var(--arcoblue-6); /* 强调文本颜色 */
--color-text-contrast: var(--gray-1); /* 对比文本颜色 */
--color-background: var(--gray-1); /* 背景颜色 */
--color-background-secondary: var(--arcoblue-1); /* 二级背景颜色 */
--color-background-emphasise: var(--arcoblue-6); /* 强调背景颜色 */
--color-border: var(--gray-3); /* 边框颜色 */
--color-border-secondary: var(--gray-3); /* 二级边框颜色 */
--border-radius-small: 4px;
--border-radius-medium: 6px;
--border-radius-medium: 8px;
--border-radius-large: 8px;
--font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto,
--border-radius-round: 50px;
--font-family:
"Segoe UI", -apple-system, BlinkMacSystemFont, Roboto,
"Helvetica Neue", Arial, "Noto Sans", sans-serif;
--font-size-small: 12px;
--font-size-medium: 14px;
--font-size-large: 20px;
--font-weight-medium: 400;
--font-weight-large: 600;
--box-shadow: 0 4px 10px rgba(0, 0, 0, 0.04);
--box-shadow-hover: 0 8px 20px rgba(0, 0, 0, 0.08);
--spacing-xs: 4px;
--spacing-extra-small: 4px;
--spacing-small: 8px;
--spacing-md: 16px;
--spacing-lg: 24px;
--spacing-xl: 32px;
--spacing-medium: 16px;
--spacing-large: 24px;
--line-height: 1.6; /* 行高 */
}
* {
box-sizing: border-box;
margin: 0;
padding: 0;
font-family: var(--font-family);
box-sizing: border-box; /* 重置盒模型 */
padding: 0; /* 重置内边距 */
margin: 0; /* 重置外边距 */
font-family: var(--font-family); /* 字体 */
}
body {
background-color: var(--color-background);
color: var(--color-text);
line-height: 1.6;
padding: var(--spacing-lg);
min-height: 100vh;
min-height: 100vh; /* 最小高度,满屏 */
background-color: var(--color-background); /* 背景颜色 */
padding: var(--spacing-large); /* 内边距 */
line-height: var(--line-height); /* 行高 */
color: var(--color-text); /* 文本颜色 */
}
/* 主容器 */
.container {
max-width: 1200px;
margin: 0 auto;
background: var(--color-background-secondary);
border-radius: var(--border-radius-large);
box-shadow: var(--box-shadow);
overflow: hidden;
max-width: 1200px; /* 最大宽度 */
margin: 0 auto; /* 上下外边距为0左右外边距自动平分(水平居中) */
background: var(--color-background-secondary); /* 背景颜色 */
border: 1px solid var(--color-border); /* 边框 */
border-radius: var(--border-radius-medium); /* 圆角 */
box-shadow: var(--box-shadow); /* 阴影 */
overflow: hidden; /* 隐藏溢出 */
}
/* 块 */
.header-block {
position: relative;
background: var(--color-primary); /* 背景色 */
padding: var(--spacing-xl);
display: flex;
justify-content: space-between;
align-items: center;
flex-wrap: wrap;
/* 标题块 */
.header {
position: relative; /* 相对定位 */
display: flex; /* 弹性布局 */
justify-content: space-between; /* 内容两端对齐 */
padding: var(--spacing-large); /* 内边距 */
background: var(--color-background-emphasise); /* 背景颜色 */
align-items: center; /* 垂直居中 */
flex-wrap: wrap; /* 换行 */
}
.header-block-title {
.header-title {
flex-basis: 100%; /* 独占一行 */
margin-bottom: var(--spacing-small); /* 外边距 */
color: var(--gray-1); /* 文字颜色 */
color: var(--color-text-contrast); /* 文字颜色 */
font-size: var(--font-size-large); /* 文字字号 */
font-weight: var(--font-weight-large); /* 文字粗细 */
}
.header-block-content {
color: var(--gray-1); /* 文字颜色 */
.header-content {
color: var(--color-text-contrast); /* 文字颜色 */
font-size: var(--font-size-medium); /* 文字字号 */
font-weight: var(--font-weight-medium); /* 文字粗细 */
opacity: 0.8; /* 文字透明度 */
}
.section-block {
padding: var(--spacing-lg);
border-bottom: 1px solid var(--color-border);
/* 内容块 */
.section {
padding: var(--spacing-large); /* 内边距 */
border-bottom: 1px solid var(--color-border); /* 边框 */
background: var(--color-background); /* 背景颜色 */
}
.section-block:last-child {
.section:last-child {
border-bottom: none;
} /* 最后一个内容块不显示下边框 */
/* 内容块标题 */
.section-title {
display: flex; /* 弹性布局 */
align-items: center; /* 垂直居中 */
padding-bottom: var(--spacing-small); /* 下内边距 */
margin-bottom: var(--spacing-large); /* 下外边距 */
border-bottom: 1px solid var(--color-border-secondary); /* 下边框 */
color: var(--color-text-emphasise); /* 文字颜色 */
font-size: var(--font-size-medium); /* 文字字号 */
font-weight: var(--font-weight-large); /* 文字粗细 */
}
.section-block-title {
color: var(--color-primary);
font-size: var(--font-size-medium);
font-weight: var(--font-weight-medium);
margin-bottom: var(--spacing-lg);
padding-bottom: var(--spacing-small);
border-bottom: 1px solid var(--color-primary-light);
display: flex;
align-items: center;
}
.section-title:before {
content: ""; /* 伪元素内容 */
width: 3px; /* 宽度 */
height: 1.2em; /* 高度 */
background: var(--color-background-emphasise); /* 背景颜色 */
border-radius: var(--border-radius-small); /* 圆角 */
margin-right: var(--spacing-small); /* 右外边距 */
} /* 标题修饰 */
.section-block-title:before {
content: "";
display: inline-block;
width: 3px;
height: 16px;
background: var(--color-primary);
border-radius: var(--border-radius-small);
margin-right: var(--spacing-small);
}
.section-block-content {
/* 内容块内容 */
.section-content {
padding: var(--spacing-small) 0; /* 上下内边距 */
margin-bottom: var(--spacing-medium); /* 下外边距 */
line-height: var(--line-height); /* 文字行高 */
color: var(--color-text); /* 文字颜色 */
font-size: var(--font-size-medium); /* 文字字号 */
font-weight: var(--font-weight-large); /* 文字粗细 */
line-height: 1.6; /* 文字行高 */
margin-bottom: var(--spacing-md);
padding: var(--spacing-small) 0;
}
.section-block-inner {
display: grid;
grid-template-columns: 1fr;
gap: var(--spacing-md);
/* 内容块内部块 */
.section-block {
display: grid; /* 网格布局 */
grid-template-columns: 1fr; /* 1列 */
gap: var(--spacing-medium); /* 间距 */
}
/* 卡片 */
.card {
background: var(--color-background-secondary);
border-radius: var(--border-radius-medium);
padding: var(--spacing-md);
border: 1px solid var(--color-border);
box-shadow: var(--box-shadow);
transition: transform 0.2s ease, box-shadow 0.2s ease;
background: var(--color-background); /* 背景颜色 */
padding: var(--spacing-medium); /* 内边距 */
margin-bottom: var(--spacing-large); /* 下外边距 */
border-radius: var(--border-radius-medium); /* 圆角 */
border: 1px solid var(--color-border); /* 边框 */
box-shadow: var(--box-shadow); /* 阴影 */
transition:
transform 0.2s ease,
box-shadow 0.2s ease; /* 过渡 */
}
/* 卡片标题 */
.card-title {
color: var(--color-primary);
font-size: var(--font-size-medium);
font-weight: var(--font-weight-large);
margin-bottom: var(--spacing-md);
padding-bottom: var(--spacing-small);
border-bottom: 1px dashed var(--color-border);
display: flex; /* 弹性布局 */
justify-content: space-between; /* 内容两端对齐 */
align-items: flex-start; /* 垂直顶部对齐 */
padding-bottom: var(--spacing-small); /* 下内边距 */
margin-bottom: var(--spacing-medium); /* 下外边距 */
border-bottom: 1px dashed var(--color-border); /* 下边框 */
color: var(--color-text-emphasise); /* 文字颜色 */
font-size: var(--font-size-medium); /* 文字字号 */
font-weight: var(--font-weight-large); /* 文字粗细 */
}
.card-title-content {
font-size: var(--font-size-small);
} /* 卡片标题内容 */
.card-title-content a {
color: inherit;
text-decoration: none; /* 去掉下划线 */
} /* 卡片标题内容链接 */
/* 卡片标题标签 */
.card-title-tag {
display: inline-block; /* 内联块元素 */
align-items: center; /* 垂直居中 */
padding: var(--spacing-small) var(--spacing-medium); /* 内边距 */
border-radius: var(--border-radius-round); /* 圆角 */
font-size: var(--font-size-small); /* 文字字号 */
font-weight: var(--font-weight-medium); /* 文字粗细 */
}
.card-title-tag.green {
background: var(--green-1); /* 背景颜色 */
border: 1px solid var(--green-3); /* 边框 */
color: var(--green-6); /* 文字颜色 */
}
.card-title-tag.yellow {
background: var(--orange-1); /* 背景颜色 */
border: 1px solid var(--orange-3); /* 边框 */
color: var(--orange-6); /* 文字颜色 */
}
.card-title-tag.red {
background: var(--red-1); /* 背景颜色 */
border: 1px solid var(--red-3); /* 边框 */
color: var(--red-6); /* 文字颜色 */
}
/* 字段布局 */
.card-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: var(--spacing-md) var(--spacing-lg);
font-size: 14px;
display: grid; /* 网格布局 */
grid-template-columns: repeat(3, 1fr); /* 3列 */
gap: var(--spacing-medium) var(--spacing-large); /* 间距 */
font-size: var(--font-size-medium); /* 文字字号 */
}
.card-item {
display: flex;
flex-direction: column;
margin-bottom: 12px;
display: flex; /* 弹性布局 */
flex-direction: column; /* 垂直方向 */
margin-bottom: var(--spacing-medium); /* 下外边距 */
}
.card-item-label {
color: var(--color-text-secondary);
font-size: var(--font-size-medium);
font-weight: var(--font-weight-medium);
margin-bottom: 4px;
color: var(--color-text-secondary); /* 文字颜色 */
font-size: var(--font-size-small); /* 文字字号 */
font-weight: var(--font-weight-medium); /* 文字粗细 */
margin-bottom: var(--spacing-extra-small); /* 下外边距 */
}
.card-item-value {
color: var(--color-text);
color: var(--color-text); /* 文字颜色 */
font-size: var(--font-size-small); /* 文字字号 */
font-weight: var(--font-weight-medium); /* 文字粗细 */
word-break: break-word; /* 自动换行 */
padding: 4px 0; /* 上下内边距 */
}
.table {
margin-bottom: var(--spacing-medium);
}
.table-title {
font-size: var(--font-size-medium);
font-weight: var(--font-weight-large);
word-break: break-word;
padding: 4px 0;
}
.invoice-card {
background: var(--color-background-secondary);
border-radius: var(--border-radius-medium);
padding: var(--spacing-md);
margin-bottom: var(--spacing-md);
box-shadow: var(--box-shadow);
border: 1px solid var(--color-border);
}
.invoice-header {
display: flex;
justify-content: space-between;
align-items: flex-start;
margin-bottom: var(--spacing-md);
padding-bottom: var(--spacing-small);
border-bottom: 1px solid var(--color-border);
}
.invoice-number-container {
display: flex;
flex-direction: column;
}
.invoice-number {
font-size: 15px;
font-weight: 600;
color: var(--color-primary);
}
.invoice-reference {
margin-top: 4px;
font-size: 12px;
color: var(--color-text-secondary);
}
.invoice-verification {
display: flex;
align-items: center;
}
.verification-tag {
padding: 6px 12px;
border-radius: 50px;
font-weight: 600;
display: inline-block;
font-size: 13px;
border: 1px solid;
}
.verification-tag.valid {
background: var(--green-1);
color: var(--green-7);
border-color: var(--green-3);
}
.verification-tag.suspicious {
background: var(--orange-1);
color: var(--orange-7);
border-color: var(--orange-3);
}
.verification-tag.invalid {
background: var(--red-1);
color: var(--red-7);
border-color: var(--red-3);
}
.invoice-details {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
gap: var(--spacing-md);
margin-bottom: var(--spacing-md);
font-size: 14px;
}
.detail-item {
display: flex;
flex-direction: column;
}
.detail-label {
font-size: 12px;
color: var(--color-text-secondary);
margin-bottom: 4px;
}
.detail-value {
font-size: 14px;
font-weight: 500;
color: var(--color-text-emphasise);
margin-bottom: var(--spacing-medium);
}
/* 表格样式 */
table {
width: 100%;
margin-top: var(--spacing-md);
border-collapse: separate;
border-spacing: 0;
border-radius: var(--border-radius-medium);
overflow: hidden;
box-shadow: var(--box-shadow);
table-layout: fixed;
border: 1px solid var(--color-border);
background-color: var(--color-background-secondary);
background-color: var(--color-background); /* 背景颜色 */
width: 100%; /* 宽度100% */
table-layout: fixed; /* 固定表格布局,加速渲染 */
overflow: hidden; /* 隐藏超出容器的内容 */
margin-top: var(--spacing-medium); /* 上外边距 */
border: 1px solid var(--color-border); /* 边框 */
border-collapse: separate; /* 边框分离,支持圆角 */
border-spacing: 0; /* 边框间距为0 */
border-radius: var(--border-radius-medium); /* 圆角 */
box-shadow: var(--box-shadow); /* 阴影效果 */
}
/* 表格标题 */
th {
background-color: var(--color-primary-light);
color: var(--color-primary);
font-size: var(--font-size-medium);
font-weight: var(--font-weight-large);
padding: 12px;
text-align: left;
width: 20%;
word-break: break-word;
background-color: var(--color-background-secondary);
color: var(--color-text-emphasise);
font-size: var(--font-size-small);
font-weight: var(--font-weight-medium);
padding: var(--spacing-medium); /* 内边距 */
text-align: left; /* 左对齐 */
width: 20%; /* 宽度 */
word-break: break-word; /* 自动换行 */
}
td {
color: var(--color-text);
font-size: var(--font-size-medium);
font-weight: var(--font-weight-large);
padding: 12px;
border-bottom: 1px solid var(--color-border);
width: 20%;
word-break: nowrap;
padding: var(--spacing-medium); /* 内边距 */
border-bottom: 1px solid var(--color-border); /* 下边框 */
color: var(--color-text); /* 文本颜色 */
font-size: var(--font-size-small); /* 字体大小 */
font-weight: var(--font-weight-medium); /* 字体粗细 */
word-break: break-word; /* 自动换行,适配小屏幕 */
}
tr:nth-child(even) {
background-color: var(--color-background);
}
.amount-total {
text-align: right;
font-weight: 600;
font-size: 15px;
color: var(--color-primary);
margin-top: var(--spacing-md);
padding-top: var(--spacing-md);
border-top: 1px solid var(--color-border);
}
tr.total-total-row td {
background-color: var(
--color-background-secondary
) !important; /* 背景颜色 */
color: var(--color-text-emphasise) !important; /* 文本颜色 */
font-weight: var(--font-weight-medium) !important; /* 字体粗细 */
} /* 总计行 */
footer {
text-align: center;
padding: var(--spacing-md);
padding: var(--spacing-medium);
color: var(--color-text-secondary);
font-size: 12px;
background: var(--color-background);
border-top: 1px solid var(--color-border);
}
.highlight {
color: var(--color-danger);
font-weight: 500;
}
</style>
</head>
<body>
<div class="container">
<div class="header-block">
<div class="header-block-title">理赔报告</div>
<div class="header-block-content">
<div class="header">
<div class="header-title">理赔报告</div>
<div class="header-content">
<span>{{ obj["report_layer"]["insurer_company"] }}</span>
<span>|</span>
<span>{{ obj["report_layer"]["report_time"] }}</span>
@ -397,9 +370,9 @@
<span>{{ obj["report_layer"]["case_number"] }}</span>
</div>
</div>
<div class="section-block">
<div class="section-block-title">理赔结论层</div>
<div class="section-block-content">
<div class="section">
<div class="section-title">结论层</div>
<div class="section-content">
<span>经理赔流程初步审核,本案结论为</span>
<span>{{ obj["adjustment_layer"]["conclusion"] }}</span>
<span>,理赔金额为</span>
@ -409,9 +382,9 @@
<span></span>
</div>
</div>
<div class="section-block">
<div class="section-block-title">影像件层</div>
<div class="section-block-content">
<div class="section">
<div class="section-title">影像件层</div>
<div class="section-content">
<span>本案签收</span>
<span>{{ obj["report_layer"]["images_counts"] }}</span>
<span>张影像件,其中已分类</span>
@ -420,7 +393,7 @@
<span>{{ obj["recognized_images_counts"] }}</span>
<span>张。具体情况如下:</span>
</div>
<div>
<div class="table">
<table>
<thead>
<tr>
@ -445,9 +418,9 @@
</table>
</div>
</div>
<div class="section">
<div class="section-title">赔案层</div>
<div class="section-block">
<div class="section-block-title">赔案层</div>
<div class="section-block-inner">
<div class="card">
<div class="card-title">出险人(亦被保险人)信息</div>
<div class="card-grid">
@ -538,13 +511,13 @@
</div>
<div class="card">
<div class="card-title">可理赔责任</div>
<div>
<div class="table">
<table>
<thead>
<tr>
<th>团单号</th>
<th>理赔责任</th>
<th></th>
<th>保期</th>
<th>主被保险人</th>
<th>被保险人</th>
<th>与主被保险人关系</th>
@ -555,7 +528,11 @@
<tr>
<td>{{ liability["group_policy"] }}</td>
<td>{{ liability["liability"] }}</td>
<td>{{ liability["termination_date"] }}</td>
<td>
<span>{{ liability["commencement_date"] }}</span
><span>~</span
><span>{{ liability["termination_date"] }}</span>
</td>
<td>{{ liability["master_insured_person"] }}</td>
<td>{{ liability["insured_person"] }}</td>
<td>{{ liability["relationship"] }}</td>
@ -567,131 +544,120 @@
</div>
</div>
</div>
<div class="section-block">
<h2>票据层</h2>
<div class="section">
<div class="section-title">票据层</div>
{% for receipt in obj["receipts_layer"] %}
<div class="invoice-card">
<div class="invoice-header">
<div class="invoice-number-container">
<div class="invoice-number">{{ receipt["number"] }}</div>
<span class="invoice-reference"
>关联影像件:
<div class="card">
<div class="card-title">
<div>
<div>{{ receipt["number"] }}</div>
<div class="card-title-content">
关联影像件编号:
<a
href="file:///{{ receipt.image_path | replace('\\', '/') }}"
href="file:///{{ receipt['image_path'] | replace('\\', '/') }}"
target="_blank"
>{{ receipt["image_index"] }}</a
></span
>
</div>
<div class="invoice-verification">
</div>
<div class="card-title-tag">
{% if receipt["verification"] == '真票' %}
<span class="verification-tag valid"
<span class="card-title-tag green"
>{{ receipt["verification"] }}</span
>
{% elif receipt["verification"] == '无法查验' %}
<span class="verification-tag suspicious"
<span class="card-title-tag yellow"
>{{ receipt["verification"] }}</span
>
{% else %}
<span class="verification-tag invalid"
<span class="card-title-tag red"
>{{ receipt["verification"] }}</span
>
{% endif %}
</div>
</div>
<div class="invoice-details">
<div class="detail-item">
<div class="detail-label">出险人</div>
<!-- 出险人为空值 -->
<div class="detail-value">{{ receipt["payer"] | str_to_str}}</div>
<div class="card-grid">
<div class="card-item">
<div class="card-item-label">出险人</div>
<!-- 出险人为空值 -->
<div class="card-item-value">{{ receipt["payer"] }}</div>
</div>
<div class="detail-item">
<div class="detail-label">票据代码</div>
<div class="card-item">
<div class="card-item-label">票据代码</div>
<!-- 票据代码可为空值 -->
<div class="detail-value">{{ receipt["code"] | str_to_str}}</div>
<div class="card-item-value">{{ receipt["code"] }}</div>
</div>
<div class="detail-item">
<div class="detail-label">校验码</div>
<div class="detail-value">{{ receipt["check_code"] }}</div>
<div class="card-item">
<div class="card-item-label">校验码</div>
<div class="card-item-value">{{ receipt["check_code"] }}</div>
</div>
<div class="detail-item">
<div class="detail-label">开票日期</div>
<div class="detail-value">
{{ receipt["date"] | datetime_to_str }}
<div class="card-item">
<div class="card-item-label">开票日期</div>
<div class="card-item-value">{{ receipt["date"] }}</div>
</div>
<div class="card-item">
<div class="card-item-label">开票金额</div>
<div class="card-item-value">{{ receipt["amount"] }}元</div>
</div>
<div class="detail-item">
<div class="detail-label">开票金额</div>
<div class="detail-value">{{ receipt["amount"] }}元</div>
<div class="card-item">
<div class="card-item-label">医疗诊断</div>
<div class="card-item-value">{{ receipt["diagnosis"] }}</div>
</div>
<div class="detail-item">
<div class="detail-label">购药及就医机构</div>
<div class="detail-value">
<div class="card-item">
<div class="card-item-label">购药及就医机构</div>
<div class="card-item-value">
{{ receipt["institution_type"] }} | {{ receipt["institution"] }}
</div>
</div>
<div class="detail-item">
<div class="detail-label">医疗诊断</div>
<div class="detail-value">{{ receipt["diagnosis"] }}</div>
<div class="card-item">
<div class="card-item-label">理赔类型</div>
<div class="card-item-value">{{ receipt["accident"] }}</div>
</div>
</div>
<div class="table">
<div class="table-title">药品/医疗服务层</div>
<table>
<thead>
<tr>
<th>药品/医疗服务</th>
<th>数量</th>
<th>金额</th>
<th>个人自费项</th>
<th>个人自付项</th>
<th>合理项</th>
<th>个人自费项(元)</th>
<th>个人自付项(元)</th>
<th>合理项(元)</th>
<th>合计(元)</th>
</tr>
</thead>
<tbody>
{% for item in receipt["items"] %}
<tr>
<td>{{ item["category"] }} | {{ item["medicine"] }}</td>
<td>{{ item["quantity"] }}</td>
<td>{{ item["amount"] }}元</td>
<td>{{ item["personal_self_payment"] }}元</td>
<td>{{ item["non_medical_payment"] }}元</td>
<td>{{ item["reasonable_amount"] }}元</td>
<td>{{ item["amount"] }}</td>
<td>{{ item["personal_self_payment"] }}</td>
<td>{{ item["non_medical_payment"] }}</td>
<td>{{ item["reasonable_amount"] }}</td>
<td>{{ item["total"] }}</td>
</tr>
{% endfor %}
<tr class="total-total-row">
<td>合计</td>
<td>{{ receipt["amount"] }}</td>
<td>{{ receipt["personal_self_payment"] }}</td>
<td>{{ receipt["non_medical_payment"] }}</td>
<td>{{ receipt["reasonable_amount"] }}</td>
<td>{{ receipt["total"] }}</td>
</tr>
</tbody>
</table>
<div class="invoice-details">
<div class="detail-item">
<div class="detail-label">理赔类型</div>
<div class="detail-value">{{ receipt["accident"] }}</div>
</div>
<div class="detail-item">
<div class="detail-label">个人自费金额</div>
<div class="detail-value">
{{ receipt["personal_self_payment"] }}
</div>
</div>
<div class="detail-item">
<div class="detail-label">个人自付金额</div>
<div class="detail-value">
{{ receipt["non_medical_payment"] }}
</div>
</div>
<div class="detail-item">
<div class="detail-label">合理金额</div>
<div class="detail-value">{{ receipt["reasonable_amount"] }}</div>
</div>
</div>
<div>
<div class="table-title">理算层</div>
<table>
<thead>
<tr>
<th>票据剩余金额</th>
<th>团单号</th>
<th>个单号</th>
<th>个单剩余保额</th>
<th>个单剩余保额(元)</th>
<th>理赔责任</th>
<th>个人自费可理算金额</th>
<th>个人自付可理算金额</th>
<th>合理可理算金额</th>
<th>可理算金额</th>
<th>理算金额</th>
</tr>
@ -700,21 +666,19 @@
{% for adjustment in receipt["adjustments"] %}
<tr>
<td>{{ adjustment["remaining_amount"] }}</td>
<td>{{ adjustment["group_policy"] }}</td>
<td>{{ adjustment["person_policy"] }}</td>
<td>{{ adjustment["remaining_coverage_amount"] }}</td>
<td>{{ adjustment["liability"] }}</td>
<td>{{ adjustment["personal_self_adjustable_amount"] }}</td>
<td>{{ adjustment["non_medical_adjustable_amount"] }}</td>
<td>{{ adjustment["reasonable_adjustable_amount"] }}</td>
<td>{{ adjustment["adjustable_amount"] }}</td>
<td>{{ adjustment["adjustment_amount"] }}</td>
</tr>
{% endfor %}
<tr class="total-total-row">
<td colspan="5">合计</td>
<td>{{ receipt["adjustment_amount"] }}</td>
</tr>
</tbody>
</table>
<div class="amount-total">
理算金额合计: {{ receipt["adjustment_amount"] }}元
</div>
</div>
{% endfor %}