13-3-统计分析--学科客户分布饼图 (实现)
大约 4 分钟
13-3-统计分析--学科客户分布饼图 (实现)
统计分析-客户统计-学科客户分布饼图
需求:统计在时间段内每个学科的报名情况,和占比(百分比),用来分析出每个学科的 难度级别:B级
- 接口名
/report/subjectStatistics
- 请求方式 get请求
- 参数列表
- 传入参数:
/report/subjectStatistics/2020-03-11/2022-04-14
- beginCreateTime 开始时间
- endCreateTime 结束时间
- 传入参数:
- 返回值:
{
"msg":"操作成功",
"code":200,
"data":[
{
"subject":"Java", //学科
"num":108 //合同数量
},
{
"subject":"产品经理",
"num":1
},
{
"subject":"前端",
"num":2
},
{
"subject":"大数据",
"num":1
}
]
}
步骤思路
提示
- 阅读产品文档(接口名,请求方式,参数列表)
- 根据产品的返回值和接收参数构建VO类
- 编写mapper层操作数据库
- 编写service层操作数据
- 编写controller层接收参数和返回数据
1.阅读产品文档(接口名,请求方式,参数列表)
先来看页面,需求是:统计在时间段内每个学科的报名情况,和占比,用来分析出每个学科的火热程度

看到这个页面:
- 前端提供一个时间范围,查询在这个时间范围内每个学科报名的情况
- 报名应该查询合同表,如果这个人最终愿意报名,则会签订合同
2.根据产品的返回值和接收参数构建VO类
{
"msg":"操作成功",
"code":200,
"data":[
{
"subject":"Java", 学科
"num":108 合同数量
},
{
"subject":"产品经理",
"num":1
},
{
"subject":"前端",
"num":2
},
{
"subject":"大数据",
"num":1
}
]
}
从上述的json字符串分析出:
- 通过json可以看到
data
里的数据是被[]
包裹的,证明是一个数组 - 数组里的内容分别是使用
{},
包裹的说明这个数组是由一个个对象
组成的 - 这个对象的属性如下,
subject
是第一个属性,对应的值是""
包裹的证明是一个字符串
,num
是第二个属性,对应的值是数字
我们应该给前端返回:
- 首先是一个数组,数组里的元素就是我们的VO类
- VO类里的属性只有两个一个是subject另一个是num
- VO类结构如下:
PieChartVO
package com.huike.report.domain.vo;
import lombok.Data;
/**
* 饼图
*/
@Data
public class PieChartVO {
//学科
private String subject;
/**
* 合同数量 / 报名人数
*/
private Integer num;
}
3.编写mapper层操作数据库
3.1 sql语句
需要按照学科的方式来查询每个学科的合同数
1.首先来统计所有的合同
SELECT count(1) from tb_contract
2.按照学科来统计每个学科的报名情况
SELECT count(1) from tb_contract GROUP BY subject
这样似乎是可以的,但是对于查询的结果来说,我们需要知道,学科对应的合同数
SELECT count(1) , subject from tb_contract GROUP BY subject
这样就能统计每个学科对应的合同数,但是又有问题,因为在合同表里存的并不是学科名而是学科的id
而对应的id是存储在字典表中的
对应的字典表是 sys_dict_data
对应的学科的部分的数据如下所示

对应的数据的值是dict_value:0
对应的数据的数据类型是dict_type:course_subject
我们不能直接把0 , 1 , 2 , 3
这样的字典数据返回给前端,这样用户怎么知道对应的是什么学科呢?
我们应该将学科对应的学科名查询出来返回给前端
所以我们还需要有一个基于字典dict_value和dict_type查询dict_label的sql语句
select dict_label
from
sys_dict_data
where
dict_type = 'course_subject' and dict_value = '0'
那么在service层中就应该有一个对应的service去查询每个字典对应的中文名
String lable= sysDictDataMapper.selectDictLabel("course_subject",subjectValue);
pieChartVO.setSubject(lable);
传入的是一个写死的course_subject
是我们字典的type
,而对应的字典的名称需要去查询对应的学科的名称
在对应的SysDictDataMapper里已经提供了根据字典类型查询字典结果的方法
我们直接调用即可
/**
* 根据字典类型和字典键值查询字典数据信息
*
* @param dictType 字典类型
* @param dictValue 字典键值
* @return 字典标签
*/
public String selectDictLabel(@Param("dictType") String dictType, @Param("dictValue") String dictValue);
4.编写service层操作数据
先分组查询出所有的课程对应的合同数,将每组中的课程id替换成课程名
@Override
public List<PieChartVO> subjectStatistics(String beginCreateTime, String endCreateTime) {
List<PieChartVO> data= reportMpper.subjectStatistics(beginCreateTime,endCreateTime);
for (PieChartVO pieChartVO : data) {
String subjectValue= pieChartVO.getSubject();
String lable= sysDictDataMapper.selectDictLabel("course_subject",subjectValue);
pieChartVO.setSubject(lable);
}
return data;
}
5.编写controller层接收参数和返回数据
/**
* 学科分布统计
* @param beginCreateTime
* @param endCreateTime
* @return
*/
@GetMapping("/subjectStatistics/{beginCreateTime}/{endCreateTime}")
public AjaxResult subjectStatistics(@PathVariable String beginCreateTime, @PathVariable String endCreateTime){
return AjaxResult.success(reportService.subjectStatistics(beginCreateTime,endCreateTime));
}