上面是今天碰到需求,之前就做过类似的分组统计,这个相对来说比较简单,统计的也少,序号和总预约人数这两部分交给前端了,不需要由后端统计,后端统计一下预约日期和检查项目和预约人数就行;
@Override
public List<ItemStatisticsVo> statistics(ItemStatisticsModel itemStatisticsModel) {
//调用xml接口
List<ItemStatisticsVo> list = new ArrayList<>();
//这里的方法是mapper.xml映射的sql,根据传入的参数进行查询,这边调用一下
List<ItemVO> itemVOS = this.getBaseMapper().selectScrReserve(itemStatisticsModel);
if (itemVOS.isEmpty()) {
throw new ServiceException("查询为空");
}
itemVOS.forEach(t -> t.setCreateTime(DateUtil.parseDate(DateUtil.format(t.getCreateTime(), "yyyy-MM-dd"))));
//先以创建时间分组,每个时间对应一个list
Map<Date, List<ItemVO>> collect = itemVOS.stream().collect(Collectors.groupingBy(ItemVO::getCreateTime));
//k->时间 v->每个时间对应的list
collect.forEach((k, v) -> {
//每个list中包含检查项目名称,以项目名称分组
Map<String, List<ItemVO>> collect1 = v.stream().collect(Collectors.groupingBy(ItemVO::getItemName));
ItemStatisticsVo vo = new ItemStatisticsVo();
//到这儿直接set日期
vo.setReservationDate(k);
List<ItemStatisticsInfoVo> list1 = new ArrayList<>();
//x->项目名称 y->list<ItemVo>
collect1.forEach((x, y) -> {
ItemStatisticsInfoVo infoVo = new ItemStatisticsInfoVo();
//检查项目名称
infoVo.setInspectionName(x);
//统计list的大小,就是每个项目名称预约的人数
infoVo.setScNum(y.size());
list1.add(infoVo);
});
vo.setList(list1);
list.add(vo);
});
return list;
}