Справка и события без внутреннего; ЛК — только при модуле; справочник DEPO сразу после подготовки

- справка «Внешние системы» — внутренняя (internaldocs); «API ЛК» и проверка callback ЛК — только при модуле ЛК
- отслеживание документации НРД (doc-watcher) — только в режиме разработки
- после подготовки DEPO справочник участников пишется входом по действию человека — не ждёт паузы после
  прежнего неудачного входа («FTV_M2M_HANDBOOK не создана»)

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-10-07 00:30:50 +03:00
parent ce5feb8d32
commit a48f965d1b
7 changed files with 28 additions and 15 deletions
+5 -1
View File
@@ -312,7 +312,7 @@ func newAdmin() (*admin, error) {
if err != nil {
return nil, fmt.Errorf("parse admin_help_crypto: %w", err)
}
helpSys, err := parse("admin_help_systems.html")
helpSys, err := parseInternalDoc("admin_help_systems.html") // внутреннее: Fansy ETL, мессенджеры — не для клиента
if err != nil {
return nil, fmt.Errorf("parse admin_help_systems: %w", err)
}
@@ -532,6 +532,10 @@ func RegisterAdmin(mux *http.ServeMux, svc *Service, rc *RuntimeConfig, getOpts
case p == "help/database":
render(w, a.helpDatabase, nowPage("База данных", "help"))
case p == "help/lk-api":
if !moduleAllowed(globalRC, "web-cabinet") && !devMode(globalRC) { // без модуля ЛК описания его API нет
http.NotFound(w, r)
return
}
render(w, a.helpLK, nowPage("API ЛК", "help"))
case p == "help/crypto":
render(w, a.helpCrypto, nowPage("Криптография", "help"))
+3 -1
View File
@@ -58,7 +58,9 @@ func CheckAll(ctx context.Context, o CheckOptions) SystemStatus {
out.Checks = append(out.Checks, checkCryptoSocket(o))
out.Checks = append(out.Checks, checkNSDAdapter(ctx, o))
out.Checks = append(out.Checks, ishVersionStatus(ctx))
out.Checks = append(out.Checks, checkLKCallback(ctx, o))
if globalRC == nil || moduleAllowed(globalRC, "web-cabinet") || devMode(globalRC) { // без модуля ЛК нечего проверять
out.Checks = append(out.Checks, checkLKCallback(ctx, o))
}
return out
}
+6 -2
View File
@@ -555,7 +555,11 @@ func depoPollOrders(ctx context.Context, db *sql.DB, rc *RuntimeConfig) {
var depoHandbookWritten time.Time
func depoWriteHandbook(rc *RuntimeConfig) error {
func depoWriteHandbook(rc *RuntimeConfig) error { return depoWriteHandbookCtx(context.Background(), rc) }
// depoWriteHandbookCtx — то же с контекстом вызывающего: после подготовки DEPO (действие человека) вход идёт и во
// время паузы после прежнего неудачного входа — иначе справочник ждал бы своего расписания («таблица не создана»).
func depoWriteHandbookCtx(pctx context.Context, rc *RuntimeConfig) error {
raw, err := readHandbook()
if err != nil {
return err
@@ -573,7 +577,7 @@ func depoWriteHandbook(rc *RuntimeConfig) error {
return err
}
defer db.Close()
ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second)
ctx, cancel := context.WithTimeout(pctx, 60*time.Second)
defer cancel()
if !depoTableExists(ctx, db, "FTV_M2M_HANDBOOK") {
if _, err := db.ExecContext(ctx, depoTableSpecByName("FTV_M2M_HANDBOOK").createSQL(false)); err != nil {
+5 -2
View File
@@ -321,8 +321,11 @@ func StartDocWatcher(rc *RuntimeConfig) func() {
ticker := time.NewTicker(24 * time.Hour)
defer ticker.Stop()
for {
summary := CheckDocSources(ctx, rc)
log.Printf("doc-watcher: проверка завершена\n%s", summary)
// отслеживание документации НРД — наш технический инструмент: у клиента не работает (07.10.2026)
if devMode(rc) {
summary := CheckDocSources(ctx, rc)
log.Printf("doc-watcher: проверка завершена\n%s", summary)
}
select {
case <-ctx.Done():
return
@@ -11,24 +11,24 @@
<p class="muted">PostgreSQL: подключение, схемы <code>fansy</code> / <code>fansy_staging</code> / <code>m2m_core</code>, что подгружается извне (ETL Fansy) и что пишет сама система. Учётные записи, гранты, миграции.</p>
</div>
</a>{{end}}
<a href="/admin/help/lk-api" style="text-decoration:none">
{{if or (mod "web-cabinet") devOn}}<a href="/admin/help/lk-api" style="text-decoration:none">
<div class="card" style="height:100%">
<h2 style="color:var(--accent)">API личного кабинета →</h2>
<p class="muted">REST-контракт ESIA Finance V1: <code>POST /api/v1/back_office/claims/</code>, GET/PATCH-операции, формат callback'ов, аутентификация Basic, примеры запросов curl.</p>
</div>
</a>
</a>{{end}}
{{if internalDocs}}<a href="/admin/help/crypto" style="text-decoration:none">
<div class="card" style="height:100%">
<h2 style="color:var(--accent)">Криптография (Валидата) →</h2>
<p class="muted">Установка АПК «Валидата Клиент L» на Astra Linux SE, подключение через PKCS#11, проверка подписи и квитанций НРД.</p>
</div>
</a>{{end}}
<a href="/admin/help/systems" style="text-decoration:none">
{{if internalDocs}}<a href="/admin/help/systems" style="text-decoration:none">
<div class="card" style="height:100%">
<h2 style="color:var(--accent)">Внешние системы →</h2>
<p class="muted">ИШ НРД ({{if devOn}}профили GUEST/TEST3/PROD{{else}}тестовый и боевой контуры{{end}}), команда Fansy (ETL в staging), уведомления (e-mail, Yandex Messenger, Telegram), порядок согласования.</p>
</div>
</a>
</a>{{end}}
<a href="/admin/help/manual" style="text-decoration:none">
<div class="card" style="height:100%">
<h2 style="color:var(--accent)">Ручной ввод M2M →</h2>
@@ -18,8 +18,8 @@
<div class="card">
<h2>Новости и события</h2>
<p class="muted">События системы, окна техработ НРД, обновления документации и сертификатов. Лента не очищается — служит журналом для аудита. Скрытые новости можно посмотреть, сняв галочку «Только активные».</p>
<form method="post" action="/admin/news/check-docs" style="margin-top:10px;display:flex;gap:8px;align-items:center;flex-wrap:wrap">
<p class="muted">События системы, окна техработ НРД, обновления сертификатов. Лента не очищается — служит журналом для аудита. Скрытые новости можно посмотреть, сняв галочку «Только активные».</p>
{{if devOn}}<form method="post" action="/admin/news/check-docs" style="margin-top:10px;display:flex;gap:8px;align-items:center;flex-wrap:wrap">
<button type="submit" class="btn">Проверить обновления документации НРД сейчас</button>
{{if not .Settings.News.LastDocCheck.IsZero}}
<span class="muted" style="font-size:12px">Последняя проверка: {{.Settings.News.LastDocCheck.Format "02.01.2006 15:04:05"}}</span>
@@ -42,7 +42,7 @@
</tbody>
</table>
</details>
{{end}}
{{end}}{{end}}
</div>
<h2 style="margin:24px 0 12px 0">Лента ({{len .Settings.News.Items}})</h2>
+2 -2
View File
@@ -126,7 +126,7 @@ func (h *setupHandlers) wizardDepoTables(w http.ResponseWriter, r *http.Request)
return
}
if !s.IsPostgres() {
_ = depoWriteHandbook(h.rc)
_ = depoWriteHandbookCtx(depoLoginForce(ctx), h.rc)
}
wizDepoGo(w, r, "job", "таблицы обмена на месте: "+msg, true)
}
@@ -460,7 +460,7 @@ func (h *setupHandlers) depoSetupDo(ctx context.Context, r *http.Request, step d
return fail(note + msg)
}
if !s.IsPostgres() {
_ = depoWriteHandbook(h.rc)
_ = depoWriteHandbookCtx(depoLoginForce(ctx), h.rc)
}
step("tables", "ok", "")
// запуск обработки: только что созданное задание запускается в течение интервала — подождать