Журнал: кэш разбора пакетов ИШ и черновиков MF010 по времени изменения — обход каталога не перечитывает файлы
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
This commit is contained in:
@@ -153,6 +153,40 @@ type OutgoingDeal struct {
|
||||
// scanForm16Drafts живьём читает INBOX и собирает исходящие сделки: все черновики
|
||||
// с <order_t_id>16</order_t_id>, сгруппированные по based_on (GUID). Объединяет с
|
||||
// состоянием подачи из стора. store может быть nil (тогда без состояния подачи).
|
||||
// mf010Cache — текст черновиков MF010 по пути и времени изменения: файл после получения не
|
||||
// меняется, а обход журнала читал их все при каждом показе.
|
||||
var mf010Cache = struct {
|
||||
mu sync.Mutex
|
||||
m map[string]mf010Entry
|
||||
}{m: map[string]mf010Entry{}}
|
||||
|
||||
type mf010Entry struct {
|
||||
mod time.Time
|
||||
size int64
|
||||
body string
|
||||
}
|
||||
|
||||
func mf010Text(p string, info os.FileInfo) (string, bool) {
|
||||
mf010Cache.mu.Lock()
|
||||
if e, ok := mf010Cache.m[p]; ok && e.mod.Equal(info.ModTime()) && e.size == info.Size() {
|
||||
mf010Cache.mu.Unlock()
|
||||
return e.body, true
|
||||
}
|
||||
mf010Cache.mu.Unlock()
|
||||
b, err := os.ReadFile(p)
|
||||
if err != nil {
|
||||
return "", false
|
||||
}
|
||||
body := string(decodeCP1251(b))
|
||||
mf010Cache.mu.Lock()
|
||||
if len(mf010Cache.m) > 20000 {
|
||||
mf010Cache.m = map[string]mf010Entry{}
|
||||
}
|
||||
mf010Cache.m[p] = mf010Entry{mod: info.ModTime(), size: info.Size(), body: body}
|
||||
mf010Cache.mu.Unlock()
|
||||
return body, true
|
||||
}
|
||||
|
||||
func scanForm16Drafts(store *OutgoingStore) []*OutgoingDeal {
|
||||
byGUID := map[string]*OutgoingDeal{}
|
||||
_ = filepath.Walk(igwInboxDir, func(p string, info os.FileInfo, err error) error {
|
||||
@@ -162,11 +196,10 @@ func scanForm16Drafts(store *OutgoingStore) []*OutgoingDeal {
|
||||
if !strings.HasSuffix(strings.ToUpper(p), "_MF010.XML") {
|
||||
return nil
|
||||
}
|
||||
b, e := os.ReadFile(p)
|
||||
if e != nil {
|
||||
body, ok := mf010Text(p, info)
|
||||
if !ok {
|
||||
return nil
|
||||
}
|
||||
body := string(decodeCP1251(b))
|
||||
if of16(body, "order_t_id") != "16" { // только списание (16), не 16/1
|
||||
return nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user