0) { verifyCsrf(); $stmt = db()->prepare('SELECT id, user_id, status FROM ' . tn('tickets') . ' WHERE id = ?'); $stmt->execute([$viewId]); $t = $stmt->fetch(); if (!$t || (int) $t['user_id'] !== (int) $user['id']) { $err = __('mytickets.err_no_perm'); } elseif ($t['status'] !== 'closed') { $err = __('mytickets.err_not_closed'); } else { db()->prepare('UPDATE ' . tn('tickets') . ' SET status = ?, updated_at = NOW(), closed_at = NULL WHERE id = ?') ->execute(['open', $viewId]); redirect('mytickets.php?view=' . $viewId . '&ok=1'); } } // 用户追加回复 $err = ''; if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_POST['user_reply']) && $viewId > 0) { verifyCsrf(); $reply = trim($_POST['reply_message'] ?? ''); $stmt = db()->prepare('SELECT id, user_id, status FROM ' . tn('tickets') . ' WHERE id = ?'); $stmt->execute([$viewId]); $t = $stmt->fetch(); if (!$t || (int) $t['user_id'] !== (int) $user['id']) { $err = __('mytickets.err_no_perm'); } elseif ($t['status'] === 'closed') { $err = __('mytickets.err_closed_reply'); } elseif ($reply === '') { $err = __('mytickets.err_reply_empty'); } elseif (strlen($reply) > 5000) { $err = __('mytickets.err_reply_long'); } else { db()->prepare('INSERT INTO ' . tn('ticket_replies') . ' (ticket_id, user_id, is_admin, message, created_at) VALUES (?,?,?,?,NOW())') ->execute([$viewId, $user['id'], 0, $reply]); db()->prepare('UPDATE ' . tn('tickets') . ' SET status = ?, updated_at = NOW() WHERE id = ?') ->execute(['open', $viewId]); redirect('mytickets.php?view=' . $viewId . '&ok=1'); } } $ticket = null; $replies = []; if ($viewId > 0) { $stmt = db()->prepare( 'SELECT t.*, d.name AS dept_name FROM ' . tn('tickets') . ' t LEFT JOIN ' . tn('ticket_departments') . ' d ON d.id = t.dept_id WHERE t.id = ? AND t.user_id = ?' ); $stmt->execute([$viewId, $user['id']]); $ticket = $stmt->fetch(); if ($ticket) { $rstmt = db()->prepare( 'SELECT r.*, u.username, u.nickname FROM ' . tn('ticket_replies') . ' r LEFT JOIN ' . tn('users') . ' u ON u.id = r.user_id WHERE r.ticket_id = ? ORDER BY r.created_at ASC' ); $rstmt->execute([$viewId]); $replies = $rstmt->fetchAll(); } } $list = db()->prepare( 'SELECT t.*, d.name AS dept_name FROM ' . tn('tickets') . ' t LEFT JOIN ' . tn('ticket_departments') . ' d ON d.id = t.dept_id WHERE t.user_id = ? ORDER BY t.updated_at DESC' ); $list->execute([$user['id']]); $list = $list->fetchAll(); require 'includes/header.php'; ?>

#' . (int)$ticket['order_id'] . '', __('mytickets.renewal_note')) ?>

#