Портфель ЛК: под карточкой только последняя ручная заливка
Каждая «Залить сейчас» оставляла строку навсегда (до перезапуска). Теперь ручная заливка заменяет прежнюю ручную; клиенты постоянного заполнения остаются. Пропущенные бумаги — свёрнутым списком «пропущено бумаг: N». Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
This commit is contained in:
@@ -20,6 +20,7 @@ import (
|
||||
"io"
|
||||
"log"
|
||||
"net/http"
|
||||
"sort"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
@@ -216,6 +217,7 @@ type LKPortfolioSyncState struct {
|
||||
Skipped []string
|
||||
Err string
|
||||
hash string
|
||||
manual bool // ручная заливка («Залить сейчас»), не постоянное заполнение
|
||||
}
|
||||
|
||||
var lkPortfolioState = struct {
|
||||
@@ -246,7 +248,7 @@ func lkPortfolioSyncTick(ctx context.Context, rc *RuntimeConfig, force bool) {
|
||||
s = &LKPortfolioSyncState{LK: pr.LK, Depo: pr.Depo}
|
||||
lkPortfolioState.m[pr.LK] = s
|
||||
}
|
||||
s.Depo, s.CheckedAt = pr.Depo, time.Now()
|
||||
s.Depo, s.CheckedAt, s.manual = pr.Depo, time.Now(), false
|
||||
if err != nil {
|
||||
if s.Err != err.Error() {
|
||||
log.Printf("lk-portfolio: %s ← %s: %v", pr.LK, pr.Depo, err)
|
||||
@@ -290,7 +292,8 @@ func lkPortfolioSyncTick(ctx context.Context, rc *RuntimeConfig, force bool) {
|
||||
}
|
||||
}
|
||||
|
||||
// lkPortfolioStates — состояние синхронизации для страницы настроек.
|
||||
// lkPortfolioStates — состояние для страницы настроек: последняя ручная заливка сверху, затем клиенты
|
||||
// постоянного заполнения.
|
||||
func lkPortfolioStates() []LKPortfolioSyncState {
|
||||
lkPortfolioState.Lock()
|
||||
defer lkPortfolioState.Unlock()
|
||||
@@ -298,9 +301,29 @@ func lkPortfolioStates() []LKPortfolioSyncState {
|
||||
for _, s := range lkPortfolioState.m {
|
||||
out = append(out, *s)
|
||||
}
|
||||
sort.Slice(out, func(i, j int) bool {
|
||||
if out[i].manual != out[j].manual {
|
||||
return out[i].manual
|
||||
}
|
||||
return out[i].LK < out[j].LK
|
||||
})
|
||||
return out
|
||||
}
|
||||
|
||||
// lkPortfolioInSync — договор в постоянном заполнении (по списку или «для всех»).
|
||||
func lkPortfolioInSync(rc *RuntimeConfig, lk string) bool {
|
||||
ps := rc.Snapshot().LK.PortfolioSync
|
||||
if ps.Enabled && ps.AllClients {
|
||||
return true
|
||||
}
|
||||
for _, p := range ps.pairs() {
|
||||
if p.LK == lk {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// registerLKPortfolioSync — POST /admin/setup/lk-portfolio: настройки и «синхронизировать сейчас».
|
||||
func registerLKPortfolioSync(mux *http.ServeMux, rc *RuntimeConfig) {
|
||||
// GET /admin/setup/lk-portfolio/clients?q= — поиск клиента DEPO для заливки портфеля.
|
||||
@@ -502,6 +525,14 @@ func lkPortfolioPushPair(ctx context.Context, rc *RuntimeConfig, pr lkPortfolioP
|
||||
lkPortfolioState.m[pr.LK] = s
|
||||
}
|
||||
s.Depo, s.CheckedAt, s.Skipped = pr.Depo, time.Now(), skipped
|
||||
if !lkPortfolioInSync(rc, pr.LK) {
|
||||
s.manual = true
|
||||
for k, o := range lkPortfolioState.m { // от прежних ручных заливок — только последняя
|
||||
if o.manual && k != pr.LK {
|
||||
delete(lkPortfolioState.m, k)
|
||||
}
|
||||
}
|
||||
}
|
||||
lkPortfolioState.Unlock()
|
||||
msg := ""
|
||||
if err != nil {
|
||||
|
||||
Reference in New Issue
Block a user