From bc4aefe8d0a0ac6e5ef1f2e65709549c2415ed8f Mon Sep 17 00:00:00 2001
From: luodangjia <luodangjia>
Date: 星期五, 11 十月 2024 14:51:40 +0800
Subject: [PATCH] 10.11

---
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java |  125 +++++++++++++++++++++++++++++++----------
 1 files changed, 94 insertions(+), 31 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 964eaa8..4f4c9a1 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
@@ -1,9 +1,7 @@
 package com.ruoyi.order.service.impl;
 
-import cn.hutool.core.date.DateUtil;
 import com.alibaba.fastjson2.JSON;
 import com.alibaba.fastjson2.JSONObject;
-import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -34,7 +32,6 @@
 import com.ruoyi.order.api.dto.SettlementConfirmAdd;
 import com.ruoyi.order.api.feignClient.AccountingStrategyDetailOrderClient;
 import com.ruoyi.order.api.feignClient.AccountingStrategyOrderClient;
-import com.ruoyi.order.api.feignClient.ChargingOrderAccountingStrategyClient;
 import com.ruoyi.order.api.model.*;
 import com.ruoyi.order.api.query.ChargingOrderQuery;
 import com.ruoyi.order.api.query.SettlementListQuery;
@@ -58,15 +55,11 @@
 import com.ruoyi.payment.api.model.WxPaymentRefundModel;
 import com.ruoyi.payment.api.vo.*;
 import com.ruoyi.system.api.feignClient.SysUserClient;
-import com.sun.org.apache.bcel.internal.generic.NEW;
 import io.seata.spring.annotation.GlobalTransactional;
-import io.swagger.annotations.ApiModelProperty;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.BeanUtils;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.StringUtils;
 
 import javax.annotation.Resource;
@@ -190,6 +183,9 @@
 	
 	@Resource
 	private AppUserTagClient appUserTagClient;
+	
+	@Resource
+	private SecurityDetectionClient securityDetectionClient;
 
 	//计数器
 	private Map<String, Integer> counter_map = new HashMap<>();
@@ -498,7 +494,7 @@
 			paymentOrder.setAmount(addChargingOrder.getPaymentAmount());
 			paymentOrder.setOpenId(appUser.getWxOpenid());
 			paymentOrder.setDescription("充电充值");
-			paymentOrder.setNotifyUrl("/order/t-charging-order/chargingOrderWXCallback");
+			paymentOrder.setNotifyUrl("/payment/wx/pay/notify");
 			Map<String, Object> data = wxPaymentClient.orderPay(paymentOrder).getData();
 			return AjaxResult.success(data);
 		}
@@ -511,7 +507,7 @@
 			req.setBody("充电充值");
 			AliPaymentResp data = aliPaymentClient.payment(req).getData();
 			if(null != data){
-				data.setNotifyUrl(data.getNotifyUrl() + "/t-charging-order/chargingOrderALICallback");
+				data.setNotifyUrl(data.getNotifyUrl() + "/order/t-charging-order/chargingOrderALICallback");
 				return AjaxResult.success(data);
 			}
 		}
@@ -550,7 +546,9 @@
 		//根据当前充值的金额和计费模板算出充电的金额
 		BigDecimal rechargeAmount = chargingOrder.getRechargeAmount();
 		BigDecimal rechargeAmount1 = new BigDecimal(rechargeAmount.toString());
-		Long now = System.currentTimeMillis();
+		SimpleDateFormat sdf = new SimpleDateFormat("HHmm");
+		Long now = Long.valueOf(sdf.format(new Date()));
+		Long nowTimeMillis = System.currentTimeMillis();
 		//根据支付金额,获取出使用的计费策略明细
 		//计算电费金额和服务费
 		BigDecimal serviceCharge = BigDecimal.ZERO;
@@ -559,21 +557,27 @@
 		BigDecimal discount = chargingOrder.getVipDiscount();
 		//先根据额定功率计算出每秒充电度数,然后计算出支付金额能充多少度电
 		TChargingGun tChargingGun = chargingGunClient.getChargingGunById(chargingOrder.getChargingGunId()).getData();
-		BigDecimal s_degrees = tChargingGun.getRatedPower().divide(new BigDecimal(3600));
-		
-		
+		BigDecimal s_degrees = tChargingGun.getRatedPower().divide(new BigDecimal(3600), 6, RoundingMode.HALF_EVEN);
+
 		TAppUser appUser = appUserClient.getUserById(chargingOrder.getAppUserId()).getData();
 		List<AccountingStrategyDetailOrder> list = accountingStrategyDetailOrderClient.getAllAccountingStrategyDetailOrder(chargingOrder.getId()).getData();
 		for (AccountingStrategyDetailOrder accountingStrategyDetailOrder : list) {
-			AccountingStrategyOrder accountingStrategyOrder = accountingStrategyOrderClient.getAccountingStrategyOrderById(accountingStrategyDetailOrder.getAccountingStrategyOrderId()).getData();
 			Integer start = Integer.valueOf(accountingStrategyDetailOrder.getStartTime().replaceAll(":", ""));
+			Integer end = Integer.valueOf(accountingStrategyDetailOrder.getEndTime().replaceAll(":", ""));
 			String[] split = accountingStrategyDetailOrder.getEndTime().split(":");
-			if(now >= start){
+			if(now >= start && now < end){
 				Calendar calendar = Calendar.getInstance();
 				calendar.set(Calendar.HOUR_OF_DAY, Integer.valueOf(split[0]));
 				calendar.set(Calendar.MINUTE, Integer.valueOf(split[1]));
 				//到此策略结束的秒数
-				long m = (calendar.getTimeInMillis() - now) / 1000;
+				if(null == nowTimeMillis){
+					String[] split1 = accountingStrategyDetailOrder.getStartTime().split(":");
+					Calendar calendar1 = Calendar.getInstance();
+					calendar1.set(Calendar.HOUR_OF_DAY, Integer.valueOf(split1[0]));
+					calendar1.set(Calendar.MINUTE, Integer.valueOf(split1[1]));
+					nowTimeMillis = calendar.getTimeInMillis();
+				}
+				long m = (calendar.getTimeInMillis() - nowTimeMillis) / 1000;
 				//每度电的单价
 				BigDecimal total_unit = accountingStrategyDetailOrder.getElectrovalence().add(accountingStrategyDetailOrder.getServiceCharge());
 				//每秒需要支付的金额
@@ -586,6 +590,7 @@
 					serviceCharge = accountingStrategyDetailOrder.getServiceCharge().multiply(s_degrees).multiply(new BigDecimal(m));
 					discountAmount = discountAmount.add(serviceCharge.multiply((new BigDecimal(10).subtract(discount)).divide(new BigDecimal(10))));
 					rechargeAmount1 = rechargeAmount1.subtract(multiply.multiply(new BigDecimal(m)));
+					nowTimeMillis = null;
 				}else{
 					electrovalence = accountingStrategyDetailOrder.getElectrovalence().multiply(s_degrees).multiply(new BigDecimal(times));
 					serviceCharge = accountingStrategyDetailOrder.getServiceCharge().multiply(s_degrees).multiply(new BigDecimal(times));
@@ -631,23 +636,41 @@
 		//使用订单id作为逻辑卡号
 		platformStartCharging.setCard_number(chargingOrder.getId().toString());
 		platformStartCharging.setAccount_balance(electrovalence);
+
+		System.err.println("-------------------远程调起开始充电请求-------------------");
+		System.err.println(platformStartCharging.toString());
+
 		sendMessageClient.platformStartCharging(platformStartCharging);
 		//异步线程检测远程启动的应答结果。如果失败,则需要全额退款
 		String code = chargingOrder.getCode();
 		//执行5分钟的定时任务检测
 		ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
 		scheduler.scheduleAtFixedRate(()->{
+			//获取安全校验
+			SecurityDetection securityDetection = securityDetectionClient.getSecurityDetection(chargingOrder.getCode()).getData();
+			if(null != securityDetection){
+				PreChargeCheck preChargeCheck1 =  redisService.getCacheObject("AQJC_" + chargingOrder.getChargingGunId());
+				if(null != preChargeCheck1){
+					preChargeCheck1.setElectronicLockLock(preChargeCheck1.getElectronicLockLock());
+					preChargeCheck1.setInsulationTesting(true);
+					preChargeCheck1.setSecureConnectionDetection(preChargeCheck1.getSecureConnectionDetection());
+					preChargeCheck1.setStartupSuccess(1);
+					redisService.setCacheObject("AQJC_" + chargingOrder.getChargingGunId(), preChargeCheck1);
+				}
+			}
+			
 			List<PlatformStartChargingReply> data = platformStartChargingReplyClient.getPlatformStartChargingReply(code).getData();
+			System.err.println("-------------------开始检查调起充电结果-------------------");
+			System.err.println(data.toString());
 			if(data.size() != 0){
 				PlatformStartChargingReply platformStartChargingReply = data.get(1);
 				Integer startup_result = platformStartChargingReply.getStartup_result();
 				Integer failure_cause = platformStartChargingReply.getFailure_cause();
 				Integer counter = counter_map.get(code);
 				PreChargeCheck preChargeCheck1 = redisService.getCacheObject(key);
-				//状态为5的时候,硬件会间隔60秒后再次检测,依然未插枪,则不启动充电
-				//因这里是间隔5秒执行检测,所以累计次数在30次以上
-				if(failure_cause == 5 && (null == counter || counter < 35)){
-					counter++;
+				//5分钟内还未插枪则取消充电,退回金额。
+				if(failure_cause == 5 && (null == counter || counter < 300)){
+					counter = (null == counter ? 0 : counter) + 1;
 					counter_map.put(code, counter);
 					//启动失败
 					preChargeCheck1.setStartupSuccess(3);
@@ -655,9 +678,9 @@
 					redisService.setCacheObject(key, preChargeCheck1);
 					return;
 				}
+				
 				//清除计时器中的无效数据
 				counter_map.remove(code);
-				//开始处理退款
 				TChargingOrder order = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, code));
 				if(0 == startup_result){
 					//启动失败
@@ -668,6 +691,7 @@
 					order.setStatus(-1);
 					order.setEndMode(0);
 				}else{
+					//启动成功
 					preChargeCheck1.setStartupSuccess(2);
 					order.setStatus(3);
 					order.setStartTime(LocalDateTime.now());
@@ -676,8 +700,10 @@
 				redisService.setCacheObject(key, preChargeCheck1);
 				//提前结束定时任务
 				scheduler.shutdown();
+			}else{
+				log.error("未上传开启充电结果........");
 			}
-		}, 5, 300, TimeUnit.SECONDS);
+		}, 5, 1, TimeUnit.SECONDS);
 		return AjaxResult.success();
 	}
 	
@@ -712,7 +738,7 @@
 				model.setOut_trade_no(chargingOrder.getCode());
 				model.setOut_refund_no(chargingOrderRefund.getRefundCode());
 				model.setReason("充电失败,取消充电订单");
-				model.setNotify_url("/order/t-charging-order/chargingOrderStartupFailureWxRefund");
+				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());
@@ -931,6 +957,9 @@
 					throw new RuntimeException(failure_cause);
 				}
 
+				// 将枪状态重置为空闲
+				chargingGun.setStatus(2);
+				chargingGunClient.updateChargingGunById(chargingGun);
 				//计算费用,处理退款
 				endCharge(chargingOrder);
 				break;
@@ -1116,7 +1145,7 @@
 				model.setOut_trade_no(chargingOrder.getCode());
 				model.setOut_refund_no(chargingOrderRefund.getRefundCode());
 				model.setReason("充电完成退款");
-				model.setNotify_url("http://221.182.45.100:9000/order/t-charging-order/chargingOrderStartupFailureWxRefund");
+				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());
@@ -1190,6 +1219,12 @@
 		for (ChargingOrderVO chargingOrderVO : list) {
 			TChargingGun data3 = chargingGunClient.getChargingGunById(chargingOrderVO.getChargingGunId()).getData();
 			TChargingPile data2 = chargingPileClient.getChargingPileById(chargingOrderVO.getChargingPileId()).getData();
+			if (chargingOrderVO.getSiteId()!=null){
+				List<Integer> integers = new ArrayList<>();
+				integers.add(chargingOrderVO.getSiteId());
+				List<Site> data = siteClient.getSiteByIds(integers).getData();
+				if (!data.isEmpty())chargingOrderVO.setSiteName(data.get(0).getName());
+			}
 			if (data2!=null && data3!=null){
 				chargingOrderVO.setTerminalName(data2.getName()+"-"+data3.getName());
 
@@ -1205,7 +1240,9 @@
 			// 单个订单累计服务费
 			BigDecimal serviceMoney1 = new BigDecimal("0");
 			UploadRealTimeMonitoringData data5 = uploadRealTimeMonitoringDataClient.chargingOrderInfo(chargingOrderVO.getCode()).getData();
-			chargingOrderVO.setChargingSecond(data5.getTime_remaining()*60L);
+			if (data5!=null){
+				chargingOrderVO.setChargingSecond(data5.getTime_remaining()*60L);
+			}
 			// 总收入
 			if (chargingOrderVO.getRefundStatus() !=null && chargingOrderVO.getRefundStatus() == 2){
 				income = income.add(chargingOrderVO.getPaymentAmount().subtract(chargingOrderVO.getRefundAmount()));
@@ -1828,6 +1865,11 @@
 	}
 
 	@Override
+	public List<Map<String, Object>> usersDay1() {
+		return this.baseMapper.usersDay1();
+	}
+
+	@Override
 	public List<Map<String, Object>> usersByQuery(ChargingStatisticsQueryDto statisticsQueryDto) {
 		return this.baseMapper.usersByQuery(statisticsQueryDto);
 	}
@@ -1875,6 +1917,8 @@
 
 	@Resource
 	private TShoppingOrderService shoppingOrderService;
+	@Resource
+	private TShoppingOrderRefundService shoppingOrderRefundService;
 	@Override
 	public R payRefund(PayOrderRefundDto payOrderQueryDto) {
 			if (payOrderQueryDto.getType()==1){
@@ -1901,7 +1945,7 @@
 					model.setOut_refund_no(chargingOrderRefund.getRefundCode());
 					model.setTransaction_id(tChargingOrder.getRechargeSerialNumber());
 					model.setReason("取消订单");
-					model.setNotify_url("http://221.182.45.100:9000/order/t-shopping-order/cancelShoppingOrderWxRefund");
+					model.setNotify_url("/order/t-shopping-order/cancelShoppingOrderWxRefund");
 					WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
 					amount.setRefund(payOrderQueryDto.getRefundAmount().multiply(new BigDecimal(100)).intValue());
 					amount.setTotal(tChargingOrder.getPaymentAmount().multiply(new BigDecimal(100)).intValue());
@@ -1909,6 +1953,9 @@
 					model.setAmount(amount);
 					R<String> orderR = wxPaymentClient.refundOrderR(model);
 					if(200 == orderR.getCode()){
+						tChargingOrder.setRefundStatus(2);
+						tChargingOrder.setRefundAmount((tChargingOrder.getRefundAmount()==null? BigDecimal.valueOf(0) :tChargingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount()));
+						this.baseMapper.updateById(tChargingOrder);
 						chargingOrderRefundService.save(chargingOrderRefund);
 					}
 				}
@@ -1922,6 +1969,9 @@
 					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()));
+						this.baseMapper.updateById(tChargingOrder);
 							chargingOrderRefundService.save(chargingOrderRefund);
 
 					}
@@ -1934,8 +1984,8 @@
 			}
 			if (payOrderQueryDto.getType()==2){
 				TShoppingOrder tChargingOrder = shoppingOrderService.getById(payOrderQueryDto.getOrderId());
-				TChargingOrderRefund chargingOrderRefund = new TChargingOrderRefund();
-				chargingOrderRefund.setChargingOrderId(tChargingOrder.getId());
+				TShoppingOrderRefund chargingOrderRefund = new TShoppingOrderRefund();
+				chargingOrderRefund.setShoppingOrderId(tChargingOrder.getId());
 				chargingOrderRefund.setRefundAmount(payOrderQueryDto.getRefundAmount());
 				chargingOrderRefund.setRefundStatus(1);
 				chargingOrderRefund.setPayType(tChargingOrder.getPaymentType());
@@ -1956,7 +2006,7 @@
 					model.setOut_refund_no(chargingOrderRefund.getRefundCode());
 					model.setTransaction_id(tChargingOrder.getSerialNumber());
 					model.setReason("取消订单");
-					model.setNotify_url("http://221.182.45.100:9000/order/t-shopping-order/cancelShoppingOrderWxRefund");
+					model.setNotify_url("/order/t-shopping-order/cancelShoppingOrderWxRefund");
 					WxPaymentRefundModel.RefundAmount amount = new WxPaymentRefundModel.RefundAmount();
 					amount.setRefund(payOrderQueryDto.getRefundAmount().multiply(new BigDecimal(100)).intValue());
 					amount.setTotal(tChargingOrder.getPaymentAmount().multiply(new BigDecimal(100)).intValue());
@@ -1964,7 +2014,10 @@
 					model.setAmount(amount);
 					R<String> orderR = wxPaymentClient.refundOrderR(model);
 					if(200 == orderR.getCode()){
-						chargingOrderRefundService.save(chargingOrderRefund);
+						tChargingOrder.setRefundStatus(2);
+						tChargingOrder.setRefundAmount((tChargingOrder.getRefundAmount()==null? BigDecimal.valueOf(0) :tChargingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount()));
+						shoppingOrderService.updateById(tChargingOrder);
+						shoppingOrderRefundService.save(chargingOrderRefund);
 					}
 				}
 
@@ -1977,7 +2030,12 @@
 					RefundResp resp = aliPaymentClient.refund(dto).getData();
 					if(null != resp){
 						SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-DDTHH:mm:ss+TIMEZONE");
-						chargingOrderRefundService.save(chargingOrderRefund);
+
+						tChargingOrder.setRefundStatus(2);
+						tChargingOrder.setRefundAmount((tChargingOrder.getRefundAmount()==null? BigDecimal.valueOf(0) :tChargingOrder.getRefundAmount()).add(payOrderQueryDto.getRefundAmount()));
+						shoppingOrderService.updateById(tChargingOrder);
+
+						shoppingOrderRefundService.save(chargingOrderRefund);
 
 					}
 				}
@@ -2421,6 +2479,11 @@
 		return this.baseMapper.countAllUserData();
 	}
 
+	@Override
+	public List<Map<String, Object>> needElec1(List<Integer> siteIds, ChargingStatisticsQueryDto statisticsQueryDto) {
+		return this.baseMapper.needElec1(siteIds,statisticsQueryDto);
+	}
+
 	public static void main(String[] args) {
 //		String format = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy年MM月dd日HH:mm:ss"));
 //		String format1 = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy年MM月dd日HH:mm:ss"));

--
Gitblit v1.7.1