/**
* 周订单量趋势
*/
@PreAuthorize("hasAuthority('admin:statistics:home:chart:order:week')")
@ApiOperation(value = "周订单量趋势")
@RequestMapping(value = "/chart/order/week", method = RequestMethod.GET)
public CommonResult<Map<String, Object>> chartOrderInWeek() {
return CommonResult.success(homeService.chartOrderInWeek());
}
service
/**
* 周订单量趋势
* @author Mr.Zhang
* @since 2020-05-16
* @return Map<String, Object>
*/
@Override
public Map<String, Object> chartOrderInWeek() {
return returnOrderDate(Constants.SEARCH_DATE_WEEK,
Constants.SEARCH_DATE_PRE_WEEK, Constants.NUM_TEN);
}
private Map<String, Object> returnOrderDate(String dateLimit, String preDateLimit, int leftTime) {
Map<String, Object> map = new HashMap<>();
//查询本周周订单量
List<StoreOrder> list = storeOrderService.getOrderGroupByDate(dateLimit, leftTime);
map.put("quality",
dataFormat(getOrderCountGroupByDate(list), dateLimit)
);
map.put("price",
dataFormat(getOrderPriceGroupByDate(list), dateLimit)
);
//查询上周周订单量
List<StoreOrder> preList = storeOrderService.getOrderGroupByDate(preDateLimit, leftTime);
map.put("preQuality",
dataFormat(getOrderCountGroupByDate(preList), preDateLimit)
);
map.put("prePrice",
dataFormat(getOrderPriceGroupByDate(preList), preDateLimit)
);
return map;
}
dao
/**
* 查询数据库中按照时间范围分组的订单数据,并统计每组订单的支付总金额、订单数量和订单ID。
* @param date 时间范围字符串,格式由调用方指定
* @param lefTime 截取创建时间长度
* @return 包含统计数据的 StoreOrder 对象列表
*/
public List<StoreOrder> getOrderGroupByDate(String date, int lefTime) {
// 创建一个 QueryWrapper 对象,用于构建查询条件和操作
QueryWrapper<StoreOrder> queryWrapper = new QueryWrapper<>();
// 选择需要查询的字段,并计算支付总金额、截取创建时间和订单数量
queryWrapper.select("sum(pay_price) as pay_price", "left(create_time, "+lefTime+") as orderId", "count(id) as id");
// 如果传入的时间范围不为空
if (StringUtils.isNotBlank(date)) {
// 获取时间范围的起始时间和结束时间
dateLimitUtilVo dateLimit = DateUtil.getDateLimit(date);
// 添加查询条件,限制订单创建时间在指定范围内
queryWrapper.between("create_time", dateLimit.getStartTime(), dateLimit.getEndTime());
}
// 设置分组条件和排序条件,将查询结果按照 orderId 进行分组并升序排序
queryWrapper.groupBy("orderId").orderByAsc("orderId");
// 执行查询操作,返回包含统计数据的 StoreOrder 对象列表
return dao.selectList(queryWrapper);
}
问题
1.假如leftTime为10,是什么意思
如果 leftTime
的值为 10,那么在代码中的这个上下文中,它的含义是指需要截取订单创建时间的前 10 个字符。这个截取操作通常用于在查询结果中按照时间段进行分组,以便统计和展示数据。
具体来说,这里的 queryWrapper.select("left(create_time, "+lefTime+") as orderId")
代码片段中,将会从订单的创建时间字段(create_time
)中截取前 10 个字符作为一个新的字段(orderId
),这个新字段将在查询结果中用于分组操作。
例如,假设订单创建时间的格式为 "YYYY-MM-DD HH:MM:SS",而 leftTime
为 10,那么截取后的 orderId
字段就会包含日期和小时部分("YYYY-MM-DD HH"),这样可以将订单按照日期和小时进行分组,以便统计一段时间内的订单数据。
2.我想截取的 orderId 字段包含YYYY-MM-DD HH:MM应该将leftTime 设为多少
如果你想截取的 orderId
字段包含到分钟级别(YYYY-MM-DD HH:MM),那么 leftTime
应该设置为 16,因为分钟部分的长度是 5 个字符,再加上日期和小时部分的长度(10 个字符),总共是 15 个字符,再加上一个用来截取的字符(分隔符 -),总共是 16 个字符。
所以,将 leftTime
设置为 16,可以确保截取的 orderId
字段包含到分钟级别的时间信息。
3.为啥使用Map<String, Object>返回呢
使用 Map<String, Object>
返回是为了灵活地组织和传递多个不同类型的数据,这在一些情况下可以更方便地处理和展示复杂的数据结构。在这段代码中,使用 Map<String, Object>
返回可以将不同类型的统计数据以可读性高的方式整合在一起。
具体地说,Map
是一种键值对的数据结构,可以用来存储多个数据项,其中每个数据项由一个键(String
类型)和对应的值(Object
类型)组成。在这段代码中,returnOrderDate()
方法需要返回多个统计数据,如订单数量、订单金额等,而这些数据具有不同的数据类型(整数、小数等),所以使用 Map<String, Object>
可以方便地将这些数据存储在一个集合中。
例如,在这段代码中,通过以下方式存储数据:
map.put("quality", dataFormat(getOrderCountGroupByDate(list), dateLimit));
map.put("price", dataFormat(getOrderPriceGroupByDate(list), dateLimit));
// ... 其他统计数据
这样做的好处是,你可以使用具有描述性的键来访问和使用这些数据,同时在代码中维护和处理这些数据也更加灵活和可读。不同于创建一个新的 Java 对象来存储这些数据,使用 Map
可以在不创建新的类的情况下进行数据组织和传递。