Мониторинг связи с НРД: участки Шлюз/НРД/M2M/Отправка, сквозная проверка справочником раз в 10 мин, история за сутки на «Статусе», цепочка в шапке (30 с), автоповтор недоставленных до 24 ч, баннер и статус «ожидает отправки» в кабинете клиента

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi
This commit is contained in:
zuevav
2026-09-25 16:17:25 +03:00
parent a0f6ce9f7b
commit 4cbefa41d5
18 changed files with 1075 additions and 62 deletions
+15
View File
@@ -85,6 +85,8 @@ var nsdWatch struct {
Contour string
Alerted bool
LastRemind time.Time
LastPollAt time.Time // последний опрос НРД шлюзом (по журналу)
LastPollOK time.Time // последний успешный
}
// nsdLinkStatus — для страницы статуса: не отвечает ли НРД шлюзу.
@@ -109,6 +111,19 @@ func nsdLinkTick(rc *RuntimeConfig, now time.Time) {
}
w := &nsdWatch
w.Lock()
w.LastPollAt = last.At
if last.OK {
w.LastPollOK = last.At
} else if firstFail != nil && w.LastPollOK.IsZero() {
// в хвосте журнала нет успешного опроса после сбоя — ищем последний успешный до него
for _, ln := range strings.Split(string(tail), "\n") {
if m := nsdPollRe.FindStringSubmatch(strings.TrimRight(ln, "\r")); m != nil && m[3] == "OK" {
if at, err := time.ParseInLocation("2006-01-02 15:04:05", m[1], time.Local); err == nil {
w.LastPollOK = at
}
}
}
}
if last.OK {
since, alerted := w.DownSince, w.Alerted
w.DownSince, w.LastErr, w.Alerted = time.Time{}, "", false