package space.anyi.BI.service.impl; import cn.hutool.core.util.IdUtil; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.multipart.MultipartFile; import space.anyi.BI.BIApplication; import space.anyi.BI.entity.Chart; import space.anyi.BI.entity.dto.ChartDTO; import space.anyi.BI.entity.vo.ChartVO; import space.anyi.BI.entity.xinghuo.HttpRequestData; import space.anyi.BI.entity.xinghuo.HttpResponseData; import space.anyi.BI.exception.SystemException; import space.anyi.BI.service.ChartService; import space.anyi.BI.mapper.ChartMapper; import org.springframework.stereotype.Service; import space.anyi.BI.util.AiUtil; import space.anyi.BI.util.BeanCopyUtil; import space.anyi.BI.util.ExcelUtils; import space.anyi.BI.util.SecurityUtils; import java.io.IOException; /** * @author 杨逸 * @description 针对表【chart(图标表)】的数据库操作Service实现 * @createDate 2024-11-28 19:51:56 */ @Service public class ChartServiceImpl extends ServiceImpl implements ChartService{ private final static Logger log = LoggerFactory.getLogger(ChartServiceImpl.class); @Override public ChartVO generateChartByAI(ChartDTO chartDTO, MultipartFile file) { //读数据 String csvData = ""; try { csvData = ExcelUtils.excel2csv(file.getInputStream()); log.info("上传的数据为:\n{}", csvData); } catch (IOException e) { e.printStackTrace(); } if (csvData.length()>3000){ throw new SystemException(500, "数据量过大,请上传小于3000行的数据"); } StringBuilder message = new StringBuilder("原始数据:\n"); message.append(csvData); message.append("分析目标:\n"); message.append(chartDTO.getAnalysisTarget()); message.append("\n.使用").append(chartDTO.getChartType()).append("进行可视化分析.\n"); //配置prompt向AI发送请求 HttpRequestData requestData = AiUtil.createDefaultRequestData(message.toString()); HttpResponseData responseData = AiUtil.doChat(requestData); //解析AI返回的数据 ChartVO chartVO = BeanCopyUtil.copyBean(chartDTO, ChartVO.class); String content = responseData.getChoices().get(0).getMessage().getContent(); log.info("AI返回的数据为:{}", content); int index = content.indexOf("```"); int endIndex = content.lastIndexOf("```"); if (index == -1 || endIndex == -1){ throw new SystemException(500, "AI生成图表失败"); } //数据可视化,Echarts的option代码 chartVO.setGeneratedChartData(content.substring(index+7, endIndex).trim()); index = endIndex; //分析结论 chartVO.setAnalysisConclusion(content.substring(index+3).trim()); Chart chart = BeanCopyUtil.copyBean(chartVO, Chart.class); chart.setUserId(SecurityUtils.getUserId()); chart.setChartData(csvData); chart.setId(IdUtil.getSnowflake(1,1).nextId()); //保存到数据库 save(chart); return chartVO; } }