chenxiaofei 2 сар өмнө
parent
commit
11095e8873

+ 1 - 1
sckw-common/sckw-common-core/src/main/java/com/sckw/core/model/constant/UrlConstants.java

@@ -5,7 +5,7 @@ public class UrlConstants {
     /**
      * 获取轨迹的请求路径
      */
-    public static final String QUERY_TRACE_URL = "api/transfer/pageVehicleDataList";
+    public static final String QUERY_TRACE_URL = "api/transfer/queryVehicleDataList";
     /**
      * 上报车辆轨迹接口
      */

+ 2 - 1
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/repository/KwfTruckRepository.java

@@ -9,6 +9,7 @@ import org.apache.commons.lang3.StringUtils;
 import org.springframework.stereotype.Repository;
 
 import java.util.List;
+import java.util.Objects;
 import java.util.Set;
 
 
@@ -21,7 +22,7 @@ public class KwfTruckRepository extends ServiceImpl<KwfTruckMapper, KwfTruck> {
     public KwfTruck getOneByEntId(Long entId) {
         return getOne(Wrappers.<KwfTruck>lambdaQuery()
                 .eq(BaseModel::getDelFlag,0)
-                .eq(KwfTruck::getEntId, entId)
+                .eq(Objects.nonNull(entId),KwfTruck::getEntId, entId)
                 .orderByDesc(BaseModel::getCreateTime)
                 .last("limit 1"));
     }

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

@@ -25,6 +25,32 @@ public class TruckInfoVo implements Serializable {
      */
     @Schema(description = "车牌号")
     private String truckNo;
+    /**
+     * 车辆id
+     */
+    private String truckId;
+    /**
+     * 司机id
+     */
+    private String driveId;
+    /**
+     * 司机名称
+     */
+    private String driveName;
+    /**
+     * 承运单位
+     */
+    private String  carrier ;
+
+    /**
+     * 司机手机号
+     */
+    private String drivePhone;
+    /**
+     * 运单状态
+     */
+    private String taskStatus;
+
     /**
      * GPS状态
      */

+ 32 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/repository/KwtLogisticsOrderUnitRepository.java

@@ -0,0 +1,32 @@
+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.KwtLogisticsOrderUnitMapper;
+import com.sckw.transport.model.KwtLogisticsOrderUnit;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author PC
+ */
+@Repository
+public class KwtLogisticsOrderUnitRepository extends ServiceImpl<KwtLogisticsOrderUnitMapper, KwtLogisticsOrderUnit> {
+    public KwtLogisticsOrderUnit queryByLOrderIdAndUnitType(Long lOrderId, int unitType) {
+        return getOne(Wrappers.<KwtLogisticsOrderUnit>lambdaQuery()
+                .eq(KwtLogisticsOrderUnit::getDelFlag,0)
+                .eq(KwtLogisticsOrderUnit::getLOrderId,lOrderId)
+                .eq(KwtLogisticsOrderUnit::getUnitType,unitType)
+                .orderByDesc(KwtLogisticsOrderUnit::getId)
+                .last("limit 1"));
+    }
+
+    public List<KwtLogisticsOrderUnit> queryByLOrderIdsAndUnitType(Set<Long> lOrderIds, int unitType) {
+        return list(Wrappers.<KwtLogisticsOrderUnit>lambdaQuery()
+                .eq(KwtLogisticsOrderUnit::getDelFlag,0)
+                .in(KwtLogisticsOrderUnit::getLOrderId,lOrderIds)
+                .eq(KwtLogisticsOrderUnit::getUnitType,unitType));
+    }
+}

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

@@ -1,5 +1,6 @@
 package com.sckw.transport.repository;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.sckw.transport.dao.KwtWaybillOrderAddressMapper;
@@ -21,4 +22,10 @@ public class KwtWaybillOrderAddressRepository extends ServiceImpl<KwtWaybillOrde
                 .eq(KwtWaybillOrderAddress::getWOrderId, wOrderId)
                 .eq(KwtWaybillOrderAddress::getDelFlag, 0));
     }
+
+    public List<KwtWaybillOrderAddress> queryBywOrderIds(List<Long> wOrderIds) {
+        return list(Wrappers.<KwtWaybillOrderAddress>lambdaQuery()
+                .eq(KwtWaybillOrderAddress::getDelFlag, 0)
+                .in(KwtWaybillOrderAddress::getWOrderId, wOrderIds));
+    }
 }

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

@@ -75,4 +75,20 @@ public class KwtWaybillOrderRepository extends ServiceImpl<KwtWaybillOrderMapper
                 .eq(Objects.nonNull(entId),KwtWaybillOrder::getEntId, entId)
                 .eq(KwtWaybillOrder::getDelFlag, 0));
     }
+
+    public KwtWaybillOrder findOneByTruckId(String truckId) {
+        return getOne(Wrappers.<KwtWaybillOrder>lambdaQuery()
+                .eq(KwtWaybillOrder::getTruckId,truckId)
+                .eq(KwtWaybillOrder::getDelFlag,0)
+                .orderByDesc(KwtWaybillOrder::getId)
+                .last("limit 1"));
+    }
+
+    public KwtWaybillOrder findOneByWOrderNo(String wOrderNo) {
+        return getOne(Wrappers.<KwtWaybillOrder>lambdaQuery()
+                .eq(KwtWaybillOrder::getWOrderNo,wOrderNo)
+                .eq(KwtWaybillOrder::getDelFlag,0)
+                .orderByDesc(KwtWaybillOrder::getId)
+                .last("limit 1"));
+    }
 }

+ 70 - 38
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/kwfTruckTraceService.java

@@ -1,8 +1,7 @@
 package com.sckw.transport.service;
 
 import com.alibaba.fastjson.JSON;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.sckw.contract.api.RemoteContractService;
 import com.sckw.core.exception.BusinessException;
@@ -24,8 +23,10 @@ import com.sckw.payment.api.dubbo.PaymentDubboService;
 import com.sckw.product.api.dubbo.GoodsInfoService;
 import com.sckw.redis.utils.RedissonUtils;
 import com.sckw.system.api.RemoteSystemService;
+import com.sckw.system.api.model.dto.res.EntCacheResDto;
 import com.sckw.system.api.model.dto.res.KwsEnterpriseResDto;
 import com.sckw.transport.common.config.UrlConfigProperties;
+import com.sckw.transport.model.KwtLogisticsOrderUnit;
 import com.sckw.transport.model.KwtWaybillOrder;
 import com.sckw.transport.model.KwtWaybillOrderAddress;
 import com.sckw.transport.model.KwtWaybillOrderSubtask;
@@ -39,6 +40,7 @@ import com.sckw.transport.model.param.VehiclesTrajectoryReq;
 import com.sckw.transport.model.vo.CurrentTaskTraceReqVo;
 import com.sckw.transport.model.vo.KwfTruckTraceReplayVo;
 import com.sckw.transport.model.vo.TruckInfoVo;
+import com.sckw.transport.repository.KwtLogisticsOrderUnitRepository;
 import com.sckw.transport.repository.KwtWaybillOrderAddressRepository;
 import com.sckw.transport.repository.KwtWaybillOrderRepository;
 import com.sckw.transport.repository.KwtWaybillOrderSubtaskRepository;
@@ -54,6 +56,7 @@ import org.springframework.stereotype.Service;
 
 import java.time.LocalDateTime;
 import java.util.*;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 
@@ -69,6 +72,7 @@ public class kwfTruckTraceService {
     private final UrlConfigProperties urlConfigProperties;
     private final KwtWaybillOrderSubtaskRepository kwtWaybillOrderSubtaskRepository;
     private final VehicleCollectService vehicleCollectService;
+    private final KwtLogisticsOrderUnitRepository kwtLogisticsOrderUnitRepository;
 
     @DubboReference(version = "1.0.0", group = "design", check = false, timeout = 8000)
     RemoteSystemService remoteSystemService;
@@ -113,20 +117,24 @@ public class kwfTruckTraceService {
         List<Long> entIds = records.stream().map(KwtWaybillOrder::getId).distinct().collect(Collectors.toList());
         //运单id
         List<Long> wOrderIds = records.stream().map(KwtWaybillOrder::getId).collect(Collectors.toList());
+        //关联订单id
+        Set<Long> lOrderIds = records.stream().map(KwtWaybillOrder::getLOrderId).collect(Collectors.toSet());
+        List<KwtLogisticsOrderUnit> logisticsOrderUnits = kwtLogisticsOrderUnitRepository.queryByLOrderIdsAndUnitType(lOrderIds,2);
+        //运单号映射企业
+        Map<Long, KwtLogisticsOrderUnit> lOrderIdAndLogisticsOrderUnitMap = logisticsOrderUnits.stream()
+                .collect(Collectors.toMap(KwtLogisticsOrderUnit::getLOrderId, Function.identity(), (k1, k2) -> k1));
         //通过企业id映射企业信息
         Map<Long, KwsEnterpriseResDto> idAndKwsEnterpriseMap = remoteSystemService.queryEnterpriseByEntIds(entIds);
 
         //装货地址和卸货地址 kwt_waybill_order_address
-        LambdaQueryWrapper<KwtWaybillOrderAddress> wrapper = Wrappers.<KwtWaybillOrderAddress>lambdaQuery()
-                .eq(KwtWaybillOrderAddress::getDelFlag, 0)
-                .in(KwtWaybillOrderAddress::getWOrderId, wOrderIds);
-        List<KwtWaybillOrderAddress> orderAddresses = kwtWaybillOrderAddressRepository.list(wrapper);
+        List<KwtWaybillOrderAddress> orderAddresses = kwtWaybillOrderAddressRepository.queryBywOrderIds(wOrderIds);
+
         //运单id和状态组合key映射地址
         Map<Long, List<KwtWaybillOrderAddress>> wOrderIdAndAddressMap = orderAddresses.stream()
                 .collect(Collectors.groupingBy(KwtWaybillOrderAddress::getWOrderId));
 
         List<KwfTruckTraceReplayVo> kwfTruckTraceReplayVoList = records.stream()
-                .map(r -> getKwfTruckTraceReplayVo(r, idAndKwsEnterpriseMap, wOrderIdAndAddressMap))
+                .map(r -> getKwfTruckTraceReplayVo(r, idAndKwsEnterpriseMap, wOrderIdAndAddressMap, lOrderIdAndLogisticsOrderUnitMap))
                 .collect(Collectors.toList());
        return PageDataResult.of(page,kwfTruckTraceReplayVoList);
     }
@@ -138,7 +146,9 @@ public class kwfTruckTraceService {
      * @param wOrderIdAndAddressMap 运单id映射地址map
      * @return 轨迹回访返回数据
      */
-    private static KwfTruckTraceReplayVo getKwfTruckTraceReplayVo(KwtWaybillOrder waybillOrder, Map<Long, KwsEnterpriseResDto> idAndKwsEnterpriseMap, Map<Long, List<KwtWaybillOrderAddress>> wOrderIdAndAddressMap) {
+    private static KwfTruckTraceReplayVo getKwfTruckTraceReplayVo(KwtWaybillOrder waybillOrder, Map<Long, KwsEnterpriseResDto> idAndKwsEnterpriseMap,
+                                                                  Map<Long, List<KwtWaybillOrderAddress>> wOrderIdAndAddressMap
+                                                                ,Map<Long, KwtLogisticsOrderUnit> lOrderIdAndLogisticsOrderUnitMap) {
 
         KwfTruckTraceReplayVo kwfTruckTraceReplay = new KwfTruckTraceReplayVo();
         kwfTruckTraceReplay.setWOrderId(waybillOrder.getId());
@@ -147,7 +157,8 @@ public class kwfTruckTraceService {
         kwfTruckTraceReplay.setPhone(waybillOrder.getDriverPhone());
         kwfTruckTraceReplay.setStatus(String.valueOf(waybillOrder.getStatus()));
         kwfTruckTraceReplay.setStatusDesc(CarWaybillEnum.getName(waybillOrder.getStatus()));
-        KwsEnterpriseResDto orDefault = idAndKwsEnterpriseMap.getOrDefault(waybillOrder.getEntId(), new KwsEnterpriseResDto());
+        KwtLogisticsOrderUnit kwtLogisticsOrderUnit = lOrderIdAndLogisticsOrderUnitMap.get(waybillOrder.getLOrderId());
+        KwsEnterpriseResDto orDefault = idAndKwsEnterpriseMap.getOrDefault(kwtLogisticsOrderUnit.getEntId(), new KwsEnterpriseResDto());
         kwfTruckTraceReplay.setCarrier(orDefault.getFirmName());
         List<KwtWaybillOrderAddress> addressList = wOrderIdAndAddressMap.get(waybillOrder.getId());
         addressList.forEach(e -> {
@@ -178,36 +189,36 @@ public class kwfTruckTraceService {
     public TruckInfoVo queryTruckInfo(TruckInfoReq req) {
         log.info("查询车辆实时位置信息参数:{}", req);
         //先查缓存 缓存没有 在查询数据中台 数据中台没有 则查询中交
-        if (StringUtils.isNotBlank(req.getTruckId()) && StringUtils.isNotBlank(req.getTruckNo())){
-            return getTruckInfo(req.getTruckNo(),req.getWOrderNo(),req.getTruckNo());
+        if (StringUtils.isNotBlank(req.getTruckId()) ){
+            return getTruckInfo(req.getTruckId(),req.getWOrderNo(),req.getTruckNo());
         }
 
         //如果车牌为空那么查询车队的第一条数据 (从tab页面直接进来)
-        if (StringUtils.isBlank(req.getEntId())){
-            throw new BusinessException("企业id不能为空");
-        }
-        RTruckVo dataFirstTruck = fleetService.findDataFirstTruck(Long.valueOf(req.getEntId()));
-        if (Objects.isNull(dataFirstTruck) || Objects.isNull(dataFirstTruck.getTruckNo())){
-            return new TruckInfoVo();
+        if (StringUtils.isNotBlank(req.getEntId())){
+            RTruckVo dataFirstTruck = fleetService.findDataFirstTruck(Long.valueOf(req.getEntId()));
+            if (Objects.isNull(dataFirstTruck) || Objects.isNull(dataFirstTruck.getTruckNo())){
+                return new TruckInfoVo();
+            }
+            return getTruckInfo(req.getTruckId(),req.getWOrderNo(),dataFirstTruck.getTruckNo());
         }
-        return getTruckInfo(req.getTruckId(),req.getWOrderNo(),dataFirstTruck.getTruckNo());
+        return new TruckInfoVo();
     }
 
     private TruckInfoVo getTruckInfo(String truckId, String wOrderNo,String truckNo) {
         //先查询缓存 如果缓存没有就查数据中台 数据中台没有就查中交
         String location = RedissonUtils.getString(CommonConstants.TRUCK_LOCATION + truckId+CommonConstants.UNDERSCORE+wOrderNo);
-        if (StringUtils.isBlank(location)){
-            return new TruckInfoVo();
-        }
-        TruckDto truckDto = JSON.parseObject(location, TruckDto.class);
-        //如果运单号为空那么返回redis的数据 这个数据是app最后一次上报的数据
-        if (Objects.nonNull(truckDto)){
-            return TruckInfoVo.toTruckInfoVo(truckDto);
+        if (StringUtils.isNotBlank(location)){
+            TruckDto truckDto = JSON.parseObject(location, TruckDto.class);
+            //如果运单号为空那么返回redis的数据 这个数据是app最后一次上报的数据
+            if (Objects.nonNull(truckDto)){
+                return TruckInfoVo.toTruckInfoVo(truckDto);
+            }
         }
+
         //缓存没有则查询数据中台
         VehicleReturnData vehicleReturnData = getVehicleReturnData(truckId);
         if (Objects.nonNull(vehicleReturnData)){
-            return buildTruckInfo(wOrderNo, vehicleReturnData);
+            return buildTruckInfo(truckId, vehicleReturnData, truckNo);
         }
         //todo 查询中交 如果数据中台没有数据则查询中交
         return getTruckInfoVoByZj(truckNo, wOrderNo);
@@ -253,23 +264,43 @@ public class kwfTruckTraceService {
 
     /**
      * 将数据中台的数据进行组织
-     * @param wOrderNo 运单号
+     * @param truckId 车辆id
      * @param vehicleReturn 中台数据
      * @return 组织的数据
      */
-    private TruckInfoVo buildTruckInfo(String wOrderNo, VehicleReturnData vehicleReturn) {
+    private TruckInfoVo buildTruckInfo(String truckId, VehicleReturnData vehicleReturn, String truckNo) {
         TruckInfoVo truckInfoVo = TruckInfoVo.getInstance();
-        truckInfoVo.setWOrderNo(vehicleReturn.getWOrderNo());
-        truckInfoVo.setTruckNo(vehicleReturn.getCarNo());
+
+        truckInfoVo.setTruckNo(truckNo);
         truckInfoVo.setGpsStatus(String.valueOf(vehicleReturn.getSpeed()));
         truckInfoVo.setLongitude(vehicleReturn.getLongitude());
         truckInfoVo.setLatitude(vehicleReturn.getLatitude());
         truckInfoVo.setLocationTime(Objects.isNull(vehicleReturn.getTs())? "" : DateUtils.format(vehicleReturn.getTs(),DateUtils.DATE_TIME_PATTERN));
-        KwtWaybillOrderSubtask subtask = kwtWaybillOrderSubtaskRepository.findOneByWOrderNo(wOrderNo);
+        KwtWaybillOrder order = kwtWaybillOrderRepository.findOneByTruckId(truckId);
+        if (Objects.nonNull(order)){
+            truckInfoVo.setTruckNo(order.getTruckNo());
+            truckInfoVo.setWOrderNo(order.getWOrderNo());
+            truckInfoVo.setDriveId(String.valueOf(order.getDriverId()));
+            truckInfoVo.setDriveName(order.getDriverName());
+            truckInfoVo.setDrivePhone(order.getDriverPhone());
+            truckInfoVo.setTruckId(truckId);
+            truckInfoVo.setTaskStatus(String.valueOf(order.getStatus()));
+        }
+
+        KwtWaybillOrderSubtask subtask = kwtWaybillOrderSubtaskRepository.findOneByWOrderNo(Optional.ofNullable(order)
+                .map(KwtWaybillOrder::getWOrderNo).
+                orElse( null));
         truckInfoVo.setLOrderNo(Objects.isNull(subtask) ? "" : String.valueOf(subtask.getLOrderId()));
         if (Objects.isNull(subtask)){
             return truckInfoVo;
         }
+        //根据物流订单号查询承运单位 2.代表承运企业
+        KwtLogisticsOrderUnit kwtLogisticsOrderUnit = kwtLogisticsOrderUnitRepository.queryByLOrderIdAndUnitType(subtask.getLOrderId(), 2);
+        if (Objects.nonNull(kwtLogisticsOrderUnit) && Objects.nonNull(kwtLogisticsOrderUnit.getEntId())){
+            EntCacheResDto entCacheResDto = remoteSystemService.queryEntCacheById(kwtLogisticsOrderUnit.getEntId());
+            truckInfoVo.setCarrier(Optional.ofNullable(entCacheResDto).map(EntCacheResDto::getFirmName).orElse(""));
+        }
+
         List<KwtWaybillOrderAddress> kwtWaybillOrderAddresses = kwtWaybillOrderAddressRepository.queryByWOrderId(subtask.getWOrderId());
         if (CollectionUtils.isEmpty(kwtWaybillOrderAddresses)){
             return truckInfoVo;
@@ -295,12 +326,9 @@ public class kwfTruckTraceService {
      */
     public CurrentTaskTraceReqVo queryCurrentTaskTrace(CurrentTaskTraceReq req) {
         log.info("查询当前任务轨迹参数:{}", req);
-        if (StringUtils.isBlank(req.getWOrderNo())){
-            log.info("运单号为空没有任务,没有关联路线");
-            return new CurrentTaskTraceReqVo();
-        }
+        KwtWaybillOrder waybillOrder = kwtWaybillOrderRepository.findOneByTruckNo(req.getTruckNo());
         //查询数据中台获取轨迹
-        List<VehicleReturnData> vehicleReturnDataList = getVehicleReturnDataList(req.getWOrderNo());
+        List<VehicleReturnData> vehicleReturnDataList = getVehicleReturnDataList(waybillOrder.getWOrderNo());
         if (CollectionUtils.isEmpty(vehicleReturnDataList)){
             return new CurrentTaskTraceReqVo();
         }
@@ -333,7 +361,9 @@ public class kwfTruckTraceService {
         if (StringUtils.isBlank(s)){
             return Collections.emptyList();
         }
-        return JSON.parseArray(s, VehicleReturnData.class);
+        JSONObject jsonObject = JSON.parseObject(s, JSONObject.class);
+        String data = JSON.toJSONString(jsonObject.get("data"));
+        return JSON.parseArray(data, VehicleReturnData.class);
     }
 
     public VehicleReturnData getVehicleReturnData(String truckId) {
@@ -349,7 +379,9 @@ public class kwfTruckTraceService {
         if (StringUtils.isBlank(s)){
             return null;
         }
-        return JSON.parseObject(s, VehicleReturnData.class);
+        JSONObject jsonObject = JSON.parseObject(s, JSONObject.class);
+        String data = JSON.toJSONString(jsonObject.get("data"));
+        return JSON.parseObject(data, VehicleReturnData.class);
     }
 
     private static CurrentTaskTraceReqVo.CurrentTaskTrace getCurrentTaskTrace(VehicleReturnData e) {

+ 1 - 0
sql/2025/10/30/2025_10_30_cxf_create.sql

@@ -10,6 +10,7 @@ create table kwf_truck_route
     start_point      varchar(400)  not null default '' comment '起始点',
     unloading_Point   varchar(400)  not null default '' comment '卸货地点',
     shortest_time varchar(10)        not null default  '' comment '最短时间',
+    point_info   text            null                 comment '详细点位信息',
     create_time datetime      not null default current_timestamp comment '创建时间',
     update_time datetime      not null default current_timestamp on update current_timestamp comment '更新时间',
     del_flag    tinyint       not null default 0 comment '是否删除(0未删除,1删除)'