Forráskód Böngészése

提交物流运单详情新增实际运费字段

chenxiaofei 4 napja
szülő
commit
3f87adb38e

+ 2 - 0
sckw-modules-api/sckw-contract-api/src/main/java/com/sckw/contract/api/RemoteContractService.java

@@ -7,6 +7,7 @@ import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.CompletionStage;
 
 /**
  * @author czh
@@ -139,4 +140,5 @@ public interface RemoteContractService {
      */
     KwcContractLogisticsDto findLogContractByEntId(Long entId);
 
+    TradeContractGoodsDto queryContractGoodsByContractId(Long contractId, Long goodsId);
 }

+ 1 - 0
sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/dubbo/TradeOrderInfoService.java

@@ -157,4 +157,5 @@ public interface TradeOrderInfoService {
 
     List<TradeOrderContractVo> queryByTradeContactIds(Set<Long> tradeContractIds);
 
+    TradeOrderContractVo queryByContractByTradeOrderId(Long tOrderId);
 }

+ 12 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/dubbo/RemoteContractServiceImpl.java

@@ -475,5 +475,17 @@ public class RemoteContractServiceImpl implements RemoteContractService {
         }).orElse(null);
     }
 
+    @Override
+    public TradeContractGoodsDto queryContractGoodsByContractId(Long contractId, Long goodsId) {
+        KwcContractTradeGoods contractTradeGoods = kwcContractTradeGoodsRepository.queryByContractIdAndGoodsId(contractId, goodsId);
+        if(Objects.isNull(contractTradeGoods)){
+            return new TradeContractGoodsDto();
+        }
+        TradeContractGoodsDto tradeContractGoodsDto = new TradeContractGoodsDto();
+        tradeContractGoodsDto.setPrice(contractTradeGoods.getPrice());
+        return tradeContractGoodsDto;
+
+    }
+
 
 }

+ 9 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/repository/KwcContractTradeGoodsRepository.java

@@ -50,4 +50,13 @@ public class KwcContractTradeGoodsRepository extends ServiceImpl<KwcContractTrad
                 .in(KwcContractTradeGoods::getContractId, contractIds)
                 .eq(Objects.nonNull(goodsId),KwcContractTradeGoods::getGoodsId, goodsId));
     }
+
+    public KwcContractTradeGoods queryByContractIdAndGoodsId(Long contractId, Long goodsId) {
+        return getOne(Wrappers.<KwcContractTradeGoods>lambdaQuery()
+                .eq(KwcContractTradeGoods::getDelFlag,0)
+                .eq(KwcContractTradeGoods::getContractId, contractId)
+                .eq(KwcContractTradeGoods::getGoodsId, goodsId)
+                .orderByDesc(KwcContractTradeGoods::getId)
+                .last("limit 1"));
+    }
 }

+ 14 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/dubbo/TradeOrderInfoServiceImpl.java

@@ -634,6 +634,20 @@ public class TradeOrderInfoServiceImpl implements TradeOrderInfoService {
         }).collect(Collectors.toList());
     }
 
+    @Override
+    public TradeOrderContractVo queryByContractByTradeOrderId(Long tOrderId) {
+        KwoTradeOrderContract kwoTradeOrderContracts = kwoTradeOrderContractRepository.queryByTradeOrderId(tOrderId);
+        if (Objects.isNull(kwoTradeOrderContracts)) {
+            return new TradeOrderContractVo();
+        }
+        TradeOrderContractVo tradeOrderContractVo = new TradeOrderContractVo();
+        tradeOrderContractVo.setContractId(kwoTradeOrderContracts.getContractId());
+        tradeOrderContractVo.setContractNo(kwoTradeOrderContracts.getContractNo());
+        tradeOrderContractVo.setTOrderId(kwoTradeOrderContracts.getTOrderId());
+        tradeOrderContractVo.setTOrderNo(kwoTradeOrderContracts.getTOrderNo());
+        return tradeOrderContractVo;
+    }
+
     @Override
     public List<OrderSaleVo> queryRecentSale(LocalDateTime start, LocalDateTime end) {
         return kwoTradeOrderService.queryRecentSale(start, end);

+ 10 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/WaybillOrderResp.java

@@ -137,4 +137,14 @@ public class WaybillOrderResp implements Serializable {
      */
     @Schema(description = "状态描述")
     private String statusDesc;
+    /**
+     * 实际运费
+     */
+    @Schema(description = "实际运费")
+    private String actualPrice;
+    /**
+     * 货物实际费用
+     */
+    @Schema(description = "货物实际费用")
+    private String actualGoodsPrice;
 }

+ 11 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/vo/WaybillOrderDetailResp.java

@@ -48,6 +48,17 @@ public class WaybillOrderDetailResp implements Serializable {
      */
     @Schema(description = "计费方式描述")
     private String priceTypeDesc;
+
+    /**
+     * 实际运费
+     */
+    @Schema(description = "实际运费")
+    private String actualPrice;
+    /**
+     * 货物实际费用
+     */
+    @Schema(description = "货物实际费用")
+    private String actualGoodsPrice;
     /**
      * 车牌号
      */

+ 69 - 17
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtWaybillOrderV1Service.java

@@ -14,6 +14,7 @@ import com.google.common.collect.Sets;
 import com.sckw.contract.api.RemoteContractService;
 import com.sckw.contract.api.feign.LogisticsScoreFeignService;
 import com.sckw.contract.api.model.dto.req.LogisticsScoreDetailFeignDto;
+import com.sckw.contract.api.model.vo.TradeContractGoodsDto;
 import com.sckw.contract.api.model.vo.TradeContractUnitDto;
 import com.sckw.core.common.enums.enums.DictEnum;
 import com.sckw.core.common.enums.enums.DictTypeEnum;
@@ -85,7 +86,8 @@ import java.text.SimpleDateFormat;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
 import java.util.*;
-import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.*;
+import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.function.Function;
 import java.util.stream.Collectors;
@@ -3793,6 +3795,8 @@ public class KwtWaybillOrderV1Service {
         return order;
     }
 
+    @Resource(name = "traceTaskExecutor")
+    private Executor traceTaskExecutor;
 
 
     public WaybillOrderDetailResp queryBillOrderDetail(WaybillOrderRequest req) {
@@ -3811,40 +3815,71 @@ public class KwtWaybillOrderV1Service {
         // 并行执行多个不相互依赖的查询
         log.debug("开始并行查询相关数据,主运单ID: {}", billOrder.getId());
         CompletableFuture<RTruckVo> truckFuture = CompletableFuture.supplyAsync(() ->
-                remoteFleetService.findTruck(billOrder.getTruckId()));
+                remoteFleetService.findTruck(billOrder.getTruckId())).exceptionally(ex -> {
+            log.error("异步任务执行失败", ex);
+            throw new BusinessException("查询车型信息失败");
+        });;
 
         CompletableFuture<RFleetVo> fleetFuture = CompletableFuture.supplyAsync(() ->
-                getFleetInfo(billOrder.getTruckId()));
+                getFleetInfo(billOrder.getTruckId()),traceTaskExecutor);
 
         CompletableFuture<List<KwtLogisticsOrderAddress>> addressFuture = CompletableFuture.supplyAsync(() ->
-                kwtLogisticsOrderAddressRepository.queryByLogOrderId(subtask.getLOrderId()));
+                kwtLogisticsOrderAddressRepository.queryByLogOrderId(subtask.getLOrderId()),traceTaskExecutor);
 
         CompletableFuture<List<KwtWaybillOrderTicket>> ticketFuture = CompletableFuture.supplyAsync(() ->
-                kwtWaybillOrderTicketRepository.queryByWOrderId(req.getOrderId()));
+                kwtWaybillOrderTicketRepository.queryByWOrderId(req.getOrderId()),traceTaskExecutor);
 
         CompletableFuture<UserCacheResDto> userFuture = CompletableFuture.supplyAsync(() ->
-                getUserInfo(subtask.getUnloadOperator()));
+                getUserInfo(subtask.getUnloadOperator()),traceTaskExecutor).exceptionally(ex -> {
+            log.error("异步任务执行失败", ex);
+            throw new BusinessException("查询用户信息失败");
+        });
 
         CompletableFuture<KwtLogisticsOrderGoods> goodsFuture = CompletableFuture.supplyAsync(() ->
-                kwtLogisticsOrderGoodsRepository.queryByLogOrderId(logOrder.getId()));
+                kwtLogisticsOrderGoodsRepository.queryByLogOrderId(logOrder.getId()),traceTaskExecutor);
 
         CompletableFuture<OrderDetailVo> orderDetailFuture = CompletableFuture.supplyAsync(() ->
-                getOrderDetail(logOrder.getTOrderId()));
+                getOrderDetail(logOrder.getTOrderId()),traceTaskExecutor).exceptionally(ex -> {
+            log.error("异步任务执行失败", ex);
+            throw new BusinessException("查询订单详情失败");
+        });
 
         CompletableFuture<List<KwtLogisticsOrderUnit>> unitFuture = CompletableFuture.supplyAsync(() ->
-                kwtLogisticsOrderUnitRepository.queryByLOrderId(logOrder.getId()));
+                kwtLogisticsOrderUnitRepository.queryByLOrderId(logOrder.getId()),traceTaskExecutor);
 
         CompletableFuture<List<KwtWaybillOrderNode>> nodeFuture = CompletableFuture.supplyAsync(() ->
-                kwtWaybillOrderNodeRepository.queryNodesByOrderId(billOrder.getId(), subtask.getId()));
+                kwtWaybillOrderNodeRepository.queryNodesByOrderId(billOrder.getId(), subtask.getId()),traceTaskExecutor);
 
         CompletableFuture<List<KwtWaybillOrderSubtask>> waybillSubtaskFuture = CompletableFuture.supplyAsync(() ->
-                kwtWaybillOrderSubtaskRepository.queryByLogId(logOrder.getId()));
-
+                kwtWaybillOrderSubtaskRepository.queryByLogId(logOrder.getId()),traceTaskExecutor);
+
+
+        CompletableFuture<TradeContractGoodsDto> contractFuture =
+                goodsFuture.thenCompose(goods -> {
+                    Long goodsId = Optional.ofNullable(goods)
+                            .map(KwtLogisticsOrderGoods::getGoodsId)
+                            .orElse(null);
+                    log.debug("开始查询合同信息,贸易订单ID: {}, 商品ID: {}", logOrder.getTOrderId(), goodsId);
+
+                    return CompletableFuture
+                            .supplyAsync(
+                                    () -> tradeOrderInfoService.queryByContractByTradeOrderId(logOrder.getTOrderId()), traceTaskExecutor)
+                            .thenCompose(tradeOrderInfo -> {
+                                log.debug("贸易订单合同信息查询完成,合同ID: {}", tradeOrderInfo.getContractId());
+                                return CompletableFuture.supplyAsync(
+                                        () -> remoteContractService.queryContractGoodsByContractId(tradeOrderInfo.getContractId(), goodsId), traceTaskExecutor
+                                );
+                            });
+                }).exceptionally(ex -> {
+                    log.error("异步任务执行失败", ex);
+                    throw new BusinessException("查询合同信息失败");
+                });
         // 等待所有并行查询完成
         log.debug("等待所有并行查询完成");
         CompletableFuture.allOf(
                 truckFuture, fleetFuture, addressFuture, ticketFuture, userFuture,
-                goodsFuture, orderDetailFuture, unitFuture, nodeFuture, waybillSubtaskFuture
+                goodsFuture, orderDetailFuture, unitFuture, nodeFuture, waybillSubtaskFuture,
+                contractFuture
         ).join();
         log.debug("所有并行查询完成");
 
@@ -3852,7 +3887,7 @@ public class KwtWaybillOrderV1Service {
         return buildWaybillOrderDetailResp(billOrder, subtask, logOrder, truckFuture.join(), 
                 fleetFuture.join(), addressFuture.join(), ticketFuture.join(), userFuture.join(), 
                 goodsFuture.join(), orderDetailFuture.join(), unitFuture.join(), 
-                nodeFuture.join(), waybillSubtaskFuture.join());
+                nodeFuture.join(), waybillSubtaskFuture.join(),contractFuture.join());
     }
 
     /**
@@ -3949,7 +3984,8 @@ public class KwtWaybillOrderV1Service {
                                                               OrderDetailVo orderDetailVo,
                                                               List<KwtLogisticsOrderUnit> unitList,
                                                               List<KwtWaybillOrderNode> kwtWaybillOrderNodes,
-                                                              List<KwtWaybillOrderSubtask> waybillOrderSubtasks) {
+                                                              List<KwtWaybillOrderSubtask> waybillOrderSubtasks,
+                                                               TradeContractGoodsDto contractGoodsDto) {
         log.debug("开始处理查询结果,主运单ID: {}, 子运单ID: {}", billOrder.getId(), subtask.getId());
 
         if (CollectionUtils.isEmpty(orderTicketList)) {
@@ -3991,7 +4027,7 @@ public class KwtWaybillOrderV1Service {
         log.info("运单详情查询完成,运单ID: {}", billOrder.getId());
         return getWaybillOrderDetailResp(subtask, billOrder, logOrder, truck, fleet, goods,
                 keyAndAddressMap, kwpGoods, logisticsOrderUnitMap, nodeList, userCacheResDto,
-                billOrders, ticketMap, dictValueAndDictResDtoMap, tradeContractUnitDtos);
+                billOrders, ticketMap, dictValueAndDictResDtoMap, tradeContractUnitDtos,contractGoodsDto);
     }
 
     /**
@@ -4128,7 +4164,8 @@ public class KwtWaybillOrderV1Service {
                                                                     List<KwtWaybillOrder> billOrders,
                                                                     Map<String, KwtWaybillOrderTicket> ticketMap,
                                                                     Map<String, Map<String, String>> dictValueAndDictResDtoMap,
-                                                                    List<TradeContractUnitDto> tradeContractUnitDtos) {
+                                                                    List<TradeContractUnitDto> tradeContractUnitDtos,
+                                                                    TradeContractGoodsDto contractGoodsDto) {
         WaybillOrderDetailResp resp = new WaybillOrderDetailResp();
 
         // 基本信息设置
@@ -4138,6 +4175,21 @@ public class KwtWaybillOrderV1Service {
         resp.setLogisticOrderNo(logOrder.getLOrderNo());
         resp.setPriceType(String.valueOf(logOrder.getBillingMode()));
         resp.setPriceTypeDesc(DictEnum.getLabel(DictTypeEnum.CHARGING_TYPE.getType(), logOrder.getBillingMode()));
+        if (org.apache.commons.lang3.StringUtils.equals(logOrder.getBillingMode(), DictEnum.CHARGING_TYPE_1.getValue())){
+            BigDecimal actualPrice = Objects.nonNull(logOrder.getPrice()) && Objects.nonNull(subtask.getLoadAmount()) ?
+                    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)+"元");
+        }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.setTruckNo(billOrder.getTruckNo());
         resp.setCarAxis(truck != null ? truck.getCarAxis() : "");
         resp.setFleetName(fleet != null ? fleet.getName() : "");