// 客户订单管理 (() => { Router.register('/plan-mgmt/customer-order', async () => { // 先返回 HTML const html = `
下单时间 订单编号 客户名称 物料 订单数量 已发货 未交订单 单价 操作
加载中...
`; // DOM 渲染后初始化 setTimeout(() => { const addBtn = document.getElementById('add-order-btn'); if (addBtn) { addBtn.addEventListener('click', () => { openModal(); }); } const refreshBtn = document.getElementById('refresh-undelivered-btn'); if (refreshBtn) { refreshBtn.addEventListener('click', async () => { refreshBtn.disabled = true; refreshBtn.innerHTML = '刷新中...'; await loadOrders(); refreshBtn.disabled = false; refreshBtn.innerHTML = '刷新未交订单'; API.toast('未交订单数据已更新', 'success'); }); } // 物料筛选功能 const filterInput = document.getElementById('material-filter'); const clearFilterBtn = document.getElementById('clear-filter-btn'); if (filterInput) { filterInput.addEventListener('input', (e) => { filterOrders(e.target.value); }); } if (clearFilterBtn) { clearFilterBtn.addEventListener('click', () => { if (filterInput) { filterInput.value = ''; filterOrders(''); } }); } loadOrders(); }, 100); return html; }); async function loadOrders() { try { console.log('开始加载订单列表...'); const res = await fetch('/api/customer-orders'); console.log('API响应状态:', res.status); const data = await res.json(); console.log('订单数据:', data); const tbody = document.getElementById('order-list'); if (!tbody) { console.error('找不到 order-list 元素'); return; } if (!data.list || data.list.length === 0) { tbody.innerHTML = '暂无数据'; return; } tbody.innerHTML = data.list.map(order => { const undeliveredQty = order.undelivered_qty || 0; const shippedQty = order.shipped_qty || 0; const isManual = order.manual_undelivered_qty !== null && order.manual_undelivered_qty !== undefined; const undeliveredStyle = undeliveredQty > 0 ? 'color: #f59e0b; font-weight: 700;' : 'color: #10b981;'; const manualIcon = isManual ? '✏️' : ''; return ` ${order.order_date || '—'} ${order.order_no || '—'} ${order.customer_name || '—'} ${order.material || '—'} ${order.quantity || 0} ${shippedQty} ${undeliveredQty}${manualIcon} ${order.unit_price || 0} `}).join(''); // 应用当前筛选(如果有) const filterInput = document.getElementById('material-filter'); if (filterInput && filterInput.value) { filterOrders(filterInput.value); } console.log('订单列表加载完成'); } catch (err) { console.error('加载订单失败:', err); const tbody = document.getElementById('order-list'); if (tbody) { tbody.innerHTML = '加载失败,请刷新重试'; } API.toast('加载订单失败', 'error'); } } function filterOrders(keyword) { const tbody = document.getElementById('order-list'); if (!tbody) return; const rows = tbody.querySelectorAll('tr'); const filterText = keyword.toLowerCase().trim(); let visibleCount = 0; rows.forEach(row => { // 跳过空数据行 if (row.querySelector('.text-center')) { return; } const material = (row.getAttribute('data-material') || '').toLowerCase(); if (!filterText || material.includes(filterText)) { row.classList.remove('filtered-row'); visibleCount++; } else { row.classList.add('filtered-row'); } }); // 如果没有匹配结果,显示提示 if (visibleCount === 0 && filterText) { const existingMsg = tbody.querySelector('.no-filter-results'); if (!existingMsg) { const msgRow = document.createElement('tr'); msgRow.className = 'no-filter-results'; msgRow.innerHTML = '没有匹配的物料'; tbody.appendChild(msgRow); } } else { const msgRow = tbody.querySelector('.no-filter-results'); if (msgRow) { msgRow.remove(); } } } let materialRowIndex = 0; let productList = []; // 缓存BOM产品列表 async function loadProductList() { try { const res = await fetch('/api/bom/products'); const data = await res.json(); productList = (data.list || []).map(p => p.product_name).filter(Boolean); // 同时从已有订单中提取物料名称(去重) const orderRes = await fetch('/api/customer-orders'); const orderData = await orderRes.json(); if (orderData.list) { for (const o of orderData.list) { if (o.material && !productList.includes(o.material)) { productList.push(o.material); } } } } catch (e) { console.error('加载产品列表失败:', e); } } function buildMaterialOptions() { return productList.map(name => `