Explorar o código

陆运台账修改自营车辆取值与增加是否安装温控设备

liyuan hai 17 horas
pai
achega
17cb443a5c

+ 14 - 0
blade-service-api/blade-client-api/src/main/java/org/springblade/client/feign/ILandVehicleClient.java

@@ -4,8 +4,12 @@ import org.springblade.client.entity.LandVehicle;
 import org.springblade.common.constant.LauncherConstant;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestParam;
 
+import java.util.List;
+
 @FeignClient(
 	value = LauncherConstant.APPLICATION_CLIENT_NAME
 )
@@ -14,6 +18,7 @@ public interface ILandVehicleClient {
 	String API_PREFIX = "/client";
 	String GET_VEHICLE_COUNT = API_PREFIX + "/getVehicleCount";
 	String GET_BY_PLATE_NO = API_PREFIX + "/selectByPlateNo";
+	String SELECT_VEHICLE_LIST_BY_CAR_NUMBER_LIST = API_PREFIX + "/selectVehicleListByCarNumberList";
 
 	@GetMapping(GET_VEHICLE_COUNT)
 	int getVehicleCount();
@@ -27,4 +32,13 @@ public interface ILandVehicleClient {
 	@GetMapping(GET_BY_PLATE_NO)
 	LandVehicle selectByPlateNo(@RequestParam("plateNo") String plateNo);
 
+
+	/**
+	 * 根据车辆编号列表查询车辆信息
+	 *
+	 * @param carNumberList 车牌号
+	 * @return 结果
+	 */
+	@PostMapping(SELECT_VEHICLE_LIST_BY_CAR_NUMBER_LIST)
+    List<LandVehicle> selectVehicleListByCarNumberList(@RequestBody List<String> carNumberList);
 }

+ 12 - 1
blade-service-api/blade-land-api/src/main/java/org/springblade/land/vo/OrderAcctVO.java

@@ -1,6 +1,5 @@
 package org.springblade.land.vo;
 
-import com.baomidou.mybatisplus.annotation.TableField;
 import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 
@@ -127,4 +126,16 @@ public class OrderAcctVO {
 	 */
 	private Integer vehicleOwned;
 
+	/**
+	 * 是否有GGSID
+	 * 0 否
+	 * 1 是
+	 */
+	private Integer hasGpsId;
+
+	/**
+	 * 车辆ID
+	 */
+	private Long vehicleId;
+
 }

+ 8 - 0
blade-service/blade-client/src/main/java/org/springblade/client/land/feign/LandVehicleClient.java

@@ -10,6 +10,8 @@ import org.springblade.core.tenant.annotation.NonDS;
 import org.springframework.web.bind.annotation.RestController;
 import springfox.documentation.annotations.ApiIgnore;
 
+import java.util.List;
+
 @NonDS
 @ApiIgnore()
 @RestController
@@ -34,4 +36,10 @@ public class LandVehicleClient implements ILandVehicleClient {
 			.eq(LandVehicle::getPlateNo, plateNo)
 		);
 	}
+
+	@Override
+	public List<LandVehicle> selectVehicleListByCarNumberList(List<String> carNumberList) {
+		return landVehicleService.list(new LambdaQueryWrapper<LandVehicle>().in(LandVehicle::getPlateNo, carNumberList).eq(LandVehicle::getIsDeleted, 0)
+			.eq(LandVehicle::getTenantId, AuthUtil.getTenantId()));
+	}
 }

+ 56 - 87
blade-service/blade-land/src/main/java/org/springblade/land/mapper/OrderMapper.xml

@@ -26,92 +26,53 @@
     </select>
 
      <select id="selectAcctList" resultType="org.springblade.land.vo.OrderAcctVO">
-        select
-            t1.id as orderId,
-            t2.id as itemId,
-            t1.corp_id as corpId,
-            t3.cname as corpName,
-            t3.short_name as corpShortName,
-            t1.salesman,
-            t5.name as salesmanName,
-            t1.shipping_mode as shippingMode,
-            t1.salesman_dept as salesmanDept,
-            t1.create_user as createUser,
-            t1.dispatcher,
-            t7.name as dispatcherName,
-            t1.dispatch_dept as dispatchDept,
-            t6.dept_name as dispatchDeptName,
-            t1.goods as goods,
-            (CASE WHEN
-            t1.shipping_mode != '散货'
-            THEN
-            t2.arrival_time
-            ELSE
-            t1.arrival_time
-            END) as arrivalTime,
-            t1.address_detail as addressDetail,
-            t1.unloading_place as unloadingPlace,
-            t1.contract_no as contractNo,
-            t1.dispatch_number as dispatchNumber,
-            t1.fleet_volum as fleetVolum,
-            t1.freight_collect as freightCollect,
-            t1.freight_pay as freightPay,
-            t1.receipt_no as receiptNo,
-            t1.bill_no as billNo,
-            t1.station,
-            concat(t2.ctn_type, '×', sum(t2.ctn_quantity)) as ctnDetail,
-            (CASE WHEN
-            t1.shipping_mode != '散货'
-            THEN
-            t2.fleet_id
-            ELSE
-            t1.fleet_id
-            END) as fleetId,
-            (CASE WHEN
-            t1.shipping_mode != '散货'
-            THEN
-            t4.cname
-            ELSE
-            t8.cname
-            END) as fleetName,
-            (CASE t1.shipping_mode
-            WHEN '散货' THEN t8.short_name
-            ELSE t4.short_name END) as fleetShortName,
-            (CASE WHEN
-            t1.shipping_mode != '散货'
-            THEN
-            t2.plate_no
-            ELSE
-            t1.plate_no
-            END) as plate_no,
-            t2.owned as vehicleOwned,
-            sum(t2.land_amount_c) as landAmountC,
-            sum(t2.land_amount_d) as landAmountD,
-            t2.confirm_status as confirmStatus,
-            (CASE WHEN
-            t1.shipping_mode != '散货'
-            THEN
-            t2.status
-            ELSE
-            t1.status
-            END) as status,
-            (CASE WHEN
-            t1.shipping_mode != '散货'
-            THEN
-            t2.remarks
-            ELSE
-            t1.remarks
-            END) as remarks,
-            t9.name as pickUpGoodsUserName
-        from land_order t1
-                 left join land_order_item t2 on t1.id = t2.order_id
-                 left join basic_corps_desc t3 on t1.corp_id = t3.id
-                 left join basic_corps_desc t4 on t2.fleet_id = t4.id
-                 left join basic_corps_desc t8 on t8.id = t1.fleet_id
-                 left join blade_user t5 on t1.salesman = t5.id
-                 left join blade_dept t6 on t1.dispatch_dept = t6.id
-                 left join blade_user t7 on t1.dispatcher = t7.id
-                 left join blade_user t9 on t1.pick_up_goods_user_id = t9.id
+         SELECT
+         t1.id AS orderId,
+         t2.id AS itemId,
+         t1.corp_id AS corpId,
+         t3.cname AS corpName,
+         t3.short_name AS corpShortName,
+         t1.salesman,
+         t5.name AS salesmanName,
+         t1.shipping_mode AS shippingMode,
+         t1.salesman_dept AS salesmanDept,
+         t1.create_user AS createUser,
+         t1.dispatcher,
+         t7.name AS dispatcherName,
+         t1.dispatch_dept AS dispatchDept,
+         t6.dept_name AS dispatchDeptName,
+         t1.goods AS goods,
+         (CASE WHEN t1.shipping_mode != '散货' THEN t2.arrival_time ELSE t1.arrival_time END) AS arrivalTime,
+         t1.address_detail AS addressDetail,
+         t1.unloading_place AS unloadingPlace,
+         t1.contract_no AS contractNo,
+         t1.dispatch_number AS dispatchNumber,
+         t1.fleet_volum AS fleetVolum,
+         t1.freight_collect AS freightCollect,
+         t1.freight_pay AS freightPay,
+         t1.receipt_no AS receiptNo,
+         t1.bill_no AS billNo,
+         t2.vehicle_id as vehicleId,
+         t1.station,
+         CONCAT(t2.ctn_type, '×', SUM(t2.ctn_quantity)) AS ctnDetail,
+         (CASE WHEN t1.shipping_mode != '散货' THEN t2.fleet_id ELSE t1.fleet_id END) AS fleetId,
+         t4.cname AS fleetName,
+         t4.short_name AS fleetShortName,
+         (CASE WHEN t1.shipping_mode != '散货' THEN t2.plate_no ELSE t1.plate_no END) AS plate_no,
+         SUM(t2.land_amount_c) AS landAmountC,
+         SUM(t2.land_amount_d) AS landAmountD,
+         t2.confirm_status AS confirmStatus,
+         (CASE WHEN t1.shipping_mode != '散货' THEN t2.status ELSE t1.status END) AS status,
+         (CASE WHEN t1.shipping_mode != '散货' THEN t2.remarks ELSE t1.remarks END) AS remarks,
+         t9.name AS pickUpGoodsUserName
+         FROM land_order t1
+         LEFT JOIN land_order_item t2 ON t1.id = t2.order_id
+         LEFT JOIN basic_corps_desc t3 ON t1.corp_id = t3.id
+         LEFT JOIN basic_corps_desc t4 ON t4.id = (CASE WHEN t1.shipping_mode != '散货' THEN t2.fleet_id ELSE t1.fleet_id END)
+         LEFT JOIN blade_user t5 ON t1.salesman = t5.id
+         LEFT JOIN blade_dept t6 ON t1.dispatch_dept = t6.id
+         LEFT JOIN blade_user t7 ON t1.dispatcher = t7.id
+         LEFT JOIN blade_user t9 ON t1.pick_up_goods_user_id = t9.id
         <where>
             t1.tenant_id = #{acct.tenantId}
             and t1.is_deleted = 0
@@ -141,7 +102,15 @@
             <if test="acct.salesman != null">and t1.salesman = #{acct.salesman}</if>
             <if test="acct.dispatcher != null">and t1.dispatcher = #{acct.dispatcher}</if>
             <if test="acct.dispatchDept != null">and t1.dispatchDept = #{acct.dispatchDept}</if>
-            <if test="acct.vehicleOwned != null">and t2.owned = #{acct.vehicleOwned}</if>
+            <if test="acct.vehicleOwned != null">and blv.owned = #{acct.vehicleOwned}</if>
+            <if test="acct.hasGpsId != null">
+                <if test="acct.hasGpsId == 0">
+                    and blv.gps_id is null
+                </if>
+                <if test="acct.hasGpsId == 1">
+                    and blv.gps_id is not null
+                </if>
+         </if>
             <if test="acct.salesmanDeptList != null">and t1.salesman_dept in
                 <foreach item="dept" collection="acct.salesmanDeptList" open="(" separator="," close=")">
                     #{dept}

+ 212 - 23
blade-service/blade-land/src/main/java/org/springblade/land/service/impl/OrderServiceImpl.java

@@ -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) {