feat: 数字员工财务报告体系与定时提醒及看板快照调度

- 新增数字员工财务报告生成、邮件投递与渲染调度器
- 引入员工画像扫描调度与定时提醒任务
- 完善财务看板快照、排行口径与部门人员占比计算
- 优化数字员工工作看板仪表盘与技能目录
- 增强前端总览页图表、工作台摘要与顶部导航栏交互
- 新增差旅申请规划推动提醒与报销创建会话状态管理
- 补充财务报告、看板调度、数字员工工作记录测试覆盖
This commit is contained in:
caoxiaozhu
2026-06-03 09:25:23 +08:00
parent 0c74b4ab4a
commit 15006a05a7
114 changed files with 7356 additions and 650 deletions

View File

@@ -123,7 +123,6 @@
z-index: 1;
}
.todo-row,
.progress-row {
position: relative;
border-top: 0;
@@ -131,12 +130,10 @@
box-shadow: inset 0 1px 0 rgba(var(--theme-primary-rgb, 58, 124, 165), 0.1);
}
.todo-row:first-child,
.progress-row:first-child {
box-shadow: none;
}
.todo-row:hover,
.progress-row:hover {
background:
linear-gradient(180deg, rgba(255, 255, 255, 0.32), rgba(255, 255, 255, 0.18)),

View File

@@ -63,7 +63,7 @@
}
.assistant-copy {
width: min(1040px, 92%);
width: min(940px, 92%);
}
.assistant-copy h1 {
@@ -71,11 +71,11 @@
}
.capability-grid--privileged {
grid-template-columns: repeat(4, minmax(0, 1fr));
grid-template-columns: repeat(6, minmax(0, 1fr));
}
.capability-grid--standard {
grid-template-columns: repeat(3, minmax(0, 1fr));
grid-template-columns: repeat(4, minmax(0, 1fr));
}
.capability-card {
@@ -87,7 +87,7 @@
}
.workbench-content-grid {
grid-template-columns: minmax(300px, 0.92fr) minmax(480px, 1.34fr) minmax(270px, 0.76fr);
grid-template-columns: minmax(480px, 1.34fr) minmax(270px, 0.76fr);
gap: 14px;
}
@@ -202,25 +202,15 @@
grid-template-columns: 1fr;
}
.todo-row,
.progress-row {
grid-template-columns: 1fr;
justify-items: start;
}
.todo-row {
grid-template-columns: 48px minmax(0, 1fr);
}
.todo-meta,
.progress-result {
justify-items: start;
}
.todo-meta {
grid-column: 2;
}
.progress-steps {
width: 100%;
}
@@ -332,30 +322,6 @@
font-size: 11px;
}
/* 我的待办列表项更精致 */
.todo-row {
padding: 5px 0;
gap: 6px;
}
.todo-copy strong {
font-size: 12.5px;
}
.todo-copy small {
font-size: 11px;
}
.todo-status {
font-size: 11px;
min-height: 18px;
padding: 0 5px;
}
.todo-meta small {
font-size: 10.5px;
}
/* 重点优化费用进度行的网格区域Grid Area双行重构 */
.progress-row {
display: grid;

View File

@@ -97,7 +97,7 @@
.assistant-copy {
position: relative;
z-index: 3;
width: min(1120px, 94%);
width: min(980px, 94%);
display: grid;
gap: var(--hero-copy-gap);
}
@@ -130,6 +130,7 @@
z-index: 5;
display: grid;
gap: 6px;
max-width: 920px;
min-height: var(--composer-min-height);
padding: var(--composer-padding-block) 18px 10px;
border: 1px solid rgba(var(--theme-primary-rgb, 58, 124, 165), 0.28);
@@ -416,7 +417,7 @@
.workbench-content-grid {
display: grid;
grid-template-columns: minmax(360px, 0.95fr) minmax(560px, 1.4fr) minmax(320px, 0.82fr);
grid-template-columns: minmax(560px, 1.45fr) minmax(320px, 0.82fr);
gap: 14px;
align-items: stretch;
min-height: 0;
@@ -434,7 +435,6 @@
box-shadow: 0 1px 2px rgba(15, 23, 42, 0.035);
}
.todo-panel,
.progress-panel,
.side-panel {
display: grid;
@@ -493,7 +493,6 @@
color: var(--workbench-muted);
}
.todo-list,
.progress-list {
display: grid;
min-height: 0;
@@ -501,45 +500,11 @@
grid-auto-rows: minmax(0, 1fr);
}
.todo-row {
display: grid;
grid-template-columns: 34px minmax(0, 1fr) auto;
align-items: center;
gap: 9px;
width: 100%;
padding: 2px 0;
border-top: 1px solid var(--workbench-line-soft);
text-align: left;
}
.todo-row:first-child,
.progress-row:first-child {
padding-top: 2px;
border-top: 0;
}
.todo-row :deep(.workbench-list-icon) {
width: 28px;
height: 28px;
}
.todo-row :deep(.workbench-list-icon__panel) {
border-radius: 4px;
}
.todo-row :deep(.workbench-list-icon__art),
.todo-row :deep(.workbench-heroicon) {
width: 16px;
height: 16px;
}
.todo-copy {
min-width: 0;
display: grid;
gap: 2px;
}
.todo-copy strong,
.progress-identity strong,
.progress-result strong {
overflow: hidden;
@@ -551,8 +516,6 @@
white-space: nowrap;
}
.todo-copy small,
.todo-meta small,
.progress-identity small {
overflow: hidden;
color: var(--workbench-muted);
@@ -562,14 +525,6 @@
white-space: nowrap;
}
.todo-meta {
min-width: 96px;
display: grid;
justify-items: end;
gap: 2px;
}
.todo-status,
.progress-status {
display: inline-flex;
align-items: center;
@@ -582,33 +537,16 @@
white-space: nowrap;
}
.todo-status--warning,
.progress-status--warning {
background: var(--warning-soft);
color: var(--warning);
}
.todo-status--success,
.progress-status--success {
background: var(--workbench-primary-soft);
color: var(--workbench-primary-active);
}
.todo-status--danger {
background: var(--danger-soft);
color: var(--danger);
}
.todo-status--info {
background: var(--info-soft);
color: var(--info);
}
.todo-status--orange {
background: var(--warning-soft);
color: var(--warning);
}
.progress-status--muted {
background: var(--info-soft);
color: var(--workbench-muted);
@@ -708,7 +646,6 @@
}
.capability-card:hover,
.todo-row:hover,
.progress-row:hover,
.quick-prompts button:hover,
.composer-icon-button:hover {

View File

@@ -403,6 +403,11 @@
color: var(--theme-primary-active);
}
.notification-wrap {
position: relative;
display: inline-flex;
}
.notification-badge {
position: absolute;
top: 2px;
@@ -423,6 +428,179 @@
box-shadow: 0 5px 10px rgba(239, 68, 68, .22);
}
.notification-popover {
position: absolute;
top: calc(100% + 10px);
right: -8px;
z-index: 60;
width: min(360px, calc(100vw - 32px));
display: grid;
gap: 10px;
padding: 12px;
border: 1px solid #e5edf5;
border-radius: 4px;
background: rgba(255, 255, 255, 0.98);
box-shadow:
0 18px 42px rgba(15, 23, 42, 0.14),
inset 0 1px 0 rgba(255, 255, 255, 0.92);
}
.notification-popover::before {
content: "";
position: absolute;
top: -6px;
right: 18px;
width: 10px;
height: 10px;
border-top: 1px solid #e5edf5;
border-left: 1px solid #e5edf5;
background: #fff;
transform: rotate(45deg);
}
.notification-head,
.notification-tabs {
position: relative;
z-index: 1;
display: flex;
align-items: center;
}
.notification-head {
justify-content: space-between;
gap: 10px;
}
.notification-head strong {
color: #0f172a;
font-size: 14px;
font-weight: 850;
}
.notification-head button {
width: 26px;
height: 26px;
display: grid;
place-items: center;
border-radius: 4px;
color: #64748b;
}
.notification-head button:hover {
background: #f1f5f9;
color: #0f172a;
}
.notification-tabs {
gap: 6px;
padding: 3px;
border: 1px solid #edf2f7;
border-radius: 4px;
background: #f8fafc;
}
.notification-tabs button {
flex: 1 1 0;
height: 28px;
border-radius: 3px;
color: #64748b;
font-size: 12px;
font-weight: 800;
}
.notification-tabs button.active {
background: #fff;
color: var(--theme-primary-active);
box-shadow: 0 1px 3px rgba(15, 23, 42, 0.08);
}
.notification-list {
position: relative;
z-index: 1;
display: grid;
max-height: 320px;
overflow: auto;
}
.notification-row {
display: grid;
grid-template-columns: 8px minmax(0, 1fr) 16px;
align-items: center;
gap: 10px;
padding: 10px 4px;
border-top: 1px solid #edf2f7;
text-align: left;
}
.notification-row:first-child {
border-top: 0;
}
.notification-row:hover {
background: #f8fafc;
}
.notification-dot {
width: 7px;
height: 7px;
border-radius: 999px;
background: var(--theme-primary);
}
.notification-dot.danger { background: #ef4444; }
.notification-dot.warning { background: #f59e0b; }
.notification-dot.success { background: var(--success); }
.notification-dot.info { background: #3b82f6; }
.notification-copy {
min-width: 0;
display: grid;
gap: 2px;
}
.notification-copy strong,
.notification-copy small,
.notification-copy em {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.notification-copy strong {
color: #0f172a;
font-size: 13px;
font-weight: 850;
}
.notification-copy small {
color: #475569;
font-size: 12px;
}
.notification-copy em {
color: #94a3b8;
font-size: 11px;
font-style: normal;
}
.notification-row > .mdi {
color: #94a3b8;
font-size: 16px;
}
.notification-empty {
min-height: 112px;
display: grid;
place-items: center;
gap: 8px;
color: #94a3b8;
font-size: 13px;
}
.notification-empty .mdi {
font-size: 24px;
}
.company-switcher {
max-width: min(220px, 28vw);
height: 38px;
@@ -593,6 +771,61 @@
.title-group {
padding-right: 56px;
}
.topbar.detail-mode {
display: grid;
grid-template-columns: minmax(0, 1fr);
gap: 8px;
padding: 10px 14px;
}
.topbar.detail-mode .title-group {
min-width: 0;
padding-right: 50px;
}
.topbar.detail-mode .eyebrow {
display: none;
}
.topbar.detail-mode h1 {
font-size: 22px;
line-height: 1.12;
}
.topbar.detail-mode p {
max-width: 100%;
margin-top: 3px;
display: -webkit-box;
overflow: hidden;
-webkit-box-orient: vertical;
-webkit-line-clamp: 1;
font-size: 12px;
line-height: 1.35;
}
.topbar.detail-mode .top-actions,
.topbar.detail-mode .detail-topbar-actions {
width: 100%;
min-width: 0;
justify-content: flex-end;
}
.topbar.detail-mode .detail-alert-strip {
width: auto;
max-width: 100%;
min-width: 0;
justify-content: flex-end;
gap: 6px;
}
.topbar.detail-mode .detail-alert-pill {
min-height: 26px;
max-width: 100%;
padding: 0 9px;
border-radius: 4px;
font-size: 11px;
}
}
@media (max-width: 640px) {
@@ -676,3 +909,22 @@
grid-template-columns: 1fr;
}
}
@media (max-width: 420px) {
.topbar.detail-mode {
gap: 6px;
padding: 8px 12px;
}
.topbar.detail-mode h1 {
font-size: 20px;
}
.topbar.detail-mode p {
font-size: 11.5px;
}
.topbar.detail-mode .detail-alert-pill {
min-height: 24px;
}
}

View File

@@ -142,19 +142,16 @@
.trend-count-panel,
.donut-panel,
.rank-panel,
.employee-rank-panel,
.top-claim-panel,
.budget-metrics-panel,
.bottleneck-panel,
.budget-panel,
.model-panel,
.feedback-panel {
grid-column: span 3;
}
.bottleneck-panel,
.rank-panel,
.employee-rank-panel,
.top-claim-panel,
.budget-metrics-panel,
.bottleneck-panel,
.budget-panel {
grid-column: span 6;
}
@@ -188,6 +185,21 @@
width: 110px;
}
.card-range-chip {
display: inline-flex;
align-items: center;
justify-content: center;
min-height: 28px;
padding: 0 10px;
border: 1px solid rgba(var(--theme-primary-rgb, 58, 124, 165), .18);
border-radius: 4px;
background: rgba(var(--theme-primary-rgb, 58, 124, 165), .07);
color: var(--theme-primary-active);
font-size: 12px;
font-weight: 800;
white-space: nowrap;
}
.panel-note {
margin-top: 8px;
color: #64748b;
@@ -581,6 +593,42 @@
.top-claim-list {
display: grid;
gap: 10px;
align-content: start;
}
.top-claim-split {
flex: 1;
display: grid;
grid-template-columns: minmax(260px, .92fr) minmax(0, 1.08fr);
gap: 18px;
align-items: stretch;
min-height: 0;
}
.department-employee-mix {
min-width: 0;
padding-right: 18px;
border-right: 1px solid #f1f5f9;
}
.department-employee-mix :deep(.donut-chart) {
min-height: 100%;
}
.department-employee-mix :deep(.donut-body) {
height: 150px;
}
.department-employee-mix :deep(.donut-legend) {
grid-template-columns: 1fr;
gap: 7px;
}
.department-employee-mix :deep(.legend-name) {
min-width: 0;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.top-claim-row {
@@ -873,6 +921,17 @@
grid-template-columns: 24px 64px minmax(0, 1fr);
}
.top-claim-split {
grid-template-columns: 1fr;
}
.department-employee-mix {
padding-right: 0;
padding-bottom: 14px;
border-right: 0;
border-bottom: 1px solid #f1f5f9;
}
.budget-metric-grid {
grid-template-columns: 1fr;
}

View File

@@ -0,0 +1,69 @@
@media (max-width: 760px) {
.approval-page,
.approval-detail,
.detail-scroll,
.detail-hero,
.progress-card,
.detail-grid,
.detail-left,
.detail-card {
width: 100%;
min-width: 0;
max-width: 100%;
}
.detail-scroll {
padding-right: 0;
overflow-x: hidden;
}
.detail-scroll > * {
min-width: 0;
max-width: 100%;
}
.hero-banner-main,
.hero-fact-grid,
.applicant-card,
.detail-card-head {
min-width: 0;
max-width: 100%;
}
.progress-card,
.progress-block {
min-width: 0;
max-width: 100%;
}
.progress-line {
width: 100%;
min-width: 0;
max-width: 100%;
}
.detail-expense-table {
width: 100%;
min-width: 0;
max-width: 100%;
overflow-x: auto;
}
.detail-actions {
width: 100%;
min-width: 0;
max-width: 100%;
}
.approval-action-group {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(104px, 1fr));
gap: 8px;
}
.back-action,
.approval-action-group > button {
width: 100%;
min-width: 0;
}
}

View File

@@ -704,6 +704,7 @@
.ai-preview-secondary:disabled,
.ai-preview-primary:disabled,
.approve-action:disabled,
.secondary-action:disabled,
.return-action:disabled,
.ai-send-btn:disabled {
opacity: .45;

View File

@@ -1645,6 +1645,13 @@
color: #ef4444;
}
.secondary-action {
min-width: 98px;
border: 1px solid #bfdbfe;
background: #eff6ff;
color: #2563eb;
}
.return-action {
min-width: 98px;
border: 1px solid #fed7aa;