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 {