要简化这段代码,可以考虑使用函数式编程和流操作来减少重复代码。以下是一个可能的简化版本:
for (OrdersDetail detail : details) {
try {
if (detail.getState().equals(OrdersDetailState.WAIT_PROCESS)) {
distributeNotDeliveredQty(user, detail);
}
if (detail.getState().equals(OrdersDetailState.MATCH_IN_PROCESS)) {
distributeNotDeliveredQtyWithWorksheetCheck(user, detail);
}
sucess++;
} catch (Exception e) {
errors++;
errorMessage.append(String.format("订单明细取消交付[%s]失败: %s \n", detail.getId(), e.getMessage()));
}
}
...
private void distributeNotDeliveredQty(User user, OrdersDetail detail) {
OrdersDetails detailsWaitProcess = ordersDetailRepository.findByOrdersIdSkuAndStates(user.getTenantId(), detail.getOrdersId(), detail.getSku(), detail.getState());
List<OrdersDetail> sortedList = sortDetailsByDeliveryDate(detailsWaitProcess);
BigDecimal sumQty = detail.getNotDeliveredQty();
for (OrdersDetail sortDetail : sortedList) {
sumQty = sumQty.subtract(sortDetail.getQty());
if (sumQty.compareTo(ZERO) > 0) {
this.notDelivered(user, sortDetail, sortDetail.getQty(), sortDetail.getMemo());
} else {
this.notDelivered(user, sortDetail, sumQty.add(sortDetail.getQty()), sortDetail.getMemo());
break;
}
}
}
private void distributeNotDeliveredQtyWithWorksheetCheck(User user, OrdersDetail detail) {
OrdersDetails detailsMatchInProcess = ordersDetailRepository.findByOrdersIdSkuAndStates(user.getTenantId(), detail.getOrdersId(), detail.getSku(), detail.getState());
List<OrdersDetail> sortedList = sortDetailsByDeliveryDate(detailsMatchInProcess);
BigDecimal sumQty = detail.getNotDeliveredQty();
for (OrdersDetail sortDetail : sortedList) {
if (hasWorksheetOrdersDetail(sortDetail, user)) {
continue;
}
sumQty = sumQty.subtract(sortDetail.getQty());
if (sumQty.compareTo(ZERO) > 0) {
this.notDelivered(user, sortDetail, sortDetail.getQty(), sortDetail.getMemo());
} else {
this.notDelivered(user, sortDetail, sumQty.add(sortDetail.getQty()), sortDetail.getMemo());
break;
}
}
}
private List<OrdersDetail> sortDetailsByDeliveryDate(OrdersDetails details) {
return details.stream()
.sorted(Comparator.comparing(OrdersDetail::getDeliveryDateEst))
.collect(Collectors.toList());
}
private boolean hasWorksheetOrdersDetail(OrdersDetail detail, User user) {
WorksheetOrdersDetails worksheetOrdersDetails = worksheetOrdersDetailRepository.findByDetailId(detail.getId(), user.getTenantId(), StatusEnum.enable);
return CollectionUtils.isNotEmpty(worksheetOrdersDetails);
}
这个简化的版本将重复的代码提取到了独立的方法中,并使用流操作来对订单明细进行排序和过滤。这样可以提高代码的可读性和可维护性。请根据实际情况进行适当调整和修改。
内容由零声教学AI助手提供,问题来源于学员提问