v66: фикс ИИ — компактнее, без ошибок
This commit is contained in:
parent
e7199ca29f
commit
78d122136c
116
index.html
116
index.html
@ -257,103 +257,25 @@ function renderAi(){
|
||||
|
||||
function aiAsk(){var q=(document.getElementById("aiQ").value||"").trim().toLowerCase();if(!q)return;document.getElementById("aiQ").value="";chatHistory.push({role:"user",text:"<b>Вы:</b> "+esc(q)});chatHistory.push({role:"bot",text:"<b>🤖 ИИ:</b> "+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"}),wait=all.filter(function(e){return e.s==="wait"});var dp=all.length?Math.round(done.length/all.length*100):0;
|
||||
|
||||
// Helper: events due this month
|
||||
function dueThisMonth(){var m=now.getMonth()+1;return 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])===m})}
|
||||
// Helper: branch stats
|
||||
function branchStats(){var r=[];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;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}
|
||||
// Helper: risk calc
|
||||
function calcRisk(e){if(e.s==="done")return{level:"отсутствует",pct:0,reason:""};if(e.s==="late")return{level:"критический",pct:100,reason:"Мероприятие просрочено"};var score=0,reasons=[];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<=7){score+=40;reasons.push("срок через "+days+" дн.")}else if(days<=14){score+=25;reasons.push("срок через "+days+" дн.")}else if(days<=30){score+=15;reasons.push("срок через "+days+" дн.")}}if(e.p<20){score+=25;reasons.push("низкий прогресс ("+e.p+"%)")}else if(e.p<50){score+=15;reasons.push("прогресс "+e.p+"%")}var d=getMD(e.id,-1);var hasRpt=false;for(var k in d)if(d.hasOwnProperty(k)&&d[k]&&d[k].report)hasRpt=true;if(!hasRpt){score+=20;reasons.push("нет текстового отчёта")}var hasFiles=false;for(var k in d)if(d.hasOwnProperty(k)&&d[k]&&d[k].files&&d[k].files.length)hasFiles=true;if(!hasFiles&&e.p<30){score+=10;reasons.push("нет подтверждающих файлов")}var level=score>=60?"критический":score>=35?"высокий":score>=15?"средний":"низкий";return{level:level,pct:Math.min(score,95),reason:reasons.join("; ")||"показатели в норме"}}
|
||||
|
||||
// === QUERY ROUTING ===
|
||||
var qq=q.toLowerCase();
|
||||
|
||||
// 1. Control
|
||||
if(qq.indexOf("просрочен")>=0||qq.indexOf("просрочк")>=0){if(!late.length)return"Просроченных мероприятий нет.";var r="<b>🔴 Просрочено "+late.length+" мероприятий:</b><br>";late.forEach(function(e){r+="• <b>№"+e.id+"</b> — "+esc(e.t.slice(0,80))+"...<br> Филиал: "+br[e.b]+" | Срок: "+e.due+" | Прогресс: "+e.p+"%<br>"});r+="<br><b>→ Рекомендация:</b> эскалировать руководителям. Провести совещание с отстающими филиалами.";return r}
|
||||
|
||||
if(qq.indexOf("текущ")>=0||qq.indexOf("этот месяц")>=0||qq.indexOf("завершить")>=0){var dtm=dueThisMonth();if(!dtm.length)return"В текущем месяце нет мероприятий с наступающим сроком.";var r="<b>📅 Мероприятия к завершению в текущем месяце ("+dtm.length+"):</b><br>";dtm.forEach(function(e){r+="• <b>№"+e.id+"</b> — "+esc(e.t.slice(0,70))+"...<br> Срок: "+e.due+" | Статус: "+st[e.s]+" | Прогресс: "+e.p+"%<br>"});return r}
|
||||
|
||||
// 2. Incidents
|
||||
if(qq.indexOf("происшеств")>=0||qq.indexOf("несчастн")>=0||qq.indexOf("травм")>=0)return"<b>📊 Анализ происшествий:</b><br>По данным системы, за 2026 год зафиксированы инциденты, связанные с просрочкой мероприятий по безопасности. <b>"+late.length+"</b> мероприятий просрочено. Основные риски: недостаточный контроль исполнения, отсутствие подтверждающих документов.<br><br><b>→ Рекомендация:</b> усилить мониторинг филиалов с наибольшим числом просрочек. Провести внеплановые аудиты."
|
||||
|
||||
// 3-4. KPIs / Ask data
|
||||
if(qq.indexOf("показател")>=0||qq.indexOf("kpi")>=0||qq.indexOf("ltif")>=0||qq.indexOf("динамик")>=0){var bs=branchStats();var r="<b>📈 Показатели безопасности:</b><br>• План выполнен на <b>"+dp+"%</b><br>• Просрочено: <b>"+late.length+"</b> мероприятий<br>• Лучший филиал: <b>"+bs[0].name+"</b> ("+bs[0].pct+"%)<br>• Худший: <b>"+bs[bs.length-1].name+"</b> ("+bs[bs.length-1].pct+"%)<br><br><b>Отрицательная динамика</b> у филиалов с просрочками: ";var worst=bs.filter(function(b){return b.late>0});if(worst.length)r+=worst.map(function(b){return b.name+" ("+b.late+" просрочек)"}).join(", ");else r+="отсутствует";return r}
|
||||
|
||||
if(qq.indexOf("почему")>=0||qq.indexOf("причин")>=0){var lateReasons={};late.forEach(function(e){var rk=calcRisk(e);if(!lateReasons[rk.reason])lateReasons[rk.reason]=0;lateReasons[rk.reason]++});var reasons=Object.keys(lateReasons).sort(function(a,b){return lateReasons[b]-lateReasons[a]});var r="<b>🔍 Основные причины отставания:</b><br>";reasons.slice(0,5).forEach(function(rk){r+="• "+rk+" — "+lateReasons[rk]+" мероприятий<br>"});r+="<br><b>→ Вывод:</b> основные факторы — отсутствие отчётности и низкая активность исполнителей.";return r}
|
||||
|
||||
if(qq.indexOf("сравн")>=0||qq.indexOf("филиал")>=0){var bs=branchStats();var r="<b>🏢 Сравнение филиалов:</b><br><table style='width:100%;font-size:12px'><tr><th>Филиал</th><th>%</th><th>Исполнено</th><th>Просрочено</th></tr>";bs.forEach(function(b){r+="<tr><td>"+b.name+"</td><td style='color:"+(b.pct>=70?"var(--green)":b.pct>=40?"var(--amber)":"var(--red)")+";font-weight:700'>"+b.pct+"%</td><td>"+b.done+"/"+b.total+"</td><td>"+(b.late||"—")+"</td></tr>"});r+="</table>";return r}
|
||||
|
||||
// 5. Risk prediction
|
||||
if(qq.indexOf("риск")>=0||qq.indexOf("вероят")>=0||qq.indexOf("прогноз")>=0){
|
||||
var risks=[];all.forEach(function(e){if(e.s!=="done"){var cr=calcRisk(e);if(cr.level!=="низкий")risks.push({e:e,risk:cr})}});risks.sort(function(a,b){return b.risk.pct-a.risk.pct});
|
||||
if(!risks.length)return"Мероприятий с высоким риском невыполнения не выявлено. Все показатели в норме.";
|
||||
var r="<b>⚠️ Прогноз рисков невыполнения:</b><br>";
|
||||
risks.slice(0,8).forEach(function(x){var cl=x.risk.level==="критический"?"r":x.risk.level==="высокий"?"a":"w";r+="<b>№"+x.e.id+"</b> — <span class='badge "+cl+"'>"+x.risk.pct+"%</span> — "+esc(x.e.t.slice(0,60))+"...<br> Причина: "+x.risk.reason+"<br>"});
|
||||
r+="<br><b>→ Рекомендация:</b> сфокусироваться на критических и высоких рисках. Обеспечить загрузку подтверждающих документов.";
|
||||
return r
|
||||
}
|
||||
|
||||
// 6. Auto-detect problems
|
||||
if(qq.indexOf("проблем")>=0||qq.indexOf("выяв")>=0||qq.indexOf("контрол")>=0){
|
||||
var problems=[];
|
||||
if(late.length)problems.push(late.length+" просроченных мероприятий");
|
||||
var noReport=all.filter(function(e){if(e.s==="done")return false;var d=getMD(e.id,-1);var has=false;for(var k in d)if(d.hasOwnProperty(k)&&d[k]&&d[k].report)has=true;return !has});
|
||||
if(noReport.length>5)problems.push(noReport.length+" мероприятий без текстового отчёта");
|
||||
var lowProg=all.filter(function(e){return e.s==="warn"&&e.p<20});
|
||||
if(lowProg.length)problems.push(lowProg.length+" мероприятий с прогрессом <20%");
|
||||
var r="<b>🔍 Автоматический анализ выявил:</b><br>";
|
||||
problems.forEach(function(p){r+="• "+p+"<br>"});
|
||||
if(!problems.length)r+="• Критических проблем не выявлено<br>";
|
||||
r+="<br><b>→ Рекомендация:</b> "+ (late.length?"Приоритет — устранить просрочки. ":"")+(noReport.length>5?"Активизировать работу по заполнению отчётов. ":"")+"Провести аудит проблемных филиалов.";
|
||||
return r
|
||||
}
|
||||
|
||||
// 7. Reports
|
||||
if(qq.indexOf("отчёт")>=0||qq.indexOf("еженед")>=0||qq.indexOf("ежемес")>=0||qq.indexOf("квартал")>=0){return"📑 Для формирования отчётов перейдите на вкладку <b>«Отчётность»</b>. Доступны форматы CSV и HTML. Для детальной аналитики используйте вкладку <b>«Аналитика»</b> — там есть кнопки скачивания полного отчёта по всем мероприятиям."}
|
||||
|
||||
// 8. Documents
|
||||
if(qq.indexOf("документ")>=0||qq.indexOf("подготов")>=0||qq.indexOf("письм")>=0||qq.indexOf("приказ")>=0||qq.indexOf("протокол")>=0||qq.indexOf("служеб")>=0){return"<b>📝 Подготовка документов:</b><br>• Служебные записки и письма — используйте данные из системы для обоснования<br>• Протоколы совещаний — формируются на основе статусов мероприятий<br>• Корректирующие мероприятия — генерируются автоматически для просроченных пунктов<br><br>Для выгрузки данных используйте кнопки <b>CSV/HTML</b> на вкладке «Отчётность»."}
|
||||
|
||||
// 9-10. Document analysis / Quality
|
||||
if(qq.indexOf("провер")>=0||qq.indexOf("полнот")>=0||qq.indexOf("качеств")>=0||qq.indexOf("подтвержд")>=0){
|
||||
var noFiles=all.filter(function(e){if(e.s==="done")return false;var d=getMD(e.id,-1);var has=false;for(var k in d)if(d.hasOwnProperty(k)&&d[k]&&d[k].files&&d[k].files.length)has=true;return !has});
|
||||
var noText=all.filter(function(e){if(e.s==="done")return false;var d=getMD(e.id,-1);var has=false;for(var k in d)if(d.hasOwnProperty(k)&&d[k]&&d[k].report)has=true;return !has});
|
||||
return"<b>🔍 Проверка качества отчётности:</b><br>• Без подтверждающих файлов: <b>"+noFiles.length+"</b> мероприятий<br>• Без текстового отчёта: <b>"+noText.length+"</b> мероприятий<br>• Полнота подтверждения: <b>"+(100-Math.round(noFiles.length/all.length*100))+"%</b><br><br><b>→ Рекомендация:</b> запросить у филиалов недостающие подтверждающие материалы.";
|
||||
}
|
||||
|
||||
// 11. Knowledge base
|
||||
if(qq.indexOf("требован")>=0||qq.indexOf("норматив")>=0||qq.indexOf("закон")>=0||qq.indexOf("порядок")>=0||qq.indexOf("стандарт")>=0){return"<b>📚 База знаний:</b><br>• Требования к обучению — согласно Правилам обучения по БиОТ (Приказ МТСЗН РК)<br>• Порядок расследования НС — согласно Трудовому кодексу РК, глава 20<br>• Требования к СИЗ — согласно ТР ТС 019/2011<br>• Внутренние документы — Стратегия развития ПБ АО «Самрук-Қазына» на 2024-2028 гг.<br><br>Для доступа к полным текстам обратитесь к нормативной базе компании."}
|
||||
|
||||
// 12. Auditor
|
||||
if(qq.indexOf("аудит")>=0||qq.indexOf("аудитор")>=0||qq.indexOf("несоответств")>=0||qq.indexOf("нарушен")>=0){return"<b>🔎 AI-аудитор — автоматическая проверка:</b><br>• Сроки обучения: требуется сверка с данными КУ<br>• Медосмотры: контроль по графику (Сервисная фабрика)<br>• СИЗ: проверка обеспечения (все филиалы)<br>• Инструктажи: контроль периодичности<br><br><b>Выявлено:</b><br>• "+late.length+" мероприятий с нарушением сроков<br>• Рекомендуется провести аудит филиалов с просрочками";
|
||||
|
||||
// 13. Lessons learned
|
||||
if(qq.indexOf("урок")>=0||qq.indexOf("опыт")>=0||qq.indexOf("извлеч")>=0){var r="<b>📖 База извлечённых уроков:</b><br>На основе анализа просроченных мероприятий:<br>";late.slice(0,3).forEach(function(e){var cr=calcRisk(e);r+="• <b>№"+e.id+"</b>: "+cr.reason+"<br> Урок: необходим регулярный контроль и ранняя эскалация<br>"});r+="<br><b>→ Профилактика:</b> внедрить систему раннего предупреждения (за 30, 14, 7 дней).";return r}
|
||||
|
||||
// 14. Next year plan
|
||||
if(qq.indexOf("план на след")>=0||qq.indexOf("2027")>=0||qq.indexOf("предложен")>=0){return"<b>📋 Предложения в План на 2027 год:</b><br>На основе анализа 2026 года:<br>• Усилить контроль за сроками (автоматические уведомления)<br>• Внедрить ежемесячный мониторинг подтверждающих документов<br>• Провести дополнительное обучение ответственных филиалов<br>• Расширить применение цифровых инструментов (ИИ-помощник)<br>• Включить мероприятия по профилактике повторных нарушений"}
|
||||
|
||||
// 15. 360
|
||||
if(qq.indexOf("360")>=0||qq.indexOf("комплекс")>=0||qq.indexOf("системн")>=0||qq.indexOf("общая оценка")>=0){var bs=branchStats();return"<b>🔵 Производственная безопасность 360°:</b><br>• План ПБ: выполнено "+dp+"%<br>• Просрочено: "+late.length+" мероприятий<br>• Филиалы в зоне риска: "+bs.filter(function(b){return b.pct<50}).map(function(b){return b.name}).join(", ")+"<br>• Системная проблема: низкая активность по загрузке подтверждающих документов<br>• Приоритет: устранение просрочек, активизация отчётности"}
|
||||
|
||||
// 16. Daily digest
|
||||
if(qq.indexOf("сводка")>=0||qq.indexOf("ежедн")>=0||qq.indexOf("утр")>=0||qq.indexOf("сегодня")>=0){var dtm=dueThisMonth();return"<b>📰 Ежедневная сводка — "+new Date().toLocaleDateString()+"</b><br><br>🔴 <b>Критическое:</b><br>• Просрочено: "+late.length+" мероприятий<br>"+(dtm.length?"• К завершению в этом месяце: "+dtm.length+" мероприятий<br>":"")+"<br>📊 <b>Показатели:</b><br>• План выполнен на "+dp+"%<br>• В процессе: "+warn.length+"<br>• Не начато: "+wait.length+"<br><br>💡 <b>Рекомендации:</b><br>"+(late.length?"• Эскалировать просрочки руководителям филиалов<br>":"")+"• Проверить наличие подтверждающих документов<br>• Запросить отчёты у отстающих филиалов"}
|
||||
|
||||
// 17. Advisor
|
||||
if(qq.indexOf("советник")>=0||qq.indexOf("директор")>=0||qq.indexOf("оцени")>=0||qq.indexOf("выступи")>=0){
|
||||
var bs=branchStats();var worst3=bs.slice(-3).map(function(b){return b.name+" ("+b.pct+"%)"}).join(", ");
|
||||
return"<b>👔 Советник директора по ПБ — оценка состояния:</b><br><br><b>Ключевые выводы:</b><br>• План выполнен на <b>"+dp+"%</b>. "+(dp>=70?"Темп хороший.":dp>=40?"Темп средний, требуется ускорение.":"Темп недостаточный, критическая ситуация.")+"<br>• Просрочено <b>"+late.length+"</b> мероприятий — "+(late.length>3?"требуется немедленная эскалация":"ситуация контролируема")+"<br><br><b>Основные риски:</b><br>• Филиалы в зоне риска: "+worst3+"<br>• Недостаточная активность по загрузке документов<br><br><b>Управленческие решения:</b><br>1. Провести совещание с руководителями отстающих филиалов<br>2. Установить еженедельный контроль для просроченных мероприятий<br>3. Запросить подтверждающие документы по всем мероприятиям в статусе «В процессе»<br>4. Усилить роль ИИ-помощника в ежедневном мониторинге<br>5. Подготовить доклад для Правления о текущем состоянии ПБ";
|
||||
}
|
||||
|
||||
// Status query
|
||||
if(qq.indexOf("статус")>=0||qq.indexOf("пункт")>=0||qq.indexOf("мероприятие")>=0){var num=q.match(/\d+/);if(num){var e=null;for(var i=0;i<all.length;i++)if(all[i].id===parseInt(num[0])){e=all[i];break}if(e){var cr=calcRisk(e);var r="<b>Пункт №"+e.id+"</b><br>Статус: <b>"+st[e.s]+"</b><br>Филиал: "+br[e.b]+"<br>Срок: "+e.due+"<br>Прогресс: "+e.p+"%<br>Риск: "+cr.level+" ("+cr.pct+"%)<br>Причина: "+cr.reason;if(e.sub)r+="<br>Подпункты: "+e.sub.length+" шт.";return r}return"Пункт №"+num[0]+" не найден."}}
|
||||
|
||||
// Greeting
|
||||
if(qq.indexOf("привет")>=0||qq.indexOf("здрав")>=0||qq.indexOf("помощ")>=0||qq.indexOf("что ты")>=0||qq.indexOf("кто ты")>=0)return"👋 Здравствуйте! Я <b>ИИ-помощник по производственной безопасности</b> АО «Казахтелеком».<br><br>Я анализирую План мероприятий на 2026 год и могу ответить на вопросы о статусе исполнения, просрочках, рисках, рейтинге филиалов, подготовить сводку для руководства, оценить ситуацию как советник директора.<br><br>Задайте вопрос — например: «сводка», «риски», «рейтинг филиалов», «просроченные», «советник».";
|
||||
|
||||
// Fallback
|
||||
return"Я могу ответить на вопросы:<br>• <b>«просроченные»</b> — список просрочек<br>• <b>«сводка»</b> — ежедневная сводка<br>• <b>«риски»</b> — прогноз с вероятностью %<br>• <b>«рейтинг филиалов»</b> — сравнение<br>• <b>«статус пункта N»</b> — статус мероприятия<br>• <b>«причины»</b> — анализ причин отставания<br>• <b>«советник»</b> — оценка директора по ПБ<br>• <b>«проверка»</b> — аудит качества отчётности<br>• <b>«текущий месяц»</b> — что нужно завершить<br>• <b>«показатели»</b> — KPI безопасности<br>• <b>«360»</b> — комплексная оценка<br>• <b>«уроки»</b> — извлечённый опыт<br>• <b>«аудит»</b> — выявленные несоответствия";
|
||||
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="<b>Просрочено "+late.length+":</b><br>";late.forEach(function(e){r+="• №"+e.id+" — "+esc(e.t.slice(0,70))+"...<br> "+br[e.b]+" | срок "+e.due+"<br>"});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?"<b>К завершению в этом месяце ("+dtm.length+"):</b><br>"+dtm.map(function(e){return"• №"+e.id+" — "+esc(e.t.slice(0,60))+"... ("+e.due+")"}).join("<br>"):"В этом месяце срочных мероприятий нет."}
|
||||
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="<b>Прогноз рисков:</b><br>";risks.slice(0,8).forEach(function(x){r+="• <b>№"+x.e.id+"</b> — "+x.risk.p+"% ("+x.risk.l+") — "+esc(x.e.t.slice(0,50))+"...<br>"});return r}
|
||||
if(qq.indexOf("рейтинг")>=0||qq.indexOf("филиал")>=0||qq.indexOf("сравн")>=0){var bsd=bs(),r="<b>Рейтинг филиалов:</b><br>";bsd.forEach(function(b,i){r+=(i+1)+". "+b.name+" — "+b.pct+"% ("+b.done+"/"+b.total+(b.late?", просрочено:"+b.late:"")+")<br>"});return r}
|
||||
if(qq.indexOf("сводка")>=0||qq.indexOf("ежедн")>=0||qq.indexOf("утр")>=0){return"<b>Сводка на "+new Date().toLocaleDateString()+"</b><br>• План: "+dp+"% ("+done.length+"/"+all.length+")<br>• Просрочено: "+late.length+"<br>• В процессе: "+warn.length+"<br>• Не начато: "+(all.length-done.length-late.length-warn.length)+"<br><br><b>→ Рекомендации:</b><br>"+(late.length?"• Эскалировать просрочки<br>":"")+"• Проверить подтверждающие документы<br>• Запросить отчёты у отстающих";}
|
||||
if(qq.indexOf("советник")>=0||qq.indexOf("директор")>=0){var bsd=bs(),w3=bsd.slice(-3).map(function(b){return b.name+" ("+b.pct+"%)"}).join(", ");return"<b>👔 Советник директора по ПБ:</b><br><br><b>Выводы:</b><br>• План: "+dp+"%. "+(dp>=70?"Темп хороший.":dp>=40?"Темп средний.":"Критично!")+"<br>• Просрочено: "+late.length+"<br><br><b>Риски:</b> "+w3+"<br><br><b>Решения:</b><br>1. Совещание с отстающими филиалами<br>2. Еженедельный контроль просрочек<br>3. Запросить документы у всех в статусе «В процессе»<br>4. Усилить ИИ-мониторинг<br>5. Доклад Правлению";}
|
||||
if(qq.indexOf("почему")>=0||qq.indexOf("причин")>=0){return"<b>Причины отставания:</b><br>• Отсутствие текстовых отчётов<br>• Нет подтверждающих файлов<br>• Низкая активность исполнителей<br>• Приближение сроков без обновлений<br><br><b>→ Решение:</b> активизировать загрузку отчётов и документов.";}
|
||||
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"<b>Проверка качества:</b><br>• Без файлов: "+nf.length+" мероприятий<br>• Полнота: "+(100-Math.round(nf.length/all.length*100))+"%<br><br><b>→ Рекомендация:</b> запросить недостающие документы.";}
|
||||
if(qq.indexOf("аудит")>=0)return"<b>🔎 AI-аудитор:</b><br>• "+late.length+" мероприятий с нарушением сроков<br>• Рекомендуется аудит отстающих филиалов<br>• Проверить: обучение, медосмотры, СИЗ, инструктажи";
|
||||
if(qq.indexOf("360")>=0||qq.indexOf("комплекс")>=0){var bsd=bs();return"<b>ПБ 360°:</b><br>• План: "+dp+"%<br>• Зона риска: "+bsd.filter(function(b){return b.pct<50}).map(function(b){return b.name}).join(", ")+"<br>• Приоритет: устранить просрочки, активизировать отчётность";}
|
||||
if(qq.indexOf("показател")>=0||qq.indexOf("kpi")>=0){var bsd=bs();return"<b>KPI безопасности:</b><br>• План: "+dp+"%<br>• Лучший: "+bsd[0].name+" ("+bsd[0].pct+"%)<br>• Худший: "+bsd[bsd.length-1].name+" ("+bsd[bsd.length-1].pct+"%)<br>• Просрочено: "+late.length;}
|
||||
if(qq.indexOf("статус")>=0||qq.indexOf("пункт")>=0){var num=q.match(/\d+/);if(num){var e=null;for(var i=0;i<all.length;i++)if(all[i].id===parseInt(num[0])){e=all[i];break}if(e){var c=cr(e);return"<b>Пункт №"+e.id+"</b><br>Статус: "+st[e.s]+"<br>Филиал: "+br[e.b]+"<br>Срок: "+e.due+"<br>Риск: "+c.l+" ("+c.p+"%)";}return"Пункт №"+num[0]+" не найден.";}}
|
||||
if(qq.indexOf("привет")>=0||qq.indexOf("здрав")>=0||qq.indexOf("помощ")>=0)return"👋 Я ИИ-помощник по ПБ АО «Казахтелеком». Спросите: «сводка», «риски», «рейтинг филиалов», «советник», «статус пункта N».";
|
||||
return"Спросите: <b>сводка</b> · <b>риски</b> · <b>рейтинг филиалов</b> · <b>советник</b> · <b>просроченные</b> · <b>проверка</b> · <b>аудит</b> · <b>360</b> · <b>статус пункта N</b> · <b>причины</b> · <b>показатели</b>";
|
||||
}
|
||||
|
||||
// ===== EDIT (no regions) =====
|
||||
|
||||
Loading…
Reference in New Issue
Block a user