From 4c77ac6367145e4740141e872e1cda1c16efa9b1 Mon Sep 17 00:00:00 2001
From: Pu Zhibing <393733352@qq.com>
Date: 星期一, 09 六月 2025 15:17:16 +0800
Subject: [PATCH] 优化功能及重复退款问题

---
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java |  671 ++++++++++++++++++++++++++++---------------------------
 1 files changed, 339 insertions(+), 332 deletions(-)

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 46af198..654db7e 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
@@ -2179,31 +2179,37 @@
 	 */
 	@Override
 	public R endChargeBillingCharge(TransactionRecordMessageVO vo) {
-		TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, vo.getTransaction_serial_number()));
-		if(null == chargingOrder){
+		Boolean hasKey = redisService.hasKey("endOrder:" + vo.getTransaction_serial_number());
+		if(hasKey){
 			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();
-		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<>();
+		//添加1分钟的缓存
+		redisService.setCacheObject("endOrder:" + vo.getTransaction_serial_number(), vo.getTransaction_serial_number(), 1L, TimeUnit.MINUTES);
 		try {
+			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();
+			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<>();
 			//跨天
 			if(!vo.getStart_time().split(" ")[0].equals(vo.getEnd_time().split(" ")[0])){
 				//当天的
@@ -2324,330 +2330,331 @@
 					lists.add(vo1);
 				}
 			}
-		}catch (Exception e){
-			e.printStackTrace();
-			R.fail("处理失败");
-		}
-		
-		//开始处理明细
-		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());
+			
+			//开始处理明细
+			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 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);
-
-		TChargingOrder order = new TChargingOrder();
-		order.setId(chargingOrder.getId());
-		order.setAppUserId(chargingOrder.getAppUserId());
-		UploadRealTimeMonitoringData uploadRealTimeMonitoringData = uploadRealTimeMonitoringDataService.getLastDataById(chargingOrder.getCode());
-		if(null != uploadRealTimeMonitoringData && null == chargingOrder.getEndMode()){
-			Integer soc = uploadRealTimeMonitoringData.getSoc();
-			if(soc >= 98){
-				order.setEndMode(2);
-			}else if(chargingOrder.getResidualAmount().compareTo(new BigDecimal(1)) <= 0){
-				order.setEndMode(3);
-			}else{
-				order.setEndMode(0);
-			}
-		}
-		order.setResidualAmount(rechargeAmount.subtract(total).setScale(2, RoundingMode.HALF_EVEN));
-		order.setStartTime(LocalDateTime.parse(vo.getStart_time(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SS")));
-		order.setEndTime(LocalDateTime.parse(vo.getEnd_time(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SS")));
-		order.setStatus(5);
-		order.setOrderAmount(orderAmount.setScale(2, RoundingMode.HALF_EVEN));
-		order.setElectrovalence(periodElectricPrice_total.setScale(2, RoundingMode.HALF_EVEN));
-		order.setChargingCapacity(vo.getTotal_electricity());
-		order.setElectricity(vo.getTotal_electricity());
-		order.setVipDiscountAmount(vipDiscountAmount_total);
-		if(vipDiscountAmount_total.compareTo(BigDecimal.ZERO) == 0){
-			order.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);
+			BigDecimal orderAmount = BigDecimal.valueOf(total.doubleValue());
+			//原金额
+			BigDecimal rechargeAmount = chargingOrder.getRechargeAmount();
+			//支付金额
+			BigDecimal payAmount = periodElectricPrice_total.add(serviceCharge_total);
+			//退款金额=充值金额-实际支付金额
+			BigDecimal refundAmount = rechargeAmount.subtract(payAmount);
+			
+			TChargingOrder order = new TChargingOrder();
+			order.setId(chargingOrder.getId());
+			order.setAppUserId(chargingOrder.getAppUserId());
+			UploadRealTimeMonitoringData uploadRealTimeMonitoringData = uploadRealTimeMonitoringDataService.getLastDataById(chargingOrder.getCode());
+			if(null != uploadRealTimeMonitoringData && null == chargingOrder.getEndMode()){
+				Integer soc = uploadRealTimeMonitoringData.getSoc();
+				if(soc >= 98){
+					order.setEndMode(2);
+				}else if(chargingOrder.getResidualAmount().compareTo(new BigDecimal(1)) <= 0){
+					order.setEndMode(3);
 				}else{
-					order.setAppCouponId(null);
-					order.setCouponDiscountAmount(BigDecimal.ZERO);
-					appCouponClient.refund(chargingOrder.getAppCouponId().toString());
+					order.setEndMode(0);
 				}
 			}
-			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;
+			order.setResidualAmount(rechargeAmount.subtract(total).setScale(2, RoundingMode.HALF_EVEN));
+			order.setStartTime(LocalDateTime.parse(vo.getStart_time(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SS")));
+			order.setEndTime(LocalDateTime.parse(vo.getEnd_time(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SS")));
+			order.setStatus(5);
+			order.setOrderAmount(orderAmount.setScale(2, RoundingMode.HALF_EVEN));
+			order.setElectrovalence(periodElectricPrice_total.setScale(2, RoundingMode.HALF_EVEN));
+			order.setChargingCapacity(vo.getTotal_electricity());
+			order.setElectricity(vo.getTotal_electricity());
+			order.setVipDiscountAmount(vipDiscountAmount_total);
+			if(vipDiscountAmount_total.compareTo(BigDecimal.ZERO) == 0){
+				order.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{
-						couponDiscount = divide;
+						order.setAppCouponId(null);
+						order.setCouponDiscountAmount(BigDecimal.ZERO);
+						appCouponClient.refund(chargingOrder.getAppCouponId().toString());
+					}
+				}
+				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(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);
+			}
+			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);
+			this.updateById(order);
+			chargingOrder = this.getById(order.getId());
+			
+			//推送三方平台
+			if(2 == chargingOrder.getOrderSource()){
+				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();
+			}
+			
+			//开始将优惠券优惠的金额添加到明细中
+			BigDecimal couponDiscountAmount = order.getCouponDiscountAmount();
+			if(null != couponDiscountAmount && couponDiscountAmount.compareTo(BigDecimal.ZERO) > 0){
+				List<TChargingOrderAccountingStrategy> list = chargingOrderAccountingStrategyService.list(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>().eq(TChargingOrderAccountingStrategy::getChargingOrderId, order.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);
+			//推送状态给三方平台
+			if(2 == chargingOrder.getOrderSource()){
+				tcecClient.pushChargingGunStatus(chargingGun.getFullNumber(), chargingGun.getStatus());
+			}
+			
+			//添加积分
+			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;
+						}
 					}
 					
-					appCoupon.setStatus(2);
-					appCouponClient.updateAppCoupon(appCoupon);
-				}else{
-					order.setAppCouponId(null);
-					order.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);
-		}
-		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);
-		this.updateById(order);
-		chargingOrder = this.getById(order.getId());
-		
-		//推送三方平台
-		if(2 == chargingOrder.getOrderSource()){
-			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();
-		}
-		
-		//开始将优惠券优惠的金额添加到明细中
-		BigDecimal couponDiscountAmount = order.getCouponDiscountAmount();
-		if(null != couponDiscountAmount && couponDiscountAmount.compareTo(BigDecimal.ZERO) > 0){
-			List<TChargingOrderAccountingStrategy> list = chargingOrderAccountingStrategyService.list(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>().eq(TChargingOrderAccountingStrategy::getChargingOrderId, order.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);
-		//推送状态给三方平台
-		if(2 == chargingOrder.getOrderSource()){
-			tcecClient.pushChargingGunStatus(chargingGun.getFullNumber(), chargingGun.getStatus());
-		}
-		
-		//添加积分
-		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);
 					}
 				}
 				
-				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);
-			if(refundAmount.compareTo(BigDecimal.ZERO) > 0){
-				Integer rechargePaymentType = chargingOrder.getRechargePaymentType();
-				//构建退款明细
-				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(refundAmount);
-				chargingOrderRefund.setRefundStatus(1);
-				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);
-					}
-				}
+				//计算用户标签
+				editUserTag(chargingOrder);
+				//用户推荐奖励
+				referralReward(chargingOrder);
 				
+				//开始构建退款费用
+				refundAmount = refundAmount.setScale(2, RoundingMode.HALF_EVEN);
+				if(refundAmount.compareTo(BigDecimal.ZERO) > 0){
+					Integer rechargePaymentType = chargingOrder.getRechargePaymentType();
+					//构建退款明细
+					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(refundAmount);
+					chargingOrderRefund.setRefundStatus(1);
+					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);
+						}
+					}
+					
+				}
 			}
+			
+			//添加汇总统计数据
+			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);
+		}catch (Exception e) {
+			e.printStackTrace();
+		}finally {
+			redisService.deleteObject("endOrder:" + vo.getTransaction_serial_number());
 		}
-		
-		//添加汇总统计数据
-		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);
 		return R.ok();
 	}
 	

--
Gitblit v1.7.1