This repo is archived. You can view files and clone it, but cannot push or open issues or pull requests.
SXS20240115/SRC/iMES_PAD/module/moduleWIP/service/DashboardService.js
2024-01-24 16:47:50 +08:00

707 lines
40 KiB
JavaScript
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.

//DashboardService
define(["angularAMD",
"text!module/moduleWIP/config/dashboard.json",
"text!module/moduleCustomer/config/dashboard.json"
],
function(angularAMD, dashboardConfig, c_dashboardConfig) {
angularAMD.factory('DashboardService', ['$rootScope', '$filter', '$translate', 'config', 'MMWService', "$http", "$timeout",
function($rootScope, $filter, $translate, config, $MMWService, $http, $timeout) {
var timer, Notification;
function startSignalR(callback) {
if (!Notification) {
Notification = $MMWService.createHub('Notification', {
connected: callback,
listeners: {
"BroadCast": function(content) {
$timeout(function() {
content = JSON.parse(content);
for (var index in content.broadcast) {
//推播作業站,設備
switch (config.cache.dashboard) {
case 'lot':
if (content.broadcast[index].SiteNo == config.cache.op) {
broadcast_process(content.broadcast[index].List);
}
break;
case 'eqp':
if (content.broadcast[index].SiteNo == config.cache.equipment) {
broadcast_process(content.broadcast[index].List);
}
break;
}
}
});
}
}
});
} else {
if (callback)
callback();
}
}
function stopSignalR(callback) {
if (Notification && Notification) {
Notification.disconnect();
Notification = undefined;
}
if (callback)
callback();
}
function broadcast_process(aryCondition) {
//生產任務看板
if (aryCondition.Content_DBLot) {
for (var index in aryCondition.Content_DBLot) {
var aryshort = aryCondition.Content_DBLot[index];
//判斷資料是新增還是刪除
switch (aryshort.dataaction) {
case 0:
//新增
//如果已有資料,就不再新增。
var index_temp;
var search = factory.dashboard['workLog'].production_info_detail.some(function(item, ary_index) { index_temp = ary_index; return item.plot_no == aryshort.plot_no && item.Dispatch == aryshort.Dispatch; });
if (!search) {
factory.dashboard['workLog'].production_info_detail.push({
status: aryshort.status,
qty: aryshort.qty,
plot_no: aryshort.plot_no,
finish_time: aryshort.finish_time,
cur_br: aryshort.cur_br,
arrivetime: aryshort.arrivetime,
status_order: aryshort.status == 'C' ? 1 : 0,
Dispatch: aryshort.Dispatch
});
}
break;
case -1:
//刪除
var index_temp;
var search = factory.dashboard['workLog'].production_info_detail.some(function(item, ary_index) { index_temp = ary_index; return item.plot_no == aryshort.plot_no && item.Dispatch == aryshort.Dispatch; });
if (search) { factory.dashboard['workLog'].production_info_detail.splice(index_temp, 1); }
break;
case 2:
//修改
var index_temp;
var search = factory.dashboard['workLog'].production_info_detail.some(function(item, ary_index) { index_temp = ary_index; return item.plot_no == aryshort.plot_no && item.Dispatch == aryshort.Dispatch; });
if (search) {
var obj_temp = {
status: aryshort.status,
qty: aryshort.qty,
plot_no: aryshort.plot_no,
finish_time: aryshort.finish_time,
cur_br: aryshort.cur_br,
arrivetime: aryshort.arrivetime,
status_order: aryshort.status == 'C' ? 1 : 0,
Dispatch: aryshort.Dispatch
};
factory.dashboard['workLog'].production_info_detail[index_temp] = obj_temp;
}
break;
}
}
}
//上工人員看板
if (aryCondition.Content_DBwork_member) {
for (var index in aryCondition.Content_DBwork_member) {
var aryshort = aryCondition.Content_DBwork_member[index];
//判斷資料是新增還是刪除
switch (aryshort.dataaction) {
case 0:
//新增
//如果已有資料,就不再新增。
var index_temp;
var search = factory.dashboard['workOperator'].work_member_detail.some(function(item, ary_index) { index_temp = ary_index; return item.employee_no == aryshort.employee_no && item.login_place == aryshort.login_place; });
if (!search) { factory.dashboard['workOperator'].work_member_detail.push({ work_time: aryshort.work_time, employee_no: aryshort.employee_no, employee_name: aryshort.employee_name, login_place: aryshort.login_place, multi_operator_mode: aryshort.multi_operator_mode }); }
break;
case -1:
//刪除
var index_temp;
var search = factory.dashboard['workOperator'].work_member_detail.some(function(item, ary_index) { index_temp = ary_index; return item.employee_no == aryshort.employee_no && item.login_place == aryshort.login_place; });
if (search) { factory.dashboard['workOperator'].work_member_detail.splice(index_temp, 1); }
break;
case 2:
//修改 (先刪除後新增)
var index_temp;
var search = factory.dashboard['workOperator'].work_member_detail.some(function(item, ary_index) { index_temp = ary_index; return item.employee_no == aryshort.employee_no && item.login_place == aryshort.login_place; });
if (search) {
var obj_temp = { work_time: aryshort.work_time, employee_no: aryshort.employee_no, employee_name: aryshort.employee_name, login_place: aryshort.login_place, multi_operator_mode: aryshort.multi_operator_mode };
factory.dashboard['workOperator'].work_member_detail[index_temp] = obj_temp;
}
break;
}
}
}
//設備參數看板
if (aryCondition.Content_DBRecipe) {
for (var index in aryCondition.Content_DBRecipe) {
//判斷資料是新增還是刪除
var aryshort = aryCondition.Content_DBRecipe[index];
//判斷資料是新增還是刪除
switch (aryshort.dataaction) {
case 0:
//新增
factory.dashboard['deviceInfo'].machine_property_detail.push({ property_no: aryshort.property_no, guideline_1: aryshort.guideline_1, guideline_2: aryshort.guideline_2, guideline_max: aryshort.guideline_max, guideline_min: aryshort.guideline_min, guideline_mode: aryshort.guideline_mode, need_alert: aryshort.need_alert, property_name: aryshort.property_name, property_value: aryshort.property_value });
break;
case -1:
//刪除
var index_temp;
var search = factory.dashboard['deviceInfo'].machine_property_detail.some(function(item, ary_index) { index_temp = ary_index; return item.property_no == aryshort.property_no; });
if (search) { factory.dashboard['deviceInfo'].machine_property_detail.splice(index_temp, 1); }
break;
case 2:
//修改(先刪除後新增)
if (index == 0) { factory.dashboard['deviceInfo'].machine_property_detail.length = 0; }
factory.dashboard['deviceInfo'].machine_property_detail.push({ property_no: aryshort.property_no, guideline_1: aryshort.guideline_1, guideline_2: aryshort.guideline_2, guideline_max: aryshort.guideline_max, guideline_min: aryshort.guideline_min, guideline_mode: aryshort.guideline_mode, need_alert: aryshort.need_alert, property_name: aryshort.property_name, property_value: aryshort.property_value });
break;
}
}
}
//上機物料看板
if (aryCondition.Content_DBMaterial) {
for (var index in aryCondition.Content_DBMaterial) {
//判斷資料是新增還是刪除
var aryshort = aryCondition.Content_DBMaterial[index];
//判斷資料是新增還是刪除
switch (aryshort.dataaction) {
case 0:
//新增
factory.dashboard['workMaterial'].materials_detail.push({ materials_no: aryshort.materials_no, materials_name: aryshort.materials_name, materials_qty: aryshort.materials_qty, materials_unit: aryshort.materials_unit });
break;
case -1:
//刪除
var index_temp;
var search = factory.dashboard['workMaterial'].materials_detail.some(function(item, ary_index) { index_temp = ary_index; return item.materials_no == aryshort.materials_no; });
if (search) { factory.dashboard['workMaterial'].materials_detail.splice(index_temp, 1); }
break;
case 2:
//修改
var index_temp;
var search = factory.dashboard['workMaterial'].materials_detail.some(function(item, ary_index) { index_temp = ary_index; return item.materials_no == aryshort.materials_no; });
if (search) {
var obj_temp = { materials_no: aryshort.materials_no, materials_name: aryshort.materials_name, materials_qty: aryshort.materials_qty, materials_unit: aryshort.materials_unit };
factory.dashboard['workMaterial'].materials_detail[index_temp] = obj_temp;
}
break;
}
}
}
//品質狀態看板
if (aryCondition.Content_quality_detail) {
for (var index in aryCondition.Content_quality_detail) {
//判斷資料是新增還是刪除
var aryshort = aryCondition.Content_quality_detail[index];
//判斷資料是新增還是刪除
switch (aryshort.dataaction) {
case 2:
//修改
try {
var obj_temp = { shift_work_qty: aryshort.shift_work_qty, shift_defect_qty: aryshort.shift_defect_qty, quality_guideline_y: aryshort.quality_guideline_y, quality_guideline_r: aryshort.quality_guideline_r };
factory.dashboard['qualityStatus'].quality_detail = obj_temp;
var qty_rate = factory.dashboard['qualityStatus'].quality_detail.shift_defect_qty / factory.dashboard['qualityStatus'].quality_detail.shift_work_qty * 100;
if (isNaN(qty_rate)) {
factory.dashboard['qualityStatus'].quality_detail.qty_rate = 0;
} else {
factory.dashboard['qualityStatus'].quality_detail.qty_rate = qty_rate.toFixed(2);
}
factory.dashboard['qualityStatus'].quality_detail.lightColor = lightColor(factory.dashboard['qualityStatus'].quality_detail);
} catch (e) {
factory.dashboard['qualityStatus'].quality_detail.qty_rate = 0;
}
break;
}
}
}
}
function getEquipmentStatus(equipment, callback, isLoading) {
if (isLoading == undefined) {
isLoading = false;
}
$MMWService.sendToEAISrv({
uri: 'KMI.machine_status_get_json',
content: {
machine_no: equipment,
StationNo: config.setting.workStation,
num_of_days: factory.dashboard['deviceInfo'].num_of_days
},
success: function(data) {
if (callback)
callback(data);
},
error: function(data) {
//20170331 modify by Dustdusk for 當失敗時isShowLoading為false則重新執行一次
$rootScope.showAlert(data.Exception, function() {
if (isLoading == false) {
if (factory.isStart) {
factory.getEquipmentStatus(equipment, callback, isLoading);
}
}
});
factory.dashboard['workOperator'].work_member_detail = undefined;
factory.dashboard['qualityStatus'].quality_detail = undefined;
factory.dashboard['workMaterial'].materials_detail = undefined;
factory.dashboard['workLog'].production_info_detail = undefined;
},
netError: function() {
//20170331 modify by Dustdusk for 當失敗時isShowLoading為false則重新執行一次
if (isLoading == false) {
if (factory.isStart) {
factory.getEquipmentStatus(equipment, callback, isLoading);
}
}
}
}, isLoading);
}
function getWorkingInfo(equipment, dataType, callback, isLoading) {
var accountno = config.cache.account;
if (isLoading == undefined) {
isLoading = false;
}
$MMWService.sendToEAISrv({
uri: 'KMI.machine_working_info_get_json',
content: {
login_employee_no: accountno,
machine_no: equipment,
data_type: dataType,
workstation_no: config.setting.workStation
},
success: function(data) {
if (callback)
callback(data);
},
error: function(data) {
//20170331 modify by Dustdusk for 當失敗時isShowLoading為false則重新執行一次
$rootScope.showAlert(data.Exception, function() {
if (isLoading == false) {
if (factory.isStart) {
factory.getWorkingInfo(equipment, dataType, callback, isLoading);
}
}
});
},
netError: function() {
//20170331 modify by Dustdusk for 當失敗時isShowLoading為false則重新執行一次
if (isLoading == false) {
if (factory.isStart) {
factory.getWorkingInfo(equipment, dataType, callback, isLoading);
}
}
}
}, isLoading);
}
function getWorkingInfo_byLot(opno, dataType, callback, isLoading) {
var accountno = config.cache.account;
if (isLoading == undefined) {
isLoading = false;
}
$MMWService.sendToEAISrv({
uri: 'KMI.op_working_info_get_json',
content: {
login_employee_no: accountno,
op_no: opno,
data_type: dataType
},
success: function(data) {
if (callback)
callback(data);
},
error: function(data) {
//20170331 modify by Dustdusk for 當失敗時isShowLoading為false則重新執行一次
$rootScope.showAlert(data.Exception, function() {
if (isLoading == false) {
if (factory.isStart) {
factory.getWorkingInfo_byLot(opno, dataType, callback, isLoading);
}
}
});
},
netError: function() {
//20170331 modify by Dustdusk for 當失敗時isShowLoading為false則重新執行一次
if (isLoading == false) {
if (factory.isStart) {
factory.getWorkingInfo_byLot(opno, dataType, callback, isLoading);
}
}
}
}, isLoading);
}
var count = 0;
//取得dashboard的資料
function getDashBoardData(options) {
var dataType = options.dataType,
callback = options.callback,
isShowLoading = options.isShowLoading;
token = factory.token = Math.floor(Math.random() * 10);
if (config.cache.dashboard == 'eqp') {
var equipment = options.equipment;
factory.getEquipmentStatus(equipment, function(data) {
if (token === factory.token) {
//data = JSON.parse(data.Result);
data = JSON.parse(data.ResultJson);
//console.log('getEquipmentStatus : ',data);
if (data.machine_info) {
data.rate_detail = [];
data.machine_info[0].machine_utilization_rate_detail.forEach(function(detail) {
data.rate_detail.push({ label: detail.status, value: detail.work_min, color: 'rgb(' + detail.status_color + ')' });
});
angular.merge(factory.dashboard['deviceInfo'], data);
factory.dashboard['deviceInfo'].rate_detail = data.rate_detail;
factory.dashboard['deviceInfo'].total_time = factory.dashboard['deviceInfo'].total_time || 0;
//20181108 modify by Dustdusk fro M#: 機台參數沒有更新
factory.dashboard['deviceInfo'].machine_property_detail = data.machine_info[0].machine_property_detail;
//判斷是否進入警告
factory.filterAlert(factory.dashboard['deviceInfo'].machine_property_detail);
factory.getWorkingInfo(equipment, dataType, function(data) {
if (token === factory.token) {
//data = JSON.parse(data.Result);
data = JSON.parse(data.ResultJson);
//console.log('getWorkingInfo : ',data);
if (data.work_member_detail) {
try {
//人員上下工相關資料
factory.dashboard['workOperator'].default_shift = data.shift;
factory.dashboard['workOperator'].work_member_detail = data.work_member_detail;
//品質狀態相關資料
try {
data.quality_detail[0].shift_defect_qty = data.quality_detail[0].shift_defect_qty || 0;
data.quality_detail[0].shift_work_qty = data.quality_detail[0].shift_work_qty || 0;
var qty_rate = data.quality_detail[0].shift_defect_qty / data.quality_detail[0].shift_work_qty * 100;
if (isNaN(qty_rate)) {
data.quality_detail[0].qty_rate = 0;
} else {
data.quality_detail[0].qty_rate = qty_rate.toFixed(2);
}
data.quality_detail[0].lightColor = lightColor(data.quality_detail[0]);
} catch (e) {
data.quality_detail[0].qty_rate = 0;
}
factory.dashboard['qualityStatus'].quality_detail = data.quality_detail[0];
//上料相關資料
factory.dashboard['workMaterial'].materials_detail = data.materials_detail;
//生產資訊
factory.dashboard['workLog'].production_info_detail = data.production_info_detail;
//測試用
//factory.dashboard['workLog'].production_info_detail.push({status:'C',qty:'1.0000',plot_no:'ST1-W01-1604120009-001',finish_time:'2016-05-03 09:38'});
factory.dashboard.updateTime = new Date();
if (callback)
callback();
} catch (e) {
$rootScope.showAlert(e, function() {
if (isShowLoading == false) {
if (factory.isStart) {
factory.getDashBoardData(options);
}
}
});
}
} else {
$rootScope.showAlert(data.SysMsg, function() {
if (isShowLoading == false) {
if (factory.isStart) {
factory.getDashBoardData(options);
}
}
});
}
} else {
console.log('fail token');
}
}, isShowLoading);
} else {
$rootScope.showAlert(data.SysMsg, function() {
if (isShowLoading == false) {
if (factory.isStart) {
factory.getDashBoardData(options);
}
}
});
}
} else {
console.log('fail token');
}
}, isShowLoading);
} else {
var opno = options.opno;
factory.getWorkingInfo_byLot(opno, dataType, function(data) {
if (token === factory.token) {
//data = JSON.parse(data.Result);
data = JSON.parse(data.ResultJson);
console.log('getWorkingInfo_byLot : ', data);
if (data.op_detail) {
try {
//作業站資訊
angular.merge(factory.dashboard['opInfo'], data.op_detail[0]);
//人員上下工相關資料
if (data.work_member_detail.length > 0) {
factory.dashboard['workOperator'].multioperatormode = data.work_member_detail[0].multi_operator_mode;
} else {
factory.dashboard['workOperator'].multioperatormode = 0;
}
factory.dashboard['workOperator'].default_shift = data.shift;
factory.dashboard['workOperator'].work_member_detail = data.work_member_detail;
//品質狀態相關資料
try {
data.quality_detail[0].shift_defect_qty = data.quality_detail[0].shift_defect_qty || 0;
data.quality_detail[0].shift_work_qty = data.quality_detail[0].shift_work_qty || 0;
var qty_rate = data.quality_detail[0].shift_defect_qty / data.quality_detail[0].shift_work_qty * 100;
if (isNaN(qty_rate)) {
data.quality_detail[0].qty_rate = 0;
} else {
data.quality_detail[0].qty_rate = qty_rate.toFixed(2);
}
data.quality_detail[0].lightColor = lightColor(data.quality_detail[0]);
} catch (e) {
data.quality_detail[0].qty_rate = 0;
}
factory.dashboard['qualityStatus'].quality_detail = data.quality_detail[0];
//生產資訊
factory.dashboard['workLog'].production_info_detail = data.production_info_detail;
//測試用
//factory.dashboard['workLog'].production_info_detail.push({status:'C',qty:'1.0000',plot_no:'ST1-W01-1604120009-001',finish_time:'2016-05-03 09:38'});
factory.dashboard.updateTime = new Date();
if (callback)
callback();
} catch (e) {
$rootScope.showAlert(e, function() {
if (isShowLoading == false) {
if (factory.isStart) {
factory.getDashBoardData(options);
}
}
});
}
} else {
$rootScope.showAlert(data.SysMsg, function() {
if (isShowLoading == false) {
if (factory.isStart) {
factory.getDashBoardData(options);
}
}
});
}
} else {
console.log('fail token');
}
}, isShowLoading);
}
}
//呼叫getDashBoardData, 設定時間到了以後再執行callback
//並且只有在第一次開始的時候傳入true讓loading出現
function dashboardTimer(callback, isFirst) {
var equipment = config.cache.equipment;
var opno = config.cache.workStation;
var dataType = '1111';
if (config.cache.dashboard == 'eqp') {
factory.getDashBoardData({
equipment: equipment,
dataType: dataType,
callback: function() {
timer = setTimeout(function() {
if (callback)
callback(callback);
}, config.setting.RefreshTime * 1000);
},
isShowLoading: isFirst
});
} else {
factory.getDashBoardData({
opno: opno,
dataType: dataType,
callback: function() {
timer = setTimeout(function() {
if (callback)
callback(callback);
}, config.setting.RefreshTime * 1000);
},
isShowLoading: isFirst
});
}
}
function lightColor(item) {
if (item.qty_rate < item.quality_guideline_y) {
return 'green';
} else if (item.qty_rate >= item.quality_guideline_y && item.qty_rate < item.quality_guideline_r) {
return 'yellow';
} else if (item.qty_rate >= item.quality_guideline_r) {
return 'red';
}
return '';
}
function filterAlert(machine_property_detail) {
if (factory.alertStartHandler) {
var alertList = [];
for (var index in machine_property_detail) {
var detail = machine_property_detail[index];
if (detail.need_alert == 'Y') {
alertList.push(detail);
}
}
if (!factory.isShowAlert && alertList.length > 0) {
factory.isShowAlert = true;
factory.alertStartHandler(alertList);
} else if (factory.isShowAlert && alertList.length == 0) {
factory.isShowAlert = false;
if (factory.alertStopHandler)
factory.alertStopHandler();
}
}
}
var factory = {};
factory.isStart = false;
//2021-02-03 yenru,繼承前 先將標準DashBoard 與個案合併
var temp_object = {};
dashboardConfig = JSON.parse(dashboardConfig);
c_dashboardConfig = JSON.parse(c_dashboardConfig);
for (var i = 0; i < Object.keys(c_dashboardConfig).length; i++) {
var subFlag = false;
for (var j = 0; j < Object.keys(dashboardConfig).length; j++) {
if (Object.keys(c_dashboardConfig)[i] == Object.keys(dashboardConfig)[j]) {
subFlag = true;
//合併,以個案為主
dashboardConfig[Object.keys(dashboardConfig)[j]] = c_dashboardConfig[Object.keys(c_dashboardConfig)[i]];
break;
}
}
//新增個案DashBoard
if (subFlag == false) {
temp_object[Object.keys(c_dashboardConfig)[i]] = c_dashboardConfig[Object.keys(c_dashboardConfig)[i]];
}
}
for (var k = 0; k < Object.keys(temp_object).length; k++) {
dashboardConfig[Object.keys(temp_object)[k]] = temp_object[Object.keys(temp_object)[k]];
}
factory.dashboard = dashboardConfig;
factory.getEquipmentStatus = getEquipmentStatus;
factory.getWorkingInfo = getWorkingInfo;
factory.getWorkingInfo_byLot = getWorkingInfo_byLot;
factory.getDashBoardData = getDashBoardData;
factory.startSignalR = startSignalR;
factory.stopSignalR = stopSignalR;
factory.filterAlert = filterAlert;
factory.getDashboard = function(name) {
return factory.dashboard[name];
}
//執行dashboardTimer以呼叫getDashBoardData, 並且時間到了之後再次執行dashboardTimer
//並且只有在第一次開始的時候傳入true讓loading出現
factory.startWatch = function() {
factory.isStart = true;
if (!timer) {
dashboardTimer(dashboardTimer, true);
} else {
console.error('Dashboard is already start ... ');
}
}
factory.stopWatch = function() {
factory.isStart = false;
clearTimeout(timer);
timer = undefined;
}
factory.dashboardWarn = function(item) {
if (item.guideline_mode == '1') {
if ((+item.guideline_2) <= (+item.property_value))
return 'is-warn';
} else if (item.guideline_mode == '2') {
if ((+item.guideline_1) >= (+item.property_value))
return 'is-warn';
} else if (item.guideline_mode == '3') {
if ((+item.guideline_2) <= (+item.property_value) ||
(+item.guideline_1) >= (+item.property_value)) {
return 'is-warn';
}
}
return '';
}
factory.isShowAlert = false;
factory.alertStartHandler = undefined;
factory.alertStopHandler = undefined;
return factory;
}
]);
});