prepare("SELECT r.id, r.code_name, r.batch_no, r.code, r.value, r.status, r.expired_at FROM claim_records r $where ORDER BY r.id DESC"); $stmt->execute($params); $rows = $stmt->fetchAll(); header('Content-Type: text/csv; charset=utf-8'); header('Content-Disposition: attachment; filename=claim_records.csv'); echo "\xEF\xBB\xBF"; $f = fopen('php://output', 'w'); fputcsv($f, ['ID', '兑换码名称', '批次号', '兑换码', '面值', '状态', '过期时间']); foreach ($rows as $r) { $statusMap = [1 => '未使用', 2 => '已使用', 3 => '已过期']; fputcsv($f, [ $r['id'], $r['code_name'], $r['batch_no'], (int)$r['status'] === 3 ? maskCode($r['code']) : $r['code'], $r['value'], $statusMap[(int)$r['status']] ?? '未知', $r['expired_at'] ? date('Y-m-d H:i:s', strtotime($r['expired_at'])) : '', ]); } fclose($f); exit; } $pageTitle = '兑换码领取记录'; require __DIR__ . '/includes/header.php'; $isAdmin = isAdmin(); $msg = ''; // 管理员:修改状态 if ($isAdmin && $_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action'])) { if (!verifyCsrf($_POST['csrf_token'] ?? '')) { die('CSRF token无效'); } $id = (int)($_POST['id'] ?? 0); if ($_POST['action'] === 'edit_status') { $newStatus = (int)($_POST['status'] ?? 0); $usedAt = ($_POST['used_at'] ?? '') !== '' ? str_replace('T', ' ', $_POST['used_at']) . ':00' : ''; $userId = (int)($_POST['user_id'] ?? 0); $usedUserId = trim($_POST['used_user_id'] ?? ''); if ($newStatus < 1 || $newStatus > 3) { $msg = '
无效的状态值
'; } elseif ($newStatus === 2 && $usedUserId === '') { $msg = '
状态设为已使用时,必须填写会员ID
'; } else { $update = ['status = ?']; $params = [$newStatus]; if ($usedAt !== '') { $update[] = 'used_at = ?'; $params[] = $usedAt; } if ($userId > 0) { $update[] = 'user_id = ?'; $params[] = $userId; } if ($usedUserId !== '') { $update[] = 'used_user_id = ?'; $params[] = $usedUserId; } $params[] = $id; $stmt = $pdo->prepare('UPDATE claim_records SET ' . implode(', ', $update) . ' WHERE id = ?'); $stmt->execute($params); $_SESSION['flash_msg'] = '状态已更新'; $_SESSION['flash_type'] = 'success'; header('Location: claim_records.php'); exit; } } elseif ($_POST['action'] === 'manual_add') { $codeName = trim($_POST['code_name'] ?? ''); $batchNo = trim($_POST['batch_no'] ?? ''); $codeType = (int)($_POST['code_type'] ?? 1); $code = trim($_POST['code'] ?? ''); $value = trim($_POST['value'] ?? ''); $expiredAt = $_POST['expired_at'] ?: null; $userId = (int)($_POST['user_id'] ?? 0); $claimedAt = ($_POST['claimed_at'] ?? '') !== '' ? str_replace('T', ' ', $_POST['claimed_at']) . ':00' : null; $price1 = $_POST['price_tier1'] !== '' ? (float)$_POST['price_tier1'] : null; $price2 = $_POST['price_tier2'] !== '' ? (float)$_POST['price_tier2'] : null; $recStatus = (int)($_POST['rec_status'] ?? 1); if (!in_array($recStatus, [1, 2, 3])) $recStatus = 1; $usedUserId = trim($_POST['used_user_id'] ?? ''); $usedAt = ($_POST['used_at'] ?? '') !== '' ? str_replace('T', ' ', $_POST['used_at']) . ':00' : null; if (!$codeName || !$batchNo || !$code) { $msg = '
兑换码名称、批次号、兑换码为必填项
'; } else { $stmt = $pdo->prepare('INSERT INTO claim_records (product_id, created_at, user_id, code_name, batch_no, code_type, code, value, status, expired_at, price_tier1, price_tier2, claimed_at, used_user_id, used_at, remark) VALUES (?, NOW(), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)'); $stmt->execute([getCurrentProductId(), $userId ?: null, $codeName, $batchNo, $codeType, $code, $value, $recStatus, $expiredAt, $price1, $price2, $claimedAt, $usedUserId ?: null, $usedAt, '手动添加']); $_SESSION['flash_msg'] = '手动添加成功'; $_SESSION['flash_type'] = 'success'; header('Location: claim_records.php'); exit; } } } // 分页 + 条件 $page = max(1, (int)($_GET['p'] ?? 1)); $perPage = 20; $offset = ($page - 1) * $perPage; $pid = getCurrentProductId(); $where = 'WHERE r.product_id = ?'; $searchParams = [$pid]; if (!$isAdmin) { $where .= ' AND r.user_id = ?'; $searchParams[] = getCurrentUserId(); } if (!empty($_GET['search'])) { $search = '%' . $_GET['search'] . '%'; $where .= ' AND (r.code LIKE ? OR r.batch_no LIKE ? OR r.code_name LIKE ?)'; $searchParams = array_merge($searchParams, [$search, $search, $search]); } $stmt = $pdo->prepare("SELECT COUNT(*) FROM claim_records r $where"); $stmt->execute($searchParams); $total = (int)$stmt->fetchColumn(); $totalPages = max(1, ceil($total / $perPage)); $stmt = $pdo->prepare("SELECT r.*, u.username FROM claim_records r LEFT JOIN users u ON r.user_id = u.id $where ORDER BY r.id DESC LIMIT ? OFFSET ?"); $stmt->execute(array_merge($searchParams, [$perPage, $offset])); $records = $stmt->fetchAll(); ?>

兑换码领取记录

兑换码领取 + 手动添加 下载 CSV
清空
ID 创建时间 兑换码名称 批次号 类型 兑换码 面值 状态 过期时间 使用时间 会员ID 用户 领取时间 出货价一档 出货价二挡 备注 操作
修改状态
暂无数据
$_GET['search']] : []); ?>
query('SELECT id, username FROM users ORDER BY id ASC')->fetchAll(); if ($isAdmin): ?>