瀏覽代碼

Merge remote-tracking branch 'origin/dev_20251130' into dev_20251130

donglang 1 月之前
父節點
當前提交
45e2a849a4
共有 24 個文件被更改,包括 575 次插入58 次删除
  1. 6 0
      sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/dubbo/TradeOrderInfoService.java
  2. 39 0
      sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/TradeOrderSettlePara.java
  3. 8 1
      sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/dubbo/TransportRemoteService.java
  4. 5 1
      sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/param/AddLogisticOrderParam.java
  5. 6 2
      sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/param/OrderFinishParam.java
  6. 1 1
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/repository/KwcContractLogisticsRepository.java
  7. 3 1
      sckw-modules/sckw-contract/src/main/java/com/sckw/contract/repository/KwcContractTradeRepository.java
  8. 9 1
      sckw-modules/sckw-order/src/main/java/com/sckw/order/controller/KwoTradeOrderController.java
  9. 6 1
      sckw-modules/sckw-order/src/main/java/com/sckw/order/dubbo/TradeOrderInfoServiceImpl.java
  10. 46 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/enums/TradeOrderStatusEnum.java
  11. 22 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/TradeOrderSettleParam.java
  12. 9 1
      sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/res/OrderDetailRes.java
  13. 155 13
      sckw-modules/sckw-order/src/main/java/com/sckw/order/serivce/KwoTradeOrderService.java
  14. 4 0
      sckw-modules/sckw-order/src/main/java/com/sckw/order/serivce/KwoTradeOrderTransportService.java
  15. 14 4
      sckw-modules/sckw-system/src/main/java/com/sckw/system/service/KwsEnterpriseService.java
  16. 25 5
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/dubbo/TransportServiceImpl.java
  17. 4 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/vo/OrderFinishReq.java
  18. 5 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/vo/ReviewWaybillOrderReq.java
  19. 14 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/vo/WaybillOrderDetailResp.java
  20. 7 1
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/repository/KwtLogisticsOrderRepository.java
  21. 2 0
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/repository/KwtWaybillOrderRepository.java
  22. 1 1
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/repository/KwtWaybillOrderSubtaskRepository.java
  23. 66 5
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtLogisticsConsignmentService.java
  24. 118 20
      sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtWaybillOrderV1Service.java

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

@@ -132,6 +132,7 @@ public interface TradeOrderInfoService {
 
     /**
      * 通交易订单id查询交易订单采购/销售企业信息     * @param tradeOrderId
+     *
      * @return
      */
     List<OrderUnitInfoDetailVO> queryOrderUnitInfByTOrderId(Set<Long> tradeOrderId);
@@ -153,5 +154,10 @@ public interface TradeOrderInfoService {
      */
     List<OrderSaleVo> queryRecentSale(LocalDateTime start, LocalDateTime end);
 
+    /**
+     * 订单结算,更改上游贸易订单累计装货量或累计卸货量
+     */
+    void orderSettle(TradeOrderSettlePara tradeOrderSettlePara);
+
 
 }

+ 39 - 0
sckw-modules-api/sckw-order-api/src/main/java/com/sckw/order/api/model/TradeOrderSettlePara.java

@@ -0,0 +1,39 @@
+package com.sckw.order.api.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import jakarta.validation.constraints.NotNull;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * 贸易订单结算
+ */
+@Getter
+@Setter
+@ToString
+public class TradeOrderSettlePara implements Serializable {
+
+    @Serial
+    private static final long serialVersionUID = 6909518527687999256L;
+
+    /**
+     * 贸易订单id
+     */
+    @JsonProperty("tOrderId")
+    @NotNull(message = "贸易订单id不能为空")
+    private Long tOrderId;
+
+    /**
+     * 累计装货量
+     */
+    private BigDecimal loadAmount;
+    /**
+     * 累计卸货量
+     */
+    private BigDecimal unloadAmount;
+}

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

@@ -175,5 +175,12 @@ public interface TransportRemoteService {
     /**
      * 完结订单
      */
-    Boolean logisticOrderFinish(@RequestBody @Valid OrderFinishParam req);
+    Boolean logisticOrderFinish( OrderFinishParam req);
+
+    /**
+     * 获取物流订单列表
+     * @param param 订单列表参数
+     * @return 订单列表
+     */
+    List<KwtLogisticsOrderVO> getLogisticOrderList(OrderFinishParam param);
 }

+ 5 - 1
sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/param/AddLogisticOrderParam.java

@@ -147,7 +147,11 @@ public class AddLogisticOrderParam implements Serializable {
      */
     @NotBlank(message = "卸货城市名称不能为空")
     private String unloadCityName;
-
+    /**
+     * 卸货详细地址
+     */
+    @NotBlank(message = "卸货详细地址不能为空")
+    private String unLoadDetailAddress;
     @Data
     public static class LogisticInfo {
         /**

+ 6 - 2
sckw-modules-api/sckw-transport-api/src/main/java/com/sckw/transport/api/model/param/OrderFinishParam.java

@@ -1,6 +1,8 @@
 package com.sckw.transport.api.model.param;
 
+import lombok.AllArgsConstructor;
 import lombok.Data;
+import lombok.NoArgsConstructor;
 
 import java.io.Serial;
 import java.io.Serializable;
@@ -12,11 +14,13 @@ import java.io.Serializable;
  * @create :2025-11-20 14:14:00
  */
 @Data
+@AllArgsConstructor
+@NoArgsConstructor
 public class OrderFinishParam implements Serializable {
     @Serial
     private static final long serialVersionUID = -8497329584784837085L;
     /**
-     * 物流订单id
+     * 贸易id
      */
-    private Long logisticOrderId;
+    private Long tradeOrderId;
 }

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

@@ -33,7 +33,7 @@ public class KwcContractLogisticsRepository extends ServiceImpl<KwcContractLogis
                 .like(StringUtils.isNotBlank(contractName), KwcContractLogistics::getName, contractName)
                 .eq(StringUtils.isNotBlank(status), KwcContractLogistics::getStatus, status)
                 .in(CollectionUtils.isNotEmpty(contractIds), KwcContractLogistics::getId, contractIds)
-                .orderByDesc(KwcContractLogistics::getCreateTime)
+                .orderByDesc(KwcContractLogistics::getUpdateTime)
                 .orderByDesc(KwcContractLogistics::getId));
     }
 

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

@@ -71,7 +71,9 @@ public class KwcContractTradeRepository extends ServiceImpl<KwcContractTradeMapp
                 .eq(Objects.nonNull(status),KwcContractTrade::getStatus, status)
                 .like(StringUtils.isNotBlank(supplementCode),KwcContractTrade::getContractPid, supplementCode)
                 .in(CollectionUtils.isNotEmpty(contractIds),KwcContractTrade::getId, contractIds)
-                .in(CollectionUtils.isNotEmpty(authEntIdList),KwcContractTrade::getEntId, authEntIdList));
+                .in(CollectionUtils.isNotEmpty(authEntIdList),KwcContractTrade::getEntId, authEntIdList)
+                .orderByDesc(KwcContractTrade::getUpdateTime)
+                .orderByDesc(KwcContractTrade::getId));
 
     }
 

+ 9 - 1
sckw-modules/sckw-order/src/main/java/com/sckw/order/controller/KwoTradeOrderController.java

@@ -125,7 +125,15 @@ public class KwoTradeOrderController {
     @GlobalTransactional(name = "default_tx_group")
     @RepeatSubmit(interval = 1000, message = "前方拥堵,请稍后尝试")
     public HttpResult audit(@RequestBody @Validated TradeOrderAuditParam tradeOrderAuditParam) {
-        return HttpResult.ok("贸易订单审核成功", kwoTradeOrderService.  auditOrder(tradeOrderAuditParam));
+        return HttpResult.ok("贸易订单审核成功", kwoTradeOrderService.auditOrder(tradeOrderAuditParam));
+    }
+
+    @PostMapping("/settle")
+    @Operation(summary = "贸易订单手动完结", description = "贸易订单手动完结")
+    @GlobalTransactional(name = "default_tx_group")
+    @RepeatSubmit(interval = 1000, message = "前方拥堵,请稍后尝试")
+    public HttpResult settle(@RequestBody @Validated TradeOrderSettleParam tradeOrderSettleParam) {
+        return HttpResult.ok("手动完结成功", kwoTradeOrderService.settleOrder(tradeOrderSettleParam));
     }
 
     /**

+ 6 - 1
sckw-modules/sckw-order/src/main/java/com/sckw/order/dubbo/TradeOrderInfoServiceImpl.java

@@ -586,6 +586,11 @@ public class TradeOrderInfoServiceImpl implements TradeOrderInfoService {
         return kwoTradeOrderService.querySignGoods(entId);
     }
 
+    @Override
+    public void orderSettle(TradeOrderSettlePara tradeOrderSettlePara) {
+        kwoTradeOrderService.updateOrderAmount(tradeOrderSettlePara);
+    }
+
     @Override
     public List<OrderSaleVo> queryRecentSale(LocalDateTime start, LocalDateTime end) {
         return kwoTradeOrderService.queryRecentSale(start, end);
@@ -609,7 +614,7 @@ public class TradeOrderInfoServiceImpl implements TradeOrderInfoService {
     @Override
     public List<OrderUnitInfoDetailVO> queryOrderUnitInfByTOrderId(Set<Long> tradeOrderId) {
         List<KwoTradeOrderUnit> kwoTradeOrderUnits = kwoTradeOrderUnitRepository.queryByOrderIds(tradeOrderId);
-        if (CollectionUtils.isEmpty(kwoTradeOrderUnits)){
+        if (CollectionUtils.isEmpty(kwoTradeOrderUnits)) {
             return Collections.emptyList();
         }
         return kwoTradeOrderUnits.stream().map(unit -> {

+ 46 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/enums/TradeOrderStatusEnum.java

@@ -0,0 +1,46 @@
+package com.sckw.order.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * @desc: 订单状态枚举
+ * @author: yzc
+ * @date: 2023-09-18 15:32
+ */
+@Getter
+@AllArgsConstructor
+public enum TradeOrderStatusEnum {
+
+    /**
+     * 订单状态枚举
+     */
+    AUDIT(1, "待审核"),
+    ING(2, "进行中"),
+    DEAL(3, "结算中"),
+    SUCCESS(4, "已完成"),
+    BACK(5, "审核驳回"),
+    ;
+    private final Integer code;
+    private final String msg;
+
+    public static String getMsg(Integer code) {
+        for (TradeOrderStatusEnum ele : TradeOrderStatusEnum.values()) {
+            if (ele.getCode().equals(code)) {
+                return ele.getMsg();
+            }
+        }
+        return null;
+    }
+
+    public static List<TradeOrderStatusEnum> getSortList() {
+        TradeOrderStatusEnum[] enums = TradeOrderStatusEnum.values();
+        return Arrays.stream(enums).sorted(Comparator.comparingInt(TradeOrderStatusEnum::getCode)).collect(Collectors.toList());
+    }
+
+}

+ 22 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/req/TradeOrderSettleParam.java

@@ -0,0 +1,22 @@
+package com.sckw.order.model.vo.req;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotNull;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+/**
+ * @desc: 采购订单请求参数
+ * @author: yzc
+ * @date: 2023-07-07 14:19
+ */
+@Getter
+@Setter
+@ToString
+public class TradeOrderSettleParam {
+    @NotNull(message = "贸易订单id不能为空")
+    @Schema(description = "贸易订单id")
+    private Long id;
+
+}

+ 9 - 1
sckw-modules/sckw-order/src/main/java/com/sckw/order/model/vo/res/OrderDetailRes.java

@@ -127,6 +127,14 @@ public class OrderDetailRes implements Serializable {
      * 累计卸货量
      */
     private BigDecimal unloadAmount;
+    /**
+     * 已履约量
+     */
+    private BigDecimal dealAmount;
+    /**
+     * 已履约金额
+     */
+    private BigDecimal dealMoney;
     /**
      * 已委托量
      */
@@ -180,7 +188,7 @@ public class OrderDetailRes implements Serializable {
     /**
      * 创建时间
      */
-    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date createTime;
 
     /**

+ 155 - 13
sckw-modules/sckw-order/src/main/java/com/sckw/order/serivce/KwoTradeOrderService.java

@@ -1,12 +1,12 @@
 package com.sckw.order.serivce;
 
-import com.google.common.collect.Lists;
-
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.NumberUtil;
 import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.github.pagehelper.PageHelper;
@@ -36,6 +36,7 @@ import com.sckw.manage.api.model.dto.res.FindEntCooperateResVo;
 import com.sckw.mongo.model.SckwTradeOrder;
 import com.sckw.order.api.model.OrderSaleVo;
 import com.sckw.order.api.model.TradeOrderCountStatisticsDTO;
+import com.sckw.order.api.model.TradeOrderSettlePara;
 import com.sckw.order.dao.KwoTradeOrderMapper;
 import com.sckw.order.enums.ContractStatusEnum;
 import com.sckw.order.enums.*;
@@ -63,6 +64,8 @@ import com.sckw.system.api.RemoteSystemService;
 import com.sckw.system.api.model.dto.res.*;
 import com.sckw.transport.api.dubbo.TransportRemoteService;
 import com.sckw.transport.api.model.param.AddLogisticOrderParam;
+import com.sckw.transport.api.model.param.OrderFinishParam;
+import com.sckw.transport.api.model.vo.KwtLogisticsOrderVO;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboReference;
@@ -73,6 +76,7 @@ import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -758,6 +762,11 @@ public class KwoTradeOrderService {
                 .setChargeTypeLabel(CollUtil.isNotEmpty(chargeTypeMap) ? chargeTypeMap.get(String.valueOf(detail.getChargeType())) : null)
                 .setConsignmentWayLabel(CollUtil.isNotEmpty(consignmentWayMap) ? consignmentWayMap.get(String.valueOf(detail.getConsignmentWay())) : null)
         ;
+        if (Objects.equals(detail.getChargeType(), 1)) {//按装货量
+            detail.setDealAmount(detail.getLoadAmount());
+        } else {
+            detail.setDealAmount(detail.getUnloadAmount());
+        }
         //商品信息
         KwoTradeOrderGoods orderGoods = kwoTradeOrderGoodsService.getByOrderId(id);
         if (Objects.nonNull(orderGoods)) {
@@ -776,6 +785,11 @@ public class KwoTradeOrderService {
                         .setPrepaidLimit(goods.getPrepaidLimit()).setAdvancePrice(goods.getAdvancePrice())
                         .setCollectionUnit(Objects.isNull(entCache) ? null : entCache.getFirmName());
                 detail.setGoodsInfo(goodsDetail);
+                if (Objects.equals(detail.getChargeType(), 1)) {//按装货量
+                    detail.setDealMoney(NumberUtil.mul(orderGoods.getUnitPrice(), detail.getLoadAmount()));
+                } else {
+                    detail.setDealMoney(NumberUtil.mul(orderGoods.getUnitPrice(), detail.getUnloadAmount()));
+                }
 
                 //商品辅助单位信息
 //                List<GoodsUnitDetailRes> assistUnit = kwoTradeOrderGoodsUnitService.findGoodsUnitDetail(id);
@@ -1585,7 +1599,7 @@ public class KwoTradeOrderService {
                 e.setLabel(finalUnitMap != null ? finalUnitMap.get(e.getValue()) : null);
                 //组装合理损耗
                 if (CollUtil.isNotEmpty(dicts)) {
-                    for (SysDictResDto ee : dicts)
+                    for (SysDictResDto ee : dicts) {
                         if (ee.getParentId().equals((long) NumberConstant.ZERO)) {
                             if (ee.getValue().equals(e.getValue())) {
                                 List<Map<String, Object>> lossUnit = new ArrayList();
@@ -1600,6 +1614,7 @@ public class KwoTradeOrderService {
                                 e.setLossUnit(lossUnit);
                             }
                         }
+                    }
                 }
             });
         }
@@ -2229,7 +2244,7 @@ public class KwoTradeOrderService {
                 .setStartTime(DateUtils.localDateToDateStart(tradeOrderParam.getStartTime()))
                 .setEndTime(DateUtils.localDateToDateEnd(tradeOrderParam.getEndTime()))
                 .setSource(OrderSourceEnum.PURCHASE.getType())
-                .setStatus(OrderStatusEnum.WAIT_ACCEPTED.getCode())
+                .setStatus(TradeOrderStatusEnum.AUDIT.getCode())
                 .setRemark(tradeOrderParam.getRemark());
         return tradeContractResDto;
     }
@@ -2274,6 +2289,9 @@ public class KwoTradeOrderService {
         if (Objects.equals(tradeContractResDto.getConsignment(), 2) && CollUtil.isEmpty(logisticsContractId)) {
             throw new BusinessException("卖方托运时,物流合同不能为空");
         }
+        //更新贸易订单状态
+        kwoTradeOrder.setStatus(Objects.equals(tradeOrderAuditParam.getStatus(), 2) ? TradeOrderStatusEnum.BACK.getCode() : TradeOrderStatusEnum.ING.getCode());
+        kwoTradeOrderMapper.updateById(kwoTradeOrder);
         if (Objects.equals(tradeOrderAuditParam.getStatus(), 2)) {
             KwoTradeOrderTrack kwoTradeOrderTrack = new KwoTradeOrderTrack();
             kwoTradeOrderTrack.setTOrderId(kwoTradeOrder.getId());
@@ -2316,9 +2334,77 @@ public class KwoTradeOrderService {
             kwoTradeOrderTransport.setCreateTime(LocalDateTime.now());
             kwoTradeOrderTransportService.insert(kwoTradeOrderTransport);
         }
-        //todo 通过后调用rpc
+        //下游新增物流订单
         AddLogisticOrderParam addLogisticOrderParam = new AddLogisticOrderParam();
-        addLogisticOrderParam.setLogisticInfo(Lists.newArrayList());
+        if (Objects.equals(tradeContractResDto.getConsignment(), 2)) {
+            List<AddLogisticOrderParam.LogisticInfo> collect = logisticsContractId.stream().map(d -> {
+                AddLogisticOrderParam.LogisticInfo logisticInfo = new AddLogisticOrderParam.LogisticInfo();
+                logisticInfo.setContractId(d.getContractId());
+                logisticInfo.setContractNo(d.getContractNo());
+                logisticInfo.setContractName("");
+                logisticInfo.setAcceptCompanyId(d.getEntId());
+                logisticInfo.setAcceptContactPhone("");
+                logisticInfo.setAcceptContacts(d.getContacts());
+                logisticInfo.setAcceptContactsId(d.getContactsId());
+                logisticInfo.setAcceptCompany("");
+                logisticInfo.setPrice(d.getTransportPrice());
+                logisticInfo.setPriceType(0L);
+                logisticInfo.setEndTime(LocalDate.now());
+                logisticInfo.setStartTime(LocalDate.now());
+                logisticInfo.setUnloadContacts("");
+                logisticInfo.setUnloadPhone("");
+                logisticInfo.setUnloadDetailAddress("");
+                logisticInfo.setAmount(new BigDecimal("0"));
+                logisticInfo.setAmountUnit("");
+                logisticInfo.setLoss(new BigDecimal("0"));
+                logisticInfo.setPayment(0L);
+                logisticInfo.setSigningWay(0);
+                logisticInfo.setLossUnit("");
+                logisticInfo.setBillingMode("");
+                logisticInfo.setRemark("");
+                logisticInfo.setType(0);
+
+                return logisticInfo;
+            }).collect(Collectors.toList());
+            addLogisticOrderParam.setLogisticInfo(collect);
+        } else {
+            List<KwoTradeOrderTransport> list = kwoTradeOrderTransportService.queryList(kwoTradeOrder.getId());
+            if (CollUtil.isNotEmpty(list)) {
+                Map<Long, ContractCommonInfoResDto> contractMap = remoteContractService.queryContractBaseInfo(list.stream().map(KwoTradeOrderTransport::getContractId).collect(Collectors.toList()));
+                List<AddLogisticOrderParam.LogisticInfo> collect = list.stream().map(d -> {
+                            AddLogisticOrderParam.LogisticInfo logisticInfo = new AddLogisticOrderParam.LogisticInfo();
+                            logisticInfo.setContractId(d.getContractId());
+                            logisticInfo.setContractNo(d.getContractNo());
+                            logisticInfo.setContractName("");
+                            logisticInfo.setAcceptCompanyId(d.getEntId());
+                            logisticInfo.setAcceptContactPhone(d.getPhone());
+                            logisticInfo.setAcceptContacts(d.getContacts());
+                            logisticInfo.setAcceptContactsId(d.getContactsId());
+                            logisticInfo.setAcceptCompany(d.getFirmName());
+                            logisticInfo.setPrice(d.getTransportPrice());
+                            logisticInfo.setPriceType(0L);
+                            logisticInfo.setEndTime(LocalDate.now());
+                            logisticInfo.setStartTime(LocalDate.now());
+                            logisticInfo.setUnloadContacts("");
+                            logisticInfo.setUnloadPhone("");
+                            logisticInfo.setUnloadDetailAddress("");
+                            logisticInfo.setAmount(new BigDecimal("0"));
+                            logisticInfo.setAmountUnit("");
+                            logisticInfo.setLoss(new BigDecimal("0"));
+                            logisticInfo.setPayment(0L);
+                            logisticInfo.setSigningWay(0);
+                            logisticInfo.setLossUnit("");
+                            logisticInfo.setBillingMode("");
+                            logisticInfo.setRemark("");
+                            logisticInfo.setType(0);
+
+                            return logisticInfo;
+                        }
+                ).collect(Collectors.toList());
+                addLogisticOrderParam.setLogisticInfo(collect);
+            }
+
+        }
         addLogisticOrderParam.setTradeOrderId(kwoTradeOrder.getId());
         addLogisticOrderParam.setTradeOrderNo(kwoTradeOrder.getTOrderNo());
         if (Objects.equals(tradeContractResDto.getConsignment(), 1)) {//买方托运
@@ -2349,15 +2435,71 @@ public class KwoTradeOrderService {
         addLogisticOrderParam.setGoodsPriceUnit(byOrderId.getUnit());
         List<KwoTradeOrderAddress> kwoTradeOrderAddresses = addressMap.get(String.valueOf(AddressTypeEnum.SHIPMENT.getCode()));
         KwoTradeOrderAddress kwoTradeOrderAddress = kwoTradeOrderAddresses.get(0);
-        addLogisticOrderParam.setLoadName(kwoTradeOrderAddress.getName());
-        addLogisticOrderParam.setLoadCityCode(kwoTradeOrderAddress.getCityCode());
-        addLogisticOrderParam.setLoadCityName(kwoTradeOrderAddress.getCityName());
-        addLogisticOrderParam.setLoadContacts(kwoTradeOrderAddress.getContacts());
-        addLogisticOrderParam.setLoadPhone(kwoTradeOrderAddress.getPhone());
-        addLogisticOrderParam.setLoadDetailAddress(kwoTradeOrderAddress.getDetailAddress());
-
+        if (Objects.nonNull(kwoTradeOrderAddress)) {
+            addLogisticOrderParam.setLoadName(kwoTradeOrderAddress.getName());
+            addLogisticOrderParam.setLoadCityCode(kwoTradeOrderAddress.getCityCode());
+            addLogisticOrderParam.setLoadCityName(kwoTradeOrderAddress.getCityName());
+            addLogisticOrderParam.setLoadContacts(kwoTradeOrderAddress.getContacts());
+            addLogisticOrderParam.setLoadPhone(kwoTradeOrderAddress.getPhone());
+            addLogisticOrderParam.setLoadDetailAddress(kwoTradeOrderAddress.getDetailAddress());
+        }
+
+        List<KwoTradeOrderAddress> kwoTradeOrderAddresses2 = addressMap.get(String.valueOf(AddressTypeEnum.SHIPMENT.getCode()));
+        KwoTradeOrderAddress unloadAddress = kwoTradeOrderAddresses2.get(0);
+        if (Objects.nonNull(unloadAddress)) {
+            addLogisticOrderParam.setUnloadId(unloadAddress.getId());
+            addLogisticOrderParam.setUnloadName(unloadAddress.getName());
+            addLogisticOrderParam.setUnloadCityCode(unloadAddress.getCityCode());
+            addLogisticOrderParam.setUnloadCityName(unloadAddress.getCityName());
+            addLogisticOrderParam.setUnLoadDetailAddress(unloadAddress.getDetailAddress());
+        }
+
+        log.info("创建物流订单:{}", JSONObject.toJSONString(addLogisticOrderParam));
         transportRemoteService.addLogisticOrder(addLogisticOrderParam);
+        return true;
+    }
 
+    /**
+     * 手动完结订单
+     *
+     * @param tradeOrderSettleParam
+     * @return
+     */
+    public Object settleOrder(TradeOrderSettleParam tradeOrderSettleParam) {
+        KwoTradeOrder kwoTradeOrder = new KwoTradeOrder();
+        List<KwtLogisticsOrderVO> logisticOrderList = transportRemoteService.getLogisticOrderList(new OrderFinishParam(tradeOrderSettleParam.getId()));
+        if (CollUtil.isNotEmpty(logisticOrderList)) {
+            if (logisticOrderList.stream().allMatch(d -> Objects.equals(d.getStatus(), LogisticsOrderV1Enum.HAVE_FINISHED.getCode()))) {
+                kwoTradeOrder.setStatus(TradeOrderStatusEnum.SUCCESS.getCode());
+            } else {
+                kwoTradeOrder.setStatus(TradeOrderStatusEnum.DEAL.getCode());
+            }
+        } else {
+            kwoTradeOrder.setStatus(TradeOrderStatusEnum.DEAL.getCode());
+        }
+        kwoTradeOrder.setId(tradeOrderSettleParam.getId());
+        kwoTradeOrder.setUpdateBy(LoginUserHolder.getUserId());
+        kwoTradeOrder.setUpdateTime(new Date());
+        kwoTradeOrderMapper.updateById(kwoTradeOrder);
+        //通知下游,贸易订单已完结,或处于完结中。
+        transportRemoteService.logisticOrderFinish(new OrderFinishParam(tradeOrderSettleParam.getId()));
         return true;
     }
+
+    public void updateOrderAmount(TradeOrderSettlePara tradeOrderSettlePara) {
+        if (Objects.isNull(tradeOrderSettlePara.getTOrderId())) {
+            throw new BusinessException("订单id不能为空");
+        }
+        KwoTradeOrder kwoTradeOrder = kwoTradeOrderMapper.selectById(tradeOrderSettlePara.getTOrderId());
+        KwoTradeOrder kwoTradeOrder1 = new KwoTradeOrder();
+        kwoTradeOrder1.setId(kwoTradeOrder.getId());
+        if (Objects.nonNull(tradeOrderSettlePara.getLoadAmount())) {
+            kwoTradeOrder1.setLoadAmount(NumberUtil.add(tradeOrderSettlePara.getLoadAmount(), kwoTradeOrder.getLoadAmount()));
+        }
+        if (Objects.nonNull(tradeOrderSettlePara.getUnloadAmount())) {
+            kwoTradeOrder1.setUnloadAmount(NumberUtil.add(tradeOrderSettlePara.getUnloadAmount(), kwoTradeOrder.getUnloadAmount()));
+        }
+
+        kwoTradeOrderMapper.updateById(kwoTradeOrder1);
+    }
 }

+ 4 - 0
sckw-modules/sckw-order/src/main/java/com/sckw/order/serivce/KwoTradeOrderTransportService.java

@@ -23,6 +23,10 @@ public class KwoTradeOrderTransportService {
         kwoTradeOrderTransportMapper.insert(kwoTradeOrderTransport);
     }
 
+    /**
+     * @param id 贸易订单id
+     * @return
+     */
     public List<KwoTradeOrderTransport> queryList(Long id) {
         return kwoTradeOrderTransportMapper.selectList(new LambdaQueryWrapper<KwoTradeOrderTransport>().eq(KwoTradeOrderTransport::getTOrderId, id).eq(KwoTradeOrderTransport::getDelFlag, 0));
     }

+ 14 - 4
sckw-modules/sckw-system/src/main/java/com/sckw/system/service/KwsEnterpriseService.java

@@ -2,9 +2,10 @@ package com.sckw.system.service;
 
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DateUtil;
-import com.alibaba.nacos.shaded.com.google.common.collect.Lists;
-import com.alibaba.fastjson.JSON;
 import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.nacos.shaded.com.google.common.collect.Lists;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.pagehelper.PageHelper;
@@ -21,6 +22,7 @@ import com.sckw.core.utils.*;
 import com.sckw.core.web.constant.HttpStatus;
 import com.sckw.core.web.context.LoginUserHolder;
 import com.sckw.core.web.model.EntCertificateInfo;
+import com.sckw.core.web.model.LoginEntInfo;
 import com.sckw.core.web.response.HttpResult;
 import com.sckw.excel.utils.ExcelUtil;
 import com.sckw.redis.utils.RedissonUtils;
@@ -535,6 +537,14 @@ public class KwsEnterpriseService {
         Integer currentApproval = kwsEnterprise.getApproval();
         kwsEnterprise.setApproval(reqVo.getStatus());
         kwsEnterprise.setRemark(reqVo.getRemark());
+        if (Objects.equals(reqVo.getStatus(), ApprovalEnum.OK.getCode())) {
+            String loginEntStr = RedissonUtils.getString(Global.getFullUserEntKey(entId));
+            LoginEntInfo loginEntInfo = StringUtils.isNotBlank(loginEntStr) ? JSON.parseObject(loginEntStr, LoginEntInfo.class) : null;
+            if (Objects.nonNull(loginEntInfo)) {
+                loginEntInfo.setStatus(reqVo.getStatus());
+                RedissonUtils.putString(Global.getFullUserEntKey(entId), JSONObject.toJSONString(loginEntInfo), Global.PC_TOKEN_EXPIRE);
+            }
+        }
         if (kwsEnterpriseDao.approval(kwsEnterprise) <= 0) {
             throw new SystemException(HttpStatus.CRUD_FAIL_CODE, HttpStatus.UPDATE_FAIL);
         }
@@ -1448,10 +1458,10 @@ public class KwsEnterpriseService {
             throw new BusinessException("企业id不能为空");
         }
         KwsEntType kwsEntType = kwsEntTypeRepository.queryByEntId(req.getEntId());
-        if (Objects.nonNull(kwsEntType)){
+        if (Objects.nonNull(kwsEntType)) {
             req.setLoginEntType(String.valueOf(kwsEntType.getType()));
         }
-        if (req.getEntType().contains(req.getLoginEntType())){
+        if (req.getEntType().contains(req.getLoginEntType())) {
             //登录客户的企业类型和查询的类型是一直的说明只能查询自己和自己的下级
             //发起方的公司信息
             return getEntInfoResp(req);

+ 25 - 5
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/dubbo/TransportServiceImpl.java

@@ -1007,8 +1007,12 @@ public class TransportServiceImpl implements TransportRemoteService {
         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()));
+        if (logOrder.getStartTime() != null){
+            kwtLogisticsOrderVO.setStartTime(Date.from(logOrder.getStartTime().atZone(ZoneId.systemDefault()).toInstant()));
+        }
+        if (logOrder.getEndTime() != null){
+            kwtLogisticsOrderVO.setEntTime(Date.from(logOrder.getEndTime().atZone(ZoneId.systemDefault()).toInstant()));
+        }
         kwtLogisticsOrderVO.setSubcontractAmount(logOrder.getSubcontractAmount());
         kwtLogisticsOrderVO.setEntrustAmount(logOrder.getEntrustAmount());
         kwtLogisticsOrderVO.setUnloadAmount(logOrder.getUnloadAmount());
@@ -1135,15 +1139,31 @@ public class TransportServiceImpl implements TransportRemoteService {
     @Override
     public Boolean logisticOrderFinish(OrderFinishParam req) {
         log.info("流程完结物流订单:{}", JSON.toJSONString(req));
-        if (Objects.isNull( req.getLogisticOrderId())){
-            throw new BusinessException("物流订单id不能为空");
+        if (Objects.isNull( req.getTradeOrderId())){
+            throw new BusinessException("贸易订单id不能为空");
         }
+
         OrderFinishReq orderFinishReq = new OrderFinishReq();
-        orderFinishReq.setLogisticOrderId(Collections.singletonList(req.getLogisticOrderId()));
+        orderFinishReq.setTradeOrderId(req.getTradeOrderId());
         return logisticsConsignmentService.logisticOrderFinish(orderFinishReq);
 
     }
 
+    @Override
+    public List<KwtLogisticsOrderVO> getLogisticOrderList(OrderFinishParam param) {
+        if(Objects.isNull(param.getTradeOrderId())){
+            throw new BusinessException("贸易订单id不能为空");
+        }
+        List<KwtLogisticsOrder> kwtLogisticsOrders = logisticsOrderRepository.queryByTradeOrderId(param.getTradeOrderId());
+        if (CollectionUtils.isEmpty(kwtLogisticsOrders)){
+            return List.of();
+        }
+        return kwtLogisticsOrders.stream()
+                .map(TransportServiceImpl::getLogisticsOrderVo)
+                .collect(Collectors.toList());
+
+    }
+
     @NotNull
     private static AddLogisticOrderDTO getAddLogisticOrderDTO(AddLogisticOrderParam param) {
         AddLogisticOrderDTO addLogisticOrderDTO = new AddLogisticOrderDTO();

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

@@ -25,4 +25,8 @@ public class OrderFinishReq implements Serializable {
     @Schema(description = "物流订单id")
     @NotEmpty(message = "物流订单id不能为空")
     private List<Long> logisticOrderId;
+    /**
+     *  贸易订单 id
+     */
+    private Long tradeOrderId;
 }

+ 5 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/vo/ReviewWaybillOrderReq.java

@@ -51,4 +51,9 @@ public class ReviewWaybillOrderReq implements Serializable {
      */
     @Schema(description = "上传时间")
     private String uploadTime;
+    /**
+     * 备注
+     */
+    @Schema(description = "备注")
+    private String remark;
 }

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

@@ -124,6 +124,10 @@ public class WaybillOrderDetailResp implements Serializable {
      */
     @Schema(description = "单据信息")
     private BillInfo billInfo;
+    /**
+     * 运单id列表
+     */
+    private List<Long> billOrderIdList;
     @Data
     public static class WeighingRecord implements Serializable{
         @Serial
@@ -139,6 +143,16 @@ public class WaybillOrderDetailResp implements Serializable {
          */
         @Schema(description = "过磅描述")
         private String weighingDesc;
+        /**
+         * 过磅图片地址
+         */
+        @Schema(description = "过磅图片地址")
+        private String weighingImgUrl;
+        /**
+         * 地磅名称
+         */
+        @Schema(description = "地磅名称")
+        private String weighingName;
 
     }
     @Data

+ 7 - 1
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/repository/KwtLogisticsOrderRepository.java

@@ -51,7 +51,7 @@ public class KwtLogisticsOrderRepository extends ServiceImpl<KwtLogisticsOrderMa
                         .like(StringUtils.isNotBlank(orderNo),KwtLogisticsOrder::getLOrderNo, orderNo)
                         .ge(StringUtils.isNotBlank(startTime),KwtLogisticsOrder::getLoadTime, startTime)
                         .le(StringUtils.isNotBlank(startTime),KwtLogisticsOrder::getUnloadTime, endTime)
-                        .orderByDesc(KwtLogisticsOrder::getCreateTime)
+                        .orderByDesc(KwtLogisticsOrder::getUpdateTime)
                         .orderByDesc(KwtLogisticsOrder::getId)
         );
     }
@@ -98,4 +98,10 @@ public class KwtLogisticsOrderRepository extends ServiceImpl<KwtLogisticsOrderMa
                 .eq(KwtLogisticsOrder::getDelFlag,0)
                 .eq(KwtLogisticsOrder::getEntId, entId));
     }
+
+    public List<KwtLogisticsOrder> queryByBillMethod(String billingMethod) {
+        return list(Wrappers.<KwtLogisticsOrder>lambdaQuery()
+                .eq(KwtLogisticsOrder::getDelFlag,0)
+                .eq(KwtLogisticsOrder::getBillingMode, billingMethod));
+    }
 }

+ 2 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/repository/KwtWaybillOrderRepository.java

@@ -128,6 +128,8 @@ public class KwtWaybillOrderRepository extends ServiceImpl<KwtWaybillOrderMapper
         return list(Wrappers.<KwtWaybillOrder>lambdaQuery()
                 .eq(KwtWaybillOrder::getDelFlag,0)
                 .in(KwtWaybillOrder::getId, wayBillOrderIds)
+                .orderByDesc(KwtWaybillOrder::getUpdateTime)
+                .orderByDesc(KwtWaybillOrder::getId)
         );
     }
 

+ 1 - 1
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/repository/KwtWaybillOrderSubtaskRepository.java

@@ -75,7 +75,7 @@ public class KwtWaybillOrderSubtaskRepository extends ServiceImpl<KwtWaybillOrde
                         .in(CollectionUtils.isNotEmpty(entIds),KwtWaybillOrderSubtask::getEntId, entIds)
                         .in(CollectionUtils.isNotEmpty(logOrderIds),KwtWaybillOrderSubtask::getLOrderId, logOrderIds)
                         .in(CollectionUtils.isNotEmpty(billOrderIds),KwtWaybillOrderSubtask::getWOrderId, billOrderIds)
-                        .orderByDesc(BaseModel::getCreateTime)
+                        .orderByDesc(BaseModel::getUpdateTime)
                         .orderByDesc(KwtWaybillOrderSubtask::getId));
     }
 

+ 66 - 5
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtLogisticsConsignmentService.java

@@ -64,6 +64,7 @@ import jakarta.annotation.Resource;
 import jakarta.validation.Valid;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.collections4.MapUtils;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.jetbrains.annotations.NotNull;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -2887,15 +2888,22 @@ public class KwtLogisticsConsignmentService {
         return logisticsOrderCirculate;
     }
 
-    public Boolean logisticOrderFinish(@Valid OrderFinishReq req) {
+    public Boolean logisticOrderFinish( OrderFinishReq req) {
         log.info("物流订单-完结订单传递参数信息:{}", JSONObject.toJSONString(req));
-        //查询物流订单
-        List<KwtLogisticsOrder> logisticsOrder =
-                logisticsOrderRepository.queryByLogisticsOrderIds(req.getLogisticOrderId());
+        List<KwtLogisticsOrder> logisticsOrder= Lists.newArrayList();
+        //根据运单号查询物流运单
+        if (Objects.nonNull(req.getTradeOrderId())){
+             logisticsOrder = logisticsOrderRepository.queryByTradeOrderId(req.getTradeOrderId());
+        }else {
+            //查询物流订单
+            logisticsOrder =
+                    logisticsOrderRepository.queryByLogisticsOrderIds(req.getLogisticOrderId());
+        }
         if (CollectionUtils.isEmpty(logisticsOrder)){
             throw new BusinessException("未找到该物流订单信息");
         }
         List<KwtLogisticsOrder> logisticsOrders = Lists.newArrayList();
+        Set<Long> tradeIds = Sets.newHashSet();
         logisticsOrder.forEach(x->{
             KwtLogisticsOrder updateLogisticsOrder = new KwtLogisticsOrder();
             updateLogisticsOrder.setId(x.getId());
@@ -2906,6 +2914,7 @@ public class KwtLogisticsConsignmentService {
             if (Objects.equals(x.getStatus(), LogisticsOrderV1Enum.WAIT_DELIVERY.getCode())){
                 updateLogisticsOrder.setStatus(LogisticsOrderV1Enum.HAVE_RECONCILED.getCode());
                 logisticsOrders.add(updateLogisticsOrder);
+                tradeIds.add(x.getTOrderId());
                 return;
                // return logisticsOrderRepository.updateLogisticsOrder(updateLogisticsOrder);
             }
@@ -2922,10 +2931,62 @@ public class KwtLogisticsConsignmentService {
                 }else {
                     updateLogisticsOrder.setStatus(LogisticsOrderV1Enum.HAVE_RECONCILED.getCode());
                     logisticsOrders.add(updateLogisticsOrder);
+                    tradeIds.add(x.getTOrderId());
                 }
             }
         });
-        return logisticsOrderRepository.updateBatchById(logisticsOrders);
+        //更新物流订单
+        if (org.apache.commons.collections4.CollectionUtils.isEmpty(logisticsOrders)){
+            log.info("没有需要更新的物流订单");
+            return false;
+        }
+        logisticsOrderRepository.updateBatchById(logisticsOrders);
+
+        //更新贸易订单数据
+        updateTradeOrder(tradeIds);
+        return Boolean.TRUE;
+    }
+
+    private void updateTradeOrder(Set<Long> tradeIds) {
+        if (org.apache.commons.collections4.CollectionUtils.isEmpty(tradeIds)){
+            return;
+        }
+        List<KwtLogisticsOrder> tradeOrderInfos = logisticsOrderRepository.queryByTradeOrderIds(tradeIds);
+        if (org.apache.commons.collections4.CollectionUtils.isEmpty(tradeOrderInfos)){
+            return;
+        }
+        Map<Long, List<KwtLogisticsOrder>> tradeOrderIdAndLogisticsOrdersMap = tradeOrderInfos.stream()
+                .collect(Collectors.groupingBy(KwtLogisticsOrder::getTOrderId));
+        //通知订贸易订单完结订单
+        if (MapUtils.isNotEmpty(tradeOrderIdAndLogisticsOrdersMap)){
+
+            tradeOrderIdAndLogisticsOrdersMap
+                    .forEach((tradeOrderId,orders)->noticeTrader(tradeOrderId, orders));
+        }
+    }
+
+    private void noticeTrader(Long tradeOrderId, List<KwtLogisticsOrder> orders) {
+        boolean b = orders.stream()
+                .allMatch(x -> Arrays.asList(LogisticsOrderV1Enum.HAVE_RECONCILED.getCode(), LogisticsOrderV1Enum.REJECT_ORDER.getCode())
+                        .contains(x.getStatus()));
+        if (!b){
+            return;
+        }
+        TradeOrderSettlePara tradeOrderSettlePara = new TradeOrderSettlePara();
+
+        tradeOrderSettlePara.setTOrderId(tradeOrderId);
+        BigDecimal loadAmount = orders.stream()
+                .filter(x -> Objects.nonNull(x.getLoadAmount()))
+                .map(KwtLogisticsOrder::getLoadAmount)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+        BigDecimal unloadAmount = orders.stream()
+                .filter(x -> Objects.nonNull(x.getUnloadAmount()))
+                .map(KwtLogisticsOrder::getUnloadAmount)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+        tradeOrderSettlePara.setLoadAmount(loadAmount);
+        tradeOrderSettlePara.setUnloadAmount(unloadAmount);
+        log.info("物流订单-完结修改贸易订单参数信息:{}", JSONObject.toJSONString(tradeOrderSettlePara));
+        tradeOrderInfoService.orderSettle(tradeOrderSettlePara);
     }
 
 

+ 118 - 20
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtWaybillOrderV1Service.java

@@ -30,6 +30,7 @@ import com.sckw.fleet.api.RemoteFleetService;
 import com.sckw.fleet.api.model.vo.*;
 import com.sckw.mongo.model.SckwWaybillOrder;
 import com.sckw.order.api.dubbo.TradeOrderInfoService;
+import com.sckw.order.api.model.TradeOrderSettlePara;
 import com.sckw.product.api.dubbo.GoodsInfoService;
 import com.sckw.product.api.model.KwpGoods;
 import com.sckw.stream.enums.MessageEnum;
@@ -3108,6 +3109,14 @@ public class KwtWaybillOrderV1Service {
             logOrderIds.add(Long.parseLong(req.getLogisticsOrderId()));
         }
 
+        if (StringUtils.isNotBlank(req.getBillingMethod() )){
+            List<KwtLogisticsOrder> kwtLogisticsOrder = logisticsOrderRepository.queryByBillMethod(req.getBillingMethod());
+            if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(kwtLogisticsOrder)){
+                logOrderIds.addAll(kwtLogisticsOrder.stream()
+                        .map(KwtLogisticsOrder::getId)
+                        .collect(Collectors.toSet()));
+            }
+        }
         if (StringUtils.isNotBlank(req.getLogisticsOrderNo()) && StringUtils.isBlank(req.getLogisticsOrderId())){
             KwtLogisticsOrder kwtLogisticsOrder = logisticsOrderRepository.queryByLogisticsOrderNo(req.getLogisticsOrderNo());
             if (Objects.nonNull(kwtLogisticsOrder)){
@@ -3324,14 +3333,27 @@ public class KwtWaybillOrderV1Service {
         List<KwtWaybillOrderNode> nodeList = Lists.newArrayList() ;
         if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(kwtWaybillOrderNodes)){
             nodeList = kwtWaybillOrderNodes.stream()
+                    .filter(x->Objects.nonNull(x.getWeighbridgeId()))
                     .sorted(Comparator.comparing(KwtWaybillOrderNode::getCreateTime))
                     .collect(Collectors.toList());
         }
 
         //查询用户
         UserCacheResDto userCacheResDto = remoteSystemService.queryUserCacheById(subtask.getUnloadOperator());
+        //根据物流订单查询运单号
+        List<KwtWaybillOrderSubtask> waybillOrderSubtasks = kwtWaybillOrderSubtaskRepository.queryByLogId(logOrder.getId());
+        List<KwtWaybillOrder> billOrders = Lists.newArrayList() ;
+        if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(waybillOrderSubtasks)){
+            Set<Long> billOrderIds = waybillOrderSubtasks.stream()
+                    .map(KwtWaybillOrderSubtask::getWOrderId)
+                    .collect(Collectors.toSet());
+            if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(billOrderIds)){
+                billOrders = kwtWaybillOrderRepository.queryByBillOrderIds(billOrderIds);
+            };
+        }
+
         return getWaybillOrderDetailResp( subtask,billOrder, logOrder, truck, fleet, goods,
-                keyAndAddressMap,kwpGoods,logisticsOrderUnitMap,nodeList,userCacheResDto);
+                keyAndAddressMap,kwpGoods,logisticsOrderUnitMap,nodeList,userCacheResDto,billOrders);
     }
 
     @NotNull
@@ -3344,7 +3366,8 @@ public class KwtWaybillOrderV1Service {
                                                                      KwpGoods kwpGoods,
                                                                      Map<String, KwtLogisticsOrderUnit> logisticsOrderUnitMap,
                                                                      List<KwtWaybillOrderNode> nodeList,
-                                                                     UserCacheResDto userCacheResDto) {
+                                                                     UserCacheResDto userCacheResDto,
+                                                                     List<KwtWaybillOrder> billOrders) {
         WaybillOrderDetailResp waybillOrderDetailResp = new WaybillOrderDetailResp();
         waybillOrderDetailResp.setWaybillOrderId(String.valueOf(billOrder.getId()));
         waybillOrderDetailResp.setWaybillOrderNo(billOrder.getWOrderNo());
@@ -3377,18 +3400,29 @@ public class KwtWaybillOrderV1Service {
         KwtLogisticsOrderUnit carrierEnt = logisticsOrderUnitMap.getOrDefault(logOrder.getId() + "-" + UnitTypeEnum.CARRIAGE.getCode(), new KwtLogisticsOrderUnit());
         waybillOrderDetailResp.setTransEntName(transEnt.getFirmName());
         waybillOrderDetailResp.setCarrierEntName(carrierEnt.getFirmName());
-        List<WaybillOrderDetailResp.WeighingRecord> records = nodeList.stream().map(node -> {
-            WaybillOrderDetailResp.WeighingRecord weighingRecord = new WaybillOrderDetailResp.WeighingRecord();
-            weighingRecord.setWeighingTime(DateUtils.format(node.getCreateTime(), DateUtils.DATE_TIME_PATTERN));
-            weighingRecord.setWeighingDesc(node.getRemark());
-            return weighingRecord;
-        }).collect(Collectors.toList());
-        waybillOrderDetailResp.setWeighingRecords(records);
+        if(org.apache.commons.collections4.CollectionUtils.isNotEmpty(nodeList)){
+            List<WaybillOrderDetailResp.WeighingRecord> records = nodeList.stream().map(node -> {
+                WaybillOrderDetailResp.WeighingRecord weighingRecord = new WaybillOrderDetailResp.WeighingRecord();
+                weighingRecord.setWeighingTime(DateUtils.format(node.getCreateTime(), DateUtils.DATE_TIME_PATTERN));
+                weighingRecord.setWeighingDesc(node.getRemark());
+                weighingRecord.setWeighingName(node.getWeighbridgeName());
+                weighingRecord.setWeighingImgUrl(node.getWeighUrl()) ;
+                return weighingRecord;
+            }).collect(Collectors.toList());
+            waybillOrderDetailResp.setWeighingRecords(records);
+        }
         WaybillOrderDetailResp.BillInfo billInfo = new WaybillOrderDetailResp.BillInfo();
         billInfo.setUploadByLabel(Objects.nonNull(userCacheResDto) ? userCacheResDto.getName() : "" );
         billInfo.setUploadTime(DateUtils.format(subtask.getUnloadUploadTime(),DateUtils.DATE_TIME_PATTERN));
         billInfo.setBillUrl(subtask.getUnloadUrl());
         waybillOrderDetailResp.setBillInfo(billInfo);
+        if (org.apache.commons.collections4.CollectionUtils.isNotEmpty(billOrders)){
+            List<Long> billOrderIdList = billOrders.stream()
+                    .filter(b -> Objects.equals(b.getStatus(), CarWaybillV1Enum.COMPLETION_LOADING.getCode()) && !Objects.equals(b.getId(),billOrder.getId()))
+                    .map(KwtWaybillOrder::getId)
+                    .collect(Collectors.toList());
+            waybillOrderDetailResp.setBillOrderIdList(billOrderIdList);
+        }
         return waybillOrderDetailResp;
     }
 
@@ -3412,17 +3446,21 @@ public class KwtWaybillOrderV1Service {
         updateSubtask.setId(subtask.getId());
         //KwtWaybillOrderTicket kwtWaybillOrderTicket = new KwtWaybillOrderTicket();
         //单证审核 运单当前状态是已卸货,传入的订单是已完成
-        if (Objects.equals(status, CarWaybillV1Enum.WAIT_UNLOADING.getCode()) && Objects.equals(billOrder.getStatus(), CarWaybillV1Enum.COMPLETION_LOADING.getCode())){
+        List<Integer> statusList = Arrays.asList(CarWaybillV1Enum.WAIT_UNLOADING.getCode(), CarWaybillV1Enum.COMPLETION_UNLOADING.getCode());
+        if (statusList.contains( status) && Objects.equals(billOrder.getStatus(), CarWaybillV1Enum.COMPLETION_LOADING.getCode())){
             updateOrder.setStatus( status);
+            updateOrder.setRemark(req.getRemark());
             updateSubtask.setStatus(status);
+            updateSubtask.setRemark(req.getRemark());
+            updateSubtask.setUnloadAmount(org.apache.commons.lang3.StringUtils.isBlank(req.getUnloadAmount()) ? null  :  new BigDecimal(req.getUnloadAmount()));
             if (org.apache.commons.lang3.StringUtils.isNotBlank(req.getAddressUrl())){
-                subtask.setUnloadUrl(req.getAddressUrl());
+                updateSubtask.setUnloadUrl(req.getAddressUrl());
             }
             if(org.apache.commons.lang3.StringUtils.isNotBlank(req.getUploadUser())){
-                subtask.setUnloadOperator(Long.valueOf(req.getUploadUser()));
+                updateSubtask.setUnloadOperator(Long.valueOf(req.getUploadUser()));
             }
             if (org.apache.commons.lang3.StringUtils.isNotBlank(req.getUploadTime())){
-                subtask.setUnloadUploadTime(DateUtils.parse(req.getUploadTime(), DateUtils.DATE_TIME_PATTERN));
+                updateSubtask.setUnloadUploadTime(DateUtils.parse(req.getUploadTime(), DateUtils.DATE_TIME_PATTERN));
             }
             boolean b = kwtWaybillOrderRepository.updateById(updateOrder) && kwtWaybillOrderSubtaskRepository.updateById(updateSubtask);
             //修改物流订单数据
@@ -3430,8 +3468,17 @@ public class KwtWaybillOrderV1Service {
             //获取更新 订单状态
             KwtLogisticsOrder kwtLogisticsOrder = getKwtLogisticsOrder(kwtLogistics, subtask);
             boolean b1 = kwtLogisticsOrderRepository.updateById(kwtLogisticsOrder);
+            //如果物流订单状态是已完成需要通知贸易订单完成
+            noticeTraderOrder(kwtLogisticsOrder, kwtLogistics);
+
             // 存储记录
-            String remark = "审核通过,运单【"+ billOrder.getWOrderNo() + "】已完成";
+            String remark = null;
+            if (Objects.equals(status, CarWaybillV1Enum.COMPLETION_UNLOADING.getCode())){
+                 remark = "审核驳回,运单【"+ billOrder.getWOrderNo() + "】已驳回";
+            }else {
+                 remark = "审核通过,运单【"+ billOrder.getWOrderNo() + "】已完成";
+            }
+
             saveNode(billOrder, subtask, status,remark);
             if (!b || !b1){
                 throw new BusinessException("审核运单失败");
@@ -3443,16 +3490,18 @@ public class KwtWaybillOrderV1Service {
         if (Objects.equals(billOrder.getStatus(), CarWaybillV1Enum.COMPLETION_UNLOADING.getCode()) && Objects.equals(status,
                 CarWaybillV1Enum.WAIT_UNLOADING.getCode())){
             updateOrder.setStatus(status);
+            updateOrder.setRemark(req.getRemark());
             updateSubtask.setStatus(status);
-            updateSubtask.setUnloadAmount(Objects.nonNull(req.getUnloadAmount()) ? new BigDecimal(req.getUnloadAmount()) : null);
+            updateSubtask.setRemark(req.getRemark());
+            updateSubtask.setUnloadAmount(org.apache.commons.lang3.StringUtils.isNotBlank(req.getUnloadAmount()) ? new BigDecimal(req.getUnloadAmount()) : null);
             if (org.apache.commons.lang3.StringUtils.isNotBlank(req.getAddressUrl())){
-                subtask.setUnloadUrl(req.getAddressUrl());
+                updateSubtask.setUnloadUrl(req.getAddressUrl());
             }
             if(org.apache.commons.lang3.StringUtils.isNotBlank(req.getUploadUser())){
-                subtask.setUnloadOperator(Long.valueOf(req.getUploadUser()));
+                updateSubtask.setUnloadOperator(Long.valueOf(req.getUploadUser()));
             }
             if (org.apache.commons.lang3.StringUtils.isNotBlank(req.getUploadTime())){
-                subtask.setUnloadUploadTime(DateUtils.parse(req.getUploadTime(), DateUtils.DATE_TIME_PATTERN));
+                updateSubtask.setUnloadUploadTime(DateUtils.parse(req.getUploadTime(), DateUtils.DATE_TIME_PATTERN));
             }
             boolean b = kwtWaybillOrderRepository.updateById(updateOrder) && kwtWaybillOrderSubtaskRepository.updateById(updateSubtask);
 //            kwtWaybillOrderTicket.setWOrderId(waybillId);
@@ -3466,27 +3515,72 @@ public class KwtWaybillOrderV1Service {
             String remark = "供应方,【"+roleName+"】【"+LoginUserHolder.getUserName()+"】已审核单证";
             saveNode(billOrder, subtask, status,remark);
             if (!b ){
-               throw new BusinessException("完单证失败");
+               throw new BusinessException("完单证失败");
             }
             return Boolean.TRUE;
         }
         return Boolean.FALSE;
     }
 
+    private void noticeTraderOrder(KwtLogisticsOrder kwtLogisticsOrder, KwtLogisticsOrder kwtLogistics) {
+
+        if (!Objects.equals(kwtLogisticsOrder.getStatus(),LogisticsOrderV1Enum.HAVE_RECONCILED.getCode())){
+           return;
+        }
+        // 根据贸易订单id查询物理订单
+        List<KwtLogisticsOrder> kwtLogisticsOrders = kwtLogisticsOrderRepository.queryByTradeOrderId(kwtLogisticsOrder.getTOrderId());
+        if (org.apache.commons.collections4.CollectionUtils.isEmpty(kwtLogisticsOrders)){
+            return;
+        }
+        //判断所有的物流订单都都已经完成
+        boolean b = kwtLogisticsOrders.stream()
+                .allMatch(x -> Arrays.asList(LogisticsOrderV1Enum.HAVE_RECONCILED.getCode(), LogisticsOrderV1Enum.REJECT_ORDER.getCode()).contains(x.getStatus()));
+        if (!b){
+            return;
+        }
+        TradeOrderSettlePara tradeOrderSettlePara = new TradeOrderSettlePara();
+        tradeOrderSettlePara.setTOrderId(kwtLogistics.getTOrderId());
+        BigDecimal loadAmount = kwtLogisticsOrders.stream()
+                .map(KwtLogisticsOrder::getLoadAmount)
+                .filter(Objects::nonNull)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+        BigDecimal unloadAmount = kwtLogisticsOrders.stream()
+                .map(KwtLogisticsOrder::getUnloadAmount)
+                .filter(Objects::nonNull)
+                .reduce(BigDecimal.ZERO, BigDecimal::add);
+        tradeOrderSettlePara.setLoadAmount(loadAmount);
+        tradeOrderSettlePara.setUnloadAmount(unloadAmount);
+        log.info("运单审核通过修改贸易订单状态请求参数:{}",JSON.toJSONString(tradeOrderSettlePara));
+        tradeOrderInfoService.orderSettle(tradeOrderSettlePara);
+    }
+
     private void saveNode(KwtWaybillOrder billOrder, KwtWaybillOrderSubtask subtask, Integer status,String remark) {
         KwtWaybillOrderNode kwtWaybillOrderNode = new KwtWaybillOrderNode();
+        kwtWaybillOrderNode.setTruckId(billOrder.getTruckId());
+        kwtWaybillOrderNode.setTruckNo(billOrder.getTruckNo());
+        kwtWaybillOrderNode.setDriverId(billOrder.getDriverId());
+        kwtWaybillOrderNode.setDriverName(billOrder.getDriverName());
+
         kwtWaybillOrderNode.setWOrderId(billOrder.getId());
         kwtWaybillOrderNode.setWSubtaskId(subtask.getId());
         kwtWaybillOrderNode.setOrderStatus(status);
         kwtWaybillOrderNode.setRemark(remark);
+        kwtWaybillOrderNode.setCreateBy(LoginUserHolder.getUserId());
+        kwtWaybillOrderNode.setTruckId(billOrder.getTruckId());
         waybillOrderNodeRepository.save(kwtWaybillOrderNode);
     }
 
     @NotNull
-    private static KwtLogisticsOrder getKwtLogisticsOrder(KwtLogisticsOrder kwtLogistics, KwtWaybillOrderSubtask subtask) {
+    private  KwtLogisticsOrder getKwtLogisticsOrder(KwtLogisticsOrder kwtLogistics, KwtWaybillOrderSubtask subtask) {
         if (Objects.isNull(kwtLogistics)){
             throw new BusinessException("物流订单信息不存在");
         }
+        //调物流订单完结订单
+        List<KwtWaybillOrderSubtask> waybillOrderSubtasks = kwtWaybillOrderSubtaskRepository.queryByLogId(subtask.getLOrderId());
+        boolean b2 = waybillOrderSubtasks.stream()
+                .allMatch(x -> Arrays.asList(CarWaybillV1Enum.WAIT_UNLOADING.getCode(), CarWaybillV1Enum.APPROVAL_TREAT.getCode()).contains(x.getStatus()));
+        // KwtLogisticsOrder logisticsOrder = kwtLogisticsOrderRepository.queryByLogisticsOrderId(subtask.getLOrderId());
+
         BigDecimal entrustAmount  = Objects.isNull(kwtLogistics.getEntrustAmount())  ? BigDecimal.ZERO: kwtLogistics.getEntrustAmount();
         BigDecimal subEntrustAmount = Objects.isNull(subtask.getEntrustAmount()) ? BigDecimal.ZERO: subtask.getEntrustAmount();
         BigDecimal loadAmount  = Objects.isNull(kwtLogistics.getLoadAmount())  ? BigDecimal.ZERO: kwtLogistics.getLoadAmount();
@@ -3500,6 +3594,10 @@ public class KwtWaybillOrderV1Service {
         kwtLogisticsOrder.setEntrustAmount(entrustAmount.add(subEntrustAmount));
         kwtLogisticsOrder.setLoadAmount(loadAmount.add(subLoadAmount));
         kwtLogisticsOrder.setUnloadAmount(unloadAmount.add(subUnloadAmount));
+        if (b2){
+            //调物流订单完结订单
+            kwtLogisticsOrder.setStatus(LogisticsOrderV1Enum.HAVE_RECONCILED.getCode());
+        }
         return kwtLogisticsOrder;
     }