以下是对代码进行优化的示例:
public List<OrderSummaryVO> listOrderSummary(User user, ReportParams params, OrderParam orderParam, int pageNo, int pageSize) {
// 订单明细状态汇总数量
List<OrderSummaryVO> orderSummaryVOs = reportRepository.findOrderDetailSummaryBySku(user.getTenantId(), params, pageNo - 1, pageSize);
if (CollectionUtils.isEmpty(orderSummaryVOs)) {
return null;
}
List<String> skuCodeSet = orderSummaryVOs.stream().map(OrderSummaryVO::getSku).collect(Collectors.toList());
Skus skus = skuRepository.findSummaryBySku(user.getTenantId(), skuCodeSet);
Map<String, Sku> skuMap = skus.stream().collect(Collectors.toMap(Sku::getSku, Function.identity(), (a, b) -> b));
DateRangeParam monthRange = params.getMonthRange();
if (monthRange == null) {
Date start = DateUtils.getStartTimeOfCurrentYear(new Date());
Date end = DateUtils.getEndTimeOfCurrentYear(new Date());
monthRange = new DateRangeParam(new DateRange(start, end));
params.setMonthRange(monthRange);
}
for (OrderSummaryVO summaryVO : orderSummaryVOs) {
summaryVO.setSkuEntity(skuMap.get(summaryVO.getSku()));
List<StockMonthly> stockOpByMonthList = reportRepository.findSummaryStockOpByMonthAndSku(user.getTenantId(), params,
summaryVO.getSku());
Set<Date> stockOpByMonthDates = stockOpByMonthList.stream()
.map(StockMonthly::getMonth)
.collect(Collectors.toSet());
Calendar currentDate = Calendar.getInstance();
currentDate.setTime(monthRange.getValue().getStart());
List<StockMonthly> stockMonthlyList = new ArrayList<>();
while (currentDate.getTime().compareTo(monthRange.getValue().getEnd()) <= 0) {
if (!stockOpByMonthDates.contains(currentDate.getTime())) {
StockMonthly stockMonth = new StockMonthly();
stockMonth.setMonth(currentDate.getTime());
stockMonth.setQtyWorkSheet(ZERO);
stockMonth.setQtyOutSourcingIn(ZERO);
stockMonth.setQtyShippedOut(ZERO);
stockOpByMonthList.add(stockMonth);
}
currentDate.add(Calendar.MONTH, 1);
}
this.fillOrdersSku(user, stockOpByMonthList, summaryVO.getSku());
List<StockMonthly> sortedList = stockOpByMonthList.stream()
.sorted(Comparator.comparing(StockMonthly::getMonth).reversed())
.collect(Collectors.toList());
summaryVO.setStockMonthlies(sortedList);
}
return orderSummaryVOs;
}
这个优化主要包括以下几点:
- 将月份范围的获取逻辑提取出来,避免多次重复计算。
- 使用
Set
存储已有的月份,用于判断是否存在相同年月的数据。 - 简化日期遍历部分的逻辑,直接比较日期大小,并按需补充缺失的数据。
- 对
stockOpByMonthList
进行排序后再赋值给summaryVO
,避免每次循环都进行排序操作。
请注意,这只是一个示例优化,并不一定完全符合实际需求。根据具体情况和代码要求,您可能需要进行适当的调整。
内容由零声教学AI助手提供,问题来源于学员提问