const PACK_CODE_EMPTY_STRING = "ОТСУТСТВУЕТ"; var activeConfig = ""; var inited = false; var tab = 0; var devices = []; var counters = []; var tasks = []; var filteredTasks = []; let filterDateTask = new Date(); var errorChangeTimer = null; var errorCount = 0; var systemProperties = null; var systemStatus = null; let rowCountView = 5; /// DEBUG SECTION var debug_en = false; var consoleHolder = console; var HistoryAPI = function () { this.state = null; this.history = []; }; HistoryAPI.prototype.pushState = function (state) { this.history.push(this.state); this.state = state; }; HistoryAPI.prototype.back = function () { if (this.history.length > 0) { this.state = this.history.pop(); } if (this.state) { if (this.state === 'page2' && testHaveError) this.state = 'page1'; _pageselect(this.state); } }; window.customHistory = new HistoryAPI(); function debug(bool) { debug_en = bool; if (!bool) { consoleHolder = console; console = {}; Object.keys(consoleHolder).forEach(function (key) { console[key] = function () { }; }) } else { console = consoleHolder; } } //debug(false); /// END DEBUG SECTION function pageselect(pageName) { _pageselect(pageName); customHistory.pushState(pageName); } function _pageselect(pageName) { if (pageName) { $(".page").addClass('hide'); var page = $('#' + pageName); page.removeClass('hide'); page.trigger("showPage"); if (pageName == "page4") { //initChart(); // uiupdate1(); } if (pageName == "page3") { $('#config > .active').removeClass('active'); } if(pageName === 'page-packEdit') $("#page-packEdit .topList input.stamp").focus(); if(pageName === 'page-palletEdit') $("#page-palletEdit .topList input").focus(); if(pageName === 'value-editor-page') $("#editor-value").focus(); if(pageName === 'value-editor-page') $("#editor-value").focus(); } } function uiupdate1() { //updateChart(counters[tab].read, counters[tab].notRead); // $("#sensorlist").empty(); for (var i = 0; i < counters.length; i++) { var template = "
\ " + counters[i].localizedName + "
" + (counters[i].status == "OFF" ? "
Выключен
" : "
Считано
\
" + fNum(counters[i].read) + "
\
Не считано
\
" + fNum(counters[i].notRead) + "
") + "
"; $("#sensorlist").append(template); } $("#tab_title").text(counters[tab].localizedName); $("#breadgood").text(fNum(counters[tab].read)); $("#breadbad").text(fNum(counters[tab].notRead)); $("#pic").attr("src", tabimage[tab]); } function fNum(number) { return new Intl.NumberFormat('ru-RU').format(number); } var tabimage = [ "img/PDF417.png", "img/dm.png", "img/barcode.png", "img/pallet.png" ]; function updateChart(good, bad) { if (config) { config.data.datasets[0].data = [bad, good]; window.myPie.update(); } } var config; // config pie chart function initChart() { var ctxP = document.getElementById("pieChart").getContext('2d'); config = { type: 'pie', data: { labels: ["Ошибки", "Успешно"], datasets: [ { data: [0, 0], backgroundColor: ["#F7464A", "green"], hoverBackgroundColor: ["#FF5A5E", "green"] } ] }, options: { tooltips: { enabled: false }, legend: { display: false }, responsive: true } }; window.myPie = new Chart(ctxP, config); } function uiupdate() { var formatted = new Date().toTimeString().match(/^([0-9]{2}:[0-9]{2}:[0-9]{2})/)[0]; $(".current-time").text(formatted); } function changeConfPage(side) { var p = confpage + side; if (p <= Math.ceil(filteredTasks.length / rowCountView) && p > 0) { confpage = p; confFill(); } } var confpage = 1; function confFill() { filterStartDateTask(filterDateTask) $("#btnStartModal").prop("disabled", true); $("#btnEndTaskModal").attr("disabled", true); $("#btnTaskReport").attr("disabled", true); $("#confs").empty(); if (filteredTasks.length > rowCountView) { $("#paging").removeClass("hide"); } $("#pageleft").prop("disabled", confpage == 1); $("#pageright").prop("disabled", confpage == Math.ceil(filteredTasks.length / rowCountView)); for (var i = ((confpage - 1) * rowCountView); i < (confpage * rowCountView); i++) { if (i < filteredTasks.length) { let conf = filteredTasks[i]; console.log("***", conf); $("#confs").append(`
${conf.localizedName}
${conf.localizedStatus}
`); } else { $("#confs").append("
"); } } $("#confs").on("click", ".data", function () { let $this = $(this); let index = $this.data('taskIndex'); let task = filteredTasks[index]; let enableStart = task.status === 'ASSIGNED' || task.status === 'PROCESSING'; let enableEnd = task.type === 'SINGLE' && enableStart; activeConfig = $this.data('alias'); $('#confs > .active').removeClass('active'); $this.addClass('active'); $("#btnStartModal").prop("disabled", !enableStart); $("#btnEndTaskModal").attr("disabled", !enableEnd); $("#btnTaskReport").attr("disabled", false); }); } function closeWindow() { stompClient.send("/app/stop"); window.close(); } function cleanErrors() { $("#errors").empty(); $(".errorCount").text(0); $(".errorCount").hide(); errorCount = 0; $(".btn-errors-page").attr("disabled", true); } function closePallet() { stompClient.send("/app/pallet/close"); customHistory.back(); } function closePalletOnStart() { let palletId = $("#noClosedPallet").data("palletId"); subscribeOnce("/topic/pallet/close").then(startConveyour); stompClient.send("/app/pallet/close", {}, palletId); } function closePack() { stompClient.send("/app/pack/close"); customHistory.back(); } function pauseSectionModal(section) { var groupName = ""; switch (section) { case "Scanners Group": groupName = "Остановить группу сканирования?"; break; case "Camera Group": groupName = "Остановить группу агрегирования?"; break; case "Pallet Group": groupName = "Остановить группу палетирования?"; break; case "Marker Group": groupName = "Остановить группу маркировки?"; break; default: groupName = section; break; } $("#groupStop").text(groupName); $("#spanPause").text(section); pageselect("modalPause"); } function resetSectionModal(section) { var groupName = ""; switch (section) { case "Scanners Group": groupName = "Сбросить группу сканирования?"; break; case "Camera Group": groupName = "Сбросить группу агрегирования?"; break; case "Pallet Group": groupName = "Сбросить группу палетирования?"; break; case "Marker Group": groupName = "Сбросить группу маркировки?"; break; default: groupName = section; break; } $("#groupReset").text(groupName); $("#spanReset").text(section); pageselect("modalReset"); } function resetRejectorSectionModal(section) { var groupName = ""; switch (section) { case "Scanners Group": groupName = "Сбросить бракиратор группы сканирования?"; break; case "Camera Group": groupName = "Сбросить бракиратор группы агрегирования?"; break; case "Pallet Group": groupName = "Сбросить бракиратор группы палетирования?"; break; default: groupName = section; break; } $("#groupResetRejector").text(groupName); $("#spanResetRejector").text(section); pageselect("modalResetRejector"); } //запись лога на странице бэкапа function writeToLog(message, target) { let formatted = new Date().toTimeString().match(/^([0-9]{2}:[0-9]{2}:[0-9]{2})/)[0]; let wtf = $('#' + target); wtf.append(formatted + " : " + message + "\r\n"); let height = wtf[0].scrollHeight; wtf.scrollTop(height); } function clearLog(target) { $("#" + target).empty(); } function closeTask() { let taskId = $('#modalEndTask .taskText').data('taskId'); stompClient.send("/app/task/close", {}, taskId); customHistory.back(); } function openModalEndTask() { let taskName = $('#page2 #confs .data.active').text(); let taskId = $('#page2 #confs .data.active').data('taskId'); $('#modalEndTask .taskText').html(taskName); $('#modalEndTask .taskText').data('taskId', taskId); pageselect("modalEndTask"); } function downloadTaskReport(format) { let taskId = $('#page2 #confs .data.active').data('taskId'); $.ajax({ type: 'GET', url: '/api/reports/task/' + taskId, data: { format: format }, success: function (data, textStatus, jqXHR) { let disposition = jqXHR.getResponseHeader('Content-Disposition'); let type = jqXHR.getResponseHeader('Content-Type'); fileDownload(jqXHR.responseText, disposition, type); }, error: function (jqXHR, textStatus, errorThrown) { console.log("ERROR : ", jqXHR.responseText); viewError("page2", jqXHR.responseText); } }); } function fileDownload(data, disposition, type) { let filename = "report.xml"; if (disposition && disposition.indexOf('attachment') !== -1) { let filenameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/; let matches = filenameRegex.exec(disposition); if (matches != null && matches[1]) { filename = matches[1].replace(/['"]/g, ''); filename = filename.replace(/UTF-8/g, ''); } } const blob = new Blob([data], {type: type}); const url = window.URL.createObjectURL(blob); const link = document.createElement('a'); link.href = url; link.setAttribute('download', decodeURI(filename)); link.click(); } function counterProcess(data) { let counters = JSON.parse(data.body.toString()); for (let counter of counters) { $("." + counter.name + " .good").text(counter.read); $("." + counter.name + " .verified").text(counter.verified); $("." + counter.name + " .bad").text(counter.notRead); $("." + counter.name + "> .packed").text(counter.packed); $("." + counter.name + "> .unpacked").text(counter.unpacked); if (counter.status == "ON") { $("." + counter.name).parent().removeClass("disable"); if (counter.name === 'PalletCounter') $("." + counter.name).parent().parent().removeClass("disable"); } else { $("." + counter.name).parent().addClass("disable"); if (counter.name === 'PalletCounter') $("." + counter.name).parent().parent().removeClass("disable"); } } } function itemCounterProcess(data) { let counters = JSON.parse(data.body.toString()); for (let counter of counters) { let currentValue = counter.currentValue; let maxValue = counter.maxValue; $("." + counter.name + " .title").text(counter.title !== 'null' ? counter.title : 'ОТСУТСВУЕТ'); if (counter.itemStatus == 'DEFECTIVE') { $("." + counter.name + " .subtitle").addClass('bad'); } else { $("." + counter.name + " .subtitle").removeClass('bad'); } $("." + counter.name + " .subtitle").text(counter.subtitle); $("." + counter.name + " .currentValue").text(currentValue); $("." + counter.name + " .subValue").text(counter.subValue); $("." + counter.name + " .maxValue").text(maxValue); if (counter.status == "ON") $("." + counter.name).parent().removeClass("disabled"); else $("." + counter.name).parent().addClass("disabled"); let progressBar = $("." + counter.name + " .progress-bar") .attr('aria-valuenow', currentValue) .attr('aria-valuemax', maxValue); if (maxValue != 0) { var percentage = currentValue * 100 / maxValue; progressBar.css('width', percentage + '%') .parent() .removeClass("active"); $("." + counter.name + " .from").show(); $("." + counter.name + " .maxValue").show(); } else { progressBar.css('width', '100%') .parent() .addClass("active"); $("." + counter.name + " .from").hide(); $("." + counter.name + " .maxValue").hide(); } } } function pauseSection(section) { stompClient.send("/app/pause", {}, section); customHistory.back(); } function resetSection(section) { stompClient.send("/app/reset", {}, section); customHistory.back(); } function resetRejectorSection(section) { stompClient.send("/app/reset/rejector", {}, section); customHistory.back(); } function resumeSection(section) { stompClient.send("/app/resume", {}, section); } function processPauseMessage(data) { pauseResume(data.body, 0); } function processResumeMessage(data) { pauseResume(data.body, 1); } function pauseResume(section, state) { let cnt; switch (section) { case "Pallet Group": cnt = "actionPalletBtn"; $(".btnClosePalletModal").prop("disabled", state != 1); break; case "Scanners Group": cnt = "StampCounter"; $("." + cnt).parent().removeClass((state == 1 ? "inforow" : "inforowOff")); $("." + cnt).parent().addClass((state == 1 ? "inforowOff" : "inforow")); break; case "Camera Group": cnt = "PackCounter"; $("#btnClosePackModal").prop("disabled", state != 1); // Если есть бракиратор в группе агрегирования if (devices.find(device => { return device.type == "REJECTOR" && device.groupName == section; })) { $("." + cnt).parent().find(".but > .btn-reset-rejector").removeClass("invisible"); }; break; case "Marker Group": cnt = "MarkerCounter"; $("." + cnt).parent().removeClass((state == 1 ? "inforow" : "inforowOff")); $("." + cnt).parent().addClass((state == 1 ? "inforowOff" : "inforow")); break; default: break; } if (cnt) { $("." + cnt).parent().find(".but > ." + (state == 1 ? "on" : "off")).removeClass("hide"); $("." + cnt).parent().find(".but > ." + (state == 1 ? "off" : "on")).addClass("hide"); } } function cursorToEnd(obj) { var start, end; start = end = obj.value.length; if (obj.setSelectionRange) { obj.focus(); obj.setSelectionRange(start, end); } else if (obj.createTextRange) { var range = obj.createTextRange(); range.collapse(obj); range.moveEnd('character', end); range.moveStart('character', start); range.select(); } } function unclosedPallet(data) { $("#noClosedPallet").addClass("hide"); $("#btnStart").removeClass("hide"); $("#btnCloseCurrentPallet").addClass("hide"); $("#startText").removeClass("hide"); $("#configText").removeClass("hide"); let pallet = JSON.parse(data.body.toString()); let taskName = ""; let taskId = $('#page2 #confs .data.active').data('taskId'); for (let i = 0; i < (tasks.length); i++) { let conf = tasks[i]; if (conf.id == pallet.taskId) { taskName = conf.name; break; } } let currentPalletStatus = pallet.status; let packs = pallet.packs.length; if (currentPalletStatus == "INCOMPLETE" && packs != 0) { if (taskId != pallet.taskId) { $("#noClosedPallet").removeClass("hide"); $('#noClosedPallet').data('palletId', pallet.id); $("#noClosedPallet").html("В задании " + taskName + " есть незавершённая палета № " + pallet.palletNumber + ". Завершить палету и запустить задание " + $("#configText").html() + " ?"); $("#btnStart").addClass("hide"); $("#configText").addClass("hide"); $("#btnCloseCurrentPallet").removeClass("hide"); $("#startText").addClass("hide"); } } pageselect("modalStart"); } function getPropertyPalletGroupPauseEnabled() { if (systemProperties == null) return true; // совместимость со старыми версиями return !(systemProperties.palletGroupPauseEnabled == false); } function sendFileAjax(selectFile, url) { // Create a Deferred let deferred = $.Deferred(); if (typeof selectFile == 'undefined') { deferred.reject("Не выбран файл"); } else { let data = new FormData(); data.append('fileXml', selectFile); $.ajax({ type: "POST", enctype: 'multipart/form-data', url: url, data: data, processData: false, contentType: false, cache: false, timeout: 1000000, success: function (data, textStatus, jqXHR) { console.log("SUCCESS : ", data); deferred.resolve(); }, error: function (jqXHR, textStatus, errorThrown) { console.log("ERROR : ", jqXHR.responseText); viewError("page3_1", jqXHR.responseText); deferred.reject(jqXHR.responseText); } }); } return deferred; } function fixGroupSeparatorCharacters(selector) { let altValue = ''; selector.keydown(function (e) { console.log(`keyCode= ${e.keyCode}, altKey= ${e.altKey}, ctrlKey=${e.ctrlKey}, shiftKey= ${e.shiftKey}, key=${e.key}`); if (e.altKey) { // Код самой клавиши Alt if (e.which != 18) { altValue += e.which } // Сравниваем набор кодов после нажатия клавиши Alt с цифровым кодом 029 (коды клавиатуры 96, 98, 105) // или последовательностью Insert, Arrow Down, Page Up (коды клавиатуры 45, 40, 33) if (altValue === '969698105' || altValue === '9698105' || altValue === '454033') { this.value += String.fromCharCode(29); } e.preventDefault(); e.stopPropagation(); } else if (e.ctrlKey) { // Сравниваем код после нажатия клавиши Ctrl с кодом клавиатуры 221 if (e.which == 221) { this.value += String.fromCharCode(29); e.preventDefault(); e.stopPropagation(); } } }); selector.keyup(function (e) { if (e.altKey === false) { altValue = ''; } }); } var entityMap = { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''', '/': '/', '`': '`', '=': '=' }; function escapeHtml (string) { return String(string).replace(/[&<>"'`=\/]/g, function (s) { return entityMap[s]; }); } function hashCode(s) { return s.split("").reduce(function (a, b) { a = ((a << 5) - a) + b.charCodeAt(0); return a & a }, 0); } function filterCurrentTimeTask() { filterDateTask = new Date(); confFill() } function filterAllTask() { filterDateTask = null; confFill() } function filterStartDateTask(date) { if (date) { let filterDate = dateFormat(date) filteredTasks = tasks.filter((task, index) => { return dateFormat(new Date(task.dueDate)) === filterDate }) } else { filteredTasks = tasks; } } function isNewDayFilter() { if (filterDateTask) { return filterDateTask.getDate() !== new Date().getDate(); } } function filterTaskNewDay() { if(isNewDayFilter()) { filterDateTask = new Date() confFill() } } function getSystemInfo() { subscribeOnce("/app/systemInfo").then(sysInfoProcess); } // Скрываем блок вспомогательного кода function isSingle() { if (systemProperties.single) { $('.link-mode').addClass("hide"); } else { $('.link-mode').removeClass("hide"); } } // Скрываем единиц продукции в палет function isAddItemToPallet() { console.log("777777",systemProperties.addItemToPallet) if (systemProperties.addItemToPallet === true) { $('.addItemToPallet').removeClass("hide"); $('#page-palletEdit .filter input').attr('placeholder', "коробка" + " / единица продукции") $('#page-palletEdit .btnAddPackItemToPallet').html(" Добавить коробку
или продукцию") } else { $('.addItemToPallet').addClass("hide"); $('#page-palletEdit .filter input').attr('placeholder', "коробка") $('#page-palletEdit .btnAddPackItemToPallet').html(' Добавить коробку') } } function viewHideCounters(counters) { if (counters.findIndex(counter => counter.name === 'PalletScannerCounter') === -1) { $('.PalletScannerCounter').addClass("hide"); $('.PalletScannerCounter').prev().addClass("span2"); } else { $('.PalletScannerCounter').removeClass("hide"); $('.PalletScannerCounter').prev().removeClass("span2"); } if (counters.findIndex(counter => counter.name === 'PalletStampCounter') === -1) { $('.PalletStampCounter').addClass("hide"); $('.PalletStampCounter').next().addClass("hide"); } else { $('.PalletStampCounter').removeClass("hide"); $('.PalletStampCounter').next().removeClass("hide"); } } function extractSSCCCode(value) { const SSCC_AI = '00'; try { const answer = parseBarcode(value); const ssccItem = answer.parsedCodeItems.find(codeItem => codeItem.ai === SSCC_AI); if (ssccItem) { return SSCC_AI + ssccItem.data; } } catch (e) { console.log(`Ошибка при разборе кода ${value}: ${e}`); } return value; } // Открываем используемые группы устройств function excludeCategory() { let groups = systemProperties.enabledGroups; for (var i = 0; i < groups.length; i++) { if (groups[i] === "Marker Group") { $('#marking-group').removeClass("hide"); } if (groups[i] === "Scanners Group") { $('#scanning-group').removeClass("hide"); } if (groups[i] === "Camera Group") { $('#aggregating-group').removeClass("hide"); } if (groups[i] === "Pallet Group") { $('#pallet-group').removeClass("hide"); } } } function sendCheckLineStatusAjax() { let deferred = $.Deferred(); $.ajax({ type: 'GET', data: {}, url: '/line/check', success: function (data) { console.log("SUCCESS", data); viewErrorReset('manual-page'); $('.btn_line_off_disable').removeClass('disabled'); if(!data.pack) { $('.manual_pack').addClass('disabled'); $('.task_pack_view').hide(); } else { $('.task_pack_view').show(); } if(!data.pallet){ $('.manual_pallet').addClass('disabled'); $('.task_pallet_view').hide(); } else { $('.task_pallet_view').show(); } deferred.resolve(data); }, error: function (jqXHR, data) { console.log("ERROR : ", jqXHR.responseText); viewErrorReset('manual-page'); viewError("manual-page", jqXHR.responseText); $('.btn_line_off_disable').addClass('disabled'); deferred.reject(data); } }); return deferred.promise(); }