fix: Lucee serializeJSON даёт UPPERCASE ключи, revert lowercase (v1.0.60)
This commit is contained in:
@@ -61,7 +61,7 @@
|
|||||||
<body>
|
<body>
|
||||||
<div class="topbar">
|
<div class="topbar">
|
||||||
<img src="/nubes-logo.svg" alt="Nubes">
|
<img src="/nubes-logo.svg" alt="Nubes">
|
||||||
<span class="title">Сверка договоров — LLM <span style="font-weight:400;color:var(--muted);font-size:12px;">v1.0.59 — Lucee</span></span>
|
<span class="title">Сверка договоров — LLM <span style="font-weight:400;color:var(--muted);font-size:12px;">v1.0.60 — Lucee</span></span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="content">
|
<div class="content">
|
||||||
@@ -214,8 +214,8 @@ fileInput.addEventListener('change', async function() {
|
|||||||
fileQueue[rowIdx].status = '↑ ' + pct + '%';
|
fileQueue[rowIdx].status = '↑ ' + pct + '%';
|
||||||
renderTable();
|
renderTable();
|
||||||
});
|
});
|
||||||
if (resp && resp.contract_id) contractId = resp.contract_id;
|
if (resp && resp.CONTRACT_ID) contractId = resp.CONTRACT_ID;
|
||||||
fileQueue[rowIdx].doc_id = resp.doc_id;
|
fileQueue[rowIdx].doc_id = resp.DOC_ID;
|
||||||
fileQueue[rowIdx].status = '<span class="status-ok">✓</span>';
|
fileQueue[rowIdx].status = '<span class="status-ok">✓</span>';
|
||||||
fileQueue[rowIdx].uploaded = true;
|
fileQueue[rowIdx].uploaded = true;
|
||||||
} catch(err) {
|
} catch(err) {
|
||||||
@@ -252,8 +252,8 @@ function uploadFile(file, onProgress) {
|
|||||||
xhr.onload = function() {
|
xhr.onload = function() {
|
||||||
try {
|
try {
|
||||||
var r = JSON.parse(xhr.responseText);
|
var r = JSON.parse(xhr.responseText);
|
||||||
if (r.ok) resolve(r);
|
if (r.OK) resolve(r);
|
||||||
else reject(new Error(r.error || 'Неизвестная ошибка'));
|
else reject(new Error(r.ERROR || 'Неизвестная ошибка'));
|
||||||
} catch(e) { reject(new Error('Некорректный ответ')); }
|
} catch(e) { reject(new Error('Некорректный ответ')); }
|
||||||
};
|
};
|
||||||
xhr.onerror = function() { reject(new Error('Сеть')); };
|
xhr.onerror = function() { reject(new Error('Сеть')); };
|
||||||
@@ -297,12 +297,12 @@ parseBtn.addEventListener('click', async function() {
|
|||||||
try {
|
try {
|
||||||
var resp = await fetch('/parser.cfm?doc_id=' + f.doc_id);
|
var resp = await fetch('/parser.cfm?doc_id=' + f.doc_id);
|
||||||
var d = await resp.json();
|
var d = await resp.json();
|
||||||
if (d.ok && d.status === 'parsed') {
|
if (d.OK && d.STATUS === 'parsed') {
|
||||||
f.parsed = true;
|
f.parsed = true;
|
||||||
f.parseInfo = d;
|
f.parseInfo = d;
|
||||||
f.status = '<span class="status-ok">✓ ' + d.element_count + ' эл.</span>';
|
f.status = '<span class="status-ok">✓ ' + d.ELEMENT_COUNT + ' эл.</span>';
|
||||||
} else {
|
} else {
|
||||||
f.status = '<span class="status-err">✗ ' + (d.error_count > 0 ? (d.errors && d.errors[0] || 'ошибка') : 'ошибка') + '</span>';
|
f.status = '<span class="status-err">✗ ' + (d.ERROR_COUNT > 0 ? (d.ERRORS && d.ERRORS[0] || 'ошибка') : 'ошибка') + '</span>';
|
||||||
f.parseInfo = d;
|
f.parseInfo = d;
|
||||||
}
|
}
|
||||||
} catch(e) {
|
} catch(e) {
|
||||||
@@ -327,10 +327,10 @@ async function refreshSupps() {
|
|||||||
try {
|
try {
|
||||||
var resp = await fetch('/api.cfm?action=query&sql=' + encodeURIComponent("SELECT s.id, s.type, s.document_id FROM supplements s WHERE s.contract_id='" + contractId + "'"));
|
var resp = await fetch('/api.cfm?action=query&sql=' + encodeURIComponent("SELECT s.id, s.type, s.document_id FROM supplements s WHERE s.contract_id='" + contractId + "'"));
|
||||||
var data = await resp.json();
|
var data = await resp.json();
|
||||||
if (data.ok && data.rows) {
|
if (data.OK && data.ROWS) {
|
||||||
data.rows.forEach(function(r) {
|
data.ROWS.forEach(function(r) {
|
||||||
var supp = {};
|
var supp = {};
|
||||||
data.columns.forEach(function(c, ci) { supp[c] = r[ci]; });
|
data.COLUMNS.forEach(function(c, ci) { supp[c] = r[ci]; });
|
||||||
for (var i = 0; i < fileQueue.length; i++) {
|
for (var i = 0; i < fileQueue.length; i++) {
|
||||||
if (fileQueue[i].doc_id === supp.document_id) {
|
if (fileQueue[i].doc_id === supp.document_id) {
|
||||||
fileQueue[i].supp_id = supp.id;
|
fileQueue[i].supp_id = supp.id;
|
||||||
@@ -382,16 +382,16 @@ document.getElementById('llmBtn').addEventListener('click', async function() {
|
|||||||
try {
|
try {
|
||||||
var resp = await fetch('/api.cfm?action=query&sql=' + encodeURIComponent("SELECT id, type FROM supplements WHERE contract_id='" + contractId + "' ORDER BY created_at"));
|
var resp = await fetch('/api.cfm?action=query&sql=' + encodeURIComponent("SELECT id, type FROM supplements WHERE contract_id='" + contractId + "' ORDER BY created_at"));
|
||||||
var data = await resp.json();
|
var data = await resp.json();
|
||||||
if (data.ok && data.rows) {
|
if (data.OK && data.ROWS) {
|
||||||
for (var i = 0; i < data.rows.length; i++) {
|
for (var i = 0; i < data.ROWS.length; i++) {
|
||||||
try {
|
try {
|
||||||
var er = await fetch('/extractor.cfm?supplement_id=' + data.rows[i].id);
|
var er = await fetch('/extractor.cfm?supplement_id=' + data.ROWS[i].id);
|
||||||
var ed = await er.json();
|
var ed = await er.json();
|
||||||
if (ed.ok) {
|
if (ed.OK) {
|
||||||
var info = (ed.skipped ? '⏭ ' : '✓ ') + (data.rows[i].type || '') + ': ' + ed.rows_saved + ' строк';
|
var info = (ed.SKIPPED ? '⏭ ' : '✓ ') + (data.ROWS[i].type || '') + ': ' + ed.ROWS_SAVED + ' строк';
|
||||||
diffBody.innerHTML += '<div style="font-size:12px;color:' + (ed.skipped ? 'var(--muted)' : 'var(--green)') + ';">' + info + '</div>';
|
diffBody.innerHTML += '<div style="font-size:12px;color:' + (ed.SKIPPED ? 'var(--muted)' : 'var(--green)') + ';">' + info + '</div>';
|
||||||
} else {
|
} else {
|
||||||
diffBody.innerHTML += '<div style="font-size:12px;color:var(--destructive);">✗ ' + (ed.error||'') + '</div>';
|
diffBody.innerHTML += '<div style="font-size:12px;color:var(--destructive);">✗ ' + (ed.ERROR||'') + '</div>';
|
||||||
}
|
}
|
||||||
} catch(e) {}
|
} catch(e) {}
|
||||||
}
|
}
|
||||||
@@ -403,31 +403,31 @@ document.getElementById('llmBtn').addEventListener('click', async function() {
|
|||||||
try {
|
try {
|
||||||
var resp = await fetch('/differ.cfm?contract_id=' + contractId);
|
var resp = await fetch('/differ.cfm?contract_id=' + contractId);
|
||||||
var data = await resp.json();
|
var data = await resp.json();
|
||||||
if (data.ok && data.all_changes) {
|
if (data.OK && data.ALL_CHANGES) {
|
||||||
var all = data.all_changes;
|
var all = data.ALL_CHANGES;
|
||||||
diffBody.innerHTML = '';
|
diffBody.innerHTML = '';
|
||||||
all.forEach(function(ch) {
|
all.forEach(function(ch) {
|
||||||
var s = ch.summary || {};
|
var s = ch.SUMMARY || {};
|
||||||
diffBody.innerHTML += '<div style="font-weight:600;margin-top:12px;">📄 Допник (' + ch.type + ')</div>';
|
diffBody.innerHTML += '<div style="font-weight:600;margin-top:12px;">📄 Допник (' + ch.TYPE + ')</div>';
|
||||||
diffBody.innerHTML += '<div style="font-size:12px;margin-left:8px;"><span style="color:var(--green);">+' + (s.added||0) + '</span> <span style="color:#eab308;">~' + (s.changed||0) + '</span> <span style="color:var(--destructive);">-' + (s.deleted||0) + '</span></div>';
|
diffBody.innerHTML += '<div style="font-size:12px;margin-left:8px;"><span style="color:var(--green);">+' + (s.ADDED||0) + '</span> <span style="color:#eab308;">~' + (s.CHANGED||0) + '</span> <span style="color:var(--destructive);">-' + (s.DELETED||0) + '</span></div>';
|
||||||
diffStatus.textContent = 'изм:' + (s.changed||0) + ' +' + (s.added||0) + ' -' + (s.deleted||0);
|
diffStatus.textContent = 'изм:' + (s.CHANGED||0) + ' +' + (s.ADDED||0) + ' -' + (s.DELETED||0);
|
||||||
|
|
||||||
var changes = ch.changes || [];
|
var changes = ch.CHANGES || [];
|
||||||
if (changes.length === 0) {
|
if (changes.length === 0) {
|
||||||
diffBody.innerHTML += '<div style="color:var(--muted);font-size:12px;">Нет изменений</div>';
|
diffBody.innerHTML += '<div style="color:var(--muted);font-size:12px;">Нет изменений</div>';
|
||||||
} else {
|
} else {
|
||||||
var tbl = '<div class="table-wrap" style="margin-top:4px;"><table><thead><tr><th>№</th><th>Услуга</th><th>Цена</th><th>Объём</th><th>Сумма</th><th>Начало</th></tr></thead><tbody>';
|
var tbl = '<div class="table-wrap" style="margin-top:4px;"><table><thead><tr><th>№</th><th>Услуга</th><th>Цена</th><th>Объём</th><th>Сумма</th><th>Начало</th></tr></thead><tbody>';
|
||||||
changes.forEach(function(c) {
|
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 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 || {});
|
var vals = c.NEW_VALUES && Object.keys(c.NEW_VALUES).length > 0 ? c.NEW_VALUES : (c.OLD_VALUES || {});
|
||||||
tbl += '<tr class="' + cls + '"><td>' + (c.row_num||'') + '</td><td>' + (vals.name||'') + '</td><td class="num-cell">' + _dc(c,'price') + '</td><td class="num-cell">' + _dc(c,'qty') + '</td><td class="num-cell">' + _dc(c,'sum') + '</td><td>' + (vals.date_start||'') + '</td></tr>';
|
tbl += '<tr class="' + cls + '"><td>' + (c.ROW_NUM||'') + '</td><td>' + (vals.NAME||'') + '</td><td class="num-cell">' + _dc(c,'PRICE') + '</td><td class="num-cell">' + _dc(c,'QTY') + '</td><td class="num-cell">' + _dc(c,'SUM') + '</td><td>' + (vals.DATE_START||'') + '</td></tr>';
|
||||||
});
|
});
|
||||||
tbl += '</tbody></table></div>';
|
tbl += '</tbody></table></div>';
|
||||||
diffBody.innerHTML += tbl;
|
diffBody.innerHTML += tbl;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
diffBody.innerHTML += '<div style="color:var(--destructive);">✗ ' + (data.error||'') + '</div>';
|
diffBody.innerHTML += '<div style="color:var(--destructive);">✗ ' + (data.ERROR||'') + '</div>';
|
||||||
}
|
}
|
||||||
} catch(e) { diffBody.innerHTML += '<div style="color:var(--destructive);">✗ ' + e.message + '</div>'; }
|
} catch(e) { diffBody.innerHTML += '<div style="color:var(--destructive);">✗ ' + e.message + '</div>'; }
|
||||||
|
|
||||||
@@ -440,12 +440,12 @@ document.getElementById('llmBtn').addEventListener('click', async function() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
function _dc(c, field) {
|
function _dc(c, field) {
|
||||||
if (c.change_type === 'changed' && c.old_values && c.new_values) {
|
if (c.CHANGE_TYPE === 'changed' && c.OLD_VALUES && c.NEW_VALUES) {
|
||||||
var ov = (c.old_values||{})[field], nv = (c.new_values||{})[field];
|
var ov = (c.OLD_VALUES||{})[field], nv = (c.NEW_VALUES||{})[field];
|
||||||
if (ov !== nv && ov !== undefined)
|
if (ov !== nv && ov !== undefined)
|
||||||
return '<span class="diff-field-old">' + (ov||'—') + '</span> → <span class="diff-field-new">' + (nv||'—') + '</span>';
|
return '<span class="diff-field-old">' + (ov||'—') + '</span> → <span class="diff-field-new">' + (nv||'—') + '</span>';
|
||||||
}
|
}
|
||||||
var v = ((c.new_values || c.old_values || {})[field]);
|
var v = ((c.NEW_VALUES || c.OLD_VALUES || {})[field]);
|
||||||
return v != null ? v : '—';
|
return v != null ? v : '—';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user