Industrial-image-management.../src/views/hr/salary/system-insurance/overview/index.vue

310 lines
7.5 KiB
Vue
Raw Normal View History

2025-07-14 11:11:33 +08:00
<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>