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();
}