Анкета участника: ответ НРД принимается автоматически — квитанция и ответ сервиса

Квитанции ЭДО НРД (пакеты C, «Уведомление о получении Пакетов…»)
разбираются: для нашей анкеты (#M2MPF…) — отметка «доставлена в НРД»
с временем, ошибка первичной обработки — отказ с текстом квитанции.
Ответ сервиса: INFO — «принята в обработку», OK — принята, ERROR —
отказ с кодом; документ-ответ M2MTransferParticipantForm — регистрация
подтверждена. Всё видно в строке «Исходящих», на странице анкеты и в
плашке раздела НРД. После запуска bj перечитывает квитанции за день
отправки, если отметки ещё нет (22.10 на 9 квитанция пришла раньше).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Q7eREaYwUt1i4fNLZcGnjn
This commit is contained in:
fontvielle
2026-10-22 11:14:22 +03:00
parent f50b338294
commit 6fc0ff5d3d
6 changed files with 202 additions and 6 deletions
+9 -1
View File
@@ -75,6 +75,7 @@ func (s *Server) pollIncoming(ctx context.Context) {
saveProcessed(processed)
}
log.Printf("lk-gateway: поллер входящих ИШ запущен (канал %s, интервал %s, обработанных в памяти %d)", s.igwChannel, interval, len(processed))
go s.participantReceiptBackfill(ctx)
for {
select {
@@ -146,7 +147,13 @@ func (s *Server) applyIncoming(ctx context.Context, p igw.Package) error {
unpacked, err := igw.UnpackPackage(zipBytes)
if err != nil {
// Нет основного .xml — служебный пакет (квитанция/конверт ЭДО).
// Не ошибка: помечаем обработанным, чтобы не повторять.
// Не ошибка: помечаем обработанным, чтобы не повторять. Квитанция о получении нашей анкеты —
// отметка «доставлена в НРД» (nsdreceipt.go).
if r, ok := parseNSDReceipt(zipBytes); ok {
if applyNSDReceipt(r) {
log.Printf("lk-gateway: поллер квитанция id=%d: анкета %s получена НРД %s, без ошибок=%v %s", p.ID, r.Package, r.ReceivedAt.Format("02.01 15:04:05"), r.OK, r.Text)
}
}
log.Printf("lk-gateway: поллер пакет id=%d (%s) — служебный (квитанция/конверт), пропуск", p.ID, p.Type)
return nil
}
@@ -279,6 +286,7 @@ func (s *Server) applyIncoming(ctx context.Context, p igw.Package) error {
// Схему ответа фиксируем на боевом контуре — сохраняем подлинный XML, чтобы
// затем встроить разбор в систему (для всех клиентов).
path, root := captureNSDReply(p, unpacked.DocXML, "participant-form")
recordParticipantFormReply(path)
log.Printf("lk-gateway: поллер ОТВЕТ НРД на анкету участника id=%d (%s): корень <%s>, сохранён %s", p.ID, p.Type, root, path)
return nil
default: