From 36e7b299289c393c3460140dc966e83f9ea2e749 Mon Sep 17 00:00:00 2001 From: puzhibing <393733352@qq.com> Date: 星期二, 11 二月 2025 09:51:22 +0800 Subject: [PATCH] 修改bug --- ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECController.java | 748 +++++++++++++++++++++++++++++++++++++++++++++----------- 1 files changed, 596 insertions(+), 152 deletions(-) diff --git a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECController.java b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECController.java index 3aa324b..f931203 100644 --- a/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECController.java +++ b/ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/drainage/TCECController.java @@ -1,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; + } } -- Gitblit v1.7.1