prepare('UPDATE ' . tn('orders') . ' SET status = ? WHERE id = ?')->execute([$status, $id]);
$msg = '订单 #' . $id . ' 状态已更新为「' . orderStatusLabel($status) . '」';
}
}
// 发货:填写连接/登录信息
if (isset($_POST['ship'])) {
verifyCsrf();
$id = (int) ($_POST['id'] ?? 0);
$serverIp = trim($_POST['server_ip'] ?? '');
$connAddr = trim($_POST['conn_addr'] ?? '');
$loginUser = trim($_POST['login_user'] ?? '');
$loginPass = trim($_POST['login_pass'] ?? '');
$remark = trim($_POST['remark'] ?? '');
$activated = isset($_POST['activated']) ? 1 : 0;
$productInfo = trim($_POST['product_info'] ?? '');
$chk = $db->prepare('SELECT id, status FROM ' . tn('orders') . ' WHERE id = ?');
$chk->execute([$id]);
$ord = $chk->fetch();
if (!$ord) {
$err = '订单不存在';
} else {
// 已存在发货记录则更新,否则插入
$ex = $db->prepare('SELECT id FROM ' . tn('order_deliveries') . ' WHERE order_id = ? ORDER BY id DESC LIMIT 1');
$ex->execute([$id]);
$exId = $ex->fetchColumn();
if ($exId) {
$db->prepare('UPDATE ' . tn('order_deliveries') . ' SET server_ip=?, conn_addr=?, login_user=?, login_pass=?, remark=?, activated=?, product_info=? WHERE id=?')
->execute([$serverIp, $connAddr, $loginUser, $loginPass, $remark, $activated, $productInfo, $exId]);
} else {
$db->prepare('INSERT INTO ' . tn('order_deliveries') . ' (order_id, server_ip, conn_addr, login_user, login_pass, remark, activated, product_info, created_at) VALUES (?,?,?,?,?,?,?,?,NOW())')
->execute([$id, $serverIp, $connAddr, $loginUser, $loginPass, $remark, $activated, $productInfo]);
}
// 由「已付款」发货后自动转为「已发货」
if ($ord['status'] === 'paid') {
$db->prepare('UPDATE ' . tn('orders') . ' SET status = ? WHERE id = ?')->execute(['shipped', $id]);
}
$msg = '发货信息已保存(订单 #' . $id . ')。';
// 通过 SMTP 通知客户(失败不影响保存)
$u = $db->prepare('SELECT u.email, u.username FROM ' . tn('orders') . ' o LEFT JOIN ' . tn('users') . ' u ON u.id = o.user_id WHERE o.id = ?');
$u->execute([$id]);
$urow = $u->fetch();
if ($urow && !empty($urow['email'])) {
$subject = '[' . SITE_NAME . '] 你的订单 #' . $id . ' 已发货';
$body = '
'
. '
订单已发货
'
. '
你好 ' . h($urow['username']) . ',你购买的以下服务/商品已开通:
'
. '
'
. '
连接地址:' . h($connAddr) . '
'
. '
登录账户:' . h($loginUser) . '
'
. '
可在「我的订单 → 详情」中查看完整登录凭据。
'
. '
'
. '
如有问题请到「我的工单」联系客服。
';
fnwSendMail($urow['email'], $subject, $body);
}
}
}
// 修改到期时间(后台)
if (isset($_POST['save_expire'])) {
verifyCsrf();
$id = (int) ($_POST['id'] ?? 0);
$clear = isset($_POST['clear_expire']);
$expRaw = trim($_POST['expires_at'] ?? '');
$newExp = null;
if (!$clear) {
if ($expRaw === '') {
$err = '请填写新的到期时间,或勾选「清除到期时间」';
} else {
$t = strtotime(str_replace('T', ' ', $expRaw));
if ($t === false) {
$err = '到期时间格式不正确';
} else {
$newExp = date('Y-m-d H:i:s', $t);
}
}
}
if ($err === '') {
$db->prepare('UPDATE ' . tn('orders') . ' SET expires_at = ?, expire_notify_sent = 0 WHERE id = ?')
->execute([$newExp, $id]);
$msg = '订单 #' . $id . ' 的到期时间已更新' . ($newExp ? '为 ' . $newExp : '(已清除)') . ',到期提醒将重新计算。';
}
}
// 删除订单(含明细与发货信息)
if (isset($_POST['delete'])) {
verifyCsrf();
$id = (int) ($_POST['delete'] ?? 0);
$db->prepare('DELETE FROM ' . tn('order_deliveries') . ' WHERE order_id = ?')->execute([$id]);
$db->prepare('DELETE FROM ' . tn('order_items') . ' WHERE order_id = ?')->execute([$id]);
$db->prepare('DELETE FROM ' . tn('orders') . ' WHERE id = ?')->execute([$id]);
$msg = '订单 #' . $id . ' 已删除';
}
$filter = trim($_GET['status'] ?? '');
$where = $filter !== '' ? 'WHERE o.status = ?' : '';
$params = $filter !== '' ? [$filter] : [];
$stmt = $db->prepare(
'SELECT o.*, u.username, u.email AS u_email FROM ' . tn('orders') . ' o
LEFT JOIN ' . tn('users') . ' u ON u.id = o.user_id
' . $where . ' ORDER BY o.created_at DESC'
);
$stmt->execute($params);
$list = $stmt->fetchAll();
// 预取商品明细
$itemsOf = [];
foreach ($list as $o) {
$it = $db->prepare('SELECT name, qty, period_days FROM ' . tn('order_items') . ' WHERE order_id = ?');
$it->execute([$o['id']]);
$itemsOf[$o['id']] = $it->fetchAll();
}
// 查看单条 + 发货
$view = isset($_GET['view']) ? (int) $_GET['view'] : 0;
$order = $delivery = null;
if ($view > 0) {
$ostmt = $db->prepare('SELECT o.*, u.username, u.email AS u_email FROM ' . tn('orders') . ' o LEFT JOIN ' . tn('users') . ' u ON u.id = o.user_id WHERE o.id = ?');
$ostmt->execute([$view]);
$order = $ostmt->fetch();
if ($order) {
$istmt = $db->prepare('SELECT * FROM ' . tn('order_items') . ' WHERE order_id = ?');
$istmt->execute([$order['id']]);
$order['items'] = $istmt->fetchAll();
$dstmt = $db->prepare('SELECT * FROM ' . tn('order_deliveries') . ' WHERE order_id = ? ORDER BY id DESC LIMIT 1');
$dstmt->execute([$order['id']]);
$delivery = $dstmt->fetch();
}
}
adminHeader('订单管理', 'orders');
?>
订单管理
= h($msg) ?>
= h($err) ?>
订单号:= h($order['order_no']) ?>
= date('Y-m-d H:i', strtotime($order['created_at'])) ?>
= orderStatusLabel($order['status']) ?>
订单发起人
= h($order['username'] ?? '未知') ?>
账号邮箱:= h($order['u_email'] ?? '未填写') ?>
联系信息
联系人:= $order['contact'] !== '' ? h($order['contact']) : '—' ?>
联系邮箱:= $order['contact_email'] !== '' ? h($order['contact_email']) : '—' ?>
收货地址:= $order['address'] !== '' ? h($order['address']) : '(未填写)' ?>
周期 / 到期
周期:= periodLabel($order['period_days']) ?>
到期时间:= expiryBadge($order['expires_at']) ?>
已发送「到期前提醒」邮件
备注
= $order['note'] !== '' ? nl2br(h($order['note'])) : '(无)' ?>
支付方式
= payTypeLabel($order['pay_type']) ?>= $order['pay_type']==='points' ? '(消耗 ' . (int)$order['points_used'] . ' 积分)' : '' ?>
商品明细
| 商品 | 单价 | 数量 | 小计 | 周期 |
| = h($it['name']) ?> |
= money($it['price']) ?> |
= (int) $it['qty'] ?> |
= money($it['subtotal']) ?> |
= periodLabel($it['period_days']) ?> |
发货信息(连接地址 / 登录凭据 / 商品信息)
已填写,当前内容如下(可重新提交覆盖):
激活状态:= !empty($delivery['activated']) ? '已激活' : '未激活' ?>
服务器 IP:= h($delivery['server_ip']) ?: '—' ?>
连接地址:= h($delivery['conn_addr']) ?: '—' ?>
登录账户:= h($delivery['login_user']) ?: '—' ?>
登录密码:= $delivery['login_pass'] !== '' ? h($delivery['login_pass']) : '—' ?>
商品信息:= nl2br(h($delivery['product_info'])) ?>
备注:= nl2br(h($delivery['remark'])) ?>
没有符合条件的订单。
| 订单号 | 用户 | 商品 | 金额 | 周期 | 支付 | 状态 | 时间 | 操作 |
| = h($o['order_no']) ?> |
= h($o['username'] ?? '游客') ?> |
= h($it['name']) ?> ×= (int)$it['qty'] ?>
|
= money($o['total']) ?> |
= periodLabel($o['period_days']) ?> |
= payTypeLabel($o['pay_type']) ?>= $o['pay_type']==='points' ? ' · ' . (int)$o['points_used'] . '分' : '' ?> |
= orderStatusLabel($o['status']) ?> |
= date('m-d H:i', strtotime($o['created_at'])) ?> |
|