// Generated by sz-rust-cli make:plugin --template {{ template_type }} --name {{ plugin_name }}
// DO NOT EDIT MANUALLY
//! Controller for report `{{ plugin_name }}` with aggregation query, grouping, sorting, and pagination
use crate::models::{{ class_name | snake_case }}::{{ class_name }}ReportQuery;
use crate::models::{{ class_name | snake_case }}::{{ class_name }}ReportRow;
use sz_rust_core::error::AppError;
pub struct {{ class_name }}Controller;
impl {{ class_name }}Controller {
/// Generate aggregation report
pub async fn generate_report(
query: {{ class_name }}ReportQuery,
) -> Result<Vec<{{ class_name }}ReportRow>, AppError> {
let page = query.page.unwrap_or(1).max(1);
let page_size = query.page_size.unwrap_or(20).clamp(1, 100);
let offset = (page - 1) * page_size;
tracing::info!(
group_by = ?query.group_by,
page = page,
page_size = page_size,
"生成报表: {{ plugin_name }}"
);
let rows = Self::execute_aggregation(&query, offset as i64, page_size as i64).await?;
Ok(rows)
}
async fn execute_aggregation(
query: &{{ class_name }}ReportQuery,
offset: i64,
limit: i64,
) -> Result<Vec<{{ class_name }}ReportRow>, AppError> {
let group_columns = query.group_by.join(", ");
let _ = (group_columns, offset, limit);
Ok(vec![])
}
/// Export report as CSV
pub async fn export_csv(
query: {{ class_name }}ReportQuery,
) -> Result<String, AppError> {
let rows = Self::generate_report(query).await?;
let mut csv = String::from("report_export\n");
for row in rows {
csv.push_str(&format!("{:?}\n", row));
}
Ok(csv)
}
}