From 475efefb40519f0a19a274fd232d2226be3c43a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Thu, 27 Aug 2026 09:45:54 +0300 Subject: [PATCH] Preserve ZIP source during upload --- History/2026-08-27-classify-stuck-at-68.md | 26 ++++++++++++++++++++++ site/config.py | 2 +- site/static/files.js | 2 +- site/templates/index.html | 14 ++++++------ 4 files changed, 35 insertions(+), 9 deletions(-) diff --git a/History/2026-08-27-classify-stuck-at-68.md b/History/2026-08-27-classify-stuck-at-68.md index 5480862..b8f99e2 100644 --- a/History/2026-08-27-classify-stuck-at-68.md +++ b/History/2026-08-27-classify-stuck-at-68.md @@ -55,3 +55,29 @@ var done = (d.counts.classified || 0) Kubernetes проверялся только командами чтения через ВМ: `kubectl get`, `kubectl describe`, `kubectl top`, `kubectl logs`. + +## Дополнительная проверка загрузки ZIP + +При проверке загрузки разными способами обнаружен отдельный дефект связи +файлов с архивом. `expandZipClient()` создаёт для каждого распакованного файла +поле `zip_source`, а `uploadFile(file, onProgress, zipSource)` умеет передавать +его в `/api/upload_refs`. Однако вызов `uploadFile()` в цикле `onFilesSelected()` +передавал только два аргумента. Поэтому backend получал `zip_source=null`, и +связь с исходным ZIP терялась. + +Проверены архивы: + +- `testgen/out/zips/duplicates_inside.zip` — целый ZIP, два файла с одинаковым именем; +- `testgen/out/zips/mixed_with_error.zip` — целый ZIP, корректный и повреждённый DOCX. + +Исправление применено в `site/static/files.js`: третьим аргументом передаётся +`entry.zip_source`. Для обычных файлов значение `null`, поэтому их поведение не +изменяется. Версия приложения повышена с `2.0.18` до `2.0.19`, cache-buster +обновлён в `site/templates/index.html`. + +## Проверки исправления + +- `node --check site/static/files.js` — успешно; +- frontend upload-тесты — успешно; +- layer 2 upload-тесты — успешно; +- архивы `duplicates_inside.zip` и `mixed_with_error.zip` прошли `unzip -t`. diff --git a/site/config.py b/site/config.py index 56b0395..90907e5 100644 --- a/site/config.py +++ b/site/config.py @@ -1,7 +1,7 @@ """Конфигурация приложения — все настройки в одном месте.""" import os -VERSION = "2.0.18" +VERSION = "2.0.19" LLM_URL = os.getenv("LLM_API_URL", "https://api.aillm.ru/v1/chat/completions") LLM_KEY = os.getenv("LLM_API_KEY", "") diff --git a/site/static/files.js b/site/static/files.js index d6c2a7e..616fbc6 100644 --- a/site/static/files.js +++ b/site/static/files.js @@ -421,7 +421,7 @@ async function onFilesSelected(newFiles) { var resp = await uploadFile(f, function(st) { entry.status = st; render(state); - }); + }, entry.zip_source); if (resp && resp.contract_id) state.contractId = resp.contract_id; entry.doc_id = resp.doc_id; entry.status = { kind: 'uploaded' }; diff --git a/site/templates/index.html b/site/templates/index.html index a8af2d5..6ee6aee 100644 --- a/site/templates/index.html +++ b/site/templates/index.html @@ -73,7 +73,7 @@
Nubes - Сверка договоров — LLM AI-driven Event Sourcing v2.0.18 + Сверка договоров — LLM AI-driven Event Sourcing v2.0.19
○ Загрузка ○ Классификация @@ -224,11 +224,11 @@ import { listZipFiles } from '/upload/zip/list_zip_files.js'; window.listZipFiles = listZipFiles; - - - - - - + + + + + +