v1.0.171: detailed SSE results for group compare
This commit is contained in:
+40
-4
@@ -336,15 +336,51 @@ window.runCompareForGroup = async function(gi) {
|
||||
}, 200);
|
||||
|
||||
var es = new EventSource(VM_API + '/process-v2?contract_id=' + cid);
|
||||
var sections = {};
|
||||
es.onmessage = function(e) {
|
||||
var d = JSON.parse(e.data);
|
||||
if (d.type === 'done') {
|
||||
|
||||
if (d.type === 'extract_start') {
|
||||
var sec = document.createElement('div');
|
||||
sec.style.cssText = 'margin-top:8px;border:1px solid var(--brand-gray);border-radius:6px;overflow:hidden;';
|
||||
sec.innerHTML = '<div class="diff-section-header" style="padding:8px 12px;background:var(--brand-grey-light);cursor:pointer;font-size:13px;font-weight:600;">⏳ ' + d.filename + '</div><div class="diff-section-body" style="display:none;padding:8px 12px;"></div>';
|
||||
sec.querySelector('.diff-section-header').addEventListener('click', function() {
|
||||
var body = sec.querySelector('.diff-section-body');
|
||||
body.style.display = body.style.display === 'none' ? 'block' : 'none';
|
||||
});
|
||||
diffBody.appendChild(sec);
|
||||
sections[d.supplement_id] = sec;
|
||||
}
|
||||
else if (d.type === 'llm_done') {
|
||||
var sec = sections[d.supplement_id];
|
||||
if (sec) {
|
||||
sec.querySelector('.diff-section-header').innerHTML = '✓ ' + d.filename + ' — ' + d.ops_count + ' оп., ' + d.mode + ' (' + d.time_s + 'с)';
|
||||
sec.querySelector('.diff-section-header').style.color = 'var(--green)';
|
||||
}
|
||||
}
|
||||
else if (d.type === 'applied') {
|
||||
var sec = sections[d.supplement_id];
|
||||
if (sec && d.ops && d.ops.length > 0) {
|
||||
var s = d.summary || {};
|
||||
var body = sec.querySelector('.diff-section-body');
|
||||
var html = '<div style="font-size:12px;margin-bottom:6px;">+' + (s.added||0) + ' ~' + (s.updated||0) + ' -' + (s.deleted||0) + '</div>';
|
||||
html += '<div class="table-wrap"><table style="font-size:11px;"><thead><tr><th>Действие</th><th>Услуга</th><th>Цена</th><th>Кол-во</th><th>Сумма</th><th>Дата</th></tr></thead><tbody>';
|
||||
d.ops.forEach(function(op) {
|
||||
var cls = op.action === 'ADD' ? 'diff-added' : op.action === 'DELETE' ? 'diff-deleted' : 'diff-changed';
|
||||
var nr = op.new_row || {};
|
||||
html += '<tr class="' + cls + '"><td>' + op.action + '</td><td>' + (nr.name||'') + '</td><td class="num-cell">' + (nr.price!=null?nr.price:'') + '</td><td class="num-cell">' + (nr.qty!=null?nr.qty:'') + '</td><td class="num-cell">' + (nr.sum!=null?nr.sum:'') + '</td><td>' + (nr.date_start||'') + '</td></tr>';
|
||||
});
|
||||
html += '</tbody></table></div>';
|
||||
body.innerHTML = html;
|
||||
body.style.display = 'block';
|
||||
}
|
||||
}
|
||||
else if (d.type === 'done') {
|
||||
clearInterval(timer); es.close();
|
||||
diffStatus.textContent = '✓ ' + d.total_time_s + 'с';
|
||||
btn.innerHTML = '✓ Готово'; btn.disabled = false;
|
||||
} else if (d.type === 'applied') {
|
||||
diffBody.innerHTML += '<div style="font-size:12px;margin-top:4px;">+' + (d.summary.added||0) + ' ~' + (d.summary.updated||0) + ' -' + (d.summary.deleted||0) + '</div>';
|
||||
} else if (d.type === 'error') {
|
||||
}
|
||||
else if (d.type === 'error') {
|
||||
clearInterval(timer); es.close();
|
||||
diffBody.innerHTML += '<div style="color:var(--destructive);">✗ ' + d.message + '</div>';
|
||||
btn.innerHTML = '✗'; btn.disabled = false;
|
||||
|
||||
Reference in New Issue
Block a user