From d6ca31251bcf88dec143429f20c0a8267c842693 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Fri, 19 Jun 2026 08:48:29 +0400 Subject: [PATCH] =?UTF-8?q?process.cfm:=20=D0=BE=D0=B4=D0=B8=D0=BD=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=BF=D1=80=D0=BE=D1=81=20=D0=B2=D0=BC=D0=B5=D1=81?= =?UTF-8?q?=D1=82=D0=BE=20N+1,=20skip=20already=20extracted,=20DELETE=20be?= =?UTF-8?q?fore=20INSERT,=20prompt=20fix=20(v1.0.49)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- extractor.cfm | 2 +- index.cfm | 84 ++++++++------- process.cfm | 289 ++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 334 insertions(+), 41 deletions(-) create mode 100644 process.cfm diff --git a/extractor.cfm b/extractor.cfm index 5c3cb18..f269019 100644 --- a/extractor.cfm +++ b/extractor.cfm @@ -78,7 +78,7 @@ 4. Верни ТОЛЬКО JSON, без пояснений. Пример ответа: -{"rows":[{"row_num":1,"name":"Аренда стойко-места","price":213905.44,"qty":3,"sum":641716.32,"date_start":"2026-04-01"}],"unresolved":[]} +{{"rows":[{{"row_num":1,"name":"Аренда стойко-места","price":213905.44,"qty":3,"sum":641716.32,"date_start":"2026-04-01"}}],"unresolved":[]}} Текст документа: --- diff --git a/index.cfm b/index.cfm index d5eaf16..48b013d 100644 --- a/index.cfm +++ b/index.cfm @@ -61,7 +61,7 @@
Nubes - Сверка договоров — LLM v1.0.47 — Lucee + Сверка договоров — LLM v1.0.49 — Lucee
@@ -340,54 +340,58 @@ document.getElementById('llmBtn').addEventListener('click', async function() { diffStatus.textContent = '⏳ ' + ((Date.now() - llmStart) / 1000).toFixed(1) + 'с'; }, 200); - // 1. Extract for each supplement + // ОДИН запрос — всё внутри: экстракция + сравнение try { - var resp = await fetch('/api.cfm?action=query&sql=' + encodeURIComponent("SELECT id FROM supplements WHERE contract_id='" + contractId + "' ORDER BY created_at")); + var resp = await fetch('/process.cfm?contract_id=' + contractId); var data = await resp.json(); - if (data.OK && data.ROWS) { - for (var i = 0; i < data.ROWS.length; i++) { - try { - var er = await fetch('/extractor.cfm?supplement_id=' + data.ROWS[i].id); - var ed = await er.json(); - if (ed.OK) diffBody.innerHTML += '
✓ ' + ed.ROWS_SAVED + ' строк
'; - else diffBody.innerHTML += '
✗ ' + (ed.ERROR||'') + '
'; - } catch(e) {} - } - } - } catch(e) {} - // 2. Differ - diffBody.innerHTML += '
📊 Сравнение:
'; - try { - var resp = await fetch('/differ.cfm?contract_id=' + contractId); - var data = await resp.json(); - if (data.OK && data.ALL_CHANGES) { - var all = data.ALL_CHANGES; + if (data.OK) { + // Показать результаты экстракции + var extr = data.EXTRACTED || []; diffBody.innerHTML = ''; - all.forEach(function(ch) { - var s = ch.SUMMARY || {}; - diffBody.innerHTML += '
📄 Допник (' + ch.TYPE + ')
'; - diffBody.innerHTML += '
+' + (s.ADDED||0) + ' ~' + (s.CHANGED||0) + ' -' + (s.DELETED||0) + '
'; - diffStatus.textContent = 'изм:' + (s.CHANGED||0) + ' +' + (s.ADDED||0) + ' -' + (s.DELETED||0); - - var changes = ch.CHANGES || []; - if (changes.length === 0) { - diffBody.innerHTML += '
Нет изменений
'; + extr.forEach(function(e) { + if (e.ERROR) { + diffBody.innerHTML += '
✗ ' + (e.FILENAME||e.SUPPLEMENT_ID) + ': ' + e.ERROR + '
'; + } else if (e.SKIPPED) { + diffBody.innerHTML += '
⏭ ' + (e.FILENAME||e.SUPPLEMENT_ID) + ' (уже извлечено, ' + e.ROWS_SAVED + ' строк)
'; } else { - var tbl = '
'; - changes.forEach(function(c) { - 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 || {}); - tbl += ''; - }); - tbl += '
УслугаЦенаОбъёмСуммаНачало
' + (c.ROW_NUM||'') + '' + (vals.NAME||'') + '' + _dc(c,'PRICE') + '' + _dc(c,'QTY') + '' + _dc(c,'SUM') + '' + (vals.DATE_START||'') + '
'; - diffBody.innerHTML += tbl; + diffBody.innerHTML += '
✓ ' + (e.FILENAME||e.SUPPLEMENT_ID) + ': ' + e.ROWS_SAVED + ' строк
'; } }); + + // Сравнение + diffBody.innerHTML += '
📊 Сравнение:
'; + var all = data.ALL_CHANGES || []; + if (all.length === 0) { + diffBody.innerHTML += '
Нет допников для сравнения.
'; + } else { + all.forEach(function(ch) { + var s = ch.SUMMARY || {}; + diffBody.innerHTML += '
📄 Допник (' + ch.TYPE + ')
'; + diffBody.innerHTML += '
+' + (s.ADDED||0) + ' ~' + (s.CHANGED||0) + ' -' + (s.DELETED||0) + '
'; + diffStatus.textContent = 'изм:' + (s.CHANGED||0) + ' +' + (s.ADDED||0) + ' -' + (s.DELETED||0); + + var changes = ch.CHANGES || []; + if (changes.length === 0) { + diffBody.innerHTML += '
Нет изменений
'; + } else { + var tbl = '
'; + changes.forEach(function(c) { + 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 || {}); + tbl += ''; + }); + tbl += '
УслугаЦенаОбъёмСуммаНачало
' + (c.ROW_NUM||'') + '' + (vals.NAME||'') + '' + _dc(c,'PRICE') + '' + _dc(c,'QTY') + '' + _dc(c,'SUM') + '' + (vals.DATE_START||'') + '
'; + diffBody.innerHTML += tbl; + } + }); + } } else { - diffBody.innerHTML += '
✗ ' + (data.ERROR||'') + '
'; + diffBody.innerHTML = '
✗ ' + (data.ERROR||'Неизвестная ошибка') + '
'; } - } catch(e) { diffBody.innerHTML += '
✗ ' + e.message + '
'; } + } catch(e) { + diffBody.innerHTML = '
✗ ' + e.message + '
'; + } clearInterval(timerInterval); diffStatus.textContent = '✓ ' + ((Date.now() - llmStart) / 1000).toFixed(1) + 'с'; diff --git a/process.cfm b/process.cfm new file mode 100644 index 0000000..af6f0de --- /dev/null +++ b/process.cfm @@ -0,0 +1,289 @@ + + + + + + + + + + + + + SELECT s.id as supp_id, s.type, d.id as doc_id, d.filename, d.elements_json, d.parsed_text + FROM supplements s + JOIN documents d ON s.document_id = d.id + WHERE s.contract_id = + AND d.parsed_text IS NOT NULL + ORDER BY s.created_at + + + + + + + + + + + + SELECT prompt_text FROM prompts WHERE contract_id = + + + + + + + + + + + + + + + + + + SELECT row_num, name, price, qty, sum, date_start + FROM spec_rows WHERE supplement_id = + ORDER BY row_num + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + DELETE FROM spec_rows WHERE supplement_id = + + + + + + + + + + + INSERT INTO spec_rows (supplement_id, row_num, name, price, qty, sum, date_start) + VALUES ( + , + , + , + , + , + , + + ) + + + + + + + + + + + + + + + + + + + + + + + SELECT id FROM supplements WHERE contract_id= AND type='initial' ORDER BY created_at LIMIT 1 + + + + SELECT id FROM supplements WHERE contract_id= ORDER BY created_at LIMIT 1 + + + + + + + + + + + SELECT id, type FROM supplements WHERE contract_id= AND id!= ORDER BY created_at + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +#serializeJSON(result)#