From 6958d89bfec79450782f8352d5716d6603549b98 Mon Sep 17 00:00:00 2001
From: Pu Zhibing <393733352@qq.com>
Date: 星期日, 26 一月 2025 17:25:56 +0800
Subject: [PATCH] 新增加互联互通扩展接口

---
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECController.java |  298 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 283 insertions(+), 15 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 71d189a..6294bf2 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,18 +1,15 @@
 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.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;
@@ -73,6 +70,13 @@
 	private TokenUtil tokenUtil;
 	
 	private static Map<Long, Integer> map = new HashMap<>();
+	
+	@Resource
+	private ParkingLotClient parkingLotClient;
+	
+	@Resource
+	private ParkingRecordClient parkingRecordClient;
+	
 	
 	
 	/**
@@ -234,11 +238,12 @@
 			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());
@@ -253,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());
@@ -312,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);
+	}
+	
 	
 	
 	
@@ -357,7 +392,7 @@
 			}
 			
 			//构建设备接口信息
-			equipmentInfo.setConnectorInfos(buildConnectorInfos(tChargingPile.getId(), chargingGunList));
+			equipmentInfo.setConnectorInfos(buildConnectorInfos(tChargingPile.getId(), tChargingPile.getCode(), chargingGunList));
 			equipmentInfos.add(equipmentInfo);
 		}
 		return equipmentInfos;
@@ -369,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) {
@@ -402,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;
@@ -732,7 +768,50 @@
 	
 	
 	/**
-	 * 请求定充电
+	 * 站点变更推送通知(快电)
+	 * @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")
@@ -786,8 +865,9 @@
 		addTripartitePlatformOrder.setStartChargeSeq(queryStartCharge.getStartChargeSeq());
 		addTripartitePlatformOrder.setChargingGunId(tChargingGun.getId());
 		addTripartitePlatformOrder.setOperatorId(operator.getOperatorId());
-		addTripartitePlatformOrder.setPaymentAmount(queryStartCharge.getPaymentAmount());
-		addTripartitePlatformOrder.setRechargePaymentType(queryStartCharge.getPaymentType());
+		addTripartitePlatformOrder.setPaymentAmount(queryStartCharge.getChargingAmt());
+		addTripartitePlatformOrder.setRechargePaymentType(0);
+		addTripartitePlatformOrder.setPlateNum(queryStartCharge.getPlateNum());
 		R order = chargingOrderClient.addTripartitePlatformOrder(addTripartitePlatformOrder);
 		//启动失败
 		if(200 != order.getCode()){
@@ -1189,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:
@@ -1238,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.buildSign(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.getDataSecret(), operator.getDataSecretIv());
+		baseResult.setData(encrypt);
+		baseResult.setSig(TCECUtil.buildSign(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.buildSign(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.getDataSecret(), operator.getDataSecretIv());
+		baseResult.setData(encrypt);
+		baseResult.setSig(TCECUtil.buildSign(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