мс вместо сек, идемпотентность (кнопка блокируется после успеха), v1.9

This commit is contained in:
2026-06-17 07:14:17 +04:00
parent e0c58fcbd0
commit 4474190cae
2 changed files with 10 additions and 6 deletions
+3 -3
View File
@@ -221,7 +221,7 @@ class ContractsApp:
"UPDATE documents SET parsed_text=%s, status='parsed' WHERE id=%s", "UPDATE documents SET parsed_text=%s, status='parsed' WHERE id=%s",
(ztext, str(zdoc_id)), (ztext, str(zdoc_id)),
) )
zelapsed = round(time_mod.time() - zf_start, 1) zelapsed = round(time_mod.time() - zf_start, 2)
files_processed += 1 files_processed += 1
yield f"data: {json.dumps({'type': 'file_done', 'name': zname, 'time_s': zelapsed, 'elements': len(zelements)})}\n\n" yield f"data: {json.dumps({'type': 'file_done', 'name': zname, 'time_s': zelapsed, 'elements': len(zelements)})}\n\n"
except Exception as e: except Exception as e:
@@ -242,11 +242,11 @@ class ContractsApp:
"UPDATE documents SET parsed_text=%s, status='parsed' WHERE id=%s", "UPDATE documents SET parsed_text=%s, status='parsed' WHERE id=%s",
(text, str(s["doc_id"])), (text, str(s["doc_id"])),
) )
elapsed = round(time_mod.time() - file_start, 1) elapsed = round(time_mod.time() - file_start, 2)
files_processed += 1 files_processed += 1
yield f"data: {json.dumps({'type': 'file_done', 'name': s['filename'], 'time_s': elapsed, 'elements': len(elements)})}\n\n" yield f"data: {json.dumps({'type': 'file_done', 'name': s['filename'], 'time_s': elapsed, 'elements': len(elements)})}\n\n"
total_time = round(time_mod.time() - start_time, 1) total_time = round(time_mod.time() - start_time, 2)
yield f"data: {json.dumps({'type': 'summary', 'total_time_s': total_time, 'total_bytes': total_bytes, 'files_processed': files_processed})}\n\n" yield f"data: {json.dumps({'type': 'summary', 'total_time_s': total_time, 'total_bytes': total_bytes, 'files_processed': files_processed})}\n\n"
return Response(generate(), mimetype="text/event-stream") return Response(generate(), mimetype="text/event-stream")
+7 -3
View File
@@ -47,7 +47,7 @@
<body> <body>
<div class="topbar"> <div class="topbar">
<img src="{{ url_for('static', filename='nubes-logo.svg') }}" alt="Nubes"> <img src="{{ url_for('static', filename='nubes-logo.svg') }}" alt="Nubes">
<span class="title">Сверка договоров <span style="font-weight:400;color:var(--muted);font-size:12px;">v1.8</span></span> <span class="title">Сверка договоров <span style="font-weight:400;color:var(--muted);font-size:12px;">v1.9</span></span>
</div> </div>
<div class="content"> <div class="content">
@@ -265,7 +265,7 @@
var now = Date.now(); var now = Date.now();
document.querySelectorAll('.proc-timer').forEach(function(el) { document.querySelectorAll('.proc-timer').forEach(function(el) {
var start = parseInt(el.dataset.start); var start = parseInt(el.dataset.start);
if (start) el.textContent = '⏳ ' + Math.round((now - start) / 1000) + 'с'; if (start) el.textContent = '⏳ ' + ((now - start) / 1000).toFixed(1) + 'с';
}); });
}, 500); }, 500);
@@ -310,7 +310,11 @@
else if (d.type === 'summary') { else if (d.type === 'summary') {
clearInterval(timerInterval); clearInterval(timerInterval);
es.close(); es.close();
resetBtn();
// Идемпотентность: больше нельзя запустить
parseBtn.disabled = true;
parseBtn.innerHTML = '<i data-lucide="check" style="width:16px;height:16px;"></i> ✓ Готово';
lucide.createIcons();
var summaryRow = document.createElement('tr'); var summaryRow = document.createElement('tr');
summaryRow.className = 'summary-row'; summaryRow.className = 'summary-row';