From 876e98e7654968634d4691b515325106c4178a78 Mon Sep 17 00:00:00 2001 From: brian Date: Wed, 12 Jul 2023 18:07:43 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B3=A8=E5=86=8C=E5=8A=9F=E8=83=BD=EF=BC=8C?= =?UTF-8?q?=E5=9B=BE=E8=A1=A8=E4=B8=8A=E4=BC=A0=E5=8E=8B=E7=BC=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sql/create_table.sql | 3 +- .../answerbi/controller/ChartController.java | 64 +++++++++++++++++++ .../model/dto/chart/ChartAddRequest.java | 6 ++ .../model/dto/chart/ChartEditRequest.java | 5 ++ .../model/dto/chart/ChartQueryRequest.java | 5 ++ .../model/dto/chart/ChartUpdateRequest.java | 4 ++ .../model/dto/chart/GenChartByAiRequest.java | 31 +++++++++ .../top/peng/answerbi/model/entity/Chart.java | 5 ++ .../service/impl/ChartServiceImpl.java | 2 + .../top/peng/answerbi/utils/ExcelUtils.java | 64 +++++++++++++++++++ src/main/resources/mapper/ChartMapper.xml | 21 +++--- .../resources/mapper/PostFavourMapper.xml | 2 +- src/main/resources/mapper/PostMapper.xml | 2 +- src/main/resources/mapper/PostThumbMapper.xml | 2 +- src/main/resources/mapper/UserMapper.xml | 18 +++--- 15 files changed, 211 insertions(+), 23 deletions(-) create mode 100644 src/main/java/top/peng/answerbi/model/dto/chart/GenChartByAiRequest.java create mode 100644 src/main/java/top/peng/answerbi/utils/ExcelUtils.java diff --git a/sql/create_table.sql b/sql/create_table.sql index 76a1c3c..5a49ee7 100644 --- a/sql/create_table.sql +++ b/sql/create_table.sql @@ -17,7 +17,7 @@ create table if not exists user deleted_flag tinyint default 0 not null comment '是否删除', user_account varchar(256) not null comment '账号', user_password varchar(512) not null comment '密码', - username varchar(256) null comment '用户昵称', + user_name varchar(256) null comment '用户昵称', user_avatar varchar(1024) null comment '用户头像', user_role varchar(256) default 'user' not null comment '用户角色:user/admin/ban', index idx_userAccount (user_account) @@ -31,6 +31,7 @@ create table if not exists chart updated_time datetime null on update CURRENT_TIMESTAMP comment '更新时间', deleted_flag tinyint default 0 not null comment '是否删除', user_id bigint null comment '创建用户 id', + chart_name varchar(128) null comment '图表名称', goal text null comment '分析目标', chart_data text null comment '图表数据', chart_type varchar(128) null comment '图表类型', diff --git a/src/main/java/top/peng/answerbi/controller/ChartController.java b/src/main/java/top/peng/answerbi/controller/ChartController.java index 935bf4a..afaade0 100644 --- a/src/main/java/top/peng/answerbi/controller/ChartController.java +++ b/src/main/java/top/peng/answerbi/controller/ChartController.java @@ -2,11 +2,18 @@ package top.peng.answerbi.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.google.gson.Gson; +import java.io.File; +import org.apache.commons.lang3.RandomStringUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.poi.util.StringUtil; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.multipart.MultipartFile; import top.peng.answerbi.annotation.AuthCheck; import top.peng.answerbi.common.CommonResponse; import top.peng.answerbi.common.DeleteRequest; import top.peng.answerbi.common.ErrorCode; import top.peng.answerbi.common.ResultUtils; +import top.peng.answerbi.constant.FileConstant; import top.peng.answerbi.constant.UserConstant; import top.peng.answerbi.exception.BusinessException; import top.peng.answerbi.exception.ThrowUtils; @@ -14,8 +21,11 @@ import top.peng.answerbi.model.dto.chart.ChartAddRequest; import top.peng.answerbi.model.dto.chart.ChartEditRequest; import top.peng.answerbi.model.dto.chart.ChartQueryRequest; import top.peng.answerbi.model.dto.chart.ChartUpdateRequest; +import top.peng.answerbi.model.dto.chart.GenChartByAiRequest; +import top.peng.answerbi.model.dto.file.UploadFileRequest; import top.peng.answerbi.model.entity.Chart; import top.peng.answerbi.model.entity.User; +import top.peng.answerbi.model.enums.FileUploadBizEnum; import top.peng.answerbi.service.ChartService; import top.peng.answerbi.service.UserService; import javax.annotation.Resource; @@ -27,6 +37,7 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import top.peng.answerbi.utils.ExcelUtils; /** * 图表接口 @@ -208,4 +219,57 @@ public class ChartController { return ResultUtils.success(result); } + /** + * 智能分析 + * + * @param multipartFile + * @param genChartByAiRequest + * @param request + * @return + */ + @PostMapping("/gen") + public CommonResponse genChartByAi(@RequestPart("file") MultipartFile multipartFile, + GenChartByAiRequest genChartByAiRequest, HttpServletRequest request) { + String chartName = genChartByAiRequest.getChartName(); + String goal = genChartByAiRequest.getGoal(); + String chartType = genChartByAiRequest.getChartType(); + + //校验 + //如果分析目标为空,就抛出请求参数错误异常,并给出提示 + ThrowUtils.throwIf(StringUtils.isBlank(goal),ErrorCode.PARAMS_ERROR,"分析目标为空"); + //如果名称不为空,并且名称长度大于100,就抛出异常,并给出提示 + ThrowUtils.throwIf(StringUtils.isNotBlank(chartName) && chartName.length() > 100,ErrorCode.PARAMS_ERROR,"图表名称过长"); + + //用户输入 + StringBuilder userInput = new StringBuilder(); + userInput.append("你是一个数据分析师,接下来我会给你我的分析目标和原始数据,请告诉我分析结论。").append("\n"); + userInput.append("分析目标:").append(goal).append("\n"); + + //压缩后的数据 + String result = ExcelUtils.excelToCsv(multipartFile); + userInput.append("数据:").append(result).append("\n"); + return ResultUtils.success(userInput.toString()); + /*//读取用户上传的excel文件,进行处理 + User loginUser = userService.getLoginUser(request); + // 文件目录:根据业务、用户来划分 + String uuid = RandomStringUtils.randomAlphanumeric(8); + String filename = uuid + "-" + multipartFile.getOriginalFilename(); + File file = null; + try { + // 返回可访问地址 + return ResultUtils.success(""); + }catch (Exception e){ + //log.error("file upload error, filepath = " + filepath, e); + throw new BusinessException(ErrorCode.SYSTEM_ERROR, "上传失败"); + }finally { + if (file != null) { + // 删除临时文件 + boolean delete = file.delete(); + if (!delete) { + //log.error("file delete error, filepath = {}", filepath); + } + } + }*/ + } + } diff --git a/src/main/java/top/peng/answerbi/model/dto/chart/ChartAddRequest.java b/src/main/java/top/peng/answerbi/model/dto/chart/ChartAddRequest.java index 2e54b84..3b3e215 100644 --- a/src/main/java/top/peng/answerbi/model/dto/chart/ChartAddRequest.java +++ b/src/main/java/top/peng/answerbi/model/dto/chart/ChartAddRequest.java @@ -17,6 +17,12 @@ import lombok.Data; */ @Data public class ChartAddRequest implements Serializable { + + /** + * 图表名称 + */ + private String chartName; + /** * 分析目标 */ diff --git a/src/main/java/top/peng/answerbi/model/dto/chart/ChartEditRequest.java b/src/main/java/top/peng/answerbi/model/dto/chart/ChartEditRequest.java index 67a004f..c2d6c9b 100644 --- a/src/main/java/top/peng/answerbi/model/dto/chart/ChartEditRequest.java +++ b/src/main/java/top/peng/answerbi/model/dto/chart/ChartEditRequest.java @@ -18,6 +18,11 @@ public class ChartEditRequest implements Serializable { */ private Long id; + /** + * 图表名称 + */ + private String chartName; + /** * 分析目标 */ diff --git a/src/main/java/top/peng/answerbi/model/dto/chart/ChartQueryRequest.java b/src/main/java/top/peng/answerbi/model/dto/chart/ChartQueryRequest.java index 0a1c7e8..011b535 100644 --- a/src/main/java/top/peng/answerbi/model/dto/chart/ChartQueryRequest.java +++ b/src/main/java/top/peng/answerbi/model/dto/chart/ChartQueryRequest.java @@ -21,6 +21,11 @@ public class ChartQueryRequest extends PageRequest implements Serializable { */ private Long id; + /** + * 图表名称 + */ + private String chartName; + /** * 分析目标 */ diff --git a/src/main/java/top/peng/answerbi/model/dto/chart/ChartUpdateRequest.java b/src/main/java/top/peng/answerbi/model/dto/chart/ChartUpdateRequest.java index c376220..82f8cf0 100644 --- a/src/main/java/top/peng/answerbi/model/dto/chart/ChartUpdateRequest.java +++ b/src/main/java/top/peng/answerbi/model/dto/chart/ChartUpdateRequest.java @@ -40,6 +40,10 @@ public class ChartUpdateRequest implements Serializable { @TableLogic private Integer deletedFlag; + /** + * 图表名称 + */ + private String chartName; /** * 分析目标 diff --git a/src/main/java/top/peng/answerbi/model/dto/chart/GenChartByAiRequest.java b/src/main/java/top/peng/answerbi/model/dto/chart/GenChartByAiRequest.java new file mode 100644 index 0000000..206fb6c --- /dev/null +++ b/src/main/java/top/peng/answerbi/model/dto/chart/GenChartByAiRequest.java @@ -0,0 +1,31 @@ +package top.peng.answerbi.model.dto.chart; + +import java.io.Serializable; +import lombok.Data; + +/** + * 文件上传请求 + * + * @author yunpeng + * @version 1.0 2023/5/16 + */ +@Data +public class GenChartByAiRequest implements Serializable { + + /** + * 图表名称 + */ + private String chartName; + + /** + * 分析目标 + */ + private String goal; + + /** + * 图表类型 + */ + private String chartType; + + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/src/main/java/top/peng/answerbi/model/entity/Chart.java b/src/main/java/top/peng/answerbi/model/entity/Chart.java index 0d1e82b..c37440f 100644 --- a/src/main/java/top/peng/answerbi/model/entity/Chart.java +++ b/src/main/java/top/peng/answerbi/model/entity/Chart.java @@ -43,6 +43,11 @@ public class Chart implements Serializable { */ private Long userId; + /** + * 图表名称 + */ + private String chartName; + /** * 分析目标 */ diff --git a/src/main/java/top/peng/answerbi/service/impl/ChartServiceImpl.java b/src/main/java/top/peng/answerbi/service/impl/ChartServiceImpl.java index c8f70f5..063ea70 100644 --- a/src/main/java/top/peng/answerbi/service/impl/ChartServiceImpl.java +++ b/src/main/java/top/peng/answerbi/service/impl/ChartServiceImpl.java @@ -33,6 +33,7 @@ public class ChartServiceImpl extends ServiceImpl return queryWrapper; } Long id = chartQueryRequest.getId(); + String chartName = chartQueryRequest.getChartName(); String goal = chartQueryRequest.getGoal(); String chartType = chartQueryRequest.getChartType(); Long userId = chartQueryRequest.getUserId(); @@ -40,6 +41,7 @@ public class ChartServiceImpl extends ServiceImpl String sortOrder = chartQueryRequest.getSortOrder(); queryWrapper.eq(id != null && id > 0, "id", id); + queryWrapper.eq(StringUtils.isNotBlank(chartName), "chart_name", goal); queryWrapper.eq(StringUtils.isNotBlank(goal), "goal", goal); queryWrapper.eq(StringUtils.isNotBlank(chartType), "chart_type", chartType); queryWrapper.eq(ObjectUtils.isNotEmpty(userId), "user_id", userId); diff --git a/src/main/java/top/peng/answerbi/utils/ExcelUtils.java b/src/main/java/top/peng/answerbi/utils/ExcelUtils.java new file mode 100644 index 0000000..6c59eb1 --- /dev/null +++ b/src/main/java/top/peng/answerbi/utils/ExcelUtils.java @@ -0,0 +1,64 @@ +/* + * @(#)ExcelUtils.java + * + * Copyright © 2023 YunPeng Corporation. + */ +package top.peng.answerbi.utils; + +import cn.hutool.core.collection.CollUtil; +import com.alibaba.excel.EasyExcel; +import com.alibaba.excel.support.ExcelTypeEnum; +import io.swagger.models.auth.In; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.util.ResourceUtils; +import org.springframework.web.multipart.MultipartFile; + +/** + * ExcelUtils Excel相关工具类 + * + * @author yunpeng + * @version 1.0 2023/7/12 + */ +@Slf4j +public class ExcelUtils { + public static String excelToCsv(MultipartFile multipartFile){ + List> list = null; + try { + list = EasyExcel.read(multipartFile.getInputStream()) + .excelType(ExcelTypeEnum.XLSX) + .sheet() + .headRowNumber(0) + .doReadSync(); + } catch (IOException e) { + log.error("表格处理错误",e); + } + //如果数据为空 + if (CollUtil.isEmpty(list)){ + return ""; + } + //转换为csv + StringBuilder sb = new StringBuilder(); + //读取表头(第一行) + Map headerMap = list.get(0); + List headerList = headerMap.values().stream().filter(ObjectUtils::isNotEmpty) + .collect(Collectors.toList()); + sb.append(StringUtils.join(headerList,",")).append("\n"); + //读取数据 + for (int i = 1; i < list.size();i++){ + Map dataMap = list.get(i); + List dataList = dataMap.values().stream().filter(ObjectUtils::isNotEmpty) + .collect(Collectors.toList()); + sb.append(StringUtils.join(dataList,",")).append("\n"); + } + return sb.toString(); + } +} diff --git a/src/main/resources/mapper/ChartMapper.xml b/src/main/resources/mapper/ChartMapper.xml index 10f4321..cce1e14 100644 --- a/src/main/resources/mapper/ChartMapper.xml +++ b/src/main/resources/mapper/ChartMapper.xml @@ -2,24 +2,25 @@ - + - - - - + + + + + - - - - + + + + id,created_time,updated_time, - deleted_flag,user_id,goal, + deleted_flag,user_id,chart_name,goal, chart_data,chart_type,gen_chart, gen_result diff --git a/src/main/resources/mapper/PostFavourMapper.xml b/src/main/resources/mapper/PostFavourMapper.xml index 0cfe67b..ba4f5c5 100644 --- a/src/main/resources/mapper/PostFavourMapper.xml +++ b/src/main/resources/mapper/PostFavourMapper.xml @@ -2,7 +2,7 @@ - + diff --git a/src/main/resources/mapper/PostMapper.xml b/src/main/resources/mapper/PostMapper.xml index c8fb018..b871ffb 100644 --- a/src/main/resources/mapper/PostMapper.xml +++ b/src/main/resources/mapper/PostMapper.xml @@ -2,7 +2,7 @@ - + diff --git a/src/main/resources/mapper/PostThumbMapper.xml b/src/main/resources/mapper/PostThumbMapper.xml index 981ef4f..fd5604c 100644 --- a/src/main/resources/mapper/PostThumbMapper.xml +++ b/src/main/resources/mapper/PostThumbMapper.xml @@ -2,7 +2,7 @@ - + diff --git a/src/main/resources/mapper/UserMapper.xml b/src/main/resources/mapper/UserMapper.xml index e932ae5..a3c0831 100644 --- a/src/main/resources/mapper/UserMapper.xml +++ b/src/main/resources/mapper/UserMapper.xml @@ -2,18 +2,18 @@ - + - - - - - - - - + + + + + + + +