feat: 增加差旅报销标准测算和财务终审流程

新增差旅报销测算接口及 Spreadsheet 规则解析,审批流程拆分
直属领导审批与财务终审两阶段并细分权限,修复 PDF 文本层
缺失时自动回退 OCR,提交后清理关联会话,前端适配审批流
交互并补充单元测试。
This commit is contained in:
caoxiaozhu
2026-05-21 09:28:33 +08:00
parent 002bf4f756
commit 8f65661809
43 changed files with 4366 additions and 410 deletions

View File

@@ -813,6 +813,24 @@
color: #1d4ed8;
}
.message-meta-chip.high {
background: #fef2f2;
color: #dc2626;
border: 1px solid #fecaca;
}
.message-meta-chip.medium {
background: #fffbeb;
color: #b45309;
border: 1px solid #fde68a;
}
.message-meta-chip.low {
background: #eff6ff;
color: #1d4ed8;
border: 1px solid #bfdbfe;
}
.risk-chip,
.message-risk-chip {
background: #fff1f2;
@@ -1262,6 +1280,10 @@
position: relative;
}
.travel-calculator-anchor {
position: relative;
}
.tool-btn.composer-side-btn.active {
border-color: rgba(59, 130, 246, 0.42);
background: rgba(239, 246, 255, 0.96);
@@ -1286,6 +1308,84 @@
0 4px 12px rgba(15, 23, 42, 0.06);
}
.travel-calculator-popover {
position: absolute;
bottom: calc(100% + 10px);
left: 0;
z-index: 30;
width: min(300px, calc(100vw - 48px));
display: grid;
gap: 12px;
padding: 14px;
border: 1px solid rgba(203, 213, 225, 0.92);
border-radius: 16px;
background: rgba(255, 255, 255, 0.98);
box-shadow:
0 18px 40px rgba(15, 23, 42, 0.16),
0 4px 12px rgba(15, 23, 42, 0.06);
}
.travel-calculator-mini-head {
display: grid;
gap: 3px;
}
.travel-calculator-mini-head strong {
color: #0f172a;
font-size: 13px;
font-weight: 900;
}
.travel-calculator-mini-head span {
color: #64748b;
font-size: 11px;
font-weight: 750;
}
.travel-calculator-form {
display: grid;
grid-template-columns: 92px minmax(0, 1fr);
gap: 8px;
}
.travel-calculator-field {
display: grid;
gap: 6px;
min-width: 0;
}
.travel-calculator-field span {
color: #64748b;
font-size: 11px;
font-weight: 800;
}
.travel-calculator-field input {
width: 100%;
min-height: 36px;
padding: 0 10px;
border: 1px solid rgba(203, 213, 225, 0.92);
border-radius: 10px;
background: #fff;
color: #0f172a;
font-size: 12px;
font-weight: 700;
}
.travel-calculator-field input:focus {
border-color: rgba(59, 130, 246, 0.46);
box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
outline: none;
}
.travel-calculator-error {
margin: 0;
color: #dc2626;
font-size: 11px;
font-weight: 750;
line-height: 1.5;
}
.composer-date-mode-tabs {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
@@ -1984,6 +2084,11 @@
transition: border-color 0.18s ease, background 0.18s ease, transform 0.18s ease;
}
.review-side-metric-card.wide {
grid-column: 1 / -1;
min-height: 104px;
}
.review-side-metric-card.invalid {
border-color: rgba(239, 68, 68, 0.34);
background: rgba(254, 242, 242, 0.72);
@@ -2038,6 +2143,14 @@
font-weight: 700;
}
.review-inline-textarea {
min-height: 82px;
padding: 9px 10px;
resize: vertical;
line-height: 1.55;
font-family: inherit;
}
.review-inline-input.invalid {
border-color: rgba(239, 68, 68, 0.4);
color: #b91c1c;
@@ -2225,16 +2338,6 @@
background: linear-gradient(180deg, rgba(255, 255, 255, 0.84) 0%, rgba(255, 249, 238, 0.8) 100%);
}
.review-side-risk-score {
color: #f97316;
font-size: 13px;
font-weight: 900;
}
.review-side-risk-score.empty {
color: #94a3b8;
}
.review-side-risk-summary {
margin: 0;
color: #334155;
@@ -2281,7 +2384,7 @@
font-size: 16px;
}
.review-side-risk-item.warning .review-side-risk-icon {
.review-side-risk-item.medium .review-side-risk-icon {
background: rgba(245, 158, 11, 0.14);
color: #b45309;
}
@@ -2291,6 +2394,11 @@
color: #dc2626;
}
.review-side-risk-item.low .review-side-risk-icon {
background: rgba(14, 165, 233, 0.12);
color: #0284c7;
}
.review-side-risk-copy {
min-width: 0;
display: grid;
@@ -4201,93 +4309,6 @@
flex: 1 1 168px;
}
.review-risk-detail-modal {
width: min(560px, calc(100vw - 40px));
max-height: min(760px, calc(100vh - 48px));
display: grid;
grid-template-rows: auto minmax(0, 1fr);
overflow: hidden;
border-radius: 24px;
border: 1px solid #e7eef6;
background:
radial-gradient(circle at top right, rgba(245, 158, 11, 0.10), transparent 28%),
linear-gradient(180deg, #fbfdff 0%, #f6f9fc 100%);
box-shadow:
0 24px 80px rgba(15, 23, 42, 0.22),
0 2px 12px rgba(15, 23, 42, 0.08);
}
.review-risk-detail-head {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: 16px;
padding: 22px 24px 18px;
border-bottom: 1px solid #eef2f7;
}
.review-risk-detail-head h3 {
margin: 12px 0 0;
color: #0f172a;
font-size: 21px;
font-weight: 900;
line-height: 1.35;
}
.review-risk-detail-body {
min-height: 0;
display: grid;
gap: 14px;
padding: 18px 24px 24px;
overflow-y: auto;
}
.review-risk-detail-level {
width: fit-content;
display: inline-flex;
align-items: center;
gap: 8px;
min-height: 30px;
padding: 0 11px;
border-radius: 999px;
background: rgba(14, 165, 233, 0.12);
color: #0284c7;
font-size: 12px;
font-weight: 900;
}
.review-risk-detail-level.warning {
background: rgba(245, 158, 11, 0.14);
color: #b45309;
}
.review-risk-detail-level.high {
background: rgba(239, 68, 68, 0.12);
color: #dc2626;
}
.review-risk-detail-section {
display: grid;
gap: 8px;
padding: 14px;
border: 1px solid rgba(226, 232, 240, 0.92);
border-radius: 16px;
background: rgba(255, 255, 255, 0.72);
}
.review-risk-detail-section strong {
color: #0f172a;
font-size: 13px;
font-weight: 900;
}
.review-risk-detail-section p {
margin: 0;
color: #475569;
font-size: 13px;
line-height: 1.7;
}
.review-edit-modal {
max-height: min(860px, calc(100vh - 48px));
display: grid;
@@ -4723,6 +4744,10 @@
min-height: 32px;
}
.travel-calculator-form {
grid-template-columns: 1fr;
}
.dialog-toolbar {
padding: 16px 16px 12px;
}