From ae491052e6101f9d90c19444bc8335eb014d9706 Mon Sep 17 00:00:00 2001 From: zuevav Date: Fri, 18 Sep 2026 14:18:34 +0300 Subject: [PATCH] =?UTF-8?q?=D0=96=D1=83=D1=80=D0=BD=D0=B0=D0=BB:=20=D1=87?= =?UTF-8?q?=D0=B5=D1=80=D0=BD=D0=BE=D0=B2=D0=B8=D0=BA=D0=B8=20=D0=BF=D0=BE?= =?UTF-8?q?=D1=80=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D0=B9=2016=20=E2=80=94=20?= =?UTF-8?q?=D0=BE=D0=B4=D0=BD=D0=B8=D0=BC=20=D0=BE=D0=B1=D1=85=D0=BE=D0=B4?= =?UTF-8?q?=D0=BE=D0=BC=20=D0=BA=D0=B0=D1=82=D0=B0=D0=BB=D0=BE=D0=B3=D0=B0?= =?UTF-8?q?=20=D1=81=20=D0=BA=D1=8D=D1=88=D0=B5=D0=BC=205=20=D1=81,=20?= =?UTF-8?q?=D0=B0=20=D0=BD=D0=B5=20=D0=BF=D0=BE=20=D0=BE=D0=B1=D1=85=D0=BE?= =?UTF-8?q?=D0=B4=D1=83=20=D0=BD=D0=B0=20=D1=81=D1=82=D1=80=D0=BE=D0=BA?= =?UTF-8?q?=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL --- internal/lkgateway/livestatus.go | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/internal/lkgateway/livestatus.go b/internal/lkgateway/livestatus.go index 87e968a..0807e31 100644 --- a/internal/lkgateway/livestatus.go +++ b/internal/lkgateway/livestatus.go @@ -13,6 +13,7 @@ import ( "encoding/json" "net/http" "strings" + "sync" "time" ) @@ -23,14 +24,37 @@ type LiveStatus struct { Active bool `json:"active"` // в работе: страница продолжает опрашивать } +// form16Snapshot — черновики и подачи поручений 16 по всем сделкам одним обходом входящего +// каталога ИШ, с кэшем на несколько секунд: журнал на сотню строк и опрос состояния каждые +// 8 секунд не должны обходить каталог по разу на строку. +var form16Snap struct { + mu sync.Mutex + at time.Time + deal map[string]*OutgoingDeal +} + +func form16Snapshot() map[string]*OutgoingDeal { + form16Snap.mu.Lock() + defer form16Snap.mu.Unlock() + if form16Snap.deal != nil && time.Since(form16Snap.at) < 5*time.Second { + return form16Snap.deal + } + m := map[string]*OutgoingDeal{} + if globalOutgoingStore != nil { + for _, d := range scanForm16Drafts(globalOutgoingStore) { + m[d.GUID] = d + } + } + form16Snap.deal, form16Snap.at = m, time.Now() + return m +} + // liveOutgoing — состояние исходящего перевода: сделка M2M + депозитарное поручение 16. func liveOutgoing(c ClaimView) LiveStatus { guid := string(c.M2MGUID) var depo *OutgoingDeal - if guid != "" && globalOutgoingStore != nil { - if d, ok := scanForm16Deal(globalOutgoingStore, guid); ok { - depo = d - } + if guid != "" && c.Status == "confirmed" { // каталог нужен только на этапе депо-исполнения + depo = form16Snapshot()[guid] } var watch *OrderWatch if guid != "" && globalOrderWatch != nil {