浏览代码

订单合同新增接口

chenxiaofei 2 月之前
父节点
当前提交
aaf2573eb9
共有 23 个文件被更改,包括 926 次插入11 次删除
  1. 11 0
      sckw-modules-api/sckw-contract-api/src/main/java/com/sckw/contract/api/RemoteContractService.java
  2. 56 0
      sckw-modules-api/sckw-contract-api/src/main/java/com/sckw/contract/api/model/dto/res/ContractLogisticsAndTradeOrderResDto.java
  3. 24 1
      sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/dubbo/TransportRemoteService.java
  4. 23 0
      sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/vo/LogisticContractVo.java
  5. 14 0
      sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/vo/RTransportEntVo.java
  6. 50 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/dubbo/RemoteContractServiceImpl.java
  7. 7 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/repository/KwcContractLogisticsRepository.java
  8. 1 1
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/repository/KwcContractTradeRepository.java
  9. 1 1
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/service/operateService/KwcContractTradeService.java
  10. 9 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/controller/TradeOrderManageController.java
  11. 8 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/KwoTradeOrder.java
  12. 26 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/TradeOrderDetailReq.java
  13. 271 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/res/TradeOrderDetailResp.java
  14. 6 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/repository/KwoTradeOrderAddressRepository.java
  15. 7 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/repository/KwoTradeOrderContractRepository.java
  16. 8 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/repository/KwoTradeOrderGoodsRepository.java
  17. 5 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/repository/KwoTradeOrderRepository.java
  18. 6 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/repository/KwoTradeOrderUnitRepository.java
  19. 248 4
      sckw-modules/sckw-order/src/main/java/com/sckw/order/serivce/TradeOrderManageService.java
  20. 112 4
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/dubbo/TransportServiceImpl.java
  21. 26 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/repository/KwtLogisticsOrderContractRepository.java
  22. 6 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/repository/KwtLogisticsOrderRepository.java
  23. 1 0
      sql/2025/11/30/2025_11_30_cxf_alert.sql

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

@@ -1,11 +1,13 @@
 package com.sckw.contract.api;
 
 import com.sckw.contract.api.model.dto.res.ContractCommonInfoResDto;
+import com.sckw.contract.api.model.dto.res.ContractLogisticsAndTradeOrderResDto;
 import com.sckw.contract.api.model.dto.res.ContractLogisticsOrderResDto;
 
 import java.math.BigDecimal;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 /**
  * @author czh
@@ -49,4 +51,13 @@ public interface RemoteContractService {
      * @return
      */
     ContractLogisticsOrderResDto getContractByContractNo(String contractNo, Long acceptId, Long consignId);
+
+    /**
+     * 根据贸易合同id查询物流合同信息
+     * @param tradeOrderContractId 贸易合同id
+     * @return 贸易合同和物流合同信息
+     */
+    ContractLogisticsAndTradeOrderResDto queryContractByContractId(Long tradeOrderContractId,Long tradeId);
+
+
 }

+ 56 - 0
sckw-modules-api/sckw-contract-api/src/main/java/com/sckw/contract/api/model/dto/res/ContractLogisticsAndTradeOrderResDto.java

@@ -0,0 +1,56 @@
+package com.sckw.contract.api.model.dto.res;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author czh
+ * @desc 贸易合同和物流合同公共信息
+ * @date 2023/7/19
+ */
+@Data
+public class ContractLogisticsAndTradeOrderResDto implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 2656035411576510101L;
+
+    /**
+     * 贸易合同id
+     */
+    private Long id;
+
+    /**
+     * 贸易合同名
+     */
+    private String contactName;
+
+    /**
+     * 贸易合同号
+     */
+    private String contractNo;
+
+    List<ContractLogisticsOrder> logisticsContracts;
+
+    @Data
+    public static class ContractLogisticsOrder implements Serializable{
+        @Serial
+        private static final long serialVersionUID = 3434430919666054438L;
+        /**
+         * 物流合同id
+         */
+        private Long logisticsContractId;
+
+        /**
+         * 物流合同名
+         */
+        private String logisticsContractName;
+
+        /**
+         * 物流合同号
+         */
+        private String logisticsContractNo;
+    }
+}

+ 24 - 1
sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/dubbo/TransportRemoteService.java

@@ -119,8 +119,31 @@ public interface TransportRemoteService {
 
     List<RWaybillOrderVo> queryWaybillOrderByEntId(Long entId);
 
-
+    /**
+     * 根据贸易订单集合查询物流公司
+     * @param tradeOrderIds 贸易订单集合
+     * @return 物流公司
+     */
     List<RTransportEntVo> queryTransportEnt(Set<Long> tradeOrderIds);
 
     List<RWaybillSubOrderVo> queryWaybillOrderByTradeOrderIds(Set<Long> tradeOrderIds);
+
+    /**
+     * 根据贸易订单查询物流合同
+     * @param tradeId 贸易订单
+     * @return 物流合同
+     */
+    List<LogisticContractVo> queryLogisticContractByTradeId(Long tradeId);
+    /**
+     * 根据贸易订单查询物流合同
+     * @param tradeId 贸易订单
+     * @return 物流公司
+     */
+    List<RTransportEntVo> queryTransportEntByTradeOrderId(Long tradeId);
+
+    /**
+     * 根据贸易订单查询物流订单
+     * @param tradeId 贸易订单id
+     */
+    List<KwtLogisticsOrderVO> queryLogisticOrderByTradeId(Long tradeId);
 }

+ 23 - 0
sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/vo/LogisticContractVo.java

@@ -0,0 +1,23 @@
+package com.sckw.transport.api.model.vo;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @author :chenXiaoFei
+ * @version :1.0
+ * @description : 物流合同数据
+ * @create :2025-11-08 10:30:00
+ */
+@Data
+public class LogisticContractVo implements Serializable {
+    @Serial
+    private static final long serialVersionUID = -1497190293426583205L;
+    /**
+     * 物流合同id
+     */
+    private Long logContractId;
+
+}

+ 14 - 0
sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/vo/RTransportEntVo.java

@@ -4,6 +4,7 @@ import lombok.Data;
 
 import java.io.Serial;
 import java.io.Serializable;
+import java.math.BigDecimal;
 import java.util.List;
 
 /**
@@ -32,4 +33,17 @@ public class RTransportEntVo implements Serializable {
      * 运输企业名称
      */
     private String transportEntName;
+    /**
+     * 运输单价
+     */
+    private BigDecimal transportPrice;
+    /**
+     * 运输联系人
+     */
+    private String transportContacts;
+    /**
+     * 运输联系人电话
+     */
+    private String transportContactsPhone;
+
 }

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

@@ -1,7 +1,10 @@
 package com.sckw.contract.dubbo;
 
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
 import com.sckw.contract.api.RemoteContractService;
 import com.sckw.contract.api.model.dto.res.ContractCommonInfoResDto;
+import com.sckw.contract.api.model.dto.res.ContractLogisticsAndTradeOrderResDto;
 import com.sckw.contract.api.model.dto.res.ContractLogisticsOrderResDto;
 import com.sckw.contract.api.model.dto.res.EntInfo;
 import com.sckw.contract.dao.KwcContractLogisticsMapper;
@@ -11,6 +14,8 @@ import com.sckw.contract.model.dto.res.QueryContractValidCountResDto;
 import com.sckw.contract.model.entity.KwcContractLogistics;
 import com.sckw.contract.model.entity.KwcContractLogisticsUnit;
 import com.sckw.contract.model.entity.KwcContractTrade;
+import com.sckw.contract.repository.KwcContractLogisticsRepository;
+import com.sckw.contract.repository.KwcContractTradeRepository;
 import com.sckw.contract.service.KwcContractLogisticsUnitService;
 import com.sckw.core.model.constant.Global;
 import com.sckw.core.model.enums.ContractStatusEnum;
@@ -18,6 +23,9 @@ import com.sckw.core.model.enums.CooperateTypeEnum;
 import com.sckw.core.model.enums.SigningWayEnum;
 import com.sckw.core.utils.CollectionUtils;
 import com.sckw.system.api.RemoteSystemService;
+import com.sckw.transport.api.dubbo.TransportRemoteService;
+import com.sckw.transport.api.model.vo.LogisticContractVo;
+import lombok.RequiredArgsConstructor;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.apache.dubbo.config.annotation.DubboService;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -32,6 +40,7 @@ import java.util.stream.Collectors;
  * @date 2023/7/31
  */
 @DubboService(group = "design", version = "1.0.0")
+@RequiredArgsConstructor
 public class RemoteContractServiceImpl implements RemoteContractService {
 
     @Autowired
@@ -48,6 +57,11 @@ public class RemoteContractServiceImpl implements RemoteContractService {
 
     @DubboReference(version = "1.0.0", group = "design", check = false, timeout = 8000)
     private RemoteSystemService remoteSystemService;
+    @DubboReference(version = "1.0.0", group = "design", check = false, timeout = 8000
+    private TransportRemoteService transportRemoteService ;
+
+    private final KwcContractTradeRepository kwcContractTradeRepository ;
+    private final KwcContractLogisticsRepository contractLogisticsRepository;
 
     @Override
     public Map<Long, ContractCommonInfoResDto> queryContractBaseInfo(List<Long> contractIds) {
@@ -192,6 +206,42 @@ public class RemoteContractServiceImpl implements RemoteContractService {
         return logisticsOrderResDto;
     }
 
+    @Override
+    public ContractLogisticsAndTradeOrderResDto queryContractByContractId(Long tradeOrderContractId,Long tradeId) {
+        //根据贸易合同查询贸易合同
+        KwcContractTrade kwcContractTrade = kwcContractTradeRepository.queryByContractId(tradeOrderContractId);
+        if (Objects.isNull(kwcContractTrade)){
+            return new ContractLogisticsAndTradeOrderResDto() ;
+        }
+        ContractLogisticsAndTradeOrderResDto contractLogisticsAndTradeOrderResDto = new ContractLogisticsAndTradeOrderResDto();
+        contractLogisticsAndTradeOrderResDto.setId(kwcContractTrade.getId());
+        contractLogisticsAndTradeOrderResDto.setContactName(kwcContractTrade.getName());
+        contractLogisticsAndTradeOrderResDto.setContractNo(kwcContractTrade.getContractNo());
+        //根据贸易订单id查询物流订单和物流合同关联信息
+        List<LogisticContractVo> logisticContractVos = transportRemoteService.queryLogisticContractByTradeId(tradeId);
+        Set<Long> logContractIds = Sets.newHashSet();
+        if (CollectionUtils.isNotEmpty(logisticContractVos)){
+            logContractIds =
+                    logisticContractVos.stream().map(LogisticContractVo::getLogContractId).collect(Collectors.toSet());
+        }
+        //查询物流合同
+        List<KwcContractLogistics> contractLogistics = contractLogisticsRepository.queryByLogisticContractIds(logContractIds);
+        if (CollectionUtils.isNotEmpty(contractLogistics)){
+            List<ContractLogisticsAndTradeOrderResDto.ContractLogisticsOrder> contractLogisticsOrders = contractLogistics.stream().map(c -> {
+                ContractLogisticsAndTradeOrderResDto.ContractLogisticsOrder contractLogisticsOrder = new ContractLogisticsAndTradeOrderResDto.ContractLogisticsOrder();
+                contractLogisticsOrder.setLogisticsContractId(c.getId());
+                contractLogisticsOrder.setLogisticsContractName(c.getName());
+                contractLogisticsOrder.setLogisticsContractNo(c.getContractNo());
+                return contractLogisticsOrder;
+            }).collect(Collectors.toList());
+            contractLogisticsAndTradeOrderResDto.setLogisticsContracts(contractLogisticsOrders);
+        }
+
+        return contractLogisticsAndTradeOrderResDto;
+    }
+
+
+
     private ContractCommonInfoResDto fillContractLogistics(KwcContractLogistics kwcContractLogistics) {
         ContractCommonInfoResDto contractCommonInfoResDto = new ContractCommonInfoResDto();
         List<EntInfo> entList = new ArrayList<>();

+ 7 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/repository/KwcContractLogisticsRepository.java

@@ -12,6 +12,7 @@ import org.springframework.stereotype.Repository;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
+import java.util.Set;
 
 /**
  * @author :chenXiaoFei
@@ -46,4 +47,10 @@ public class KwcContractLogisticsRepository extends ServiceImpl<KwcContractLogis
         return getOne(Wrappers.<KwcContractLogistics>lambdaQuery()
                 .eq(KwcContractLogistics::getId, id));
     }
+
+    public List<KwcContractLogistics> queryByLogisticContractIds(Set<Long> logContractIds) {
+        return list(Wrappers.<KwcContractLogistics>lambdaQuery()
+                .eq(KwcContractLogistics::getDelFlag, 0)
+                .in(KwcContractLogistics::getId, logContractIds));
+    }
 }

+ 1 - 1
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/repository/KwcContractTradeRepository.java

@@ -24,7 +24,7 @@ public class KwcContractTradeRepository extends ServiceImpl<KwcContractTradeMapp
                 .eq(KwcContractTrade::getContractPid, pid));
     }
 
-    public KwcContractTrade queryByContractId( String contractId) {
+    public KwcContractTrade queryByContractId( Long contractId) {
         return getOne(Wrappers.<KwcContractTrade>lambdaQuery()
                 .eq(KwcContractTrade::getDelFlag, 0)
                 .eq(KwcContractTrade::getContractNo, contractId)

+ 1 - 1
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/service/operateService/KwcContractTradeService.java

@@ -1279,7 +1279,7 @@ public class KwcContractTradeService {
     public Boolean updateStatus(@Valid ApprovalReq req) {
         log.info("修改合同状态,请求参数 :{}", JSON.toJSONString(req));
         //查询本地商品合同信息
-        KwcContractTrade kwcContractTrade = kwcContractTradeRepository.queryByContractId(req.getContractId());
+        KwcContractTrade kwcContractTrade = kwcContractTradeRepository.queryByContractId(Long.valueOf(req.getContractId()));
         if (Objects.isNull(kwcContractTrade)) {
             throw new BusinessException("合同不存在");
         }

+ 9 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/controller/TradeOrderManageController.java

@@ -9,6 +9,7 @@ import com.sckw.core.web.response.result.PageDataResult;
 import com.sckw.excel.utils.ExcelUtil;
 import com.sckw.order.model.vo.req.*;
 import com.sckw.order.model.vo.res.QueryTradeOrderResp;
+import com.sckw.order.model.vo.res.TradeOrderDetailResp;
 import com.sckw.order.serivce.TradeOrderManageService;
 import jakarta.servlet.http.HttpServletResponse;
 import lombok.AllArgsConstructor;
@@ -96,4 +97,12 @@ public class TradeOrderManageController {
         return BaseResult.success(tradeOrderManageService.pageQueryTradeOrder(req));
     }
 
+    /**
+     * 获取贸易订单详情
+     */
+    @PostMapping(value = "/getTradeOrderDetail")
+    public BaseResult<TradeOrderDetailResp> getTradeOrderDetail(@RequestBody @Validated TradeOrderDetailReq req) {
+        return BaseResult.success(tradeOrderManageService.getTradeOrderDetail(req));
+    }
+
 }

+ 8 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/KwoTradeOrder.java

@@ -112,4 +112,12 @@ public class KwoTradeOrder extends BaseModel implements Serializable {
     @TableField("charge_type")
     private Integer chargeType;
 
+    /**
+     * 托运方式
+     */
+    @TableField("consignment_way")
+    private Integer consignmentWay;
+
+
+
 }

+ 26 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/TradeOrderDetailReq.java

@@ -0,0 +1,26 @@
+package com.sckw.order.model.vo.req;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @author :chenXiaoFei
+ * @version :1.0
+ * @description : 贸易订单详情查询请求参数
+ * @create :2025-11-07 16:49:00
+ */
+@Data
+public class TradeOrderDetailReq implements Serializable {
+    @Serial
+    private static final long serialVersionUID = 6441044501410981032L;
+    /**
+     * 贸易订单id
+     */
+    @Schema(description = "贸易订单id")
+    @NotBlank(message = "贸易订单id不能为空")
+    private String tradeOrderId;
+}

+ 271 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/res/TradeOrderDetailResp.java

@@ -0,0 +1,271 @@
+package com.sckw.order.model.vo.res;
+
+import com.sckw.transport.api.model.vo.LogisticsOrderVO;
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author :chenXiaoFei
+ * @version :1.0
+ * @description : 贸易订单详情查询请求参数
+ * @create :2025-11-07 16:49:00
+ */
+@Data
+public class TradeOrderDetailResp implements Serializable {
+    @Serial
+    private static final long serialVersionUID = 6441044501410981032L;
+    /**
+     * 贸易订单id
+     */
+    @Schema(description = "贸易订单id")
+    @NotBlank(message = "贸易订单id不能为空")
+    private String tradeOrderId;
+    /**
+     * 合同信息列表
+     */
+    @Schema(description = "合同信息")
+    private TradeOrderContractInfo tradeOrderContractInfo;
+    /**
+     * 单位信息列表
+     */
+    @Schema(description = "单位信息")
+    private TradeOrderUnitInfo tradeOrderUnitInfo;
+    /**
+     * 商品信息
+     */
+    @Schema(description = "商品信息")
+    private TradeOrderGoodsInfo tradeOrderGoodsInfo;
+    /**
+     * 卸货信息
+     */
+    @Schema(description = "卸货信息")
+    private TradeOrderUnloadInfo tradeOrderUnloadInfo;
+    /**
+     * 履约信息
+     */
+    @Schema(description = "履约信息")
+    private TradeOrderPerformanceInfo tradeOrderPerformanceInfo;
+    /**
+     * 备注
+     */
+    @Schema(description = "备注")
+    private String remark;
+    @Data
+    public static class TradeOrderContractInfo implements Serializable{
+        @Serial
+        private static final long serialVersionUID = -2721141435748386755L;
+        /**
+         * 贸易合同名称
+         */
+        @Schema(description = "贸易合同名称")
+        private String contractName;
+        /**
+         * 贸易合同编号
+         */
+        @Schema(description = "贸易合同编号")
+        private String contractNo;
+
+        private List<LogisticsContract> logisticsContracts;
+
+    }
+    @Data
+    public static class TradeOrderUnitInfo implements Serializable{
+        @Serial
+        private static final long serialVersionUID = -9038880677807691151L;
+        /**
+         * 采购单位id
+         */
+        @Schema(description = "采购单位id")
+        private String purchaseUnitId;
+        /**
+         * 采购单位名称
+         */
+        @Schema(description = "采购单位名称")
+        private String purchaseUnitName;
+        /**
+         * 采购联系人
+         */
+        @Schema(description = "采购联系人")
+        private String purchaseContacts;
+        /**
+         * 采购联系人手机号
+         */
+        @Schema(description = "采购联系人手机号")
+        private String purchaseContactsPhone;
+        /**
+         * 供应单位id
+         */
+        @Schema(description = "供应单位id")
+        private String supplyUnitId;
+        /**
+         * 供应单位名称
+         */
+        @Schema(description = "供应单位名称")
+        private String supplyUnitName;
+        /**
+         * 供应联系人
+         */
+        @Schema(description = "供应联系人")
+        private String supplyContacts;
+        /**
+         * 供应联系人手机号
+         */
+        @Schema(description = "供应联系人手机号")
+        private String supplyContactsPhone;
+        /**
+         * 承运单位id
+         */
+        @Schema(description = "承运单位id")
+        private String carriageUnitId;
+        /**
+         * 承运单位名称
+         */
+        @Schema(description = "承运单位名称")
+        private String carriageUnitName;
+        /**
+         * 承运联系人
+         */
+        @Schema(description = "承运联系人")
+        private String carriageContacts;
+        /**
+         * 承运联系人手机号
+         */
+        @Schema(description = "承运联系人手机号")
+        private String carriageContactsPhone;
+        /**
+         * 运输单价
+         */
+        @Schema(description = "运输单价")
+        private String carriagePrice;
+        /**
+         * 运输费用(下单量*运输单价)
+         */
+        @Schema(description = "运输费用")
+        private String carriageCost;
+    }
+    @Data
+    public static class TradeOrderGoodsInfo implements Serializable{
+        @Serial
+        private static final long serialVersionUID = -9038880677807691151L;
+        /**
+         * 商品id
+         */
+        @Schema(description = "商品id")
+        private String goodsId;
+        /**
+         * 商品名称
+         */
+        @Schema(description = "商品名称")
+        private String goodsName;
+        /**
+         * 商品单价
+         */
+        @Schema(description = "商品单价")
+        private String unitPrice;
+        /**
+         * 订单总量
+         */
+        @Schema(description = "订单总量")
+        private String orderTotal;
+        /**
+         * 订单金额(下单量*单价)
+         */
+        @Schema(description = "订单金额")
+        private String orderAmount;
+    }
+    @Data
+    public static class TradeOrderUnloadInfo implements Serializable{
+        @Serial
+        private static final long serialVersionUID = -9038880677807691151L;
+        /**
+         * 卸货地址
+         */
+        @Schema(description = "卸货地址")
+        private String unloadAddress;
+        /**
+         * 卸货联系人
+         */
+        @Schema(description = "卸货联系人")
+        private String unloadContacts;
+        /**
+         * 卸货联系人手机号
+         */
+        @Schema(description = "卸货联系人手机号")
+        private String unloadContactsPhone;
+    }
+    @Data
+    public static class TradeOrderPerformanceInfo implements Serializable{
+        @Serial
+        private static final long serialVersionUID = -9038880677807691151L;
+        /**
+         * 支付方式
+         */
+        @Schema(description = "支付方式")
+        private String payType;
+        /**
+         * 支付方式描述
+         */
+        @Schema(description = "支付方式描述")
+        private String payTypeDesc;
+        /**
+         * 托运方式
+         */
+        @Schema(description = "托运方式")
+        private String transportType;
+        /**
+         *托运方式描述
+         */
+        @Schema(description = "托运方式描述")
+        private String transportTypeDesc;
+        /**
+         * 计费方式
+         */
+        @Schema(description = "计费方式")
+        private String priceType;
+        /**
+         * 计费方式描述
+         */
+        @Schema(description = "计费方式描述")
+        private String priceTypeDesc;
+        /**
+         * 已履量
+         */
+        @Schema(description = "已履量")
+        private String loadAmount;
+        /**
+         * 已履金额
+         */
+        @Schema(description = "已履金额")
+        private String loadAmountPrice;
+        /**
+         * 累计装货量
+         */
+        @Schema(description = "累计装货量")
+        private String loadTotal;
+        /**
+         * 累计卸货量
+         */
+        @Schema(description = "累计卸货量")
+        private String unloadTotal;
+    }
+    @Data
+    public static class LogisticsContract implements Serializable{
+        @Serial
+        private static final long serialVersionUID = 2797122008473312915L;
+        /**
+         * 物流合同名称
+         */
+        @Schema(description = "物流合同名称")
+        private String logisticsContractName;
+        /**
+         * 物流合同编号
+         */
+        @Schema(description = "物流合同编号")
+        private String logisticsContractNo;
+    }
+}

+ 6 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/repository/KwoTradeOrderAddressRepository.java

@@ -23,4 +23,10 @@ public class KwoTradeOrderAddressRepository extends ServiceImpl<KwoTradeOrderAdd
                 .eq(BaseModel::getDelFlag,0)
                 .in(KwoTradeOrderAddress::getTOrderId,tradeOrderIds));
     }
+
+    public List<KwoTradeOrderAddress> queryByOrderId(Long tradeOrderId) {
+        return list(Wrappers.<KwoTradeOrderAddress>lambdaQuery()
+                .eq(BaseModel::getDelFlag,0)
+                .eq(KwoTradeOrderAddress::getTOrderId,tradeOrderId));
+    }
 }

+ 7 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/repository/KwoTradeOrderContractRepository.java

@@ -23,4 +23,11 @@ public class KwoTradeOrderContractRepository extends ServiceImpl<KwoTradeOrderCo
                 .eq(BaseModel::getDelFlag,0)
                 .in(KwoTradeOrderContract::getTOrderId, tradeOrderIds));
     }
+
+    public KwoTradeOrderContract queryByTradeOrderId(Long traceOrderId) {
+        return getOne(Wrappers.<KwoTradeOrderContract>lambdaQuery()
+                .eq(BaseModel::getDelFlag,0)
+                .eq(KwoTradeOrderContract::getTOrderId, traceOrderId)
+                .last("limit 1"));
+    }
 }

+ 8 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/repository/KwoTradeOrderGoodsRepository.java

@@ -37,4 +37,12 @@ public class KwoTradeOrderGoodsRepository extends ServiceImpl<KwoTradeOrderGoods
                 .eq(BaseModel::getDelFlag,0)
                 .in(KwoTradeOrderGoods::getGoodsId,goodsIds));
     }
+
+    public KwoTradeOrderGoods queryByOrderId(Long tradeOrderId) {
+        return getOne(Wrappers.<KwoTradeOrderGoods>lambdaQuery()
+                .eq(BaseModel::getDelFlag,0)
+                .eq(KwoTradeOrderGoods::getTOrderId,tradeOrderId)
+                .orderByDesc(BaseModel::getId)
+                .last("limit 1"));
+    }
 }

+ 5 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/repository/KwoTradeOrderRepository.java

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.sckw.order.dao.KwoTradeOrderMapper;
 import com.sckw.order.model.KwoTradeOrder;
+import jakarta.validation.constraints.NotBlank;
 import org.apache.commons.collections4.CollectionUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Repository;
@@ -32,4 +33,8 @@ public class KwoTradeOrderRepository extends ServiceImpl<KwoTradeOrderMapper, Kw
                 .ge(StringUtils.isNotBlank(orderStartTime),KwoTradeOrder::getCreateTime, orderStartTime)
                 .le(StringUtils.isNotBlank(orderEndTime),KwoTradeOrder::getCreateTime, orderEndTime));
     }
+
+    public KwoTradeOrder queryByTradeOrderId(Long tradeOrderId) {
+        return null;
+    }
 }

+ 6 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/repository/KwoTradeOrderUnitRepository.java

@@ -23,4 +23,10 @@ public class KwoTradeOrderUnitRepository extends ServiceImpl<KwoTradeOrderUnitMa
                 .eq(BaseModel::getDelFlag,0)
                 .in(KwoTradeOrderUnit::getTOrderId, tradeOrderIds));
     }
+
+    public List<KwoTradeOrderUnit> queryByOrderId(Long traderOrderId) {
+        return list(Wrappers.<KwoTradeOrderUnit>lambdaQuery()
+                .eq(BaseModel::getDelFlag,0)
+                .eq(KwoTradeOrderUnit::getTOrderId, traderOrderId));
+    }
 }

+ 248 - 4
sckw-modules/sckw-order/src/main/java/com/sckw/order/serivce/TradeOrderManageService.java

@@ -6,8 +6,11 @@ import com.github.pagehelper.PageHelper;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
+import com.sckw.contract.api.RemoteContractService;
+import com.sckw.contract.api.model.dto.res.ContractLogisticsAndTradeOrderResDto;
 import com.sckw.core.common.enums.enums.DictEnum;
 import com.sckw.core.common.enums.enums.DictTypeEnum;
+import com.sckw.core.exception.BusinessException;
 import com.sckw.core.model.base.BaseModel;
 import com.sckw.core.model.enums.AddressTypeEnum;
 import com.sckw.core.model.page.PageResult;
@@ -28,6 +31,7 @@ import com.sckw.order.model.dto.OrderListResDTO;
 import com.sckw.order.model.dto.TradeOrderListSelectDTO;
 import com.sckw.order.model.vo.req.*;
 import com.sckw.order.model.vo.res.QueryTradeOrderResp;
+import com.sckw.order.model.vo.res.TradeOrderDetailResp;
 import com.sckw.order.repository.*;
 import com.sckw.product.api.dubbo.GoodsInfoService;
 import com.sckw.product.api.model.KwpGoods;
@@ -35,6 +39,7 @@ import com.sckw.system.api.RemoteSystemService;
 import com.sckw.system.api.RemoteUserService;
 import com.sckw.system.api.model.dto.res.UserCacheResDto;
 import com.sckw.transport.api.dubbo.TransportRemoteService;
+import com.sckw.transport.api.model.vo.KwtLogisticsOrderVO;
 import com.sckw.transport.api.model.vo.RTransportEntVo;
 import com.sckw.transport.api.model.vo.RWaybillSubOrderVo;
 import lombok.AllArgsConstructor;
@@ -45,6 +50,7 @@ import org.springframework.data.domain.Sort;
 import org.springframework.data.mongodb.core.query.Criteria;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.*;
 import java.util.function.Function;
@@ -69,6 +75,8 @@ public class TradeOrderManageService {
 
     @DubboReference(version = "1.0.0", group = "design", check = false)
     private TransportRemoteService transportRemoteService;
+    @DubboReference(version = "1.0.0", group = "design", check = false)
+    private RemoteContractService remoteContractService;
 
     private final KwoTradeOrderService tradeOrderService;
     private final KwoTradeOrderMapper tradeOrderMapper;
@@ -232,12 +240,12 @@ public class TradeOrderManageService {
         //查询贸易合同商品信息
         Map<Long, KwoTradeOrderGoods> tradeOrderIdGoodsMap = Maps.newHashMap() ;
         List<KwoTradeOrderGoods> tradeOrderGoods = tradeOrderGoodsRepository.queryByOrderIds(tradeOrderIds);
-        List<Long> goodsList = Lists.newArrayList();
+        List<Long> goodsIds = Lists.newArrayList();
         if (CollectionUtils.isNotEmpty(tradeOrderGoods)){
             tradeOrderIdGoodsMap = tradeOrderGoods.stream()
                     .collect(Collectors.toMap(KwoTradeOrderGoods::getTOrderId, Function.identity(), (k, v) -> k));
             //获取商品id
-            goodsList = tradeOrderGoods.stream()
+            goodsIds = tradeOrderGoods.stream()
                     .map(KwoTradeOrderGoods::getGoodsId)
                     .distinct()
                     .collect(Collectors.toList());
@@ -245,8 +253,8 @@ public class TradeOrderManageService {
 
         //查询商品信息
         Map<Long, KwpGoods> goodsIdAndGoodsMap = Maps.newHashMap() ;
-        if (CollectionUtils.isNotEmpty(goodsList)){
-           goodsIdAndGoodsMap = goodsInfoService.getGoodsByIds(goodsList);
+        if (CollectionUtils.isNotEmpty(goodsIds)){
+           goodsIdAndGoodsMap = goodsInfoService.getGoodsByIds(goodsIds);
         }
 
         //查询贸易订单公司信息
@@ -374,4 +382,240 @@ public class TradeOrderManageService {
         queryTradeOrderResp.setCreateTime(DateUtils.format(tradeOrder.getCreateTime(), DateUtils.DATE_TIME_PATTERN));
         return queryTradeOrderResp;
     }
+
+    public TradeOrderDetailResp getTradeOrderDetail(TradeOrderDetailReq req) {
+        log.info("贸易订单详情查询请求参数req:{}", JSON.toJSONString(req));
+        KwoTradeOrder tradeOrder = tradeOrderRepository.queryByTradeOrderId(Long.valueOf(req.getTradeOrderId()));
+        if (Objects.isNull(tradeOrder)){
+            throw new BusinessException("贸易订单不存在");
+        }
+        //根据贸易id查询贸易合同信息
+        KwoTradeOrderContract tradeOrderContract = tradeOrderContractRepository.queryByTradeOrderId(tradeOrder.getId());
+        //获取合同id
+        Long tradeOrderContractId =
+                Optional.ofNullable(tradeOrderContract).map(KwoTradeOrderContract::getTOrderId).orElse(null);
+        //查询合同信息
+        ContractLogisticsAndTradeOrderResDto logisticsAndTradeOrder = remoteContractService.queryContractByContractId(tradeOrderContractId
+                , tradeOrder.getId());
+
+        //查询贸易订单相关的贸易企业信息
+        List<KwoTradeOrderUnit> kwoTradeOrderUnits = tradeOrderUnitRepository.queryByOrderId(tradeOrder.getId());
+        Map<String, KwoTradeOrderUnit> tradeOrderIdAndUnitTypeAndUnitMap = Maps.newHashMap() ;
+        if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(kwoTradeOrderUnits)){
+           tradeOrderIdAndUnitTypeAndUnitMap = kwoTradeOrderUnits.stream()
+                    .peek(x -> x.setTradeOrderIdAndUnitType(tradeOrder.getId() + "-" + x.getUnitType()))
+                    .collect(Collectors.toMap(KwoTradeOrderUnit::getTradeOrderIdAndUnitType, Function.identity(), (x, y) -> x));
+        }
+        //查询承运单位
+        List<RTransportEntVo> logisticsEnts = transportRemoteService.queryTransportEntByTradeOrderId(tradeOrder.getId());
+        //查询物流订单
+        List<KwtLogisticsOrderVO> kwtLogisticsOrderVOS = transportRemoteService.queryLogisticOrderByTradeId(tradeOrder.getId());
+        //物流订单id映射物流信息
+        Map<Long, KwtLogisticsOrderVO> logIdAndLogisticsOrderMap = Maps.newHashMap();
+        if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(kwtLogisticsOrderVOS)){
+            logIdAndLogisticsOrderMap = kwtLogisticsOrderVOS.stream()
+                    .collect(Collectors.toMap(KwtLogisticsOrderVO::getId, Function.identity(), (x, y) -> x));
+        }
+        //根据物流订单查询运单
+        List<RWaybillSubOrderVo> rWaybillSubOrderVos = transportRemoteService.queryWaybillOrderByTradeOrderIds(Set.of(tradeOrder.getId()));
+        //将贸易订单id和运单进行映射
+        Map<Long, RWaybillSubOrderVo> tradeOrderIdAndSubOrderVoMap = Maps.newHashMap();
+        if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(rWaybillSubOrderVos)){
+            tradeOrderIdAndSubOrderVoMap = rWaybillSubOrderVos.stream().collect(Collectors.toMap(RWaybillSubOrderVo::getTradeId, Function.identity()
+                    , (k1, k2) -> k1));
+        }
+
+        //查询贸易订单商品信息
+        KwoTradeOrderGoods tradeOrderGoods = tradeOrderGoodsRepository.queryByOrderId(tradeOrder.getId());
+        Long goodsId = Optional.ofNullable(tradeOrderGoods)
+                .map(KwoTradeOrderGoods::getGoodsId)
+                .orElse(null);
+        //更具商品id查询商品信息
+        KwpGoods goods = goodsInfoService.getGoodsById(goodsId);
+
+        //获取贸易订单地址
+        List<KwoTradeOrderAddress> tradeOrderAddresses = tradeOrderAddressRepository.queryByOrderId(tradeOrder.getId());
+        Map<String, KwoTradeOrderAddress> tradeOrderIdAndAddressMap = Maps.newHashMap();
+        if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(tradeOrderAddresses)){
+            tradeOrderIdAndAddressMap = tradeOrderAddresses.stream()
+                    .peek(x -> x.setTradeOrderIdTypeKey(tradeOrder.getId() + "-" + x.getAddressType()))
+                    .collect(Collectors.toMap(KwoTradeOrderAddress::getTradeOrderIdTypeKey, Function.identity(), (x, y) -> x));
+        }
+
+        //组装明细信息
+        return getTradeOrderDetailResp(tradeOrder, logisticsAndTradeOrder, tradeOrderIdAndUnitTypeAndUnitMap, logisticsEnts, kwtLogisticsOrderVOS, goods, tradeOrderIdAndAddressMap, tradeOrderIdAndSubOrderVoMap, logIdAndLogisticsOrderMap);
+    }
+
+    @NotNull
+    private static TradeOrderDetailResp getTradeOrderDetailResp(KwoTradeOrder tradeOrder, ContractLogisticsAndTradeOrderResDto logisticsAndTradeOrder, Map<String, KwoTradeOrderUnit> tradeOrderIdAndUnitTypeAndUnitMap, List<RTransportEntVo> logisticsEnts, List<KwtLogisticsOrderVO> kwtLogisticsOrderVOS, KwpGoods goods, Map<String, KwoTradeOrderAddress> tradeOrderIdAndAddressMap, Map<Long, RWaybillSubOrderVo> tradeOrderIdAndSubOrderVoMap, Map<Long, KwtLogisticsOrderVO> logIdAndLogisticsOrderMap) {
+        TradeOrderDetailResp tradeOrderDetailResp = new TradeOrderDetailResp();
+        //合同信息
+        setContractInfo(tradeOrderDetailResp, tradeOrder, logisticsAndTradeOrder);
+
+        //单位信息列表
+        setTradeOrderUnitInfo(tradeOrderIdAndUnitTypeAndUnitMap, tradeOrder, logisticsEnts, kwtLogisticsOrderVOS, tradeOrderDetailResp);
+
+        //商品信息
+        setGoodsInfo(goods, tradeOrder, tradeOrderDetailResp);
+
+        //卸货信息
+        setUnloadInfo(tradeOrderIdAndAddressMap, tradeOrder, tradeOrderDetailResp);
+        //履约信息
+        setPerform(tradeOrder, tradeOrderIdAndSubOrderVoMap, logIdAndLogisticsOrderMap, tradeOrderDetailResp);
+        tradeOrderDetailResp.setRemark(tradeOrder.getRemark());
+        return tradeOrderDetailResp;
+    }
+
+    private static void setPerform(KwoTradeOrder tradeOrder, Map<Long, RWaybillSubOrderVo> tradeOrderIdAndSubOrderVoMap, Map<Long, KwtLogisticsOrderVO> logIdAndLogisticsOrderMap, TradeOrderDetailResp tradeOrderDetailResp) {
+        TradeOrderDetailResp.TradeOrderPerformanceInfo tradeOrderPerformanceInfo = new TradeOrderDetailResp.TradeOrderPerformanceInfo();
+        tradeOrderPerformanceInfo.setPayType(String.valueOf(tradeOrder.getTrading()));
+        tradeOrderPerformanceInfo.setPayTypeDesc(DictEnum.getLabel(DictTypeEnum.TRADE_TYPE.getType(),
+                tradeOrder.getTrading()));
+        tradeOrderPerformanceInfo.setTransportType(String.valueOf(tradeOrder.getConsignmentWay()));
+        tradeOrderPerformanceInfo.setTransportTypeDesc(DictEnum.getLabel(DictTypeEnum.CONSIGNMENT_WAY.getType(),
+                String.valueOf(tradeOrder.getConsignmentWay())));
+        tradeOrderPerformanceInfo.setPriceType(String.valueOf(tradeOrder.getChargeType()));
+        tradeOrderPerformanceInfo.setPriceTypeDesc(DictEnum.getLabel(DictTypeEnum.CHARGING_TYPE.getType(),
+                String.valueOf(tradeOrder.getChargeType())));
+        RWaybillSubOrderVo rWaybillSubOrderVo = tradeOrderIdAndSubOrderVoMap.getOrDefault(tradeOrder.getId(),new RWaybillSubOrderVo());
+        List<RWaybillSubOrderVo.BillSubOrder> subOrders = rWaybillSubOrderVo.getSubOrders();
+        if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(subOrders)){
+        
+            //累计装货量
+            double loadTotal = subOrders.stream().filter(x -> Objects.nonNull(x.getLoadAmount()))
+                    .mapToDouble(x -> x.getLoadAmount().doubleValue()).sum();
+            double unloadTotal = subOrders.stream().filter(x -> Objects.nonNull(x.getUnloadAmount()))
+                    .mapToDouble(x -> x.getUnloadAmount().doubleValue()).sum();
+            double loadAmount = 0.0 ;
+            if (org.apache.commons.lang3.StringUtils.equals(String.valueOf(tradeOrder.getTrading()),
+                    DictEnum.CHARGING_TYPE_2.getValue())){
+                //已履约量
+                loadAmount = subOrders.stream().filter(x -> Objects.nonNull(x.getUnloadAmount()))
+                        .mapToDouble(x -> x.getUnloadAmount().doubleValue()).sum();
+            }else if (org.apache.commons.lang3.StringUtils.equals(String.valueOf(tradeOrder.getTrading()),
+                    DictEnum.CHARGING_TYPE_1.getValue())){
+                //已履约量
+                loadAmount = subOrders.stream().filter(x -> Objects.nonNull(x.getLoadAmount()))
+                        .mapToDouble(x -> x.getLoadAmount().doubleValue()).sum();
+             
+            }
+            tradeOrderPerformanceInfo.setLoadAmount(String.valueOf(loadAmount));
+
+            tradeOrderPerformanceInfo.setLoadTotal(String.valueOf(loadTotal));
+
+            tradeOrderPerformanceInfo.setUnloadTotal(String.valueOf(unloadTotal));
+            //按照物流id进行分组
+            Map<Long, List<RWaybillSubOrderVo.BillSubOrder>> logIdAndSubOrderVoMap =
+                    subOrders.stream().collect(Collectors.groupingBy(RWaybillSubOrderVo.BillSubOrder::getLOrderId));
+            Map<Long, KwtLogisticsOrderVO> finalLogIdAndLogisticsOrderMap = logIdAndLogisticsOrderMap;
+            logIdAndSubOrderVoMap.forEach((logId, subOrderVos) -> {
+                KwtLogisticsOrderVO logisticsOrder = finalLogIdAndLogisticsOrderMap.getOrDefault(logId, new KwtLogisticsOrderVO());
+                BigDecimal price =
+                        Optional.ofNullable(logisticsOrder).map(KwtLogisticsOrderVO::getPrice).orElse(BigDecimal.ZERO);
+                double sum = 0.0 ;
+                if (org.apache.commons.lang3.StringUtils.equals(String.valueOf(tradeOrder.getTrading()),
+                        DictEnum.CHARGING_TYPE_2.getValue())){
+                    //已履约量
+                    sum = subOrderVos.stream().filter(x -> Objects.nonNull(x.getUnloadAmount()))
+                            .mapToDouble(x -> x.getUnloadAmount().doubleValue()).sum();
+                }else if (org.apache.commons.lang3.StringUtils.equals(String.valueOf(tradeOrder.getTrading()),
+                        DictEnum.CHARGING_TYPE_1.getValue())){
+                    //已履约量
+                    sum = subOrderVos.stream().filter(x -> Objects.nonNull(x.getLoadAmount()))
+                            .mapToDouble(x -> x.getLoadAmount().doubleValue()).sum();
+
+                }
+             tradeOrderPerformanceInfo.setLoadAmountPrice(price.multiply(new BigDecimal(sum)).setScale(2,
+                     RoundingMode.HALF_UP).toPlainString());
+            });
+        }
+
+        tradeOrderDetailResp.setTradeOrderPerformanceInfo(tradeOrderPerformanceInfo);
+    }
+
+    private static void setUnloadInfo(Map<String, KwoTradeOrderAddress> tradeOrderIdAndAddressMap, KwoTradeOrder tradeOrder, TradeOrderDetailResp tradeOrderDetailResp) {
+        TradeOrderDetailResp.TradeOrderUnloadInfo tradeOrderUnloadInfo = new TradeOrderDetailResp.TradeOrderUnloadInfo();
+        KwoTradeOrderAddress unloadAdd = tradeOrderIdAndAddressMap.getOrDefault(tradeOrder.getId() + "-" + AddressTypeEnum.TAKE.getCode(),
+                new KwoTradeOrderAddress());
+        tradeOrderUnloadInfo.setUnloadAddress(unloadAdd.getDetailAddress());
+        tradeOrderUnloadInfo.setUnloadContacts(unloadAdd.getContacts());
+        tradeOrderUnloadInfo.setUnloadContactsPhone(unloadAdd.getPhone());
+        tradeOrderDetailResp.setTradeOrderUnloadInfo(tradeOrderUnloadInfo);
+    }
+
+    private static void setGoodsInfo(KwpGoods goods, KwoTradeOrder tradeOrder, TradeOrderDetailResp tradeOrderDetailResp) {
+        TradeOrderDetailResp.TradeOrderGoodsInfo tradeOrderGoodsInfo = new TradeOrderDetailResp.TradeOrderGoodsInfo();
+        if (Objects.nonNull(goods)){
+            tradeOrderGoodsInfo.setGoodsId(String.valueOf(goods.getId()));
+            tradeOrderGoodsInfo.setGoodsName(goods.getName());
+        }
+        tradeOrderGoodsInfo.setUnitPrice(Objects.nonNull(tradeOrder.getPrice()) ? tradeOrder.getPrice().toPlainString() : null);
+        tradeOrderGoodsInfo.setOrderTotal(Objects.nonNull(tradeOrder.getAmount()) ? tradeOrder.getAmount().toPlainString() : null);
+        if (Objects.nonNull(tradeOrder.getPrice()) && Objects.nonNull(tradeOrder.getAmount())){
+            tradeOrderGoodsInfo.setOrderAmount(tradeOrder.getAmount().multiply(tradeOrder.getAmount()).setScale(2
+                    , RoundingMode.HALF_UP).toPlainString());
+        }
+        tradeOrderDetailResp.setTradeOrderGoodsInfo(tradeOrderGoodsInfo);
+    }
+
+    private static void setTradeOrderUnitInfo(Map<String, KwoTradeOrderUnit> tradeOrderIdAndUnitTypeAndUnitMap, KwoTradeOrder tradeOrder, List<RTransportEntVo> logisticsEnts, List<KwtLogisticsOrderVO> kwtLogisticsOrderVOS, TradeOrderDetailResp tradeOrderDetailResp) {
+        TradeOrderDetailResp.TradeOrderUnitInfo tradeOrderUnitInfo = new TradeOrderDetailResp.TradeOrderUnitInfo();
+        KwoTradeOrderUnit purchaseUnit = tradeOrderIdAndUnitTypeAndUnitMap.getOrDefault(tradeOrder.getId() + "-" + OrderUnitTypeEnum.PURCHASE.getType(),
+                new KwoTradeOrderUnit());
+        tradeOrderUnitInfo.setPurchaseUnitId(String.valueOf(purchaseUnit.getId()));
+        tradeOrderUnitInfo.setPurchaseUnitName(purchaseUnit.getFirmName());
+        tradeOrderUnitInfo.setPurchaseContacts(purchaseUnit.getContacts());
+        tradeOrderUnitInfo.setPurchaseContactsPhone(purchaseUnit.getPhone());
+        KwoTradeOrderUnit supplyUnit =
+                tradeOrderIdAndUnitTypeAndUnitMap.getOrDefault(tradeOrder.getId() + "-" + OrderUnitTypeEnum.SALE.getType(),
+                new KwoTradeOrderUnit());
+        tradeOrderUnitInfo.setSupplyUnitId(String.valueOf(supplyUnit.getId()));
+        tradeOrderUnitInfo.setSupplyUnitName(supplyUnit.getFirmName());
+        tradeOrderUnitInfo.setSupplyContacts(supplyUnit.getContacts());
+        tradeOrderUnitInfo.setSupplyContactsPhone(supplyUnit.getPhone());
+        if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(logisticsEnts)){
+            logisticsEnts.forEach(l->{
+                tradeOrderUnitInfo.setCarriageUnitId(String.valueOf(l.getTransportEntId()));
+                tradeOrderUnitInfo.setCarriageUnitName(l.getTransportEntName());
+                tradeOrderUnitInfo.setCarriageContacts(l.getTransportContacts());
+                tradeOrderUnitInfo.setCarriageContactsPhone(l.getTransportContactsPhone());
+                tradeOrderUnitInfo.setCarriagePrice(Objects.nonNull(l.getTransportPrice())?
+                        l.getTransportPrice().setScale(2, RoundingMode.HALF_UP).toPlainString():
+                        null);
+            });
+        }
+
+        BigDecimal carriageCost = BigDecimal.ZERO;
+        if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(kwtLogisticsOrderVOS)){
+            carriageCost = kwtLogisticsOrderVOS.stream()
+                    .map(order -> {
+                        BigDecimal price = order.getPrice() != null ? order.getPrice() : BigDecimal.ZERO;
+                        BigDecimal amount = order.getAmount() != null ? order.getAmount() : BigDecimal.ZERO;
+                        return price.multiply(amount);
+                    })
+                    .reduce(BigDecimal.ZERO, BigDecimal::add);
+
+        }
+        tradeOrderUnitInfo.setCarriageCost(carriageCost.setScale(2, RoundingMode.HALF_UP).toPlainString());
+        tradeOrderDetailResp.setTradeOrderUnitInfo(tradeOrderUnitInfo);
+    }
+
+    private static void setContractInfo(TradeOrderDetailResp tradeOrderDetailResp, KwoTradeOrder tradeOrder, ContractLogisticsAndTradeOrderResDto logisticsAndTradeOrder) {
+        tradeOrderDetailResp.setTradeOrderId(String.valueOf(tradeOrder.getId()));
+        TradeOrderDetailResp.TradeOrderContractInfo tradeOrderContractInfo = new TradeOrderDetailResp.TradeOrderContractInfo();
+        tradeOrderContractInfo.setContractName(logisticsAndTradeOrder.getContactName());
+        tradeOrderContractInfo.setContractNo(logisticsAndTradeOrder.getContractNo());
+        List<ContractLogisticsAndTradeOrderResDto.ContractLogisticsOrder> logisticsContracts = logisticsAndTradeOrder.getLogisticsContracts();
+        if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(logisticsContracts)){
+            List<TradeOrderDetailResp.LogisticsContract> logisticsContractList =
+                    logisticsContracts.stream().map(logisticsContract -> {
+                TradeOrderDetailResp.LogisticsContract logisticsContract1 = new TradeOrderDetailResp.LogisticsContract();
+                logisticsContract1.setLogisticsContractName(logisticsContract.getLogisticsContractName());
+                logisticsContract1.setLogisticsContractNo(logisticsContract.getLogisticsContractNo());
+                return logisticsContract1;
+            }).collect(Collectors.toList());
+            tradeOrderContractInfo.setLogisticsContracts(logisticsContractList);
+        }
+        tradeOrderDetailResp.setTradeOrderContractInfo(tradeOrderContractInfo);
+    }
 }

+ 112 - 4
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/dubbo/TransportServiceImpl.java

@@ -5,6 +5,7 @@ import com.alibaba.fastjson2.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.google.common.collect.Lists;
+import com.sckw.contract.api.RemoteContractService;
 import com.sckw.core.common.enums.enums.DictEnum;
 import com.sckw.core.common.enums.enums.DictTypeEnum;
 import com.sckw.core.exception.BusinessException;
@@ -42,10 +43,7 @@ import com.sckw.transport.api.model.vo.*;
 import com.sckw.transport.dao.*;
 import com.sckw.transport.model.*;
 import com.sckw.transport.model.vo.WaybillCountVo;
-import com.sckw.transport.repository.KwtLogisticsOrderRepository;
-import com.sckw.transport.repository.KwtLogisticsOrderUnitRepository;
-import com.sckw.transport.repository.KwtWaybillOrderRepository;
-import com.sckw.transport.repository.KwtWaybillOrderSubtaskRepository;
+import com.sckw.transport.repository.*;
 import com.sckw.transport.service.KwtCommonService;
 import jakarta.annotation.Resource;
 import jodd.util.StringUtil;
@@ -61,7 +59,9 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
+import java.time.ZoneId;
 import java.util.*;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 /**
@@ -122,6 +122,7 @@ public class TransportServiceImpl implements TransportRemoteService {
     private final KwtWaybillOrderSubtaskRepository waybillOrderSubtaskRepository;
     private final KwtLogisticsOrderRepository logisticsOrderRepository;
     private final KwtLogisticsOrderUnitRepository logisticsOrderUnitRepository;
+    private final KwtLogisticsOrderContractRepository logisticsOrderContractRepository;
     /**
      * 对账管理-ids查询
      *
@@ -878,6 +879,113 @@ public class TransportServiceImpl implements TransportRemoteService {
 
     }
 
+    @Override
+    public List<LogisticContractVo> queryLogisticContractByTradeId(Long tradeId) {
+        //查询物流id
+        List<KwtLogisticsOrder> kwtLogisticsOrders = logisticsOrderRepository.queryByTradeOrderId(tradeId);
+        if (org.apache.commons.collections4.CollectionUtils.isEmpty(kwtLogisticsOrders)){
+            return Collections.emptyList();
+        }
+        //获取物流订单
+        Set<Long> logOrderIds = kwtLogisticsOrders.stream()
+                .map(KwtLogisticsOrder::getId)
+                .collect(Collectors.toSet());
+        //根据物流订单id获取物流合同
+        List<KwtLogisticsOrderContract> contracts = logisticsOrderContractRepository.queryByLogOrderIds(logOrderIds);
+        if (org.apache.commons.collections4.CollectionUtils.isEmpty(contracts)){
+            return Collections.emptyList();
+        }
+        //获取物流合同id
+        return contracts.stream().map(c->{
+             LogisticContractVo logisticContractVo = new LogisticContractVo();
+             logisticContractVo.setLogContractId(c.getContractId());
+             return logisticContractVo;
+         }).collect(Collectors.toList());
+    }
+
+    @Override
+    public List<RTransportEntVo> queryTransportEntByTradeOrderId(Long tradeId) {
+        List<KwtLogisticsOrder> logisticsOrders = logisticsOrderRepository.queryByTradeOrderId(tradeId);
+        if (org.apache.commons.collections4.CollectionUtils.isEmpty(logisticsOrders)){
+            return Collections.emptyList();
+        }
+        List<Long> logIds = logisticsOrders.stream()
+                .map(KwtLogisticsOrder::getId)
+                .collect(Collectors.toList());
+        //物流订单映射物流信息
+        Map<Long, KwtLogisticsOrder> logIdAndLogisticsOrderMap =
+                logisticsOrders.stream().collect(Collectors.toMap(KwtLogisticsOrder::getId,
+                Function.identity(),
+                (e1, e2) -> e1));
+        List<KwtLogisticsOrderUnit> units = logisticsOrderUnitRepository.queryByLogOrderIds(logIds);
+        if (org.apache.commons.collections4.CollectionUtils.isEmpty(units)){
+            return Collections.emptyList();
+        }
+
+        return units.stream().map(unit -> {
+            KwtLogisticsOrder logOrder = logIdAndLogisticsOrderMap.get(unit.getLOrderId());
+            RTransportEntVo rTransportEntVo = new RTransportEntVo();
+            rTransportEntVo.setTransportPrice(logOrder.getPrice());
+            rTransportEntVo.setTransportEntType(unit.getUnitType());
+            rTransportEntVo.setTransportEntId(unit.getEntId());
+            rTransportEntVo.setTransportEntName(unit.getFirmName());
+            rTransportEntVo.setTransportContacts(unit.getContacts());
+            rTransportEntVo.setTransportContactsPhone(unit.getPhone());
+            return rTransportEntVo;
+        }).collect(Collectors.toList());
+    }
+
+    @Override
+    public List<KwtLogisticsOrderVO> queryLogisticOrderByTradeId(Long tradeId) {
+        List<KwtLogisticsOrder> kwtLogisticsOrders = logisticsOrderRepository.queryByTradeOrderId(tradeId);
+        if (org.apache.commons.collections4.CollectionUtils.isEmpty(kwtLogisticsOrders)){
+            return Collections.emptyList();
+        }
+        return kwtLogisticsOrders.stream()
+                .map(TransportServiceImpl::getLogisticsOrderVo)
+                .collect(Collectors.toList());
+
+    }
+
+    private static KwtLogisticsOrderVO getLogisticsOrderVo(KwtLogisticsOrder logOrder) {
+        KwtLogisticsOrderVO kwtLogisticsOrderVO = new KwtLogisticsOrderVO();
+        kwtLogisticsOrderVO.setId(logOrder.getId());
+        kwtLogisticsOrderVO.setEntId(logOrder.getEntId());
+        kwtLogisticsOrderVO.setTOrderId(logOrder.getTOrderId());
+        kwtLogisticsOrderVO.setTOrderNo(logOrder.getTOrderNo());
+        kwtLogisticsOrderVO.setLOrderNo(logOrder.getLOrderNo());
+        kwtLogisticsOrderVO.setPid(logOrder.getPid());
+        kwtLogisticsOrderVO.setSettlementCycle(logOrder.getSettlementCycle());
+        kwtLogisticsOrderVO.setBillingMode(logOrder.getBillingMode());
+        kwtLogisticsOrderVO.setPrice(logOrder.getPrice());
+        kwtLogisticsOrderVO.setPriceType(logOrder.getPriceType());
+        kwtLogisticsOrderVO.setAmount(logOrder.getAmount());
+        kwtLogisticsOrderVO.setUnit(logOrder.getUnit());
+        kwtLogisticsOrderVO.setLoss(logOrder.getLoss());
+        kwtLogisticsOrderVO.setLossUnit(logOrder.getLossUnit());
+        kwtLogisticsOrderVO.setGoodsPrice(logOrder.getGoodsPrice());
+        kwtLogisticsOrderVO.setGoodsPriceUnit(logOrder.getGoodsPriceUnit());
+        kwtLogisticsOrderVO.setStartTime(Date.from(logOrder.getStartTime().atZone(ZoneId.systemDefault()).toInstant()));
+        kwtLogisticsOrderVO.setEntTime(Date.from(logOrder.getEndTime().atZone(ZoneId.systemDefault()).toInstant()));
+        kwtLogisticsOrderVO.setSubcontractAmount(logOrder.getSubcontractAmount());
+        kwtLogisticsOrderVO.setEntrustAmount(logOrder.getEntrustAmount());
+        kwtLogisticsOrderVO.setUnloadAmount(logOrder.getUnloadAmount());
+        kwtLogisticsOrderVO.setLoadAmount(logOrder.getLoadAmount());
+        kwtLogisticsOrderVO.setIgnoreAmount(logOrder.getIgnoreAmount());
+        kwtLogisticsOrderVO.setDeficitAmount(logOrder.getDeficitAmount());
+        kwtLogisticsOrderVO.setDeficitPrice(logOrder.getDeficitPrice());
+        kwtLogisticsOrderVO.setPayment(logOrder.getPayment());
+        kwtLogisticsOrderVO.setTaxRate(logOrder.getTaxRate());
+        kwtLogisticsOrderVO.setRemark(logOrder.getRemark());
+        kwtLogisticsOrderVO.setStatus(logOrder.getStatus());
+        kwtLogisticsOrderVO.setCreateBy(logOrder.getCreateBy());
+        kwtLogisticsOrderVO.setCreateTime(logOrder.getCreateTime());
+        kwtLogisticsOrderVO.setUpdateBy(logOrder.getUpdateBy());
+        kwtLogisticsOrderVO.setUpdateTime(logOrder.getUpdateTime());
+        kwtLogisticsOrderVO.setDelFlag(logOrder.getDelFlag());
+        return kwtLogisticsOrderVO;
+    }
+
     @NotNull
     private static RWaybillSubOrderVo.BillSubOrder getRWaybillSubOrderVo(KwtWaybillOrderSubtask subtask) {
         RWaybillSubOrderVo.BillSubOrder billSubOrder = new RWaybillSubOrderVo.BillSubOrder();

+ 26 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/repository/KwtLogisticsOrderContractRepository.java

@@ -0,0 +1,26 @@
+package com.sckw.transport.repository;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sckw.transport.dao.KwtLogisticsOrderContractMapper;
+import com.sckw.transport.model.KwtLogisticsOrderContract;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author :chenXiaoFei
+ * @version :1.0
+ * @description : 物流订单和物流合同关联接口
+ * @create :2025-11-08 10:41:00
+ */
+@Repository
+public class KwtLogisticsOrderContractRepository extends ServiceImpl<KwtLogisticsOrderContractMapper,
+        KwtLogisticsOrderContract> {
+    public List<KwtLogisticsOrderContract> queryByLogOrderIds(Set<Long> logOrderIds) {
+        return list(Wrappers.<KwtLogisticsOrderContract>lambdaQuery()
+                .eq(KwtLogisticsOrderContract::getDelFlag,0)
+                .in(KwtLogisticsOrderContract::getLOrderId,logOrderIds));
+    }
+}

+ 6 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/repository/KwtLogisticsOrderRepository.java

@@ -26,4 +26,10 @@ public class KwtLogisticsOrderRepository extends ServiceImpl<KwtLogisticsOrderMa
                 .eq(KwtLogisticsOrder::getDelFlag, 0)
                 .in(KwtLogisticsOrder::getTOrderId, tradeOrderIds));
     }
+
+    public List<KwtLogisticsOrder> queryByTradeOrderId(Long tradeId) {
+        return list(Wrappers.<KwtLogisticsOrder>lambdaQuery()
+                .eq(KwtLogisticsOrder::getDelFlag, 0)
+                .eq(KwtLogisticsOrder::getTOrderId, tradeId));
+    }
 }

+ 1 - 0
sql/2025/11/30/2025_11_30_cxf_alert.sql

@@ -27,5 +27,6 @@ ALTER TABLE kwc_contract_logistics_goods ADD common_price decimal(10, 2)  NOT NU
 
 
 ALTER TABLE kwo_trade_order ADD charge_type TINYINT NOT NULL default '0'  comment '计费方式';
+ALTER TABLE kwo_trade_order ADD consignment_way TINYINT NOT NULL default '0'  comment '托运方式 1-采购方托运,2-供应方托运';
 ALTER TABLE kwo_trade_order_goods ADD goods_name varchar(255)   NOT NULL default ''  comment '商品名称';