query('SELECT * FROM ' . tn('ticket_departments') . ' ORDER BY sort, id')->fetchAll(); if (empty($depts)) { $depts = [['id' => 0, 'name' => __('ticket.meta_unspecified'), 'description' => '']]; } // 当前用户可续期的订单(周期商品 + 已发货/已完成) $renewOrders = db()->prepare( 'SELECT o.id, o.order_no, o.period_days, o.expires_at FROM ' . tn('orders') . ' o WHERE o.user_id = ? AND o.period_days > 0 AND o.status IN ("shipped","completed") ORDER BY o.created_at DESC' ); $renewOrders->execute([$user['id']]); $renewOrders = $renewOrders->fetchAll(); $renewOrderId = (int) ($_GET['order_id'] ?? 0); $msg = ''; $err = ''; if ($_SERVER['REQUEST_METHOD'] === 'POST') { verifyCsrf(); $dept = (int) ($_POST['dept_id'] ?? 0); $subject = trim($_POST['subject'] ?? ''); $message = trim($_POST['message'] ?? ''); $priority = (int) ($_POST['priority'] ?? 2); $type = in_array($_POST['type'] ?? 'general', ['general', 'renewal'], true) ? $_POST['type'] : 'general'; $orderId = (int) ($_POST['order_id'] ?? 0); if ($type === 'renewal') { // 校验关联订单确实属于本人且可续期 $okOrder = false; foreach ($renewOrders as $ro) { if ((int) $ro['id'] === $orderId) { $okOrder = true; break; } } if (!$okOrder) { $err = __('ticket_page.err_order_invalid'); } elseif ($subject === '') { $subject = __('ticket_page.subject_renewal_prefix') . $orderId; } } if ($subject === '') $err = __('ticket_page.err_subject_empty'); elseif (strlen($subject) > 160) $err = __('ticket_page.err_subject_long'); elseif ($message === '') $err = __('ticket_page.err_message_empty'); elseif (!in_array($priority, [1, 2, 3], true)) $err = __('ticket_page.err_priority_bad'); if ($err === '') { db()->prepare( 'INSERT INTO ' . tn('tickets') . ' (user_id, dept_id, order_id, type, subject, message, priority, status, created_at, updated_at) VALUES (?,?,?,?,?,?,?,?,NOW(),NOW())' )->execute([$user['id'], $dept, $type === 'renewal' ? $orderId : null, $type, $subject, $message, $priority, 'open']); $tid = db()->lastInsertId(); // 通过 SMTP 通知处理人员(失败不影响工单入库) $deptNameMap = []; foreach ($depts as $d) { $deptNameMap[$d['id']] = $d['name']; } $deptName = $deptNameMap[$dept] ?? __('ticket.meta_unspecified'); $cfg = smtpConfig(); if (!empty($cfg['notify_emails'])) { $base = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? 'https' : 'http') . '://' . ($_SERVER['HTTP_HOST'] ?? 'localhost') . dirname($_SERVER['SCRIPT_NAME']); $url = rtrim($base, '/') . '/admin/tickets.php?view=' . $tid; $typeLabel = ticketTypeLabel($type); $orderLine = $type === 'renewal' ? '

类型:续期申请(关联订单 #' . $orderId . ')

' : '

类型:strong>普通工单

'; $body = '
' . '

[' . h(SITE_NAME) . '] 收到新工单 #' . $tid . '

' . '

提交人:' . h($user['username']) . '(' . h($user['email']) . ')

' . '

部门:' . h($deptName) . '

' . '

优先级:' . ticketPriorityLabel($priority) . '

' . $orderLine . '

标题:' . h($subject) . '

' . '
' . h($message) . '
' . '

前往后台处理

' . '
'; fnwSendMail($cfg['notify_emails'], '[' . SITE_NAME . '] 新工单 #' . $tid . ' ' . $subject, $body); } redirect('mytickets.php?ok=1'); } } require 'includes/header.php'; ?>