(() => {
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('确认失败,请稍后重试');
}
}
};
})();