// 成品入库管理 (() => { 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 }; })();