insert($this->table(), [ 'user_id' => $user_id, 'order_number' => sanitize_text_field($order_number), 'amount' => $amount, 'type' => sanitize_key($type), 'status' => 'pending', 'created_at' => current_time('mysql'), ], ['%d', '%s', '%f', '%s', '%s', '%s']); return (int) $wpdb->insert_id; } /** * 结算收益 */ public function settle(int $revenue_id): bool { global $wpdb; return $wpdb->update( $this->table(), ['status' => 'settled', 'settled_at' => current_time('mysql')], ['id' => $revenue_id, 'status' => 'pending'], ['%s', '%s'], ['%d', '%s'] ) !== false; } /** * 获取用户收益列表 */ public function get_user_revenues(int $user_id, array $args = []): array { global $wpdb; $where = ['user_id = %d']; $params = [$user_id]; $status = sanitize_key((string) ($args['status'] ?? '')); if ($status !== '') { $where[] = 'status = %s'; $params[] = $status; } $limit = max(1, min(100, (int) ($args['limit'] ?? 20))); $offset = max(0, (int) ($args['offset'] ?? 0)); $sql = "SELECT * FROM {$this->table()} WHERE " . implode(' AND ', $where) . " ORDER BY created_at DESC LIMIT %d OFFSET %d"; $params[] = $limit; $params[] = $offset; return (array) $wpdb->get_results($wpdb->prepare($sql, $params), ARRAY_A); } /** * Admin list (all users) with optional status filter. * * @param array{status?:string,limit?:int,offset?:int} $args * @return array{items:array,total:int,page:int,max_pages:int} */ public function get_list(array $args = []): array { global $wpdb; $limit = max(1, min(100, (int) ($args['limit'] ?? 20))); $offset = max(0, (int) ($args['offset'] ?? 0)); $status = sanitize_key((string) ($args['status'] ?? '')); $where = []; $params = []; if ($status !== '') { $where[] = 'status = %s'; $params[] = $status; } $where_sql = $where ? 'WHERE ' . implode(' AND ', $where) : ''; $count_sql = "SELECT COUNT(*) FROM {$this->table()} {$where_sql}"; $total = $params ? (int) $wpdb->get_var($wpdb->prepare($count_sql, $params)) : (int) $wpdb->get_var($count_sql); $sql = "SELECT * FROM {$this->table()} {$where_sql} ORDER BY created_at DESC LIMIT %d OFFSET %d"; $params[] = $limit; $params[] = $offset; $items = $wpdb->get_results($wpdb->prepare($sql, $params), ARRAY_A); return [ 'items' => $items ?: [], 'total' => $total, 'page' => (int) floor($offset / $limit) + 1, 'max_pages' => (int) ceil(max(1, $total) / $limit), ]; } /** * 获取收益统计 */ public function get_stats(int $user_id = 0): array { global $wpdb; $where = ''; $params = []; if ($user_id > 0) { $where = 'WHERE user_id = %d'; $params[] = $user_id; } $sql = "SELECT COALESCE(SUM(amount), 0) as total, COALESCE(SUM(CASE WHEN status = 'pending' THEN amount ELSE 0 END), 0) as pending, COALESCE(SUM(CASE WHEN status = 'settled' THEN amount ELSE 0 END), 0) as settled, COUNT(*) as count FROM {$this->table()} {$where}"; if (!empty($params)) { $row = $wpdb->get_row($wpdb->prepare($sql, $params), ARRAY_A); } else { $row = $wpdb->get_row($sql, ARRAY_A); } return [ 'total' => (float) ($row['total'] ?? 0), 'pending' => (float) ($row['pending'] ?? 0), 'settled' => (float) ($row['settled'] ?? 0), 'count' => (int) ($row['count'] ?? 0), ]; } }