|
|
@@ -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>
|