فهرست منبع

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

zuy 2 سال پیش
والد
کامیت
c0155dd2c9

+ 3 - 3
admin/src/main/resources/application-dev.yml

@@ -83,18 +83,18 @@ spring:
         db-admin:
           url: jdbc:mysql://121.40.98.15:3307/charge_admin?serverTimezone=Asia/Shanghai
           username: kym
-          password: kx7#zFvS$$%uVDkZPk
+          password: KuaiyuMan/*-
           driver-class-name: com.mysql.cj.jdbc.Driver
         db-miniapp:
           url: jdbc:mysql://121.40.98.15:3307/charge_app?serverTimezone=Asia/Shanghai
           username: kym
-          password: kx7#zFvS$$%uVDkZPk
+          password: KuaiyuMan/*-
           driver-class-name: com.mysql.cj.jdbc.Driver
   data:
     redis:
       port: 6380
       host: 121.40.98.15
-      password: kuaiyuman@3rt
+      password: KtXA^Zx!TZmLEy(@JjB@2(TVG0kdy5)&
       database: 0
       lettuce:
         pool:

+ 2 - 1
common/src/main/java/com/kym/common/constant/ResponseEnum.java

@@ -53,7 +53,8 @@ public enum ResponseEnum implements BusinessExceptionAssert {
     // EN+
     EN_PLUS_API_EXCEPTION(90000, "接口数据异常"),
     EN_PLUS_QUERY_TOKEN_ERROR(90001, "TOKEN获取异常"),
-    EN_PLUS_PUSH_SIGN_FAIL(90002, "EN+推送数据验签失败");
+    EN_PLUS_PUSH_SIGN_FAIL(90002, "EN+推送数据验签失败"),
+    EN_PLUS_TOKEN_EXCEPTION(90003,"EN+TOKEN过期");
 
     private final Integer code;
     private final String message;

+ 36 - 13
miniapp/src/main/java/com/kym/miniapp/jobs/StartChargeDelayJob.java

@@ -1,7 +1,8 @@
 package com.kym.miniapp.jobs;
 
 import com.baomidou.dynamic.datasource.annotation.DS;
-import com.google.common.util.concurrent.RateLimiter;
+import com.kym.common.constant.ResponseEnum;
+import com.kym.common.exception.BusinessException;
 import com.kym.common.utils.CommUtil;
 import com.kym.entity.miniapp.ChargeOrder;
 import com.kym.entity.miniapp.delay.DelayChargeOrder;
@@ -17,6 +18,7 @@ import org.springframework.context.event.EventListener;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Component;
 
+import java.util.ArrayList;
 import java.util.concurrent.DelayQueue;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
@@ -32,8 +34,6 @@ import java.util.concurrent.Executors;
 @Scope(ConfigurableBeanFactory.SCOPE_SINGLETON) // 设置成单例
 public class StartChargeDelayJob implements DelayService<DelayChargeOrder> {
 
-    private final static RateLimiter rateLimiter = RateLimiter.create(4);
-
     /**
      * 预约订单队列
      */
@@ -45,6 +45,11 @@ public class StartChargeDelayJob implements DelayService<DelayChargeOrder> {
      */
     private final ExecutorService executor = Executors.newFixedThreadPool(1);
 
+    /**
+     * 重试列表
+     */
+    private ArrayList<String> retryList = new ArrayList<>();
+
     public StartChargeDelayJob(ChargeOrderService chargeOrderService, ChargeService chargeService) {
         this.chargeOrderService = chargeOrderService;
         this.chargeService = chargeService;
@@ -71,7 +76,6 @@ public class StartChargeDelayJob implements DelayService<DelayChargeOrder> {
                 .toList();
         var delayList = delayChargeOrderList.stream().map(delay -> new DelayedItem<>(delay, delay.getStartTime())).toList();
         START_DELAY_QUEUE.addAll(delayList);
-
         // 开启线程处理队列消息
         processDelayedOrders();
     }
@@ -81,14 +85,12 @@ public class StartChargeDelayJob implements DelayService<DelayChargeOrder> {
             executor.execute(() -> {
                 ThreadLocal<String> threadLocal = ThreadLocal.withInitial(() -> null); // 初始化为空值,避免使用new ThreadLocal()
                 log.info("预约启动充电处理线程:{}", Thread.currentThread().getName());
-                DelayedItem<DelayChargeOrder> delayedItem;
-
+                DelayedItem<DelayChargeOrder> delayedItem = null;
                 try {
                     delayedItem = START_DELAY_QUEUE.take();
                     log.info("出队预约充电订单:{},队列剩余:{}", delayedItem.data.getStartChargeSeq(), START_DELAY_QUEUE.size());
                     // 启动充电
                     var order = delayedItem.data;
-                    threadLocal.set(order.getStartChargeSeq());
                     chargeService.queryStartCharge(order.getUserId(), order.getConnectorId(), null, false, null, null);
                     log.info("预约充电启动成功:用户:{},订单号:{},预约启动时间:{}", order.getUserId(), order.getStartChargeSeq(), order.getStartTime());
                     // 线程休眠250ms
@@ -98,14 +100,27 @@ public class StartChargeDelayJob implements DelayService<DelayChargeOrder> {
                         log.error("预约充电队列take异常", e);
                     } else {
                         log.info("预约启动充电失败,订单号:{}", threadLocal.get());
+                        if (e instanceof BusinessException && (ResponseEnum.EN_PLUS_TOKEN_EXCEPTION.getCode().equals(((BusinessException) e).getCode()))) {
+                            if (retryList.contains(threadLocal.get())) {
+                                log.info("EN+ token异常,预约订单:{}已重试忽略", threadLocal.get());
+                                log.error(e.getMessage());
+                                // 启动失败将订单状态修改为充电状态已结束,订单状态已确认,结束原因:预约启动失败
+                                updateOrderStatus(threadLocal.get(), ChargeOrder.CHARGE_STATUS_已结束, ChargeOrder.ORDER_STATUS_失败, ChargeOrder.STOP_REASON_预约启动充电失败);
+                                retryList.remove(threadLocal.get());
+                                return;
+                            }
+                            log.info("EN+ token异常,预约订单:{},重试", threadLocal.get());
+                            // token异常就重新放入队列重试
+                            var success = addToDelayQueue(delayedItem);
+                            if (success) {
+                                retryList.add(threadLocal.get());
+                            }
+                            // 跳出本次循环
+                            return;
+                        }
                         log.error(e.getMessage());
                         // 启动失败将订单状态修改为充电状态已结束,订单状态已确认,结束原因:预约启动失败
-                        chargeOrderService.lambdaUpdate()
-                                .eq(ChargeOrder::getStartChargeSeq, threadLocal.get())
-                                .set(ChargeOrder::getChargeStatus, ChargeOrder.CHARGE_STATUS_已结束)
-                                .set(ChargeOrder::getOrderStatus, ChargeOrder.ORDER_STATUS_失败)
-                                .set(ChargeOrder::getStopReason, ChargeOrder.STOP_REASON_预约启动充电失败)
-                                .update();
+                        updateOrderStatus(threadLocal.get(), ChargeOrder.CHARGE_STATUS_已结束, ChargeOrder.ORDER_STATUS_失败, ChargeOrder.STOP_REASON_预约启动充电失败);
                     }
                 } finally {
                     threadLocal.remove();
@@ -122,6 +137,14 @@ public class StartChargeDelayJob implements DelayService<DelayChargeOrder> {
         }
     }
 
+    private void updateOrderStatus(String startChargeSeq, int chargeStatus, int orderStatus, int stopReason) {
+        chargeOrderService.lambdaUpdate()
+                .eq(ChargeOrder::getStartChargeSeq, startChargeSeq)
+                .set(ChargeOrder::getChargeStatus, chargeStatus)
+                .set(ChargeOrder::getOrderStatus, orderStatus)
+                .set(ChargeOrder::getStopReason, stopReason)
+                .update();
+    }
 
     @Override
     public boolean addToDelayQueue(DelayedItem<DelayChargeOrder> delayedItem) {

+ 3 - 3
miniapp/src/main/resources/application-dev.yml

@@ -83,18 +83,18 @@ spring:
         db-admin:
           url: jdbc:mysql://121.40.98.15:3307/charge_admin?tinyInt1isBit=false&serverTimezone=Asia/Shanghai
           username: kym
-          password: kx7#zFvS$$%uVDkZPk
+          password: KuaiyuMan/*-
           driver-class-name: com.mysql.cj.jdbc.Driver
         db-miniapp:
           url: jdbc:mysql://121.40.98.15:3307/charge_app
           username: kym
-          password: kx7#zFvS$$%uVDkZPk
+          password: KuaiyuMan/*-
           driver-class-name: com.mysql.cj.jdbc.Driver
   data:
     redis:
       port: 6380
       host: 121.40.98.15
-      password: kuaiyuman
+      password: KtXA^Zx!TZmLEy(@JjB@2(TVG0kdy5)&
       database: 10
       lettuce:
         pool:

+ 5 - 1
service/src/main/java/com/kym/service/enplus/impl/EnPlusServiceImpl.java

@@ -87,7 +87,11 @@ public class EnPlusServiceImpl implements EnPlusService {
             return response;
         } else {
             LOGGER.error(":url:{}\n params:{}\ntoken:{}\n返回信息:{}", url, params, token, response);
-            // todo 如果返回Ret=4002,token错误的情况下,删除redis中的token,如果是预约订单则将此订单设置为延迟启动
+            if(4002 == response.getRet() ){
+                // 如果返回Ret=4002,token错误的情况下,删除redis中的token,如果是预约订单则将此订单设置为延迟启动
+                redisTemplate.delete(RedisKeys.EN_PLUS_TOKEN);
+                throw new BusinessException(ResponseEnum.EN_PLUS_TOKEN_EXCEPTION);
+            }
             throw new BusinessException(ResponseEnum.EN_PLUS_API_EXCEPTION);
         }
     }