/** * 工单管理页面组件 */ export default class WorkOrders { constructor(container, route) { this.container = container; this.route = route; this.currentPage = 1; this.perPage = 20; this.currentStatus = 'all'; this.searchQuery = ''; this.init(); } async init() { try { this.render(); this.bindEvents(); await this.loadWorkOrders(); } catch (error) { console.error('WorkOrders init error:', error); this.showError(error); } } render() { this.container.innerHTML = `
工单列表
共 0 个工单
ID 标题 类别 优先级 状态 创建时间 操作
加载中...
`; } bindEvents() { // 状态筛选 document.getElementById('status-filter').addEventListener('change', () => { this.currentStatus = document.getElementById('status-filter').value; this.currentPage = 1; this.loadWorkOrders(); }); // 搜索 document.getElementById('search-btn').addEventListener('click', () => { this.searchQuery = document.getElementById('search-input').value.trim(); this.currentPage = 1; this.loadWorkOrders(); }); document.getElementById('search-input').addEventListener('keypress', (e) => { if (e.key === 'Enter') { document.getElementById('search-btn').click(); } }); // 新建工单 document.getElementById('create-workorder-btn').addEventListener('click', () => { this.showCreateWorkOrderModal(); }); } async loadWorkOrders() { try { const params = new URLSearchParams({ page: this.currentPage, per_page: this.perPage, status: this.currentStatus, search: this.searchQuery }); const response = await fetch(`/api/workorders?${params}`); const data = await response.json(); if (response.ok && data.success) { this.renderWorkOrders(data.workorders || []); this.renderPagination(data.pagination || {}); document.getElementById('workorder-count').textContent = `共 ${data.total || 0} 个工单`; } else { this.showErrorInTable(data.message || '加载工单失败'); } } catch (error) { console.error('加载工单失败:', error); this.showErrorInTable('网络错误'); } } renderWorkOrders(workorders) { const tbody = document.getElementById('workorders-tbody'); if (workorders.length === 0) { tbody.innerHTML = ` 暂无工单 `; return; } tbody.innerHTML = workorders.map(workorder => { const statusBadge = this.getStatusBadge(workorder.status); const priorityBadge = this.getPriorityBadge(workorder.priority); const createTime = new Date(workorder.created_at).toLocaleString(); return ` ${workorder.order_id || workorder.id}
${workorder.title}
${workorder.description?.substring(0, 50) || ''}... ${workorder.category || '未分类'} ${priorityBadge} ${statusBadge} ${createTime}
`; }).join(''); } renderPagination(pagination) { const nav = document.getElementById('pagination-nav'); const list = document.getElementById('pagination-list'); if (!pagination || pagination.total_pages <= 1) { nav.style.display = 'none'; return; } nav.style.display = 'block'; let html = ''; // 上一页 if (pagination.has_prev) { html += `
  • 上一页
  • `; } // 页码 for (let i = Math.max(1, pagination.page - 2); i <= Math.min(pagination.total_pages, pagination.page + 2); i++) { const activeClass = i === pagination.page ? 'active' : ''; html += `
  • ${i}
  • `; } // 下一页 if (pagination.has_next) { html += `
  • 下一页
  • `; } list.innerHTML = html; } getStatusBadge(status) { const statusMap = { 'open': '待处理', 'in_progress': '处理中', 'resolved': '已解决', 'closed': '已关闭' }; return statusMap[status] || `${status}`; } getPriorityBadge(priority) { const priorityMap = { 'low': '', 'medium': '', 'high': '', 'urgent': '紧急' }; return priorityMap[priority] || `${priority}`; } showErrorInTable(message) { const tbody = document.getElementById('workorders-tbody'); tbody.innerHTML = ` ${message} `; } showCreateWorkOrderModal() { // 这里应该显示创建工单的模态框 if (window.showToast) { window.showToast('创建工单功能开发中', 'info'); } } showError(error) { this.container.innerHTML = `

    页面加载失败

    ${error.message || '未知错误'}

    `; } } // 全局函数供表格操作使用 window.viewWorkOrder = async function(id) { try { // 显示模态框(先显示加载状态) const modalEl = document.getElementById('workorder-detail-modal'); const modal = new bootstrap.Modal(modalEl); modal.show(); // 重置内容 document.getElementById('modal-status-badge').innerHTML = ''; document.getElementById('modal-ai-analysis').innerHTML = '
    正在分析...'; document.getElementById('modal-chat-history').innerHTML = '
    '; // 获取详情 const response = await fetch(`/api/workorders/${id}`); const result = await response.json(); if (!result.success) { alert('获取工单详情失败'); return; } const wo = result.workorder; // 填充基本信息 document.getElementById('modal-title').textContent = wo.title; document.getElementById('modal-id').textContent = wo.order_id || wo.id; document.getElementById('modal-category').textContent = wo.category || '-'; document.getElementById('modal-created-at').textContent = new Date(wo.created_at).toLocaleString(); document.getElementById('modal-user').textContent = wo.user_id || '-'; document.getElementById('modal-description').textContent = wo.description || '无描述'; // 状态徽章 const statusMap = { 'open': '待处理', 'in_progress': '处理中', 'resolved': '已解决', 'closed': '已关闭' }; document.getElementById('modal-status-badge').innerHTML = statusMap[wo.status] || wo.status; // 优先级 const priorityMap = { 'low': '', 'medium': '', 'high': '', 'urgent': '紧急' }; document.getElementById('modal-priority').innerHTML = priorityMap[wo.priority] || wo.priority; // AI 分析/建议 if (wo.resolution) { document.getElementById('modal-ai-analysis').innerHTML = `
    ${wo.resolution}
    `; } else { document.getElementById('modal-ai-analysis').textContent = '暂无 AI 分析建议'; } // 渲染对话/处理历史 (模拟数据或真实数据) const historyContainer = document.getElementById('modal-chat-history'); // 这里假设后端返回的详情中包含 history 或 timeline // 如果没有,暂时显示描述作为第一条记录 let historyHtml = ''; // 模拟一条初始记录 historyHtml += `
    用户 ${new Date(wo.created_at).toLocaleString()}
    ${wo.description}
    `; if (wo.timeline && wo.timeline.length > 0) { // 如果有真实的时间轴数据 historyHtml = wo.timeline.map(item => `
    ${item.author || (item.type === 'ai' ? 'AI 助手' : '系统')} ${new Date(item.timestamp).toLocaleString()}
    ${item.content}
    `).join(''); } historyContainer.innerHTML = historyHtml; // 绑定编辑按钮 document.getElementById('modal-edit-btn').onclick = () => { modal.hide(); editWorkOrder(id); }; } catch (e) { console.error('查看工单详情失败', e); alert('查看详情失败: ' + e.message); } }; window.editWorkOrder = function(id) { if (window.showToast) { window.showToast(`编辑工单 ${id} 功能开发中`, 'info'); } }; window.deleteWorkOrder = function(id) { if (!confirm(`确定要删除工单 ${id} 吗?`)) { return; } (async () => { try { const response = await fetch(`/api/workorders/${id}`, { method: 'DELETE' }); const result = await response.json(); if (response.ok && result.success) { if (window.showToast) { window.showToast(result.message || `工单 ${id} 删除成功`, 'success'); } // 通知当前页面刷新工单列表(保持当前页) const event = new CustomEvent('workorder-deleted', { detail: { id } }); document.dispatchEvent(event); } else { if (window.showToast) { window.showToast(result.message || '删除工单失败', 'error'); } else { alert(result.message || '删除工单失败'); } } } catch (error) { console.error('删除工单失败:', error); if (window.showToast) { window.showToast('删除失败,请检查网络或查看控制台日志', 'error'); } else { alert('删除失败,请检查网络或查看控制台日志'); } } })(); }; window.changePage = function(page) { // 重新加载当前页面实例 const event = new CustomEvent('changePage', { detail: { page } }); document.dispatchEvent(event); }; // 监听删除事件,触发当前 WorkOrders 列表刷新(保持当前页) document.addEventListener('workorder-deleted', () => { const event = new CustomEvent('reloadWorkOrders'); document.dispatchEvent(event); });