const ComplaintDetailPage = { complaintId: null, async render(id) { this.complaintId = id; return '

加载中...

'; }, async mount() { const container = document.getElementById('page-content'); const backBtn = ''; document.getElementById('page-title').textContent = `投诉 #${this.complaintId}`; document.getElementById('page-actions').innerHTML = backBtn; try { const complaint = await API.get(`/complaints/${this.complaintId}`); this.renderDetail(container, complaint); } catch (err) { container.innerHTML = `
加载失败: ${err.message}
`; } }, renderDetail(container, c) { const user = Auth.getUser(); container.innerHTML = `
基本信息
${Utils.statusBadge(c.status)} ${Utils.priorityBadge(c.priority)}
标题${Utils.escapeHtml(c.title)}
描述${Utils.escapeHtml(c.description)}
分类${Utils.categoryBadge(c.category)}
玩家${Utils.escapeHtml(c.player_name)}
${c.player_email ? `
邮箱${Utils.escapeHtml(c.player_email)}
` : ''} ${c.player_contact ? `
联系方式${Utils.escapeHtml(c.player_contact)}
` : ''}
创建时间${Utils.formatDate(c.created_at)}
更新时间${Utils.formatDate(c.updated_at)}
${c.plan ? this.renderPlanSection(c) : ''} ${c.implementation ? this.renderImplementationSection(c) : ''} ${c.review ? this.renderReviewSection(c) : ''}
沟通记录
${c.responses && c.responses.length > 0 ? `
${c.responses.map(r => `
${Utils.escapeHtml(r.user_name) || '系统'} ${r.user_role ? `${Utils.roleLabels[r.user_role]}` : ''} ${Utils.formatDate(r.created_at)}
${Utils.escapeHtml(r.content)}
`).join('')}
` : '

暂无记录

'}
添加回复
人员分配
规划者${c.planner_name || '未分配'}
实施者${c.implementer_name || '未分配'}
审查者${c.reviewer_name || '未分配'}
操作
${user && (user.role === 'planner' || user.role === 'admin') && !c.plan ? ` ` : ''} ${user && (user.role === 'planner' || user.role === 'admin') && c.plan && c.plan.status === 'draft' ? ` ` : ''} ${user && (user.role === 'implementer' || user.role === 'admin') && c.plan && c.implementer_name === user.display_name && !c.implementation ? ` ` : ''} ${user && (user.role === 'reviewer' || user.role === 'admin') && c.implementation && c.implementation.status === 'completed' && !c.review ? ` ` : ''} ${user && (user.role === 'admin') ? ` ` : ''}
`; document.getElementById('add-response-form')?.addEventListener('submit', async (e) => { e.preventDefault(); const content = document.getElementById('response-content').value.trim(); if (!content) return; try { await API.post(`/complaints/${c.id}/response`, { content }); document.getElementById('response-content').value = ''; this.mount(); } catch (err) { alert(err.message); } }); }, renderPlanSection(c) { const p = c.plan; return `
处理计划 ${Utils.statusBadge(p.status)}
标题${Utils.escapeHtml(p.title)}
描述${Utils.escapeHtml(p.description)}
${p.technical_approach ? `
技术方案${Utils.escapeHtml(p.technical_approach)}
` : ''} ${p.expected_effort ? `
预计工时${p.expected_effort}
` : ''} ${p.reject_reason ? `
驳回原因${Utils.escapeHtml(p.reject_reason)}
` : ''}
规划者${p.planner_name || '-'}
`; }, renderImplementationSection(c) { const i = c.implementation; return `
实施情况 ${Utils.statusBadge(i.status)}
${i.code_reference ? `
代码参考${Utils.escapeHtml(i.code_reference)}
` : ''} ${i.implementation_notes ? `
实施说明${Utils.escapeHtml(i.implementation_notes)}
` : ''} ${i.reject_reason ? `
驳回原因${Utils.escapeHtml(i.reject_reason)}
` : ''}
实施者${i.implementer_name || '-'}
${i.status === 'in_progress' ? `
` : ''}
`; }, renderReviewSection(c) { const r = c.review; return `
审查结果 ${Utils.statusBadge(r.status)}
${r.review_notes ? `
审查意见${Utils.escapeHtml(r.review_notes)}
` : ''} ${r.issues_found ? `
发现的问题${Utils.escapeHtml(r.issues_found)}
` : ''} ${r.reject_reason ? `
驳回原因${Utils.escapeHtml(r.reject_reason)}
` : ''}
审查者${r.reviewer_name || '-'}
`; }, async refresh() { await this.mount(); }, async createPlan(complaintId) { Utils.openModal('创建处理计划', `
`); document.getElementById('create-plan-form').addEventListener('submit', async (e) => { e.preventDefault(); try { await API.post('/plans', { complaint_id: complaintId, title: document.getElementById('plan-title').value, description: document.getElementById('plan-description').value, technical_approach: document.getElementById('plan-tech').value, expected_effort: document.getElementById('plan-effort').value, }); App.closeModal(); this.refresh(); } catch (err) { alert(err.message); } }); }, async assignImplementer(complaintId, planId) { const users = await API.get('/users/implementers'); if (!users.length) { alert('暂无可用实施者'); return; } Utils.openModal('分配实施者', `
`); document.getElementById('assign-impl-form').addEventListener('submit', async (e) => { e.preventDefault(); try { await API.post(`/plans/${planId}/assign`, { implementer_id: parseInt(document.getElementById('assign-impl-user').value) }); App.closeModal(); this.refresh(); } catch (err) { alert(err.message); } }); }, async startImplementation(complaintId, planId) { try { await API.post('/implementations', { plan_id: planId }); this.refresh(); } catch (err) { alert(err.message); } }, async startReview(complaintId, implementationId) { try { await API.post('/reviews', { implementation_id: implementationId }); this.refresh(); } catch (err) { alert(err.message); } }, showUpdateStatusModal(complaintId) { Utils.openModal('修改状态', `
`); document.getElementById('update-status-form').addEventListener('submit', async (e) => { e.preventDefault(); try { await API.put(`/complaints/${complaintId}`, { status: document.getElementById('new-status').value }); App.closeModal(); this.refresh(); } catch (err) { alert(err.message); } }); } };