ソースを参照

提交全图监控

chenxiaofei 1 ヶ月 前
コミット
439d7ca4b8

+ 10 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/controller/KwfTruckTraceController.java

@@ -106,6 +106,16 @@ public class KwfTruckTraceController {
         return BaseResult.success(vehicleExceptionService.queryExceptionList(req));
     }
 
+    /**
+     * 分页查询车辆异常图片信息
+     */
+    @PostMapping("/exceptionJkList")
+    @Operation(summary = "车辆异常唯一车牌列表", description = "根据运输企业ID、异常类型、车牌号、定位状态分页查询车辆异常图片信息")
+    public BaseResult<PageDataResult<VehicleExceptionVo>> exceptionJkList(@RequestBody VehicleExceptionQueryReq req) {
+        return BaseResult.success(vehicleExceptionService.exceptionJkList(req));
+    }
+
+
     /**
      * 生成车辆轨迹
      */

+ 45 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/repository/KwtVehicleExceptionRepository.java

@@ -42,6 +42,51 @@ public class KwtVehicleExceptionRepository extends ServiceImpl<KwtVehicleExcepti
                         .like(StringUtils.isNotBlank(truckNo), KwtVehicleException::getTruckNo, truckNo)
                         .orderByDesc(KwtVehicleException::getExceptionTime));
     }
+
+    /**
+     * 分页查询每个车牌号异常时间最新的一条记录
+     * 使用子查询确保每个车牌号只返回异常时间最新的一条记录
+     *
+     * @param entId          企业ID
+     * @param exceptionType  异常类型
+     * @param truckNo        车牌号
+     * @param pageNum        页码
+     * @param pageSize       每页数量
+     * @return 分页结果
+     */
+    public IPage<KwtVehicleException> queryExceptionImagePage1(Long entId, Integer exceptionType,
+                                                              String truckNo, int pageNum, int pageSize) {
+        // 构建子查询条件:当前记录的异常时间等于该车牌号的最大异常时间
+        // 使用 (truck_no, exception_time) IN 子查询来确保只查询每个车牌号最新的一条
+        StringBuilder subQuery = new StringBuilder();
+        subQuery.append("(truck_no, exception_time) IN (");
+        subQuery.append("SELECT truck_no, MAX(exception_time) ");
+        subQuery.append("FROM kwt_vehicle_exception ");
+        subQuery.append("WHERE del_flag = 0");
+        
+        if (Objects.nonNull(entId)) {
+            subQuery.append(" AND ent_id = ").append(entId);
+        }
+        if (Objects.nonNull(exceptionType)) {
+            subQuery.append(" AND exception_type = ").append(exceptionType);
+        }
+        if (StringUtils.isNotBlank(truckNo)) {
+            // 转义单引号防止 SQL 注入
+            String escapedTruckNo = truckNo.replace("'", "''");
+            subQuery.append(" AND truck_no LIKE '%").append(escapedTruckNo).append("%'");
+        }
+        
+        subQuery.append(" GROUP BY truck_no)");
+        
+        return page(new Page<>(pageNum, pageSize),
+                Wrappers.<KwtVehicleException>lambdaQuery()
+                        .eq(KwtVehicleException::getDelFlag, 0)
+                        .eq(Objects.nonNull(entId), KwtVehicleException::getEntId, entId)
+                        .eq(Objects.nonNull(exceptionType), KwtVehicleException::getExceptionType, exceptionType)
+                        .like(StringUtils.isNotBlank(truckNo), KwtVehicleException::getTruckNo, truckNo)
+                        .apply(subQuery.toString())
+                        .orderByDesc(KwtVehicleException::getExceptionTime));
+    }
     
     /**
      * 批量查询运单的异常数量

+ 43 - 1
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/VehicleExceptionService.java

@@ -6,7 +6,6 @@ import com.sckw.core.web.response.result.PageDataResult;
 import com.sckw.transport.api.feign.VehicleTraceClient;
 import com.sckw.transport.api.model.dto.VehicleDataDTO;
 import com.sckw.transport.api.model.dto.VehicleReturnData;
-import com.sckw.core.web.response.BaseResult;
 import com.sckw.transport.model.KwtVehicleException;
 import com.sckw.transport.model.dto.VehicleExceptionQueryReq;
 import com.sckw.transport.model.enuma.VehicleExceptionTypeEnum;
@@ -164,4 +163,47 @@ public class VehicleExceptionService {
         
         return locationStatusMap;
     }
+
+    public PageDataResult<VehicleExceptionVo> exceptionJkList(VehicleExceptionQueryReq req) {
+        // 分页查询异常图片数据
+        IPage<KwtVehicleException> page = exceptionImageRepository.queryExceptionImagePage1(
+                req.getEntId(),
+                req.getExceptionType(),
+                req.getTruckNo(),
+                req.getPageNum(),
+                req.getPageSize()
+        );
+
+        List<KwtVehicleException> records = page.getRecords();
+        if (CollectionUtils.isEmpty(records)) {
+            return PageDataResult.empty(req.getPageNum(), req.getPageSize());
+        }
+
+        // 如果有定位状态筛选,需要查询车辆实时定位
+        Map<String, Integer> truckLocationStatusMap = new HashMap<>();
+        if (req.getLocationStatus() != null) {
+            List<String> truckNos = records.stream()
+                    .map(KwtVehicleException::getTruckNo)
+                    .distinct()
+                    .collect(Collectors.toList());
+
+            truckLocationStatusMap = queryVehicleLocationStatus(truckNos);
+        }
+
+        // 转换为VO
+        final Map<String, Integer> finalLocationStatusMap = truckLocationStatusMap;
+        List<VehicleExceptionVo> voList = records.stream()
+                .map(image -> buildVehicleExceptionVo(image, finalLocationStatusMap))
+                .filter(Objects::nonNull)
+                .collect(Collectors.toList());
+
+        // 如果有定位状态筛选,过滤结果
+        if (req.getLocationStatus() != null) {
+            voList = voList.stream()
+                    .filter(vo -> req.getLocationStatus().equals(vo.getLocationStatus()))
+                    .collect(Collectors.toList());
+        }
+
+        return PageDataResult.of(page, voList);
+    }
 }

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

@@ -548,8 +548,8 @@ public class kwfTruckTraceService {
         try {
             // 使用 Feign 调用查询实时位置
             BaseIotResult<VehicleReturnData> result = vehicleTraceClient.queryRealTimeLocation(vehicleDataDTO);
-
-            if (result == null || result.getCode() != "0" || result.getData() == null) {
+            log.info("查询实时轨迹返回数据: {}", JSON.toJSONString( result));
+            if (result == null || !Objects.equals(result.getCode(), "0") || result.getData() == null) {
                 log.warn("查询实时轨迹返回空数据, 车牌号: {}", truckId);
                 return null;
             }