106 lines
3.7 KiB
JavaScript
106 lines
3.7 KiB
JavaScript
/* ============================================================
|
|
page-vendor-import.js — vendor_stockout Excel 匯入流程
|
|
============================================================ */
|
|
(function () {
|
|
const dropzone = document.getElementById('stockoutDropzone');
|
|
if (!dropzone) return;
|
|
|
|
const fileInput = document.getElementById('stockoutFileInput');
|
|
const filePanel = document.getElementById('stockoutFilePanel');
|
|
const fileName = document.getElementById('stockoutFileName');
|
|
const fileSize = document.getElementById('stockoutFileSize');
|
|
const uploadButton = document.getElementById('stockoutUploadButton');
|
|
const progressPanel = document.getElementById('stockoutProgressPanel');
|
|
const resultPanel = document.getElementById('stockoutResultPanel');
|
|
const errorPanel = document.getElementById('stockoutErrorPanel');
|
|
const errorMessage = document.getElementById('stockoutErrorMessage');
|
|
const importAgainButton = document.getElementById('stockoutImportAgainButton');
|
|
let selectedFile = null;
|
|
|
|
const show = (panel) => panel.classList.add('is-visible');
|
|
const hide = (panel) => panel.classList.remove('is-visible');
|
|
|
|
function resetTransientPanels() {
|
|
hide(progressPanel);
|
|
hide(resultPanel);
|
|
hide(errorPanel);
|
|
}
|
|
|
|
function formatFileSize(bytes) {
|
|
if (bytes < 1024) return bytes + ' B';
|
|
if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(1) + ' KB';
|
|
return (bytes / (1024 * 1024)).toFixed(1) + ' MB';
|
|
}
|
|
|
|
function handleFile(file) {
|
|
if (!file) return;
|
|
if (!file.name.match(/\.(xlsx|xls)$/i)) {
|
|
errorMessage.textContent = '先選擇供應商缺貨 Excel 檔。';
|
|
show(errorPanel);
|
|
return;
|
|
}
|
|
selectedFile = file;
|
|
fileName.textContent = file.name;
|
|
fileSize.textContent = formatFileSize(file.size);
|
|
resetTransientPanels();
|
|
show(filePanel);
|
|
}
|
|
|
|
dropzone.addEventListener('click', () => fileInput.click());
|
|
fileInput.addEventListener('change', (e) => handleFile(e.target.files[0]));
|
|
|
|
dropzone.addEventListener('dragover', (e) => {
|
|
e.preventDefault();
|
|
dropzone.classList.add('is-dragover');
|
|
});
|
|
dropzone.addEventListener('dragleave', () => dropzone.classList.remove('is-dragover'));
|
|
dropzone.addEventListener('drop', (e) => {
|
|
e.preventDefault();
|
|
dropzone.classList.remove('is-dragover');
|
|
handleFile(e.dataTransfer.files[0]);
|
|
});
|
|
|
|
uploadButton.addEventListener('click', async () => {
|
|
if (!selectedFile) return;
|
|
|
|
const formData = new FormData();
|
|
formData.append('file', selectedFile);
|
|
hide(filePanel);
|
|
hide(resultPanel);
|
|
hide(errorPanel);
|
|
show(progressPanel);
|
|
|
|
try {
|
|
const response = await fetchWithCSRF('/vendor-stockout/api/import/excel', {
|
|
method: 'POST',
|
|
body: formData
|
|
});
|
|
const result = await response.json();
|
|
hide(progressPanel);
|
|
|
|
if (result.success) {
|
|
document.getElementById('stockoutTotalCount').textContent = result.data.total_count;
|
|
document.getElementById('stockoutSuccessCount').textContent = result.data.success_count;
|
|
document.getElementById('stockoutDuplicateCount').textContent = result.data.duplicate_count;
|
|
document.getElementById('stockoutFailedCount').textContent = result.data.failed_count;
|
|
document.getElementById('stockoutBatchId').textContent = result.data.batch_id;
|
|
show(resultPanel);
|
|
} else {
|
|
errorMessage.textContent = result.message || '匯入失敗';
|
|
show(errorPanel);
|
|
}
|
|
} catch (error) {
|
|
hide(progressPanel);
|
|
errorMessage.textContent = '網路錯誤:' + error.message;
|
|
show(errorPanel);
|
|
}
|
|
});
|
|
|
|
importAgainButton.addEventListener('click', () => {
|
|
selectedFile = null;
|
|
fileInput.value = '';
|
|
hide(filePanel);
|
|
resetTransientPanels();
|
|
});
|
|
})();
|