// 客户订单管理
(() => {
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 => `