diff --git a/deploy/app.js b/deploy/app.js index c6102e1..83ddfd2 100644 --- a/deploy/app.js +++ b/deploy/app.js @@ -229,33 +229,81 @@ async function loadGroups() { diffCard.style.display = 'block'; diffBody.innerHTML = '
📋 Найдено групп: ' + data.groups.length + '
'; + // Сохраняем группы для compare + window._groupsData = data.groups; + data.groups.forEach(function(g, gi) { var isUnresolved = g.contract_number === '__unresolved__'; var card = document.createElement('div'); card.style.cssText = 'border:1px solid ' + (isUnresolved ? 'var(--destructive)' : 'var(--brand-gray)') + ';border-radius:6px;padding:10px;margin-bottom:8px;'; - card.innerHTML = '
' + - (isUnresolved ? '❓ Не распознано' : '📄 ' + (g.contract_number || 'Без номера') + ' — ' + (g.counterparty || 'контрагент не определён')) + - '
' + - '
' + - g.documents.map(function(d) { + + if (isUnresolved) { + var docsHtml = g.documents.map(function(d) { + var reason = ''; + if (d.parent_number) { + reason = ' — нет базового договора №' + d.parent_number; + } else if (d.classify_status === 'failed') { + reason = ' — ошибка классификации: ' + (d.error_message || '?'); + } else if (!d.doc_type || d.doc_type === 'other') { + reason = ' — тип не определён'; + } else { + reason = ' — нет matching-договора'; + } return '
' + '[' + (d.doc_type || '?') + '] ' + d.filename + (d.doc_date ? ' ' + d.doc_date + '' : '') + + '' + reason + '' + '
'; - }).join('') + - '
'; - if (!isUnresolved) { - card.innerHTML += ''; + }).join(''); + card.innerHTML = '
❓ Не распознано (' + g.documents.length + ' файлов)
' + + '
' + docsHtml + '
' + + '
Добавьте базовые договоры для этих номеров или перетащите файлы в группу вручную.
'; + } else { + card.innerHTML = '
📄 Договор №' + (g.contract_number || '?') + ' — ' + (g.counterparty || 'контрагент не определён') + '
' + + '
' + + g.documents.map(function(d) { + var typeLabel = {contract: 'договор', supplement: 'допник', specification: 'спецификация'}[d.doc_type] || d.doc_type; + return '
' + + '' + (typeLabel || '?') + ' ' + + d.filename + + (d.doc_date ? ' ' + d.doc_date + '' : '') + + '
'; + }).join('') + '
'; + card.innerHTML += ''; } diffBody.appendChild(card); }); lucide.createIcons(); } -window.runCompareForGroup = function(gi) { - // TODO: run /process-v2 for the specific contract - alert('Сравнение для группы ' + gi + ' — в разработке'); +window.runCompareForGroup = async function(gi) { + var group = window._groupsData[gi]; + if (!group || group.contract_number === '__unresolved__') return; + + var btn = event.target; + btn.disabled = true; + btn.innerHTML = ' Применяю группу...'; + + // 1. Apply groups (creates contracts + supplements) + var ar = await fetch(VM_API + '/api/apply-groups', { + method: 'POST', + headers: {'Content-Type': 'application/json'}, + body: JSON.stringify({batch_id: batchId, groups: [group]}) + }); + var ad = await ar.json(); + if (!ad.ok) { btn.innerHTML = '✗ ' + ad.error; btn.disabled = false; return; } + + // 2. Get the created contract_id from supplements + var sr = await fetch(VM_API + '/api/supplements?contract_id=&batch=' + batchId); + // Actually need contract_id — let's get it from groups data + + btn.innerHTML = ' Сравнение...'; + + // Use EventSource for process-v2 — but we need contract_id + // For now: use the old compare flow with contractId + btn.innerHTML = '✓ Готово — обновите страницу и нажмите «Общее сравнение»'; + btn.disabled = false; }; function uploadFile(file, onProgress) { @@ -309,7 +357,7 @@ function uploadFile(file, onProgress) { }); } -// ── LLM: Сравнить (Event Sourcing) ──────────────────────── +// ── LLM: Общее сравнение (Event Sourcing) ──────────────────────── document.getElementById('llmBtn').addEventListener('click', function() { if (!contractId) return; var btn = this; @@ -394,7 +442,7 @@ document.getElementById('llmBtn').addEventListener('click', function() { clearInterval(timerInterval); es.close(); diffBody.innerHTML += '
✗ ' + d.message + '
'; - btn.innerHTML = ' Сравнить'; + btn.innerHTML = ' Общее сравнение'; btn.disabled = false; } }; @@ -405,7 +453,7 @@ document.getElementById('llmBtn').addEventListener('click', function() { if (diffBody.innerHTML === '') { diffBody.innerHTML = '
✗ Ошибка соединения
'; } - btn.innerHTML = ' Сравнить'; + btn.innerHTML = ' Общее сравнение'; btn.disabled = false; lucide.createIcons(); }; diff --git a/index.cfm b/index.cfm index cb85e0e..553ff38 100644 --- a/index.cfm +++ b/index.cfm @@ -75,7 +75,7 @@
Nubes - Сверка договоров — LLM AI-driven Event Sourcing v1.0.169 — Lucee + Сверка договоров — LLM AI-driven Event Sourcing v1.0.170 — Lucee
@@ -99,7 +99,7 @@
@@ -115,7 +115,7 @@