You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

828 lines
30 KiB

5 months ago
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>执行率管理 - 资金使用管理系统</title>
<link href="https://cdn.staticfile.org/bootstrap/5.3.0/css/bootstrap.min.css" rel="stylesheet">
<link rel="stylesheet" href="https://cdn.staticfile.org/bootstrap-icons/1.11.0/font/bootstrap-icons.min.css">
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Microsoft YaHei', sans-serif;
background-color: #f5f7fa;
padding: 20px;
}
.page-header {
background: white;
padding: 25px 30px;
border-radius: 10px;
margin-bottom: 20px;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05);
display: flex;
justify-content: space-between;
align-items: center;
}
.page-title {
font-size: 24px;
font-weight: 600;
color: #333;
margin: 0;
}
.page-title i {
margin-right: 10px;
color: #667eea;
}
.filter-section {
background: white;
padding: 20px 25px;
border-radius: 10px;
margin-bottom: 20px;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05);
}
.filter-row {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 15px;
align-items: end;
}
.form-label {
font-weight: 500;
color: #333;
margin-bottom: 8px;
font-size: 14px;
}
.summary-cards {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 20px;
margin-bottom: 20px;
}
.summary-card {
background: white;
padding: 25px;
border-radius: 10px;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05);
transition: transform 0.3s, box-shadow 0.3s;
}
.summary-card:hover {
transform: translateY(-5px);
box-shadow: 0 5px 20px rgba(0, 0, 0, 0.1);
}
.summary-card-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 15px;
}
.summary-card-title {
font-size: 14px;
color: #666;
font-weight: 500;
}
.summary-card-icon {
width: 50px;
height: 50px;
border-radius: 10px;
display: flex;
align-items: center;
justify-content: center;
font-size: 24px;
color: white;
}
.summary-card-icon.overall {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
}
.summary-card-icon.high {
background: linear-gradient(135deg, #11998e 0%, #38ef7d 100%);
}
.summary-card-icon.medium {
background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
}
.summary-card-icon.low {
background: linear-gradient(135deg, #fa709a 0%, #fee140 100%);
}
.summary-card-value {
font-size: 36px;
font-weight: 700;
color: #333;
margin-bottom: 5px;
}
.summary-card-change {
font-size: 14px;
display: flex;
align-items: center;
gap: 5px;
}
.summary-card-change.positive {
color: #10b981;
}
.summary-card-change.negative {
color: #ef4444;
}
.rate-badge {
display: inline-flex;
align-items: center;
padding: 4px 12px;
border-radius: 20px;
font-size: 12px;
font-weight: 600;
}
.rate-badge.excellent {
background-color: #d1fae5;
color: #065f46;
}
.rate-badge.good {
background-color: #dbeafe;
color: #1e40af;
}
.rate-badge.warning {
background-color: #fef3c7;
color: #92400e;
}
.rate-badge.danger {
background-color: #fee2e2;
color: #991b1b;
}
.main-content {
background: white;
border-radius: 10px;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.05);
overflow: hidden;
}
.content-header {
padding: 20px 25px;
border-bottom: 1px solid #e5e7eb;
display: flex;
justify-content: space-between;
align-items: center;
}
.content-title {
font-size: 18px;
font-weight: 600;
color: #333;
margin: 0;
}
.table-container {
padding: 25px;
}
.table {
margin: 0;
}
.table thead th {
border-top: none;
border-bottom: 2px solid #e5e7eb;
font-weight: 600;
color: #666;
font-size: 14px;
padding: 12px;
background-color: #f8f9fa;
}
.table tbody td {
padding: 15px 12px;
vertical-align: middle;
border-bottom: 1px solid #f3f4f6;
}
.table tbody tr:hover {
background-color: #f8f9fa;
}
.progress-cell {
min-width: 200px;
}
.progress {
height: 10px;
border-radius: 10px;
background-color: #e5e7eb;
}
.progress-bar {
border-radius: 10px;
transition: width 0.3s;
}
.progress-bar.excellent {
background-color: #10b981;
}
.progress-bar.good {
background-color: #3b82f6;
}
.progress-bar.warning {
background-color: #f59e0b;
}
.progress-bar.danger {
background-color: #ef4444;
}
.chart-container {
padding: 25px;
border-bottom: 1px solid #e5e7eb;
}
.chart-title {
font-size: 16px;
font-weight: 600;
color: #333;
margin-bottom: 20px;
}
.chart-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 20px;
}
.chart-item {
text-align: center;
}
.chart-circle {
width: 150px;
height: 150px;
margin: 0 auto 15px;
position: relative;
}
.chart-circle svg {
transform: rotate(-90deg);
}
.chart-circle-text {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
text-align: center;
}
.chart-circle-value {
font-size: 32px;
font-weight: 700;
color: #333;
}
.chart-circle-label {
font-size: 14px;
color: #666;
}
.chart-item-title {
font-size: 14px;
color: #666;
margin-top: 10px;
}
.department-badge {
display: inline-flex;
align-items: center;
gap: 5px;
padding: 4px 10px;
background-color: #f0f0ff;
color: #667eea;
border-radius: 15px;
font-size: 12px;
font-weight: 500;
}
.btn-action {
padding: 5px 12px;
font-size: 12px;
}
.empty-state {
text-align: center;
padding: 60px 20px;
color: #999;
}
.empty-state i {
font-size: 64px;
margin-bottom: 20px;
opacity: 0.3;
}
</style>
</head>
<body>
<!-- 页面头部 -->
<div class="page-header">
<h1 class="page-title">
<i class="bi bi-percent"></i> 执行率管理
</h1>
<div class="department-badge">
<i class="bi bi-building"></i>
当前科室:技术研发部
</div>
</div>
<!-- 筛选区域 -->
<div class="filter-section">
<form id="filterForm">
<div class="filter-row">
<div>
<label class="form-label">统计年度</label>
<select class="form-select" id="statYear">
<option value="2024" selected>2024年</option>
<option value="2023">2023年</option>
<option value="2022">2022年</option>
</select>
</div>
<div>
<label class="form-label">统计周期</label>
<select class="form-select" id="statPeriod">
<option value="year" selected>年度</option>
<option value="quarter">季度</option>
<option value="month">月度</option>
</select>
</div>
<div>
<label class="form-label">一级预算</label>
<select class="form-select" id="level1Budget">
<option value="">全部</option>
<option value="1">科研项目预算</option>
<option value="2">行政运行预算</option>
<option value="3">设备购置预算</option>
<option value="4">人员支出预算</option>
</select>
</div>
<div>
<label class="form-label">执行率范围</label>
<select class="form-select" id="rateRange">
<option value="">全部</option>
<option value="excellent">优秀 (≥80%)</option>
<option value="good">良好 (60%-80%)</option>
<option value="warning">一般 (40%-60%)</option>
<option value="danger">较低 (<40%)</option>
</select>
</div>
<div>
<button type="button" class="btn btn-primary w-100" onclick="searchExecutionRate()">
<i class="bi bi-search"></i> 查询
</button>
</div>
<div>
<button type="button" class="btn btn-outline-secondary w-100" onclick="resetFilter()">
<i class="bi bi-arrow-clockwise"></i> 重置
</button>
</div>
</div>
</form>
</div>
<!-- 汇总卡片 -->
<div class="summary-cards">
<div class="summary-card">
<div class="summary-card-header">
<div class="summary-card-title">科室总体执行率</div>
<div class="summary-card-icon overall">
<i class="bi bi-graph-up-arrow"></i>
</div>
</div>
<div class="summary-card-value">65.5%</div>
<div class="summary-card-change positive">
<i class="bi bi-arrow-up"></i>
<span>较上月 +2.3%</span>
</div>
</div>
<div class="summary-card">
<div class="summary-card-header">
<div class="summary-card-title">高执行率项目 (≥80%)</div>
<div class="summary-card-icon high">
<i class="bi bi-check-circle"></i>
</div>
</div>
<div class="summary-card-value">8</div>
<div class="summary-card-change positive">
<i class="bi bi-arrow-up"></i>
<span>较上月 +2</span>
</div>
</div>
<div class="summary-card">
<div class="summary-card-header">
<div class="summary-card-title">中等执行率 (60%-80%)</div>
<div class="summary-card-icon medium">
<i class="bi bi-exclamation-circle"></i>
</div>
</div>
<div class="summary-card-value">12</div>
<div class="summary-card-change">
<span>与上月持平</span>
</div>
</div>
<div class="summary-card">
<div class="summary-card-header">
<div class="summary-card-title">低执行率项目 (<60%)</div>
<div class="summary-card-icon low">
<i class="bi bi-x-circle"></i>
</div>
</div>
<div class="summary-card-value">5</div>
<div class="summary-card-change negative">
<i class="bi bi-arrow-down"></i>
<span>较上月 -1</span>
</div>
</div>
</div>
<!-- 主要内容 -->
<div class="main-content">
<!-- 图表区域 -->
<div class="chart-container">
<div class="chart-title">
<i class="bi bi-bar-chart"></i> 执行率分布图表
</div>
<div class="chart-grid">
<div class="chart-item">
<div class="chart-circle">
<svg width="150" height="150">
<circle cx="75" cy="75" r="70" fill="none" stroke="#e5e7eb" stroke-width="10"/>
<circle cx="75" cy="75" r="70" fill="none" stroke="#10b981" stroke-width="10"
stroke-dasharray="439.8" stroke-dashoffset="151.5" stroke-linecap="round"/>
</svg>
<div class="chart-circle-text">
<div class="chart-circle-value">65.5%</div>
<div class="chart-circle-label">总体执行率</div>
</div>
</div>
<div class="chart-item-title">科室总体执行率</div>
</div>
<div class="chart-item">
<div class="chart-circle">
<svg width="150" height="150">
<circle cx="75" cy="75" r="70" fill="none" stroke="#e5e7eb" stroke-width="10"/>
<circle cx="75" cy="75" r="70" fill="none" stroke="#3b82f6" stroke-width="10"
stroke-dasharray="439.8" stroke-dashoffset="87.96" stroke-linecap="round"/>
</svg>
<div class="chart-circle-text">
<div class="chart-circle-value">80%</div>
<div class="chart-circle-label">科研项目</div>
</div>
</div>
<div class="chart-item-title">科研项目预算执行率</div>
</div>
<div class="chart-item">
<div class="chart-circle">
<svg width="150" height="150">
<circle cx="75" cy="75" r="70" fill="none" stroke="#e5e7eb" stroke-width="10"/>
<circle cx="75" cy="75" r="70" fill="none" stroke="#f59e0b" stroke-width="10"
stroke-dasharray="439.8" stroke-dashoffset="175.92" stroke-linecap="round"/>
</svg>
<div class="chart-circle-text">
<div class="chart-circle-value">60%</div>
<div class="chart-circle-label">行政运行</div>
</div>
</div>
<div class="chart-item-title">行政运行预算执行率</div>
</div>
</div>
</div>
<!-- 明细表格 -->
<div class="content-header">
<h2 class="content-title">
<i class="bi bi-list-ul"></i> 执行率明细
</h2>
<div>
<button class="btn btn-sm btn-outline-primary" onclick="exportData()">
<i class="bi bi-download"></i> 导出数据
</button>
</div>
</div>
<div class="table-container">
<div class="table-responsive">
<table class="table table-hover">
<thead>
<tr>
<th>一级预算</th>
<th>二级预算</th>
<th>预算金额</th>
<th>已使用</th>
<th>剩余金额</th>
<th>执行率</th>
<th>执行进度</th>
<th>状态</th>
<th>操作</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>科研项目预算</strong></td>
<td>课题A - 海洋环境监测</td>
<td>¥2,500,000</td>
<td>¥1,680,000</td>
<td>¥820,000</td>
<td><strong>67.2%</strong></td>
<td class="progress-cell">
<div class="progress">
<div class="progress-bar good" style="width: 67.2%"></div>
</div>
</td>
<td><span class="rate-badge good">良好</span></td>
<td>
<button class="btn btn-sm btn-outline-primary btn-action" onclick="viewDetail(1)">
<i class="bi bi-eye"></i> 详情
</button>
</td>
</tr>
<tr>
<td><strong>科研项目预算</strong></td>
<td>课题B - 数据分析平台</td>
<td>¥1,800,000</td>
<td>¥1,200,000</td>
<td>¥600,000</td>
<td><strong>66.7%</strong></td>
<td class="progress-cell">
<div class="progress">
<div class="progress-bar good" style="width: 66.7%"></div>
</div>
</td>
<td><span class="rate-badge good">良好</span></td>
<td>
<button class="btn btn-sm btn-outline-primary btn-action" onclick="viewDetail(2)">
<i class="bi bi-eye"></i> 详情
</button>
</td>
</tr>
<tr>
<td><strong>科研项目预算</strong></td>
<td>课题C - 设备维护升级</td>
<td>¥900,000</td>
<td>¥570,000</td>
<td>¥330,000</td>
<td><strong>63.3%</strong></td>
<td class="progress-cell">
<div class="progress">
<div class="progress-bar good" style="width: 63.3%"></div>
</div>
</td>
<td><span class="rate-badge good">良好</span></td>
<td>
<button class="btn btn-sm btn-outline-primary btn-action" onclick="viewDetail(3)">
<i class="bi bi-eye"></i> 详情
</button>
</td>
</tr>
<tr>
<td><strong>行政运行预算</strong></td>
<td>办公用品采购</td>
<td>¥800,000</td>
<td>¥450,000</td>
<td>¥350,000</td>
<td><strong>56.3%</strong></td>
<td class="progress-cell">
<div class="progress">
<div class="progress-bar warning" style="width: 56.3%"></div>
</div>
</td>
<td><span class="rate-badge warning">一般</span></td>
<td>
<button class="btn btn-sm btn-outline-primary btn-action" onclick="viewDetail(4)">
<i class="bi bi-eye"></i> 详情
</button>
</td>
</tr>
<tr>
<td><strong>行政运行预算</strong></td>
<td>会议培训费用</td>
<td>¥1,200,000</td>
<td>¥695,680</td>
<td>¥504,320</td>
<td><strong>58.0%</strong></td>
<td class="progress-cell">
<div class="progress">
<div class="progress-bar warning" style="width: 58.0%"></div>
</div>
</td>
<td><span class="rate-badge warning">一般</span></td>
<td>
<button class="btn btn-sm btn-outline-primary btn-action" onclick="viewDetail(5)">
<i class="bi bi-eye"></i> 详情
</button>
</td>
</tr>
<tr>
<td><strong>行政运行预算</strong></td>
<td>差旅费用</td>
<td>¥1,000,000</td>
<td>¥600,000</td>
<td>¥400,000</td>
<td><strong>60.0%</strong></td>
<td class="progress-cell">
<div class="progress">
<div class="progress-bar good" style="width: 60.0%"></div>
</div>
</td>
<td><span class="rate-badge good">良好</span></td>
<td>
<button class="btn btn-sm btn-outline-primary btn-action" onclick="viewDetail(6)">
<i class="bi bi-eye"></i> 详情
</button>
</td>
</tr>
<tr>
<td><strong>设备购置预算</strong></td>
<td>科研设备采购</td>
<td>¥1,500,000</td>
<td>¥950,000</td>
<td>¥550,000</td>
<td><strong>63.3%</strong></td>
<td class="progress-cell">
<div class="progress">
<div class="progress-bar good" style="width: 63.3%"></div>
</div>
</td>
<td><span class="rate-badge good">良好</span></td>
<td>
<button class="btn btn-sm btn-outline-primary btn-action" onclick="viewDetail(7)">
<i class="bi bi-eye"></i> 详情
</button>
</td>
</tr>
<tr>
<td><strong>设备购置预算</strong></td>
<td>办公设备采购</td>
<td>¥680,000</td>
<td>¥450,000</td>
<td>¥230,000</td>
<td><strong>66.2%</strong></td>
<td class="progress-cell">
<div class="progress">
<div class="progress-bar good" style="width: 66.2%"></div>
</div>
</td>
<td><span class="rate-badge good">良好</span></td>
<td>
<button class="btn btn-sm btn-outline-primary btn-action" onclick="viewDetail(8)">
<i class="bi bi-eye"></i> 详情
</button>
</td>
</tr>
<tr>
<td><strong>设备购置预算</strong></td>
<td>设备维护费用</td>
<td>¥400,000</td>
<td>¥250,000</td>
<td>¥150,000</td>
<td><strong>62.5%</strong></td>
<td class="progress-cell">
<div class="progress">
<div class="progress-bar good" style="width: 62.5%"></div>
</div>
</td>
<td><span class="rate-badge good">良好</span></td>
<td>
<button class="btn btn-sm btn-outline-primary btn-action" onclick="viewDetail(9)">
<i class="bi bi-eye"></i> 详情
</button>
</td>
</tr>
<tr>
<td><strong>人员支出预算</strong></td>
<td>工资福利</td>
<td>¥1,000,000</td>
<td>¥1,000,000</td>
<td>¥0</td>
<td><strong>100%</strong></td>
<td class="progress-cell">
<div class="progress">
<div class="progress-bar excellent" style="width: 100%"></div>
</div>
</td>
<td><span class="rate-badge excellent">优秀</span></td>
<td>
<button class="btn btn-sm btn-outline-primary btn-action" onclick="viewDetail(10)">
<i class="bi bi-eye"></i> 详情
</button>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<script src="https://cdn.staticfile.org/bootstrap/5.3.0/js/bootstrap.bundle.min.js"></script>
<script>
// 查询执行率
function searchExecutionRate() {
const year = document.getElementById('statYear').value;
const period = document.getElementById('statPeriod').value;
const level1 = document.getElementById('level1Budget').value;
const range = document.getElementById('rateRange').value;
// 这里应该调用后端API进行查询
console.log('查询参数:', { year, period, level1, range });
// 模拟查询结果
alert('查询功能待对接后端API');
}
// 重置筛选
function resetFilter() {
document.getElementById('statYear').value = '2024';
document.getElementById('statPeriod').value = 'year';
document.getElementById('level1Budget').value = '';
document.getElementById('rateRange').value = '';
}
// 查看详情
function viewDetail(id) {
// 这里可以打开详情模态框或跳转到详情页面
alert('执行率详情功能待开发项目ID: ' + id);
}
// 导出数据
function exportData() {
// 这里应该调用后端API导出数据
alert('导出功能待对接后端API');
}
// 根据执行率获取状态
function getRateStatus(rate) {
if (rate >= 80) {
return { class: 'excellent', text: '优秀' };
} else if (rate >= 60) {
return { class: 'good', text: '良好' };
} else if (rate >= 40) {
return { class: 'warning', text: '一般' };
} else {
return { class: 'danger', text: '较低' };
}
}
// 根据执行率获取进度条样式
function getProgressBarClass(rate) {
if (rate >= 80) {
return 'excellent';
} else if (rate >= 60) {
return 'good';
} else if (rate >= 40) {
return 'warning';
} else {
return 'danger';
}
}
// 页面加载时的动画效果
document.addEventListener('DOMContentLoaded', function() {
const cards = document.querySelectorAll('.summary-card');
cards.forEach((card, index) => {
card.style.opacity = '0';
card.style.transform = 'translateY(20px)';
setTimeout(() => {
card.style.transition = 'all 0.5s ease';
card.style.opacity = '1';
card.style.transform = 'translateY(0)';
}, index * 100);
});
});
</script>
</body>
</html>