ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECController.java
@@ -1250,9 +1250,10 @@ if(data.size() > 0){ BigDecimal totalElectricity = data.stream().map(TChargingOrderAccountingStrategy::getPeriodElectricPrice).reduce(BigDecimal.ZERO, BigDecimal::add); BigDecimal serviceCharge = data.stream().map(TChargingOrderAccountingStrategy::getPeriodServicePrice).reduce(BigDecimal.ZERO, BigDecimal::add); BigDecimal totalMoney = totalElectricity.add(serviceCharge).setScale(4, RoundingMode.HALF_EVEN); queryEquipChargeStatusResult.setElecMoney(totalElectricity); queryEquipChargeStatusResult.setSeviceMoney(serviceCharge); queryEquipChargeStatusResult.setTotalMoney(chargingOrder.getPaymentAmount()); queryEquipChargeStatusResult.setTotalMoney(totalMoney); }else if(null != chargingOrder.getRechargeAmount() && null != chargingOrder.getResidualAmount()){ queryEquipChargeStatusResult.setElecMoney(chargingOrder.getRechargeAmount().subtract(chargingOrder.getResidualAmount())); queryEquipChargeStatusResult.setSeviceMoney(BigDecimal.ZERO); @@ -1505,11 +1506,12 @@ List<TChargingOrderAccountingStrategy> data = chargingOrderAccountingStrategyClient.getChargingOrderAccountingStrategyByOrderId(chargingOrder.getId()).getData(); if(data.size() > 0){ BigDecimal totalElectricity = data.stream().map(TChargingOrderAccountingStrategy::getPeriodElectricPrice).reduce(BigDecimal.ZERO, BigDecimal::add); BigDecimal serviceCharge = data.stream().map(TChargingOrderAccountingStrategy::getPeriodServicePrice).reduce(BigDecimal.ZERO, BigDecimal::add); notificationChargeOrderInfo.setTotalElecMoney(totalElectricity.setScale(2, RoundingMode.HALF_EVEN)); notificationChargeOrderInfo.setTotalSeviceMoney(serviceCharge.setScale(2, RoundingMode.HALF_EVEN)); notificationChargeOrderInfo.setTotalMoney(chargingOrder.getPaymentAmount()); BigDecimal totalElectricity = data.stream().map(TChargingOrderAccountingStrategy::getPeriodElectricPrice).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(4, RoundingMode.HALF_EVEN); BigDecimal serviceCharge = data.stream().map(TChargingOrderAccountingStrategy::getPeriodServicePrice).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(4, RoundingMode.HALF_EVEN); BigDecimal totalMoney = totalElectricity.add(serviceCharge).setScale(4, RoundingMode.HALF_EVEN); notificationChargeOrderInfo.setTotalElecMoney(totalElectricity); notificationChargeOrderInfo.setTotalSeviceMoney(serviceCharge); notificationChargeOrderInfo.setTotalMoney(totalMoney); }else{ notificationChargeOrderInfo.setTotalElecMoney(chargingOrder.getRechargeAmount().subtract(chargingOrder.getResidualAmount())); notificationChargeOrderInfo.setTotalSeviceMoney(BigDecimal.ZERO); ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECUtil.java
@@ -227,6 +227,7 @@ * @return */ public static NotificationChargeOrderInfoResult notificationChargeOrderInfo(Operator operator, NotificationChargeOrderInfo info){ System.out.println("推送充电订单信息:--->" + JSON.toJSONString(info)); HttpRequest post = HttpUtil.createPost(operator.getUrl() + InterfaceUrlEnum.NOTIFICATION_CHARGE_ORDER_INFO.getUrl()); buildBody(post, info, operator); HttpResponse execute = post.execute(); ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/util/TCECCJianGuanontroller.java
@@ -1193,9 +1193,10 @@ if(data.size() > 0){ BigDecimal totalElectricity = data.stream().map(TChargingOrderAccountingStrategy::getPeriodElectricPrice).reduce(BigDecimal.ZERO, BigDecimal::add); BigDecimal serviceCharge = data.stream().map(TChargingOrderAccountingStrategy::getPeriodServicePrice).reduce(BigDecimal.ZERO, BigDecimal::add); BigDecimal totalMoney = totalElectricity.add(serviceCharge).setScale(4, RoundingMode.HALF_EVEN); queryEquipChargeStatusResult.setElecMoney(totalElectricity); queryEquipChargeStatusResult.setSeviceMoney(serviceCharge); queryEquipChargeStatusResult.setTotalMoney(chargingOrder.getPaymentAmount()); queryEquipChargeStatusResult.setTotalMoney(totalMoney); }else{ queryEquipChargeStatusResult.setElecMoney(chargingOrder.getRechargeAmount().subtract(chargingOrder.getResidualAmount())); queryEquipChargeStatusResult.setSeviceMoney(BigDecimal.ZERO); @@ -1443,11 +1444,12 @@ List<TChargingOrderAccountingStrategy> data = chargingOrderAccountingStrategyClient.getChargingOrderAccountingStrategyByOrderId(chargingOrder.getId()).getData(); if(data.size() > 0){ BigDecimal totalElectricity = data.stream().map(TChargingOrderAccountingStrategy::getPeriodElectricPrice).reduce(BigDecimal.ZERO, BigDecimal::add); BigDecimal serviceCharge = data.stream().map(TChargingOrderAccountingStrategy::getPeriodServicePrice).reduce(BigDecimal.ZERO, BigDecimal::add); notificationChargeOrderInfo.setTotalElecMoney(totalElectricity.setScale(2, RoundingMode.HALF_EVEN)); notificationChargeOrderInfo.setTotalSeviceMoney(serviceCharge.setScale(2, RoundingMode.HALF_EVEN)); notificationChargeOrderInfo.setTotalMoney(chargingOrder.getPaymentAmount()); BigDecimal totalElectricity = data.stream().map(TChargingOrderAccountingStrategy::getPeriodElectricPrice).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(4, RoundingMode.HALF_EVEN); BigDecimal serviceCharge = data.stream().map(TChargingOrderAccountingStrategy::getPeriodServicePrice).reduce(BigDecimal.ZERO, BigDecimal::add).setScale(4, RoundingMode.HALF_EVEN); BigDecimal totalMoney = totalElectricity.add(serviceCharge).setScale(4, RoundingMode.HALF_EVEN); notificationChargeOrderInfo.setTotalElecMoney(totalElectricity); notificationChargeOrderInfo.setTotalSeviceMoney(serviceCharge); notificationChargeOrderInfo.setTotalMoney(totalMoney); }else{ notificationChargeOrderInfo.setTotalElecMoney(chargingOrder.getRechargeAmount().subtract(chargingOrder.getResidualAmount())); notificationChargeOrderInfo.setTotalSeviceMoney(BigDecimal.ZERO); ruoyi-service/ruoyi-order/pom.xml
@@ -166,6 +166,15 @@ </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.redisson</groupId> <artifactId>redisson-spring-boot-starter</artifactId> <version>3.16.8</version> </dependency> </dependencies> <build> ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/mapper/TChargingOrderMapper.java
@@ -10,6 +10,7 @@ import com.ruoyi.order.api.query.ChargingOrderQuery; import com.ruoyi.order.api.vo.ChargingOrderListVO; import com.ruoyi.order.api.vo.ChargingOrderVO; import com.ruoyi.order.api.vo.TChargingOrderVo; import com.ruoyi.order.dto.*; import com.ruoyi.order.vo.OrderCountByDate; import org.apache.ibatis.annotations.Mapper; @@ -147,4 +148,25 @@ List<OrderCountByDate> countOrdersByDate(@Param("startTime")LocalDateTime startTime, @Param("endTime")LocalDateTime endTime,@Param("gunIds")List<Integer> gunIds); BigDecimal getSumDegreeBySiteIds(@Param("siteIds") List<Integer> siteIds); /** * 获取启动失败且时间超过1小时的订单 * @return */ List<TChargingOrder> findFailedStartupOrder(); /** * 获取停止中的数据 * @return */ List<TChargingOrder> findStoppedOrder(); /** * 获取充电中的订单 * @return */ List<TChargingOrder> findChargingOrder(); } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TChargingOrderService.java
@@ -330,4 +330,23 @@ R<StatisticsOfBatteryVO> getStatisticsOfBattery(); BigDecimal getSumDegreeBySiteIds(List<Integer> siteIds); /** * 获取启动失败且时间超过1小时的订单 * @return */ List<TChargingOrder> findFailedStartupOrder(); /** * 获取停止中的数据 * @return */ List<TChargingOrder> findStoppedOrder(); /** * 获取充电中的数据 * @return */ List<TChargingOrder> findChargingOrder(); } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
@@ -51,6 +51,7 @@ import com.ruoyi.order.service.TChargingOrderService; import com.ruoyi.order.service.TOrderEvaluateService; import com.ruoyi.order.service.*; import com.ruoyi.order.util.RedisLock; import com.ruoyi.order.util.mongodb.service.PlatformStartChargingReplyService; import com.ruoyi.order.util.mongodb.service.TransactionRecordService; import com.ruoyi.order.util.mongodb.service.UploadRealTimeMonitoringDataService; @@ -71,10 +72,14 @@ import com.ruoyi.system.api.domain.SysUser; import com.ruoyi.system.api.feignClient.SysUserClient; import io.seata.spring.annotation.GlobalTransactional; import org.redisson.Redisson; import org.redisson.api.RLock; import org.redisson.api.RedissonClient; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; @@ -221,6 +226,9 @@ private ITChargingOrderSummaryDataService chargingOrderSummaryDataService; @Resource private TOrderAppealService orderAppealService; @Autowired private RedissonClient redissonClient; @@ -2278,12 +2286,18 @@ */ @Override public R endChargeBillingCharge(TransactionRecordMessageVO vo) { Boolean hasKey = redisService.hasKey("endOrder:" + vo.getTransaction_serial_number()); if(hasKey){ 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(); } //添加1分钟的缓存 redisService.setCacheObject("endOrder:" + vo.getTransaction_serial_number(), vo.getTransaction_serial_number(), 1L, TimeUnit.MINUTES); if(!tryLock){ return R.ok(); } try { TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, vo.getTransaction_serial_number())); if(null == chargingOrder){ @@ -2763,7 +2777,7 @@ }catch (Exception e) { e.printStackTrace(); }finally { redisService.deleteObject("endOrder:" + vo.getTransaction_serial_number()); lock.unlock(); } return R.ok(); } @@ -4279,4 +4293,34 @@ return this.baseMapper.getSumDegreeBySiteIds(siteIds); } /** * 获取启动失败且时间超过1小时的订单 * @return */ @Override public List<TChargingOrder> findFailedStartupOrder() { return this.baseMapper.findFailedStartupOrder(); } /** * 获取停止中的数据 * @return */ @Override public List<TChargingOrder> findStoppedOrder() { return this.baseMapper.findStoppedOrder(); } /** * 获取充电中的数据 * @return */ @Override public List<TChargingOrder> findChargingOrder() { return this.baseMapper.findChargingOrder(); } } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/util/task/TaskUtil.java
@@ -1,15 +1,29 @@ package com.ruoyi.order.util.task; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson2.util.UUIDUtils; import com.alibaba.nacos.common.utils.UuidUtils; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.chargingPile.api.feignClient.SiteClient; import com.ruoyi.chargingPile.api.model.Site; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.integration.api.feignClient.UploadRealTimeMonitoringDataClient; import com.ruoyi.integration.api.model.TransactionRecord; import com.ruoyi.integration.api.model.UploadRealTimeMonitoringData; import com.ruoyi.order.api.model.TChargingBill; import com.ruoyi.order.api.model.TChargingOrder; import com.ruoyi.order.api.model.TChargingOrderRefund; import com.ruoyi.order.api.vo.TransactionRecordMessageVO; import com.ruoyi.order.service.TChargingBillService; import com.ruoyi.order.service.TChargingOrderRefundService; import com.ruoyi.order.service.TChargingOrderService; import com.ruoyi.order.util.mongodb.service.TransactionRecordService; import com.ruoyi.order.util.mongodb.service.UploadRealTimeMonitoringDataService; import lombok.extern.slf4j.Slf4j; import org.apache.logging.log4j.core.util.UuidUtil; import org.apache.poi.util.StringUtil; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.web.context.WebServerInitializedEvent; import org.springframework.context.ApplicationListener; @@ -31,6 +45,7 @@ * @author zhibing.pu * @date 2023/7/11 8:39 */ @Slf4j @Component public class TaskUtil implements ApplicationListener<WebServerInitializedEvent> { @@ -41,9 +56,81 @@ @Resource private TChargingOrderService chargingOrderService; @Resource private TChargingOrderRefundService chargingOrderRefundService; @Resource private UploadRealTimeMonitoringDataService uploadRealTimeMonitoringDataService; @Resource private TransactionRecordService transactionRecordService; private Integer port = null; //十分钟循环执行的定时任务 @Scheduled(fixedRate = 1000 * 60 * 10) public void taskTenMinutes() { if(null != port && port == 5400){ List<TChargingOrder> failedStartupOrder = chargingOrderService.findFailedStartupOrder(); log.info("定时任务执行,查询到启动失败的订单数量:{}", failedStartupOrder.size()); for (TChargingOrder order : failedStartupOrder) { //查询是否有充电信息 List<UploadRealTimeMonitoringData> dataByOrderCode = uploadRealTimeMonitoringDataService.getDataByOrderCode(order.getCode()); log.info("充电实时数据:{}", JSON.toJSONString(dataByOrderCode)); //没有充电数据,则执行退款 if(null == dataByOrderCode || dataByOrderCode.isEmpty()){ log.info("定时任务执行,查询到启动失败的订单,执行退款:{}", order.getCode()); chargingOrderService.refund(order.getCode()); int num = 0; while (true){ TChargingOrderRefund one = chargingOrderRefundService.getOne(new LambdaQueryWrapper<TChargingOrderRefund>().eq(TChargingOrderRefund::getChargingOrderId, order.getId())); if(null != one && 2 == one.getRefundStatus()){ order.setStatus(-1); chargingOrderService.updateById(order); break; } try { Thread.sleep(5000); } catch (InterruptedException e) { throw new RuntimeException(e); } num++; if(num > 10){ break; } } } } //处理退款中的数据 List<TChargingOrder> stoppedOrder = chargingOrderService.findStoppedOrder(); log.info("定时任务执行,查询到停止中的订单数量:{}", stoppedOrder.size()); for (TChargingOrder order : stoppedOrder) { TransactionRecord one = transactionRecordService.findOne(order.getCode()); if(null != one){ log.info("定时任务执行,查询到停止中的订单账单数据:{}", JSON.toJSONString(one)); TransactionRecordMessageVO vo = new TransactionRecordMessageVO(); BeanUtils.copyProperties(one, vo); R r = chargingOrderService.endChargeBillingCharge(vo); log.info("定时任务执行,停止中的订单处理结果:{}", JSON.toJSONString(r)); } } //处理状态为充电中,但硬件已完成的订单 List<TChargingOrder> chargingOrder = chargingOrderService.findChargingOrder(); log.info("定时任务执行,查询到充电中的订单数量:{}", chargingOrder.size()); for (TChargingOrder order : chargingOrder) { TransactionRecord one = transactionRecordService.findOne(order.getCode()); if(null != one && StringUtils.isNotEmpty(one.getResult())){ log.info("定时任务执行,查询到充电中的订单账单数据:{}", JSON.toJSONString(one)); TransactionRecordMessageVO vo = new TransactionRecordMessageVO(); BeanUtils.copyProperties(one, vo); R r = chargingOrderService.endChargeBillingCharge(vo); log.info("定时任务执行,充电中的订单处理结果:{}", JSON.toJSONString(r)); } } } } @Scheduled(cron = "0 0 0 2 * ?") public void taskMonth() { ruoyi-service/ruoyi-order/src/main/resources/mapper/order/TChargingOrderMapper.xml
@@ -1774,4 +1774,56 @@ </foreach> </select> <select id="findFailedStartupOrder" resultType="com.ruoyi.order.api.model.TChargingOrder"> SELECT * FROM t_charging_order WHERE `status` = 2 AND recharge_payment_status = 2 AND recharge_serial_number IS NOT NULL AND NOW() >= ADDDATE( pay_time, INTERVAL 60 MINUTE ) AND del_flag = 0 AND order_source = 1 AND id NOT IN ( SELECT charging_order_id FROM t_charging_order_refund) </select> <select id="findStoppedOrder" resultType="com.ruoyi.order.api.model.TChargingOrder"> SELECT * FROM t_charging_order WHERE `status` = 4 AND NOW() >= ADDDATE(end_time, INTERVAL 10 MINUTE ) AND del_flag = 0 AND id NOT IN ( SELECT charging_order_id FROM t_charging_order_refund) </select> <select id="findChargingOrder" resultType="com.ruoyi.order.api.model.TChargingOrder"> SELECT * FROM t_charging_order WHERE `status` = 3 AND del_flag = 0 AND id NOT IN ( SELECT charging_order_id FROM t_charging_order_refund) </select> </mapper> ruoyi-service/ruoyi-order/src/test/java/com/ruoyi/order/RuoYiOrderApplicationTests.java
@@ -8,6 +8,7 @@ //import com.ruoyi.chargingPile.api.model.Site; //import com.ruoyi.chargingPile.api.model.TChargingGun; //import com.ruoyi.chargingPile.api.model.TChargingPile; //import com.ruoyi.common.core.domain.R; //import com.ruoyi.common.core.web.domain.AjaxResult; //import com.ruoyi.common.core.web.page.PageInfo; //import com.ruoyi.common.redis.service.RedisService; @@ -34,119 +35,37 @@ //import com.ruoyi.payment.api.feignClient.AliPaymentClient; //import com.ruoyi.payment.api.feignClient.WxPaymentClient; //import org.junit.jupiter.api.Test; //import org.redisson.api.RLock; //import org.redisson.api.RedissonClient; //import org.springframework.beans.factory.annotation.Autowired; //import org.springframework.boot.test.context.SpringBootTest; // //import javax.annotation.Resource; //import java.io.PrintWriter; //import java.math.BigDecimal; //import java.util.*; //import java.util.concurrent.TimeUnit; // //@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT, classes = RuoYiOrderApplication.class) //public class RuoYiOrderApplicationTests { // // @Resource // private TChargingOrderService chargingOrderService; // // @Resource // private ChargingGunClient chargingGunClient; // @Resource // private TSettlementConfirmMapper tSettlementConfirmMapper; // // @Resource // private SiteClient siteClient; // // @Resource // private AppUserCarClient appUserCarClient; // @Resource // private AppUserClient appUserClient; // // @Resource // private ChargingPileClient chargingPileClient; // // @Resource // private TChargingOrderAccountingStrategyService chargingOrderAccountingStrategyService; // // @Resource // private TokenService tokenService; // // @Resource // private WxPaymentClient wxPaymentClient; // // @Resource // private AliPaymentClient aliPaymentClient; // // @Resource // private AppCouponClient appCouponClient; // // @Resource // private AppUserVipDetailClient appUserVipDetailClient; // // @Resource // private RedisService redisService; // // @Resource // private UploadRealTimeMonitoringDataClient uploadRealTimeMonitoringDataClient; // // @Resource // private ChargingHandshakeClient chargingHandshakeClient; // // @Resource // private SendMessageClient sendMessageClient; // // @Resource // private TOrderEvaluateService orderEvaluateService; // // @Resource // private AccountingStrategyDetailClient accountingStrategyDetailClient; // // @Resource // private AccountingStrategyDetailOrderClient accountingStrategyDetailOrderClient; // // @Resource // private AccountingStrategyClient accountingStrategyClient; // // @Resource // private PlatformStartChargingReplyClient platformStartChargingReplyClient; // // @Resource // private TChargingOrderRefundService chargingOrderRefundService; // // @Resource // private PlatformStopChargingReplyClient platformStopChargingReplyClient; // // @Resource // private AccountingStrategyOrderService accountingStrategyOrderService; // // @Resource // private AccountingStrategyDetailOrderService accountingStrategyDetailOrderService; // // @Resource // private InviteUserClient inviteUserClient; // // @Resource // private AppUserIntegralChangeClient appUserIntegralChangeClient; // // @Resource // private IntegralRuleClient integralRuleClient; // // @Resource // private VipClient vipClient; // // @Resource // private UserTagClient userTagClient; // // @Resource // private AppUserTagClient appUserTagClient; // // @Resource // private SecurityDetectionClient securityDetectionClient; // @Autowired // private RedissonClient redissonClient; // // // @Test // public void test(){ // PayOrderQueryDto payOrderQueryDto = new PayOrderQueryDto(); // payOrderQueryDto.setPageCurr(1); // payOrderQueryDto.setPageSize(10000999); // PageInfo<PayOrderDto> data = chargingOrderService.payOrderQuery(payOrderQueryDto).getData(); // RLock lock = redissonClient.getLock("endOrder:1234565"); // boolean tryLock = false; // try { // tryLock = lock.tryLock(100, TimeUnit.SECONDS); // } catch (InterruptedException e) { // e.printStackTrace(); // lock.unlock(); // } // if(!tryLock){ // System.out.println("获取锁失败"); // } // System.out.println("获取锁成功"); // } //}