diff --git a/index.html b/index.html index 00bda6e..d6f13aa 100644 --- a/index.html +++ b/index.html @@ -202,7 +202,6 @@ 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="
"+all.length+"
Всего
"+done.length+"
Исполнено ("+dp+"%)
"+warn.length+"
В процессе
"+late.length+"
Просрочено
"+wait.length+"
Не начато
"; - h+="
"; // Chart h+="

Динамика по кварталам

Q1 фактQ2 прогнозQ3 планQ4 цель
"; // Branch ranking @@ -221,18 +220,16 @@ 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"
"+x.c+" "+esc(x.m)+"Срок: "+x.t+"
"}).join(""):"
Нет уведомлений
"} -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="Аналитика ПБ

📊 Аналитика ПБ — все мероприятия

Сформирован: "+new Date().toLocaleDateString()+"

"; - all.forEach(function(e){var cl=e.s==="done"?"done":e.s==="late"?"late":"";h+=""}); - h+="
МероприятиеПодпунктыФилиалРазделСтатусСрокОсталосьФакт
"+e.id+""+esc(e.t)+""+(e.sub?e.sub.length:"—")+""+esc(br[e.b])+""+sec[e.sec]+""+st[e.s]+""+e.due+""+daysLeft(e).replace(/<[^>]*>/g,"")+""+(e.done||"—")+"
"; - 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("Слишком большой")}} +// ===== REPORTS ===== function renderRp(){var b=0;for(var i=0;i"+M(i)+""; + var h="

Сводный отчёт

"; + h+="

Хранилище: "+(b>1048576?(b/1048576).toFixed(1)+" МБ":(b/1024).toFixed(0)+" КБ")+"

"; h+="
"; -function dDOC_removed(){}//placeholder + document.getElementById("pg-rp").innerHTML=h} +function dCSV(){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="Отчёт ПБ

Сводный отчёт ПБ

";all.forEach(function(e){var cl={done:"g",warn:"a",late:"r",wait:""}[e.s];h+="

"+e.id+". "+esc(e.t)+"

"+br[e.b]+" | "+sec[e.sec]+" | Срок: "+e.due+" | "+st[e.s]+"

";var d=getMD(e.id,-1);for(var i=f;i<=t;i++){var m=ms[i];if(d[m]&&d[m].report)h+="
"+M(i)+"

"+esc(d[m].report)+"

"}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+="
"+s.l+") "+M(i)+"

"+esc(sd[m].report)+"

"}});h+="
"});h+="";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 exp(){var d={events:ev,date:new Date().toISOString(),files:{},sc:{}};for(var i=0;iВы: "+esc(q)});chatHistory.push({role:"bot",text:"🤖 ИИ: "+aiAnswer(q)});renderAi();var el=document.getElementById("aiChat");if(el)el.scrollTop=el.scrollHeight} -function aiAnswer(q){ - var all=ev||[],now=new Date(),late=all.filter(function(e){return e.s==="late"}),done=all.filter(function(e){return e.s==="done"}),warn=all.filter(function(e){return e.s==="warn"}),dp=all.length?Math.round(done.length/all.length*100):0; - function bs(){var r=[];br.forEach(function(b,i){var it=all.filter(function(e){return e.b===i}),d=it.filter(function(e){return e.s==="done"}).length,l=it.filter(function(e){return e.s==="late"}).length;r.push({name:b,done:d,total:it.length,late:l,pct:it.length?Math.round(d/it.length*100):0})});r.sort(function(a,b){return b.pct-a.pct});return r} - function cr(e){if(e.s==="done")return{l:"отсутствует",p:0};if(e.s==="late")return{l:"критический",p:100};var s=0;var p=e.due.split(".");if(p.length===3){var d=new Date(parseInt(p[2]),parseInt(p[1])-1,parseInt(p[0])),days=Math.round((d-now)/86400000);if(days<=7)s+=40;else if(days<=14)s+=25;else if(days<=30)s+=15}if(e.p<20)s+=25;else if(e.p<50)s+=15;var md=getMD(e.id,-1),hr=false;for(var k in md)if(md.hasOwnProperty(k)&&md[k]&&md[k].report)hr=true;if(!hr)s+=20;var l=s>=60?"критический":s>=35?"высокий":s>=15?"средний":"низкий";return{l:l,p:Math.min(s,95)}} - var qq=q.toLowerCase(); - if(qq.indexOf("просрочен")>=0){if(!late.length)return"Просрочек нет.";var r="Просрочено "+late.length+":
";late.forEach(function(e){r+="• №"+e.id+" — "+esc(e.t.slice(0,70))+"...
"+br[e.b]+" | срок "+e.due+"
"});return r} - if(qq.indexOf("текущ")>=0||qq.indexOf("месяц")>=0){var dtm=all.filter(function(e){if(e.s==="done"||e.s==="late")return false;var p=e.due.split(".");return p.length===3&&parseInt(p[1])===(now.getMonth()+1)});return dtm.length?"К завершению в этом месяце ("+dtm.length+"):
"+dtm.map(function(e){return"• №"+e.id+" — "+esc(e.t.slice(0,60))+"... ("+e.due+")"}).join("
"):"В этом месяце срочных мероприятий нет."} - if(qq.indexOf("риск")>=0||qq.indexOf("прогноз")>=0){var risks=[];all.forEach(function(e){if(e.s!=="done"){var c=cr(e);if(c.l!=="низкий")risks.push({e:e,risk:c})}});risks.sort(function(a,b){return b.risk.p-a.risk.p});if(!risks.length)return"Рисков не выявлено.";var r="Прогноз рисков:
";risks.slice(0,8).forEach(function(x){r+="• №"+x.e.id+" — "+x.risk.p+"% ("+x.risk.l+") — "+esc(x.e.t.slice(0,50))+"...
"});return r} - if(qq.indexOf("рейтинг")>=0||qq.indexOf("филиал")>=0||qq.indexOf("сравн")>=0){var bsd=bs(),r="Рейтинг филиалов:
";bsd.forEach(function(b,i){r+=(i+1)+". "+b.name+" — "+b.pct+"% ("+b.done+"/"+b.total+(b.late?", просрочено:"+b.late:"")+")
"});return r} - if(qq.indexOf("сводка")>=0||qq.indexOf("ежедн")>=0||qq.indexOf("утр")>=0){return"Сводка на "+new Date().toLocaleDateString()+"
• План: "+dp+"% ("+done.length+"/"+all.length+")
• Просрочено: "+late.length+"
• В процессе: "+warn.length+"
• Не начато: "+(all.length-done.length-late.length-warn.length)+"

→ Рекомендации:
"+(late.length?"• Эскалировать просрочки
":"")+"• Проверить подтверждающие документы
• Запросить отчёты у отстающих";} - if(qq.indexOf("советник")>=0||qq.indexOf("директор")>=0){var bsd=bs(),w3=bsd.slice(-3).map(function(b){return b.name+" ("+b.pct+"%)"}).join(", ");return"👔 Советник директора по ПБ:

Выводы:
• План: "+dp+"%. "+(dp>=70?"Темп хороший.":dp>=40?"Темп средний.":"Критично!")+"
• Просрочено: "+late.length+"

Риски: "+w3+"

Решения:
1. Совещание с отстающими филиалами
2. Еженедельный контроль просрочек
3. Запросить документы у всех в статусе «В процессе»
4. Усилить ИИ-мониторинг
5. Доклад Правлению";} - if(qq.indexOf("почему")>=0||qq.indexOf("причин")>=0){return"Причины отставания:
• Отсутствие текстовых отчётов
• Нет подтверждающих файлов
• Низкая активность исполнителей
• Приближение сроков без обновлений

→ Решение: активизировать загрузку отчётов и документов.";} - if(qq.indexOf("проверк")>=0||qq.indexOf("качеств")>=0||qq.indexOf("подтвержд")>=0){var nf=all.filter(function(e){if(e.s==="done")return false;var d=getMD(e.id,-1),h=false;for(var k in d)if(d.hasOwnProperty(k)&&d[k]&&d[k].files&&d[k].files.length)h=true;return !h});return"Проверка качества:
• Без файлов: "+nf.length+" мероприятий
• Полнота: "+(100-Math.round(nf.length/all.length*100))+"%

→ Рекомендация: запросить недостающие документы.";} - if(qq.indexOf("аудит")>=0)return"🔎 AI-аудитор:
• "+late.length+" мероприятий с нарушением сроков
• Рекомендуется аудит отстающих филиалов
• Проверить: обучение, медосмотры, СИЗ, инструктажи"; - if(qq.indexOf("360")>=0||qq.indexOf("комплекс")>=0){var bsd=bs();return"ПБ 360°:
• План: "+dp+"%
• Зона риска: "+bsd.filter(function(b){return b.pct<50}).map(function(b){return b.name}).join(", ")+"
• Приоритет: устранить просрочки, активизировать отчётность";} - if(qq.indexOf("показател")>=0||qq.indexOf("kpi")>=0){var bsd=bs();return"KPI безопасности:
• План: "+dp+"%
• Лучший: "+bsd[0].name+" ("+bsd[0].pct+"%)
• Худший: "+bsd[bsd.length-1].name+" ("+bsd[bsd.length-1].pct+"%)
• Просрочено: "+late.length;} - if(qq.indexOf("статус")>=0||qq.indexOf("пункт")>=0){var num=q.match(/\d+/);if(num){var e=null;for(var i=0;iПункт №"+e.id+"
Статус: "+st[e.s]+"
Филиал: "+br[e.b]+"
Срок: "+e.due+"
Риск: "+c.l+" ("+c.p+"%)";}return"Пункт №"+num[0]+" не найден.";}} - if(qq.indexOf("привет")>=0||qq.indexOf("здрав")>=0||qq.indexOf("помощ")>=0)return"👋 Я ИИ-помощник по ПБ АО «Казахтелеком». Спросите: «сводка», «риски», «рейтинг филиалов», «советник», «статус пункта N»."; - return"Спросите: сводка · риски · рейтинг филиалов · советник · просроченные · проверка · аудит · 360 · статус пункта N · причины · показатели"; +function aiAnswer(q){var all=ev||[],now=new Date(),late=all.filter(function(e){return e.s==="late"}),done=all.filter(function(e){return e.s==="done"}),warn=all.filter(function(e){return e.s==="warn"}),wait=all.filter(function(e){return e.s==="wait"}); + // Query routing + if(q.indexOf("просрочен")>=0||q.indexOf("просрочк")>=0||q.indexOf("сорван")>=0){if(!late.length)return"Просроченных мероприятий нет. План выполняется без отклонений.";var r="Просрочено "+late.length+" мероприятий:
";late.forEach(function(e){r+="• №"+e.id+" — "+esc(e.t.slice(0,80))+"...
Филиал: "+br[e.b]+", срок: "+e.due+"
"});r+="
Рекомендация: эскалировать руководителям филиалов, провести совещание.";return r} + if(q.indexOf("риск")>=0||q.indexOf("невыполнен")>=0||q.indexOf("угроз")>=0){var risks=[];all.forEach(function(e){if(e.s!=="done"&&e.s!=="late"){var p=e.due.split(".");if(p.length===3){var d=new Date(parseInt(p[2]),parseInt(p[1])-1,parseInt(p[0]));var days=Math.round((d-now)/86400000);if(days<=30)risks.push({e:e,days:days})}}});risks.sort(function(a,b){return a.days-b.days});if(!risks.length)return"Мероприятий с риском невыполнения в ближайшие 30 дней не выявлено.";var r="Выявлено "+risks.length+" мероприятий с риском:
";risks.slice(0,8).forEach(function(x){r+="• №"+x.e.id+" — "+x.days+" дн. — "+esc(x.e.t.slice(0,60))+"...
"});return r} + if(q.indexOf("статус")>=0||q.indexOf("пункт")>=0||q.indexOf("мероприятие")>=0){var num=q.match(/\d+/);if(num){var e=null;for(var i=0;i
Статус: "+st[e.s]+"
Филиал: "+br[e.b]+"
Срок: "+e.due+"
Осталось: "+daysLeft(e).replace(/<[^>]*>/g,"")+"
Ответственный: "+nl(e.r);if(e.sub){r+="
Подпункты: "+e.sub.length+" шт."}return r}return"Пункт №"+num[0]+" не найден в плане."}} + if(q.indexOf("сводка")>=0||q.indexOf("руководств")>=0||q.indexOf("правлен")>=0||q.indexOf("итог")>=0||q.indexOf("обзор")>=0){var dp=all.length?Math.round(done.length/all.length*100):0;var r="Сводка для руководства
• План выполнен на "+dp+"% ("+done.length+"/"+all.length+")
• В процессе: "+warn.length+"
• Не начато: "+wait.length+"
• Просрочено: "+late.length+"
";if(late.length)r+="
Требует внимания: эскалация просрочек.";else r+="
Ситуация под контролем.";return r} + if(q.indexOf("рейтинг")>=0||q.indexOf("филиал")>=0||q.indexOf("отста")>=0||q.indexOf("худш")>=0||q.indexOf("лучш")>=0){var brData=[];br.forEach(function(b,i){var it=all.filter(function(e){return e.b===i});var d=it.filter(function(e){return e.s==="done"}).length;var l=it.filter(function(e){return e.s==="late"}).length;brData.push({name:b,done:d,total:it.length,late:l,pct:it.length?Math.round(d/it.length*100):0})});brData.sort(function(a,b){return b.pct-a.pct});var r="Рейтинг филиалов:
";brData.forEach(function(b,i){r+=(i+1)+". "+b.name+" — "+b.pct+"% ("+b.done+"/"+b.total+(b.late?", просрочено: "+b.late:"")+")
"});return r} + if(q.indexOf("график")>=0||q.indexOf("диаграм")>=0||q.indexOf("динамик")>=0){return"График доступен на вкладке «Аналитика». Переключитесь для просмотра визуализации."} + if(q.indexOf("документ")>=0||q.indexOf("файл")>=0){var tf=0;all.forEach(function(e){var d=getMD(e.id,-1);for(var k in d)if(d.hasOwnProperty(k))tf+=(d[k].files||[]).length;if(e.sub)e.sub.forEach(function(si){var sd=getMD(e.id,si);for(var k in sd)if(sd.hasOwnProperty(k))tf+=(sd[k].files||[]).length})});return"Всего загружено "+tf+" документов. Детальная информация — на вкладке «Отчётность»."} + if(q.indexOf("срок")>=0||q.indexOf("дедлайн")>=0){var near=[];all.forEach(function(e){if(e.s!=="done"&&e.s!=="late"){var p=e.due.split(".");if(p.length===3){var d=new Date(parseInt(p[2]),parseInt(p[1])-1,parseInt(p[0]));var days=Math.round((d-now)/86400000);if(days<=14)near.push({e:e,days:days})}}});near.sort(function(a,b){return a.days-b.days});if(!near.length)return"Ближайших сроков исполнения в течение 14 дней нет.";var r="Ближайшие сроки (≤14 дней):
";near.forEach(function(x){r+="• №"+x.e.id+" — "+x.days+" дн. — "+esc(x.e.t.slice(0,50))+"...
"});return r} + if(q.indexOf("привет")>=0||q.indexOf("здрав")>=0)return"Здравствуйте! Я ИИ-помощник по производственной безопасности. Спросите о статусе мероприятий, просрочках, рисках, рейтинге филиалов или сводке для руководства."; + return"Я могу ответить на вопросы:
«просроченные» — список просрочек
«риски» — прогноз рисков невыполнения
«сводка» — сводка для руководства
«статус пункта N» — статус мероприятия
«рейтинг филиалов» — кто лучший/худший
«сроки» — ближайшие дедлайны
«документы» — статистика загрузок"; } // ===== EDIT (no regions) ===== @@ -294,7 +284,7 @@ function oe(id,mi,si){ h+=""; h+=""; scfs.forEach(function(f,fi){h+="
📄 "+esc(f.name)+""+(f.size/1024).toFixed(0)+" КБ · "+(f.date||"")+"
"}); - h+="

PDF, DOC/DOCX, XLS/XLSX, JPG/PNG, PPT/PPTX · до 3 МБ

"; + h+="
"; } }); h+="
";ms.forEach(function(_,i){h+=""+M(i)+""});h+="
"; @@ -305,7 +295,7 @@ function oe(id,mi,si){ h+=""; h+=""; cfs.forEach(function(f,i){h+="
📄 "+esc(f.name)+""+(f.size/1024).toFixed(0)+" КБ · "+(f.date||"")+"
"}); - h+="

PDF, DOC/DOCX, XLS/XLSX, JPG/PNG, PPT/PPTX · до 3 МБ

"; + h+="

PDF, DOC, XLS, фото, презентации

"; } h+="
🤖 ИИ-анализ: "+esc(e.ai)+"
";