721 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
			
		
		
	
	
			721 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
| <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ManPowerStat.aspx.cs" Inherits="FineUIPro.Web.JDGL.SGManPower.ManPowerStat" %>
 | ||
| 
 | ||
| <!DOCTYPE html>
 | ||
| <html>
 | ||
| <head id="Head1" runat="server">
 | ||
|     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 | ||
|     <title>人力统计</title>
 | ||
|     <link href="../../res/index/css/reset.css" rel="stylesheet" />
 | ||
|     <link href="../../res/index/css/home.css" rel="stylesheet" />
 | ||
|     <link href="../../res/index/css/swiper-3.4.2.min.css" rel="stylesheet" />
 | ||
|     <style type="text/css">
 | ||
|         * {
 | ||
|             box-sizing: border-box;
 | ||
|         }
 | ||
| 
 | ||
|         .flexV {
 | ||
|             flex-direction: column;
 | ||
|         }
 | ||
| 
 | ||
|         .wrap {
 | ||
|             height: 100%;
 | ||
|             padding: 15px;
 | ||
|             background-color: #FFFFFF;
 | ||
|         }
 | ||
| 
 | ||
|         .iteml {
 | ||
|             margin-left: 5px;
 | ||
|         }
 | ||
| 
 | ||
|         .itemb {
 | ||
|             margin-bottom: 5px;
 | ||
|         }
 | ||
| 
 | ||
|         .bottom-wrap {
 | ||
|             padding: 0;
 | ||
|             margin-bottom: 5px;
 | ||
|         }
 | ||
| 
 | ||
|             .bottom-wrap:last-child {
 | ||
|                 margin-bottom: 0;
 | ||
|             }
 | ||
| 
 | ||
|         .bw-b-bottom {
 | ||
|             width: 100%;
 | ||
|             height: 100%;
 | ||
|         }
 | ||
| 
 | ||
|         .bw-b-bottom-up {
 | ||
|             border-radius: 0;
 | ||
|             height: 100%;
 | ||
|             margin: 0;
 | ||
|             box-shadow: none;
 | ||
|         }
 | ||
| 
 | ||
|         .bw-item-content {
 | ||
|             padding: 5px;
 | ||
|         }
 | ||
| 
 | ||
|         .top {
 | ||
|             width: 100%;
 | ||
|         }
 | ||
| 
 | ||
|         .bw-b {
 | ||
|             width: 50%;
 | ||
|         }
 | ||
| 
 | ||
|         .tab-wrap {
 | ||
|             left: auto;
 | ||
|             right: 15px;
 | ||
|             top: 5px;
 | ||
|             font-size: 12px;
 | ||
|         }
 | ||
| 
 | ||
|         .tab .t-item {
 | ||
|             width: auto;
 | ||
|             padding: 5px 10px;
 | ||
|             color: #363636;
 | ||
|         }
 | ||
| 
 | ||
|         .tit-item {
 | ||
|             padding: 0 10px;
 | ||
|             justify-content: space-between;
 | ||
|             font-size: 12px;
 | ||
|         }
 | ||
| 
 | ||
|         .tab-wrap .tab .t-item {
 | ||
|             color: #1C1C1C;
 | ||
|         }
 | ||
| 
 | ||
|         .tip-item {
 | ||
|             margin-left: 10px;
 | ||
|             align-items: center;
 | ||
|             font-size: 10px;
 | ||
|         }
 | ||
| 
 | ||
|         .tip {
 | ||
|             width: 25px;
 | ||
|             height: 13px;
 | ||
|             background-color: #258F76;
 | ||
|             border-radius: 2px;
 | ||
|             margin-right: 5px;
 | ||
|         }
 | ||
| 
 | ||
|         .tip-next {
 | ||
|             background-color: #4F4F4F;
 | ||
|         }
 | ||
| 
 | ||
|         .myTableClass {
 | ||
|             width: 100%;
 | ||
|             height: 100%;
 | ||
|             overflow: auto;
 | ||
|             margin: 2px 1px;
 | ||
|             border-collapse: collapse;
 | ||
|             border: 1px solid #BEBEBE;
 | ||
|             background: #ffffff;
 | ||
|             color: #8B8989;
 | ||
|             text-align: center;
 | ||
|             font-size: 14px;
 | ||
|         }
 | ||
| 
 | ||
|         .tab-title {
 | ||
|             height: 48px;
 | ||
|             color: #3CB371;
 | ||
|             font-size: 16px;
 | ||
|             font-weight: 700;
 | ||
|         }
 | ||
| 
 | ||
|         .tab-header {
 | ||
|             height: 36px;
 | ||
|             color: #1C86EE;
 | ||
|             font-size: 14px;
 | ||
|             font-weight: 600;
 | ||
|         }
 | ||
| 
 | ||
|         td, th {
 | ||
|             border: 1px solid #BEBEBE;
 | ||
|         }
 | ||
|         .container {
 | ||
|             display: flex;
 | ||
|             flex-direction: column;
 | ||
|             height: 100%;
 | ||
|         }
 | ||
|         
 | ||
|         .filter-options {
 | ||
|             justify-content: flex-end;
 | ||
|             padding: 10px;
 | ||
|             background-color: #f8f8f8;
 | ||
|             border-bottom: 1px solid #ddd;
 | ||
|         }
 | ||
|         
 | ||
|         .filter-options label {
 | ||
|             margin-left: 10px;
 | ||
|             font-size: 14px;
 | ||
|             color: #333;
 | ||
|         }
 | ||
|         
 | ||
|         .filter-options input[type="radio"] {
 | ||
|             margin-right: 5px;
 | ||
|         }
 | ||
|         
 | ||
|         .loading-overlay {
 | ||
|             position: fixed;
 | ||
|             top: 0;
 | ||
|             left: 0;
 | ||
|             width: 100%;
 | ||
|             height: 100%;
 | ||
|             background: rgba(0, 0, 0, 0.5);
 | ||
|             display: none;
 | ||
|             justify-content: center;
 | ||
|             align-items: center;
 | ||
|             z-index: 9999;
 | ||
|         }
 | ||
|         
 | ||
|         .loading-spinner {
 | ||
|             width: 50px;
 | ||
|             height: 50px;
 | ||
|             border: 5px solid #f3f3f3;
 | ||
|             border-top: 5px solid #3498db;
 | ||
|             border-radius: 50%;
 | ||
|             animation: spin 1s linear infinite;
 | ||
|         }
 | ||
|         
 | ||
|         @keyframes spin {
 | ||
|             0% { transform: rotate(0deg); }
 | ||
|             100% { transform: rotate(360deg); }
 | ||
|         }
 | ||
|         
 | ||
|         .chart-container {
 | ||
|             width: 100%;
 | ||
|             height: 100%;
 | ||
|             min-height: 300px;
 | ||
|         }
 | ||
|         
 | ||
|         .error-message {
 | ||
|             color: red;
 | ||
|             text-align: center;
 | ||
|             padding: 20px;
 | ||
|             display: none;
 | ||
|         }
 | ||
|     </style>
 | ||
| </head>
 | ||
| <body>
 | ||
|     <div class="container">
 | ||
|         <div class="filter-options">
 | ||
|             <label>
 | ||
|                 <input type="radio" name="data-filter" value="total" checked> 总数
 | ||
|             </label>
 | ||
|             <label>
 | ||
|                 <input type="radio" name="data-filter" value="annual"> 年度
 | ||
|             </label>
 | ||
|             <select id="year-select" style="display: none; margin-left: 10px; padding: 2px; font-size: 14px;">
 | ||
|                 <!-- 年份选项将通过JavaScript动态填充 -->
 | ||
|             </select>
 | ||
|             <label>
 | ||
|                 <input type="radio" name="data-filter" value="monthly"> 月度
 | ||
|             </label>
 | ||
|             <select id="month-select" style="display: none; margin-left: 10px; padding: 2px; font-size: 14px;">
 | ||
|                 <option value="1">1月</option>
 | ||
|                 <option value="2">2月</option>
 | ||
|                 <option value="3">3月</option>
 | ||
|                 <option value="4">4月</option>
 | ||
|                 <option value="5">5月</option>
 | ||
|                 <option value="6">6月</option>
 | ||
|                 <option value="7">7月</option>
 | ||
|                 <option value="8">8月</option>
 | ||
|                 <option value="9">9月</option>
 | ||
|                 <option value="10">10月</option>
 | ||
|                 <option value="11">11月</option>
 | ||
|                 <option value="12">12月</option>
 | ||
|             </select>
 | ||
|         </div>
 | ||
|         <div class="wrap flex flexV">
 | ||
|             <div class="bottom-wrap flex1">
 | ||
|                 <div class="top flex">
 | ||
|                     <div class="item flex2 iteml">
 | ||
|                         <div class="bw-b-bottom">
 | ||
|                             <div class="bw-b-bottom-up">
 | ||
|                                 <div class="bw-item-content">
 | ||
|                                     <div id='one' class="chart-container"></div>
 | ||
|                                     <div id='one-error' class="error-message"></div>
 | ||
|                                 </div>
 | ||
|                             </div>
 | ||
|                         </div>
 | ||
|                     </div>
 | ||
|                     <div class="item flex2 iteml">
 | ||
|                         <div class="bw-b-bottom">
 | ||
|                             <div class="bw-b-bottom-up">
 | ||
|                                 <div class="bw-item-content">
 | ||
|                                     <div id='two' class="chart-container"></div>
 | ||
|                                     <div id='two-error' class="error-message"></div>
 | ||
|                                 </div>
 | ||
|                             </div>
 | ||
|                         </div>
 | ||
|                     </div>
 | ||
|                 </div>
 | ||
|             </div>
 | ||
|             <div class="bottom-wrap flex1">
 | ||
|                 <div class="top flex">
 | ||
|                     <div class="item flex2 iteml">
 | ||
|                         <div class="bw-b-bottom">
 | ||
|                             <div class="bw-b-bottom-up">
 | ||
|                                 <div class="bw-item-content">
 | ||
|                                     <div id='three' class="chart-container"></div>
 | ||
|                                     <div id='three-error' class="error-message"></div>
 | ||
|                                 </div>
 | ||
|                             </div>
 | ||
|                         </div>
 | ||
|                     </div>
 | ||
|     
 | ||
|                     <div class="item flex2 iteml">
 | ||
|                         <div class="bw-b-bottom">
 | ||
|                             <div class="bw-b-bottom-up">
 | ||
|                                 <div class="bw-item-content">
 | ||
|                                     <div id='four' class="chart-container"></div>
 | ||
|                                     <div id='four-error' class="error-message"></div>
 | ||
|                                 </div>
 | ||
|                             </div>
 | ||
|                         </div>
 | ||
|                     </div>
 | ||
|                 </div>
 | ||
|             </div>
 | ||
|         </div>
 | ||
|     </div>
 | ||
|     
 | ||
|     <!-- 加载动画 -->
 | ||
|     <div id="loadingOverlay" class="loading-overlay">
 | ||
|         <div class="loading-spinner"></div>
 | ||
|     </div>
 | ||
| </body>
 | ||
| <script type="text/javascript" src="../../res/index/js/jquery-3.4.1.min.js"></script>
 | ||
| <script type="text/javascript" src="../../res/index/js/swiper-3.4.2.jquery.min.js"></script>
 | ||
| <script type="text/javascript" src="../../res/index/js/echarts.min.js"></script>
 | ||
| 
 | ||
| <script type="text/javascript">
 | ||
|     // 存储各图表的实例
 | ||
|     var chartInstances = {};
 | ||
|     
 | ||
|     // 页面加载完成后初始化图表
 | ||
|     $(document).ready(function() {
 | ||
|         // 填充年份下拉框
 | ||
|         populateYearSelect();
 | ||
|         
 | ||
|         // 获取当前URL中的type参数,如果没有则默认为total
 | ||
|         var urlParams = new URLSearchParams(window.location.search);
 | ||
|         var currentType = urlParams.get('type') || 'total';
 | ||
|         
 | ||
|         // 设置对应的单选按钮为选中状态
 | ||
|         $('input[name="data-filter"][value="' + currentType + '"]').prop('checked', true);
 | ||
|         
 | ||
|         // 根据选中的类型显示/隐藏年份下拉框
 | ||
|         toggleYearSelect(currentType);
 | ||
|         
 | ||
|         // 初始化图表
 | ||
|         loadAndRenderCharts(currentType);
 | ||
|         
 | ||
|         // 监听单选按钮变化事件
 | ||
|         $('input[name="data-filter"]').change(function() {
 | ||
|             var dataType = $(this).val();
 | ||
|             toggleYearSelect(dataType);
 | ||
|         });
 | ||
|         
 | ||
|         // 监听年份下拉框变化事件
 | ||
|         $('#year-select').change(function() {
 | ||
|             var dataType = $('input[name="data-filter"]:checked').val();
 | ||
|             if (dataType === 'annual' || dataType === 'monthly') {
 | ||
|                 loadAndRenderCharts(dataType);
 | ||
|             }
 | ||
|         });
 | ||
|         
 | ||
|         // 监听月份下拉框变化事件
 | ||
|         $('#month-select').change(function() {
 | ||
|             var dataType = $('input[name="data-filter"]:checked').val();
 | ||
|             if (dataType === 'monthly') {
 | ||
|                 loadAndRenderCharts(dataType);
 | ||
|             }
 | ||
|         });
 | ||
|     });
 | ||
|     
 | ||
|     // 填充年份下拉框
 | ||
|     function populateYearSelect() {
 | ||
|         var currentYear = new Date().getFullYear();
 | ||
|         var yearSelect = $('#year-select');
 | ||
|         
 | ||
|         // 添加最近10年的选项
 | ||
|         for (var i = currentYear; i >= currentYear - 10; i--) {
 | ||
|             yearSelect.append($('<option></option>').attr('value', i).text(i));
 | ||
|         }
 | ||
|         
 | ||
|         // 默认选中当前年份
 | ||
|         yearSelect.val(currentYear);
 | ||
|     }
 | ||
|     
 | ||
|     // 根据选中的数据类型显示/隐藏年份下拉框
 | ||
|     function toggleYearSelect(dataType) {
 | ||
|         if (dataType === 'annual') {
 | ||
|             $('#year-select').show();
 | ||
|             $('#month-select').hide();
 | ||
|             // 不再立即触发数据查询,只显示年份选择框
 | ||
|         } else if (dataType === 'monthly') {
 | ||
|             $('#year-select').show();
 | ||
|             $('#month-select').show();
 | ||
|             // 不再立即触发数据查询,只显示年份和月份选择框
 | ||
|         } else {
 | ||
|             $('#year-select').hide();
 | ||
|             $('#month-select').hide();
 | ||
|         }
 | ||
|     }
 | ||
|     
 | ||
|     // 通过Ajax加载数据并渲染图表
 | ||
|     function loadAndRenderCharts(type) {
 | ||
|         // 显示加载状态
 | ||
|         showLoading();
 | ||
|         
 | ||
|         // 隐藏所有错误信息
 | ||
|         $('.error-message').hide();
 | ||
|         
 | ||
|         // 获取选中的年份或月份
 | ||
|         var selectedYear = $('#year-select').val();
 | ||
|         var selectedMonth = $('#month-select').val();
 | ||
|         
 | ||
|         // 使用Ajax并行获取四个图表的数据
 | ||
|         $.when(
 | ||
|             $.ajax({
 | ||
|                 url: 'ManPowerStat.aspx/GetChartData',
 | ||
|                 type: 'POST',
 | ||
|                 data: JSON.stringify(createParams(type, 'One', selectedYear, selectedMonth)),
 | ||
|                 contentType: 'application/json; charset=utf-8',
 | ||
|                 dataType: 'json',
 | ||
|                 timeout: 30000 // 30秒超时
 | ||
|             }),
 | ||
|             $.ajax({
 | ||
|                 url: 'ManPowerStat.aspx/GetChartData',
 | ||
|                 type: 'POST',
 | ||
|                 data: JSON.stringify(createParams(type, 'Two', selectedYear, selectedMonth)),
 | ||
|                 contentType: 'application/json; charset=utf-8',
 | ||
|                 dataType: 'json',
 | ||
|                 timeout: 30000
 | ||
|             }),
 | ||
|             $.ajax({
 | ||
|                 url: 'ManPowerStat.aspx/GetChartData',
 | ||
|                 type: 'POST',
 | ||
|                 data: JSON.stringify(createParams(type, 'Three', selectedYear, selectedMonth)),
 | ||
|                 contentType: 'application/json; charset=utf-8',
 | ||
|                 dataType: 'json',
 | ||
|                 timeout: 30000
 | ||
|             }),
 | ||
|             $.ajax({
 | ||
|                 url: 'ManPowerStat.aspx/GetChartData',
 | ||
|                 type: 'POST',
 | ||
|                 data: JSON.stringify(createParams(type, 'Four', selectedYear, selectedMonth)),
 | ||
|                 contentType: 'application/json; charset=utf-8',
 | ||
|                 dataType: 'json',
 | ||
|                 timeout: 30000
 | ||
|             })
 | ||
|         ).done(function(oneResult, twoResult, threeResult, fourResult) {
 | ||
|             try {
 | ||
|                 // 渲染四个图表
 | ||
|                 renderChart('one', oneResult[0].d, '五环管理人员统计分析');
 | ||
|                 renderChart('two', twoResult[0].d, '施工单位管理人员统计分析');
 | ||
|                 renderChart('three', threeResult[0].d, '作业人员统计分析');
 | ||
|                 renderChart('four', fourResult[0].d, '过程人力统计分析');
 | ||
|             } catch (e) {
 | ||
|                 console.error('图表渲染错误:', e);
 | ||
|                 showError('图表渲染失败,请重试');
 | ||
|             }
 | ||
|             
 | ||
|             // 隐藏加载状态
 | ||
|             hideLoading();
 | ||
|         }).fail(function(jqXHR, textStatus, errorThrown) {
 | ||
|             // 处理错误情况
 | ||
|             console.error('Ajax请求失败:', textStatus, errorThrown);
 | ||
|             console.error('响应内容:', jqXHR.responseText);
 | ||
|             
 | ||
|             var errorMessage = '数据加载失败';
 | ||
|             if (textStatus === 'timeout') {
 | ||
|                 errorMessage = '请求超时,请重试';
 | ||
|             } else if (jqXHR.responseText) {
 | ||
|                 try {
 | ||
|                     var errorResponse = JSON.parse(jqXHR.responseText);
 | ||
|                     if (errorResponse.Message) {
 | ||
|                         errorMessage = errorResponse.Message;
 | ||
|                     }
 | ||
|                 } catch (e) {
 | ||
|                     errorMessage = jqXHR.responseText;
 | ||
|                 }
 | ||
|             }
 | ||
|             
 | ||
|             showError(errorMessage);
 | ||
|             hideLoading();
 | ||
|         });
 | ||
|     }
 | ||
|     
 | ||
|     // 创建传递给后端的参数对象
 | ||
|     function createParams(type, chart, year, month) {
 | ||
|         debugger
 | ||
|         var params = { 
 | ||
|             type: type, 
 | ||
|             chart: chart ,
 | ||
|             year:null,
 | ||
|             month:null,
 | ||
|         };
 | ||
|         
 | ||
|         // 只有在需要时才添加year和month参数
 | ||
|         if (type === 'annual' && year) {
 | ||
|             params.year = year;
 | ||
|         } else if (type === 'monthly' && year && month) {
 | ||
|             params.year = year;
 | ||
|             params.month = month;
 | ||
|         }
 | ||
|         
 | ||
|         // 确保参数对象中不包含值为undefined的属性
 | ||
|         for (var key in params) {
 | ||
|             if (params[key] === undefined) {
 | ||
|                 delete params[key];
 | ||
|             }
 | ||
|         }
 | ||
|         
 | ||
|         return params;
 | ||
|     }
 | ||
|     
 | ||
|     // 渲染单个图表的通用方法
 | ||
|     function renderChart(chartId, data, title) {
 | ||
|         try {
 | ||
|             // 隐藏错误信息
 | ||
|             $('#' + chartId + '-error').hide();
 | ||
|             
 | ||
|             // 解析数据
 | ||
|             var chartData;
 | ||
|             if (typeof data === 'string') {
 | ||
|                 chartData = JSON.parse(data);
 | ||
|             } else {
 | ||
|                 chartData = data;
 | ||
|             }
 | ||
|             
 | ||
|             // 验证数据
 | ||
|             if (!chartData || !chartData.categories || !chartData.series) {
 | ||
|                 throw new Error('数据格式不正确');
 | ||
|             }
 | ||
|             
 | ||
|             // 如果图表实例已存在,先销毁
 | ||
|             if (chartInstances[chartId]) {
 | ||
|                 chartInstances[chartId].dispose();
 | ||
|             }
 | ||
|             
 | ||
|             var chartContainer = document.getElementById(chartId);
 | ||
|             if (!chartContainer) {
 | ||
|                 throw new Error('找不到图表容器: ' + chartId);
 | ||
|             }
 | ||
|             
 | ||
|             var myChart = echarts.init(chartContainer);
 | ||
|             var xArr = chartData.categories;
 | ||
|             var num = chartData.xFontNum || 6;
 | ||
|             
 | ||
|             // 确保series数据存在
 | ||
|             var seriesData = [];
 | ||
|             if (chartData.series && chartData.series.length >= 2) {
 | ||
|                 seriesData = [
 | ||
|                     {
 | ||
|                         name: '计划',
 | ||
|                         type: 'line',
 | ||
|                         data: chartData.series[1].data || [],
 | ||
|                         label: {
 | ||
|                             show: true,
 | ||
|                             position: 'top',
 | ||
|                             textStyle: {
 | ||
|                                 fontSize: '12px',
 | ||
|                                 color: '#363636'
 | ||
|                             },
 | ||
|                             formatter: function (params) {
 | ||
|                                 return params.value === 0 ? '' : params.value;
 | ||
|                             },
 | ||
|                         },
 | ||
|                         itemStyle: { normal: { color: 'rgba(255,0,0, 0.5)' } },
 | ||
|                         smooth: true
 | ||
|                     },
 | ||
|                     {
 | ||
|                         name: '实际',
 | ||
|                         type: 'line',
 | ||
|                         data: chartData.series[0].data || [],
 | ||
|                         label: {
 | ||
|                             show: true,
 | ||
|                             position: 'top',
 | ||
|                             textStyle: {
 | ||
|                                 fontSize: '12px',
 | ||
|                                 color: '#363636'
 | ||
|                             },
 | ||
|                             formatter: function (params) {
 | ||
|                                 return params.value === 0 ? '' : params.value;
 | ||
|                             },
 | ||
|                         },
 | ||
|                         itemStyle: { normal: { color: 'rgba(0,100,0,0.8)' } },
 | ||
|                         smooth: true
 | ||
|                     }
 | ||
|                 ];
 | ||
|             }
 | ||
|             
 | ||
|             var option = {
 | ||
|                 title: {
 | ||
|                     text: title,
 | ||
|                     textStyle: {
 | ||
|                         color: '#1C1C1C',
 | ||
|                         fontSize: 16,
 | ||
|                         fontWeight: 700
 | ||
|                     },
 | ||
|                     show: true
 | ||
|                 },
 | ||
|                 tooltip: {},
 | ||
|                 legend: {
 | ||
|                     left: '80%',
 | ||
|                     show: true,
 | ||
|                     textStyle: {
 | ||
|                         color: '#363636',
 | ||
|                         fontSize: 12,
 | ||
|                     }
 | ||
|                 },
 | ||
|                 dataZoom: [
 | ||
|                     {
 | ||
|                         type: 'slider',
 | ||
|                         maxValueSpan: 6,
 | ||
|                         show: xArr && xArr.length > 6, // 只有数据超过6个才显示缩放
 | ||
|                         xAxisIndex: [0],
 | ||
|                         bottom: 0, height: 10,
 | ||
|                         backgroundColor: 'rgba(0,0,0,0)',
 | ||
|                         borderColor: 'none',
 | ||
|                         brushSelect: false,
 | ||
|                         textStyle: {
 | ||
|                             color: 'rgba(0,0,0,0)'
 | ||
|                         },
 | ||
|                         selectedDataBackground: {
 | ||
|                             areaStyle: {
 | ||
|                                 color: 'red',
 | ||
|                                 borderWidth: 0
 | ||
|                             }
 | ||
|                         },
 | ||
|                         handleStyle: {
 | ||
|                             color: "#0a1449"
 | ||
|                         },
 | ||
|                         moveHandleStyle: {
 | ||
|                             color: '#0a1449'
 | ||
|                         }
 | ||
|                     }
 | ||
|                 ],
 | ||
|                 xAxis: {
 | ||
|                     axisTick: {
 | ||
|                         show: false
 | ||
|                     },
 | ||
|                     axisLine: {
 | ||
|                         lineStyle: {
 | ||
|                             color: 'rgba(0,0,0, 0.3)',
 | ||
|                         }
 | ||
|                     },
 | ||
|                     axisLabel: {
 | ||
|                         show: true,
 | ||
|                         textStyle: {
 | ||
|                             color: 'rgba(0,0,0, 0.8)'
 | ||
|                         },
 | ||
|                         interval: 0,
 | ||
|                         rotate: -15,
 | ||
|                         formatter: function (value) {
 | ||
|                             if (!value) return '';
 | ||
|                             var ret = "";
 | ||
|                             var maxLength = num;
 | ||
|                             var valLength = value.length;
 | ||
|                             var rowN = Math.ceil(valLength / maxLength);
 | ||
|                             if (rowN > 1) {
 | ||
|                                 for (var i = 0; i < rowN; i++) {
 | ||
|                                     var temp = "";
 | ||
|                                     var start = i * maxLength;
 | ||
|                                     var end = start + maxLength;
 | ||
|                                     temp = value.substring(start, end) + (i == rowN - 1 ? "" : "\n");
 | ||
|                                     ret += temp;
 | ||
|                                 }
 | ||
|                                 return ret;
 | ||
|                             } else {
 | ||
|                                 return value;
 | ||
|                             }
 | ||
|                         }
 | ||
|                     },
 | ||
|                     type: 'category',
 | ||
|                     data: xArr || [],
 | ||
|                     boundaryGap: [0, 0.01],
 | ||
|                 },
 | ||
|                 yAxis: {
 | ||
|                     axisTick: {
 | ||
|                         show: false
 | ||
|                     },
 | ||
|                     axisLine: {
 | ||
|                         show: false,
 | ||
|                         lineStyle: {
 | ||
|                             color: 'rgba(0,0,0, 0.3)'
 | ||
|                         }
 | ||
|                     },
 | ||
|                     axisLabel: {
 | ||
|                         show: true,
 | ||
|                         textStyle: {
 | ||
|                             color: 'rgba(0,0,0, 0.8)'
 | ||
|                         }
 | ||
|                     },
 | ||
|                 },
 | ||
|                 series: seriesData,
 | ||
|                 grid: {
 | ||
|                     top: '20%',
 | ||
|                     left: '0%',
 | ||
|                     right: '0%',
 | ||
|                     bottom: 40,
 | ||
|                     containLabel: true,
 | ||
|                     backgroundColor: 'rgba(0,162,233, 0.01)',
 | ||
|                 },
 | ||
|                 backgroundColor: 'rgba(0,162,233, 0.01)',
 | ||
|                 textStyle: {
 | ||
|                     color: 'rgba(0,0,0, 0.3)'
 | ||
|                 }
 | ||
|             };
 | ||
|             
 | ||
|             myChart.setOption(option);
 | ||
|             chartInstances[chartId] = myChart;
 | ||
|             
 | ||
|             // 监听窗口大小变化,重新调整图表大小
 | ||
|             var resizeHandler = function() {
 | ||
|                 if (chartInstances[chartId]) {
 | ||
|                     chartInstances[chartId].resize();
 | ||
|                 }
 | ||
|             };
 | ||
|             
 | ||
|             // 避免重复绑定事件
 | ||
|             if (window.addEventListener) {
 | ||
|                 window.removeEventListener('resize', resizeHandler);
 | ||
|                 window.addEventListener('resize', resizeHandler);
 | ||
|             }
 | ||
|         } catch (e) {
 | ||
|             console.error('渲染图表失败 [' + chartId + ']:', e);
 | ||
|             showError('图表渲染失败: ' + e.message, chartId);
 | ||
|         }
 | ||
|     }
 | ||
|     
 | ||
|     // 显示错误信息
 | ||
|     function showError(message, chartId) {
 | ||
|         if (chartId) {
 | ||
|             $('#' + chartId + '-error').text(message).show();
 | ||
|         } else {
 | ||
|             // 全局错误显示
 | ||
|             alert(message);
 | ||
|         }
 | ||
|     }
 | ||
|     
 | ||
|     // 显示加载状态
 | ||
|     function showLoading() {
 | ||
|         document.getElementById('loadingOverlay').style.display = 'flex';
 | ||
|     }
 | ||
|     
 | ||
|     // 隐藏加载状态
 | ||
|     function hideLoading() {
 | ||
|         document.getElementById('loadingOverlay').style.display = 'none';
 | ||
|     }
 | ||
| </script>
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| </html>
 |