up:: 订单状态提示和IP地址写法升级
说明: 在实际做业务的时候呢,订单数往往是一个比较核心的这样的一个数据,因为你每天有多少订单肯定能说明你业务的规模,那么我们如何去写一个统计每日订单的一个接口
其次呢,就是在获取订单数据的时候,甚至是说和订单无关,但是涉及到数据库的时候呢,有的时候我们会碰到时区的问题,因为我们是在东八区,那实际上系统默认的通常是零时区,所以如果你遇到了时区的问题,我们在这个小节中也会去告诉你有什么排查思路,如何解决。
开发订单趋势变化图
1.首先肯定是与订单相关,其次只能管理员看见,打开orderAdminController
@GetMapping("admin/order/statistics")
@ApiOperation("每日订单量统计")
public ApiRestResponse statistics(@RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") Date startDate,
@RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") Date endDate) {
List<OrderStatisticsVO> statistics = orderService.statistics(startDate, endDate);
return ApiRestResponse.success(statistics);
}
代码很简单,不必多说
返回值是一段时间,里面对应时间上的订单数,所以使用列表形式
2.在VO包下新建OrderStatisticsVO.java文件
package com.imooc.mall.model.vo;
import java.util.Date;
/**
* 描述: 订单统计VO
*/public class OrderStatisticsVO {
private Date days;
private Integer amount;
public Date getDays() {
return days;
}
public void setDays(Date days) {
this.days = days;
}
public Integer getAmount() {
return amount;
}
public void setAmount(Integer amount) {
this.amount = amount;
}
}
3. OrderService接口文件下声明方法
List<OrderStatisticsVO> statistics(Date startDate, Date endDate);
4.OrderServiceImpl实现方法
1.首先我们需要在数据库进行查取,新建一个查询文件
package com.imooc.mall.model.query;
import java.util.Date;
/**
* 描述: 订单量统计的Query
*/public class OrderStatisticsQuery {
private Date startDate;
private Date endDate;
public Date getStartDate() {
return startDate;
}
public void setStartDate(Date startDate) {
this.startDate = startDate;
}
public Date getEndDate() {
return endDate;
}
public void setEndDate(Date endDate) {
this.endDate = endDate;
}
}
2.需要查询数据库,新建一个mapper方法
List<OrderStatisticsVO> selectOrderStatistics(@Param("query")OrderStatisticsQuery query);
3.去往xml编写sql语句进行实现
<resultMap id="listOrderStatisticsMap" type="com.imooc.mall.model.vo.OrderStatisticsVO">
<result column="days" jdbcType="TIMESTAMP" property="days"/>
<result column="amount" jdbcType="INTEGER" property="amount"/>
</resultMap>
<select id="selectOrderStatistics" resultMap="listOrderStatisticsMap">
select date_format(from_unixtime(UNIX_TIMESTAMP(create_time)), "%Y-%m-%d")
as days, count(*) as amount
from imooc_mall_order
<where>
<if test="query.startDate != null">
<![CDATA[ and create_time >= #{query.startDate} ]]>
</if>
<if test="query.endDate != null">
<![CDATA[ and create_time <= #{query.endDate} ]]>
</if>
</where>
group by days
order by days
</select>
4.实现
@Override
public List<OrderStatisticsVO> statistics(Date startDate, Date endDate) {
OrderStatisticsQuery orderStatisticsQuery = new OrderStatisticsQuery();
orderStatisticsQuery.setStartDate(startDate);
orderStatisticsQuery.setEndDate(endDate);
List<OrderStatisticsVO> orderStatisticsVOS = orderMapper.selectOrderStatistics
(orderStatisticsQuery);
return orderStatisticsVOS;
}
5. 测试
1.登陆管理员账号
破案了,登陆账号时需要在headers添加上JWT,要不然查询时还是会提醒你需要登陆。。。
2.测试结果
我们在东八区,16+8 = 0 点
时区问题
检查时间从下面三个方面进行排查
1.mysql排查
2. 检查spring boot的时区
3.排查JSON转换时区
然后运行:
可以看到已经变成零时区了,说明问题就是Json转换时区的问题