From 9c4b38c6382b2a33d1716c962553ece34e4913f5 Mon Sep 17 00:00:00 2001
From: Pu Zhibing <393733352@qq.com>
Date: 星期四, 17 十月 2024 10:03:28 +0800
Subject: [PATCH] 合并代码

---
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java |  223 ++++++++++++++++++++++---------------------------------
 1 files changed, 89 insertions(+), 134 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 604b1e2..6e5e235 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
@@ -65,12 +65,14 @@
 import org.springframework.util.StringUtils;
 
 import javax.annotation.Resource;
+import java.lang.reflect.InvocationTargetException;
 import java.math.BigDecimal;
 import java.math.MathContext;
 import java.math.RoundingMode;
 import java.text.SimpleDateFormat;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.ZoneId;
 import java.time.ZoneOffset;
 import java.time.format.DateTimeFormatter;
 import java.time.format.TextStyle;
@@ -146,9 +148,6 @@
 
 	@Resource
 	private AccountingStrategyDetailOrderClient accountingStrategyDetailOrderClient;
-	
-	@Resource
-	private AccountingStrategyOrderClient accountingStrategyOrderClient;
 
 	@Resource
 	private AccountingStrategyClient accountingStrategyClient;
@@ -262,8 +261,8 @@
 		}else{
 			myChargingOrderInfo.setLicensePlate("无");
 		}
-		myChargingOrderInfo.setStartTime(chargingOrder.getStartTime().toInstant(ZoneOffset.of("+8")).toEpochMilli());
-		myChargingOrderInfo.setEndTime(chargingOrder.getEndTime().toInstant(ZoneOffset.of("+8")).toEpochMilli());
+		myChargingOrderInfo.setStartTime(chargingOrder.getStartTime().atZone(ZoneId.systemDefault()).toInstant().getEpochSecond() * 1000);
+		myChargingOrderInfo.setEndTime(chargingOrder.getEndTime().atZone(ZoneId.systemDefault()).toInstant().getEpochSecond() * 1000);
 		myChargingOrderInfo.setOrderAmount(chargingOrder.getOrderAmount());
 		myChargingOrderInfo.setPaymentAmount(chargingOrder.getPaymentAmount());
 		myChargingOrderInfo.setRechargeAmount(chargingOrder.getRechargeAmount());
@@ -308,7 +307,7 @@
 			}
 			myChargingOrderInfo.setPower(power);
 		}
-		myChargingOrderInfo.setActionable(myChargingOrderInfo.getEndTime() + 604800000L > System.currentTimeMillis() ? 0 : 1);
+		myChargingOrderInfo.setActionable(myChargingOrderInfo.getEndTime() + 604800000L < System.currentTimeMillis() ? 0 : 1);
 		return myChargingOrderInfo;
 	}
 	
@@ -892,13 +891,11 @@
 	 * @return
 	 */
 	public AjaxResult chargingOrderStartupFailureWxRefund(String out_refund_no, String refund_id, String tradeState, String success_time){
-		if("SUCCESS".equals(tradeState)){
-			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);
-		}
+		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);
 		return AjaxResult.success();
 	}
 
@@ -1696,107 +1693,25 @@
 	 * @param query
 	 */
 	@Override
+	@GlobalTransactional(rollbackFor = Exception.class)
 	public void chargeMonitoring(UploadRealTimeMonitoringDataQuery query) {
 		if(com.ruoyi.common.core.utils.StringUtils.isNotEmpty(query.getTransaction_serial_number())){
 			//获取当前的计费策略
 			TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, query.getTransaction_serial_number()));
-			AccountingStrategyDetailOrder strategyDetail = accountingStrategyDetailOrderClient.getNowAccountingStrategyDetailOrder(chargingOrder.getId()).getData();
-			TChargingOrderAccountingStrategy chargingOrderAccountingStrategy = chargingOrderAccountingStrategyService.getOne(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>()
-					.eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrder.getId()).orderByDesc(TChargingOrderAccountingStrategy::getCreateTime).last(" limit 0, 1"));
-			if(null == chargingOrderAccountingStrategy){
-				chargingOrderAccountingStrategy = new TChargingOrderAccountingStrategy();
-				chargingOrderAccountingStrategy.setChargingOrderId(chargingOrder.getId());
-				chargingOrderAccountingStrategy.setAccountingStrategyDetailId(strategyDetail.getId());
-				chargingOrderAccountingStrategy.setType(strategyDetail.getType());
-				chargingOrderAccountingStrategy.setStartTime(chargingOrder.getStartTime().format(DateTimeFormatter.ofPattern("HH:mm")));
-				chargingOrderAccountingStrategy.setEndTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("HH:mm")));
-				chargingOrderAccountingStrategy.setElectrovalence(strategyDetail.getElectrovalence());
-				chargingOrderAccountingStrategy.setServiceCharge(strategyDetail.getServiceCharge());
-				chargingOrderAccountingStrategy.setCostServiceCharge(strategyDetail.getCostServiceCharge());
-				//已充电总度数
-				BigDecimal charging_degree = query.getCharging_degree();
-				BigDecimal electrovalenc = strategyDetail.getElectrovalence().multiply(charging_degree);
-				BigDecimal originalServicePrice = strategyDetail.getServiceCharge().multiply(charging_degree);
-				BigDecimal serviceCharge = originalServicePrice;
-				//计算优惠金额
-				if(null != chargingOrder.getVipDiscount()){
-					serviceCharge = serviceCharge.multiply(chargingOrder.getVipDiscount().divide(new BigDecimal(10)));
-				}
-				chargingOrderAccountingStrategy.setChargingCapacity(charging_degree);
-				chargingOrderAccountingStrategy.setPeriodElectricPrice(electrovalenc);
-				chargingOrderAccountingStrategy.setPeriodServicePrice(serviceCharge);
-				chargingOrderAccountingStrategy.setPeriodOriginalServicePrice(originalServicePrice);
-				chargingOrderAccountingStrategy.setCreateTime(LocalDateTime.now());
-				chargingOrderAccountingStrategyService.save(chargingOrderAccountingStrategy);
-			}else{
-				if(chargingOrderAccountingStrategy.getAccountingStrategyDetailId().equals(strategyDetail.getId())){
-					//已充电总度数
-					BigDecimal charging_degree = query.getCharging_degree();
-					BigDecimal chargingCapacity = chargingOrderAccountingStrategy.getChargingCapacity();
-					//计算本阶段充电度数
-					BigDecimal subtract = charging_degree.subtract(chargingCapacity);
-					//计算本阶段费用
-					BigDecimal electrovalenc = strategyDetail.getElectrovalence().multiply(subtract);
-					BigDecimal originalServicePrice = strategyDetail.getServiceCharge().multiply(subtract);
-					BigDecimal serviceCharge = originalServicePrice;
-					//计算优惠金额
-					if(null != chargingOrder.getVipDiscount()){
-						serviceCharge = serviceCharge.multiply(chargingOrder.getVipDiscount().divide(new BigDecimal(10)));
-					}
-					//将本阶段的费用增加到总费用中
-					electrovalenc = electrovalenc.add(chargingOrderAccountingStrategy.getPeriodElectricPrice());
-					originalServicePrice = originalServicePrice.add(chargingOrderAccountingStrategy.getPeriodOriginalServicePrice());
-					serviceCharge = serviceCharge.add(chargingOrderAccountingStrategy.getPeriodServicePrice());
-					chargingOrderAccountingStrategy.setChargingCapacity(charging_degree);
-					chargingOrderAccountingStrategy.setPeriodElectricPrice(electrovalenc);
-					chargingOrderAccountingStrategy.setPeriodServicePrice(serviceCharge);
-					chargingOrderAccountingStrategy.setPeriodOriginalServicePrice(originalServicePrice);
-					chargingOrderAccountingStrategy.setEndTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("HH:mm")));
-					chargingOrderAccountingStrategyService.updateById(chargingOrderAccountingStrategy);
-				}else{
-					chargingOrderAccountingStrategy = new TChargingOrderAccountingStrategy();
-					chargingOrderAccountingStrategy.setChargingOrderId(chargingOrder.getId());
-					chargingOrderAccountingStrategy.setAccountingStrategyDetailId(strategyDetail.getId());
-					chargingOrderAccountingStrategy.setType(strategyDetail.getType());
-					chargingOrderAccountingStrategy.setStartTime(chargingOrder.getStartTime().format(DateTimeFormatter.ofPattern("HH:mm")));
-					chargingOrderAccountingStrategy.setEndTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("HH:mm")));
-					chargingOrderAccountingStrategy.setElectrovalence(strategyDetail.getElectrovalence());
-					chargingOrderAccountingStrategy.setServiceCharge(strategyDetail.getServiceCharge());
-					chargingOrderAccountingStrategy.setCostServiceCharge(strategyDetail.getCostServiceCharge());
-					//已充电总度数
-					BigDecimal charging_degree = query.getCharging_degree();
-					BigDecimal electrovalenc = strategyDetail.getElectrovalence().multiply(charging_degree);
-					BigDecimal originalServicePrice = strategyDetail.getServiceCharge().multiply(charging_degree);
-					BigDecimal serviceCharge = originalServicePrice;
-					//计算优惠金额
-					if(null != chargingOrder.getVipDiscount()){
-						serviceCharge = serviceCharge.multiply(chargingOrder.getVipDiscount().divide(new BigDecimal(10)));
-					}
-					chargingOrderAccountingStrategy.setChargingCapacity(charging_degree);
-					chargingOrderAccountingStrategy.setPeriodElectricPrice(electrovalenc);
-					chargingOrderAccountingStrategy.setPeriodServicePrice(serviceCharge);
-					chargingOrderAccountingStrategy.setPeriodOriginalServicePrice(originalServicePrice);
-					chargingOrderAccountingStrategy.setCreateTime(LocalDateTime.now());
-					chargingOrderAccountingStrategyService.save(chargingOrderAccountingStrategy);
-				}
-			}
-
-			List<TChargingOrderAccountingStrategy> list = chargingOrderAccountingStrategyService.list(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>()
-					.eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrder.getId()));
-			//总充电金额
-			BigDecimal t = BigDecimal.ZERO;
-			for (TChargingOrderAccountingStrategy coas : list) {
-				t = t.add(coas.getPeriodServicePrice()).add(coas.getPeriodElectricPrice());
-			}
-			BigDecimal residualAmount = chargingOrder.getRechargeAmount().subtract(t).setScale(4, RoundingMode.HALF_EVEN);
+			BigDecimal residualAmount = chargingOrder.getResidualAmount().add(chargingOrder.getVipDiscountAmount()).subtract(query.getPaid_amount());
 			chargingOrder.setResidualAmount(residualAmount);
 			if(query.getOutput_current().compareTo(BigDecimal.ZERO) != 0){
-				BigDecimal divide = query.getOutput_current().multiply(query.getOutput_voltage()).divide(new BigDecimal(1000));
+				BigDecimal divide = (query.getOutput_current().multiply(query.getOutput_voltage())).divide(new BigDecimal(1000));
 				chargingOrder.setChargingPower(divide);
 				chargingOrder.setCurrent(query.getOutput_current());
 				chargingOrder.setVoltage(query.getOutput_voltage());
 				chargingOrder.setPower(query.getOutput_current().multiply(query.getOutput_voltage()));
 				chargingOrder.setNeedElec(query.getOutput_current());
+				
+				TChargingGun chargingGun = chargingGunClient.getChargingGunById(chargingOrder.getChargingGunId()).getData();
+				chargingGun.setChargingPower(divide);
+				chargingGun.setSoc(query.getSoc());
+				chargingGunClient.updateChargingGunById(chargingGun);
 			}
 			chargingOrder.setElectricity(query.getCharging_degree());
 			chargingOrder.setTotalElectricity(new BigDecimal(100 - query.getSoc()));
@@ -1843,25 +1758,6 @@
 			return;
 		}
 		
-		//先判断总的充电度数是否和总报文消息中的数据相同,不相同等待30s
-		UploadRealTimeMonitoringData uploadRealTimeMonitoringData = uploadRealTimeMonitoringDataClient.chargingOrderInfo(chargingOrder.getCode()).getData();
-		if(null != uploadRealTimeMonitoringData){
-			for (int i = 0; i < 30; i++) {
-				List<TChargingOrderAccountingStrategy> list1 = chargingOrderAccountingStrategyService.list(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>().eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrder.getId()));
-				BigDecimal reduce = list1.stream().map(TChargingOrderAccountingStrategy::getChargingCapacity).reduce(BigDecimal.ZERO, BigDecimal::add);
-				BigDecimal charging_degree = uploadRealTimeMonitoringData.getCharging_degree();
-				if(charging_degree.compareTo(reduce) != 0){
-					try {
-						Thread.sleep(1000);
-					} catch (InterruptedException e) {
-						throw new RuntimeException(e);
-					}
-				}else{
-					break;
-				}
-			}
-		}
-		
 		//计算用户标签
 		editUserTag(chargingOrder);
 		//用户推荐奖励
@@ -1870,17 +1766,71 @@
 		//如果使用优惠券需要判断优惠券是否满足使用条件
 		//根据实际的充电金额计算退款金额   退回费用=(原金额/总金额)*(总金额-实际充电金额)
 		//退款金额=优惠券金额+剩余充电金额
-		List<TChargingOrderAccountingStrategy> list = chargingOrderAccountingStrategyService.list(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>().eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrder.getId()));
 		BigDecimal periodElectricPrice_total = BigDecimal.ZERO;
 		BigDecimal periodServicePrice_total = BigDecimal.ZERO;
 		BigDecimal total = BigDecimal.ZERO;
-		for (TChargingOrderAccountingStrategy chargingOrderAccountingStrategy : list) {
-			BigDecimal periodElectricPrice = chargingOrderAccountingStrategy.getPeriodElectricPrice();
-			BigDecimal periodServicePrice = chargingOrderAccountingStrategy.getPeriodOriginalServicePrice();
-			periodElectricPrice_total = periodElectricPrice_total.add(periodElectricPrice);
-			periodServicePrice_total = periodServicePrice_total.add(periodServicePrice);
-			total = total.add(periodElectricPrice).add(periodServicePrice);
+		
+		//获取订单的计费策略
+		List<AccountingStrategyDetailOrder> accountingStrategyDetailOrderList = accountingStrategyDetailOrderClient.getAllAccountingStrategyDetailOrder(chargingOrder.getId()).getData();
+		chargingOrderAccountingStrategyService.remove(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>().eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrder.getId()));
+		for (int i = 0; i < 12; i++) {
+			Class<? extends TransactionRecordMessageVO> clazz = vo.getClass();
+			try {
+				String time = (String) clazz.getMethod("getTime" + (i + 1)).invoke(vo);
+				if(StringUtils.hasLength(time)){
+					//充电度数
+					Object invoke = clazz.getMethod("getSharp_peak_charge" + (i + 1)).invoke(vo);
+					if(null == invoke || invoke.toString().equals("0")){
+						continue;
+					}
+					BigDecimal Sharp_peak_charge = new BigDecimal(invoke.toString());
+					//充电金额
+					Object invoke1 = clazz.getMethod("getSharp_peak_amount" + (i + 1)).invoke(vo);
+					BigDecimal sharp_peak_amount = new BigDecimal(invoke1.toString());
+					
+					String[] split = time.split("-");
+					AccountingStrategyDetailOrder strategyDetail = accountingStrategyDetailOrderList.stream().filter(s -> s.getStartTime().equals(split[0]) && s.getEndTime().equals(split[1])).findFirst().get();
+					
+					TChargingOrderAccountingStrategy chargingOrderAccountingStrategy = new TChargingOrderAccountingStrategy();
+					chargingOrderAccountingStrategy.setChargingOrderId(chargingOrder.getId());
+					chargingOrderAccountingStrategy.setAccountingStrategyDetailId(strategyDetail.getId());
+					chargingOrderAccountingStrategy.setType(strategyDetail.getType());
+					chargingOrderAccountingStrategy.setStartTime(chargingOrder.getStartTime().format(DateTimeFormatter.ofPattern("HH:mm")));
+					chargingOrderAccountingStrategy.setEndTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("HH:mm")));
+					chargingOrderAccountingStrategy.setElectrovalence(strategyDetail.getElectrovalence());
+					chargingOrderAccountingStrategy.setServiceCharge(strategyDetail.getServiceCharge());
+					chargingOrderAccountingStrategy.setCostServiceCharge(strategyDetail.getCostServiceCharge());
+					//已充电总度数
+					BigDecimal electrovalenc = strategyDetail.getElectrovalence().multiply(Sharp_peak_charge);
+					BigDecimal originalServicePrice = strategyDetail.getServiceCharge().multiply(Sharp_peak_charge);
+					BigDecimal serviceCharge = originalServicePrice;
+					//计算优惠金额
+					if(null != chargingOrder.getVipDiscount()){
+						serviceCharge = serviceCharge.multiply(chargingOrder.getVipDiscount().divide(new BigDecimal(10)));
+					}
+					chargingOrderAccountingStrategy.setChargingCapacity(Sharp_peak_charge);
+					chargingOrderAccountingStrategy.setPeriodElectricPrice(electrovalenc);
+					chargingOrderAccountingStrategy.setPeriodServicePrice(serviceCharge);
+					chargingOrderAccountingStrategy.setPeriodOriginalServicePrice(originalServicePrice);
+					chargingOrderAccountingStrategy.setCreateTime(LocalDateTime.now());
+					chargingOrderAccountingStrategyService.save(chargingOrderAccountingStrategy);
+					
+					BigDecimal periodElectricPrice = chargingOrderAccountingStrategy.getPeriodElectricPrice();
+					BigDecimal periodServicePrice = chargingOrderAccountingStrategy.getPeriodOriginalServicePrice();
+					periodElectricPrice_total = periodElectricPrice_total.add(periodElectricPrice);
+					periodServicePrice_total = periodServicePrice_total.add(periodServicePrice);
+					total = total.add(periodElectricPrice).add(periodServicePrice);
+				}
+			} catch (IllegalAccessException e) {
+				throw new RuntimeException(e);
+			} catch (InvocationTargetException e) {
+				throw new RuntimeException(e);
+			} catch (NoSuchMethodException e) {
+				throw new RuntimeException(e);
+			}
 		}
+		
+		
 		//原金额
 		BigDecimal rechargeAmount = chargingOrder.getRechargeAmount();
 		BigDecimal vipDiscountAmount = chargingOrder.getVipDiscountAmount();
@@ -1927,12 +1877,15 @@
 		if(null == chargingOrder.getEndMode()){
 			order.setEndMode(1);
 		}
-		order.setEndTime(LocalDateTime.now());
+		order.setResidualAmount(rechargeAmount.subtract(total));
+		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);
 		order.setVipDiscountAmount(discountAmount);
 		order.setServiceCharge(periodServicePrice_total);
 		order.setElectrovalence(periodElectricPrice_total);
+		order.setChargingCapacity(vo.getTotal_electricity());
 		
 		//计算优惠券
 		if(null != chargingOrder.getAppCouponId()){
@@ -1978,6 +1931,8 @@
 		// 将枪状态重置为空闲
 		TChargingGun chargingGun = chargingGunClient.getChargingGunById(chargingOrder.getChargingGunId()).getData();
 		chargingGun.setStatus(2);
+		chargingGun.setChargingPower(BigDecimal.ZERO);
+		chargingGun.setSoc(0);
 		chargingGunClient.updateChargingGunById(chargingGun);
 		
 		//添加积分
@@ -2192,10 +2147,10 @@
 					RefundResp resp = aliPaymentClient.refund(dto).getData();
 					if(null != resp){
 						SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-DDTHH:mm:ss+TIMEZONE");
-						tChargingOrder.setRefundStatus(2);
-						tChargingOrder.setRefundAmount((tChargingOrder.getRefundAmount()==null? BigDecimal.valueOf(0) :tChargingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount()));
+						chargingOrderRefund.setRefundStatus(2);
+						chargingOrderRefund.setRefundAmount((tChargingOrder.getRefundAmount()==null? BigDecimal.valueOf(0) :tChargingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount()));
 						this.baseMapper.updateById(tChargingOrder);
-							chargingOrderRefundService.save(chargingOrderRefund);
+						chargingOrderRefundService.save(chargingOrderRefund);
 
 					}
 				}
@@ -2731,7 +2686,7 @@
 		info.setEndDay(endTime.format(DateTimeFormatter.ofPattern("MM月dd日")) + " 周" + endTime.getDayOfWeek().getDisplayName(TextStyle.FULL, Locale.SIMPLIFIED_CHINESE));
 		info.setEndHour(endTime.format(DateTimeFormatter.ofPattern("HH:mm")));
 		int hour = endTime.getHour() - startTime.getHour();
-		int second = endTime.getSecond() - startTime.getSecond();
+		int second = endTime.getMinute() - startTime.getMinute();
 		info.setDuration(0 == hour ? String.format("%s分钟", second) : String.format("%s小时%s分钟", hour, second));
 		return info;
 	}

--
Gitblit v1.7.1