(() => { async function render() { return `
工厂/项目名称 工单/订单号 产品型号 订单数量 订单生产开始时间 订单生产结束时间 当前状态 备注 操作
暂无数据
`; } Router.register('/production-mgmt/work-order', async () => { const html = await render(); setTimeout(async () => { // 等待DOM完全渲染 await new Promise(resolve => setTimeout(resolve, 50)); await initPage(); }, 0); return html; }); // 监听路由变化,离开工单页面时清理定时器 let lastPath = ''; window.addEventListener('hashchange', () => { const currentPath = location.hash.replace('#', ''); if (lastPath === '/production-mgmt/work-order' && currentPath !== '/production-mgmt/work-order') { stopAutoRefresh(); } lastPath = currentPath; }); let currentPage = 1; let totalPages = 1; let workOrders = []; let currentUser = null; let refreshInterval = null; async function initPage() { // 获取当前用户信息 try { currentUser = await API.me(); } catch (error) { console.error('获取用户信息失败:', error); } // 根据用户角色显示/隐藏添加按钮 const addBtn = document.getElementById('add-work-order-btn'); if (addBtn && currentUser?.role !== 'superadmin') { addBtn.style.display = 'none'; } initEventListeners(); loadWorkOrders(); // 启动自动刷新(每10秒刷新一次) startAutoRefresh(); } function startAutoRefresh() { // 清除已存在的定时器 if (refreshInterval) { clearInterval(refreshInterval); } // 每10秒自动刷新一次工单列表 refreshInterval = setInterval(() => { loadWorkOrders(); }, 10000); } function stopAutoRefresh() { if (refreshInterval) { clearInterval(refreshInterval); refreshInterval = null; } } function initEventListeners() { const searchBtn = document.getElementById('search-btn'); const resetBtn = document.getElementById('reset-btn'); const prevBtn = document.getElementById('prev-page'); const nextBtn = document.getElementById('next-page'); const addBtn = document.getElementById('add-work-order-btn'); const modal = document.getElementById('work-order-modal'); const closeModal = document.getElementById('close-modal'); const cancelModal = document.getElementById('cancel-modal'); const saveBtn = document.getElementById('save-work-order'); searchBtn?.addEventListener('click', () => { currentPage = 1; loadWorkOrders(); }); resetBtn?.addEventListener('click', () => { document.getElementById('factory-filter').value = ''; document.getElementById('order-filter').value = ''; document.getElementById('model-filter').value = ''; document.getElementById('date-filter').value = ''; currentPage = 1; loadWorkOrders(); }); prevBtn?.addEventListener('click', () => { if (currentPage > 1) { currentPage--; loadWorkOrders(); } }); nextBtn?.addEventListener('click', () => { if (currentPage < totalPages) { currentPage++; loadWorkOrders(); } }); // 添加工单按钮 addBtn?.addEventListener('click', () => { openModal(); }); // 关闭弹窗 closeModal?.addEventListener('click', () => { closeModalWindow(); }); cancelModal?.addEventListener('click', () => { closeModalWindow(); }); // 点击弹窗外部关闭 modal?.addEventListener('click', (e) => { if (e.target === modal) { closeModalWindow(); } }); // 保存工单 saveBtn?.addEventListener('click', () => { saveWorkOrder(); }); } async function loadWorkOrders() { const tbody = document.getElementById('work-order-tbody'); const pageInfo = document.getElementById('page-info'); const prevBtn = document.getElementById('prev-page'); const nextBtn = document.getElementById('next-page'); // 检查DOM元素是否存在 if (!tbody || !pageInfo || !prevBtn || !nextBtn) { console.warn('工单页面DOM元素未就绪,跳过加载'); return; } // 获取筛选条件 const factory = document.getElementById('factory-filter')?.value || ''; const order = document.getElementById('order-filter')?.value || ''; const model = document.getElementById('model-filter')?.value || ''; const date = document.getElementById('date-filter')?.value || ''; try { // 调用后端API获取数据 const params = new URLSearchParams(); if (factory) params.append('factory', factory); if (order) params.append('order', order); if (date) params.append('date', date); const response = await fetch(`/api/work-orders?${params.toString()}`, { method: 'GET', headers: { 'Content-Type': 'application/json' } }); const result = await response.json(); if (result.ok) { workOrders = result.data || []; totalPages = 1; } else { throw new Error(result.error || '加载失败'); } const isSuperAdmin = currentUser?.role === 'superadmin'; const isAdmin = currentUser?.role === 'admin' || isSuperAdmin; const colspanCount = isSuperAdmin ? 9 : (isAdmin ? 9 : 8); if (workOrders.length === 0) { tbody.innerHTML = `暂无数据`; } else { tbody.innerHTML = workOrders.map(order => { const statusClass = order.status === 'confirmed' ? 'status-confirmed' : 'status-issued'; const statusText = order.statusText || '已下发'; const isConfirmed = order.status === 'confirmed'; // 格式化日期时间,去掉 T const formatDateTime = (dateTime) => { if (!dateTime || dateTime === '-') return '-'; return dateTime.replace('T', ' '); }; return ` ${order.factory} ${order.orderNo} ${order.productModel || '-'} ${order.orderQty} ${formatDateTime(order.productionStartTime)} ${formatDateTime(order.productionEndTime)} ${statusText} ${order.remark || '-'} ${isSuperAdmin ? ` ` : isAdmin ? ` ${!isConfirmed ? `` : '已确认'} ` : ''} `; }).join(''); } // 根据用户角色显示/隐藏操作列表头 const thead = document.querySelector('.data-table thead tr'); const operationTh = thead?.querySelector('th:last-child'); if (operationTh) { operationTh.style.display = (isSuperAdmin || isAdmin) ? '' : 'none'; } // 更新分页信息 pageInfo.textContent = `第 ${currentPage} 页 / 共 ${totalPages} 页`; prevBtn.disabled = currentPage <= 1; nextBtn.disabled = currentPage >= totalPages; } catch (error) { console.error('加载工单数据失败:', error); API.toast('加载数据失败,请稍后重试'); const isSuperAdmin = currentUser?.role === 'superadmin'; const isAdmin = currentUser?.role === 'admin' || isSuperAdmin; const colspanCount = isSuperAdmin ? 9 : (isAdmin ? 9 : 8); tbody.innerHTML = `加载失败`; } } // 打开弹窗 function openModal(order = null) { const modal = document.getElementById('work-order-modal'); const modalTitle = document.getElementById('modal-title'); const form = document.getElementById('work-order-form'); const factoryInput = document.getElementById('form-factory'); form.reset(); if (order) { // 编辑模式 modalTitle.textContent = '编辑工单'; document.getElementById('form-order-id').value = order.id; factoryInput.value = order.factory; document.getElementById('form-order-no').value = order.orderNo; document.getElementById('form-product-model').value = order.productModel || ''; document.getElementById('form-order-qty').value = order.orderQty; document.getElementById('form-start-time').value = order.productionStartTime || ''; document.getElementById('form-end-time').value = order.productionEndTime || ''; document.getElementById('form-remark').value = order.remark || ''; } else { // 添加模式 modalTitle.textContent = '添加工单'; document.getElementById('form-order-id').value = ''; // 如果是管理员,自动填充工厂并设为只读 if (currentUser && currentUser.role === 'admin' && currentUser.factory) { factoryInput.value = currentUser.factory; factoryInput.readOnly = true; factoryInput.style.backgroundColor = 'var(--surface)'; factoryInput.style.cursor = 'not-allowed'; } else { factoryInput.readOnly = false; factoryInput.style.backgroundColor = ''; factoryInput.style.cursor = ''; } } modal.style.display = 'flex'; } // 关闭弹窗 function closeModalWindow() { const modal = document.getElementById('work-order-modal'); modal.style.display = 'none'; } // 保存工单 async function saveWorkOrder() { const orderId = document.getElementById('form-order-id').value; const factory = document.getElementById('form-factory').value.trim(); const orderNo = document.getElementById('form-order-no').value.trim(); const productModel = document.getElementById('form-product-model').value.trim(); const orderQty = document.getElementById('form-order-qty').value; const startTime = document.getElementById('form-start-time').value; const endTime = document.getElementById('form-end-time').value; const remark = document.getElementById('form-remark').value.trim(); // 验证必填项 if (!factory || !orderNo || !orderQty) { API.toast('请填写所有必填项'); return; } const data = { factory, orderNo, productModel, orderQty: parseInt(orderQty), productionStartTime: startTime, productionEndTime: endTime, remark }; try { let response; if (orderId) { // 编辑 - 更新现有工单 response = await fetch(`/api/work-orders/${orderId}`, { method: 'PUT', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data) }); } else { // 添加 - 新增工单 response = await fetch('/api/work-orders', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(data) }); } const result = await response.json(); if (result.ok) { API.toast(result.message || (orderId ? '工单更新成功' : '工单添加成功')); closeModalWindow(); // 确保数据保存后再刷新列表 await loadWorkOrders(); } else { API.toast(result.error || '保存失败'); } } catch (error) { console.error('保存工单失败:', error); API.toast('保存失败,请稍后重试'); } } // 暴露全局函数供按钮调用 window.editWorkOrderById = function(id) { const order = workOrders.find(o => o.id === id); if (order) { openModal(order); } }; window.deleteWorkOrder = async function(id) { if (confirm('确定要删除这条工单吗?')) { try { const response = await fetch(`/api/work-orders/${id}`, { method: 'DELETE', headers: { 'Content-Type': 'application/json' } }); const result = await response.json(); if (result.ok) { API.toast(result.message || '工单删除成功'); await loadWorkOrders(); } else { API.toast(result.error || '删除失败'); } } catch (error) { console.error('删除工单失败:', error); API.toast('删除失败,请稍后重试'); } } }; window.confirmWorkOrder = async function(id) { if (confirm('确定要确认这条工单吗?')) { try { const response = await fetch(`/api/work-orders/${id}/confirm`, { method: 'POST', headers: { 'Content-Type': 'application/json' } }); const result = await response.json(); if (result.ok) { API.toast(result.message || '工单确认成功'); await loadWorkOrders(); } else { API.toast(result.error || '确认失败'); } } catch (error) { console.error('确认工单失败:', error); API.toast('确认失败,请稍后重试'); } } }; })();