List<ApparatusUsageDetailDTO> useDetailAll = usageService.findUseDetailAll(id, "");
if (null == useDetailAll || useDetailAll.isEmpty()) {
return;
}
//将全部数据根据 类型进行分组 为 使用集合 + 归还集合
Map<Short, List<ApparatusUsageDetailDTO>> listMap = useDetailAll.stream().collect(Collectors.groupingBy(ApparatusUsageDetailDTO::getType, Collectors.toList()));
//新集合
List<ApparatusUsageDetailDTO> data = new ArrayList<>();
//使用集合排序 按照id倒序 最大的排前面
List<ApparatusUsageDetailDTO> useApparatus = listMap.get((short) 1).stream().sorted(Comparator.comparing(ApparatusUsageDetailDTO::getId).reversed()).collect(Collectors.toList());
//归还集合排序 按照id倒序 最大的排前面
List<ApparatusUsageDetailDTO> returnApparatus = listMap.get((short) 2).stream().sorted(Comparator.comparing(ApparatusUsageDetailDTO::getId).reversed()).collect(Collectors.toList());
//遍历归还的仪器 将数据拼装在使用的字段中
Iterator<ApparatusUsageDetailDTO> useApparatusIterator = useApparatus.iterator();
Iterator<ApparatusUsageDetailDTO> returnDetailIterator = returnApparatus.iterator();
while (returnDetailIterator.hasNext()) {
//获取归还的仪器编号
ApparatusUsageDetailDTO returnDetail = returnDetailIterator.next();
String apparatusNumber = returnDetail.getApparatusNumber();
Date backDate = returnDetail.getBackDate();
// 获取领用记录中 当前编号的最大id的领用记录
while (useApparatusIterator.hasNext()) {
ApparatusUsageDetailDTO usageDetail = useApparatusIterator.next();
//如果领用记录最新的仪器编号 和 当前归还记录的一致, 归还时间要大于领用时间
if (usageDetail.getApparatusNumber().equalsIgnoreCase(apparatusNumber)
&& backDate.after(usageDetail.getUsageDate())) {
//将归还时间和人 填充进使用记录对应字段
usageDetail.setBackDate(returnDetail.getBackDate());
usageDetail.setBackName(returnDetail.getBackName());
//将封装后的数据保存到data缓存list
data.add(usageDetail);
//使用集合移除这个记录
useApparatusIterator.remove();
//归还集合移除这个记录
returnDetailIterator.remove();
break;
}
}
}
//将使用集合剩余的元素添加到data中
data.addAll(useApparatus);
//需要导出的数据集合
List<ApparatusUsageDetailDTO> collect = data.stream().sorted(Comparator.comparing(ApparatusUsageDetailDTO::getId).reversed()).collect(Collectors.toList());
try {
ExcelUtil.writeExcel(response, collect, "仪器设备出入库登记表", "仪器设备出入库登记表", ApparatusUsageDetailDTO.class);
} catch (Exception e) {
log.error("仪器设备出入库登记表导出接口异常", e);
}
两个list集合数据 根据某个属性值进行匹配融合,剩余的封装进新的集合
这段代码主要实现了对仪器设备使用和归还记录的整合。首先通过服务获取所有使用详情,然后根据类型对数据进行分组。接着,对使用和归还集合分别按ID降序排序,并遍历归还集合,将归还记录与使用记录匹配,如果归还时间晚于使用时间,则更新使用记录并存入新集合。最后,将未匹配的使用记录添加到新集合中,按照ID降序排序后导出为Excel文件。
摘要由CSDN通过智能技术生成