Переглянути джерело

收费系统新增停车场收费接口

donglang 5 годин тому
батько
коміт
8ea96addd9

+ 9 - 1
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/handler/ComeIntoHandler.java

@@ -20,14 +20,15 @@ import com.sckw.system.api.model.dto.res.SysDictResDto;
 import com.sckw.transport.model.*;
 import com.sckw.transport.model.enuma.WeighbridgeTypeEnum;
 import com.sckw.transport.model.param.WaybillOrderCmeIntoWeighParam;
+import com.sckw.transport.utils.ParkingNotificationAsyncService;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.util.*;
-import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
@@ -41,6 +42,10 @@ import java.util.stream.Collectors;
 @Service
 public class ComeIntoHandler extends AbstractWaybillOrderHandler<WaybillOrderCmeIntoWeighParam> {
 
+    @Autowired
+    private ParkingNotificationAsyncService parkingNotificationAsyncService;
+
+
     @Override
     protected KwtWaybillOrder getWaybillOrder(WaybillOrderCmeIntoWeighParam param) {
         return getWaybillOrder(param.getWaybillOrderId());
@@ -65,6 +70,9 @@ public class ComeIntoHandler extends AbstractWaybillOrderHandler<WaybillOrderCme
         if (waybillOrder.getIsExistWeighbridges()) {
             //第一次过磅
             firstWeighbridge(param, waybillOrder, orderTicket);
+
+            // 异步通知第三方车辆入场
+            parkingNotificationAsyncService.asyncEntryNotification(param, waybillOrder);
         } else {
             //第二次过磅
             laterWeighbridge(param,waybillOrder, orderTicket);

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

@@ -22,7 +22,7 @@ public class KwtParkingStrategySwitch implements Serializable {
     private Long id;
 
     /**
-     * 状态(0-关闭,1-开启)
+     * 服务费状态(0-关闭,1-开启)
      */
     private Integer status;
 
@@ -31,6 +31,11 @@ public class KwtParkingStrategySwitch implements Serializable {
      */
     private BigDecimal defaultFee;
 
+    /**
+     * 入场状态(0-关闭,1-开启)
+     */
+    private Integer intoStatus;
+
     /**
      * 创建人
      */

+ 6 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/OrderTakingResp.java

@@ -25,5 +25,11 @@ public class OrderTakingResp implements Serializable {
     @Schema(description = "运单id")
     private Long waybillOrderId;
 
+    /**
+     * 充值url
+     */
+    @Schema(description = "充值url")
+    private String chargeUrl;
+
 
 }

+ 7 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/model/param/ParkingStrategySwitchSaveParam.java

@@ -40,4 +40,11 @@ public class ParkingStrategySwitchSaveParam implements Serializable {
      * 默认费用
      */
     private BigDecimal defaultFee;
+
+    /**
+     * 入场状态开关(0-关闭、1-开启)
+     */
+    @NotNull(message = "入场状态开关不能为空")
+    @Schema(description = "入场状态开关")
+    private Integer intoStatus;
 }

+ 1 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/ParkingChangeStrategyService.java

@@ -345,6 +345,7 @@ public class ParkingChangeStrategyService {
         }
         strategySwitch.setStatus(param.getStatus());
         strategySwitch.setDefaultFee(param.getDefaultFee());
+        strategySwitch.setIntoStatus(param.getIntoStatus());
         parkingStrategySwitchRepository.updateById(strategySwitch);
     }
 

+ 6 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/app/GatekeeperOrderService.java

@@ -38,6 +38,7 @@ import com.sckw.transport.model.param.forklift.request.GatekeeperOrderPassReason
 import com.sckw.transport.model.param.forklift.request.GatekeeperOrderQueryParam;
 import com.sckw.transport.model.vo.StatisticsWaybillResp;
 import com.sckw.transport.repository.*;
+import com.sckw.transport.utils.ParkingNotificationAsyncService;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboReference;
@@ -77,6 +78,8 @@ public class GatekeeperOrderService {
     private final KwtWaybillOrderWeighbridgeRepository waybillOrderWeighbridgeRepository;
     @Autowired
     protected KwtLogisticsOrderUnitRepository logisticsOrderUnitRepository;
+    @Autowired
+    private ParkingNotificationAsyncService parkingNotificationAsyncService;
 
     @DubboReference(version = "1.0.0", group = "design", check = false)
     private RemoteContractService remoteContractService;
@@ -1006,6 +1009,9 @@ public class GatekeeperOrderService {
 
         //4. 创建门卫卸货订单
 //        creatGatekeeperUnLoadingOrder(gatekeeper, waybillOrder);
+
+        // 异步通知第三方出场收费接口
+        parkingNotificationAsyncService.asyncExitNotification(waybillOrder, gatekeeper, isEmptyLoadLeave);
     }
 
     /**

+ 45 - 1
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/service/app/WaybillOrderService.java

@@ -36,6 +36,7 @@ import com.sckw.transport.model.vo.OrderTotalTakeVo;
 import com.sckw.transport.model.vo.StatisticsWaybillResp;
 import com.sckw.transport.repository.*;
 import com.sckw.transport.service.KwtWaybillOrderV1Service;
+import com.sckw.transport.service.ParkingPlateInfoService;
 import jakarta.annotation.Resource;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -78,6 +79,8 @@ public class WaybillOrderService {
     private final KwtWaybillOrderNodeRepository waybillOrderNodeRepository;
     private final KwtWaybillOrderWeighbridgeRepository waybillOrderWeighbridgeRepository;
     private final KwtLogisticsOrderContractRepository logisticsOrderContractRepository;
+    private final KwtParkingStrategySwitchRepository parkingStrategySwitchRepository;
+    private final ParkingPlateInfoService parkingPlateInfoService;
 
     @DubboReference(version = "1.0.0", group = "design", check = false, timeout = 6000)
     RemoteSystemService remoteSystemService;
@@ -1597,7 +1600,7 @@ public class WaybillOrderService {
             checkIdempotent(param);
 
             // 5. 执行接单
-            return takingOrderHandler.handler(param);
+            return takingOrder(param);
 
         } finally {
             // 6. 释放分布式锁
@@ -1608,6 +1611,47 @@ public class WaybillOrderService {
         }
     }
 
+    /**
+     * 接单
+     * @param param
+     */
+    private OrderTakingResp takingOrder(OrderCirculateTakingQueryParam param) {
+        // 访问第三方接口,校验车辆费用情况
+        ParkingPlatformResult<PlateInfoResp> result = checkTruckFee(param);
+        boolean isAvailable = (result == null || Objects.equals(1, result.getData().getAcceptOrder()));
+        log.info("调用第三方接口校验车辆是否可以通行,reslt:{}", isAvailable);
+        if (isAvailable) {
+           return takingOrderHandler.handler(param);
+        } else {
+            OrderTakingResp resp = new OrderTakingResp();
+            resp.setChargeUrl(result.getData().getChargeUrl());
+            return resp;
+        }
+    }
+
+    /**
+     * 校验车辆是否在车场有效期、充值缴费、是否是免费车
+     * @param param
+     */
+    private ParkingPlatformResult<PlateInfoResp> checkTruckFee(OrderCirculateTakingQueryParam param) {
+        KwtParkingStrategySwitch strategySwitch = parkingStrategySwitchRepository.queryParkingStrategySwitch();
+        // 入场收费开关关闭,不校验
+        if (strategySwitch == null || Objects.equals(strategySwitch.getIntoStatus(), 0)) {
+            log.info("入场收费开关,reslt:{}", "关闭");
+            return null;
+        }
+
+        // 校验
+        PlateInfoQueryParam queryParam = new PlateInfoQueryParam();
+        queryParam.setCarLicense(param.getTruckNo());
+        ParkingPlatformResult<PlateInfoResp> parkingPlatformResult = parkingPlateInfoService.queryPlateInfo(queryParam);
+        if (parkingPlatformResult == null || parkingPlatformResult.getData() == null) {
+            throw new BusinessPlatfromException(ErrorCodeEnum.WAYBILL_ORDER_NOT_UNFINISHED, "第三发车辆信息查询接口,当前车辆未查出信息");
+        }
+        log.info("校验车辆是否在车场有效期,reslt:{}", JSON.toJSONString(parkingPlatformResult));
+        return parkingPlatformResult;
+    }
+
     /**
      * 幂等性校验:检查是否已经存在该车辆针对该物流订单的有效运单
      * @param param 接单参数

+ 76 - 0
sckw-modules/sckw-transport/src/main/java/com/sckw/transport/utils/ParkingNotificationAsyncService.java

@@ -0,0 +1,76 @@
+package com.sckw.transport.utils;
+
+import com.alibaba.fastjson.JSON;
+import com.sckw.transport.model.KwtGatekeeperWaybillOrder;
+import com.sckw.transport.model.KwtParkingStrategySwitch;
+import com.sckw.transport.model.KwtWaybillOrder;
+import com.sckw.transport.model.param.EntryNotificationParam;
+import com.sckw.transport.model.param.ExitNotificationParam;
+import com.sckw.transport.model.param.WaybillOrderCmeIntoWeighParam;
+import com.sckw.transport.repository.KwtParkingStrategySwitchRepository;
+import com.sckw.transport.service.ParkingPlateInfoService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Async;
+import org.springframework.stereotype.Service;
+
+import java.util.Objects;
+
+@Service
+@Slf4j
+public class ParkingNotificationAsyncService {
+
+    @Autowired
+    private ParkingPlateInfoService parkingPlateInfoService;
+    @Autowired
+    private KwtParkingStrategySwitchRepository parkingStrategySwitchRepository;
+
+    /**
+     * 异步通知第三方车辆入场
+     * 注意:此方法必须放在另一个 Bean 中,否则 @Async 会失效
+     */
+    @Async
+    public void asyncEntryNotification(WaybillOrderCmeIntoWeighParam param, KwtWaybillOrder waybillOrder) {
+        try {
+            log.info("异步调用第三方车辆入场通知接口,运单号:{}", waybillOrder.getId());
+
+            EntryNotificationParam entryParam = new EntryNotificationParam();
+            entryParam.setCarLicense(param.getTruckNo());
+            entryParam.setGateId(String.valueOf(param.getWeighbridgeId()));
+            entryParam.setBusinessId(waybillOrder.getWOrderNo());
+
+            parkingPlateInfoService.entryNotification(entryParam);
+            log.info("异步调用第三方车辆入场通知接口成功,运单号:{}", waybillOrder.getId());
+        } catch (Exception e) {
+            log.error("异步通知第三方车辆入场失败, 运单号: {}, 车牌号: {}", waybillOrder.getWOrderNo(), param.getTruckNo(), e);
+        }
+    }
+
+    /**
+     * 异步通知第三方出场扣费
+     * 注意:此方法必须放在另一个 Bean 中,否则 @Async 会失效
+     */
+    @Async
+    public void asyncExitNotification(KwtWaybillOrder waybillOrder, KwtGatekeeperWaybillOrder gatekeeperWaybillOrder, Boolean isEmptyLoadLeave) {
+        try {
+            log.info("异步调用第三方车辆出场扣费通知接口,运单号:{}", waybillOrder.getId());
+            KwtParkingStrategySwitch strategySwitch = parkingStrategySwitchRepository.queryParkingStrategySwitch();
+            // 入场收费开关关闭,不做扣费
+            if (strategySwitch == null || Objects.equals(strategySwitch.getIntoStatus(), 0)) {
+                log.info("入场收费开关,reslt:{}", "关闭");
+                return;
+            }
+
+            ExitNotificationParam exitParam = new ExitNotificationParam();
+            exitParam.setCarLicense(waybillOrder.getTruckNo());
+            exitParam.setGateId(String.valueOf(gatekeeperWaybillOrder.getWeighbridgeId()));
+            exitParam.setBusinessId(gatekeeperWaybillOrder.getWOrderNo());
+            exitParam.setNeedDeduct(isEmptyLoadLeave ? 0 : 1);
+
+            parkingPlateInfoService.exitNotification(exitParam);
+            log.error("异步调用第三方车辆出场扣款通知接口成功, 运单号: {}, 车牌号: {}, 是否空载:{}", waybillOrder.getWOrderNo(), waybillOrder.getTruckNo(), isEmptyLoadLeave);
+        } catch (Exception e) {
+            log.error("异步调用第三方车辆出场扣款通知失败, 运单号: {}, 车牌号: {}", waybillOrder.getWOrderNo(), waybillOrder.getTruckNo(), e);
+        }
+    }
+}

+ 9 - 8
sql/2026/01/2026_01_06_donglang_create.sql

@@ -163,14 +163,15 @@ CREATE TABLE `kwt_parking_wallet_fee_balance` (
 ) comment '预存服务费明细';
 
 CREATE TABLE `kwt_parking_strategy_switch` (
-                                                  `id`                            bigint          NOT NULL AUTO_INCREMENT COMMENT '主键',
-                                                   status                          int             NOT NULL DEFAULT '0' COMMENT '状态(0-关闭,1-开启)',
-                                                   default_fee                decimal(16,2)   NOT NULL DEFAULT '0.00' COMMENT '默认服务费',
-                                                  create_time                     datetime        NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
-                                                  update_time                     datetime        NOT NULL DEFAULT CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP COMMENT '更新时间',
-                                                  create_user                     bigint          NOT NULL DEFAULT '-1' COMMENT '创建人',
-                                                  update_user                     bigint          NOT NULL DEFAULT '-1' COMMENT '更新人',
-                                                  PRIMARY KEY (`id`) USING BTREE
+                                            `id`                            bigint          NOT NULL AUTO_INCREMENT COMMENT '主键',
+                                            status                          int             NOT NULL DEFAULT '0' COMMENT '服务费状态(0-关闭,1-开启)',
+                                            default_fee                     decimal(16,2)   NOT NULL DEFAULT '0.00' COMMENT '默认服务费',
+                                            into_status                     int             NOT NULL DEFAULT '0' COMMENT '入参状态(0-关闭,1-开启)',
+                                            create_time                     datetime        NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+                                            update_time                     datetime        NOT NULL DEFAULT CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP COMMENT '更新时间',
+                                            create_user                     bigint          NOT NULL DEFAULT '-1' COMMENT '创建人',
+                                            update_user                     bigint          NOT NULL DEFAULT '-1' COMMENT '更新人',
+                                            PRIMARY KEY (`id`) USING BTREE
 ) comment '收费策开关表';