例如不同状态的订单量。
创建一个实体作为出参
@Data
public class OrderDataStatisticsVo {
private Long toBePaidNum = 0L;
private Long paidNum = 0L;
private Long cancelNum = 0L;
private Long shippedNum = 0L;
private Long signedInNum = 0L;
private Long refundedNum = 0L;
}
实体:
@Data
@EqualsAndHashCode(callSuper=false)
@TableName("tb_orders")
public class OrdersEntity implements Serializable {
private static final long serialVersionUID = 1L;
@TableId
private Long id;
private Integer orderState;
//其他字段省略
}
controller:
@GetMapping("dataStatistics")
@ApiOperation("数据统计")
public R dataStatistics(OrdersDTO ordersDTO){
return ordersService.dataStatistics(ordersDTO);
}
Service:
RdataStatistics(OrdersDTO ordersDTO);
两种实现方式:
第一种(sql实现)
Service的实现:
@Service public class OrdersServiceImpl extends CrudServiceImplimplements OrdersService { private static final Logger logger = LoggerFactory.getLogger(OrdersServiceImpl.class); @Autowired private OrdersDao ordersDao; public R dataStatistics(OrdersDTO ordersDTO) { logger.info("dataStatistics ordersDTO: {}", ordersDTO); return R.ok(ordersDao.dataStatistics(ordersDTO)); } }
OrdersDao:
OrderDataStatisticsVo dataStatistics(OrdersDTO ordersDTO);
OrdersDao.xml
select SUM(CASE order_state WHEN 0 THEN 1 ELSE 0 END) as toBePaidNum, SUM(CASE order_state WHEN 1 THEN 1 ELSE 0 END) as paidNum, SUM(CASE order_state WHEN 2 THEN 1 ELSE 0 END) as cancelNum, SUM(CASE order_state WHEN 4 THEN 1 ELSE 0 END) as shippedNum, SUM(CASE order_state WHEN 5 THEN 1 ELSE 0 END) as signedInNum, SUM(CASE order_state WHEN 6 THEN 1 ELSE 0 END) as refundedNum from tb_orders and id = #{id} and order_no = #{orderNo} and goods_name like CONCAt('%',#{goodsName},'%') and phone = #{phone} and order_state = #{orderState} and pay_state = #{payState} and channel_source = #{channelSource} and payment_method = #{paymentMethod} and date_format(create_time,'%Y-%m-%d') >= str_to_date(#{startTime},'%Y-%m-%d') and date_format(create_time,'%Y-%m-%d') <= str_to_date(#{endTime},'%Y-%m-%d') and date_format(pay_time,'%Y-%m-%d') >= str_to_date(#{payStartTime},'%Y-%m-%d') and date_format(pay_time,'%Y-%m-%d') <= str_to_date(#{payEndTime},'%Y-%m-%d')
第二种(业务实现)
Service的实现:
@Service public class OrdersServiceImpl extends CrudServiceImplimplements OrdersService { private static final Logger logger = LoggerFactory.getLogger(OrdersServiceImpl.class); @Autowired private OrdersDao ordersDao; public R dataStatistics(OrdersDTO ordersDTO) { logger.info("dataStatistics ordersDTO: {}", ordersDTO); QueryWrapper queryWrapper = buildWrapper(ordersDTO); queryWrapper.select("id","order_state"); List list = ordersDao.selectList(queryWrapper); Map map = list.stream().collect(Collectors.groupingBy(OrdersEntity::getOrderState,Collectors.counting())); OrderDataStatisticsVo orderDataStatisticsVo = new OrderDataStatisticsVo(); map.forEach((k,v)->{ switch (k){ case 0: orderDataStatisticsVo.setToBePaidNum(v); break; case 1: orderDataStatisticsVo.setPaidNum(v); break; case 2: orderDataStatisticsVo.setCancelNum(v); break; case 4: orderDataStatisticsVo.setShippedNum(v); break; case 5: orderDataStatisticsVo.setSignedInNum(v); break; case 6: orderDataStatisticsVo.setRefundedNum(v); break; } }); return R.ok(orderDataStatisticsVo); } private QueryWrapper buildWrapper(OrdersDTO ordersDTO) { QueryWrapper wrapper = new QueryWrapper<>(); wrapper.eq(ordersDTO.getId() != null, "id", ordersDTO.getId()); wrapper.eq(StringUtils.isNotBlank(ordersDTO.getOrderNo()), "order_no", ordersDTO.getOrderNo()); wrapper.like(StringUtils.isNotBlank(ordersDTO.getGoodsName()), "goods_name", ordersDTO.getGoodsName()); wrapper.eq(StringUtils.isNotBlank(ordersDTO.getPhone()), "phone", ordersDTO.getPhone()); wrapper.eq(ordersDTO.getOrderState() != null, "order_state", ordersDTO.getOrderState()); wrapper.eq(ordersDTO.getPayState() != null, "pay_state", ordersDTO.getPayState()); wrapper.eq(StringUtils.isNotBlank(ordersDTO.getChannelSource()), "channel_source", ordersDTO.getChannelSource()); wrapper.eq(ordersDTO.getPaymentMethod() != null, "payment_method", ordersDTO.getPaymentMethod()); if (StringUtils.isNotBlank(ordersDTO.getEndTime())) { ordersDTO.setEndTime(DateUtils.format(DateUtils.addDateDays(DateUtils.parse(ordersDTO.getEndTime(), DateUtils.DATE_PATTERN), 1), DateUtils.DATE_PATTERN)); wrapper.lt("create_time", ordersDTO.getEndTime()); } if (StringUtils.isNotBlank(ordersDTO.getStartTime())) { wrapper.ge("create_time", ordersDTO.getStartTime()); } if (StringUtils.isNotBlank(ordersDTO.getPayEndTime())) { ordersDTO.setPayEndTime(DateUtils.format(DateUtils.addDateDays(DateUtils.parse(ordersDTO.getPayEndTime(), DateUtils.DATE_PATTERN), 1), DateUtils.DATE_PATTERN)); wrapper.lt("pay_time", ordersDTO.getPayEndTime()); } if (StringUtils.isNotBlank(ordersDTO.getPayStartTime())) { wrapper.ge("pay_time", ordersDTO.getPayStartTime()); } wrapper.orderByDesc("id"); return wrapper; } }
验证:



