11-1-按接口开发 今日简报(实现)
11-1-按接口开发 今日简报(实现)
1.接口定义
接口定义
获取首页基础数据信息(今日简报部分数据),需要查询今日处理的的线索数量,商机数量,
2.需求:
需求
当前用户在当天的线索数量,商机数量,合同数量,成交的金额
当前用户的线索 商机 合同 成交金额都不需要考虑状态只要是今日做的哪怕是回收了删除了都要考虑
以便当前销售人员进行复盘分析工作,用来分析今天操作了
- 接口名:
/index/getTodayInfo/
- 前端传入参数:无
- 返回前端数据样例
{
"msg":"操作成功",
"code":200,
"data":{
"todayCluesNum":0, //今日线索数目
"todayBusinessNum":0,//今日商机数目
"todayContractNum":1,//今日合同数目
"todaySalesAmount":0 //今日销售金额
}
}
3.提示:
提示
思路提示:
- 获取当前登录用户的用户名:
String username = SecurityUtils.getUsername();
- 查询的是被分配了多少条
- 在查询的时候数据库里的时间是的
- 统计销售金额的时候需要统计的是而,存在做活动的情况,活动有
步骤提示:
- 阅读产品文档(接口名,请求方式,参数列表)
- 根据产品的返回值和接收参数构建VO类
- 编写mapper层操作数据库
- 编写service层操作数据
- 提示获取用户名:String username = SecurityUtils.getUsername();
- 可以参考统计分析--基本数据展示接口
- 编写controller层接收参数和返回数据
4. 实现步骤
1.首先阅读接口文档:
如上
2.接口文档
如上
3.基于提供的json创建对象
创建前端需要的结果集VO对象
IndexTodayInfoVO
import lombok.Data;
@Data
public class IndexTodayInfoVO {
private Integer todayCluesNum=0; //今日线索数目
private Integer todayBusinessNum=0; //今日商机数目
private Integer todayContractNum=0; //今日合同数目
private Double todaySalesAmount=0.0; //今日销售金额
}
需求是要我们查询该用户下 思考下应该从哪些表查询? ❓
4.编写sql
查询该用户下今日的线索数目
1.查询数据库中所有的线索数目
SELECT COUNT(id) AS todayCluesNum FROM tb_clue
2.查询该用户下所有的线索数量
首先思考:
- 如何判断一个线索最终归属人是谁? -->可以单独通过线索表来进行判断吗?--->线索表里的
create_by
字段没有办法说明线索的最终归属人
而线索的创建人
,由于系统中存在分配的逻辑,一个线索可能被分配到一个人,然后又继续分配,这里我们要判断线索的最终归属人
就要去找分配表,分配表是tb_assign_record
,这张表的特点是:
- assign_id是关联id,它既可以线索id也可以是商机id,它的这个线索id和商机id的状态主要是由type字段来区分的
- type为0 标识这条技术是一条线索,如果type是1 则这是一条商机数据,这个过程中一个商机可能被分配给很多人,这其中用了一个latest字段用来区分,latest为1表示这一条记录是最后一条记录
3.查询该用户下所有的线索数目
SELECT COUNT(id) AS todayCluesNum
FROM `tb_clue`
WHERE id IN (
SELECT assign_id FROM tb_assign_record
WHERE user_name = 'admin' AND latest = 1 AND `type` = 0)
4.查询该用户下今日的线索数目
这个时候又有一个问题了,需要对比的是分配时间表里的创建时间,因为领导把任务分配给了具体的业务员的时候,这个任务就相当于分配下去了,就算作他今天的任务,所以在查询今日简报的时候,就应该被统计到
SELECT COUNT(id) AS todayCluesNum
FROM `tb_clue`
WHERE id IN
(SELECT assign_id FROM `tb_assign_record`
WHERE user_name = 'admin' AND latest = 1 AND `type` = 0
AND create_time = '2021-11-16' -- 今日时间)
大家思考一下这样写是不是就写完了,有没有问题
数据库中存储的时间是包含了时分秒的 也就是说 日期格式是yyyy-MM-dd HH:mm:ss 如:2022-06-03 22:46:42
而我们这里的比较仅仅就是一个年月日的值,当然是可以比较,但是会按照我们期望的结果进行比对年月日吗?一定不会,我们需要在比对的时候将数据库里的字段进行日期格式转换 ,这里可以通过百度的方式查阅:sql的日期格式化转化,需要对数据库中的create_time字段进行日期格式转换。
2022-06-03 22:46:42
--转化-->2022-06-03
得到下面的sql语句
SELECT COUNT(id) AS todayCluesNum
FROM `tb_clue`
WHERE id IN
(SELECT assign_id FROM `tb_assign_record`
WHERE user_name = 'admin' AND latest = 1 AND `type` = 0
AND DATE_FORMAT(create_time, '%Y-%m-%d') = '2021-11-16'
)
查询今日商机数量的sql
⚠️ ⚠️同今日线索数量,如果上面的今日线索能看明白可以,实战写不出来再来看下面的内容
1.先查询所有的商机数
SELECT COUNT(id) AS todayBusinessNum FROM `tb_business`
2.查询当前用户所有的商机数
SELECT COUNT(id) AS todayBusinessNum FROM `tb_business`
WHERE id IN
( SELECT assign_id FROM `tb_assign_record`
WHERE user_name = 'admin' AND latest = 1 AND `type` = 1 )
3.查询当前用户今日所有的商机数
SELECT COUNT(id) AS todayBusinessNum FROM `tb_business`
WHERE id IN
( SELECT assign_id FROM `tb_assign_record`
WHERE user_name = 'admin' AND latest = 1 AND `type` = 1
AND create_time = '2021-11-16'
)
考虑到创建时间需要进行日期的格式化,利用sql里的DATE_FORMAT函数来进行格式化得到如下sql
SELECT COUNT(id) AS todayBusinessNum FROM `tb_business`
WHERE id IN
( SELECT assign_id FROM `tb_assign_record`
WHERE user_name = 'admin' AND latest = 1 AND `type` = 1
AND DATE_FORMAT(create_time, '%Y-%m-%d') = '2021-11-16'
)
查询今日合同数量的sql
这个过程中合同后续没有流转了,所以通过合同表的create_by
来判断合同的最终归属人
查询该用户所有的合同数量
SELECT COUNT(id) AS todayContractNum
FROM `tb_contract`
WHERE create_by = 'admin'
查询当天的合同数量并且考虑到日期格式问题,sql如下
今日合同数量的sql如下
SELECT COUNT(id) AS todayContractNum
FROM `tb_contract`
WHERE create_by = 'admin'
AND DATE_FORMAT(create_time, '%Y-%m-%d') = '2021-11-16'
查询今日成交金额的sql
-- IFNULL(值1,0) 如果值1为空则返回0,否则返回值1
SELECT IFNULL(SUM(`contract_order`),0) AS todaySalesAmount
FROM `tb_contract`
WHERE create_by = 'admin'
AND DATE_FORMAT(create_time, '%Y-%m-%d') = '2021-11-16'
注意
写出了sql以后需要在项目中执行我们需要的sql
先从mapper层开始编写,我们整理了4条sql语句分别对应了4个数据
所以我们在mapper层也分别写对应4个sql,由于都是查询所以使用的是select,返回值类型是resultType
id对应的是mapper接口里的方法名
5.根据sql编写xml
编写对应的xml
ReportMapper.xml
<!-- 今日线索数量 -->
<select id="getTodayCluesNum" resultType="Integer">
SELECT COUNT(DISTINCT (id)) AS todayCluesNum
FROM `tb_clue`
WHERE id IN
(SELECT assign_id FROM `tb_assign_record`
WHERE user_name = #{username}
AND DATE_FORMAT(create_time, '%Y-%m-%d') = #{now}
AND latest = 1
AND `type` = 0)
</select>
<!-- 今日商机数量 -->
<select id="getTodayBusinessNum" resultType="Integer">
SELECT COUNT(DISTINCT (id)) AS todayBusinessNum
FROM `tb_business`
WHERE id IN
( SELECT
assign_id
FROM
`tb_assign_record`
WHERE user_name = #{username}
AND DATE_FORMAT(create_time, '%Y-%m-%d') = #{now}
AND latest = 1
AND `type` = 1 )
</select>
<!-- 今日合同数量 -->
<select id="getTodayContractNum" resultType="Integer">
SELECT COUNT(id) AS todayContractNum
FROM `tb_contract`
WHERE create_by = #{username}
AND DATE_FORMAT(create_time, '%Y-%m-%d') = #{now}
</select>
<!-- 今日合同金额 -->
<select id="getTodaySalesAmount" resultType="Double">
SELECT IFNULL( SUM(`contract_order`),0) AS todaySalesAmount
FROM
`tb_contract`
WHERE create_by = #{username}
AND DATE_FORMAT(create_time, '%Y-%m-%d') = #{now}
</select>
6.基于xml编写mapper层
ReportMapper.java
/**=========================================今日简报========================================*/
/**
* 首页--今日简报--今日线索数量
* @param today 今日
* @param username 用户名
* @return
*/
Integer getTodayCluesNum(@Param("now") String today,@Param("username") String username);
/**
* 首页--今日简报--今日商机数量
* @param today 今日
* @param username 用户名
* @return
*/
Integer getTodayBusinessNum(@Param("now") String today,@Param("username") String username);
/**
* 首页--今日简报--今日合同数量
* @param today 今日
* @param username 用户名
* @return
*/
Integer getTodayContractNum(@Param("now") String today,@Param("username") String username);
/**
* 首页--今日简报--今日销售金额
* @param today 今日
* @param username 用户名
* @return
*/
Double getTodaySalesAmount(@Param("now") String today,@Param("username") String username);
7.编写业务层
在业务层需要将所有的数据封装成我们之前构造的VO对象IndexTodayInfoVO
创建一个结果集对象,将每个属性都封装进去
ReportServiceImpl.java
/**
* 获取今日简报
* @param today 今日
* @return
*/
@Override
public IndexTodayInfoVO getTodayInfo(String today) {
//1)构建一个空的结果集对象
IndexTodayInfoVO result = new IndexTodayInfoVO();
//2 封装结果集属性
// 2.1 由于查询需要用到用户名 调用工具类获取用户名
String username = SecurityUtils.getUsername();
// 2.2 封装第一个属性 今日线索数量
result.setTodayCluesNum(reportMpper.getTodayCluesNum(today,username));
// 2.3 封装第二个属性 今日商机数量
result.setTodayBusinessNum(reportMpper.getTodayBusinessNum(today,username));
// 2.4 封装第三个属性 今日合同数量
result.setTodayContractNum(reportMpper.getTodayContractNum(today,username));
// 2.5 封装第四个属性 今日合同金额
result.setTodaySalesAmount(reportMpper.getTodaySalesAmount(today,username));
//3属性封装完成后,返回结果集
return result;
}
IReportService.java
/**
* 获取今日简报数据
* @param today
* @return
*/
IndexTodayInfoVO getTodayInfo(String today);
8.controller层接收参数
controller层主要是处理前端的交互,传入参数是空,返回值是包装类,用包装类封装我们的VO结果集
IndexController.java
@RestController
@RequestMapping("/index")
public class IndexController {
@Autowired
private IReportService reportService;
/**
* 首页--获取今日简报数据
* @return
*/
@GetMapping("/getTodayInfo")
public AjaxResult getTodayInfo(){
return AjaxResult.success(reportService.getTodayInfo(new SimpleDateFormat("yyyy-MM-dd").format(new Date())));
}