diff --git a/tduck-api/src/main/java/com/tduck/cloud/api/web/controller/ProjectDashboardController.java b/tduck-api/src/main/java/com/tduck/cloud/api/web/controller/ProjectDashboardController.java index 4f62148..5587819 100644 --- a/tduck-api/src/main/java/com/tduck/cloud/api/web/controller/ProjectDashboardController.java +++ b/tduck-api/src/main/java/com/tduck/cloud/api/web/controller/ProjectDashboardController.java @@ -8,6 +8,8 @@ import com.tduck.cloud.common.util.Result; import com.tduck.cloud.project.entity.UserProjectResultEntity; import com.tduck.cloud.project.service.ProjectDashboardService; import com.tduck.cloud.project.service.UserProjectResultService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @@ -24,6 +26,7 @@ import static com.tduck.cloud.project.constant.ProjectRedisKeyConstants.PROJECT_ @RestController @RequiredArgsConstructor +@Api(tags = "Dashboard") public class ProjectDashboardController { private final RedisUtils redisUtils; @@ -83,4 +86,13 @@ public class ProjectDashboardController { public Result projectReportSource(String projectKey) { return Result.success(projectDashboardService.projectReportSource(projectKey)); } + + /** + * 数据分析 + */ + @Login + @GetMapping("/user/project/report/analysis") + public Result projectReportAnalysis(String projectKey){ + return Result.success(projectDashboardService.projectReportAnalysis(projectKey)); + } } diff --git a/tduck-project/src/main/java/com/tduck/cloud/project/service/ProjectDashboardService.java b/tduck-project/src/main/java/com/tduck/cloud/project/service/ProjectDashboardService.java index 6e30f26..b46ec85 100644 --- a/tduck-project/src/main/java/com/tduck/cloud/project/service/ProjectDashboardService.java +++ b/tduck-project/src/main/java/com/tduck/cloud/project/service/ProjectDashboardService.java @@ -46,4 +46,12 @@ public interface ProjectDashboardService { * @return */ List projectReportSource(String projectKey); + + + /** + * + * @param projectKey + * @return + */ + List projectReportAnalysis(String projectKey); } diff --git a/tduck-project/src/main/java/com/tduck/cloud/project/service/impl/ProjectDashboardServiceImpl.java b/tduck-project/src/main/java/com/tduck/cloud/project/service/impl/ProjectDashboardServiceImpl.java index f69796a..d720028 100644 --- a/tduck-project/src/main/java/com/tduck/cloud/project/service/impl/ProjectDashboardServiceImpl.java +++ b/tduck-project/src/main/java/com/tduck/cloud/project/service/impl/ProjectDashboardServiceImpl.java @@ -8,10 +8,18 @@ import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.CharUtil; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.google.common.collect.Lists; +import com.tduck.cloud.project.entity.UserProjectItemEntity; +import com.tduck.cloud.project.entity.UserProjectResultEntity; +import com.tduck.cloud.project.entity.enums.ProjectItemTypeEnum; import com.tduck.cloud.project.mapper.ProjectDashboardMapper; import com.tduck.cloud.project.service.ProjectDashboardService; +import com.tduck.cloud.project.service.UserProjectItemService; +import com.tduck.cloud.project.service.UserProjectResultService; import com.tduck.cloud.project.vo.ProjectReportVO; import lombok.RequiredArgsConstructor; +import lombok.Value; import org.springframework.stereotype.Service; import java.util.*; @@ -27,6 +35,10 @@ import java.util.stream.Collectors; public class ProjectDashboardServiceImpl implements ProjectDashboardService { private final ProjectDashboardMapper projectDashboardMapper; + private final UserProjectResultService userProjectResultService; + + private final UserProjectItemService userProjectItemService; + @Override public Collection projectReportSituation(String projectKey) { @@ -61,4 +73,60 @@ public class ProjectDashboardServiceImpl implements ProjectDashboardService { public List projectReportSource(String projectKey) { return projectDashboardMapper.selectProjectReportSource(projectKey); } + + @Override + public List projectReportAnalysis(String projectKey) { + + List typeEnumList = Lists.newArrayList( + ProjectItemTypeEnum.RADIO, + ProjectItemTypeEnum.CHECKBOX, + ProjectItemTypeEnum.SELECT + ); + + // 题目 + List projectItemList = userProjectItemService.list(new QueryWrapper().lambda().eq(UserProjectItemEntity::getProjectKey, projectKey)); + // 结果 + List projectResultList = userProjectResultService.list(new QueryWrapper().lambda().select(UserProjectResultEntity::getProcessData).eq(UserProjectResultEntity::getProjectKey, projectKey)); + // 标题label与id的对应值 + Map formMap = new LinkedHashMap<>(); + // 储存标题与可选项 + Map> map = new HashMap<>(); + for (UserProjectItemEntity userProjectItemEntity : projectItemList) { + if (typeEnumList.contains(userProjectItemEntity.getType())){ + Map optionMap = new LinkedHashMap<>(); + List> options = (List>)userProjectItemEntity.getExpand().get("options"); + for (Map option : options) { + optionMap.put(option.get("label").toString(), 0); + } + // 单选框类型 + map.put("field"+userProjectItemEntity.getFormItemId(),optionMap); + // id and label + ProjectReportVO.Analysis analysis = new ProjectReportVO.Analysis(); + analysis.setLabel(userProjectItemEntity.getLabel()); + analysis.setType(userProjectItemEntity.getType().getDesc()); + formMap.put("field"+userProjectItemEntity.getFormItemId(), analysis); + } + } + + for (UserProjectResultEntity userProjectResultEntity : projectResultList) { + Map processData = userProjectResultEntity.getProcessData(); + + for (Map.Entry> entry : map.entrySet()) { + if (processData.containsKey(entry.getKey())){ + // 结果中字段值 处理多选 + String[] fieldValues = processData.get(entry.getKey()).toString().split(","); + for (int i = 0; i < fieldValues.length; i++) { + // 获取问题集合中对应的选项的count + Integer count = entry.getValue().get(fieldValues[i]); + entry.getValue().put(fieldValues[i], count +1); + } + } + formMap.get(entry.getKey()).setFieldName(new ArrayList(entry.getValue().keySet())); + formMap.get(entry.getKey()).setData(new ArrayList(entry.getValue().values())); + formMap.get(entry.getKey()).setMap(entry.getValue()); + } + } + List result = new ArrayList(formMap.values()); + return result; + } } diff --git a/tduck-project/src/main/java/com/tduck/cloud/project/vo/ProjectReportVO.java b/tduck-project/src/main/java/com/tduck/cloud/project/vo/ProjectReportVO.java index ed68625..4afd46e 100644 --- a/tduck-project/src/main/java/com/tduck/cloud/project/vo/ProjectReportVO.java +++ b/tduck-project/src/main/java/com/tduck/cloud/project/vo/ProjectReportVO.java @@ -5,6 +5,9 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +import java.util.List; +import java.util.Map; + /** * @author : smalljop * @description : 项目报表 @@ -77,4 +80,26 @@ public class ProjectReportVO { private Integer count; } + + + /** + * 反馈数据分析 + */ + @Data + @AllArgsConstructor + @NoArgsConstructor + public static class Analysis { + /** 类型 */ + private String type; + /** 题目名称 */ + private String label; + /** 标签集 */ + private List fieldName; + /** 数据集 */ + private List data; + /** 合集 */ + private Map map; + /** 图表类型 */ + private String chartType = "pie"; + } }