package com.zy.ai.controller; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.core.annotations.ManagerAuth; import com.core.common.R; import com.zy.ai.entity.AiDataAnalysisReport; import com.zy.ai.service.AiDataAnalysisReportService; import com.zy.ai.service.DataAnalysisCoordinatorService; import com.zy.common.web.BaseController; import com.zy.system.service.ConfigService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @Slf4j @RestController @RequestMapping("/ai/dataAnalysis") @RequiredArgsConstructor public class DataAnalysisController extends BaseController { private static final int DEFAULT_LIMIT = 20; private static final int MAX_LIMIT = 100; private final DataAnalysisCoordinatorService dataAnalysisCoordinatorService; private final AiDataAnalysisReportService aiDataAnalysisReportService; private final ConfigService configService; @GetMapping("/enabled/auth") @ManagerAuth(memo = "查询AI数据分析功能开关") public R getEnabled() { Map result = new LinkedHashMap<>(); result.put("enabled", dataAnalysisCoordinatorService.isEnabled()); result.put("scheduledPeriods", configService.getConfigValue("aiDataAnalysisScheduledPeriods", "YESTERDAY")); result.put("cron", configService.getConfigValue("aiDataAnalysisCron", "0 0 1 * * ?")); result.put("uploadEnabled", "1".equals(configService.getConfigValue("aiDataAnalysisUploadEnabled", "0"))); result.put("uploadUrl", configService.getConfigValue("aiDataAnalysisUploadUrl", "")); return R.ok(result); } @PostMapping("/enabled/auth") @ManagerAuth(memo = "修改AI数据分析功能开关") public R setEnabled(@RequestParam("enabled") String enabled) { boolean isEnabled = "1".equals(enabled) || "true".equalsIgnoreCase(enabled); log.info("AI数据分析开关切换: enabled={}, 原值={}", enabled, dataAnalysisCoordinatorService.isEnabled()); dataAnalysisCoordinatorService.setEnabled(isEnabled); boolean saved = dataAnalysisCoordinatorService.isEnabled(); log.info("AI数据分析开关保存结果: {}", saved); Map result = new LinkedHashMap<>(); result.put("enabled", saved); return R.ok(result); } @PostMapping("/trigger/auth") @ManagerAuth(memo = "手动触发AI数据分析") public R trigger(@RequestParam("periodType") String periodType) { return R.ok(dataAnalysisCoordinatorService.runManualAnalysis(periodType)); } @GetMapping("/reports/auth") @ManagerAuth(memo = "查看AI数据分析报告列表") public R listReports( @RequestParam(value = "periodType", required = false) String periodType, @RequestParam(value = "limit", required = false) Integer limit) { int safeLimit = normalizeLimit(limit); QueryWrapper wrapper = new QueryWrapper<>(); if (periodType != null && !periodType.trim().isEmpty()) { wrapper.eq("period_type", periodType.trim()); } wrapper.orderByDesc("create_time").last("limit " + safeLimit); List reports = aiDataAnalysisReportService.list(wrapper); return R.ok(toReportSummaries(reports)); } @GetMapping("/report/{id}/auth") @ManagerAuth(memo = "查看AI数据分析报告详情") public R getReport(@PathVariable("id") Long id) { AiDataAnalysisReport report = aiDataAnalysisReportService.getById(id); if (report == null) { return R.error("报告不存在"); } return R.ok(toReportDetail(report)); } private int normalizeLimit(Integer limit) { if (limit == null || limit <= 0) { return DEFAULT_LIMIT; } return Math.min(limit, MAX_LIMIT); } private List> toReportSummaries(List reports) { List> result = new ArrayList<>(); if (reports == null || reports.isEmpty()) { return result; } for (AiDataAnalysisReport report : reports) { result.add(toReportSummary(report)); } return result; } private Map toReportSummary(AiDataAnalysisReport report) { LinkedHashMap item = new LinkedHashMap<>(); item.put("id", report.getId()); item.put("periodType", report.getPeriodType()); item.put("triggerType", report.getTriggerType()); item.put("status", report.getStatus()); item.put("createTime", report.getCreateTime()); item.put("finishTime", report.getFinishTime()); item.put("llmCallCount", report.getLlmCallCount()); item.put("totalTokens", report.getTotalTokens()); item.put("uploadStatus", report.getUploadStatus()); return item; } private Map toReportDetail(AiDataAnalysisReport report) { LinkedHashMap item = new LinkedHashMap<>(); item.put("id", report.getId()); item.put("periodType", report.getPeriodType()); item.put("periodStart", report.getPeriodStart()); item.put("periodEnd", report.getPeriodEnd()); item.put("triggerType", report.getTriggerType()); item.put("status", report.getStatus()); item.put("summary", report.getSummary()); item.put("structuredData", report.getStructuredData()); item.put("llmCallCount", report.getLlmCallCount()); item.put("promptTokens", report.getPromptTokens()); item.put("completionTokens", report.getCompletionTokens()); item.put("totalTokens", report.getTotalTokens()); item.put("errorMessage", report.getErrorMessage()); item.put("localFilePath", report.getLocalFilePath()); item.put("uploadStatus", report.getUploadStatus()); item.put("createTime", report.getCreateTime()); item.put("finishTime", report.getFinishTime()); return item; } }