revert to stable base b5714a6
This commit is contained in:
parent
d2495bf929
commit
3848ee5a3b
535
index.html
535
index.html
@ -90,7 +90,6 @@ tr:hover{background:#FAFBFC}
|
||||
<div class="logout"><button class="btn btn-sm btn-r" style="width:100%" onclick="doLogout()">Выйти</button></div>
|
||||
</div>
|
||||
<div id="main">
|
||||
<div id="reminder_bar" style="display:none;background:#FFF3E0;border:1px solid #FDE68A;border-radius:8px;padding:8px 16px;margin-bottom:12px;font-size:12px;color:#92400E"></div>
|
||||
<div class="top"><h2 id="page_title">Мероприятия</h2>
|
||||
<div style="display:flex;gap:8px;align-items:center">
|
||||
<span id="stor_ind" class="stor-bar"></span>
|
||||
@ -153,13 +152,7 @@ tr:hover{background:#FAFBFC}
|
||||
<option value="h1">1-е полугодие</option>
|
||||
<option value="h2">2-е полугодие</option>
|
||||
</select>
|
||||
<span style="font-size:12px;color:#64748B">с</span> <select id="rp_month_from" onchange="renderReports()" style="padding:6px 10px;border:1px solid #E2E8F0;border-radius:6px;font-size:12px">
|
||||
<option value="0">Январь</option><option value="1">Февраль</option><option value="2">Март</option>
|
||||
<option value="3">Апрель</option><option value="4">Май</option><option value="5">Июнь</option>
|
||||
<option value="6">Июль</option><option value="7">Август</option><option value="8">Сентябрь</option>
|
||||
<option value="9">Октябрь</option><option value="10">Ноябрь</option><option value="11">Декабрь</option>
|
||||
</select>
|
||||
<span style="font-size:12px;color:#64748B">по</span> <select id="rp_month_to" onchange="renderReports()" style="padding:6px 10px;border:1px solid #E2E8F0;border-radius:6px;font-size:12px">
|
||||
<select id="rp_month" onchange="renderReports()" style="padding:6px 10px;border:1px solid #E2E8F0;border-radius:6px;display:none">
|
||||
<option value="0">Январь</option><option value="1">Февраль</option><option value="2">Март</option>
|
||||
<option value="3">Апрель</option><option value="4">Май</option><option value="5">Июнь</option>
|
||||
<option value="6">Июль</option><option value="7">Август</option><option value="8">Сентябрь</option>
|
||||
@ -249,8 +242,6 @@ tr:hover{background:#FAFBFC}
|
||||
<p style="font-size:11px;color:#64748B;margin-top:8px">На корпоративную почту придёт уведомление о регистрации и напоминания о необходимости представления отчёта</p>
|
||||
</div></div></div>
|
||||
<script>
|
||||
try{
|
||||
alert("JS OK");
|
||||
var ALL_EVENTS=[
|
||||
{
|
||||
"id": 1,
|
||||
@ -976,41 +967,6 @@ var brs=["Дирекция производственной безопаснос
|
||||
var stn={warn:"В процессе",late:"Просрочено",done:"Исполнено"};
|
||||
var stc={warn:"a",late:"r",done:"g"};
|
||||
var USR={curator:{n:"Куратор ПБ",bg:0},admin:{n:"Администратор",bg:0},dpp:{n:"Директор ДПБ",bg:0},ivanov:{n:"Иванов Иван",bg:1},petrov:{n:"Петров Петр",bg:2},sidorov:{n:"Сидоров Сидор",bg:3},kozhin:{n:"Кожин А.М.",bg:4},ismailov:{n:"Исмаилов Р.К.",bg:1},nurpeisov:{n:"Нурпеисов Д.А.",bg:5},suleimenov:{n:"Сулейменов К.Т.",bg:6},kassenov:{n:"Касенов Б.Б.",bg:7},serikov:{n:"Сериков Е.С.",bg:8},zhunusov:{n:"Жунусов А.А.",bg:2},muratov:{n:"Муратов А.Т.",bg:3},bakirov:{n:"Бакиров Т.Н.",bg:4}};
|
||||
var DBNAME="hse_files_v2";var DBVER=1;var db=null;
|
||||
function openDB(cb){
|
||||
if(db){cb(db);return}
|
||||
var r=indexedDB.open(DBNAME,DBVER);
|
||||
r.onupgradeneeded=function(e){var d=e.target.result;if(!d.objectStoreNames.contains("files")){d.createObjectStore("files",{keyPath:"id"})}};
|
||||
r.onsuccess=function(e){db=e.target.result;cb(db)};
|
||||
r.onerror=function(){db=null;cb(null)}
|
||||
}
|
||||
function saveFile(id,file,cb){
|
||||
openDB(function(d){
|
||||
if(!d){cb(false);return}
|
||||
var tx=d.transaction("files","readwrite");var st=tx.objectStore("files");
|
||||
var fr=new FileReader();
|
||||
fr.onload=function(){st.put({id:id,name:file.name,size:file.size,type:file.type,data:fr.result,ts:new Date().toISOString()});tx.oncomplete=function(){cb(true)}};
|
||||
fr.readAsArrayBuffer(file)
|
||||
})
|
||||
}
|
||||
function getFile(id,cb){
|
||||
openDB(function(d){if(!d){cb(null);return}var tx=d.transaction("files","readonly");var st=tx.objectStore("files");var rq=st.get(id);rq.onsuccess=function(){cb(rq.result)};rq.onerror=function(){cb(null)}})
|
||||
}
|
||||
function deleteFileDB(id,cb){
|
||||
openDB(function(d){if(!d){cb(false);return}var tx=d.transaction("files","readwrite");var st=tx.objectStore("files");st.delete(id);tx.oncomplete=function(){cb(true)}})
|
||||
}
|
||||
function listFiles(prefix,cb){
|
||||
openDB(function(d){
|
||||
if(!d){cb([]);return}
|
||||
try{
|
||||
var tx=d.transaction("files","readonly");var st=tx.objectStore("files");
|
||||
var rq=st.getAll();
|
||||
rq.onsuccess=function(){var all=rq.result||[];var res=[];for(var i=0;i<all.length;i++){if(all[i].id.indexOf(prefix)===0)res.push(all[i])}cb(res)};
|
||||
rq.onerror=function(){cb([])}
|
||||
}catch(e){cb([])}
|
||||
})
|
||||
}
|
||||
|
||||
|
||||
function esc(s){
|
||||
return String(s).replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""")
|
||||
@ -1054,34 +1010,13 @@ function init(){
|
||||
fb.appendChild(o)
|
||||
}
|
||||
}
|
||||
if(cu)showApp();
|
||||
showReminders()
|
||||
}
|
||||
function showReminders(){
|
||||
var remind=[];for(var i=0;i<evs.length;i++){var dr=daysRem(evs[i].due);if(evs[i].s!=="done"&&dr<=30&&dr>=0)remind.push({e:evs[i],dr:dr})}
|
||||
if(remind.length>0){
|
||||
var rdiv=document.getElementById("reminder_bar");
|
||||
if(!rdiv)return;
|
||||
remind.sort(function(a,b){return a.dr-b.dr});
|
||||
var urgent=remind.filter(function(r){return r.dr<=3});
|
||||
var html="";
|
||||
if(urgent.length)html+="<span style='color:#EF4444;font-weight:700'>\u26A0 \u0421\u0440\u043E\u0447\u043D\u043E: "+urgent.length+" \u043F\u0443\u043D\u043A\u0442\u043E\u0432 \u043F\u0440\u043E\u0441\u0440\u043E\u0447\u0435\u043D\u043E/\u0441\u0435\u0433\u043E\u0434\u043D\u044F!</span> ";
|
||||
html+="\u0411\u043B\u0438\u0436\u0430\u0439\u0448\u0438\u0435 \u0434\u0435\u0434\u043B\u0430\u0439\u043D\u044B: ";
|
||||
var shown=0;
|
||||
for(var i=0;i<remind.length&&shown<3;i++){if(remind[i].dr>3&&shown<3){html+="N"+remind[i].e.id+" ("+remind[i].dr+" \u0434\u043D), ";shown++}}
|
||||
rdiv.innerHTML=html;
|
||||
rdiv.style.display="block"
|
||||
}
|
||||
if(cu)showApp()
|
||||
}
|
||||
|
||||
function doLogin(){
|
||||
var e=document.getElementById("lem").value.trim().toLowerCase();
|
||||
var k=e.split("@")[0];
|
||||
var u=USR[k]||USR[e];
|
||||
if(!u){
|
||||
var ex=localStorage.getItem("ext_users");
|
||||
if(ex){try{var eu=JSON.parse(ex);if(eu[k])u=eu[k];if(!u&&eu[e])u=eu[e]}catch(e){}}
|
||||
}
|
||||
var u=USR[k];
|
||||
if(u){
|
||||
cu={n:u.n,bg:u.bg,role:u.role!==undefined?u.role:(u.bg===0?0:1)};
|
||||
localStorage.setItem("su",JSON.stringify(cu));
|
||||
@ -1286,11 +1221,11 @@ function openEv(id,subIdx){
|
||||
h+="<div style='margin-bottom:12px;padding:10px;background:#F0F9FF;border-radius:8px'><strong>AI-анализ:</strong> <span style='font-size:13px;color:#64748B'>"+esc(e.ai||"\u2014")+"</span></div>";
|
||||
h+="<div style='margin-bottom:12px'><strong>Отчётность:</strong></div>";
|
||||
h+="<div style='margin-bottom:8px;display:flex;gap:8px;flex-wrap:wrap;align-items:center'>";
|
||||
h+="<span style='font-size:12px'>Количество:</span> <input type='number' id='evq_"+e.id+"' value='"+(e.q||"")+"' min='0' style='width:80px;padding:4px;border:1px solid #E2E8F0;border-radius:4px;font-size:12px'>";
|
||||
var now=new Date();
|
||||
var curMonth=now.getMonth();
|
||||
var savedMonth=localStorage.getItem("evmonth_"+e.id);
|
||||
var selMonth=savedMonth!==null?parseInt(savedMonth,10):curMonth;
|
||||
h+="<span style='font-size:12px'>Количество:</span> <input type='number' id='evq_"+e.id+"' value='"+(localStorage.getItem("sq_"+e.id+"_m"+selMonth)||e.q||"")+"' min='0' style='width:80px;padding:4px;border:1px solid #E2E8F0;border-radius:4px;font-size:12px'>";
|
||||
h+="<span style='font-size:12px;margin-left:8px'>Месяц:</span> <select id='evm_"+e.id+"' style='padding:4px;border:1px solid #E2E8F0;border-radius:4px;font-size:12px'>";
|
||||
var mnames=["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек"];
|
||||
for(var mi=0;mi<12;mi++){
|
||||
@ -1299,12 +1234,38 @@ function openEv(id,subIdx){
|
||||
h+=">"+mnames[mi]+"</option>"
|
||||
}
|
||||
h+="</select></div>";
|
||||
h+="<div style='margin-bottom:12px'><textarea id='evn_"+e.id+"' placeholder='Примечание / описание выполнения...' style='width:100%;padding:8px;border:1px solid #E2E8F0;border-radius:6px;font-size:12px;resize:vertical;min-height:50px'>"+esc(subIdx!==undefined?((localStorage.getItem("sn_"+e.id+"_s"+subIdx)||"")):(localStorage.getItem("sn_"+e.id+"_m"+selMonth)||e.n||""))+"</textarea></div>";
|
||||
h+="<div style='margin-bottom:12px'><strong>Файлы за месяц:</strong>";
|
||||
var monthKey="_m"+selMonth;
|
||||
var prefix=fk+monthKey;
|
||||
h+="<div id='fileList_"+e.id+"' style='font-size:12px;color:#64748B'>Загрузка...</div>";
|
||||
h+="</div><div style='margin-top:6px'><input type='file' id='fu_"+e.id+"' style='font-size:12px' onchange='upFile("+e.id+(subIdx!==undefined?","+subIdx:"")+")'></div></div>";
|
||||
h+="<div style='margin-bottom:12px'><textarea id='evn_"+e.id+"' placeholder='Примечание / описание выполнения...' style='width:100%;padding:8px;border:1px solid #E2E8F0;border-radius:6px;font-size:12px;resize:vertical;min-height:50px'>"+esc(subIdx!==undefined?((localStorage.getItem("sn_"+e.id+"_s"+subIdx)||"")):(e.n||""))+"</textarea></div>";
|
||||
h+="<div style='margin-bottom:12px'><strong>Файлы:</strong>";
|
||||
if(cu&&cu.bg===0){
|
||||
for(var bi=0;bi<brs.length;bi++){
|
||||
var bk=fk+"_b"+bi;
|
||||
var fd=localStorage.getItem(bk);
|
||||
if(fd){
|
||||
try{
|
||||
var fa=JSON.parse(fd);
|
||||
if(fa.length)h+="<div style='font-size:11px;color:#64748B;margin-top:4px'><strong>"+esc(brs[bi])+":</strong></div>";
|
||||
for(var fi=0;fi<fa.length;fi++){
|
||||
var f=fa[fi];
|
||||
h+="<div class='file-item'><span class='fn'>"+esc(f.n)+"</span><span class='fs'>("+(f.s?Math.round(f.s/1024)+"KB":"")+", "+esc(f.u||"")+" "+esc(f.d||"")+")</span><a onclick='dlFile("+e.id+","+fi+")'>Скачать</a><a style='color:#EF4444;margin-left:4px' onclick='delFile("+e.id+","+fi+")'>Удалить</a></div>"
|
||||
}
|
||||
}catch(ex){}
|
||||
}
|
||||
}
|
||||
}else{
|
||||
var bk=fk+"_b"+(cu?cu.bg:0);
|
||||
var fd=localStorage.getItem(bk);
|
||||
if(fd){
|
||||
try{
|
||||
var fa=JSON.parse(fd);
|
||||
for(var fi=0;fi<fa.length;fi++){
|
||||
var f=fa[fi];
|
||||
h+="<div class='file-item'><span class='fn'>"+esc(f.n)+"</span><span class='fs'>("+(f.s?Math.round(f.s/1024)+"KB":"")+", "+esc(f.u||"")+" "+esc(f.d||"")+")</span><a onclick='dlFile("+e.id+","+fi+")'>Скачать</a><a style='color:#EF4444;margin-left:4px' onclick='delFile("+e.id+","+fi+")'>Удалить</a></div>"
|
||||
}
|
||||
}catch(ex){}
|
||||
}
|
||||
}
|
||||
h+="<div style='margin-top:6px'><input type='file' id='fu_"+e.id+"' style='font-size:12px' onchange='upFile("+e.id+(subIdx!==undefined?","+subIdx:"")+")'></div>";
|
||||
h+="</div>";
|
||||
if(subIdx===undefined&&e.sub&&e.sub.length>0){
|
||||
h+="<div style='margin-bottom:12px'><strong>Подпункты:</strong>";
|
||||
var ss=localStorage.getItem("ss_"+e.id);
|
||||
@ -1318,30 +1279,7 @@ function openEv(id,subIdx){
|
||||
h+="<div style='margin-top:16px;text-align:right;border-top:1px solid #E2E8F0;padding-top:12px'><button class='btn btn-sm btn-g' onclick='saveEvModal("+e.id+")'>Сохранить</button>";
|
||||
h+="<button class='btn btn-sm' style='margin-left:8px;background:#E2E8F0;color:#0B1A2E' onclick='closeModal()'>Отмена</button></div>";
|
||||
h+="</div>";
|
||||
showModal(h);
|
||||
listFiles(prefix+"_b",function(files){
|
||||
var fdiv=document.getElementById("fileList_"+e.id);
|
||||
if(!fdiv)return;
|
||||
if(!files||!files.length){fdiv.innerHTML="Нет файлов";return}
|
||||
var fh="";var mnames2=["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек"];
|
||||
var groups={};
|
||||
for(var fi=0;fi<files.length;fi++){
|
||||
var f=files[fi];var parts=f.id.split("_b");var brIdx=parseInt(parts[1])||0;
|
||||
if(!groups[brIdx])groups[brIdx]=[];
|
||||
groups[brIdx].push(f)
|
||||
}
|
||||
for(var bi=0;bi<brs.length;bi++){
|
||||
if(!groups[bi]||!groups[bi].length)continue;
|
||||
if(cu&&cu.bg===0)fh+="<div style='font-size:11px;color:#64748B;margin-top:4px'><strong>"+esc(brs[bi])+":</strong></div>";
|
||||
for(var fi=0;fi<groups[bi].length;fi++){
|
||||
var f=groups[bi][fi];
|
||||
var kb=Math.round(f.size/1024);var sz=kb<1024?kb+" KB":(kb/1024).toFixed(1)+" MB";
|
||||
var d=new Date(f.ts);var ds=d.getDate()+"."+String(d.getMonth()+1).padStart(2,"0")+"."+d.getFullYear();
|
||||
fh+="<div class='file-item'><span class='fn'>"+esc(f.name)+"</span><span class='fs'>("+sz+", "+ds+")</span><a onclick='dlFile(0,\""+f.id+"\")'>Скачать</a><a style='color:#EF4444;margin-left:4px' onclick='delFile(0,\""+f.id+"\")'>Удалить</a></div>"
|
||||
}
|
||||
}
|
||||
fdiv.innerHTML=fh||"Нет файлов"
|
||||
})
|
||||
showModal(h)
|
||||
}
|
||||
|
||||
function showModal(html){
|
||||
@ -1357,9 +1295,13 @@ function closeModal(){
|
||||
|
||||
function saveEvModal(id){
|
||||
var sel=document.getElementById("evs_"+id);
|
||||
var inq=document.getElementById("evq_"+id);
|
||||
var inn=document.getElementById("evn_"+id);
|
||||
for(var i=0;i<evs.length;i++){
|
||||
if(evs[i].id===id){
|
||||
if(sel)evs[i].s=sel.value;
|
||||
if(inq)evs[i].q=parseInt(inq.value,10)||0;
|
||||
if(inn){if(curSub!==null){try{localStorage.setItem("sn_"+id+"_s"+curSub,inn.value.trim())}catch(e){}}else{evs[i].n=inn.value.trim()}}
|
||||
if(sel&&sel.value==="done"&&(evs[i].done==="\u2014"||!evs[i].done)){
|
||||
var d=new Date();
|
||||
evs[i].done=d.getDate()+"."+String(d.getMonth()+1).padStart(2,"0")+"."+d.getFullYear()
|
||||
@ -1368,20 +1310,7 @@ function saveEvModal(id){
|
||||
}
|
||||
}
|
||||
var inm=document.getElementById("evm_"+id);
|
||||
if(inm){
|
||||
var mv=inm.value;
|
||||
try{localStorage.setItem("evmonth_"+id,mv)}catch(e){}
|
||||
var inq=document.getElementById("evq_"+id);var inn=document.getElementById("evn_"+id);
|
||||
if(inn)try{localStorage.setItem("sn_"+id+"_m"+mv,inn.value.trim())}catch(e){}
|
||||
if(inq)try{localStorage.setItem("sq_"+id+"_m"+mv,(parseInt(inq.value,10)||0).toString())}catch(e){}
|
||||
}
|
||||
var prefix="sf_"+id+"_m"+(inm?inm.value:"0");
|
||||
listFiles(prefix,function(files){
|
||||
if(files&&files.length){
|
||||
var meta=files.map(function(f){return{n:f.name,s:f.size,t:f.type,ts:f.ts}});
|
||||
try{localStorage.setItem("rptf_"+prefix+"_",JSON.stringify(meta))}catch(e){}
|
||||
}
|
||||
});
|
||||
if(inm)try{localStorage.setItem("evmonth_"+id,inm.value)}catch(e){}
|
||||
saveEv();
|
||||
closeModal();
|
||||
renderEv()
|
||||
@ -1405,38 +1334,56 @@ function upFile(id){
|
||||
var inp=document.getElementById("fu_"+id);
|
||||
if(!inp||!inp.files||!inp.files[0])return;
|
||||
var f=inp.files[0];
|
||||
if(f.size>1073741824){alert("\u0424\u0430\u0439\u043B \u0431\u043E\u043B\u044C\u0448\u0435 1GB");return}
|
||||
if(f.size>3145728){alert("\u0424\u0430\u0439\u043B \u0431\u043E\u043B\u044C\u0448\u0435 3MB");return}
|
||||
var fr=new FileReader();
|
||||
var subKey=curSub!==null?"_s"+curSub:"";
|
||||
var inm=document.getElementById("evm_"+id);
|
||||
var monthKey=inm?"_m"+inm.value:"";
|
||||
var brKey="_b"+(cu?cu.bg:0);
|
||||
var fileId="sf_"+id+monthKey+subKey+brKey+"_"+Date.now();
|
||||
var fname=f.name;var fsize=f.size;var ftype=f.type;
|
||||
var fr=new FileReader();
|
||||
fr.onload=function(){
|
||||
openDB(function(d){
|
||||
if(!d){alert("IndexedDB \u043D\u0435\u0434\u043E\u0441\u0442\u0443\u043F\u043D\u0430");return}
|
||||
var tx=d.transaction("files","readwrite");var st=tx.objectStore("files");
|
||||
st.put({id:fileId,name:fname,size:fsize,type:ftype,data:fr.result,ts:new Date().toISOString()});
|
||||
tx.oncomplete=function(){openEv(id,curSub!==null?curSub:undefined)};
|
||||
tx.onerror=function(){alert("\u041E\u0448\u0438\u0431\u043A\u0430 \u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u0438\u044F")}
|
||||
})
|
||||
var key="sf_"+id+monthKey+subKey+brKey;
|
||||
var arr=[];
|
||||
var ex=localStorage.getItem(key);
|
||||
if(ex){try{arr=JSON.parse(ex)}catch(e){}}
|
||||
var d=new Date();
|
||||
arr.push({n:f.name,s:f.size,d:d.getDate()+"."+String(d.getMonth()+1).padStart(2,"0")+"."+d.getFullYear(),u:cu?cu.n:"",data:fr.result});
|
||||
try{localStorage.setItem(key,JSON.stringify(arr))}catch(e){alert("\u041E\u0448\u0438\u0431\u043A\u0430 \u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u0438\u044F")}
|
||||
openEv(id,curSub!==null?curSub:undefined)
|
||||
};
|
||||
fr.readAsArrayBuffer(f)
|
||||
fr.readAsDataURL(f)
|
||||
}
|
||||
function dlFile(evId,fileId){
|
||||
if(typeof fileId!=="string"||fileId.length<10)return;
|
||||
getFile(fileId,function(f){
|
||||
if(!f)return;
|
||||
var blob=new Blob([f.data],{type:f.type||"application/octet-stream"});
|
||||
var url=URL.createObjectURL(blob);
|
||||
var a=document.createElement("a");a.href=url;a.download=f.name;document.body.appendChild(a);a.click();document.body.removeChild(a);
|
||||
setTimeout(function(){URL.revokeObjectURL(url)},5000)
|
||||
})
|
||||
function dlFile(id,idx){
|
||||
var inm=document.getElementById("evm_"+id);
|
||||
var monthKey=inm?"_m"+inm.value:"";
|
||||
var key="sf_"+id+monthKey+(curSub!==null?"_s"+curSub:"")+"_b"+(cu?cu.bg:0);
|
||||
var ex=localStorage.getItem(key);
|
||||
if(!ex)return;
|
||||
try{
|
||||
var arr=JSON.parse(ex);
|
||||
var f=arr[idx];
|
||||
if(!f||!f.data)return;
|
||||
var a=document.createElement("a");
|
||||
a.href=f.data;
|
||||
a.download=f.n;
|
||||
document.body.appendChild(a);
|
||||
a.click();
|
||||
document.body.removeChild(a)
|
||||
}catch(e){}
|
||||
}
|
||||
function delFile(evId,fileId){
|
||||
function delFile(id,idx){
|
||||
if(!confirm("\u0423\u0434\u0430\u043B\u0438\u0442\u044C \u0444\u0430\u0439\u043B?"))return;
|
||||
deleteFileDB(fileId,function(ok){if(ok){openEv(evId,curSub!==null?curSub:undefined)}})
|
||||
var inm=document.getElementById("evm_"+id);
|
||||
var monthKey=inm?"_m"+inm.value:"";
|
||||
var key="sf_"+id+monthKey+(curSub!==null?"_s"+curSub:"")+"_b"+(cu?cu.bg:0);
|
||||
var ex=localStorage.getItem(key);
|
||||
if(!ex)return;
|
||||
try{
|
||||
var arr=JSON.parse(ex);
|
||||
arr.splice(idx,1);
|
||||
if(arr.length){localStorage.setItem(key,JSON.stringify(arr))}
|
||||
else{localStorage.removeItem(key)}
|
||||
openEv(id,curSub!==null?curSub:undefined)
|
||||
}catch(e){}
|
||||
}
|
||||
|
||||
function saveBackup(){
|
||||
@ -1524,9 +1471,19 @@ function renderAnalytics(){
|
||||
}
|
||||
|
||||
function getFilteredEvs(){
|
||||
var period=document.getElementById("rp_period").value;
|
||||
var statusF=document.getElementById("rp_status").value;
|
||||
var year=parseInt(document.getElementById("rp_year").value,10)||2026;
|
||||
var months=getReportMonths();
|
||||
var month=parseInt(document.getElementById("rp_month").value,10)||0;
|
||||
var months=[];
|
||||
if(period==="month"){months=[month]}
|
||||
else if(period==="q1"){months=[0,1,2]}
|
||||
else if(period==="q2"){months=[3,4,5]}
|
||||
else if(period==="q3"){months=[6,7,8]}
|
||||
else if(period==="q4"){months=[9,10,11]}
|
||||
else if(period==="h1"){months=[0,1,2,3,4,5]}
|
||||
else if(period==="h2"){months=[6,7,8,9,10,11]}
|
||||
else if(period==="year"){months=[0,1,2,3,4,5,6,7,8,9,10,11]}
|
||||
var r=[];
|
||||
for(var i=0;i<evs.length;i++){
|
||||
var e=evs[i];
|
||||
@ -1543,36 +1500,23 @@ function getFilteredEvs(){
|
||||
function getReportPeriod(){
|
||||
var period=document.getElementById("rp_period").value;
|
||||
var year=document.getElementById("rp_year").value;
|
||||
var mFrom=parseInt(document.getElementById("rp_month_from").value,10)||0;
|
||||
var mTo=parseInt(document.getElementById("rp_month_to").value,10)||11;
|
||||
var mnames=["\u044F\u043D\u0432\u0430\u0440\u044C","\u0444\u0435\u0432\u0440\u0430\u043B\u044C","\u043C\u0430\u0440\u0442","\u0430\u043F\u0440\u0435\u043B\u044C","\u043C\u0430\u0439","\u0438\u044E\u043D\u044C","\u0438\u044E\u043B\u044C","\u0430\u0432\u0433\u0443\u0441\u0442","\u0441\u0435\u043D\u0442\u044F\u0431\u0440\u044C","\u043E\u043A\u0442\u044F\u0431\u0440\u044C","\u043D\u043E\u044F\u0431\u0440\u044C","\u0434\u0435\u043A\u0430\u0431\u0440\u044C"];
|
||||
if(period==="year")return year+" \u0433\u043E\u0434";
|
||||
if(period==="q1")return "I \u043A\u0432. "+year;
|
||||
if(period==="q2")return "II \u043A\u0432. "+year;
|
||||
if(period==="q3")return "III \u043A\u0432. "+year;
|
||||
if(period==="q4")return "IV \u043A\u0432. "+year;
|
||||
var month=parseInt(document.getElementById("rp_month").value,10)||0;
|
||||
var mnames=["\u042F\u043D\u0432\u0430\u0440\u044C","\u0424\u0435\u0432\u0440\u0430\u043B\u044C","\u041C\u0430\u0440\u0442","\u0410\u043F\u0440\u0435\u043B\u044C","\u041C\u0430\u0439","\u0418\u044E\u043D\u044C","\u0418\u044E\u043B\u044C","\u0410\u0432\u0433\u0443\u0441\u0442","\u0421\u0435\u043D\u0442\u044F\u0431\u0440\u044C","\u041E\u043A\u0442\u044F\u0431\u0440\u044C","\u041D\u043E\u044F\u0431\u0440\u044C","\u0414\u0435\u043A\u0430\u0431\u0440\u044C"];
|
||||
if(period==="month")return mnames[month]+" "+year;
|
||||
if(period==="q1")return "I \u043A\u0432\u0430\u0440\u0442\u0430\u043B "+year;
|
||||
if(period==="q2")return "II \u043A\u0432\u0430\u0440\u0442\u0430\u043B "+year;
|
||||
if(period==="q3")return "III \u043A\u0432\u0430\u0440\u0442\u0430\u043B "+year;
|
||||
if(period==="q4")return "IV \u043A\u0432\u0430\u0440\u0442\u0430\u043B "+year;
|
||||
if(period==="h1")return "1-\u0435 \u043F\u043E\u043B\u0443\u0433\u043E\u0434\u0438\u0435 "+year;
|
||||
if(period==="h2")return "2-\u0435 \u043F\u043E\u043B\u0443\u0433\u043E\u0434\u0438\u0435 "+year;
|
||||
if(period==="month")return mnames[mFrom]+" "+year;
|
||||
return mnames[mFrom]+" \u2014 "+mnames[mTo]+" "+year
|
||||
return year+" \u0433\u043E\u0434"
|
||||
}
|
||||
function getReportMonths(){
|
||||
var period=document.getElementById("rp_period").value;
|
||||
var mFrom=parseInt(document.getElementById("rp_month_from").value,10)||0;
|
||||
var mTo=parseInt(document.getElementById("rp_month_to").value,10)||11;
|
||||
var months=[];
|
||||
if(period==="year"){for(var i=0;i<12;i++)months.push(i)}
|
||||
else if(period==="q1")months=[0,1,2];
|
||||
else if(period==="q2")months=[3,4,5];
|
||||
else if(period==="q3")months=[6,7,8];
|
||||
else if(period==="q4")months=[9,10,11];
|
||||
else if(period==="h1")months=[0,1,2,3,4,5];
|
||||
else if(period==="h2")months=[6,7,8,9,10,11];
|
||||
else if(period==="month")months=[mFrom];
|
||||
else{for(var i=mFrom;i<=mTo;i++)months.push(i)}
|
||||
return months
|
||||
function rpPeriodChange(){
|
||||
var v=document.getElementById("rp_period").value;
|
||||
var mSel=document.getElementById("rp_month");
|
||||
if(v==="month"){mSel.style.display="inline-block"}else{mSel.style.display="none"}
|
||||
renderReports()
|
||||
}
|
||||
function rpPeriodChange(){}
|
||||
function renderReports(){
|
||||
var fl=getFilteredEvs();
|
||||
var cnt=document.getElementById("rp_count");
|
||||
@ -1595,46 +1539,52 @@ function dlCSV(){
|
||||
function dlHTML(){
|
||||
var fl=getFilteredEvs();
|
||||
var periodLabel=getReportPeriod();
|
||||
var months=getReportMonths();
|
||||
var hh="<!DOCTYPE html><html><head><meta charset='utf-8'><title>\u041E\u0442\u0447\u0451\u0442 \u041F\u0411 \u0437\u0430 "+periodLabel+"</title><style>body{font:14px Arial,sans-serif;padding:30px;color:#1A1A2E} h2{font-size:20px;margin-bottom:4px} h3{font-size:15px;color:#0A1628;margin:16px 0 4px;border-bottom:2px solid #005BAA;padding-bottom:6px} .meta{font-size:12px;color:#1A1A2E;margin:2px 0 6px 0;background:#F0F4FF;padding:6px 10px;border-radius:4px} .meta span{display:inline-block;margin-right:16px;font-weight:500} .desc{font-size:13px;color:#1A1A2E;margin:6px 0;padding:10px;background:#F0F4FF;border-radius:4px;border-left:4px solid #005BAA} .files{margin:6px 0 8px 0;font-size:11px} .files a{color:#004B8C;display:block;margin:2px 0;padding:4px 8px;background:#E8F0FE;border-radius:4px;font-weight:600;text-decoration:none} .qty{font-weight:600;color:#2E7D32;margin:4px 0} @media print{body{padding:10mm}}</style></head><body><h2>\u041F\u043B\u0430\u043D \u043F\u0440\u043E\u0438\u0437\u0432\u043E\u0434\u0441\u0442\u0432\u0435\u043D\u043D\u043E\u0439 \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0441\u0442\u0438</h2><p>QAZAQtelecom HSE \u0437\u0430 "+periodLabel+"</p><p style='font-size:11px;color:#64748B'>\u041E\u0442\u0447\u0451\u0442 \u0441\u0444\u043E\u0440\u043C\u0438\u0440\u043E\u0432\u0430\u043D: "+new Date().toLocaleDateString("ru-RU")+"</p><br>";
|
||||
var hh="<!DOCTYPE html><html><head><meta charset='utf-8'><title>\u041E\u0442\u0447\u0451\u0442 \u041F\u0411 \u0437\u0430 "+periodLabel+"</title><style>body{font:14px Arial,sans-serif;padding:30px;color:#1A1A2E} h2{font-size:20px;margin-bottom:4px} h3{font-size:14px;color:#005BAA;margin:16px 0 4px} table{border-collapse:collapse;width:100%;margin-bottom:12px} th,td{border:1px solid #ccc;padding:6px 10px;font-size:12px;text-align:left;vertical-align:top} th{background:#0A1628;color:#fff} .desc{font-size:12px;color:#64748B;margin:4px 0 8px 0;padding:6px;background:#F8FAFC;border-radius:4px} .files{margin:4px 0;font-size:11px} .files a{color:#005BAA;display:block;margin:2px 0} .qty{font-weight:600;color:#2E7D32} @media print{body{padding:10mm}}</style></head><body><h2>\u041F\u043B\u0430\u043D \u043F\u0440\u043E\u0438\u0437\u0432\u043E\u0434\u0441\u0442\u0432\u0435\u043D\u043D\u043E\u0439 \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0441\u0442\u0438</h2><p>QAZAQtelecom HSE \u0437\u0430 "+periodLabel+"</p><p style='font-size:11px;color:#64748B'>\u041E\u0442\u0447\u0451\u0442 \u0441\u0444\u043E\u0440\u043C\u0438\u0440\u043E\u0432\u0430\u043D: "+new Date().toLocaleDateString("ru-RU")+"</p><br>";
|
||||
for(var i=0;i<fl.length;i++){
|
||||
var e=fl[i];
|
||||
var secName=secs[e.sec].split(". ")[1]||secs[e.sec];
|
||||
hh+="<h3>N"+e.id+". "+esc(e.t)+"</h3>";
|
||||
hh+="<div class='meta'><span>\u0420\u0430\u0437\u0434\u0435\u043B | "+esc(secName)+"</span><span>\u0421\u0440\u043E\u043A: "+e.due+"</span><span>\u0421\u0442\u0430\u0442\u0443\u0441: "+stn[e.s]+"</span></div>";
|
||||
var reportNote="";var reportQty=0;
|
||||
for(var mi=0;mi<months.length;mi++){
|
||||
var nk="sn_"+e.id+"_m"+months[mi];var sv=localStorage.getItem(nk);
|
||||
if(sv){reportNote=sv;break}
|
||||
var qk="sq_"+e.id+"_m"+months[mi];var qv=localStorage.getItem(qk);
|
||||
if(qv)reportQty=parseInt(qv,10)||0
|
||||
hh+="<table><tr><th style='width:120px'>\u0421\u0440\u043E\u043A</th><td>"+e.due+"</td><th style='width:120px'>\u0421\u0442\u0430\u0442\u0443\u0441</th><td>"+stn[e.s]+"</td><th style='width:120px'>\u0424\u0438\u043B\u0438\u0430\u043B</th><td>"+brs[e.b]+"</td><th style='width:120px'>\u041E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043D\u043D\u044B\u0439</th><td>"+esc(nl2c(e.r))+"</td></tr></table>";
|
||||
if(e.n)hh+="<div class='desc'><strong>\u041E\u043F\u0438\u0441\u0430\u043D\u0438\u0435:</strong> "+esc(e.n)+"</div>";
|
||||
if(e.q)hh+="<div class='qty'>\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E: "+e.q+"</div>";
|
||||
var fhtml="";
|
||||
for(var si=-1;si<(e.sub?e.sub.length:0);si++){
|
||||
var sk=si>=0?"_s"+si:"";
|
||||
for(var bk=0;bk<brs.length;bk++){
|
||||
var key="sf_"+e.id+sk+"_b"+bk;
|
||||
var fd=localStorage.getItem(key);
|
||||
if(fd){
|
||||
try{var arr=JSON.parse(fd);
|
||||
for(var fi=0;fi<arr.length;fi++){
|
||||
var f=arr[fi];
|
||||
if(f&&f.n)fhtml+="<a href='"+f.data+"' download='"+esc(f.n)+"'>"+esc(f.n)+" ("+Math.round((f.s||0)/1024)+" KB)</a>"
|
||||
}}catch(ex){}
|
||||
}
|
||||
}
|
||||
}
|
||||
if(!reportNote&&e.n)reportNote=e.n;
|
||||
if(!reportQty&&e.q)reportQty=e.q;
|
||||
if(reportNote)hh+="<div class='desc'><strong>\u041E\u043F\u0438\u0441\u0430\u043D\u0438\u0435 \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u044F:</strong><br>"+esc(reportNote)+"</div>";
|
||||
if(reportQty)hh+="<div class='qty'>\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E: "+reportQty+"</div>";
|
||||
var fhtml2="";for(var mi=0;mi<months.length;mi++){var mk2="_m"+months[mi];for(var si=-1;si<(e.sub?e.sub.length:0);si++){var sk2=si>=0?"_s"+si:"";for(var bk=0;bk<brs.length;bk++){var prefix2="sf_"+e.id+mk2+sk2+"_b"+bk+"_";var fk2="rptf_"+prefix2;var hasKey=localStorage.getItem(fk2);if(hasKey){try{var fl2=JSON.parse(hasKey);for(var fj=0;fj<fl2.length;fj++){var ff=fl2[fj];fhtml2+="<a href='#' onclick='return false' style='color:#005BAA'>"+esc(ff.n)+" ("+Math.round((ff.s||0)/1024)+" KB)</a><br>"}}catch(ex){}}}}}}if(fhtml2)hh+="<div class='files'><strong>\u041F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u044E\u0449\u0438\u0435 \u0444\u0430\u0439\u043B\u044B:</strong><br>"+fhtml2+"</div>";
|
||||
|
||||
if(fhtml)hh+="<div class='files'><strong>\u041F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u044E\u0449\u0438\u0435 \u0444\u0430\u0439\u043B\u044B:</strong><br>"+fhtml+"</div>";
|
||||
}
|
||||
hh+="<p style='font-size:11px;color:#64748B'><em>\u041E\u0442\u0447\u0451\u0442 \u0441\u0444\u043E\u0440\u043C\u0438\u0440\u043E\u0432\u0430\u043D: "+new Date().toLocaleDateString("ru-RU")+"</em></p></body></html>";
|
||||
hh+="<br><p style='font-size:11px;color:#64748B'><em>\u041E\u0442\u0447\u0451\u0442 \u0441\u0444\u043E\u0440\u043C\u0438\u0440\u043E\u0432\u0430\u043D: "+new Date().toLocaleDateString("ru-RU")+"</em></p></body></html>";
|
||||
var blob=new Blob([hh],{type:"text/html"});
|
||||
var a=document.createElement("a");a.href=URL.createObjectURL(blob);a.download="report_pb_"+periodLabel.replace(/\s/g,"_")+".html";a.click()
|
||||
var a=document.createElement("a");
|
||||
a.href=URL.createObjectURL(blob);
|
||||
a.download="report_pb_"+periodLabel.replace(/\s/g,"_")+".html";
|
||||
a.click()
|
||||
}
|
||||
function dlWord(){
|
||||
var fl=getFilteredEvs();var periodLabel=getReportPeriod();var months=getReportMonths();
|
||||
var hh="<html xmlns:o='urn:schemas-microsoft-com:office:office' xmlns:w='urn:schemas-microsoft-com:office:word' xmlns='http://www.w3.org/TR/REC-html40'><head><meta charset='utf-8'><title>\u041E\u0442\u0447\u0451\u0442 \u041F\u0411 \u0437\u0430 "+periodLabel+"</title><style>@page{size:A4;margin:20mm}body{font:12pt 'Times New Roman'}h2{font-size:16pt;text-align:center}h3{font-size:12pt;color:#005BAA;border-bottom:1px solid #ccc;padding-bottom:4pt}.meta{font-size:10pt;color:#555;margin:2pt 0 6pt 0}.desc{font-size:10pt;color:#555;margin:4pt 0;padding:6pt;background:#f9f9f9}.files{font-size:9pt;margin:4pt 0}.files a{color:#005BAA;display:block}.qty{font-weight:600;color:#2E7D32}</style></head><body><h2>\u041F\u043B\u0430\u043D \u041F\u0411</h2><p style='text-align:center'>AO \u00AB\u041A\u0430\u0437\u0430\u0445\u0442\u0435\u043B\u0435\u043A\u043E\u043C\u00BB \u0437\u0430 "+periodLabel+"</p><br>";
|
||||
for(var i=0;i<fl.length;i++){var e=fl[i];var secName=secs[e.sec].split(". ")[1]||secs[e.sec];
|
||||
hh+="<h3>N"+e.id+". "+esc(e.t)+"</h3>";
|
||||
hh+="<p class='meta'>\u0420\u0430\u0437\u0434\u0435\u043B | "+esc(secName)+" | \u0421\u0440\u043E\u043A: "+e.due+" | "+stn[e.s]+"</p>";
|
||||
var rn="";var rq=0;for(var mi=0;mi<months.length;mi++){var nk="sn_"+e.id+"_m"+months[mi];var sv=localStorage.getItem(nk);if(sv){rn=sv;break}var qk="sq_"+e.id+"_m"+months[mi];var qv=localStorage.getItem(qk);if(qv)rq=parseInt(qv,10)||0}
|
||||
if(!rn&&e.n)rn=e.n;if(!rq&&e.q)rq=e.q;
|
||||
if(rn)hh+="<p class='desc'><strong>\u041E\u043F\u0438\u0441\u0430\u043D\u0438\u0435:</strong> "+esc(rn)+"</p>";
|
||||
if(rq)hh+="<p class='qty'>\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E: "+rq+"</p>";
|
||||
var fh="";for(var mi=0;mi<months.length;mi++){for(var si=-1;si<(e.sub?e.sub.length:0);si++){var sk=si>=0?"_s"+si:"";var mk="_m"+months[mi];for(var bk=0;bk<brs.length;bk++){var key="sf_"+e.id+mk+sk+"_b"+bk;var fd=localStorage.getItem(key);if(fd){try{var arr=JSON.parse(fd);for(var fi=0;fi<arr.length;fi++){var f=arr[fi];if(f&&f.n)fh+="<a href='"+f.data+"'>"+esc(f.n)+" ("+Math.round((f.s||0)/1024)+" KB)</a>"}}catch(ex){}}}}}
|
||||
if(fh)hh+="<div class='files'><strong>\u041F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u044E\u0449\u0438\u0435 \u0444\u0430\u0439\u043B\u044B:</strong><br>"+fh+"</div>";
|
||||
var fl=getFilteredEvs();
|
||||
var month=parseInt(document.getElementById("rp_month").value,10)+1;
|
||||
var year=document.getElementById("rp_year").value;
|
||||
var hh="<html xmlns:o='urn:schemas-microsoft-com:office:office' xmlns:w='urn:schemas-microsoft-com:office:word' xmlns='http://www.w3.org/TR/REC-html40'><head><meta charset='utf-8'><title>Отчёт План ПБ "+month+"."+year+"</title><style>@page{size:A4;margin:20mm}body{font:12pt 'Times New Roman'}h2{font-size:16pt;text-align:center}table{border-collapse:collapse;width:100%}th,td{border:1px solid #000;padding:4px 8px;font-size:11pt}th{background:#ddd}</style></head><body><h2>План производственной безопасности</h2><p style='text-align:center'>AO «Казахтелеком» за "+month+"."+year+"</p><br><table><tr><th>N</th><th>Мероприятие</th><th>Филиал</th><th>Срок</th><th>Статус</th><th>Прогресс</th><th>Кол-во</th><th>Примечание</th></tr>";
|
||||
for(var i=0;i<fl.length;i++){
|
||||
var e=fl[i];
|
||||
hh+="<tr><td>"+e.id+"</td><td>"+esc(e.t)+"</td><td>"+brs[e.b]+"</td><td>"+e.due+"</td><td>"+stn[e.s]+"</td><td>"+(e.p||0)+"%</td><td>"+(e.q||"")+"</td><td>"+esc(e.n||"")+"</td></tr>"
|
||||
}
|
||||
hh+="<p style='font-size:9pt;color:#888'><em>\u041E\u0442\u0447\u0451\u0442 \u0441\u0444\u043E\u0440\u043C\u0438\u0440\u043E\u0432\u0430\u043D: "+new Date().toLocaleDateString("ru-RU")+"</em></p></body></html>";
|
||||
var blob=new Blob([hh],{type:"application/msword"});var a=document.createElement("a");a.href=URL.createObjectURL(blob);a.download="report_pb_"+periodLabel.replace(/\s/g,"_")+".doc";a.click()
|
||||
hh+="</table><p><br><em>Отчёт сформирован: "+new Date().toLocaleDateString("ru-RU")+"</em></p></body></html>";
|
||||
var blob=new Blob([hh],{type:"application/msword"});
|
||||
var a=document.createElement("a");
|
||||
a.href=URL.createObjectURL(blob);
|
||||
a.download="report_pb_"+year+"_"+month+".doc";
|
||||
a.click()
|
||||
}
|
||||
function dlPdf(){
|
||||
var fl=getFilteredEvs();
|
||||
@ -1704,68 +1654,119 @@ function aiSend(){
|
||||
function aiResp(q){
|
||||
var total=evs.length;
|
||||
var done=0,late=0,warn=0;
|
||||
for(var i=0;i<evs.length;i++){var s=evs[i].s;if(s==="done")done++;else if(s==="late")late++;else if(s==="warn")warn++}
|
||||
for(var i=0;i<evs.length;i++){
|
||||
var s=evs[i].s;
|
||||
if(s==="done")done++;
|
||||
else if(s==="late")late++;
|
||||
else if(s==="warn")warn++
|
||||
}
|
||||
var ql=q.toLowerCase();
|
||||
var ans="";
|
||||
if(ql.indexOf("\u0441\u0432\u043E\u0434")!==-1||ql.indexOf("\u043E\u0431\u0449")!==-1||ql.indexOf("\u0441\u0442\u0430\u0442\u0443\u0441")!==-1||ql.indexOf("\u0432\u0441\u0435")!==-1){
|
||||
ans="\u041E\u0431\u0449\u0430\u044F \u0441\u0432\u043E\u0434\u043A\u0430:";
|
||||
ans+="\n- \u0412\u0441\u0435\u0433\u043E: "+total+" \u043C\u0435\u0440\u043E\u043F\u0440\u0438\u044F\u0442\u0438\u0439";
|
||||
ans+="\n- \u0418\u0441\u043F\u043E\u043B\u043D\u0435\u043D\u043E: "+done+" ("+Math.round(done/total*100)+"%)";
|
||||
ans+="\n- \u0412 \u043F\u0440\u043E\u0446\u0435\u0441\u0441\u0435: "+warn;
|
||||
ans+="\n- \u041F\u0440\u043E\u0441\u0440\u043E\u0447\u0435\u043D\u043E: "+late
|
||||
}else if(ql.indexOf("\u043F\u0440\u043E\u0441\u0440\u043E\u0447")!==-1||ql.indexOf("\u0441\u0440\u043E\u0447\u043D")!==-1||ql.indexOf("\u043A\u0440\u0438\u0442\u0438\u0447")!==-1){
|
||||
var lateList=[];for(var i=0;i<evs.length;i++){if(evs[i].s==="late"){lateList.push(evs[i])}}
|
||||
if(lateList.length){ans="\u041F\u0440\u043E\u0441\u0440\u043E\u0447\u0435\u043D\u043D\u044B\u0435 ("+lateList.length+"):";for(var i=0;i<lateList.length;i++){ans+="\nN"+lateList[i].id+" - "+lateList[i].t.slice(0,80)+"... ("+lateList[i].due+", "+brs[lateList[i].b]+")"}}else{ans="\u041F\u0440\u043E\u0441\u0440\u043E\u0447\u0435\u043D\u043D\u044B\u0445 \u043D\u0435\u0442"}
|
||||
}else if(ql.indexOf("\u0440\u0438\u0441\u043A")!==-1||ql.indexOf("risk")!==-1||ql.indexOf("\u043F\u0440\u043E\u0431\u043B")!==-1||ql.indexOf("\u0441\u0440\u044B\u0432")!==-1){
|
||||
var risk=[];for(var i=0;i<evs.length;i++){var dr=daysRem(evs[i].due);if(evs[i].s!=="done"&&dr<=30&&dr>0){risk.push(evs[i])}}
|
||||
var noReport=[];for(var i=0;i<brs.length;i++){var hasRep=false;for(var j=0;j<evs.length;j++){if(evs[j].b===i&&evs[j].q>0){hasRep=true;break}}if(!hasRep)noReport.push(brs[i])}
|
||||
var critRisk=[];for(var i=0;i<evs.length;i++){var dr=daysRem(evs[i].due);if(evs[i].s!=="done"&&dr<=7&&dr>0){critRisk.push(evs[i])}}
|
||||
ans="\u0410\u043D\u0430\u043B\u0438\u0437 \u0440\u0438\u0441\u043A\u043E\u0432:";
|
||||
ans+="\n\n\u0412\u044B\u0441\u043E\u043A\u0438\u0439 \u0440\u0438\u0441\u043A \u0441\u0440\u044B\u0432\u0430 (\u22647 \u0434\u043D): "+(critRisk.length?critRisk.length+" \u043F\u0443\u043D\u043A\u0442\u043E\u0432":"\u043D\u0435\u0442");
|
||||
for(var i=0;i<Math.min(critRisk.length,5);i++){ans+="\n N"+critRisk[i].id+" - "+critRisk[i].t.slice(0,50)+"... ("+daysRem(critRisk[i].due)+" \u0434\u043D.)"}
|
||||
if(risk.length>0){ans+="\n\n\u0417\u043E\u043D\u0430 \u0440\u0438\u0441\u043A\u0430 (<30 \u0434\u043D): "+risk.length+" \u043F\u0443\u043D\u043A\u0442\u043E\u0432"}
|
||||
if(noReport.length>0){ans+="\n\n\u041D\u0435\u0442 \u043E\u0442\u0447\u0451\u0442\u043E\u0432 \u043E\u0442 \u0444\u0438\u043B\u0438\u0430\u043B\u043E\u0432 ("+noReport.length+"):";for(var i=0;i<Math.min(noReport.length,3);i++){ans+="\n - "+noReport[i]}}
|
||||
if(!critRisk.length&&!risk.length&&!noReport.length)ans+="\n\u0420\u0438\u0441\u043A\u043E\u0432 \u043D\u0435 \u0432\u044B\u044F\u0432\u043B\u0435\u043D\u043E"
|
||||
}else if(ql.indexOf("\u0440\u0435\u0439\u0442")!==-1||ql.indexOf("\u0444\u0438\u043B\u0438\u0430\u043B")!==-1||ql.indexOf("\u043B\u0443\u0447\u0448")!==-1||ql.indexOf("\u0445\u0443\u0434\u0448")!==-1){
|
||||
var brd=[];for(var i=0;i<brs.length;i++){brd.push({n:brs[i],t:0,d:0})}
|
||||
|
||||
if(ql.indexOf("свод")!==-1||ql.indexOf("общ")!==-1||ql.indexOf("статус")!==-1||ql.indexOf("все")!==-1){
|
||||
ans="Общая сводка по плану ПБ:";
|
||||
ans+="\n- Всего: "+total+" мероприятий";
|
||||
ans+="\n- Исполнено: "+done+" ("+Math.round(done/total*100)+"%)";
|
||||
ans+="\n- В процессе: "+warn;
|
||||
ans+="\n- Просрочено: "+late
|
||||
|
||||
}else if(ql.indexOf("просроч")!==-1||ql.indexOf("срочн")!==-1||ql.indexOf("критич")!==-1){
|
||||
var lateList=[];
|
||||
for(var i=0;i<evs.length;i++){if(evs[i].s==="late"){lateList.push(evs[i])}}
|
||||
if(lateList.length){
|
||||
ans="Просроченные мероприятия ("+lateList.length+"):";
|
||||
for(var i=0;i<lateList.length;i++){
|
||||
ans+="\nN"+lateList[i].id+" - "+lateList[i].t.slice(0,80)+"... ("+lateList[i].due+", "+brs[lateList[i].b]+")"
|
||||
}
|
||||
}else{ans="Просроченных нет"}
|
||||
|
||||
}else if(ql.indexOf("рик")!==-1||ql.indexOf("risk")!==-1||ql.indexOf("пробл")!==-1||ql.indexOf("срыв")!==-1){
|
||||
var risk=[];
|
||||
for(var i=0;i<evs.length;i++){
|
||||
var dr=daysRem(evs[i].due);
|
||||
if(evs[i].s!=="done"&&dr<=30&&dr>0){risk.push(evs[i])}
|
||||
}
|
||||
if(risk.length){
|
||||
ans="Менее 30 дней до срока ("+risk.length+"):";
|
||||
for(var i=0;i<risk.length;i++){
|
||||
ans+="\nN"+risk[i].id+" - "+risk[i].t.slice(0,60)+"... ("+daysRem(risk[i].due)+" дн.)"
|
||||
}
|
||||
}else{ans="Рисков нет"}
|
||||
|
||||
}else if(ql.indexOf("рейт")!==-1||ql.indexOf("филиал")!==-1||ql.indexOf("лучш")!==-1||ql.indexOf("худш")!==-1){
|
||||
var brd=[];
|
||||
for(var i=0;i<brs.length;i++){brd.push({n:brs[i],t:0,d:0})}
|
||||
for(var i=0;i<evs.length;i++){var e=evs[i];brd[e.b].t++;if(e.s==="done")brd[e.b].d++}
|
||||
brd.sort(function(a,b){return(b.d/b.t||0)-(a.d/a.t||0)});
|
||||
ans="\u0420\u0435\u0439\u0442\u0438\u043D\u0433 \u0444\u0438\u043B\u0438\u0430\u043B\u043E\u0432:";for(var i=0;i<brd.length;i++){var pct=brd[i].t?Math.round(brd[i].d/brd[i].t*100):0;ans+="\n"+(i+1)+". "+brd[i].n+": "+brd[i].d+"/"+brd[i].t+" ("+pct+"%)"}
|
||||
}else if(ql.indexOf("\u043F\u0440\u043E\u0433\u043D\u043E\u0437")!==-1||ql.indexOf("\u043F\u0440\u043E\u0433\u043D")!==-1){
|
||||
ans="Рейтинг филиалов:";
|
||||
for(var i=0;i<brd.length;i++){
|
||||
var pct=brd[i].t?Math.round(brd[i].d/brd[i].t*100):0;
|
||||
ans+="\n"+(i+1)+". "+brd[i].n+": "+brd[i].d+"/"+brd[i].t+" ("+pct+"%)"
|
||||
}
|
||||
|
||||
}else if(ql.indexOf("прогноз")!==-1||ql.indexOf("прогн")!==-1){
|
||||
var atRisk=0,crit=0,onTrack=0;
|
||||
for(var i=0;i<evs.length;i++){var dr=daysRem(evs[i].due);if(evs[i].s==="done")onTrack++;else if(dr<=0)crit++;else if(dr<=30)atRisk++;else onTrack++}
|
||||
ans="\u041F\u0440\u043E\u0433\u043D\u043E\u0437:\n- \u0412\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u043E: "+onTrack+"\n- \u0412 \u0437\u043E\u043D\u0435 \u0440\u0438\u0441\u043A\u0430 (<30 \u0434\u043D): "+atRisk+"\n- \u041A\u0440\u0438\u0442\u0438\u0447\u0435\u0441\u043A\u0438\u0435: "+crit;
|
||||
ans+="\n\n\u041F\u0440\u043E\u0433\u043D\u043E\u0437\u0438\u0440\u0443\u0435\u043C\u044B\u0439 %: "+Math.round((onTrack+atRisk*0.5)/evs.length*100)+"%";
|
||||
if(crit>3)ans+="\n\n\u0420\u0435\u043A\u043E\u043C\u0435\u043D\u0434\u0430\u0446\u0438\u044F: \u0441\u0440\u043E\u0447\u043D\u044B\u0439 \u0448\u0442\u0430\u0431 \u043F\u043E "+crit+" \u043F\u0440\u043E\u0441\u0440\u043E\u0447\u0435\u043D\u043D\u044B\u043C \u043F\u0443\u043D\u043A\u0442\u0430\u043C."
|
||||
}else if(ql.indexOf("\u0441\u0442\u0430\u0442\u0443\u0441")!==-1||ql.indexOf("\u0441\u043E\u0441\u0442\u043E\u044F\u043D")!==-1||ql.indexOf("\u043E\u0431\u0441\u0442\u0430\u043D")!==-1){
|
||||
var bySec=[];for(var si=0;si<secs.length;si++){bySec.push({n:secs[si].split(".")[0],t:0,d:0,l:0})}
|
||||
for(var i=0;i<evs.length;i++){var e=evs[i];bySec[e.sec].t++;if(e.s==="done")bySec[e.sec].d++;else if(e.s==="late")bySec[e.sec].l++}
|
||||
ans="\u0421\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0435 \u043F\u043E \u0440\u0430\u0437\u0434\u0435\u043B\u0430\u043C:";for(var i=0;i<bySec.length;i++){ans+="\n"+bySec[i].n+": "+bySec[i].d+"/"+bySec[i].t+" ("+Math.round(bySec[i].d/bySec[i].t*100)+"%)"+(bySec[i].l?" \u043F\u0440\u043E\u0441\u0440\u043E\u0447\u0435\u043D\u043E:"+bySec[i].l:"")}
|
||||
}else if(ql.indexOf("\u043F\u043B\u0430\u043D")!==-1||ql.indexOf("\u0434\u0435\u0439\u0441\u0442\u0432")!==-1||ql.indexOf("\u0440\u0435\u043A\u043E\u043C\u0435\u043D\u0434")!==-1||ql.indexOf("\u0441\u043E\u0432\u0435\u0442")!==-1){
|
||||
for(var i=0;i<evs.length;i++){
|
||||
var dr=daysRem(evs[i].due);
|
||||
if(evs[i].s==="done")onTrack++;
|
||||
else if(dr<=0)crit++;
|
||||
else if(dr<=30)atRisk++;
|
||||
else onTrack++
|
||||
}
|
||||
ans="Прогноз выполнения плана ПБ:\n- Выполнено: "+onTrack+"\n- В зоне риска (<30 дн): "+atRisk+"\n- Критические (просрочено): "+crit;
|
||||
ans+="\n\nПрогнозируемый % выполнения к концу года: "+Math.round((onTrack+atRisk*0.5)/evs.length*100)+"%";
|
||||
if(crit>3)ans+="\n\nРекомендация: срочный штаб по "+crit+" просроченным пунктам."
|
||||
|
||||
}else if(ql.indexOf("статус")!==-1||ql.indexOf("состоян")!==-1||ql.indexOf("обстан")!==-1){
|
||||
var bySec=[];
|
||||
for(var si=0;si<secs.length;si++){bySec.push({n:secs[si].split(".")[0],t:0,d:0,l:0})}
|
||||
for(var i=0;i<evs.length;i++){
|
||||
var e=evs[i];bySec[e.sec].t++;
|
||||
if(e.s==="done")bySec[e.sec].d++;
|
||||
else if(e.s==="late")bySec[e.sec].l++
|
||||
}
|
||||
ans="Состояние по разделам:";
|
||||
for(var i=0;i<bySec.length;i++){
|
||||
ans+="\n"+bySec[i].n+": "+bySec[i].d+"/"+bySec[i].t+" ("+Math.round(bySec[i].d/bySec[i].t*100)+"%)"+(bySec[i].l?" просрочено:"+bySec[i].l:"")
|
||||
}
|
||||
|
||||
}else if(ql.indexOf("план")!==-1||ql.indexOf("действ")!==-1||ql.indexOf("рекоменд")!==-1||ql.indexOf("совет")!==-1){
|
||||
var pct=Math.round(done/total*100);
|
||||
if(pct<30)ans="\u0420\u0435\u043A\u043E\u043C\u0435\u043D\u0434\u0430\u0446\u0438\u044F: \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u043E \u043C\u0435\u043D\u0435\u0435 30%. \u0420\u0435\u043A\u043E\u043C\u0435\u043D\u0434\u0443\u0435\u0442\u0441\u044F \u0443\u0441\u0438\u043B\u0438\u0442\u044C \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u044C \u0437\u0430 \u043F\u0440\u043E\u0441\u0440\u043E\u0447\u0435\u043D\u043D\u044B\u043C\u0438 \u0438 \u043F\u0440\u043E\u0432\u0435\u0441\u0442\u0438 \u0448\u0442\u0430\u0431 \u0441 \u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043D\u043D\u044B\u043C\u0438 \u043B\u0438\u0446\u0430\u043C\u0438";
|
||||
else if(pct<60)ans="\u0420\u0435\u043A\u043E\u043C\u0435\u043D\u0434\u0430\u0446\u0438\u044F: \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u043E "+pct+"%. \u041E\u0431\u0440\u0430\u0442\u0438\u0442\u044C \u0432\u043D\u0438\u043C\u0430\u043D\u0438\u0435 \u043D\u0430 \u043F\u0440\u043E\u0446\u0435\u043D\u0442 \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u044F \u0432 \u0444\u0438\u043B\u0438\u0430\u043B\u0430\u0445 \u0441 \u043D\u0438\u0437\u043A\u0438\u043C \u043F\u043E\u043A\u0430\u0437\u0430\u0442\u0435\u043B\u0435\u043C";
|
||||
else ans="\u0425\u043E\u0440\u043E\u0448\u0438\u0439 \u043F\u0440\u043E\u0433\u0440\u0435\u0441\u0441: "+pct+"%. \u0420\u0435\u043A\u043E\u043C\u0435\u043D\u0434\u0443\u0435\u0442\u0441\u044F \u043F\u0440\u043E\u0434\u043E\u043B\u0436\u0430\u0442\u044C \u0440\u0430\u0431\u043E\u0442\u0443 \u0432 \u0442\u043E\u043C \u0436\u0435 \u0442\u0435\u043C\u043F\u0435"
|
||||
}else if(ql.indexOf("\u0430\u0443\u0434\u0438\u0442")!==-1||ql.indexOf("\u043F\u0440\u043E\u0432\u0435\u0440")!==-1||ql.indexOf("\u043A\u043E\u043D\u0442\u0440\u043E\u043B")!==-1){
|
||||
ans="\u0410\u0443\u0434\u0438\u0442 \u043F\u043B\u0430\u043D\u0430 \u041F\u0411:";
|
||||
ans+="\n- \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u043E: "+done+"/"+total+" ("+Math.round(done/total*100)+"%)";
|
||||
ans+="\n- \u043F\u0440\u043E\u0441\u0440\u043E\u0447\u0435\u043D\u043E: "+late;
|
||||
var riskCount=0;for(var i=0;i<evs.length;i++){var dr=daysRem(evs[i].due);if(evs[i].s!=="done"&&dr<=30&&dr>0)riskCount++}
|
||||
ans+="\n- \u0432 \u0440\u0438\u0441\u043A\u0435 (<30 \u0434\u043D): "+riskCount;
|
||||
if(done/total>0.7)ans+="\n\u041E\u0431\u0449\u0430\u044F \u043E\u0446\u0435\u043D\u043A\u0430: \u0445\u043E\u0440\u043E\u0448\u043E";
|
||||
else if(done/total>0.4)ans+="\n\u041E\u0431\u0449\u0430\u044F \u043E\u0446\u0435\u043D\u043A\u0430: \u0443\u0434\u043E\u0432\u043B\u0435\u0442\u0432\u043E\u0440\u0438\u0442\u0435\u043B\u044C\u043D\u043E";
|
||||
else ans+="\n\u041E\u0431\u0449\u0430\u044F \u043E\u0446\u0435\u043D\u043A\u0430: \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0432\u043D\u0438\u043C\u0430\u043D\u0438\u044F"
|
||||
}else if(ql.indexOf("\u043F\u0443\u043D\u043A\u0442")!==-1||ql.indexOf("\u043D\u043E\u043C\u0435\u0440")!==-1){
|
||||
var match=ql.match(/\d+/);if(match){var num=parseInt(match[0],10);var found=null;for(var i=0;i<evs.length;i++){if(evs[i].id===num){found=evs[i];break}}
|
||||
if(found){ans="N"+found.id+" "+found.t.slice(0,80)+"...";ans+="\n\u0421\u0442\u0430\u0442\u0443\u0441: "+stn[found.s];ans+="\n\u0424\u0438\u043B\u0438\u0430\u043B: "+brs[found.b];ans+="\n\u0421\u0440\u043E\u043A: "+found.due;ans+="\n\u041F\u0440\u043E\u0433\u0440\u0435\u0441\u0441: "+(found.p||0)+"%"}else{ans="\u041F\u0443\u043D\u043A\u0442 N"+num+" \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D"}}else{ans="\u041D\u0430\u043F\u0438\u0448\u0438 \u043D\u043E\u043C\u0435\u0440 \u043F\u0443\u043D\u043A\u0442\u0430, \u043D\u0430\u043F\u0440\u0438\u043C\u0435\u0440: \u043F\u0443\u043D\u043A\u0442 5"}
|
||||
}else if(ql.indexOf("\u043D\u0430\u043F\u043E\u043C\u0438\u043D")!==-1||ql.indexOf("\u0434\u0435\u0434\u043B\u0430\u0439\u043D")!==-1){
|
||||
var remind=[];for(var i=0;i<evs.length;i++){var dr=daysRem(evs[i].due);if(evs[i].s!=="done"&&dr<=30&&dr>=0)remind.push({e:evs[i],dr:dr})}
|
||||
remind.sort(function(a,b){return a.dr-b.dr});
|
||||
if(remind.length){ans="\u041D\u0430\u043F\u043E\u043C\u0438\u043D\u0430\u043D\u0438\u044F ("+remind.length+"):";for(var i=0;i<Math.min(remind.length,10);i++){ans+="\nN"+remind[i].e.id+" - "+(remind[i].dr<=0?"\u041F\u0420\u041E\u0421\u0420\u041E\u0427\u0415\u041D\u041E!":"\u043E\u0441\u0442\u0430\u043B\u043E\u0441\u044C "+remind[i].dr+" \u0434\u043D.")+" ("+brs[remind[i].e.b]+")"}}else{ans="\u041D\u0430\u043F\u043E\u043C\u0438\u043D\u0430\u043D\u0438\u0439 \u043D\u0435\u0442"}
|
||||
if(pct<30)ans="Рекомендация: выполнено менее 30%. Рекомендуется усилить контроль за просроченными и провести штаб с ответственными лицами";
|
||||
else if(pct<60)ans="Рекомендация: выполнено "+pct+"%. Обратить внимание на процент выполнения в филиалах с низким показателем";
|
||||
else ans="Хороший прогресс: "+pct+"%. Рекомендуется продолжать работу в том же темпе"
|
||||
|
||||
}else if(ql.indexOf("аудит")!==-1||ql.indexOf("провер")!==-1||ql.indexOf("контрол")!==-1){
|
||||
ans="Аудит плана ПБ:";
|
||||
ans+="\n- выполнено: "+done+"/"+total+" ("+Math.round(done/total*100)+"%)";
|
||||
ans+="\n- просрочено: "+late;
|
||||
var riskCount=0;
|
||||
for(var i=0;i<evs.length;i++){var dr=daysRem(evs[i].due);if(evs[i].s!=="done"&&dr<=30&&dr>0)riskCount++}
|
||||
ans+="\n- в риске (<30 дней): "+riskCount;
|
||||
if(done/total>0.7)ans+="\nОбщая оценка: хорошо";
|
||||
else if(done/total>0.4)ans+="\nОбщая оценка: удовлетворительно";
|
||||
else ans+="\nОбщая оценка: требует внимания"
|
||||
|
||||
}else if(ql.indexOf("пункт")!==-1||ql.indexOf("номер")!==-1){
|
||||
var match=ql.match(/\d+/);
|
||||
if(match){
|
||||
var num=parseInt(match[0],10);
|
||||
var found=null;
|
||||
for(var i=0;i<evs.length;i++){if(evs[i].id===num){found=evs[i];break}}
|
||||
if(found){
|
||||
ans="N"+found.id+" "+found.t.slice(0,80)+"...";
|
||||
ans+="\nСтатус: "+stn[found.s];
|
||||
ans+="\nФилиал: "+brs[found.b];
|
||||
ans+="\nСрок: "+found.due;
|
||||
ans+="\nПрогресс: "+(found.p||0)+"%"
|
||||
}else{ans="Пункт N"+num+" не найден"}
|
||||
}else{ans="Напиши номер пункта, например: пункт 5"}
|
||||
|
||||
}else{
|
||||
ans="\u042F \u2014 \u0414\u0436\u0430\u0440\u0432\u0438\u0441, \u0432\u0430\u0448 \u0430\u043D\u0430\u043B\u0438\u0442\u0438\u0447\u0435\u0441\u043A\u0438\u0439 \u0430\u0441\u0441\u0438\u0441\u0442\u0435\u043D\u0442. \u041C\u043E\u0433\u0443 \u043E\u0442\u0432\u0435\u0442\u0438\u0442\u044C:\n\n\u2022 \u0441\u0432\u043E\u0434\u043A\u0430 \u2014 \u043E\u0431\u0449\u0430\u044F \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043A\u0430\n\u2022 \u043F\u0440\u043E\u0441\u0440\u043E\u0447\u0435\u043D\u043D\u044B\u0435 \u2014 \u0441\u043F\u0438\u0441\u043E\u043A \u043F\u0440\u043E\u0441\u0440\u043E\u0447\u0435\u043A\n\u2022 \u0440\u0438\u0441\u043A\u0438 \u2014 \u0437\u043E\u043D\u0430 \u0440\u0438\u0441\u043A\u0430, \u043D\u0435\u0442 \u043E\u0442\u0447\u0451\u0442\u043E\u0432\n\u2022 \u0440\u0435\u0439\u0442\u0438\u043D\u0433 \u2014 \u0440\u0435\u0439\u0442\u0438\u043D\u0433 \u0444\u0438\u043B\u0438\u0430\u043B\u043E\u0432\n\u2022 \u0430\u0443\u0434\u0438\u0442 \u2014 \u043F\u043E\u043B\u043D\u044B\u0439 \u0430\u0443\u0434\u0438\u0442\n\u2022 \u043F\u0440\u043E\u0433\u043D\u043E\u0437 \u2014 \u043F\u0440\u043E\u0433\u043D\u043E\u0437 \u0438\u0441\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u044F\n\u2022 \u043D\u0430\u043F\u043E\u043C\u0438\u043D\u0430\u043D\u0438\u044F \u2014 \u0431\u043B\u0438\u0436\u0430\u0439\u0448\u0438\u0435 \u0434\u0435\u0434\u043B\u0430\u0439\u043D\u044B\n\u2022 \u043F\u0443\u043D\u043A\u0442 N \u2014 \u0434\u0435\u0442\u0430\u043B\u0438 \u043A\u043E\u043D\u043A\u0440\u0435\u0442\u043D\u043E\u0433\u043E \u043C\u0435\u0440\u043E\u043F\u0440\u0438\u044F\u0442\u0438\u044F"
|
||||
ans="Я — Джарвис, ваш аналитический ассистент. Могу ответить:\n\n• сводка — общая статистика\n• просроченные — список просрочек\n• риски — зона риска (<30 дней)\n• рейтинг — рейтинг филиалов\n• аудит — полный аудит\n• прогноз — прогноз исполнения\n• статус — состояние по разделам\n• план — план действий и рекомендации\n• пункт N — детали конкретного мероприятия"
|
||||
}
|
||||
addMsg("b",ans,"\u0414\u0436\u0430\u0440\u0432\u0438\u0441")
|
||||
|
||||
addMsg("b",ans,"Джарвис")
|
||||
}
|
||||
function renderUsers(){
|
||||
if(!cu||cu.bg!==0){document.getElementById("tab_users").innerHTML="<div class='card'><p style='color:#EF4444'>\u0414\u043E\u0441\u0442\u0443\u043F \u0437\u0430\u043F\u0440\u0435\u0449\u0451\u043D</p></div>";return}
|
||||
@ -1788,7 +1789,6 @@ function resetPw(k){
|
||||
}
|
||||
function addUser(){
|
||||
var em=document.getElementById("reg_email").value.trim().toLowerCase();
|
||||
var k=em.split("@")[0];
|
||||
var nm=document.getElementById("reg_name").value.trim();
|
||||
var ph=document.getElementById("reg_phone").value.trim();
|
||||
var bg=parseInt(document.getElementById("reg_branch").value,10);
|
||||
@ -1796,9 +1796,9 @@ function addUser(){
|
||||
var rlSel=document.getElementById("reg_role");
|
||||
var rl=rlSel?parseInt(rlSel.value,10):1;
|
||||
if(!em||!nm){alert("\u0417\u0430\u043F\u043E\u043B\u043D\u0438\u0442\u0435 \u043B\u043E\u0433\u0438\u043D \u0438 \u0424\u0418\u041E");return}
|
||||
if(USR[k]){alert("\u041F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442");return}
|
||||
USR[k]={n:nm,bg:bg,ph:ph,role:rl};
|
||||
if(pw)USR[k].pw=pw;
|
||||
if(USR[em]){alert("\u041F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C \u0443\u0436\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442");return}
|
||||
USR[em]={n:nm,bg:bg,ph:ph,role:rl};
|
||||
if(pw)USR[em].pw=pw;
|
||||
saveUsers();
|
||||
closeRegModal();
|
||||
renderUsers()
|
||||
@ -1958,15 +1958,15 @@ function dlAnalyticsPPT(){
|
||||
if(evs[i].s==="done")done++;else if(evs[i].s==="late")late++;else warn++
|
||||
}
|
||||
var pct=total?Math.round(done/total*100):0;
|
||||
var dueNow=0;for(var i=0;i<evs.length;i++){if(evs[i].s!=="done"&&daysRem(evs[i].due)<=0)dueNow++}
|
||||
var brd=[];for(var i=0;i<brs.length;i++){brd.push({n:brs[i],t:0,d:0})}
|
||||
var brd=[];
|
||||
for(var i=0;i<brs.length;i++){brd.push({n:brs[i],t:0,d:0})}
|
||||
for(var i=0;i<evs.length;i++){var e=evs[i];brd[e.b].t++;if(e.s==="done")brd[e.b].d++}
|
||||
brd.sort(function(a,b){return(b.d/b.t||0)-(a.d/a.t||0)});
|
||||
var h="<html xmlns:o='urn:schemas-microsoft-com:office:office' xmlns:p='urn:schemas-microsoft-com:office:powerpoint' xmlns='http://www.w3.org/TR/REC-html40'><head><meta charset='utf-8'><title>\u0410\u043D\u0430\u043B\u0438\u0442\u0438\u043A\u0430 HSE</title><style>body{font:16px Arial;padding:30px}@page{size:A4 landscape;margin:10mm}h1{color:#005BAA;font-size:28px}.num{font-size:42px;font-weight:800;color:#005BAA}.pct{font-size:64px;font-weight:800;color:"+(pct>=70?"#10B981":pct>=40?"#F59E0B":"#EF4444")+"}.bar{height:24px;background:#005BAA;border-radius:6px;margin:6px 0}.slide{page-break-after:always;min-height:400px}table{border-collapse:collapse;width:100%}td{padding:10px 16px;border:1px solid #ddd;font-size:14px}th{background:#0A1628;color:#fff;padding:8px 12px;font-size:12px}</style></head><body><div class='slide'><h1>QAZAQtelecom HSE \u2014 \u0410\u043D\u0430\u043B\u0438\u0442\u0438\u043A\u0430 \u041F\u0411</h1><p>\u0414\u0430\u0442\u0430: "+new Date().toLocaleDateString("ru-RU")+"</p><br><div style='text-align:center'><div class='pct'>"+pct+"%</div><p style='font-size:18px;color:#64748B'>\u041E\u0431\u0449\u0438\u0439 \u043F\u0440\u043E\u0446\u0435\u043D\u0442 \u0438\u0441\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u044F \u043F\u043B\u0430\u043D\u0430</p></div><br><table><tr><td style='text-align:center'><div class='num'>"+total+"</div>\u0412\u0441\u0435\u0433\u043E</td><td style='text-align:center'><div class='num'>"+done+"</div>\u0418\u0441\u043F\u043E\u043B\u043D\u0435\u043D\u043E</td><td style='text-align:center'><div class='num'>"+warn+"</div>\u0412 \u043F\u0440\u043E\u0446\u0435\u0441\u0441\u0435</td><td style='text-align:center'><div class='num' style='color:#EF4444'>"+dueNow+"</div>\u041F\u0440\u043E\u0441\u0440\u043E\u0447\u0435\u043D\u043E</td></tr></table><div class='bar' style='width:"+Math.round(pct*5)+"px'></div></div><div class='slide'><h2>\u0420\u0435\u0439\u0442\u0438\u043D\u0433 \u0444\u0438\u043B\u0438\u0430\u043B\u043E\u0432</h2><table><tr><th>\u2116</th><th>\u0424\u0438\u043B\u0438\u0430\u043B</th><th>\u0412\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u043E</th><th>%</th></tr>";
|
||||
for(var i=0;i<brd.length;i++){var bp=brd[i].t?Math.round(brd[i].d/brd[i].t*100):0;h+="<tr><td>"+(i+1)+"</td><td>"+esc(brd[i].n)+"</td><td>"+brd[i].d+"/"+brd[i].t+"</td><td><div class='bar' style='width:"+(bp*2)+"px'></div> "+bp+"%</td></tr>"}
|
||||
h+="</table></div></body></html>";
|
||||
var blob=new Blob([h],{type:"application/vnd.ms-powerpoint"});
|
||||
var a=document.createElement("a");a.href=URL.createObjectURL(blob);a.download="analytics_"+new Date().toISOString().slice(0,10)+".ppt";a.click()
|
||||
var h="<!DOCTYPE html><html><head><meta charset='utf-8'><title>\u0410\u043D\u0430\u043B\u0438\u0442\u0438\u043A\u0430 HSE</title><style>body{font:16px Arial;padding:30px}@page{size:A4 landscape;margin:10mm}h1{color:#005BAA;font-size:24px}.num{font-size:36px;font-weight:800;color:#005BAA}.bar{height:20px;background:#005BAA;border-radius:4px;margin:2px 0}table{border-collapse:collapse}td{padding:8px 16px;border:1px solid #ddd}@media print{body{padding:5mm}}</style></head><body><h1>QAZAQtelecom HSE \u2014 \u0410\u043D\u0430\u043B\u0438\u0442\u0438\u043A\u0430</h1><p>\u0414\u0430\u0442\u0430: "+new Date().toLocaleDateString("ru-RU")+"</p><br><table><tr><td style='text-align:center'><div class='num'>"+total+"</div>\u0412\u0441\u0435\u0433\u043E</td><td style='text-align:center'><div class='num'>"+done+"</div>\u0418\u0441\u043F\u043E\u043B\u043D\u0435\u043D\u043E</td><td style='text-align:center'><div class='num'>"+warn+"</div>\u0412 \u043F\u0440\u043E\u0446\u0435\u0441\u0441\u0435</td><td style='text-align:center'><div class='num'>"+late+"</div>\u041F\u0440\u043E\u0441\u0440\u043E\u0447\u0435\u043D\u043E</td></tr></table><br><p>\u0412\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u0435: <strong>"+pct+"%</strong></p><div class='bar' style='width:"+Math.round(pct*4)+"px'></div><br><h3>\u0420\u0435\u0439\u0442\u0438\u043D\u0433 \u0444\u0438\u043B\u0438\u0430\u043B\u043E\u0432</h3><table>";
|
||||
for(var i=0;i<brd.length;i++){var bp=brd[i].t?Math.round(brd[i].d/brd[i].t*100):0;h+="<tr><td>"+(i+1)+". "+esc(brd[i].n)+"</td><td>"+brd[i].d+"/"+brd[i].t+"</td><td><div class='bar' style='width:"+bp+"px'></div></td><td>"+bp+"%</td></tr>"}
|
||||
h+="</table></body></html>";
|
||||
var blob=new Blob([h],{type:"application/vnd.openxmlformats-officedocument.presentationml.presentation"});
|
||||
var a=document.createElement("a");a.href=URL.createObjectURL(blob);a.download="analytics_"+new Date().toISOString().slice(0,10)+".pptx";a.click()
|
||||
}
|
||||
function dlAnalyticsPDF(){
|
||||
var h=document.getElementById("tab_analytics").innerHTML;
|
||||
@ -1975,15 +1975,16 @@ function dlAnalyticsPDF(){
|
||||
w.document.close()
|
||||
}
|
||||
function dlAnalyticsWord(){
|
||||
var total=evs.length;var done=0,late=0,warn=0;
|
||||
for(var i=0;i<evs.length;i++){if(evs[i].s==="done")done++;else if(evs[i].s==="late")late++;else warn++}
|
||||
var pct=total?Math.round(done/total*100):0;
|
||||
var dueNow=0;for(var i=0;i<evs.length;i++){if(evs[i].s!=="done"&&daysRem(evs[i].due)<=0)dueNow++}
|
||||
var h="<html xmlns:o='urn:schemas-microsoft-com:office:office' xmlns:w='urn:schemas-microsoft-com:office:word'><head><meta charset='utf-8'><title>\u0410\u043D\u0430\u043B\u0438\u0442\u0438\u043A\u0430 HSE</title><style>@page{size:A4;margin:20mm}body{font:14pt 'Times New Roman'}h1{color:#005BAA}table{border-collapse:collapse;width:100%}td{padding:8px 16px;border:1px solid #ccc;font-size:12pt}th{background:#eee}</style></head><body><h1>QAZAQtelecom HSE \u2014 \u0410\u043D\u0430\u043B\u0438\u0442\u0438\u043A\u0430</h1><p>\u0414\u0430\u0442\u0430: "+new Date().toLocaleDateString("ru-RU")+"</p><h2>\u041E\u0431\u0449\u0438\u0439 \u043F\u0440\u043E\u0446\u0435\u043D\u0442 \u0438\u0441\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u044F: "+pct+"%</h2><table><tr><td>\u0412\u0441\u0435\u0433\u043E</td><td>"+total+"</td><td>\u0418\u0441\u043F\u043E\u043B\u043D\u0435\u043D\u043E</td><td>"+done+"</td></tr><tr><td>\u0412 \u043F\u0440\u043E\u0446\u0435\u0441\u0441\u0435</td><td>"+warn+"</td><td>\u041F\u0440\u043E\u0441\u0440\u043E\u0447\u0435\u043D\u043E</td><td>"+dueNow+"</td></tr></table></body></html>";
|
||||
var blob=new Blob([h],{type:"application/msword"});var a=document.createElement("a");a.href=URL.createObjectURL(blob);a.download="analytics.doc";a.click()
|
||||
var total=evs.length;
|
||||
var done=0,late=0,warn=0;
|
||||
for(var i=0;i<evs.length;i++){
|
||||
if(evs[i].s==="done")done++;else if(evs[i].s==="late")late++;else warn++
|
||||
}
|
||||
var h="<html xmlns:o='urn:schemas-microsoft-com:office:office' xmlns:w='urn:schemas-microsoft-com:office:word'><head><meta charset='utf-8'><title>Аналитика HSE</title><style>@page{size:A4;margin:20mm}body{font:14pt 'Times New Roman'}h1{color:#005BAA}table{border-collapse:collapse}td{border:1px solid #000;padding:12px 20px;font-size:20pt;font-weight:700}</style></head><body><h1>QAZAQtelecom HSE — Аналитика</h1><p>Дата: "+new Date().toLocaleDateString("ru-RU")+"</p><br><table><tr><td>Всего<br><span style='font-size:28pt'>"+total+"</span></td><td>Исполнено<br><span style='font-size:28pt'>"+done+" ("+Math.round(done/total*100)+"%)</span></td><td>В процессе<br><span style='font-size:28pt'>"+warn+"</span></td><td>Просрочено<br><span style='font-size:28pt;color:red'>"+late+"</span></td></tr></table></body></html>";
|
||||
var blob=new Blob([h],{type:"application/msword"});
|
||||
var a=document.createElement("a");a.href=URL.createObjectURL(blob);a.download="analytics.doc";a.click()
|
||||
}
|
||||
|
||||
|
||||
}catch(e){alert("JS ERROR: "+e.message)}</script></script></script></script></script></script></script></script></script>
|
||||
</script></script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
Loading…
Reference in New Issue
Block a user