Procházet zdrojové kódy

提交合同查询接口

chenxiaofei před 1 měsícem
rodič
revize
cd3e1b4da3
19 změnil soubory, kde provedl 603 přidání a 31 odebrání
  1. 1 0
      sckw-common/sckw-common-core/src/main/java/com/sckw/core/model/enums/LogisticsOrderEnum.java
  2. 9 4
      sckw-modules-api/sckw-contract-api/src/main/java/com/sckw/contract/api/RemoteContractService.java
  3. 5 0
      sckw-modules-api/sckw-contract-api/src/main/java/com/sckw/contract/api/model/dto/res/ContractLogisticsOrderResDto.java
  4. 32 0
      sckw-modules-api/sckw-contract-api/src/main/java/com/sckw/contract/api/model/dto/res/ContractTradeOrderDto.java
  5. 156 0
      sckw-modules-api/sckw-contract-api/src/main/java/com/sckw/contract/api/model/dto/res/ContractTradeOrderInfo.java
  6. 32 0
      sckw-modules-api/sckw-contract-api/src/main/java/com/sckw/contract/api/model/dto/res/LogisticsOrderDto.java
  7. 157 10
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/dubbo/RemoteContractServiceImpl.java
  8. 7 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/repository/KwcContractLogisticsGoodsRepository.java
  9. 14 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/repository/KwcContractLogisticsUnitRepository.java
  10. 7 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/repository/KwcContractTradeGoodsRepository.java
  11. 7 0
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/repository/KwcContractTradeUnitRepository.java
  12. 9 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/controller/KwtLogisticsOrderController.java
  13. 3 3
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/KwtLogisticsOrder.java
  14. 18 1
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/vo/DispatchCarReq.java
  15. 3 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/vo/DispatchCarResp.java
  16. 26 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/vo/OrderFinishReq.java
  17. 11 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/repository/KwtLogisticsOrderCirculateRepository.java
  18. 4 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/repository/KwtLogisticsOrderRepository.java
  19. 102 13
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtLogisticsConsignmentService.java

+ 1 - 0
sckw-common/sckw-common-core/src/main/java/com/sckw/core/model/enums/LogisticsOrderEnum.java

@@ -51,6 +51,7 @@ public enum LogisticsOrderEnum {
     REJECT_ORDER(8, "rejectOrder", "8", "已拒单"),
 
     CANCEL_ORDER(9, "cancelOrder", "9", "已撤销"),
+    NEARING_COMPLETION(10, "nearingCompletion", "9", "完结中"),
     ;
 
     private final Integer code;

+ 9 - 4
sckw-modules-api/sckw-contract-api/src/main/java/com/sckw/contract/api/RemoteContractService.java

@@ -1,8 +1,6 @@
 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 com.sckw.contract.api.model.dto.res.*;
 
 import java.math.BigDecimal;
 import java.util.List;
@@ -59,5 +57,12 @@ public interface RemoteContractService {
      */
     ContractLogisticsAndTradeOrderResDto queryContractByContractId(Long tradeOrderContractId,Long tradeId);
 
-
+    /**
+     * 查询物流合同信息
+     */
+    List<ContractLogisticsOrderResDto> queryContractLogisticsOrder(LogisticsOrderDto logisticsOrderDto);
+    /**
+     * 查询贸易合同信息
+     */
+    List<ContractTradeOrderInfo> queryContractTradeOrder(ContractTradeOrderDto contractTradeOrderDto);
 }

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

@@ -4,6 +4,7 @@ import lombok.Data;
 
 import java.io.Serial;
 import java.io.Serializable;
+import java.math.BigDecimal;
 
 /**
  * @author czh
@@ -70,5 +71,9 @@ public class ContractLogisticsOrderResDto implements Serializable {
      * 承运企业名称
      */
     private String acceptCarriageEntName;
+    /**
+     * 价格
+     */
+    private BigDecimal price;
 
 }

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

@@ -0,0 +1,32 @@
+package com.sckw.contract.api.model.dto.res;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @author :chenXiaoFei
+ * @version :1.0
+ * @description :
+ * @create :2025-11-14 15:57:00
+ */
+@Data
+public class ContractTradeOrderDto implements Serializable {
+    @Serial
+    private static final long serialVersionUID = 1154651392583058057L;
+    /**
+     * 商品id
+     */
+    private Long goodsId;
+
+    /**
+     * 托运方企业id
+     */
+    private Long entId;
+
+    /**
+     * 企业类型(1-供应 2-采购)
+     */
+    private Integer entType;
+}

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

@@ -0,0 +1,156 @@
+package com.sckw.contract.api.model.dto.res;
+
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
+import com.baomidou.mybatisplus.annotation.TableField;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @author :chenXiaoFei
+ * @version :1.0
+ * @description :
+ * @create :2025-11-14 15:57:00
+ */
+@Data
+public class ContractTradeOrderInfo implements Serializable {
+    @Serial
+    private static final long serialVersionUID = 1154651392583058057L;
+    private Long id;
+
+    /**
+     * 企业id
+     */
+    private Long entId;
+
+    /**
+     * 合同编号
+     */
+    private String contractNo;
+
+    /**
+     * 合同名称
+     */
+    private String name;
+
+    /**
+     * 签约方式(1线上签约、2线下签约)
+     */
+    private Integer signingWay;
+
+    /**
+     * 交易方式(1预付款、2货到付款)
+     */
+    private Integer trading;
+
+    /**
+     * 开始日期
+     */
+    private Date startTime;
+
+    /**
+     * 结束日期
+     */
+
+    private Date endTime;
+
+    /**
+     * 数量
+     */
+    private BigDecimal amount;
+
+    /**
+     * 履行量
+     */
+    private BigDecimal performedAmount;
+
+    /**
+     * 签署文件
+     */
+    private String signingUrl;
+
+    /**
+     * 已签署文件
+     */
+    private String signedUrl;
+
+    /**
+     * 签约编号
+     */
+    private String signingNo;
+
+    /**
+     * 合同关联id
+     */
+    private Long contractPid;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 签约状态(签约中、已签约、已完结(结算时间已完成)、已解约、签约失败)
+     */
+    private Integer status;
+
+    /**
+     *
+     */
+    private Long createBy;
+
+    /**
+     *
+     */
+    private Date createTime;
+
+    /**
+     *
+     */
+    private Long updateBy;
+
+    /**
+     * 更新时间
+     */
+    private Date updateTime;
+
+    /**
+     * 是否删除(0未删除,1删除)
+     */
+    private Integer delFlag;
+
+    /**
+     * 业务id
+     */
+    private String businessId;
+
+    /**
+     * 结算方式
+     */
+
+    private Integer settlement;
+
+    /**
+     * 托运方式
+     */
+
+    private Integer consignment;
+    /**
+     * 卸货方式
+     */
+
+    private Integer unloadWay;
+    /**
+     * 销售人员id
+     */
+
+    private Long salesmanId;
+    /**
+     * 销售联系电话
+     */
+
+    private String salesmanPhone;
+}

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

@@ -0,0 +1,32 @@
+package com.sckw.contract.api.model.dto.res;
+
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @author :chenXiaoFei
+ * @version :1.0
+ * @description : 物流合同请求参数
+ * @create :2025-11-14 15:56:00
+ */
+@Data
+public class LogisticsOrderDto implements Serializable {
+    @Serial
+    private static final long serialVersionUID = -2666407909388440211L;
+    /**
+     * 商品id
+     */
+    private Long goodsId;
+
+    /**
+     * 托运方企业id
+     */
+    private Long entId;
+
+    /**
+     * 企业类型(3-托运 4-承运)
+     */
+    private Integer entType;
+}

+ 157 - 10
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/dubbo/RemoteContractServiceImpl.java

@@ -1,22 +1,17 @@
 package com.sckw.contract.dubbo;
 
-import com.google.common.collect.Lists;
+import com.alibaba.fastjson.JSON;
 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.api.model.dto.res.*;
 import com.sckw.contract.dao.KwcContractLogisticsMapper;
 import com.sckw.contract.dao.KwcContractLogisticsUnitMapper;
 import com.sckw.contract.dao.KwcContractTradeMapper;
 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.model.entity.*;
+import com.sckw.contract.repository.*;
 import com.sckw.contract.service.KwcContractLogisticsUnitService;
+import com.sckw.core.exception.BusinessException;
 import com.sckw.core.model.constant.Global;
 import com.sckw.core.model.enums.ContractStatusEnum;
 import com.sckw.core.model.enums.CooperateTypeEnum;
@@ -26,12 +21,15 @@ 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 lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.apache.dubbo.config.annotation.DubboService;
+import org.jetbrains.annotations.NotNull;
 import org.springframework.beans.factory.annotation.Autowired;
 
 import java.math.BigDecimal;
 import java.util.*;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 /**
@@ -41,6 +39,7 @@ import java.util.stream.Collectors;
  */
 @DubboService(group = "design", version = "1.0.0")
 @RequiredArgsConstructor
+@Slf4j
 public class RemoteContractServiceImpl implements RemoteContractService {
 
     @Autowired
@@ -62,6 +61,10 @@ public class RemoteContractServiceImpl implements RemoteContractService {
 
     private final KwcContractTradeRepository kwcContractTradeRepository ;
     private final KwcContractLogisticsRepository contractLogisticsRepository;
+    private final KwcContractTradeUnitRepository kwcContractTradeUnitRepository;
+    private final KwcContractTradeGoodsRepository kwcContractTradeGoodsRepository;
+    private final KwcContractLogisticsUnitRepository kwcContractLogisticsUnitRepository;
+    private final KwcContractLogisticsGoodsRepository kwcContractLogisticsGoodsRepository;
 
     @Override
     public Map<Long, ContractCommonInfoResDto> queryContractBaseInfo(List<Long> contractIds) {
@@ -240,6 +243,150 @@ public class RemoteContractServiceImpl implements RemoteContractService {
         return contractLogisticsAndTradeOrderResDto;
     }
 
+    @Override
+    public List<ContractLogisticsOrderResDto> queryContractLogisticsOrder(LogisticsOrderDto logisticsOrderDto) {
+        log.info("查询物流合同请求:{}",JSON.toJSONString( logisticsOrderDto));
+
+        if (Objects.isNull(logisticsOrderDto.getGoodsId())) {
+            throw new BusinessException("商品id不能为空!");
+        }
+        if (Objects.isNull(logisticsOrderDto.getEntId())) {
+            throw new BusinessException("托运方企业id不能为空!");
+        }
+        //查询物流公司
+        List<KwcContractLogisticsUnit> contractLogistics =
+                kwcContractLogisticsUnitRepository.queryByEntId(logisticsOrderDto.getEntId());
+        if (org.apache.commons.collections4.CollectionUtils.isEmpty(contractLogistics)){
+            return Collections.emptyList();
+        }
+        //物流订单和类型组成唯一key
+        Map<String, KwcContractLogisticsUnit> contractLogisticsMap =
+                contractLogistics.stream().peek(c -> c.setContractIdUnitTypeKey(c.getContractId() + "_" + c.getUnitType()))
+                .collect(Collectors.toMap(KwcContractLogisticsUnit::getContractIdUnitTypeKey, Function.identity(), (x,
+                                                                                                                    y) -> x));
+        //物流订单合id
+        Set<Long> logTradeContractIds =
+                contractLogistics.stream().map(KwcContractLogisticsUnit::getContractId).collect(Collectors.toSet());
+
+        //查询商品信息
+       List<KwcContractLogisticsGoods> kwcContractLogisticsGoods = kwcContractLogisticsGoodsRepository.queryByLogIdsAndGoodsId(logTradeContractIds,
+                logisticsOrderDto.getGoodsId());
+       if (org.apache.commons.collections4.CollectionUtils.isEmpty(kwcContractLogisticsGoods)){
+           return Collections.emptyList();
+       }
+       //合同id和商品映射
+        Map<Long, KwcContractLogisticsGoods> contractLogisticsGoodsMap =
+                kwcContractLogisticsGoods.stream().collect(Collectors.toMap(KwcContractLogisticsGoods::getContractId,
+                Function.identity(), (x, y) -> x));
+        Set<Long> logTradeContractIdList =
+                kwcContractLogisticsGoods.stream().map(KwcContractLogisticsGoods::getContractId).collect(Collectors.toSet());
+       //查询物流订单
+        List<KwcContractLogistics> logistics = contractLogisticsRepository.queryByLogisticContractIds(logTradeContractIdList);
+        if (CollectionUtils.isEmpty( logistics)){
+            return Collections.emptyList();
+        }
+       return logistics.stream()
+                .map(log -> getContractLogisticsOrderResDto(log, contractLogisticsMap, contractLogisticsGoodsMap))
+               .collect(Collectors.toList());
+
+    }
+
+    @NotNull
+    private static ContractLogisticsOrderResDto getContractLogisticsOrderResDto(KwcContractLogistics log, Map<String, KwcContractLogisticsUnit> contractLogisticsMap, Map<Long, KwcContractLogisticsGoods> contractLogisticsGoodsMap) {
+        ContractLogisticsOrderResDto contractLogisticsOrderResDto = new ContractLogisticsOrderResDto();
+        contractLogisticsOrderResDto.setId(log.getId());
+        contractLogisticsOrderResDto.setContactName(log.getName());
+        contractLogisticsOrderResDto.setContractNo(log.getContractNo());
+        contractLogisticsOrderResDto.setSigningWay(log.getSigningWay());
+        contractLogisticsOrderResDto.setStatus(log.getStatus());
+        KwcContractLogisticsUnit consignEnt = contractLogisticsMap.getOrDefault(log.getId() + "_" + CooperateTypeEnum.CONSIGN.getCode(),
+                new KwcContractLogisticsUnit());
+        KwcContractLogisticsUnit acceptCarriageEnt = contractLogisticsMap.getOrDefault(log.getId() + "_" + CooperateTypeEnum.CARRIAGE.getCode(),
+                new KwcContractLogisticsUnit());
+        contractLogisticsOrderResDto.setConsignEntId(consignEnt.getContractId());
+        contractLogisticsOrderResDto.setConsignEntName(consignEnt.getFirmName());
+        contractLogisticsOrderResDto.setAcceptCarriageEntId(acceptCarriageEnt.getContractId());
+        contractLogisticsOrderResDto.setAcceptCarriageEntName(acceptCarriageEnt.getFirmName());
+        KwcContractLogisticsGoods goods = contractLogisticsGoodsMap.getOrDefault(log.getId(),
+                new KwcContractLogisticsGoods());
+        contractLogisticsOrderResDto.setPrice(goods.getPrice());
+        return contractLogisticsOrderResDto;
+    }
+
+    @Override
+    public List<ContractTradeOrderInfo> queryContractTradeOrder(ContractTradeOrderDto contractTradeOrderDto) {
+        log.info("查询贸易合同订单,请求:{}", JSON.toJSONString(contractTradeOrderDto));
+        checkParam(contractTradeOrderDto.getGoodsId(), contractTradeOrderDto.getEntId(), contractTradeOrderDto.getEntType());
+        //查询贸易合同企业信息
+        List<KwcContractTradeUnit> tradeUnits = kwcContractTradeUnitRepository.queryByEntIdAndUnitType(contractTradeOrderDto.getEntId(),
+                contractTradeOrderDto.getEntType());
+        if (org.apache.commons.collections4.CollectionUtils.isEmpty(tradeUnits)){
+            return Collections.emptyList();
+        }
+        Set<Long> contractIds =
+                tradeUnits.stream().map(KwcContractTradeUnit::getContractId).collect(Collectors.toSet());
+        //查询商品信息
+        List<KwcContractTradeGoods> kwcContractGoods = kwcContractTradeGoodsRepository.queryByContractIdsAndGoodsId(contractIds,
+                contractTradeOrderDto.getGoodsId());
+        if (org.apache.commons.collections4.CollectionUtils.isEmpty(kwcContractGoods)){
+            return Collections.emptyList();
+        }
+        Set<Long> contractIdList = kwcContractGoods.stream()
+                        .map(KwcContractTradeGoods::getContractId)
+                        .collect(Collectors.toSet());
+        //查询贸易合同
+        List<KwcContractTrade> kwcContractTrades = kwcContractTradeRepository.queryByContractIds(contractIdList);
+        if (org.apache.commons.collections4.CollectionUtils.isEmpty(kwcContractTrades)){
+            return Collections.emptyList();
+        }
+       return kwcContractTrades.stream().map(RemoteContractServiceImpl::getContractTradeOrderInfo)
+               .collect(Collectors.toList());
+    }
+
+    private static void checkParam(Long contractTradeOrderDto, Long contractTradeOrderDto1, Integer contractTradeOrderDto2) {
+        if (Objects.isNull(contractTradeOrderDto)) {
+            throw new BusinessException("商品id不能为空!");
+        }
+        if (Objects.isNull(contractTradeOrderDto1)) {
+            throw new BusinessException("托运方企业id不能为空!");
+        }
+        if (Objects.isNull(contractTradeOrderDto2)) {
+            throw new BusinessException("企业类型不能为空!");
+        }
+    }
+
+    @NotNull
+    private static ContractTradeOrderInfo getContractTradeOrderInfo(KwcContractTrade c) {
+        ContractTradeOrderInfo contractTradeOrderInfo = new ContractTradeOrderInfo();
+        contractTradeOrderInfo.setId(c.getId());
+        contractTradeOrderInfo.setEntId(c.getEntId());
+        contractTradeOrderInfo.setContractNo(c.getContractNo());
+        contractTradeOrderInfo.setName(c.getName());
+        contractTradeOrderInfo.setSigningWay(c.getSigningWay());
+        contractTradeOrderInfo.setTrading(c.getTrading());
+        contractTradeOrderInfo.setStartTime(c.getStartTime());
+        contractTradeOrderInfo.setEndTime(c.getEndTime());
+        contractTradeOrderInfo.setAmount(c.getAmount());
+        contractTradeOrderInfo.setPerformedAmount(c.getPerformedAmount());
+        contractTradeOrderInfo.setSigningUrl(c.getSigningUrl());
+        contractTradeOrderInfo.setSignedUrl(c.getSignedUrl());
+        contractTradeOrderInfo.setSigningNo(c.getSigningNo());
+        contractTradeOrderInfo.setContractPid(c.getContractPid());
+        contractTradeOrderInfo.setRemark(c.getRemark());
+        contractTradeOrderInfo.setStatus(c.getStatus());
+        contractTradeOrderInfo.setCreateBy(c.getCreateBy());
+        contractTradeOrderInfo.setCreateTime(c.getCreateTime());
+        contractTradeOrderInfo.setUpdateBy(c.getUpdateBy());
+        contractTradeOrderInfo.setUpdateTime(c.getUpdateTime());
+        contractTradeOrderInfo.setDelFlag(c.getDelFlag());
+        contractTradeOrderInfo.setBusinessId(c.getBusinessId());
+        contractTradeOrderInfo.setSettlement(c.getSettlement());
+        contractTradeOrderInfo.setConsignment(c.getConsignment());
+        contractTradeOrderInfo.setUnloadWay(c.getUnloadWay());
+        contractTradeOrderInfo.setSalesmanId(c.getSalesmanId());
+        contractTradeOrderInfo.setSalesmanPhone(c.getSalesmanPhone());
+        return contractTradeOrderInfo;
+    }
 
 
     private ContractCommonInfoResDto fillContractLogistics(KwcContractLogistics kwcContractLogistics) {

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

@@ -40,4 +40,11 @@ public class KwcContractLogisticsGoodsRepository extends ServiceImpl<KwcContract
         remove(Wrappers.<KwcContractLogisticsGoods>lambdaQuery()
                 .eq(KwcContractLogisticsGoods::getContractId,contactId));
     }
+
+    public List<KwcContractLogisticsGoods> queryByLogIdsAndGoodsId(Set<Long> logTradeContractIds, Long goodsId) {
+        return list(Wrappers.<KwcContractLogisticsGoods>lambdaQuery()
+                .eq(KwcContractLogisticsGoods::getDelFlag,0)
+                .eq(KwcContractLogisticsGoods::getGoodsId,goodsId)
+                .in(KwcContractLogisticsGoods::getContractId,logTradeContractIds));
+    }
 }

+ 14 - 0
sckw-modules/sckw-contract/src/main/java/com/sckw/contract/repository/KwcContractLogisticsUnitRepository.java

@@ -3,6 +3,7 @@ package com.sckw.contract.repository;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.sckw.contract.dao.KwcContractLogisticsUnitMapper;
+import com.sckw.contract.model.entity.KwcContractLogistics;
 import com.sckw.contract.model.entity.KwcContractLogisticsUnit;
 import com.sckw.contract.model.entity.KwcContractTradeUnit;
 import org.springframework.stereotype.Repository;
@@ -40,4 +41,17 @@ public class KwcContractLogisticsUnitRepository extends ServiceImpl<KwcContractL
         remove(Wrappers.<KwcContractLogisticsUnit>lambdaQuery()
                 .eq(KwcContractLogisticsUnit::getContractId, contactId));
     }
+
+    public List<KwcContractLogisticsUnit> queryByEntIdAndEntType(Long entId, Integer entType) {
+        return list(Wrappers.<KwcContractLogisticsUnit>lambdaQuery()
+                .eq(KwcContractLogisticsUnit::getEntId, entId)
+                .eq(KwcContractLogisticsUnit::getUnitType, entType)
+                .eq(KwcContractLogisticsUnit::getDelFlag,0));
+    }
+
+    public List<KwcContractLogisticsUnit> queryByEntId(Long entId) {
+        return list(Wrappers.<KwcContractLogisticsUnit>lambdaQuery()
+                .eq(KwcContractLogisticsUnit::getEntId, entId)
+                .eq(KwcContractLogisticsUnit::getDelFlag,0));
+    }
 }

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

@@ -42,4 +42,11 @@ public class KwcContractTradeGoodsRepository extends ServiceImpl<KwcContractTrad
                 .eq(KwcContractTradeGoods::getDelFlag,0)
                 .eq(KwcContractTradeGoods::getContractId, contractId));
     }
+
+    public List<KwcContractTradeGoods> queryByContractIdsAndGoodsId(Set<Long> contractIds, Long goodsId) {
+        return list(Wrappers.<KwcContractTradeGoods>lambdaQuery()
+                .eq(KwcContractTradeGoods::getDelFlag,0)
+                .in(KwcContractTradeGoods::getContractId, contractIds)
+                .eq(KwcContractTradeGoods::getGoodsId, goodsId));
+    }
 }

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

@@ -35,4 +35,11 @@ public class KwcContractTradeUnitRepository extends ServiceImpl<KwcContractTrade
                 .eq(KwcContractTradeUnit::getDelFlag, 0)
                 .in(KwcContractTradeUnit::getContractId, tradeContractIds));
     }
+
+    public List<KwcContractTradeUnit> queryByEntIdAndUnitType(Long entId, Integer unitType) {
+       return list(Wrappers.<KwcContractTradeUnit>lambdaQuery()
+                .eq(KwcContractTradeUnit::getEntId, entId)
+                .eq(KwcContractTradeUnit::getUnitType, unitType)
+                .eq(KwcContractTradeUnit::getDelFlag, 0));
+    }
 }

+ 9 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/controller/KwtLogisticsOrderController.java

@@ -183,4 +183,13 @@ public class KwtLogisticsOrderController {
     public BaseResult<DispatchCarResp> dispatchCar(@RequestBody @Valid DispatchCarReq req) {
         return BaseResult.success(logisticsConsignmentService.dispatchCar(req));
     }
+
+    /**
+     * 完结订单
+     */
+    @PostMapping("/logisticOrderFinish")
+    @Operation(summary = "完结订单", description = "完结订单")
+    public BaseResult<Boolean> logisticOrderFinish(@RequestBody @Valid OrderFinishReq req ) {
+        return BaseResult.success(logisticsConsignmentService.logisticOrderFinish(req));
+    }
 }

+ 3 - 3
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/KwtLogisticsOrder.java

@@ -1,8 +1,6 @@
 package com.sckw.transport.model;
 
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableLogic;
-import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.*;
 import jakarta.validation.constraints.DecimalMin;
 import jakarta.validation.constraints.Digits;
 import jakarta.validation.constraints.Max;
@@ -10,6 +8,7 @@ import jakarta.validation.constraints.Min;
 import lombok.Data;
 
 import java.io.Serializable;
+import java.lang.reflect.Type;
 import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.util.Date;
@@ -26,6 +25,7 @@ public class KwtLogisticsOrder implements Serializable {
     /**
      * 主键
      */
+    @TableId(type = IdType.NONE)
     private Long id;
 
     /**

+ 18 - 1
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/vo/DispatchCarReq.java

@@ -36,5 +36,22 @@ public class DispatchCarReq implements Serializable {
      */
     @Schema(description = "车辆id")
     @NotEmpty(message = "车辆id列表")
-    private List<String> truckId;
+    private List<CarInfo> carInfos;
+    @Data
+    public static class CarInfo implements Serializable{
+        @Serial
+        private static final long serialVersionUID = 4384175564253296575L;
+        /**
+         * 车辆id
+         */
+        @Schema(description = "车辆id")
+        @NotBlank(message = "车辆id不能为空")
+        private String truckId;
+        /**
+         * 车牌号
+         */
+        @Schema(description = "车牌号")
+        @NotBlank(message = "车牌号不能为空")
+        private String truckNo;
+    }
 }

+ 3 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/vo/DispatchCarResp.java

@@ -1,5 +1,7 @@
 package com.sckw.transport.model.vo;
 
+import lombok.Data;
+
 import java.io.Serial;
 import java.io.Serializable;
 
@@ -9,6 +11,7 @@ import java.io.Serializable;
  * @description :
  * @create :2025-11-14 10:23:00
  */
+@Data
 public class DispatchCarResp implements Serializable {
     @Serial
     private static final long serialVersionUID = 5084673710895915098L;

+ 26 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/vo/OrderFinishReq.java

@@ -0,0 +1,26 @@
+package com.sckw.transport.model.vo;
+
+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-14 15:22:00
+ */
+@Data
+public class OrderFinishReq implements Serializable {
+    @Serial
+    private static final long serialVersionUID = 2204191724806474658L;
+    /**
+     * 物流订单id
+     */
+    @Schema(description = "物流订单id")
+    @NotBlank(message = "物流订单id不能为空")
+    private String logisticOrderId;
+}

+ 11 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/repository/KwtLogisticsOrderCirculateRepository.java

@@ -43,4 +43,15 @@ public class KwtLogisticsOrderCirculateRepository extends ServiceImpl<KwtLogisti
         return updateBatchById(updateCirculates);
 
     }
+
+    public List<KwtLogisticsOrderCirculate> findOneByLogOrderIdsAndTruckIds(Long logOrderId, Set<String> truckIds) {
+        return list(Wrappers.<KwtLogisticsOrderCirculate>lambdaQuery()
+                .eq(KwtLogisticsOrderCirculate::getDelFlag,0)
+                .eq(KwtLogisticsOrderCirculate::getLOrderId, logOrderId)
+                .in(KwtLogisticsOrderCirculate::getTruckId, truckIds));
+    }
+
+    public Boolean insertCirculates(List<KwtLogisticsOrderCirculate> insertOrderCirculates) {
+       return saveBatch(insertOrderCirculates);
+    }
 }

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

@@ -79,4 +79,8 @@ public class KwtLogisticsOrderRepository extends ServiceImpl<KwtLogisticsOrderMa
                 .eq(KwtLogisticsOrder::getDelFlag,0)
                 .in(KwtLogisticsOrder::getId, logOrderIds));
     }
+
+    public Boolean updateLogisticsOrder(KwtLogisticsOrder updateLogisticsOrder) {
+       return updateById(updateLogisticsOrder);
+    }
 }

+ 102 - 13
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtLogisticsConsignmentService.java

@@ -72,6 +72,7 @@ import org.springframework.util.ObjectUtils;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.time.ZoneId;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.function.Function;
@@ -2405,19 +2406,11 @@ public class KwtLogisticsConsignmentService {
                 kwtLogisticsOrder.getAmount().setScale(2, RoundingMode.HALF_UP).toPlainString() : "0.00");
         BigDecimal expectedTransportPrice = BigDecimal.ZERO;
         BigDecimal actualTransportPrice = BigDecimal.ZERO;
-        if (org.apache.commons.lang3.StringUtils.equals(kwtLogisticsOrder.getBillingMode(),DictEnum.CHARGING_TYPE_1.getValue())){
-            expectedTransportPrice = Objects.nonNull(kwtLogisticsOrder.getPrice()) && Objects.nonNull(kwtLogisticsOrder.getLoadAmount()) ?
+        expectedTransportPrice =
+                Objects.nonNull(kwtLogisticsOrder.getPrice()) && Objects.nonNull(kwtLogisticsOrder.getAmount()) ?
                     kwtLogisticsOrder.getPrice().multiply(kwtLogisticsOrder.getLoadAmount()) : BigDecimal.ZERO;
-            actualTransportPrice = Objects.nonNull(kwtLogisticsOrder.getPrice()) && Objects.nonNull(kwtLogisticsOrder.getTotalLoadAmount()) ?
-                    kwtLogisticsOrder.getPrice().multiply(kwtLogisticsOrder.getTotalLoadAmount()) : BigDecimal.ZERO;
-
-        }else if (org.apache.commons.lang3.StringUtils.equals(kwtLogisticsOrder.getBillingMode(),DictEnum.CHARGING_TYPE_2.getValue())){
-            expectedTransportPrice = Objects.nonNull(kwtLogisticsOrder.getPrice()) && Objects.nonNull(kwtLogisticsOrder.getUnloadAmount()) ?
-                    kwtLogisticsOrder.getPrice().multiply(kwtLogisticsOrder.getUnloadAmount()) : BigDecimal.ZERO;
-            actualTransportPrice = Objects.nonNull(kwtLogisticsOrder.getPrice()) && Objects.nonNull(kwtLogisticsOrder.getTotalUnloadAmount()) ?
-                    kwtLogisticsOrder.getPrice().multiply(kwtLogisticsOrder.getTotalUnloadAmount()) : BigDecimal.ZERO;
-        }
-
+        actualTransportPrice = Objects.nonNull(kwtLogisticsOrder.getPrice()) && Objects.nonNull(kwtLogisticsOrder.getTotalUnloadAmount()) ?
+                kwtLogisticsOrder.getPrice().multiply(kwtLogisticsOrder.getTotalUnloadAmount()) : BigDecimal.ZERO;
 
         logisticsOrderResp.setExpectedTransportPrice(expectedTransportPrice.setScale(2,RoundingMode.HALF_UP).toPlainString());
         logisticsOrderResp.setActualTransportPrice(actualTransportPrice.setScale(2,RoundingMode.HALF_UP).toPlainString());
@@ -2772,7 +2765,103 @@ public class KwtLogisticsConsignmentService {
     }
 
     public DispatchCarResp dispatchCar(@Valid DispatchCarReq req) {
+        log.info("派车请求参数:{}", JSON.toJSONString(req));
+        //查询物流订单
+        Long logOrderId = Long.parseLong(req.getLogisticOrderId());
+        KwtLogisticsOrder logisticsOrder =
+                logisticsOrderRepository.queryByLogisticsOrderId(logOrderId);
+        if (Objects.isNull(logisticsOrder)){
+            throw new BusinessException("未找到该物流订单信息");
+        }
+        //车牌id去重
+        List<DispatchCarReq.CarInfo> carInfos = req.getCarInfos();
+        Set<String> truckIds = carInfos.stream()
+                        .map(DispatchCarReq.CarInfo::getTruckId)
+                        .collect(Collectors.toSet());
+        //查询派车信息
+        List<KwtLogisticsOrderCirculate> logisticsOrderCirculates =
+                logisticsOrderCirculateRepository.findOneByLogOrderIdsAndTruckIds(logisticsOrder.getId(), truckIds);
+
+        List<KwtLogisticsOrderCirculate> insertOrderCirculates = Lists.newArrayList();
+        if (org.apache.commons.collections4.CollectionUtils.isEmpty(logisticsOrderCirculates)){
+            //直接新增
+            List<KwtLogisticsOrderCirculate> saveOrderCirculates = carInfos.stream()
+                    .map(t -> getKwtLogisticsOrderCirculate(req, t, logOrderId, logisticsOrder))
+                    .collect(Collectors.toList());
+            insertOrderCirculates.addAll(saveOrderCirculates);
+        }else {
+            //过滤掉已有的车
+            List<Long> truckIdList = logisticsOrderCirculates.stream()
+                    .map(KwtLogisticsOrderCirculate::getTruckId)
+                    .collect(Collectors.toList());
+            List<KwtLogisticsOrderCirculate> saveOrderCirculates = carInfos.stream().filter(t -> !truckIdList.contains(t.getTruckId()))
+                    .map(t -> getKwtLogisticsOrderCirculate(req, t, logOrderId, logisticsOrder))
+                    .collect(Collectors.toList());
+            insertOrderCirculates.addAll(saveOrderCirculates);
+        }
+        DispatchCarResp dispatchCarResp = new DispatchCarResp();
+        if (org.apache.commons.collections4.CollectionUtils.isEmpty(insertOrderCirculates)){
+            //批量新增
+            dispatchCarResp.setSuccessCount("0");
+            return new DispatchCarResp();
+        }
+        Boolean b = logisticsOrderCirculateRepository.insertCirculates(insertOrderCirculates);
+        if (!b){
+            throw new BusinessException("派车失败");
+        }
+        dispatchCarResp.setSuccessCount(String.valueOf(insertOrderCirculates.size()));
+        return dispatchCarResp;
+    }
 
-        return null;
+    @NotNull
+    private static KwtLogisticsOrderCirculate getKwtLogisticsOrderCirculate(DispatchCarReq req,
+                                                                            DispatchCarReq.CarInfo carInfo, Long logOrderId, KwtLogisticsOrder logisticsOrder) {
+        KwtLogisticsOrderCirculate logisticsOrderCirculate = new KwtLogisticsOrderCirculate();
+        logisticsOrderCirculate.setEntId(Long.valueOf(req.getEntId()));
+        logisticsOrderCirculate.setLOrderId(logOrderId);
+        logisticsOrderCirculate.setTruckId(Long.valueOf(carInfo.getTruckId()));
+        logisticsOrderCirculate.setTruckNo(carInfo.getTruckNo());
+        Date startDate = Objects.nonNull(logisticsOrder.getStartTime()) ?
+                Date.from(logisticsOrder.getStartTime().atZone(ZoneId.systemDefault()).toInstant()) : null;
+        logisticsOrderCirculate.setStartTime(startDate);
+        Date endDate = Objects.nonNull(logisticsOrder.getEndTime()) ?
+                Date.from(logisticsOrder.getEndTime().atZone(ZoneId.systemDefault()).toInstant()) : null;
+        logisticsOrderCirculate.setEndTime(endDate);
+        logisticsOrderCirculate.setUnit(logisticsOrder.getUnit());
+        logisticsOrderCirculate.setEntrustAmount(logisticsOrder.getEntrustAmount());
+        Date date = new Date();
+        logisticsOrderCirculate.setCreateBy(LoginUserHolder.getUserId());
+        logisticsOrderCirculate.setCreateTime(date);
+        logisticsOrderCirculate.setUpdateBy(LoginUserHolder.getUserId());
+        logisticsOrderCirculate.setUpdateTime(date);
+        return logisticsOrderCirculate;
+    }
+
+    public Boolean logisticOrderFinish(@Valid OrderFinishReq req) {
+        log.info("物流订单-完结订单传递参数信息:{}", JSONObject.toJSONString(req));
+        //查询物流订单
+        Long logOrderId = Long.parseLong(req.getLogisticOrderId());
+        KwtLogisticsOrder logisticsOrder =
+                logisticsOrderRepository.queryByLogisticsOrderId(logOrderId);
+        if (Objects.isNull(logisticsOrder)){
+            throw new BusinessException("未找到该物流订单信息");
+        }
+        KwtLogisticsOrder updateLogisticsOrder = new KwtLogisticsOrder();
+        updateLogisticsOrder.setId(logOrderId);
+        if (Objects.equals(logisticsOrder.getStatus(), LogisticsOrderEnum.WAIT_DELIVERY.getCode())){
+            updateLogisticsOrder.setStatus(LogisticsOrderEnum.HAVE_FINISHED.getCode());
+        }
+        //查询物流订单下的所有运单
+        List<KwtWaybillOrderSubtask> waybillOrderSubtasks = logisticsOrderSubtaskRepository.queryByLogId(logOrderId);
+        if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(waybillOrderSubtasks) && Objects.equals(logisticsOrder.getStatus(), LogisticsOrderEnum.IN_TRANSIT.getCode())){
+            boolean b = waybillOrderSubtasks.stream().anyMatch(x -> !Objects.equals(x.getStatus(),
+                    CarWaybillEnum.APPROVAL_PASS.getCode()));
+            if (b){
+                updateLogisticsOrder.setStatus(LogisticsOrderEnum.NEARING_COMPLETION.getCode());
+            }else if (Objects.equals(logisticsOrder.getStatus(), LogisticsOrderEnum.NEARING_COMPLETION.getCode())){
+                updateLogisticsOrder.setStatus(LogisticsOrderEnum.HAVE_FINISHED.getCode());
+            }
+        }
+        return logisticsOrderRepository.updateLogisticsOrder(updateLogisticsOrder);
     }
 }