瀏覽代碼

提交惯用路线开发

chenxiaofei 8 月之前
父節點
當前提交
529f666581

+ 53 - 0
sckw-common/sckw-common-excel/src/main/java/com/sckw/excel/utils/DateUtil.java

@@ -1146,5 +1146,58 @@ public class DateUtil {
         return startDate;
     }
 
+    /**
+     * 计算两个Date之间的时长(毫秒)
+     */
+    public static Long getDifferenceInMillis(Date start, Date end) {
+        if (start == null || end == null) {
+            return null;
+        }
+        return Math.abs(end.getTime() - start.getTime());
+    }
+
+    /**
+     * 计算两个Date之间的时长(秒)
+     */
+    public static long getDifferenceInSeconds(Date start, Date end) {
+        Duration duration = Duration.between(
+                start.toInstant(),
+                end.toInstant()
+        );
+        return Math.abs(duration.getSeconds());
+    }
+
+    /**
+     * 计算两个Date之间的时长(分钟)
+     */
+    public static long getDifferenceInMinutes(Date start, Date end) {
+        Duration duration = Duration.between(
+                start.toInstant(),
+                end.toInstant()
+        );
+        return Math.abs(duration.toMinutes());
+    }
+
+    /**
+     * 计算两个Date之间的时长(小时)
+     */
+    public static long getDifferenceInHours(Date start, Date end) {
+        Duration duration = Duration.between(
+                start.toInstant(),
+                end.toInstant()
+        );
+        return Math.abs(duration.toHours());
+    }
+
+    /**
+     * 计算两个Date之间的时长(天)
+     */
+    public static long getDifferenceInDays(Date start, Date end) {
+        Duration duration = Duration.between(
+                start.toInstant(),
+                end.toInstant()
+        );
+        return Math.abs(duration.toDays());
+    }
 
 }

+ 4 - 0
sckw-modules-api/sckw-fleet-api/src/main/java/com/sckw/fleet/api/RemoteFleetService.java

@@ -2,6 +2,7 @@ package com.sckw.fleet.api;
 
 import com.sckw.fleet.api.model.vo.RDriverDetailVo;
 import com.sckw.fleet.api.model.vo.RDriverVo;
+import com.sckw.fleet.api.model.vo.RTruckRouteVo;
 import com.sckw.fleet.api.model.vo.RTruckVo;
 import org.apache.ibatis.annotations.Param;
 
@@ -87,4 +88,7 @@ public interface RemoteFleetService {
     RTruckVo findDataFirstTruck(Long entId);
 
     RTruckVo findDriveAndTruckByPhone(String mobile);
+
+    void saveOrUpdate(RTruckRouteVo params);
+
 }

+ 66 - 0
sckw-modules-api/sckw-fleet-api/src/main/java/com/sckw/fleet/api/model/vo/RTruckRouteVo.java

@@ -0,0 +1,66 @@
+package com.sckw.fleet.api.model.vo;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import java.time.LocalDateTime;
+
+/**
+ * 车辆惯用线路信息表
+ * @author PC
+ */
+@Data
+public class RTruckRouteVo {
+    /**
+     * 主键
+     */
+    private Long id;
+
+    /**
+     * 车队id
+     */
+    private Long fleetId;
+
+    /**
+     * 司机id
+     */
+    private Long driverId;
+
+    /**
+     * 企业id
+     */
+
+    private Long entId;
+    /**
+     * 起始点
+     */
+    private String startPoint;
+
+    /**
+     * 卸货地点
+     */
+    private String unloadingPoint;
+
+    /**
+     * 最短时间
+     */
+    private String shortestTime;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updateTime;
+
+    /**
+     * 是否删除(0未删除,1删除)
+     */
+    private Integer delFlag;
+    /**
+     * 车辆id
+     */
+    private Long truckId;
+}

+ 9 - 6
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/controller/KwfTruckRouteController.java

@@ -4,14 +4,13 @@ import com.sckw.core.web.response.BaseResult;
 import com.sckw.core.web.response.result.PageDataResult;
 import com.sckw.fleet.model.request.DeleteTruckRoteReq;
 import com.sckw.fleet.model.request.QueryTruckRoteReq;
+import com.sckw.fleet.model.request.TruckRoteDetailReq;
 import com.sckw.fleet.model.vo.QueryTruckRoteVo;
+import com.sckw.fleet.model.vo.TruckRoteDetailVo;
 import com.sckw.fleet.service.KwfTruckRouteService;
 import jakarta.validation.Valid;
 import lombok.RequiredArgsConstructor;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.*;
 
 /**
  * @author PC
@@ -25,7 +24,7 @@ public class KwfTruckRouteController {
     /**
      *  分页获取车辆信息
      **/
-    @GetMapping("/pageTruckRoute")
+    @PostMapping("/pageTruckRoute")
     public BaseResult<PageDataResult<QueryTruckRoteVo>> pageTruckRoute(@RequestBody QueryTruckRoteReq req) {
         return BaseResult.success(truckService.pageTruckRoute(req));
     }
@@ -35,9 +34,13 @@ public class KwfTruckRouteController {
      * @param req 请求参数
      * @return 删除结果
      */
-    @GetMapping("/deleteTruckRoute")
+    @PostMapping("/deleteTruckRoute")
     public BaseResult<Boolean> deleteTruckRoute(@Valid @RequestBody DeleteTruckRoteReq req) {
         return BaseResult.success(truckService.deleteTruckRoute(req));
     }
 
+    @PostMapping("/truckRouteDetail")
+    public BaseResult<TruckRoteDetailVo> truckRouteDetail(@Valid @RequestBody TruckRoteDetailReq req) {
+        return BaseResult.success(truckService.truckRouteDetail(req));
+    }
 }

+ 43 - 3
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/dubbo/RemoteFleetServiceImpl.java

@@ -8,12 +8,11 @@ import com.sckw.core.utils.StringUtils;
 import com.sckw.fleet.api.RemoteFleetService;
 import com.sckw.fleet.api.model.vo.RDriverDetailVo;
 import com.sckw.fleet.api.model.vo.RDriverVo;
+import com.sckw.fleet.api.model.vo.RTruckRouteVo;
 import com.sckw.fleet.api.model.vo.RTruckVo;
 import com.sckw.fleet.dao.KwfDriverMapper;
 import com.sckw.fleet.dao.KwfTruckMapper;
-import com.sckw.fleet.model.KwfDriver;
-import com.sckw.fleet.model.KwfFleetDriver;
-import com.sckw.fleet.model.KwfTruck;
+import com.sckw.fleet.model.*;
 import com.sckw.fleet.repository.*;
 import lombok.RequiredArgsConstructor;
 import org.apache.dubbo.config.annotation.DubboService;
@@ -46,6 +45,7 @@ public class RemoteFleetServiceImpl implements RemoteFleetService {
     private final KwfDriverRepository driverRepository;
     private final KwfFleetDriverRepository kwfFleetDriverRepository;
     private final KwfFleetTruckRepository kwfFleetTruckRepository;
+    private final KwfTruckRouteRepository kwfTruckRouteRepository;
 
     /**
      * @param driverIds 司机档案主键id,多个已逗号隔开
@@ -216,6 +216,46 @@ public class RemoteFleetServiceImpl implements RemoteFleetService {
         return null;
     }
 
+    @Override
+    public void saveOrUpdate(RTruckRouteVo params) {
+        //获取车队信息
+        List<KwfFleetTruck> kwfFleetTrucks = kwfFleetTruckRepository.queryByTruckId(params.getTruckId());
+        if (CollectionUtils.isNotEmpty(kwfFleetTrucks)) {
+            params.setFleetId(kwfFleetTrucks.get(0).getFleetId());
+        }
+        KwfTruckRoute kwfTruckRoute = new KwfTruckRoute();
+        kwfTruckRoute.setFleetId(params.getFleetId());
+        kwfTruckRoute.setDriverId(params.getDriverId());
+        kwfTruckRoute.setEntId(params.getEntId());
+        kwfTruckRoute.setStartPoint(params.getStartPoint());
+        kwfTruckRoute.setUnloadingPoint(params.getUnloadingPoint());
+        kwfTruckRoute.setShortestTime(params.getShortestTime());
+
+        KwfTruckRoute truckRoute = kwfTruckRouteRepository.findOneByDriverId(params.getDriverId());
+        if (Objects.isNull(truckRoute)){
+            kwfTruckRouteRepository.saveTruckRoute(kwfTruckRoute);
+            return;
+        }
+        KwfTruckRoute updateTruckRoute = new KwfTruckRoute();
+        //如果数据库中没有最短时间进行更新
+        if (Objects.isNull(truckRoute.getShortestTime())){
+            updateTruckRoute(params, updateTruckRoute, truckRoute);
+            return;
+        }
+        //如果传入的时间大于数据库中的时间才进行更新
+        if (StringUtils.isNotBlank(truckRoute.getShortestTime())
+                && StringUtils.isNotBlank(params.getShortestTime())
+                && truckRoute.getShortestTime().compareTo(params.getShortestTime()) > 0 ){
+            updateTruckRoute(params, kwfTruckRoute, truckRoute);
+        }
+    }
+
+    private void updateTruckRoute(RTruckRouteVo params, KwfTruckRoute updateTruckRoute, KwfTruckRoute truckRoute) {
+        updateTruckRoute.setId(truckRoute.getId());
+        updateTruckRoute.setStartPoint(params.getStartPoint());
+        kwfTruckRouteRepository.updateTruckRoute(updateTruckRoute);
+    }
+
     /**
      *  获取车辆数据
      * @param truck 车辆对象

+ 26 - 0
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/request/TruckRoteDetailReq.java

@@ -0,0 +1,26 @@
+package com.sckw.fleet.model.request;
+
+import com.sckw.core.web.request.PageReq;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @author PC
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+@Valid
+public class TruckRoteDetailReq extends PageReq implements Serializable {
+    @Serial
+    private static final long serialVersionUID = 2817549090778895464L;
+    /**
+     * 司机id
+     */
+    @NotNull(message = "司机id不能为空")
+    private Long driverId;
+}

+ 28 - 0
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/model/vo/TruckRoteDetailVo.java

@@ -0,0 +1,28 @@
+
+package com.sckw.fleet.model.vo;
+
+import com.sckw.core.web.request.PageReq;
+import jakarta.validation.Valid;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+/**
+ * @author PC
+ */
+@Data
+public class TruckRoteDetailVo implements Serializable {
+    @Serial
+    private static final long serialVersionUID = 2817549090778895464L;
+    /**
+     * 起始点
+     */
+    private String startPoint;
+    /**
+     * 卸货点
+     */
+    private String unloadingPoint;
+}

+ 16 - 0
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/repository/KwfTruckRouteRepository.java

@@ -1,5 +1,6 @@
 package com.sckw.fleet.repository;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -36,4 +37,19 @@ public class KwfTruckRouteRepository extends ServiceImpl<KwfTruckRouteMapper, Kw
 
         return updateById(kwfTruckRoute);
     }
+
+
+    public KwfTruckRoute findOneByDriverId(Long driverId) {
+        return getOne(Wrappers.<KwfTruckRoute>lambdaQuery()
+                .eq(KwfTruckRoute::getDriverId, driverId)
+                .eq(KwfTruckRoute::getDelFlag,0));
+    }
+
+    public Boolean saveTruckRoute(KwfTruckRoute kwfTruckRoute) {
+        return save(kwfTruckRoute);
+    }
+
+    public Boolean updateTruckRoute(KwfTruckRoute kwfTruckRoute) {
+       return updateById(kwfTruckRoute);
+    }
 }

+ 73 - 25
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/service/KwfTruckRouteService.java

@@ -1,5 +1,6 @@
 package com.sckw.fleet.service;
 
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.sckw.core.model.base.BaseModel;
 import com.sckw.core.utils.DateUtils;
@@ -10,22 +11,24 @@ import com.sckw.fleet.model.dto.KwfTruckRouteDto;
 import com.sckw.fleet.model.request.DeleteTruckRoteReq;
 import com.sckw.fleet.model.request.QueryTruckRoteReq;
 
+import com.sckw.fleet.model.request.TruckRoteDetailReq;
 import com.sckw.fleet.model.vo.QueryTruckRoteVo;
+import com.sckw.fleet.model.vo.TruckRoteDetailVo;
 import com.sckw.fleet.repository.*;
+import jakarta.validation.Valid;
 import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
 import org.springframework.stereotype.Service;
 
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
+import java.util.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
 /**
  * @author PC
  */
+@Slf4j
 @Service
 @RequiredArgsConstructor
 public class KwfTruckRouteService {
@@ -38,28 +41,12 @@ public class KwfTruckRouteService {
 
 
     public PageDataResult<QueryTruckRoteVo> pageTruckRoute(QueryTruckRoteReq req) {
-        Set<Long> driveIds = null;
-        Set<Long> fleetIds = null;
-        if (StringUtils.isNotBlank(req.getDriverName())) {
-            //查询司机信息
-            List<KwfDriver> drivers = driverRepository.findDriverByName(req.getDriverName());
-            if (CollectionUtils.isNotEmpty(drivers)) {
-                //司机ids
-                driveIds = drivers.stream()
-                        .map(BaseModel::getId)
-                        .collect(Collectors.toSet());
-            }
-        }
+        log.info("分页查询车辆惯用路线,参数:{}", JSON.toJSONString(req));
+        //获取司机id
+        Set<Long> driveIds = getDriveIds(req);
+        //获取车队id
+        Set<Long> fleetIds = getFleetIds(req);
 
-        if (StringUtils.isNotBlank(req.getTruckNo())) {
-            KwfTruck kwfTruck = truckRepository.queryByTruckNo(req.getTruckNo());
-            if (Objects.nonNull(kwfTruck)) {
-                List<KwfFleetTruck> kwfFleetTrucks = fleetTruckRepository.queryByTruckId(kwfTruck.getId());
-                fleetIds = kwfFleetTrucks.stream()
-                        .map(KwfFleetTruck::getFleetId)
-                        .collect(Collectors.toSet());
-            }
-        }
         KwfTruckRouteDto kwfTruckRoute = new KwfTruckRouteDto();
         kwfTruckRoute.setFleetIds(fleetIds);
         kwfTruckRoute.setDriverIds(driveIds);
@@ -70,6 +57,7 @@ public class KwfTruckRouteService {
         if (CollectionUtils.isEmpty(records)){
             return PageDataResult.empty(req.getPageNum(), req.getPageSize());
         }
+        //获取车队id
         Set<Long> fleetIdList = records.stream()
                 .map(KwfTruckRoute::getFleetId)
                 .collect(Collectors.toSet());
@@ -92,7 +80,54 @@ public class KwfTruckRouteService {
         return PageDataResult.of(truckRoutePage, queryTruckRoteVos);
     }
 
+    /**
+     * 获取车队id
+     * @param req 请求参数
+     * @return 车队id集合
+     */
+    private Set<Long> getFleetIds(QueryTruckRoteReq req) {
+        if (StringUtils.isBlank(req.getTruckNo())) {
+            return Collections.emptySet();
+        }
+        KwfTruck kwfTruck = truckRepository.queryByTruckNo(req.getTruckNo());
+        if (Objects.isNull(kwfTruck)) {
+            return Collections.emptySet();
+        }
+        List<KwfFleetTruck> kwfFleetTrucks = fleetTruckRepository.queryByTruckId(kwfTruck.getId());
+        if (CollectionUtils.isEmpty(kwfFleetTrucks)) {
+            return Collections.emptySet();
+        }
+        return kwfFleetTrucks.stream()
+                .map(KwfFleetTruck::getFleetId)
+                .collect(Collectors.toSet());
+    }
+
+    /**
+     * 返回司机id
+     * @param req 请求参数
+     * @return 驾驶员id集合
+     */
+    private Set<Long> getDriveIds(QueryTruckRoteReq req) {
+        if (StringUtils.isBlank(req.getDriverName())) {
+            return Collections.emptySet();
+        }
+        //查询司机信息
+        List<KwfDriver> drivers = driverRepository.findDriverByName(req.getDriverName());
+        if (CollectionUtils.isEmpty(drivers)) {
+            return Collections.emptySet();
+        }
+        return drivers.stream()
+                .map(BaseModel::getId)
+                .collect(Collectors.toSet());
+    }
 
+    /**
+     * 组织返回参数
+     * @param r 路线信息
+     * @param fleetIdAndFleetMap 车队id映射车队信息
+     * @param driverIdAndDriverMap 驾驶员id映射驾驶员信息
+     * @return 查询车辆惯用路线返回参数
+     */
     private static QueryTruckRoteVo getQueryTruckRoteVo(KwfTruckRoute r, Map<Long, KwfFleet> fleetIdAndFleetMap, Map<Long, KwfDriver> driverIdAndDriverMap) {
         QueryTruckRoteVo queryTruckRoteVo = new QueryTruckRoteVo();
         queryTruckRoteVo.setTruckNo("");
@@ -110,7 +145,20 @@ public class KwfTruckRouteService {
     }
 
     public Boolean deleteTruckRoute(DeleteTruckRoteReq req) {
+        log.info("删除车辆惯用路线,请求参数 :{}", JSON.toJSONString(req));
         return truckRouteRepository.deleteTruckRoute(req.getId());
 
     }
+
+    public TruckRoteDetailVo truckRouteDetail(@Valid TruckRoteDetailReq req) {
+        log.info("查询车辆惯用路线详情,请求参数 :{}", JSON.toJSONString(req));
+        KwfTruckRoute kwfTruckRoute = truckRouteRepository.findOneByDriverId(req.getDriverId());
+        if (Objects.isNull(kwfTruckRoute)){
+            return new TruckRoteDetailVo();
+        }
+        TruckRoteDetailVo truckRoteDetailVo = new TruckRoteDetailVo();
+        truckRoteDetailVo.setStartPoint(kwfTruckRoute.getStartPoint());
+        truckRoteDetailVo.setUnloadingPoint(kwfTruckRoute.getUnloadingPoint());
+        return truckRoteDetailVo;
+    }
 }

+ 1 - 1
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/KwtWaybillOrderAddress.java

@@ -151,5 +151,5 @@ public class KwtWaybillOrderAddress implements Serializable {
     private static final long serialVersionUID = 1L;
 
     @TableField(exist = false)
-    private String wOrderIdStatusKey;
+    private String wOrderIdAddressTypeKey;
 }

+ 9 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/repository/KwtWaybillOrderAddressRepository.java

@@ -1,10 +1,13 @@
 package com.sckw.transport.repository;
 
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.sckw.transport.dao.KwtWaybillOrderAddressMapper;
 import com.sckw.transport.model.KwtWaybillOrderAddress;
+import jakarta.validation.constraints.NotNull;
 import org.springframework.stereotype.Repository;
 
+import java.util.List;
 
 
 /**
@@ -12,4 +15,10 @@ import org.springframework.stereotype.Repository;
  */
 @Repository
 public class KwtWaybillOrderAddressRepository extends ServiceImpl<KwtWaybillOrderAddressMapper, KwtWaybillOrderAddress> {
+    public List<KwtWaybillOrderAddress> queryByWOrderId(Long wOrderId) {
+
+        return list(Wrappers.<KwtWaybillOrderAddress>lambdaQuery()
+                .eq(KwtWaybillOrderAddress::getWOrderId, wOrderId)
+                .eq(KwtWaybillOrderAddress::getDelFlag, 0));
+    }
 }

+ 22 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/repository/KwtWaybillOrderTrackRepository.java

@@ -0,0 +1,22 @@
+package com.sckw.transport.repository;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sckw.transport.dao.KwtWaybillOrderTrackMapper;
+import com.sckw.transport.model.KwtWaybillOrderTrack;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author PC
+ */
+@Repository
+public class KwtWaybillOrderTrackRepository extends ServiceImpl<KwtWaybillOrderTrackMapper, KwtWaybillOrderTrack> {
+    public List<KwtWaybillOrderTrack> queryByAddressIds(Set<Long> addressIds) {
+        return list(Wrappers.<KwtWaybillOrderTrack>lambdaQuery()
+                .in(KwtWaybillOrderTrack::getWAddressId, addressIds)
+                .eq(KwtWaybillOrderTrack::getDelFlag,0));
+    }
+}

+ 57 - 1
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtWaybillOrderV1Service.java

@@ -13,12 +13,14 @@ import com.sckw.core.model.page.PageHelperUtil;
 import com.sckw.core.model.page.PageResult;
 import com.sckw.core.model.vo.TableTop;
 import com.sckw.core.utils.*;
+import com.sckw.core.web.constant.CommonConstants;
 import com.sckw.core.web.constant.HttpStatus;
 import com.sckw.core.web.context.LoginUserHolder;
 import com.sckw.core.web.response.HttpResult;
 import com.sckw.excel.utils.DateUtil;
 import com.sckw.fleet.api.RemoteFleetService;
 import com.sckw.fleet.api.model.vo.RDriverVo;
+import com.sckw.fleet.api.model.vo.RTruckRouteVo;
 import com.sckw.fleet.api.model.vo.RTruckVo;
 import com.sckw.mongo.model.SckwWaybillOrder;
 import com.sckw.order.api.dubbo.TradeOrderInfoService;
@@ -39,12 +41,14 @@ import com.sckw.transport.model.enuma.CarWaybillDetailEnum;
 import com.sckw.transport.model.enuma.CarWaybillNdexTopEnum;
 import com.sckw.transport.model.enuma.CarWaybillTableTopEnum;
 import com.sckw.transport.model.vo.*;
+import com.sckw.transport.repository.KwtWaybillOrderAddressRepository;
+import com.sckw.transport.repository.KwtWaybillOrderTrackRepository;
 import jakarta.annotation.Resource;
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.validation.Valid;
+import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboReference;
-import org.apache.ibatis.annotations.Param;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.cloud.stream.function.StreamBridge;
@@ -58,6 +62,8 @@ import java.math.RoundingMode;
 import java.time.LocalDateTime;
 import java.time.ZoneId;
 import java.util.*;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
@@ -68,6 +74,7 @@ import java.util.stream.Stream;
  */
 @Slf4j
 @Service
+@RequiredArgsConstructor
 public class KwtWaybillOrderV1Service {
     @Autowired
     KwtWaybillOrderV1Mapper waybillOrderV1Dao;
@@ -99,6 +106,8 @@ public class KwtWaybillOrderV1Service {
     KwtWaybillOrderSubtaskService waybillOrderSubtaskService;
     @Autowired
     KwtCommonService commonService;
+    private final KwtWaybillOrderAddressRepository waybillOrderAddressRepository;
+    private final KwtWaybillOrderTrackRepository kwtWaybillOrderTrackRepository;
     @Resource
     private StreamBridge streamBridge;
     @DubboReference(version = "1.0.0", group = "design", check = false)
@@ -2108,9 +2117,56 @@ public class KwtWaybillOrderV1Service {
 
         /*7、物流订单信息更新*/
         editLogisticsOrder(subtasks);
+        //8.运单常用线路保持
+        //8.1根据订单号获取地址信息
+        editTruckRoute(params, waybillOrder, wOrderId);
         return HttpResult.ok();
     }
 
+    private void editTruckRoute(WaybillOrderTicketApprovalV2Dto params, KwtWaybillOrderV1 waybillOrder, Long wOrderId) {
+        try {
+            List<KwtWaybillOrderAddress> addressList = waybillOrderAddressRepository.queryByWOrderId(params.getWOrderId());
+            if (CollectionUtils.isNotEmpty(addressList)){
+                Set<Long> addressIds = addressList.stream()
+                        .map(KwtWaybillOrderAddress::getId)
+                        .collect(Collectors.toSet());
+                //运单id和地址类型组装key映射地址对象
+                Map<String, KwtWaybillOrderAddress> keyAndAddressMap = addressList.stream()
+                        .peek(a -> a.setWOrderIdAddressTypeKey(a.getWOrderId() + CommonConstants.UNDERSCORE + a.getAddressType()))
+                        .collect(Collectors.toMap(KwtWaybillOrderAddress::getWOrderIdAddressTypeKey, Function.identity(), (k1, k2) -> k1));
+                //查询运单状态信息
+                List<KwtWaybillOrderTrack> tracks =  kwtWaybillOrderTrackRepository.queryByAddressIds(addressIds);
+                //地址id映射运单状态
+                Map<Long, KwtWaybillOrderTrack> addressIdAndTrackMap = tracks.stream()
+                        .collect(Collectors.toMap(KwtWaybillOrderTrack::getWAddressId, Function.identity(), (k1, k2) -> k1));
+                RTruckRouteVo rTruckRouteVo = new RTruckRouteVo();
+                rTruckRouteVo.setTruckId(waybillOrder.getTruckId());
+                rTruckRouteVo.setDriverId(waybillOrder.getDriverId());
+                rTruckRouteVo.setEntId(waybillOrder.getEntId());
+                KwtWaybillOrderAddress startPoint = keyAndAddressMap.getOrDefault(wOrderId + CommonConstants.UNDERSCORE + AddressTypeEnum.SHIPMENT.getCode(), new KwtWaybillOrderAddress());
+                rTruckRouteVo.setStartPoint(startPoint.getDetailAddress());
+                KwtWaybillOrderAddress unloadingPoint = keyAndAddressMap.getOrDefault(wOrderId + CommonConstants.UNDERSCORE + AddressTypeEnum.TAKE.getCode(), new KwtWaybillOrderAddress());
+                rTruckRouteVo.setUnloadingPoint(unloadingPoint.getDetailAddress());
+                AtomicReference<Date> startTime = new AtomicReference<>();
+                AtomicReference<Date> unloadingTime = new AtomicReference<>();
+                addressList.forEach(a->{
+                    KwtWaybillOrderTrack kwtWaybillOrderTrack = addressIdAndTrackMap.get(a.getId());
+                    if (Objects.equals(a.getAddressType(), AddressTypeEnum.SHIPMENT.getCode())){
+                        startTime.set(kwtWaybillOrderTrack.getOperateTime());
+                    }
+                    if (Objects.equals(a.getAddressType(), AddressTypeEnum.TAKE.getCode())){
+                        unloadingTime.set(kwtWaybillOrderTrack.getOperateTime());
+                    }
+                });
+                Long shortestTime = DateUtil.getDifferenceInMillis(unloadingTime.get(), startTime.get());
+                rTruckRouteVo.setShortestTime(Objects.isNull(shortestTime) ? null: String.valueOf(shortestTime));
+                remoteFleetService.saveOrUpdate(rTruckRouteVo);
+            }
+        } catch (Exception e) {
+            log.error("修改惯用线路异常:",e);
+        }
+    }
+
     /**
      * @param params {}
      * @desc 更新榜单信息-单证审核