0 && in_array($sStatus, ['未结算', '已结算', '已作废'])) { $stmt = $pdo->prepare('INSERT INTO bill_status (bill_date, user_id, status, updated_at, updated_by) VALUES (?, ?, ?, NOW(), ?) ON DUPLICATE KEY UPDATE status = ?, updated_at = NOW(), updated_by = ?'); $stmt->execute([$sDate, $sUserId, $sStatus, getCurrentUserId(), $sStatus, getCurrentUserId()]); $_SESSION['flash_msg'] = '账单状态已更新'; $_SESSION['flash_type'] = 'success'; $queryRedirect = []; $filterUserId = $userId; // 保留原始筛选条件 if ($filterUserId > 0) $queryRedirect[] = 'user_id=' . $filterUserId; if ($sStartDate) $queryRedirect[] = 'start_date=' . $sStartDate; if ($sEndDate) $queryRedirect[] = 'end_date=' . $sEndDate; header('Location: bill_records.php' . ($queryRedirect ? '?' . implode('&', $queryRedirect) : '')); exit; } else { $statusMsg = '
参数错误
'; } } } // 详情模式 if ($detailDate) { $pid = getCurrentProductId(); $where = 'WHERE r.status = 2 AND r.product_id = ? AND DATE(r.used_at) = ?'; $params = [$pid, $detailDate]; if ($detailUserId > 0) { $where .= ' AND r.user_id = ?'; $params[] = $detailUserId; } $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 ASC"); $stmt->execute($params); $details = $stmt->fetchAll(); // 读取该日该用户的账单状态 $stmt = $pdo->prepare("SELECT status FROM bill_status WHERE bill_date = ? AND user_id = ?"); $stmt->execute([$detailDate, $detailUserId]); $billStatus = $stmt->fetchColumn() ?: '未结算'; ?>

账单明细 - 0 && isset($details[0]['username'])): ?> ( 状态:

← 返回
ID 兑换码名称 批次号 兑换码 面值 使用时间 会员ID 用户 出货价一档 出货价二挡 备注
暂无数据
0) { $where .= ' AND r.user_id = ?'; $params[] = $userId; } if ($startDate) { $where .= ' AND DATE(r.used_at) >= ?'; $params[] = $startDate; } if ($endDate) { $where .= ' AND DATE(r.used_at) <= ?'; $params[] = $endDate; } $stmt = $pdo->prepare("SELECT COUNT(DISTINCT DATE(r.used_at)" . ($userId > 0 ? "" : ", r.user_id") . ") FROM claim_records r $where"); $stmt->execute($params); $total = (int)$stmt->fetchColumn(); $totalPages = max(1, ceil($total / $perPage)); $groupBy = $userId > 0 ? 'DATE(r.used_at)' : 'DATE(r.used_at), r.user_id'; $selectCols = $userId > 0 ? "DATE(r.used_at) AS bill_date, r.user_id AS uid, COUNT(*) AS total, SUM(COALESCE(r.price_tier1, 0)) AS total_price1, SUM(COALESCE(r.price_tier2, 0)) AS total_price2" : "DATE(r.used_at) AS bill_date, r.user_id AS uid, u.username, COUNT(*) AS total, SUM(COALESCE(r.price_tier1, 0)) AS total_price1, SUM(COALESCE(r.price_tier2, 0)) AS total_price2"; $stmt = $pdo->prepare("SELECT $selectCols FROM claim_records r LEFT JOIN users u ON r.user_id = u.id $where GROUP BY $groupBy ORDER BY bill_date DESC" . ($userId > 0 ? '' : ', u.username ASC') . " LIMIT ? OFFSET ?"); $stmt->execute(array_merge($params, [$perPage, $offset])); $records = $stmt->fetchAll(); // 批量查询账单状态 $statusMap = []; if (!empty($records)) { $cases = []; foreach ($records as $r) { $uid = $userId > 0 ? $userId : $r['uid']; $cases[] = "('" . $r['bill_date'] . "', " . (int)$uid . ")"; } if (!empty($cases)) { $stmt = $pdo->query("SELECT CONCAT(bill_date, '_', user_id) AS k, status FROM bill_status WHERE (bill_date, user_id) IN (" . implode(',', $cases) . ")"); while ($row = $stmt->fetch()) { $statusMap[$row['k']] = $row['status']; } } } function billStatusBadge(string $status): string { switch ($status) { case '未结算': return '未结算'; case '已结算': return '已结算'; case '已作废': return '已作废'; default: return '未知'; } } $allUsers = $isAdmin ? $pdo->query('SELECT id, username FROM users ORDER BY id ASC')->fetchAll() : []; // 构建筛选条件 URL 参数 $queryParams = []; if ($userId > 0) $queryParams['user_id'] = $userId; if ($startDate) $queryParams['start_date'] = $startDate; if ($endDate) $queryParams['end_date'] = $endDate; ?>

账单管理

0): ?> 清空
清空
0 ? $userId : $r['uid']; $statusKey = $r['bill_date'] . '_' . $uid; $billStatus = $statusMap[$statusKey] ?? '未结算'; ?>
日期 用户 使用数量 出货价一档合计 出货价二挡合计 状态 操作
0 ? number_format($r['total_price1'], 2) : '-' ?> 0 ? number_format($r['total_price2'], 2) : '-' ?>
暂无数据
0) $extra['user_id'] = $userId; if ($startDate) $extra['start_date'] = $startDate; if ($endDate) $extra['end_date'] = $endDate; renderPagination($page, $totalPages, $extra); ?>