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