feat: 增加差旅报销标准测算和财务终审流程
新增差旅报销测算接口及 Spreadsheet 规则解析,审批流程拆分 直属领导审批与财务终审两阶段并细分权限,修复 PDF 文本层 缺失时自动回退 OCR,提交后清理关联会话,前端适配审批流 交互并补充单元测试。
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user