feat: ZIP-подтверждение + статусы duplicate/warning + сводка батча
This commit is contained in:
+4
-1
@@ -180,7 +180,10 @@ async function runClassify() {
|
|||||||
clearInterval(timer);
|
clearInterval(timer);
|
||||||
clearInterval(pollTimer);
|
clearInterval(pollTimer);
|
||||||
classifyDone = true;
|
classifyDone = true;
|
||||||
btn.innerHTML = '✓ ' + data.done + '/' + data.total + ' классифицировано (' + Math.round((Date.now() - start) / 1000) + 'с)';
|
var summary = data.summary || (data.done + '/' + data.total + ' классифицировано');
|
||||||
|
if (data.garbage) summary += ' | 🗑️ ' + data.garbage + ' мусор';
|
||||||
|
if (data.types) summary += ' | ' + Object.entries(data.types).map(function(e){return e[1]+'×'+e[0];}).join(', ');
|
||||||
|
btn.innerHTML = '✓ ' + summary + ' (' + Math.round((Date.now() - start) / 1000) + 'с)';
|
||||||
stepDone('stepClassify');
|
stepDone('stepClassify');
|
||||||
stepActive('stepGroups');
|
stepActive('stepGroups');
|
||||||
loadGroupsAction();
|
loadGroupsAction();
|
||||||
|
|||||||
+28
-2
@@ -35,7 +35,10 @@ function statusToHTML(st) {
|
|||||||
case 'unzipping': return '⏳ распаковка...';
|
case 'unzipping': return '⏳ распаковка...';
|
||||||
case 'parsing': return '⏳ парсинг...';
|
case 'parsing': return '⏳ парсинг...';
|
||||||
case 'parsed': return '<span class="status-ok">✓ ' + (st.count || 0) + ' эл.' + (st.elapsed ? ' (' + st.elapsed + 'с)' : '') + '</span>';
|
case 'parsed': return '<span class="status-ok">✓ ' + (st.count || 0) + ' эл.' + (st.elapsed ? ' (' + st.elapsed + 'с)' : '') + '</span>';
|
||||||
case 'error': return '<span class="status-err">✗ ' + (st.text || 'Неизвестная ошибка') + '</span>';
|
case 'error': return '<span class="status-err">✗ ' + escHtml(st.text || 'Неизвестная ошибка') + '</span>';
|
||||||
|
case 'duplicate': return '<span style="color:var(--muted);">⤿ дубликат</span>';
|
||||||
|
case 'warning': return '<span style="color:#eab308;">⚠ ' + escHtml(st.text || 'пустой') + '</span>';
|
||||||
|
case 'no_format': return '<span class="status-err">✗ формат не поддерживается</span>';
|
||||||
default: return '';
|
default: return '';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -367,6 +370,16 @@ async function addZipFile(file) {
|
|||||||
});
|
});
|
||||||
if (!zipResp.ok || !zipResp.files) throw new Error('unzip failed');
|
if (!zipResp.ok || !zipResp.files) throw new Error('unzip failed');
|
||||||
|
|
||||||
|
// Подтверждение: показать список файлов перед загрузкой
|
||||||
|
var fileList = zipResp.files.map(function(f) { return ' • ' + f.filename + ' (' + (f.size/1024).toFixed(1) + ' KB)'; }).join('\n');
|
||||||
|
if (!confirm('Архив «' + file.name + '» — ' + total + ' файлов:\n\n' + fileList + '\n\nЗагрузить эти файлы?')) {
|
||||||
|
// Отмена — убрать строку ZIP
|
||||||
|
var zipPos2 = state.files.indexOf(zipEntry);
|
||||||
|
if (zipPos2 >= 0) state.files.splice(zipPos2, 1);
|
||||||
|
render(state);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// Шаг 2: обработать каждый файл из архива
|
// Шаг 2: обработать каждый файл из архива
|
||||||
// Временная строка ZIP остаётся в таблице — обновляем её статус
|
// Временная строка ZIP остаётся в таблице — обновляем её статус
|
||||||
var total = zipResp.files.length;
|
var total = zipResp.files.length;
|
||||||
@@ -443,7 +456,20 @@ async function addRegularFile(file, zipSource) {
|
|||||||
// Бэкенд возвращает doc_id и contract_id (нижний регистр — Python keys)
|
// Бэкенд возвращает doc_id и contract_id (нижний регистр — Python keys)
|
||||||
if (resp && resp.contract_id) state.contractId = resp.contract_id;
|
if (resp && resp.contract_id) state.contractId = resp.contract_id;
|
||||||
state.files[rowIdx].doc_id = resp.doc_id;
|
state.files[rowIdx].doc_id = resp.doc_id;
|
||||||
state.files[rowIdx].status = { kind: 'uploaded' };
|
|
||||||
|
// Дубликат?
|
||||||
|
if (resp && resp.duplicate_of) {
|
||||||
|
state.files[rowIdx].status = { kind: 'duplicate' };
|
||||||
|
render(state);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Warning от парсинга?
|
||||||
|
if (resp && resp.warning) {
|
||||||
|
state.files[rowIdx].status = { kind: 'warning', text: resp.warning };
|
||||||
|
render(state);
|
||||||
|
} else {
|
||||||
|
state.files[rowIdx].status = { kind: 'uploaded' };
|
||||||
|
}
|
||||||
state.files[rowIdx].uploaded = true;
|
state.files[rowIdx].uploaded = true;
|
||||||
|
|
||||||
// Авто-парсинг: бэкенд парсит всё (PDF + DOCX + DOC)
|
// Авто-парсинг: бэкенд парсит всё (PDF + DOCX + DOC)
|
||||||
|
|||||||
Reference in New Issue
Block a user