فهرست منبع

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

donglang 2 هفته پیش
والد
کامیت
5900ff3e6a

+ 2 - 2
sckw-auth/src/main/java/com/sckw/auth/service/impl/AuthServiceImpl.java

@@ -209,8 +209,8 @@ public class AuthServiceImpl implements IAuthService {
         }
 
         /*缓存信息**/
-        AsyncFactory.execute(new AsyncProcess(loginBase, user, null, enterprise, remoteUserService));
-
+//        AsyncFactory.execute(new AsyncProcess(loginBase, user, null, enterprise, remoteUserService));
+        new AsyncProcess(loginBase, user, null, enterprise, remoteUserService).run();
         /*数据组装**/
 
         LoginResVo1 loginRes = new LoginResVo1();

+ 10 - 2
sckw-common/sckw-common-core/src/main/java/com/sckw/core/utils/LocUtils.java

@@ -3,9 +3,12 @@ package com.sckw.core.utils;
 import java.io.IOException;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.LocalTime;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
 
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
@@ -72,8 +75,9 @@ public class LocUtils {
      * @param pointCount  需要生成的轨迹点数量
      * @return 包含轨迹点位和耗时的结果对象
      */
-    public static RouteResult getDrivingRoutePointsWithDuration(String startLng, String startLat, 
-                                                                 String endLng, String endLat, int pointCount) {
+    public static RouteResult getDrivingRoutePointsWithDuration(String startLng, String startLat,
+                                                                String endLng, String endLat, int pointCount,
+                                                                LocalDate date) {
         if (StringUtils.isBlank(startLng) || StringUtils.isBlank(startLat) 
                 || StringUtils.isBlank(endLng) || StringUtils.isBlank(endLat)) {
             return null;
@@ -114,6 +118,10 @@ public class LocUtils {
             // 从所有点位中均匀选取指定数量的点
             //List<RoutePoint> selectedPoints = selectUniformPoints(allPoints, pointCount);
             LocalDateTime now = LocalDateTime.now();
+            if (Objects.nonNull( date)){
+                now = date.atTime(LocalTime.now());
+            }
+
             for (int i = 0; i < allPoints.size(); i++) {
                 RoutePoint point = allPoints.get(i);
                 point.setTs(now.plusMinutes(i * 5L));

+ 4 - 2
sckw-modules/sckw-fleet/src/main/java/com/sckw/fleet/service/KwfTruckRouteService.java

@@ -316,7 +316,8 @@ public class KwfTruckRouteService {
                     startLat,
                     endLng,
                     endLat,
-                    20
+                    20,
+                    null
             );
 
             if (routeResult != null && com.sckw.core.utils.StringUtils.isNotBlank(routeResult.getPointInfo())) {
@@ -384,7 +385,8 @@ public class KwfTruckRouteService {
                         req.getStartLat(),
                         req.getEndLng(),
                         req.getEndLat(),
-                        20
+                        20,
+                         null
                 );
 
                 if (routeResult != null && StringUtils.isNotBlank(routeResult.getPointInfo())) {

+ 3 - 1
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/dubbo/TransportServiceImpl.java

@@ -1504,7 +1504,9 @@ public class TransportServiceImpl implements TransportRemoteService {
         if (CollectionUtils.isEmpty(logisticsOrderContracts)){
             return List.of();
         }
-        Map<Long, List<KwtLogisticsOrderContract>> logContractIdAndContractsMap = logisticsOrderContracts.stream().collect(Collectors.groupingBy(KwtLogisticsOrderContract::getContractId));
+
+        Map<Long, List<Long>> logContractIdAndContractsMap = logisticsOrderContracts.stream()
+                .collect(Collectors.groupingBy(KwtLogisticsOrderContract::getContractId, Collectors.mapping(KwtLogisticsOrderContract::getLOrderId, Collectors.toList())));
         List<Long> logIds = logisticsOrderContracts.stream()
                 .map(KwtLogisticsOrderContract::getLOrderId)
                 .distinct()

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

@@ -57,7 +57,7 @@ public class KwtVehicleExceptionRepository extends ServiceImpl<KwtVehicleExcepti
      * @return 分页结果
      */
     public IPage<KwtVehicleException> queryExceptionImagePage1(Long entId, Integer exceptionType,
-                                                              String truckNo, int pageNum, int pageSize) {
+                                                              String truckNo,String startDate,String endDate, int pageNum, int pageSize) {
         // 构建子查询条件:当前记录的异常时间等于该车牌号的最大异常时间
         // 使用 (truck_no, exception_time) IN 子查询来确保只查询每个车牌号最新的一条
         StringBuilder subQuery = new StringBuilder();
@@ -72,6 +72,12 @@ public class KwtVehicleExceptionRepository extends ServiceImpl<KwtVehicleExcepti
         if (Objects.nonNull(exceptionType)) {
             subQuery.append(" AND exception_type = ").append(exceptionType);
         }
+        if (StringUtils.isNotBlank(startDate)) {
+            subQuery.append(" AND exception_time >= '").append(startDate).append("'");
+        }
+        if (StringUtils.isNotBlank(endDate)) {
+            subQuery.append(" AND exception_time <= '").append(endDate).append("'");
+        }
         if (StringUtils.isNotBlank(truckNo)) {
             // 转义单引号防止 SQL 注入
             String escapedTruckNo = truckNo.replace("'", "''");

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

@@ -3191,7 +3191,7 @@ public class KwtLogisticsConsignmentService {
         logisticsOrderRepository.updateBatchById(logisticsOrders);
 
         //更新贸易订单数据
-        updateTradeOrder(tradeIds);
+       // updateTradeOrder(tradeIds);
         return Boolean.TRUE;
     }
 
@@ -3224,11 +3224,11 @@ public class KwtLogisticsConsignmentService {
 
         tradeOrderSettlePara.setTOrderId(tradeOrderId);
         BigDecimal loadAmount = orders.stream()
-                .filter(x -> Objects.nonNull(x.getLoadAmount()))
+                .filter(x -> Objects.nonNull(x.getTotalLoadAmount()))
                 .map(KwtLogisticsOrder::getLoadAmount)
                 .reduce(BigDecimal.ZERO, BigDecimal::add);
         BigDecimal unloadAmount = orders.stream()
-                .filter(x -> Objects.nonNull(x.getUnloadAmount()))
+                .filter(x -> Objects.nonNull(x.getTotalUnloadAmount()))
                 .map(KwtLogisticsOrder::getUnloadAmount)
                 .reduce(BigDecimal.ZERO, BigDecimal::add);
         tradeOrderSettlePara.setLoadAmount(loadAmount);

+ 42 - 40
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/KwtWaybillOrderV1Service.java

@@ -3657,6 +3657,7 @@ public class KwtWaybillOrderV1Service {
         if (Objects.isNull(subtask)){
             throw new BusinessException("子运单信息不存在");
         }
+        KwtLogisticsOrder kwtLogistics= kwtLogisticsOrderRepository.queryByLogisticsOrderId(subtask.getLOrderId());
         KwtWaybillOrder updateOrder = new KwtWaybillOrder();
         updateOrder.setId(billOrder.getId());
         KwtWaybillOrderSubtask updateSubtask = new KwtWaybillOrderSubtask();
@@ -3680,11 +3681,12 @@ public class KwtWaybillOrderV1Service {
                 updateSubtask.setUnloadUploadTime(DateUtils.parse(req.getUploadTime(), DateUtils.DATE_TIME_PATTERN));
             }
             boolean b = kwtWaybillOrderRepository.updateById(updateOrder) && kwtWaybillOrderSubtaskRepository.updateById(updateSubtask);
-            //修改物流订单数据
-            KwtLogisticsOrder kwtLogistics= kwtLogisticsOrderRepository.queryByLogisticsOrderId(subtask.getLOrderId());
             //获取更新 订单状态
-            KwtLogisticsOrder kwtLogisticsOrder = getKwtLogisticsOrder(kwtLogistics, subtask,status);
-            boolean b1 = kwtLogisticsOrderRepository.updateById(kwtLogisticsOrder);
+            if (Objects.equals(status, CarWaybillV1Enum.COMPLETED.getCode())){
+                KwtLogisticsOrder kwtLogisticsOrder = getKwtLogisticsOrder(kwtLogistics, subtask,status);
+                kwtLogisticsOrderRepository.updateById(kwtLogisticsOrder);
+            }
+
             //如果物流订单状态是已完成需要通知贸易订单完成
 
             // 存储记录
@@ -3697,7 +3699,7 @@ public class KwtWaybillOrderV1Service {
             }
 
             saveNode(billOrder, subtask, status,remark);
-            if (!b || !b1){
+            if (!b ){
                 throw new BusinessException("审核运单失败");
             }
             //查询司机是否存在已绑定的车辆
@@ -3737,31 +3739,45 @@ public class KwtWaybillOrderV1Service {
             }
             //如果审核的状态是 完成,那么就要去查询物流订单状态是完结中,并且所有物流订单下的运单全部是完成或者取消如果是则更新状态为已完成
             //修改物流订单数据
-            updateLogisticOrder(subtask);
+            KwtLogisticsOrder kwtLogisticsOrder = getKwtLogisticsOrder(kwtLogistics, subtask,status);
+            kwtLogisticsOrderRepository.updateById(kwtLogisticsOrder);
+           // updateLogisticOrder(subtask,kwtLogistics);
             //查询司机是否存在已绑定的车辆
             log.info("运单由审核驳回审核完成,解绑司机与车辆关系,运单id:{},企业id:{},司机id:{}", billOrder.getId(), billOrder.getEntId(), billOrder.getDriverId());
             remoteFleetService.unbindTruck(billOrder.getEntId(), billOrder.getDriverId());
             return Boolean.TRUE;
         }
+        noticeTraderOrder(status, subtask,kwtLogistics);
         //计算司机分值
         calculateAutoDispatchScore(billOrder, status);
 
         return Boolean.FALSE;
     }
 
-    private void updateLogisticOrder(KwtWaybillOrderSubtask subtask) {
-        KwtLogisticsOrder kwtLogistics= kwtLogisticsOrderRepository.queryByLogisticsOrderId(subtask.getLOrderId());
+    private void updateLogisticOrder(KwtWaybillOrderSubtask subtask,KwtLogisticsOrder kwtLogistics) {
         if (Objects.nonNull(kwtLogistics) && Objects.equals(kwtLogistics.getStatus(), LogisticsOrderV1Enum.NEARING_COMPLETION.getCode())){
             List<KwtWaybillOrderSubtask> waybillOrderSubtasks = kwtWaybillOrderSubtaskRepository.queryByLogId(subtask.getLOrderId());
             boolean b2 = waybillOrderSubtasks.stream()
                     .allMatch(x -> Arrays.asList(CarWaybillV1Enum.COMPLETED.getCode(), CarWaybillV1Enum.CANCELLED.getCode()).contains(x.getStatus()));
+            KwtLogisticsOrder logisticsOrder = new KwtLogisticsOrder();
+            logisticsOrder.setId(kwtLogistics.getId());
             if (b2){
-                KwtLogisticsOrder logisticsOrder = new KwtLogisticsOrder();
-                logisticsOrder.setId(kwtLogistics.getId());
                 logisticsOrder.setStatus(LogisticsOrderV1Enum.COMPLETED.getCode());
                 log.info("运单状态由审核驳回变成审核完成,修改物流订单状态为已完成,物流订单id:{}", kwtLogistics.getId());
-                kwtLogisticsOrderRepository.updateById(logisticsOrder);
+
             }
+            BigDecimal unloadAmount  = Objects.isNull(kwtLogistics.getUnloadAmount())  ? BigDecimal.ZERO: kwtLogistics.getUnloadAmount();
+            BigDecimal subUnloadAmount = Objects.isNull(subtask.getUnloadAmount()) ? BigDecimal.ZERO: subtask.getUnloadAmount();
+            BigDecimal entrustAmount  = Objects.isNull(kwtLogistics.getEntrustAmount())  ? BigDecimal.ZERO: kwtLogistics.getEntrustAmount();
+            BigDecimal subEntrustAmount = Objects.isNull(subtask.getEntrustAmount()) ? BigDecimal.ZERO: subtask.getEntrustAmount();
+            KwtLogisticsOrder kwtLogisticsOrder = new KwtLogisticsOrder();
+            kwtLogisticsOrder.setId(kwtLogistics.getId());
+            BigDecimal subtractAmount = entrustAmount.subtract(subEntrustAmount);
+            BigDecimal entrust = subtractAmount.compareTo(BigDecimal.ZERO) >= 0
+                    ? subtractAmount : new BigDecimal("0.00");
+            kwtLogisticsOrder.setEntrustAmount(entrust);
+            kwtLogisticsOrder.setTotalUnloadAmount(unloadAmount.add(subUnloadAmount));
+            kwtLogisticsOrderRepository.updateById(logisticsOrder);
         }
     }
 
@@ -4154,34 +4170,14 @@ public class KwtWaybillOrderV1Service {
     }
 
 
-    private void noticeTraderOrder(KwtLogisticsOrder kwtLogisticsOrder, KwtLogisticsOrder kwtLogistics) {
-
-        if (!Objects.equals(kwtLogisticsOrder.getStatus(),LogisticsOrderV1Enum.COMPLETED.getCode())){
+    private void noticeTraderOrder(Integer status, KwtWaybillOrderSubtask subtask,KwtLogisticsOrder kwtLogistics) {
+        if (!Objects.equals(status,CarWaybillV1Enum.COMPLETED.getCode())){
+            log.info("物流订单状态不是已完成,不通知贸易订单完结");
            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.COMPLETED.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);
+        tradeOrderSettlePara.setUnloadAmount(subtask.getUnloadAmount());
         log.info("运单审核通过修改贸易订单状态请求参数:{}",JSON.toJSONString(tradeOrderSettlePara));
         tradeOrderInfoService.orderSettle(tradeOrderSettlePara);
     }
@@ -4208,15 +4204,18 @@ public class KwtWaybillOrderV1Service {
             throw new BusinessException("物流订单信息不存在");
         }
         //调物流订单完结订单
-        BigDecimal loadAmount  = Objects.isNull(kwtLogistics.getLoadAmount())  ? BigDecimal.ZERO: kwtLogistics.getLoadAmount();
-        BigDecimal subLoadAmount = Objects.isNull(subtask.getLoadAmount()) ? BigDecimal.ZERO: subtask.getLoadAmount();
+       // BigDecimal loadAmount  = Objects.isNull(kwtLogistics.getLoadAmount())  ? BigDecimal.ZERO: kwtLogistics.getLoadAmount();
+       // BigDecimal subLoadAmount = Objects.isNull(subtask.getLoadAmount()) ? BigDecimal.ZERO: subtask.getLoadAmount();
         BigDecimal unloadAmount  = Objects.isNull(kwtLogistics.getUnloadAmount())  ? BigDecimal.ZERO: kwtLogistics.getUnloadAmount();
         BigDecimal subUnloadAmount = Objects.isNull(subtask.getUnloadAmount()) ? BigDecimal.ZERO: subtask.getUnloadAmount();
-
-
+        BigDecimal entrustAmount  = Objects.isNull(kwtLogistics.getEntrustAmount())  ? BigDecimal.ZERO: kwtLogistics.getEntrustAmount();
+        BigDecimal subEntrustAmount = Objects.isNull(subtask.getEntrustAmount()) ? BigDecimal.ZERO: subtask.getEntrustAmount();
         KwtLogisticsOrder kwtLogisticsOrder = new KwtLogisticsOrder();
         kwtLogisticsOrder.setId(kwtLogistics.getId());
-        kwtLogisticsOrder.setTotalLoadAmount(loadAmount.add(subLoadAmount));
+        BigDecimal subtractAmount = entrustAmount.subtract(subEntrustAmount);
+        BigDecimal entrust = subtractAmount.compareTo(BigDecimal.ZERO) >= 0
+                ? subtractAmount : new BigDecimal("0.00");
+        kwtLogisticsOrder.setEntrustAmount(entrust);
         kwtLogisticsOrder.setTotalUnloadAmount(unloadAmount.add(subUnloadAmount));
 
         //如果审核的状态是 完成,那么就要去查询物流订单状态是完结中,并且所有物流订单下的运单全部是完成或者取消如果是则更新状态为已完成
@@ -4327,6 +4326,9 @@ public class KwtWaybillOrderV1Service {
         waybillOrderNodeVo.setTimelines(voList);
         // 获取时间节点
         List<WaybillOrderNodeVo.WaybillOrderNode> nodeList = getWaybillOrderNodes(voList);
+        nodeList = nodeList.stream()
+                .sorted(Comparator.comparing(WaybillOrderNodeVo.WaybillOrderNode::getOrderStatus))
+                .collect(Collectors.toList());
         waybillOrderNodeVo.setWaybillOrderNodes(nodeList);
         return waybillOrderNodeVo;
     }

+ 19 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/VehicleExceptionService.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.sckw.core.model.enums.AddressTypeEnum;
+import com.sckw.core.utils.DateUtils;
 import com.sckw.core.web.response.BaseIotResult;
 import com.sckw.core.web.response.result.PageDataResult;
 import com.sckw.transport.api.feign.VehicleTraceClient;
@@ -61,6 +62,14 @@ public class VehicleExceptionService {
      */
     public PageDataResult<VehicleExceptionVo> queryExceptionList(VehicleExceptionQueryReq req) {
         log.info("分页查询车辆异常信息,参数:{}", JSON.toJSONString( req));
+        if (StringUtils.isBlank( req.getStartDate())){
+            String startDate = DateUtils.format(DateUtils.getStartOfDay(new Date()), DateUtils.DATE_TIME_PATTERN);
+            req.setStartDate(startDate);
+        }
+        if (StringUtils.isBlank( req.getEndDate())){
+            String endDate = DateUtils.format(DateUtils.getEndOfDay(new Date()), DateUtils.DATE_TIME_PATTERN);
+            req.setEndDate(endDate);
+        }
         // 分页查询异常图片数据
         IPage<KwtVehicleException> page = exceptionImageRepository.queryExceptionImagePage(
                 req.getEntId(),
@@ -257,11 +266,21 @@ public class VehicleExceptionService {
      */
     public PageDataResult<VehicleExceptionVo> exceptionJkList(VehicleExceptionQueryReq req) {
         log.info("分页查询车辆异常监控列表, req: {}", JSON.toJSONString( req));
+        if (StringUtils.isBlank( req.getStartDate())){
+            String startDate = DateUtils.format(DateUtils.getStartOfDay(new Date()), DateUtils.DATE_TIME_PATTERN);
+            req.setStartDate(startDate);
+        }
+        if (StringUtils.isBlank( req.getEndDate())){
+            String endDate = DateUtils.format(DateUtils.getEndOfDay(new Date()), DateUtils.DATE_TIME_PATTERN);
+            req.setEndDate(endDate);
+        }
         // 分页查询异常图片数据
         IPage<KwtVehicleException> page = exceptionImageRepository.queryExceptionImagePage1(
                 req.getEntId(),
                 req.getExceptionType(),
                 req.getTruckNo(),
+                req.getStartDate(),
+                req.getEndDate(),
                 req.getPageNum(),
                 req.getPageSize()
         );

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

@@ -1572,7 +1572,7 @@ public class kwfTruckTraceService {
              endLat = latitude;
         }
 
-        LocUtils.RouteResult routeResult = generateRoutePointsWithDuration(startLng, startLat, endLng, endLat);
+        LocUtils.RouteResult routeResult = generateRoutePointsWithDuration(startLng, startLat, endLng, endLat, date);
         if (routeResult == null || com.sckw.core.utils.StringUtils.isBlank(routeResult.getPointInfo())) {
             log.error("高德API生成轨迹点位失败,起点: {},{} 终点: {},{}", startLng, startLat, endLng, endLat);
             throw new BusinessException("生成轨迹失败:高德API生成轨迹点位失败");
@@ -1665,7 +1665,7 @@ public class kwfTruckTraceService {
     }
 
 
-    private LocUtils.RouteResult generateRoutePointsWithDuration(String startLng, String startLat, String endLng, String endLat) {
+    private LocUtils.RouteResult generateRoutePointsWithDuration(String startLng, String startLat, String endLng, String endLat,LocalDate date) {
         try {
             log.info("开始调用高德API生成轨迹点位和耗时,起点: {},{} 终点: {},{}",
                     startLng, startLat, endLng, endLat);
@@ -1676,7 +1676,8 @@ public class kwfTruckTraceService {
                     startLat,
                     endLng,
                     endLat,
-                    20
+                    20,
+                     date
             );
 
             if (routeResult != null && com.sckw.core.utils.StringUtils.isNotBlank(routeResult.getPointInfo())) {