From ccd1837ee6016e0b72557f98ea45fc2e4f152ae1 Mon Sep 17 00:00:00 2001
From: xuhy <3313886187@qq.com>
Date: 星期三, 26 三月 2025 11:10:32 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ChargingOrderFallbackFactory.java      |   10 
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/StationStatsInfo.java   |   50 +
 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderClient.java           |   12 
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECController1.java          | 2264 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/dto/ChargingStatisticeDTO.java                 |   21 
 ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/EquipmentStatsInfo.java |   29 
 ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingStatisticeVO.java                   |   21 
 ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java           |   19 
 8 files changed, 2,418 insertions(+), 8 deletions(-)

diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/dto/ChargingStatisticeDTO.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/dto/ChargingStatisticeDTO.java
new file mode 100644
index 0000000..157fa00
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/dto/ChargingStatisticeDTO.java
@@ -0,0 +1,21 @@
+package com.ruoyi.order.api.dto;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.ruoyi.order.api.model.TChargingOrder;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Data
+@ApiModel(value = "监管平台充电用能DTO",description = "监管平台充电用能DTO")
+public class ChargingStatisticeDTO {
+    @ApiModelProperty(value = "开始时间2020-01-01 00:00:00")
+    private LocalDateTime startTime;
+    @ApiModelProperty(value = "结束时间2020-01-01 23:59:59")
+    private LocalDateTime endTime;
+}
diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ChargingOrderFallbackFactory.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ChargingOrderFallbackFactory.java
index b1f6b08..6d50bbe 100644
--- a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ChargingOrderFallbackFactory.java
+++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ChargingOrderFallbackFactory.java
@@ -3,6 +3,7 @@
 import com.ruoyi.common.core.domain.R;
 import com.ruoyi.common.core.dto.ChargingOrderGroup;
 import com.ruoyi.common.core.dto.ChargingPercentProvinceDto;
+import com.ruoyi.order.api.dto.ChargingStatisticeDTO;
 import com.ruoyi.order.api.feignClient.ChargingOrderClient;
 import com.ruoyi.order.api.model.AddTripartitePlatformOrder;
 import com.ruoyi.order.api.model.ChargingListQuery;
@@ -174,8 +175,13 @@
             public R<List<TChargingOrder>> getChargingOrder(TChargingOrderVo order) {
                 return R.fail("获取充电订单数据失败:" + throwable.getMessage());
             }
-    
-    
+
+            @Override
+            public R<List<TChargingOrder>> getChargingStatistics(ChargingStatisticeDTO dto) {
+                return R.fail("获取充电订单数据失败-监管:" + throwable.getMessage());
+            }
+
+
             @Override
             public R<List<TChargingOrder>> getCarChargingOrder(Long carId, String startTime, String endTime) {
                 return R.fail("根据车辆id获取指定时间范围内的数据失败:" + throwable.getMessage());
diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderClient.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderClient.java
index 2a22b03..fc03e1f 100644
--- a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderClient.java
+++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderClient.java
@@ -5,6 +5,7 @@
 import com.ruoyi.common.core.dto.ChargingOrderGroup;
 import com.ruoyi.common.core.dto.ChargingPercentProvinceDto;
 import com.ruoyi.common.core.web.domain.AjaxResult;
+import com.ruoyi.order.api.dto.ChargingStatisticeDTO;
 import com.ruoyi.order.api.factory.ChargingOrderFallbackFactory;
 import com.ruoyi.order.api.model.AddTripartitePlatformOrder;
 import com.ruoyi.order.api.model.ChargingListQuery;
@@ -235,8 +236,15 @@
      */
     @PostMapping("/t-charging-order/getChargingOrder")
     R<List<TChargingOrder>> getChargingOrder(@RequestBody TChargingOrderVo order);
-    
-    
+    /**
+     * 获取充电订单数据
+     * @param
+     * @return
+     */
+    @PostMapping(value = "/t-charging-order/getChargingStatistics")
+    public R<List<TChargingOrder>> getChargingStatistics(@RequestBody ChargingStatisticeDTO dto);
+
+
     /**
      * 根据车辆id获取指定时间范围内的数据
      * @param carId
diff --git a/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingStatisticeVO.java b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingStatisticeVO.java
new file mode 100644
index 0000000..6760d25
--- /dev/null
+++ b/ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/ChargingStatisticeVO.java
@@ -0,0 +1,21 @@
+package com.ruoyi.order.api.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Data
+@ApiModel(value = "监管平台充电用能DTO",description = "监管平台充电用能DTO")
+public class ChargingStatisticeVO {
+    @ApiModelProperty(value = "站点id")
+    private Integer siteId;
+    @ApiModelProperty(value = "累计充电量")
+    private BigDecimal startTime;
+    @ApiModelProperty(value = "累计充电时间")
+    private Integer chargingTime;
+
+
+}
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECController1.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECController1.java
new file mode 100644
index 0000000..43c6faa
--- /dev/null
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECController1.java
@@ -0,0 +1,2264 @@
+package com.ruoyi.integration.drainage;
+
+import cn.hutool.http.HttpRequest;
+import cn.hutool.http.HttpResponse;
+import cn.hutool.http.HttpUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.nacos.common.utils.JacksonUtils;
+import com.ruoyi.chargingPile.api.feignClient.*;
+import com.ruoyi.chargingPile.api.model.*;
+import com.ruoyi.common.core.domain.R;
+import com.ruoyi.common.core.dto.ChargingPercentProvinceDto;
+import com.ruoyi.common.core.utils.DateUtils;
+import com.ruoyi.common.core.utils.HttpUtils;
+import com.ruoyi.common.core.utils.StringUtils;
+import com.ruoyi.common.core.web.page.PageInfo;
+import com.ruoyi.integration.api.model.UploadRealTimeMonitoringData;
+import com.ruoyi.integration.api.vo.StartChargeResult;
+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.integration.mongodb.service.UploadRealTimeMonitoringDataService;
+import com.ruoyi.order.api.dto.ChargingStatisticeDTO;
+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.TChargingOrder;
+import com.ruoyi.order.api.model.TChargingOrderAccountingStrategy;
+import com.ruoyi.other.api.domain.Operator;
+import com.ruoyi.other.api.feignClient.OperatorClient;
+import com.ruoyi.other.api.feignClient.SystemConfigurationClient;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
+import org.springframework.web.bind.annotation.*;
+
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.ChronoUnit;
+import java.util.*;
+import java.util.concurrent.*;
+import java.util.stream.Collectors;
+
+/**
+ * @author zhibing.pu
+ * @Date 2025/1/21 17:52
+ */
+@Slf4j
+@RestController
+@RequestMapping("/evcs/v1.0")
+public class TCECController1 {
+	
+	@Resource
+	private SiteClient siteClient;
+	
+	@Resource
+	private ChargingPileClient chargingPileClient;
+	
+	@Resource
+	private ChargingGunClient chargingGunClient;
+	
+	@Resource
+	private ChargingOrderClient chargingOrderClient;
+	
+	@Resource
+	private OperatorClient operatorClient;
+	
+	@Resource
+	private AccountingStrategyDetailClient accountingStrategyDetailClient;
+	
+	@Resource
+	private ChargingOrderAccountingStrategyClient chargingOrderAccountingStrategyClient;
+	
+	@Resource
+	private UploadRealTimeMonitoringDataService uploadRealTimeMonitoringDataService;
+	
+	@Resource
+	private TokenUtil tokenUtil;
+
+	@Resource
+	private ParkingLotClient parkingLotClient;
+	
+	@Resource
+	private ParkingRecordClient parkingRecordClient;
+	
+	@Resource
+	private SystemConfigurationClient systemConfigurationClient;
+	// 监管平台密钥 向量 地址
+	private static String ourDataSecret = "";
+	private static String ourDataSecretIv = "";
+	private static String url = "https://dev-gov-hlht-sc.unievbj.com/evcs/v1.0.0/";// 测试
+//	private static String url = "https://hlht-dipper-sc.unievbj.com/evcs/v1.0.0/";// 正式
+	private static String operatorSecret = "f1331ef0b37c2d1b";// 测试
+//	private static String operatorSecret = "a762796b2a8989b8";// 正式
+
+	
+	
+	/**
+	 * 请求校验
+	 * @param baseRequest
+	 * @param request
+	 * @return
+	 */
+	public BaseResult requestCheck(Boolean tokenCheck, BaseRequest baseRequest, HttpServletRequest request){
+		BaseResult baseResult = new BaseResult();
+		baseResult.setRet(0);
+		baseResult.setMsg("成功");
+		baseResult.setOperatorID(baseRequest.getOperatorID());
+		Long mapKey = Long.valueOf(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
+		baseResult.setTimeStamp(mapKey);
+		baseResult.setSeq("0001");
+		//校验token和签名
+		String operatorID = baseRequest.getOperatorID();
+		String sig = baseRequest.getSig();
+		Long timeStamp = baseRequest.getTimeStamp();
+		String data = baseRequest.getData();
+		String seq = baseRequest.getSeq();
+		if(StringUtils.isEmpty(operatorID) || StringUtils.isEmpty(sig) || StringUtils.isEmpty(data) || StringUtils.isEmpty(seq) || null == timeStamp){
+			baseResult.setRet(4003);
+			baseResult.setMsg("参数异常");
+			return baseResult;
+		}
+		
+		R<Operator> r = operatorClient.getOperator(operatorID);
+		if(200 != r.getCode()){
+			baseResult.setRet(500);
+			baseResult.setMsg("系统异常");
+			return baseResult;
+		}
+		//校验token
+		if(tokenCheck){
+			Operator loginUser = tokenUtil.getLoginUser(request);
+			if(null == loginUser){
+				baseResult.setRet(4002);
+				baseResult.setMsg("身份校验失败,无效的token");
+				return baseResult;
+			}
+		}
+		
+		Operator operator = r.getData();
+		baseResult.setOperator(operator);
+		baseRequest.setOperator(operator);
+		//校验签名
+		String sign = TCECUtil.ourBuildSign(baseRequest);
+		if(!sign.equals(sig)){
+			baseResult.setRet(4001);
+			baseResult.setMsg("签名校验失败");
+			return baseResult;
+		}
+		return baseResult;
+	}
+	
+	
+	
+	
+	
+	/**
+	 * 获取token
+	 * @return
+	 */
+	@PostMapping("/query_token")
+	public BaseResult queryToken(@RequestBody BaseRequest baseRequest, HttpServletRequest request){
+		log.info("三方平台获取token请求参数:" + JacksonUtils.toJson(baseRequest));
+		BaseResult baseResult = requestCheck(false, baseRequest, request);
+		if(0 != baseResult.getRet()){
+			log.info("三方平台获取token响应Data:");
+			baseResult.setData("");
+			baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
+			log.info("三方平台获取token响应参数:" + JacksonUtils.toJson(baseResult));
+			return baseResult;
+		}
+		QueryTokenResult queryTokenResult = new QueryTokenResult();
+		Operator operator = baseResult.getOperator();
+		if(null == operator){
+			queryTokenResult.setSuccStat(1);
+			queryTokenResult.setFailReason(1);
+			//参数加密
+			String jsonString = JacksonUtils.toJson(queryTokenResult);
+			log.info("三方平台获取token响应Data:" + jsonString);
+			String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
+			baseResult.setData(encrypt);
+			baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
+			log.info("三方平台获取token响应参数:" + JacksonUtils.toJson(baseResult));
+			return baseResult;
+		}
+		
+		//解密参数
+		String decrypt = AESUtil.decrypt(baseRequest.getData(), operator.getOurDataSecret(), operator.getOurDataSecretIv());
+		log.info("三方平台获取token请求Data:" + decrypt);
+		QueryToken queryToken = JSON.parseObject(decrypt, QueryToken.class);
+		if(!queryToken.getOperatorSecret().equals(operator.getOurOperatorSecret())){
+			queryTokenResult.setSuccStat(1);
+			queryTokenResult.setFailReason(2);
+			//参数加密
+			String jsonString = JacksonUtils.toJson(queryTokenResult);
+			log.info("三方平台获取token响应Data:" + jsonString);
+			String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
+			baseResult.setData(encrypt);
+			baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
+			log.info("三方平台获取token响应参数:" + JacksonUtils.toJson(baseResult));
+			return baseResult;
+		}
+		
+		//生成token
+		Map<String, Object> token = tokenUtil.createToken(operator);
+		String access_token = token.get("access_token").toString();
+		Long expires_in = Long.valueOf(token.get("expires_in").toString());
+
+		queryTokenResult.setOperatorID("906171535");
+		queryTokenResult.setSuccStat(0);
+		queryTokenResult.setFailReason(0);
+		queryTokenResult.setAccessToken(access_token);
+		queryTokenResult.setTokenAvailableTime(expires_in * 60);
+		//参数加密
+		String jsonString = JacksonUtils.toJson(queryTokenResult);
+		log.info("三方平台获取token响应Data:" + jsonString);
+		String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
+		baseResult.setData(encrypt);
+		baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
+		log.info("三方平台获取token响应参数:" + JacksonUtils.toJson(baseResult));
+		return baseResult;
+	}
+	
+	
+	
+	
+	
+	/**
+	 * 查询充电站信息
+	 * @return
+	 */
+	@PostMapping("/query_stations_info")
+	public BaseResult queryStationsInfo(@RequestBody BaseRequest baseRequest, HttpServletRequest request){
+		log.info("三方平台查询充电站信息请求参数:" + JacksonUtils.toJson(baseRequest));
+		//校验token和签名
+		BaseResult baseResult = requestCheck(true, baseRequest, request);
+		if(0 != baseResult.getRet()){
+			log.info("三方平台查询充电站信息响应Data:");
+			baseResult.setData("");
+			baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
+			log.info("三方平台查询充电站信息响应参数:" + JacksonUtils.toJson(baseResult));
+			return baseResult;
+		}
+		Operator operator = baseResult.getOperator();
+		//解密参数
+		String decrypt = AESUtil.decrypt(baseRequest.getData(), operator.getOurDataSecret(), operator.getOurDataSecretIv());
+		log.info("三方平台查询充电站信息请求Data:" + decrypt);
+		QueryStationsInfo queryStationsInfo = JSON.parseObject(decrypt, QueryStationsInfo.class);
+		Integer pageNo = queryStationsInfo.getPageNo();
+		Integer pageSize = queryStationsInfo.getPageSize();
+		if(null == pageNo){
+			pageNo = 1;
+		}
+		if(null == pageSize){
+			pageSize = 10;
+		}
+		PageInfo<Site> siteListPaging = siteClient.getSiteListPaging(pageNo, pageSize, new ArrayList<>());
+		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(parkingLots, siteListPaging.getRecords()));
+		//参数加密
+		String jsonString = JacksonUtils.toJson(queryStationsInfoResult);
+		log.info("三方平台查询充电站信息响应Data:" + jsonString);
+		String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
+		baseResult.setData(encrypt);
+		baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
+		log.info("三方平台查询充电站信息响应参数:" + JacksonUtils.toJson(baseResult));
+		return baseResult;
+	}
+	
+	
+	/**
+	 * 构建站点数据
+	 * @param sites
+	 * @return
+	 */
+	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());
+		List<TChargingGun> chargingGunList = chargingGunClient.getChargingGunByChargingPileIds(collect1).getData();
+		String serviceTel = systemConfigurationClient.getServerPhone().getData();
+		List<StationInfo> StationInfos = new ArrayList<>();
+		for (Site datum : sites) {
+			StationInfo stationInfo = new StationInfo();
+			stationInfo.setAreaCodeCountryside(datum.getAreaCodeCountryside());
+			stationInfo.setStationClassification(datum.getStationClassification());
+			stationInfo.setGeneralApplicationType(datum.getGeneralApplicationType());
+			if (org.springframework.util.StringUtils.hasLength(datum.getSwapMatchCars())){
+				stationInfo.setSwapMatchCars(Arrays.asList(datum.getSwapMatchCars().split(",")));
+			}
+			stationInfo.setBusineHours(datum.getStartServiceTime());
+			stationInfo.setRoundTheClock(datum.getRoundTheClock());
+			stationInfo.setParkType(datum.getParkType());
+			stationInfo.setElectricityFee("{"+datum.getElectricityFee()+"}");
+			stationInfo.setServiceFee("{"+datum.getServiceFee()+"}");
+			stationInfo.setParkFee("{\"rules\":"+datum.getParkFee()+","+"\"freeDuration\":"+datum.getParkFeeFree()+"}");
+			stationInfo.setElectricityType(datum.getElectricityType());
+			stationInfo.setBusinessExpandType(datum.getBusinessExpandType());
+			stationInfo.setCapacity(datum.getCapacity());
+			stationInfo.setRatedPower(datum.getRatedPower());
+			stationInfo.setPeriodFee(datum.getPeriodFee());
+			stationInfo.setOfficialRunTime(datum.getOfficialRunTime());
+			stationInfo.setStationOrientation(datum.getStationOrientation());
+			stationInfo.setStationArea(datum.getStationArea());
+			stationInfo.setHavePerson(datum.getHavePerson());
+			stationInfo.setVideoMonitor(datum.getVideoMonitor());
+			if (StringUtils.isNotEmpty(datum.getSupportingFacilities())){
+				String[] split = datum.getSupportingFacilities().split(",");
+				List<Integer> collect = Arrays.stream(split).map(Integer::parseInt).collect(Collectors.toList());
+				stationInfo.setSupportingFacilities(collect);
+			}
+			stationInfo.setPrinterFlag(datum.getPrinterFlag());
+			stationInfo.setBarrierFlag(datum.getBarrierFlag());
+			stationInfo.setParkingLockFlag(datum.getParkingLockFlag());
+			stationInfo.setEquipmentOwnerName(datum.getEquipmentOwnerName());
+			stationInfo.setResidentNo(datum.getResidentNo());
+			stationInfo.setSupplyType(datum.getSupplyType());
+			stationInfo.setWattHourMeterNo(datum.getWattHourMeterNo());
+			BigDecimal forwardPower = datum.getForwardPower();
+			if (forwardPower!=null){
+				stationInfo.setForwardPower(forwardPower.setScale(4, BigDecimal.ROUND_HALF_UP).toString());
+			}
+			stationInfo.setRecordUniqueNo(datum.getRecordUniqueNo());
+			stationInfo.setStationID(datum.getId().toString());
+			stationInfo.setOperatorID("906171535");
+			stationInfo.setEquipmentOwnerID("906171535");
+			stationInfo.setStationName(datum.getName());
+			stationInfo.setCountryCode(StringUtils.isNotEmpty(datum.getCountryCode()) ? datum.getCountryCode() : "CN");
+			stationInfo.setAreaCode(datum.getDistrictsCode());
+			stationInfo.setAddress(datum.getAddress());
+			stationInfo.setStationTel(datum.getPhone());
+			stationInfo.setServiceTel(serviceTel);
+			switch (datum.getSiteType()){
+				case 0:
+					stationInfo.setStationType(StationTypeEnum.OTHER.getType());
+					break;
+				case 1:
+					stationInfo.setStationType(StationTypeEnum.PUBLIC.getType());
+					break;
+				case 2:
+					stationInfo.setStationType(StationTypeEnum.PERSONAGE.getType());
+					break;
+				case 3:
+					stationInfo.setStationType(StationTypeEnum.BUS_SPECIFIC.getType());
+					break;
+				case 4:
+					stationInfo.setStationType(StationTypeEnum.SANITATION_SPECIFIC.getType());
+					break;
+				case 5:
+					stationInfo.setStationType(StationTypeEnum.LOGISTICS_SPECIFIC.getType());
+					break;
+				case 6:
+					stationInfo.setStationType(StationTypeEnum.TEXT_SPECIFIC.getType());
+					break;
+			}
+			if(datum.getStatus() == 1){
+				stationInfo.setStationStatus(StationStatusEnum.NORMAL_USE.getStatus());
+			}
+			if(datum.getStatus() == 2){
+				stationInfo.setStationStatus(StationStatusEnum.MAINTAIN.getStatus());
+			}
+			if(datum.getStatus() == 3){
+				stationInfo.setStationStatus(StationStatusEnum.OFF_LINE.getStatus());
+			}
+			stationInfo.setParkNums(datum.getParkingSpace());
+			stationInfo.setStationLat(new BigDecimal(datum.getLat()).setScale(6, RoundingMode.DOWN));
+			stationInfo.setStationLng(new BigDecimal(datum.getLon()).setScale(6, RoundingMode.DOWN));
+			stationInfo.setConstruction(datum.getConstructionSite() == 0 ? ConstructionEnum.OTHER.getType() : datum.getConstructionSite());
+			stationInfo.setPictures(StringUtils.isNotEmpty(datum.getImgUrl()) ? Arrays.asList(datum.getImgUrl().split(",")) : new ArrayList<>());
+			stationInfo.setSiteGuide(datum.getGuide());
+			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);
+	}
+	
+	
+	
+	
+	/**
+	 * 构建桩数据
+	 * @param tChargingPiles
+	 * @return
+	 */
+	public List<EquipmentInfo> buildEquipmentInfo(Integer siteId, List<TChargingPile> tChargingPiles, List<TChargingGun> chargingGunList){
+		List<EquipmentInfo> equipmentInfos = new ArrayList<>();
+		List<TChargingPile> collect = tChargingPiles.stream().filter(s -> s.getSiteId().equals(siteId)).collect(Collectors.toList());
+		for (TChargingPile tChargingPile : collect) {
+			EquipmentInfo equipmentInfo = new EquipmentInfo();
+			equipmentInfo.setEquipmentID(tChargingPile.getId().toString());
+			equipmentInfo.setManufacturerID(tChargingPile.getManufacturerCode());
+			equipmentInfo.setManufacturerName(tChargingPile.getManufacturer());
+			equipmentInfo.setEquipmentModel(tChargingPile.getEquipmentType());
+			equipmentInfo.setEquipmentUniqueNumber(tChargingPile.getEquipmentUniqueNumber());
+			equipmentInfo.setEquipmentClassification(tChargingPile.getEquipmentClassification());
+			if(null != tChargingPile.getProductionDate()){
+				equipmentInfo.setProductionDate(tChargingPile.getProductionDate().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
+			}
+			switch (tChargingPile.getType()){
+				case 0:
+					equipmentInfo.setEquipmentType(EquipmentTypeEnum.OTHER.getType());
+					break;
+				case 1:
+					equipmentInfo.setEquipmentType(EquipmentTypeEnum.DIRECT_CURRENT.getType());
+					break;
+				case 2:
+					equipmentInfo.setEquipmentType(EquipmentTypeEnum.ALTERNATING_CURRENT.getType());
+					break;
+				case 3:
+					equipmentInfo.setEquipmentType(EquipmentTypeEnum.ALTERNATING_DIRECT.getType());
+					break;
+				case 4:
+					equipmentInfo.setEquipmentType(EquipmentTypeEnum.WIRELESS_DEVICE.getType());
+					break;
+				case 5:
+					equipmentInfo.setEquipmentType(EquipmentTypeEnum.ORDER.getType());
+					break;
+				case 6:
+					equipmentInfo.setEquipmentType(EquipmentTypeEnum.V2G.getType());
+					break;
+			}
+			
+			//构建设备接口信息
+			equipmentInfo.setConnectorInfos(buildConnectorInfos(tChargingPile.getId(), tChargingPile.getCode(), chargingGunList));
+			equipmentInfo.setPower(tChargingPile.getRatedPower());
+			equipmentInfos.add(equipmentInfo);
+		}
+		return equipmentInfos;
+	}
+	
+	
+	/**
+	 * 构建接口数据
+	 * @param chargingGunList
+	 * @return
+	 */
+	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) {
+			ConnectorInfo connectorInfo = new ConnectorInfo();
+			connectorInfo.setConnectorID(chargingGun.getFullNumber());
+			connectorInfo.setConnectorName(chargingGun.getName());
+			connectorInfo.setEquipmentClassification(chargingGun.getEquipmentClassification());
+			connectorInfo.setConstantVoltageLowerLimits(chargingGun.getConstantVoltageLowerLimits());
+			connectorInfo.setConstantVoltageUpperLimits(chargingGun.getConstantVoltageUpperLimits());
+			connectorInfo.setConstantCurrentLowerLimits(chargingGun.getConstantCurrentLowerLimits());
+			connectorInfo.setConstantCurrentUpperLimits(chargingGun.getConstantCurrentUpperLimits());
+			connectorInfo.setAuxPower(chargingGun.getAuxPower());
+			connectorInfo.setOpreateStatus(chargingGun.getOpreateStatus());
+			connectorInfo.setOpreateHours(chargingGun.getOpreateHours());
+			switch (chargingGun.getType()){
+				case 0:
+					connectorInfo.setConnectorType(ConnectorTypeEnum.OTHER.getType());
+					break;
+				case 1:
+					connectorInfo.setConnectorType(ConnectorTypeEnum.HOUSEHOLD_SOCKET.getType());
+					break;
+				case 2:
+					connectorInfo.setConnectorType(ConnectorTypeEnum.AC_SOCKET.getType());
+					break;
+				case 3:
+					connectorInfo.setConnectorType(ConnectorTypeEnum.AC_INTERFACE_PLUG.getType());
+					break;
+				case 4:
+					connectorInfo.setConnectorType(ConnectorTypeEnum.DC_INTERFACE_GUN_HEAD.getType());
+					break;
+				case 5:
+					connectorInfo.setConnectorType(ConnectorTypeEnum.WIRELESS_CHARGING_STAND.getType());
+					break;
+			}
+			connectorInfo.setCurrent(chargingGun.getRatedCurrent().intValue());
+			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;
+	}
+	
+	
+	/**
+	 * 接口状态变化后推送给第三方
+	 * @return
+	 */
+	@PostMapping("/pushChargingGunStatus")
+	public R pushChargingGunStatus(@RequestParam("fullNumber") String fullNumber, @RequestParam("status") Integer status){
+		ConnectorStatusInfo connectorStatusInfo = new ConnectorStatusInfo();
+		connectorStatusInfo.setConnectorID(fullNumber);
+		switch (status){
+			case 1:
+				connectorStatusInfo.setStatus(0);
+				break;
+			case 2:
+				connectorStatusInfo.setStatus(1);
+				break;
+			case 3:
+				connectorStatusInfo.setStatus(2);
+				break;
+			case 4:
+				connectorStatusInfo.setStatus(3);
+				break;
+			case 5:
+				connectorStatusInfo.setStatus(3);
+				break;
+			case 6:
+				connectorStatusInfo.setStatus(4);
+				break;
+			case 7:
+				connectorStatusInfo.setStatus(255);
+				break;
+		}
+		ConnectorStatusInfo connectorStatusInfo1 = new ConnectorStatusInfo();
+		BeanUtils.copyProperties(connectorStatusInfo, connectorStatusInfo1);
+		connectorStatusInfo.setConnectorStatusInfo(connectorStatusInfo1);
+		List<Operator> operators = operatorClient.getAllOperator().getData();
+		for (Operator operator : operators) {
+			TCECUtil.notificationStationStatus(operator, connectorStatusInfo);
+		}
+		return R.ok();
+	}
+	
+	
+	
+	/**
+	 * 设备接口状态查询
+	 * @return
+	 */
+	@PostMapping("/query_station_status")
+	public BaseResult queryStationStatus(@RequestBody BaseRequest baseRequest, HttpServletRequest request){
+		log.info("三方平台获取设备接口状态请求参数:" + JacksonUtils.toJson(baseRequest));
+		BaseResult baseResult = requestCheck(true, baseRequest, request);
+		if(0 != baseResult.getRet()){
+			log.info("三方平台获取设备接口状态响应Data:");
+			baseResult.setData("");
+			baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
+			log.info("三方平台获取设备接口状态响应参数:" + JacksonUtils.toJson(baseResult));
+			return baseResult;
+		}
+		Operator operator = baseResult.getOperator();
+		//解密参数
+		String decrypt = AESUtil.decrypt(baseRequest.getData(), operator.getOurDataSecret(), operator.getOurDataSecretIv());
+		log.info("三方平台获取设备接口状态请求Data:" + decrypt);
+		QueryStationStatus queryStationsInfo = JSON.parseObject(decrypt, QueryStationStatus.class);
+		List<Integer> collect = queryStationsInfo.getStationIDs().stream().map(Integer::valueOf).collect(Collectors.toList());
+		List<Site> data = siteClient.getSiteByIds(collect).getData();
+		List<Integer> siteIds = data.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());
+		List<TChargingGun> chargingGunList = chargingGunClient.getChargingGunByChargingPileIds(collect1).getData();
+		
+		QueryStationStatusResult result = new QueryStationStatusResult();
+		result.setTotal(data.size());
+		List<StationStatusInfo> StationStatusInfos = new ArrayList<>();
+		for (Site datum : data) {
+			StationStatusInfo stationStatusInfo = new StationStatusInfo();
+			stationStatusInfo.setStationID(datum.getId().toString());
+			//构建接口状态
+			List<ConnectorStatusInfo> ConnectorStatusInfos = new ArrayList<>();
+			List<TChargingGun> collect2 = chargingGunList.stream().filter(s -> s.getSiteId().equals(datum.getId())).collect(Collectors.toList());
+			for (TChargingGun chargingGun : collect2) {
+				ConnectorStatusInfo info = new ConnectorStatusInfo();
+				info.setConnectorID(chargingGun.getFullNumber());
+				switch (chargingGun.getStatus()){
+					case 1:
+						info.setStatus(0);
+						break;
+					case 2:
+						info.setStatus(1);
+						break;
+					case 3:
+						info.setStatus(2);
+						break;
+					case 4:
+						info.setStatus(3);
+						break;
+					case 5:
+						info.setStatus(3);
+						break;
+					case 6:
+						info.setStatus(4);
+						break;
+					case 7:
+						info.setStatus(255);
+						break;
+				}
+				ConnectorStatusInfos.add(info);
+			}
+			stationStatusInfo.setConnectorStatusInfos(ConnectorStatusInfos);
+			StationStatusInfos.add(stationStatusInfo);
+		}
+		result.setStationStatusInfos(StationStatusInfos);
+		//参数加密
+		String jsonString = JacksonUtils.toJson(result);
+		log.info("三方平台获取设备接口状态响应Data:" + jsonString);
+		String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
+		baseResult.setData(encrypt);
+		baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
+		log.info("三方平台获取设备接口状态响应参数:" + JacksonUtils.toJson(baseResult));
+		return baseResult;
+	}
+	
+	
+	
+	
+	
+	/**
+	 * 查询统计信息
+	 * @return
+	 */
+	@PostMapping("/query_station_stats")
+	public BaseResult queryStationStats(@RequestBody BaseRequest baseRequest, HttpServletRequest request){
+		log.info("三方平台获取统计信息请求参数:" + JacksonUtils.toJson(baseRequest));
+		//校验token和签名
+		BaseResult baseResult = requestCheck(true, baseRequest, request);
+		if(0 != baseResult.getRet()){
+			log.info("三方平台获取统计信息响应Data:");
+			baseResult.setData("");
+			baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
+			log.info("三方平台获取统计信息响应参数:" + JacksonUtils.toJson(baseResult));
+			return baseResult;
+		}
+		Operator operator = baseResult.getOperator();
+		//解密参数
+		String decrypt = AESUtil.decrypt(baseRequest.getData(), operator.getOurDataSecret(), operator.getOurDataSecretIv());
+		log.info("三方平台获取统计信息请求Data:" + decrypt);
+		QueryStationStats queryStationStats = JSON.parseObject(decrypt, QueryStationStats.class);
+		QueryStationStatsResult result = new QueryStationStatsResult();
+		ChargingPercentProvinceDto dto = new ChargingPercentProvinceDto();
+		dto.setDate1(LocalDate.parse(queryStationStats.getStartTime(), DateTimeFormatter.ofPattern("yyyy-MM-dd")));
+		dto.setDate2(LocalDate.parse(queryStationStats.getEndTime(), DateTimeFormatter.ofPattern("yyyy-MM-dd")));
+		dto.setSiteIds(new HashSet<>(Integer.valueOf(queryStationStats.getStationID())));
+		dto.setTripartitePlatformName(operator.getName());
+		List<TChargingOrder> chargingOrders = chargingOrderClient.getOrderBySiteIdAndTime(dto).getData();
+		BigDecimal reduce = chargingOrders.stream().map(TChargingOrder::getChargingCapacity).reduce(BigDecimal.ZERO, BigDecimal::add);
+		StationStatsInfo stationStats = new StationStatsInfo();
+		stationStats.setStationID(chargingOrders.get(0).getSiteId().toString());
+		stationStats.setStartTime(queryStationStats.getStartTime());
+		stationStats.setEndTime(queryStationStats.getEndTime());
+		stationStats.setStationElectricity(reduce);
+		//构建设备统计数据
+		List<EquipmentStatsInfo> EquipmentStatsInfos = new ArrayList<>();
+		Map<Integer, List<TChargingOrder>> collect = chargingOrders.stream().collect(Collectors.groupingBy(TChargingOrder::getChargingPileId));
+		for (Integer integer : collect.keySet()) {
+			List<TChargingOrder> tChargingOrders = collect.get(integer);
+			BigDecimal reduce1 = tChargingOrders.stream().map(TChargingOrder::getChargingCapacity).reduce(BigDecimal.ZERO, BigDecimal::add);
+			
+			EquipmentStatsInfo equipmentStatsInfo = new EquipmentStatsInfo();
+			equipmentStatsInfo.setEquipmentID(integer.toString());
+			equipmentStatsInfo.setEquipmentElectricity(reduce1);
+			
+			//构建设备接口统计数据
+			Map<Integer, List<TChargingOrder>> collect2 = tChargingOrders.stream().collect(Collectors.groupingBy(TChargingOrder::getChargingGunId));
+			List<ConnectorStatsInfo> ConnectorStatsInfos = new ArrayList<>();
+			for (Integer integer1 : collect2.keySet()) {
+				List<TChargingOrder> tChargingOrders1 = collect2.get(integer1);
+				BigDecimal reduce2 = tChargingOrders1.stream().map(TChargingOrder::getChargingCapacity).reduce(BigDecimal.ZERO, BigDecimal::add);
+				
+				TChargingGun chargingGun = chargingGunClient.getChargingGunById(integer1).getData();
+				ConnectorStatsInfo connectorStatsInfo = new ConnectorStatsInfo();
+				connectorStatsInfo.setConnectorID(chargingGun.getFullNumber());
+				connectorStatsInfo.setConnectorElectricity(reduce2);
+				ConnectorStatsInfos.add(connectorStatsInfo);
+			}
+			equipmentStatsInfo.setConnectorStatsInfos(ConnectorStatsInfos);
+			EquipmentStatsInfos.add(equipmentStatsInfo);
+		}
+		stationStats.setEquipmentStatsInfos(EquipmentStatsInfos);
+		result.setStationStats(stationStats);
+		//参数加密
+		String jsonString = JacksonUtils.toJson(result);
+		log.info("三方平台获取统计信息响应Data:" + jsonString);
+		String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
+		baseResult.setData(encrypt);
+		baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
+		log.info("三方平台获取统计信息响应参数:" + JacksonUtils.toJson(baseResult));
+		return baseResult;
+	}
+	
+	
+	/**
+	 * 请求设备认证
+	 * @return
+	 */
+	@PostMapping("/query_equip_auth")
+	public BaseResult queryEquipAuth(@RequestBody BaseRequest baseRequest, HttpServletRequest request){
+		log.info("三方平台设备认证请求参数:" + JacksonUtils.toJson(baseRequest));
+		//校验token和签名
+		BaseResult baseResult = requestCheck(true, baseRequest, request);
+		if(0 != baseResult.getRet()){
+			log.info("三方平台设备认证响应Data:");
+			baseResult.setData("");
+			baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
+			log.info("三方平台设备认证响应参数:" + JacksonUtils.toJson(baseResult));
+			return baseResult;
+		}
+		Operator operator = baseResult.getOperator();
+		//解密参数
+		String decrypt = AESUtil.decrypt(baseRequest.getData(), operator.getOurDataSecret(), operator.getOurDataSecretIv());
+		log.info("三方平台设备认证请求Data:" + decrypt);
+		QueryEquipAuth queryEquipAuth = JSON.parseObject(decrypt, QueryEquipAuth.class);
+		String connectorID = queryEquipAuth.getConnectorID();
+		TChargingGun tChargingGun = chargingGunClient.getChargingGunByFullNumber(connectorID).getData();
+		if(null == tChargingGun){
+			baseResult.setRet(4004);
+			baseResult.setMsg("connectorID 参数无效");
+			log.info("三方平台设备认证响应参数:" + JacksonUtils.toJson(baseResult));
+			return baseResult;
+		}
+		QueryEquipAuthResult queryEquipAuthResult = new QueryEquipAuthResult();
+		queryEquipAuthResult.setEquipAuthSeq(queryEquipAuth.getEquipAuthSeq());
+		queryEquipAuthResult.setConnectorID(connectorID);
+		//1=离线,2=空闲,3=占用(未充电),4=占用(充电中),5=占用(已充满),6=占用(预约锁定),7=故障
+		switch (tChargingGun.getStatus()){
+			case 1:
+				queryEquipAuthResult.setSuccStat(1);
+				queryEquipAuthResult.setFailReason(2);
+				break;
+			case 2:
+				queryEquipAuthResult.setSuccStat(0);
+				queryEquipAuthResult.setFailReason(0);
+				break;
+			case 3:
+				queryEquipAuthResult.setSuccStat(0);
+				queryEquipAuthResult.setFailReason(1);
+				break;
+			case 4:
+				queryEquipAuthResult.setSuccStat(1);
+				queryEquipAuthResult.setFailReason(4);
+				break;
+			case 5:
+				queryEquipAuthResult.setSuccStat(1);
+				queryEquipAuthResult.setFailReason(5);
+				break;
+			case 6:
+				queryEquipAuthResult.setSuccStat(1);
+				queryEquipAuthResult.setFailReason(6);
+				break;
+			case 7:
+				queryEquipAuthResult.setSuccStat(1);
+				queryEquipAuthResult.setFailReason(2);
+				break;
+		}
+		//参数加密
+		String jsonString = JacksonUtils.toJson(queryEquipAuthResult);
+		log.info("三方平台设备认证响应Data:" + jsonString);
+		String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
+		baseResult.setData(encrypt);
+		baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
+		log.info("三方平台设备认证响应参数:" + JacksonUtils.toJson(baseResult));
+		return baseResult;
+	}
+	
+	
+	
+	/**
+	 * 查询业务策略信息
+	 * @return
+	 */
+	@PostMapping("/query_equip_business_policy")
+	public BaseResult queryEquipBusinessPolicy(@RequestBody BaseRequest baseRequest, HttpServletRequest request){
+		log.info("三方平台查询业务策略信息请求参数:" + JacksonUtils.toJson(baseRequest));
+		//校验token和签名
+		BaseResult baseResult = requestCheck(true, baseRequest, request);
+		if(0 != baseResult.getRet()){
+			log.info("三方平台查询业务策略信息响应Data:");
+			baseResult.setData("");
+			baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
+			log.info("三方平台查询业务策略信息响应参数:" + JacksonUtils.toJson(baseResult));
+			return baseResult;
+		}
+		Operator operator = baseResult.getOperator();
+		//解密参数
+		String decrypt = AESUtil.decrypt(baseRequest.getData(), operator.getOurDataSecret(), operator.getOurDataSecretIv());
+		log.info("三方平台查询业务策略信息请求Data:" + decrypt);
+		QueryEquipBusinessPolicy queryEquipBusinessPolicy = JSON.parseObject(decrypt, QueryEquipBusinessPolicy.class);
+		
+		//构建返回结果
+		QueryEquipBusinessPolicyResult queryEquipBusinessPolicyResult = new QueryEquipBusinessPolicyResult();
+		queryEquipBusinessPolicyResult.setEquipBizSeq(queryEquipBusinessPolicy.getEquipBizSeq());
+		queryEquipBusinessPolicyResult.setConnectorID(queryEquipBusinessPolicy.getConnectorID());
+		queryEquipBusinessPolicyResult.setSuccStat(0);
+		queryEquipBusinessPolicyResult.setFailReason(0);
+		String connectorID = queryEquipBusinessPolicy.getConnectorID();
+		TChargingGun tChargingGun = chargingGunClient.getChargingGunByFullNumber(connectorID).getData();
+		if(null == tChargingGun){
+			baseResult.setRet(4004);
+			baseResult.setMsg("connectorID 参数无效");
+			//参数加密
+			String jsonString = JacksonUtils.toJson(queryEquipBusinessPolicyResult);
+			log.info("三方平台查询业务策略信息响应Data:" + jsonString);
+			String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
+			baseResult.setData(encrypt);
+			baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
+			log.info("三方平台查询业务策略信息响应参数:" + JacksonUtils.toJson(baseResult));
+			return baseResult;
+		}
+		Integer accountingStrategyId = tChargingGun.getAccountingStrategyId();
+		if(null == accountingStrategyId){
+			List<Site> data = siteClient.getSiteByIds(Arrays.asList(tChargingGun.getSiteId())).getData();
+			accountingStrategyId = data.get(0).getAccountingStrategyId();
+		}
+		List<TAccountingStrategyDetail> accountingStrategyDetails = accountingStrategyDetailClient.getListByAccountingStrategyId(accountingStrategyId).getData();
+		if(accountingStrategyDetails.size() == 0){
+			queryEquipBusinessPolicyResult.setSuccStat(1);
+			queryEquipBusinessPolicyResult.setFailReason(1);
+			queryEquipBusinessPolicyResult.setSumPeriod(0);
+			//参数加密
+			String jsonString = JacksonUtils.toJson(queryEquipBusinessPolicyResult);
+			log.info("三方平台查询业务策略信息响应Data:" + jsonString);
+			String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
+			baseResult.setData(encrypt);
+			baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
+			log.info("三方平台查询业务策略信息响应参数:" + JacksonUtils.toJson(baseResult));
+			return baseResult;
+		}
+		List<PolicyInfo> PolicyInfos = new ArrayList<>();
+		for (TAccountingStrategyDetail accountingStrategyDetail : accountingStrategyDetails) {
+			PolicyInfo policyInfo = new PolicyInfo();
+			policyInfo.setStartTime(accountingStrategyDetail.getStartTime().replaceAll(":", "") + "00");
+			policyInfo.setElecPrice(accountingStrategyDetail.getElectrovalence());
+			policyInfo.setSevicePrice(accountingStrategyDetail.getServiceCharge());
+			PolicyInfos.add(policyInfo);
+		}
+		queryEquipBusinessPolicyResult.setSumPeriod(PolicyInfos.size());
+		queryEquipBusinessPolicyResult.setPolicyInfos(PolicyInfos);
+		//参数加密
+		String jsonString = JacksonUtils.toJson(queryEquipBusinessPolicyResult);
+		log.info("三方平台查询业务策略信息响应Data:" + jsonString);
+		String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
+		baseResult.setData(encrypt);
+		baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
+		log.info("三方平台查询业务策略信息响应参数:" + JacksonUtils.toJson(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")
+	public BaseResult queryStartCharge(@RequestBody BaseRequest baseRequest, HttpServletRequest request){
+		log.info("三方平台请求开始充电请求参数:" + JacksonUtils.toJson(baseRequest));
+		//校验token和签名
+		BaseResult baseResult = requestCheck(true, baseRequest, request);
+		if(0 != baseResult.getRet()){
+			log.info("三方平台请求开始充电响应Data:");
+			baseResult.setData("");
+			baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
+			log.info("三方平台请求开始充电响应参数:" + JacksonUtils.toJson(baseResult));
+			return baseResult;
+		}
+		Operator operator = baseResult.getOperator();
+		//解密参数
+		String decrypt = AESUtil.decrypt(baseRequest.getData(), operator.getOurDataSecret(), operator.getOurDataSecretIv());
+		log.info("三方平台请求开始充电请求Data:" + decrypt);
+		QueryStartCharge queryStartCharge = JSON.parseObject(decrypt, QueryStartCharge.class);
+		
+		//构建返回结果
+		QueryStartChargeResult result = new QueryStartChargeResult();
+		result.setStartChargeSeq(queryStartCharge.getStartChargeSeq());
+		result.setConnectorID(queryStartCharge.getConnectorID());
+		String connectorID = queryStartCharge.getConnectorID();
+		TChargingGun tChargingGun = chargingGunClient.getChargingGunByFullNumber(connectorID).getData();
+		//设备不存在
+		if(null == tChargingGun){
+			baseResult.setRet(4004);
+			baseResult.setMsg("connectorID 参数无效");
+			result.setSuccStat(1);
+			result.setFailReason(1);
+			result.setStartChargeSeqStat(5);
+			//参数加密
+			String jsonString = JacksonUtils.toJson(result);
+			log.info("三方平台请求开始充电响应Data:" + jsonString);
+			String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
+			baseResult.setData(encrypt);
+			baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
+			log.info("三方平台请求开始充电响应参数:" + JacksonUtils.toJson(baseResult));
+			return baseResult;
+		}
+		//设备离线
+		if(tChargingGun.getStatus() == 1){
+			result.setSuccStat(1);
+			result.setFailReason(2);
+			result.setStartChargeSeqStat(5);
+			//参数加密
+			String jsonString = JacksonUtils.toJson(result);
+			log.info("三方平台请求开始充电响应Data:" + jsonString);
+			String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
+			baseResult.setData(encrypt);
+			baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
+			log.info("三方平台请求开始充电响应参数:" + JacksonUtils.toJson(baseResult));
+			return baseResult;
+		}
+		//调用充电接口
+		AddTripartitePlatformOrder addTripartitePlatformOrder = new AddTripartitePlatformOrder();
+		addTripartitePlatformOrder.setStartChargeSeq(queryStartCharge.getStartChargeSeq());
+		addTripartitePlatformOrder.setChargingGunId(tChargingGun.getId());
+		addTripartitePlatformOrder.setOperatorId(operator.getOperatorId());
+		addTripartitePlatformOrder.setPaymentAmount(null == queryStartCharge.getChargingAmt() ? new BigDecimal(9999) : queryStartCharge.getChargingAmt());
+		addTripartitePlatformOrder.setRechargePaymentType(0);
+		addTripartitePlatformOrder.setPlateNum(queryStartCharge.getPlateNum());
+		R order = chargingOrderClient.addTripartitePlatformOrder(addTripartitePlatformOrder);
+		//启动失败
+		if(200 != order.getCode()){
+			result.setSuccStat(1);
+			result.setFailReason(1);
+			result.setStartChargeSeqStat(2);
+			//参数加密
+			String jsonString = JacksonUtils.toJson(result);
+			log.info("三方平台请求开始充电响应Data:" + jsonString);
+			String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
+			baseResult.setData(encrypt);
+			baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
+			log.info("三方平台请求开始充电响应参数:" + JacksonUtils.toJson(baseResult));
+			return baseResult;
+		}
+		result.setStartChargeSeqStat(1);
+		result.setSuccStat(0);
+		result.setFailReason(0);
+		//参数加密
+		String jsonString = JacksonUtils.toJson(result);
+		log.info("三方平台请求开始充电响应Data:" + jsonString);
+		String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
+		baseResult.setData(encrypt);
+		baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
+		log.info("三方平台请求开始充电响应参数:" + JacksonUtils.toJson(baseResult));
+		
+		//定义定时任务推送订单状态
+		ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
+		Runnable task = new Runnable() {
+			@Override
+			public void run() {
+				try {
+					TChargingOrder chargingOrder = chargingOrderClient.getChargingOrderByStartChargeSeq(result.getStartChargeSeq()).getData();
+					if(chargingOrder.getStatus() != 3){
+						scheduler.shutdown();
+						return;
+					}
+					log.info("开始执行三方平台定时推送");
+					notificationEquipChargeStatus(chargingOrder.getStartChargeSeq(), chargingOrder.getOperatorId());
+				}catch (Exception e){
+					e.printStackTrace();
+				}
+			}
+		};
+		//一分钟执行一次
+		scheduler.scheduleAtFixedRate(task, 10, 10, TimeUnit.SECONDS);
+		return baseResult;
+	}
+	
+	
+	/**
+	 * 启动充电结果推送
+	 * @param result
+	 * @return
+	 */
+	@PostMapping("/notificationStartChargeResult")
+	public R notificationStartChargeResult(@RequestBody StartChargeResult result){
+		NotificationStartCharge notificationStartCharge = new NotificationStartCharge();
+		BeanUtils.copyProperties(result, notificationStartCharge);
+		Operator operator = operatorClient.getOperator(result.getOperatorID()).getData();
+		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();
+	}
+	
+	
+	
+	/**
+	 * 查询充电状态
+	 * @return
+	 */
+	@PostMapping("/query_equip_charge_status")
+	public BaseResult queryEquipChargeStatus(@RequestBody BaseRequest baseRequest, HttpServletRequest request){
+		log.info("三方平台查询充电状态请求参数:" + JacksonUtils.toJson(baseRequest));
+		//校验token和签名
+		BaseResult baseResult = requestCheck(true, baseRequest, request);
+		if(0 != baseResult.getRet()){
+			log.info("三方平台查询充电状态响应Data:");
+			baseResult.setData("");
+			baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
+			log.info("三方平台查询充电状态响应参数:" + JacksonUtils.toJson(baseResult));
+			return baseResult;
+		}
+		Operator operator = baseResult.getOperator();
+		//解密参数
+		String decrypt = AESUtil.decrypt(baseRequest.getData(), operator.getOurDataSecret(), operator.getOurDataSecretIv());
+		log.info("三方平台查询充电状态请求Data:" + decrypt);
+		QueryEquipChargeStatus queryEquipChargeStatus = JSON.parseObject(decrypt, QueryEquipChargeStatus.class);
+		//校验token和签名
+		QueryEquipChargeStatusResult queryEquipChargeStatusResult = buildQueryEquipChargeStatusResult(queryEquipChargeStatus.getStartChargeSeq());
+		//参数加密
+		String jsonString = JacksonUtils.toJson(queryEquipChargeStatusResult);
+		log.info("三方平台查询充电状态响应Data:" + jsonString);
+		String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
+		baseResult.setData(encrypt);
+		baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
+		log.info("三方平台查询充电状态响应参数:" + JacksonUtils.toJson(baseResult));
+		return baseResult;
+	}
+	
+	
+	/**
+	 * 构建充电状态结果
+	 * @param startChargeSeq
+	 * @return
+	 */
+	public QueryEquipChargeStatusResult buildQueryEquipChargeStatusResult(String startChargeSeq){
+		//构建返回结果
+		QueryEquipChargeStatusResult queryEquipChargeStatusResult = new QueryEquipChargeStatusResult();
+		queryEquipChargeStatusResult.setStartChargeSeq(startChargeSeq);
+		TChargingOrder chargingOrder = chargingOrderClient.getChargingOrderByStartChargeSeq(startChargeSeq).getData();
+		if(null == chargingOrder){
+			return null;
+		}
+		//0=未知,1=等待中/已插枪,2=启动中,3=充电中,4=停止中,5=已结束
+		switch (chargingOrder.getStatus()){
+			case 0:
+				queryEquipChargeStatusResult.setStartChargeSeqStat(5);
+				break;
+			case 1:
+				queryEquipChargeStatusResult.setStartChargeSeqStat(0);
+				break;
+			case 2:
+				queryEquipChargeStatusResult.setStartChargeSeqStat(1);
+				break;
+			case 3:
+				queryEquipChargeStatusResult.setStartChargeSeqStat(2);
+				break;
+			case 4:
+				queryEquipChargeStatusResult.setStartChargeSeqStat(3);
+				break;
+			case 5:
+				queryEquipChargeStatusResult.setStartChargeSeqStat(4);
+				break;
+		}
+		TChargingGun chargingGun = chargingGunClient.getChargingGunById(chargingOrder.getChargingGunId()).getData();
+		queryEquipChargeStatusResult.setConnectorID(chargingGun.getFullNumber());
+		//1=离线,2=空闲,3=占用(未充电),4=占用(充电中),5=占用(已充满),6=占用(预约锁定),7=故障
+		switch (chargingGun.getStatus()){
+			case 1:
+				queryEquipChargeStatusResult.setConnectorStatus(0);
+				break;
+			case 2:
+				queryEquipChargeStatusResult.setConnectorStatus(1);
+				break;
+			case 3:
+				queryEquipChargeStatusResult.setConnectorStatus(2);
+				break;
+			case 4:
+				queryEquipChargeStatusResult.setConnectorStatus(3);
+				break;
+			case 5:
+				queryEquipChargeStatusResult.setConnectorStatus(1);
+				break;
+			case 6:
+				queryEquipChargeStatusResult.setConnectorStatus(4);
+				break;
+			case 7:
+				queryEquipChargeStatusResult.setConnectorStatus(255);
+				break;
+		}
+		queryEquipChargeStatusResult.setCurrentA(chargingOrder.getCurrent());
+		queryEquipChargeStatusResult.setVoltageA(chargingOrder.getVoltage());
+		UploadRealTimeMonitoringData timeMonitoringData = uploadRealTimeMonitoringDataService.getLastDataById(chargingOrder.getCode());
+		queryEquipChargeStatusResult.setSoc(null == timeMonitoringData ? BigDecimal.ZERO : new BigDecimal(timeMonitoringData.getSoc()));
+		queryEquipChargeStatusResult.setStartTime((null == chargingOrder.getStartTime() ? chargingOrder.getCreateTime() : chargingOrder.getStartTime()).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+		queryEquipChargeStatusResult.setEndTime((null == chargingOrder.getEndTime() ? LocalDateTime.now() : chargingOrder.getEndTime()).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+		queryEquipChargeStatusResult.setTotalPower(chargingOrder.getElectricity());
+		
+		List<TChargingOrderAccountingStrategy> data = chargingOrderAccountingStrategyClient.getChargingOrderAccountingStrategyByOrderId(chargingOrder.getId()).getData();
+		if(data.size() > 0){
+			BigDecimal totalElectricity = data.stream().map(TChargingOrderAccountingStrategy::getPeriodElectricPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
+			BigDecimal serviceCharge = data.stream().map(TChargingOrderAccountingStrategy::getPeriodServicePrice).reduce(BigDecimal.ZERO, BigDecimal::add);
+			queryEquipChargeStatusResult.setElecMoney(totalElectricity);
+			queryEquipChargeStatusResult.setSeviceMoney(serviceCharge);
+			queryEquipChargeStatusResult.setTotalMoney(chargingOrder.getPaymentAmount());
+		}else{
+			queryEquipChargeStatusResult.setElecMoney(chargingOrder.getRechargeAmount().subtract(chargingOrder.getResidualAmount()));
+			queryEquipChargeStatusResult.setSeviceMoney(BigDecimal.ZERO);
+			queryEquipChargeStatusResult.setTotalMoney(chargingOrder.getRechargeAmount().subtract(chargingOrder.getResidualAmount()));
+		}
+		
+		//构建充电明细
+		List<ChargeDetail> chargeDetails = new ArrayList<>();
+		
+		LocalDateTime startTime = null == chargingOrder.getStartTime() ? LocalDateTime.now() : chargingOrder.getStartTime();
+		LocalDateTime endTime = null == chargingOrder.getEndTime() ? LocalDateTime.now() : 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);
+		}
+		queryEquipChargeStatusResult.setChargeDetails(chargeDetails);
+		return queryEquipChargeStatusResult;
+	}
+	
+	
+	/**
+	 * 推送充电状态
+	 * @param startChargeSeq
+	 * @return
+	 */
+	@PostMapping("/notificationEquipChargeStatus")
+	public R notificationEquipChargeStatus(@RequestParam(value = "startChargeSeq") String startChargeSeq, @RequestParam(value = "operatorId") Integer operatorId){
+		QueryEquipChargeStatusResult queryEquipChargeStatusResult = buildQueryEquipChargeStatusResult(startChargeSeq);
+		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();
+	}
+	
+	
+	/**
+	 * 请求停止充电
+	 * @return
+	 */
+	@PostMapping("/query_stop_charge")
+	public BaseResult queryStopCharge(@RequestBody BaseRequest baseRequest, HttpServletRequest request){
+		log.info("三方平台请求停止充电请求参数:" + JacksonUtils.toJson(baseRequest));
+		//校验token和签名
+		BaseResult baseResult = requestCheck(true, baseRequest, request);
+		if(0 != baseResult.getRet()){
+			log.info("三方平台请求停止充电响应Data:");
+			baseResult.setData("");
+			baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
+			log.info("三方平台请求停止充电响应参数:" + JacksonUtils.toJson(baseResult));
+			return baseResult;
+		}
+		Operator operator = baseResult.getOperator();
+		//解密参数
+		String decrypt = AESUtil.decrypt(baseRequest.getData(), operator.getOurDataSecret(), operator.getOurDataSecretIv());
+		log.info("三方平台请求停止充电请求Data:" + decrypt);
+		QueryStopCharge queryStopCharge = JSON.parseObject(decrypt, QueryStopCharge.class);
+		QueryStopChargeResult queryStopChargeResult = new QueryStopChargeResult();
+		queryStopChargeResult.setStartChargeSeq(queryStopCharge.getStartChargeSeq());
+		queryStopChargeResult.setStartChargeSeqStat(3);
+		queryStopChargeResult.setSuccStat(0);
+		queryStopChargeResult.setFailReason(0);
+		//执行停机操作
+		R r = chargingOrderClient.tripartitePlatformStopCharge(queryStopCharge.getStartChargeSeq());
+		if(200 != r.getCode()){
+			queryStopChargeResult.setStartChargeSeqStat(5);
+			queryStopChargeResult.setSuccStat(1);
+			queryStopChargeResult.setFailReason(3);
+			//参数加密
+			String jsonString = JacksonUtils.toJson(queryStopChargeResult);
+			log.info("三方平台请求停止充电响应Data:" + jsonString);
+			String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
+			baseResult.setData(encrypt);
+			baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
+			log.info("三方平台请求停止充电响应参数:" + JacksonUtils.toJson(baseResult));
+			return baseResult;
+		}
+		//参数加密
+		String jsonString = JacksonUtils.toJson(queryStopChargeResult);
+		log.info("三方平台请求停止充电响应Data:" + jsonString);
+		String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
+		baseResult.setData(encrypt);
+		baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
+		log.info("三方平台请求停止充电响应参数:" + JacksonUtils.toJson(baseResult));
+		return baseResult;
+	}
+	
+	
+	
+	/**
+	 * 推送停止充电结果
+	 * @param startChargeSeq    充电订单号
+	 * @param connectorID       充电设备接口编码
+	 * @return
+	 */
+	@PostMapping("/notificationStopChargeResult")
+	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(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();
+	}
+	
+	
+	/**
+	 * 推送订单信息
+	 * @param startChargeSeq
+	 * @return
+	 */
+	@PostMapping("/notificationChargeOrderInfo")
+	public R notificationChargeOrderInfo(@RequestParam("startChargeSeq") String startChargeSeq, @RequestParam("operatorId") Integer operatorId){
+		NotificationChargeOrderInfo info = buildNotificationChargeOrderInfo(startChargeSeq);
+		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();
+	}
+	
+	
+	/**
+	 * 构建推送订单信息
+	 * @param startChargeSeq
+	 * @return
+	 */
+	public NotificationChargeOrderInfo buildNotificationChargeOrderInfo(String startChargeSeq){
+		//构建返回结果
+		NotificationChargeOrderInfo notificationChargeOrderInfo = new NotificationChargeOrderInfo();
+		notificationChargeOrderInfo.setStartChargeSeq(startChargeSeq);
+		TChargingOrder chargingOrder = chargingOrderClient.getChargingOrderByStartChargeSeq(startChargeSeq).getData();
+		if(null == chargingOrder){
+			return null;
+		}
+		TChargingGun chargingGun = chargingGunClient.getChargingGunById(chargingOrder.getChargingGunId()).getData();
+		notificationChargeOrderInfo.setConnectorID(chargingGun.getFullNumber());
+		notificationChargeOrderInfo.setStartTime((null == chargingOrder.getStartTime() ? chargingOrder.getCreateTime() : chargingOrder.getStartTime()).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+		notificationChargeOrderInfo.setEndTime((null == chargingOrder.getEndTime() ? LocalDateTime.now() : chargingOrder.getEndTime()).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+		notificationChargeOrderInfo.setTotalPower(chargingOrder.getElectricity());
+		
+		List<TChargingOrderAccountingStrategy> data = chargingOrderAccountingStrategyClient.getChargingOrderAccountingStrategyByOrderId(chargingOrder.getId()).getData();
+		if(data.size() > 0){
+			BigDecimal totalElectricity = data.stream().map(TChargingOrderAccountingStrategy::getPeriodElectricPrice).reduce(BigDecimal.ZERO, BigDecimal::add);
+			BigDecimal serviceCharge = data.stream().map(TChargingOrderAccountingStrategy::getPeriodServicePrice).reduce(BigDecimal.ZERO, BigDecimal::add);
+			notificationChargeOrderInfo.setTotalElecMoney(totalElectricity.setScale(2, RoundingMode.HALF_EVEN));
+			notificationChargeOrderInfo.setTotalSeviceMoney(serviceCharge.setScale(2, RoundingMode.HALF_EVEN));
+			notificationChargeOrderInfo.setTotalMoney(chargingOrder.getPaymentAmount());
+		}else{
+			notificationChargeOrderInfo.setTotalElecMoney(chargingOrder.getRechargeAmount().subtract(chargingOrder.getResidualAmount()));
+			notificationChargeOrderInfo.setTotalSeviceMoney(BigDecimal.ZERO);
+			notificationChargeOrderInfo.setTotalMoney(chargingOrder.getRechargeAmount().subtract(chargingOrder.getResidualAmount()));
+		}
+		
+		
+		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:
+				notificationChargeOrderInfo.setStopReason(3);
+				break;
+			case 1:
+				notificationChargeOrderInfo.setStopReason(0);
+				break;
+			case 2:
+				notificationChargeOrderInfo.setStopReason(2);
+				break;
+			case 3:
+				notificationChargeOrderInfo.setStopReason(5);
+				break;
+		}
+		
+		//构建充电明细
+		List<ChargeDetail> chargeDetails = new ArrayList<>();
+		
+		LocalDateTime startTime = null == chargingOrder.getStartTime() ? LocalDateTime.now() : chargingOrder.getStartTime();
+		LocalDateTime endTime = null == chargingOrder.getEndTime() ? LocalDateTime.now() : 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);
+		}
+		notificationChargeOrderInfo.setChargeDetails(chargeDetails);
+		return notificationChargeOrderInfo;
+	}
+	
+	
+	/**
+	 * 二维码查询枪号(快电)
+	 * @param baseRequest
+	 * @param request
+	 * @return
+	 */
+	@PostMapping("/query_terminal_code")
+	public BaseResult queryTerminalCode(@RequestBody BaseRequest baseRequest, HttpServletRequest request){
+		log.info("三方平台二维码查询枪号请求参数:" + JacksonUtils.toJson(baseRequest));
+		//校验token和签名
+		BaseResult baseResult = requestCheck(true, baseRequest, request);
+		if(0 != baseResult.getRet()){
+			log.info("三方平台二维码查询枪号响应Data:");
+			baseResult.setData("");
+			baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
+			log.info("三方平台二维码查询枪号响应参数:" + JacksonUtils.toJson(baseResult));
+			return baseResult;
+		}
+		Operator operator = baseResult.getOperator();
+		//解密参数
+		String decrypt = AESUtil.decrypt(baseRequest.getData(), operator.getOurDataSecret(), operator.getOurDataSecretIv());
+		log.info("三方平台二维码查询枪号请求Data:" + decrypt);
+		QueryTerminalCode queryTerminalCode = JSON.parseObject(decrypt, QueryTerminalCode.class);
+		String qrCode = queryTerminalCode.getQRCode();
+		String substring = qrCode.substring(qrCode.indexOf("=") + 1);
+		TChargingGun chargingGun = chargingGunClient.getChargingGunByFullNumber(substring).getData();
+		QueryTerminalCodeResult queryTerminalCodeResult = new QueryTerminalCodeResult();
+		if(null != chargingGun){
+			queryTerminalCodeResult.setTerminalCode(chargingGun.getId().toString());
+		}
+		
+		//参数加密
+		String jsonString = JacksonUtils.toJson(queryTerminalCodeResult);
+		log.info("三方平台二维码查询枪号响应Data:" + jsonString);
+		String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
+		baseResult.setData(encrypt);
+		baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
+		log.info("三方平台二维码查询枪号响应参数:" + JacksonUtils.toJson(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 = JacksonUtils.toJson(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){
+		log.info("三方平台账单拉取请求参数:" + JacksonUtils.toJson(baseRequest));
+		//校验token和签名
+		BaseResult baseResult = requestCheck(true, baseRequest, request);
+		if(0 != baseResult.getRet()){
+			log.info("三方平台账单拉取响应Data:");
+			baseResult.setData("");
+			baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
+			log.info("三方平台账单拉取响应参数:" + JacksonUtils.toJson(baseResult));
+			return baseResult;
+		}
+		Operator operator = baseResult.getOperator();
+		//解密参数
+		String decrypt = AESUtil.decrypt(baseRequest.getData(), operator.getOurDataSecret(), operator.getOurDataSecretIv());
+		log.info("三方平台账单拉取请求Data:" + decrypt);
+		QueryChargeOrderInfo queryChargeOrderInfo = JSON.parseObject(decrypt, QueryChargeOrderInfo.class);
+		//构建返回结果
+		QueryChargeOrderInfoResult result = buildQueryChargeOrderInfoResult(queryChargeOrderInfo);
+		//参数加密
+		String jsonString = JacksonUtils.toJson(result);
+		log.info("三方平台账单拉取响应Data:" + jsonString);
+		String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
+		baseResult.setData(encrypt);
+		baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
+		log.info("三方平台账单拉取响应参数:" + JacksonUtils.toJson(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;
+			}
+			TChargingGun chargingGun = chargingGunClient.getChargingGunById(chargingOrder.getChargingGunId()).getData();
+			OrderInfo orderInfo = new OrderInfo();
+			orderInfo.setStartChargeSeq(chargingOrder.getStartChargeSeq());
+			orderInfo.setConnectorID(chargingGun.getFullNumber());
+			orderInfo.setStartTime((null == chargingOrder.getStartTime() ? chargingOrder.getCreateTime() : chargingOrder.getStartTime()).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
+			orderInfo.setEndTime((null == chargingOrder.getEndTime() ? 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 = null == chargingOrder.getEndTime() ? LocalDateTime.now() : 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;
+	}
+	
+	
+	
+	/*********************数据监管平台接口*********************/
+	/**
+	 * 查询运营商信息
+	 * @param baseRequest
+	 * @param request
+	 * @return
+	 */
+	@PostMapping("/supervise_query_operator_info")
+	public BaseResult superviseQueryOperatorInfo(@RequestBody BaseRequest baseRequest, HttpServletRequest request){
+		log.info("监管平台查询充电站信息请求参数:" + JacksonUtils.toJson(baseRequest));
+		//校验token和签名
+		BaseResult baseResult = requestCheck(true, baseRequest, request);
+		if(0 != baseResult.getRet()){
+			log.info("监管平台查询充电站信息响应Data:");
+			baseResult.setData("");
+			baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
+			log.info("监管平台查询充电站信息响应参数:" + JacksonUtils.toJson(baseResult));
+			return baseResult;
+		}
+		Operator operator = baseResult.getOperator();
+		//解密参数
+		String decrypt = AESUtil.decrypt(baseRequest.getData(), operator.getOurDataSecret(), operator.getOurDataSecretIv());
+		log.info("监管平台查询充电站信息请求Data:" + decrypt);
+		SuperviseQueryOperatorInfo superviseQueryOperatorInfo = JSON.parseObject(decrypt, SuperviseQueryOperatorInfo.class);
+		Integer pageNo = superviseQueryOperatorInfo.getPageNo();
+		Integer pageSize = superviseQueryOperatorInfo.getPageSize();
+		if(null == pageNo){
+			pageNo = 1;
+		}
+		if(null == pageSize){
+			pageSize = 50;
+		}
+		String operatorTel = systemConfigurationClient.getServerPhone().getData();
+		SuperviseQueryOperatorInfoResultPage superviseQueryOperatorInfoResultPage = new SuperviseQueryOperatorInfoResultPage();
+		superviseQueryOperatorInfoResultPage.setPageNo(1);
+		superviseQueryOperatorInfoResultPage.setPageCount(1);
+		superviseQueryOperatorInfoResultPage.setItemSize(1);
+
+		SuperviseQueryOperatorInfoResult superviseQueryOperatorInfoResult = new SuperviseQueryOperatorInfoResult();
+		superviseQueryOperatorInfoResult.setOperatorID("906171535");
+		superviseQueryOperatorInfoResult.setOperatorUSCID("91510903906171535D");
+		superviseQueryOperatorInfoResult.setOperatorName("四川明星新能源科技有限公司");
+		superviseQueryOperatorInfoResult.setOperatorTel1(operatorTel);
+		List<SuperviseQueryOperatorInfoResult> superviseQueryOperatorInfoResults = new ArrayList<>();
+		superviseQueryOperatorInfoResults.add(superviseQueryOperatorInfoResult);
+		// 将superviseQueryOperatorInfoResults转化为json数组
+		superviseQueryOperatorInfoResultPage.setOperatorInfos(superviseQueryOperatorInfoResults);
+		String jsonString = JacksonUtils.toJson(superviseQueryOperatorInfoResultPage);
+		//参数加密
+		log.info("监管平台查询充电站信息响应Data:" + jsonString);
+		String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
+		baseResult.setData(encrypt);
+		baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
+		log.info("监管平台查询充电站信息响应参数:" + JacksonUtils.toJson(baseResult));
+		return baseResult;
+	}
+
+
+	
+	/**
+	 * 查询充电站信息
+	 * @param baseRequest
+	 * @param request
+	 * @return
+	 */
+	@PostMapping("/supervise_query_stations_info")
+	public BaseResult superviseQueryStationsInfo(@RequestBody BaseRequest baseRequest, HttpServletRequest request){
+		log.info("监管平台查询充电站信息请求参数:" + JacksonUtils.toJson(baseRequest));
+		//校验token和签名
+		BaseResult baseResult = requestCheck(true, baseRequest, request);
+		if(0 != baseResult.getRet()){
+			log.info("监管平台查询充电站信息响应Data:");
+			baseResult.setData("");
+			baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
+			log.info("监管平台查询充电站信息响应参数:" + JacksonUtils.toJson(baseResult));
+			return baseResult;
+		}
+		Operator operator = baseResult.getOperator();
+		//解密参数
+		String decrypt = AESUtil.decrypt(baseRequest.getData(), operator.getOurDataSecret(), operator.getOurDataSecretIv());
+		log.info("监管平台查询充电站信息请求Data:" + decrypt);
+		QueryStationsInfo queryStationsInfo = JSON.parseObject(decrypt, QueryStationsInfo.class);
+		Integer pageNo = queryStationsInfo.getPageNo();
+		Integer pageSize = queryStationsInfo.getPageSize();
+		List<String> stationIDs = queryStationsInfo.getStationIDs();
+		if(null == pageNo){
+			pageNo = 1;
+		}
+		if(null == pageSize){
+			pageSize = 50;
+		}
+		PageInfo<Site> siteListPaging = siteClient.getSiteListPaging(pageNo, pageSize, stationIDs);
+		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(parkingLots, siteListPaging.getRecords()));
+		//参数加密
+		String jsonString = JacksonUtils.toJson(queryStationsInfoResult);
+		log.info("监管平台查询充电站信息响应Data:" + jsonString);
+		String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
+		baseResult.setData(encrypt);
+		baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
+		log.info("监管平台查询充电站信息响应参数:" + JacksonUtils.toJson(baseResult));
+		return baseResult;
+	}
+	/**
+	 * 推送充电用能统计
+	 * @return
+	 */
+	@PostMapping("/supervise_notification_operation_stats_info")
+	public void superviseNotificationOperationStatsInfo(){
+		List<Site> data = siteClient.getSiteAll().getData();
+		LocalDateTime now = LocalDateTime.now();
+		LocalDateTime startLocalDateTime = now.minusDays(1);
+		LocalDateTime endLocalDateTime = now.minusDays(1);
+		// 获取今天凌晨
+		startLocalDateTime.withHour(0);
+		startLocalDateTime.withMinute(0);
+		startLocalDateTime.withSecond(0);
+		String start = DateUtils.localDateTimeToString(startLocalDateTime);
+		endLocalDateTime.withHour(23);
+		endLocalDateTime.withMinute(59);
+		endLocalDateTime.withSecond(59);
+		String end = DateUtils.localDateTimeToString(endLocalDateTime);
+		ChargingStatisticeDTO chargingStatisticeDTO = new ChargingStatisticeDTO();
+		chargingStatisticeDTO.setStartTime(startLocalDateTime);
+		chargingStatisticeDTO.setEndTime(endLocalDateTime);
+		List<TChargingOrder> data1 = chargingOrderClient.getChargingStatistics(chargingStatisticeDTO).getData();
+		List<StationStatsInfo> stationStatsInfos = new ArrayList<>();
+		for (Site datum : data) {
+			StationStatsInfo stationStatsInfo = new StationStatsInfo();
+			stationStatsInfo.setStationID(datum.getId().toString());
+			stationStatsInfo.setEquipmentOwnerID("906171535");
+			stationStatsInfo.setOperatorID("906171535");
+			stationStatsInfo.setStationClassification(1);
+			stationStatsInfo.setStartTime(start);
+			stationStatsInfo.setEndTime(end);
+			List<TChargingOrder> chargingOrders = data1.stream().filter(e -> e.getSiteId().equals(datum.getId())).collect(Collectors.toList());
+			// 充电电量
+			BigDecimal electricity = new BigDecimal("0");
+			int chargingCount = 0;
+			for (TChargingOrder chargingOrder : chargingOrders) {
+				if (chargingOrder.getElectricity()!=null){
+					electricity = electricity.add(chargingOrder.getElectricity());
+					chargingCount++;
+				}
+			}
+			stationStatsInfo.setStationElectricity(electricity.divide(new BigDecimal("24")).setScale(4, BigDecimal.ROUND_DOWN));
+			stationStatsInfo.setStationTotalChargeEnergy(electricity.setScale(4, BigDecimal.ROUND_DOWN));
+			stationStatsInfo.setStationTotalWarningNum(0);
+			stationStatsInfo.setStationTotalOtherEnergy(new BigDecimal("0"));
+			stationStatsInfo.setStationTotalChargeNum(chargingCount);
+			//构建设备统计数据
+			List<EquipmentStatsInfo> EquipmentStatsInfos = new ArrayList<>();
+			Map<Integer, List<TChargingOrder>> collect = chargingOrders.stream().collect(Collectors.groupingBy(TChargingOrder::getChargingPileId));
+			for (Integer integer : collect.keySet()) {
+				List<TChargingOrder> tChargingOrders = collect.get(integer);
+				BigDecimal reduce1 = tChargingOrders.stream().map(TChargingOrder::getChargingCapacity).reduce(BigDecimal.ZERO, BigDecimal::add);
+				EquipmentStatsInfo equipmentStatsInfo = new EquipmentStatsInfo();
+				equipmentStatsInfo.setEquipmentClassification(1);
+				long chargingTime = 0L;
+				for (TChargingOrder tChargingOrder : tChargingOrders) {
+					// 累加充电时长
+					LocalDateTime startTime = tChargingOrder.getStartTime();
+					LocalDateTime endTime = tChargingOrder.getEndTime();
+					// 计算时间差 单位分钟
+					chargingTime += ChronoUnit.SECONDS.between(startTime, endTime)/60;
+				}
+				equipmentStatsInfo.setEquipmentTotalChargeTime(chargingTime);
+				equipmentStatsInfo.setEquipmentTotalChargeNum(tChargingOrders.size());
+				equipmentStatsInfo.setEquipmentTotalWarningNum(0);
+				equipmentStatsInfo.setEquipmentID(integer.toString());
+				equipmentStatsInfo.setEquipmentElectricity(reduce1);
+				//构建设备接口统计数据
+				Map<Integer, List<TChargingOrder>> collect2 = tChargingOrders.stream().collect(Collectors.groupingBy(TChargingOrder::getChargingGunId));
+				List<ConnectorStatsInfo> ConnectorStatsInfos = new ArrayList<>();
+				for (Integer integer1 : collect2.keySet()) {
+					List<TChargingOrder> tChargingOrders1 = collect2.get(integer1);
+					BigDecimal reduce2 = tChargingOrders1.stream().map(TChargingOrder::getChargingCapacity).reduce(BigDecimal.ZERO, BigDecimal::add);
+
+					TChargingGun chargingGun = chargingGunClient.getChargingGunById(integer1).getData();
+					ConnectorStatsInfo connectorStatsInfo = new ConnectorStatsInfo();
+					connectorStatsInfo.setConnectorID(chargingGun.getFullNumber());
+					connectorStatsInfo.setConnectorElectricity(reduce2);
+					ConnectorStatsInfos.add(connectorStatsInfo);
+				}
+				equipmentStatsInfo.setConnectorStatsInfos(ConnectorStatsInfos);
+				EquipmentStatsInfos.add(equipmentStatsInfo);
+			}
+			stationStatsInfo.setEquipmentStatsInfos(EquipmentStatsInfos);
+			stationStatsInfos.add(stationStatsInfo);
+		}
+	}
+	/**
+	 * 推送充换电站实时功率
+	 * @return
+	 */
+	@PostMapping("/supervise_notification_realtime_power_info")
+	public void superviseNotificationRealtimePowerInfo(){
+
+	}
+
+	/**
+	 * 推送充换电站信息
+	 * @param datum
+	 * @return
+	 */
+	@PostMapping("/supervise_notification_station_info")
+	public void superviseNotificationStationInfo(@RequestBody Site datum){
+		BaseResult baseResult = new BaseResult();
+		StationInfo stationInfo = new StationInfo();
+		List<TChargingPile> tChargingPiles = chargingPileClient.getChargingPileBySiteIds(Collections.singletonList(datum.getId())).getData();
+		List<Integer> collect1 = tChargingPiles.stream().map(TChargingPile::getId).collect(Collectors.toList());
+		List<TChargingGun> chargingGunList = chargingGunClient.getChargingGunByChargingPileIds(collect1).getData();
+		String serviceTel = systemConfigurationClient.getServerPhone().getData();
+		stationInfo.setAreaCodeCountryside(datum.getAreaCodeCountryside());
+		stationInfo.setStationClassification(datum.getStationClassification());
+		stationInfo.setGeneralApplicationType(datum.getGeneralApplicationType());
+		if (org.springframework.util.StringUtils.hasLength(datum.getSwapMatchCars())){
+			stationInfo.setSwapMatchCars(Arrays.asList(datum.getSwapMatchCars().split(",")));
+		}
+		stationInfo.setBusineHours(datum.getStartServiceTime());
+		stationInfo.setRoundTheClock(datum.getRoundTheClock());
+		stationInfo.setParkType(datum.getParkType());
+		stationInfo.setElectricityFee("{"+datum.getElectricityFee()+"}");
+		stationInfo.setServiceFee("{"+datum.getServiceFee()+"}");
+		stationInfo.setParkFee("{\"rules\":"+datum.getParkFee()+","+"\"freeDuration\":"+datum.getParkFeeFree()+"}");
+		stationInfo.setElectricityType(datum.getElectricityType());
+		stationInfo.setBusinessExpandType(datum.getBusinessExpandType());
+		stationInfo.setCapacity(datum.getCapacity());
+		stationInfo.setRatedPower(datum.getRatedPower());
+		stationInfo.setPeriodFee(datum.getPeriodFee());
+		stationInfo.setOfficialRunTime(datum.getOfficialRunTime());
+		stationInfo.setStationOrientation(datum.getStationOrientation());
+		stationInfo.setStationArea(datum.getStationArea());
+		stationInfo.setHavePerson(datum.getHavePerson());
+		stationInfo.setVideoMonitor(datum.getVideoMonitor());
+		if (StringUtils.isNotEmpty(datum.getSupportingFacilities())){
+			String[] split = datum.getSupportingFacilities().split(",");
+			List<Integer> collect = Arrays.stream(split).map(Integer::parseInt).collect(Collectors.toList());
+			stationInfo.setSupportingFacilities(collect);
+		}
+		stationInfo.setPrinterFlag(datum.getPrinterFlag());
+		stationInfo.setBarrierFlag(datum.getBarrierFlag());
+		stationInfo.setParkingLockFlag(datum.getParkingLockFlag());
+		stationInfo.setEquipmentOwnerName(datum.getEquipmentOwnerName());
+		stationInfo.setResidentNo(datum.getResidentNo());
+		stationInfo.setSupplyType(datum.getSupplyType());
+		stationInfo.setWattHourMeterNo(datum.getWattHourMeterNo());
+		BigDecimal forwardPower = datum.getForwardPower();
+		if (forwardPower!=null){
+			stationInfo.setForwardPower(forwardPower.setScale(4, BigDecimal.ROUND_HALF_UP).toString());
+		}
+		stationInfo.setRecordUniqueNo(datum.getRecordUniqueNo());
+		stationInfo.setStationID(datum.getId().toString());
+		stationInfo.setOperatorID("906171535");
+		stationInfo.setEquipmentOwnerID("906171535");
+		stationInfo.setStationName(datum.getName());
+		stationInfo.setCountryCode(StringUtils.isNotEmpty(datum.getCountryCode()) ? datum.getCountryCode() : "CN");
+		stationInfo.setAreaCode(datum.getDistrictsCode());
+		stationInfo.setAddress(datum.getAddress());
+		stationInfo.setStationTel(datum.getPhone());
+		stationInfo.setServiceTel(serviceTel);
+		switch (datum.getSiteType()){
+			case 0:
+				stationInfo.setStationType(StationTypeEnum.OTHER.getType());
+				break;
+			case 1:
+				stationInfo.setStationType(StationTypeEnum.PUBLIC.getType());
+				break;
+			case 2:
+				stationInfo.setStationType(StationTypeEnum.PERSONAGE.getType());
+				break;
+			case 3:
+				stationInfo.setStationType(StationTypeEnum.BUS_SPECIFIC.getType());
+				break;
+			case 4:
+				stationInfo.setStationType(StationTypeEnum.SANITATION_SPECIFIC.getType());
+				break;
+			case 5:
+				stationInfo.setStationType(StationTypeEnum.LOGISTICS_SPECIFIC.getType());
+				break;
+			case 6:
+				stationInfo.setStationType(StationTypeEnum.TEXT_SPECIFIC.getType());
+				break;
+		}
+		if(datum.getStatus() == 1){
+			stationInfo.setStationStatus(StationStatusEnum.NORMAL_USE.getStatus());
+		}
+		if(datum.getStatus() == 2){
+			stationInfo.setStationStatus(StationStatusEnum.MAINTAIN.getStatus());
+		}
+		if(datum.getStatus() == 3){
+			stationInfo.setStationStatus(StationStatusEnum.OFF_LINE.getStatus());
+		}
+		stationInfo.setParkNums(datum.getParkingSpace());
+		stationInfo.setStationLat(new BigDecimal(datum.getLat()).setScale(6, RoundingMode.DOWN));
+		stationInfo.setStationLng(new BigDecimal(datum.getLon()).setScale(6, RoundingMode.DOWN));
+		stationInfo.setConstruction(datum.getConstructionSite() == 0 ? ConstructionEnum.OTHER.getType() : datum.getConstructionSite());
+		stationInfo.setPictures(StringUtils.isNotEmpty(datum.getImgUrl()) ? Arrays.asList(datum.getImgUrl().split(",")) : new ArrayList<>());
+		stationInfo.setSiteGuide(datum.getGuide());
+		stationInfo.setMatchCars(datum.getVehicleDescription());
+		stationInfo.setElectricityFee(datum.getRateDescription());
+		//构建充电设备信息数据
+		stationInfo.setEquipmentInfos(buildEquipmentInfo(datum.getId(), tChargingPiles, chargingGunList));
+		// 推送
+		HttpRequest post = HttpUtil.createPost(url + "supervise_notification_station_info");
+		buildBody(post, stationInfo);
+		HttpResponse execute = post.execute();
+		if(200 != execute.getStatus()){
+			log.error("推送监管平台电站信息失败:" + execute.body());
+			return ;
+		}
+		log.info("推送监管平台电站信息响应:" + execute.body());
+		String data = baseResult.getData();
+		// 转化为json
+		if(!data.contains("0")){
+			log.error("推送监管平台电站信息失败:" + baseResult.getMsg());
+			// 重试
+			for (int i = 1; i <= 3; i++) {
+				try {
+					Thread.sleep(5000);
+					HttpRequest post1 = HttpUtil.createPost(url + "supervise_notification_station_info");
+					buildBody(post1, stationInfo);
+					HttpResponse execute1 = post1.execute();
+					if(200 == execute1.getStatus()){
+						log.info("重试次数:"+i+"推送监管平台电站信息响应:" + execute1.body());
+						BaseResult baseResult2 = JSON.parseObject(execute1.body(), BaseResult.class);
+						String data1 = baseResult2.getData();
+						if (data1.contains("0")){
+							break;
+						}
+					}
+				} catch (InterruptedException e) {
+                    throw new RuntimeException(e);
+                }
+            }
+		}
+	}
+	/**
+	 * 构建请求参数和消息头
+	 * @param post
+	 * @param o
+	 */
+	public static void buildBody(HttpRequest post, Object o){
+		Long timeStamp = Long.valueOf(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
+		post.contentType("application/json;charset=utf-8");
+//		post.header("Authorization", "Bearer " + getToken(operator));
+		BaseRequest baseRequest = new BaseRequest();
+		baseRequest.setOperatorID("906171535");
+		baseRequest.setTimeStamp(timeStamp);
+		baseRequest.setSeq("0001");
+		String jsonString = JacksonUtils.toJson(o);
+		String encrypt = AESUtil.encrypt(jsonString, ourDataSecret, ourDataSecretIv);
+		baseRequest.setData(encrypt);
+		baseRequest.setSig(TCECUtil.ourBuildSign(baseRequest));
+		log.info("监管平台推送参数:" + JacksonUtils.toJson(baseRequest));
+		String request_json = JacksonUtils.toJson(baseRequest);
+		post.body(request_json);
+
+	}
+
+//
+//
+//	/**
+//	 * 构建站点数据
+//	 * @param sites
+//	 * @return
+//	 */
+//	public List<StationInfo> superviseBuildSite(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());
+//		List<TChargingGun> chargingGunList = chargingGunClient.getChargingGunByChargingPileIds(collect1).getData();
+//		String serviceTel = systemConfigurationClient.getServerPhone().getData();
+//		List<StationInfo> StationInfos = new ArrayList<>();
+//		for (Site datum : sites) {
+//			StationInfo stationInfo = new StationInfo();
+//			stationInfo.setStationID(datum.getId().toString());
+//			stationInfo.setStationUniqueNumber(datum.getDistrictsCode() + "906171535" + datum.getId());
+//			stationInfo.setOperatorID("906171535");
+//			stationInfo.setEquipmentOwnerID("906171535");
+//			stationInfo.setStationName(datum.getName());
+//			stationInfo.setCountryCode(StringUtils.isNotEmpty(datum.getCountryCode()) ? datum.getCountryCode() : "CN");
+//			stationInfo.setAreaCode(datum.getDistrictsCode());
+//			stationInfo.setAreaCodeCountryside();
+//			stationInfo.setAddress(datum.getAddress());
+//			stationInfo.setStationTel(datum.getPhone());
+//			stationInfo.setServiceTel(serviceTel);
+//			switch (datum.getSiteType()){
+//				case 0:
+//					stationInfo.setStationType(StationTypeEnum.OTHER.getType());
+//					break;
+//				case 1:
+//					stationInfo.setStationType(StationTypeEnum.PUBLIC.getType());
+//					break;
+//				case 2:
+//					stationInfo.setStationType(StationTypeEnum.PERSONAGE.getType());
+//					break;
+//				case 3:
+//					stationInfo.setStationType(StationTypeEnum.BUS_SPECIFIC.getType());
+//					break;
+//				case 4:
+//					stationInfo.setStationType(StationTypeEnum.SANITATION_SPECIFIC.getType());
+//					break;
+//				case 5:
+//					stationInfo.setStationType(StationTypeEnum.LOGISTICS_SPECIFIC.getType());
+//					break;
+//				case 6:
+//					stationInfo.setStationType(StationTypeEnum.TEXT_SPECIFIC.getType());
+//					break;
+//			}
+//			if(datum.getStatus() == 1){
+//				stationInfo.setStationStatus(StationStatusEnum.NORMAL_USE.getStatus());
+//			}
+//			if(datum.getStatus() == 2){
+//				stationInfo.setStationStatus(StationStatusEnum.MAINTAIN.getStatus());
+//			}
+//			if(datum.getStatus() == 3){
+//				stationInfo.setStationStatus(StationStatusEnum.OFF_LINE.getStatus());
+//			}
+//			stationInfo.setParkNums(datum.getParkingSpace());
+//			stationInfo.setStationLat(new BigDecimal(datum.getLat()).setScale(6, RoundingMode.DOWN));
+//			stationInfo.setStationLng(new BigDecimal(datum.getLon()).setScale(6, RoundingMode.DOWN));
+//			stationInfo.setConstruction(datum.getConstructionSite() == 0 ? ConstructionEnum.OTHER.getType() : datum.getConstructionSite());
+//			stationInfo.setPictures(StringUtils.isNotEmpty(datum.getImgUrl()) ? Arrays.asList(datum.getImgUrl().split(",")) : new ArrayList<>());
+//			stationInfo.setSiteGuide(datum.getGuide());
+//			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();
+//				superviseBuildPlaceHolder(tParkingLot, stationInfo);
+//			}
+//
+//			//构建充电设备信息数据
+//			stationInfo.setEquipmentInfos(superviseBuildEquipmentInfo(datum.getId(), tChargingPiles, chargingGunList));
+//			StationInfos.add(stationInfo);
+//
+//		}
+//		return StationInfos;
+//	}
+//
+//
+//	/**
+//	 * 构建停车费信息
+//	 * @param tParkingLot
+//	 * @param stationInfo
+//	 */
+//	public void superviseBuildPlaceHolder(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);
+//	}
+//
+//
+//
+//
+//	/**
+//	 * 构建桩数据
+//	 * @param tChargingPiles
+//	 * @return
+//	 */
+//	public List<EquipmentInfo> superviseBuildEquipmentInfo(Integer siteId, List<TChargingPile> tChargingPiles, List<TChargingGun> chargingGunList){
+//		List<EquipmentInfo> equipmentInfos = new ArrayList<>();
+//		List<TChargingPile> collect = tChargingPiles.stream().filter(s -> s.getSiteId().equals(siteId)).collect(Collectors.toList());
+//		for (TChargingPile tChargingPile : collect) {
+//			EquipmentInfo equipmentInfo = new EquipmentInfo();
+//			equipmentInfo.setEquipmentID(tChargingPile.getId().toString());
+//			equipmentInfo.setManufacturerID(tChargingPile.getManufacturerCode());
+//			equipmentInfo.setManufacturerName(tChargingPile.getManufacturer());
+//			equipmentInfo.setEquipmentModel(tChargingPile.getEquipmentType());
+//			if(null != tChargingPile.getProductionDate()){
+//				equipmentInfo.setProductionDate(tChargingPile.getProductionDate().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
+//			}
+//			switch (tChargingPile.getType()){
+//				case 0:
+//					equipmentInfo.setEquipmentType(EquipmentTypeEnum.OTHER.getType());
+//					break;
+//				case 1:
+//					equipmentInfo.setEquipmentType(EquipmentTypeEnum.DIRECT_CURRENT.getType());
+//					break;
+//				case 2:
+//					equipmentInfo.setEquipmentType(EquipmentTypeEnum.ALTERNATING_CURRENT.getType());
+//					break;
+//				case 3:
+//					equipmentInfo.setEquipmentType(EquipmentTypeEnum.ALTERNATING_DIRECT.getType());
+//					break;
+//				case 4:
+//					equipmentInfo.setEquipmentType(EquipmentTypeEnum.WIRELESS_DEVICE.getType());
+//					break;
+//			}
+//
+//			//构建设备接口信息
+//			equipmentInfo.setConnectorInfos(superviseBuildConnectorInfos(tChargingPile.getId(), tChargingPile.getCode(), chargingGunList));
+//			equipmentInfo.setPower(tChargingPile.getRatedPower());
+//			equipmentInfos.add(equipmentInfo);
+//		}
+//		return equipmentInfos;
+//	}
+//
+//
+//	/**
+//	 * 构建接口数据
+//	 * @param chargingGunList
+//	 * @return
+//	 */
+//	public List<ConnectorInfo> superviseBuildConnectorInfos(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) {
+//			ConnectorInfo connectorInfo = new ConnectorInfo();
+//			connectorInfo.setConnectorID(chargingGun.getFullNumber());
+//			connectorInfo.setConnectorName(chargingGun.getName());
+//			switch (chargingGun.getType()){
+//				case 0:
+//					connectorInfo.setConnectorType(ConnectorTypeEnum.OTHER.getType());
+//					break;
+//				case 1:
+//					connectorInfo.setConnectorType(ConnectorTypeEnum.HOUSEHOLD_SOCKET.getType());
+//					break;
+//				case 2:
+//					connectorInfo.setConnectorType(ConnectorTypeEnum.AC_SOCKET.getType());
+//					break;
+//				case 3:
+//					connectorInfo.setConnectorType(ConnectorTypeEnum.AC_INTERFACE_PLUG.getType());
+//					break;
+//				case 4:
+//					connectorInfo.setConnectorType(ConnectorTypeEnum.DC_INTERFACE_GUN_HEAD.getType());
+//					break;
+//				case 5:
+//					connectorInfo.setConnectorType(ConnectorTypeEnum.WIRELESS_CHARGING_STAND.getType());
+//					break;
+//			}
+//			connectorInfo.setVoltageUpperLimits(chargingGun.getUpperRatedVoltage().intValue());
+//			connectorInfo.setVoltageLowerLimits(chargingGun.getLowerLimitOfRatedVoltage().intValue());
+//			connectorInfo.setCurrent(chargingGun.getRatedCurrent().intValue());
+//			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;
+//	}
+	
+}
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/EquipmentStatsInfo.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/EquipmentStatsInfo.java
index 33d9c11..7dcb6c0 100644
--- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/EquipmentStatsInfo.java
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/EquipmentStatsInfo.java
@@ -27,6 +27,35 @@
 	@JsonProperty("EquipmentElectricity")
 	private BigDecimal equipmentElectricity;
 	/**
+	 * 设备分类 1:车辆充电设备
+	 * 2:换电站内的电池
+	 * 箱充电设备
+	 */
+	@NotNull
+	@JsonProperty("EquipmentClassification")
+	private Integer equipmentClassification;
+	/**
+	 * 充电设备累计充电时长 单位分钟
+	 */
+	@NotNull
+	@JsonProperty("EquipmentTotalChargeTime")
+	private Long equipmentTotalChargeTime;
+	/**
+	 * 充电设备累计充
+	 * 电次数
+	 */
+	@NotNull
+	@JsonProperty("EquipmentTotalChargeNum")
+	private Integer equipmentTotalChargeNum;
+	/**
+	 * 充电设备累计充
+	 * 电次数
+	 */
+	@NotNull
+	@JsonProperty("EquipmentTotalWarningNum")
+	private Integer equipmentTotalWarningNum;
+
+	/**
 	 * 充电设备接口统计信息列表
 	 */
 	@NotNull
diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/StationStatsInfo.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/StationStatsInfo.java
index e06100b..5662a1c 100644
--- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/StationStatsInfo.java
+++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/model/StationStatsInfo.java
@@ -21,6 +21,27 @@
 	@JsonProperty("StationID")
 	private String stationID;
 	/**
+	 * 设备所属方ID
+	 * 设备所属运营平台组织机构代码
+	 */
+	@NotNull
+	@JsonProperty("EquipmentOwnerID")
+	private String equipmentOwnerID;
+	/**
+	 * 运营商ID
+	 */
+	@NotNull
+	@JsonProperty("OperatorID")
+	private String operatorID;
+	/**
+	 * 站点分类 1:充电站
+	 * 2:换电站
+	 * 3:充换电一体站
+	 */
+	@NotNull
+	@JsonProperty("StationClassification")
+	private Integer stationClassification;
+	/**
 	 * 统计的开始时间
 	 * yyyy-MM-dd
 	 */
@@ -41,6 +62,35 @@
 	@JsonProperty("StationElectricity")
 	private BigDecimal stationElectricity;
 	/**
+	 * 充换电站累计
+	 * 充电量
+	 */
+	@NotNull
+	@JsonProperty("StationTotalChargeEnergy")
+	private BigDecimal stationTotalChargeEnergy;
+
+	/**
+	 * 充换电站累计
+	 * 告警数量
+	 */
+	@NotNull
+	@JsonProperty("StationTotalWarningNum")
+	private Integer stationTotalWarningNum;
+	/**
+	 充换电站累计
+	 其他电量
+	 */
+	@NotNull
+	@JsonProperty("StationTotalOtherEnergy")
+	private BigDecimal stationTotalOtherEnergy;
+	/**
+	 充换电站累计
+	 充电次数
+	 */
+	@NotNull
+	@JsonProperty("StationTotalChargeNum")
+	private Integer stationTotalChargeNum;
+	/**
 	 * 充电设备统计信息列表
 	 */
 	@NotNull
diff --git a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java
index b980704..06e5acf 100644
--- a/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java
+++ b/ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java
@@ -36,6 +36,7 @@
 import com.ruoyi.integration.api.feignClient.UploadRealTimeMonitoringDataClient;
 import com.ruoyi.integration.api.model.ChargingOrderAndUploadRealTimeMonitoringDataDto;
 import com.ruoyi.integration.api.model.UploadRealTimeMonitoringPageData;
+import com.ruoyi.order.api.dto.ChargingStatisticeDTO;
 import com.ruoyi.order.api.model.*;
 import com.ruoyi.order.api.query.ChargingOrderQuery;
 import com.ruoyi.common.core.dto.MongoChargingOrderQuery;
@@ -157,10 +158,20 @@
     private RoleSiteClient roleSiteClient;
     @Resource
     private SysUserRoleClient sysUserRoleClient;
-    
-    
-    
-    
+
+
+
+    /**
+     * 远程调用 监管平台查询前一天用能统计
+     * @return
+     */
+    @ResponseBody
+    @PostMapping(value = "/getChargingStatistics")
+    public R<List<TChargingOrder>> getChargingStatistics(@RequestBody ChargingStatisticeDTO dto) {
+        List<TChargingOrder> list = chargingOrderService.lambdaQuery()
+                .between(TChargingOrder::getEndTime, dto.getStartTime(), dto.getEndTime()).list();
+        return R.ok(list);
+    }
 
     /**
      * 远程调用 增加管理后台赠送会员记录

--
Gitblit v1.7.1