define(["angularAMD"], function (angularAMD) { angularAMD.service('mrs05Service', ["$rootScope", "$filter", "$stateParams", "config", "DashboardService", "MMWService", '$mdDialog', function ($rootScope, $filter, $stateParams, config, $DashboardService, $MMWService, $mdDialog) { /*** * optins : { * plotItem : { * plot_no, * op_seq, * op_no * work_station * }, * close : function //關閉後呼叫的方法 * } */ this.init = function (options) { function openDialog() { $mdDialog.dialog('module/moduleWIP/program/mrs-eqp/mrs05/mrs05.html', function (dialog) { $rootScope.equipment = {}; initialDialogParameters(dialog); if (dialog.equipmentNo != undefined) { getQCList(dialog.equipmentNo, dialog.callByCheckIn, loadQcList); } function loadQcList(data) { var tmp; tmp = JSON.parse(data['kcWIP.clsLot.LoadWaitQCListData']); ReplaceInspTypeInQcListWithValueList(tmp.WaitQCList, function (waitQCList) { dialog.WaitQCList = waitQCList; }); //BR進站時,不顯示補點檢 if (!dialog.callByCheckIn) { tmp = JSON.parse(data['kcWIP.clsLot.LoadReQCListData']); ReplaceInspTypeInQcListWithValueList(tmp.ReQCList, function (reQCList) { dialog.ReQCList = reQCList; }); } } //ValueList相關 function ReplaceInspTypeInQcListWithValueList(qcList, callback) { GetValueList('FRMEQPQCLISTSETUP', 'QCTYPE', function (valueList) { if (valueList.length > 0) { qcList.forEach( qcListItem => { var drSel = valueList.filter(valueListItem => { return qcListItem.INSPTYPE == valueListItem.COLUMNVALUE; }); if (drSel.length > 0) { return qcListItem.InspTypeName = $filter('translate')('mrs05.QCTYPE.' + drSel[0].DISPLAYTEXT.toUpperCase()); } } ); } if (callback) callback(qcList); }); } function GetValueList(pTableName, pColumnName, callback) { var uri = []; var content = []; uri.push("kcSYS.clsValueList.LoadValueList"); content.push({ pTableName: pTableName, pColumnName: pColumnName }); $MMWService.sendToMESSrv_Multi({ uri: uri, content: content, success: function (data) { if (data.Code == "0") { var tmpJson = JSON.parse(data.ResultJson); var tmp; var index = 0; tmp = JSON.parse(tmpJson[uri[index]]); tmp = tmp[Object.keys(tmp)[0]]; if (callback) { callback(tmp); } } } }); } return { confirm: function () { //全填寫完才可存檔 for (var n in dialog.eqpQcListDetail) { if (dialog.eqpQcListDetail[n].QCResult == -1) { $rootScope.showAlert(dialog.eqpQcListDetail[n].QCITEM + $filter('translate')('mrs05.msg.notDefine')); return; } } prepareParameters(dialog); addWIPEQPQCListLog(dialog, function (data) { data = JSON.parse(data.ResultJson); if (data.Result != 'fail') { options.callBack(true); dialog.hide(); } else { $rootScope.showAlert(data.SysMsg); } }); }, background: { click: function () { dialog.hide(); if (typeof (feedback) == 'function') feedback(); } }, itemStatus: function (item) { if (item.check_type == '0') { if (item.std_value == item.CheckValue) { //item.CheckResult = 'OK' item.CheckResult = 0 return 'check-point-ok'; } else { //item.CheckResult = 'NG' item.CheckResult = 1 return 'check-point-notok'; } } else if (item.check_type == '1') { var isInterval = true; if (item.range_min !== null) { isInterval = isInterval && ((+item.range_min) <= (+item.CheckValue)); } if (item.range_max !== null) { isInterval = isInterval && ((+item.CheckValue) <= (+item.range_max)); } if (isInterval) { //item.CheckResult = 'OK' item.CheckResult = 0 return 'check-point-ok'; } else { //item.CheckResult = 'NG' item.CheckResult = 1 return 'check-point-notok'; } } else if (item.check_type == '3') { //20190312 KevinChang加入QC類別為3的CheckResult直接給0 item.CheckResult = 0 } return ''; }, itemClick: function (item) { //item.isClick = !item.isClick; if (item.CheckValue == '0') { //item.CheckResult = 'NG' item.CheckResult = 1 item.CheckValue = 1; } else { //item.CheckResult = 'OK'; item.CheckResult = 0 item.CheckValue = 0; } }, type2Init: function (item) { if (!item.CheckValue) { //item.CheckResult = 'NG'; item.CheckResult = 1 item.CheckValue = 1; } }, back: function () { dialog.hide(); if (options.close) options.close(); }, cancel: function () { dialog.eqpQcListDetail = []; }, loadMachineChecklist: function (item) { dialog.qcListNo = item.QCLISTNO; dialog.qcListName = item.QCLISTNAME; dialog.qcTaskNo = item.QCTASKNO; dialog.inspType = item.INSPTYPE; //移除EAI 架構,直接呼叫KC var uri = []; var content = []; //點檢序號 uri.push("kcWIP.clsWIP.GetQCListSerial"); content.push({ QCListSerialLeadString: getQCListSerialLeadString(item.QCLISTNO) }); uri.push("kcEQP.clsEQPBasis.ShowEQPQCListBasis"); content.push({ QCListNo: item.QCLISTNO }); //品管項目 uri.push("kcEQP.clsEQPBasis.ShowEQPQCListDetail"); content.push({ QCListNo: item.QCLISTNO }); //設備 uri.push("kcEQP.clsEQPBasis.LoadEquipmentBasis"); content.push({ EquipmentNo: dialog.equipmentNo }); getMachineChecklist(uri, content, function (data) { data = JSON.parse(data.ResultJson); if (Object.keys(data).length > 0) { let temp; //點檢序號 temp = JSON.parse(data['kcWIP.clsWIP.GetQCListSerial']); dialog.qCListSerial = temp.ReturnValue; temp = JSON.parse(data['kcEQP.clsEQPBasis.ShowEQPQCListBasis']); temp = temp.ShowEQPQCListBasis; if (temp.length > 0) dialog.unValidAction = temp[0].UNVALIDACTION; //品管項目 temp = JSON.parse(data['kcEQP.clsEQPBasis.ShowEQPQCListDetail']); temp.ShowEQPQCListDetail = initialQcListDetail(temp.ShowEQPQCListDetail, dialog.qCListSerial); dialog.expressionColQty = initialExpressionColQty(temp.ShowEQPQCListDetail); dialog.eqpQcListDetail = temp.ShowEQPQCListDetail; //設備類別、設備名稱 temp = JSON.parse(data['kcEQP.clsEQPBasis.LoadEquipmentBasis']); temp = temp.EQPEquipmentBasis[0]; dialog.equipmentType = temp.EQUIPMENTTYPE; dialog.equipmentName = temp.EQUIPMENTNAME; } }); }, inputValueCorrect: inputValueCorrect, checkQCResult: checkQCResult, switchQCResult: function (item) { if (item.QCTYPE == 2) { item.QCResult = (item.QCResult == 0) ? 1 : 0; } }, showCorrectIcon: showCorrectIcon, showErrorIcon: showErrorIcon, scanQrcode_eqp: function () { $rootScope.$root.OpenScanner({ after: function (result) { dialog.equipmentNo = result.text; //20230324,13871,處理錯誤 //search_eqp({ eqpno: dialog.equipmentNo }, function (data) { }); getQCList(dialog.equipmentNo,dialog.callByCheckIn, loadQcList); }, exception: function () { //目前裝置無法使用相機 $rootScope.showAlert($filter('translate')('common.msg.camera_not_support')); }, orientation: "landscape" }); }, enter: function (event) { if (event.keyCode == 13) { getQCList(dialog.equipmentNo,dialog.callByCheckIn, loadQcList); } }, showEquipmentList: function () { if (dialog.equipmentNoList == undefined) return; if (dialog.equipmentNoList.length <= 0) return; $rootScope.showSelect({ title: "{{'mrs05.title'|translate}}", label: "MACHINE_NO", code: "MACHINE_NO", order: "MACHINE_NO", selectCode: '', list: dialog.equipmentNoList, confirm: function (s_item, s_dialog) { s_dialog.hide(); dialog.equipmentNo = s_item.MACHINE_NO; getQCList(dialog.equipmentNo, dialog.callByCheckIn, loadQcList); } }); } } } ); } function search_eqp(content, callback) { $rootScope.alertStatus(function (Status) { if (Status == 1) { return; } else { getAllMachineData_OP(content.eqpno, function (data) { data = JSON.parse(data.ResultJson); var dt = data["ds"]["query_result"]; if (dt.length > 0) { dialog.listWorkStation = dt; } else { $rootScope.showAlert($filter('translate')('mrs00.msg.cantGet') + dialog.equipmentNo + $filter('translate')('mrs00.msg.machineInfo')); dialog.equipmentNo = ''; dialog.listWorkStation = []; } }); } }); } function getAllMachineData_OP(strEQP, callback) { $MMWService.sendToMESSrv({ uri: 'kcWIP.clsMDS.LoadEquipmentInfoByOP', content: { EquipmentNo: strEQP, ds: [] }, success: function (data) { if (callback) callback(data); } }); } function prepareParameters(para) { para.qcResult = calculateTotalQCResult(para.eqpQcListDetail); for (var n in para.eqpQcListDetail) { para.eqpQcListDetail[n].D01 = para.eqpQcListDetail[n].InputValue; } } function inputValueCorrect(inputVal, item) { if (inputVal == '') return true; if (inputVal == null) return true; return checkInputValueCorrect(inputVal, item); } function showErrorIcon(item) { var show = false; //提示訊息 if (item.QCTYPE == 2) { show = (item.QCResult != 0); } else {//其他 show = !inputValueCorrect(item.InputValue, item) if (item.INPUTDATACOUNT >= 2) show |= !inputValueCorrect(item.D02, item) if (item.INPUTDATACOUNT >= 3) show |= !inputValueCorrect(item.D03, item) if (item.INPUTDATACOUNT >= 4) show |= !inputValueCorrect(item.D04, item) if (item.INPUTDATACOUNT >= 5) show |= !inputValueCorrect(item.D05, item) if (item.INPUTDATACOUNT >= 6) show |= !inputValueCorrect(item.D06, item) if (item.INPUTDATACOUNT >= 7) show |= !inputValueCorrect(item.D07, item) if (item.INPUTDATACOUNT >= 8) show |= !inputValueCorrect(item.D08, item) if (item.INPUTDATACOUNT >= 9) show |= !inputValueCorrect(item.D09, item) if (item.INPUTDATACOUNT >= 10) show |= !inputValueCorrect(item.D10, item) } //給QCResult 附值 if (show) { item.QCResult = 1; } return show; } function showCorrectIcon(item) { var show = false; //提示訊息 if (item.QCTYPE == 2) { show = (item.QCResult == 0); } else {//其他 if (allFieldsArefilled(item)) { show = checkQCResult(item); } } //給QCResult 附值 if (show) { item.QCResult = 0; } else if (!showErrorIcon(item)){ item.QCResult = -1; } return show; } function allFieldsArefilled(item) { var result = (item.InputValue != '' && item.InputValue != null); if (item.INPUTDATACOUNT >= 2) result &= (item.D02 != '' && item.D02 != null); if (item.INPUTDATACOUNT >= 3) result &= (item.D03 != '' && item.D03 != null); if (item.INPUTDATACOUNT >= 4) result &= (item.D04 != '' && item.D04 != null); if (item.INPUTDATACOUNT >= 5) result &= (item.D05 != '' && item.D05 != null); if (item.INPUTDATACOUNT >= 6) result &= (item.D06 != '' && item.D06 != null); if (item.INPUTDATACOUNT >= 7) result &= (item.D07 != '' && item.D07 != null); if (item.INPUTDATACOUNT >= 8) result &= (item.D08 != '' && item.D08 != null); if (item.INPUTDATACOUNT >= 9) result &= (item.D09 != '' && item.D09 != null); if (item.INPUTDATACOUNT >= 10) result &= (item.D10 != '' && item.D10 != null); return result; } function checkQCResult(item) { var result = checkInputValueCorrect(item.InputValue, item); if (item.INPUTDATACOUNT >= 2) result &= checkInputValueCorrect(item.D02, item); if (item.INPUTDATACOUNT >= 3) result &= checkInputValueCorrect(item.D03, item); if (item.INPUTDATACOUNT >= 4) result &= checkInputValueCorrect(item.D04, item); if (item.INPUTDATACOUNT >= 5) result &= checkInputValueCorrect(item.D05, item); if (item.INPUTDATACOUNT >= 6) result &= checkInputValueCorrect(item.D06, item); if (item.INPUTDATACOUNT >= 7) result &= checkInputValueCorrect(item.D07, item); if (item.INPUTDATACOUNT >= 8) result &= checkInputValueCorrect(item.D08, item); if (item.INPUTDATACOUNT >= 9) result &= checkInputValueCorrect(item.D09, item); if (item.INPUTDATACOUNT >= 10) result &= checkInputValueCorrect(item.D10, item); return result; } function checkInputValueCorrect(inputVal, item) { switch (item.QCTYPE) { case 0: //標準值 if (inputVal == item.STDVALUE) { return true; } break; case 1: //區間 let inputValue = parseInt(inputVal, 10); let max = parseInt(item.MAXIVALUE, 10); let min = parseInt(item.MINIVALUE, 10); if (inputValue <= max) { if (inputValue >= min) { return true; } } break; case 2: //顯示訊息 return (item.qcResult==0); break; case 3: //輸入資料 if (inputVal != undefined && inputVal != '') { return true; } break; } return false; } function initialDialogParameters(dialog) { dialog.equipmentNoList = options.equipmentNoList; dialog.equipmentNo = options.EquipmentNo; dialog.equipmentType = ""; dialog.equipmentName = ""; dialog.qcListNo = ""; dialog.qcListName = ""; dialog.LotSerial = (options.LotSerial) ? options.LotSerial : ""; dialog.LogGroupSerial = (options.LogGroupSerial) ? options.LogGroupSerial : ""; dialog.callByCheckIn = (options.callByCheckIn) ? options.callByCheckIn : false; dialog.eqpQcListDetail = []; dialog.qCListSerial = ""; dialog.qcResult = -999; dialog.description = ""; dialog.creator = config.cache.account; dialog.unValidAction = -999; dialog.expressionColQty = 1; dialog.qcTaskNo = ""; dialog.inspType = -999; } function initialQcListDetail(qcListDetail, qCListSerial) { for (var n in qcListDetail) { qcListDetail[n]['QCListSerial'] = qCListSerial; qcListDetail[n]['QCResult'] = (qcListDetail[n]['QCTYPE'] == 2) ? 0 : -1; qcListDetail[n]['InputValue'] = ""; } return qcListDetail } function initialExpressionColQty(qcListDetail) { var result = 1; for (var n in qcListDetail) { if (qcListDetail[n]['INPUTDATACOUNT'] > result) { result = qcListDetail[n]['INPUTDATACOUNT']; } } return result } function calculateTotalQCResult(eqpQcListDetail) { for (var n in eqpQcListDetail) { if (eqpQcListDetail[n]['QCResult'] == -1) return -1 } for (var n in eqpQcListDetail) { if (eqpQcListDetail[n]['QCResult'] == 1) return 1 } return 0; } function getQCListSerialLeadString(qcListNo) { const today = new Date(); var mm = '' + (today.getMonth() + 1); var dd = '' + today.getDate(); var yy = today.getFullYear().toString().slice(-2); var result = qcListNo + yy + padStart(mm, 2, '0') + padStart(dd, 2, '0'); return result } function padStart(string, targetLength, padString = ' ') { return (Array(targetLength).join(padString) + string) .slice(-targetLength) } function getMachineChecklist(uri, content, callback) { $MMWService.sendToMESSrv_Multi({ uri: uri, content: content, success: function (data) { if (callback) callback(data); } }); } function getQCList(equipment, callByCheckIn, callback) { //移除EAI 架構,直接呼叫KC var uri = []; var content = []; //待點檢 uri.push("kcWIP.clsLot.LoadWaitQCListData"); content.push({ EquipmentNo: equipment, CallByCheckIn: callByCheckIn }); //補點檢 if (!callByCheckIn) { uri.push("kcWIP.clsLot.LoadReQCListData"); content.push({ EquipmentNo: equipment }); } $MMWService.sendToMESSrv_Multi({ uri: uri, content: content, success: function (data) { data = JSON.parse(data.ResultJson); if (Object.keys(data).length > 0) { callback(data); } } }); } function addWIPEQPQCListLog(para, callback) { //移除EAI 架構,直接呼叫KC var uri = []; var content = []; //待點檢 uri.push("kcWIP.clsWIP.AddWIPEQPQCListLog"); content.push({ QCListSerial: para.qCListSerial,//ok EquipmentNo: para.equipmentNo,//ok QCListNo: para.qcListNo,//ok LotSerial: para.LotSerial, LogGroupSerial: para.LogGroupSerial, QCResult: para.qcResult, Description: para.description, Creator: para.creator, //CreateDate: para.createDate, UnValidAction: para.unValidAction, dtQCListDetail: para.eqpQcListDetail, ExpressionColQty: para.expressionColQty, QCTaskNo: para.qcTaskNo, InspType: para.inspType }); $MMWService.sendToMESSrv_Multi({ uri: uri, content: content, success: function (data) { if (callback) callback(data); } }); } openDialog(); } }]); });