|
|
@@ -41,6 +41,7 @@ import com.sckw.fleet.api.model.vo.*;
|
|
|
import com.sckw.mongo.model.SckwWaybillOrder;
|
|
|
import com.sckw.order.api.dubbo.TradeOrderInfoService;
|
|
|
import com.sckw.order.api.model.OrderDetailVo;
|
|
|
+import com.sckw.order.api.model.TradeOrderContractVo;
|
|
|
import com.sckw.order.api.model.TradeOrderSettlePara;
|
|
|
import com.sckw.product.api.dubbo.GoodsInfoService;
|
|
|
import com.sckw.product.api.model.KwpGoods;
|
|
|
@@ -170,7 +171,8 @@ public class KwtWaybillOrderV1Service {
|
|
|
LogisticsScoreFeignService logisticsScoreFeignService;
|
|
|
@Autowired
|
|
|
private KwtLogisticsOrderAddressRepository kwtLogisticsOrderAddressRepository;
|
|
|
-
|
|
|
+ // 定义超时时间常量
|
|
|
+ private static final long PARALLEL_TIMEOUT_SECONDS = 60;
|
|
|
/**
|
|
|
* @param params 请求参数
|
|
|
* @desc 统计
|
|
|
@@ -3011,6 +3013,9 @@ public class KwtWaybillOrderV1Service {
|
|
|
Map<String, Map<String, String>> result = queryDictionaryData();
|
|
|
log.debug("字典数据查询完成");
|
|
|
return result;
|
|
|
+ },traceTaskExecutor).exceptionally(ex -> {
|
|
|
+ log.error("字典查询失败", ex);
|
|
|
+ throw new BusinessException("字典查询失败");
|
|
|
});
|
|
|
|
|
|
// 等待物流订单ID和运单ID查询完成
|
|
|
@@ -3047,21 +3052,130 @@ public class KwtWaybillOrderV1Service {
|
|
|
OrderIds orderIds = extractOrderIds(records);
|
|
|
|
|
|
// 并行执行批量查询和获取字典数据
|
|
|
- log.debug("开始并行执行批量查询和获取字典数据");
|
|
|
- CompletableFuture<OrderData> orderDataFuture = CompletableFuture.supplyAsync(() -> batchQueryOrderData(orderIds));
|
|
|
+ log.debug("开始并行执行订单数据查询");
|
|
|
+ CompletableFuture<OrderData> orderDataFuture = CompletableFuture.supplyAsync(() -> {
|
|
|
+ log.debug("开始查询订单数据,订单ID数量: {}", orderIds.getWayBillOrderIds().size());
|
|
|
+ OrderData result = batchQueryOrderData(orderIds);
|
|
|
+ log.debug("订单数据查询完成");
|
|
|
+ return result;
|
|
|
+ }, traceTaskExecutor).exceptionally(ex -> {
|
|
|
+ log.error("查询订单失败", ex);
|
|
|
+ throw new BusinessException("查询订单失败");
|
|
|
+ });
|
|
|
+
|
|
|
+ log.debug("开始查询物流订单,物流订单ID数量: {}", orderIds.getLogicsOrderIds().size());
|
|
|
+ CompletableFuture<List<KwtLogisticsOrder>> logisticsOrderFuture = CompletableFuture.supplyAsync(() ->
|
|
|
+ logisticsOrderRepository.queryByLogOrderIds(orderIds.getLogicsOrderIds()), traceTaskExecutor)
|
|
|
+ .exceptionally(ex -> {
|
|
|
+ log.error("查询物流订单失败", ex);
|
|
|
+ throw new BusinessException("查询物流订单失败");
|
|
|
+ });
|
|
|
+
|
|
|
+ log.debug("开始查询商品信息,物流订单ID数量: {}", orderIds.getLogicsOrderIds().size());
|
|
|
+ CompletableFuture<List<KwtLogisticsOrderGoods>> goodsInfoFuture = CompletableFuture.supplyAsync(() ->
|
|
|
+ kwtLogisticsOrderGoodsRepository.queryByLogIds(new ArrayList<>(orderIds.getLogicsOrderIds())), traceTaskExecutor)
|
|
|
+ .exceptionally(ex -> {
|
|
|
+ log.error("查询物流商品失败", ex);
|
|
|
+ throw new BusinessException("查询物流商品失败");
|
|
|
+ });
|
|
|
+
|
|
|
+ // ====== 提取 tradeOrderIds ======
|
|
|
+ log.debug("开始提取贸易订单ID");
|
|
|
+ CompletableFuture<Set<Long>> tradeOrderIdsFuture =
|
|
|
+ logisticsOrderFuture.thenApply(list -> {
|
|
|
+ log.debug("物流订单数据处理完成,数量: {}", list.size());
|
|
|
+ return list.stream()
|
|
|
+ .map(KwtLogisticsOrder::getTOrderId)
|
|
|
+ .filter(Objects::nonNull)
|
|
|
+ .collect(Collectors.toSet());
|
|
|
+ });
|
|
|
+
|
|
|
+ // ====== 提取 goodsIds ======
|
|
|
+ log.debug("开始提取商品ID");
|
|
|
+ CompletableFuture<Set<Long>> goodsIdsFuture =
|
|
|
+ goodsInfoFuture.thenApply(list -> {
|
|
|
+ log.debug("商品信息数据处理完成,数量: {}", list.size());
|
|
|
+ return list.stream()
|
|
|
+ .map(KwtLogisticsOrderGoods::getGoodsId)
|
|
|
+ .filter(Objects::nonNull)
|
|
|
+ .collect(Collectors.toSet());
|
|
|
+ }).handle(((goodsIds, ex) -> {
|
|
|
+ if (ex != null) {
|
|
|
+ log.error("查询商品ID失败", ex);
|
|
|
+ return Set.of();
|
|
|
+ } else {
|
|
|
+ log.debug("商品ID提取完成,数量: {}", goodsIds.size());
|
|
|
+ return goodsIds;
|
|
|
+ }
|
|
|
+ }));
|
|
|
+
|
|
|
+ // ====== 查询贸易订单合同 ======
|
|
|
+ log.debug("开始查询贸易订单合同");
|
|
|
+ CompletableFuture<List<TradeOrderContractVo>> tradeOrderContractFuture =
|
|
|
+ tradeOrderIdsFuture.thenCompose(tradeOrderIds -> {
|
|
|
+ log.debug("贸易订单ID准备完成,数量: {}", tradeOrderIds.size());
|
|
|
+ return CompletableFuture.supplyAsync(() -> {
|
|
|
+ log.debug("开始查询贸易订单合同,贸易订单ID数量: {}", tradeOrderIds.size());
|
|
|
+ List<TradeOrderContractVo> result = tradeOrderInfoService.queryTradeOrderIds(tradeOrderIds);
|
|
|
+ log.debug("贸易订单合同查询完成,数量: {}", result.size());
|
|
|
+ return result;
|
|
|
+ });
|
|
|
+ }).exceptionally(ex -> {
|
|
|
+ log.error("查询贸易订单合同失败", ex);
|
|
|
+ throw new BusinessException("查询贸易订单合同失败");
|
|
|
+ });
|
|
|
+
|
|
|
+ // ====== 查询贸易合同商品 ======
|
|
|
+ log.debug("开始查询贸易合同商品");
|
|
|
+ CompletableFuture<List<TradeContractGoodsDto>> contractGoodsFuture =
|
|
|
+ tradeOrderContractFuture.thenCombine(goodsIdsFuture, (contracts, goodsIds) -> {
|
|
|
+ log.debug("贸易合同和商品ID准备完成,合同数量: {}, 商品ID数量: {}",
|
|
|
+ Optional.ofNullable(contracts).map(List::size).orElse(0),
|
|
|
+ goodsIds.size());
|
|
|
+ Set<Long> contractIds = Optional.ofNullable(contracts)
|
|
|
+ .orElse(List.of())
|
|
|
+ .stream()
|
|
|
+ .map(TradeOrderContractVo::getContractId)
|
|
|
+ .filter(Objects::nonNull)
|
|
|
+ .collect(Collectors.toSet());
|
|
|
+ log.debug("合同ID提取完成,数量: {}", contractIds.size());
|
|
|
+ List<TradeContractGoodsDto> result = remoteContractService.queryContractGoodsByContractIds(contractIds, goodsIds);
|
|
|
+ log.debug("贸易合同商品查询完成,数量: {}", result.size());
|
|
|
+ return result;
|
|
|
+ }).thenApply(goods -> Optional.ofNullable(goods).orElse(List.of()))
|
|
|
+ .exceptionally(ex -> {
|
|
|
+ log.error("查询贸易订单商品失败", ex);
|
|
|
+ throw new BusinessException("查询贸易订单商品失败");
|
|
|
+ });
|
|
|
+
|
|
|
+ log.debug("所有异步任务创建完成");
|
|
|
+
|
|
|
+
|
|
|
|
|
|
// 等待所有并行操作完成
|
|
|
log.debug("等待所有并行操作完成");
|
|
|
- CompletableFuture.allOf(orderDataFuture, dictFuture).join();
|
|
|
-
|
|
|
+ CompletableFuture.allOf(orderDataFuture,logisticsOrderFuture,
|
|
|
+ goodsInfoFuture, tradeOrderIdsFuture, goodsIdsFuture,
|
|
|
+ tradeOrderContractFuture, dictFuture,contractGoodsFuture).join();
|
|
|
+ log.debug("所有并行操作完成");
|
|
|
OrderData orderData = orderDataFuture.join();
|
|
|
Map<String, Map<String, String>> dictValueAndDictResDtoMap = dictFuture.join();
|
|
|
log.debug("批量查询和字典数据获取完成");
|
|
|
+ Map<Long, KwtLogisticsOrder> logisticsOrderMap = Optional.ofNullable(logisticsOrderFuture.join())
|
|
|
+ .orElse(List.of()).stream()
|
|
|
+ .collect(Collectors.toMap(KwtLogisticsOrder::getId, Function.identity(), (k1, k2) -> k1));
|
|
|
+
|
|
|
+ Map<Long, TradeOrderContractVo> tradeOrderContractVoMap = Optional.ofNullable(tradeOrderContractFuture.join())
|
|
|
+ .orElse(List.of()).stream()
|
|
|
+ .collect(Collectors.toMap(TradeOrderContractVo::getTOrderId, Function.identity(), (k1, k2) -> k1));
|
|
|
+ Map<String, TradeContractGoodsDto> orderContracGoodstoMap = Optional.ofNullable(contractGoodsFuture.join())
|
|
|
+ .orElse(List.of()).stream()
|
|
|
+ .collect(Collectors.toMap(x->x.getContractId()+"-"+x.getGoodsId(), Function.identity(), (k1, k2) -> k1));
|
|
|
|
|
|
// 转换为响应对象
|
|
|
log.debug("开始转换为响应对象");
|
|
|
List<WaybillOrderResp> resps = convertToWaybillOrderRespList(
|
|
|
- records, orderData, dictValueAndDictResDtoMap);
|
|
|
+ records, orderData, dictValueAndDictResDtoMap,logisticsOrderMap, tradeOrderContractVoMap,orderContracGoodstoMap);
|
|
|
log.info("转换完成,响应对象数量: {}", resps.size());
|
|
|
|
|
|
return PageDataResult.of(page, resps);
|
|
|
@@ -3264,10 +3378,13 @@ public class KwtWaybillOrderV1Service {
|
|
|
private List<WaybillOrderResp> convertToWaybillOrderRespList(
|
|
|
List<KwtWaybillOrderSubtask> records,
|
|
|
OrderData orderData,
|
|
|
- Map<String, Map<String, String>> dictValueAndDictResDtoMap) {
|
|
|
+ Map<String, Map<String, String>> dictValueAndDictResDtoMap,
|
|
|
+ Map<Long, KwtLogisticsOrder> logisticsOrderMap,
|
|
|
+ Map<Long, TradeOrderContractVo> tradeOrderContractVoMap,
|
|
|
+ Map<String, TradeContractGoodsDto> orderContracGoodstoMap) {
|
|
|
|
|
|
return records.stream()
|
|
|
- .map(record -> buildWaybillOrderResp(record, orderData, dictValueAndDictResDtoMap))
|
|
|
+ .map(record -> buildWaybillOrderResp(record, orderData, dictValueAndDictResDtoMap,logisticsOrderMap, tradeOrderContractVoMap,orderContracGoodstoMap))
|
|
|
.collect(Collectors.toList());
|
|
|
}
|
|
|
|
|
|
@@ -3277,7 +3394,10 @@ public class KwtWaybillOrderV1Service {
|
|
|
private WaybillOrderResp buildWaybillOrderResp(
|
|
|
KwtWaybillOrderSubtask record,
|
|
|
OrderData orderData,
|
|
|
- Map<String, Map<String, String>> dictValueAndDictResDtoMap) {
|
|
|
+ Map<String, Map<String, String>> dictValueAndDictResDtoMap,
|
|
|
+ Map<Long, KwtLogisticsOrder> logisticsOrderMap,
|
|
|
+ Map<Long, TradeOrderContractVo> tradeOrderContractVoMap,
|
|
|
+ Map<String, TradeContractGoodsDto> orderContracGoodstoMap) {
|
|
|
|
|
|
return getWaybillOrderResp(
|
|
|
record,
|
|
|
@@ -3289,7 +3409,10 @@ public class KwtWaybillOrderV1Service {
|
|
|
orderData.getWaybillOrderNodeMap(),
|
|
|
orderData.getLogIdAndOrderMap(),
|
|
|
dictValueAndDictResDtoMap,
|
|
|
- orderData.getWOrderIdAndOffsiteNodeMap());
|
|
|
+ orderData.getWOrderIdAndOffsiteNodeMap(),
|
|
|
+ logisticsOrderMap,
|
|
|
+ tradeOrderContractVoMap,
|
|
|
+ orderContracGoodstoMap);
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -3709,7 +3832,10 @@ public class KwtWaybillOrderV1Service {
|
|
|
Map<String, KwtWaybillOrderNode> waybillOrderNodeMap,
|
|
|
Map<Long, KwtLogisticsOrder> finalLogIdAndOrderMap,
|
|
|
Map<String, Map<String, String>> dictValueAndDictResDtoMap,
|
|
|
- Map<Long, KwtWaybillOrderNode> wOrderIdAndOffsiteNodeMap) {
|
|
|
+ Map<Long, KwtWaybillOrderNode> wOrderIdAndOffsiteNodeMap,
|
|
|
+ Map<Long, KwtLogisticsOrder> logisticsOrderMap,
|
|
|
+ Map<Long, TradeOrderContractVo> tradeOrderContractVoMap,
|
|
|
+ Map<String, TradeContractGoodsDto> orderContracGoodstoMap) {
|
|
|
WaybillOrderResp waybillOrderResp = new WaybillOrderResp();
|
|
|
KwtWaybillOrder billOrder = finalWaybillOrderIdAndBillOrderMap.getOrDefault(record.getWOrderId(),
|
|
|
new KwtWaybillOrder());
|
|
|
@@ -3782,6 +3908,26 @@ public class KwtWaybillOrderV1Service {
|
|
|
|
|
|
waybillOrderResp.setStatus(String.valueOf(record.getStatus()));
|
|
|
waybillOrderResp.setStatusDesc(CarWaybillV1Enum.geDesc(record.getStatus()));
|
|
|
+ KwtLogisticsOrder logOrder = logisticsOrderMap.getOrDefault(lOrderId, new KwtLogisticsOrder());
|
|
|
+ KwtLogisticsOrderGoods kwtLogisticsOrderGoods = finalLogOrderIdAndGoodsIdMap.getOrDefault(lOrderId, new KwtLogisticsOrderGoods());
|
|
|
+ TradeOrderContractVo tradeOrderContractVo = tradeOrderContractVoMap.getOrDefault(logOrder.getTOrderId(), new TradeOrderContractVo());
|
|
|
+ TradeContractGoodsDto contractGoodsDto = orderContracGoodstoMap.getOrDefault(tradeOrderContractVo.getContractId()+"-"+kwtLogisticsOrderGoods.getGoodsId(), new TradeContractGoodsDto());
|
|
|
+ if (org.apache.commons.lang3.StringUtils.equals(logOrder.getBillingMode(), DictEnum.CHARGING_TYPE_1.getValue())){
|
|
|
+ BigDecimal actualPrice = Objects.nonNull(logOrder.getPrice()) && Objects.nonNull(record.getLoadAmount()) ?
|
|
|
+ logOrder.getPrice().multiply(record.getLoadAmount()) : BigDecimal.ZERO;
|
|
|
+ BigDecimal actualGoodsPrice = Objects.nonNull(contractGoodsDto.getPrice()) && Objects.nonNull(record.getLoadAmount()) ?
|
|
|
+ contractGoodsDto.getPrice().multiply(record.getLoadAmount()) : BigDecimal.ZERO;
|
|
|
+ waybillOrderResp.setActualPrice(actualPrice.setScale(2, RoundingMode.HALF_UP).toPlainString());
|
|
|
+ waybillOrderResp.setActualGoodsPrice(actualGoodsPrice.setScale(2, RoundingMode.HALF_UP).toPlainString());
|
|
|
+ }else if (org.apache.commons.lang3.StringUtils.equals(logOrder.getBillingMode(), DictEnum.CHARGING_TYPE_2.getValue())){
|
|
|
+ BigDecimal actualPrice = Objects.nonNull(logOrder.getPrice()) && Objects.nonNull(record.getUnloadAmount()) ?
|
|
|
+ logOrder.getPrice().multiply(record.getUnloadAmount()) : BigDecimal.ZERO;
|
|
|
+ BigDecimal actualGoodsPrice = Objects.nonNull(contractGoodsDto.getPrice()) && Objects.nonNull(record.getUnloadAmount()) ?
|
|
|
+ contractGoodsDto.getPrice().multiply(record.getUnloadAmount()) : BigDecimal.ZERO;
|
|
|
+ waybillOrderResp.setActualPrice(actualPrice.setScale(2, RoundingMode.HALF_UP).toPlainString());
|
|
|
+ waybillOrderResp.setActualGoodsPrice(actualGoodsPrice.setScale(2, RoundingMode.HALF_UP).toPlainString());
|
|
|
+ }
|
|
|
+
|
|
|
return waybillOrderResp;
|
|
|
}
|
|
|
|
|
|
@@ -4180,15 +4326,15 @@ public class KwtWaybillOrderV1Service {
|
|
|
logOrder.getPrice().multiply(subtask.getLoadAmount()) : BigDecimal.ZERO;
|
|
|
BigDecimal actualGoodsPrice = Objects.nonNull(contractGoodsDto.getPrice()) && Objects.nonNull(subtask.getLoadAmount()) ?
|
|
|
contractGoodsDto.getPrice().multiply(subtask.getLoadAmount()) : BigDecimal.ZERO;
|
|
|
- resp.setActualPrice(actualPrice.setScale(2, RoundingMode.HALF_UP) +"元");
|
|
|
- resp.setActualGoodsPrice(actualGoodsPrice.setScale(2, RoundingMode.HALF_UP)+"元");
|
|
|
+ resp.setActualPrice(actualPrice.setScale(2, RoundingMode.HALF_UP).toPlainString() +"元");
|
|
|
+ resp.setActualGoodsPrice(actualGoodsPrice.setScale(2, RoundingMode.HALF_UP).toPlainString()+"元");
|
|
|
}else if (org.apache.commons.lang3.StringUtils.equals(logOrder.getBillingMode(), DictEnum.CHARGING_TYPE_2.getValue())){
|
|
|
BigDecimal actualPrice = Objects.nonNull(logOrder.getPrice()) && Objects.nonNull(subtask.getUnloadAmount()) ?
|
|
|
logOrder.getPrice().multiply(subtask.getUnloadAmount()) : BigDecimal.ZERO;
|
|
|
BigDecimal actualGoodsPrice = Objects.nonNull(contractGoodsDto.getPrice()) && Objects.nonNull(subtask.getUnloadAmount()) ?
|
|
|
contractGoodsDto.getPrice().multiply(subtask.getUnloadAmount()) : BigDecimal.ZERO;
|
|
|
- resp.setActualPrice(actualPrice.setScale(2, RoundingMode.HALF_UP)+"元");
|
|
|
- resp.setActualGoodsPrice(actualGoodsPrice.setScale(2, RoundingMode.HALF_UP)+"元");
|
|
|
+ resp.setActualPrice(actualPrice.setScale(2, RoundingMode.HALF_UP).toPlainString()+"元");
|
|
|
+ resp.setActualGoodsPrice(actualGoodsPrice.setScale(2, RoundingMode.HALF_UP).toPlainString()+"元");
|
|
|
}
|
|
|
resp.setTruckNo(billOrder.getTruckNo());
|
|
|
resp.setCarAxis(truck != null ? truck.getCarAxis() : "");
|