310 lines
7.5 KiB
Vue
310 lines
7.5 KiB
Vue
|
<template>
|
|||
|
<GiPageLayout>
|
|||
|
<div class="system-insurance-overview-container">
|
|||
|
<!-- 页面标题 -->
|
|||
|
<div class="page-header">
|
|||
|
<h2 class="page-title">工作台概览</h2>
|
|||
|
</div>
|
|||
|
|
|||
|
<!-- 统计卡片 -->
|
|||
|
<div class="stats-grid">
|
|||
|
<a-card class="stat-card" :bordered="false">
|
|||
|
<div class="stat-content">
|
|||
|
<div class="stat-value">{{ stats.totalEmployees }}</div>
|
|||
|
<div class="stat-label">员工总数</div>
|
|||
|
<div class="stat-trend">↑ 5% 较上月</div>
|
|||
|
</div>
|
|||
|
</a-card>
|
|||
|
|
|||
|
<a-card class="stat-card" :bordered="false">
|
|||
|
<div class="stat-content">
|
|||
|
<div class="stat-value">{{ stats.validPolicies }}</div>
|
|||
|
<div class="stat-label">有效保单</div>
|
|||
|
<div class="stat-trend">↑ 3% 较上月</div>
|
|||
|
</div>
|
|||
|
</a-card>
|
|||
|
|
|||
|
<a-card class="stat-card" :bordered="false">
|
|||
|
<div class="stat-content">
|
|||
|
<div class="stat-value">{{ stats.expiringPolicies }}</div>
|
|||
|
<div class="stat-label">即将到期</div>
|
|||
|
<div class="stat-trend">↑ 5% 较上月</div>
|
|||
|
</div>
|
|||
|
</a-card>
|
|||
|
|
|||
|
<a-card class="stat-card" :bordered="false">
|
|||
|
<div class="stat-content">
|
|||
|
<div class="stat-value">{{ stats.annualPremium }}</div>
|
|||
|
<div class="stat-label">年度总保费</div>
|
|||
|
<div class="stat-trend">↑ 8% 较上年</div>
|
|||
|
</div>
|
|||
|
</a-card>
|
|||
|
</div>
|
|||
|
|
|||
|
<!-- 筛选和操作区域 -->
|
|||
|
<div class="filter-section">
|
|||
|
<div class="filter-left">
|
|||
|
<a-select v-model="selectedDepartment" placeholder="全部部门" style="width: 150px">
|
|||
|
<a-option value="">全部部门</a-option>
|
|||
|
<a-option value="tech">技术部</a-option>
|
|||
|
<a-option value="sales">销售部</a-option>
|
|||
|
<a-option value="hr">人事部</a-option>
|
|||
|
<a-option value="finance">财务部</a-option>
|
|||
|
</a-select>
|
|||
|
<a-button type="primary" @click="handleFilter">
|
|||
|
筛选
|
|||
|
</a-button>
|
|||
|
</div>
|
|||
|
<div class="filter-right">
|
|||
|
<a-button type="outline" @click="handleExportExcel">
|
|||
|
<template #icon><icon-download /></template>
|
|||
|
导出Excel
|
|||
|
</a-button>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
|
|||
|
<!-- 即将到期提醒 -->
|
|||
|
<a-alert
|
|||
|
type="warning"
|
|||
|
:message="expiringAlert"
|
|||
|
:closable="false"
|
|||
|
show-icon
|
|||
|
class="expiring-alert"
|
|||
|
/>
|
|||
|
|
|||
|
<!-- 保险类型分布图 -->
|
|||
|
<a-card class="chart-card" :bordered="false">
|
|||
|
<template #title>
|
|||
|
<div class="chart-title">
|
|||
|
<icon-bar-chart />
|
|||
|
保险类型分布图表
|
|||
|
</div>
|
|||
|
</template>
|
|||
|
|
|||
|
<div class="chart-container">
|
|||
|
<div class="chart-placeholder">
|
|||
|
<div class="chart-legend">
|
|||
|
<div class="legend-item">
|
|||
|
<div class="legend-color medical"></div>
|
|||
|
<span class="legend-text">医疗保险 (45%)</span>
|
|||
|
</div>
|
|||
|
<div class="legend-item">
|
|||
|
<div class="legend-color accident"></div>
|
|||
|
<span class="legend-text">意外险 (25%)</span>
|
|||
|
</div>
|
|||
|
<div class="legend-item">
|
|||
|
<div class="legend-color pension"></div>
|
|||
|
<span class="legend-text">养老保险 (20%)</span>
|
|||
|
</div>
|
|||
|
<div class="legend-item">
|
|||
|
<div class="legend-color life"></div>
|
|||
|
<span class="legend-text">人寿保险 (10%)</span>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
<div class="chart-visual">
|
|||
|
<!-- 简单的饼图可视化 -->
|
|||
|
<svg width="300" height="300" viewBox="0 0 300 300">
|
|||
|
<circle cx="150" cy="150" r="80" fill="#1890ff" stroke="#fff" stroke-width="2" />
|
|||
|
<circle cx="150" cy="150" r="80" fill="#52c41a" stroke="#fff" stroke-width="2"
|
|||
|
stroke-dasharray="125.6 502.4" stroke-dashoffset="0"
|
|||
|
transform="rotate(90 150 150)" />
|
|||
|
<circle cx="150" cy="150" r="80" fill="#faad14" stroke="#fff" stroke-width="2"
|
|||
|
stroke-dasharray="100.5 527.5" stroke-dashoffset="-125.6"
|
|||
|
transform="rotate(90 150 150)" />
|
|||
|
<circle cx="150" cy="150" r="80" fill="#f5222d" stroke="#fff" stroke-width="2"
|
|||
|
stroke-dasharray="62.8 565.2" stroke-dashoffset="-226.1"
|
|||
|
transform="rotate(90 150 150)" />
|
|||
|
</svg>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
</div>
|
|||
|
</a-card>
|
|||
|
</div>
|
|||
|
</GiPageLayout>
|
|||
|
</template>
|
|||
|
|
|||
|
<script setup lang="ts">
|
|||
|
import { ref, reactive } from 'vue'
|
|||
|
import { Message } from '@arco-design/web-vue'
|
|||
|
import { IconDownload, IconBarChart } from '@arco-design/web-vue/es/icon'
|
|||
|
|
|||
|
// 统计数据
|
|||
|
const stats = reactive({
|
|||
|
totalEmployees: 156,
|
|||
|
validPolicies: 142,
|
|||
|
expiringPolicies: 23,
|
|||
|
annualPremium: '¥ 1,256,800'
|
|||
|
})
|
|||
|
|
|||
|
// 筛选条件
|
|||
|
const selectedDepartment = ref('')
|
|||
|
|
|||
|
// 即将到期提醒
|
|||
|
const expiringAlert = '您有 3份 保险即将在30天内到期,请及时处理。'
|
|||
|
|
|||
|
// 筛选操作
|
|||
|
const handleFilter = () => {
|
|||
|
Message.info('筛选功能已执行')
|
|||
|
}
|
|||
|
|
|||
|
// 导出Excel
|
|||
|
const handleExportExcel = () => {
|
|||
|
Message.success('Excel文件导出成功')
|
|||
|
}
|
|||
|
</script>
|
|||
|
|
|||
|
<style scoped>
|
|||
|
.system-insurance-overview-container {
|
|||
|
padding: 20px;
|
|||
|
}
|
|||
|
|
|||
|
.page-header {
|
|||
|
margin-bottom: 20px;
|
|||
|
}
|
|||
|
|
|||
|
.page-title {
|
|||
|
font-size: 24px;
|
|||
|
font-weight: 600;
|
|||
|
color: #1d2129;
|
|||
|
margin: 0;
|
|||
|
}
|
|||
|
|
|||
|
.stats-grid {
|
|||
|
display: grid;
|
|||
|
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
|
|||
|
gap: 20px;
|
|||
|
margin-bottom: 20px;
|
|||
|
}
|
|||
|
|
|||
|
.stat-card {
|
|||
|
background: white;
|
|||
|
border-radius: 8px;
|
|||
|
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
|
|||
|
transition: transform 0.2s;
|
|||
|
}
|
|||
|
|
|||
|
.stat-card:hover {
|
|||
|
transform: translateY(-2px);
|
|||
|
}
|
|||
|
|
|||
|
.stat-content {
|
|||
|
text-align: center;
|
|||
|
padding: 20px;
|
|||
|
}
|
|||
|
|
|||
|
.stat-value {
|
|||
|
font-size: 32px;
|
|||
|
font-weight: 600;
|
|||
|
color: #1d2129;
|
|||
|
margin-bottom: 8px;
|
|||
|
}
|
|||
|
|
|||
|
.stat-label {
|
|||
|
font-size: 14px;
|
|||
|
color: #4e5969;
|
|||
|
margin-bottom: 8px;
|
|||
|
}
|
|||
|
|
|||
|
.stat-trend {
|
|||
|
font-size: 12px;
|
|||
|
color: #52c41a;
|
|||
|
font-weight: 500;
|
|||
|
}
|
|||
|
|
|||
|
.filter-section {
|
|||
|
display: flex;
|
|||
|
justify-content: space-between;
|
|||
|
align-items: center;
|
|||
|
margin-bottom: 20px;
|
|||
|
padding: 16px 20px;
|
|||
|
background: white;
|
|||
|
border-radius: 8px;
|
|||
|
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
|
|||
|
}
|
|||
|
|
|||
|
.filter-left {
|
|||
|
display: flex;
|
|||
|
align-items: center;
|
|||
|
gap: 12px;
|
|||
|
}
|
|||
|
|
|||
|
.filter-right {
|
|||
|
display: flex;
|
|||
|
gap: 12px;
|
|||
|
}
|
|||
|
|
|||
|
.expiring-alert {
|
|||
|
margin-bottom: 20px;
|
|||
|
}
|
|||
|
|
|||
|
.chart-card {
|
|||
|
background: white;
|
|||
|
border-radius: 8px;
|
|||
|
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
|
|||
|
}
|
|||
|
|
|||
|
.chart-title {
|
|||
|
display: flex;
|
|||
|
align-items: center;
|
|||
|
gap: 8px;
|
|||
|
font-size: 16px;
|
|||
|
font-weight: 600;
|
|||
|
color: #1d2129;
|
|||
|
}
|
|||
|
|
|||
|
.chart-container {
|
|||
|
padding: 20px;
|
|||
|
}
|
|||
|
|
|||
|
.chart-placeholder {
|
|||
|
display: flex;
|
|||
|
align-items: center;
|
|||
|
justify-content: space-between;
|
|||
|
gap: 40px;
|
|||
|
}
|
|||
|
|
|||
|
.chart-legend {
|
|||
|
display: flex;
|
|||
|
flex-direction: column;
|
|||
|
gap: 16px;
|
|||
|
}
|
|||
|
|
|||
|
.legend-item {
|
|||
|
display: flex;
|
|||
|
align-items: center;
|
|||
|
gap: 12px;
|
|||
|
}
|
|||
|
|
|||
|
.legend-color {
|
|||
|
width: 16px;
|
|||
|
height: 16px;
|
|||
|
border-radius: 2px;
|
|||
|
}
|
|||
|
|
|||
|
.legend-color.medical {
|
|||
|
background: #1890ff;
|
|||
|
}
|
|||
|
|
|||
|
.legend-color.accident {
|
|||
|
background: #52c41a;
|
|||
|
}
|
|||
|
|
|||
|
.legend-color.pension {
|
|||
|
background: #faad14;
|
|||
|
}
|
|||
|
|
|||
|
.legend-color.life {
|
|||
|
background: #f5222d;
|
|||
|
}
|
|||
|
|
|||
|
.legend-text {
|
|||
|
font-size: 14px;
|
|||
|
color: #4e5969;
|
|||
|
}
|
|||
|
|
|||
|
.chart-visual {
|
|||
|
display: flex;
|
|||
|
justify-content: center;
|
|||
|
align-items: center;
|
|||
|
}
|
|||
|
</style>
|