puzhibing
2025-02-11 36e7b299289c393c3460140dc966e83f9ea2e749
ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECController.java
@@ -1,30 +1,26 @@
package com.ruoyi.integration.drainage;
import com.alibaba.fastjson.JSON;
import com.ruoyi.chargingPile.api.feignClient.AccountingStrategyDetailClient;
import com.ruoyi.chargingPile.api.feignClient.ChargingGunClient;
import com.ruoyi.chargingPile.api.feignClient.ChargingPileClient;
import com.ruoyi.chargingPile.api.feignClient.SiteClient;
import com.ruoyi.chargingPile.api.model.Site;
import com.ruoyi.chargingPile.api.model.TAccountingStrategyDetail;
import com.ruoyi.chargingPile.api.model.TChargingGun;
import com.ruoyi.chargingPile.api.model.TChargingPile;
import com.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.StringUtils;
import com.ruoyi.common.core.web.page.PageInfo;
import com.ruoyi.common.security.service.TokenService;
import com.ruoyi.integration.drainage.kuaidian.TCECKDUtil;
import com.ruoyi.integration.drainage.kuaidian.model.*;
import com.ruoyi.integration.drainage.model.*;
import com.ruoyi.integration.drainage.model.enu.*;
import com.ruoyi.order.api.feignClient.ChargingOrderAccountingStrategyClient;
import com.ruoyi.order.api.feignClient.ChargingOrderClient;
import com.ruoyi.order.api.model.AddTripartitePlatformOrder;
import com.ruoyi.order.api.model.StartChargeResult;
import com.ruoyi.integration.api.vo.StartChargeResult;
import com.ruoyi.order.api.model.TChargingOrder;
import com.ruoyi.order.api.model.TChargingOrderAccountingStrategy;
import com.ruoyi.other.api.domain.Operator;
import com.ruoyi.other.api.feignClient.OperatorClient;
import com.ruoyi.system.api.model.LoginUser;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.web.bind.annotation.*;
@@ -36,12 +32,14 @@
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
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 TCECController {
@@ -69,8 +67,13 @@
   
   @Resource
   private TokenUtil tokenUtil;
   @Resource
   private ParkingLotClient parkingLotClient;
   
   private static Map<Long, Integer> map = new HashMap<>();
   @Resource
   private ParkingRecordClient parkingRecordClient;
   
   
   /**
@@ -85,22 +88,8 @@
      baseResult.setMsg("成功");
      baseResult.setOperatorID(baseRequest.getOperatorID());
      Long mapKey = Long.valueOf(LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss")));
      Integer integer = map.get(mapKey);
      if(null == integer){
         integer = 1;
      }else{
         integer++;
      }
      map.put(mapKey, integer);
      baseResult.setTimeStamp(mapKey);
      baseResult.setSeq(String.format("%04d", integer));
      //清空小于当前时间的map中的无效数据
      for (Long k : map.keySet()) {
         if(k <= (mapKey - 10)){
            map.remove(k);
         }
      }
      baseResult.setSeq("0001");
      //校验token和签名
      String operatorID = baseRequest.getOperatorID();
      String sig = baseRequest.getSig();
@@ -121,7 +110,7 @@
      }
      //校验token
      if(tokenCheck){
         LoginUser loginUser = tokenUtil.getLoginUser(request);
         Operator loginUser = tokenUtil.getLoginUser(request);
         if(null == loginUser){
            baseResult.setRet(4002);
            baseResult.setMsg("身份校验失败,无效的token");
@@ -130,42 +119,16 @@
      }
      
      Operator operator = r.getData();
      baseResult.setOperator(operator);
      baseRequest.setOperator(operator);
      //校验签名
      String sign = buildSign(baseRequest);
      String sign = TCECUtil.ourBuildSign(baseRequest);
      if(!sign.equals(sig)){
         baseResult.setRet(4001);
         baseResult.setMsg("签名校验失败");
         return baseResult;
      }
      baseResult.setOperator(operator);
      return baseResult;
   }
   /**
    * 构建签名字符串
    * @param model
    * @return
    */
   public String buildSign(BaseModel model){
      Operator operator = model.getOperator();
      //签名秘钥SigSecret
      String key = operator.getSigSecret();
      String sign = "";
      switch (operator.getName()){
         case "XinDianTu":
            //进行字符串拼接、计算
            String m = new StringBuilder(model.getOperatorID()).append(model.getData()).append(model.getTimeStamp()).append(model.getSeq()).toString();
            byte[] hmacMd5 = SignUtil.getHMacMD5Bytes(key.getBytes(), m.getBytes());
            // 打印计算得到的签名Sig
            sign = SignUtil.bytesToHexString(hmacMd5);
            break;
         case "KuaiDian":
            sign = SignUtil.hmacSign(model.getData(), key);
            break;
      }
      return sign;
   }
   
   
@@ -178,10 +141,13 @@
    */
   @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(buildSign(baseResult));
         baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
         log.info("三方平台获取token响应参数:" + JacksonUtils.toJson(baseResult));
         return baseResult;
      }
      QueryTokenResult queryTokenResult = new QueryTokenResult();
@@ -189,20 +155,30 @@
      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.getDataSecret(), operator.getDataSecretIv());
      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.getOperatorSecret())){
      if(!queryToken.getOperatorSecret().equals(operator.getOurOperatorSecret())){
         queryTokenResult.setSuccStat(1);
         queryTokenResult.setFailReason(2);
         //参数加密
         String jsonString = JSON.toJSONString(queryTokenResult);
         String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv());
         String jsonString = JacksonUtils.toJson(queryTokenResult);
         log.info("三方平台获取token响应Data:" + jsonString);
         String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
         baseResult.setData(encrypt);
         baseResult.setSig(buildSign(baseResult));
         baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
         log.info("三方平台获取token响应参数:" + JacksonUtils.toJson(baseResult));
         return baseResult;
      }
      
@@ -210,16 +186,19 @@
      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 = JSON.toJSONString(queryTokenResult);
      String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv());
      String jsonString = JacksonUtils.toJson(queryTokenResult);
      log.info("三方平台获取token响应Data:" + jsonString);
      String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
      baseResult.setData(encrypt);
      baseResult.setSig(buildSign(baseResult));
      baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
      log.info("三方平台获取token响应参数:" + JacksonUtils.toJson(baseResult));
      return baseResult;
   }
   
@@ -233,16 +212,20 @@
    */
   @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(buildSign(baseResult));
         baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
         log.info("三方平台查询充电站信息响应参数:" + JacksonUtils.toJson(baseResult));
         return baseResult;
      }
      Operator operator = baseResult.getOperator();
      //解密参数
      String decrypt = AESUtil.decrypt(baseRequest.getData(), operator.getDataSecret(), operator.getDataSecretIv());
      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();
@@ -253,16 +236,19 @@
         pageSize = 10;
      }
      PageInfo<Site> siteListPaging = siteClient.getSiteListPaging(pageNo, pageSize);
      List<TParkingLot> parkingLots = parkingLotClient.getAllParkingLot().getData();
      QueryStationsInfoResult queryStationsInfoResult = new QueryStationsInfoResult();
      queryStationsInfoResult.setPageNo(pageNo);
      queryStationsInfoResult.setPageCount((0 == (siteListPaging.getTotal() % pageSize) ? 0 : 1) + Double.valueOf(siteListPaging.getTotal() / pageSize).intValue());
      queryStationsInfoResult.setItemSize(Long.valueOf(siteListPaging.getTotal()).intValue());
      queryStationsInfoResult.setStationInfos(buildSite(siteListPaging.getRecords()));
      queryStationsInfoResult.setStationInfos(buildSite(parkingLots, siteListPaging.getRecords()));
      //参数加密
      String jsonString = JSON.toJSONString(queryStationsInfoResult);
      String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv());
      String jsonString = JacksonUtils.toJson(queryStationsInfoResult);
      log.info("三方平台查询充电站信息响应Data:" + jsonString);
      String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
      baseResult.setData(encrypt);
      baseResult.setSig(buildSign(baseResult));
      baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
      log.info("三方平台查询充电站信息响应参数:" + JacksonUtils.toJson(baseResult));
      return baseResult;
   }
   
@@ -272,7 +258,7 @@
    * @param sites
    * @return
    */
   public List<StationInfo> buildSite(List<Site> sites){
   public List<StationInfo> buildSite(List<TParkingLot> parkingLots, List<Site> sites){
      List<Integer> siteIds = sites.stream().map(Site::getId).collect(Collectors.toList());
      List<TChargingPile> tChargingPiles = chargingPileClient.getChargingPileBySiteIds(siteIds).getData();
      List<Integer> collect1 = tChargingPiles.stream().map(TChargingPile::getId).collect(Collectors.toList());
@@ -282,10 +268,10 @@
      for (Site datum : sites) {
         StationInfo stationInfo = new StationInfo();
         stationInfo.setStationID(datum.getId().toString());
         stationInfo.setOperatorID("");
         stationInfo.setEquipmentOwnerID("91510903906171535D");
         stationInfo.setOperatorID("906171535");
         stationInfo.setEquipmentOwnerID("906171535");
         stationInfo.setStationName(datum.getName());
         stationInfo.setCountryCode(datum.getCountryCode());
         stationInfo.setCountryCode(StringUtils.isNotEmpty(datum.getCountryCode()) ? datum.getCountryCode() : "CN");
         stationInfo.setAreaCode(datum.getDistrictsCode());
         stationInfo.setAddress(datum.getAddress());
         stationInfo.setStationTel(datum.getPhone());
@@ -326,17 +312,47 @@
         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(Arrays.asList(datum.getImgUrl().split(",")));
         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);
   }
   
   
   
@@ -376,7 +392,8 @@
         }
         
         //构建设备接口信息
         equipmentInfo.setConnectorInfos(buildConnectorInfos(tChargingPile.getId(), chargingGunList));
         equipmentInfo.setConnectorInfos(buildConnectorInfos(tChargingPile.getId(), tChargingPile.getCode(), chargingGunList));
         equipmentInfo.setPower(tChargingPile.getRatedPower());
         equipmentInfos.add(equipmentInfo);
      }
      return equipmentInfos;
@@ -388,7 +405,7 @@
    * @param chargingGunList
    * @return
    */
   public List<ConnectorInfo> buildConnectorInfos(Integer chargingPileId, List<TChargingGun> chargingGunList){
   public List<ConnectorInfo> buildConnectorInfos(Integer chargingPileId, String code, List<TChargingGun> chargingGunList){
      List<ConnectorInfo> connectorInfos = new ArrayList<>();
      List<TChargingGun> collect = chargingGunList.stream().filter(s -> s.getChargingPileId().equals(chargingPileId)).collect(Collectors.toList());
      for (TChargingGun chargingGun : collect) {
@@ -421,6 +438,7 @@
         connectorInfo.setPower(chargingGun.getRatedPower());
         connectorInfo.setParkNo(chargingGun.getParkingNumber());
         connectorInfo.setNationalStandard(Integer.valueOf(chargingGun.getNationalStandard()));
         connectorInfo.setQRCode("https://mxcd.zhinenganguan.com?No=" + code + chargingGun.getCode());
         connectorInfos.add(connectorInfo);
      }
      return connectorInfos;
@@ -458,7 +476,13 @@
            connectorStatusInfo.setStatus(255);
            break;
      }
      NotificationStationStatusResult result = TCECUtil.notificationStationStatus(connectorStatusInfo);
      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();
   }
   
@@ -470,15 +494,19 @@
    */
   @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(buildSign(baseResult));
         baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
         log.info("三方平台获取设备接口状态响应参数:" + JacksonUtils.toJson(baseResult));
         return baseResult;
      }
      Operator operator = baseResult.getOperator();
      //解密参数
      String decrypt = AESUtil.decrypt(baseRequest.getData(), operator.getDataSecret(), operator.getDataSecretIv());
      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();
@@ -529,10 +557,12 @@
      }
      result.setStationStatusInfos(StationStatusInfos);
      //参数加密
      String jsonString = JSON.toJSONString(result);
      String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv());
      String jsonString = JacksonUtils.toJson(result);
      log.info("三方平台获取设备接口状态响应Data:" + jsonString);
      String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
      baseResult.setData(encrypt);
      baseResult.setSig(buildSign(baseResult));
      baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
      log.info("三方平台获取设备接口状态响应参数:" + JacksonUtils.toJson(baseResult));
      return baseResult;
   }
   
@@ -546,16 +576,20 @@
    */
   @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(buildSign(baseResult));
         baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
         log.info("三方平台获取统计信息响应参数:" + JacksonUtils.toJson(baseResult));
         return baseResult;
      }
      Operator operator = baseResult.getOperator();
      //解密参数
      String decrypt = AESUtil.decrypt(baseRequest.getData(), operator.getDataSecret(), operator.getDataSecretIv());
      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();
@@ -599,10 +633,12 @@
      stationStats.setEquipmentStatsInfos(EquipmentStatsInfos);
      result.setStationStats(stationStats);
      //参数加密
      String jsonString = JSON.toJSONString(result);
      String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv());
      String jsonString = JacksonUtils.toJson(result);
      log.info("三方平台获取统计信息响应Data:" + jsonString);
      String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
      baseResult.setData(encrypt);
      baseResult.setSig(buildSign(baseResult));
      baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
      log.info("三方平台获取统计信息响应参数:" + JacksonUtils.toJson(baseResult));
      return baseResult;
   }
   
@@ -613,22 +649,27 @@
    */
   @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(buildSign(baseResult));
         baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
         log.info("三方平台设备认证响应参数:" + JacksonUtils.toJson(baseResult));
         return baseResult;
      }
      Operator operator = baseResult.getOperator();
      //解密参数
      String decrypt = AESUtil.decrypt(baseRequest.getData(), operator.getDataSecret(), operator.getDataSecretIv());
      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.getChargingGunById(Integer.valueOf(connectorID)).getData();
      if(null == tChargingGun){
         baseResult.setRet(4004);
         baseResult.setMsg("connectorID 参数无效");
         log.info("三方平台设备认证响应参数:" + JacksonUtils.toJson(baseResult));
         return baseResult;
      }
      QueryEquipAuthResult queryEquipAuthResult = new QueryEquipAuthResult();
@@ -666,10 +707,12 @@
            break;
      }
      //参数加密
      String jsonString = JSON.toJSONString(queryEquipAuthResult);
      String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv());
      String jsonString = JacksonUtils.toJson(queryEquipAuthResult);
      log.info("三方平台设备认证响应Data:" + jsonString);
      String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
      baseResult.setData(encrypt);
      baseResult.setSig(buildSign(baseResult));
      baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
      log.info("三方平台设备认证响应参数:" + JacksonUtils.toJson(baseResult));
      return baseResult;
   }
   
@@ -681,16 +724,20 @@
    */
   @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(buildSign(baseResult));
         baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
         log.info("三方平台查询业务策略信息响应参数:" + JacksonUtils.toJson(baseResult));
         return baseResult;
      }
      Operator operator = baseResult.getOperator();
      //解密参数
      String decrypt = AESUtil.decrypt(baseRequest.getData(), operator.getDataSecret(), operator.getDataSecretIv());
      String decrypt = AESUtil.decrypt(baseRequest.getData(), operator.getOurDataSecret(), operator.getOurDataSecretIv());
      log.info("三方平台查询业务策略信息请求Data:" + decrypt);
      QueryEquipBusinessPolicy queryEquipBusinessPolicy = JSON.parseObject(decrypt, QueryEquipBusinessPolicy.class);
      
      //构建返回结果
@@ -705,10 +752,12 @@
         baseResult.setRet(4004);
         baseResult.setMsg("connectorID 参数无效");
         //参数加密
         String jsonString = JSON.toJSONString(queryEquipBusinessPolicyResult);
         String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv());
         String jsonString = JacksonUtils.toJson(queryEquipBusinessPolicyResult);
         log.info("三方平台查询业务策略信息响应Data:" + jsonString);
         String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
         baseResult.setData(encrypt);
         baseResult.setSig(buildSign(baseResult));
         baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
         log.info("三方平台查询业务策略信息响应参数:" + JacksonUtils.toJson(baseResult));
         return baseResult;
      }
      Integer accountingStrategyId = tChargingGun.getAccountingStrategyId();
@@ -722,10 +771,12 @@
         queryEquipBusinessPolicyResult.setFailReason(1);
         queryEquipBusinessPolicyResult.setSumPeriod(0);
         //参数加密
         String jsonString = JSON.toJSONString(queryEquipBusinessPolicyResult);
         String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv());
         String jsonString = JacksonUtils.toJson(queryEquipBusinessPolicyResult);
         log.info("三方平台查询业务策略信息响应Data:" + jsonString);
         String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
         baseResult.setData(encrypt);
         baseResult.setSig(buildSign(baseResult));
         baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
         log.info("三方平台查询业务策略信息响应参数:" + JacksonUtils.toJson(baseResult));
         return baseResult;
      }
      List<PolicyInfo> PolicyInfos = new ArrayList<>();
@@ -739,30 +790,79 @@
      queryEquipBusinessPolicyResult.setSumPeriod(PolicyInfos.size());
      queryEquipBusinessPolicyResult.setPolicyInfos(PolicyInfos);
      //参数加密
      String jsonString = JSON.toJSONString(queryEquipBusinessPolicyResult);
      String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv());
      String jsonString = JacksonUtils.toJson(queryEquipBusinessPolicyResult);
      log.info("三方平台查询业务策略信息响应Data:" + jsonString);
      String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
      baseResult.setData(encrypt);
      baseResult.setSig(buildSign(baseResult));
      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(buildSign(baseResult));
         baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
         log.info("三方平台请求开始充电响应参数:" + JacksonUtils.toJson(baseResult));
         return baseResult;
      }
      Operator operator = baseResult.getOperator();
      //解密参数
      String decrypt = AESUtil.decrypt(baseRequest.getData(), operator.getDataSecret(), operator.getDataSecretIv());
      String decrypt = AESUtil.decrypt(baseRequest.getData(), operator.getOurDataSecret(), operator.getOurDataSecretIv());
      log.info("三方平台请求开始充电请求Data:" + decrypt);
      QueryStartCharge queryStartCharge = JSON.parseObject(decrypt, QueryStartCharge.class);
      
      //构建返回结果
@@ -779,10 +879,12 @@
         result.setFailReason(1);
         result.setStartChargeSeqStat(5);
         //参数加密
         String jsonString = JSON.toJSONString(result);
         String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv());
         String jsonString = JacksonUtils.toJson(result);
         log.info("三方平台请求开始充电响应Data:" + jsonString);
         String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
         baseResult.setData(encrypt);
         baseResult.setSig(buildSign(baseResult));
         baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
         log.info("三方平台请求开始充电响应参数:" + JacksonUtils.toJson(baseResult));
         return baseResult;
      }
      //设备离线
@@ -791,19 +893,22 @@
         result.setFailReason(2);
         result.setStartChargeSeqStat(5);
         //参数加密
         String jsonString = JSON.toJSONString(result);
         String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv());
         String jsonString = JacksonUtils.toJson(result);
         log.info("三方平台请求开始充电响应Data:" + jsonString);
         String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
         baseResult.setData(encrypt);
         baseResult.setSig(buildSign(baseResult));
         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(query.get);
      addTripartitePlatformOrder.setPaymentAmount(queryStartCharge.getPaymentAmount());
      addTripartitePlatformOrder.setRechargePaymentType(queryStartCharge.getPaymentType());
      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()){
@@ -811,20 +916,24 @@
         result.setFailReason(1);
         result.setStartChargeSeqStat(2);
         //参数加密
         String jsonString = JSON.toJSONString(result);
         String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv());
         String jsonString = JacksonUtils.toJson(result);
         log.info("三方平台请求开始充电响应Data:" + jsonString);
         String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
         baseResult.setData(encrypt);
         baseResult.setSig(buildSign(baseResult));
         baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
         log.info("三方平台请求开始充电响应参数:" + JacksonUtils.toJson(baseResult));
         return baseResult;
      }
      result.setStartChargeSeqStat(1);
      result.setSuccStat(0);
      result.setFailReason(0);
      //参数加密
      String jsonString = JSON.toJSONString(result);
      String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv());
      String jsonString = JacksonUtils.toJson(result);
      log.info("三方平台请求开始充电响应Data:" + jsonString);
      String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
      baseResult.setData(encrypt);
      baseResult.setSig(buildSign(baseResult));
      baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
      log.info("三方平台请求开始充电响应参数:" + JacksonUtils.toJson(baseResult));
      return baseResult;
   }
   
@@ -838,11 +947,53 @@
   public R notificationStartChargeResult(@RequestBody StartChargeResult result){
      NotificationStartCharge notificationStartCharge = new NotificationStartCharge();
      BeanUtils.copyProperties(result, notificationStartCharge);
      com.ruoyi.integration.drainage.model.NotificationStartChargeResult notificationStartChargeResult = TCECUtil.notificationStartChargeResult(notificationStartCharge);
      Operator operator = operatorClient.getOperator(result.getOperatorID()).getData();
      com.ruoyi.integration.drainage.model.NotificationStartChargeResult notificationStartChargeResult = TCECUtil.notificationStartChargeResult(operator, notificationStartCharge);
      //启动重试推送机制
      if(null == notificationStartChargeResult || 1 == notificationStartChargeResult.getSuccStat()){
         ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
         threadPoolExecutor.execute(new Runnable() {
            //计数器
            Integer size = 0;
            @Override
            public void run() {
               NotificationStartChargeResult notificationStartChargeResult1 = TCECUtil.notificationStartChargeResult(operator, notificationStartCharge);
               //启动重试推送机制
               if(null != notificationStartChargeResult1 && 0 == notificationStartChargeResult1.getSuccStat()){
                  threadPoolExecutor.shutdown();
                  return;
               }
               size++;
               if(size >= 5){
                  threadPoolExecutor.shutdown();
                  return;
               }
               //间隔一分钟重试一次
               try {
                  Thread.sleep(60000);
               } catch (InterruptedException e) {
                  throw new RuntimeException(e);
               }
            }
         });
      }
      //定义定时任务推送订单状态
      ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
      Runnable task = new Runnable() {
         @Override
         public void run() {
            TChargingOrder chargingOrder = chargingOrderClient.getChargingOrderByStartChargeSeq(result.getStartChargeSeq()).getData();
            if(null == chargingOrder || chargingOrder.getStatus() != 3){
               scheduler.shutdown();
               return;
            }
            notificationEquipChargeStatus(result.getStartChargeSeq(), operator.getId());
         }
      };
      //一分钟执行一次
      scheduler.scheduleAtFixedRate(task, 1, 1, TimeUnit.MINUTES);
      return R.ok();
   }
   
@@ -854,24 +1005,30 @@
    */
   @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(buildSign(baseResult));
         baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
         log.info("三方平台查询充电状态响应参数:" + JacksonUtils.toJson(baseResult));
         return baseResult;
      }
      Operator operator = baseResult.getOperator();
      //解密参数
      String decrypt = AESUtil.decrypt(baseRequest.getData(), operator.getDataSecret(), operator.getDataSecretIv());
      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 = JSON.toJSONString(queryEquipChargeStatusResult);
      String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv());
      String jsonString = JacksonUtils.toJson(queryEquipChargeStatusResult);
      log.info("三方平台查询充电状态响应Data:" + jsonString);
      String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
      baseResult.setData(encrypt);
      baseResult.setSig(buildSign(baseResult));
      baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
      log.info("三方平台查询充电状态响应参数:" + JacksonUtils.toJson(baseResult));
      return baseResult;
   }
   
@@ -940,7 +1097,7 @@
      queryEquipChargeStatusResult.setVoltageA(chargingOrder.getVoltage());
      queryEquipChargeStatusResult.setSoc(chargingOrder.getTotalElectricity());
      queryEquipChargeStatusResult.setStartTime((null == chargingOrder.getStartTime() ? chargingOrder.getCreateTime() : chargingOrder.getStartTime()).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
      queryEquipChargeStatusResult.setEndTime((null == chargingOrder.getStartTime() ? LocalDateTime.now() : chargingOrder.getEndTime()).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());
      queryEquipChargeStatusResult.setElecMoney(chargingOrder.getTotalElectricity());
      queryEquipChargeStatusResult.setSeviceMoney(chargingOrder.getServiceCharge());
@@ -951,7 +1108,7 @@
      List<TChargingOrderAccountingStrategy> data = chargingOrderAccountingStrategyClient.getChargingOrderAccountingStrategyByOrderId(chargingOrder.getId()).getData();
      
      LocalDateTime startTime = chargingOrder.getStartTime();
      LocalDateTime endTime = chargingOrder.getEndTime();
      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) {
@@ -987,12 +1144,37 @@
    * @return
    */
   @PostMapping("/notificationEquipChargeStatus")
   public R notificationEquipChargeStatus(@RequestParam("startChargeSeq") String startChargeSeq){
   public R notificationEquipChargeStatus(@RequestParam(value = "startChargeSeq") String startChargeSeq, @RequestParam(value = "operatorId") Integer operatorId){
      QueryEquipChargeStatusResult queryEquipChargeStatusResult = buildQueryEquipChargeStatusResult(startChargeSeq);
      NotificationEquipChargeStatusResult notificationEquipChargeStatusResult = TCECUtil.notificationEquipChargeStatus(queryEquipChargeStatusResult);
      Operator operator = operatorClient.getOperatorById(operatorId).getData();
      NotificationEquipChargeStatusResult notificationEquipChargeStatusResult = TCECUtil.notificationEquipChargeStatus(operator, queryEquipChargeStatusResult);
      //启动重试推送机制
      if(null == notificationEquipChargeStatusResult || 1 == notificationEquipChargeStatusResult.getSuccStat()){
         ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
         threadPoolExecutor.execute(new Runnable() {
            //计数器
            Integer size = 0;
            @Override
            public void run() {
               NotificationEquipChargeStatusResult notificationEquipChargeStatusResult1 = TCECUtil.notificationEquipChargeStatus(operator, queryEquipChargeStatusResult);
               //启动重试推送机制
               if(null != notificationEquipChargeStatusResult1 && 0 == notificationEquipChargeStatusResult1.getSuccStat()){
                  threadPoolExecutor.shutdown();
                  return;
               }
               size++;
               if(size >= 5){
                  threadPoolExecutor.shutdown();
                  return;
               }
               //间隔一分钟重试一次
               try {
                  Thread.sleep(60000);
               } catch (InterruptedException e) {
                  throw new RuntimeException(e);
               }
            }
         });
      }
      return R.ok();
   }
@@ -1004,16 +1186,20 @@
    */
   @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(buildSign(baseResult));
         baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
         log.info("三方平台请求停止充电响应参数:" + JacksonUtils.toJson(baseResult));
         return baseResult;
      }
      Operator operator = baseResult.getOperator();
      //解密参数
      String decrypt = AESUtil.decrypt(baseRequest.getData(), operator.getDataSecret(), operator.getDataSecretIv());
      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());
@@ -1027,17 +1213,21 @@
         queryStopChargeResult.setSuccStat(1);
         queryStopChargeResult.setFailReason(3);
         //参数加密
         String jsonString = JSON.toJSONString(queryStopChargeResult);
         String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv());
         String jsonString = JacksonUtils.toJson(queryStopChargeResult);
         log.info("三方平台请求停止充电响应Data:" + jsonString);
         String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
         baseResult.setData(encrypt);
         baseResult.setSig(buildSign(baseResult));
         baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
         log.info("三方平台请求停止充电响应参数:" + JacksonUtils.toJson(baseResult));
         return baseResult;
      }
      //参数加密
      String jsonString = JSON.toJSONString(queryStopChargeResult);
      String encrypt = AESUtil.encrypt(jsonString, operator.getDataSecret(), operator.getDataSecretIv());
      String jsonString = JacksonUtils.toJson(queryStopChargeResult);
      log.info("三方平台请求停止充电响应Data:" + jsonString);
      String encrypt = AESUtil.encrypt(jsonString, operator.getOurDataSecret(), operator.getOurDataSecretIv());
      baseResult.setData(encrypt);
      baseResult.setSig(buildSign(baseResult));
      baseResult.setSig(TCECUtil.ourBuildSign(baseResult));
      log.info("三方平台请求停止充电响应参数:" + JacksonUtils.toJson(baseResult));
      return baseResult;
   }
   
@@ -1050,17 +1240,43 @@
    * @return
    */
   @PostMapping("/notificationStopChargeResult")
   public R notificationStopChargeResult(@RequestParam("startChargeSeq") String startChargeSeq, @RequestParam("connectorID") String connectorID){
   public R notificationStopChargeResult(@RequestParam("startChargeSeq") String startChargeSeq, @RequestParam("connectorID") String connectorID,
                                         @RequestParam("operatorId") Integer operatorId){
      Operator operator = operatorClient.getOperatorById(operatorId).getData();
      NotificationStopChargeResult info = new NotificationStopChargeResult();
      info.setStartChargeSeq(startChargeSeq);
      info.setStartChargeSeqStat(4);
      info.setConnectorID(connectorID);
      info.setSuccStat(0);
      info.setFailReason(0);
      NotificationStopCharge notificationStopCharge = TCECUtil.notificationStopChargeResult(info);
      NotificationStopCharge notificationStopCharge = TCECUtil.notificationStopChargeResult(operator, info);
      //启动重试推送机制
      if(null == notificationStopCharge || 1 == notificationStopCharge.getSuccStat()){
         ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
         threadPoolExecutor.execute(new Runnable() {
            //计数器
            Integer size = 0;
            @Override
            public void run() {
               NotificationStopCharge notificationStopCharge1 = TCECUtil.notificationStopChargeResult(operator, info);
               //启动重试推送机制
               if(null != notificationStopCharge1 && 0 == notificationStopCharge1.getSuccStat()){
                  threadPoolExecutor.shutdown();
                  return;
               }
               size++;
               if(size >= 5){
                  threadPoolExecutor.shutdown();
                  return;
               }
               //间隔一分钟重试一次
               try {
                  Thread.sleep(60000);
               } catch (InterruptedException e) {
                  throw new RuntimeException(e);
               }
            }
         });
      }
      return R.ok();
   }
@@ -1072,12 +1288,37 @@
    * @return
    */
   @PostMapping("/notificationChargeOrderInfo")
   public R notificationChargeOrderInfo(@RequestParam("startChargeSeq") String startChargeSeq){
   public R notificationChargeOrderInfo(@RequestParam("startChargeSeq") String startChargeSeq, @RequestParam("operatorId") Integer operatorId){
      NotificationChargeOrderInfo info = buildNotificationChargeOrderInfo(startChargeSeq);
      NotificationChargeOrderInfoResult notificationChargeOrderInfoResult = TCECUtil.notificationChargeOrderInfo(info);
      Operator operator = operatorClient.getOperatorById(operatorId).getData();
      NotificationChargeOrderInfoResult notificationChargeOrderInfoResult = TCECUtil.notificationChargeOrderInfo(operator, info);
      //启动重试推送机制
      if(null == notificationChargeOrderInfoResult || 1 == notificationChargeOrderInfoResult.getConfirmResult()){
         ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
         threadPoolExecutor.execute(new Runnable() {
            //计数器
            Integer size = 0;
            @Override
            public void run() {
               NotificationChargeOrderInfoResult notificationChargeOrderInfoResult1 = TCECUtil.notificationChargeOrderInfo(operator, info);
               //启动重试推送机制
               if(null != notificationChargeOrderInfoResult1 && 0 == notificationChargeOrderInfoResult1.getConfirmResult()){
                  threadPoolExecutor.shutdown();
                  return;
               }
               size++;
               if(size >= 5){
                  threadPoolExecutor.shutdown();
                  return;
               }
               //间隔一分钟重试一次
               try {
                  Thread.sleep(60000);
               } catch (InterruptedException e) {
                  throw new RuntimeException(e);
               }
            }
         });
      }
      return R.ok();
   }
@@ -1098,11 +1339,17 @@
      }
      notificationChargeOrderInfo.setConnectorID(chargingOrder.getChargingGunId().toString());
      notificationChargeOrderInfo.setStartTime((null == chargingOrder.getStartTime() ? chargingOrder.getCreateTime() : chargingOrder.getStartTime()).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
      notificationChargeOrderInfo.setEndTime((null == chargingOrder.getStartTime() ? LocalDateTime.now() : chargingOrder.getEndTime()).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());
      notificationChargeOrderInfo.setTotalElecMoney(chargingOrder.getTotalElectricity());
      notificationChargeOrderInfo.setTotalSeviceMoney(chargingOrder.getServiceCharge());
      notificationChargeOrderInfo.setTotalMoney(chargingOrder.getTotalElectricity().add(chargingOrder.getServiceCharge()));
      notificationChargeOrderInfo.setTotalDelayMoney(BigDecimal.ZERO);
      TParkingRecord parkingRecord = parkingRecordClient.getParkingRecordByChargingOrderId(chargingOrder.getId()).getData();
      if(null != parkingRecord && parkingRecord.getStatus() == 3){
         notificationChargeOrderInfo.setTotalDelayMoney(parkingRecord.getPayment());
      }
      //结束方式(0=异常终止,1=主动终止,2=满电终止,3=费用不足终止)
      switch (chargingOrder.getEndMode()){
         case 0:
@@ -1124,7 +1371,7 @@
      List<TChargingOrderAccountingStrategy> data = chargingOrderAccountingStrategyClient.getChargingOrderAccountingStrategyByOrderId(chargingOrder.getId()).getData();
      
      LocalDateTime startTime = chargingOrder.getStartTime();
      LocalDateTime endTime = chargingOrder.getEndTime();
      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) {
@@ -1152,4 +1399,201 @@
      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;
         }
         OrderInfo orderInfo = new OrderInfo();
         orderInfo.setStartChargeSeq(chargingOrder.getStartChargeSeq());
         orderInfo.setConnectorID(chargingOrder.getChargingGunId().toString());
         orderInfo.setStartTime((null == chargingOrder.getStartTime() ? chargingOrder.getCreateTime() : chargingOrder.getStartTime()).format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
         orderInfo.setEndTime((null == chargingOrder.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;
   }
}