Files
Bridge-and-Join-s/internal/lkgateway/web/templates/admin_home.html
zuevav 9737c787f9 feat: живой цикл M2M с НРД + мастер установки ключа на флешку
Инфраструктура M2M (живой обмен с НРД через ИШ):
- обработка M2MTransferResponse: ERROR(M2Mxx) → заявка Отклонена, сохранение
  ответа; INFO → ждём Decision; идемпотентность поллера
- fallback-корреляция ответов с нулевым GUID (M2M14/M2M17) по FIFO
- сырой XML ответа НРД в карточке заявки (для пересылки в ТП)
- тестовый пакет роботу приведён к эталону m2m_robot_samples (CostInfo=Yes,
  4 бумаги, IsolationStatus, DocumentSeries=сценарий); override паспорта
- редирект из теста сразу в карточку заявки

Мастер установки ключа Валидаты на флешку (admin/setup/keywizard):
- пошаговый: загрузка .7z+пароль → выбор флешки → запись → справочник
  сертификатов (CRL) → перезапуск+проверка ИШ → готово
- привилегированный воркер (bj-keymedia) в host-namespace через файл-обмен,
  bj-server остаётся в песочнице
- сохранение структуры профиля архива (spr<N>), перечисление съёмных USB

Прочее:
- пакет-доказательство для ТП НРД + форма регистрации участника M2M
- эталонные образцы робота (DOC/m2m_robot_samples)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-19 00:03:21 +03:00

109 lines
4.2 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{{define "content"}}
{{/* ===== Оператор-дашборд (Apple-стиль): приветствие → статус → плитки задач → сводка ===== */}}
<div class="hero">
<h1 class="hero-greeting">Добрый день</h1>
{{if .AllReady}}
<span class="hero-status ok">● Система готова к работе</span>
{{else}}
<div style="display:flex;align-items:center;gap:14px;flex-wrap:wrap">
<span class="hero-status warn">● Требуется настройка — {{.NotReadyCount}} из {{.TotalCount}} компонентов</span>
<a href="/admin/wizard" class="btn">Открыть мастер настройки →</a>
</div>
{{end}}
</div>
{{/* ===== Крупные плитки задач ===== */}}
<div class="tiles">
<a href="/admin/claims?new=1" class="tile brand">
<span class="ico"></span>
<span class="t-title">Новый перевод</span>
<span class="t-sub">Заявка на перевод ценных бумаг M2M</span>
<span class="t-arrow"></span>
</a>
<a href="/admin/claims" class="tile">
<span class="ico">📋</span>
<span class="t-title">Переводы</span>
<span class="t-sub">{{.Counts.Total}} всего · {{.Counts.InProgress}} в работе</span>
<span class="t-arrow"></span>
</a>
<a href="/admin/status" class="tile">
<span class="ico">🔍</span>
<span class="t-title">Диагностика</span>
<span class="t-sub">Состояние СКЗИ, ИШ и базы</span>
<span class="t-arrow"></span>
</a>
<a href="/admin/setup" class="tile">
<span class="ico">⚙️</span>
<span class="t-title">Настройка</span>
<span class="t-sub">Криптография, НРД, подключения</span>
<span class="t-arrow"></span>
</a>
</div>
{{/* ===== Сводка по переводам ===== */}}
<div class="grid">
<div class="stat">
<div class="stat-label">Всего переводов</div>
<div class="stat-value">{{.Counts.Total}}</div>
</div>
<div class="stat">
<div class="stat-label">Подтверждено</div>
<div class="stat-value" style="color:var(--ok)">{{.Counts.Confirmed}}</div>
</div>
<div class="stat">
<div class="stat-label">В ожидании</div>
<div class="stat-value" style="color:var(--warn)">{{.Counts.InProgress}}</div>
</div>
<div class="stat">
<div class="stat-label">Отказы / таймауты</div>
<div class="stat-value" style="color:var(--err)">{{.Counts.Failed}}</div>
</div>
</div>
{{/* ===== Последние переводы ===== */}}
<div class="section-head">
<h2>Последние переводы</h2>
<a href="/admin/claims">все →</a>
</div>
<div class="card">
{{if .Recent}}
<table>
<thead><tr><th>Время</th><th>ID</th><th>Инвестор</th><th>ЦБ</th><th>Статус</th><th></th></tr></thead>
<tbody>
{{range .Recent}}
<tr>
<td>{{.CreatedAt.Format "15:04:05"}}</td>
<td><code>{{slice .ID 0 8}}</code></td>
<td>{{.Investor.LastName}} {{slice .Investor.FirstName 0 1}}.</td>
<td>{{len .Securities}}</td>
<td><span class="badge {{.Status}}">{{ruState .Status}}</span></td>
<td><a href="/admin/claims/{{.ID}}">открыть →</a></td>
</tr>
{{end}}
</tbody>
</table>
{{else}}
<p class="muted" style="margin:0">Переводов ещё нет. Нажмите «Новый перевод», чтобы создать первый.</p>
{{end}}
</div>
{{/* ===== События (компактно, если есть) ===== */}}
{{if .News}}
<div class="section-head">
<h2>События</h2>
<a href="/admin/news">все →</a>
</div>
<div class="card">
{{range .News}}
<div style="padding:9px 0;border-bottom:1px solid var(--border)">
<div style="font-weight:600;font-size:13.5px">
{{if eq .Kind "maintenance"}}🔧 {{end}}{{if eq .Kind "feature"}}✨ {{end}}{{if eq .Kind "system"}}⚠️ {{end}}{{if eq .Kind "doc-update"}}📄 {{end}}{{.Title}}
</div>
{{if .Body}}<div class="muted" style="font-size:12px;margin-top:3px">{{.Body}}</div>{{end}}
</div>
{{end}}
</div>
{{end}}
{{end}}