Prechádzať zdrojové kódy

大屏优化,提交结果将工位数据去除

jingbo 5 mesiacov pred
rodič
commit
0c65292c58

+ 9 - 0
src/main/java/com/jeesite/modules/mes/service/MesProductRecordService.java

@@ -748,6 +748,15 @@ public class MesProductRecordService extends CrudService<MesProductRecordDao, Me
 			}
 		}
 
+
+		// 将工位当前工件去除
+		MesProcessProduct mesProcessProduct = new MesProcessProduct();
+		mesProcessProduct.setOprno(oldOprno);
+		mesProcessProduct.setProductCate(lineSn);
+		MesProcessProduct mesProcessProduct1 = mesProcessProductService.get(mesProcessProduct);
+		mesProcessProduct1.setSn("");
+		mesProcessProductService.update(mesProcessProduct1);
+
 		// 下线工位
 		MesLineProcess mesLineProcess = mesLineProcessService.getOffLineOprno(lineSn);
 		String xxOprno = ObjectUtils.isEmpty(mesLineProcess)?"":mesLineProcess.getOprno();

+ 27 - 20
src/main/java/com/jeesite/modules/mes/web/MesProductController.java

@@ -455,8 +455,11 @@ public class MesProductController extends BaseController {
 		mesProduct1.setState("1");
 		Long actualCount = mesProductService.findCount(mesProduct1);
 		data.put("actual", actualCount);
-
-		data.put("plan", 660);
+		String planCount = Global.getConfig("mes.planCount");
+		if (planCount == null || planCount.equals("")){
+			planCount = "0";
+		}
+		data.put("plan", planCount);
 		int scrapCount = mesScrapService.findList(new MesScrap()).size();
 		data.put("scrap", scrapCount);
 
@@ -531,7 +534,7 @@ public class MesProductController extends BaseController {
 
 		//工具剩余寿命查询
 		MesToolLife mesToolLifeQuery = new MesToolLife();
-		mesToolLifeQuery.setStatus("1");
+		mesToolLifeQuery.setStatus("0");
 		List<MesToolLife> toolLifeList = mesToolLifeService.findList(mesToolLifeQuery);
 		logger.info("工具寿命查询结果数量: " + (toolLifeList != null ? toolLifeList.size() : 0));
 
@@ -552,11 +555,16 @@ public class MesProductController extends BaseController {
 		List<String> dateList = new ArrayList<>();
 		List<Long> outputList = new ArrayList<>();
 		Calendar calendar = Calendar.getInstance();
+		calendar.set(Calendar.HOUR_OF_DAY, 0);
+		calendar.set(Calendar.MINUTE, 0);
+		calendar.set(Calendar.SECOND, 0);
+		calendar.set(Calendar.MILLISECOND, 0);
 		for (int i = 6; i >= 0; i--) {
-			calendar.add(Calendar.DATE, -i);
-			int year = calendar.get(Calendar.YEAR);
-			int month = calendar.get(Calendar.MONTH) + 1;
-			int day = calendar.get(Calendar.DAY_OF_MONTH);
+			Calendar dayCal = (Calendar) calendar.clone();
+			dayCal.add(Calendar.DATE, -i);
+			int year = dayCal.get(Calendar.YEAR);
+			int month = dayCal.get(Calendar.MONTH) + 1;
+			int day = dayCal.get(Calendar.DAY_OF_MONTH);
 			String dateStr = month + "月" + day + "日";
 			dateList.add(dateStr);
 
@@ -598,19 +606,18 @@ public class MesProductController extends BaseController {
 		data.put("quality1", quality1);
 		data.put("quality2", quality2);
 
-		List<Map<String, Object>> oprnoData = new ArrayList<>();
-		MesLineProcess mesLineProcess = new MesLineProcess();
-		mesLineProcess.setStatus("0");
-		mesLineProcess.getSqlMap().getWhere().and("pid", QueryType.IS_NULL, "");
-		List<MesLineProcess> processList1 = mesLineProcessService.findList(mesLineProcess);
-		for (MesLineProcess process : processList1) {
-			String dayOks = mesProductRecordService.getSjOk(process.getOprno(), process.getLineSn(), sdate1, edate1);
-			Map<String, Object> oprnoMap = MapUtils.newHashMap();
-			oprnoMap.put("oprno", process.getOprno());
-			oprnoMap.put("okNum", Integer.valueOf(dayOks));
-			oprnoData.add(oprnoMap);
-		}
-		data.put("oprnoData", oprnoData);
+		List<Map<String, Object>> workStationData = new ArrayList<>();
+		MesProcessProduct processProductQuery = new MesProcessProduct();
+		List<MesProcessProduct> processProductList = mesProcessProductService.findList(processProductQuery);
+		logger.info("查询到的工位当前工件数量: " + (processProductList != null ? processProductList.size() : 0));
+		for (MesProcessProduct pp : processProductList) {
+			Map<String, Object> item = MapUtils.newHashMap();
+			item.put("oprno", pp.getOprno());
+			item.put("sn", pp.getSn());
+			workStationData.add(item);
+			logger.info("工位: " + pp.getOprno() + ", 工件: " + pp.getSn());
+		}
+		data.put("workStationData", workStationData);
 
 		// 查询返修问题清单并统计每个问题类型的返修数量
 		List<String> defectTitles = new ArrayList<>();

+ 264 - 298
src/main/resources/views/modules/mes/mesScreen4.html

@@ -853,105 +853,18 @@
             document.getElementById('mes3Time').textContent = pad(h) + ':' + pad(mi) + ':' + pad(s);
         }
 
-        // ====== 各窗口测试数据 ======
-        var mockData = {};
 
-        function generateMockData() {
-            // 近7日日期标签
-            var now = new Date();
-            var weekLabels = [];
-            for (var i = 6; i >= 0; i--) {
-                var d = new Date(now);
-                d.setDate(d.getDate() - i);
-                weekLabels.push((d.getMonth() + 1) + '月' + d.getDate() + '日');
-            }
-
-            // 1. 近七日产量折线图 (左1)
-            mockData.productTrend = {
-                labels: weekLabels,
-                data: [1100, 1100, 1200, 1125, 1125, 1180, 1150],
-                max: 1300, min: 1000
-            };
-
-            // 2. 近七日产品检验盘点 (左2) - 产出/不良 双柱状图
-            mockData.qualityInspect = {
-                labels: weekLabels,
-                produced: [400, 321, 354, 164, 241, 342, 231],
-                defect: [345, 256, 312, 123, 214, 286, 189],
-                max: 500
-            };
-
-            // 3. 不良类型柱状图 (左3)
-            mockData.defectType = {
-                labels: ['故障A', '故障B', '电阻设备', '焊接', '铸锭', '故障C', '故障D'],
-                data: [480, 380, 220, 180, 60, 200, 80],
-                max: 500
-            };
-
-            // 4. 达成率数据分析 - 近七日达成率 (右1)
-            mockData.achieveRate = {
-                labels: weekLabels,
-                target: [1150, 1160, 1180, 1165, 1180, 1180, 1170],
-                actual: [1150, 1160, 1180, 1165, 1180, 1200, 1170],
-                max: 1300, min: 1000
-            };
-            mockData.todayRate = 80;
-            mockData.monthRate = 70;
-
-            // 5. 每小时上下线数据分析 (右2) - 24小时
-            var hourLabels = [];
-            var upLine = [], downLine = [];
-            for (var i = 1; i <= 24; i++) {
-                hourLabels.push(pad(i));
-                upLine.push(Math.round(60 + Math.random() * 40));
-                downLine.push(Math.round(50 + Math.random() * 40));
-            }
-            mockData.hourlyData = {
-                labels: hourLabels,
-                up: upLine,
-                down: downLine,
-                max: 120
-            };
-
-            // 6. 报警信息 (右3)
-            mockData.alerts = [
-                {no: 1, text: 'HEV产线不良率超过10%'},
-                {no: 2, text: 'B13产线不良率超过5%'},
-                {no: 3, text: 'HEV产线不良率超过3%'},
-                {no: 4, text: 'B13产线不良率超过3%'}
-            ];
-
-            // 7. 设备故障统计分析 - 故障类型排名
-            mockData.faultRank = [
-                {rank: 'No.1', name: '机构故障', count: 10, percent: 100, top: 1},
-                {rank: 'No.2', name: '电控故障', count: 8, percent: 80, top: 2},
-                {rank: 'No.3', name: '辅助设备故障', count: 6, percent: 60},
-                {rank: 'No.4', name: '突发故障', count: 4, percent: 40},
-                {rank: 'No.5', name: '故障类型1', count: 2, percent: 20}
-            ];
-            // 近七日设备故障分析
-            mockData.faultAnalysis = {
-                labels: weekLabels,
-                faultTime: [25, 35, 45, 35, 30, 40, 43],
-                faultRate: [40, 60, 100, 55, 55, 60, 65],
-                maxTime: 60, maxRate: 120
-            };
-
-            // 6个数据卡片
-            mockData.cards = {
-                productionPeople: 48,
-                deviceCount: 56,
-                planProduction: 221,
-                actualProduction: 225,
-                repairCount: 11,
-                scrapCount: 10
-            };
-        }
 
         // 不良类型柱状图 - ECharts版本
         function initDefectChart(labels, data) {
             let chartDom = document.getElementById('chartLeft3');
             if (!chartDom) return;
+            
+            if (!labels || labels.length === 0 || !data || data.length === 0) {
+                chartDom.innerHTML = '<div style="display:flex;align-items:center;justify-content:center;height:100%;color:#4DC9F5;font-size:14px;">暂无数据</div>';
+                return;
+            }
+            
             let myChart = echarts.init(chartDom);
             
             let option = {
@@ -995,7 +908,7 @@
                         name: '返修数量',
                         type: 'bar',
                         data: data || [],
-                        barWidth: '40%',
+                        barWidth: 30,
                         itemStyle: {
                             color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
                                 { offset: 0, color: '#00C8FF' },
@@ -1030,6 +943,12 @@
         function initProductionChart(xData, yData) {
             let chartDom = document.getElementById('chartLeft1');
             if (!chartDom) return;
+            
+            if (!xData || xData.length === 0 || !yData || yData.length === 0) {
+                chartDom.innerHTML = '<div style="display:flex;align-items:center;justify-content:center;height:100%;color:#4DC9F5;font-size:14px;">暂无数据</div>';
+                return;
+            }
+            
             let myChart = echarts.init(chartDom);
 
             let option = {
@@ -1143,17 +1062,52 @@
         }
 
         // 工位当前工件表格初始化
+        var alarmListData = [];
+        var alarmListTimer = null;
+        var alarmListPage = 0;
+        var alarmListPageSize = 5;
+
         function initAlarmList(tableData) {
-            if (!tableData || tableData.length === 0) {
+            alarmListData = tableData || [];
+            alarmListPage = 0;
+            if (alarmListTimer) {
+                clearInterval(alarmListTimer);
+            }
+            
+            if (!alarmListData || alarmListData.length === 0) {
                 $('#alarmList').html('<div style="text-align:center;color:#4DC9F5;padding-top:20px;">暂无数据</div>');
                 return;
             }
-            let html = '';
-            for (let i = 0; i < tableData.length; i++) {
-                let item = tableData[i];
-                let rowClass = (i + 1) % 2 !== 0 ? 'odd' : 'even';
+            
+            renderAlarmListPage();
+            
+            if (alarmListData.length > alarmListPageSize) {
+                alarmListTimer = setInterval(function() {
+                    alarmListPage++;
+                    if (alarmListPage * alarmListPageSize >= alarmListData.length) {
+                        alarmListPage = 0;
+                    }
+                    renderAlarmListPage();
+                }, 3000);
+            }
+        }
+        
+        function renderAlarmListPage() {
+            if (!alarmListData || alarmListData.length === 0) {
+                $('#alarmList').html('<div style="text-align:center;color:#4DC9F5;padding-top:20px;">暂无数据</div>');
+                return;
+            }
+            
+            var start = alarmListPage * alarmListPageSize;
+            var end = Math.min(start + alarmListPageSize, alarmListData.length);
+            var pageData = alarmListData.slice(start, end);
+            
+            var html = '';
+            for (var i = 0; i < pageData.length; i++) {
+                var item = pageData[i];
+                var rowClass = (i + 1) % 2 !== 0 ? 'odd' : 'even';
                 html += '<div class="alarm-row ' + rowClass + '">';
-                html += '  <div class="col-idx">' + item.id + '</div>';
+                html += '  <div class="col-idx">' + (start + i + 1) + '</div>';
                 html += '  <div class="col-info">' + item.msg + '</div>';
                 html += '</div>';
             }
@@ -1161,113 +1115,113 @@
         }
 
         // 工具寿命柱状图初始化
-        function initToolLifeChart(faultx, faulty1) {
-            let chartDom = document.getElementById('toolLifeChart');
-            if (!chartDom) return;
-            let myChart = echarts.init(chartDom);
+        var toolLifeData = { faultx: [], faulty1: [] };
+        var toolLifeTimer = null;
+        var toolLifePage = 0;
+        var toolLifePageSize = 5;
 
-            function insertEnter(str, n) {
-                var len = str.length;
-                var strTemp = '';
-                if (len > n) {
-                    strTemp = str.substring(0, n);
-                    str = str.substring(n, len);
-                    return strTemp + '\n' + str;
-                } else {
-                    return str;
-                }
+        function initToolLifeChart(faultx, faulty1) {
+            toolLifeData.faultx = faultx || [];
+            toolLifeData.faulty1 = faulty1 || [];
+            toolLifePage = 0;
+            if (toolLifeTimer) {
+                clearInterval(toolLifeTimer);
+            }
+            
+            if (!toolLifeData.faultx || toolLifeData.faultx.length === 0 || 
+                !toolLifeData.faulty1 || toolLifeData.faulty1.length === 0) {
+                $('#toolLifeChart').html('<div style="display:flex;align-items:center;justify-content:center;height:100%;color:#4DC9F5;font-size:14px;">暂无数据</div>');
+                return;
+            }
+            
+            renderToolLifeChart();
+            
+            if (toolLifeData.faultx.length > toolLifePageSize) {
+                toolLifeTimer = setInterval(function() {
+                    toolLifePage++;
+                    if (toolLifePage * toolLifePageSize >= toolLifeData.faultx.length) {
+                        toolLifePage = 0;
+                    }
+                    renderToolLifeChart();
+                }, 3000);
+            }
+        }
+        
+        function renderToolLifeChart() {
+            if (!toolLifeData.faultx || toolLifeData.faultx.length === 0 || 
+                !toolLifeData.faulty1 || toolLifeData.faulty1.length === 0) {
+                $('#toolLifeChart').html('<div style="display:flex;align-items:center;justify-content:center;height:100%;color:#4DC9F5;font-size:14px;">暂无数据</div>');
+                return;
             }
+            
+            var start = toolLifePage * toolLifePageSize;
+            var end = Math.min(start + toolLifePageSize, toolLifeData.faultx.length);
+            var pageFaultx = toolLifeData.faultx.slice(start, end);
+            var pageFaulty1 = toolLifeData.faulty1.slice(start, end);
+            
+            var chartDom = document.getElementById('toolLifeChart');
+            if (!chartDom) return;
+            
+            var myChart = echarts.init(chartDom);
 
-            let option = {
+            var option = {
                 grid: {
-                    top: '5%',
-                    left: '35%',
-                    right: '15%',
+                    top: '10%',
+                    left: '15%',
+                    right: '10%',
                     bottom: '15%',
                     containLabel: false
                 },
                 xAxis: {
-                    type: 'value',
-                    show: true,
-                    splitLine: { show: false },
+                    type: 'category',
+                    data: pageFaultx,
+                    axisTick: { show: false },
                     axisLine: {
                         show: true,
                         lineStyle: { color: '#2A4E77' }
                     },
-                    axisTick: { show: false },
                     axisLabel: {
-                        show: true,
                         color: '#fff',
-                        fontSize: 12
+                        fontSize: 12,
+                        interval: 0,
+                        rotate: 30,
+                        textStyle: {
+                            overflow: 'truncate',
+                            width: 80
+                        }
                     }
                 },
                 yAxis: {
-                    type: 'category',
-                    data: faulty1 || ['工具1', '工具2', '工具3', '工具4', '工具5'],
+                    type: 'value',
+                    splitLine: { show: false },
+                    axisLine: {
+                        show: true,
+                        lineStyle: { color: '#2A4E77' }
+                    },
                     axisTick: { show: false },
-                    axisLine: { show: false },
                     axisLabel: {
                         color: '#fff',
-                        fontSize: 14,
-                        interval: 0,
-                        lineHeight: 18,
-                        formatter: function (value) {
-                            let formatValue = insertEnter(value, 4);
-                            if (value.indexOf('机构') > -1) {
-                                return '{no1| } ' + formatValue;
-                            } else if (value.indexOf('电控') > -1) {
-                                return '{no2| } ' + formatValue;
-                            } else if (value.indexOf('辅助') > -1) {
-                                return '{no3| } ' + formatValue;
-                            }
-                            return formatValue;
-                        },
-                        rich: {
-                            no1: {
-                                width: 40,
-                                height: 20,
-                                align: 'center',
-                                verticalAlign: 'middle',
-                                padding: [0, 5, 11, 0],
-                                backgroundColor: { image: '/static/screen/imgs/srcrowNO1.png' },
-                                formatter: ' '
-                            },
-                            no2: {
-                                width: 40,
-                                height: 20,
-                                align: 'center',
-                                verticalAlign: 'middle',
-                                padding: [0, 5, 11, 0],
-                                backgroundColor: { image: '/static/screen/imgs/srcrowNO2.png' },
-                                formatter: ' '
-                            },
-                            no3: {
-                                width: 40,
-                                height: 20,
-                                align: 'center',
-                                verticalAlign: 'middle',
-                                padding: [0, 5, 11, 0],
-                                backgroundColor: { image: '/static/screen/imgs/srcrowNO3.png' },
-                                formatter: ' '
-                            }
-                        }
+                        fontSize: 12
                     }
                 },
                 series: [
                     {
                         name: '剩余寿命',
                         type: 'bar',
-                        data: faultx || [100, 80, 60, 40, 20],
-                        barWidth: 15,
+                        data: pageFaulty1,
+                        barWidth: 25,
                         itemStyle: {
-                            color: '#4FFFFF',
-                            barBorderRadius: [0, 10, 10, 0]
+                            color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+                                { offset: 0, color: '#00C8FF' },
+                                { offset: 1, color: 'rgba(0, 200, 255, 0.3)' }
+                            ]),
+                            barBorderRadius: [4, 4, 0, 0]
                         },
                         label: {
                             show: true,
-                            position: 'right',
+                            position: 'top',
                             color: '#fff',
-                            fontSize: 14,
+                            fontSize: 12,
                             formatter: '{c}'
                         }
                     }
@@ -1282,12 +1236,14 @@
         function initFaultAnalysisChart(dates, rates, deviceCounts) {
             let chartDom = document.getElementById('faultAnalysisChart');
             if (!chartDom) return;
+            
+            if (!dates || dates.length === 0) {
+                chartDom.innerHTML = '<div style="display:flex;align-items:center;justify-content:center;height:100%;color:#4DC9F5;font-size:14px;">暂无故障</div>';
+                return;
+            }
+            
             let myChart = echarts.init(chartDom);
 
-            let faultDates = dates || ['05月03日', '05月04日', '05月05日', '05月06日', '05月07日', '05月08日', '05月09日'];
-            let faultRates = rates || [12.5, 15.2, 10.8, 18.3, 14.6, 16.2, 13.8];
-            let faultDeviceCounts = deviceCounts || [5, 6, 4, 7, 6, 6, 5];
-
             let option = {
                 grid: {
                     top: '15%',
@@ -1299,7 +1255,7 @@
                 xAxis: [
                     {
                         type: 'category',
-                        data: faultDates,
+                        data: dates,
                         axisLine: {
                             show: true,
                             lineStyle: { color: '#2A4E77' }
@@ -1312,7 +1268,7 @@
                     },
                     {
                         type: 'category',
-                        data: faultDates,
+                        data: dates,
                         gridIndex: 0,
                         show: false
                     }
@@ -1364,7 +1320,7 @@
                         type: 'line',
                         xAxisIndex: 0,
                         yAxisIndex: 0,
-                        data: faultRates,
+                        data: rates,
                         smooth: true,
                         symbol: 'circle',
                         symbolSize: 6,
@@ -1396,7 +1352,7 @@
                         type: 'bar',
                         xAxisIndex: 1,
                         yAxisIndex: 1,
-                        data: faultDeviceCounts,
+                        data: deviceCounts,
                         barWidth: '40%',
                         itemStyle: {
                             color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
@@ -1424,6 +1380,12 @@
             let container = document.getElementById('faultRankContainer');
             if (!container) return;
 
+            // 检查数据是否为空
+            if (!types || types.length === 0 || !counts || counts.length === 0) {
+                container.innerHTML = '<div style="display:flex;align-items:center;justify-content:center;height:100%;color:#4DC9F5;font-size:14px;">暂无故障</div>';
+                return;
+            }
+
             // 确保数据不为空
             let faultTypes = types || ['机构故障', '电控故障', '辅助设备故障', '突发故障', '故障类型1'];
             let faultCounts = counts || [10, 8, 6, 4, 2];
@@ -1633,133 +1595,158 @@
         }
 
         // 渲染报警信息列表
-        function renderAlerts() {
-            var list = mockData.alerts || [];
+        var alertsData = [];
+        var alertsTimer = null;
+        var alertsPage = 0;
+        var alertsPageSize = 4;
+
+        function renderAlerts(list) {
+            alertsData = list || [];
+            alertsPage = 0;
+            if (alertsTimer) {
+                clearInterval(alertsTimer);
+            }
+            
+            if (!alertsData || alertsData.length === 0) {
+                $('#alertList').html('<div style="text-align:center;color:#4DC9F5;padding-top:20px;">暂无数据</div>');
+                return;
+            }
+            
+            renderAlertsPage();
+            
+            if (alertsData.length > alertsPageSize) {
+                alertsTimer = setInterval(function() {
+                    alertsPage++;
+                    if (alertsPage * alertsPageSize >= alertsData.length) {
+                        alertsPage = 0;
+                    }
+                    renderAlertsPage();
+                }, 3000);
+            }
+        }
+        
+        function renderAlertsPage() {
+            if (!alertsData || alertsData.length === 0) {
+                $('#alertList').html('<div style="text-align:center;color:#4DC9F5;padding-top:20px;">暂无数据</div>');
+                return;
+            }
+            
+            var start = alertsPage * alertsPageSize;
+            var end = Math.min(start + alertsPageSize, alertsData.length);
+            var pageData = alertsData.slice(start, end);
+            
             var html = '';
-            if (list.length === 0) {
-                html = '<div style="text-align:center;color:#4DC9F5;padding-top:20px;">暂无报警</div>';
-            } else {
-                for (var i = 0; i < list.length; i++) {
-                    html += '<div class="mes3-alert-item">';
-                    html += '<div class="alert-no">' + list[i].no + '</div>';
-                    html += '<div class="alert-text">' + list[i].text + '</div>';
-                    html += '</div>';
-                }
+            for (var i = 0; i < pageData.length; i++) {
+                var item = pageData[i];
+                html += '<div class="mes3-alert-item">';
+                html += '<div class="alert-no">' + (start + i + 1) + '</div>';
+                html += '<div class="alert-text">' + item.text + '</div>';
+                html += '</div>';
             }
-            var el = document.getElementById('alertList');
-            if (el) el.innerHTML = html;
+            $('#alertList').html(html);
         }
 
         // 渲染数据卡片和达成率数字
-        function renderTextData() {
-            var c = mockData.cards || {};
-            var map = {
-                productionPeople: c.productionPeople,
-                deviceCount: c.deviceCount,
-                planProduction: c.planProduction,
-                actualProduction: c.actualProduction,
-                repairCount: c.repairCount,
-                scrapCount: c.scrapCount,
-                todayRate: mockData.todayRate,
-                monthRate: mockData.monthRate
-            };
-            for (var k in map) {
-                var el = document.getElementById(k);
-                if (el && map[k] != null) el.textContent = map[k];
+        function renderTextData(data) {
+            if (!data) {
+                $("#workers").text("-");
+                $("#devices").text("-");
+                $("#plan").text("-");
+                $("#actual").text("-");
+                $("#repair").text("-");
+                $("#scrap").text("-");
+                return;
             }
+            $("#workers").text(data.workers != null ? data.workers : "-");
+            $("#devices").text(data.devices != null ? data.devices : "-");
+            $("#plan").text(data.plan != null ? data.plan : "-");
+            $("#actual").text(data.actual != null ? data.actual : "-");
+            $("#repair").text(data.repair != null ? data.repair : "-");
+            $("#scrap").text(data.scrap != null ? data.scrap : "-");
         }
 
         function refreshData() {
-            // 调用后端接口获取数据
             $.post("/js/a/mes/mesProduct/screenData4", function(ret) {
                 if (ret.result === "true" && ret.data) {
                     var data = ret.data;
-                    // 更新数据卡片
-                    $("#workers").text(data.workers || 0);
-                    $("#devices").text(data.devices || 0);
-                    $("#plan").text(data.plan || 0);
-                    $("#actual").text(data.actual || 0);
-                    $("#repair").text(data.repair || 0);
-                    $("#scrap").text(data.scrap || 0);
                     
-                    // 先生成mock数据作为基础
-                    generateMockData();
+                    renderTextData(data);
                     
-                    // 如果接口返回了近七日产量数据(date和output),使用真实数据
-                    if (data.date && data.output && data.date.length > 0 && data.output.length > 0) {
-                        mockData.productTrend = {
-                            labels: data.date,
-                            data: data.output.map(function(item) { return item || 0; }),
-                            max: 1300,
-                            min: 0
-                        };
-                    }
-                    
-                    // 如果接口返回了报警数据,使用真实数据
+                    var alertData = [];
                     if (data.alarms && data.alarms.length > 0) {
-                        mockData.alerts = data.alarms.map(function(item, index) {
+                        alertData = data.alarms.map(function(item, index) {
                             return {
                                 no: index + 1,
                                 text: item.msg || ''
                             };
                         });
-                    } else {
-                        mockData.alerts = [];
                     }
+                    renderAlerts(alertData);
                     
-                    // 如果接口返回了不良类型数据,使用真实数据
-                    if (data.defectTitles && data.defectCounts && data.defectTitles.length > 0 && data.defectCounts.length > 0) {
-                        mockData.defectType = {
-                            labels: data.defectTitles,
-                            data: data.defectCounts.map(function(item) { return item || 0; }),
-                            max: Math.max.apply(null, data.defectCounts) || 500
-                        };
+                    var workStationData = [];
+                    if (data.workStationData && data.workStationData.length > 0) {
+                        workStationData = data.workStationData.map(function(item, index) {
+                            return {
+                                id: index + 1,
+                                msg: (item.oprno || '') + '-' + (item.sn || '')
+                            };
+                        });
                     }
+                    initAlarmList(workStationData);
                     
-                    // 如果接口返回了故障类型排名数据,使用真实数据
-                    if (data.alarmTypes && data.alarmCounts && data.alarmTypes.length > 0 && data.alarmCounts.length > 0) {
-                        mockData.faultRank = {
-                            types: data.alarmTypes,
-                            counts: data.alarmCounts.map(function(item) { return item || 0; })
-                        };
-                    }
+                    initToolLifeChart(
+                        data.faultx || [],
+                        (data.faulty1 || []).map(function(item) { return Number(item); })
+                    );
                     
-                    // 初始化故障类型排名图
-                    initFaultRankChart(data.alarmTypes || [], data.alarmCounts || []);
+                    var productLabels = data.date || [];
+                    var productData = (data.output || []).map(function(item) {
+                        return Number(item);
+                    });
+                    initProductionChart(productLabels, productData);
                     
-                    // 如果接口返回了近七日故障率数据,使用真实数据
-                    if (data.faultDates && data.faultRates && data.faultDates.length > 0 && data.faultRates.length > 0) {
-                        mockData.faultAnalysis = {
-                            dates: data.faultDates,
-                            rates: data.faultRates.map(function(item) { return item || 0; })
-                        };
-                    }
+                    var defectLabels = data.defectTitles || [];
+                    var defectData = (data.defectCounts || []).map(function(item) {
+                        return Number(item);
+                    });
+                    initDefectChart(defectLabels, defectData);
                     
-                    // 初始化近七日设备故障分析折线图
-                    initFaultAnalysisChart(data.faultDates || [], data.faultRates || [], data.faultDeviceCounts || []);
+                    var alarmTypeList = data.alarmTypes || [];
+                    var alarmCountList = (data.alarmCounts || []).map(function(item) {
+                        return Number(item);
+                    });
+                    initFaultRankChart(alarmTypeList, alarmCountList);
+                    
+                    var faultRateList = (data.faultRates || []).map(function(item) {
+                        return Number(item);
+                    });
+                    var faultDeviceCountList = (data.faultDeviceCounts || []).map(function(item) {
+                        return Number(item);
+                    });
+                    initFaultAnalysisChart(data.faultDates || [], faultRateList, faultDeviceCountList);
                     
-                    renderTextData();
-                    renderAlerts();
-                    initToolLifeChart(data.faulty1 || [], data.faultx || []);
-                    drawAllCharts();
                     initHourlyChart();
                     fetchHourlyData();
                 } else {
-                    // 接口调用失败,使用mock数据
-                    generateMockData();
-                    renderTextData();
-                    renderAlerts();
-                    initToolLifeChart([100, 80, 60, 40, 20], ['工具1', '工具2', '工具3', '工具4', '工具5']);
-                    drawAllCharts();
+                    renderTextData(null);
+                    renderAlerts([]);
+                    initAlarmList([]);
+                    initToolLifeChart([], []);
+                    initProductionChart([], []);
+                    initDefectChart([], []);
+                    initFaultRankChart([], []);
+                    initFaultAnalysisChart([], [], []);
                     initHourlyChart();
                 }
             }).fail(function() {
-                // 请求失败,使用mock数据
-                generateMockData();
-                renderTextData();
-                renderAlerts();
-                initToolLifeChart([100, 80, 60, 40, 20], ['工具1', '工具2', '工具3', '工具4', '工具5']);
-                drawAllCharts();
+                renderTextData(null);
+                renderAlerts([]);
+                initAlarmList([]);
+                initToolLifeChart([], []);
+                initProductionChart([], []);
+                initDefectChart([], []);
+                initFaultRankChart([], []);
+                initFaultAnalysisChart([], [], []);
                 initHourlyChart();
             });
         }
@@ -1770,27 +1757,8 @@
             $('body').css({'zoom': wb >= hb ? hb : wb});
         }
 
-        function drawAllCharts() {
-            // 左1:近七日产量折线图 (使用ECharts)
-            var d1 = mockData.productTrend;
-            if (d1) initProductionChart(d1.labels, d1.data);
-
-            // 左3:不良类型柱状图 (使用ECharts)
-            var d3 = mockData.defectType;
-            if (d3) initDefectChart(d3.labels, d3.data);
-
-            // 中下:设备故障统计分析
-            // 左:故障类型排名图 (使用ECharts)
-            var d4a = mockData.faultRank;
-            if (d4a) initFaultRankChart(d4a.types, d4a.counts);
-            // 右:近七日设备故障分析(已改用ECharts,由initFaultAnalysisChart处理)
-
-            // 右2:每小时上下线数据(已改用ECharts,由initHourlyChart/fetchHourlyData处理)
-        }
-
         $(window).resize(function() {
             changeZoom();
-            drawAllCharts();
         });
 
         $(function() {
@@ -1801,8 +1769,6 @@
 
             // 每2分钟刷新一次数据
             setInterval(refreshData, 1000 * 60 * 2);
-            // 每秒重绘一次(应对 resize 或 zoom 变化)
-            setInterval(drawAllCharts, 1000);
         });
     })();
 </script>