// 成品入库管理
(() => {
let receiptList = [];
let outsourcingOrders = [];
let currentPage = 1;
const pageSize = 20;
Router.register('/outsourcing-mgmt/finished-goods-receipt', async () => {
const html = `
`;
setTimeout(() => {
document.getElementById('add-receipt-btn')?.addEventListener('click', () => openModal());
document.getElementById('search-keyword')?.addEventListener('keypress', (e) => {
if (e.key === 'Enter') search();
});
document.getElementById('receipt-qty')?.addEventListener('input', () => updateConsumptionPreview());
const today = new Date().toISOString().split('T')[0];
const dateInput = document.getElementById('receipt-date');
if (dateInput) dateInput.value = today;
loadList();
loadOutsourcingOrders();
}, 0);
return html;
});
async function loadList() {
try {
const res = await API.get('/api/finished-goods-receipt');
receiptList = res.list || [];
renderList();
} catch (e) {
console.error('加载入库列表失败:', e);
document.getElementById('receipt-list').innerHTML = '| 加载失败 |
';
}
}
async function loadOutsourcingOrders() {
try {
const res = await API.get('/api/outsourcing-orders');
outsourcingOrders = res.list || [];
const select = document.getElementById('outsourcing-order-no');
if (select) {
select.innerHTML = '' +
outsourcingOrders.map(o => ``).join('');
}
} catch (e) {
console.error('加载委外工单失败:', e);
}
}
let currentOrderMaterials = [];
async function loadOrderInfo() {
const orderNo = document.getElementById('outsourcing-order-no').value;
if (!orderNo) {
document.getElementById('order-info').style.display = 'none';
document.getElementById('consumption-preview').style.display = 'none';
currentOrderMaterials = [];
return;
}
try {
const order = outsourcingOrders.find(o => o.order_no === orderNo);
if (!order) return;
document.getElementById('info-product-code').textContent = order.product_code || '';
document.getElementById('info-product-name').textContent = order.product_name || '';
document.getElementById('info-production-qty').textContent = order.production_qty || 0;
document.getElementById('info-factory').textContent = order.outsourcing_factory || '';
document.getElementById('order-info').style.display = 'block';
const res = await API.get(`/api/outsourcing-orders/${order.id}`);
currentOrderMaterials = res.materials || [];
updateConsumptionPreview();
} catch (e) {
console.error('加载工单信息失败:', e);
alert('加载工单信息失败');
}
}
function updateConsumptionPreview() {
const receiptQty = parseInt(document.getElementById('receipt-qty')?.value) || 0;
if (receiptQty <= 0 || currentOrderMaterials.length === 0) {
document.getElementById('consumption-preview').style.display = 'none';
return;
}
document.getElementById('consumption-preview').style.display = 'block';
document.getElementById('consumption-list').innerHTML = currentOrderMaterials.map(m => {
const consumedQty = Math.ceil(m.bom_unit_qty * receiptQty);
return `
| ${escapeHtml(m.material_code)} |
${escapeHtml(m.material_name)} |
${m.bom_unit_qty} |
${consumedQty} |
${escapeHtml(m.unit)} |
`;
}).join('');
}
function renderList() {
const tbody = document.getElementById('receipt-list');
const keyword = (document.getElementById('search-keyword')?.value || '').toLowerCase();
let filtered = receiptList;
if (keyword) {
filtered = receiptList.filter(item =>
(item.receipt_no || '').toLowerCase().includes(keyword) ||
(item.outsourcing_order_no || '').toLowerCase().includes(keyword) ||
(item.product_code || '').toLowerCase().includes(keyword) ||
(item.product_name || '').toLowerCase().includes(keyword)
);
}
const totalPages = Math.ceil(filtered.length / pageSize);
const start = (currentPage - 1) * pageSize;
const pageData = filtered.slice(start, start + pageSize);
if (pageData.length === 0) {
tbody.innerHTML = '| 暂无数据 |
';
} else {
tbody.innerHTML = pageData.map(item => `
| ${escapeHtml(item.receipt_no || '')} |
${escapeHtml(item.outsourcing_order_no || '')} |
${escapeHtml(item.product_code || '')} |
${escapeHtml(item.product_name || '')} |
${item.receipt_qty || 0} |
${escapeHtml(item.receipt_date || '')} |
${escapeHtml(item.created_by || '')} |
${formatTime(item.created_at)} |
`).join('');
}
renderPagination(totalPages);
}
function renderPagination(totalPages) {
const container = document.getElementById('pagination');
if (totalPages <= 1) {
container.innerHTML = '';
return;
}
let html = '';
html += ``;
html += `第 ${currentPage} / ${totalPages} 页`;
html += ``;
container.innerHTML = html;
}
function openModal() {
document.getElementById('outsourcing-order-no').value = '';
document.getElementById('receipt-qty').value = 1;
const today = new Date().toISOString().split('T')[0];
document.getElementById('receipt-date').value = today;
document.getElementById('order-info').style.display = 'none';
document.getElementById('consumption-preview').style.display = 'none';
currentOrderMaterials = [];
document.getElementById('receipt-modal').style.display = 'flex';
}
function closeModal() {
document.getElementById('receipt-modal').style.display = 'none';
}
async function save() {
const outsourcing_order_no = document.getElementById('outsourcing-order-no').value.trim();
const receipt_qty = parseInt(document.getElementById('receipt-qty').value) || 0;
const receipt_date = document.getElementById('receipt-date').value.trim();
if (!outsourcing_order_no || !receipt_date) {
alert('请填写所有必填字段');
return;
}
if (receipt_qty <= 0) {
alert('入库数量必须大于0');
return;
}
try {
const res = await API.post('/api/finished-goods-receipt', {
outsourcing_order_no,
receipt_qty,
receipt_date
});
let message = `入库成功,入库单号:${res.receipt_no}`;
if (res.material_consumption && res.material_consumption.length > 0) {
message += '\n\n物料消耗明细:';
res.material_consumption.forEach(m => {
message += `\n${m.material_name}: ${m.consumed_qty}`;
});
}
alert(message);
closeModal();
loadList();
} catch (e) {
alert(e.message || '入库失败');
}
}
function search() {
currentPage = 1;
renderList();
}
function resetSearch() {
document.getElementById('search-keyword').value = '';
currentPage = 1;
renderList();
}
function goPage(page) {
currentPage = page;
renderList();
}
function formatTime(ts) {
if (!ts) return '-';
try {
const d = new Date(ts);
return d.toLocaleString('zh-CN', { hour12: false });
} catch {
return ts;
}
}
function escapeHtml(str) {
if (!str) return '';
return String(str).replace(/&/g, '&').replace(//g, '>').replace(/"/g, '"');
}
window.FinishedGoodsReceipt = {
search,
resetSearch,
closeModal,
save,
goPage,
loadOrderInfo
};
})();