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转换时区的问题

可以参考优质文章谁偷了我的1天,JSON格式化时区问题_斗者_2013的博客-CSDN博客_jsonfield 时区