Procházet zdrojové kódy

1、物流运单完结操作;

zk před 2 roky
rodič
revize
6aca876dcb

+ 10 - 2
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/dao/KwtLogisticsOrderMapper.java

@@ -12,7 +12,6 @@ import com.sckw.transport.model.vo.execlVo.AcceptCarriageOrderExcelVo;
 import com.sckw.transport.model.vo.AcceptCarriageOrderVO;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
-
 import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
@@ -151,7 +150,8 @@ public interface KwtLogisticsOrderMapper extends BaseMapper<KwtLogisticsOrder> {
      * @desc 查询分包物流订单
      * @author zk
      * @date 2023/7/20
-     **/
+     *
+     * @return*/
     List<KwtLogisticsOrder> findLogisticsOrder(Map params);
 
     /**
@@ -441,4 +441,12 @@ public interface KwtLogisticsOrderMapper extends BaseMapper<KwtLogisticsOrder> {
                                                            @Param("userIds") List<Long> userIds,
                                                            @Param("idsList") List<Long> idsList
     );
+
+    /**
+     * @param params {lOrderId 物流订单id, tOrderId 贸易订单id, upperlOrderId 下级分包物流订单, belowlOrderId 所属上级分包, status 状态}
+     * @desc 统计物流订单
+     * @author zk
+     * @date 2023/9/18
+     **/
+    LogisticsCountVo findLogisticsOrderCount(Map<String, Object> params);
 }

+ 1 - 1
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/dao/KwtWaybillOrderMapper.java

@@ -83,7 +83,7 @@ public interface KwtWaybillOrderMapper extends BaseMapper<KwtWaybillOrder> {
      * @author zk
      * @date 2023/7/31
      **/
-    WaybillCountVo findWaybillOrderCount(Map params);
+    WaybillCountVo findWaybillOrderCount(Map<String, Object> params);
 
     /**
      * @param driverId 司机ID

+ 203 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/vo/KwtLogisticsOrderTreeVo.java

@@ -0,0 +1,203 @@
+package com.sckw.transport.model.vo;
+
+import jakarta.validation.constraints.DecimalMin;
+import jakarta.validation.constraints.Digits;
+import jakarta.validation.constraints.Max;
+import jakarta.validation.constraints.Min;
+import lombok.Data;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * desc 物流订单层级关系
+ * author zk
+ * date 2023/9/18 0018
+ */
+@Data
+public class KwtLogisticsOrderTreeVo implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    private Long id;
+
+    /**
+     * 企业id
+     */
+    private Long entId;
+
+    /**
+     * 物流订单类型(1 贸易订单生成物流订单、2 自建物流订单)
+     */
+    private String type;
+
+    /**
+     * 交易订单id(kwo_trade_order)
+     */
+    private Long tOrderId;
+
+    /**
+     * 交易订单编号(kwo_trade_order)
+     */
+    private String tOrderNo;
+
+    /**
+     * 物流订单编号
+     */
+    private String lOrderNo;
+
+    /**
+     * 分包上级物流订单id
+     */
+    private Long pid;
+
+    /**
+     * 分包所有物流订单id
+     */
+    private String pids;
+
+    /**
+     * 当前单据所属等级
+     */
+    private String level;
+
+    /**
+     * 结算周期(周结、月结、季结)
+     */
+    private Long settlementCycle;
+    /**
+     * 计费方式
+     */
+    private String billingMode;
+
+    /**
+     * 运价
+     */
+    private BigDecimal price;
+
+    /**
+     * 运价方式(元/吨、元/车)
+     */
+    @Min(value = 0,message = "运价方式类型不能大于等于{value}")
+    @Max(value = 4,message = "运价方式类型不能大于等于{value}")
+    private Long priceType;
+
+    /**
+     * 已委托量
+     */
+    @Digits(integer = 10,fraction = 2,message = "委托量格式不正确")
+    @DecimalMin(value = "0.00",message = "委托量不能小于{value}")
+    private BigDecimal amount;
+
+    /**
+     * 单位(吨、方、箱、件)
+     */
+    private String unit;
+
+    /**
+     * 合理损耗
+     */
+    private BigDecimal loss;
+
+    /**
+     * 合理损耗单位(‰/kG)
+     */
+    private String lossUnit;
+
+    /**
+     * 商品价值(扣亏货值)
+     */
+    private BigDecimal goodsPrice;
+
+    /**
+     * 商品价值(扣亏货值)单位
+     */
+    private String goodsPriceUnit;
+
+    /**
+     * 计划开始日期
+     */
+    private LocalDate startTime;
+
+    /**
+     * 计划结束日期
+     */
+    private LocalDate endTime;
+
+    /**
+     * 分包量
+     */
+    private BigDecimal subcontractAmount;
+
+    /**
+     * 已委托量
+     */
+    private BigDecimal entrustAmount;
+
+    /**
+     * 卸货量
+     */
+    private BigDecimal unloadAmount;
+
+    /**
+     * 装货量
+     */
+    private BigDecimal loadAmount;
+
+    /**
+     * 忽略剩余量
+     */
+    private BigDecimal ignoreAmount;
+
+    /**
+     * 亏吨量(装货量-卸货量)
+     */
+    private BigDecimal deficitAmount;
+
+    /**
+     * 亏吨扣款
+     */
+    private BigDecimal deficitPrice;
+
+    /**
+     * 卸货-履约量(自己+下游承运总卸货量)
+     */
+    private BigDecimal totalUnloadAmount;
+
+    /**
+     * 装货-履约量(自己+下游承运总装货量)
+     */
+    private BigDecimal totalLoadAmount;
+
+    /**
+     * 实际开始时间(装货)
+     */
+    private Date loadTime;
+
+    /**
+     * 实际结束时间(卸货)
+     */
+    private Date unloadTime;
+
+    /**
+     * 付款方式(预付款、线下支付、第三方支付)
+     */
+    private Long payment;
+
+    /**
+     * 发票税率(%)
+     */
+    private BigDecimal taxRate;
+
+    /**
+     * 用户状态(0正常、1已锁)
+     */
+    private Integer status;
+
+    private List<KwtLogisticsOrderTreeVo> children;
+}

+ 55 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/vo/LogisticsCountVo.java

@@ -0,0 +1,55 @@
+package com.sckw.transport.model.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * desc 物流订单统计
+ * author zk
+ * date 2023/9/18 0018
+ */
+@Data
+public class LogisticsCountVo {
+
+    /**
+     * 已委托量
+     */
+    private BigDecimal entrustAmount;
+
+    /**
+     * 装货量
+     */
+    private BigDecimal loadAmount;
+
+    /**
+     * 卸货量
+     */
+    private BigDecimal unloadAmount;
+
+    /**
+     * 亏吨量
+     */
+    private BigDecimal deficitAmount;
+
+    /**
+     * 装货时间(第一单车辆运单装货时间)
+     */
+    private Date loadTime;
+
+    /**
+     * 卸货时间(最后一单车辆运单卸货时间)
+     */
+    private Date unloadTime;
+
+    /**
+     * 装货量
+     */
+    private BigDecimal totalLoadAmount;
+
+    /**
+     * 卸货量
+     */
+    private BigDecimal totalUnloadAmount;
+}

+ 139 - 6
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtWaybillOrderService.java

@@ -34,6 +34,7 @@ import com.sckw.system.api.model.dto.res.UserCacheResDto;
 import com.sckw.transport.dao.*;
 import com.sckw.transport.model.*;
 import com.sckw.transport.model.dto.*;
+import com.sckw.transport.model.vo.LogisticsCountVo;
 import com.sckw.transport.model.vo.UserInfoVo;
 import com.sckw.transport.model.vo.WaybillCountVo;
 import com.sckw.transport.model.vo.WaybillOrderDriverVo;
@@ -1069,6 +1070,52 @@ public class KwtWaybillOrderService {
         return HttpResult.ok("车辆运单撤回成功!");
     }
 
+    /**
+     * @param lorderId 物流运单id
+     * @desc 取消派车-物流订单完结(趟次/循环派车)
+     * @author zk
+     * @date 2023/7/24
+     **/
+    public void cancelSendCar(Long lorderId) {
+        /**1数据校验**/
+        KwtLogisticsOrder order = logisticsOrderDao.selectById(lorderId);
+        if (order == null) {
+            return;
+        }
+
+        /**1-5循环派车失效kwt_logistics_order_circulate**/
+        //趟次派车信息
+        List<KwtWaybillOrder> waybillOrders = waybillOrderDao.findWaybillOrder(new HashMap<>(Global.NUMERICAL_SIXTEEN){{
+            put("lOrderId", lorderId);
+            put("status", CarWaybillEnum.PENDING_ORDER.getCode());
+        }});
+        for (KwtWaybillOrder waybillOrder:waybillOrders) {
+            waybillOrder.setStatus(CarWaybillEnum.REVOKED.getCode());
+            waybillOrderDao.updateById(waybillOrder);
+
+            //车辆订单-Mongodb数据更新
+            SckwWaybillOrder wOrder = new SckwWaybillOrder();
+            wOrder.set_id(waybillOrder.getId());
+            editSckwWaybillOrder(wOrder, waybillOrder, 2);
+        }
+
+        //循环派车信息
+        List<KwtLogisticsOrderCirculate> circulates = logisticsOrderCirculateDao.findCirculateList(lorderId, null, null, 0);
+        for (KwtLogisticsOrderCirculate circulate : circulates) {
+            circulate.setStatus(Global.NUMERICAL_ONE);
+            logisticsOrderCirculateDao.updateById(circulate);
+
+            //车辆订单-Mongodb数据更新
+            SckwWaybillOrder wOrder = new SckwWaybillOrder();
+            wOrder.set_id(circulate.getId());
+            KwtWaybillOrder waybillOrder = new KwtWaybillOrder();
+            waybillOrder.setStatus(CarWaybillEnum.REVOKED.getCode());
+            waybillOrder.setUpdateTime(circulate.getUpdateTime());
+            waybillOrder.setUpdateBy(circulate.getUpdateBy());
+            editSckwWaybillOrder(wOrder, waybillOrder, 2);
+        }
+    }
+
     /**
      * @param wOrder mongodb中车辆运单信息
      * @param order  车辆运单信息
@@ -1742,13 +1789,99 @@ public class KwtWaybillOrderService {
         boolean subcontractBool = checkSubcontract(logisticsOrder);
 
         /**1-2校验当前承运订单是否运输完成**/
-        //车辆运单统计
+        //车辆运单统计(运输中的物流订单+车辆运单审核通过)
+        WaybillCountVo waybillCount = waybillOrderDao.findWaybillOrderCount(new HashMap() {{
+            put("upperlOrderId", logisticsOrder.getId());
+            put("passStatus", Global.NUMERICAL_ONE);
+            put("logisticsStatus", LogisticsOrderEnum.IN_TRANSIT.getCode());
+        }});
+        //物流订单统计(运输完成后的物流订单)
+        LogisticsCountVo LogisticsCount = logisticsOrderDao.findLogisticsOrderCount(new HashMap(){{
+            put("upperlOrderId", logisticsOrder.getId());
+            put("finishedStatus", Global.NUMERICAL_ONE);
+        }});
+
+        logisticsOrder.setTotalLoadAmount(waybillCount.getLoadAmount().add(LogisticsCount.getLoadAmount()));
+        logisticsOrder.setTotalUnloadAmount(waybillCount.getUnloadAmount().add(LogisticsCount.getUnloadAmount()));
+        logisticsOrderDao.updateById(logisticsOrder);
+
+        /**1-3更新贸易订单总量**/
+        if (logisticsLevel(logisticsOrder) == Global.NUMERICAL_ONE) {
+            //物流订单统计(运输完成后的物流订单)
+            LogisticsCountVo tradeCount = logisticsOrderDao.findLogisticsOrderCount(new HashMap(){{
+                put("tOrderId", logisticsOrder.getTOrderId());
+                put("finishedStatus", Global.NUMERICAL_ONE);
+            }});
+            //查询贸易订单关联物流运单是否全部完结-totalUnfinished
+            WaybillCountVo tradeCount1 = waybillOrderDao.findWaybillOrderCount(new HashMap() {{
+                put("tOrderId", logisticsOrder.getTOrderId());
+            }});
+            CompleteLogisticsOrderParam tradeOrder = new CompleteLogisticsOrderParam();
+            tradeOrder.setTOrderId(logisticsOrder.getTOrderId());
+            tradeOrder.setActualLoadAmount(tradeCount.getLoadAmount());
+            tradeOrder.setActualUnloadAmount(tradeCount.getUnloadAmount());
+            tradeOrder.setIsAllComplete(tradeCount1.getTotalUnfinished() > 0 ? false : true);
+            tradeOrder.setUpdateBy(LoginUserHolder.getUserId());
+            tradeOrder.setUpdateByName(LoginUserHolder.getUserName());
+            tradeOrderInfoService.completeLogisticsOrder(tradeOrder);
+        }
+
+        /**1-4Mongodb数据更新**/
+        //承运订单
+        SckwLogisticsOrder lOrder = new SckwLogisticsOrder();
+        lOrder.setTotalLoadAmount(logisticsOrder.getTotalLoadAmount());
+        lOrder.setTotalUnloadAmount(logisticsOrder.getTotalUnloadAmount());
+        editSckwLogisticsOrder(lOrder, logisticsOrder);
+
+        /**2当前物流订单属于分包(存在上级物流订单)**/
+        //获取所有上级物流订单ID(当前物流订单ID除外)
+        String pids = logisticsOrder.getPids();
+        if (StringUtils.isNotBlank(pids)) {
+            String[] idArray = pids.split(Global.COMMA);
+            for (String id : idArray) {
+                Long pid = Long.parseLong(id);
+                //当前物流订单ID除外
+                if (!pid.equals(lOrderId)) {
+                    /**校验当前承运订单是否运输完成**/
+                    checkLogisticsByStatus(pid);
+                }
+            }
+        }
+    }
+
+    /**
+     * @param lOrderId 承运订单ID
+     * @description 校验当前承运订单是否运输完成(修改状态 + 统计量)
+     * @author zk
+     * @date 2023/7/27
+     **/
+    public void checkLogisticsByStatusV1(Long lOrderId) {
+        /**
+         校验当前承运订单是否运输完成(虑该当前承运订单上下级物流订单)
+         1存在下级分包,下级物流订单和当前物流订单全部运输完成则修改当前物流订单状态为已完成(HAVE_FINISHED)、统计值
+         2当前物流订单属于分包:需要判断上级及同级分包全部运输完成修改上级物流订单状态为已完成(HAVE_FINISHED)、统计值-一直向上到一级物流订单
+         **/
+
+        /**1存在下级分包**/
+        KwtLogisticsOrder logisticsOrder = logisticsOrderDao.selectById(lOrderId);
+        /**1-1校验下级分包是否全部运输完成**/
+        boolean subcontractBool = checkSubcontract(logisticsOrder);
+
+        /**1-2校验当前承运订单是否运输完成**/
+        //车辆运单统计(运输中的物流订单+车辆运单审核通过)
         WaybillCountVo waybillCount = waybillOrderDao.findWaybillOrderCount(new HashMap() {{
             put("upperlOrderId", logisticsOrder.getId());
-            put("passStatus", 1);
+            put("passStatus", Global.NUMERICAL_ONE);
+            put("logisticsStatus", LogisticsOrderEnum.IN_TRANSIT.getCode());
         }});
-        logisticsOrder.setTotalLoadAmount(waybillCount.getLoadAmount());
-        logisticsOrder.setTotalUnloadAmount(waybillCount.getUnloadAmount());
+        //物流订单统计(运输完成后的物流订单)
+        LogisticsCountVo LogisticsCount = logisticsOrderDao.findLogisticsOrderCount(new HashMap(){{
+            put("upperlOrderId", logisticsOrder.getId());
+            put("finishedStatus", Global.NUMERICAL_ONE);
+        }});
+
+        logisticsOrder.setTotalLoadAmount(waybillCount.getLoadAmount().add(LogisticsCount.getLoadAmount()));
+        logisticsOrder.setTotalUnloadAmount(waybillCount.getUnloadAmount().add(LogisticsCount.getUnloadAmount()));
         BigDecimal subcontractAmount = logisticsOrder.getSubcontractAmount() == null ? new BigDecimal(Global.AMOUNT) : logisticsOrder.getSubcontractAmount();
         //物流运单状态(不包含已完成、已对账、已结算)+ 物流订单上级委派量-下游分包总量 <= 自己承运总装货量 + 下级分包全部运输完成
         if (!LogisticsOrderEnum.transportCompleted(logisticsOrder.getStatus())
@@ -1756,7 +1889,7 @@ public class KwtWaybillOrderService {
                 && subcontractBool) {
             //---------------------------------------------zk 2023-08-01 全量可运
             /**1-3下级分包承运订单运输完成**/
-            //logisticsOrder.setStatus(LogisticsOrderEnum.HAVE_FINISHED.getCode());//取消自动完结
+            logisticsOrder.setStatus(LogisticsOrderEnum.HAVE_FINISHED.getCode());//取消自动完结
             logisticsOrderDao.updateById(logisticsOrder);
 
             /**1-4承运订单状态记录**/
@@ -1791,7 +1924,7 @@ public class KwtWaybillOrderService {
             //查询贸易订单总装货量/总卸货量
             WaybillCountVo tradeCount = waybillOrderDao.findWaybillOrderCount(new HashMap() {{
                 put("tOrderId", logisticsOrder.getTOrderId());
-                put("passStatus", 1);
+                put("passStatus", Global.NUMERICAL_ONE);
             }});
             //查询贸易订单关联物流运单是否全部完结-totalUnfinished
             WaybillCountVo tradeCount1 = waybillOrderDao.findWaybillOrderCount(new HashMap() {{

+ 232 - 2
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/TransportCommonService.java

@@ -1,16 +1,20 @@
 package com.sckw.transport.service;
 
+import cn.hutool.core.collection.CollectionUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.sckw.contract.api.RemoteContractService;
 import com.sckw.contract.api.model.dto.res.ContractCommonInfoResDto;
+import com.sckw.core.annotation.Log;
 import com.sckw.core.common.enums.NumberConstant;
 import com.sckw.core.common.enums.enums.DictEnum;
 import com.sckw.core.common.enums.enums.DictTypeEnum;
+import com.sckw.core.model.constant.Global;
 import com.sckw.core.model.enums.LogisticsOrderEnum;
 import com.sckw.core.model.page.PageResult;
+import com.sckw.core.utils.BeanUtils;
 import com.sckw.core.utils.CollectionUtils;
 import com.sckw.core.utils.IdWorker;
 import com.sckw.core.utils.StringUtils;
@@ -36,8 +40,7 @@ import com.sckw.transport.model.dto.CancelOrderDTO;
 import com.sckw.transport.model.dto.DocumentParamDTO;
 import com.sckw.transport.model.param.ContractParam;
 import com.sckw.transport.model.param.LogisticsOrderParam;
-import com.sckw.transport.model.vo.OrderDetailVO;
-import com.sckw.transport.model.vo.SckwLogisticsOrderVO;
+import com.sckw.transport.model.vo.*;
 import jakarta.annotation.Resource;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboReference;
@@ -733,4 +736,231 @@ public class TransportCommonService {
         PageResult build = PageResult.build(contractParam.getPage(), contractParam.getPageSize(), list.stream().count(), returnList);
         return HttpResult.ok(build);
     }
+
+    /**
+     * @param lOrderId 承运订单ID
+     * @desc 完结物流订单数据处理
+     * @author zk
+     * @date 2023/9/18
+     **/
+    public void closeHandle(Long lOrderId) {
+        /**1数据校验**/
+        KwtLogisticsOrder logisticsOrder = logisticsOrderMapper.selectById(lOrderId);
+        if (logisticsOrder == null) {
+            return;
+        }
+
+        /**2物流订单树形数据结构**/
+        //所有管理物流订单
+        List<KwtLogisticsOrder> orders = logisticsOrderMapper.findLogisticsOrder(new HashMap<>(){{
+            put("upperlOrderId", lOrderId);
+            put("belowlOrderId", logisticsOrder.getPids());
+        }});
+        //数据copy
+        List<KwtLogisticsOrderTreeVo> logisticsOrders = orders.stream().map( order -> {
+                            KwtLogisticsOrderTreeVo logisticsOrderVo = new KwtLogisticsOrderTreeVo();
+                            BeanUtils.copyPropertiesValue(order, logisticsOrderVo);
+                            return logisticsOrderVo;
+                        }
+                ).collect(Collectors.toList());
+        List<KwtLogisticsOrderTreeVo> treeData = findTree(logisticsOrders);
+        /**数据去除已完结订单下级*/
+        orderTreeHandle(treeData);
+
+        /**3链路数据组装*/
+        List<List<KwtLogisticsOrderTreeVo>> orderLinks = new ArrayList<>();
+        for (KwtLogisticsOrderTreeVo order:treeData) {
+            Stack<KwtLogisticsOrderTreeVo> pathStack = new Stack<>();
+            iteratorNode(order, pathStack, orderLinks);
+        }
+        List<KwtLogisticsOrderTreeVo> orderLink = findLink(orderLinks, lOrderId);
+        //倒序
+        Collections.reverse(orderLink);
+
+        /**4数据处理**/
+        for (KwtLogisticsOrderTreeVo order:orderLink) {
+            //排除已完结订单
+            if (Objects.equals(order.getStatus(), LogisticsOrderEnum.HAVE_FINISHED.getCode())) {
+                //计算总装总卸向上级统计
+                continue;
+            }
+
+            //车辆运单统计(运输中的物流订单+车辆运单审核通过)
+            WaybillCountVo waybillCount = waybillOrderMapper.findWaybillOrderCount(new HashMap() {{
+                put("upperlOrderId", order.getId());
+                put("passStatus", Global.NUMERICAL_ONE);
+                put("logisticsStatus", LogisticsOrderEnum.IN_TRANSIT.getCode());
+            }});
+            //物流订单统计(运输完成后的物流订单)
+            LogisticsCountVo LogisticsCount = logisticsOrderMapper.findLogisticsOrderCount(new HashMap(){{
+                put("upperlOrderId", order.getId());
+                put("finishedStatus", Global.NUMERICAL_ONE);
+            }});
+
+            KwtLogisticsOrder currentOrder = logisticsOrderMapper.selectById(lOrderId);
+            currentOrder.setTotalLoadAmount(waybillCount.getLoadAmount().add(LogisticsCount.getLoadAmount()));
+            currentOrder.setTotalUnloadAmount(waybillCount.getUnloadAmount().add(LogisticsCount.getUnloadAmount()));
+            logisticsOrderMapper.updateById(currentOrder);
+
+            /**Mongodb数据更新**/
+            SckwLogisticsOrder lOrder = new SckwLogisticsOrder();
+            lOrder.setTotalLoadAmount(waybillCount.getLoadAmount());
+            lOrder.setTotalUnloadAmount(waybillCount.getUnloadAmount());
+            SckwBusSum busSum = new SckwBusSum();
+            //业务汇总类型
+            busSum.setBusSumType(BusinessTypeEnum.LOGISTICS_ORDER_TYPE.getName());
+            //操作对象(1新增/2修改)
+            busSum.setMethod(NumberConstant.TWO);
+            //业务汇总数据对象
+            busSum.setObject(order);
+            streamBridge.send("sckw-busSum", JSON.toJSONString(busSum));
+
+            //一级物流订单向贸易订单推送数据
+            if (order.getPid() == null) {
+
+            }
+        }
+    }
+
+    /**
+     * @param treeData 物流订单树形数据
+     * @desc 数据去除已完结订单下级
+     * @author zk
+     * @date 2023/9/18
+     **/
+    public static void orderTreeHandle(List<KwtLogisticsOrderTreeVo> treeData){
+        if (CollectionUtil.isEmpty(treeData)) {
+            return;
+        }
+
+        for (KwtLogisticsOrderTreeVo order:treeData) {
+            orderTreeHandle(order.getChildren());
+            if (order.getStatus() == 4) {
+                order.setChildren(null);
+            }
+        }
+    }
+
+    /**
+     * @param orders 物流订单
+     * @desc 树形数据处理
+     * @author zk
+     * @date 2023/9/18
+     **/
+    public static List<KwtLogisticsOrderTreeVo> findTree(List<KwtLogisticsOrderTreeVo> orders) {
+        //跟节点
+        List<KwtLogisticsOrderTreeVo> rootList = new ArrayList();
+
+        //获取根节点数据
+        if (CollectionUtil.isNotEmpty(orders)) {
+            for(KwtLogisticsOrderTreeVo order:orders){
+                if (order.getPid() == null) {
+                    rootList.add(order);
+                }
+            }
+        }
+
+        //遍历,找到二级节点(根节点的id和所有节点中的pid比较)
+        for (KwtLogisticsOrderTreeVo order : rootList) {
+            List<KwtLogisticsOrderTreeVo> child = getChild(order.getId(), orders);
+            order.setChildren(child);
+        }
+
+        return rootList;
+    }
+
+    /**
+     * @param pid 上级物流订单ID
+     * @param orders 物流订单
+     * @desc 树形数据处理-递归
+     * @author zk
+     * @date 2023/9/18
+     **/
+    public static List<KwtLogisticsOrderTreeVo> getChild(Long pid, List<KwtLogisticsOrderTreeVo> orders) {
+        List<KwtLogisticsOrderTreeVo> childList = new ArrayList();
+        for (KwtLogisticsOrderTreeVo order : orders) {
+            if(pid.equals(order.getPid())){
+                //获取当前节点id的所有子列表
+                childList.add(order);
+            }
+        }
+        for (KwtLogisticsOrderTreeVo order : childList) {
+            //将该id的子节点进行遍历,通过递归调用,获取每一个子节点的子节点数据
+            List<KwtLogisticsOrderTreeVo> child = getChild(order.getId(), orders);
+            order.setChildren(child);
+        }
+        if(childList.size()==0){
+            //子节点的长度为0,返回null,null不会被阿里的FastJson包解析
+            return  null;
+        }
+        return childList;
+    }
+
+    /**
+     * @param: order 当前节点
+     * @param: pathstack 栈
+     * @param: orderLinks 设备链路信息
+     * @desc 链路组装
+     * @author zk
+     * @date 2023/8/8
+     **/
+    public static void iteratorNode(KwtLogisticsOrderTreeVo order, Stack<KwtLogisticsOrderTreeVo> pathstack, List orderLinks) {
+        //入栈
+        pathstack.push(order);
+        List childlist = order.getChildren();
+        //没有子节点 说明是叶子结点
+        if (childlist == null){
+            List list = new ArrayList();
+            Iterator stackIt = pathstack.iterator();
+            while (stackIt.hasNext()) {
+                list.add(stackIt.next());
+            }
+            List<KwtLogisticsOrderTreeVo> orders = print(list);
+            orderLinks.add(orders);
+        } else {
+            Iterator iterator = childlist.iterator();
+            while (iterator.hasNext()) {
+                KwtLogisticsOrderTreeVo child = (KwtLogisticsOrderTreeVo) iterator.next();
+                //深度优先 进入递归
+                iteratorNode(child, pathstack, orderLinks);
+                //回溯时候出栈
+                pathstack.pop();
+            }
+        }
+    }
+
+    /**
+     * @param list 树形数据
+     * @desc 链路组装
+     * @author zk
+     * @date 2023/8/8
+     **/
+    private static List<KwtLogisticsOrderTreeVo> print(List list) {
+        List<KwtLogisticsOrderTreeVo> orders = new ArrayList();
+        Iterator iterator = list.iterator();
+        while (iterator.hasNext()) {
+            KwtLogisticsOrderTreeVo order = (KwtLogisticsOrderTreeVo) iterator.next();
+            order.setChildren(null);
+            orders.add(order);
+        }
+        return orders;
+    }
+
+    /**
+     * @param orderLinks 物流订单链路信息
+     * @param lOrderId 物流订单id
+     * @desc 获取当前物流订单垂直链路
+     * @author zk
+     * @date 2023/9/18
+     **/
+    public static List<KwtLogisticsOrderTreeVo> findLink(List<List<KwtLogisticsOrderTreeVo>> orderLinks, Long lOrderId) {
+        for (List<KwtLogisticsOrderTreeVo> logisticsOrders:orderLinks) {
+            for (KwtLogisticsOrderTreeVo order:logisticsOrders) {
+                if (Objects.equals(lOrderId, order.getId())) {
+                    return logisticsOrders;
+                }
+            }
+        }
+        return null;
+    }
 }

+ 31 - 0
sckw-modules/sckw-transport/src/main/resources/mapper/KwtLogisticsOrderMapper.xml

@@ -686,6 +686,12 @@
             and FIND_IN_SET(id, #{belowlOrderId, jdbcType=VARCHAR})
             and id != #{ownOrderId, jdbcType=BIGINT}
         </if>
+        <if test="upperlOrderId != null and upperlOrderId != ''">
+            and FIND_IN_SET(#{upperlOrderId, jdbcType=BIGINT}, pids)
+        </if>
+        <if test="belowlOrderId != null and belowlOrderId != ''">
+            and FIND_IN_SET(id, #{belowlOrderId, jdbcType=VARCHAR})
+        </if>
     </select>
     <select id="selectOrderCountByTorderId" resultType="com.sckw.transport.model.dto.LogisticsOrderDTO">
         SELECT a.id          as lOrderId,
@@ -2519,4 +2525,29 @@
         </where>
         ORDER BY tab.createTime DESC
     </select>
+
+    <select id="findLogisticsOrderCount" resultType="com.sckw.transport.model.vo.LogisticsCountVo" parameterType="java.util.Map">
+        SELECT
+        sum(load_amount) loadAmount, sum(unload_amount) unloadAmount,
+        sum(total_load_amount) totalLoadAmount, sum(total_unload_amount) totalUnloadAmount
+        from kwt_logistics_order where del_flag = 0
+        <if test="tOrderId != null and tOrderId != ''">
+            and t_order_id = #{tOrderId, jdbcType=BIGINT}
+        </if>
+        <if test="lOrderId != null and lOrderId != ''">
+            and id = #{lOrderId, jdbcType=BIGINT}
+        </if>
+        <if test="finishedStatus != null and finishedStatus != ''">
+            and status in (4, 5, 6)
+        </if>
+        <if test="status != null and status != ''">
+            and status = #{lOrderId, jdbcType=INTEGER}
+        </if>
+        <if test="upperlOrderId != null and upperlOrderId != ''">
+            and FIND_IN_SET(#{upperlOrderId, jdbcType=BIGINT}, pids)
+        </if>
+        <if test="belowlOrderId != null and belowlOrderId != ''">
+            and FIND_IN_SET(id, #{belowlOrderId, jdbcType=VARCHAR})
+        </if>
+    </select>
 </mapper>

+ 12 - 0
sckw-modules/sckw-transport/src/main/resources/mapper/KwtWaybillOrderMapper.xml

@@ -177,6 +177,9 @@
         <if test="truckId != null and truckId != ''">
             and wo.truck_id = #{truckId, jdbcType=BIGINT}
         </if>
+        <if test="logisticsStatus != null and logisticsStatus != ''">
+            and lo.status  = #{logisticsStatus, jdbcType=INTEGER}
+        </if>
         <if test="passStatus != null and passStatus != ''">
             and wo.status = 8
         </if>
@@ -522,12 +525,21 @@
         kwo.create_time createTime, kwo.driver_id driverId, kwo.driver_name driverName, kwo.driver_phone driverPhone
         FROM kwt_waybill_order kwo
         where kwo.del_flag = 0
+        <if test="tOrderId != null and tOrderId != ''">
+            and kwo.t_order_id = #{tOrderId, jdbcType=BIGINT}
+        </if>
+        <if test="lOrderId != null and lOrderId != ''">
+            and kwo.id = #{lOrderId, jdbcType=BIGINT}
+        </if>
         <if test="driverId != null and driverId != ''">
             and kwo.driver_id = #{driverId, jdbcType=BIGINT}
         </if>
         <if test="truckNo != null and truckNo != ''">
             and kwo.truck_no = #{truckNo, jdbcType=VARCHAR}
         </if>
+        <if test="status != null and status != ''">
+            and kwo.status = #{status, jdbcType=INTEGER}
+        </if>
         <if test="busStatus != null and busStatus == 2">
             and kwo.status = 2
         </if>