13-3-统计分析--学科客户分布饼图 (实现)

YangeIT大约 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
        }
    ]
}

步骤思路

提示

  1. 阅读产品文档(接口名,请求方式,参数列表)
  2. 根据产品的返回值和接收参数构建VO类
  3. 编写mapper层操作数据库
  4. 编写service层操作数据
  5. 编写controller层接收参数和返回数据

1.阅读产品文档(接口名,请求方式,参数列表)

先来看页面,需求是:统计在时间段内每个学科的报名情况,和占比,用来分析出每个学科的火热程度

​看到这个页面:

  1. 前端提供一个时间范围,查询在这个时间范围内每个学科报名的情况
  2. 报名应该查询合同表,如果这个人最终愿意报名,则会签订合同

2.根据产品的返回值和接收参数构建VO类

{
    "msg":"操作成功",
    "code":200,
    "data":[
        {
            "subject":"Java",    学科
            "num":108            合同数量
        },
        {
            "subject":"产品经理",
            "num":1
        },
        {
            "subject":"前端",
            "num":2
        },
        {
            "subject":"大数据",
            "num":1
        }
    ]
}

从上述的json字符串分析出:

  1. 通过json可以看到data里的数据是被[]包裹的,证明是一个数组
  2. 数组里的内容分别是使用{},包裹的说明这个数组是由一个个对象组成的
  3. 这个对象的属性如下,subject是第一个属性,对应的值是""包裹的证明是一个字符串,num是第二个属性,对应的值是数字

我们应该给前端返回:

  1. 首先是一个数组,数组里的元素就是我们的VO类
  2. VO类里的属性只有两个一个是subject另一个是num
  3. 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));
    }