hb_zhgd_screen/pages/dataAnalysisOctober/proQualityAnalysis.html

781 lines
23 KiB
HTML
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.

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<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">
<link rel="stylesheet" href="../../css/coreTable.css" />
<link rel="stylesheet" href="../../css/accessMge/accessMge.css">
<link rel="stylesheet" href="../../css/tipCommon.css">
<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/echarts.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>
<title>工程质量分析</title>
</head>
<body>
<div id="proQuality">
<!-- 顶部日期筛选区域 -->
<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>
<!-- 右侧主体区域 - Grid布局 -->
<div class="main-content">
<!-- 模块1: 施工队伍质量合格率 (左上) -->
<div class="module module-1">
<div class="module-title">
<span class="title-indicator"></span>
<span class="title-text" 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">
统计每个班组质量检测合格率排名。
合格率:该班组检测合格次数÷该班组检测总次数
×100%。
</div>
<div class="module-content">
<div id="teamQualityChart" class="chart-container"></div>
</div>
</div>
<!-- 模块2: 质量检测合格占比 (右上) -->
<div class="module module-2">
<div class="module-title">
<span class="title-indicator"></span>
<span class="title-text">质量检测合格占比</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">
合格占比合格总数量÷总检查数量×100%
不合格占比不合格总数量÷总检查数量×100%
</div>
<div class="module-content">
<div id="qualityRatioChart" class="chart-container"></div>
<div class="ratio-info">
<div class="ratio-item">
<span class="ratio-label">合格</span>
<span class="ratio-value" id="passRatio">65.00%</span>
</div>
<div class="ratio-item">
<span class="ratio-label">不合格</span>
<span class="ratio-value" id="failRatio">35.00%</span>
</div>
</div>
</div>
</div>
<!-- 模块3: 质量检测记录 (左下) -->
<div class="module module-3">
<div class="module-title">
<span class="title-indicator"></span>
<span class="title-text">质量检测记录</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">
项目经理根据现场检测报告,在系统后台进行班组施工
质量记录
</div>
<div class="module-content">
<div class="search-bar">
<input type="text" id="keywordInput" class="search-input" placeholder="请输入关键字">
<button type="button" class="search-btn" onclick="queryRecords()">查询</button>
</div>
<div class="table-container">
<table id="qualityRecordTable" lay-filter="qualityRecordTable"></table>
</div>
</div>
</div>
<!-- 模块4: 分析预警 (右下) -->
<div class="module module-4">
<div class="module-title">
<span class="title-indicator"></span>
<span class="title-text">分析预警</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">
质量检测合格率低于80%,系统预警提醒
</div>
<div class="module-content">
<div id="warningList" class="warning-list">
<!-- 警告项将通过JS动态生成 -->
</div>
</div>
</div>
</div>
</div>
<!-- 质量检测记录弹框 -->
<div id="qualityRecordModal" class="quality-record-modal">
<div class="modal-overlay" onclick="closeQualityRecordModal()"></div>
<div class="modal-content">
<div class="modal-header">
<span class="modal-title">质量检测记录</span>
<span class="modal-close" onclick="closeQualityRecordModal()">×</span>
</div>
<div class="modal-body">
<div class="modal-search-bar">
<input type="text" id="modalKeywordInput" class="search-input" placeholder="输入关键字">
<input type="text" id="modalDateRange" class="search-input date-input" placeholder="请选择日期范围"
readonly>
<button type="button" class="search-btn" onclick="queryModalRecords()">查询</button>
</div>
<div class="modal-table-container">
<table id="modalQualityRecordTable" lay-filter="modalQualityRecordTable"></table>
</div>
</div>
</div>
</div>
</body>
<style>
#proQuality {
width: 100%;
height: 100%;
/* padding: 1%; */
box-sizing: border-box;
overflow: hidden;
/* 防止产生滚动条 */
display: flex;
flex-direction: column;
}
/* 顶部日期筛选区域 */
.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;
}
.main-content {
flex: 1;
width: 100%;
height: 0;
display: grid;
grid-template-columns: 2fr 1fr;
grid-template-rows: 2fr 3fr;
gap: 6px;
overflow: hidden;
/* padding: 1%; */
box-sizing: border-box;
/* 防止grid产生滚动条 */
}
.module {
position: relative;
display: flex;
flex-direction: column;
/* padding: 2%; */
box-sizing: border-box;
overflow: hidden;
/* 防止模块内容撑开 */
min-height: 0;
/* 允许flex子元素缩小 */
/* background-size: 100% 100%;
background-position: center center;
background-repeat: no-repeat; */
}
.module-1 {
background-image: url("../../img/dataAnalysisOctober/proQualityAnalysis/common_bg.png");
}
.module-2 {
background-image: url("../../img/dataAnalysisOctober/proQualityAnalysis/common_bg.png");
}
.module-3 {
background-image: url("../../img/dataAnalysisOctober/proQualityAnalysis/common_bg.png");
}
.module-4 {
background-image: url("../../img/dataAnalysisOctober/proQualityAnalysis/common_bg.png");
}
.module-title {
display: flex;
align-items: center;
height: 40px;
min-height: 40px;
margin-bottom: 20px;
padding-left: 18px;
}
.title-indicator {
width: 4px;
height: 20px;
background: linear-gradient(180deg, #FF9C65 0%, #FFD700 100%);
margin-right: 10px;
flex-shrink: 0;
}
.title-text {
font-size: 16px;
font-weight: bold;
color: #FFFFFF;
white-space: nowrap;
}
.module-content {
flex: 1;
display: flex;
flex-direction: column;
overflow: hidden;
min-height: 0;
height: 0;
/* 配合flex:1使用确保不撑开 */
}
/* 模块1样式 - 柱状图 */
.module-1 .chart-container {
width: 100%;
height: 100%;
position: relative;
min-height: 0;
}
/* 模块2样式 - 环形图 */
.module-2 .module-content {
flex-direction: row;
align-items: center;
justify-content: space-around;
}
.module-2 .chart-container {
width: 60%;
height: 100%;
position: relative;
z-index: 1;
}
.ratio-info {
display: flex;
flex-direction: column;
gap: 15px;
width: 35%;
}
.ratio-item {
display: flex;
flex-direction: row;
align-items: center;
justify-content: space-between;
padding: 12px 15px;
background: rgba(13, 34, 37, 0.6);
border: 1px solid rgba(6, 189, 221, 0.6);
border-radius: 4px;
position: relative;
overflow: hidden;
}
/* 角部切角效果 */
.ratio-item::before {
content: '';
position: absolute;
top: 0;
right: 0;
width: 8px;
height: 8px;
background: transparent;
border-top: 2px solid rgba(6, 189, 221, 0.6);
border-right: 2px solid rgba(6, 189, 221, 0.6);
border-top-right-radius: 2px;
}
.ratio-item::after {
content: '';
position: absolute;
bottom: 0;
left: 0;
width: 8px;
height: 8px;
background: transparent;
border-bottom: 2px solid rgba(6, 189, 221, 0.6);
border-left: 2px solid rgba(6, 189, 221, 0.6);
border-bottom-left-radius: 2px;
}
.ratio-label {
font-size: 14px;
color: #FFFFFF;
font-weight: normal;
}
.ratio-value {
font-size: 18px;
font-weight: bold;
color: #00FFB8;
}
/* 模块3样式 - 表格 */
.module-3 .search-bar {
margin-left: 10px;
display: flex;
gap: 10px;
margin-bottom: 15px;
align-items: center;
}
.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-range-wrapper {
display: flex;
align-items: center;
gap: 8px;
flex-shrink: 0;
}
.date-input {
width: 240px;
}
.date-separator {
color: rgba(255, 255, 255, 0.6);
font-size: 14px;
flex-shrink: 0;
}
.search-btn {
height: 32px;
padding: 0 24px;
background: linear-gradient(135deg, #207E75 0%, #2A9D8F 100%);
border: none;
border-radius: 2px;
color: #FFFFFF;
cursor: pointer;
font-size: 14px;
transition: all 0.3s;
flex-shrink: 0;
}
.search-btn:hover {
background: linear-gradient(135deg, #2A9D8F 0%, #3AB5A5 100%);
box-shadow: 0 2px 8px rgba(6, 189, 221, 0.3);
}
.search-btn:active {
transform: translateY(1px);
}
.table-container {
flex: 1;
overflow-y: auto;
/* 只在垂直方向滚动 */
overflow-x: hidden;
/* 隐藏横向滚动 */
position: relative;
min-height: 0;
}
/* Layui表格样式覆盖 */
.module-3 .layui-table {
background-color: transparent !important;
}
.module-3 .layui-table thead tr {
background-color: rgba(13, 34, 37, 0.8) !important;
}
.module-3 .layui-table thead th {
background-color: transparent !important;
color: #FFFFFF !important;
border-color: rgba(6, 189, 221, 0.3) !important;
font-weight: bold;
}
.module-3 .layui-table tbody tr {
background-color: rgba(25, 62, 68, 0.3) !important;
}
.module-3 .layui-table tbody tr:hover {
background-color: rgba(25, 62, 68, 0.6) !important;
}
.module-3 .layui-table tbody td {
color: #FFFFFF !important;
border-color: rgba(6, 189, 221, 0.2) !important;
}
.module-3 .layui-table-page {
background-color: transparent !important;
border-top: 1px solid rgba(6, 189, 221, 0.3) !important;
padding: 10px 0 !important;
}
.module-3 .layui-table-page .layui-laypage {
margin: 0 !important;
}
.module-3 .layui-table-page .layui-laypage a,
.module-3 .layui-table-page .layui-laypage span {
color: #FFFFFF !important;
background-color: rgba(25, 62, 68, 0.6) !important;
border-color: rgba(6, 189, 221, 0.5) !important;
}
.module-3 .layui-table-page .layui-laypage .layui-laypage-curr em {
background-color: #207E75 !important;
color: #FFFFFF !important;
}
.module-3 .layui-table-page .layui-laypage a:hover {
background-color: rgba(6, 189, 221, 0.6) !important;
border-color: rgba(6, 189, 221, 0.8) !important;
}
.module-3 .layui-table-page input {
background-color: rgba(25, 62, 68, 0.6) !important;
border-color: rgba(6, 189, 221, 0.5) !important;
color: #FFFFFF !important;
}
/* 模块4样式 - 警告列表 */
.module-4 .module-content {
overflow: hidden;
/* 隐藏滚动条,使用无缝滚动 */
padding: 0 15px;
/* 两侧padding */
position: relative;
}
.warning-list {
width: 100%;
display: flex;
flex-direction: column;
gap: 10px;
position: relative;
}
/* 当启用滚动时移除gap改用margin */
.warning-list-scroll {
gap: 0;
will-change: transform;
/* 优化动画性能 */
}
.warning-list-scroll .warning-item {
margin-bottom: 10px;
}
/* 确保最后一个item也有间距但最后一份的最后一个不需要 */
.warning-list-scroll .warning-item:last-of-type {
margin-bottom: 10px;
}
.warning-item {
display: flex;
align-items: flex-start;
padding: 10px 15px;
/* 两侧padding */
background: rgba(25, 62, 68, 0.3);
border-left: 3px solid #FF6B6B;
border-radius: 2px;
flex-shrink: 0;
/* 防止压缩 */
}
.warning-icon {
width: 20px;
height: 20px;
margin-right: 10px;
flex-shrink: 0;
background-image: url("../../img/dataAnalysisOctober/proQualityAnalysis/icon.png");
background-size: contain;
background-repeat: no-repeat;
background-position: center;
}
.warning-text {
flex: 1;
font-size: 14px;
color: #FFFFFF;
line-height: 1.5;
overflow: hidden;
/* 隐藏溢出 */
text-overflow: ellipsis;
/* 显示省略号 */
white-space: nowrap;
/* 不换行 */
min-width: 0;
/* 允许flex子元素缩小 */
}
/* 无缝滚动动画 */
@keyframes scrollWarning {
from {
transform: translateY(0);
}
to {
transform: translateY(-50%);
}
}
/* 确保动画能正常工作 */
.warning-list-scroll {
animation-name: scrollWarning;
animation-timing-function: linear;
animation-iteration-count: infinite;
}
/* 鼠标悬停时暂停滚动 */
.module-4:hover .warning-list-scroll {
animation-play-state: paused;
}
/* 滚动条样式 */
.module-content::-webkit-scrollbar,
.table-container::-webkit-scrollbar,
.warning-list::-webkit-scrollbar {
width: 6px;
height: 6px;
}
.module-content::-webkit-scrollbar-track,
.table-container::-webkit-scrollbar-track,
.warning-list::-webkit-scrollbar-track {
background: rgba(13, 34, 37, 0.5);
border-radius: 3px;
}
.module-content::-webkit-scrollbar-thumb,
.table-container::-webkit-scrollbar-thumb,
.warning-list::-webkit-scrollbar-thumb {
background: rgba(6, 189, 221, 0.5);
border-radius: 3px;
}
.module-content::-webkit-scrollbar-thumb:hover,
.table-container::-webkit-scrollbar-thumb:hover,
.warning-list::-webkit-scrollbar-thumb:hover {
background: rgba(6, 189, 221, 0.8);
}
/* 质量检测记录弹框样式 */
.quality-record-modal {
display: none;
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
z-index: 9999;
}
.quality-record-modal.show {
display: flex;
align-items: center;
justify-content: center;
}
.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: 80%;
height: 70%;
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: 10000;
}
.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;
}
.modal-search-bar {
display: flex;
gap: 10px;
margin-bottom: 15px;
align-items: center;
flex-shrink: 0;
}
.modal-table-container {
flex: 1;
overflow-y: auto;
overflow-x: hidden;
min-height: 0;
}
/* 弹框内表格样式 */
#modalQualityRecordTable .layui-table {
background-color: transparent !important;
}
#modalQualityRecordTable .layui-table thead tr {
background-color: rgba(13, 34, 37, 0.8) !important;
}
#modalQualityRecordTable .layui-table thead th {
background-color: transparent !important;
color: #FFFFFF !important;
border-color: rgba(6, 189, 221, 0.3) !important;
font-weight: bold;
}
#modalQualityRecordTable .layui-table tbody tr {
background-color: rgba(25, 62, 68, 0.3) !important;
}
#modalQualityRecordTable .layui-table tbody tr:hover {
background-color: rgba(25, 62, 68, 0.6) !important;
}
#modalQualityRecordTable .layui-table tbody td {
color: #FFFFFF !important;
border-color: rgba(6, 189, 221, 0.2) !important;
}
#modalQualityRecordTable .layui-table-page {
background-color: transparent !important;
border-top: 1px solid rgba(6, 189, 221, 0.3) !important;
padding: 10px 0 !important;
}
#modalQualityRecordTable .layui-table-page .layui-laypage {
margin: 0 !important;
}
#modalQualityRecordTable .layui-table-page .layui-laypage a,
#modalQualityRecordTable .layui-table-page .layui-laypage span {
color: #FFFFFF !important;
background-color: rgba(25, 62, 68, 0.6) !important;
border-color: rgba(6, 189, 221, 0.5) !important;
}
#modalQualityRecordTable .layui-table-page .layui-laypage .layui-laypage-curr em {
background-color: #207E75 !important;
color: #FFFFFF !important;
}
#modalQualityRecordTable .layui-table-page .layui-laypage a:hover {
background-color: rgba(6, 189, 221, 0.6) !important;
border-color: rgba(6, 189, 221, 0.8) !important;
}
#modalQualityRecordTable .layui-table-page input {
background-color: rgba(25, 62, 68, 0.6) !important;
border-color: rgba(6, 189, 221, 0.5) !important;
color: #FFFFFF !important;
}
</style>
<script src="../../js/pages/dataAnalysisOctober/proQualityAnalysis.js" type="text/javascript"></script>
</html>