diff --git a/index.cfm b/index.cfm index 4589033..61970a0 100644 --- a/index.cfm +++ b/index.cfm @@ -64,7 +64,7 @@
Nubes - Сверка договоров v1.0.19 — Lucee + Сверка договоров v1.0.20 — Lucee
@@ -99,10 +99,14 @@ Обработка
+
+ +
+
@@ -370,6 +374,68 @@ document.getElementById('btnDiffer').addEventListener('click', async function() btn.disabled = false; }); +// ── Полный цикл: парсинг → LLM → сравнение ──────────────── +document.getElementById('btnFull').addEventListener('click', async function() { + var btn = this; btn.disabled = true; log('⚡ Полный цикл...'); + // 1. Парсинг + for (var i = 0; i < fileQueue.length; i++) { + var f = fileQueue[i]; + if (!f.doc_id || f.parsed) continue; + try { + var resp = await fetch('/parser.cfm?doc_id=' + f.doc_id); + var d = await resp.json(); + if (d.OK) { f.element_count = d.ELEMENT_COUNT; f.parsed = true; f.status = 'parsed (' + d.ELEMENT_COUNT + ')'; log('📄 ' + f.name + ': ' + d.ELEMENT_COUNT + ' эл.'); } + else { log('❌ ' + f.name + ': ' + (d.ERROR||'')); } + } catch(e) { log('❌ ' + f.name + ': ' + e.message); } + renderTable(); + } + // 2. LLM-извлечение + try { + var resp = await fetch('/api.cfm?action=query&sql=' + encodeURIComponent("SELECT s.id,d.filename FROM supplements s JOIN documents d ON s.document_id=d.id WHERE s.contract_id='" + contractId + "' ORDER BY s.created_at")); + var data = await resp.json(); + if (data.OK && data.ROWS) { + for (var i = 0; i < data.ROWS.length; i++) { + var row = data.ROWS[i]; + try { + var er = await fetch('/extractor.cfm?supplement_id=' + row.id); + var ed = await er.json(); + if (ed.OK) { log('🤖 ' + row.filename + ': ' + ed.ROWS_SAVED + ' строк'); } + else { log('❌ ' + row.filename + ': ' + (ed.ERROR||'')); } + } catch(e) { log('❌ ' + row.filename + ': ' + e.message); } + } + } + } catch(e) { log('❌ ' + e.message); } + // 3. Сравнение + try { + var resp = await fetch('/differ.cfm?contract_id=' + contractId); + var data = await resp.json(); + if (data.OK) { + var s = data.SUMMARY; + log('🔍 Изменено: ' + (s.CHANGED||0) + ', Добавлено: ' + (s.ADDED||0) + ', Удалено: ' + (s.DELETED||0)); + var html = '

Изменено: ' + (s.CHANGED||0) + ' Добавлено: ' + (s.ADDED||0) + ' Удалено: ' + (s.DELETED||0) + ' Без изменений: ' + (s.UNCHANGED||0) + '

'; + html += ''; + for (var i = 0; i < data.CHANGES.length; i++) { + var c = data.CHANGES[i]; + var cls = c.CHANGE_TYPE === 'added' ? 'diff-added' : (c.CHANGE_TYPE === 'deleted' ? 'diff-deleted' : (c.CHANGE_TYPE === 'changed' ? 'diff-changed' : '')); + var vals = c.NEW_VALUES && Object.keys(c.NEW_VALUES).length > 0 ? c.NEW_VALUES : c.OLD_VALUES; + html += ''; + } + html += '
#ТипУслугаЦенаКол-воСумма
' + c.ROW_NUM + '' + c.CHANGE_TYPE + '' + (vals.NAME||'') + '' + (vals.PRICE||'') + '' + (vals.QTY||'') + '' + (vals.SUM||'') + '
'; + document.getElementById('diffBody').innerHTML = html; + document.getElementById('diffCard').style.display = 'block'; + } else { log('❌ ' + (data.ERROR||'')); } + } catch(e) { log('❌ ' + e.message); } + log('✅ Полный цикл завершён'); + btn.disabled = false; +}); + +// ── Промпт ───────────────────────────────────────────────── +var promptEditor = document.getElementById('promptEditor'); +promptEditor.value = localStorage.getItem('llm_prompt') || ''; +promptEditor.addEventListener('input', function() { + localStorage.setItem('llm_prompt', this.value); +}); + // ── Чат ─────────────────────────────────────────────────── document.getElementById('chatSend').addEventListener('click', async function() { var input = document.getElementById('chatInput');