181 lines
11 KiB
HTML
181 lines
11 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="ru">
|
||
<head>
|
||
<meta charset="utf-8">
|
||
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||
<title>QAZAQtelecom HSE — План ПБ 2026</title>
|
||
<link rel="stylesheet" href="style.css">
|
||
</head>
|
||
<body onload="init()" style="margin:0">
|
||
<div id="login"><div>
|
||
<h1><span>QAZAQtelecom</span> HSE</h1>
|
||
<p>План производственной безопасности 2026</p>
|
||
<input id="lem" placeholder="curator@telecom.kz">
|
||
<input id="lpw" type="password" placeholder="Пароль">
|
||
<p id="lerr" style="color:#EF4444;font-size:12px;display:none">Неверная почта</p>
|
||
<button class="btn" style="width:100%" onclick="doLogin()">Войти</button>
|
||
</div></div>
|
||
<div id="app">
|
||
<div id="sidebar">
|
||
<div class="logo">QAZAQtelecom <span>HSE</span></div>
|
||
<div class="user" id="su_name"></div>
|
||
<a class=" active" id="snav_events" onclick="switchTab('events')"><span>Мероприятия</span></a>
|
||
<a class="" id="snav_analytics" onclick="switchTab('analytics')"><span>Аналитика</span></a>
|
||
<a class="" id="snav_reports" onclick="switchTab('reports')"><span>Отчётность</span></a>
|
||
<a class="" id="snav_ai" onclick="switchTab('ai')"><span>Джарвис</span></a>
|
||
<a class="" id="snav_hse" onclick="switchTab('hse')"><span>HSE.sk.kz</span></a>
|
||
<a class="" id="snav_users" onclick="switchTab('users')"><span>Учётные записи</span></a>
|
||
<div class="logout"><button class="btn btn-sm btn-r" style="width:100%" onclick="doLogout()">Выйти</button></div>
|
||
</div>
|
||
<div id="main">
|
||
<div class="top"><h2 id="page_title">Мероприятия</h2>
|
||
<div style="display:flex;gap:8px;align-items:center">
|
||
<span id="stor_ind" class="stor-bar"></span>
|
||
<button class="btn btn-sm btn-o" onclick="saveBackup()">Резерв</button>
|
||
<button class="btn btn-sm btn-g" onclick="document.getElementById('fu').click()">Восст.</button>
|
||
<input type="file" id="fu" accept=".json" style="display:none" onchange="loadBackup(this)">
|
||
</div></div>
|
||
<div id="tab_events">
|
||
<div class="fr">
|
||
<input id="sea" placeholder="Поиск..." oninput="renderEv()">
|
||
<select id="fs" onchange="renderEv()"><option value="">Все статусы</option><option value="warn">В процессе</option><option value="done">Исполнено</option><option value="late">Просрочено</option></select>
|
||
<select id="fb" onchange="renderEv()"><option value="">Все филиалы</option></select>
|
||
<span id="sc" style="font-size:12px;color:#64748B;margin-left:auto"></span>
|
||
</div>
|
||
<div class="card" id="ev_content"></div>
|
||
</div>
|
||
<div id="tab_analytics" style="display:none">
|
||
<div class="stat-grid" id="an_stats"></div>
|
||
<div class="card"><h3>TOP-10 проблемных мероприятий</h3><div id="an_top"></div></div>
|
||
<div style="display:flex;gap:8px;margin-bottom:16px">
|
||
<button class="btn btn-sm btn-o" onclick="dlAnalyticsPPT()">Скачать PPT</button>
|
||
<button class="btn btn-sm btn-r" onclick="dlAnalyticsPDF()">Скачать PDF</button>
|
||
<button class="btn btn-sm" onclick="dlAnalyticsWord()">Скачать Word</button>
|
||
</div>
|
||
<div class="card" id="ltif_card"><h3>LTIF — Коэффициент частоты травм</h3>
|
||
<p style="font-size:12px;color:#64748B;margin-bottom:8px">LTIF = (A × 1 000 000) / Человеко-часы, где A — число пострадавших</p>
|
||
<div style="display:flex;gap:8px;flex-wrap:wrap;align-items:end;margin-bottom:10px">
|
||
<div><span style="font-size:11px;color:#64748B">Месяц</span>
|
||
<select id="ltif_month" style="padding:6px 10px;border:1px solid #E2E8F0;border-radius:6px;font-size:12px">
|
||
<option value="0">Январь</option><option value="1">Февраль</option><option value="2">Март</option>
|
||
<option value="3">Апрель</option><option value="4">Май</option><option value="5">Июнь</option>
|
||
<option value="6">Июль</option><option value="7">Август</option><option value="8">Сентябрь</option>
|
||
<option value="9">Октябрь</option><option value="10">Ноябрь</option><option value="11">Декабрь</option>
|
||
</select></div>
|
||
<div><span style="font-size:11px;color:#64748B">Человеко-часы</span>
|
||
<input id="ltif_hours" type="number" placeholder="0" style="width:130px;padding:6px;border:1px solid #E2E8F0;border-radius:6px;font-size:12px"></div>
|
||
<div><span style="font-size:11px;color:#64748B">Пострадавших (A)</span>
|
||
<input id="ltif_inj" type="number" placeholder="0" style="width:80px;padding:6px;border:1px solid #E2E8F0;border-radius:6px;font-size:12px"></div>
|
||
<button class="btn btn-sm btn-g" onclick="saveLTIF()">Сохранить</button>
|
||
<button class="btn btn-sm" onclick="loadLTIF()">Загрузить</button>
|
||
</div>
|
||
<div id="ltif_result" style="font-size:14px;padding:8px 0"></div>
|
||
<div id="ltif_table"></div>
|
||
<div id="ltif_corr_div"></div>
|
||
</div>
|
||
</div>
|
||
<div id="tab_reports" style="display:none">
|
||
<div class="card"><h3>Выгрузка сводного отчёта</h3>
|
||
<p style="font-size:13px;color:#64748B;margin-bottom:12px">Выберите период и формат для скачивания отчёта.</p>
|
||
<div class="fr">
|
||
<span style="font-size:13px;color:#64748B">Период:</span>
|
||
<select id="rp_period" style="padding:6px 10px;border:1px solid #E2E8F0;border-radius:6px" onchange="rpPeriodChange()">
|
||
<option value="year">Год</option>
|
||
<option value="month">Месяц</option>
|
||
<option value="q1">Январь-Март (Q1)</option>
|
||
<option value="q2">Апрель-Июнь (Q2)</option>
|
||
<option value="q3">Июль-Сентябрь (Q3)</option>
|
||
<option value="q4">Октябрь-Декабрь (Q4)</option>
|
||
<option value="h1">1-е полугодие</option>
|
||
<option value="h2">2-е полугодие</option>
|
||
</select>
|
||
<select id="rp_month" onchange="renderReports()" style="padding:6px 10px;border:1px solid #E2E8F0;border-radius:6px;display:none">
|
||
<option value="0">Январь</option><option value="1">Февраль</option><option value="2">Март</option>
|
||
<option value="3">Апрель</option><option value="4">Май</option><option value="5">Июнь</option>
|
||
<option value="6">Июль</option><option value="7">Август</option><option value="8">Сентябрь</option>
|
||
<option value="9">Октябрь</option><option value="10">Ноябрь</option><option value="11" selected>Декабрь</option>
|
||
</select>
|
||
<select id="rp_year" style="padding:6px 10px;border:1px solid #E2E8F0;border-radius:6px">
|
||
<option>2026</option><option>2027</option>
|
||
</select>
|
||
<select id="rp_status" style="padding:6px 10px;border:1px solid #E2E8F0;border-radius:6px">
|
||
<option value="">Все статусы</option>
|
||
<option value="warn">В процессе</option>
|
||
<option value="done">Исполнено</option>
|
||
<option value="late">Просрочено</option>
|
||
</select>
|
||
</div>
|
||
<div style="display:flex;gap:8px;flex-wrap:wrap">
|
||
<button class="btn btn-sm btn-g" onclick="dlCSV()">CSV</button>
|
||
<button class="btn btn-sm" onclick="dlHTML()">HTML</button>
|
||
<button class="btn btn-sm btn-o" onclick="dlWord()">Word</button>
|
||
<button class="btn btn-sm btn-r" onclick="dlPdf()">PDF</button>
|
||
</div>
|
||
<p id="rp_count" style="font-size:12px;color:#64748B;margin-top:8px"></p>
|
||
</div>
|
||
<div class="card" id="rp_preview"></div>
|
||
</div>
|
||
<div id="tab_users" style="display:none">
|
||
<div class="card"><h3>Учётные записи</h3>
|
||
<p style="font-size:13px;color:#64748B;margin-bottom:8px">Управление ответственными лицами по филиалам</p>
|
||
<button class="btn btn-sm btn-g" onclick="showRegModal()">+ Зарегистрировать</button>
|
||
<div id="users_list" style="margin-top:14px"></div>
|
||
</div></div>
|
||
<div id="tab_hse" style="display:none">
|
||
<div class="card"><h3>Интеграция с HSE.sk.kz</h3>
|
||
<p style="font-size:13px;color:#64748B;margin-bottom:16px">Направление подписанного сводного отчёта по месяцам в систему hse.sk.kz</p>
|
||
<div style="margin-bottom:12px"><strong>Месяц:</strong>
|
||
<input type="month" id="hse_month" style="padding:6px 10px;border:1px solid #E2E8F0;border-radius:6px;margin-left:8px">
|
||
</div>
|
||
<div style="margin-bottom:12px"><strong>Формат:</strong>
|
||
<select id="hse_fmt" style="padding:6px 10px;border:1px solid #E2E8F0;border-radius:6px;margin-left:8px">
|
||
<option value="word">Word (.docx)</option>
|
||
<option value="pdf">PDF</option>
|
||
</select>
|
||
</div>
|
||
<div style="margin-bottom:12px"><strong>API Ключ:</strong>
|
||
<input id="hse_key" type="password" placeholder="Ключ API HSE.sk.kz" style="padding:6px 10px;border:1px solid #E2E8F0;border-radius:6px;margin-left:8px;width:300px">
|
||
</div>
|
||
<button class="btn btn-sm btn-g" onclick="hseSend()" id="hse_btn">Отправить отчёт в HSE.sk.kz</button>
|
||
<div id="hse_result" style="margin-top:12px;font-size:13px"></div>
|
||
</div></div>
|
||
<div id="tab_ai" style="display:none">
|
||
<div class="card">
|
||
<div class="chat-q">
|
||
<button onclick="aiAsk('сводка')">Сводка</button>
|
||
<button onclick="aiAsk('просроченные')">Просроченные</button>
|
||
<button onclick="aiAsk('риски')">Риски</button>
|
||
<button onclick="aiAsk('рейтинг')">Рейтинг</button>
|
||
<button onclick="aiAsk('прогноз')">Прогноз</button>
|
||
<button onclick="aiAsk('статус')">Статус</button>
|
||
<button onclick="aiAsk('план')">План действий</button>
|
||
</div>
|
||
<div class="chat-box" id="ai_chat"></div>
|
||
<div class="chat-inp"><input id="ai_inp" placeholder="Спроси про план ПБ..." onkeydown="if(event.key=='Enter')aiSend()">
|
||
<button class="btn btn-sm" onclick="aiSend()">Отправить</button></div>
|
||
</div></div>
|
||
</div></div>
|
||
<div id="modal" class="mod-overlay" onclick="if(event.target===this)closeModal()">
|
||
<div class="mod-box" id="modal_body"></div>
|
||
</div>
|
||
<div id="regModal" class="mod-overlay" onclick="if(event.target===this)closeRegModal()">
|
||
<div class="mod-box" style="max-width:500px">
|
||
<h3 style="margin-bottom:14px">Регистрация пользователя</h3>
|
||
<div style="margin-bottom:8px"><label style="font-size:12px;color:#64748B">Email (логин)</label>
|
||
<input id="reg_email" placeholder="ivanov" style="width:100%;padding:8px;border:1px solid #E2E8F0;border-radius:6px;font-size:13px"></div>
|
||
<div style="margin-bottom:8px"><label style="font-size:12px;color:#64748B">ФИО</label>
|
||
<input id="reg_name" placeholder="Иванов И.И." style="width:100%;padding:8px;border:1px solid #E2E8F0;border-radius:6px;font-size:13px"></div>
|
||
<div style="margin-bottom:8px"><label style="font-size:12px;color:#64748B">Телефон</label>
|
||
<input id="reg_phone" placeholder="+77001234567" style="width:100%;padding:8px;border:1px solid #E2E8F0;border-radius:6px;font-size:13px"></div>
|
||
<div style="margin-bottom:8px"><label style="font-size:12px;color:#64748B">Филиал</label>
|
||
<select id="reg_branch" style="width:100%;padding:8px;border:1px solid #E2E8F0;border-radius:6px;font-size:13px"></select></div>
|
||
<div style="margin-bottom:14px"><label style="font-size:12px;color:#64748B">Пароль</label>
|
||
<input id="reg_pass" type="password" placeholder="****" style="width:100%;padding:8px;border:1px solid #E2E8F0;border-radius:6px;font-size:13px"></div>
|
||
<div style="display:flex;gap:8px;justify-content:flex-end">
|
||
<button class="btn btn-sm" style="background:#E2E8F0;color:#0B1A2E" onclick="closeRegModal()">Отмена</button>
|
||
<button class="btn btn-sm btn-g" onclick="addUser()">Зарегистрировать</button>
|
||
</div></div></div>
|
||
<script src="script.js"></script>
|
||
</body>
|
||
</html>
|