文章目录
概要
所谓销量排名,销量指的是商品销售的数量。项目当中的商品主要包含两类:一个是套餐,一个是菜品,所以销量排名其实指的就是菜品和套餐销售的数量排名。通过柱形图来展示销量排名,这些销量是按照降序来排列,并且只需要统计销量排名前十的商品。
需求分析以及接口设计
业务规则:
-
根据时间选择区间,展示销量前10的商品(包括菜品和套餐)
-
基于可视化报表的柱状图降序展示商品销量
-
此处的销量为商品销售的份数
-
技术细节
1.Controller层
/**
* 销量统计
* @param begin
* @param end
* @return
*/
@ApiOperation("销量统计")
@GetMapping("/top10")
public Result<SalesTop10ReportVO> top10(
@DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate begin,
@DateTimeFormat(pattern = "yyyy-MM-dd")LocalDate end){
log.info("销量统计:{},{}",begin,end);
SalesTop10ReportVO salesTop10ReportVO = reportService.top10(begin, end);
return Result.success(salesTop10ReportVO);
}
2.Service层:
public SalesTop10ReportVO top10(LocalDate begin, LocalDate end) {
LocalDateTime beginTime = LocalDateTime.of(begin, LocalTime.MIN);
LocalDateTime endTime = LocalDateTime.of(end, LocalTime.MAX);
List<GoodsSalesDTO> list = orderMapper.getListByStatusAndOrderTime(beginTime,endTime,Orders.COMPLETED);
ArrayList<String> nameList = new ArrayList<>();
ArrayList<Integer> numberList = new ArrayList<>();
for (GoodsSalesDTO goodsSalesDTO : list) {
nameList.add(goodsSalesDTO.getName());
numberList.add(goodsSalesDTO.getNumber());
}
String nameListStr = StringUtils.join(nameList, ",");
String numberListStr = StringUtils.join(numberList, ",");
return SalesTop10ReportVO
.builder()
.nameList(nameListStr)
.numberList(numberListStr)
.build();
}
3.Mapper层
<select id="getListByStatusAndOrderTime" resultType="com.sky.dto.GoodsSalesDTO">
select od.name,sum(od.number) number from `sky-take-out`.orders o,`sky-take-out`.order_detail od
where o.id = od.order_id and o.status = #{status}
<if test="begin != null">and o.order_time > #{begin} </if>
<if test="end != null">and o.order_time < #{end} </if>
group by od.name #将name分为一组,就是将他们结合
order by number desc #根据销量倒序排序
limit 0,10 #查前十个
</select>
效果展示![](https://i-blog.csdnimg.cn/direct/8b82ebf0c98e478d954b8718d154a4e4.png)