请求方式为GET方式,因为营业额统计本质上是一个查询类的操作, 查询相应的数据,最终把数据整合好,然后返回给前端。接口的请求参数有哪些,我们要统计营业额具体是统计哪个时间段之内的呢,应该通过参数传过来比较合理,比如说想统计近七日的,那近七日是几月几号到几月几号呢,这就需要通过参数传过来,然后后端根据它提交过来的这个参数,来查询这个时间段之内的统计数据。所以这个参数我们提交过来两个就可以了,一个是起始日期,一个是结束日期。
日期类型有固定的格式,通过@DateTimeFormat注解来描述这个日期的格式,否则不能正确封装。
1.计算dateList
从begin这一天一直加到end,把这些天数加到dateList集合里面去。把dateList集合里面的元素一个一个取出来,中间用逗号分隔开,拼成一个字符串封装到dateList里面去。
2.计算turnoverList
查询从begin到end每一天的营业额数据,中间以逗号分隔开,拼接成一个字符串封装到turnoverList里面去。
营业额与日期应该是一一对应的,哪一天的日期对应哪一天的营业额。
LocalDate只有年月日没有时分秒,而LocalDateTime既有年月日又体现时分秒。要计算当天的营业额数据就要知道当天的起始时间从什么时刻开始,也就是说除了要体现年月日还要体现时分秒,同时还要计算当天的结束时间。
//查询date日期对应的营业额数据,营业额是指:状态为"已完成"的订单金额合计
//select sum(amount) from orders where order_time > beginTime and order_time < endTime and status = 5
注意:test里面的begin、end、status要与Map中的key一样,前后一致,不然取不出来。
统计这一天的营业额,假设这一天一个订单也没有,这个营业额统计出来是null,所以它如果返回的是null的话我们把它转成0。
java"> /*** 统计指定时间区间内的营业额数据* @param begin* @param end* @return*/public TurnoverReportVO getTurnoverStatistics(LocalDate begin, LocalDate end) {//当前集合用于存放从begin到end范围内的每天的日期List<LocalDate> dateList = new ArrayList<>();dateList.add(begin);while (!end.equals(begin)){//日期计算,计算指定日期的最后一天对应的日期begin = begin.plusDays(1);dateList.add(begin);}//存放每天的营业额List<Double> turnoverList = new ArrayList();for (LocalDate date : dateList){//查询date日期对应的营业额数据,营业额是指:状态为"已完成"的订单金额合计LocalDateTime beginTime = LocalDateTime.of(date, LocalTime.MIN);LocalDateTime endTime = LocalDateTime.of(date, LocalTime.MAX);//select sum(amount) from orders where order_time > beginTime and order_time < endTime and status = 5Map map = new HashMap();map.put("begin",beginTime);map.put("end",endTime);map.put("status", Orders.COMPLETED);Double turnover = orderMapper.sumByMap(map);turnover =turnover == null ? 0.0 : turnover;turnoverList.add(turnover);}//封装返回结果return TurnoverReportVO.builder().dateList(StringUtils.join(dateList,",")).turnoverList(StringUtils.join(turnoverList,",")).build();}
·功能测试
增强for
格式 for(元素数据类型 变量名:数组或者Collection集合){
//在此处使用变量即可,该变量就是元素
}
条件运算符
条件运算符是Java中唯一的需要3个操作数的运算符,所以又称三目运算符或三元运算符。
条件运算符的语法格式如下。
条件 ? 表达式1 : 表达式2
·首先对条件进行判断,如果结果为true,则返回表达式1的值。
·如果结果为false,返回表达式2的值。
JDK8开始新增日期API
概述
·从Java8开始,java.time包提供了新的日期和时间API,主要涉及的类型有:
LocalDate:不包含具体时间的日期
LocalTime:不包含日期的时间
LocalDateTime:包含了日期及时间
LocalTimeFormatter:用于做时间的格式化和解析的
Duration:用于计算两个"时间"间隔
Period:用于计算两个"日期"间隔
·新增的API严格区分了时刻、本地日期、本地时间,并且,对日期和时间进行运算更加方便。
·其次,新的API的类型几乎全部是不可变类型(和String的使用类似),可以放心使用不必担心被修改。
LocalDate、LocalTime、LocalDateTime
·它们分别表示日期,时间,日期时间对象,它们的类的实例是不可变的对象。
·它们三者构建对象和API都是通用的。
构建对象的方式如下:
方法名 说明
Public static Xxxx now(); 静态方法,根据当前时间创建对象
LocalDate localDate = LocalDate.now();
LocalTime localTime = LocalTime.now();
LocalDateTime localDateTime = LocalDateTime.now();
Public static Xxxx of(...); LocalDate localDate 1= LocalDate.of(2099,11,11);
LocalTime localTime1 = LocalTime.of(11,11,11);
LocalDateTime localDateTime1 = LocalDateTime.0f(2020,10,6,13,23,43);
LocalDateTime综合了LocalDate和LocalTime里面的方法,所以下面只用LocalDate和LocalTime来举例。
·这些方法返回的是一个新的实例引用,因为LocalDateTime、LocalDate、LocalTime都是不可变的。
方法名 说明
plusDays,plusWeeks,plusMonths,plusYears 向当前LocalDate对象添加几天、几周、几个月、几年
minusDay,minusWeeks,minusMonths,minusYears 从LocalDate对象减去几天、几周、几个月、几年
withDayOfMonth,withDayOfYear,withMonth,withYear 将月份天数、年份天数、月份、年份修改为指定的值并返回新的LocalDate对象
isBefore,isAfter 比较两个LocalDate