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