Przeglądaj źródła

feat(charging): 改进充电状态及启动结果推送接口的异常处理

- 启动充电结果推送改用JSON格式请求体,支持异常捕获与日志记录
- 充电状态推送增加异常捕获,完善成功与失败日志打印
- 补偿订单任务改用异步执行,增强任务执行效率,支持线程池配置
- 用户退款逻辑新增检查正在充电订单,防止充值中订单退款
- UserFeedbackMapper查询默认添加按创建时间倒序排序
- 测试代码更新退款相关请求参数,确保参数正确性
wzq 1 tydzień temu
rodzic
commit
fc70752064

+ 24 - 2
src/main/java/com/zsElectric/boot/business/quartz/CompensateOrderJob.java

@@ -3,9 +3,14 @@ package com.zsElectric.boot.business.quartz;
 import com.zsElectric.boot.business.service.ChargeOrderInfoService;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
 import org.springframework.stereotype.Component;
 
+import java.util.concurrent.CompletableFuture;
+
 /**
  * 订单补偿定时任务
  * 针对异常订单做补偿机制
@@ -20,6 +25,10 @@ public class CompensateOrderJob {
 
     private final ChargeOrderInfoService chargeOrderInfoService;
 
+    @Autowired
+    @Qualifier("businessTaskExecutor")
+    private ThreadPoolTaskExecutor businessTaskExecutor;
+
     /**
      * 充电订单补偿定时任务 - 每10分钟执行一次
      * 查找状态为3(已完成)或5(未成功充电)且充电数据为0的订单
@@ -30,10 +39,23 @@ public class CompensateOrderJob {
         log.info("开始执行充电订单补偿定时任务");
 
         try {
-            String result = chargeOrderInfoService.compensateUnprocessedOrders();
-            log.info("充电订单补偿定时任务执行完成: {}", result);
+            CompletableFuture<String> stringCompletableFuture = executeTaskWithResult();
+            log.info("充电订单补偿定时任务执行完成: {}", stringCompletableFuture.get());
         } catch (Exception e) {
             log.error("执行充电订单补偿任务失败", e);
         }
     }
+
+    /**
+     * 执行有返回值的异步任务
+     */
+    public CompletableFuture<String> executeTaskWithResult() {
+        // 使用 supplyAsync 并指定自定义线程池
+        return CompletableFuture.supplyAsync(() -> {
+            // 这里是你的异步任务逻辑
+            System.out.println("执行线程: " + Thread.currentThread().getName());
+            String result = chargeOrderInfoService.compensateUnprocessedOrders();
+            return "处理结果: " + result;
+        }, businessTaskExecutor); // 关键:传入线程池实例
+    }
 }

+ 16 - 5
src/main/java/com/zsElectric/boot/business/service/WFTOrderService.java

@@ -793,6 +793,17 @@ public class WFTOrderService {
             log.info("当前用户一年内未支付任何券订单,无法进行退款操作!");
             throw new BusinessException("无法进行退款操作,请联系客服处理!");
         }
+
+        //查询是否存在正在充电的订单
+        List<ChargeOrderInfo> chargeOrderInfoList = chargeOrderInfoMapper.selectList(Wrappers.<ChargeOrderInfo>lambdaQuery()
+                .eq(ChargeOrderInfo::getUserId, userId)
+                .in(ChargeOrderInfo::getStatus, SystemConstants.STATUS_ONE, SystemConstants.STATUS_TWO)
+        );
+        if (CollUtil.isNotEmpty(chargeOrderInfoList)) {
+            log.info("当前用户存在正在充电的订单,无法进行退款操作!");
+            throw new BusinessException("当前用户存在正在充电的订单,无法进行退款操作!");
+        }
+
         for (UserOrderInfo userOrderInfo : userOrderInfoList) {
             if (refundMoney.compareTo(BigDecimal.ZERO) == 0) {
                 break;
@@ -1111,12 +1122,12 @@ public class WFTOrderService {
     public static void main(String[] args) throws IOException {
         SortedMap<String, String> params = new TreeMap<>();
         SwiftpassConfig swiftpassConfig = new SwiftpassConfig();
-        params.put("transaction_id", "2301202601162014907802");//商户订单号
-//        params.put("out_trade_no", "ZSWL20251201000000201343");//商户订单号
-        params.put("out_refund_no", "TK2301202601162014907802");//商户退款单号
+//        params.put("transaction_id", "2301202601162014907802");//商户订单号
+        params.put("out_trade_no", "ZSWL20251127000000019417");//商户订单号
+        params.put("out_refund_no", "TK20251127000000019417");//商户退款单号
         params.put("attach", "");//退款原因
-        params.put("total_fee", "3000");//原订单金额
-        params.put("refund_fee", "1904");//退款金额
+        params.put("total_fee", "10000");//原订单金额
+        params.put("refund_fee", "3118");//退款金额
         params.put("sign_type", "RSA_1_256");
         PayUtill payUtill = new PayUtill();
         swiftpassConfig.setKey("f5131b3f07acb965a59041b690a29911");

+ 22 - 2
src/main/java/com/zsElectric/boot/charging/service/impl/ChargingReceptionServiceImpl.java

@@ -3,10 +3,12 @@ package com.zsElectric.boot.charging.service.impl;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.util.ObjUtil;
 import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.json.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.google.gson.Gson;
 import com.zsElectric.boot.business.mapper.*;
 import com.zsElectric.boot.business.model.entity.*;
 import com.zsElectric.boot.business.service.ChargeOrderInfoService;
@@ -31,6 +33,7 @@ import com.zsElectric.boot.system.mapper.DictItemMapper;
 import com.zsElectric.boot.system.model.entity.DictItem;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.codehaus.jettison.json.JSONObject;
 import org.redisson.api.RLock;
 import org.redisson.api.RedissonClient;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -456,7 +459,17 @@ public class ChargingReceptionServiceImpl implements ChargingReceptionService {
                     map.put("startTime", startTime);
                     map.put("connectorId", chargeOrderInfo.getConnectorId());
                     map.put("jsonNode", jsonNode);
-                    okHttpUtil.doPostForm(firmInfo.getChannelUrl() + "/notification_start_charge_result", map, null);
+                    String url = firmInfo.getChannelUrl() + "/notification_start_charge_result";
+                    Gson gson = new Gson();
+                    String requestBody = gson.toJson(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);
+                    }
                 }
             }
             
@@ -844,7 +857,14 @@ public class ChargingReceptionServiceImpl implements ChargingReceptionService {
                     String channelUrl = firmInfo.getChannelUrl() + "/notification_equip_charge_status";
 
                     // 推送充电状态
-                    okHttpUtil.doPostForm(channelUrl, BeanUtil.beanToMap(chargeStatus), null);
+                    try {
+                        JsonNode response = okHttpUtil.doPostForm(channelUrl, BeanUtil.beanToMap(chargeStatus), null);
+                        log.info("推送充电状态成功 - startChargeSeq: {}, firmId: {}, channelUrl: {}, response: {}", 
+                                startChargeSeq, firmId, channelUrl, response);
+                    } catch (Exception e) {
+                        log.error("推送充电状态失败 - startChargeSeq: {}, firmId: {}, channelUrl: {}, 错误信息: {}", 
+                                startChargeSeq, firmId, channelUrl, e.getMessage(), e);
+                    }
 
                 }
             }

+ 1 - 0
src/main/resources/mapper/business/UserFeedbackMapper.xml

@@ -23,6 +23,7 @@
             c_user_feedback
         <where> is_deleted = 0
         </where>
+        ORDER BY create_time DESC
     </select>
 
 </mapper>