From 7be5c390d12c7fa93c71720d2043308526e68bac Mon Sep 17 00:00:00 2001
From: puzhibing <393733352@qq.com>
Date: 星期三, 25 三月 2026 01:14:20 +0800
Subject: [PATCH] 添加事务和redis锁

---
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java | 1381 +++++++++++++++++-----------------
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TShoppingOrderServiceImpl.java |   31 
 ruoyi-service/ruoyi-account/pom.xml                                                                 |    5 
 ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppCouponController.java    |   32 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/task/TaskUtil.java                     |  841 +++++++++++----------
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderInvoiceServiceImpl.java  |    2 
 ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml                  |   11 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java    |   19 
 8 files changed, 1,194 insertions(+), 1,128 deletions(-)

diff --git a/ruoyi-service/ruoyi-account/pom.xml b/ruoyi-service/ruoyi-account/pom.xml
index dc21302..29abee0 100644
--- a/ruoyi-service/ruoyi-account/pom.xml
+++ b/ruoyi-service/ruoyi-account/pom.xml
@@ -168,6 +168,11 @@
             <scope>system</scope>
             <systemPath>${project.basedir}/lib/java-sdk-core-3.2.5.jar</systemPath>
         </dependency>
+        <dependency>
+            <groupId>org.redisson</groupId>
+            <artifactId>redisson-spring-boot-starter</artifactId>
+            <version>3.16.8</version>
+        </dependency>
     </dependencies>
 
     <build>
diff --git a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppCouponController.java b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppCouponController.java
index f42acae..a14bcc0 100644
--- a/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppCouponController.java
+++ b/ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppCouponController.java
@@ -20,6 +20,7 @@
 import com.ruoyi.common.log.annotation.Log;
 import com.ruoyi.common.log.enums.BusinessType;
 import com.ruoyi.common.log.enums.OperatorType;
+import com.ruoyi.common.redis.service.RedisService;
 import com.ruoyi.common.security.utils.SecurityUtils;
 import com.ruoyi.other.api.vo.CouponListVOVO;
 import com.ruoyi.account.api.vo.ExchangeRecordVO;
@@ -37,6 +38,8 @@
 import com.ruoyi.other.api.feignClient.OtherClient;
 import io.swagger.annotations.ApiModelProperty;
 import io.swagger.annotations.ApiOperation;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.*;
@@ -46,6 +49,7 @@
 import javax.annotation.Resource;
 import java.time.LocalDateTime;
 import java.util.*;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 /**
@@ -79,6 +83,9 @@
     private TAppUserTagService appUserTagService;
     @Autowired
     private TAppUserService appUserService;
+
+    @Autowired
+    private RedissonClient redissonClient;
     
 
     /**
@@ -101,13 +108,26 @@
     @ApiOperation(value = "添加车辆", tags = {"小程序-扫一扫"})
     @PostMapping(value = "/scan/addCar")
     public AjaxResult addCar(@RequestBody TAppUserCar dto) {
-        dto.setAppUserId(tokenService.getLoginUserApplet().getUserId());
-        TAppUserCar one = appUserCarService.getOne(new LambdaQueryWrapper<TAppUserCar>().eq(TAppUserCar::getLicensePlate, dto.getLicensePlate())
-                .eq(TAppUserCar::getDelFlag, 0));
-        if(null != one){
-            return AjaxResult.error("车辆已存在");
+        Long userId = tokenService.getLoginUserApplet().getUserId();
+        RLock lock = redissonClient.getLock("CREATE_CAR:" + userId);
+        try {
+            boolean tryLock = lock.tryLock(10, 10, TimeUnit.SECONDS);
+            if(tryLock){
+                dto.setAppUserId(userId);
+                TAppUserCar one = appUserCarService.getOne(new LambdaQueryWrapper<TAppUserCar>()
+                        .eq(TAppUserCar::getLicensePlate, dto.getLicensePlate())
+                        .eq(TAppUserCar::getAppUserId, dto.getAppUserId())
+                        .eq(TAppUserCar::getDelFlag, 0));
+                if(null != one){
+                    return AjaxResult.error("车辆已存在");
+                }
+                appUserCarService.save(dto);
+            }
+        } catch (InterruptedException e) {
+            throw new RuntimeException(e);
+        }finally {
+            lock.unlock();
         }
-        appUserCarService.save(dto);
         return AjaxResult.success();
     }
     /**
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java
index f39badd..972893d 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java
@@ -879,7 +879,9 @@
         ChargingDetails chargingDetails = chargingOrderService.getChargingDetails(id);
         return AjaxResult.success(chargingDetails);
     }
-    
+
+
+
     @Log(title = "【扫一扫】手动停止充电", businessType = BusinessType.STOP,operatorType = OperatorType.MOBILE)
     @ResponseBody
     @PutMapping(value = "/stopCharging/{id}")
@@ -2362,19 +2364,6 @@
         return R.ok(String.valueOf(chargingOrder.getId()));
     }
 
-//    @GetMapping(value = "/getOrderByCode")
-//    @ApiOperation(value = "H5通过编号查询订单", tags = {"H5-首页-用户充电订单信息"})
-//    public R<String> getOrderByCode(@RequestParam("code") String code) {
-//        Long userId = tokenService.getLoginUserApplet().getUserId();
-//        TChargingOrder chargingOrder = chargingOrderService.getOne(Wrappers.lambdaQuery(TChargingOrder.class)
-//                .eq(TChargingOrder::getAppUserId, userId)
-//                .in(TChargingOrder::getStatus, Arrays.asList(1,2,3,4))
-//                .orderByDesc(TChargingOrder::getCreateTime)
-//                .last("LIMIT 1"));
-//        if(Objects.isNull(chargingOrder)){
-//            return R.ok();
-//        }
-//        return R.ok(String.valueOf(chargingOrder.getId()));
-//    }
+
 
 }
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
index 95a33af..4883945 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
@@ -83,6 +83,7 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.StringUtils;
 
 import javax.annotation.Resource;
@@ -646,6 +647,7 @@
 	 * @param attach         附加数据
 	 * @return
 	 */
+    @Transactional
 	@Override
 	public AjaxResult chargingOrderCallback(Integer paymentType, String out_trade_no, String transaction_id, String attach) {
 		TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, out_trade_no));
@@ -820,8 +822,8 @@
 			Integer failure_cause = platformStartChargingReply.getFailure_cause();
 			Integer counter = counter_map.get(code);
 			PreChargeCheck preChargeCheck1 = redisService.getCacheObject(key);
-			//5分钟内还未插枪则取消充电,退回金额。
-			if (failure_cause == 5 && (null == counter || counter < 300)) {
+			//15分钟内还未插枪则取消充电,退回金额。
+			if (failure_cause == 5 && (null == counter || counter < 60 * 15)) {
 				counter = (null == counter ? 0 : counter) + 1;
 				counter_map.put(code, counter);
 				//启动失败
@@ -903,8 +905,8 @@
 			}else{
 				Integer counter = boot_failed_map.get(code);
 				log.info(code + ":-------------------未上传开启充电结果-------------------" + counter);
-				//5分钟内未启动成功,退回金额。
-				if (null == counter || counter < 300) {
+				//15分钟内未启动成功,退回金额。
+				if (null == counter || counter < 60 * 15) {
 					counter = (null == counter ? 0 : counter) + 1;
 					boot_failed_map.put(code, counter);
 					//启动失败
@@ -1041,127 +1043,140 @@
 	 *
 	 * @param code
 	 */
+    @Transactional
 	public void refund(String code) {
-		log.info(code + ":-------------------充电启动失败,执行退款-------------------");
-		TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, code));
-		if (chargingOrder.getOrderSource() == 1 && chargingOrder.getStatus() == 2) {
-			Integer rechargePaymentType = chargingOrder.getRechargePaymentType();
-			BigDecimal rechargeAmount = chargingOrder.getRechargeAmount();
-			//构建退款明细
-			TChargingOrderRefund chargingOrderRefund = new TChargingOrderRefund();
-			chargingOrderRefund.setChargingOrderId(chargingOrder.getId());
-			SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
-			chargingOrderRefund.setRefundCode("CDF" + sdf.format(new Date()) + Double.valueOf(Math.random() * 1000).intValue());
-			chargingOrderRefund.setRefundAmount(rechargeAmount);
-			chargingOrderRefund.setRefundStatus(1);
-			chargingOrderRefund.setPayType(rechargePaymentType);
-			chargingOrderRefund.setRefundStatus(1);
-			chargingOrderRefund.setCode(code);
-			chargingOrderRefund.setRefundTitle("充电失败");
-			chargingOrderRefund.setRefundContent("充电失败");
-			chargingOrderRefund.setRefundReason("充电失败");
-			chargingOrderRefund.setRefundRemark("全额退款");
-			chargingOrderRefund.setRefundTotalAmount(rechargeAmount);
-			chargingOrderRefund.setPayAmount(rechargeAmount);
-			if (1 == rechargePaymentType) {
-				WxPaymentRefundModel model = new WxPaymentRefundModel();
-				model.setOut_trade_no(chargingOrder.getCode());
-				model.setOut_refund_no(chargingOrderRefund.getRefundCode());
-				model.setReason("充电失败,取消充电订单");
-				model.setNotify_url("/payment/wx/refund/notify");
-				WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
-				amount.setRefund(rechargeAmount.multiply(new BigDecimal(100)).intValue());
-				amount.setTotal(rechargeAmount.multiply(new BigDecimal(100)).intValue());
-				amount.setCurrency("CNY");
-				model.setAmount(amount);
-				R<Map<String, Object>> orderR = wxPaymentClient.refundOrderR(model);
-				if (200 == orderR.getCode()) {
-					chargingOrderRefundService.save(chargingOrderRefund);
-					//手续费
-					Map<String, Object> amount1 = (Map<String, Object>) orderR.getData().get("amount");
-					Object refund_fee1 = amount1.get("refund_fee");
-					BigDecimal refund_fee = new BigDecimal(null == refund_fee1 ? "0" : refund_fee1.toString()).divide(new BigDecimal(100));
-					chargingOrderRefund.setRefundFee(refund_fee);
-					chargingOrderRefundService.updateById(chargingOrderRefund);
-					//回退会员折扣次数
-					if (chargingOrder.getVipDiscountAmount().compareTo(BigDecimal.ZERO) > 0) {
-						TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData();
-						GetAppUserVipDetail getAppUserVipDetail = new GetAppUserVipDetail();
-						getAppUserVipDetail.setAppUserId(chargingOrder.getAppUserId());
-						getAppUserVipDetail.setVipId(appUser.getVipId());
-						TAppUserVipDetail data = appUserVipDetailClient.getAppUserVipDetail(getAppUserVipDetail).getData();
-						if (null != data) {
-							data.setChargeNum(data.getChargeNum() + 1);
-							appUserVipDetailClient.updateAppUserVipDetail(data);
-						}
-					}
-				}
-			}
-			if (2 == rechargePaymentType) {
-				RefundReq dto = new RefundReq();
-				dto.setOutTradeNo(chargingOrder.getCode());
-				dto.setOutRequestNo(chargingOrderRefund.getCode());
-				dto.setRefundAmount(rechargeAmount.toString());
-				dto.setRefundReason("充电失败,取消充电订单");
-				RefundResp resp = aliPaymentClient.refund(dto).getData();
-				if (null != resp) {
-					chargingOrderRefundService.save(chargingOrderRefund);
-					//回退会员折扣次数
-					if (chargingOrder.getVipDiscountAmount().compareTo(BigDecimal.ZERO) > 0) {
-						TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData();
-						GetAppUserVipDetail getAppUserVipDetail = new GetAppUserVipDetail();
-						getAppUserVipDetail.setAppUserId(chargingOrder.getAppUserId());
-						getAppUserVipDetail.setVipId(appUser.getVipId());
-						TAppUserVipDetail data = appUserVipDetailClient.getAppUserVipDetail(getAppUserVipDetail).getData();
-						if (null != data) {
-							data.setChargeNum(data.getChargeNum() + 1);
-							appUserVipDetailClient.updateAppUserVipDetail(data);
-						}
-					}
-					
-					try {
-						Thread.sleep(1000);
-					} catch (InterruptedException e) {
-						throw new RuntimeException(e);
-					}
-					chargingOrderStartupFailureWxRefund(chargingOrderRefund.getRefundCode(), resp.getTradeNo(), "SUCCESS", null);
-				}
-			}
-			if (3 == rechargePaymentType) {
-				RefundReq dto = new RefundReq();
-				dto.setOutTradeNo(chargingOrder.getRechargeSerialNumber());
-				dto.setOutRequestNo(chargingOrderRefund.getCode());
-				dto.setRefundAmount(rechargeAmount.toString());
-				dto.setRefundReason("充电失败,取消充电订单");
-				RefundResp resp = h5AliPaymentClient.refund(dto).getData();
-				if (null != resp && "10000".equals(resp.getCode())) {
-					chargingOrderRefundService.save(chargingOrderRefund);
-					//回退会员折扣次数
-					if (chargingOrder.getVipDiscountAmount().compareTo(BigDecimal.ZERO) > 0) {
-						TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData();
-						GetAppUserVipDetail getAppUserVipDetail = new GetAppUserVipDetail();
-						getAppUserVipDetail.setAppUserId(chargingOrder.getAppUserId());
-						getAppUserVipDetail.setVipId(appUser.getVipId());
-						TAppUserVipDetail data = appUserVipDetailClient.getAppUserVipDetail(getAppUserVipDetail).getData();
-						if (null != data) {
-							data.setChargeNum(data.getChargeNum() + 1);
-							appUserVipDetailClient.updateAppUserVipDetail(data);
-						}
-					}
-					
-					try {
-						Thread.sleep(1000);
-					} catch (InterruptedException e) {
-						throw new RuntimeException(e);
-					}
-					chargingOrderStartupFailureWxRefund(chargingOrderRefund.getRefundCode(), resp.getTradeNo(), "SUCCESS", null);
-				}
-			}
-			
-		}
+        RLock lock = redissonClient.getLock("REFUND_ORDER_LOCK:" + code);
+        try {
+            boolean tryLock = lock.tryLock(30, 30, TimeUnit.SECONDS);
+            if(tryLock){
+                log.info(code + ":-------------------充电启动失败,执行退款-------------------");
+                TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, code));
+                if (chargingOrder.getOrderSource() == 1 && chargingOrder.getStatus() == 2) {
+                    Integer rechargePaymentType = chargingOrder.getRechargePaymentType();
+                    BigDecimal rechargeAmount = chargingOrder.getRechargeAmount();
+                    //构建退款明细
+                    TChargingOrderRefund chargingOrderRefund = new TChargingOrderRefund();
+                    chargingOrderRefund.setChargingOrderId(chargingOrder.getId());
+                    SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
+                    chargingOrderRefund.setRefundCode("CDF" + sdf.format(new Date()) + Double.valueOf(Math.random() * 1000).intValue());
+                    chargingOrderRefund.setRefundAmount(rechargeAmount);
+                    chargingOrderRefund.setRefundStatus(1);
+                    chargingOrderRefund.setPayType(rechargePaymentType);
+                    chargingOrderRefund.setRefundStatus(1);
+                    chargingOrderRefund.setCode(code);
+                    chargingOrderRefund.setRefundTitle("充电失败");
+                    chargingOrderRefund.setRefundContent("充电失败");
+                    chargingOrderRefund.setRefundReason("充电失败");
+                    chargingOrderRefund.setRefundRemark("全额退款");
+                    chargingOrderRefund.setRefundTotalAmount(rechargeAmount);
+                    chargingOrderRefund.setPayAmount(rechargeAmount);
+                    if (1 == rechargePaymentType) {
+                        WxPaymentRefundModel model = new WxPaymentRefundModel();
+                        model.setOut_trade_no(chargingOrder.getCode());
+                        model.setOut_refund_no(chargingOrderRefund.getRefundCode());
+                        model.setReason("充电失败,取消充电订单");
+                        model.setNotify_url("/payment/wx/refund/notify");
+                        WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
+                        amount.setRefund(rechargeAmount.multiply(new BigDecimal(100)).intValue());
+                        amount.setTotal(rechargeAmount.multiply(new BigDecimal(100)).intValue());
+                        amount.setCurrency("CNY");
+                        model.setAmount(amount);
+                        R<Map<String, Object>> orderR = wxPaymentClient.refundOrderR(model);
+                        if (200 == orderR.getCode()) {
+                            chargingOrderRefundService.save(chargingOrderRefund);
+                            //手续费
+                            Map<String, Object> amount1 = (Map<String, Object>) orderR.getData().get("amount");
+                            Object refund_fee1 = amount1.get("refund_fee");
+                            BigDecimal refund_fee = new BigDecimal(null == refund_fee1 ? "0" : refund_fee1.toString()).divide(new BigDecimal(100));
+                            chargingOrderRefund.setRefundFee(refund_fee);
+                            chargingOrderRefundService.updateById(chargingOrderRefund);
+                            //回退会员折扣次数
+                            if (chargingOrder.getVipDiscountAmount().compareTo(BigDecimal.ZERO) > 0) {
+                                TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData();
+                                GetAppUserVipDetail getAppUserVipDetail = new GetAppUserVipDetail();
+                                getAppUserVipDetail.setAppUserId(chargingOrder.getAppUserId());
+                                getAppUserVipDetail.setVipId(appUser.getVipId());
+                                TAppUserVipDetail data = appUserVipDetailClient.getAppUserVipDetail(getAppUserVipDetail).getData();
+                                if (null != data) {
+                                    data.setChargeNum(data.getChargeNum() + 1);
+                                    appUserVipDetailClient.updateAppUserVipDetail(data);
+                                }
+                            }
+                        }
+                    }
+                    if (2 == rechargePaymentType) {
+                        RefundReq dto = new RefundReq();
+                        dto.setOutTradeNo(chargingOrder.getCode());
+                        dto.setOutRequestNo(chargingOrderRefund.getCode());
+                        dto.setRefundAmount(rechargeAmount.toString());
+                        dto.setRefundReason("充电失败,取消充电订单");
+                        RefundResp resp = aliPaymentClient.refund(dto).getData();
+                        if (null != resp) {
+                            chargingOrderRefundService.save(chargingOrderRefund);
+                            //回退会员折扣次数
+                            if (chargingOrder.getVipDiscountAmount().compareTo(BigDecimal.ZERO) > 0) {
+                                TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData();
+                                GetAppUserVipDetail getAppUserVipDetail = new GetAppUserVipDetail();
+                                getAppUserVipDetail.setAppUserId(chargingOrder.getAppUserId());
+                                getAppUserVipDetail.setVipId(appUser.getVipId());
+                                TAppUserVipDetail data = appUserVipDetailClient.getAppUserVipDetail(getAppUserVipDetail).getData();
+                                if (null != data) {
+                                    data.setChargeNum(data.getChargeNum() + 1);
+                                    appUserVipDetailClient.updateAppUserVipDetail(data);
+                                }
+                            }
+
+                            try {
+                                Thread.sleep(1000);
+                            } catch (InterruptedException e) {
+                                throw new RuntimeException(e);
+                            }
+                            chargingOrderStartupFailureWxRefund(chargingOrderRefund.getRefundCode(), resp.getTradeNo(), "SUCCESS", null);
+                        }
+                    }
+                    if (3 == rechargePaymentType) {
+                        RefundReq dto = new RefundReq();
+                        dto.setOutTradeNo(chargingOrder.getRechargeSerialNumber());
+                        dto.setOutRequestNo(chargingOrderRefund.getCode());
+                        dto.setRefundAmount(rechargeAmount.toString());
+                        dto.setRefundReason("充电失败,取消充电订单");
+                        RefundResp resp = h5AliPaymentClient.refund(dto).getData();
+                        if (null != resp && "10000".equals(resp.getCode())) {
+                            chargingOrderRefundService.save(chargingOrderRefund);
+                            //回退会员折扣次数
+                            if (chargingOrder.getVipDiscountAmount().compareTo(BigDecimal.ZERO) > 0) {
+                                TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData();
+                                GetAppUserVipDetail getAppUserVipDetail = new GetAppUserVipDetail();
+                                getAppUserVipDetail.setAppUserId(chargingOrder.getAppUserId());
+                                getAppUserVipDetail.setVipId(appUser.getVipId());
+                                TAppUserVipDetail data = appUserVipDetailClient.getAppUserVipDetail(getAppUserVipDetail).getData();
+                                if (null != data) {
+                                    data.setChargeNum(data.getChargeNum() + 1);
+                                    appUserVipDetailClient.updateAppUserVipDetail(data);
+                                }
+                            }
+
+                            try {
+                                Thread.sleep(1000);
+                            } catch (InterruptedException e) {
+                                throw new RuntimeException(e);
+                            }
+                            chargingOrderStartupFailureWxRefund(chargingOrderRefund.getRefundCode(), resp.getTradeNo(), "SUCCESS", null);
+                        }
+                    }
+
+                }
+            }
+        } catch (InterruptedException e) {
+            throw new RuntimeException(e);
+        }finally {
+            lock.unlock();
+        }
+
 	}
 	
-	
+
+    @Transactional
 	public void refund1(String code, BigDecimal money) {
 		log.info(code + ":-------------------充电成功,执行手动退款-------------------");
 		TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, code));
@@ -1254,22 +1269,35 @@
 	 * @param success_time
 	 * @return
 	 */
+    @Transactional
 	public AjaxResult chargingOrderStartupFailureWxRefund(String out_refund_no, String refund_id, String tradeState, String success_time) {
-		TChargingOrderRefund one = chargingOrderRefundService.getOne(new LambdaQueryWrapper<TChargingOrderRefund>().eq(TChargingOrderRefund::getRefundCode, out_refund_no));
-		one.setRefundSerialNumber(refund_id);
-		one.setRefundStatus(2);
-		one.setRefundTime(LocalDateTime.now());
-		chargingOrderRefundService.updateById(one);
-		
-		TChargingOrder order = this.getById(one.getChargingOrderId());
-		TChargingOrder chargingOrder = new TChargingOrder();
-		chargingOrder.setId(one.getChargingOrderId());
-		chargingOrder.setAppUserId(order.getAppUserId());
-		chargingOrder.setRefundStatus(2);
-		chargingOrder.setRefundSerialNumber(refund_id);
-		chargingOrder.setRefundTime(LocalDateTime.now());
-		this.updateById(chargingOrder);
-		return AjaxResult.success();
+        RLock lock = redissonClient.getLock("chargingOrderStartupFailureWxRefund:" + out_refund_no);
+        try {
+            boolean tryLock = lock.tryLock(10, 10, TimeUnit.SECONDS);
+            if(tryLock){
+                TChargingOrderRefund one = chargingOrderRefundService.getOne(new LambdaQueryWrapper<TChargingOrderRefund>().eq(TChargingOrderRefund::getRefundCode, out_refund_no));
+                if(null != one && one.getRefundStatus() == 1){
+                    one.setRefundSerialNumber(refund_id);
+                    one.setRefundStatus(2);
+                    one.setRefundTime(LocalDateTime.now());
+                    chargingOrderRefundService.updateById(one);
+
+                    TChargingOrder order = this.getById(one.getChargingOrderId());
+                    TChargingOrder chargingOrder = new TChargingOrder();
+                    chargingOrder.setId(one.getChargingOrderId());
+                    chargingOrder.setAppUserId(order.getAppUserId());
+                    chargingOrder.setRefundStatus(2);
+                    chargingOrder.setRefundSerialNumber(refund_id);
+                    chargingOrder.setRefundTime(LocalDateTime.now());
+                    this.updateById(chargingOrder);
+                }
+            }
+        } catch (InterruptedException e) {
+            throw new RuntimeException(e);
+        }finally {
+            lock.unlock();
+        }
+        return AjaxResult.success();
 	}
 	
 	
@@ -2333,555 +2361,548 @@
 	 *
 	 * @param vo
 	 */
+    @Transactional
 	@Override
 	public R endChargeBillingCharge(TransactionRecordMessageVO vo) {
 		RLock lock = redissonClient.getLock("endOrder:" + vo.getTransaction_serial_number());
-		boolean tryLock = false;
 		try {
-			tryLock = lock.tryLock(100, TimeUnit.SECONDS);
-		} catch (InterruptedException e) {
-			e.printStackTrace();
-			lock.unlock();
-			return R.ok();
-		}
-		if (!tryLock) {
-			return R.ok();
-		}
-		try {
-			Object cacheObject = redisService.getCacheObject("chargingOrderStatus:" + vo.getTransaction_serial_number());
-			if(null != cacheObject && 5 == (int)cacheObject){
-				return R.ok();
-			}
-			TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, vo.getTransaction_serial_number()));
-			if (null == chargingOrder) {
-				return R.ok();
-			}
-			Integer status = chargingOrder.getStatus();
-			if (status == 5) {
-				return R.ok();
-			}
-			
-			//如果使用优惠券需要判断优惠券是否满足使用条件
-			//退款金额=优惠券金额+剩余充电金额
-			BigDecimal periodElectricPrice_total = BigDecimal.ZERO;
-			BigDecimal periodServicePrice_total = BigDecimal.ZERO;
-			BigDecimal vipDiscountAmount_total = BigDecimal.ZERO;
-			BigDecimal serviceCharge_total = BigDecimal.ZERO;
-			BigDecimal total = BigDecimal.ZERO;
-			
-			//获取订单的计费策略
-			List<AccountingStrategyDetailOrder> accountingStrategyDetailOrderList = accountingStrategyDetailOrderClient.getAllAccountingStrategyDetailOrder(chargingOrder.getId()).getData();
-			if (accountingStrategyDetailOrderList.isEmpty()) {
-				return R.fail("计费策略为空,无法计算费用");
-			}
-			accountingStrategyDetailOrderList.get(accountingStrategyDetailOrderList.size() - 1).setEndTime("23:59");
-			//开始处理计费明细数据和优惠数据
-			chargingOrderAccountingStrategyService.remove(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>().eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrder.getId()));
-			SimpleDateFormat sdfs = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-			List<AccountingStrategyDetailOrderVo> lists = new ArrayList<>();
-			List<UploadRealTimeMonitoringData> dataList = uploadRealTimeMonitoringDataService.getDataByOrderCode(chargingOrder.getCode());
-			if(!dataList.isEmpty()){
-				vo.setStart_time(sdfs.format(dataList.get(dataList.size() - 1).getCreate_time()) + ".00");
-				vo.setEnd_time(sdfs.format(dataList.get(0).getCreate_time()) + ".00");
-			}
+            boolean tryLock = lock.tryLock(60, 60, TimeUnit.SECONDS);
+            if(tryLock){
+                Object cacheObject = redisService.getCacheObject("chargingOrderStatus:" + vo.getTransaction_serial_number());
+                if(null != cacheObject && 5 == (int)cacheObject){
+                    return R.ok();
+                }
+                TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, vo.getTransaction_serial_number()));
+                if (null == chargingOrder) {
+                    return R.ok();
+                }
+                Integer status = chargingOrder.getStatus();
+                if (status == 5) {
+                    return R.ok();
+                }
 
-			//跨天
-			if (!vo.getStart_time().split(" ")[0].equals(vo.getEnd_time().split(" ")[0])) {
-				//当天的
-				//开始通过计费策略遍历解析每个时段的费用明细
-				String start_time = vo.getStart_time();
-				String end_time = vo.getEnd_time();
-				long start = sdfs.parse(start_time).getTime();
-				long end = sdfs.parse(end_time).getTime();
-				Class<? extends TransactionRecordMessageVO> clazz = vo.getClass();
-				/**
-				 * "start_time": "2025-01-03 23:06:43.00",
-				 * 	"end_time": "2025-01-04 00:39:39.00",
-				 */
-				for (int i = accountingStrategyDetailOrderList.size(); i > 0; i--) {
-					AccountingStrategyDetailOrder strategyDetail = accountingStrategyDetailOrderList.get(i - 1);
-					long time = sdfs.parse(start_time.split(" ")[0] + " " + strategyDetail.getEndTime() + ":00").getTime();
-					if (time < start) {
-						break;
-					}
-					//阶段(1=尖阶段,2=峰阶段,3=平阶段,4=谷阶段)
-					Object invoke = null;
-					switch (strategyDetail.getType()) {
-						case 1:
-							//充电度数
-							invoke = clazz.getMethod("getSpike_charge" + (i)).invoke(vo);
-							break;
-						case 2:
-							//充电度数
-							invoke = clazz.getMethod("getPeak_charge" + (i)).invoke(vo);
-							break;
-						case 3:
-							//充电度数
-							invoke = clazz.getMethod("getFlat_charge" + (i)).invoke(vo);
-							break;
-						case 4:
-							//充电度数
-							invoke = clazz.getMethod("getValley_charge" + (i)).invoke(vo);
-							break;
-					}
-					if (null == invoke || Double.valueOf(invoke.toString()) == 0) {
-						continue;
-					}
-					BigDecimal sharp_peak_charge = new BigDecimal(invoke.toString());
-					AccountingStrategyDetailOrderVo vo1 = new AccountingStrategyDetailOrderVo();
-					BeanUtils.copyProperties(strategyDetail, vo1);
-					vo1.setChargingCapacity(sharp_peak_charge);
-					lists.add(0, vo1);
-				}
-				
-				//第二天的
-				//开始通过计费策略遍历解析每个时段的费用明细
-				for (int i = 0; i < accountingStrategyDetailOrderList.size(); i++) {
-					AccountingStrategyDetailOrder strategyDetail = accountingStrategyDetailOrderList.get(i);
-					long time = sdfs.parse(end_time.split(" ")[0] + " " + strategyDetail.getStartTime() + ":00").getTime();
-					if (time > end) {
-						break;
-					}
-					//阶段(1=尖阶段,2=峰阶段,3=平阶段,4=谷阶段)
-					Object invoke = null;
-					switch (strategyDetail.getType()) {
-						case 1:
-							//充电度数
-							invoke = clazz.getMethod("getSpike_charge" + (i + 1)).invoke(vo);
-							break;
-						case 2:
-							//充电度数
-							invoke = clazz.getMethod("getPeak_charge" + (i + 1)).invoke(vo);
-							break;
-						case 3:
-							//充电度数
-							invoke = clazz.getMethod("getFlat_charge" + (i + 1)).invoke(vo);
-							break;
-						case 4:
-							//充电度数
-							invoke = clazz.getMethod("getValley_charge" + (i + 1)).invoke(vo);
-							break;
-					}
-					if (null == invoke || Double.valueOf(invoke.toString()) == 0) {
-						continue;
-					}
-					BigDecimal sharp_peak_charge = new BigDecimal(invoke.toString());
-					AccountingStrategyDetailOrderVo vo1 = new AccountingStrategyDetailOrderVo();
-					BeanUtils.copyProperties(strategyDetail, vo1);
-					vo1.setChargingCapacity(sharp_peak_charge);
-					lists.add(vo1);
-				}
-			} else {
-				for (int i = 0; i < accountingStrategyDetailOrderList.size(); i++) {
-					Class<? extends TransactionRecordMessageVO> clazz = vo.getClass();
-					AccountingStrategyDetailOrder strategyDetail = accountingStrategyDetailOrderList.get(i);
-					//阶段(1=尖阶段,2=峰阶段,3=平阶段,4=谷阶段)
-					Object invoke = null;
-					switch (strategyDetail.getType()) {
-						case 1:
-							//充电度数
-							invoke = clazz.getMethod("getSpike_charge" + (i + 1)).invoke(vo);
-							break;
-						case 2:
-							//充电度数
-							invoke = clazz.getMethod("getPeak_charge" + (i + 1)).invoke(vo);
-							break;
-						case 3:
-							//充电度数
-							invoke = clazz.getMethod("getFlat_charge" + (i + 1)).invoke(vo);
-							break;
-						case 4:
-							//充电度数
-							invoke = clazz.getMethod("getValley_charge" + (i + 1)).invoke(vo);
-							break;
-					}
-					if (null == invoke || Double.valueOf(invoke.toString()) == 0) {
-						continue;
-					}
-					BigDecimal sharp_peak_charge = new BigDecimal(invoke.toString());
-					AccountingStrategyDetailOrderVo vo1 = new AccountingStrategyDetailOrderVo();
-					BeanUtils.copyProperties(strategyDetail, vo1);
-					vo1.setChargingCapacity(sharp_peak_charge);
-					lists.add(vo1);
-				}
-			}
-			
-			//开始处理明细
-			for (int i = 0; i < lists.size(); i++) {
-				AccountingStrategyDetailOrderVo strategyDetail = lists.get(i);
-				BigDecimal sharp_peak_charge = strategyDetail.getChargingCapacity();
-				TChargingOrderAccountingStrategy chargingOrderAccountingStrategy = new TChargingOrderAccountingStrategy();
-				chargingOrderAccountingStrategy.setChargingOrderId(chargingOrder.getId());
-				chargingOrderAccountingStrategy.setAccountingStrategyDetailId(strategyDetail.getId());
-				chargingOrderAccountingStrategy.setType(strategyDetail.getType());
-				chargingOrderAccountingStrategy.setElectrovalence(strategyDetail.getElectrovalence());
-				chargingOrderAccountingStrategy.setServiceCharge(strategyDetail.getServiceCharge());
-				chargingOrderAccountingStrategy.setCostServiceCharge(strategyDetail.getCostServiceCharge());
-				if (i == 0) {
-					String time = vo.getStart_time().split(" ")[1];
-					chargingOrderAccountingStrategy.setStartTime(time.substring(0, time.lastIndexOf(":")));
-				} else {
-					chargingOrderAccountingStrategy.setStartTime(strategyDetail.getStartTime());
-				}
-				if (i == lists.size() - 1) {
-					String time = vo.getEnd_time().split(" ")[1];
-					chargingOrderAccountingStrategy.setEndTime(time.substring(0, time.lastIndexOf(":")));
-				} else {
-					chargingOrderAccountingStrategy.setEndTime(strategyDetail.getEndTime());
-				}
-				
-				//已充电总度数
-				BigDecimal electrovalenc = strategyDetail.getElectrovalence().multiply(sharp_peak_charge);
-				BigDecimal originalServicePrice = strategyDetail.getServiceCharge().multiply(sharp_peak_charge);
-				BigDecimal serviceCharge = originalServicePrice;
-				BigDecimal vipDiscountAmount = BigDecimal.ZERO;
-				//计算优惠金额
-				if (null != chargingOrder.getVipDiscount()) {
-					//0.58折
-					vipDiscountAmount = serviceCharge.multiply(new BigDecimal(1).subtract(chargingOrder.getVipDiscount()));
-					serviceCharge = serviceCharge.multiply(chargingOrder.getVipDiscount());
-				}
-				chargingOrderAccountingStrategy.setChargingCapacity(sharp_peak_charge);
-				chargingOrderAccountingStrategy.setPeriodElectricPrice(electrovalenc.setScale(4, RoundingMode.HALF_EVEN));
-				chargingOrderAccountingStrategy.setPeriodServicePrice(serviceCharge.setScale(4, RoundingMode.HALF_EVEN));
-				chargingOrderAccountingStrategy.setPeriodOriginalServicePrice(originalServicePrice.setScale(4, RoundingMode.HALF_EVEN));
-				chargingOrderAccountingStrategy.setVipDiscountAmount(vipDiscountAmount.setScale(4, RoundingMode.HALF_EVEN));
-				chargingOrderAccountingStrategy.setCreateTime(LocalDateTime.now());
-				chargingOrderAccountingStrategyService.save(chargingOrderAccountingStrategy);
-				//电费
-				periodElectricPrice_total = periodElectricPrice_total.add(electrovalenc);
-				//服务费(含折扣)
-				serviceCharge_total = serviceCharge_total.add(serviceCharge);
-				//服务费(不含折扣)
-				periodServicePrice_total = periodServicePrice_total.add(originalServicePrice);
-				//会员折扣优惠金额
-				vipDiscountAmount_total = vipDiscountAmount_total.add(vipDiscountAmount);
-				//原始总金额(不含折扣)
-				total = total.add(electrovalenc.add(originalServicePrice));
-			}
-			
-			BigDecimal orderAmount = BigDecimal.valueOf(total.doubleValue());
-			//原金额
-			BigDecimal rechargeAmount = chargingOrder.getRechargeAmount();
-			//支付金额
-			BigDecimal payAmount = periodElectricPrice_total.add(serviceCharge_total);
-			//退款金额=充值金额-实际支付金额
-			BigDecimal refundAmount = rechargeAmount.subtract(payAmount);
-			
-			UploadRealTimeMonitoringData uploadRealTimeMonitoringData = uploadRealTimeMonitoringDataService.getLastDataById(chargingOrder.getCode());
-			if (null != uploadRealTimeMonitoringData && null == chargingOrder.getEndMode()) {
-				Integer soc = uploadRealTimeMonitoringData.getSoc();
-				if (soc >= 98) {
-					chargingOrder.setEndMode(2);
-				} else if (null != chargingOrder.getResidualAmount() && chargingOrder.getResidualAmount().compareTo(new BigDecimal(1)) <= 0) {
-					chargingOrder.setEndMode(3);
-				} else {
-					chargingOrder.setEndMode(1);
-				}
-			}
-			chargingOrder.setResidualAmount(rechargeAmount.subtract(total).setScale(2, RoundingMode.HALF_EVEN));
+                //如果使用优惠券需要判断优惠券是否满足使用条件
+                //退款金额=优惠券金额+剩余充电金额
+                BigDecimal periodElectricPrice_total = BigDecimal.ZERO;
+                BigDecimal periodServicePrice_total = BigDecimal.ZERO;
+                BigDecimal vipDiscountAmount_total = BigDecimal.ZERO;
+                BigDecimal serviceCharge_total = BigDecimal.ZERO;
+                BigDecimal total = BigDecimal.ZERO;
 
-			chargingOrder.setStartTime(LocalDateTime.parse(vo.getStart_time(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SS")));
-			chargingOrder.setEndTime(LocalDateTime.parse(vo.getEnd_time(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SS")));
-			chargingOrder.setStatus(5);
-			chargingOrder.setOrderAmount(orderAmount.setScale(2, RoundingMode.HALF_EVEN));
-			chargingOrder.setElectrovalence(periodElectricPrice_total.setScale(2, RoundingMode.HALF_EVEN));
-			chargingOrder.setChargingCapacity(vo.getTotal_electricity());
-			chargingOrder.setElectricity(vo.getTotal_electricity());
-			chargingOrder.setVipDiscountAmount(vipDiscountAmount_total);
-			if (vipDiscountAmount_total.compareTo(BigDecimal.ZERO) == 0) {
-				chargingOrder.setVipDiscount(BigDecimal.valueOf(1));
-			}
-			
-			//计算优惠券
-			BigDecimal couponDiscount = BigDecimal.ZERO;
-			if (null != chargingOrder.getAppCouponId()) {
-				//判断实际充电金额是否满足优惠券使用条件,如果不满足则不适用优惠券。
-				TAppCoupon appCoupon = appCouponClient.getAppCouponById(chargingOrder.getAppCouponId()).getData();
-				String couponJson = appCoupon.getCouponJson();
-				TCoupon tCoupon = JSON.parseObject(couponJson, TCoupon.class);
-				Integer preferentialMode = tCoupon.getPreferentialMode();
-				if (1 == preferentialMode) {
-					//满减
-					if (payAmount.compareTo(tCoupon.getMeetTheConditions()) >= 0) {
-						BigDecimal couponDiscountAmount = tCoupon.getDiscountAmount();
-						//如果优惠金额大于服务费金额,以服务费作为最大限制
-						if (serviceCharge_total.compareTo(couponDiscountAmount) < 0) {
-							couponDiscount = serviceCharge_total;
-							serviceCharge_total = BigDecimal.ZERO;
-						} else {
-							couponDiscount = couponDiscountAmount;
-						}
-						appCoupon.setStatus(2);
-						appCouponClient.updateAppCoupon(appCoupon);
-					} else {
-						appCouponClient.refund(chargingOrder.getAppCouponId().toString());
-						chargingOrder.setAppCouponId(null);
-						chargingOrder.setCouponDiscountAmount(BigDecimal.ZERO);
-					}
-				}
-				if (2 == preferentialMode) {
-					//抵扣
-					if (payAmount.compareTo(tCoupon.getMeetTheConditions()) >= 0) {
-						//折扣金额
-						BigDecimal divide = payAmount.multiply(new BigDecimal(10).subtract(tCoupon.getDiscount())).divide(new BigDecimal(10));
-						divide = divide.compareTo(tCoupon.getMaximumDiscountAmount()) > 0 ? tCoupon.getMaximumDiscountAmount() : divide;
-						//如果优惠金额大于服务费金额,以服务费作为最大限制
-						if (serviceCharge_total.compareTo(divide) < 0) {
-							couponDiscount = serviceCharge_total;
-							serviceCharge_total = BigDecimal.ZERO;
-						} else {
-							couponDiscount = divide;
-						}
-						
-						appCoupon.setStatus(2);
-						appCouponClient.updateAppCoupon(appCoupon);
-					} else {
-						chargingOrder.setAppCouponId(null);
-						chargingOrder.setCouponDiscountAmount(BigDecimal.ZERO);
-						appCouponClient.refund(chargingOrder.getAppCouponId().toString());
-					}
-				}
-			}
-			//优惠券优惠金额
-			couponDiscount = couponDiscount.setScale(4, RoundingMode.HALF_EVEN);
-			//退款金额+优惠券
-			refundAmount = refundAmount.add(couponDiscount);
-			//实际支付金额-优惠券
-			payAmount = payAmount.subtract(couponDiscount);
-			if (serviceCharge_total.compareTo(BigDecimal.ZERO) > 0) {
-				serviceCharge_total = serviceCharge_total.subtract(couponDiscount);
-			}
-			chargingOrder.setCouponDiscountAmount(couponDiscount.setScale(2, RoundingMode.HALF_EVEN));
-			chargingOrder.setServiceCharge(serviceCharge_total.setScale(2, RoundingMode.HALF_EVEN));
-			chargingOrder.setPaymentAmount(payAmount.setScale(2, RoundingMode.HALF_EVEN));
-			chargingOrder.setRefundAmount(refundAmount.setScale(2, RoundingMode.HALF_EVEN));
-			chargingOrder.setRefundStatus(1);
-			UploadRealTimeMonitoringData asc = uploadRealTimeMonitoringDataService.getDataByOrderCode(chargingOrder.getCode(), "asc");
-			UploadRealTimeMonitoringData desc = uploadRealTimeMonitoringDataService.getDataByOrderCode(chargingOrder.getCode(), "desc");
-			if(null != asc){
-				chargingOrder.setStartSoc(new BigDecimal(asc.getSoc()));
-			}
-			if(null != desc){
-				chargingOrder.setEndSoc(new BigDecimal(desc.getSoc()));
-			}
-			this.updateById(chargingOrder);
-			redisService.setCacheObject("chargingOrderStatus:" + vo.getTransaction_serial_number(), 5, 100L, TimeUnit.SECONDS);
-			
-			chargingOrder = this.getById(chargingOrder.getId());
-			Site site = siteClient.getSiteByIds(Arrays.asList(chargingOrder.getSiteId())).getData().get(0);
-			//推送三方平台
-			if (2 == chargingOrder.getOrderSource() && 1 == site.getIsOpenSynchronization()) {
-				TChargingOrder finalChargingOrder = chargingOrder;
-				new Thread(new Runnable() {
-					@Override
-					public void run() {
-						tcecClient.notificationEquipChargeStatus(finalChargingOrder.getStartChargeSeq(), finalChargingOrder.getOperatorId());
-						tcecClient.notificationStopChargeResult(finalChargingOrder.getStartChargeSeq(), finalChargingOrder.getChargingGunId().toString(),
-								finalChargingOrder.getOperatorId());
-						tcecClient.notificationChargeOrderInfo(finalChargingOrder.getStartChargeSeq(), finalChargingOrder.getOperatorId());
-					}
-				}).start();
-			}
-			ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.SECONDS, new LinkedBlockingDeque<>());
-			TChargingOrder finalChargingOrder1 = chargingOrder;
-			threadPoolExecutor.execute(()->{
-				//推送成都监管
-				NotificationConnectorChargeStatusVo statusVo = new NotificationConnectorChargeStatusVo();
-				statusVo.setOrderCode(finalChargingOrder1.getCode());
-				statusVo.setChargingGunId(finalChargingOrder1.getChargingGunId());
-				chengDuJianGuanClient.notificationConnectorChargeStatus(statusVo);
-				chengDuJianGuanClient.notificationOrderInfo(statusVo);
-			});
-			
-			//开始将优惠券优惠的金额添加到明细中
-			BigDecimal couponDiscountAmount = chargingOrder.getCouponDiscountAmount();
-			if (null != couponDiscountAmount && couponDiscountAmount.compareTo(BigDecimal.ZERO) > 0) {
-				List<TChargingOrderAccountingStrategy> list = chargingOrderAccountingStrategyService.list(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>().eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrder.getId()));
-				BigDecimal reduce = list.stream().map(TChargingOrderAccountingStrategy::getPeriodServicePrice).reduce(BigDecimal.ZERO, BigDecimal::add);
-				for (TChargingOrderAccountingStrategy chargingOrderAccountingStrategy : list) {
-					BigDecimal periodServicePrice = chargingOrderAccountingStrategy.getPeriodServicePrice();
-					BigDecimal multiply = couponDiscountAmount.multiply(periodServicePrice.divide(reduce, new MathContext(4, RoundingMode.HALF_EVEN)));
-					periodServicePrice = periodServicePrice.subtract(multiply);
-					chargingOrderAccountingStrategy.setPeriodServicePrice(periodServicePrice.setScale(2, RoundingMode.HALF_EVEN));
-					chargingOrderAccountingStrategy.setCouponDiscountAmount(multiply.setScale(2, RoundingMode.HALF_EVEN));
-				}
-				chargingOrderAccountingStrategyService.updateBatchById(list);
-			}
-			
-			// 将枪状态重置为空闲
-			TChargingGun chargingGun = new TChargingGun();
-			chargingGun.setId(chargingOrder.getChargingGunId());
-			chargingGun.setStatus(2);
-			chargingGun.setChargingPower(BigDecimal.ZERO);
-			chargingGunClient.updateChargingGunById(chargingGun);
-			chargingGun = chargingGunClient.getChargingGunById(chargingOrder.getChargingGunId()).getData();
-			//推送状态给三方平台
-			if (2 == chargingOrder.getOrderSource() && 1 == site.getIsOpenSynchronization()) {
-				tcecClient.pushChargingGunStatus(chargingGun.getFullNumber(), 2);
-			}
-			
-			//添加积分
-			if (1 == chargingOrder.getOrderSource()) {
-				TIntegralRule integralRule = integralRuleClient.getSet().getData();
-				if (null != integralRule) {
-					TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData();
-					Integer num1 = JSON.parseObject(integralRule.getChargeCredit()).getInteger("num1");
-					Integer integral = chargingOrder.getServiceCharge().intValue() * num1;
-					if (null != appUser.getVipId()) {
-						TVip vip = vipClient.getInfo1(appUser.getVipId()).getData();
-						Integer doubleIntegration = vip.getDoubleIntegration();
-						//双倍积分
-						if (1 == doubleIntegration) {
-							integral *= 2;
-						}
-					}
-					
-					if (integral > 0) {
-						TAppUserIntegralChange appUserIntegralChange = new TAppUserIntegralChange();
-						appUserIntegralChange.setAppUserId(appUser.getId());
-						appUserIntegralChange.setChangeType(2);
-						appUserIntegralChange.setHistoricalIntegral(appUser.getPoints());
-						appUser.setPoints(appUser.getPoints() + integral);
-						appUserIntegralChange.setCurrentIntegral(appUser.getPoints());
-						appUserIntegralChange.setCreateTime(LocalDateTime.now());
-						appUserIntegralChange.setOrderCode(chargingOrder.getCode());
-						appUserIntegralChange.setExtension(chargingOrder.getId().toString());
-						appUserClient.updateAppUser(appUser);
-						appUserIntegralChangeClient.addAppUserIntegralChange(appUserIntegralChange);
-					}
-				}
-				
-				//计算用户标签
-				editUserTag(chargingOrder);
-				//用户推荐奖励
-				referralReward(chargingOrder);
-				
-				//开始构建退款费用
-				refundAmount = refundAmount.setScale(2, RoundingMode.HALF_EVEN);
-				Integer rechargePaymentType = chargingOrder.getRechargePaymentType();
-				if (refundAmount.compareTo(BigDecimal.ZERO) > 0) {
-					//构建退款明细
-					TChargingOrderRefund chargingOrderRefund = new TChargingOrderRefund();
-					chargingOrderRefund.setChargingOrderId(chargingOrder.getId());
-					SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyMMddHHmmssSSS");
-					chargingOrderRefund.setRefundCode("CDF" + sdf1.format(new Date()) + (Double.valueOf(Math.random() * 1000).intValue()));
-					chargingOrderRefund.setRefundAmount(refundAmount);
-					chargingOrderRefund.setPayType(rechargePaymentType);
-					chargingOrderRefund.setRefundStatus(1);
-					chargingOrderRefund.setCode(chargingOrder.getCode());
-					chargingOrderRefund.setRefundTitle("充电完成退款");
-					chargingOrderRefund.setRefundContent("充电完成退款");
-					chargingOrderRefund.setRefundReason("充电完成退款");
-					chargingOrderRefund.setRefundRemark("实际充电消费金额:" + chargingOrder.getPaymentAmount());
-					chargingOrderRefund.setRefundTotalAmount(refundAmount);
-					chargingOrderRefund.setPayAmount(rechargeAmount);
-					if (1 == rechargePaymentType) {
-						WxPaymentRefundModel model = new WxPaymentRefundModel();
-						model.setOut_trade_no(chargingOrder.getCode());
-						model.setOut_refund_no(chargingOrderRefund.getRefundCode());
-						model.setReason("充电完成退款");
-						model.setNotify_url("/payment/wx/refund/notify");
-						WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
-						amount.setRefund(refundAmount.multiply(new BigDecimal(100)).intValue());
-						amount.setTotal(rechargeAmount.multiply(new BigDecimal(100)).intValue());
-						amount.setCurrency("CNY");
-						model.setAmount(amount);
-						R<Map<String, Object>> result = wxPaymentClient.refundOrderR(model);
-						if (200 == result.getCode()) {
-							chargingOrderRefundService.save(chargingOrderRefund);
-							//手续费
-							Map<String, Object> amount1 = (Map<String, Object>) result.getData().get("amount");
-							Object refund_fee1 = amount1.get("refund_fee");
-							BigDecimal refund_fee = new BigDecimal(null == refund_fee1 ? "0" : refund_fee1.toString()).divide(new BigDecimal(100));
-							chargingOrderRefund.setRefundFee(refund_fee);
-							chargingOrderRefundService.updateById(chargingOrderRefund);
-						}
-					}
-					if (2 == rechargePaymentType) {
-						RefundReq dto = new RefundReq();
-						dto.setOutTradeNo(chargingOrder.getCode());
-						dto.setOutRequestNo(chargingOrderRefund.getRefundCode());
-						dto.setRefundAmount(refundAmount.toString());
-						dto.setRefundReason("充电完成退款");
-						RefundResp resp = aliPaymentClient.refund(dto).getData();
-						if (null != resp) {
-							chargingOrderRefundService.save(chargingOrderRefund);
-							this.chargingOrderStartupFailureWxRefund(chargingOrderRefund.getRefundCode(), resp.getTradeNo(), "SUCCESS", null);
-						}
-					}
-					if (3 == rechargePaymentType) {
-						RefundReq dto = new RefundReq();
-						dto.setOutTradeNo(chargingOrder.getRechargeSerialNumber());
-						dto.setOutRequestNo(chargingOrderRefund.getRefundCode());
-						dto.setRefundAmount(refundAmount.toString());
-						dto.setRefundReason("充电完成退款");
-						RefundResp resp = h5AliPaymentClient.refund(dto).getData();
-						if (null != resp && "10000".equals(resp.getCode())) {
-							chargingOrderRefundService.save(chargingOrderRefund);
-							this.chargingOrderStartupFailureWxRefund(chargingOrderRefund.getRefundCode(), resp.getTradeNo(), "SUCCESS", null);
-						}
-					}
-				}else{
-					//构建退款明细
-					TChargingOrderRefund chargingOrderRefund = new TChargingOrderRefund();
-					chargingOrderRefund.setChargingOrderId(chargingOrder.getId());
-					SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyMMddHHmmssSSS");
-					chargingOrderRefund.setRefundCode("CDF" + sdf1.format(new Date()) + (Double.valueOf(Math.random() * 1000).intValue()));
-					chargingOrderRefund.setRefundAmount(refundAmount);
-					chargingOrderRefund.setRefundStatus(2);
-					chargingOrderRefund.setPayType(rechargePaymentType);
-					chargingOrderRefund.setCode(chargingOrder.getCode());
-					chargingOrderRefund.setRefundTitle("充电完成退款");
-					chargingOrderRefund.setRefundContent("充电完成退款");
-					chargingOrderRefund.setRefundReason("充电完成退款");
-					chargingOrderRefund.setRefundRemark("实际充电消费金额:" + chargingOrder.getPaymentAmount());
-					chargingOrderRefund.setRefundTotalAmount(refundAmount);
-					chargingOrderRefund.setPayAmount(rechargeAmount);
-					chargingOrderRefund.setRefundTime(LocalDateTime.now());
-					chargingOrderRefundService.save(chargingOrderRefund);
+                //获取订单的计费策略
+                List<AccountingStrategyDetailOrder> accountingStrategyDetailOrderList = accountingStrategyDetailOrderClient.getAllAccountingStrategyDetailOrder(chargingOrder.getId()).getData();
+                if (accountingStrategyDetailOrderList.isEmpty()) {
+                    return R.fail("计费策略为空,无法计算费用");
+                }
+                accountingStrategyDetailOrderList.get(accountingStrategyDetailOrderList.size() - 1).setEndTime("23:59");
+                //开始处理计费明细数据和优惠数据
+                chargingOrderAccountingStrategyService.remove(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>().eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrder.getId()));
+                SimpleDateFormat sdfs = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+                List<AccountingStrategyDetailOrderVo> lists = new ArrayList<>();
+                List<UploadRealTimeMonitoringData> dataList = uploadRealTimeMonitoringDataService.getDataByOrderCode(chargingOrder.getCode());
+                if(!dataList.isEmpty()){
+                    vo.setStart_time(sdfs.format(dataList.get(dataList.size() - 1).getCreate_time()) + ".00");
+                    vo.setEnd_time(sdfs.format(dataList.get(0).getCreate_time()) + ".00");
+                }
 
-					chargingOrder.setRefundStatus(2);
-					chargingOrder.setRefundTime(LocalDateTime.now());
-					this.updateById(chargingOrder);
-				}
-			}
-			
-			//添加汇总统计数据
-			List<TChargingOrderAccountingStrategy> list4 = chargingOrderAccountingStrategyService.list(new QueryWrapper<TChargingOrderAccountingStrategy>().eq("charging_order_id", chargingOrder.getId()));
-			BigDecimal electronic_reduce = list4.stream().map(TChargingOrderAccountingStrategy::getPeriodElectricPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
-			BigDecimal service_reduce = list4.stream().map(TChargingOrderAccountingStrategy::getPeriodServicePrice).reduce(BigDecimal.ZERO, BigDecimal::add);
-			BigDecimal chargingCapacity = list4.stream().map(TChargingOrderAccountingStrategy::getChargingCapacity).reduce(BigDecimal.ZERO, BigDecimal::add);
-			BigDecimal serviceMoney = BigDecimal.ZERO;
-			BigDecimal paymentMoney = BigDecimal.ZERO;
-			long time = 0;
-			if (!chargingOrder.getOrderSource().equals(2)) {
-				serviceMoney = serviceMoney.add(service_reduce);
-				paymentMoney = paymentMoney.add(electronic_reduce).add(service_reduce);
-			} else {
-				serviceMoney = serviceMoney.add(service_reduce.multiply(new BigDecimal("0.8")));
-				paymentMoney = paymentMoney.add(electronic_reduce).add(service_reduce.multiply(new BigDecimal("0.8")));
-			}
-			if (chargingOrder.getStartTime() != null && chargingOrder.getEndTime() != null) {
-				LocalDateTime startTime = chargingOrder.getStartTime();
-				LocalDateTime endTime = chargingOrder.getEndTime();
-				// 计算时间差 单位秒
-				time = ChronoUnit.SECONDS.between(startTime, endTime);
-			}
-			TChargingOrderSummaryData summaryData = new TChargingOrderSummaryData();
-			summaryData.setChargingOrderId(chargingOrder.getId());
-			summaryData.setChargingCapacity(chargingCapacity);
-			summaryData.setChargingDuration(time);
-			summaryData.setIncome(paymentMoney.setScale(2, BigDecimal.ROUND_HALF_EVEN));
-			summaryData.setElectricPrice(electronic_reduce.setScale(2, BigDecimal.ROUND_HALF_EVEN));
-			summaryData.setServicePrice(serviceMoney.setScale(2, BigDecimal.ROUND_HALF_EVEN));
-			chargingOrderSummaryDataService.save(summaryData);
-			
-			//推送监管平台订单状态和订单详情
-			ChargingOrderVo chargingOrderVo = new ChargingOrderVo();
-			BeanUtils.copyProperties(chargingOrder, chargingOrderVo);
-			chargingMessageClient.pushOrderInfo(chargingOrderVo);
-			chargingMessageClient.pushOrderStatus(chargingOrderVo);
+                //跨天
+                if (!vo.getStart_time().split(" ")[0].equals(vo.getEnd_time().split(" ")[0])) {
+                    //当天的
+                    //开始通过计费策略遍历解析每个时段的费用明细
+                    String start_time = vo.getStart_time();
+                    String end_time = vo.getEnd_time();
+                    long start = sdfs.parse(start_time).getTime();
+                    long end = sdfs.parse(end_time).getTime();
+                    Class<? extends TransactionRecordMessageVO> clazz = vo.getClass();
+                    /**
+                     * "start_time": "2025-01-03 23:06:43.00",
+                     * 	"end_time": "2025-01-04 00:39:39.00",
+                     */
+                    for (int i = accountingStrategyDetailOrderList.size(); i > 0; i--) {
+                        AccountingStrategyDetailOrder strategyDetail = accountingStrategyDetailOrderList.get(i - 1);
+                        long time = sdfs.parse(start_time.split(" ")[0] + " " + strategyDetail.getEndTime() + ":00").getTime();
+                        if (time < start) {
+                            break;
+                        }
+                        //阶段(1=尖阶段,2=峰阶段,3=平阶段,4=谷阶段)
+                        Object invoke = null;
+                        switch (strategyDetail.getType()) {
+                            case 1:
+                                //充电度数
+                                invoke = clazz.getMethod("getSpike_charge" + (i)).invoke(vo);
+                                break;
+                            case 2:
+                                //充电度数
+                                invoke = clazz.getMethod("getPeak_charge" + (i)).invoke(vo);
+                                break;
+                            case 3:
+                                //充电度数
+                                invoke = clazz.getMethod("getFlat_charge" + (i)).invoke(vo);
+                                break;
+                            case 4:
+                                //充电度数
+                                invoke = clazz.getMethod("getValley_charge" + (i)).invoke(vo);
+                                break;
+                        }
+                        if (null == invoke || Double.valueOf(invoke.toString()) == 0) {
+                            continue;
+                        }
+                        BigDecimal sharp_peak_charge = new BigDecimal(invoke.toString());
+                        AccountingStrategyDetailOrderVo vo1 = new AccountingStrategyDetailOrderVo();
+                        BeanUtils.copyProperties(strategyDetail, vo1);
+                        vo1.setChargingCapacity(sharp_peak_charge);
+                        lists.add(0, vo1);
+                    }
+
+                    //第二天的
+                    //开始通过计费策略遍历解析每个时段的费用明细
+                    for (int i = 0; i < accountingStrategyDetailOrderList.size(); i++) {
+                        AccountingStrategyDetailOrder strategyDetail = accountingStrategyDetailOrderList.get(i);
+                        long time = sdfs.parse(end_time.split(" ")[0] + " " + strategyDetail.getStartTime() + ":00").getTime();
+                        if (time > end) {
+                            break;
+                        }
+                        //阶段(1=尖阶段,2=峰阶段,3=平阶段,4=谷阶段)
+                        Object invoke = null;
+                        switch (strategyDetail.getType()) {
+                            case 1:
+                                //充电度数
+                                invoke = clazz.getMethod("getSpike_charge" + (i + 1)).invoke(vo);
+                                break;
+                            case 2:
+                                //充电度数
+                                invoke = clazz.getMethod("getPeak_charge" + (i + 1)).invoke(vo);
+                                break;
+                            case 3:
+                                //充电度数
+                                invoke = clazz.getMethod("getFlat_charge" + (i + 1)).invoke(vo);
+                                break;
+                            case 4:
+                                //充电度数
+                                invoke = clazz.getMethod("getValley_charge" + (i + 1)).invoke(vo);
+                                break;
+                        }
+                        if (null == invoke || Double.valueOf(invoke.toString()) == 0) {
+                            continue;
+                        }
+                        BigDecimal sharp_peak_charge = new BigDecimal(invoke.toString());
+                        AccountingStrategyDetailOrderVo vo1 = new AccountingStrategyDetailOrderVo();
+                        BeanUtils.copyProperties(strategyDetail, vo1);
+                        vo1.setChargingCapacity(sharp_peak_charge);
+                        lists.add(vo1);
+                    }
+                } else {
+                    for (int i = 0; i < accountingStrategyDetailOrderList.size(); i++) {
+                        Class<? extends TransactionRecordMessageVO> clazz = vo.getClass();
+                        AccountingStrategyDetailOrder strategyDetail = accountingStrategyDetailOrderList.get(i);
+                        //阶段(1=尖阶段,2=峰阶段,3=平阶段,4=谷阶段)
+                        Object invoke = null;
+                        switch (strategyDetail.getType()) {
+                            case 1:
+                                //充电度数
+                                invoke = clazz.getMethod("getSpike_charge" + (i + 1)).invoke(vo);
+                                break;
+                            case 2:
+                                //充电度数
+                                invoke = clazz.getMethod("getPeak_charge" + (i + 1)).invoke(vo);
+                                break;
+                            case 3:
+                                //充电度数
+                                invoke = clazz.getMethod("getFlat_charge" + (i + 1)).invoke(vo);
+                                break;
+                            case 4:
+                                //充电度数
+                                invoke = clazz.getMethod("getValley_charge" + (i + 1)).invoke(vo);
+                                break;
+                        }
+                        if (null == invoke || Double.valueOf(invoke.toString()) == 0) {
+                            continue;
+                        }
+                        BigDecimal sharp_peak_charge = new BigDecimal(invoke.toString());
+                        AccountingStrategyDetailOrderVo vo1 = new AccountingStrategyDetailOrderVo();
+                        BeanUtils.copyProperties(strategyDetail, vo1);
+                        vo1.setChargingCapacity(sharp_peak_charge);
+                        lists.add(vo1);
+                    }
+                }
+
+                //开始处理明细
+                for (int i = 0; i < lists.size(); i++) {
+                    AccountingStrategyDetailOrderVo strategyDetail = lists.get(i);
+                    BigDecimal sharp_peak_charge = strategyDetail.getChargingCapacity();
+                    TChargingOrderAccountingStrategy chargingOrderAccountingStrategy = new TChargingOrderAccountingStrategy();
+                    chargingOrderAccountingStrategy.setChargingOrderId(chargingOrder.getId());
+                    chargingOrderAccountingStrategy.setAccountingStrategyDetailId(strategyDetail.getId());
+                    chargingOrderAccountingStrategy.setType(strategyDetail.getType());
+                    chargingOrderAccountingStrategy.setElectrovalence(strategyDetail.getElectrovalence());
+                    chargingOrderAccountingStrategy.setServiceCharge(strategyDetail.getServiceCharge());
+                    chargingOrderAccountingStrategy.setCostServiceCharge(strategyDetail.getCostServiceCharge());
+                    if (i == 0) {
+                        String time = vo.getStart_time().split(" ")[1];
+                        chargingOrderAccountingStrategy.setStartTime(time.substring(0, time.lastIndexOf(":")));
+                    } else {
+                        chargingOrderAccountingStrategy.setStartTime(strategyDetail.getStartTime());
+                    }
+                    if (i == lists.size() - 1) {
+                        String time = vo.getEnd_time().split(" ")[1];
+                        chargingOrderAccountingStrategy.setEndTime(time.substring(0, time.lastIndexOf(":")));
+                    } else {
+                        chargingOrderAccountingStrategy.setEndTime(strategyDetail.getEndTime());
+                    }
+
+                    //已充电总度数
+                    BigDecimal electrovalenc = strategyDetail.getElectrovalence().multiply(sharp_peak_charge);
+                    BigDecimal originalServicePrice = strategyDetail.getServiceCharge().multiply(sharp_peak_charge);
+                    BigDecimal serviceCharge = originalServicePrice;
+                    BigDecimal vipDiscountAmount = BigDecimal.ZERO;
+                    //计算优惠金额
+                    if (null != chargingOrder.getVipDiscount()) {
+                        //0.58折
+                        vipDiscountAmount = serviceCharge.multiply(new BigDecimal(1).subtract(chargingOrder.getVipDiscount()));
+                        serviceCharge = serviceCharge.multiply(chargingOrder.getVipDiscount());
+                    }
+                    chargingOrderAccountingStrategy.setChargingCapacity(sharp_peak_charge);
+                    chargingOrderAccountingStrategy.setPeriodElectricPrice(electrovalenc.setScale(4, RoundingMode.HALF_EVEN));
+                    chargingOrderAccountingStrategy.setPeriodServicePrice(serviceCharge.setScale(4, RoundingMode.HALF_EVEN));
+                    chargingOrderAccountingStrategy.setPeriodOriginalServicePrice(originalServicePrice.setScale(4, RoundingMode.HALF_EVEN));
+                    chargingOrderAccountingStrategy.setVipDiscountAmount(vipDiscountAmount.setScale(4, RoundingMode.HALF_EVEN));
+                    chargingOrderAccountingStrategy.setCreateTime(LocalDateTime.now());
+                    chargingOrderAccountingStrategyService.save(chargingOrderAccountingStrategy);
+                    //电费
+                    periodElectricPrice_total = periodElectricPrice_total.add(electrovalenc);
+                    //服务费(含折扣)
+                    serviceCharge_total = serviceCharge_total.add(serviceCharge);
+                    //服务费(不含折扣)
+                    periodServicePrice_total = periodServicePrice_total.add(originalServicePrice);
+                    //会员折扣优惠金额
+                    vipDiscountAmount_total = vipDiscountAmount_total.add(vipDiscountAmount);
+                    //原始总金额(不含折扣)
+                    total = total.add(electrovalenc.add(originalServicePrice));
+                }
+
+                BigDecimal orderAmount = BigDecimal.valueOf(total.doubleValue());
+                //原金额
+                BigDecimal rechargeAmount = chargingOrder.getRechargeAmount();
+                //支付金额
+                BigDecimal payAmount = periodElectricPrice_total.add(serviceCharge_total);
+                //退款金额=充值金额-实际支付金额
+                BigDecimal refundAmount = rechargeAmount.subtract(payAmount);
+
+                UploadRealTimeMonitoringData uploadRealTimeMonitoringData = uploadRealTimeMonitoringDataService.getLastDataById(chargingOrder.getCode());
+                if (null != uploadRealTimeMonitoringData && null == chargingOrder.getEndMode()) {
+                    Integer soc = uploadRealTimeMonitoringData.getSoc();
+                    if (soc >= 98) {
+                        chargingOrder.setEndMode(2);
+                    } else if (null != chargingOrder.getResidualAmount() && chargingOrder.getResidualAmount().compareTo(new BigDecimal(1)) <= 0) {
+                        chargingOrder.setEndMode(3);
+                    } else {
+                        chargingOrder.setEndMode(1);
+                    }
+                }
+                chargingOrder.setResidualAmount(rechargeAmount.subtract(total).setScale(2, RoundingMode.HALF_EVEN));
+
+                chargingOrder.setStartTime(LocalDateTime.parse(vo.getStart_time(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SS")));
+                chargingOrder.setEndTime(LocalDateTime.parse(vo.getEnd_time(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SS")));
+                chargingOrder.setStatus(5);
+                chargingOrder.setOrderAmount(orderAmount.setScale(2, RoundingMode.HALF_EVEN));
+                chargingOrder.setElectrovalence(periodElectricPrice_total.setScale(2, RoundingMode.HALF_EVEN));
+                chargingOrder.setChargingCapacity(vo.getTotal_electricity());
+                chargingOrder.setElectricity(vo.getTotal_electricity());
+                chargingOrder.setVipDiscountAmount(vipDiscountAmount_total);
+                if (vipDiscountAmount_total.compareTo(BigDecimal.ZERO) == 0) {
+                    chargingOrder.setVipDiscount(BigDecimal.valueOf(1));
+                }
+
+                //计算优惠券
+                BigDecimal couponDiscount = BigDecimal.ZERO;
+                if (null != chargingOrder.getAppCouponId()) {
+                    //判断实际充电金额是否满足优惠券使用条件,如果不满足则不适用优惠券。
+                    TAppCoupon appCoupon = appCouponClient.getAppCouponById(chargingOrder.getAppCouponId()).getData();
+                    String couponJson = appCoupon.getCouponJson();
+                    TCoupon tCoupon = JSON.parseObject(couponJson, TCoupon.class);
+                    Integer preferentialMode = tCoupon.getPreferentialMode();
+                    if (1 == preferentialMode) {
+                        //满减
+                        if (payAmount.compareTo(tCoupon.getMeetTheConditions()) >= 0) {
+                            BigDecimal couponDiscountAmount = tCoupon.getDiscountAmount();
+                            //如果优惠金额大于服务费金额,以服务费作为最大限制
+                            if (serviceCharge_total.compareTo(couponDiscountAmount) < 0) {
+                                couponDiscount = serviceCharge_total;
+                                serviceCharge_total = BigDecimal.ZERO;
+                            } else {
+                                couponDiscount = couponDiscountAmount;
+                            }
+                            appCoupon.setStatus(2);
+                            appCouponClient.updateAppCoupon(appCoupon);
+                        } else {
+                            appCouponClient.refund(chargingOrder.getAppCouponId().toString());
+                            chargingOrder.setAppCouponId(null);
+                            chargingOrder.setCouponDiscountAmount(BigDecimal.ZERO);
+                        }
+                    }
+                    if (2 == preferentialMode) {
+                        //抵扣
+                        if (payAmount.compareTo(tCoupon.getMeetTheConditions()) >= 0) {
+                            //折扣金额
+                            BigDecimal divide = payAmount.multiply(new BigDecimal(10).subtract(tCoupon.getDiscount())).divide(new BigDecimal(10));
+                            divide = divide.compareTo(tCoupon.getMaximumDiscountAmount()) > 0 ? tCoupon.getMaximumDiscountAmount() : divide;
+                            //如果优惠金额大于服务费金额,以服务费作为最大限制
+                            if (serviceCharge_total.compareTo(divide) < 0) {
+                                couponDiscount = serviceCharge_total;
+                                serviceCharge_total = BigDecimal.ZERO;
+                            } else {
+                                couponDiscount = divide;
+                            }
+
+                            appCoupon.setStatus(2);
+                            appCouponClient.updateAppCoupon(appCoupon);
+                        } else {
+                            chargingOrder.setAppCouponId(null);
+                            chargingOrder.setCouponDiscountAmount(BigDecimal.ZERO);
+                            appCouponClient.refund(chargingOrder.getAppCouponId().toString());
+                        }
+                    }
+                }
+                //优惠券优惠金额
+                couponDiscount = couponDiscount.setScale(4, RoundingMode.HALF_EVEN);
+                //退款金额+优惠券
+                refundAmount = refundAmount.add(couponDiscount);
+                //实际支付金额-优惠券
+                payAmount = payAmount.subtract(couponDiscount);
+                if (serviceCharge_total.compareTo(BigDecimal.ZERO) > 0) {
+                    serviceCharge_total = serviceCharge_total.subtract(couponDiscount);
+                }
+                chargingOrder.setCouponDiscountAmount(couponDiscount.setScale(2, RoundingMode.HALF_EVEN));
+                chargingOrder.setServiceCharge(serviceCharge_total.setScale(2, RoundingMode.HALF_EVEN));
+                chargingOrder.setPaymentAmount(payAmount.setScale(2, RoundingMode.HALF_EVEN));
+                chargingOrder.setRefundAmount(refundAmount.setScale(2, RoundingMode.HALF_EVEN));
+                chargingOrder.setRefundStatus(1);
+                UploadRealTimeMonitoringData asc = uploadRealTimeMonitoringDataService.getDataByOrderCode(chargingOrder.getCode(), "asc");
+                UploadRealTimeMonitoringData desc = uploadRealTimeMonitoringDataService.getDataByOrderCode(chargingOrder.getCode(), "desc");
+                if(null != asc){
+                    chargingOrder.setStartSoc(new BigDecimal(asc.getSoc()));
+                }
+                if(null != desc){
+                    chargingOrder.setEndSoc(new BigDecimal(desc.getSoc()));
+                }
+                this.updateById(chargingOrder);
+                redisService.setCacheObject("chargingOrderStatus:" + vo.getTransaction_serial_number(), 5, 100L, TimeUnit.SECONDS);
+
+                chargingOrder = this.getById(chargingOrder.getId());
+                Site site = siteClient.getSiteByIds(Arrays.asList(chargingOrder.getSiteId())).getData().get(0);
+                //推送三方平台
+                if (2 == chargingOrder.getOrderSource() && 1 == site.getIsOpenSynchronization()) {
+                    TChargingOrder finalChargingOrder = chargingOrder;
+                    new Thread(new Runnable() {
+                        @Override
+                        public void run() {
+                            tcecClient.notificationEquipChargeStatus(finalChargingOrder.getStartChargeSeq(), finalChargingOrder.getOperatorId());
+                            tcecClient.notificationStopChargeResult(finalChargingOrder.getStartChargeSeq(), finalChargingOrder.getChargingGunId().toString(),
+                                    finalChargingOrder.getOperatorId());
+                            tcecClient.notificationChargeOrderInfo(finalChargingOrder.getStartChargeSeq(), finalChargingOrder.getOperatorId());
+                        }
+                    }).start();
+                }
+                ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.SECONDS, new LinkedBlockingDeque<>());
+                TChargingOrder finalChargingOrder1 = chargingOrder;
+                threadPoolExecutor.execute(()->{
+                    //推送成都监管
+                    NotificationConnectorChargeStatusVo statusVo = new NotificationConnectorChargeStatusVo();
+                    statusVo.setOrderCode(finalChargingOrder1.getCode());
+                    statusVo.setChargingGunId(finalChargingOrder1.getChargingGunId());
+                    chengDuJianGuanClient.notificationConnectorChargeStatus(statusVo);
+                    chengDuJianGuanClient.notificationOrderInfo(statusVo);
+                });
+
+                //开始将优惠券优惠的金额添加到明细中
+                BigDecimal couponDiscountAmount = chargingOrder.getCouponDiscountAmount();
+                if (null != couponDiscountAmount && couponDiscountAmount.compareTo(BigDecimal.ZERO) > 0) {
+                    List<TChargingOrderAccountingStrategy> list = chargingOrderAccountingStrategyService.list(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>().eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrder.getId()));
+                    BigDecimal reduce = list.stream().map(TChargingOrderAccountingStrategy::getPeriodServicePrice).reduce(BigDecimal.ZERO, BigDecimal::add);
+                    for (TChargingOrderAccountingStrategy chargingOrderAccountingStrategy : list) {
+                        BigDecimal periodServicePrice = chargingOrderAccountingStrategy.getPeriodServicePrice();
+                        BigDecimal multiply = couponDiscountAmount.multiply(periodServicePrice.divide(reduce, new MathContext(4, RoundingMode.HALF_EVEN)));
+                        periodServicePrice = periodServicePrice.subtract(multiply);
+                        chargingOrderAccountingStrategy.setPeriodServicePrice(periodServicePrice.setScale(2, RoundingMode.HALF_EVEN));
+                        chargingOrderAccountingStrategy.setCouponDiscountAmount(multiply.setScale(2, RoundingMode.HALF_EVEN));
+                    }
+                    chargingOrderAccountingStrategyService.updateBatchById(list);
+                }
+
+                // 将枪状态重置为空闲
+                TChargingGun chargingGun = new TChargingGun();
+                chargingGun.setId(chargingOrder.getChargingGunId());
+                chargingGun.setStatus(2);
+                chargingGun.setChargingPower(BigDecimal.ZERO);
+                chargingGunClient.updateChargingGunById(chargingGun);
+                chargingGun = chargingGunClient.getChargingGunById(chargingOrder.getChargingGunId()).getData();
+                //推送状态给三方平台
+                if (2 == chargingOrder.getOrderSource() && 1 == site.getIsOpenSynchronization()) {
+                    tcecClient.pushChargingGunStatus(chargingGun.getFullNumber(), 2);
+                }
+
+                //添加积分
+                if (1 == chargingOrder.getOrderSource()) {
+                    TIntegralRule integralRule = integralRuleClient.getSet().getData();
+                    if (null != integralRule) {
+                        TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData();
+                        Integer num1 = JSON.parseObject(integralRule.getChargeCredit()).getInteger("num1");
+                        Integer integral = chargingOrder.getServiceCharge().intValue() * num1;
+                        if (null != appUser.getVipId()) {
+                            TVip vip = vipClient.getInfo1(appUser.getVipId()).getData();
+                            Integer doubleIntegration = vip.getDoubleIntegration();
+                            //双倍积分
+                            if (1 == doubleIntegration) {
+                                integral *= 2;
+                            }
+                        }
+
+                        if (integral > 0) {
+                            TAppUserIntegralChange appUserIntegralChange = new TAppUserIntegralChange();
+                            appUserIntegralChange.setAppUserId(appUser.getId());
+                            appUserIntegralChange.setChangeType(2);
+                            appUserIntegralChange.setHistoricalIntegral(appUser.getPoints());
+                            appUser.setPoints(appUser.getPoints() + integral);
+                            appUserIntegralChange.setCurrentIntegral(appUser.getPoints());
+                            appUserIntegralChange.setCreateTime(LocalDateTime.now());
+                            appUserIntegralChange.setOrderCode(chargingOrder.getCode());
+                            appUserIntegralChange.setExtension(chargingOrder.getId().toString());
+                            appUserClient.updateAppUser(appUser);
+                            appUserIntegralChangeClient.addAppUserIntegralChange(appUserIntegralChange);
+                        }
+                    }
+
+                    //计算用户标签
+                    editUserTag(chargingOrder);
+                    //用户推荐奖励
+                    referralReward(chargingOrder);
+
+                    //开始构建退款费用
+                    refundAmount = refundAmount.setScale(2, RoundingMode.HALF_EVEN);
+                    Integer rechargePaymentType = chargingOrder.getRechargePaymentType();
+                    if (refundAmount.compareTo(BigDecimal.ZERO) > 0) {
+                        //构建退款明细
+                        TChargingOrderRefund chargingOrderRefund = new TChargingOrderRefund();
+                        chargingOrderRefund.setChargingOrderId(chargingOrder.getId());
+                        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyMMddHHmmssSSS");
+                        chargingOrderRefund.setRefundCode("CDF" + sdf1.format(new Date()) + (Double.valueOf(Math.random() * 1000).intValue()));
+                        chargingOrderRefund.setRefundAmount(refundAmount);
+                        chargingOrderRefund.setPayType(rechargePaymentType);
+                        chargingOrderRefund.setRefundStatus(1);
+                        chargingOrderRefund.setCode(chargingOrder.getCode());
+                        chargingOrderRefund.setRefundTitle("充电完成退款");
+                        chargingOrderRefund.setRefundContent("充电完成退款");
+                        chargingOrderRefund.setRefundReason("充电完成退款");
+                        chargingOrderRefund.setRefundRemark("实际充电消费金额:" + chargingOrder.getPaymentAmount());
+                        chargingOrderRefund.setRefundTotalAmount(refundAmount);
+                        chargingOrderRefund.setPayAmount(rechargeAmount);
+                        if (1 == rechargePaymentType) {
+                            WxPaymentRefundModel model = new WxPaymentRefundModel();
+                            model.setOut_trade_no(chargingOrder.getCode());
+                            model.setOut_refund_no(chargingOrderRefund.getRefundCode());
+                            model.setReason("充电完成退款");
+                            model.setNotify_url("/payment/wx/refund/notify");
+                            WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
+                            amount.setRefund(refundAmount.multiply(new BigDecimal(100)).intValue());
+                            amount.setTotal(rechargeAmount.multiply(new BigDecimal(100)).intValue());
+                            amount.setCurrency("CNY");
+                            model.setAmount(amount);
+                            R<Map<String, Object>> result = wxPaymentClient.refundOrderR(model);
+                            if (200 == result.getCode()) {
+                                chargingOrderRefundService.save(chargingOrderRefund);
+                                //手续费
+                                Map<String, Object> amount1 = (Map<String, Object>) result.getData().get("amount");
+                                Object refund_fee1 = amount1.get("refund_fee");
+                                BigDecimal refund_fee = new BigDecimal(null == refund_fee1 ? "0" : refund_fee1.toString()).divide(new BigDecimal(100));
+                                chargingOrderRefund.setRefundFee(refund_fee);
+                                chargingOrderRefundService.updateById(chargingOrderRefund);
+                            }
+                        }
+                        if (2 == rechargePaymentType) {
+                            RefundReq dto = new RefundReq();
+                            dto.setOutTradeNo(chargingOrder.getCode());
+                            dto.setOutRequestNo(chargingOrderRefund.getRefundCode());
+                            dto.setRefundAmount(refundAmount.toString());
+                            dto.setRefundReason("充电完成退款");
+                            RefundResp resp = aliPaymentClient.refund(dto).getData();
+                            if (null != resp) {
+                                chargingOrderRefundService.save(chargingOrderRefund);
+                                this.chargingOrderStartupFailureWxRefund(chargingOrderRefund.getRefundCode(), resp.getTradeNo(), "SUCCESS", null);
+                            }
+                        }
+                        if (3 == rechargePaymentType) {
+                            RefundReq dto = new RefundReq();
+                            dto.setOutTradeNo(chargingOrder.getRechargeSerialNumber());
+                            dto.setOutRequestNo(chargingOrderRefund.getRefundCode());
+                            dto.setRefundAmount(refundAmount.toString());
+                            dto.setRefundReason("充电完成退款");
+                            RefundResp resp = h5AliPaymentClient.refund(dto).getData();
+                            if (null != resp && "10000".equals(resp.getCode())) {
+                                chargingOrderRefundService.save(chargingOrderRefund);
+                                this.chargingOrderStartupFailureWxRefund(chargingOrderRefund.getRefundCode(), resp.getTradeNo(), "SUCCESS", null);
+                            }
+                        }
+                    }else{
+                        //构建退款明细
+                        TChargingOrderRefund chargingOrderRefund = new TChargingOrderRefund();
+                        chargingOrderRefund.setChargingOrderId(chargingOrder.getId());
+                        SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyMMddHHmmssSSS");
+                        chargingOrderRefund.setRefundCode("CDF" + sdf1.format(new Date()) + (Double.valueOf(Math.random() * 1000).intValue()));
+                        chargingOrderRefund.setRefundAmount(refundAmount);
+                        chargingOrderRefund.setRefundStatus(2);
+                        chargingOrderRefund.setPayType(rechargePaymentType);
+                        chargingOrderRefund.setCode(chargingOrder.getCode());
+                        chargingOrderRefund.setRefundTitle("充电完成退款");
+                        chargingOrderRefund.setRefundContent("充电完成退款");
+                        chargingOrderRefund.setRefundReason("充电完成退款");
+                        chargingOrderRefund.setRefundRemark("实际充电消费金额:" + chargingOrder.getPaymentAmount());
+                        chargingOrderRefund.setRefundTotalAmount(refundAmount);
+                        chargingOrderRefund.setPayAmount(rechargeAmount);
+                        chargingOrderRefund.setRefundTime(LocalDateTime.now());
+                        chargingOrderRefundService.save(chargingOrderRefund);
+
+                        chargingOrder.setRefundStatus(2);
+                        chargingOrder.setRefundTime(LocalDateTime.now());
+                        this.updateById(chargingOrder);
+                    }
+                }
+
+                //添加汇总统计数据
+                List<TChargingOrderAccountingStrategy> list4 = chargingOrderAccountingStrategyService.list(new QueryWrapper<TChargingOrderAccountingStrategy>().eq("charging_order_id", chargingOrder.getId()));
+                BigDecimal electronic_reduce = list4.stream().map(TChargingOrderAccountingStrategy::getPeriodElectricPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
+                BigDecimal service_reduce = list4.stream().map(TChargingOrderAccountingStrategy::getPeriodServicePrice).reduce(BigDecimal.ZERO, BigDecimal::add);
+                BigDecimal chargingCapacity = list4.stream().map(TChargingOrderAccountingStrategy::getChargingCapacity).reduce(BigDecimal.ZERO, BigDecimal::add);
+                BigDecimal serviceMoney = BigDecimal.ZERO;
+                BigDecimal paymentMoney = BigDecimal.ZERO;
+                long time = 0;
+                if (!chargingOrder.getOrderSource().equals(2)) {
+                    serviceMoney = serviceMoney.add(service_reduce);
+                    paymentMoney = paymentMoney.add(electronic_reduce).add(service_reduce);
+                } else {
+                    serviceMoney = serviceMoney.add(service_reduce.multiply(new BigDecimal("0.8")));
+                    paymentMoney = paymentMoney.add(electronic_reduce).add(service_reduce.multiply(new BigDecimal("0.8")));
+                }
+                if (chargingOrder.getStartTime() != null && chargingOrder.getEndTime() != null) {
+                    LocalDateTime startTime = chargingOrder.getStartTime();
+                    LocalDateTime endTime = chargingOrder.getEndTime();
+                    // 计算时间差 单位秒
+                    time = ChronoUnit.SECONDS.between(startTime, endTime);
+                }
+                TChargingOrderSummaryData summaryData = new TChargingOrderSummaryData();
+                summaryData.setChargingOrderId(chargingOrder.getId());
+                summaryData.setChargingCapacity(chargingCapacity);
+                summaryData.setChargingDuration(time);
+                summaryData.setIncome(paymentMoney.setScale(2, BigDecimal.ROUND_HALF_EVEN));
+                summaryData.setElectricPrice(electronic_reduce.setScale(2, BigDecimal.ROUND_HALF_EVEN));
+                summaryData.setServicePrice(serviceMoney.setScale(2, BigDecimal.ROUND_HALF_EVEN));
+                chargingOrderSummaryDataService.save(summaryData);
+
+                //推送监管平台订单状态和订单详情
+                ChargingOrderVo chargingOrderVo = new ChargingOrderVo();
+                BeanUtils.copyProperties(chargingOrder, chargingOrderVo);
+                chargingMessageClient.pushOrderInfo(chargingOrderVo);
+                chargingMessageClient.pushOrderStatus(chargingOrderVo);
+            }
 		} catch (Exception e) {
 			e.printStackTrace();
 		} finally {
@@ -3254,7 +3275,7 @@
 	public TChargingOrder getChargingOrderByLicensePlate(GetChargingOrderByLicensePlate query) {
 		TChargingOrder one = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getPlateNum, query.getLicensePlate())
 				.eq(TChargingOrder::getDelFlag, 0).between(TChargingOrder::getStartTime, query.getStartTime(), LocalDateTime.now())
-				.eq(TChargingOrder::getRechargePaymentStatus, 2).in(TChargingOrder::getStatus, Arrays.asList(4, 5))
+				.eq(TChargingOrder::getRechargePaymentStatus, 2).in(TChargingOrder::getStatus, Arrays.asList(3, 4, 5))
                 .last(" order by start_time desc limit 0, 1"));
 		return one;
 	}
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderInvoiceServiceImpl.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderInvoiceServiceImpl.java
index 9bdeb53..69f4a89 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderInvoiceServiceImpl.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderInvoiceServiceImpl.java
@@ -106,7 +106,7 @@
 		Long userId = tokenService.getLoginUserApplet().getUserId();
 		RLock lock = redissonClient.getLock("ADD_ORDER_INVOICE:" + userId);
 		try {
-			boolean tryLock = lock.tryLock(5, TimeUnit.SECONDS);
+			boolean tryLock = lock.tryLock(5, 5, TimeUnit.SECONDS);
 			if(tryLock){
 				String orders = addOrderInvoice.getOrders();
 				if(StringUtils.isEmpty(orders)){
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TShoppingOrderServiceImpl.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TShoppingOrderServiceImpl.java
index a33ba2a..b6a365f 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TShoppingOrderServiceImpl.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TShoppingOrderServiceImpl.java
@@ -507,13 +507,16 @@
             //redis锁 和支付使用同一个锁
             RLock lock = redissonClient.getLock("SHOPPING_GOODS_LOCK");
             try {
-                lock.tryLock(5, 30, TimeUnit.SECONDS);
-                TGoods goods = goodsClient.getGoodsById(shoppingOrder.getGoodsId()).getData();
-                Integer inventory = goods.getInventory();
-                if(-1 != inventory){
-                    goods.setInventory(inventory + shoppingOrder.getPurchaseQuantity());
-                    goodsClient.updateGoods(goods);
+                boolean tryLock = lock.tryLock(5, 30, TimeUnit.SECONDS);
+                if(tryLock){
+                    TGoods goods = goodsClient.getGoodsById(shoppingOrder.getGoodsId()).getData();
+                    Integer inventory = goods.getInventory();
+                    if(-1 != inventory){
+                        goods.setInventory(inventory + shoppingOrder.getPurchaseQuantity());
+                        goodsClient.updateGoods(goods);
+                    }
                 }
+
             }catch (Exception e){
                 e.printStackTrace();
             }finally {
@@ -526,17 +529,19 @@
             //redis锁 和支付使用同一个锁
             RLock lock = redissonClient.getLock("SHOPPING_COUPON_LOCK");
             try {
-                lock.tryLock(5, 30, TimeUnit.SECONDS);
-                TCoupon coupon = couponClient.getCouponById1(shoppingOrder.getCouponId()).getData();
-                Integer inventory = coupon.getInventoryQuantity();
-                if(-1 != inventory){
-                    coupon.setInventoryQuantity(inventory + shoppingOrder.getPurchaseQuantity());
-                    couponClient.updateCoupon(coupon);
+                boolean tryLock = lock.tryLock(5, 5, TimeUnit.SECONDS);
+                if(tryLock){
+                    TCoupon coupon = couponClient.getCouponById1(shoppingOrder.getCouponId()).getData();
+                    Integer inventory = coupon.getInventoryQuantity();
+                    if(-1 != inventory){
+                        coupon.setInventoryQuantity(inventory + shoppingOrder.getPurchaseQuantity());
+                        couponClient.updateCoupon(coupon);
+                    }
                 }
+
             }catch (Exception e){
                 e.printStackTrace();
             }finally {
-                //解锁
                 lock.unlock();
             }
         }
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/task/TaskUtil.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/task/TaskUtil.java
index 066024d..fef21ba 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/task/TaskUtil.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/task/TaskUtil.java
@@ -41,11 +41,14 @@
 import com.ruoyi.payment.api.model.RefundResp;
 import com.ruoyi.payment.api.model.WxPaymentRefundModel;
 import lombok.extern.slf4j.Slf4j;
+import org.redisson.api.RLock;
+import org.redisson.api.RedissonClient;
 import org.springframework.beans.BeanUtils;
 import org.springframework.boot.web.context.WebServerInitializedEvent;
 import org.springframework.context.ApplicationListener;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
+import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
 import java.math.BigDecimal;
@@ -138,6 +141,9 @@
     @Resource
     private ChengDuJianGuanClient chengDuJianGuanClient;
 
+    @Resource
+    private RedissonClient redissonClient;
+
 
     @Scheduled(fixedRate = 1000 * 60)
     public void taskOneMinutes() {
@@ -181,12 +187,12 @@
                                 break;
                             }
                             try {
-                                Thread.sleep(5000);
+                                Thread.sleep(1000);
                             } catch (InterruptedException e) {
                                 throw new RuntimeException(e);
                             }
                             num++;
-                            if(num > 10){
+                            if(num > 30){
                                 break;
                             }
                         }
@@ -196,6 +202,7 @@
                     }
                 }
             }
+
             //处理退款中的数据
             List<TChargingOrder> stoppedOrder = chargingOrderService.findStoppedOrder();
             log.info("定时任务执行,查询到停止中的订单数量:{}", stoppedOrder.size());
@@ -225,6 +232,8 @@
                     endOrder(order);
                 }
             }
+
+
             //处理状态为充电中,但硬件已完成的订单
             List<TChargingOrder> chargingOrder = chargingOrderService.findChargingOrder();
             log.info("定时任务执行,查询到充电中的订单数量:{}", chargingOrder.size());
@@ -250,8 +259,19 @@
                     BeanUtils.copyProperties(one, vo);
                     R r = chargingOrderService.endChargeBillingCharge(vo);
                     log.info("定时任务执行,充电中的订单处理结果:{}", JSON.toJSONString(r));
+                }else{
+                    //判断充电流水超过15分钟没有更新,则判定为充电结束
+                    List<UploadRealTimeMonitoringData> dataList = uploadRealTimeMonitoringDataService.getDataByOrderCode(order.getCode());
+                    if(!dataList.isEmpty()){
+                        UploadRealTimeMonitoringData uploadRealTimeMonitoringData = dataList.get(0);
+                        Date createTime = uploadRealTimeMonitoringData.getCreate_time();
+                        if(System.currentTimeMillis() - createTime.getTime() - (8 * 60 * 60 * 1000) > 1000 * 60 * 30){
+                            endOrder(order);
+                        }
+                    }
                 }
             }
+
             //处理还未退款,但是订单状态已结束的数据
             List<TChargingOrder> endChargingOrder = chargingOrderService.findEndChargingOrder();
             log.info("定时任务执行,查询到已结束未退款的订单数量:{}", endChargingOrder.size());
@@ -310,422 +330,433 @@
 
 
 
+    @Transactional
     public void endOrder(TChargingOrder order){
-        List<UploadRealTimeMonitoringData> dataList = uploadRealTimeMonitoringDataService.getDataByOrderCode(order.getCode());
-        if(!dataList.isEmpty()){
-            //获取当前订单的计费规则,然后分段计算总的度数和充电金额
-            List<AccountingStrategyDetailOrder> detailOrders = accountingStrategyDetailOrderService.list(new LambdaQueryWrapper<AccountingStrategyDetailOrder>()
-                    .eq(AccountingStrategyDetailOrder::getChargingOrderId, order.getId()).last(" order by start_time"));
-            detailOrders.get(detailOrders.size() - 1).setEndTime("23:59");
-            SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
-            //开始解析每个时段的充电度数
-            BigDecimal decimal = BigDecimal.ZERO;
-            //如果使用优惠券需要判断优惠券是否满足使用条件
-            //退款金额=优惠券金额+剩余充电金额
-            BigDecimal periodElectricPrice_total = BigDecimal.ZERO;
-            BigDecimal periodServicePrice_total = BigDecimal.ZERO;
-            BigDecimal vipDiscountAmount_total = BigDecimal.ZERO;
-            BigDecimal serviceCharge_total = BigDecimal.ZERO;
-            BigDecimal total = BigDecimal.ZERO;
-            //判断实时数据是否跨天
-            SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");
-            Date end_time = dataList.get(0).getCreate_time();
-            String end = sdf2.format(end_time);
-            Date start_time = dataList.get(dataList.size() - 1).getCreate_time();
-            String start = sdf2.format(start_time);
-            if(!end.equals(start)){
-                List<AccountingStrategyDetailOrder> list = detailOrders.stream().map(s->{
-                    AccountingStrategyDetailOrder accountingStrategyDetailOrder = new AccountingStrategyDetailOrder();
-                    BeanUtils.copyProperties(s, accountingStrategyDetailOrder);
-                    return accountingStrategyDetailOrder;
-                }).collect(Collectors.toList());
-                for (AccountingStrategyDetailOrder detailOrder : detailOrders) {
-                    detailOrder.setStartTime(start + " " + detailOrder.getStartTime());
-                    detailOrder.setEndTime(start + " " + detailOrder.getEndTime());
-                }
-                for (AccountingStrategyDetailOrder detailOrder : list) {
-                    detailOrder.setStartTime(end + " " + detailOrder.getStartTime());
-                    detailOrder.setEndTime(end + " " + detailOrder.getEndTime());
-                }
-                detailOrders.addAll(list);
-            }else{
-                for (AccountingStrategyDetailOrder detailOrder : detailOrders) {
-                    detailOrder.setStartTime(start + " " + detailOrder.getStartTime());
-                    detailOrder.setEndTime(start + " " + detailOrder.getEndTime());
-                }
-            }
-
-            SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyMMddHHmm");
-            List<TChargingOrderAccountingStrategy> list = new ArrayList<>();
-            for (AccountingStrategyDetailOrder detailOrder : detailOrders) {
-                long startTime = Long.parseLong(detailOrder.getStartTime().replaceAll("-", "").replaceAll(" ", "").replaceAll(":", ""));
-                long endTime = Long.parseLong(detailOrder.getEndTime().replaceAll("-", "").replaceAll(" ", "").replaceAll(":", ""));
-                List<UploadRealTimeMonitoringData> collect = dataList.stream().filter(s -> Long.parseLong(sdf1.format(s.getCreate_time())) > startTime && Long.parseLong(sdf1.format(s.getCreate_time())) <= endTime).collect(Collectors.toList());
-
-                if(!collect.isEmpty()){
-                    //升序排序
-                    collect.sort(new Comparator<UploadRealTimeMonitoringData>(){
-                        @Override
-                        public int compare(UploadRealTimeMonitoringData o1, UploadRealTimeMonitoringData o2) {
-                            return o1.getCharging_degree().compareTo(o2.getCharging_degree());
+        RLock lock = redissonClient.getLock("endOrder:" + order.getCode());
+        try {
+            boolean tryLock = lock.tryLock(60, 60, TimeUnit.SECONDS);
+            if(tryLock){
+                List<UploadRealTimeMonitoringData> dataList = uploadRealTimeMonitoringDataService.getDataByOrderCode(order.getCode());
+                if(!dataList.isEmpty()){
+                    //获取当前订单的计费规则,然后分段计算总的度数和充电金额
+                    List<AccountingStrategyDetailOrder> detailOrders = accountingStrategyDetailOrderService.list(new LambdaQueryWrapper<AccountingStrategyDetailOrder>()
+                            .eq(AccountingStrategyDetailOrder::getChargingOrderId, order.getId()).last(" order by start_time"));
+                    detailOrders.get(detailOrders.size() - 1).setEndTime("23:59");
+                    SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
+                    //开始解析每个时段的充电度数
+                    BigDecimal decimal = BigDecimal.ZERO;
+                    //如果使用优惠券需要判断优惠券是否满足使用条件
+                    //退款金额=优惠券金额+剩余充电金额
+                    BigDecimal periodElectricPrice_total = BigDecimal.ZERO;
+                    BigDecimal periodServicePrice_total = BigDecimal.ZERO;
+                    BigDecimal vipDiscountAmount_total = BigDecimal.ZERO;
+                    BigDecimal serviceCharge_total = BigDecimal.ZERO;
+                    BigDecimal total = BigDecimal.ZERO;
+                    //判断实时数据是否跨天
+                    SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd");
+                    Date end_time = dataList.get(0).getCreate_time();
+                    String end = sdf2.format(end_time);
+                    Date start_time = dataList.get(dataList.size() - 1).getCreate_time();
+                    String start = sdf2.format(start_time);
+                    if(!end.equals(start)){
+                        List<AccountingStrategyDetailOrder> list = detailOrders.stream().map(s->{
+                            AccountingStrategyDetailOrder accountingStrategyDetailOrder = new AccountingStrategyDetailOrder();
+                            BeanUtils.copyProperties(s, accountingStrategyDetailOrder);
+                            return accountingStrategyDetailOrder;
+                        }).collect(Collectors.toList());
+                        for (AccountingStrategyDetailOrder detailOrder : detailOrders) {
+                            detailOrder.setStartTime(start + " " + detailOrder.getStartTime());
+                            detailOrder.setEndTime(start + " " + detailOrder.getEndTime());
                         }
+                        for (AccountingStrategyDetailOrder detailOrder : list) {
+                            detailOrder.setStartTime(end + " " + detailOrder.getStartTime());
+                            detailOrder.setEndTime(end + " " + detailOrder.getEndTime());
+                        }
+                        detailOrders.addAll(list);
+                    }else{
+                        for (AccountingStrategyDetailOrder detailOrder : detailOrders) {
+                            detailOrder.setStartTime(start + " " + detailOrder.getStartTime());
+                            detailOrder.setEndTime(start + " " + detailOrder.getEndTime());
+                        }
+                    }
+
+                    SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyMMddHHmm");
+                    List<TChargingOrderAccountingStrategy> list = new ArrayList<>();
+                    for (AccountingStrategyDetailOrder detailOrder : detailOrders) {
+                        long startTime = Long.parseLong(detailOrder.getStartTime().replaceAll("-", "").replaceAll(" ", "").replaceAll(":", ""));
+                        long endTime = Long.parseLong(detailOrder.getEndTime().replaceAll("-", "").replaceAll(" ", "").replaceAll(":", ""));
+                        List<UploadRealTimeMonitoringData> collect = dataList.stream().filter(s -> Long.parseLong(sdf1.format(s.getCreate_time())) > startTime && Long.parseLong(sdf1.format(s.getCreate_time())) <= endTime).collect(Collectors.toList());
+
+                        if(!collect.isEmpty()){
+                            //升序排序
+                            collect.sort(new Comparator<UploadRealTimeMonitoringData>(){
+                                @Override
+                                public int compare(UploadRealTimeMonitoringData o1, UploadRealTimeMonitoringData o2) {
+                                    return o1.getCharging_degree().compareTo(o2.getCharging_degree());
+                                }
+                            });
+                            UploadRealTimeMonitoringData uploadRealTimeMonitoringData = collect.get(collect.size() - 1);
+                            BigDecimal chargingDegree = uploadRealTimeMonitoringData.getCharging_degree();
+                            BigDecimal subtract = chargingDegree.subtract(decimal);
+                            decimal = chargingDegree;
+                            if(subtract.compareTo(BigDecimal.ZERO) > 0){
+                                //组装充电明细数据
+                                TChargingOrderAccountingStrategy chargingOrderAccountingStrategy = new TChargingOrderAccountingStrategy();
+                                chargingOrderAccountingStrategy.setChargingOrderId(order.getId());
+                                chargingOrderAccountingStrategy.setAccountingStrategyDetailId(detailOrder.getId());
+                                chargingOrderAccountingStrategy.setType(detailOrder.getType());
+                                chargingOrderAccountingStrategy.setElectrovalence(detailOrder.getElectrovalence());
+                                chargingOrderAccountingStrategy.setServiceCharge(detailOrder.getServiceCharge());
+                                chargingOrderAccountingStrategy.setCostServiceCharge(detailOrder.getCostServiceCharge());
+                                chargingOrderAccountingStrategy.setChargingCapacity(subtract);
+                                chargingOrderAccountingStrategy.setCreateTime(LocalDateTime.now());
+
+                                if (list.size() == 0) {
+                                    String time = sdf.format(collect.get(0).getCreate_time());
+                                    chargingOrderAccountingStrategy.setStartTime(time);
+                                } else {
+                                    chargingOrderAccountingStrategy.setStartTime(detailOrder.getStartTime().split(" ")[1]);
+                                }
+                                chargingOrderAccountingStrategy.setEndTime(detailOrder.getEndTime().split(" ")[1]);
+
+                                //已充电总度数
+                                BigDecimal electrovalenc = detailOrder.getElectrovalence().multiply(subtract);
+                                BigDecimal originalServicePrice = detailOrder.getServiceCharge().multiply(subtract);
+                                BigDecimal serviceCharge = originalServicePrice;
+                                BigDecimal vipDiscountAmount = BigDecimal.ZERO;
+                                //计算优惠金额
+                                if (null != order.getVipDiscount()) {
+                                    //0.58折
+                                    vipDiscountAmount = serviceCharge.multiply(new BigDecimal(1).subtract(order.getVipDiscount()));
+                                    serviceCharge = serviceCharge.multiply(order.getVipDiscount());
+                                }
+                                chargingOrderAccountingStrategy.setPeriodElectricPrice(electrovalenc.setScale(4, RoundingMode.HALF_EVEN));
+                                chargingOrderAccountingStrategy.setPeriodServicePrice(serviceCharge.setScale(4, RoundingMode.HALF_EVEN));
+                                chargingOrderAccountingStrategy.setPeriodOriginalServicePrice(originalServicePrice.setScale(4, RoundingMode.HALF_EVEN));
+                                chargingOrderAccountingStrategy.setVipDiscountAmount(vipDiscountAmount.setScale(4, RoundingMode.HALF_EVEN));
+                                chargingOrderAccountingStrategy.setCreateTime(LocalDateTime.now());
+                                list.add(chargingOrderAccountingStrategy);
+                                //电费
+                                periodElectricPrice_total = periodElectricPrice_total.add(electrovalenc);
+                                //服务费(含折扣)
+                                serviceCharge_total = serviceCharge_total.add(serviceCharge);
+                                //服务费(不含折扣)
+                                periodServicePrice_total = periodServicePrice_total.add(originalServicePrice);
+                                //会员折扣优惠金额
+                                vipDiscountAmount_total = vipDiscountAmount_total.add(vipDiscountAmount);
+                                //原始总金额(不含折扣)
+                                total = total.add(electrovalenc.add(originalServicePrice));
+                            }
+                        }
+
+                    }
+                    list.get(list.size() - 1).setEndTime(sdf.format(dataList.get(0).getCreate_time()));
+                    chargingOrderAccountingStrategyService.saveBatch(list);
+
+                    BigDecimal orderAmount = BigDecimal.valueOf(total.doubleValue());
+                    //原金额
+                    BigDecimal rechargeAmount = order.getRechargeAmount();
+                    //支付金额
+                    BigDecimal payAmount = periodElectricPrice_total.add(serviceCharge_total);
+                    //退款金额=充值金额-实际支付金额
+                    BigDecimal refundAmount = rechargeAmount.subtract(payAmount);
+
+                    UploadRealTimeMonitoringData uploadRealTimeMonitoringData = uploadRealTimeMonitoringDataService.getLastDataById(order.getCode());
+                    if (null != uploadRealTimeMonitoringData && null == order.getEndMode()) {
+                        Integer soc = uploadRealTimeMonitoringData.getSoc();
+                        if (soc >= 98) {
+                            order.setEndMode(2);
+                        } else if (null != order.getResidualAmount() && order.getResidualAmount().compareTo(new BigDecimal(1)) <= 0) {
+                            order.setEndMode(3);
+                        } else {
+                            order.setEndMode(1);
+                        }
+                    }
+
+                    order.setResidualAmount(rechargeAmount.subtract(total).setScale(2, RoundingMode.HALF_EVEN));
+                    order.setStartTime(list.get(0).getCreateTime());
+                    order.setEndTime(list.get(list.size() - 1).getCreateTime());
+                    order.setStatus(5);
+                    order.setOrderAmount(orderAmount.setScale(2, RoundingMode.HALF_EVEN));
+                    order.setElectrovalence(periodElectricPrice_total.setScale(2, RoundingMode.HALF_EVEN));
+                    order.setChargingCapacity(list.get(list.size() - 1).getChargingCapacity());
+                    order.setElectricity(list.get(list.size() - 1).getChargingCapacity());
+                    order.setVipDiscountAmount(vipDiscountAmount_total);
+                    if (vipDiscountAmount_total.compareTo(BigDecimal.ZERO) == 0) {
+                        order.setVipDiscount(BigDecimal.valueOf(1));
+                    }
+
+                    //计算优惠券
+                    BigDecimal couponDiscount = BigDecimal.ZERO;
+                    if (null != order.getAppCouponId()) {
+                        //判断实际充电金额是否满足优惠券使用条件,如果不满足则不适用优惠券。
+                        TAppCoupon appCoupon = appCouponClient.getAppCouponById(order.getAppCouponId()).getData();
+                        String couponJson = appCoupon.getCouponJson();
+                        TCoupon tCoupon = com.alibaba.fastjson2.JSON.parseObject(couponJson, TCoupon.class);
+                        Integer preferentialMode = tCoupon.getPreferentialMode();
+                        if (1 == preferentialMode) {
+                            //满减
+                            if (payAmount.compareTo(tCoupon.getMeetTheConditions()) >= 0) {
+                                BigDecimal couponDiscountAmount = tCoupon.getDiscountAmount();
+                                //如果优惠金额大于服务费金额,以服务费作为最大限制
+                                if (serviceCharge_total.compareTo(couponDiscountAmount) < 0) {
+                                    couponDiscount = serviceCharge_total;
+                                    serviceCharge_total = BigDecimal.ZERO;
+                                } else {
+                                    couponDiscount = couponDiscountAmount;
+                                }
+                                appCoupon.setStatus(2);
+                                appCouponClient.updateAppCoupon(appCoupon);
+                            } else {
+                                appCouponClient.refund(order.getAppCouponId().toString());
+                                order.setAppCouponId(null);
+                                order.setCouponDiscountAmount(BigDecimal.ZERO);
+                            }
+                        }
+                        if (2 == preferentialMode) {
+                            //抵扣
+                            if (payAmount.compareTo(tCoupon.getMeetTheConditions()) >= 0) {
+                                //折扣金额
+                                BigDecimal divide = payAmount.multiply(new BigDecimal(10).subtract(tCoupon.getDiscount())).divide(new BigDecimal(10));
+                                divide = divide.compareTo(tCoupon.getMaximumDiscountAmount()) > 0 ? tCoupon.getMaximumDiscountAmount() : divide;
+                                //如果优惠金额大于服务费金额,以服务费作为最大限制
+                                if (serviceCharge_total.compareTo(divide) < 0) {
+                                    couponDiscount = serviceCharge_total;
+                                    serviceCharge_total = BigDecimal.ZERO;
+                                } else {
+                                    couponDiscount = divide;
+                                }
+
+                                appCoupon.setStatus(2);
+                                appCouponClient.updateAppCoupon(appCoupon);
+                            } else {
+                                order.setAppCouponId(null);
+                                order.setCouponDiscountAmount(BigDecimal.ZERO);
+                                appCouponClient.refund(order.getAppCouponId().toString());
+                            }
+                        }
+                    }
+                    //优惠券优惠金额
+                    couponDiscount = couponDiscount.setScale(4, RoundingMode.HALF_EVEN);
+                    //退款金额+优惠券
+                    refundAmount = refundAmount.add(couponDiscount);
+                    //实际支付金额-优惠券
+                    payAmount = payAmount.subtract(couponDiscount);
+                    if (serviceCharge_total.compareTo(BigDecimal.ZERO) > 0) {
+                        serviceCharge_total = serviceCharge_total.subtract(couponDiscount);
+                    }
+                    order.setCouponDiscountAmount(couponDiscount.setScale(2, RoundingMode.HALF_EVEN));
+                    order.setServiceCharge(serviceCharge_total.setScale(2, RoundingMode.HALF_EVEN));
+                    order.setPaymentAmount(payAmount.setScale(2, RoundingMode.HALF_EVEN));
+                    order.setRefundAmount(refundAmount.setScale(2, RoundingMode.HALF_EVEN));
+                    order.setRefundStatus(1);
+                    UploadRealTimeMonitoringData asc = uploadRealTimeMonitoringDataService.getDataByOrderCode(order.getCode(), "asc");
+                    UploadRealTimeMonitoringData desc = uploadRealTimeMonitoringDataService.getDataByOrderCode(order.getCode(), "desc");
+                    if(null != asc){
+                        order.setStartSoc(new BigDecimal(asc.getSoc()));
+                    }
+                    if(null != desc){
+                        order.setEndSoc(new BigDecimal(desc.getSoc()));
+                    }
+                    chargingOrderService.updateById(order);
+
+                    order = chargingOrderService.getById(order.getId());
+                    Site site = siteClient.getSiteByIds(Arrays.asList(order.getSiteId())).getData().get(0);
+                    //推送三方平台
+                    if (2 == order.getOrderSource() && 1 == site.getIsOpenSynchronization()) {
+                        TChargingOrder finalChargingOrder = order;
+                        new Thread(new Runnable() {
+                            @Override
+                            public void run() {
+                                tcecClient.notificationEquipChargeStatus(finalChargingOrder.getStartChargeSeq(), finalChargingOrder.getOperatorId());
+                                tcecClient.notificationStopChargeResult(finalChargingOrder.getStartChargeSeq(), finalChargingOrder.getChargingGunId().toString(),
+                                        finalChargingOrder.getOperatorId());
+                                tcecClient.notificationChargeOrderInfo(finalChargingOrder.getStartChargeSeq(), finalChargingOrder.getOperatorId());
+                            }
+                        }).start();
+                    }
+
+                    //开始将优惠券优惠的金额添加到明细中
+                    BigDecimal couponDiscountAmount = order.getCouponDiscountAmount();
+                    if (null != couponDiscountAmount && couponDiscountAmount.compareTo(BigDecimal.ZERO) > 0) {
+                        List<TChargingOrderAccountingStrategy> list1 = chargingOrderAccountingStrategyService.list(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>().eq(TChargingOrderAccountingStrategy::getChargingOrderId, order.getId()));
+                        BigDecimal reduce = list1.stream().map(TChargingOrderAccountingStrategy::getPeriodServicePrice).reduce(BigDecimal.ZERO, BigDecimal::add);
+                        for (TChargingOrderAccountingStrategy chargingOrderAccountingStrategy : list1) {
+                            BigDecimal periodServicePrice = chargingOrderAccountingStrategy.getPeriodServicePrice();
+                            BigDecimal multiply = couponDiscountAmount.multiply(periodServicePrice.divide(reduce, new MathContext(4, RoundingMode.HALF_EVEN)));
+                            periodServicePrice = periodServicePrice.subtract(multiply);
+                            chargingOrderAccountingStrategy.setPeriodServicePrice(periodServicePrice.setScale(2, RoundingMode.HALF_EVEN));
+                            chargingOrderAccountingStrategy.setCouponDiscountAmount(multiply.setScale(2, RoundingMode.HALF_EVEN));
+                        }
+                        chargingOrderAccountingStrategyService.updateBatchById(list1);
+                    }
+
+                    // 将枪状态重置为空闲
+                    TChargingGun chargingGun = new TChargingGun();
+                    chargingGun.setId(order.getChargingGunId());
+                    chargingGun.setStatus(2);
+                    chargingGun.setChargingPower(BigDecimal.ZERO);
+                    chargingGunClient.updateChargingGunById(chargingGun);
+                    chargingGun = chargingGunClient.getChargingGunById(order.getChargingGunId()).getData();
+                    //推送状态给三方平台
+                    if (2 == order.getOrderSource() && 1 == site.getIsOpenSynchronization()) {
+                        tcecClient.pushChargingGunStatus(chargingGun.getFullNumber(), 2);
+                    }
+                    ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.SECONDS, new LinkedBlockingDeque<>());
+                    TChargingOrder finalOrder = order;
+                    threadPoolExecutor.execute(()->{
+                        //推送成都监管
+                        NotificationConnectorChargeStatusVo statusVo = new NotificationConnectorChargeStatusVo();
+                        statusVo.setOrderCode(finalOrder.getCode());
+                        statusVo.setChargingGunId(finalOrder.getChargingGunId());
+                        chengDuJianGuanClient.notificationConnectorChargeStatus(statusVo);
+                        chengDuJianGuanClient.notificationOrderInfo(statusVo);
                     });
-                    UploadRealTimeMonitoringData uploadRealTimeMonitoringData = collect.get(collect.size() - 1);
-                    BigDecimal chargingDegree = uploadRealTimeMonitoringData.getCharging_degree();
-                    BigDecimal subtract = chargingDegree.subtract(decimal);
-                    decimal = chargingDegree;
-                    if(subtract.compareTo(BigDecimal.ZERO) > 0){
-                        //组装充电明细数据
-                        TChargingOrderAccountingStrategy chargingOrderAccountingStrategy = new TChargingOrderAccountingStrategy();
-                        chargingOrderAccountingStrategy.setChargingOrderId(order.getId());
-                        chargingOrderAccountingStrategy.setAccountingStrategyDetailId(detailOrder.getId());
-                        chargingOrderAccountingStrategy.setType(detailOrder.getType());
-                        chargingOrderAccountingStrategy.setElectrovalence(detailOrder.getElectrovalence());
-                        chargingOrderAccountingStrategy.setServiceCharge(detailOrder.getServiceCharge());
-                        chargingOrderAccountingStrategy.setCostServiceCharge(detailOrder.getCostServiceCharge());
-                        chargingOrderAccountingStrategy.setChargingCapacity(subtract);
-                        chargingOrderAccountingStrategy.setCreateTime(LocalDateTime.now());
 
-                        if (list.size() == 0) {
-                            String time = sdf.format(collect.get(0).getCreate_time());
-                            chargingOrderAccountingStrategy.setStartTime(time);
-                        } else {
-                            chargingOrderAccountingStrategy.setStartTime(detailOrder.getStartTime().split(" ")[1]);
-                        }
-                        chargingOrderAccountingStrategy.setEndTime(detailOrder.getEndTime().split(" ")[1]);
 
-                        //已充电总度数
-                        BigDecimal electrovalenc = detailOrder.getElectrovalence().multiply(subtract);
-                        BigDecimal originalServicePrice = detailOrder.getServiceCharge().multiply(subtract);
-                        BigDecimal serviceCharge = originalServicePrice;
-                        BigDecimal vipDiscountAmount = BigDecimal.ZERO;
-                        //计算优惠金额
-                        if (null != order.getVipDiscount()) {
-                            //0.58折
-                            vipDiscountAmount = serviceCharge.multiply(new BigDecimal(1).subtract(order.getVipDiscount()));
-                            serviceCharge = serviceCharge.multiply(order.getVipDiscount());
+                    //添加积分
+                    if (1 == order.getOrderSource()) {
+                        TIntegralRule integralRule = integralRuleClient.getSet().getData();
+                        if (null != integralRule) {
+                            TAppUser appUser = appUserClient.getUserById(order.getAppUserId()).getData();
+                            Integer num1 = com.alibaba.fastjson2.JSON.parseObject(integralRule.getChargeCredit()).getInteger("num1");
+                            Integer integral = order.getServiceCharge().intValue() * num1;
+                            if (null != appUser.getVipId()) {
+                                TVip vip = vipClient.getInfo1(appUser.getVipId()).getData();
+                                Integer doubleIntegration = vip.getDoubleIntegration();
+                                //双倍积分
+                                if (1 == doubleIntegration) {
+                                    integral *= 2;
+                                }
+                            }
+
+                            if (integral > 0) {
+                                TAppUserIntegralChange appUserIntegralChange = new TAppUserIntegralChange();
+                                appUserIntegralChange.setAppUserId(appUser.getId());
+                                appUserIntegralChange.setChangeType(2);
+                                appUserIntegralChange.setHistoricalIntegral(appUser.getPoints());
+                                appUser.setPoints(appUser.getPoints() + integral);
+                                appUserIntegralChange.setCurrentIntegral(appUser.getPoints());
+                                appUserIntegralChange.setCreateTime(LocalDateTime.now());
+                                appUserIntegralChange.setOrderCode(order.getCode());
+                                appUserIntegralChange.setExtension(order.getId().toString());
+                                appUserClient.updateAppUser(appUser);
+                                appUserIntegralChangeClient.addAppUserIntegralChange(appUserIntegralChange);
+                            }
                         }
-                        chargingOrderAccountingStrategy.setPeriodElectricPrice(electrovalenc.setScale(4, RoundingMode.HALF_EVEN));
-                        chargingOrderAccountingStrategy.setPeriodServicePrice(serviceCharge.setScale(4, RoundingMode.HALF_EVEN));
-                        chargingOrderAccountingStrategy.setPeriodOriginalServicePrice(originalServicePrice.setScale(4, RoundingMode.HALF_EVEN));
-                        chargingOrderAccountingStrategy.setVipDiscountAmount(vipDiscountAmount.setScale(4, RoundingMode.HALF_EVEN));
-                        chargingOrderAccountingStrategy.setCreateTime(LocalDateTime.now());
-                        list.add(chargingOrderAccountingStrategy);
-                        //电费
-                        periodElectricPrice_total = periodElectricPrice_total.add(electrovalenc);
-                        //服务费(含折扣)
-                        serviceCharge_total = serviceCharge_total.add(serviceCharge);
-                        //服务费(不含折扣)
-                        periodServicePrice_total = periodServicePrice_total.add(originalServicePrice);
-                        //会员折扣优惠金额
-                        vipDiscountAmount_total = vipDiscountAmount_total.add(vipDiscountAmount);
-                        //原始总金额(不含折扣)
-                        total = total.add(electrovalenc.add(originalServicePrice));
+
+                        //计算用户标签
+                        chargingOrderService.editUserTag(order);
+                        //用户推荐奖励
+                        chargingOrderService.referralReward(order);
+
+                        //开始构建退款费用
+                        refundAmount = refundAmount.setScale(2, RoundingMode.HALF_EVEN);
+                        if (refundAmount.compareTo(BigDecimal.ZERO) > 0) {
+                            Integer rechargePaymentType = order.getRechargePaymentType();
+                            //构建退款明细
+                            TChargingOrderRefund chargingOrderRefund = new TChargingOrderRefund();
+                            chargingOrderRefund.setChargingOrderId(order.getId());
+                            SimpleDateFormat sdfaa = new SimpleDateFormat("yyyyMMddHHmmssSSS");
+                            chargingOrderRefund.setRefundCode("CDF" + sdfaa.format(new Date()) + (Double.valueOf(Math.random() * 1000).intValue()));
+                            chargingOrderRefund.setRefundAmount(refundAmount);
+                            chargingOrderRefund.setRefundStatus(1);
+                            chargingOrderRefund.setPayType(rechargePaymentType);
+                            chargingOrderRefund.setRefundStatus(1);
+                            chargingOrderRefund.setCode(order.getCode());
+                            chargingOrderRefund.setRefundTitle("充电完成退款");
+                            chargingOrderRefund.setRefundContent("充电完成退款");
+                            chargingOrderRefund.setRefundReason("充电完成退款");
+                            chargingOrderRefund.setRefundRemark("实际充电消费金额:" + order.getPaymentAmount());
+                            chargingOrderRefund.setRefundTotalAmount(refundAmount);
+                            chargingOrderRefund.setPayAmount(rechargeAmount);
+                            if (1 == rechargePaymentType) {
+                                WxPaymentRefundModel model = new WxPaymentRefundModel();
+                                model.setOut_trade_no(order.getCode());
+                                model.setOut_refund_no(chargingOrderRefund.getRefundCode());
+                                model.setReason("充电完成退款");
+                                model.setNotify_url("/payment/wx/refund/notify");
+                                WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
+                                amount.setRefund(refundAmount.multiply(new BigDecimal(100)).intValue());
+                                amount.setTotal(rechargeAmount.multiply(new BigDecimal(100)).intValue());
+                                amount.setCurrency("CNY");
+                                model.setAmount(amount);
+                                R<Map<String, Object>> result = wxPaymentClient.refundOrderR(model);
+                                if (200 == result.getCode()) {
+                                    chargingOrderRefundService.save(chargingOrderRefund);
+                                    //手续费
+                                    Map<String, Object> amount1 = (Map<String, Object>) result.getData().get("amount");
+                                    Object refund_fee1 = amount1.get("refund_fee");
+                                    BigDecimal refund_fee = new BigDecimal(null == refund_fee1 ? "0" : refund_fee1.toString()).divide(new BigDecimal(100));
+                                    chargingOrderRefund.setRefundFee(refund_fee);
+                                    chargingOrderRefundService.updateById(chargingOrderRefund);
+                                }
+                            }
+                            if (2 == rechargePaymentType) {
+                                RefundReq dto = new RefundReq();
+                                dto.setOutTradeNo(order.getCode());
+                                dto.setOutRequestNo(chargingOrderRefund.getRefundCode());
+                                dto.setRefundAmount(refundAmount.toString());
+                                dto.setRefundReason("充电完成退款");
+                                RefundResp resp = aliPaymentClient.refund(dto).getData();
+                                if (null != resp) {
+                                    chargingOrderRefundService.save(chargingOrderRefund);
+                                    chargingOrderService.chargingOrderStartupFailureWxRefund(chargingOrderRefund.getRefundCode(), resp.getTradeNo(), "SUCCESS", null);
+                                }
+                            }
+                            if (3 == rechargePaymentType) {
+                                RefundReq dto = new RefundReq();
+                                dto.setOutTradeNo(order.getRechargeSerialNumber());
+                                dto.setOutRequestNo(chargingOrderRefund.getRefundCode());
+                                dto.setRefundAmount(refundAmount.toString());
+                                dto.setRefundReason("充电完成退款");
+                                RefundResp resp = h5AliPaymentClient.refund(dto).getData();
+                                if (null != resp && "10000".equals(resp.getCode())) {
+                                    chargingOrderRefundService.save(chargingOrderRefund);
+                                    chargingOrderService.chargingOrderStartupFailureWxRefund(chargingOrderRefund.getRefundCode(), resp.getTradeNo(), "SUCCESS", null);
+                                }
+                            }
+                        }
                     }
-                }
 
-            }
-            list.get(list.size() - 1).setEndTime(sdf.format(dataList.get(0).getCreate_time()));
-            chargingOrderAccountingStrategyService.saveBatch(list);
-
-            BigDecimal orderAmount = BigDecimal.valueOf(total.doubleValue());
-            //原金额
-            BigDecimal rechargeAmount = order.getRechargeAmount();
-            //支付金额
-            BigDecimal payAmount = periodElectricPrice_total.add(serviceCharge_total);
-            //退款金额=充值金额-实际支付金额
-            BigDecimal refundAmount = rechargeAmount.subtract(payAmount);
-
-            UploadRealTimeMonitoringData uploadRealTimeMonitoringData = uploadRealTimeMonitoringDataService.getLastDataById(order.getCode());
-            if (null != uploadRealTimeMonitoringData && null == order.getEndMode()) {
-                Integer soc = uploadRealTimeMonitoringData.getSoc();
-                if (soc >= 98) {
-                    order.setEndMode(2);
-                } else if (null != order.getResidualAmount() && order.getResidualAmount().compareTo(new BigDecimal(1)) <= 0) {
-                    order.setEndMode(3);
-                } else {
-                    order.setEndMode(1);
-                }
-            }
-
-            order.setResidualAmount(rechargeAmount.subtract(total).setScale(2, RoundingMode.HALF_EVEN));
-            order.setStartTime(list.get(0).getCreateTime());
-            order.setEndTime(list.get(list.size() - 1).getCreateTime());
-            order.setStatus(5);
-            order.setOrderAmount(orderAmount.setScale(2, RoundingMode.HALF_EVEN));
-            order.setElectrovalence(periodElectricPrice_total.setScale(2, RoundingMode.HALF_EVEN));
-            order.setChargingCapacity(list.get(list.size() - 1).getChargingCapacity());
-            order.setElectricity(list.get(list.size() - 1).getChargingCapacity());
-            order.setVipDiscountAmount(vipDiscountAmount_total);
-            if (vipDiscountAmount_total.compareTo(BigDecimal.ZERO) == 0) {
-                order.setVipDiscount(BigDecimal.valueOf(1));
-            }
-
-            //计算优惠券
-            BigDecimal couponDiscount = BigDecimal.ZERO;
-            if (null != order.getAppCouponId()) {
-                //判断实际充电金额是否满足优惠券使用条件,如果不满足则不适用优惠券。
-                TAppCoupon appCoupon = appCouponClient.getAppCouponById(order.getAppCouponId()).getData();
-                String couponJson = appCoupon.getCouponJson();
-                TCoupon tCoupon = com.alibaba.fastjson2.JSON.parseObject(couponJson, TCoupon.class);
-                Integer preferentialMode = tCoupon.getPreferentialMode();
-                if (1 == preferentialMode) {
-                    //满减
-                    if (payAmount.compareTo(tCoupon.getMeetTheConditions()) >= 0) {
-                        BigDecimal couponDiscountAmount = tCoupon.getDiscountAmount();
-                        //如果优惠金额大于服务费金额,以服务费作为最大限制
-                        if (serviceCharge_total.compareTo(couponDiscountAmount) < 0) {
-                            couponDiscount = serviceCharge_total;
-                            serviceCharge_total = BigDecimal.ZERO;
-                        } else {
-                            couponDiscount = couponDiscountAmount;
-                        }
-                        appCoupon.setStatus(2);
-                        appCouponClient.updateAppCoupon(appCoupon);
+                    //添加汇总统计数据
+                    List<TChargingOrderAccountingStrategy> list4 = chargingOrderAccountingStrategyService.list(new QueryWrapper<TChargingOrderAccountingStrategy>().eq("charging_order_id", order.getId()));
+                    BigDecimal electronic_reduce = list4.stream().map(TChargingOrderAccountingStrategy::getPeriodElectricPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
+                    BigDecimal service_reduce = list4.stream().map(TChargingOrderAccountingStrategy::getPeriodServicePrice).reduce(BigDecimal.ZERO, BigDecimal::add);
+                    BigDecimal chargingCapacity = list4.stream().map(TChargingOrderAccountingStrategy::getChargingCapacity).reduce(BigDecimal.ZERO, BigDecimal::add);
+                    BigDecimal serviceMoney = BigDecimal.ZERO;
+                    BigDecimal paymentMoney = BigDecimal.ZERO;
+                    long time = 0;
+                    if (!order.getOrderSource().equals(2)) {
+                        serviceMoney = serviceMoney.add(service_reduce);
+                        paymentMoney = paymentMoney.add(electronic_reduce).add(service_reduce);
                     } else {
-                        appCouponClient.refund(order.getAppCouponId().toString());
-                        order.setAppCouponId(null);
-                        order.setCouponDiscountAmount(BigDecimal.ZERO);
+                        serviceMoney = serviceMoney.add(service_reduce.multiply(new BigDecimal("0.8")));
+                        paymentMoney = paymentMoney.add(electronic_reduce).add(service_reduce.multiply(new BigDecimal("0.8")));
                     }
-                }
-                if (2 == preferentialMode) {
-                    //抵扣
-                    if (payAmount.compareTo(tCoupon.getMeetTheConditions()) >= 0) {
-                        //折扣金额
-                        BigDecimal divide = payAmount.multiply(new BigDecimal(10).subtract(tCoupon.getDiscount())).divide(new BigDecimal(10));
-                        divide = divide.compareTo(tCoupon.getMaximumDiscountAmount()) > 0 ? tCoupon.getMaximumDiscountAmount() : divide;
-                        //如果优惠金额大于服务费金额,以服务费作为最大限制
-                        if (serviceCharge_total.compareTo(divide) < 0) {
-                            couponDiscount = serviceCharge_total;
-                            serviceCharge_total = BigDecimal.ZERO;
-                        } else {
-                            couponDiscount = divide;
-                        }
+                    if (order.getStartTime() != null && order.getEndTime() != null) {
+                        time = ChronoUnit.SECONDS.between(order.getStartTime(), order.getEndTime());
+                    }
+                    TChargingOrderSummaryData summaryData = new TChargingOrderSummaryData();
+                    summaryData.setChargingOrderId(order.getId());
+                    summaryData.setChargingCapacity(chargingCapacity);
+                    summaryData.setChargingDuration(time);
+                    summaryData.setIncome(paymentMoney.setScale(2, BigDecimal.ROUND_HALF_EVEN));
+                    summaryData.setElectricPrice(electronic_reduce.setScale(2, BigDecimal.ROUND_HALF_EVEN));
+                    summaryData.setServicePrice(serviceMoney.setScale(2, BigDecimal.ROUND_HALF_EVEN));
+                    chargingOrderSummaryDataService.save(summaryData);
 
-                        appCoupon.setStatus(2);
-                        appCouponClient.updateAppCoupon(appCoupon);
-                    } else {
-                        order.setAppCouponId(null);
-                        order.setCouponDiscountAmount(BigDecimal.ZERO);
-                        appCouponClient.refund(order.getAppCouponId().toString());
-                    }
+                    //推送监管平台订单状态和订单详情
+                    ChargingOrderVo chargingOrderVo = new ChargingOrderVo();
+                    BeanUtils.copyProperties(order, chargingOrderVo);
+                    chargingMessageClient.pushOrderInfo(chargingOrderVo);
+                    chargingMessageClient.pushOrderStatus(chargingOrderVo);
                 }
             }
-            //优惠券优惠金额
-            couponDiscount = couponDiscount.setScale(4, RoundingMode.HALF_EVEN);
-            //退款金额+优惠券
-            refundAmount = refundAmount.add(couponDiscount);
-            //实际支付金额-优惠券
-            payAmount = payAmount.subtract(couponDiscount);
-            if (serviceCharge_total.compareTo(BigDecimal.ZERO) > 0) {
-                serviceCharge_total = serviceCharge_total.subtract(couponDiscount);
-            }
-            order.setCouponDiscountAmount(couponDiscount.setScale(2, RoundingMode.HALF_EVEN));
-            order.setServiceCharge(serviceCharge_total.setScale(2, RoundingMode.HALF_EVEN));
-            order.setPaymentAmount(payAmount.setScale(2, RoundingMode.HALF_EVEN));
-            order.setRefundAmount(refundAmount.setScale(2, RoundingMode.HALF_EVEN));
-            order.setRefundStatus(1);
-            UploadRealTimeMonitoringData asc = uploadRealTimeMonitoringDataService.getDataByOrderCode(order.getCode(), "asc");
-            UploadRealTimeMonitoringData desc = uploadRealTimeMonitoringDataService.getDataByOrderCode(order.getCode(), "desc");
-            if(null != asc){
-                order.setStartSoc(new BigDecimal(asc.getSoc()));
-            }
-            if(null != desc){
-                order.setEndSoc(new BigDecimal(desc.getSoc()));
-            }
-            chargingOrderService.updateById(order);
-
-            order = chargingOrderService.getById(order.getId());
-            Site site = siteClient.getSiteByIds(Arrays.asList(order.getSiteId())).getData().get(0);
-            //推送三方平台
-            if (2 == order.getOrderSource() && 1 == site.getIsOpenSynchronization()) {
-                TChargingOrder finalChargingOrder = order;
-                new Thread(new Runnable() {
-                    @Override
-                    public void run() {
-                        tcecClient.notificationEquipChargeStatus(finalChargingOrder.getStartChargeSeq(), finalChargingOrder.getOperatorId());
-                        tcecClient.notificationStopChargeResult(finalChargingOrder.getStartChargeSeq(), finalChargingOrder.getChargingGunId().toString(),
-                                finalChargingOrder.getOperatorId());
-                        tcecClient.notificationChargeOrderInfo(finalChargingOrder.getStartChargeSeq(), finalChargingOrder.getOperatorId());
-                    }
-                }).start();
-            }
-
-            //开始将优惠券优惠的金额添加到明细中
-            BigDecimal couponDiscountAmount = order.getCouponDiscountAmount();
-            if (null != couponDiscountAmount && couponDiscountAmount.compareTo(BigDecimal.ZERO) > 0) {
-                List<TChargingOrderAccountingStrategy> list1 = chargingOrderAccountingStrategyService.list(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>().eq(TChargingOrderAccountingStrategy::getChargingOrderId, order.getId()));
-                BigDecimal reduce = list1.stream().map(TChargingOrderAccountingStrategy::getPeriodServicePrice).reduce(BigDecimal.ZERO, BigDecimal::add);
-                for (TChargingOrderAccountingStrategy chargingOrderAccountingStrategy : list1) {
-                    BigDecimal periodServicePrice = chargingOrderAccountingStrategy.getPeriodServicePrice();
-                    BigDecimal multiply = couponDiscountAmount.multiply(periodServicePrice.divide(reduce, new MathContext(4, RoundingMode.HALF_EVEN)));
-                    periodServicePrice = periodServicePrice.subtract(multiply);
-                    chargingOrderAccountingStrategy.setPeriodServicePrice(periodServicePrice.setScale(2, RoundingMode.HALF_EVEN));
-                    chargingOrderAccountingStrategy.setCouponDiscountAmount(multiply.setScale(2, RoundingMode.HALF_EVEN));
-                }
-                chargingOrderAccountingStrategyService.updateBatchById(list1);
-            }
-
-            // 将枪状态重置为空闲
-            TChargingGun chargingGun = new TChargingGun();
-            chargingGun.setId(order.getChargingGunId());
-            chargingGun.setStatus(2);
-            chargingGun.setChargingPower(BigDecimal.ZERO);
-            chargingGunClient.updateChargingGunById(chargingGun);
-            chargingGun = chargingGunClient.getChargingGunById(order.getChargingGunId()).getData();
-            //推送状态给三方平台
-            if (2 == order.getOrderSource() && 1 == site.getIsOpenSynchronization()) {
-                tcecClient.pushChargingGunStatus(chargingGun.getFullNumber(), 2);
-            }
-            ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.SECONDS, new LinkedBlockingDeque<>());
-            TChargingOrder finalOrder = order;
-            threadPoolExecutor.execute(()->{
-                //推送成都监管
-                NotificationConnectorChargeStatusVo statusVo = new NotificationConnectorChargeStatusVo();
-                statusVo.setOrderCode(finalOrder.getCode());
-                statusVo.setChargingGunId(finalOrder.getChargingGunId());
-                chengDuJianGuanClient.notificationConnectorChargeStatus(statusVo);
-                chengDuJianGuanClient.notificationOrderInfo(statusVo);
-            });
-
-
-            //添加积分
-            if (1 == order.getOrderSource()) {
-                TIntegralRule integralRule = integralRuleClient.getSet().getData();
-                if (null != integralRule) {
-                    TAppUser appUser = appUserClient.getUserById(order.getAppUserId()).getData();
-                    Integer num1 = com.alibaba.fastjson2.JSON.parseObject(integralRule.getChargeCredit()).getInteger("num1");
-                    Integer integral = order.getServiceCharge().intValue() * num1;
-                    if (null != appUser.getVipId()) {
-                        TVip vip = vipClient.getInfo1(appUser.getVipId()).getData();
-                        Integer doubleIntegration = vip.getDoubleIntegration();
-                        //双倍积分
-                        if (1 == doubleIntegration) {
-                            integral *= 2;
-                        }
-                    }
-
-                    if (integral > 0) {
-                        TAppUserIntegralChange appUserIntegralChange = new TAppUserIntegralChange();
-                        appUserIntegralChange.setAppUserId(appUser.getId());
-                        appUserIntegralChange.setChangeType(2);
-                        appUserIntegralChange.setHistoricalIntegral(appUser.getPoints());
-                        appUser.setPoints(appUser.getPoints() + integral);
-                        appUserIntegralChange.setCurrentIntegral(appUser.getPoints());
-                        appUserIntegralChange.setCreateTime(LocalDateTime.now());
-                        appUserIntegralChange.setOrderCode(order.getCode());
-                        appUserIntegralChange.setExtension(order.getId().toString());
-                        appUserClient.updateAppUser(appUser);
-                        appUserIntegralChangeClient.addAppUserIntegralChange(appUserIntegralChange);
-                    }
-                }
-
-                //计算用户标签
-                chargingOrderService.editUserTag(order);
-                //用户推荐奖励
-                chargingOrderService.referralReward(order);
-
-                //开始构建退款费用
-                refundAmount = refundAmount.setScale(2, RoundingMode.HALF_EVEN);
-                if (refundAmount.compareTo(BigDecimal.ZERO) > 0) {
-                    Integer rechargePaymentType = order.getRechargePaymentType();
-                    //构建退款明细
-                    TChargingOrderRefund chargingOrderRefund = new TChargingOrderRefund();
-                    chargingOrderRefund.setChargingOrderId(order.getId());
-                    SimpleDateFormat sdfaa = new SimpleDateFormat("yyyyMMddHHmmssSSS");
-                    chargingOrderRefund.setRefundCode("CDF" + sdfaa.format(new Date()) + (Double.valueOf(Math.random() * 1000).intValue()));
-                    chargingOrderRefund.setRefundAmount(refundAmount);
-                    chargingOrderRefund.setRefundStatus(1);
-                    chargingOrderRefund.setPayType(rechargePaymentType);
-                    chargingOrderRefund.setRefundStatus(1);
-                    chargingOrderRefund.setCode(order.getCode());
-                    chargingOrderRefund.setRefundTitle("充电完成退款");
-                    chargingOrderRefund.setRefundContent("充电完成退款");
-                    chargingOrderRefund.setRefundReason("充电完成退款");
-                    chargingOrderRefund.setRefundRemark("实际充电消费金额:" + order.getPaymentAmount());
-                    chargingOrderRefund.setRefundTotalAmount(refundAmount);
-                    chargingOrderRefund.setPayAmount(rechargeAmount);
-                    if (1 == rechargePaymentType) {
-                        WxPaymentRefundModel model = new WxPaymentRefundModel();
-                        model.setOut_trade_no(order.getCode());
-                        model.setOut_refund_no(chargingOrderRefund.getRefundCode());
-                        model.setReason("充电完成退款");
-                        model.setNotify_url("/payment/wx/refund/notify");
-                        WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
-                        amount.setRefund(refundAmount.multiply(new BigDecimal(100)).intValue());
-                        amount.setTotal(rechargeAmount.multiply(new BigDecimal(100)).intValue());
-                        amount.setCurrency("CNY");
-                        model.setAmount(amount);
-                        R<Map<String, Object>> result = wxPaymentClient.refundOrderR(model);
-                        if (200 == result.getCode()) {
-                            chargingOrderRefundService.save(chargingOrderRefund);
-                            //手续费
-                            Map<String, Object> amount1 = (Map<String, Object>) result.getData().get("amount");
-                            Object refund_fee1 = amount1.get("refund_fee");
-                            BigDecimal refund_fee = new BigDecimal(null == refund_fee1 ? "0" : refund_fee1.toString()).divide(new BigDecimal(100));
-                            chargingOrderRefund.setRefundFee(refund_fee);
-                            chargingOrderRefundService.updateById(chargingOrderRefund);
-                        }
-                    }
-                    if (2 == rechargePaymentType) {
-                        RefundReq dto = new RefundReq();
-                        dto.setOutTradeNo(order.getCode());
-                        dto.setOutRequestNo(chargingOrderRefund.getRefundCode());
-                        dto.setRefundAmount(refundAmount.toString());
-                        dto.setRefundReason("充电完成退款");
-                        RefundResp resp = aliPaymentClient.refund(dto).getData();
-                        if (null != resp) {
-                            chargingOrderRefundService.save(chargingOrderRefund);
-                            chargingOrderService.chargingOrderStartupFailureWxRefund(chargingOrderRefund.getRefundCode(), resp.getTradeNo(), "SUCCESS", null);
-                        }
-                    }
-                    if (3 == rechargePaymentType) {
-                        RefundReq dto = new RefundReq();
-                        dto.setOutTradeNo(order.getRechargeSerialNumber());
-                        dto.setOutRequestNo(chargingOrderRefund.getRefundCode());
-                        dto.setRefundAmount(refundAmount.toString());
-                        dto.setRefundReason("充电完成退款");
-                        RefundResp resp = h5AliPaymentClient.refund(dto).getData();
-                        if (null != resp && "10000".equals(resp.getCode())) {
-                            chargingOrderRefundService.save(chargingOrderRefund);
-                            chargingOrderService.chargingOrderStartupFailureWxRefund(chargingOrderRefund.getRefundCode(), resp.getTradeNo(), "SUCCESS", null);
-                        }
-                    }
-                }
-            }
-
-            //添加汇总统计数据
-            List<TChargingOrderAccountingStrategy> list4 = chargingOrderAccountingStrategyService.list(new QueryWrapper<TChargingOrderAccountingStrategy>().eq("charging_order_id", order.getId()));
-            BigDecimal electronic_reduce = list4.stream().map(TChargingOrderAccountingStrategy::getPeriodElectricPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
-            BigDecimal service_reduce = list4.stream().map(TChargingOrderAccountingStrategy::getPeriodServicePrice).reduce(BigDecimal.ZERO, BigDecimal::add);
-            BigDecimal chargingCapacity = list4.stream().map(TChargingOrderAccountingStrategy::getChargingCapacity).reduce(BigDecimal.ZERO, BigDecimal::add);
-            BigDecimal serviceMoney = BigDecimal.ZERO;
-            BigDecimal paymentMoney = BigDecimal.ZERO;
-            long time = 0;
-            if (!order.getOrderSource().equals(2)) {
-                serviceMoney = serviceMoney.add(service_reduce);
-                paymentMoney = paymentMoney.add(electronic_reduce).add(service_reduce);
-            } else {
-                serviceMoney = serviceMoney.add(service_reduce.multiply(new BigDecimal("0.8")));
-                paymentMoney = paymentMoney.add(electronic_reduce).add(service_reduce.multiply(new BigDecimal("0.8")));
-            }
-            if (order.getStartTime() != null && order.getEndTime() != null) {
-                time = ChronoUnit.SECONDS.between(order.getStartTime(), order.getEndTime());
-            }
-            TChargingOrderSummaryData summaryData = new TChargingOrderSummaryData();
-            summaryData.setChargingOrderId(order.getId());
-            summaryData.setChargingCapacity(chargingCapacity);
-            summaryData.setChargingDuration(time);
-            summaryData.setIncome(paymentMoney.setScale(2, BigDecimal.ROUND_HALF_EVEN));
-            summaryData.setElectricPrice(electronic_reduce.setScale(2, BigDecimal.ROUND_HALF_EVEN));
-            summaryData.setServicePrice(serviceMoney.setScale(2, BigDecimal.ROUND_HALF_EVEN));
-            chargingOrderSummaryDataService.save(summaryData);
-
-            //推送监管平台订单状态和订单详情
-            ChargingOrderVo chargingOrderVo = new ChargingOrderVo();
-            BeanUtils.copyProperties(order, chargingOrderVo);
-            chargingMessageClient.pushOrderInfo(chargingOrderVo);
-            chargingMessageClient.pushOrderStatus(chargingOrderVo);
+        }catch (Exception e){
+            e.printStackTrace();
+        }finally {
+            lock.unlock();
         }
     }
 
diff --git a/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml b/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml
index a6d418a..0f07d11 100644
--- a/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml
+++ b/ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml
@@ -2138,15 +2138,10 @@
         FROM
         t_charging_order
         WHERE
-        `status` = 2 and order_source = 1
+        `status` = 2
         AND recharge_payment_status = 2
-        AND NOW() >= ADDDATE(pay_time, INTERVAL 15 MINUTE )
+        AND (NOW() >= ADDDATE(pay_time, INTERVAL 15 MINUTE ) OR NOW() >= ADDDATE(create_time, INTERVAL 30 MINUTE ))
         AND del_flag = 0
-        AND id NOT IN (
-        SELECT
-        charging_order_id
-        FROM
-        t_charging_order_refund)
     </select>
 
 
@@ -2174,7 +2169,7 @@
         t_charging_order
         WHERE
         `status` = 3
-        AND del_flag = 0 and order_source = 1
+        AND del_flag = 0
         AND id NOT IN (
         SELECT
         charging_order_id

--
Gitblit v1.7.1