$(function () { InitPMGridData(); $('#dialog_pm').dialog(function () { showmaskbg(false); }); }); function SetAssetItem(asset) { $("#dialog_pm").data("asset", asset); } function showConfirmOKCancel(msg, title, fok, fcancel) { showmaskbg(true); _dialog.showConfirmOKCancel(msg, title, function (e) { showmaskbg(false); if (typeof fok === 'function') { fok(e); } }, function () { if (fcancel) fcancel(); showmaskbg(false); }); } /****** PM******/ var pmschedules var grid_pmschedules; function InitPMGridData() { grid_pmschedules = new GridView('#pmschedulelist'); grid_pmschedules.lang = { all: GetTextByKey("P_GRID_ALL", "(All)"), ok: GetTextByKey("P_GRID_OK", "OK"), reset: GetTextByKey("P_GRID_RESET", "Reset") }; var list_columns = [ { name: 'Selected', caption: "", valueIndex: 'Selected', type: 3, css: { 'width': 30, 'text-align': 'center' } }, { name: 'PmScheduleName', caption: GetTextByKey("P_MA_SCHEDULENAME", "Schedule Name"), valueIndex: 'PmScheduleName', css: { 'width': 200, 'text-align': 'left' } }, { name: 'StartValue', caption: GetTextByKey("P_MA_INITIALSERVICEVALUE", "Initial Service Value"), valueIndex: 'StartValue', css: { 'width': 120, 'text-align': 'right' } }, { name: 'LastAlertTimeString', caption: GetTextByKey("P_MA_LASTSERVICEDATE", "Last Service Date"), valueIndex: 'LastAlertTimeString', css: { 'width': 120, 'text-align': 'left' } }, { name: 'ServiceName', caption: GetTextByKey("P_MA_LASTSERVICEPERFORMED", "Last Service Performed"), valueIndex: 'ServiceName', css: { 'width': 140, 'text-align': 'left' } } ]; var columns = []; // head for (var hd in list_columns) { var col = {}; col.name = list_columns[hd].name; col.caption = list_columns[hd].caption; col.visible = true; col.sortable = true; col.width = list_columns[hd].css.width; col.align = list_columns[hd].css["text-align"] col.key = list_columns[hd].valueIndex; if (list_columns[hd].type) { col.type = list_columns[hd].type; } if (col.name === "Selected") { col.events = { onchange: function () { if (this.Selected) { showSetPMDialog(this); this.Selected = false;//弹出对话框并取消勾选,因为此时机器并没有真正加入到计划,在对话框OK刷新列表 grid_pmschedules.reload(); } else { var item = this; var msg = GetTextByKey("P_MA_REMOVEASSETFROMSCHEDULE", "Do you want to remove this asset from the schedule?"); if (item.UnMaintainedAlert && item.UnMaintainedAlert > 0) { var msg = GetTextByKey("P_MA_REMOVEASSETFROMSCHEDULE_TIPS", "Select OK below will result in the deletion of existing unassigned PM alerts for this asset.<br/> If you do not want those alerts deleted, select CANCEL and assign appropriate alerts to a maintenance record or work order in asset health prior to deletion/removal."); } showConfirmOKCancel(msg, GetTextByKey("P_MA_REMOVEASSET", 'Remove Asset'), function () { removeAssetFromPMSchedule(item); }, function () { item.Selected = true; grid_pmschedules.reload(); }); } } }; } columns.push(col); } grid_pmschedules.canMultiSelect = false; grid_pmschedules.columns = columns; grid_pmschedules.init(); } function getAssetPMSchedules() { showLoading(); assetrequest('GetPMSchedulesByAsset', machineid, function (data) { hideLoading(); if (typeof (data) === "string") { showAlert(data, GetTextByKey("P_MA_ERROR", 'Error')); return; } if (data && data.length > 0) { pmschedules = data; ShowPMSchedules(data); } }, function () { hideLoading(); }); } function ShowPMSchedules() { var rows = []; for (var i = 0; i < pmschedules.length; i++) { var r = pmschedules[i]; if (r.PmScheduleType === "HM" || r.PmScheduleType === "PM") r.StartValue = r.StartHours; else if (r.PmScheduleType === "ADM" || r.PmScheduleType === "RDM") r.StartValue = r.StartOdometer; else r.StartValue = r.StartDateString; var fr = { Values: r }; rows.push(fr); } grid_pmschedules.setData(rows); } function reshowpmgrid() { setTimeout(function () { $("#pmschedulelist").css("height", $(window).height() - $("#pmschedulelist").offset().top - 10); grid_pmschedules && grid_pmschedules.resize(); }); } function addAssetToPMSchedule(item) { showLoading(); assetrequest('AddAssetToPMSchedule', JSON.stringify(item), function (data) { hideLoading(); if (data === "OK") { $('#dialog_pm').hideDialog(); showmaskbg(false); getAssetPMSchedules(); } else showAlert(data, GetTextByKey("P_MA_ERROR", 'Error')); }, function () { hideLoading(); }); } function removeAssetFromPMSchedule(schedule) { var assetid = $("#dialog_pm").data("asset").ID; var scheduleid = schedule.PmScheduleID; showLoading(); assetrequest('RemoveAssetFromPMSchedule', JSON.stringify([assetid, scheduleid]), function (data) { hideLoading(); if (data === "OK") { //showAlert(data, 'Removed Successfully.'); getAssetPMSchedules(); } else showAlert(data, GetTextByKey("P_MA_ERROR", 'Error')); }, function () { hideLoading(); }); } function showSetPMDialog(pmschedule) { showmaskbg(true); //$('#dialog_pm .dialog-title span.title').text('Set PM Schedule'); if (pmschedule) { var contentctrl = $("#dialog_pm .dialog-content"); contentctrl.empty(); //scheduletype === "HM" || scheduletype === "RDM" || scheduletype === "TBM" if (pmschedule.PmScheduleType === "PM" || pmschedule.PmScheduleType === "ADM") { createAbsoluteContent(contentctrl, pmschedule); } else if (pmschedule.PmScheduleType === "HM" || pmschedule.PmScheduleType === "RDM") { createRelativeContent(contentctrl, pmschedule); } else if (pmschedule.PmScheduleType === "TBM") { createTBMContent(contentctrl, pmschedule); } } $('#dialog_pm').css({ 'top': (document.documentElement.clientHeight - $('#dialog_adjustenginehours').height()) / 3, 'left': (document.documentElement.clientWidth - $('#dialog_adjustenginehours').width()) / 2 }).showDialogfixed(); } function createAbsoluteContent(contentctrl, pmschedule) { var text = GetTextByKey("P_MA_WHENWOULDYOULIKETHEFIRSTALERT", "When would you like the first alert?"); contentctrl.append($("<span></span><br />").text(text)); var radio1 = $("<input type='radio' name='pm' checked='checked' />"); contentctrl.append(radio1); var tag = hasAvailableIntervals(pmschedule); if (tag) text = getFirstLineText(pmschedule); else text = GetTextByKey("P_MA_NOAVAILABLEINTERVALS", "No available intervals."); contentctrl.append($("<span></span><br />").text(text)); if (tag) { var radio2 = $("<input type='radio' name='pm' />"); contentctrl.append(radio2); text = GetTextByKey("P_MA_ONEORMORESERVICESWASMISSEDALERTMEFOR", "One or more services was missed. Alert me for "); contentctrl.append($("<span></span>").text(text)); var selInterval = $("<select></select>").prop("disabled", true); contentctrl.append(selInterval); contentctrl.append($("<span> </span>").text(GetTextByKey("P_MA_NOW", " now."))); if (pmschedule.Intervals) { for (var i = 0; i < pmschedule.Intervals.length; i++) { var interval = pmschedule.Intervals[i]; if (!interval.Recurring) continue;//暂不考虑非周期性Service selInterval.append($("<option></option>").val(interval.PmIntervalID).text(interval.ServiceName)); } } radio1.change(enableInput); radio2.change(enableInput); function enableInput() { if (radio1.prop("checked")) selInterval.prop("disabled", true); else selInterval.prop("disabled", false); } } $("#btnSetPMSchedule").unbind().click(function () { var asset = $("#dialog_pm").data("asset"); var item = {}; item.AssetID = asset.ID; item.PmScheduleID = pmschedule.PmScheduleID; //item.PMType = pmschedule.PmScheduleType; if (pmschedule.PmScheduleType === "PM") item.StartHours = asset.EngineHours; else { var unit = pmschedule.PmScheduleUom; var value = asset.Odometer; if (value > 0 && unit && asset.OdometerUnits && unit.toLowerCase().charAt(0) != asset.OdometerUnits.toLowerCase().charAt(0)) { if (unit.toLowerCase().startsWith("m")) value = value * 0.6213712; else value = value / 0.6213712; } item.StartOdometer = Math.round(value); } if (radio2 && radio2.prop("checked")) { item.SelectedIntervalID = selInterval.val(); } addAssetToPMSchedule(item); }); } function createRelativeContent(contentctrl, pmschedule) { var text = GetTextByKey("P_MA_WHENWOULDYOULIKETHEFIRSTALERT", "When would you like the first alert?"); contentctrl.append($("<span></span><br />").text(text)); var radio1 = $("<input type='radio' name='pm' checked='checked' />"); contentctrl.append(radio1); var tag = hasAvailableIntervals(pmschedule); if (tag) text = getFirstLineText(pmschedule); else text = GetTextByKey("P_MA_NOAVAILABLEINTERVALS", "No available intervals."); contentctrl.append($("<span></span><br />").text(text)); if (tag) { var radio2 = $("<input type='radio' name='pm' />"); contentctrl.append(radio2); text = GetTextByKey("P_MA_CALCULATEBASEDUPONLASTSERVICETHE", "Calculate based upon last service. The "); contentctrl.append($("<span></span>").text(text)); var selInterval = $("<select></select>").prop("disabled", true); contentctrl.append(selInterval); contentctrl.append($("<span></span>").text(GetTextByKey("P_MA_SERVICEWASPERFORMEDAT", " service was performed at "))); var txtStartValue = $("<input type='text' style='width:80px;' />").prop("disabled", true); contentctrl.append(txtStartValue); if (pmschedule.AllIntervals) { var asset = $("#dialog_pm").data("asset"); var value = 0; if (pmschedule.PmScheduleType === "HM") value = Math.round(asset.EngineHours); else value = Math.round(asset.Odometer); if (isNaN(value)) value = 0; var tempIntervals = getIntervalValues(value, pmschedule.AllIntervals); for (var i = 0; i < tempIntervals.length; i++) { var interval = tempIntervals[i]; selInterval.append($("<option></option>").val(interval).text(interval)); } //for (var i = 0; i < pmschedule.AllIntervals.length; i++) { // var interval = pmschedule.AllIntervals[i]; // selInterval.append($("<option></option>").val(interval).text(interval)); //} } radio1.change(enableInput); radio2.change(enableInput); function enableInput() { if (radio1.prop("checked")) { txtStartValue.prop("disabled", true); selInterval.prop("disabled", true); } else { txtStartValue.prop("disabled", false); selInterval.prop("disabled", false); } } } $("#btnSetPMSchedule").unbind().click(function () { var asset = $("#dialog_pm").data("asset"); var item = {}; item.AssetID = asset.ID; item.PmScheduleID = pmschedule.PmScheduleID; //item.PMType = pmschedule.PmScheduleType; if (radio1.prop("checked")) { if (pmschedule.PmScheduleType === "HM") item.StartHours = asset.EngineHours; else { var unit = pmschedule.PmScheduleUom; var value = asset.Odometer; if (value > 0 && unit && asset.OdometerUnits && unit.toLowerCase().charAt(0) != asset.OdometerUnits.toLowerCase().charAt(0)) { if (unit.toLowerCase().startsWith("m")) value = value * 0.6213712; else value = value / 0.6213712; } item.StartOdometer = Math.round(value); } } else { if (pmschedule.PmScheduleType === "HM") { item.StartHours = txtStartValue.val(); if (item.StartHours === "" || isNaN(item.StartHours)) item.StartHours = asset.EngineHours; } else { item.StartOdometer = txtStartValue.val(); if (item.StartOdometer === "" || isNaN(item.StartOdometer)) { var unit = pmschedule.PmScheduleUom; var value = asset.Odometer; if (value > 0 && unit && asset.OdometerUnits && unit.toLowerCase().charAt(0) != asset.OdometerUnits.toLowerCase().charAt(0)) { if (unit.toLowerCase().startsWith("m")) value = value * 0.6213712; else value = value / 0.6213712; } item.StartOdometer = Math.round(value); } } item.StartIntervalValue = selInterval.val(); } addAssetToPMSchedule(item); }); } function createTBMContent(contentctrl, pmschedule) { var text = GetTextByKey("P_MA_WHENWOULDYOULIKETHEFIRSTALERT", "When would you like the first alert?"); contentctrl.append($("<span></span><br />").text(text)); var radio1 = $("<input type='radio' name='pm' checked='checked' />"); contentctrl.append(radio1); var tag = hasAvailableIntervals(pmschedule); if (tag) text = GetTextByKey("P_MA_TRIGGERANALERTASIFSERVICEISDUETODAY", "Trigger an alert as if service is due today."); else text = GetTextByKey("P_MA_NOAVAILABLEINTERVALS", "No available intervals."); contentctrl.append($("<span></span><br />").text(text)); if (tag) { var radio2 = $("<input type='radio' name='pm' />"); contentctrl.append(radio2); text = GetTextByKey("P_MA_CALCULATEBASEDUPONLASTSERVICETHELASTSERVICEDATAWAS", "Calculate based upon last service. The last service date was "); contentctrl.append($("<span></span>").text(text)); var dateparent = $("<span></span>"); contentctrl.append(dateparent); var txtLastServiceDate = $("<input type='text' style='width:80px;' />").prop("disabled", true); txtLastServiceDate.datetimepicker({ timepicker: false, format: 'm/d/Y', enterLikeTab: false }).text(currentdate); dateparent.append(txtLastServiceDate); contentctrl.append($("<span></span>").text(GetTextByKey("P_MA_FOR", " for "))); var selInterval = $("<select></select>").prop("disabled", true); contentctrl.append(selInterval); if (pmschedule.Intervals) { for (var i = 0; i < pmschedule.AllIntervals.length; i++) { var interval = pmschedule.AllIntervals[i]; selInterval.append($("<option></option>").val(interval).text(interval)); } } radio1.change(enableInput); radio2.change(enableInput); function enableInput() { if (radio1.prop("checked")) { txtLastServiceDate.prop("disabled", true); selInterval.prop("disabled", true); } else { txtLastServiceDate.prop("disabled", false); selInterval.prop("disabled", false); } } } $("#btnSetPMSchedule").unbind().click(function () { var asset = $("#dialog_pm").data("asset"); var item = {}; item.AssetId = asset.ID; item.PmScheduleID = pmschedule.PmScheduleID; //item.PMType = pmschedule.PmScheduleType; if (radio1.prop("checked")) { item.StartDate = nowdate; } else { item.StartDate = txtLastServiceDate.val(); item.StartIntervalValue = selInterval.val(); if (item.StartDate == "") item.StartDate = "1900-01-01"; } addAssetToPMSchedule(item); }); } function hasAvailableIntervals(pmschedule) { if (!pmschedule.Intervals || pmschedule.Intervals.length == 0) return false; for (var i = 0; i < pmschedule.Intervals.length; i++) { var ii = pmschedule.Intervals[i]; if (ii.Recurring) return true; } return false; } function getIntervalValues(currentValue, allIntervals) { var result = [];//取当前值的前两个和后10个Interval if (allIntervals && allIntervals.length > 0) { var maxInterval = allIntervals[allIntervals.length - 1]; var pervoid = parseInt(currentValue / maxInterval); var remain = currentValue % maxInterval; if (remain > 0) pervoid++; var maxpervoid = pervoid + 1; var minpervoid = pervoid - Math.ceil(10 / allIntervals.length) - 1;//10表示向后取10 if (minpervoid < 0) minpervoid = 0; for (var pi = maxpervoid; pi >= minpervoid; pi--) { for (var i = allIntervals.length - 1; i >= 0; i--) { var interval = allIntervals[i]; var tempinterval = pi * maxInterval + interval; result.push(tempinterval); if (tempinterval >= currentValue) { if (result.length > 2) result.splice(0, 1); } else if (result.length == 12) break; } } } return result; } function getFirstLineText(pmschedule) { var text = ""; if (pmschedule.Intervals && pmschedule.Intervals.length > 0) { var asset = $("#dialog_pm").data("asset"); var unit = ""; var value = 0; if (pmschedule.PmScheduleType === "PM" || pmschedule.PmScheduleType === "HM") { unit = "hours"; value = Math.round(asset.EngineHours); } else { unit = pmschedule.PmScheduleUom; value = asset.Odometer; if (value > 0 && unit && asset.OdometerUnits && unit.toLowerCase().charAt(0) != asset.OdometerUnits.toLowerCase().charAt(0)) { if (unit.toLowerCase().startsWith("m")) value = value * 0.6213712; else value = value / 0.6213712; value = Math.round(value); } } if (isNaN(value)) value = 0; var minoffset = null; var nextInterval = null; for (var i = 0; i < pmschedule.Intervals.length; i++) { var ii = pmschedule.Intervals[i]; if (!ii.Recurring) continue;//暂不考虑非周期性Service var offset = 0; if (value == 0) offset = ii.Interval; else if (value % ii.Interval > 0) offset = ii.Interval - value % ii.Interval; if (!nextInterval || offset < minoffset) { nextInterval = ii; minoffset = offset; continue; } if (offset == minoffset && (ii.Priority < nextInterval.Priority || (ii.Priority == nextInterval.Priority && ii.Interval > nextInterval.Interval))) nextInterval = ii; } if (nextInterval) { text = GetTextByKey("P_MA_THEFIRSTALERTWILLBE", "The first alert will be "); text += nextInterval.NotificationPeriod + " " + unit; if (value != 0 && value % nextInterval.Interval == 0) parseInt(value / nextInterval.Interval) * nextInterval.Interval else value = (parseInt(value / nextInterval.Interval) + 1) * nextInterval.Interval; text += GetTextByKey("P_MA_BEFORETHEASSETREADING", " before the asset reading ") + value + " " + unit; text += GetTextByKey("P_MA_FOR", " for ") + nextInterval.ServiceName + "."; } } return text; }