13-1-首页--待办数据统计接口(实现)
13-1-首页--待办数据统计接口(实现)
需求:查询当前用户待根进的线索,商机,和待分配的线索和商机
对于销售主管来说,主要的工作是分配线索和商机,对于销售人员来说主要是跟进线索和商机
👉 在首页提供一个入口用来展示还有多少任务是没有完成的

接口名
/index/getTodoInfo
请求方式 get请求
参数列表
- 传入参数:
/index/getTodoInfo?beginCreateTime=2021-05-05&endCreateTime=2023-05-05
- beginCreateTime 开始时间
- endCreateTime 结束时间
- 传入参数:
返回值:
{
"msg":"操作成功",
"code":200,
"data":{
"tofollowedCluesNum":0, //待跟进线索数目
"tofollowedBusinessNum":0,//待跟进商机数目
"toallocatedCluesNum":1,//待分配线索数目
"toallocatedBusinessNum":0 //待分配商机数目
}
}
步骤思路
- 阅读产品文档(接口名,请求方式,参数列表)
- 根据产品的返回值和接收参数构建VO类
- 编写mapper层操作数据库
- 编写service层操作数据
- 编写controller层接收参数和返回数据
思路:
1.阅读上述产品文档
同上需求,得出接口信息
2.根据返回值数据类型构建返回对象
根据返回值,分装实体对象
package com.huike.report.domain.vo;
import lombok.Data;
/**
* 首页--今日待办--返回前端VO类
*/
@Data
public class IndexTodoInfoVO {
private Integer tofollowedCluesNum=0; //待跟进线索数目
private Integer tofollowedBusinessNum=0; //待跟进商机数目
private Integer toallocatedCluesNum=0; //待分配线索数目
private Integer toallocatedBusinessNum=0; //待分配商机数目
}
3.基于需求编写sql
按照开始时间和结束时间查询一段时间范围内(开始时间和结束时间)的基本数据
需求:查询当前用户在选定范围内的待跟进的线索,商机,和待分配的线索和商机
对于销售主管来说,主要的工作是分配线索和商机,对于销售人员来说主要是跟进线索和商机
3.1查询待跟进线索
1.查询所有的线索
select * from tb_clue
2.查询所有的待跟进线索
待跟进这个状态从哪里进行获取
在第一天阅读代码的时候已经介绍了,业务对象的状态是保存在实体类中的枚举类中的
package com.huike.clues.domain;
/**
* 线索管理对象 tb_clue
* @date 2021-04-02
*/
public class TbClue extends BaseEntity {
public enum StatusType{
UNFOLLOWED("待跟进","1"),
FOLLOWING("跟进中","2"),
RECOVERY("回收","3"),
FALSE("伪线索/踢回公海","4"),
DELETED("删除","5"),
TOBUSINESS("转换商机","6"),
TOCUSTOMER("转换客户","7");
private String name;
private String value;
private StatusType(String name,String value){
this.name = name;
this.value = value;
}
public String getName() {
return name;
}
public String getValue() {
return value;
}
}
}
线索的状态可以看到对应的待跟进,定义了待跟进状态码 对应的是1
UNFOLLOWED("待跟进","1"),
FOLLOWING("跟进中","2"),
RECOVERY("回收","3"),
FALSE("伪线索/踢回公海","4"),
DELETED("删除","5"),
TOBUSINESS("转换商机","6"),
TOCUSTOMER("转换客户","7");
那么对应的待跟进的sql语句就应该按照枚举类里定义的内容来进行判断
那么我们现在查询待跟进 的数据 👇
SELECT * FROM tb_clue WHERE `status` = 1
3.查询当前用户待跟进的所有线索
如果要判断这个线索是某一个人的需要关联到分配表
tb_assign_record 其中的用户名是对应的用户名,如果是最后一条 latest是1 ,如果是线索type为1
SELECT * FROM `tb_clue` WHERE `status` = 1 AND
id IN(
SELECT assign_id FROM `tb_assign_record`
WHERE user_name = 'admin' AND latest = 1 AND `type` = 0
)
接下来需要考虑的是时间范围
这里的时间应该是线索的创建时间,还是应该是被分配给当前用户的时间,
由于数据是和用户进行绑定的,线索的创建时间可能当时根本没有和当前用户进行绑定,应该取的是分配表里的最后一条数据的创建时间
4.查询当前用户在一定时间范围内的待跟进线索 👇
SELECT * FROM `tb_clue` WHERE `status` = 1 AND
id IN(
SELECT assign_id FROM `tb_assign_record`
WHERE user_name = 'admin' AND latest = 1 AND `type` = 0
AND create_time BETWEEN '2021-05-05' AND '2022-05-05'
)
5.统一当前用户在一定时间范围内的待跟进线索数量👇
SELECT count(id) FROM `tb_clue` WHERE `status` = 1 AND
id IN(
SELECT assign_id FROM `tb_assign_record`
WHERE user_name = 'admin' AND latest = 1 AND `type` = 0
AND create_time BETWEEN '2021-05-05' AND '2022-05-05'
)
3.2 查询待跟进商机数
原理同待跟进线索,可以自己尝试编写代码
如果自己写不出来,阅读下方的思路部分
先查询所有的商机
SELECT * FROM `tb_business`
查询待跟进的商机
同样需要先确定商机的待跟进状态
该部分同样写在枚举类中,由于商机的实体类继承了线索的实体类
public class TbBusiness extends TbClue{
我们可以认为商机的状态与线索的状态相同
UNFOLLOWED("待跟进","1"),
FOLLOWING("跟进中","2"),
RECOVERY("回收","3"),
FALSE("伪线索/踢回公海","4"),
DELETED("删除","5"),
TOBUSINESS("转换商机","6"),
TOCUSTOMER("转换客户","7");
查询所有待跟进的商机,由于待跟进状态是1我们在sql语句中用1来判断
SELECT * FROM `tb_business` WHERE `status` = 1
查询本人的所有的待跟进商机
SELECT
*
FROM
`tb_business`
WHERE id
IN(
SELECT assign_id FROM `tb_assign_record`
WHERE user_name = 'admin'
AND latest = 1
AND `type` = 1
)
AND `status` = 1
添加时间范围查询
SELECT
*
FROM
`tb_business`
WHERE id
IN(
SELECT assign_id FROM `tb_assign_record`
WHERE user_name = 'admin'
AND create_time BETWEEN '2021-05-05'
AND '2022-05-05'
AND latest = 1
AND `type` = 1
)
AND `status` = 1
添加统计逻辑,查待跟进商机数
SELECT
count(id)
FROM
`tb_business`
WHERE id
IN(
SELECT assign_id FROM `tb_assign_record`
WHERE user_name = 'admin'
AND create_time BETWEEN '2021-05-05'
AND '2022-05-05'
AND latest = 1
AND `type` = 1
)
AND `status` = 1
3.3 查询待分配线索数
对应的待分配的和待跟进的略有区别,就是一个状态的区别,只是这个状态稍微要绕一下
首先要查询所有的线索
select * from tb_clue
然后要确定待分配
什么是待分配,我创建的,但是我没有分配出去,也就是我创建了这条数据,但是我还没有分配给别人
这种就属于待分配线索
说白了就是 线索表中有数据 但是 分配表中没有数据的数据
查询所有的待分配线索
SELECT COUNT(DISTINCT(id)) AS toallocatedCluesNum
FROM `tb_clue`
WHERE id NOT IN (
SELECT assign_id FROM `tb_assign_record`
WHERE
`latest` = 1 AND
`type` = 0
)
查询属于自己的待分配线索
SELECT COUNT(DISTINCT(id)) AS toallocatedCluesNum
FROM `tb_clue`
WHERE id NOT IN (
SELECT assign_id FROM `tb_assign_record`
WHERE
`latest` = 1 AND
`type` = 0
)
AND create_by = 'admin'
查询一段时间范围内的属于自己的待分配线索
SELECT COUNT(DISTINCT(id)) AS toallocatedCluesNum
FROM `tb_clue`
WHERE id NOT IN (
SELECT assign_id FROM `tb_assign_record`
WHERE
`latest` = 1 AND
`type` = 0
)
AND create_by = 'admin'
AND create_time BETWEEN '2021-05-05' AND '2022-05-05'
3.4 查询待分配商机数
原理同待分配线索数,先自行尝试,实在无法理解,则看下面的内容
查询所有的商机数
SELECT count(id) FROM `tb_business`
查询所有的待分配的商机
即商机表里有,但是分配表里没有的数据
SELECT COUNT(id) AS toallocatedCluesNum
FROM `tb_business`
WHERE id NOT IN (
SELECT assign_id FROM `tb_assign_record`
WHERE
`latest` = 1 AND
`type` = 1
)
查询属于登录人的待分配线索
SELECT COUNT(DISTINCT(id)) AS toallocatedCluesNum
FROM `tb_business`
WHERE id NOT IN (
SELECT assign_id FROM `tb_assign_record`
WHERE
`latest` = 1 AND
`type` = 1
)
AND create_by = 'admin'
添加时间范围
SELECT COUNT(DISTINCT(id)) AS toallocatedCluesNum
FROM `tb_business`
WHERE id NOT IN (
SELECT assign_id FROM `tb_assign_record`
WHERE
`latest` = 1 AND
`type` = 1
)
AND create_by = 'admin'
AND create_time BETWEEN '2021-05-05' AND '2022-05-05'
4.编写xml代码:ReportMapper.xml
<select id="getToallocatedCluesNum" resultType="Integer">
SELECT COUNT(DISTINCT(id)) AS toallocatedCluesNum
FROM `tb_clue`
WHERE id NOT IN (
SELECT assign_id FROM `tb_assign_record`
WHERE
AND latest = 1
AND `type` = 0
)
and
AND create_time BETWEEN #{startTime} AND #{endTime}
</select>
<select id="getToallocatedBusinessNum" resultType="Integer">
SELECT COUNT(DISTINCT(id)) AS toallocatedBusinessNum
FROM `tb_business`
WHERE id NOT IN (
SELECT assign_id FROM `tb_assign_record`
WHERE create_time BETWEEN #{startTime}
AND #{endTime}
AND latest = 1
AND `type` = 1
)
AND create_time BETWEEN #{startTime} AND #{endTime}
</select>
<select id="getTofollowedCluesNum" resultType="Integer">
SELECT COUNT(DISTINCT (id)) AS tofollowedCluesNum
FROM `tb_clue`
WHERE id IN
(
SELECT assign_id FROM `tb_assign_record`
WHERE user_name = #{username}
AND create_time BETWEEN #{startTime} AND #{endTime}
AND latest = 1
AND `type` = 0
)
AND `status` = 1
</select>
<select id="getTofollowedBusinessNum" resultType="Integer">
SELECT COUNT(DISTINCT(id)) AS tofollowedBusinessNum
FROM `tb_business`
WHERE id IN (
SELECT assign_id FROM `tb_assign_record`
WHERE user_name = #{username}
AND create_time BETWEEN #{startTime} AND #{endTime}
AND latest = 1
AND `type` = 1
)
AND `status` = 1
</select>
5.编写Mapper层接口
ReportMapper
/**=========================================待办========================================*/
/**
* 首页--今日待办--待分配线索数量
* @param beginCreateTime 开始时间
* @param endCreateTime 结束时间
* @param username 用户名
* @return
*/
Integer getToallocatedCluesNum(@Param("startTime")String beginCreateTime,
@Param("endTime")String endCreateTime,
@Param("username")String username);
/**
* 首页--今日待办--待分配商机数量
* @param beginCreateTime 开始时间
* @param endCreateTime 结束时间
* @param username 用户名
* @return
*/
Integer getToallocatedBusinessNum(@Param("startTime")String beginCreateTime,
@Param("endTime")String endCreateTime,
@Param("username")String username);
/**
* 首页--今日待办--待跟进线索数量
* @param beginCreateTime
* @param endCreateTime
* @param username
* @return
*/
Integer getTofollowedCluesNum(@Param("startTime")String beginCreateTime,
@Param("endTime")String endCreateTime,
@Param("username")String username);
/**
* 首页--今日待办--待跟进商机数量
* @param beginCreateTime 开始时间
* @param endCreateTime 结束时间
* @param username 用户名
* @return
*/
Integer getTofollowedBusinessNum(@Param("startTime")String beginCreateTime,
@Param("endTime")String endCreateTime,
@Param("username")String username);
6.编写service层代码
编写service层实现类
ReportServiceImpl
/**
* 获取待办
* @param beginCreateTime 开始时间
* @param endCreateTime 结束时间
* @return
*/
@Override
public IndexTodoInfoVO getTodoInfo(String beginCreateTime, String endCreateTime) {
IndexTodoInfoVO result = new IndexTodoInfoVO();
//2 封装结果集属性
// 2.1 由于查询需要用到用户名 调用工具类获取用户名
String username = SecurityUtils.getUsername();
// 2.2 封装第一个属性 待分配线索数量
result.setToallocatedCluesNum(reportMpper.getToallocatedCluesNum(beginCreateTime,endCreateTime,username));
// 2.3 封装第二个属性 待分配商机数量
result.setToallocatedBusinessNum(reportMpper.getToallocatedBusinessNum(beginCreateTime,endCreateTime,username));
// 2.4 封装第三个属性 待跟进线索数量
result.setTofollowedCluesNum(reportMpper.getTofollowedCluesNum(beginCreateTime,endCreateTime,username));
// 2.5 封装第四个属性 待跟进商机
result.setTofollowedBusinessNum(reportMpper.getTofollowedBusinessNum(beginCreateTime,endCreateTime,username));
//3属性封装完成后,返回结果集
return result;
}
编写service层接口
IReportService
/**
* 获取待办数据
* @param beginCreateTime
* @param endCreateTime
* @return
*/
IndexTodoInfoVO getTodoInfo(String beginCreateTime, String endCreateTime);
7.编写controller层代码
IndexController
/**
* 首页--获取待办数据
* @return
*/
@GetMapping("/getTodoInfo")
public AjaxResult getTodoInfo(@RequestParam("beginCreateTime") String beginCreateTime,
@RequestParam("endCreateTime") String endCreateTime){
return AjaxResult.success(reportService.getTodoInfo(beginCreateTime,endCreateTime));
}