v68: откат проблемных функций, чистый JS
This commit is contained in:
parent
c3d3813ce2
commit
200b92bf56
49
index.html
49
index.html
@ -230,54 +230,9 @@ function dAnHTML(){var all=ev||[];var h="<!DOCTYPE html><html><head><meta charse
|
||||
function renderRp(){var b=0;for(var i=0;i<localStorage.length;i++){var k=localStorage.key(i);if(k.indexOf("sf_")===0)b+=localStorage.getItem(k).length*2}
|
||||
var h="<div class='card'><h3>📥 Сводный отчёт</h3><div class='fr'><select id='rf'>";for(var i=0;i<ms.length;i++)h+="<option value='"+i+"'>"+M(i)+"</option>";
|
||||
h+="</select><span>—</span><select id='rt'>";for(var i=0;i<ms.length;i++)h+="<option value='"+i+"'"+(i===11?" selected":"")+">"+M(i)+"</option>";
|
||||
h+="</select><button class='btn btn-sm' onclick='dCSV()'>CSV</button><button class='btn btn-sm' onclick='dHTML()'>HTML</button><button class='btn btn-sm btn-gn' onclick='dDOC()'>Word</button><button class='btn btn-sm' onclick='dPDF()'>PDF</button></div>";
|
||||
h+="<p style='font-size:12px;color:var(--gray-500);margin-bottom:10px'>Хранилище: "+(b>1048576?(b/1048576).toFixed(1)+" МБ":(b/1024).toFixed(0)+" КБ")+"</p>";
|
||||
// Monthly sign-off
|
||||
h+="<div class='card' style='background:var(--gray-50);margin-top:12px'><h3>✍️ Подписание отчёта по месяцу</h3><div class='fr'><select id='sm' onchange='showSignInfo()'>";for(var i=0;i<ms.length;i++)h+="<option value='"+i+"'>"+M(i)+"</option>";
|
||||
h+="</select><button class='btn btn-sm' onclick='signMonth()'>✍️ Подписать и направить</button></div><div id='signInfo' style='font-size:12px;color:var(--gray-500);margin-top:8px'></div><p style='font-size:11px;color:var(--gray-500);margin-top:6px'>При подписании формируется сводный отчёт за месяц для отправки в <a href='https://hse.sk.kz/' target='_blank' style='color:var(--cyan)'>HSE Samruk Kazyna</a></p></div>";
|
||||
h+="</select><button class='btn btn-sm' onclick='dCSV()'>CSV</button><button class='btn btn-sm' onclick='dHTML()'>HTML</button></div>";
|
||||
h+="<button class='btn btn-sm btn-gn' onclick='exp()'>💾 Сохранить всё</button> <button class='btn btn-sm btn-ghost' onclick=\"document.getElementById('if').click()\">📥 Загрузить</button> <input type='file' id='if' accept='.json' style='display:none' onchange='imp(this)'> <button class='btn btn-sm btn-red' onclick='clr()'>🗑 Очистить</button></div>";
|
||||
document.getElementById("pg-rp").innerHTML=h;showSignInfo()}
|
||||
function dDOC(){var f=parseInt(document.getElementById("rf").value),t=parseInt(document.getElementById("rt").value),all=ev||[];
|
||||
var h="<html xmlns:o='urn:schemas-microsoft-com:office:office' xmlns:w='urn:schemas-microsoft-com:office:word'><head><meta charset='utf-8'><style>body{font:14px Arial}h1{font-size:20px}h2{font-size:16px;color:#0B1A2E}table{width:100%;border-collapse:collapse;margin:10px 0}th,td{border:1px solid #999;padding:6px 10px;font-size:12px}th{background:#0B1A2E;color:#fff}.g{color:#10B981}.r{color:#EF4444}</style></head><body>";
|
||||
h+="<h1>Сводный отчёт по производственной безопасности</h1><p>АО «Казахтелеком» | Период: "+M(f)+" — "+M(t)+" | Сформирован: "+new Date().toLocaleDateString()+"</p>";
|
||||
h+="<h2>1. Общая статистика</h2><table><tr><th>Показатель</th><th>Значение</th></tr>";
|
||||
h+="<tr><td>Всего мероприятий</td><td>"+all.length+"</td></tr>";
|
||||
h+="<tr><td>Исполнено</td><td class='g'>"+all.filter(function(e){return e.s==="done"}).length+"</td></tr>";
|
||||
h+="<tr><td>Просрочено</td><td class='r'>"+all.filter(function(e){return e.s==="late"}).length+"</td></tr></table>";
|
||||
h+="<h2>2. Детализация по мероприятиям</h2><table><tr><th>№</th><th>Мероприятие</th><th>Филиал</th><th>Статус</th><th>Срок</th></tr>";
|
||||
all.forEach(function(e){h+="<tr><td>"+e.id+"</td><td>"+esc(e.t)+"</td><td>"+br[e.b]+"</td><td>"+st[e.s]+"</td><td>"+e.due+"</td></tr>"});
|
||||
h+="</table><h2>3. Отчёты по месяцам</h2>";
|
||||
all.forEach(function(e){var has=false;for(var i=f;i<=t;i++){var m=ms[i],d=getMD(e.id,-1);if(d[m]&&d[m].report){has=true;h+="<p><b>№"+e.id+" — "+M(i)+":</b> "+esc(d[m].report)+"</p>"}}if(e.sub)e.sub.forEach(function(s,si){var sd=getMD(e.id,si);for(var i=f;i<=t;i++){var m=ms[i];if(sd[m]&&sd[m].report)h+="<p><b>"+s.l+") — "+M(i)+":</b> "+esc(sd[m].report)+"</p>"}})});
|
||||
h+="<br><p>Подготовлено с использованием ИИ-агента мониторинга ПБ</p></body></html>";
|
||||
var a=document.createElement("a");a.href=URL.createObjectURL(new Blob(["\uFEFF"+h],{type:"application/msword"}));a.download="otchet_pb.doc";a.click()}
|
||||
|
||||
function dPDF(){var f=parseInt(document.getElementById("rf").value),t=parseInt(document.getElementById("rt").value),all=ev||[];
|
||||
var h="<html><head><meta charset='utf-8'><style>body{font:13px/1.6 Arial;max-width:1000px;margin:0 auto;padding:24px;color:#222}h1{font-size:20px;border-bottom:2px solid #0B1A2E;padding-bottom:8px}h2{font-size:16px;color:#0B1A2E;margin-top:20px}table{width:100%;border-collapse:collapse;margin:12px 0;font-size:11px}th,td{border:1px solid #ccc;padding:6px 8px;text-align:left}th{background:#0B1A2E;color:#fff}.g{color:#10B981}.r{color:#EF4444}@media print{body{padding:0}h1{font-size:18px}h2{font-size:14px}}</style></head><body>";
|
||||
h+="<h1>Сводный отчёт по производственной безопасности</h1><p>АО «Казахтелеком» | Период: "+M(f)+" — "+M(t)+" | "+new Date().toLocaleDateString()+"</p>";
|
||||
h+="<h2>Общая статистика</h2><table><tr><th>Показатель</th><th>Значение</th></tr><tr><td>Всего</td><td>"+all.length+"</td></tr><tr><td>Исполнено</td><td class='g'>"+all.filter(function(e){return e.s==="done"}).length+"</td></tr><tr><td>Просрочено</td><td class='r'>"+all.filter(function(e){return e.s==="late"}).length+"</td></tr></table>";
|
||||
h+="<h2>Мероприятия</h2><table><tr><th>№</th><th>Мероприятие</th><th>Филиал</th><th>Статус</th><th>Срок</th></tr>";
|
||||
all.forEach(function(e){h+="<tr><td>"+e.id+"</td><td>"+esc(e.t)+"</td><td>"+br[e.b]+"</td><td>"+st[e.s]+"</td><td>"+e.due+"</td></tr>"});h+="</table><p style='margin-top:20px;font-size:11px;color:#999'>Подготовлено ИИ-агентом мониторинга ПБ</p></body></html>";
|
||||
var w=window.open("","_blank","width=1000,height=800");w.document.write(h);w.document.close();setTimeout(function(){w.print()},500)}
|
||||
|
||||
function showSignInfo(){var mi=parseInt((document.getElementById("sm")||{}).value||0);var all=ev||[],mk=ms[mi],tot=0,signed=localStorage.getItem("signed_"+mk);
|
||||
all.forEach(function(e){var d=getMD(e.id,-1);if(d[mk]&&(d[mk].report||(d[mk].files&&d[mk].files.length)))tot++});
|
||||
document.getElementById("signInfo").innerHTML="За "+M(mi)+": отчётов по <b>"+tot+"</b> мероприятиям. "+(signed?"<span style='color:var(--green)'>✅ Подписан ("+signed+")</span>":"<span style='color:var(--gray-500)'>Не подписан</span>")}
|
||||
|
||||
function signMonth(){var mi=parseInt(document.getElementById("sm").value),mk=ms[mi],all=ev||[],tot=0;
|
||||
all.forEach(function(e){var d=getMD(e.id,-1);if(d[mk]&&(d[mk].report||(d[mk].files&&d[mk].files.length)))tot++});
|
||||
localStorage.setItem("signed_"+mk,new Date().toLocaleDateString()+" — "+cu.n);
|
||||
// Build summary for HSE
|
||||
var sum="Сводный отчёт за "+M(mi)+"\nАО «Казахтелеком»\n\n";
|
||||
sum+="Мероприятий с отчётами: "+tot+" из "+all.length+"\n";
|
||||
sum+="Исполнено: "+all.filter(function(e){return e.s==="done"}).length+"\n";
|
||||
sum+="Просрочено: "+all.filter(function(e){return e.s==="late"}).length+"\n\n";
|
||||
sum+="Подписал: "+cu.n+"\nДата: "+new Date().toLocaleDateString()+"\n";
|
||||
sum+="\n=== Детализация ===\n";
|
||||
all.forEach(function(e){var d=getMD(e.id,-1);if(d[mk]&&d[mk].report)sum+="№"+e.id+": "+d[mk].report+"\n"});
|
||||
localStorage.setItem("hse_report_"+mk,sum);
|
||||
alert("✅ Отчёт за "+M(mi)+" подписан!\n\nСводка сохранена. Для отправки в HSE перейдите по ссылке:\nhttps://hse.sk.kz/\n\nТекст отчёта скопирован — вставьте в форму HSE.");
|
||||
showSignInfo()}(){var f=parseInt(document.getElementById("rf").value),t=parseInt(document.getElementById("rt").value),all=ev||[],csv="\uFEFF№;Филиал;Мероприятие;Статус;Осталось;Срок\n";all.forEach(function(e){csv+=e.id+";"+br[e.b]+";\""+e.t.replace(/"/g,'""')+"\";"+st[e.s]+";"+daysLeft(e).replace(/<[^>]*>/g,"")+";"+e.due+"\n"});var a=document.createElement("a");a.href=URL.createObjectURL(new Blob([csv]));a.download="otchet.csv";a.click()}
|
||||
function dHTML(){var f=parseInt(document.getElementById("rf").value),t=parseInt(document.getElementById("rt").value),all=ev||[],h="<!DOCTYPE html><html><head><meta charset='utf-8'><title>Отчёт ПБ</title><style>body{font:13px/1.5 Arial;max-width:1000px;margin:0 auto;padding:24px}.ev{border:1px solid #ddd;border-radius:10px;padding:16px;margin-bottom:14px}.badge{display:inline-block;padding:3px 8px;border-radius:4px;font-size:10px;font-weight:700}.g{background:#D1FAE5;color:#065F46}.a{background:#FEF3C7;color:#92400E}.r{background:#FEE2E2;color:#991B1B}.m{background:#f5f5f5;padding:8px 12px;border-radius:6px;margin:6px 0}</style></head><body><h2>Сводный отчёт ПБ</h2>";all.forEach(function(e){var cl={done:"g",warn:"a",late:"r",wait:""}[e.s];h+="<div class='ev'><h3>"+e.id+". "+esc(e.t)+"</h3><p>"+br[e.b]+" | "+sec[e.sec]+" | Срок: "+e.due+" | <span class='badge "+cl+"'>"+st[e.s]+"</span></p>";var d=getMD(e.id,-1);for(var i=f;i<=t;i++){var m=ms[i];if(d[m]&&d[m].report)h+="<div class='m'><b>"+M(i)+"</b><p>"+esc(d[m].report)+"</p></div>"}if(e.sub)e.sub.forEach(function(s,si){var sd=getMD(e.id,si);for(var i=f;i<=t;i++){var m=ms[i];if(sd[m]&&sd[m].report)h+="<div class='m' style='border-left:3px solid #00B4D8'><b>"+s.l+") "+M(i)+"</b><p>"+esc(sd[m].report)+"</p></div>"}});h+="</div>"});h+="</body></html>";try{var a=document.createElement("a");a.href=URL.createObjectURL(new Blob(["\uFEFF"+h],{type:"text/html"}));a.download="otchet.html";a.click()}catch(e){alert("Слишком большой отчёт")}}
|
||||
function dDOC_removed(){}//placeholder
|
||||
function exp(){var d={events:ev,date:new Date().toISOString(),files:{},sc:{}};for(var i=0;i<localStorage.length;i++){var k=localStorage.key(i);if(k.indexOf("sf_")===0)d.files[k]=localStorage.getItem(k);if(k.indexOf("ss_")===0)d.sc[k]=localStorage.getItem(k)}var a=document.createElement("a");a.href=URL.createObjectURL(new Blob([JSON.stringify(d)]));a.download="backup.json";a.click()}
|
||||
function imp(inp){if(!inp.files.length)return;var r=new FileReader();r.onload=function(evt){try{var d=JSON.parse(evt.target.result);ev=d.events;saveEv();for(var k in d.files)localStorage.setItem(k,d.files[k]);for(var k in d.sc)localStorage.setItem(k,d.sc[k]);alert("OK. Обновите.");location.reload()}catch(e){alert("Ошибка")}};r.readAsText(inp.files[0])}
|
||||
function clr(){if(!confirm("Удалить все файлы?"))return;var ks=[];for(var i=0;i<localStorage.length;i++){var k=localStorage.key(i);if(k.indexOf("sf_")===0||k.indexOf("ss_")===0)ks.push(k)}ks.forEach(function(k){localStorage.removeItem(k)});alert("Очищено");renderRp()}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user