Junjie
2 天以前 63b01db83d9aad8a15276b4236a9a22e4aeef065
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
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<String, Object> 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<String, Object> 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<AiDataAnalysisReport> wrapper = new QueryWrapper<>();
        if (periodType != null && !periodType.trim().isEmpty()) {
            wrapper.eq("period_type", periodType.trim());
        }
        wrapper.orderByDesc("create_time").last("limit " + safeLimit);
        List<AiDataAnalysisReport> 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<Map<String, Object>> toReportSummaries(List<AiDataAnalysisReport> reports) {
        List<Map<String, Object>> result = new ArrayList<>();
        if (reports == null || reports.isEmpty()) {
            return result;
        }
        for (AiDataAnalysisReport report : reports) {
            result.add(toReportSummary(report));
        }
        return result;
    }
 
    private Map<String, Object> toReportSummary(AiDataAnalysisReport report) {
        LinkedHashMap<String, Object> 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<String, Object> toReportDetail(AiDataAnalysisReport report) {
        LinkedHashMap<String, Object> 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;
    }
}