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

310 lines
7.5 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<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>