From a155690a38eb156a4dbef88452b3d5decc833e77 Mon Sep 17 00:00:00 2001
From: Pu Zhibing <393733352@qq.com>
Date: 星期五, 24 一月 2025 15:27:41 +0800
Subject: [PATCH] 新增引流接口及业务逻辑

---
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java |  216 +++++++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 197 insertions(+), 19 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 cb195dc..c10feaf 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
@@ -32,6 +32,7 @@
 import com.ruoyi.integration.api.feignClient.*;
 import com.ruoyi.integration.api.model.*;
 import com.ruoyi.integration.api.vo.GetPlatformStopChargingReply;
+import com.ruoyi.integration.api.vo.StartChargeResult;
 import com.ruoyi.order.api.dto.SettlementConfirmAdd;
 import com.ruoyi.order.api.feignClient.AccountingStrategyDetailOrderClient;
 import com.ruoyi.order.api.feignClient.AccountingStrategyOrderClient;
@@ -141,7 +142,7 @@
 	private UploadRealTimeMonitoringDataClient uploadRealTimeMonitoringDataClient;
 	
 	@Resource
-	private ChargingHandshakeClient chargingHandshakeClient;
+	private TCECClient tcecClient;
 
 	@Resource
 	private SendMessageClient sendMessageClient;
@@ -202,6 +203,9 @@
 	
 	//计数器
 	private Map<String, Integer> boot_failed_map = new HashMap<>();
+	
+	@Resource
+	private OperatorClient operatorClient;
 
 
 
@@ -465,7 +469,7 @@
 		chargingOrder.setRechargeAmount(addChargingOrder.getPaymentAmount());
 		chargingOrder.setAppCouponId(addChargingOrder.getAppUserCouponId());
 		chargingOrder.setVipDiscountAmount(BigDecimal.ZERO);
-		chargingOrder.setOrderSource(0);
+		chargingOrder.setOrderSource(1);
 		chargingOrder.setTitle("【充电桩充电】" + chargingPile.getNumber() + "号桩/" + tChargingGun.getCode() + "号枪");
 		
 		Site site = siteClient.getSiteByIds(Arrays.asList(tChargingGun.getSiteId())).getData().get(0);
@@ -744,6 +748,10 @@
 			}
 			this.updateById(order);
 			redisService.setCacheObject(key, preChargeCheck1, 24L, TimeUnit.HOURS);
+			//推送三方平台订单状态
+			if(2 == chargingOrder.getOrderSource()){
+				tcecClient.notificationEquipChargeStatus(chargingOrder.getStartChargeSeq(), chargingOrder.getOperatorId());
+			}
 			return true;
 		}else{
 			Integer counter = boot_failed_map.get(code);
@@ -774,6 +782,10 @@
 			order.setEndMode(0);
 			this.updateById(order);
 			redisService.setCacheObject(key, preChargeCheck1, 24L, TimeUnit.HOURS);
+			//推送三方平台订单状态
+			if(2 == chargingOrder.getOrderSource()){
+				tcecClient.notificationEquipChargeStatus(chargingOrder.getStartChargeSeq(), chargingOrder.getOperatorId());
+			}
 			return true;
 		}
 	}
@@ -833,9 +845,24 @@
 			TChargingGun chargingGun = chargingGunClient.getChargingGunById(order.getChargingGunId()).getData();
 			chargingGun.setStatus(4);
 			chargingGunClient.updateChargingGunById(chargingGun);
+			//推送状态给三方平台
+			tcecClient.pushChargingGunStatus(chargingGun.getId(), chargingGun.getStatus());
 		}
 		redisService.setCacheObject("AQJC_" + order.getChargingGunId(), preChargeCheck1, 24L, TimeUnit.HOURS);
 		this.updateById(order);
+		//推送三方平台启动充电结果
+		if(2 == order.getOrderSource()){
+			StartChargeResult result = new StartChargeResult();
+			result.setStartChargeSeq(order.getStartChargeSeq());
+			result.setStartChargeSeqStat(3 == order.getStatus() ? 2 : 4);
+			result.setConnectorID(order.getChargingGunId().toString());
+			result.setStartTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+			Operator operator = operatorClient.getOperatorById(order.getOperatorId()).getData();
+			result.setOperatorID(operator.getOperatorId());
+			tcecClient.notificationStartChargeResult(result);
+			
+			tcecClient.notificationEquipChargeStatus(order.getStartChargeSeq(), order.getOperatorId());
+		}
 	}
 	
 	/**
@@ -845,7 +872,7 @@
 	public void refund(String code){
 		log.info(code + ":-------------------充电启动失败,执行退款-------------------");
 		TChargingOrder chargingOrder = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getCode, code));
-		if(chargingOrder.getStatus() == 2){
+		if(chargingOrder.getOrderSource() == 1 && chargingOrder.getStatus() == 2){
 			Integer rechargePaymentType = chargingOrder.getRechargePaymentType();
 			BigDecimal rechargeAmount = chargingOrder.getRechargeAmount();
 			//构建退款明细
@@ -1000,7 +1027,6 @@
 		chargingOrder.setStatus(4);
 		chargingOrder.setEndMode(1);
 		this.updateById(chargingOrder);
-		
 		String code1 = order.getCode();
 		TChargingGun chargingGun = chargingGunClient.getChargingGunById(order.getChargingGunId()).getData();
 		//异步线程处理停机
@@ -1015,6 +1041,11 @@
 			log.info(code1 + ":-------------------远程停止充电请求-------------------");
 			log.info(platformStopCharging.toString());
 		});
+		//推送三方平台
+		if(2 == order.getOrderSource()){
+			tcecClient.notificationEquipChargeStatus(order.getStartChargeSeq(), order.getOperatorId());
+		}
+		
 		return AjaxResult.success();
 	}
 	
@@ -1261,16 +1292,6 @@
 		 BigDecimal refundMoney = new BigDecimal("0");
 		 BigDecimal paymentMoney = new BigDecimal("0");
 		List<String> collect2 = list.stream().map(TChargingOrder::getCode).collect(Collectors.toList());
-		StringBuilder stringBuilder2 = new StringBuilder();
-		List<UploadRealTimeMonitoringData> uploadRealTimeMonitoringData2 = new ArrayList<>();
-		for (String s : collect2) {
-			stringBuilder2.append(s).append(",");
-		}
-		if (stringBuilder2.length()>0){
-			StringBuilder ids = stringBuilder2.deleteCharAt(stringBuilder2.length() - 1);
-			uploadRealTimeMonitoringData2 = uploadRealTimeMonitoringDataClient.getOrderInfoByCodes(ids.toString()).getData();
-
-		}
 		for (ChargingOrderVO chargingOrderVO : list) {
 			if (roleType == 2){
 				for (Integer siteId : siteIds) {
@@ -1297,11 +1318,13 @@
 			// 充电订单 明细记录
 			List<TChargingOrderAccountingStrategy> chargingOrderId = chargingOrderAccountingStrategyService.list(new QueryWrapper<TChargingOrderAccountingStrategy>()
 					.eq("charging_order_id", chargingOrderVO.getId()));
-			UploadRealTimeMonitoringData data5 = uploadRealTimeMonitoringData2.stream().filter(e -> e.getTransaction_serial_number().equals(chargingOrderVO.getCode()))
-					.findFirst().orElse(null);
-			if (data5!=null && data5.getCumulative_charging_time()!=null){
-				long l = data5.getCumulative_charging_time() * 60L;
-				chargingOrderVO.setChargingSecond(l);
+			if (chargingOrderVO.getStartTime()!=null && chargingOrderVO.getEndTime()!=null){
+				LocalDateTime startTime = chargingOrderVO.getStartTime();
+				LocalDateTime endTime = chargingOrderVO.getEndTime();
+				// 计算时间差 单位秒
+				long between = ChronoUnit.SECONDS.between(startTime, endTime);
+				chargingOrderVO.setChargingSecond(between);
+
 			}
 			// 充电时段数
 			int size = chargingOrderId.size();
@@ -2261,6 +2284,14 @@
 		this.updateById(order);
 		chargingOrder = this.getById(order.getId());
 		
+		//推送三方平台
+		if(2 == chargingOrder.getOrderSource()){
+			tcecClient.notificationEquipChargeStatus(chargingOrder.getStartChargeSeq(), chargingOrder.getOperatorId());
+			tcecClient.notificationStopChargeResult(chargingOrder.getStartChargeSeq(), chargingOrder.getChargingGunId().toString(),
+					chargingOrder.getOperatorId());
+			tcecClient.notificationChargeOrderInfo(chargingOrder.getStartChargeSeq(), chargingOrder.getOperatorId());
+		}
+		
 		//开始将优惠券优惠的金额添加到明细中
 		BigDecimal couponDiscountAmount = order.getCouponDiscountAmount();
 		if(null != couponDiscountAmount && couponDiscountAmount.compareTo(BigDecimal.ZERO) > 0){
@@ -2282,6 +2313,8 @@
 		chargingGun.setStatus(2);
 		chargingGun.setChargingPower(BigDecimal.ZERO);
 		chargingGunClient.updateChargingGunById(chargingGun);
+		//推送状态给三方平台
+		tcecClient.pushChargingGunStatus(chargingGun.getId(), chargingGun.getStatus());
 		
 		//添加积分
 		TIntegralRule integralRule = integralRuleClient.getSet().getData();
@@ -3982,4 +4015,149 @@
 	public Long countCar(List<String> brands) {
 		return this.baseMapper.countCar(brands);
 	}
+	
+	
+	/**
+	 * 添加三方平台充电订单数据
+	 * @param chargingGunId
+	 */
+	@Override
+	public R addTripartitePlatformOrder(Integer chargingGunId, String operatorId, Integer rechargePaymentType, BigDecimal paymentAmount, String startChargeSeq) {
+		//检查当前枪是否是正在使用中
+		TChargingOrder one = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getChargingGunId, chargingGunId)
+				.in(TChargingOrder::getStatus, Arrays.asList(1, 2, 3)).eq(TChargingOrder::getDelFlag, 0));
+		if(null != one){
+			return R.fail("充电枪正在充电中,启动失败");
+		}
+		
+		//构建新的待支付订单
+		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
+		TChargingOrder chargingOrder = new TChargingOrder();
+		String code = "CD" + Double.valueOf(Math.random() * 1000).intValue() + sdf.format(new Date());
+		chargingOrder.setCode(code);
+		chargingOrder.setOrderType(1);
+		chargingOrder.setOrderClassification(1);
+		TChargingGun tChargingGun = chargingGunClient.getChargingGunById(chargingGunId).getData();
+		TChargingPile chargingPile = chargingPileClient.getChargingPileById(tChargingGun.getChargingPileId()).getData();
+		chargingOrder.setSiteId(tChargingGun.getSiteId());
+		chargingOrder.setChargingPileId(tChargingGun.getChargingPileId());
+		chargingOrder.setChargingGunId(chargingGunId);
+		chargingOrder.setRechargePaymentType(rechargePaymentType);
+		chargingOrder.setRechargePaymentStatus(2);
+		chargingOrder.setRechargeAmount(paymentAmount);
+		chargingOrder.setVipDiscountAmount(BigDecimal.ZERO);
+		chargingOrder.setOrderSource(2);
+		Operator operator = operatorClient.getOperator(operatorId).getData();
+		chargingOrder.setOperatorId(operator.getId());
+		chargingOrder.setAppUserId(operator.getId().longValue());
+		chargingOrder.setTripartitePlatformName(operator.getName());
+		chargingOrder.setStartChargeSeq(startChargeSeq);
+		chargingOrder.setTitle("【充电桩充电】" + chargingPile.getNumber() + "号桩/" + tChargingGun.getCode() + "号枪");
+		chargingOrder.setStatus(2);
+		chargingOrder.setPayTime(LocalDateTime.now());
+		chargingOrder.setChargeAmount(chargingOrder.getRechargeAmount());
+		chargingOrder.setVipDiscountAmount(BigDecimal.ZERO);
+		this.save(chargingOrder);
+		
+		Integer accountingStrategyId = tChargingGun.getAccountingStrategyId();
+		if(null == accountingStrategyId){
+			Site site = siteClient.getSiteByIds(Arrays.asList(tChargingGun.getSiteId())).getData().get(0);
+			//查询站点上面的计费策略
+			accountingStrategyId = site.getAccountingStrategyId();
+		}
+		TAccountingStrategy accountingStrategy = accountingStrategyClient.getAccountingStrategyById(accountingStrategyId).getData();
+		
+		//添加订单的计费策略
+		List<TAccountingStrategyDetail> strategyDetailList = accountingStrategyDetailClient.getListByAccountingStrategyId(accountingStrategyId).getData();
+		AccountingStrategyOrder accountingStrategyOrder = new AccountingStrategyOrder();
+		BeanUtils.copyProperties(accountingStrategy, accountingStrategyOrder);
+		accountingStrategyOrder.setChargingOrderId(chargingOrder.getId());
+		accountingStrategyOrderService.save(accountingStrategyOrder);
+		List<AccountingStrategyDetailOrder> list1 = new ArrayList<>();
+		for (TAccountingStrategyDetail tAccountingStrategyDetail : strategyDetailList) {
+			AccountingStrategyDetailOrder accountingStrategyDetailOrder = new AccountingStrategyDetailOrder();
+			BeanUtils.copyProperties(tAccountingStrategyDetail, accountingStrategyDetailOrder);
+			accountingStrategyDetailOrder.setChargingOrderId(chargingOrder.getId());
+			list1.add(accountingStrategyDetailOrder);
+		}
+		accountingStrategyDetailOrderService.saveBatch(list1);
+		
+		
+		//添加安全检测数据到缓存中,每步安全检测完成后需要更新缓存数据
+		PreChargeCheck preChargeCheck = new PreChargeCheck();
+		preChargeCheck.setElectronicLockLock(false);
+		preChargeCheck.setInsulationTesting(false);
+		preChargeCheck.setSecureConnectionDetection(false);
+		preChargeCheck.setStartupSuccess(1);
+		String key = "AQJC_" + chargingOrder.getChargingGunId();
+		redisService.setCacheObject(key, preChargeCheck, 24L, TimeUnit.HOURS);
+		
+		BigDecimal rechargeAmount = chargingOrder.getRechargeAmount();
+		//调用远程启动充电消息
+		PlatformStartCharging platformStartCharging = new PlatformStartCharging();
+		platformStartCharging.setTransaction_serial_number(chargingOrder.getCode());
+		platformStartCharging.setCharging_pile_code(chargingPile.getCode());
+		platformStartCharging.setCharging_gun_code(tChargingGun.getCode());
+		//使用订单id作为逻辑卡号
+		platformStartCharging.setCard_number(chargingOrder.getId().toString());
+		platformStartCharging.setAccount_balance(rechargeAmount);
+		log.info(chargingOrder.getCode() + ":-------------------远程调起开始充电请求-------------------" + platformStartCharging.toString());
+		sendMessageClient.platformStartCharging(platformStartCharging);
+		//异步线程检测远程启动的应答结果。如果失败,则需要全额退款
+		Long id = chargingOrder.getId();
+		//执行5分钟的定时任务检测
+		ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
+		scheduler.scheduleAtFixedRate(()->{
+			if(timingDetection(id)){
+				scheduler.shutdown();
+			}
+		}, 5, 1, TimeUnit.SECONDS);
+		
+		//推送三方平台订单状态
+		tcecClient.notificationEquipChargeStatus(chargingOrder.getStartChargeSeq(), chargingOrder.getOperatorId());
+		return R.ok();
+	}
+	
+	
+	/**
+	 * 三方平台停止充电操作
+	 * @param startChargeSeq
+	 * @return
+	 */
+	@Override
+	public R tripartitePlatformStopCharge(String startChargeSeq) {
+		TChargingOrder order = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getStartChargeSeq, startChargeSeq));
+		Integer status = order.getStatus();
+		if(status != 3){
+			return R.fail("还未开始充电");
+		}
+		if(status == 4 || status == 5){
+			return R.fail("不能重复操作");
+		}
+		TChargingOrder chargingOrder = new TChargingOrder();
+		chargingOrder.setId(order.getId());
+		chargingOrder.setAppUserId(order.getOperatorId().longValue());
+		chargingOrder.setEndTime(LocalDateTime.now());
+		chargingOrder.setStatus(4);
+		chargingOrder.setEndMode(1);
+		this.updateById(chargingOrder);
+		
+		tcecClient.notificationEquipChargeStatus(order.getStartChargeSeq(), order.getOperatorId());
+		
+		String code1 = order.getCode();
+		TChargingGun chargingGun = chargingGunClient.getChargingGunById(order.getChargingGunId()).getData();
+		//异步线程处理停机
+		ExecutorService cachedThreadPool = Executors.newFixedThreadPool(1);
+		cachedThreadPool.execute(()->{
+			//调用硬件停止充电,停止成功后开始计算费用退款
+			TChargingPile chargingPile = chargingPileClient.getChargingPileById(order.getChargingPileId()).getData();
+			PlatformStopCharging platformStopCharging = new PlatformStopCharging();
+			platformStopCharging.setCharging_pile_code(chargingPile.getCode());
+			platformStopCharging.setCharging_gun_code(chargingGun.getCode());
+			sendMessageClient.platformStopCharging(platformStopCharging);
+			log.info(code1 + ":-------------------远程停止充电请求-------------------");
+			log.info(platformStopCharging.toString());
+		});
+		return R.ok();
+	}
 }

--
Gitblit v1.7.1