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

707 lines
40 KiB
JavaScript
Raw Normal View History

2024-01-24 16:47:50 +08:00
//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;
}
]);
});