Журнал: черновики поручений 16 — одним обходом каталога с кэшем 5 с, а не по обходу на строку

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
This commit is contained in:
zuevav
2026-09-18 14:18:34 +03:00
parent 46e55e1277
commit ae491052e6
+28 -4
View File
@@ -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 {