Карточки заявок обновляются сами: отпечаток состояния, перерисовка без ручного обновления, индикатор «обновляется автоматически»

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014FsEKyJrYF69Cj9ZXzFLRi
This commit is contained in:
zuevav
2026-09-25 16:07:11 +03:00
parent 27c350a087
commit a0f6ce9f7b
4 changed files with 85 additions and 8 deletions
+48 -4
View File
@@ -11,7 +11,9 @@ package lkgateway
import (
"context"
"encoding/json"
"hash/fnv"
"net/http"
"strconv"
"strings"
"sync"
"time"
@@ -22,6 +24,48 @@ type LiveStatus struct {
Text string `json:"text"` // чего ждём / чем закончилось
Kind string `json:"kind"` // wait | warn | ok | bad
Active bool `json:"active"` // в работе: страница продолжает опрашивать
Sig string `json:"sig,omitempty"` // отпечаток состояния: изменился — карточка перерисовывается
}
// liveSig — короткий отпечаток всего, что показывает карточка: сменился — страница обновляется.
func liveSig(parts ...any) string {
raw, _ := json.Marshal(parts)
h := fnv.New64a()
_, _ = h.Write(raw)
return strconv.FormatUint(h.Sum64(), 36)
}
// liveOutgoing — состояние исходящего перевода с отпечатком карточки.
func liveOutgoing(c ClaimView) LiveStatus {
st := liveOutgoingState(c)
guid := string(c.M2MGUID)
var quik []*QuikLink
var depoL *DepoLink
var watch *OrderWatch
if guid != "" {
quik = globalQuikLinks.ForGUID(guid)
if globalDepoLinks != nil {
depoL = globalDepoLinks.Get(guid)
}
if globalOrderWatch != nil {
watch = globalOrderWatch.Get(guid)
}
}
st.Sig = liveSig(st.Text, c.Status, c.UpdatedAt, sendFailGet(guid), quik, depoL, watch)
return st
}
// liveIncoming — состояние входящего перевода с отпечатком карточки.
func liveIncoming(it *IncomingTransfer) LiveStatus {
st := liveIncomingState(it)
if it != nil {
var watch *OrderWatch
if globalOrderWatch != nil {
watch = globalOrderWatch.Get(it.GUID)
}
st.Sig = liveSig(st.Text, it, watch)
}
return st
}
// form16Snapshot — черновики и подачи поручений 16 по всем сделкам одним обходом входящего
@@ -49,8 +93,8 @@ func form16Snapshot() map[string]*OutgoingDeal {
return m
}
// liveOutgoing — состояние исходящего перевода: сделка M2M + депозитарное поручение 16.
func liveOutgoing(c ClaimView) LiveStatus {
// liveOutgoingState — состояние исходящего перевода: сделка M2M + депозитарное поручение 16.
func liveOutgoingState(c ClaimView) LiveStatus {
guid := string(c.M2MGUID)
var depo *OutgoingDeal
if guid != "" && c.Status == "confirmed" { // каталог нужен только на этапе депо-исполнения
@@ -110,8 +154,8 @@ func liveOutgoing(c ClaimView) LiveStatus {
return LiveStatus{Text: russianState(c.Status), Kind: "wait"}
}
// liveIncoming — состояние входящего перевода: наше решение, затем поручение 16/1.
func liveIncoming(it *IncomingTransfer) LiveStatus {
// liveIncomingState — состояние входящего перевода: наше решение, затем поручение 16/1.
func liveIncomingState(it *IncomingTransfer) LiveStatus {
if it == nil {
return LiveStatus{}
}