ChartServiceImpl.java 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. package space.anyi.BI.service.impl;
  2. import cn.hutool.core.util.IdUtil;
  3. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  4. import org.slf4j.Logger;
  5. import org.slf4j.LoggerFactory;
  6. import org.springframework.web.multipart.MultipartFile;
  7. import space.anyi.BI.BIApplication;
  8. import space.anyi.BI.entity.Chart;
  9. import space.anyi.BI.entity.dto.ChartDTO;
  10. import space.anyi.BI.entity.vo.ChartVO;
  11. import space.anyi.BI.entity.xinghuo.HttpRequestData;
  12. import space.anyi.BI.entity.xinghuo.HttpResponseData;
  13. import space.anyi.BI.exception.SystemException;
  14. import space.anyi.BI.service.ChartService;
  15. import space.anyi.BI.mapper.ChartMapper;
  16. import org.springframework.stereotype.Service;
  17. import space.anyi.BI.util.AiUtil;
  18. import space.anyi.BI.util.BeanCopyUtil;
  19. import space.anyi.BI.util.ExcelUtils;
  20. import space.anyi.BI.util.SecurityUtils;
  21. import java.io.IOException;
  22. /**
  23. * @author 杨逸
  24. * @description 针对表【chart(图标表)】的数据库操作Service实现
  25. * @createDate 2024-11-28 19:51:56
  26. */
  27. @Service
  28. public class ChartServiceImpl extends ServiceImpl<ChartMapper, Chart>
  29. implements ChartService{
  30. private final static Logger log = LoggerFactory.getLogger(ChartServiceImpl.class);
  31. @Override
  32. public ChartVO generateChartByAI(ChartDTO chartDTO, MultipartFile file) {
  33. //读数据
  34. String csvData = "";
  35. try {
  36. csvData = ExcelUtils.excel2csv(file.getInputStream());
  37. log.info("上传的数据为:\n{}", csvData);
  38. } catch (IOException e) {
  39. e.printStackTrace();
  40. }
  41. if (csvData.length()>3000){
  42. throw new SystemException(500, "数据量过大,请上传小于3000行的数据");
  43. }
  44. StringBuilder message = new StringBuilder("原始数据:\n");
  45. message.append(csvData);
  46. message.append("分析目标:\n");
  47. message.append(chartDTO.getAnalysisTarget());
  48. message.append("\n.使用").append(chartDTO.getChartType()).append("进行可视化分析.\n");
  49. //配置prompt向AI发送请求
  50. HttpRequestData requestData = AiUtil.createDefaultRequestData(message.toString());
  51. HttpResponseData responseData = AiUtil.doChat(requestData);
  52. //解析AI返回的数据
  53. ChartVO chartVO = BeanCopyUtil.copyBean(chartDTO, ChartVO.class);
  54. String content = responseData.getChoices().get(0).getMessage().getContent();
  55. log.info("AI返回的数据为:{}", content);
  56. int index = content.indexOf("```");
  57. int endIndex = content.lastIndexOf("```");
  58. if (index == -1 || endIndex == -1){
  59. throw new SystemException(500, "AI生成图表失败");
  60. }
  61. //数据可视化,Echarts的option代码
  62. chartVO.setGeneratedChartData(content.substring(index+7, endIndex).trim());
  63. index = endIndex;
  64. //分析结论
  65. chartVO.setAnalysisConclusion(content.substring(index+3).trim());
  66. Chart chart = BeanCopyUtil.copyBean(chartVO, Chart.class);
  67. chart.setUserId(SecurityUtils.getUserId());
  68. chart.setChartData(csvData);
  69. chart.setId(IdUtil.getSnowflake(1,1).nextId());
  70. //保存到数据库
  71. save(chart);
  72. return chartVO;
  73. }
  74. }