|
|
@@ -483,6 +483,9 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, LandOrder> implem
|
|
|
public IPage<OrderAcctVO> getAcct(IPage<OrderAcctVO> page, OrderAcctVO acctVO) {
|
|
|
acctVO.setTenantId(AuthUtil.getTenantId());
|
|
|
List<OrderAcctVO> acctList = baseMapper.selectAcctList(page, acctVO);
|
|
|
+ if (CollectionUtil.isEmpty(acctList)) {
|
|
|
+ return page;
|
|
|
+ }
|
|
|
calculateAcct(acctList);
|
|
|
return page.setRecords(acctList);
|
|
|
}
|
|
|
@@ -491,6 +494,9 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, LandOrder> implem
|
|
|
public List<OrderAcctVO> getAcctNoPage(OrderAcctVO acctVO) {
|
|
|
acctVO.setTenantId(AuthUtil.getTenantId());
|
|
|
List<OrderAcctVO> acctList = baseMapper.selectAcctList(null, acctVO);
|
|
|
+ if (CollectionUtil.isEmpty(acctList)) {
|
|
|
+ return acctList;
|
|
|
+ }
|
|
|
calculateAcct(acctList);
|
|
|
return acctList;
|
|
|
}
|
|
|
@@ -2032,27 +2038,75 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, LandOrder> implem
|
|
|
}
|
|
|
|
|
|
private void calculateAcct(List<OrderAcctVO> acctList) {
|
|
|
- acctList.forEach(acct -> {
|
|
|
- LambdaQueryWrapper<OrderFee> orderFeeLambda = new LambdaQueryWrapper<>();
|
|
|
- orderFeeLambda.eq(OrderFee::getIsDeleted, 0);
|
|
|
-
|
|
|
+ if (ObjectUtil.isEmpty(acctList)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ List<String> carNumberList = acctList.stream().map(OrderAcctVO::getPlateNo).filter(Objects::nonNull).distinct().collect(Collectors.toList());
|
|
|
+ List<LandVehicle> vehicleList = landVehicleClient.selectVehicleListByCarNumberList(carNumberList);
|
|
|
+ LinkedHashSet<Long> bulkOrderIds = new LinkedHashSet<>();
|
|
|
+ LinkedHashSet<Long> bulkItemIds = new LinkedHashSet<>();
|
|
|
+ LinkedHashSet<Long> addressOrderIds = new LinkedHashSet<>();
|
|
|
+ for (OrderAcctVO acct : acctList) {
|
|
|
+ if (acct.getOrderId() != null) {
|
|
|
+ addressOrderIds.add(acct.getOrderId());
|
|
|
+ }
|
|
|
if (!ObjectUtil.isEmpty(acct.getShippingMode()) && acct.getShippingMode().equals("散货")) {
|
|
|
- orderFeeLambda.eq(OrderFee::getOrderId, acct.getOrderId());
|
|
|
- } else {
|
|
|
- orderFeeLambda.eq(OrderFee::getItemId, acct.getItemId());
|
|
|
+ if (acct.getOrderId() != null) {
|
|
|
+ bulkOrderIds.add(acct.getOrderId());
|
|
|
+ }
|
|
|
+ } else if (acct.getItemId() != null) {
|
|
|
+ bulkItemIds.add(acct.getItemId());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ Map<Long, List<OrderFee>> feesByOrderId = groupOrderFeesByOrderId(listOrderFeesByOrderIds(bulkOrderIds));
|
|
|
+ Map<Long, List<OrderFee>> feesByItemId = groupOrderFeesByItemId(listOrderFeesByItemIds(bulkItemIds));
|
|
|
+ LinkedHashSet<Long> feeIds = new LinkedHashSet<>();
|
|
|
+ LinkedHashSet<Long> corpIds = new LinkedHashSet<>();
|
|
|
+ for (OrderAcctVO acct : acctList) {
|
|
|
+ List<OrderFee> feeList = resolveAcctFeeList(acct, feesByOrderId, feesByItemId);
|
|
|
+ for (OrderFee fee : feeList) {
|
|
|
+ if (!ObjectUtil.isEmpty(fee.getFeeId())) {
|
|
|
+ feeIds.add(fee.getFeeId());
|
|
|
+ if (fee.getCorpId() != null) {
|
|
|
+ corpIds.add(fee.getCorpId());
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
- List<OrderFee> feeList = orderFeeMapper.selectList(orderFeeLambda);
|
|
|
+ }
|
|
|
+ Map<Long, String> feeIdToName = batchLoadFeeNamesById(feeIds);
|
|
|
+ Map<Long, CorpsDesc> corpIdToDesc = batchLoadCorpsById(corpIds);
|
|
|
+ Map<Long, List<OrderAddress>> addressesByOrderId = loadOrderAddressesGrouped(addressOrderIds);
|
|
|
+
|
|
|
+ for (OrderAcctVO acct : acctList) {
|
|
|
+ if (StringUtil.isNotBlank(acct.getPlateNo())) {
|
|
|
+ LandVehicle vehicle = vehicleList.stream().filter(e -> e.getPlateNo().equals(acct.getPlateNo())).findFirst().orElse(null);
|
|
|
+ acct.setVehicleOwned(Objects.nonNull(vehicle) && Objects.nonNull(vehicle.getOwned()) ? vehicle.getOwned() : 0);
|
|
|
+ acct.setHasGpsId(Objects.nonNull(vehicle) && Objects.nonNull(vehicle.getGpsId()) ? 1 : 0);
|
|
|
+ acct.setVehicleId(Objects.nonNull(vehicle) && Objects.nonNull(vehicle.getId()) ? vehicle.getId() : null);
|
|
|
+ }
|
|
|
+ List<OrderFee> feeList = resolveAcctFeeList(acct, feesByOrderId, feesByItemId);
|
|
|
|
|
|
StringBuilder extraAmountItemD = new StringBuilder();
|
|
|
StringBuilder extraAmountItemC = new StringBuilder();
|
|
|
+ BigDecimal extraAmountD = BigDecimal.ZERO;
|
|
|
+ BigDecimal extraAmountC = BigDecimal.ZERO;
|
|
|
for (OrderFee fee : feeList) {
|
|
|
if (!ObjectUtil.isEmpty(fee.getFeeId())) {
|
|
|
- R<FeesDesc> feesMessage = feesDescClient.detail(fee.getFeeId());
|
|
|
- if (feesMessage.isSuccess() && feesMessage.getData() != null) {
|
|
|
- fee.setFeeName(feesMessage.getData().getCname());
|
|
|
+ String feeName = feeIdToName.get(fee.getFeeId());
|
|
|
+ if (feeName != null) {
|
|
|
+ fee.setFeeName(feeName);
|
|
|
+ } else {
|
|
|
+ R<FeesDesc> feesMessage = feesDescClient.detail(fee.getFeeId());
|
|
|
+ if (feesMessage.isSuccess() && feesMessage.getData() != null) {
|
|
|
+ fee.setFeeName(feesMessage.getData().getCname());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ CorpsDesc corp = fee.getCorpId() == null ? null : corpIdToDesc.get(fee.getCorpId());
|
|
|
+ if (corp == null && fee.getCorpId() != null) {
|
|
|
+ corp = corpsDescClient.getCorpId(fee.getCorpId());
|
|
|
}
|
|
|
- CorpsDesc corp = corpsDescClient.getCorpId(fee.getCorpId());
|
|
|
if (fee.getType() == 1) {
|
|
|
+ extraAmountD = extraAmountD.add(fee.getAmount());
|
|
|
if (corp != null) {
|
|
|
extraAmountItemD.append("客户名称").append(":").append(corp.getCname()).append(" >>>> ");
|
|
|
}
|
|
|
@@ -2063,6 +2117,9 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, LandOrder> implem
|
|
|
extraAmountItemD.append("\n");
|
|
|
}
|
|
|
} else {
|
|
|
+ if (fee.getType() == 2) {
|
|
|
+ extraAmountC = extraAmountC.add(fee.getAmount());
|
|
|
+ }
|
|
|
if (corp != null) {
|
|
|
extraAmountItemC.append("车队名称").append(":").append(corp.getCname()).append(" >>>> ");
|
|
|
}
|
|
|
@@ -2076,22 +2133,16 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, LandOrder> implem
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- acct.setExtraAmountD(feeList.stream().filter(e -> e.getType() == 1).reduce(BigDecimal.ZERO, (x, y) -> x.add(y.getAmount()), BigDecimal::add));
|
|
|
+ acct.setExtraAmountD(extraAmountD);
|
|
|
acct.setExtraAmountItemD(extraAmountItemD.toString());
|
|
|
- acct.setExtraAmountC(feeList.stream().filter(e -> e.getType() == 2).reduce(BigDecimal.ZERO, (x, y) -> x.add(y.getAmount()), BigDecimal::add));
|
|
|
+ acct.setExtraAmountC(extraAmountC);
|
|
|
acct.setExtraAmountItemC(extraAmountItemC.toString());
|
|
|
if (null != acct.getLandAmountD() && null != acct.getExtraAmountD() && null != acct.getLandAmountC() && null != acct.getExtraAmountC()) {
|
|
|
acct.setProfit(acct.getLandAmountD().add(acct.getExtraAmountD()).subtract(acct.getLandAmountC()).subtract(acct.getExtraAmountC()));
|
|
|
}
|
|
|
|
|
|
- //重新拼接地址
|
|
|
- LambdaQueryWrapper<OrderAddress> addressLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
|
|
- addressLambdaQueryWrapper.eq(OrderAddress::getOrderId, acct.getOrderId())
|
|
|
- .eq(OrderAddress::getTenantId, AuthUtil.getTenantId())
|
|
|
- .eq(OrderAddress::getIsDeleted, 0)
|
|
|
- .orderByAsc(OrderAddress::getSort);
|
|
|
-
|
|
|
- List<OrderAddress> addressList = orderAddressMapper.selectList(addressLambdaQueryWrapper);
|
|
|
+ List<OrderAddress> addressList = acct.getOrderId() == null ? Collections.emptyList()
|
|
|
+ : addressesByOrderId.getOrDefault(acct.getOrderId(), Collections.emptyList());
|
|
|
int i = 1;
|
|
|
StringBuilder addressDetail = new StringBuilder();
|
|
|
StringBuilder unloadingPlace = new StringBuilder();
|
|
|
@@ -2119,8 +2170,146 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, LandOrder> implem
|
|
|
acct.setAddressDetail(addressDetail.toString());
|
|
|
acct.setUnloadingPlace(unloadingPlace.toString());
|
|
|
}
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- });
|
|
|
+ private List<OrderFee> listOrderFeesByOrderIds(Collection<Long> orderIds) {
|
|
|
+ if (orderIds == null || orderIds.isEmpty()) {
|
|
|
+ return Collections.emptyList();
|
|
|
+ }
|
|
|
+ List<OrderFee> all = new ArrayList<>();
|
|
|
+ List<Long> idList = new ArrayList<>(orderIds);
|
|
|
+ final int batchSize = 500;
|
|
|
+ for (int from = 0; from < idList.size(); from += batchSize) {
|
|
|
+ int to = Math.min(from + batchSize, idList.size());
|
|
|
+ List<Long> sub = idList.subList(from, to);
|
|
|
+ all.addAll(orderFeeMapper.selectList(new LambdaQueryWrapper<OrderFee>()
|
|
|
+ .eq(OrderFee::getIsDeleted, 0)
|
|
|
+ .in(OrderFee::getOrderId, sub)));
|
|
|
+ }
|
|
|
+ return all;
|
|
|
+ }
|
|
|
+
|
|
|
+ private List<OrderFee> listOrderFeesByItemIds(Collection<Long> itemIds) {
|
|
|
+ if (itemIds == null || itemIds.isEmpty()) {
|
|
|
+ return Collections.emptyList();
|
|
|
+ }
|
|
|
+ List<OrderFee> all = new ArrayList<>();
|
|
|
+ List<Long> idList = new ArrayList<>(itemIds);
|
|
|
+ final int batchSize = 500;
|
|
|
+ for (int from = 0; from < idList.size(); from += batchSize) {
|
|
|
+ int to = Math.min(from + batchSize, idList.size());
|
|
|
+ List<Long> sub = idList.subList(from, to);
|
|
|
+ all.addAll(orderFeeMapper.selectList(new LambdaQueryWrapper<OrderFee>()
|
|
|
+ .eq(OrderFee::getIsDeleted, 0)
|
|
|
+ .in(OrderFee::getItemId, sub)));
|
|
|
+ }
|
|
|
+ return all;
|
|
|
+ }
|
|
|
+
|
|
|
+ private static Map<Long, List<OrderFee>> groupOrderFeesByOrderId(List<OrderFee> fees) {
|
|
|
+ Map<Long, List<OrderFee>> map = new LinkedHashMap<>();
|
|
|
+ for (OrderFee f : fees) {
|
|
|
+ if (f.getOrderId() != null) {
|
|
|
+ map.computeIfAbsent(f.getOrderId(), k -> new ArrayList<>()).add(f);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return map;
|
|
|
+ }
|
|
|
+
|
|
|
+ private static Map<Long, List<OrderFee>> groupOrderFeesByItemId(List<OrderFee> fees) {
|
|
|
+ Map<Long, List<OrderFee>> map = new LinkedHashMap<>();
|
|
|
+ for (OrderFee f : fees) {
|
|
|
+ if (f.getItemId() != null) {
|
|
|
+ map.computeIfAbsent(f.getItemId(), k -> new ArrayList<>()).add(f);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return map;
|
|
|
+ }
|
|
|
+
|
|
|
+ private static List<OrderFee> resolveAcctFeeList(OrderAcctVO acct, Map<Long, List<OrderFee>> feesByOrderId, Map<Long, List<OrderFee>> feesByItemId) {
|
|
|
+ if (!ObjectUtil.isEmpty(acct.getShippingMode()) && acct.getShippingMode().equals("散货")) {
|
|
|
+ if (acct.getOrderId() == null) {
|
|
|
+ return Collections.emptyList();
|
|
|
+ }
|
|
|
+ List<OrderFee> list = feesByOrderId.get(acct.getOrderId());
|
|
|
+ return list != null ? list : Collections.emptyList();
|
|
|
+ }
|
|
|
+ if (acct.getItemId() == null) {
|
|
|
+ return Collections.emptyList();
|
|
|
+ }
|
|
|
+ List<OrderFee> list = feesByItemId.get(acct.getItemId());
|
|
|
+ return list != null ? list : Collections.emptyList();
|
|
|
+ }
|
|
|
+
|
|
|
+ private Map<Long, String> batchLoadFeeNamesById(Collection<Long> feeIds) {
|
|
|
+ if (feeIds == null || feeIds.isEmpty()) {
|
|
|
+ return Collections.emptyMap();
|
|
|
+ }
|
|
|
+ Map<Long, String> map = new HashMap<>();
|
|
|
+ List<Long> idList = new ArrayList<>(feeIds);
|
|
|
+ final int chunk = 200;
|
|
|
+ for (int from = 0; from < idList.size(); from += chunk) {
|
|
|
+ int to = Math.min(from + chunk, idList.size());
|
|
|
+ String idsStr = idList.subList(from, to).stream().map(String::valueOf).collect(Collectors.joining(","));
|
|
|
+ List<FeesDesc> list = feesDescClient.getFeesByIds(idsStr);
|
|
|
+ if (ObjectUtil.isNotEmpty(list)) {
|
|
|
+ for (FeesDesc fd : list) {
|
|
|
+ if (fd.getId() != null && fd.getCname() != null) {
|
|
|
+ map.put(fd.getId(), fd.getCname());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return map;
|
|
|
+ }
|
|
|
+
|
|
|
+ private Map<Long, CorpsDesc> batchLoadCorpsById(Collection<Long> corpIds) {
|
|
|
+ if (corpIds == null || corpIds.isEmpty()) {
|
|
|
+ return Collections.emptyMap();
|
|
|
+ }
|
|
|
+ Map<Long, CorpsDesc> map = new HashMap<>();
|
|
|
+ List<Long> idList = new ArrayList<>(corpIds);
|
|
|
+ final int chunk = 200;
|
|
|
+ for (int from = 0; from < idList.size(); from += chunk) {
|
|
|
+ int to = Math.min(from + chunk, idList.size());
|
|
|
+ String idsStr = idList.subList(from, to).stream().map(String::valueOf).collect(Collectors.joining(","));
|
|
|
+ List<CorpsDesc> list = corpsDescClient.selectByCorpIds(idsStr);
|
|
|
+ if (ObjectUtil.isNotEmpty(list)) {
|
|
|
+ for (CorpsDesc c : list) {
|
|
|
+ if (c.getId() != null) {
|
|
|
+ map.put(c.getId(), c);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return map;
|
|
|
+ }
|
|
|
+
|
|
|
+ private Map<Long, List<OrderAddress>> loadOrderAddressesGrouped(Collection<Long> orderIds) {
|
|
|
+ if (orderIds == null || orderIds.isEmpty()) {
|
|
|
+ return Collections.emptyMap();
|
|
|
+ }
|
|
|
+ List<OrderAddress> all = new ArrayList<>();
|
|
|
+ List<Long> idList = new ArrayList<>(orderIds);
|
|
|
+ final int batchSize = 500;
|
|
|
+ for (int from = 0; from < idList.size(); from += batchSize) {
|
|
|
+ int to = Math.min(from + batchSize, idList.size());
|
|
|
+ List<Long> sub = idList.subList(from, to);
|
|
|
+ all.addAll(orderAddressMapper.selectList(new LambdaQueryWrapper<OrderAddress>()
|
|
|
+ .in(OrderAddress::getOrderId, sub)
|
|
|
+ .eq(OrderAddress::getTenantId, AuthUtil.getTenantId())
|
|
|
+ .eq(OrderAddress::getIsDeleted, 0)
|
|
|
+ .orderByAsc(OrderAddress::getOrderId)
|
|
|
+ .orderByAsc(OrderAddress::getSort)));
|
|
|
+ }
|
|
|
+ Map<Long, List<OrderAddress>> grouped = new LinkedHashMap<>();
|
|
|
+ for (OrderAddress oa : all) {
|
|
|
+ if (oa.getOrderId() != null) {
|
|
|
+ grouped.computeIfAbsent(oa.getOrderId(), k -> new ArrayList<>()).add(oa);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return grouped;
|
|
|
}
|
|
|
|
|
|
private void buildCtn(Integer ctnQuantity, BigDecimal landWeight, LandOrder order, OrderItem item) {
|