Просмотр исходного кода

fix(charging): 优化渠道方推送接口增加重试机制

- 修改ChargeOrderInfoMapper XML,订单类型为2时使用订单手机号替代用户手机号
- 调整ChargeOrderInfoServiceImpl条件查询,补偿状态为0或空时才处理
- 在ChargingReceptionServiceImpl中给推送渠道方充电订单信息、启动充电结果和停止充电结果接口添加3次重试机制
- 重试过程增加5秒间隔,捕获中断异常并记录日志
- 修复判断渠道订单类型时避免空指针异常增加非空校验
wzq 1 день назад
Родитель
Сommit
cc5ae5602f

+ 5 - 1
src/main/java/com/zsElectric/boot/business/service/impl/ChargeOrderInfoServiceImpl.java

@@ -1090,7 +1090,11 @@ public class ChargeOrderInfoServiceImpl extends ServiceImpl<ChargeOrderInfoMappe
                 .and(wrapper -> wrapper
                         .isNull(ChargeOrderInfo::getThirdPartyServerfee)
                         .or()
-                        .eq(ChargeOrderInfo::getThirdPartyServerfee, BigDecimal.ZERO)));
+                        .eq(ChargeOrderInfo::getThirdPartyServerfee, BigDecimal.ZERO))
+                // 补偿状态为0或null
+                .and(wrapper -> wrapper
+                        .eq(ChargeOrderInfo::getCompensateStatus, BigDecimal.ZERO))
+        );
         
         if (unprocessedOrders.isEmpty()) {
             log.info("充电订单补偿定时任务: 没有找到需要补偿的订单");

+ 66 - 23
src/main/java/com/zsElectric/boot/charging/service/impl/ChargingReceptionServiceImpl.java

@@ -187,14 +187,28 @@ public class ChargingReceptionServiceImpl implements ChargingReceptionService {
                             FirmInfo firmInfo = firmInfoMapper.selectById(chargeOrderInfo.getFirmId());
                             String requestBody = com.alibaba.fastjson2.JSONObject.toJSONString(map);
                             if (ObjectUtil.isNotNull(firmInfo)) {
-                                try {
-                                    JsonNode response = okHttpUtil.doPostJson(firmInfo.getChannelUrl() + "/notification_charge_order_info", requestBody, null);
-                                    log.info("渠道方推送充电订单信息成功 - chargeOrderNo: {}, firmId: {}, response: {}", 
-                                            chargeOrderInfo.getChargeOrderNo(), chargeOrderInfo.getFirmId(), response);
-                                } catch (Exception e) {
-                                    log.error("渠道方推送充电订单信息失败 - chargeOrderNo: {}, firmId: {}, channelUrl: {}, 错误信息: {}", 
-                                            chargeOrderInfo.getChargeOrderNo(), chargeOrderInfo.getFirmId(), 
-                                            firmInfo.getChannelUrl() + "/notification_charge_order_info", e.getMessage(), e);
+                                String url = firmInfo.getChannelUrl() + "/notification_charge_order_info";
+                                int maxRetries = 3;
+                                int retryIntervalMs = 5000;
+                                for (int attempt = 1; attempt <= maxRetries; attempt++) {
+                                    try {
+                                        JsonNode response = okHttpUtil.doPostJson(url, requestBody, null);
+                                        log.info("渠道方推送充电订单信息成功 - chargeOrderNo: {}, firmId: {}, response: {}", 
+                                                chargeOrderInfo.getChargeOrderNo(), chargeOrderInfo.getFirmId(), response);
+                                        break;
+                                    } catch (Exception e) {
+                                        log.error("渠道方推送充电订单信息失败(第{}次) - chargeOrderNo: {}, firmId: {}, channelUrl: {}, 错误信息: {}", 
+                                                attempt, chargeOrderInfo.getChargeOrderNo(), chargeOrderInfo.getFirmId(), url, e.getMessage(), e);
+                                        if (attempt < maxRetries) {
+                                            try {
+                                                Thread.sleep(retryIntervalMs);
+                                            } catch (InterruptedException ie) {
+                                                Thread.currentThread().interrupt();
+                                                log.warn("重试等待被中断 - chargeOrderNo: {}", chargeOrderInfo.getChargeOrderNo());
+                                                break;
+                                            }
+                                        }
+                                    }
                                 }
                             } else {
                                 log.warn("渠道方推送充电订单信息失败 - firmInfo为空, chargeOrderNo: {}, firmId: {}", 
@@ -462,13 +476,27 @@ public class ChargingReceptionServiceImpl implements ChargingReceptionService {
                     String url = firmInfo.getChannelUrl() + "/notification_start_charge_result";
                     String requestBody = com.alibaba.fastjson2.JSONObject.toJSONString(map);
 
-                    try {
-                        JsonNode response = okHttpUtil.doPostJson(url, requestBody, null);
-                        log.info("推送启动充电结果成功 - StartChargeSeq: {}, chargeOrderNo: {}, url: {}, response: {}",
-                                startChargeSeq, chargeOrderInfo.getChargeOrderNo(), url, response);
-                    } catch (Exception e) {
-                        log.error("推送启动充电结果失败 - StartChargeSeq: {}, chargeOrderNo: {}, url: {}, requestBody: {}",
-                                startChargeSeq, chargeOrderInfo.getChargeOrderNo(), url, requestBody, e);
+                    int maxRetries = 3;
+                    int retryIntervalMs = 5000;
+                    for (int attempt = 1; attempt <= maxRetries; attempt++) {
+                        try {
+                            JsonNode response = okHttpUtil.doPostJson(url, requestBody, null);
+                            log.info("推送启动充电结果成功 - StartChargeSeq: {}, chargeOrderNo: {}, url: {}, response: {}",
+                                    startChargeSeq, chargeOrderInfo.getChargeOrderNo(), url, response);
+                            break;
+                        } catch (Exception e) {
+                            log.error("推送启动充电结果失败(第{}次) - StartChargeSeq: {}, chargeOrderNo: {}, url: {}, requestBody: {}",
+                                    attempt, startChargeSeq, chargeOrderInfo.getChargeOrderNo(), url, requestBody, e);
+                            if (attempt < maxRetries) {
+                                try {
+                                    Thread.sleep(retryIntervalMs);
+                                } catch (InterruptedException ie) {
+                                    Thread.currentThread().interrupt();
+                                    log.warn("重试等待被中断 - StartChargeSeq: {}", startChargeSeq);
+                                    break;
+                                }
+                            }
+                        }
                     }
                 }
             }
@@ -559,13 +587,28 @@ public class ChargingReceptionServiceImpl implements ChargingReceptionService {
                                         map.put("status", SystemConstants.STATUS_TWO);
                                         String url = firmInfo.getChannelUrl() + "/notification_stop_charge_result";
                                         String requestBody = new JSONObject(map).toString();
-                                        try {
-                                            JsonNode response = okHttpUtil.doPostJson(url, requestBody, null);
-                                            log.info("推送停止充电结果成功 - StartChargeSeq: {}, chargeOrderNo: {}, url: {}, response: {}",
-                                                    startChargeSeq, chargeOrderInfo.getChargeOrderNo(), url, response);
-                                        } catch (Exception e) {
-                                            log.error("推送停止充电结果失败 - StartChargeSeq: {}, chargeOrderNo: {}, url: {}, params: {}",
-                                                    startChargeSeq, chargeOrderInfo.getChargeOrderNo(), url, map, e);
+                                        
+                                        int maxRetries = 3;
+                                        int retryIntervalMs = 5000;
+                                        for (int attempt = 1; attempt <= maxRetries; attempt++) {
+                                            try {
+                                                JsonNode response = okHttpUtil.doPostJson(url, requestBody, null);
+                                                log.info("推送停止充电结果成功 - StartChargeSeq: {}, chargeOrderNo: {}, url: {}, response: {}",
+                                                        startChargeSeq, chargeOrderInfo.getChargeOrderNo(), url, response);
+                                                break;
+                                            } catch (Exception e) {
+                                                log.error("推送停止充电结果失败(第{}次) - StartChargeSeq: {}, chargeOrderNo: {}, url: {}, params: {}",
+                                                        attempt, startChargeSeq, chargeOrderInfo.getChargeOrderNo(), url, map, e);
+                                                if (attempt < maxRetries) {
+                                                    try {
+                                                        Thread.sleep(retryIntervalMs);
+                                                    } catch (InterruptedException ie) {
+                                                        Thread.currentThread().interrupt();
+                                                        log.warn("重试等待被中断 - StartChargeSeq: {}", startChargeSeq);
+                                                        break;
+                                                    }
+                                                }
+                                            }
                                         }
                                     }
                                 }
@@ -836,7 +879,7 @@ public class ChargingReceptionServiceImpl implements ChargingReceptionService {
             }
 
             //异步推送渠道方充电状态
-            if(SystemConstants.CHARGE_ORDER_TYPE_CHANNEL.equals(chargeOrderInfo.getOrderType())){
+            if(ObjectUtil.isNotEmpty(chargeOrderInfo) && SystemConstants.CHARGE_ORDER_TYPE_CHANNEL.equals(chargeOrderInfo.getOrderType())){
                 pushChargeStatusTask(startChargeSeq, chargeStatus);
             }
 

+ 2 - 2
src/main/resources/mapper/business/ChargeOrderInfoMapper.xml

@@ -21,7 +21,7 @@
         coi.total_charge,
         coi.real_cost,
         coi.real_service_cost,
-        ui.phone AS phoneNum,
+        CASE WHEN coi.order_type = 2 THEN coi.phone_num ELSE ui.phone END AS phoneNum,
         coi.plate_num,
         coi.stop_reason,
         coi.charge_details,
@@ -189,7 +189,7 @@
         coi.total_charge,
         coi.real_cost,
         coi.real_service_cost,
-        ui.phone AS phoneNum,
+        CASE WHEN coi.order_type = 2 THEN coi.phone_num ELSE ui.phone END AS phoneNum,
         coi.plate_num,
         coi.stop_reason,
         coi.charge_details,