diff --git a/backend/routes/export.js b/backend/routes/export.js index bc6d771..208258f 100644 --- a/backend/routes/export.js +++ b/backend/routes/export.js @@ -35,7 +35,7 @@ router.get('/tickets', authenticate, requireRole('owner'), async (req, res) => { }); router.get('/reported-players', authenticate, requireRole('owner'), async (req, res) => { - const rows = await query(`SELECT target_game_name as '被举报人游戏名', target_game_uid as '被举报人UID', COUNT(*) as '被举报次数', SUM(CASE WHEN status='resolved' THEN 1 ELSE 0 END) as '已处理', SUM(CASE WHEN status IN ('pending','processing','awaiting_info') THEN 1 ELSE 0 END) as '处理中', SUM(CASE WHEN status='rejected' THEN 1 ELSE 0 END) as '已驳回', MAX(created_at) as '最近举报时间', GROUP_CONCAT(reason SEPARATOR ' | ') as '常见原因' FROM tickets WHERE type='report' AND target_game_name IS NOT NULL AND target_game_name != '' GROUP BY target_game_name, target_game_uid ORDER BY COUNT(*) DESC`); + const rows = await query(`SELECT target_game_name as '被举报人游戏名', target_game_uid as '被举报人UID', COUNT(*) as '被举报次数', SUM(CASE WHEN status='resolved' THEN 1 ELSE 0 END) as '已处理', SUM(CASE WHEN status IN ('pending','processing','awaiting_info','appealing') THEN 1 ELSE 0 END) as '处理中', SUM(CASE WHEN status='rejected' THEN 1 ELSE 0 END) as '已驳回', MAX(created_at) as '最近举报时间', GROUP_CONCAT(reason SEPARATOR ' | ') as '常见原因' FROM tickets WHERE type='report' AND target_game_name IS NOT NULL AND target_game_name != '' GROUP BY target_game_name, target_game_uid ORDER BY COUNT(*) DESC`); if (req.query.format === 'csv') { const { csv, filename } = toCSV(['被举报人游戏名','被举报人UID','被举报次数','已处理','处理中','已驳回','最近举报时间','常见原因'], rows, `reported_players_${new Date().toISOString().slice(0,10)}.csv`); res.setHeader('Content-Type','text/csv; charset=utf-8'); diff --git a/backend/routes/tickets.js b/backend/routes/tickets.js index 34800e0..ea46e10 100644 --- a/backend/routes/tickets.js +++ b/backend/routes/tickets.js @@ -66,7 +66,7 @@ router.get('/unclaimed', authenticate, requireRole('owner','admin'), async (req, router.get('/reported-players', authenticate, requireRole('owner','admin'), async (req, res) => { const rows = await query(`SELECT target_game_name as name, target_game_uid as uid, COUNT(*) as total_reports, - SUM(CASE WHEN status IN ('pending','processing','awaiting_info') THEN 1 ELSE 0 END) as active_count, + SUM(CASE WHEN status IN ('pending','processing','awaiting_info','appealing') THEN 1 ELSE 0 END) as active_count, SUM(CASE WHEN status='resolved' THEN 1 ELSE 0 END) as resolved_count, SUM(CASE WHEN status='rejected' THEN 1 ELSE 0 END) as rejected_count, MAX(created_at) as last_report, @@ -124,7 +124,7 @@ router.post('/', optionalAuth, upload.array('files', 5), finalizeUpload, validat if (!description) return res.status(400).json({ error: '请填写详细申诉内容' }); } - const countRow = await getRow("SELECT COUNT(*) as c FROM tickets WHERE (reporter_game_name = ? OR reporter_game_uid = ?) AND status IN ('pending','processing','awaiting_info')", [rgn, rgu]); + const countRow = await getRow("SELECT COUNT(*) as c FROM tickets WHERE (reporter_game_name = ? OR reporter_game_uid = ?) AND status IN ('pending','processing','awaiting_info','appealing')", [rgn, rgu]); if (countRow.c >= 5) return res.status(400).json({ error: '您的待处理/处理中工单已达上限(5个),请等待已有工单处理完毕后再提交' }); const trackingToken = uuid();