v64: скачивание аналитики CSV/HTML

This commit is contained in:
Dauren777 2026-06-09 12:35:27 +00:00
parent 2c27241021
commit f755ed6f9f

View File

@ -202,6 +202,7 @@ function renderAn(){
var all=ev||[],done=all.filter(function(e){return e.s==="done"}),late=all.filter(function(e){return e.s==="late"}),warn=all.filter(function(e){return e.s==="warn"}),wait=all.filter(function(e){return e.s==="wait"});
var dp=all.length?Math.round(done.length/all.length*100):0;
var h="<div class='stats'><div class='stat'><div class='n'>"+all.length+"</div><div class='l'>Всего</div></div><div class='stat g'><div class='n'>"+done.length+"</div><div class='l'>Исполнено ("+dp+"%)</div></div><div class='stat a'><div class='n'>"+warn.length+"</div><div class='l'>В процессе</div></div><div class='stat r'><div class='n'>"+late.length+"</div><div class='l'>Просрочено</div></div><div class='stat'><div class='n'>"+wait.length+"</div><div class='l'>Не начато</div></div></div>";
h+="<div class='fr' style='margin-bottom:16px'><button class='btn btn-sm' onclick='dAnCSV()'>📥 Скачать CSV (все)</button><button class='btn btn-sm btn-ghost' onclick='dAnHTML()'>📄 Скачать HTML (все)</button></div>";
// Chart
h+="<div class='card'><h3>Динамика по кварталам</h3><div class='chart-bar'><div style='height:55%;background:var(--green)'></div><div style='height:70%;background:var(--green)'></div><div style='height:82%;background:var(--cyan)'></div><div style='height:"+dp+"%;background:var(--cyan)'></div></div><div style='display:flex;gap:8px;padding:8px 0 0;font-size:11px;color:var(--gray-500);text-align:center'><span style='flex:1'>Q1 факт</span><span style='flex:1'>Q2 прогноз</span><span style='flex:1'>Q3 план</span><span style='flex:1'>Q4 цель</span></div></div>";
// Branch ranking
@ -220,7 +221,12 @@ function nu(){var all=ev||[],n=[],now=new Date();all.forEach(function(e){if(e.s=
document.getElementById("nc").textContent=n.length;document.getElementById("nc").style.display=n.length?"inline-block":"none";
document.getElementById("nd").innerHTML=n.length?n.map(function(x){return"<div class='it'><b>"+x.c+" "+esc(x.m)+"</b><span>Срок: "+x.t+"</span></div>"}).join(""):"<div class='it' style='text-align:center;color:var(--gray-500)'>Нет уведомлений</div>"}
// ===== REPORTS =====
function dAnCSV(){var all=ev||[],csv="\uFEFF№;Филиал;Мероприятие;Подпункты;Раздел;Статус;Прогресс;Срок;Осталось;Факт;Описание\n";all.forEach(function(e){var rep="";var d=getMD(e.id,-1);for(var k in d)if(d.hasOwnProperty(k)&&d[k]&&d[k].report)rep+=d[k].report.replace(/"/g,'""')+"; ";csv+=e.id+";"+br[e.b]+";\""+e.t.replace(/"/g,'""')+"\";"+(e.sub?e.sub.length:"—")+";"+sec[e.sec]+";"+st[e.s]+";"+e.p+"%;"+e.due+";"+daysLeft(e).replace(/<[^>]*>/g,"")+";"+(e.done||"—")+";\""+rep+"\"\n"});var a=document.createElement("a");a.href=URL.createObjectURL(new Blob([csv]));a.download="analitika.csv";a.click()}
function dAnHTML(){var all=ev||[];var h="<!DOCTYPE html><html><head><meta charset='utf-8'><title>Аналитика ПБ</title><style>body{font:13px/1.5 Arial;max-width:1100px;margin:0 auto;padding:24px}h1{color:#0B1A2E}h2{color:#00B4D8;margin-top:24px}table{width:100%;border-collapse:collapse;margin-bottom:16px}th,td{padding:8px 12px;text-align:left;font-size:12px;border:1px solid #ddd}th{background:#0B1A2E;color:#fff;font-weight:600}.g{color:#10B981}.a{color:#F59E0B}.r{color:#EF4444}.w{color:#64748B}.done td{background:#f0fff4}.late td{background:#fff5f5}</style></head><body><h1>📊 Аналитика ПБ — все мероприятия</h1><p>Сформирован: "+new Date().toLocaleDateString()+"</p><table><tr><th></th><th>Мероприятие</th><th>Подпункты</th><th>Филиал</th><th>Раздел</th><th>Статус</th><th>Срок</th><th>Осталось</th><th>Факт</th></tr>";
all.forEach(function(e){var cl=e.s==="done"?"done":e.s==="late"?"late":"";h+="<tr class='"+cl+"'><td>"+e.id+"</td><td>"+esc(e.t)+"</td><td>"+(e.sub?e.sub.length:"—")+"</td><td>"+esc(br[e.b])+"</td><td>"+sec[e.sec]+"</td><td><b class='"+{done:"g",warn:"a",late:"r",wait:"w"}[e.s]+"'>"+st[e.s]+"</b></td><td>"+e.due+"</td><td>"+daysLeft(e).replace(/<[^>]*>/g,"")+"</td><td>"+(e.done||"—")+"</td></tr>"});
h+="</table></body></html>";
try{var a=document.createElement("a");a.href=URL.createObjectURL(new Blob(["\uFEFF"+h],{type:"text/html"}));a.download="analitika.html";a.click()}catch(e){alert("Слишком большой")}}
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>";