|
|
@@ -7,20 +7,44 @@
|
|
|
}"
|
|
|
v-loading="loading"
|
|
|
>
|
|
|
- <!-- 核心指标:在册总人数 ≠ 本月发放人数 -->
|
|
|
+ <!-- 风格 B:顶筛浮条(发放周期) -->
|
|
|
+ <section class="dashboard-filter-bar" aria-label="展板筛选">
|
|
|
+ <div class="dashboard-filter-bar__left">
|
|
|
+ <span class="dashboard-filter-bar__scope">{{ data?.batchInfo?.scope || '全区' }}</span>
|
|
|
+ <span class="dashboard-filter-bar__sep">·</span>
|
|
|
+ <span class="dashboard-filter-bar__tip">{{ roleTip }}</span>
|
|
|
+ </div>
|
|
|
+ <div class="dashboard-filter-bar__period">
|
|
|
+ <span class="dashboard-filter-bar__period-label">发放周期</span>
|
|
|
+ <el-date-picker
|
|
|
+ :model-value="userStore.currentMonth"
|
|
|
+ type="month"
|
|
|
+ value-format="YYYY-MM"
|
|
|
+ format="YYYY-MM"
|
|
|
+ size="small"
|
|
|
+ placeholder="选择月份"
|
|
|
+ :clearable="false"
|
|
|
+ class="dashboard-filter-bar__picker"
|
|
|
+ @update:model-value="onMonthChange"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </section>
|
|
|
+
|
|
|
+ <!-- 核心指标:多色 KPI(在册总人数 ≠ 本月发放人数) -->
|
|
|
<StatCards :items="statItems" />
|
|
|
+ <!-- 说明 tip 由全局 .dashboard-stat-note { display:none } 隐藏,勿删 -->
|
|
|
<p class="dashboard-stat-note">
|
|
|
<strong>在册总人数</strong>是当前角色范围内的人员档案底数(含暂停、死亡等仍在库人员),
|
|
|
<strong>不是</strong>本月实际发放人数。
|
|
|
本月发放人数与金额按当前发放周期的月补清单口径统计,见下方对照表。
|
|
|
</p>
|
|
|
|
|
|
- <!-- 5.1.1.1 近期告警滚动;点击跳转告警页 -->
|
|
|
+ <!-- 轻量告警条:浮层白卡 + 横向滚动 -->
|
|
|
<section class="alert-ticker" aria-label="近期告警">
|
|
|
<div class="alert-ticker__label">
|
|
|
<el-icon><Bell /></el-icon>
|
|
|
<span>近期告警</span>
|
|
|
- <em v-if="alertTickerItems.length">未关闭 {{ alertTickerItems.length }}</em>
|
|
|
+ <em v-if="alertTickerItems.length">{{ alertTickerItems.length }}</em>
|
|
|
</div>
|
|
|
<div class="alert-ticker__track-wrap" @mouseenter="tickerPaused = true" @mouseleave="tickerPaused = false">
|
|
|
<div
|
|
|
@@ -50,7 +74,7 @@
|
|
|
</el-button>
|
|
|
</section>
|
|
|
|
|
|
- <!-- 本批次发放概览 -->
|
|
|
+ <!-- 本批次发放概览(浮层白卡) -->
|
|
|
<section class="batch-overview">
|
|
|
<div class="batch-overview__head">
|
|
|
<div class="batch-overview__title">
|
|
|
@@ -61,30 +85,14 @@
|
|
|
<template v-if="isVillage || isTown">
|
|
|
统计范围
|
|
|
<em>{{ data?.batchInfo.scope || '-' }}</em>
|
|
|
- · {{ roleTip }}
|
|
|
</template>
|
|
|
<template v-else>
|
|
|
全区月批 {{ data?.batchInfo.batchNo || '-' }} · 统计范围
|
|
|
<em>{{ data?.batchInfo.scope || '-' }}</em>
|
|
|
- · {{ roleTip }}
|
|
|
</template>
|
|
|
</p>
|
|
|
</div>
|
|
|
</div>
|
|
|
- <div class="batch-overview__period">
|
|
|
- <span class="batch-overview__period-label">发放周期</span>
|
|
|
- <el-date-picker
|
|
|
- :model-value="userStore.currentMonth"
|
|
|
- type="month"
|
|
|
- value-format="YYYY-MM"
|
|
|
- format="YYYY-MM"
|
|
|
- size="small"
|
|
|
- placeholder="选择月份"
|
|
|
- :clearable="false"
|
|
|
- class="batch-overview__period-picker"
|
|
|
- @update:model-value="onMonthChange"
|
|
|
- />
|
|
|
- </div>
|
|
|
</div>
|
|
|
|
|
|
<div class="batch-overview__metrics">
|
|
|
@@ -134,14 +142,14 @@
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
<el-table-column prop="node" label="当前节点" width="150" show-overflow-tooltip />
|
|
|
- <el-table-column label="状态" width="80" align="center">
|
|
|
+ <el-table-column label="状态" width="80" align="center" fixed="right">
|
|
|
<template #default="{ row }">
|
|
|
<el-tag size="small" :type="(row as TodoItem).read ? 'info' : 'warning'" effect="plain">
|
|
|
{{ (row as TodoItem).read ? '已读' : '未读' }}
|
|
|
</el-tag>
|
|
|
</template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column label="操作" width="100" align="center">
|
|
|
+ <el-table-column label="操作" width="100" align="center" fixed="right">
|
|
|
<template #default="{ row }">
|
|
|
<el-button
|
|
|
v-if="canHandleTodo(row as TodoItem)"
|
|
|
@@ -168,23 +176,17 @@
|
|
|
<!-- 村 / 镇:发放表与状态饼图并排;待办已在上方单独一行 -->
|
|
|
<div v-if="isTownLevelBoard" class="village-workspace">
|
|
|
<div class="village-workspace__main" :class="{ 'has-pie': sidePieItems.length > 0 }">
|
|
|
- <PieMixPanel
|
|
|
- v-if="sidePieItems.length > 0"
|
|
|
- class="village-workspace__pie"
|
|
|
- :title="sidePieTitle"
|
|
|
- :items="sidePieItems"
|
|
|
- />
|
|
|
-
|
|
|
- <PagePanel :title="payTableTitle" class="village-workspace__table-panel village-workspace__pay">
|
|
|
+ <!-- 左右同为 PagePanel 根节点,标题行结构一致、顶边对齐 -->
|
|
|
+ <PagePanel :title="payTableTitle" class="village-workspace__pay village-workspace__table-panel">
|
|
|
<el-table
|
|
|
v-loading="payTableLoading"
|
|
|
:data="payTableRows"
|
|
|
border
|
|
|
stripe
|
|
|
size="small"
|
|
|
- max-height="300"
|
|
|
+ max-height="280"
|
|
|
>
|
|
|
- <el-table-column prop="name" :label="payTableNameLabel" min-width="110" />
|
|
|
+ <el-table-column prop="name" :label="payTableNameLabel" min-width="110" show-overflow-tooltip />
|
|
|
<el-table-column label="发放人数" width="100" align="right">
|
|
|
<template #default="{ row }">{{ formatHeadcount(row.people) }}</template>
|
|
|
</el-table-column>
|
|
|
@@ -193,6 +195,13 @@
|
|
|
</el-table-column>
|
|
|
</el-table>
|
|
|
</PagePanel>
|
|
|
+ <PagePanel
|
|
|
+ v-if="sidePieItems.length > 0"
|
|
|
+ :title="sidePieTitle"
|
|
|
+ class="village-workspace__pie"
|
|
|
+ >
|
|
|
+ <PieMixPanel :items="sidePieItems" />
|
|
|
+ </PagePanel>
|
|
|
</div>
|
|
|
|
|
|
<div class="village-workspace__trend">
|
|
|
@@ -413,9 +422,9 @@ let refreshTimer: ReturnType<typeof setInterval> | null = null
|
|
|
const DASHBOARD_REFRESH_MS = 120_000
|
|
|
|
|
|
/** 图表主色:政务蓝行政台 */
|
|
|
-const CHART_COLOR = '#2B73F8'
|
|
|
-const CHART_COLORS = ['#2B73F8', '#27C98E', '#FA8C16', '#722ED1', '#1890FF']
|
|
|
-const CHART_COLOR_GREEN = '#27C98E'
|
|
|
+const CHART_COLOR = '#2f54eb'
|
|
|
+const CHART_COLORS = ['#2f54eb', '#13c2c2', '#faad14', '#722ed1', '#52c41a']
|
|
|
+const CHART_COLOR_GREEN = '#23B7A4'
|
|
|
|
|
|
const userStore = useUserStore()
|
|
|
/** shallowRef:整包替换工作台数据,避免深层响应拖慢图表重算 */
|
|
|
@@ -537,25 +546,25 @@ const REGISTERED_COUNT_TIP =
|
|
|
const MONTH_PAY_COUNT_TIP = '当前发放周期纳入月补清单的人数,与在册总人数口径不同。'
|
|
|
const MONTH_AMOUNT_TIP = '当前发放周期月补清单应发合计。'
|
|
|
|
|
|
-/** 核心指标:在册总人数与本月发放人数分列,避免混用 */
|
|
|
+/** 核心指标:在册总人数与本月发放人数分列;色调对齐风格 B 多色 KPI */
|
|
|
const statItems = computed(() => {
|
|
|
const s = data.value?.stats
|
|
|
const payPeople = data.value?.batchInfo?.peopleCount
|
|
|
if (!s) {
|
|
|
return [
|
|
|
- { label: '在册总人数', value: '-', unit: '人', tip: REGISTERED_COUNT_TIP },
|
|
|
- { label: '本月发放人数', value: '-', unit: '人', tip: MONTH_PAY_COUNT_TIP },
|
|
|
- { label: '本月新增', value: '-', unit: '人', tip: '本月新纳入在册的人数。' },
|
|
|
- { label: '本月减少', value: '-', unit: '人', tip: '本月因暂停/停止/死亡等退出发放的人数。' },
|
|
|
- { label: '本月发放金额', value: '-', unit: '元', tip: MONTH_AMOUNT_TIP },
|
|
|
+ { label: '在册总人数', value: '-', unit: '人', tip: REGISTERED_COUNT_TIP, tone: 'blue' as const },
|
|
|
+ { label: '本月发放人数', value: '-', unit: '人', tip: MONTH_PAY_COUNT_TIP, tone: 'green' as const },
|
|
|
+ { label: '本月新增', value: '-', unit: '人', tip: '本月新纳入在册的人数。', tone: 'purple' as const },
|
|
|
+ { label: '本月减少', value: '-', unit: '人', tip: '本月因暂停/停止/死亡等退出发放的人数。', tone: 'orange' as const },
|
|
|
+ { label: '本月发放金额', value: '-', unit: '元', tip: MONTH_AMOUNT_TIP, tone: 'cyan' as const },
|
|
|
]
|
|
|
}
|
|
|
return [
|
|
|
- { label: '在册总人数', value: s.normal, unit: '人', tip: REGISTERED_COUNT_TIP },
|
|
|
- { label: '本月发放人数', value: payPeople ?? 0, unit: '人', tip: MONTH_PAY_COUNT_TIP },
|
|
|
- { label: '本月新增', value: s.monthIncrease ?? 0, unit: '人', tip: '本月新纳入在册的人数。' },
|
|
|
- { label: '本月减少', value: s.monthDecrease ?? 0, unit: '人', tip: '本月因暂停/停止/死亡等退出发放的人数。' },
|
|
|
- { label: '本月发放金额', value: formatAmount(s.amount), unit: '元', tip: MONTH_AMOUNT_TIP },
|
|
|
+ { label: '在册总人数', value: s.normal, unit: '人', tip: REGISTERED_COUNT_TIP, tone: 'blue' as const },
|
|
|
+ { label: '本月发放人数', value: payPeople ?? 0, unit: '人', tip: MONTH_PAY_COUNT_TIP, tone: 'green' as const },
|
|
|
+ { label: '本月新增', value: s.monthIncrease ?? 0, unit: '人', tip: '本月新纳入在册的人数。', tone: 'purple' as const },
|
|
|
+ { label: '本月减少', value: s.monthDecrease ?? 0, unit: '人', tip: '本月因暂停/停止/死亡等退出发放的人数。', tone: 'orange' as const },
|
|
|
+ { label: '本月发放金额', value: formatAmount(s.amount), unit: '元', tip: MONTH_AMOUNT_TIP, tone: 'cyan' as const },
|
|
|
]
|
|
|
})
|
|
|
|
|
|
@@ -600,14 +609,14 @@ const batchMetrics = computed(() => {
|
|
|
value: s?.monthDecrease ?? 0,
|
|
|
unit: '人',
|
|
|
icon: 'Bell',
|
|
|
- tone: 'tone-gold',
|
|
|
+ tone: 'tone-primary',
|
|
|
},
|
|
|
{
|
|
|
label: '预计发放',
|
|
|
value: s ? formatAmount(s.amount) : info ? formatAmount(info.amount) : '-',
|
|
|
unit: '元',
|
|
|
icon: 'Wallet',
|
|
|
- tone: 'tone-gold',
|
|
|
+ tone: 'tone-primary',
|
|
|
},
|
|
|
]
|
|
|
}
|
|
|
@@ -618,7 +627,7 @@ const batchMetrics = computed(() => {
|
|
|
label: '发放月份',
|
|
|
value: userStore.currentMonth || '-',
|
|
|
icon: 'Calendar',
|
|
|
- tone: 'tone-gold',
|
|
|
+ tone: 'tone-primary',
|
|
|
},
|
|
|
{
|
|
|
label: '待资格审批',
|
|
|
@@ -639,7 +648,7 @@ const batchMetrics = computed(() => {
|
|
|
value: review?.withoutLandCount ?? 0,
|
|
|
unit: '人',
|
|
|
icon: 'Wallet',
|
|
|
- tone: 'tone-gold',
|
|
|
+ tone: 'tone-primary',
|
|
|
},
|
|
|
]
|
|
|
}
|
|
|
@@ -665,14 +674,14 @@ const batchMetrics = computed(() => {
|
|
|
value: sw?.diskPendingCount ?? 0,
|
|
|
unit: '批',
|
|
|
icon: 'Ticket',
|
|
|
- tone: 'tone-gold',
|
|
|
+ tone: 'tone-primary',
|
|
|
},
|
|
|
{
|
|
|
label: '未关闭告警',
|
|
|
value: sw?.alertCount ?? 0,
|
|
|
unit: '条',
|
|
|
icon: 'Bell',
|
|
|
- tone: 'tone-gold',
|
|
|
+ tone: 'tone-primary',
|
|
|
},
|
|
|
]
|
|
|
}
|
|
|
@@ -698,14 +707,14 @@ const batchMetrics = computed(() => {
|
|
|
value: lw?.issueReadyCount ?? 0,
|
|
|
unit: '批',
|
|
|
icon: 'Ticket',
|
|
|
- tone: 'tone-gold',
|
|
|
+ tone: 'tone-primary',
|
|
|
},
|
|
|
{
|
|
|
label: '未关闭告警',
|
|
|
value: lw?.alertCount ?? 0,
|
|
|
unit: '条',
|
|
|
icon: 'Bell',
|
|
|
- tone: 'tone-gold',
|
|
|
+ tone: 'tone-primary',
|
|
|
},
|
|
|
]
|
|
|
}
|
|
|
@@ -716,7 +725,7 @@ const batchMetrics = computed(() => {
|
|
|
label: '全区月批',
|
|
|
value: info?.batchNo ?? '-',
|
|
|
icon: 'Ticket',
|
|
|
- tone: 'tone-gold',
|
|
|
+ tone: 'tone-primary',
|
|
|
},
|
|
|
{
|
|
|
label: '覆盖街镇/村',
|
|
|
@@ -736,7 +745,7 @@ const batchMetrics = computed(() => {
|
|
|
value: d?.withoutLandCount ?? 0,
|
|
|
unit: '人',
|
|
|
icon: 'Checked',
|
|
|
- tone: 'tone-gold',
|
|
|
+ tone: 'tone-primary',
|
|
|
},
|
|
|
]
|
|
|
}
|
|
|
@@ -747,7 +756,7 @@ const batchMetrics = computed(() => {
|
|
|
label: '全区月批',
|
|
|
value: info?.batchNo ?? '-',
|
|
|
icon: 'Ticket',
|
|
|
- tone: 'tone-gold',
|
|
|
+ tone: 'tone-primary',
|
|
|
},
|
|
|
{
|
|
|
label: '覆盖街镇/村',
|
|
|
@@ -767,7 +776,7 @@ const batchMetrics = computed(() => {
|
|
|
value: d ? formatAmount(d.amount) : '-',
|
|
|
unit: '元',
|
|
|
icon: 'Wallet',
|
|
|
- tone: 'tone-gold',
|
|
|
+ tone: 'tone-primary',
|
|
|
},
|
|
|
]
|
|
|
}
|
|
|
@@ -776,7 +785,7 @@ const batchMetrics = computed(() => {
|
|
|
label: '全区月批',
|
|
|
value: info?.batchNo ?? '-',
|
|
|
icon: 'Ticket',
|
|
|
- tone: 'tone-gold',
|
|
|
+ tone: 'tone-primary',
|
|
|
},
|
|
|
{
|
|
|
label: '统计范围',
|
|
|
@@ -796,7 +805,7 @@ const batchMetrics = computed(() => {
|
|
|
value: info ? formatAmount(info.amount) : '-',
|
|
|
unit: '元',
|
|
|
icon: 'Wallet',
|
|
|
- tone: 'tone-gold',
|
|
|
+ tone: 'tone-primary',
|
|
|
},
|
|
|
]
|
|
|
})
|
|
|
@@ -808,7 +817,7 @@ function buildBarOption(
|
|
|
valueFormatter?: (v: unknown) => string,
|
|
|
barColorStops = [
|
|
|
{ offset: 0, color: '#4A8AFF' },
|
|
|
- { offset: 1, color: '#2B73F8' },
|
|
|
+ { offset: 1, color: '#2f54eb' },
|
|
|
],
|
|
|
): EChartsCoreOption {
|
|
|
const names = list.map((i) => i.name)
|
|
|
@@ -847,7 +856,7 @@ function buildBarOption(
|
|
|
xAxis: {
|
|
|
type: 'category',
|
|
|
data: names,
|
|
|
- axisLine: { lineStyle: { color: '#e0d6c8' } },
|
|
|
+ axisLine: { lineStyle: { color: '#e8eef5' } },
|
|
|
axisLabel: {
|
|
|
color: '#8c8c8c',
|
|
|
fontSize: many ? 10 : 12,
|
|
|
@@ -862,7 +871,7 @@ function buildBarOption(
|
|
|
name: yName,
|
|
|
nameTextStyle: { color: '#8c8c8c', fontSize: 11 },
|
|
|
axisLabel: { color: '#8c8c8c', fontSize: 11 },
|
|
|
- splitLine: { lineStyle: { color: '#f0ebe3', type: 'dashed' } },
|
|
|
+ splitLine: { lineStyle: { color: '#e8eef5', type: 'dashed' } },
|
|
|
axisLine: { show: false },
|
|
|
minInterval: yName.includes('人') ? 1 : undefined,
|
|
|
},
|
|
|
@@ -912,7 +921,7 @@ function mergePayRows(people: ChartBarItem[] = [], amounts: ChartBarItem[] = [])
|
|
|
|
|
|
function buildPayCombineOption(list: Array<{ name: string; people: number; amount: number }>): EChartsCoreOption {
|
|
|
return {
|
|
|
- color: [CHART_COLOR, '#1A56C4'],
|
|
|
+ color: [CHART_COLOR, '#225DCB'],
|
|
|
tooltip: {
|
|
|
trigger: 'axis',
|
|
|
backgroundColor: 'rgba(255,255,255,0.96)',
|
|
|
@@ -933,7 +942,7 @@ function buildPayCombineOption(list: Array<{ name: string; people: number; amoun
|
|
|
xAxis: {
|
|
|
type: 'category',
|
|
|
data: list.map((i) => i.name),
|
|
|
- axisLine: { lineStyle: { color: '#e0d6c8' } },
|
|
|
+ axisLine: { lineStyle: { color: '#e8eef5' } },
|
|
|
axisLabel: { color: '#8c8c8c', fontSize: 11 },
|
|
|
axisTick: { show: false },
|
|
|
},
|
|
|
@@ -948,7 +957,7 @@ function buildPayCombineOption(list: Array<{ name: string; people: number; amoun
|
|
|
fontSize: 11,
|
|
|
formatter: (v: number) => (Math.abs(v) >= 10000 ? `${v / 10000}万` : String(v)),
|
|
|
},
|
|
|
- splitLine: { lineStyle: { color: '#f0ebe3', type: 'dashed' } },
|
|
|
+ splitLine: { lineStyle: { color: '#e8eef5', type: 'dashed' } },
|
|
|
axisLine: { show: false },
|
|
|
},
|
|
|
{
|
|
|
@@ -976,7 +985,7 @@ function buildPayCombineOption(list: Array<{ name: string; people: number; amoun
|
|
|
y2: 1,
|
|
|
colorStops: [
|
|
|
{ offset: 0, color: '#4A8AFF' },
|
|
|
- { offset: 1, color: '#2B73F8' },
|
|
|
+ { offset: 1, color: '#2f54eb' },
|
|
|
],
|
|
|
},
|
|
|
},
|
|
|
@@ -1050,7 +1059,7 @@ const roleBarOption = computed(() =>
|
|
|
const batchCompareOption = computed<EChartsCoreOption>(() => {
|
|
|
const list = data.value?.batchCompareChart ?? []
|
|
|
return {
|
|
|
- color: [CHART_COLOR, '#1A56C4'],
|
|
|
+ color: [CHART_COLOR, '#225DCB'],
|
|
|
tooltip: {
|
|
|
trigger: 'axis',
|
|
|
backgroundColor: 'rgba(255,255,255,0.96)',
|
|
|
@@ -1071,7 +1080,7 @@ const batchCompareOption = computed<EChartsCoreOption>(() => {
|
|
|
xAxis: {
|
|
|
type: 'category',
|
|
|
data: list.map((i) => i.name),
|
|
|
- axisLine: { lineStyle: { color: '#e0d6c8' } },
|
|
|
+ axisLine: { lineStyle: { color: '#e8eef5' } },
|
|
|
axisLabel: { color: '#8c8c8c', fontSize: 12 },
|
|
|
axisTick: { show: false },
|
|
|
},
|
|
|
@@ -1086,7 +1095,7 @@ const batchCompareOption = computed<EChartsCoreOption>(() => {
|
|
|
fontSize: 11,
|
|
|
formatter: (v: number) => (Math.abs(v) >= 10000 ? `${v / 10000}万` : String(v)),
|
|
|
},
|
|
|
- splitLine: { lineStyle: { color: '#f0ebe3', type: 'dashed' } },
|
|
|
+ splitLine: { lineStyle: { color: '#e8eef5', type: 'dashed' } },
|
|
|
axisLine: { show: false },
|
|
|
},
|
|
|
{
|
|
|
@@ -1114,7 +1123,7 @@ const batchCompareOption = computed<EChartsCoreOption>(() => {
|
|
|
y2: 1,
|
|
|
colorStops: [
|
|
|
{ offset: 0, color: '#4A8AFF' },
|
|
|
- { offset: 1, color: '#2B73F8' },
|
|
|
+ { offset: 1, color: '#2f54eb' },
|
|
|
],
|
|
|
},
|
|
|
},
|
|
|
@@ -1184,7 +1193,7 @@ function buildPieOption(
|
|
|
itemStyle: { borderColor: '#fff', borderWidth: 2 },
|
|
|
emphasis: {
|
|
|
scaleSize: 4,
|
|
|
- itemStyle: { shadowBlur: 8, shadowColor: 'rgba(43,115,248,0.35)' },
|
|
|
+ itemStyle: { shadowBlur: 8, shadowColor: 'rgba(34,93,203,0.35)' },
|
|
|
},
|
|
|
},
|
|
|
],
|
|
|
@@ -1232,7 +1241,7 @@ const districtWithoutLandOption = computed(() =>
|
|
|
(v) => `${Number(v).toLocaleString('zh-CN')} 人`,
|
|
|
[
|
|
|
{ offset: 0, color: '#4A8AFF' },
|
|
|
- { offset: 1, color: '#2B73F8' },
|
|
|
+ { offset: 1, color: '#2f54eb' },
|
|
|
],
|
|
|
),
|
|
|
)
|
|
|
@@ -1387,23 +1396,105 @@ watch(
|
|
|
.dashboard-view {
|
|
|
display: flex;
|
|
|
flex-direction: column;
|
|
|
+ gap: 14px;
|
|
|
+}
|
|
|
+
|
|
|
+/* 风格 B:顶筛条(白壳内轻边框) */
|
|
|
+.dashboard-filter-bar {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: space-between;
|
|
|
gap: 12px;
|
|
|
+ min-height: 48px;
|
|
|
+ padding: 8px 16px;
|
|
|
+ background: #fafafa;
|
|
|
+ border: 1px solid @border-light;
|
|
|
+ border-radius: 8px;
|
|
|
+ box-shadow: none;
|
|
|
+
|
|
|
+ &__left {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ gap: 6px;
|
|
|
+ min-width: 0;
|
|
|
+ font-size: 13px;
|
|
|
+ color: #595959;
|
|
|
+ }
|
|
|
+
|
|
|
+ &__scope {
|
|
|
+ font-weight: 700;
|
|
|
+ color: #262626;
|
|
|
+ }
|
|
|
+
|
|
|
+ &__sep {
|
|
|
+ color: #bfbfbf;
|
|
|
+ }
|
|
|
+
|
|
|
+ &__tip {
|
|
|
+ overflow: hidden;
|
|
|
+ text-overflow: ellipsis;
|
|
|
+ white-space: nowrap;
|
|
|
+ }
|
|
|
+
|
|
|
+ &__period {
|
|
|
+ flex-shrink: 0;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ gap: 8px;
|
|
|
+ padding: 2px 6px 2px 12px;
|
|
|
+ background: #f5f7ff;
|
|
|
+ border: 1px solid rgba(47, 84, 235, 0.16);
|
|
|
+ border-radius: 8px;
|
|
|
+ }
|
|
|
+
|
|
|
+ &__period-label {
|
|
|
+ font-size: 12px;
|
|
|
+ color: #595959;
|
|
|
+ white-space: nowrap;
|
|
|
+ }
|
|
|
+
|
|
|
+ &__picker {
|
|
|
+ width: 124px;
|
|
|
+
|
|
|
+ :deep(.el-input__wrapper) {
|
|
|
+ min-height: 32px !important;
|
|
|
+ height: 32px !important;
|
|
|
+ background: #fff;
|
|
|
+ box-shadow: none;
|
|
|
+ border: 1px solid @border-color;
|
|
|
+ }
|
|
|
+
|
|
|
+ :deep(.el-input__inner) {
|
|
|
+ font-size: 12px;
|
|
|
+ font-weight: 600;
|
|
|
+ color: #262626;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
.dashboard-todos-panel__count {
|
|
|
font-size: 12px;
|
|
|
- color: #8a7a66;
|
|
|
+ color: #8a9099;
|
|
|
}
|
|
|
|
|
|
.dashboard-todos-table {
|
|
|
cursor: pointer;
|
|
|
|
|
|
+ :deep(th.el-table__cell),
|
|
|
+ :deep(td.el-table__cell) {
|
|
|
+ text-align: left;
|
|
|
+ }
|
|
|
+
|
|
|
+ :deep(.el-table__cell .cell) {
|
|
|
+ text-align: left;
|
|
|
+ }
|
|
|
+
|
|
|
:deep(.is-todo-read) {
|
|
|
- color: #9a8b7a;
|
|
|
+ color: #8a9099;
|
|
|
}
|
|
|
|
|
|
.text-muted {
|
|
|
- color: #b5a898;
|
|
|
+ color: #c0c4cc;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -1411,11 +1502,13 @@ watch(
|
|
|
display: flex;
|
|
|
align-items: center;
|
|
|
gap: 10px;
|
|
|
- min-height: 40px;
|
|
|
- padding: 6px 10px;
|
|
|
- background: #fff8ef;
|
|
|
+ min-height: 44px;
|
|
|
+ padding: 8px 16px;
|
|
|
+ margin-bottom: 0;
|
|
|
+ background: #fff;
|
|
|
border: 1px solid @border-light;
|
|
|
- border-left: 3px solid #2B73F8;
|
|
|
+ border-radius: 8px;
|
|
|
+ box-shadow: none;
|
|
|
|
|
|
&__label {
|
|
|
display: inline-flex;
|
|
|
@@ -1424,7 +1517,7 @@ watch(
|
|
|
flex-shrink: 0;
|
|
|
font-size: 13px;
|
|
|
font-weight: 600;
|
|
|
- color: @primary-dark;
|
|
|
+ color: #262626;
|
|
|
|
|
|
em {
|
|
|
font-style: normal;
|
|
|
@@ -1432,7 +1525,7 @@ watch(
|
|
|
height: 18px;
|
|
|
padding: 0 5px;
|
|
|
border-radius: 9px;
|
|
|
- background: #c45c26;
|
|
|
+ background: #ff7875;
|
|
|
color: #fff;
|
|
|
font-size: 11px;
|
|
|
line-height: 18px;
|
|
|
@@ -1479,7 +1572,7 @@ watch(
|
|
|
|
|
|
&__type {
|
|
|
font-size: 12px;
|
|
|
- color: #8a7350;
|
|
|
+ color: #8a9099;
|
|
|
}
|
|
|
|
|
|
&__text {
|
|
|
@@ -1530,12 +1623,12 @@ watch(
|
|
|
min-height: 0;
|
|
|
display: flex;
|
|
|
flex-direction: column;
|
|
|
- gap: 12px;
|
|
|
+ gap: 14px;
|
|
|
|
|
|
&__charts {
|
|
|
display: grid;
|
|
|
grid-template-columns: repeat(3, minmax(0, 1fr));
|
|
|
- gap: 12px;
|
|
|
+ gap: 14px;
|
|
|
|
|
|
@media (max-width: 1200px) {
|
|
|
grid-template-columns: repeat(2, minmax(0, 1fr));
|
|
|
@@ -1575,7 +1668,7 @@ watch(
|
|
|
}
|
|
|
|
|
|
:deep(.el-table__header th.el-table__cell) {
|
|
|
- background: #f5f2eb;
|
|
|
+ background: #fafafa;
|
|
|
color: @text-regular;
|
|
|
font-weight: 600;
|
|
|
}
|
|
|
@@ -1586,21 +1679,22 @@ watch(
|
|
|
}
|
|
|
|
|
|
:deep(.el-table__row:hover > td.el-table__cell) {
|
|
|
- background: #faf6ee !important;
|
|
|
+ background: #f0f7ff !important;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
.village-workspace {
|
|
|
display: flex;
|
|
|
flex-direction: column;
|
|
|
- gap: 12px;
|
|
|
+ gap: 14px;
|
|
|
|
|
|
&__main {
|
|
|
display: grid;
|
|
|
grid-template-columns: minmax(0, 1fr);
|
|
|
grid-template-areas: 'pay';
|
|
|
- gap: 12px;
|
|
|
- align-items: start;
|
|
|
+ gap: 14px;
|
|
|
+ /* 右侧跟左侧同高(拉高右侧),不改左侧宽度 */
|
|
|
+ align-items: stretch;
|
|
|
|
|
|
&.has-pie {
|
|
|
grid-template-columns: minmax(0, 1.55fr) minmax(300px, 0.9fr);
|
|
|
@@ -1610,6 +1704,7 @@ watch(
|
|
|
@media (max-width: 1100px) {
|
|
|
grid-template-columns: 1fr;
|
|
|
grid-template-areas: 'pay';
|
|
|
+ align-items: start;
|
|
|
|
|
|
&.has-pie {
|
|
|
grid-template-areas:
|
|
|
@@ -1618,26 +1713,30 @@ watch(
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- :deep(.content-panel) {
|
|
|
+ > .content-panel {
|
|
|
margin-bottom: 0;
|
|
|
min-height: 0;
|
|
|
- overflow: visible;
|
|
|
+ height: 100%;
|
|
|
display: flex;
|
|
|
flex-direction: column;
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
- :deep(.page-panel__title),
|
|
|
- :deep(.block-title) {
|
|
|
- flex-shrink: 0;
|
|
|
- }
|
|
|
+ &__pay {
|
|
|
+ grid-area: pay;
|
|
|
+ min-width: 0;
|
|
|
}
|
|
|
|
|
|
&__pie {
|
|
|
grid-area: pie;
|
|
|
- }
|
|
|
+ min-width: 0;
|
|
|
|
|
|
- &__pay {
|
|
|
- grid-area: pay;
|
|
|
+ /* 标题下内容区吃满剩余高度,供饼图垂直居中 */
|
|
|
+ :deep(.pie-mix),
|
|
|
+ :deep(.pie-mix__empty) {
|
|
|
+ flex: 1;
|
|
|
+ min-height: 0;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
&__table-panel {
|
|
|
@@ -1646,10 +1745,26 @@ watch(
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ &__pay,
|
|
|
+ &__pie {
|
|
|
+ :deep(.page-panel__title),
|
|
|
+ :deep(.block-title) {
|
|
|
+ flex-shrink: 0;
|
|
|
+ margin-bottom: 12px;
|
|
|
+ min-height: 36px;
|
|
|
+ }
|
|
|
+
|
|
|
+ :deep(.page-panel__text) {
|
|
|
+ overflow: hidden;
|
|
|
+ text-overflow: ellipsis;
|
|
|
+ white-space: nowrap;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
&__trend {
|
|
|
display: grid;
|
|
|
grid-template-columns: repeat(2, minmax(0, 1fr));
|
|
|
- gap: 12px;
|
|
|
+ gap: 14px;
|
|
|
|
|
|
@media (max-width: 1100px) {
|
|
|
grid-template-columns: 1fr;
|
|
|
@@ -1666,18 +1781,23 @@ watch(
|
|
|
}
|
|
|
|
|
|
.batch-overview {
|
|
|
- background: @block-bg;
|
|
|
+ background: #fff;
|
|
|
border: 1px solid @border-light;
|
|
|
+ border-radius: 8px;
|
|
|
+ box-shadow: none;
|
|
|
overflow: hidden;
|
|
|
+ margin-bottom: 0;
|
|
|
|
|
|
&__head {
|
|
|
display: flex;
|
|
|
align-items: center;
|
|
|
justify-content: space-between;
|
|
|
gap: 12px;
|
|
|
+ box-sizing: border-box;
|
|
|
+ min-height: 56px;
|
|
|
padding: 12px 16px;
|
|
|
- background: linear-gradient(90deg, #eef4ff 0%, #f7f9fc 55%, #fff 100%);
|
|
|
- border-bottom: 1px solid #d6e4ff;
|
|
|
+ background: #fff;
|
|
|
+ border-bottom: 1px solid @border-light;
|
|
|
}
|
|
|
|
|
|
&__title {
|
|
|
@@ -1688,67 +1808,28 @@ watch(
|
|
|
|
|
|
h3 {
|
|
|
margin: 0;
|
|
|
- font-size: 15px;
|
|
|
+ font-size: 16px;
|
|
|
font-weight: 700;
|
|
|
- color: @text-primary;
|
|
|
+ color: #262626;
|
|
|
line-height: 1.3;
|
|
|
}
|
|
|
|
|
|
p {
|
|
|
margin: 4px 0 0;
|
|
|
font-size: 12px;
|
|
|
- color: @text-secondary;
|
|
|
+ color: #8c8c8c;
|
|
|
line-height: 1.4;
|
|
|
|
|
|
em {
|
|
|
font-style: normal;
|
|
|
font-weight: 600;
|
|
|
- color: @primary-dark;
|
|
|
+ color: #262626;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
&__bar {
|
|
|
- flex-shrink: 0;
|
|
|
- width: 3px;
|
|
|
- height: 28px;
|
|
|
- margin-top: 2px;
|
|
|
- background: linear-gradient(180deg, @brand-gold-deep, @primary-color);
|
|
|
- border-radius: 1px;
|
|
|
- }
|
|
|
-
|
|
|
- &__period {
|
|
|
- flex-shrink: 0;
|
|
|
- display: flex;
|
|
|
- align-items: center;
|
|
|
- gap: 8px;
|
|
|
- padding: 2px 6px 2px 10px;
|
|
|
- font-size: 12px;
|
|
|
- color: @primary-dark;
|
|
|
- background: rgba(43, 115, 248, 0.12);
|
|
|
- border: 1px solid rgba(43, 115, 248, 0.35);
|
|
|
- border-radius: @radius-sm;
|
|
|
- }
|
|
|
-
|
|
|
- &__period-label {
|
|
|
- flex-shrink: 0;
|
|
|
- white-space: nowrap;
|
|
|
- }
|
|
|
-
|
|
|
- &__period-picker {
|
|
|
- width: 120px;
|
|
|
-
|
|
|
- :deep(.el-input__wrapper) {
|
|
|
- background: #fff;
|
|
|
- box-shadow: none;
|
|
|
- border: 1px solid rgba(43, 115, 248, 0.45);
|
|
|
- }
|
|
|
-
|
|
|
- :deep(.el-input__inner) {
|
|
|
- font-size: 12px;
|
|
|
- color: @primary-dark;
|
|
|
- font-weight: 600;
|
|
|
- }
|
|
|
+ display: none;
|
|
|
}
|
|
|
|
|
|
&__metrics {
|
|
|
@@ -1788,7 +1869,7 @@ watch(
|
|
|
}
|
|
|
|
|
|
&:hover {
|
|
|
- background: @el-primary-light-9;
|
|
|
+ background: #fafafa;
|
|
|
}
|
|
|
|
|
|
&__icon {
|
|
|
@@ -1800,8 +1881,8 @@ watch(
|
|
|
justify-content: center;
|
|
|
border-radius: @radius-sm;
|
|
|
font-size: 18px;
|
|
|
- background: @el-primary-light-9;
|
|
|
- color: @primary-color;
|
|
|
+ background: #f5f5f5;
|
|
|
+ color: #595959;
|
|
|
}
|
|
|
|
|
|
&__body {
|
|
|
@@ -1810,7 +1891,7 @@ watch(
|
|
|
|
|
|
&__label {
|
|
|
font-size: 12px;
|
|
|
- color: @text-secondary;
|
|
|
+ color: #8c8c8c;
|
|
|
margin-bottom: 4px;
|
|
|
white-space: nowrap;
|
|
|
}
|
|
|
@@ -1818,7 +1899,7 @@ watch(
|
|
|
&__value {
|
|
|
font-size: 18px;
|
|
|
font-weight: 700;
|
|
|
- color: @text-primary;
|
|
|
+ color: #262626;
|
|
|
line-height: 1.2;
|
|
|
word-break: break-all;
|
|
|
|
|
|
@@ -1827,13 +1908,13 @@ watch(
|
|
|
font-size: 12px;
|
|
|
font-style: normal;
|
|
|
font-weight: 400;
|
|
|
- color: @text-secondary;
|
|
|
+ color: #8c8c8c;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- &.tone-gold .metric-item__icon {
|
|
|
- background: #e8f1ff;
|
|
|
- color: @primary-dark;
|
|
|
+ &.tone-primary .metric-item__icon {
|
|
|
+ background: @el-primary-light-9;
|
|
|
+ color: @primary-color;
|
|
|
}
|
|
|
|
|
|
&.tone-green .metric-item__icon {
|
|
|
@@ -1852,8 +1933,8 @@ watch(
|
|
|
}
|
|
|
|
|
|
&.tone-plain .metric-item__icon {
|
|
|
- background: #f3f3f3;
|
|
|
- color: @text-regular;
|
|
|
+ background: #f5f5f5;
|
|
|
+ color: #595959;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -1861,7 +1942,7 @@ watch(
|
|
|
.dashboard-view__tables {
|
|
|
display: grid;
|
|
|
grid-template-columns: repeat(2, 1fr);
|
|
|
- gap: 12px;
|
|
|
+ gap: 14px;
|
|
|
|
|
|
@media (max-width: 1100px) {
|
|
|
grid-template-columns: 1fr;
|
|
|
@@ -1870,6 +1951,28 @@ watch(
|
|
|
:deep(.content-panel) {
|
|
|
margin-bottom: 0;
|
|
|
height: 100%;
|
|
|
+ border: 1px solid @border-light;
|
|
|
+ border-radius: 8px;
|
|
|
+ box-shadow: none;
|
|
|
+ background: #fff;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/* 展板内嵌套 PagePanel:白壳内轻边框卡 */
|
|
|
+.village-workspace,
|
|
|
+.district-workspace {
|
|
|
+ :deep(.content-panel) {
|
|
|
+ border: 1px solid @border-light;
|
|
|
+ border-radius: 8px;
|
|
|
+ box-shadow: none;
|
|
|
+ background: #fff;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+.dashboard-todos-panel {
|
|
|
+ border: 1px solid @border-light !important;
|
|
|
+ border-radius: 8px !important;
|
|
|
+ box-shadow: none !important;
|
|
|
+ background: #fff !important;
|
|
|
+}
|
|
|
</style>
|