2d2fbb6732
Скролл: автообновление карточки (bjReloadKeepScroll) раньше сохраняло только прокрутку окна, а боковой «Путь заявки» (.claim-tl — position:fixed, свой overflow) и другие прокручиваемые блоки (.settings-nav, .doc-toc) отбрасывало наверх. Теперь сохраняется и восстанавливается и их scrollTop (JSON в sessionStorage, восстановление на rAF/timeout/load). DEPO: на «Обмен с DEPO» рядом с «Вернуть в очередь» добавлена «Снять с очереди» — помечает застрявшие записи STATE=SKIPPED (QHl04-06, depoDismissFailures), обработчик их больше не берёт и они уходят из списка ошибок. Для устаревших/ненужных записей (напр. старые тестовые). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
81 lines
8.4 KiB
HTML
81 lines
8.4 KiB
HTML
{{define "content"}}
|
||
<div class="hero">
|
||
<h1 class="hero-greeting">Обмен с DEPO (Fancy)</h1>
|
||
<span class="hero-status">Переводы M2M, которые bj передал в депозитарную систему через трансферные таблицы базы {{.DB}} (FTV_M2M / FTV_M2M_LINES / FTV_M2M_EVENTS). Job bj2depo создаёт по ним документы в DEPO и отвечает событиями; bj ведёт статусы, документ и ошибки.</span>
|
||
</div>
|
||
|
||
{{if .Flash}}<div class="card" style="background:var(--accent-weak)">{{.Flash}}</div>{{end}}
|
||
|
||
<div class="card">
|
||
<h2>Как идёт обмен</h2>
|
||
<p class="muted" style="line-height:1.7">
|
||
<span class="badge awaiting_decision">FTV_M2M</span> bj записывает перевод (шапка + строки по бумагам) и событие <code>BJ_*</code> со STATE=<b>TODO</b> →
|
||
<span class="badge awaiting_decision">bj2depo</span> процедура FTV_M2M_JOB ({{.JobMode}}) читает события, создаёт документ 16/16-1 в DEPO, отвечает <code>DEPO_ORDER_CREATED</code> (номер документа) или <code>DEPO_ERROR</code> →
|
||
<span class="badge sent">документ</span> bj следит за состоянием документа (OD_DOCS: начальный ввод → конец обработки / отмена) и при отмене оповещает →
|
||
<span class="badge confirmed">события НРД</span> по ответам MS010 и M2M bj дописывает <code>BJ_ORDER_ACCEPTED / BJ_EXECUTED / BJ_REJECTED / BJ_CANCELLED</code>.
|
||
Опрос таблиц — раз в минуту.{{if internalDocs}} Подробности и словарь событий — <a href="/admin/help/fancy-events">страница для программиста Fancy</a>.{{end}}
|
||
</p>
|
||
<div style="display:flex;gap:18px;flex-wrap:wrap;font-size:13px;margin-top:6px">
|
||
<span>Переводов: <b>{{.Sum.Total}}</b></span>
|
||
<span>Ждут job: <b>{{.Sum.Pending}}</b></span>
|
||
<span>С документом DEPO: <b>{{.Sum.WithDoc}}</b></span>
|
||
<span>С ошибками: <b style="{{if .Sum.Errors}}color:var(--err){{end}}">{{.Sum.Errors}}</b></span>
|
||
{{if not .Sum.LastEventAt.IsZero}}<span>Последнее событие: <b>{{wall .Sum.LastEventAt}}</b></span>{{end}}
|
||
<span>Справочник НРД в DEPO: {{if .Sum.HasHandbook}}<b>{{.Sum.Handbook}}</b> участников{{if not .Sum.HandbookAt.IsZero}} (обновлён {{wall .Sum.HandbookAt}}){{end}}{{else}}<span class="muted">таблица FTV_M2M_HANDBOOK не создана</span>{{end}}</span>
|
||
<span>Job bj2depo: {{.JobMode}}{{if eq .Fancy.DepoJobMode "bj"}}{{if .Fancy.DepoJobLast}} · последний вызов: {{.Fancy.DepoJobLast}}{{if not .Fancy.DepoJobLastAt.IsZero}} ({{msk .Fancy.DepoJobLastAt}}){{end}}{{end}}{{else if .Fancy.DepoJobCheck}} · проверка готовности: {{if .Fancy.DepoJobCheckOK}}OK{{else}}не пройдена{{end}}{{if not .Fancy.DepoJobCheckAt.IsZero}} ({{msk .Fancy.DepoJobCheckAt}}){{end}}{{end}} · <a href="/admin/setup#fancy">настройки</a></span>
|
||
</div>
|
||
</div>
|
||
|
||
{{if or .Failures (not .RunAsOK)}}<div class="card" style="border:1px solid var(--err)">
|
||
<h2 style="color:var(--err)">Обработчик DEPO не смог обработать записи{{if .Failures}} ({{len .Failures}}){{end}}</h2>
|
||
<p class="muted">Пока причина не устранена, документы в DEPO не создаются, а статусы по заявкам ЛК не ставятся. Устраните причину по тексту ошибки и верните записи в очередь: обработчик возьмёт их заново.</p>
|
||
{{if not .RunAsOK}}<p style="color:var(--err)">✗ {{.RunAsMsg}}</p>{{end}}
|
||
{{if .Failures}}
|
||
<div style="overflow-x:auto"><table style="margin-top:8px">
|
||
<thead><tr><th>Запись</th><th>Перевод</th><th>Тип / строка</th><th>Когда</th><th>Ошибка обработчика</th></tr></thead>
|
||
<tbody>{{range .Failures}}<tr>
|
||
<td>{{.TableRu}} №{{.ID}}</td><td><code>{{.GUID}}</code></td><td>{{.Type}}{{if .Ref}}<div class="muted" style="font-size:11px">{{.Ref}}</div>{{end}}</td>
|
||
<td style="white-space:nowrap">{{if not .At.IsZero}}{{wall .At}}{{end}}</td><td style="color:var(--err);font-size:12px">{{.Comment}}</td>
|
||
</tr>{{end}}</tbody>
|
||
</table></div>
|
||
<div style="display:flex;gap:10px;flex-wrap:wrap;margin-top:12px">
|
||
<form method="post" action="/admin/fancy-queue/requeue" style="margin:0"><button type="submit" class="btn btn-ok" onclick="return confirm('Вернуть записи с ошибкой в очередь обработчика DEPO? Он попробует обработать их заново.')">↻ Вернуть в очередь</button></form>
|
||
<form method="post" action="/admin/fancy-queue/dismiss" style="margin:0"><button type="submit" class="btn" onclick="return confirm('Снять эти записи с очереди? Обработчик больше не будет их брать, и они исчезнут из списка ошибок. Применяйте для устаревших/ненужных записей.')">✕ Снять с очереди</button></form>
|
||
</div>
|
||
<p class="muted" style="margin:8px 0 0;font-size:12px">«Вернуть в очередь» — повторить обработку после устранения причины. «Снять с очереди» — пометить записи как снятые (SKIPPED) и убрать из ошибок, если переобрабатывать их не нужно (например, старые тестовые).</p>
|
||
{{end}}
|
||
</div>{{end}}
|
||
|
||
<div class="card">
|
||
<h2>Переводы в DEPO ({{len .Rows}})</h2>
|
||
{{if .Error}}<p style="color:var(--err)">{{.Error}}</p>{{end}}
|
||
{{if .Rows}}
|
||
<div style="overflow-x:auto">
|
||
<table style="font-size:12.5px">
|
||
<thead><tr><th>Создан</th><th>Перевод</th><th>Направление</th><th>Депонент</th><th>Контрагент</th><th>Бумаги</th><th>Документ DEPO</th><th>Состояние</th></tr></thead>
|
||
<tbody>
|
||
{{range .Rows}}
|
||
<tr>
|
||
<td style="white-space:nowrap">{{if not .CreatedAt.IsZero}}{{wall .CreatedAt}}{{else}}—{{end}}</td>
|
||
<td><a href="/admin/claims?guid={{.GUID}}"><code>{{short 8 .GUID}}</code></a>{{if .Comment}}<div class="muted" style="font-size:11px">{{.Comment}}</div>{{end}}</td>
|
||
<td style="white-space:nowrap">{{.DirectionRu}}</td>
|
||
<td>{{.Deponent}}{{if .DeponentDoc}}<div class="muted" style="font-size:11px">{{.DeponentDoc}}</div>{{end}}</td>
|
||
<td><code>{{.CP}}</code></td>
|
||
<td>{{range .Lines}}<div><code>{{.ISIN}}</code>{{if .SecCode}} <span class="muted">{{.SecCode}}</span>{{end}} × {{.Amount}}{{if eq .State "ERROR"}} <span class="badge rejected">ошибка</span>{{end}}</div>{{else}}<span class="muted">—</span>{{end}}</td>
|
||
<td>{{if .Doc}}<b>№{{.Doc}}</b><div class="muted" style="font-size:11px">{{.DocState}}{{if not .DocAt.IsZero}} · {{wall .DocAt}}{{end}}</div>{{else}}<span class="muted">не создан</span>{{end}}</td>
|
||
<td><span class="badge {{stageCls .}}">{{stageText .}}</span>
|
||
{{range .Errors}}<div style="color:var(--err);font-size:11px">{{.}}</div>{{end}}</td>
|
||
</tr>
|
||
<tr><td colspan="8" style="padding:2px 10px 8px 24px;border-top:none"><div class="muted" style="font-size:11px;display:flex;gap:6px 18px;flex-wrap:wrap">{{range .Events}}<span><span style="{{if eq .State "TODO"}}color:var(--warn);font-weight:600{{end}}">{{.Type}}</span>{{if .Ref}} <code>{{.Ref}}</code>{{end}} · {{wall .At}}{{if .Codes}} · {{.Codes}}{{end}}{{if .Comment}} — {{.Comment}}{{end}}</span>{{else}}<span>событий нет</span>{{end}}</div></td></tr>
|
||
{{end}}
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
{{else if not .Error}}
|
||
<p class="muted">В трансферных таблицах пока нет переводов. Они появятся при входящем/исходящем переводе M2M{{if devOn}} или при прогоне «Тестирование M2M → выгрузка истории в DEPO»{{end}}.</p>
|
||
{{end}}
|
||
</div>
|
||
|
||
{{if internalDocs}}<p style="margin-top:14px"><a href="/admin/help/fancy-events" class="muted">bj ↔ bj2depo: события, таблицы, действия job →</a></p>{{end}}
|
||
{{end}}
|