您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Помощник по заполнению склада
// ==UserScript== // @name Virtonomica:Заполнение склада // @namespace virtonomica // @description Помощник по заполнению склада // @author UnclWish // @include http*://*virtonomic*.*/*/main/unit/view/* // @include http*://*virtonomic*.*/*/main/unit/view/*# // @version 2.9 // ==/UserScript== var run = function() { //---------------------------------------------------------------- var win = (typeof(unsafeWindow) != 'undefined' ? unsafeWindow : top.window); var $ = win.$; //--------------------------------------------------------------------- // работа с локальным хранилищем //--------------------------------------------------------------------- /** * записать данные в локальное хранилище, с проверкой ошибок */ function ToStorage(name, val) { try { window.localStorage.setItem(name, JSON.stringify(val)); } catch(e) { var out = "Ошибка добавления в локальное хранилище"; console.log(out); } } //--------------------------------------------------------------------- // end of работа с локальным хранилищем //--------------------------------------------------------------------- var wc_info = $("<div id=v_info></div>"); var wc_link = $("<div id=v_link></div>"); // Проверим ссылку что это игровое поле var href = location.href; if ((href).slice(-1)=="#") href = (href).slice(0,-1); if ((href).slice(-3)=="old") href = (href).slice(0,-4); var realm = href.replace('https://virtonomica.ru/',''); realm = realm.substr(0,4); var tm_info_link = `https://virtonomica.ru/${realm}/window/globalreport/tm/info`; var tm_api_link = `https://virtonomica.ru/api/${realm}/main/brandname/browse?pagesize=10000`; var vl_info_link = `https://virtonomica.ru/${realm}/main/industry/unit_type/info/2011/volume`; var title=$('#wrapper > div.metro_header > div > div.picture').attr('class'); if (title.search('unit-header-warehouse') == -1) return; // Выход если не склад var a1=$('div.title').text().trim(); //var a2=a1.slice(0,5); //if(a2 != "Склад") return; // Выход если не склад var a3=(href).slice(-3); //console.log(a3); if (isNaN(a3)) return; //Выход если не главная страница //console.log(a3); if (a1.indexOf("Офис") == -1 ) return; //Выход если главная страница не нашей компании $("table.infoblock").after(wc_info); $("table.grid").after(wc_link); function getValsArray() { var vals_array = new Object(); $.ajax({ url: vl_info_link, async: false, //то самое плохое место с синхронными запросами. Зато работает без дополнительных проверок. Но лучше избегать, конечно. success: function(data){ var table = $("#mainContent > div.table-responsive.table-warehouse > table", data); //console.log('table = ' + table.length); //alert ('table = ' + table.length); var tr = $("tbody > tr", table); //console.log('tr = ' + tr.length); for (var i=0; i<tr.length; i++){ //var th = $("th", tr.eq(i) ); var th = $("td>span>button>span>i", tr.eq(i) ); //var td = $("td", tr.eq(i) ); var td = $("td>span>span", tr.eq(i) ); var img = $("td>span>button", tr.eq(i) ).attr('data-link'); //console.log('img = ' + img.length); //var src = img.attr('href'); for(var j=0; j< td.length; j++){ //var code = src.replace('https://virtonomica.ru/'+realm+'/main/product/info/',''); var arrayimg = img.split("&tpl"); arrayimg.pop(); //var imageName = array.join(""); var code = arrayimg[0].replace('https://virtonomica.ru/api/'+realm+'/main/product/info?id=',''); //var name = th.eq(j).text(); var name = th.eq(j).attr('data-content'); var vals = td.eq(j).text(); //vals = parseFloat( vals.replace('$', '').replace(' ', '').replace(' ', '').replace(' ', '') ); vals = parseFloat( vals.replace(/\u00A0/g, '')); //console.log (vals); vals_array[name] = new Object(); vals_array[code] = new Object(); vals_array[name].name = name; vals_array[code].code = code; vals_array[name].vals = vals; vals_array[code].vals = vals; } } ToStorage('vals_array', vals_array); }, //ajaxError: //$("#v_info").append("<br>" + np + " - нет данных по объемам хранения. Если товар не ТМ, сохраните данные на странице по <a href=https://virtonomica.ru/"+realm+"/main/industry/unit_type/info/2011/volume>ссылке</a>").css('color', 'red') }); } function getArrayTM() { var arrayTM = new Object(); $.ajax({ url: tm_api_link, async: false, //то самое плохое место с синхронными запросами. Зато работает без дополнительных проверок. Но лучше избегать, конечно. success: function(TM){ var TMdata = TM.data; //console.log(TMdata); for (var key in TMdata) { var symbolTM = TMdata[key].symbol; var nameTM = TMdata[key].name; var name = TMdata[key].product_name; arrayTM[symbolTM] = new Object(); //ic_array[code] = new Object(); arrayTM[symbolTM].name = name; //ic_array[code].code = code; arrayTM[symbolTM].nameTM = nameTM; //ic_array[code].vals = ic; } ToStorage('arrayTM', arrayTM ); }, //ajaxError: //$("#v_info").append("<br>" + np + " - нет данных по объемам хранения. Если товар не ТМ, сохраните данные на странице по <a href=https://virtonomica.ru/"+realm+"/main/industry/unit_type/info/2011/volume>ссылке</a>").css('color', 'red') }); } function getArrayTMold() { var arrayTM = new Object(); $.ajax({ url: tm_info_link, async: false, //то самое плохое место с синхронными запросами. Зато работает без дополнительных проверок. Но лучше избегать, конечно. success: function(data){ var tmimg_data = $("td>img[src*='/img/products']",data); //console.log (tmimg_data); //var tm_data = $("td>img[src*='/img/products']",data).parent().next(); for (var i=0; i<tmimg_data.length; i++) { var tm_data = tmimg_data.eq(i).parent().next(); var code = tmimg_data.eq(i).attr('src'); //console.log(code); var tm_name = tm_data.text(); tm_name = tm_name.split('\n'); tm_name = tm_name[2].trim(); //np = tm_name; var name = tm_name; //console.log(name); arrayTM[name] = new Object(); arrayTM[code] = new Object(); arrayTM[name].name = name; arrayTM[name].code = code; arrayTM[code].name = name; } ToStorage('arrayTM', arrayTM ); }, //ajaxError: //$("#v_info").append("<br>" + np + " - нет данных по объемам хранения. Если товар не ТМ, сохраните данные на странице по <a href=https://virtonomica.ru/"+realm+"/main/industry/unit_type/info/2011/volume>ссылке</a>").css('color', 'red') }); } function num(num, x){ //num = num.toFixed(2); var parts = num.split('.'); parts[0] = parts[0].substr(0, parts[0].length%3)+parts[0].substr(parts[0].length%3).replace(/(\d{3})/g,' \$1'); if (parts[0].length%4 == 0) parts[0] = parts[0].slice(1); if (x) return parts.join('.'); else return parts[0]; } function UpdateValsStorage() { // удаляем данные по объемам хранения и обновляем страницу window.localStorage.removeItem('vals_array'); getValsArray(); location.reload(); } var vals_array = JSON.parse(window.localStorage.getItem('vals_array')); if (vals_array == null) { getValsArray(); vals_array = JSON.parse(window.localStorage.getItem('vals_array')); } //var UpdateVals = $('<input type=submit class=button100 id=bsave value="Обновить">').unbind('click').click(function() { var UpdateVals = $('<button id=bsave>Обновить</button>').unbind('click').click(function() { UpdateValsStorage(); }); $("#v_info").html("Вы можете обновить значения объемов хренения, если они изменились ").css('color', 'blue').append(UpdateVals); // -------------------------- определяем размер склада var valskl = $("table.infoblock td.title:eq(0)").next().text(); var typeskl = $("table.infoblock td.title:eq(1)").next().text(); var valskl2 = valskl.slice(-10).slice(0,1); valskl = parseFloat(valskl) * 1000; //console.log (valskl); //console.log (valskl2); if (valskl2 == "н") valskl = valskl * 1000; //console.log (typeskl); if (typeskl == "Загоны для животных") valskl = valskl * 10 // ------------------------------------------------------------------------------------------------- /// -------------------------- добавляем столбцы, расчитываем и выводим новое заполнение склада var r = 0; var sumproc = 0; // суммарный процент заполнения $("table.grid tbody tr[class]").each( function(){ var nameprod = $("td:eq(0)",this).text(); //console.log(nameprod); //if ((nameprod).slice(-8) == "(устар.)") {nameprod = nameprod.replace(' (устар.)','')}; var imgprod = $("td:eq(0)>img",this).attr('src'); var symbol = imgprod.replace('/img/products/',''); symbol = symbol.replace('.gif',''); //console.log(symbol); var nowqual = $("td:eq(1)",this).text().trim().replace(' ', '').replace(' ', '').replace(' ', '').replace(' ', ''); var nowsale = $("td:eq(5)",this).text().trim().replace(' ', '').replace(' ', '').replace(' ', '').replace(' ', ''); var nowzak = $("td:eq(6)",this).text().trim().replace(' ', '').replace(' ', '').replace(' ', '').replace(' ', ''); var newqual = nowqual - nowsale; if (newqual < 0) newqual = 0; newqual = newqual + nowzak * 1; var sklproc = Get_skl_procent(symbol, imgprod, nameprod, valskl, newqual); /*if (isNaN(sklproc)) { // Если нет в базе, т.е. ТМ-ка, пробуем расчитать по складской процентовке, иначе считаем "0" var nowproc=$("td:eq(9)",this).text(); nowproc=parseFloat(nowproc)*1; sklproc=0; if (nowproc!=0) { sklproc=nowproc*newqual/nowqual; } }*/ sklproc = sklproc.toFixed(2); var tcolor = "green"; if (sklproc > 69.99) tcolor = "orange"; if (sklproc > 89.99) tcolor = "red"; var txt = "<td align=right class=nowrap style=color:"+tcolor+">"+sklproc+" %</td>"; if (r == 0) $(this).prev().append('<th>Будет %</th><th>'); r = r + 1; sumproc = sumproc + sklproc * 1; $(this).append(txt); }); // -------------------------- добавляем сведения о доставках на склад ----------------------------------- var prod_name = []; var prod_qual = []; //var prod_img1; var prod_img = []; var symbol = []; var new_url = href+"/delivery"; //console.log(new_url); var u = 0; var a = 0; var b = 0; $.get(new_url, function(data) { //$('#mainContent>table.list>tbody>tr[class]>td',data).each(function() { $('#mainContent > div.table-responsive > table > tbody > tr > td',data).each(function() { switch (u){ // Доставляемый товар и количество case 0: prod_name[a] = $(this,data).text().trim(); //prod_img[a] = $("img[src*='/img/products']",this).attr('src'); //prod_img1 = $("i[class*='ico pr-ico']",this).attr('class').split(/\s/g); prod_img[a] = $("i[class*='ico pr-ico']",this).attr('class'); //prod_img[a] = prod_img1[2]; //prod_img1 = prod_img1[2].split("-"); //prod_img[a] = "/img/products/"+prod_img1[1]+".gif"; //console.log(prod_img[a]); a = a + 1; break; case 1: prod_qual[b] = $(this,data).text().trim().replace(/\u00A0/g, '').replace(/\s/g, ''); b = b + 1; break; } //console.log(prod_name[a], prod_qual[a]); u = u + 1; if (u==3) u = 0; }); //console.log(prod_name, prod_qual); if (u==0) var valdos = 0; var dossum = AfterLoad (valskl, prod_name, prod_qual, prod_img); sumproc = sumproc + dossum * 1; sumproc = sumproc.toFixed(2); var tcolor2 = "green"; if (sumproc > 69.99) tcolor2 = "orange"; if (sumproc > 89.99) tcolor2 = "red"; $("table.grid tbody").append("<tr><td style=color:blue>Просмотр <a href="+vl_info_link+">объемов хранения</a> и <a href="+tm_info_link+">списка ТМ</a><td><td><td><td><td><td><td><td><td>Итого:</td><td align=right class=nowrap style=color:"+tcolor2+">"+sumproc+" %</td></tr>"); }); //------------------------------------------------------------------------------------------------------------- // -------------------------- расчет процента заполнения склада------------------------------------------------- function Get_skl_procent(spi, ip, np, vs, vp){ if (vals_array[np] == null ) { var arrayTM = JSON.parse(window.localStorage.getItem('arrayTM')); if (arrayTM == null) { getArrayTM(); arrayTM = JSON.parse(window.localStorage.getItem('arrayTM')); } //console.log(np,spi,ip); if (arrayTM[spi] == null) { $("#v_info").append('Объемы хранения товара "'+np+'" не найдены, возможно новый товар. Обновляем базу объёмов складируемой продукции...').css('color', 'red').css('font-size', '8pt'); getValsArray(); vals_array = JSON.parse(window.localStorage.getItem('vals_array')); if (vals_array[np] == null ) { $("#v_info").append('Объемы хранения товара "'+np+'" не найдены, возможно новый товар с ТМ. Обновляем базу объёмов складируемой продукции ТМ...').css('color', 'red').css('font-size', '8pt'); getArrayTM(); arrayTM = JSON.parse(window.localStorage.getItem('arrayTM')); np = arrayTM[spi].name; //console (np, name); } } else np = arrayTM[spi].name; } var proc = vp / vals_array[np].vals * 10000 / vs * 100; return proc; } // -------------------------- расчет процента доставки на склад------------------------------------------------------- function AfterLoad (vs, p_n, p_q, p_i){ var sp = 0; for (var y=0; y<p_n.length; y++) { var np = p_n[y]; var vp = p_q[y]; var ip = p_i[y]; var dosproc = Get_skl_procent (ip, ip, np, vs, vp); var tcolor3 = "green"; if (dosproc > 69.99) tcolor3 = "orange"; if (dosproc > 89.99) tcolor3 = "red"; dosproc = dosproc.toFixed(2); var vpnum = num (vp, false); //$("table.grid tbody").append("<tr style='BACKGROUND-COLOR : #d0f0c0'><td><img src='"+ip+".svg' alt='"+np+"' width='25' align=middle style='margin-right: 10px' border=0>"+np+"<td><td><td><td><td><td><td align=right>"+vpnum+"<td><td>Доставка :</td><td align=right class=nowrap style=color:"+tcolor3+">"+dosproc+" %</td></tr>"); $("table.grid tbody").append("<tr style='BACKGROUND-COLOR : #d0f0c0'><td><i class='"+ip+"' data-container='body' data-trigger='hover' data-placement='right' data-content='"+np+"' data-original-title title></i>"+np+"<td><td><td><td><td><td><td align=right>"+vpnum+"<td><td>Доставка :</td><td align=right class=nowrap style=color:"+tcolor3+">"+dosproc+" %</td></tr>"); sp = sp + dosproc * 1; } sp = sp.toFixed(2); tcolor3 = "green"; if (sp > 69.99) tcolor3 = "orange"; if (sp > 89.99) tcolor3 = "red"; if (sp == 0) $("table.grid tbody").append("<tr><td><td><td><td><td><td><td><td><td><td>Доставок нет</td><td align=right class=nowrap style=color:"+tcolor3+"></td></tr>"); else $("table.grid tbody").append("<tr><td><td><td><td><td><td><td><td><td><td>Доставка всего:</td><td align=right class=nowrap style=color:"+tcolor3+">"+sp+" %</td></tr>"); return sp; } }; var script = document.createElement("script"); script.textContent = '(' + run.toString() + ')();'; document.documentElement.appendChild(script);