From bad2110204732e41ed5bc6e48b6e27fe4b6a2249 Mon Sep 17 00:00:00 2001
From: Pu Zhibing <393733352@qq.com>
Date: 星期三, 05 二月 2025 10:34:34 +0800
Subject: [PATCH] 新增加互联互通扩展接口

---
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECController.java |  550 +++++++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 452 insertions(+), 98 deletions(-)

diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECController.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECController.java
index 3aa324b..2689841 100644
--- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECController.java
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECController.java
@@ -1,25 +1,21 @@
 package com.ruoyi.integration.drainage;
 
 import com.alibaba.fastjson.JSON;
-import com.ruoyi.chargingPile.api.feignClient.AccountingStrategyDetailClient;
-import com.ruoyi.chargingPile.api.feignClient.ChargingGunClient;
-import com.ruoyi.chargingPile.api.feignClient.ChargingPileClient;
-import com.ruoyi.chargingPile.api.feignClient.SiteClient;
-import com.ruoyi.chargingPile.api.model.Site;
-import com.ruoyi.chargingPile.api.model.TAccountingStrategyDetail;
-import com.ruoyi.chargingPile.api.model.TChargingGun;
-import com.ruoyi.chargingPile.api.model.TChargingPile;
+import com.ruoyi.chargingPile.api.feignClient.*;
+import com.ruoyi.chargingPile.api.model.*;
+import com.ruoyi.chargingPile.api.vo.GetParkingRecord;
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.core.dto.ChargingPercentProvinceDto;
 import com.ruoyi.common.core.utils.StringUtils;
 import com.ruoyi.common.core.web.page.PageInfo;
-import com.ruoyi.common.security.service.TokenService;
+import com.ruoyi.integration.drainage.kuaidian.TCECKDUtil;
+import com.ruoyi.integration.drainage.kuaidian.model.*;
 import com.ruoyi.integration.drainage.model.*;
 import com.ruoyi.integration.drainage.model.enu.*;
 import com.ruoyi.order.api.feignClient.ChargingOrderAccountingStrategyClient;
 import com.ruoyi.order.api.feignClient.ChargingOrderClient;
 import com.ruoyi.order.api.model.AddTripartitePlatformOrder;
-import com.ruoyi.order.api.model.StartChargeResult;
+import com.ruoyi.integration.api.vo.StartChargeResult;
 import com.ruoyi.order.api.model.TChargingOrder;
 import com.ruoyi.order.api.model.TChargingOrderAccountingStrategy;
 import com.ruoyi.other.api.domain.Operator;
@@ -36,6 +32,9 @@
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 /**
@@ -71,6 +70,13 @@
 	private TokenUtil tokenUtil;
 	
 	private static Map<Long, Integer> map = new HashMap<>();
+	
+	@Resource
+	private ParkingLotClient parkingLotClient;
+	
+	@Resource
+	private ParkingRecordClient parkingRecordClient;
+	
 	
 	
 	/**
@@ -132,7 +138,7 @@
 		Operator operator = r.getData();
 		baseRequest.setOperator(operator);
 		//校验签名
-		String sign = buildSign(baseRequest);
+		String sign = TCECUtil.buildSign(baseRequest);
 		if(!sign.equals(sig)){
 			baseResult.setRet(4001);
 			baseResult.setMsg("签名校验失败");
@@ -140,32 +146,6 @@
 		}
 		baseResult.setOperator(operator);
 		return baseResult;
-	}
-	
-	
-	/**
-	 * 构建签名字符串
-	 * @param model
-	 * @return
-	 */
-	public String buildSign(BaseModel model){
-		Operator operator = model.getOperator();
-		//签名秘钥SigSecret
-		String key = operator.getSigSecret();
-		String sign = "";
-		switch (operator.getName()){
-			case "XinDianTu":
-				//进行字符串拼接、计算
-				String m = new StringBuilder(model.getOperatorID()).append(model.getData()).append(model.getTimeStamp()).append(model.getSeq()).toString();
-				byte[] hmacMd5 = SignUtil.getHMacMD5Bytes(key.getBytes(), m.getBytes());
-				// 打印计算得到的签名Sig
-				sign = SignUtil.bytesToHexString(hmacMd5);
-				break;
-			case "KuaiDian":
-				sign = SignUtil.hmacSign(model.getData(), key);
-				break;
-		}
-		return sign;
 	}
 	
 	
@@ -181,7 +161,7 @@
 		BaseResult baseResult = requestCheck(false, baseRequest, request);
 		if(0 != baseResult.getRet()){
 			baseResult.setData("");
-			baseResult.setSig(buildSign(baseResult));
+			baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
 			return baseResult;
 		}
 		QueryTokenResult queryTokenResult = new QueryTokenResult();
@@ -189,6 +169,11 @@
 		if(null == operator){
 			queryTokenResult.setSuccStat(1);
 			queryTokenResult.setFailReason(1);
+			//参数加密
+			String jsonString = JSON.toJSONString(queryTokenResult);
+			String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
+			baseResult.setData(encrypt);
+			baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
 			return baseResult;
 		}
 		
@@ -200,9 +185,9 @@
 			queryTokenResult.setFailReason(2);
 			//参数加密
 			String jsonString = JSON.toJSONString(queryTokenResult);
-			String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv());
+			String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
 			baseResult.setData(encrypt);
-			baseResult.setSig(buildSign(baseResult));
+			baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
 			return baseResult;
 		}
 		
@@ -217,9 +202,9 @@
 		queryTokenResult.setTokenAvailableTime(expires_in * 60);
 		//参数加密
 		String jsonString = JSON.toJSONString(queryTokenResult);
-		String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv());
+		String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
 		baseResult.setData(encrypt);
-		baseResult.setSig(buildSign(baseResult));
+		baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
 		return baseResult;
 	}
 	
@@ -237,7 +222,7 @@
 		BaseResult baseResult = requestCheck(true, baseRequest, request);
 		if(0 != baseResult.getRet()){
 			baseResult.setData("");
-			baseResult.setSig(buildSign(baseResult));
+			baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
 			return baseResult;
 		}
 		Operator operator = baseResult.getOperator();
@@ -253,16 +238,17 @@
 			pageSize = 10;
 		}
 		PageInfo<Site> siteListPaging = siteClient.getSiteListPaging(pageNo, pageSize);
+		List<TParkingLot> parkingLots = parkingLotClient.getAllParkingLot().getData();
 		QueryStationsInfoResult queryStationsInfoResult = new QueryStationsInfoResult();
 		queryStationsInfoResult.setPageNo(pageNo);
 		queryStationsInfoResult.setPageCount((0 == (siteListPaging.getTotal() % pageSize) ? 0 : 1) + Double.valueOf(siteListPaging.getTotal() / pageSize).intValue());
 		queryStationsInfoResult.setItemSize(Long.valueOf(siteListPaging.getTotal()).intValue());
-		queryStationsInfoResult.setStationInfos(buildSite(siteListPaging.getRecords()));
+		queryStationsInfoResult.setStationInfos(buildSite(parkingLots, siteListPaging.getRecords()));
 		//参数加密
 		String jsonString = JSON.toJSONString(queryStationsInfoResult);
-		String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv());
+		String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
 		baseResult.setData(encrypt);
-		baseResult.setSig(buildSign(baseResult));
+		baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
 		return baseResult;
 	}
 	
@@ -272,7 +258,7 @@
 	 * @param sites
 	 * @return
 	 */
-	public List<StationInfo> buildSite(List<Site> sites){
+	public List<StationInfo> buildSite(List<TParkingLot> parkingLots, List<Site> sites){
 		List<Integer> siteIds = sites.stream().map(Site::getId).collect(Collectors.toList());
 		List<TChargingPile> tChargingPiles = chargingPileClient.getChargingPileBySiteIds(siteIds).getData();
 		List<Integer> collect1 = tChargingPiles.stream().map(TChargingPile::getId).collect(Collectors.toList());
@@ -331,12 +317,42 @@
 			stationInfo.setMatchCars(datum.getVehicleDescription());
 			stationInfo.setBusineHours(datum.getStartServiceTime() + "-" + datum.getEndServiceTime());
 			stationInfo.setElectricityFee(datum.getRateDescription());
+			//添加停车费信息
+			Optional<TParkingLot> first = parkingLots.stream().filter(s -> s.getSiteId().equals(datum.getId())).findFirst();
+			if(first.isPresent()){
+				TParkingLot tParkingLot = first.get();
+				buildPlaceHolder(tParkingLot, stationInfo);
+			}
+			
 			//构建充电设备信息数据
 			stationInfo.setEquipmentInfos(buildEquipmentInfo(datum.getId(), tChargingPiles, chargingGunList));
 			StationInfos.add(stationInfo);
+			
 		}
 		return StationInfos;
 	}
+	
+	
+	/**
+	 * 构建停车费信息
+	 * @param tParkingLot
+	 * @param stationInfo
+	 */
+	public void buildPlaceHolder(TParkingLot tParkingLot, StationInfo stationInfo){
+		stationInfo.setOvertimeFee(tParkingLot.getName() + "停车费");
+		PlaceHolder placeHolder = new PlaceHolder();
+		placeHolder.setFreeTime(tParkingLot.getChargeFreeDuration());
+		placeHolder.setMaxFee(tParkingLot.getChargeCapping());
+		List<PlaceHolderPrice> PlaceHolderPrices = new ArrayList<>();
+		PlaceHolderPrice placeHolderPrice = new PlaceHolderPrice();
+		placeHolderPrice.setStartTime("00:00");
+		placeHolderPrice.setEndTime("23:59");
+		placeHolderPrice.setPrice(tParkingLot.getChargeRate());
+		PlaceHolderPrices.add(placeHolderPrice);
+		placeHolder.setPlaceHolderPrices(PlaceHolderPrices);
+		stationInfo.setPlaceHolder(placeHolder);
+	}
+	
 	
 	
 	
@@ -376,7 +392,7 @@
 			}
 			
 			//构建设备接口信息
-			equipmentInfo.setConnectorInfos(buildConnectorInfos(tChargingPile.getId(), chargingGunList));
+			equipmentInfo.setConnectorInfos(buildConnectorInfos(tChargingPile.getId(), tChargingPile.getCode(), chargingGunList));
 			equipmentInfos.add(equipmentInfo);
 		}
 		return equipmentInfos;
@@ -388,7 +404,7 @@
 	 * @param chargingGunList
 	 * @return
 	 */
-	public List<ConnectorInfo> buildConnectorInfos(Integer chargingPileId, List<TChargingGun> chargingGunList){
+	public List<ConnectorInfo> buildConnectorInfos(Integer chargingPileId, String code, List<TChargingGun> chargingGunList){
 		List<ConnectorInfo> connectorInfos = new ArrayList<>();
 		List<TChargingGun> collect = chargingGunList.stream().filter(s -> s.getChargingPileId().equals(chargingPileId)).collect(Collectors.toList());
 		for (TChargingGun chargingGun : collect) {
@@ -421,6 +437,7 @@
 			connectorInfo.setPower(chargingGun.getRatedPower());
 			connectorInfo.setParkNo(chargingGun.getParkingNumber());
 			connectorInfo.setNationalStandard(Integer.valueOf(chargingGun.getNationalStandard()));
+			connectorInfo.setQRCode("https://mxcd.zhinenganguan.com?No=" + code + chargingGun.getCode());
 			connectorInfos.add(connectorInfo);
 		}
 		return connectorInfos;
@@ -458,7 +475,10 @@
 				connectorStatusInfo.setStatus(255);
 				break;
 		}
-		NotificationStationStatusResult result = TCECUtil.notificationStationStatus(connectorStatusInfo);
+		List<Operator> operators = operatorClient.getAllOperator().getData();
+		for (Operator operator : operators) {
+			TCECUtil.notificationStationStatus(operator, connectorStatusInfo);
+		}
 		return R.ok();
 	}
 	
@@ -473,7 +493,7 @@
 		BaseResult baseResult = requestCheck(true, baseRequest, request);
 		if(0 != baseResult.getRet()){
 			baseResult.setData("");
-			baseResult.setSig(buildSign(baseResult));
+			baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
 			return baseResult;
 		}
 		Operator operator = baseResult.getOperator();
@@ -530,9 +550,9 @@
 		result.setStationStatusInfos(StationStatusInfos);
 		//参数加密
 		String jsonString = JSON.toJSONString(result);
-		String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv());
+		String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
 		baseResult.setData(encrypt);
-		baseResult.setSig(buildSign(baseResult));
+		baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
 		return baseResult;
 	}
 	
@@ -550,7 +570,7 @@
 		BaseResult baseResult = requestCheck(true, baseRequest, request);
 		if(0 != baseResult.getRet()){
 			baseResult.setData("");
-			baseResult.setSig(buildSign(baseResult));
+			baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
 			return baseResult;
 		}
 		Operator operator = baseResult.getOperator();
@@ -600,9 +620,9 @@
 		result.setStationStats(stationStats);
 		//参数加密
 		String jsonString = JSON.toJSONString(result);
-		String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv());
+		String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
 		baseResult.setData(encrypt);
-		baseResult.setSig(buildSign(baseResult));
+		baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
 		return baseResult;
 	}
 	
@@ -617,7 +637,7 @@
 		BaseResult baseResult = requestCheck(true, baseRequest, request);
 		if(0 != baseResult.getRet()){
 			baseResult.setData("");
-			baseResult.setSig(buildSign(baseResult));
+			baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
 			return baseResult;
 		}
 		Operator operator = baseResult.getOperator();
@@ -667,9 +687,9 @@
 		}
 		//参数加密
 		String jsonString = JSON.toJSONString(queryEquipAuthResult);
-		String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv());
+		String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
 		baseResult.setData(encrypt);
-		baseResult.setSig(buildSign(baseResult));
+		baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
 		return baseResult;
 	}
 	
@@ -685,7 +705,7 @@
 		BaseResult baseResult = requestCheck(true, baseRequest, request);
 		if(0 != baseResult.getRet()){
 			baseResult.setData("");
-			baseResult.setSig(buildSign(baseResult));
+			baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
 			return baseResult;
 		}
 		Operator operator = baseResult.getOperator();
@@ -706,9 +726,9 @@
 			baseResult.setMsg("connectorID 参数无效");
 			//参数加密
 			String jsonString = JSON.toJSONString(queryEquipBusinessPolicyResult);
-			String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv());
+			String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
 			baseResult.setData(encrypt);
-			baseResult.setSig(buildSign(baseResult));
+			baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
 			return baseResult;
 		}
 		Integer accountingStrategyId = tChargingGun.getAccountingStrategyId();
@@ -723,9 +743,9 @@
 			queryEquipBusinessPolicyResult.setSumPeriod(0);
 			//参数加密
 			String jsonString = JSON.toJSONString(queryEquipBusinessPolicyResult);
-			String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv());
+			String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
 			baseResult.setData(encrypt);
-			baseResult.setSig(buildSign(baseResult));
+			baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
 			return baseResult;
 		}
 		List<PolicyInfo> PolicyInfos = new ArrayList<>();
@@ -740,15 +760,58 @@
 		queryEquipBusinessPolicyResult.setPolicyInfos(PolicyInfos);
 		//参数加密
 		String jsonString = JSON.toJSONString(queryEquipBusinessPolicyResult);
-		String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv());
+		String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
 		baseResult.setData(encrypt);
-		baseResult.setSig(buildSign(baseResult));
+		baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
 		return baseResult;
 	}
 	
 	
 	/**
-	 * 请求定充电
+	 * 站点变更推送通知(快电)
+	 * @param siteIds
+	 * @return
+	 */
+	@PostMapping("/notificationStationChange")
+	public R notificationStationChange(@RequestParam("siteIds") List<Integer> siteIds){
+		Operator operator = operatorClient.getOperatorByName("KuaiDian").getData();
+		NotificationStationChangeResult notificationStationChange = TCECKDUtil.notificationStationChange(operator, 3, siteIds);
+		//启动重试推送机制
+		if(null == notificationStationChange || 1 == notificationStationChange.getSuccStat()){
+			ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
+			threadPoolExecutor.execute(new Runnable() {
+				//计数器
+				Integer size = 0;
+				@Override
+				public void run() {
+					NotificationStationChangeResult notificationStationChange1 = TCECKDUtil.notificationStationChange(operator, 3, siteIds);
+					//启动重试推送机制
+					if(null != notificationStationChange1 && 0 == notificationStationChange1.getSuccStat()){
+						threadPoolExecutor.shutdown();
+						return;
+					}
+					size++;
+					if(size >= 5){
+						threadPoolExecutor.shutdown();
+						return;
+					}
+					//间隔一分钟重试一次
+					try {
+						Thread.sleep(60000);
+					} catch (InterruptedException e) {
+						throw new RuntimeException(e);
+					}
+				}
+			});
+		}
+		return R.ok();
+	}
+	
+	
+	
+	
+	/**
+	 * 请求开始充电
 	 * @return
 	 */
 	@PostMapping("/query_start_charge")
@@ -757,7 +820,7 @@
 		BaseResult baseResult = requestCheck(true, baseRequest, request);
 		if(0 != baseResult.getRet()){
 			baseResult.setData("");
-			baseResult.setSig(buildSign(baseResult));
+			baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
 			return baseResult;
 		}
 		Operator operator = baseResult.getOperator();
@@ -780,9 +843,9 @@
 			result.setStartChargeSeqStat(5);
 			//参数加密
 			String jsonString = JSON.toJSONString(result);
-			String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv());
+			String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
 			baseResult.setData(encrypt);
-			baseResult.setSig(buildSign(baseResult));
+			baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
 			return baseResult;
 		}
 		//设备离线
@@ -792,18 +855,19 @@
 			result.setStartChargeSeqStat(5);
 			//参数加密
 			String jsonString = JSON.toJSONString(result);
-			String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv());
+			String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
 			baseResult.setData(encrypt);
-			baseResult.setSig(buildSign(baseResult));
+			baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
 			return baseResult;
 		}
 		//调用充电接口
 		AddTripartitePlatformOrder addTripartitePlatformOrder = new AddTripartitePlatformOrder();
 		addTripartitePlatformOrder.setStartChargeSeq(queryStartCharge.getStartChargeSeq());
 		addTripartitePlatformOrder.setChargingGunId(tChargingGun.getId());
-//		addTripartitePlatformOrder.setOperatorId(query.get);
-		addTripartitePlatformOrder.setPaymentAmount(queryStartCharge.getPaymentAmount());
-		addTripartitePlatformOrder.setRechargePaymentType(queryStartCharge.getPaymentType());
+		addTripartitePlatformOrder.setOperatorId(operator.getOperatorId());
+		addTripartitePlatformOrder.setPaymentAmount(queryStartCharge.getChargingAmt());
+		addTripartitePlatformOrder.setRechargePaymentType(0);
+		addTripartitePlatformOrder.setPlateNum(queryStartCharge.getPlateNum());
 		R order = chargingOrderClient.addTripartitePlatformOrder(addTripartitePlatformOrder);
 		//启动失败
 		if(200 != order.getCode()){
@@ -812,9 +876,9 @@
 			result.setStartChargeSeqStat(2);
 			//参数加密
 			String jsonString = JSON.toJSONString(result);
-			String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv());
+			String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
 			baseResult.setData(encrypt);
-			baseResult.setSig(buildSign(baseResult));
+			baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
 			return baseResult;
 		}
 		result.setStartChargeSeqStat(1);
@@ -822,9 +886,9 @@
 		result.setFailReason(0);
 		//参数加密
 		String jsonString = JSON.toJSONString(result);
-		String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv());
+		String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
 		baseResult.setData(encrypt);
-		baseResult.setSig(buildSign(baseResult));
+		baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
 		return baseResult;
 	}
 	
@@ -838,10 +902,36 @@
 	public R notificationStartChargeResult(@RequestBody StartChargeResult result){
 		NotificationStartCharge notificationStartCharge = new NotificationStartCharge();
 		BeanUtils.copyProperties(result, notificationStartCharge);
-		com.ruoyi.integration.drainage.model.NotificationStartChargeResult notificationStartChargeResult = TCECUtil.notificationStartChargeResult(notificationStartCharge);
+		Operator operator = operatorClient.getOperator(result.getOperatorID()).getData();
+		com.ruoyi.integration.drainage.model.NotificationStartChargeResult notificationStartChargeResult = TCECUtil.notificationStartChargeResult(operator, notificationStartCharge);
 		//启动重试推送机制
 		if(null == notificationStartChargeResult || 1 == notificationStartChargeResult.getSuccStat()){
-		
+			
+			ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
+			threadPoolExecutor.execute(new Runnable() {
+				//计数器
+				Integer size = 0;
+				@Override
+				public void run() {
+					NotificationStartChargeResult notificationStartChargeResult1 = TCECUtil.notificationStartChargeResult(operator, notificationStartCharge);
+					//启动重试推送机制
+					if(null != notificationStartChargeResult1 && 0 == notificationStartChargeResult1.getSuccStat()){
+						threadPoolExecutor.shutdown();
+						return;
+					}
+					size++;
+					if(size >= 5){
+						threadPoolExecutor.shutdown();
+						return;
+					}
+					//间隔一分钟重试一次
+					try {
+						Thread.sleep(60000);
+					} catch (InterruptedException e) {
+						throw new RuntimeException(e);
+					}
+				}
+			});
 		}
 		return R.ok();
 	}
@@ -858,7 +948,7 @@
 		BaseResult baseResult = requestCheck(true, baseRequest, request);
 		if(0 != baseResult.getRet()){
 			baseResult.setData("");
-			baseResult.setSig(buildSign(baseResult));
+			baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
 			return baseResult;
 		}
 		Operator operator = baseResult.getOperator();
@@ -869,9 +959,9 @@
 		QueryEquipChargeStatusResult queryEquipChargeStatusResult = buildQueryEquipChargeStatusResult(queryEquipChargeStatus.getStartChargeSeq());
 		//参数加密
 		String jsonString = JSON.toJSONString(queryEquipChargeStatusResult);
-		String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv());
+		String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
 		baseResult.setData(encrypt);
-		baseResult.setSig(buildSign(baseResult));
+		baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
 		return baseResult;
 	}
 	
@@ -987,12 +1077,37 @@
 	 * @return
 	 */
 	@PostMapping("/notificationEquipChargeStatus")
-	public R notificationEquipChargeStatus(@RequestParam("startChargeSeq") String startChargeSeq){
+	public R notificationEquipChargeStatus(@RequestParam("startChargeSeq") String startChargeSeq, @RequestParam("operatorId") Integer operatorId){
 		QueryEquipChargeStatusResult queryEquipChargeStatusResult = buildQueryEquipChargeStatusResult(startChargeSeq);
-		NotificationEquipChargeStatusResult notificationEquipChargeStatusResult = TCECUtil.notificationEquipChargeStatus(queryEquipChargeStatusResult);
+		Operator operator = operatorClient.getOperatorById(operatorId).getData();
+		NotificationEquipChargeStatusResult notificationEquipChargeStatusResult = TCECUtil.notificationEquipChargeStatus(operator, queryEquipChargeStatusResult);
 		//启动重试推送机制
 		if(null == notificationEquipChargeStatusResult || 1 == notificationEquipChargeStatusResult.getSuccStat()){
-		
+			ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
+			threadPoolExecutor.execute(new Runnable() {
+				//计数器
+				Integer size = 0;
+				@Override
+				public void run() {
+					NotificationEquipChargeStatusResult notificationEquipChargeStatusResult1 = TCECUtil.notificationEquipChargeStatus(operator, queryEquipChargeStatusResult);
+					//启动重试推送机制
+					if(null != notificationEquipChargeStatusResult1 && 0 == notificationEquipChargeStatusResult1.getSuccStat()){
+						threadPoolExecutor.shutdown();
+						return;
+					}
+					size++;
+					if(size >= 5){
+						threadPoolExecutor.shutdown();
+						return;
+					}
+					//间隔一分钟重试一次
+					try {
+						Thread.sleep(60000);
+					} catch (InterruptedException e) {
+						throw new RuntimeException(e);
+					}
+				}
+			});
 		}
 		return R.ok();
 	}
@@ -1008,7 +1123,7 @@
 		BaseResult baseResult = requestCheck(true, baseRequest, request);
 		if(0 != baseResult.getRet()){
 			baseResult.setData("");
-			baseResult.setSig(buildSign(baseResult));
+			baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
 			return baseResult;
 		}
 		Operator operator = baseResult.getOperator();
@@ -1028,16 +1143,16 @@
 			queryStopChargeResult.setFailReason(3);
 			//参数加密
 			String jsonString = JSON.toJSONString(queryStopChargeResult);
-			String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv());
+			String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
 			baseResult.setData(encrypt);
-			baseResult.setSig(buildSign(baseResult));
+			baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
 			return baseResult;
 		}
 		//参数加密
 		String jsonString = JSON.toJSONString(queryStopChargeResult);
-		String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv());
+		String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
 		baseResult.setData(encrypt);
-		baseResult.setSig(buildSign(baseResult));
+		baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
 		return baseResult;
 	}
 	
@@ -1050,17 +1165,43 @@
 	 * @return
 	 */
 	@PostMapping("/notificationStopChargeResult")
-	public R notificationStopChargeResult(@RequestParam("startChargeSeq") String startChargeSeq, @RequestParam("connectorID") String connectorID){
+	public R notificationStopChargeResult(@RequestParam("startChargeSeq") String startChargeSeq, @RequestParam("connectorID") String connectorID,
+	                                      @RequestParam("operatorId") Integer operatorId){
+		Operator operator = operatorClient.getOperatorById(operatorId).getData();
 		NotificationStopChargeResult info = new NotificationStopChargeResult();
 		info.setStartChargeSeq(startChargeSeq);
 		info.setStartChargeSeqStat(4);
 		info.setConnectorID(connectorID);
 		info.setSuccStat(0);
 		info.setFailReason(0);
-		NotificationStopCharge notificationStopCharge = TCECUtil.notificationStopChargeResult(info);
+		NotificationStopCharge notificationStopCharge = TCECUtil.notificationStopChargeResult(operator, info);
 		//启动重试推送机制
 		if(null == notificationStopCharge || 1 == notificationStopCharge.getSuccStat()){
-		
+			ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
+			threadPoolExecutor.execute(new Runnable() {
+				//计数器
+				Integer size = 0;
+				@Override
+				public void run() {
+					NotificationStopCharge notificationStopCharge1 = TCECUtil.notificationStopChargeResult(operator, info);
+					//启动重试推送机制
+					if(null != notificationStopCharge1 && 0 == notificationStopCharge1.getSuccStat()){
+						threadPoolExecutor.shutdown();
+						return;
+					}
+					size++;
+					if(size >= 5){
+						threadPoolExecutor.shutdown();
+						return;
+					}
+					//间隔一分钟重试一次
+					try {
+						Thread.sleep(60000);
+					} catch (InterruptedException e) {
+						throw new RuntimeException(e);
+					}
+				}
+			});
 		}
 		return R.ok();
 	}
@@ -1072,12 +1213,37 @@
 	 * @return
 	 */
 	@PostMapping("/notificationChargeOrderInfo")
-	public R notificationChargeOrderInfo(@RequestParam("startChargeSeq") String startChargeSeq){
+	public R notificationChargeOrderInfo(@RequestParam("startChargeSeq") String startChargeSeq, @RequestParam("operatorId") Integer operatorId){
 		NotificationChargeOrderInfo info = buildNotificationChargeOrderInfo(startChargeSeq);
-		NotificationChargeOrderInfoResult notificationChargeOrderInfoResult = TCECUtil.notificationChargeOrderInfo(info);
+		Operator operator = operatorClient.getOperatorById(operatorId).getData();
+		NotificationChargeOrderInfoResult notificationChargeOrderInfoResult = TCECUtil.notificationChargeOrderInfo(operator, info);
 		//启动重试推送机制
 		if(null == notificationChargeOrderInfoResult || 1 == notificationChargeOrderInfoResult.getConfirmResult()){
-		
+			ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
+			threadPoolExecutor.execute(new Runnable() {
+				//计数器
+				Integer size = 0;
+				@Override
+				public void run() {
+					NotificationChargeOrderInfoResult notificationChargeOrderInfoResult1 = TCECUtil.notificationChargeOrderInfo(operator, info);
+					//启动重试推送机制
+					if(null != notificationChargeOrderInfoResult1 && 0 == notificationChargeOrderInfoResult1.getConfirmResult()){
+						threadPoolExecutor.shutdown();
+						return;
+					}
+					size++;
+					if(size >= 5){
+						threadPoolExecutor.shutdown();
+						return;
+					}
+					//间隔一分钟重试一次
+					try {
+						Thread.sleep(60000);
+					} catch (InterruptedException e) {
+						throw new RuntimeException(e);
+					}
+				}
+			});
 		}
 		return R.ok();
 	}
@@ -1103,6 +1269,12 @@
 		notificationChargeOrderInfo.setTotalElecMoney(chargingOrder.getTotalElectricity());
 		notificationChargeOrderInfo.setTotalSeviceMoney(chargingOrder.getServiceCharge());
 		notificationChargeOrderInfo.setTotalMoney(chargingOrder.getTotalElectricity().add(chargingOrder.getServiceCharge()));
+		notificationChargeOrderInfo.setTotalDelayMoney(BigDecimal.ZERO);
+		TParkingRecord parkingRecord = parkingRecordClient.getParkingRecordByChargingOrderId(chargingOrder.getId()).getData();
+		if(null != parkingRecord && parkingRecord.getStatus() == 3){
+			notificationChargeOrderInfo.setTotalDelayMoney(parkingRecord.getPayment());
+		}
+		
 		//结束方式(0=异常终止,1=主动终止,2=满电终止,3=费用不足终止)
 		switch (chargingOrder.getEndMode()){
 			case 0:
@@ -1152,4 +1324,186 @@
 		notificationChargeOrderInfo.setChargeDetails(chargeDetails);
 		return notificationChargeOrderInfo;
 	}
+	
+	
+	/**
+	 * 二维码查询抢号(快电)
+	 * @param baseRequest
+	 * @param request
+	 * @return
+	 */
+	@PostMapping("/query_terminal_code")
+	public BaseResult queryTerminalCode(@RequestBody BaseRequest baseRequest, HttpServletRequest request){
+		//校验token和签名
+		BaseResult baseResult = requestCheck(true, baseRequest, request);
+		if(0 != baseResult.getRet()){
+			baseResult.setData("");
+			baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
+			return baseResult;
+		}
+		Operator operator = baseResult.getOperator();
+		//解密参数
+		String decrypt = AESUtil.decrypt(baseRequest.getData(), operator.getDataSecret(), operator.getDataSecretIv());
+		QueryTerminalCode queryTerminalCode = JSON.parseObject(decrypt, QueryTerminalCode.class);
+		String qrCode = queryTerminalCode.getQRCode();
+		String substring = qrCode.substring(qrCode.indexOf("=") + 1);
+		QueryTerminalCodeResult queryTerminalCodeResult = new QueryTerminalCodeResult();
+		queryTerminalCodeResult.setTerminalCode(substring);
+		
+		//参数加密
+		String jsonString = JSON.toJSONString(queryTerminalCodeResult);
+		String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
+		baseResult.setData(encrypt);
+		baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
+		return baseResult;
+	}
+	
+	
+	/**
+	 * 推送充电车牌号
+	 * 客户归属运营商向设备运营商推送充电用户车牌号减免停车费,多次推送以最后一次车牌号为准
+	 * @param baseRequest
+	 * @param request
+	 * @return
+	 */
+	@PostMapping("/notification_charge_carnum")
+	public BaseResult notificationChargeCarnum(@RequestBody BaseRequest baseRequest, HttpServletRequest request){
+		//校验token和签名
+		BaseResult baseResult = requestCheck(true, baseRequest, request);
+		if(0 != baseResult.getRet()){
+			baseResult.setData("");
+			baseResult.setSig(TCECUtil.buildSign(baseResult));
+			return baseResult;
+		}
+		Operator operator = baseResult.getOperator();
+		//解密参数
+		String decrypt = AESUtil.decrypt(baseRequest.getData(), operator.getDataSecret(), operator.getDataSecretIv());
+		NotificationChargeCarnum notificationChargeCarnum = JSON.parseObject(decrypt, NotificationChargeCarnum.class);
+		
+		NotificationChargeCarnumResult notificationChargeCarnumResult = new NotificationChargeCarnumResult();
+		notificationChargeCarnumResult.setStartChargeSeqs(notificationChargeCarnum.getStartChargeSeqs());
+		notificationChargeCarnumResult.setSuccStat(0);
+		notificationChargeCarnumResult.setFailReason(0);
+		TChargingOrder chargingOrder = chargingOrderClient.getChargingOrderByStartChargeSeq(notificationChargeCarnum.getStartChargeSeqs()).getData();
+		if(null == chargingOrder){
+			notificationChargeCarnumResult.setSuccStat(1);
+			notificationChargeCarnumResult.setFailReason(1);
+		}else{
+			//待处理相关业务逻辑
+		}
+		//参数加密
+		String jsonString = JSON.toJSONString(notificationChargeCarnumResult);
+		String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv());
+		baseResult.setData(encrypt);
+		baseResult.setSig(TCECUtil.buildSign(baseResult));
+		return baseResult;
+	}
+	
+	
+	/**
+	 * 账单拉取(快电)
+	 * @param baseRequest
+	 * @param request
+	 * @return
+	 */
+	@PostMapping("/query_charge_order_info")
+	public BaseResult queryChargeOrderInfo(@RequestBody BaseRequest baseRequest, HttpServletRequest request){
+		//校验token和签名
+		BaseResult baseResult = requestCheck(true, baseRequest, request);
+		if(0 != baseResult.getRet()){
+			baseResult.setData("");
+			baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
+			return baseResult;
+		}
+		Operator operator = baseResult.getOperator();
+		//解密参数
+		String decrypt = AESUtil.decrypt(baseRequest.getData(), operator.getDataSecret(), operator.getDataSecretIv());
+		QueryChargeOrderInfo queryChargeOrderInfo = JSON.parseObject(decrypt, QueryChargeOrderInfo.class);
+		//构建返回结果
+		QueryChargeOrderInfoResult result = buildQueryChargeOrderInfoResult(queryChargeOrderInfo);
+		//参数加密
+		String jsonString = JSON.toJSONString(result);
+		String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
+		baseResult.setData(encrypt);
+		baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
+		return baseResult;
+	}
+	
+	
+	
+	/**
+	 * 构建充电账单拉取实体
+	 * @param queryChargeOrderInfo
+	 * @return
+	 */
+	public QueryChargeOrderInfoResult buildQueryChargeOrderInfoResult(QueryChargeOrderInfo queryChargeOrderInfo){
+		//构建返回结果
+		QueryChargeOrderInfoResult queryChargeOrderInfoResult = new QueryChargeOrderInfoResult();
+		List<OrderInfo> orderInfos = new ArrayList<>();
+		List<String> startChargeSeqs = queryChargeOrderInfo.getStartChargeSeqs();
+		List<TChargingOrder> chargingOrders = chargingOrderClient.getChargingOrderByStartChargeSeqs(startChargeSeqs).getData();
+		for (TChargingOrder chargingOrder : chargingOrders) {
+			if(null == chargingOrder){
+				return null;
+			}
+			OrderInfo orderInfo = new OrderInfo();
+			orderInfo.setStartChargeSeq(chargingOrder.getStartChargeSeq());
+			orderInfo.setConnectorID(chargingOrder.getChargingGunId().toString());
+			orderInfo.setStartTime((null == chargingOrder.getStartTime() ? chargingOrder.getCreateTime() : chargingOrder.getStartTime()).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+			orderInfo.setEndTime((null == chargingOrder.getStartTime() ? LocalDateTime.now() : chargingOrder.getEndTime()).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+			orderInfo.setTotalPower(chargingOrder.getTotalElectricity());
+			orderInfo.setTotalElecMoney(chargingOrder.getElectrovalence());
+			orderInfo.setTotalSeviceMoney(chargingOrder.getServiceCharge());
+			orderInfo.setTotalMoney(chargingOrder.getTotalElectricity().add(chargingOrder.getServiceCharge()));
+			//结束方式(0=异常终止,1=主动终止,2=满电终止,3=费用不足终止)
+			switch (chargingOrder.getEndMode()){
+				case 0:
+					orderInfo.setStopReason(3);
+					break;
+				case 1:
+					orderInfo.setStopReason(0);
+					break;
+				case 2:
+					orderInfo.setStopReason(2);
+					break;
+				case 3:
+					orderInfo.setStopReason(4);
+					break;
+			}
+			//构建充电明细
+			List<ChargeDetail> chargeDetails = new ArrayList<>();
+			List<TChargingOrderAccountingStrategy> data = chargingOrderAccountingStrategyClient.getChargingOrderAccountingStrategyByOrderId(chargingOrder.getId()).getData();
+			
+			LocalDateTime startTime = chargingOrder.getStartTime();
+			LocalDateTime endTime = chargingOrder.getEndTime();
+			String s_format = startTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+			String e_format = endTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+			for (TChargingOrderAccountingStrategy datum : data) {
+				ChargeDetail chargeDetail = new ChargeDetail();
+				if(s_format.equals(e_format)){
+					chargeDetail.setDetailStartTime(s_format + " " + datum.getStartTime() + ":00");
+					chargeDetail.setDetailEndTime(s_format + " " + datum.getEndTime() + ":59");
+				}else{
+					String substring = datum.getEndTime().substring(0, datum.getEndTime().indexOf(":"));
+					if(Integer.valueOf(substring) > 12){
+						chargeDetail.setDetailStartTime(s_format + " " + datum.getStartTime() + ":00");
+						chargeDetail.setDetailEndTime(s_format + " " + datum.getEndTime() + ":59");
+					}else{
+						chargeDetail.setDetailStartTime(e_format + " " + datum.getStartTime() + ":00");
+						chargeDetail.setDetailEndTime(e_format + " " + datum.getEndTime() + ":59");
+					}
+				}
+				chargeDetail.setElecPrice(datum.getElectrovalence());
+				chargeDetail.setSevicePrice(datum.getServiceCharge());
+				chargeDetail.setDetailPower(datum.getChargingCapacity());
+				chargeDetail.setDetailElecMoney(datum.getPeriodElectricPrice());
+				chargeDetail.setDetailSeviceMoney(datum.getPeriodServicePrice());
+				chargeDetails.add(chargeDetail);
+			}
+			orderInfo.setChargeDetails(chargeDetails);
+			orderInfos.add(orderInfo);
+		}
+		queryChargeOrderInfoResult.setOrderInfos(orderInfos);
+		return queryChargeOrderInfoResult;
+	}
 }

--
Gitblit v1.7.1