fix: CSV/Word/PDF use getReportPeriod, sub-items have file/date/note support

This commit is contained in:
Dauren777 2026-06-11 10:24:32 +00:00
parent 6767494d2e
commit eeb642101d

View File

@ -1211,6 +1211,10 @@ function openEv(id,subIdx){
for(var i=0;i<evs.length;i++){if(evs[i].id===id){e=evs[i];break}}
if(!e)return;
var fk=subIdx!==undefined?"sf_"+id+"_s"+subIdx:"sf_"+id;
var now=new Date();var curMonth=now.getMonth();
var savedMonth=localStorage.getItem("evmonth_"+id);
var selMonth=savedMonth!==null?parseInt(savedMonth,10):curMonth;
var fkBase="sf_"+id+"_m"+selMonth+(subIdx!==undefined?"_s"+subIdx:"");
var h="<div style='max-width:700px'>";
var titlePre=subIdx!==undefined?"N"+id+"."+e.sub[subIdx].l+" ":"N"+id+". ";
h+="<h3 style='margin-bottom:8px;padding-right:30px'>"+titlePre+esc(e.t)+"</h3>";
@ -1234,11 +1238,7 @@ 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'>";
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'>Количество:</span> <input type='number' id='evq_"+e.id+"' value='"+(localStorage.getItem("sq_"+e.id+(subIdx!==undefined?"_s"+subIdx:"")+"_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+"' onchange='switchEvMonth("+e.id+","+(subIdx!==undefined?subIdx:"null")+")' style='padding:4px;border:1px solid #E2E8F0;border-radius:4px;font-size:12px'>";
var mnames=["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек"];
for(var mi=0;mi<12;mi++){
@ -1247,11 +1247,11 @@ 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'><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+"_m"+selMonth)||"")):(localStorage.getItem("sn_"+e.id+"_m"+selMonth)||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+"_m"+selMonth+"_b"+bi;
var bk=fkBase+"_b"+bi;
var fd=localStorage.getItem(bk);
if(fd){
try{
@ -1265,7 +1265,7 @@ function openEv(id,subIdx){
}
}
}else{
var bk=fk+"_m"+selMonth+"_b"+(cu?cu.bg:0);
var bk=fkBase+"_b"+(cu?cu.bg:0);
var fd=localStorage.getItem(bk);
if(fd){
try{
@ -1310,11 +1310,19 @@ function switchEvMonth(id,subIdx){
var inm=document.getElementById("evm_"+id);if(!inm)return;
var mv=inm.value;
var inn=document.getElementById("evn_"+id);var inq=document.getElementById("evq_"+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 subSuffix=curSub!==null?"_s"+curSub:"";
if(inn)try{localStorage.setItem("sn_"+id+subSuffix+"_m"+mv,inn.value.trim())}catch(e){}
if(inq)try{localStorage.setItem("sq_"+id+subSuffix+"_m"+mv,(parseInt(inq.value,10)||0).toString())}catch(e){}
try{localStorage.setItem("evmonth_"+id,mv)}catch(e){}
openEv(id,subIdx!==null?subIdx:undefined)
}
function saveEvModal(id){
var sel=document.getElementById("evs_"+id);
for(var i=0;i<evs.length;i++){if(evs[i].id===id){if(sel)evs[i].s=sel.value;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()}break}}
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);var subSuffix2=curSub!==null?"_s"+curSub:"";if(inn)try{localStorage.setItem("sn_"+id+subSuffix2+"_m"+mv,inn.value.trim())}catch(e){};if(inq)try{localStorage.setItem("sq_"+id+subSuffix2+"_m"+mv,(parseInt(inq.value,10)||0).toString())}catch(e){}}
saveEv();closeModal();renderEv()
}
function saveEvModal(id){
var sel=document.getElementById("evs_"+id);
for(var i=0;i<evs.length;i++){if(evs[i].id===id){if(sel)evs[i].s=sel.value;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()}break}}
@ -1554,7 +1562,7 @@ function dlCSV(){
var blob=new Blob([csv],{type:"text/csv;charset=utf-8"});
var a=document.createElement("a");
a.href=URL.createObjectURL(blob);
a.download="report_"+document.getElementById("rp_year").value+"_"+(parseInt(document.getElementById("rp_month").value,10)+1)+".csv";
a.download="report_"+document.getElementById("rp_year").value+"_"+getReportPeriod().replace(/\s/g,"_")+".csv";
a.click()
}
function dlHTML(){
@ -1585,34 +1593,33 @@ function dlHTML(){
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()
}
function dlWord(){
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>"
var fl=getFilteredEvs();var periodLabel=getReportPeriod();var months=getReportMonths();
var mn=["\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"];
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 sn=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(sn)+" | \\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 fhtml="";for(var mi=0;mi<months.length;mi++){var fg="";var mk="_m"+months[mi];
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+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)fg+="<a href='"+f.data+"'>"+esc(f.n)+" ("+Math.round((f.s||0)/1024)+" KB)</a>"}}catch(ex){}}
}}
if(fg)fhtml+="<p><strong>"+mn[months[mi]]+":</strong><br>"+fg+"</p>"}
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+="</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()
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()
}
function dlPdf(){
var fl=getFilteredEvs();
var month=parseInt(document.getElementById("rp_month").value,10)+1;
var year=document.getElementById("rp_year").value;
var hh="<!DOCTYPE html><html><head><meta charset='utf-8'><title>Отчёт План ПБ "+month+"."+year+"</title><style>body{font:14px Arial;padding:20px}table{border-collapse:collapse;width:100%}th,td{border:1px solid #ccc;padding:6px 10px;font-size:12px;text-align:left}th{background:#0B1A2E;color:#fff}@media print{body{padding:10mm}table{page-break-inside:auto}tr{page-break-inside:avoid}}</style></head><body><h2>План производственной безопасности</h2><p>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+="</table><p><br><em>Отчёт сформирован: "+new Date().toLocaleDateString("ru-RU")+"</em></p><script>window.onload=function(){window.print()}<\/script></body></html>";
var w=window.open("","_blank","width=900,height=700");
w.document.write(hh);
w.document.close()
var fl=getFilteredEvs();var periodLabel=getReportPeriod();
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;padding:20px}h2{font-size:20px}h3{font-size:14px;color:#005BAA;border-bottom:1px solid #ccc;padding-bottom:4px}.meta{font-size:12px;color:#555;margin:4px 0}table{border-collapse:collapse;width:100%}th,td{border:1px solid #ccc;padding:6px 10px;font-size:12px;text-align:left}th{background:#0B1A2E;color:#fff}@media print{body{padding:10mm}}</style></head><body><h2>\\u041F\\u043B\\u0430\\u043D \\u041F\\u0411</h2><p>QAZAQtelecom HSE \\u0437\\u0430 "+periodLabel+"</p><br><table><tr><th>N</th><th>\\u041C\\u0435\\u0440\\u043E\\u043F\\u0440\\u0438\\u044F\\u0442\\u0438\\u0435</th><th>\\u0424\\u0438\\u043B\\u0438\\u0430\\u043B</th><th>\\u0421\\u0440\\u043E\\u043A</th><th>\\u0421\\u0442\\u0430\\u0442\\u0443\\u0441</th><th>%</th><th>\\u041A\\u043E\\u043B-\\u0432\\u043E</th><th>\\u041F\\u0440\\u0438\\u043C\\u0435\\u0447\\u0430\\u043D\\u0438\\u0435</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+="</table><p><em>\\u041E\\u0442\\u0447\\u0451\\u0442 \\u0441\\u0444\\u043E\\u0440\\u043C\\u0438\\u0440\\u043E\\u0432\\u0430\\u043D: "+new Date().toLocaleDateString("ru-RU")+"</em></p><script>window.onload=function(){window.print()}<\/script></body></html>";
var w=window.open("","_blank","width=900,height=700");w.document.write(hh);w.document.close()
}
function hseSend(){
var btn=document.getElementById("hse_btn");