hb_zhgd_screen/pages/dataAnalysisOctober/projectManagement.html

1067 lines
37 KiB
HTML
Raw Normal View History

2025-10-17 14:57:09 +08:00
<!DOCTYPE html>
2026-01-21 10:34:06 +08:00
<html lang="zh-CN">
2025-10-17 14:57:09 +08:00
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
2026-01-21 10:34:06 +08:00
<title>项目管理分析</title>
2025-10-17 14:57:09 +08:00
<link rel="stylesheet" href="../../css/font.css">
<link rel="stylesheet" href="../../plugin/layui-v2.9.7/layui/css/layui.css">
<link rel="stylesheet" href="../../css/dataAnalysis/dataAnalysis.css">
<link rel="stylesheet" href="../../css/shuiYin/shuiYin.css">
2026-01-21 10:34:06 +08:00
<link rel="stylesheet" href="../../css/coreTable.css" />
2025-10-17 14:57:09 +08:00
<link rel="stylesheet" href="../../css/accessMge/accessMge.css">
2026-01-26 15:51:06 +08:00
<link rel="stylesheet" href="../../css/tipCommon.css">
2025-10-17 14:57:09 +08:00
<script src="../../js/publics/sm4.js" type="text/javascript"></script>
<script src="../../js/publics/jquery-3.6.0.min.js" type="text/javascript"></script>
<script src="../../js/publics/public.js"></script>
<script src="../../plugin/scroll/jquery.nicescroll.min.js"></script>
<script src="../../js/publics/4.3.0/echarts.min.js"></script>
<script src="../../plugin/layui-v2.9.7/layui/layui.js"></script>
<script src="../../js/publics/aescbc.js"></script>
<script src="../../js/publics/sm3.js"></script>
<script src="../../api/commonRequest.js"></script>
<style>
#proQuality {
width: 100%;
2026-01-24 17:14:53 +08:00
height: 130%;
2026-01-21 10:34:06 +08:00
position: relative;
overflow: hidden;
2025-10-17 14:57:09 +08:00
}
2026-01-21 10:34:06 +08:00
/* 顶部查询区域 - 绝对定位,不占用主内容区域高度 */
.filter-bar {
position: absolute;
top: 0;
left: 1%;
right: 1%;
height: 50px;
2025-10-17 14:57:09 +08:00
display: flex;
2026-01-21 10:34:06 +08:00
align-items: center;
gap: 12px;
padding: 0 10px;
z-index: 10;
2025-10-17 14:57:09 +08:00
}
2025-10-18 16:58:04 +08:00
2026-01-21 10:34:06 +08:00
.date-range-input {
width: 280px;
height: 36px;
background: rgba(13, 34, 37, 0.6);
border: 1px solid rgba(0, 255, 255, 0.3);
border-radius: 2px;
color: #fff;
padding: 0 12px;
font-size: 14px;
box-sizing: border-box;
}
.date-range-input::placeholder {
color: rgba(255, 255, 255, 0.5);
}
.query-btn {
width: 80px;
height: 36px;
background: linear-gradient(180deg, #00FEFC 0%, #00B8B6 100%);
border: none;
border-radius: 2px;
color: #fff;
font-size: 14px;
cursor: pointer;
transition: all 0.3s;
}
.query-btn:hover {
background: linear-gradient(180deg, #00B8B6 0%, #00FEFC 100%);
box-shadow: 0 0 8px rgba(0, 254, 252, 0.5);
2025-10-17 14:57:09 +08:00
}
2025-10-18 16:58:04 +08:00
2026-01-24 17:14:53 +08:00
/* 顶部日期筛选区域(与工程质量分析保持一致) */
.top-date-filter {
display: flex;
align-items: center;
gap: 10px;
padding: 4px 20px;
background: rgba(13, 34, 37, 0.8);
border-bottom: 1px solid rgba(6, 189, 221, 0.3);
flex-shrink: 0;
}
.date-filter-label {
font-size: 14px;
color: #FFFFFF;
font-weight: bold;
white-space: nowrap;
}
.date-range-wrapper {
display: flex;
align-items: center;
gap: 8px;
flex-shrink: 0;
}
.search-input {
width: 160px;
height: 32px;
padding: 0 12px;
background: rgba(25, 62, 68, 0.6);
border: 1px solid rgba(6, 189, 221, 0.6);
border-radius: 2px;
color: #FFFFFF;
font-size: 14px;
transition: all 0.3s;
flex-shrink: 0;
}
.search-input:focus {
outline: none;
border-color: rgba(6, 189, 221, 1);
background: rgba(25, 62, 68, 0.8);
}
.search-input::placeholder {
color: rgba(255, 255, 255, 0.5);
}
.date-input {
width: 240px;
}
2026-01-21 10:34:06 +08:00
/* 主内容区域 - 使用6列3行网格 */
.main-content {
2025-10-17 14:57:09 +08:00
width: 100%;
2026-01-21 10:34:06 +08:00
height: 100%;
display: grid;
/* 6列第一行占6列第二行左右各3列(1/2)第三行左边4列(2/3)右边2列(1/3) */
grid-template-columns: repeat(6, 1fr);
/* 3行第一行2/5高度第二行和第三行各1.5/5高度 */
/* 2/5 = 4fr, 1.5/5 = 3fr, 1.5/5 = 3fr */
grid-template-rows: 4fr 3fr 3fr;
gap: 1%;
min-height: 0;
/* 添加顶部内边距,避免被 filter-bar 遮挡 */
/* padding-top: 60px; */
box-sizing: border-box;
}
.panel {
border: 1px solid rgba(0, 255, 255, 0.15);
box-shadow: 0 0 8px rgba(0, 255, 255, 0.15);
border-radius: 3px;
overflow: hidden;
position: relative;
background-image: url("../../img/dataAnalysisOctober/proQualityAnalysis/common_bg.png");
2025-10-17 14:57:09 +08:00
display: flex;
2026-01-21 10:34:06 +08:00
flex-direction: column;
2025-10-17 14:57:09 +08:00
}
2026-01-21 10:34:06 +08:00
.panel-title {
height: 40px;
2025-10-17 14:57:09 +08:00
display: flex;
2026-01-21 10:34:06 +08:00
align-items: center;
padding: 0 18px;
font-size: 16px;
color: #ffffff;
font-weight: bold;
gap: 8px;
flex-shrink: 0;
2025-10-17 14:57:09 +08:00
}
2026-01-21 10:34:06 +08:00
.title-indicator {
width: 4px;
height: 18px;
background: linear-gradient(180deg, #00FEFC 0%, #00B8B6 100%);
border-radius: 2px;
flex-shrink: 0;
2025-10-17 14:57:09 +08:00
}
2026-01-21 10:34:06 +08:00
.title-text {
flex: 1;
2025-10-17 14:57:09 +08:00
}
2026-01-21 10:34:06 +08:00
.panel-title .info-icon {
margin-left: auto;
width: 16px;
height: 16px;
cursor: pointer;
opacity: 0.7;
font-size: 14px;
2025-10-17 14:57:09 +08:00
}
2026-01-21 10:34:06 +08:00
.panel-body {
flex: 1;
padding: 4px 10px;
box-sizing: border-box;
overflow: hidden;
min-height: 0;
2025-10-17 14:57:09 +08:00
}
2026-01-21 10:34:06 +08:00
/* 第一行:项目信息 - 占整个宽度 */
.panel-project-info {
grid-column: 1 / 7;
grid-row: 1 / 2;
2025-10-17 14:57:09 +08:00
}
2026-01-21 10:34:06 +08:00
/* 第二行:项目支出趋势 - 左边 */
.panel-expenditure-trend {
grid-column: 1 / 4;
grid-row: 2 / 3;
2025-10-17 14:57:09 +08:00
}
2026-01-21 10:34:06 +08:00
/* 第二行:项目支出占比 - 右边 */
.panel-expenditure-proportion {
grid-column: 4 / 7;
grid-row: 2 / 3;
2025-10-17 14:57:09 +08:00
}
2026-01-21 10:34:06 +08:00
/* 第三行:项目风险 - 左边2/3 */
.panel-project-risk {
grid-column: 1 / 5;
grid-row: 3 / 4;
2025-10-17 14:57:09 +08:00
}
2026-01-21 10:34:06 +08:00
/* 第三行:分析预警 - 右边1/3 */
.panel-analysis-warning {
grid-column: 5 / 7;
grid-row: 3 / 4;
2025-10-17 14:57:09 +08:00
}
2026-01-21 10:34:06 +08:00
.chart-container {
width: 100%;
2025-10-17 14:57:09 +08:00
height: 100%;
}
2026-01-21 10:34:06 +08:00
/* 项目信息面板内部布局 - 使用4列2行网格 */
.project-info-content {
2025-10-17 14:57:09 +08:00
width: 100%;
2026-01-21 10:34:06 +08:00
height: 100%;
display: grid;
/* 4列第一行 1列、1列、2列第二行 2列、2列 */
grid-template-columns: repeat(6, 1fr);
/* 2行第一行稍高第二行稍低约3:2 */
grid-template-rows: 2fr 2fr;
/* gap: 1%; */
min-height: 0;
gap: 4px;
2025-10-17 14:57:09 +08:00
}
2025-10-18 16:58:04 +08:00
2026-01-21 10:34:06 +08:00
/* 子模块样式 */
.sub-module {
border: 1px solid rgba(0, 255, 255, 0.2);
border-radius: 2px;
background: rgba(13, 34, 37, 0.3);
padding: 10px;
box-sizing: border-box;
2025-10-17 14:57:09 +08:00
display: flex;
2026-01-21 10:34:06 +08:00
flex-direction: column;
overflow: hidden;
}
.sub-module-title {
height: 30px;
display: flex;
align-items: center;
gap: 6px;
2025-10-17 14:57:09 +08:00
font-size: 14px;
2026-01-21 10:34:06 +08:00
color: #ffffff;
font-weight: 500;
flex-shrink: 0;
2025-10-17 14:57:09 +08:00
}
2025-10-18 16:58:04 +08:00
2026-01-21 10:34:06 +08:00
.sub-module-title .sub-title-indicator {
width: 3px;
height: 14px;
background: linear-gradient(180deg, #00FEFC 0%, #00B8B6 100%);
border-radius: 1px;
2025-10-17 14:57:09 +08:00
}
2025-10-18 16:58:04 +08:00
2026-01-21 10:34:06 +08:00
.sub-module-title .sub-info-icon {
margin-left: auto;
width: 14px;
height: 14px;
cursor: pointer;
opacity: 0.7;
font-size: 12px;
2025-10-17 14:57:09 +08:00
}
2026-01-21 10:34:06 +08:00
.sub-module-body {
flex: 1;
display: flex;
align-items: center;
justify-content: center;
min-height: 0;
}
/* 第一行:土建工序进度 - 左上 */
.sub-module-civil-progress {
grid-column: 1 / 2;
grid-row: 1 / 2;
}
/* 第一行:电气工序进度 - 中上 */
.sub-module-electrical-progress {
grid-column: 2 / 3;
grid-row: 1 / 2;
2025-10-17 14:57:09 +08:00
}
2026-01-21 10:34:06 +08:00
/* 第一行:土建专业 - 右上占2列 */
.sub-module-civil-chart {
grid-column: 3 / 7;
grid-row: 1 / 2;
}
/* 第二行:风险分析 - 左下占2列 */
.sub-module-risk-analysis {
grid-column: 1 / 3;
grid-row: 2 / 3;
}
/* 第二行:电气专业 - 右下占2列 */
.sub-module-electrical-chart {
grid-column: 3 / 7;
grid-row: 2 / 3;
}
/* 进度指标样式 */
.progress-indicators {
display: flex;
justify-content: space-around;
align-items: center;
2025-10-17 14:57:09 +08:00
width: 100%;
height: 100%;
2026-01-21 10:34:06 +08:00
gap: 20px;
2025-10-17 14:57:09 +08:00
}
2026-01-21 10:34:06 +08:00
.progress-indicator {
display: flex;
flex-direction: column;
align-items: center;
gap: 8px;
}
.progress-number {
font-size: 20px;
font-weight: bold;
color: #00FEFC;
line-height: 1;
text-shadow: 0 0 10px rgba(0, 254, 252, 0.5);
}
.progress-label {
font-size: 13px;
color: rgba(255, 255, 255, 0.8);
text-align: center;
}
/* 项目风险模块样式 */
.risk-content-wrapper {
2025-10-17 14:57:09 +08:00
width: 100%;
height: 100%;
2026-01-21 10:34:06 +08:00
display: flex;
gap: 15px;
2025-10-17 14:57:09 +08:00
}
2026-01-21 10:34:06 +08:00
.risk-chart-wrapper {
flex: 1;
min-width: 0;
2026-01-24 17:14:53 +08:00
display: flex;
flex-direction: column;
}
.total-risk-display {
text-align: center;
color: #fff;
font-size: 16px;
font-weight: bold;
padding: 10px 0;
margin-top: 10px;
border-top: 1px solid rgba(0, 255, 255, 0.3);
2026-01-21 10:34:06 +08:00
}
.risk-stats-wrapper {
width: 200px;
2025-10-17 14:57:09 +08:00
display: flex;
2026-01-21 10:34:06 +08:00
flex-direction: column;
gap: 15px;
2025-10-17 14:57:09 +08:00
justify-content: center;
}
2026-01-21 10:34:06 +08:00
.risk-stat-item {
display: flex;
align-items: center;
gap: 12px;
padding: 10px;
background: rgba(13, 34, 37, 0.4);
border: 1px solid rgba(0, 255, 255, 0.2);
border-radius: 2px;
2025-10-17 14:57:09 +08:00
}
2026-01-21 10:34:06 +08:00
.risk-stat-icon {
font-size: 24px;
width: 40px;
height: 40px;
display: flex;
align-items: center;
justify-content: center;
2025-10-17 14:57:09 +08:00
flex-shrink: 0;
}
2026-01-21 10:34:06 +08:00
.risk-stat-content {
flex: 1;
2025-10-17 14:57:09 +08:00
display: flex;
flex-direction: column;
2026-01-21 10:34:06 +08:00
gap: 4px;
2025-10-17 14:57:09 +08:00
}
2026-01-21 10:34:06 +08:00
.risk-stat-value {
font-size: 20px;
font-weight: bold;
color: #00FEFC;
line-height: 1;
2025-10-17 14:57:09 +08:00
}
2026-01-21 10:34:06 +08:00
.risk-stat-label {
font-size: 12px;
color: rgba(255, 255, 255, 0.8);
}
/* 分析预警模块样式 */
.warning-tabs {
display: flex;
gap: 8px;
padding: 0 0 10px 0;
flex-shrink: 0;
}
.warning-tab {
padding: 4px 10px;
border: 1px solid rgba(0, 255, 255, 0.5);
border-radius: 2px;
color: #fff;
cursor: pointer;
font-size: 12px;
transition: all 0.3s;
}
.warning-tab:hover {
background: rgba(0, 255, 255, 0.1);
}
.warning-tab.active {
background: rgba(0, 255, 255, 0.15);
border-color: #00FEFC;
}
.warning-table-wrapper {
flex: 1;
overflow-y: auto;
min-height: 0;
}
.warning-table {
width: 100%;
border-collapse: collapse;
font-size: 12px;
color: #fff;
}
.warning-table thead {
background: rgba(0, 255, 255, 0.1);
position: sticky;
top: 0;
z-index: 10;
}
.warning-table th {
padding: 8px 6px;
text-align: center;
border: 1px solid rgba(0, 255, 255, 0.2);
font-weight: 500;
color: #00FEFC;
font-size: 12px;
}
.warning-table td {
padding: 6px;
text-align: center;
border: 1px solid rgba(0, 255, 255, 0.15);
color: rgba(255, 255, 255, 0.9);
font-size: 12px;
}
.warning-table tbody tr:hover {
background: rgba(0, 255, 255, 0.05);
}
.warning-action {
color: #00FEFC;
cursor: pointer;
text-decoration: underline;
}
.warning-action:hover {
color: #1CFFA3;
}
/* 滚动条样式 */
.warning-table-wrapper::-webkit-scrollbar {
width: 6px;
}
.warning-table-wrapper::-webkit-scrollbar-track {
background: rgba(13, 34, 37, 0.3);
border-radius: 3px;
}
.warning-table-wrapper::-webkit-scrollbar-thumb {
background: rgba(0, 255, 255, 0.3);
border-radius: 3px;
}
.warning-table-wrapper::-webkit-scrollbar-thumb:hover {
background: rgba(0, 255, 255, 0.5);
2025-10-17 14:57:09 +08:00
}
2026-01-24 19:13:29 +08:00
/* 定制措施弹框样式 */
.strategy-modal {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
display: none;
align-items: center;
justify-content: center;
z-index: 10000;
}
.strategy-modal.show {
display: flex;
}
.modal-overlay {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.6);
backdrop-filter: blur(4px);
}
.modal-content {
position: relative;
width: 600px;
max-width: 90%;
background: rgba(13, 34, 37, 0.95);
border: 1px solid rgba(6, 189, 221, 0.6);
border-radius: 8px;
box-shadow: 0 8px 32px rgba(0, 0, 0, 0.5);
display: flex;
flex-direction: column;
overflow: hidden;
z-index: 10001;
}
.modal-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 15px 20px;
background: rgba(13, 34, 37, 0.9);
border-bottom: 1px solid rgba(6, 189, 221, 0.3);
flex-shrink: 0;
}
.modal-title {
font-size: 18px;
font-weight: bold;
color: #FFFFFF;
}
.modal-close {
font-size: 28px;
color: #FFFFFF;
cursor: pointer;
line-height: 1;
transition: color 0.3s;
width: 30px;
height: 30px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 4px;
}
.modal-close:hover {
color: #00FFB8;
background: rgba(6, 189, 221, 0.2);
}
.modal-body {
flex: 1;
display: flex;
flex-direction: column;
overflow: hidden;
padding: 20px;
min-height: 0;
}
.strategy-form {
display: flex;
flex-direction: column;
gap: 20px;
}
.form-item {
display: flex;
flex-direction: column;
gap: 8px;
}
.form-label {
font-size: 14px;
color: #FFFFFF;
font-weight: bold;
display: flex;
align-items: center;
gap: 4px;
}
.required {
color: #FF6B6B;
}
.form-textarea {
width: 100%;
min-height: 120px;
padding: 10px;
background: rgba(25, 62, 68, 0.6);
border: 1px solid rgba(6, 189, 221, 0.6);
border-radius: 4px;
color: #FFFFFF;
font-size: 14px;
resize: vertical;
font-family: inherit;
}
.form-textarea:focus {
outline: none;
border-color: rgba(6, 189, 221, 1);
background: rgba(25, 62, 68, 0.8);
}
.form-textarea::placeholder {
color: rgba(255, 255, 255, 0.5);
}
.upload-section {
display: flex;
flex-direction: column;
gap: 10px;
}
.upload-btn {
display: inline-flex;
align-items: center;
gap: 8px;
padding: 8px 16px;
background: rgba(25, 62, 68, 0.6);
border: 1px solid rgba(6, 189, 221, 0.6);
border-radius: 4px;
color: #FFFFFF;
font-size: 14px;
cursor: pointer;
transition: all 0.3s;
width: fit-content;
}
.upload-btn:hover {
background: rgba(25, 62, 68, 0.8);
border-color: rgba(6, 189, 221, 1);
box-shadow: 0 2px 8px rgba(6, 189, 221, 0.3);
}
.upload-btn:active {
transform: translateY(1px);
box-shadow: 0 1px 4px rgba(6, 189, 221, 0.2);
}
.upload-icon {
font-size: 16px;
}
.file-info {
font-size: 14px;
color: #00FFB8;
min-height: 20px;
}
.file-tips {
font-size: 12px;
color: rgba(255, 255, 255, 0.6);
}
.form-actions {
display: flex;
justify-content: flex-end;
gap: 12px;
margin-top: 10px;
}
.btn-confirm,
.btn-cancel {
padding: 8px 24px;
border: none;
border-radius: 4px;
font-size: 14px;
font-weight: bold;
cursor: pointer;
transition: all 0.3s;
}
.btn-confirm {
background: linear-gradient(135deg, #06BDDD 0%, #00D4FF 100%);
color: #FFFFFF;
}
.btn-confirm:hover {
background: linear-gradient(135deg, #05A8C5 0%, #00B8E6 100%);
box-shadow: 0 4px 12px rgba(6, 189, 221, 0.4);
}
.btn-confirm:active {
transform: translateY(1px);
box-shadow: 0 2px 6px rgba(6, 189, 221, 0.3);
}
.btn-cancel {
background: rgba(255, 255, 255, 0.1);
color: #FFFFFF;
border: 1px solid rgba(255, 255, 255, 0.3);
}
.btn-cancel:hover {
background: rgba(255, 255, 255, 0.15);
border-color: rgba(255, 255, 255, 0.5);
}
.btn-cancel:active {
transform: translateY(1px);
}
2025-10-17 14:57:09 +08:00
</style>
</head>
<body>
2026-01-21 10:34:06 +08:00
<div id="proQuality">
2026-01-24 17:14:53 +08:00
<!-- 顶部日期筛选区域(与工程质量分析保持一致) -->
<div class="top-date-filter">
<div class="date-filter-label">日期范围:</div>
<div class="date-range-wrapper">
<input type="text" id="dateRange" class="search-input date-input" placeholder="请选择日期范围" readonly>
</div>
</div>
2026-01-21 10:34:06 +08:00
<!-- 主内容区域 -->
<div class="main-content">
<!-- 项目信息 - 第一行,占整个宽度 -->
<div class="panel panel-project-info">
<div class="panel-title">
<span class="title-indicator"></span>
<span class="title-text">项目信息</span>
2026-01-26 15:51:06 +08:00
2025-10-21 13:38:20 +08:00
</div>
2026-01-21 10:34:06 +08:00
<div class="panel-body">
<div class="project-info-content">
<!-- 土建工序进度 - 左上 -->
<div class="sub-module sub-module-civil-progress">
<div class="sub-module-title">
<span class="sub-title-indicator"></span>
2026-01-26 15:51:06 +08:00
<span style="flex: 1;">土建工序进度</span>
<span class="info-icon">
<img src="../../img/dataAnalysisOctober/common_icon.png" alt=""
style="cursor: pointer; width: 20px; height: 20px;margin-right: 10px;margin-top: 5px;">
</span>
</div>
<div class="tooltip-box">
土建总工序:统计土建专业所有工序数量 <br>
已完成工序:统计土建专业已完成工序的数量
2026-01-21 10:34:06 +08:00
</div>
<div class="sub-module-body">
<div class="progress-indicators">
<div class="progress-indicator">
<div class="progress-number" id="civilTotal">10</div>
<div class="progress-label">土建总工序</div>
</div>
<div class="progress-indicator">
<div class="progress-number" id="civilCompleted">5</div>
<div class="progress-label">已完成工序</div>
</div>
</div>
</div>
</div>
2025-10-21 13:38:20 +08:00
2026-01-21 10:34:06 +08:00
<!-- 电气工序进度 - 中上 -->
<div class="sub-module sub-module-electrical-progress">
<div class="sub-module-title">
<span class="sub-title-indicator"></span>
2026-01-26 15:51:06 +08:00
<span style="flex: 1;">电气工序进度</span>
<span class="info-icon">
<img src="../../img/dataAnalysisOctober/common_icon.png" alt=""
style="cursor: pointer; width: 20px; height: 20px;margin-right: 10px;margin-top: 5px;">
</span>
</div>
<div class="tooltip-box">
电气总工序:统计电气专业所有工序数量 <br>
已完成工序:统计电气专业已完成工序的数量
2026-01-21 10:34:06 +08:00
</div>
<div class="sub-module-body">
<div class="progress-indicators">
<div class="progress-indicator">
<div class="progress-number" id="electricalTotal">10</div>
<div class="progress-label">电气总工序</div>
</div>
<div class="progress-indicator">
<div class="progress-number" id="electricalCompleted">5</div>
<div class="progress-label">已完成工序</div>
</div>
</div>
</div>
</div>
2025-10-21 13:38:20 +08:00
2026-01-21 10:34:06 +08:00
<!-- 土建专业 - 右上占2列 -->
<div class="sub-module sub-module-civil-chart">
<div class="sub-module-title">
<span class="sub-title-indicator"></span>
2026-01-26 15:51:06 +08:00
<span style="flex: 1;">土建专业</span>
<span class="info-icon">
<img src="../../img/dataAnalysisOctober/common_icon.png" alt=""
style="cursor: pointer; width: 20px; height: 20px;margin-right: 10px;margin-top: 5px;">
</span>
</div>
<div class="tooltip-box">
数据取自e基建2.0,根据数据进
行工序阶段进度对比展示。
2026-01-21 10:34:06 +08:00
</div>
<div class="sub-module-body">
<div id="civilSpecialtyChart" class="chart-container"></div>
</div>
</div>
2025-10-21 13:38:20 +08:00
2026-01-21 10:34:06 +08:00
<!-- 风险分析 - 左下占2列 -->
<div class="sub-module sub-module-risk-analysis">
<div class="sub-module-title">
<span class="sub-title-indicator"></span>
2026-01-26 15:53:27 +08:00
<span style="flex: 1;">风险分析</span>
<span class="info-icon">
<img src="../../img/dataAnalysisOctober/common_icon.png" alt=""
style="cursor: pointer; width: 20px; height: 20px;margin-right: 10px;margin-top: 5px;">
</span>
</div>
<div class="tooltip-box">
系统获取e基建月计划数据分析统计
风险分类统计
月计划的各风险数量,对各风险数量进行
2026-01-21 10:34:06 +08:00
</div>
<div class="sub-module-body">
<div id="riskAnalysisChart" class="chart-container"></div>
</div>
</div>
2025-10-21 13:38:20 +08:00
2026-01-21 10:34:06 +08:00
<!-- 电气专业 - 右下占2列 -->
<div class="sub-module sub-module-electrical-chart">
<div class="sub-module-title">
<span class="sub-title-indicator"></span>
2026-01-26 15:51:06 +08:00
<span style="flex: 1;">电气专业</span>
<span class="info-icon">
<img src="../../img/dataAnalysisOctober/common_icon.png" alt=""
style="cursor: pointer; width: 20px; height: 20px;margin-right: 10px;margin-top: 5px;">
</span>
</div>
<div class="tooltip-box">
数据取自e基建2.0,根据数据进
行工序阶段进度对比展示。
2026-01-21 10:34:06 +08:00
</div>
<div class="sub-module-body">
<div id="electricalSpecialtyChart" class="chart-container"></div>
</div>
</div>
2025-10-17 14:57:09 +08:00
</div>
2026-01-21 10:34:06 +08:00
</div>
</div>
2025-10-17 14:57:09 +08:00
2026-01-21 10:34:06 +08:00
<!-- 项目支出趋势 - 第二行,左边 -->
<div class="panel panel-expenditure-trend">
<div class="panel-title">
<span class="title-indicator"></span>
<span class="title-text">项目支出趋势</span>
2026-01-26 15:51:06 +08:00
<span class="info-icon">
<img src="../../img/dataAnalysisOctober/common_icon.png" alt=""
style="cursor: pointer; width: 20px; height: 20px;margin-right: 10px;margin-top: 5px;">
</span>
</div>
<div class="tooltip-box">
系统后台记录项目支出信息,该
模块统计每月项目总支出,
2026-01-21 10:34:06 +08:00
</div>
<div class="panel-body">
<div id="expenditureTrendChart" class="chart-container"></div>
</div>
</div>
2025-10-17 14:57:09 +08:00
2026-01-21 10:34:06 +08:00
<!-- 项目支出占比 - 第二行,右边 -->
<div class="panel panel-expenditure-proportion">
<div class="panel-title">
<span class="title-indicator"></span>
<span class="title-text">项目支出占比</span>
2026-01-26 15:51:06 +08:00
<span class="info-icon">
<img src="../../img/dataAnalysisOctober/common_icon.png" alt=""
style="cursor: pointer; width: 20px; height: 20px;margin-right: 10px;margin-top: 5px;">
</span>
</div>
<div class="tooltip-box">
系统后台记录项目预算总费用。
支出占比:(支出费用之和÷总预算)×
100%
剩余占比100%-支出占比
2025-10-17 14:57:09 +08:00
</div>
2026-01-21 10:34:06 +08:00
<div class="panel-body">
<div id="expenditureProportionChart" class="chart-container"></div>
2025-10-17 14:57:09 +08:00
</div>
</div>
2026-01-21 10:34:06 +08:00
<!-- 项目风险 - 第三行左边2/3 -->
<div class="panel panel-project-risk">
<div class="panel-title">
<span class="title-indicator"></span>
<span class="title-text">项目风险</span>
2026-01-26 15:51:06 +08:00
<span class="info-icon">
<img src="../../img/dataAnalysisOctober/common_icon.png" alt=""
style="cursor: pointer; width: 20px; height: 20px;margin-right: 10px;margin-top: 5px;">
</span>
</div>
<div class="tooltip-box">
系统获取e基建月计划数据分析统计
风险分类统计
月计划的各风险数量,对各风险数量进行
2025-10-17 14:57:09 +08:00
</div>
2026-01-21 10:34:06 +08:00
<div class="panel-body">
<div class="risk-content-wrapper">
<div class="risk-chart-wrapper">
<div id="projectRiskChart" class="chart-container"></div>
2026-01-24 17:14:53 +08:00
<div class="total-risk-display" id="totalRiskDisplay">总风险数量0个</div>
2025-10-17 14:57:09 +08:00
</div>
2026-01-21 10:34:06 +08:00
<div class="risk-stats-wrapper">
<div class="risk-stat-item">
<div class="risk-stat-icon">📄</div>
<div class="risk-stat-content">
<div class="risk-stat-value" id="closedRisk">18</div>
<div class="risk-stat-label">已销号风险</div>
</div>
</div>
<div class="risk-stat-item">
<div class="risk-stat-icon">🛡️</div>
<div class="risk-stat-content">
<div class="risk-stat-value" id="remainingRisk">18</div>
<div class="risk-stat-label">剩余风险</div>
</div>
</div>
<div class="risk-stat-item">
<div class="risk-stat-icon">⚠️</div>
<div class="risk-stat-content">
<div class="risk-stat-value" id="remainingLevel2Risk">18</div>
<div class="risk-stat-label">剩余二级及以上风险</div>
</div>
2025-10-17 14:57:09 +08:00
</div>
</div>
</div>
</div>
2026-01-21 10:34:06 +08:00
</div>
<!-- 分析预警 - 第三行右边1/3 -->
<div class="panel panel-analysis-warning">
<div class="panel-title">
<span class="title-indicator"></span>
<span class="title-text">分析预警</span>
2026-01-26 15:51:06 +08:00
<span class="info-icon">
<img src="../../img/dataAnalysisOctober/common_icon.png" alt=""
style="cursor: pointer; width: 20px; height: 20px;margin-right: 10px;margin-top: 5px;">
</span>
</div>
<div class="tooltip-box">
进度分析预警实际进度小于计划进度10%,系统进行预警进度数据取自e
基建2.0 <br>
成本预警当月支出与上月支出环比增长率比大于10%,进行提醒,环比增
长率=(本月支出-上月支出÷上月支出×100% <br>
风险预警:当月出现二级及以上风险,系统自动预警提醒。
2026-01-21 10:34:06 +08:00
</div>
<div class="panel-body">
<div class="warning-tabs">
<div class="warning-tab active" data-type="all" onclick="filterWarning('all')">全部</div>
<div class="warning-tab" data-type="progress" onclick="filterWarning('progress')">进度</div>
<div class="warning-tab" data-type="cost" onclick="filterWarning('cost')">成本</div>
<div class="warning-tab" data-type="risk" onclick="filterWarning('risk')">风险</div>
</div>
<div class="warning-table-wrapper">
<table class="warning-table" id="warningTable">
<thead>
<tr>
<th>序号</th>
<th>预警时间</th>
<th>预警类别</th>
<th>预警内容</th>
<th>操作</th>
</tr>
</thead>
<tbody id="warningTableBody">
<!-- 数据将通过JS动态填充 -->
</tbody>
</table>
2025-10-17 14:57:09 +08:00
</div>
</div>
</div>
</div>
</div>
2026-01-24 19:13:29 +08:00
<!-- 定制措施弹框 -->
<div id="strategyModal" class="strategy-modal">
<div class="modal-overlay" onclick="closeStrategyModal()"></div>
<div class="modal-content">
<div class="modal-header">
<span class="modal-title">定制措施</span>
<span class="modal-close" onclick="closeStrategyModal()">×</span>
</div>
<div class="modal-body">
<div class="strategy-form">
<div class="form-item">
<label class="form-label">
<span class="required">*</span>应对措施
</label>
<textarea id="measureDataInput" class="form-textarea" placeholder="请输入应对措施"></textarea>
</div>
<div class="form-item">
<label class="form-label">附件</label>
<div class="upload-section">
<input type="file" id="fileInput" style="display: none;" accept=".doc,.docx,.pdf,.jpg,.png">
<button type="button" class="upload-btn"
onclick="document.getElementById('fileInput').click()">
<span class="upload-icon">📄</span>
<span>上传文件</span>
</button>
<div class="file-info" id="fileInfo"></div>
<div class="file-tips">支持格式: .doc .docx .pdf .jpg .png ,单个文件不能超过20MB</div>
</div>
</div>
<div class="form-actions">
<button type="button" class="btn-confirm" onclick="submitStrategy()">确定</button>
<button type="button" class="btn-cancel" onclick="closeStrategyModal()">取消</button>
</div>
</div>
</div>
</div>
</div>
2025-10-17 14:57:09 +08:00
</body>
<script src="../../js/pages/dataAnalysisOctober/projectManagement.js" type="text/javascript"></script>
2026-01-21 10:34:06 +08:00
</html>