From 2280e9af5e2656e61ad7d6418ad21adc6a9f8156 Mon Sep 17 00:00:00 2001 From: ZZ Date: Tue, 9 Nov 2021 16:29:53 +0800 Subject: [PATCH] =?UTF-8?q?WIP:=E4=B8=89=E6=96=B9=E5=AF=B9=E6=8E=A5?= =?UTF-8?q?=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/xhpc/evcs/dto/StartChargeRequest.java | 8 +- .../com/xhpc/evcs/encryption/Aes128Cbc.java | 7 +- evcs-modules/evcs-core/pom.xml | 1 + .../evcs/api/QueryEquipAuthController.java | 2 + .../QueryEquipBusinessPolicyController.java | 167 +++++------ .../evcs/api/QueryStartChargeController.java | 8 +- .../api/QueryStationStatusController.java | 18 +- .../xhpc/evcs/api/QueryTokenController.java | 95 +++--- .../java/com/xhpc/evcs/config/EvcsFilter.java | 122 ++++---- .../evcs/jpa/XhpcInternetUserRepository.java | 19 ++ evcs-modules/pom.xml | 2 +- .../com/xhpc/common/api/PileOrderService.java | 7 +- .../api/factory/PileOrderFallbackFactory.java | 2 +- .../xhpc/evcs/domain/XhpcInternetUser.java | 274 ++++++++++++++++++ .../order/api/XhpcPileOrderController.java | 14 +- .../com/xhpc/pp/logic/RealtimeDataLogic.java | 31 +- 16 files changed, 565 insertions(+), 212 deletions(-) create mode 100644 evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/jpa/XhpcInternetUserRepository.java create mode 100644 xhpc-modules/xhpc-common/src/main/java/com/xhpc/evcs/domain/XhpcInternetUser.java diff --git a/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/dto/StartChargeRequest.java b/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/dto/StartChargeRequest.java index cf065ca4..3d3796ac 100644 --- a/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/dto/StartChargeRequest.java +++ b/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/dto/StartChargeRequest.java @@ -15,7 +15,7 @@ public class StartChargeRequest { @JsonProperty("StartChargeSeq") String startChargeSeq; - @JsonProperty("ConnectorId") + @JsonProperty("ConnectorID") String connectorId; @JsonProperty("QRCode") @@ -24,10 +24,16 @@ public class StartChargeRequest { @JsonProperty("PlateNum") String plateNum; + @JsonProperty("CarPlateNo") + String plateNum2; + @JsonProperty("ChargingAmt") Integer chargingAmt; @JsonProperty("driverId") String driverId; + @JsonProperty("UserId") + String userId3rdpty; + } diff --git a/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/encryption/Aes128Cbc.java b/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/encryption/Aes128Cbc.java index 1bb4b113..bbee3ac8 100644 --- a/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/encryption/Aes128Cbc.java +++ b/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/encryption/Aes128Cbc.java @@ -63,7 +63,12 @@ public class Aes128Cbc { NoSuchAlgorithmException, IllegalBlockSizeException, UnsupportedEncodingException, NoSuchPaddingException, InvalidKeyException { - System.out.println(encrypt("{\"PageNo\": \"1\", \"PageSize\": 49}", "8LpncubmWiPCzY3V", "av6A8QdnRaVRMXu6")); + System.out.println(decryptString("6vjf229/jP0V/lvorkuYeRSKiv" + + "+A2CMWqPaFVhjebxCxkYmRObUp9I8EoXkHLoeHYRVZwlG47PQ1N4YIn6B5bvtpP4hmFkgHvNzg7UW5+GnCSKxV9RBXxGW" + + "/uWDiPQbgh6gflk4Ia/zvgD9ZLTyAXAm4in/dYovaWcHm08fZ" + + "+xfGoHENu1taQO7BcWidJJtmPkVAWECKTHEbcoFcZagKjHIJV5f7V8OrmawYGQqNmA8=", "8LpncubmWiPCzY3V", "av6A8QdnRaVRMXu6" + )); + //ujNoGsWRo5MyPKYOxeofKwgPEng3xF+yhM8DDjwtwHo= System.out.println(encrypt("{\"StationIDs\":[\"1\"]}", "8LpncubmWiPCzY3V", "av6A8QdnRaVRMXu6")); System.out.println(encrypt("{\"OperatorID\":\"MA5FNJXW9\", \"OperatorSecret\":\"Ut5UFdqDthiJyncU\"}", "8LpncubmWiPCzY3V", "av6A8QdnRaVRMXu6")); diff --git a/evcs-modules/evcs-core/pom.xml b/evcs-modules/evcs-core/pom.xml index c10b40e9..871936d9 100644 --- a/evcs-modules/evcs-core/pom.xml +++ b/evcs-modules/evcs-core/pom.xml @@ -14,6 +14,7 @@ com.xhpc evcs-common 1.0 + compile mysql diff --git a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/QueryEquipAuthController.java b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/QueryEquipAuthController.java index e7b74c9a..31f1356d 100644 --- a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/QueryEquipAuthController.java +++ b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/QueryEquipAuthController.java @@ -53,6 +53,8 @@ public class QueryEquipAuthController { String terminalStatus = (String) realTimeTerminalData.get("vehicleGunStatus"); if ("否".equals(terminalStatus)) { resp.setMsg("gun is not plugging"); + resp.setRet("1"); + equipAuthResponse.setSuccStat(1); equipAuthResponse.setFailReason(1); } else { resp.setMsg("success"); diff --git a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/QueryEquipBusinessPolicyController.java b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/QueryEquipBusinessPolicyController.java index bc8ce2d4..d7ec442c 100644 --- a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/QueryEquipBusinessPolicyController.java +++ b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/QueryEquipBusinessPolicyController.java @@ -39,96 +39,97 @@ public class QueryEquipBusinessPolicyController { commonResponse.setRet("1"); return commonResponse; } - Long rateModelId = (Long) cachePile.get("rateModelId"); - CacheRateModel rateModel = REDIS.getCacheObject("rateModel:" + rateModelId); - String[] tfPricesSeq = rateModel.getTfPricesSeq(); - - //存储时段 ArrayList modelTypes = new ArrayList<>(); //存储时段个数 ArrayList modelCount = new ArrayList<>(); - //建立对应时段的映射Map集合,存放其对应的价格和服务费 - Map timeMap = new HashMap<>(); - //个数计数器 - int count = 0; - //最后一个时段的前一个时段的下标索引 - int index = 0; - //遍历获取每一个时段 - for (int i = 0; i < tfPricesSeq.length - 1; i++) { - count++; - //如果当前时段与后面的时段不相同,则表示当前时段已经结束,添加当前时段到list中,并将其坐标存放到另一个集合中。 - if (!tfPricesSeq[i].equals(tfPricesSeq[i + 1])) { - //将每段时间的索引,赋值 - index = i; - modelTypes.add(tfPricesSeq[i]); - modelCount.add(count); - //如果这段时段结束,则重置计数器 - count = 0; + Long rateModelId = (Long) cachePile.get("rateModelId"); + CacheRateModel rateModel = REDIS.getCacheObject("rateModel:" + rateModelId); + PolicyInfos[] policyInfosArr = new PolicyInfos[0]; + if (rateModel != null) { + String[] tfPricesSeq = rateModel.getTfPricesSeq(); + //存储时段 + //建立对应时段的映射Map集合,存放其对应的价格和服务费 + Map timeMap = new HashMap<>(); + //个数计数器 + int count = 0; + //最后一个时段的前一个时段的下标索引 + int index = 0; + //遍历获取每一个时段 + for (int i = 0; i < tfPricesSeq.length - 1; i++) { + count++; + //如果当前时段与后面的时段不相同,则表示当前时段已经结束,添加当前时段到list中,并将其坐标存放到另一个集合中。 + if (!tfPricesSeq[i].equals(tfPricesSeq[i + 1])) { + //将每段时间的索引,赋值 + index = i; + modelTypes.add(tfPricesSeq[i]); + modelCount.add(count); + //如果这段时段结束,则重置计数器 + count = 0; + } } - } - //获取最后一个时段的费率值 - String lastModelType = tfPricesSeq[tfPricesSeq.length - 1]; - //放入到类型list中 - modelTypes.add(lastModelType); - //获取最后一个时段的费率的个数 - int lastCount = (tfPricesSeq.length - 1) - index; - //放入到个数List中 - modelCount.add(lastCount); + //获取最后一个时段的费率值 + String lastModelType = tfPricesSeq[tfPricesSeq.length - 1]; + //放入到类型list中 + modelTypes.add(lastModelType); + //获取最后一个时段的费率的个数 + int lastCount = (tfPricesSeq.length - 1) - index; + //放入到个数List中 + modelCount.add(lastCount); - //获取各个类型的时段的时间区间,并将其存放至timeList集合中。 - //定义一个初始时间段 - String initTime = "000000"; - //添加临时存储变量 - int temp = -1; - ArrayList timeList = new ArrayList<>(); - //放入必有初始时间 - timeList.add(initTime); - //根据出现的时段个数确定他们的时间区间,然后存放至List集合中 - for (int i = 0; i < modelCount.size() - 1; i++) { - if (temp != -1) { - Integer integer = modelCount.get(i); - int hours = integer / 2; - temp = temp + hours; - String hoursStr = String.format("%02d", temp); - String finalTime = hoursStr + "0000"; - timeList.add(finalTime); - } else { - Integer integer = modelCount.get(i); - int hours = integer / 2; - //记录中间时间 - temp = hours; - String hoursStr = String.format("%02d", temp); - String finalTime = hoursStr + "0000"; - timeList.add(finalTime); + //获取各个类型的时段的时间区间,并将其存放至timeList集合中。 + //定义一个初始时间段 + String initTime = "000000"; + //添加临时存储变量 + int temp = -1; + ArrayList timeList = new ArrayList<>(); + //放入必有初始时间 + timeList.add(initTime); + //根据出现的时段个数确定他们的时间区间,然后存放至List集合中 + for (int i = 0; i < modelCount.size() - 1; i++) { + if (temp != -1) { + Integer integer = modelCount.get(i); + int hours = integer / 2; + temp = temp + hours; + String hoursStr = String.format("%02d", temp); + String finalTime = hoursStr + "0000"; + timeList.add(finalTime); + } else { + Integer integer = modelCount.get(i); + int hours = integer / 2; + //记录中间时间 + temp = hours; + String hoursStr = String.format("%02d", temp); + String finalTime = hoursStr + "0000"; + timeList.add(finalTime); + } } - } - - PolicyInfos[] policyInfosArr = new PolicyInfos[timeList.size()]; - for (int i = 0; i <= timeList.size() - 1; i++) { - PolicyInfos policyInfos = new PolicyInfos(); - policyInfos.setStartTime(timeList.get(i)); - String modelType = modelTypes.get(i); - switch (modelType) { - case "00": - policyInfos.setServicePrice(BigDecimal.valueOf((long) rateModel.getT1SvcPrice()).divide(BigDecimal.valueOf(100000L)).setScale(4).doubleValue()); - policyInfos.setElecPrice(BigDecimal.valueOf((long) rateModel.getT1Price()).divide(BigDecimal.valueOf(100000L)).setScale(4).doubleValue()); - break; - case "01": - policyInfos.setServicePrice(BigDecimal.valueOf((long) rateModel.getT2SvcPrice()).divide(BigDecimal.valueOf(100000L)).setScale(4).doubleValue()); - policyInfos.setElecPrice(BigDecimal.valueOf((long) rateModel.getT2Price()).divide(BigDecimal.valueOf(100000L)).setScale(4).doubleValue()); - break; - case "02": - policyInfos.setServicePrice(BigDecimal.valueOf((long) rateModel.getT3SvcPrice()).divide(BigDecimal.valueOf(100000L)).setScale(4).doubleValue()); - policyInfos.setElecPrice(BigDecimal.valueOf((long) rateModel.getT3Price()).divide(BigDecimal.valueOf(100000L)).setScale(4).doubleValue()); - break; - case "03": - policyInfos.setServicePrice(BigDecimal.valueOf((long) rateModel.getT4SvcPrice()).divide(BigDecimal.valueOf(100000L)).setScale(4).doubleValue()); - policyInfos.setElecPrice(BigDecimal.valueOf((long) rateModel.getT4Price()).divide(BigDecimal.valueOf(100000L)).setScale(4).doubleValue()); - break; - default: - break; + policyInfosArr = new PolicyInfos[timeList.size()]; + for (int i = 0; i <= timeList.size() - 1; i++) { + PolicyInfos policyInfos = new PolicyInfos(); + policyInfos.setStartTime(timeList.get(i)); + String modelType = modelTypes.get(i); + switch (modelType) { + case "00": + policyInfos.setServicePrice(BigDecimal.valueOf((long) rateModel.getT1SvcPrice()).divide(BigDecimal.valueOf(100000L)).setScale(4).doubleValue()); + policyInfos.setElecPrice(BigDecimal.valueOf((long) rateModel.getT1Price()).divide(BigDecimal.valueOf(100000L)).setScale(4).doubleValue()); + break; + case "01": + policyInfos.setServicePrice(BigDecimal.valueOf((long) rateModel.getT2SvcPrice()).divide(BigDecimal.valueOf(100000L)).setScale(4).doubleValue()); + policyInfos.setElecPrice(BigDecimal.valueOf((long) rateModel.getT2Price()).divide(BigDecimal.valueOf(100000L)).setScale(4).doubleValue()); + break; + case "02": + policyInfos.setServicePrice(BigDecimal.valueOf((long) rateModel.getT3SvcPrice()).divide(BigDecimal.valueOf(100000L)).setScale(4).doubleValue()); + policyInfos.setElecPrice(BigDecimal.valueOf((long) rateModel.getT3Price()).divide(BigDecimal.valueOf(100000L)).setScale(4).doubleValue()); + break; + case "03": + policyInfos.setServicePrice(BigDecimal.valueOf((long) rateModel.getT4SvcPrice()).divide(BigDecimal.valueOf(100000L)).setScale(4).doubleValue()); + policyInfos.setElecPrice(BigDecimal.valueOf((long) rateModel.getT4Price()).divide(BigDecimal.valueOf(100000L)).setScale(4).doubleValue()); + break; + default: + break; + } + policyInfosArr[i] = policyInfos; } - policyInfosArr[i] = policyInfos; } //封装数据 diff --git a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/QueryStartChargeController.java b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/QueryStartChargeController.java index 478b5595..0d351622 100644 --- a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/QueryStartChargeController.java +++ b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/QueryStartChargeController.java @@ -51,13 +51,16 @@ public class QueryStartChargeController { resp.setMsg("This 3rd has no token"); } else { // invoke a order making interface(finished); - R res = pileOrderService.pileStartUpBy3rd(startChargeSeq, startChargeRequest.getDriverId(), startChargeRequest.getChargingAmt(), startChargeRequest.getPlateNum(), 0, connectorID); + String plateNum = startChargeRequest.getPlateNum(); + plateNum = plateNum == null ? startChargeRequest.getPlateNum2() : plateNum; + R res = pileOrderService.pileStartUpBy3rd(startChargeSeq, startChargeRequest.getDriverId(), + startChargeRequest.getChargingAmt(), plateNum, 0, connectorID); startChargeResponse.setStartChargeSeq(startChargeSeq); startChargeResponse.setConnectorID(connectorID); if (res.getCode() != 200) { startChargeResponse.setSuccStat(1); startChargeResponse.setFailReason(0); - startChargeResponse.setStartChargeSeqStat(5); + startChargeResponse.setStartChargeSeqStat(4); } else { Map etOrderData = (Map) res.getData(); EtOrderMapping etOrderMapping = new EtOrderMapping(); @@ -81,6 +84,7 @@ public class QueryStartChargeController { pushOrder.put("chargeOrderInfoNotificationStat", 0); REDIS.setCacheMap("pushOrder:".concat(orderNo), pushOrder); } + resp.setMsg(res.getMsg()); resp.setRet(String.valueOf(res.getCode())); } resp.setData(JSONUtil.toJSONString(startChargeResponse)); diff --git a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/QueryStationStatusController.java b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/QueryStationStatusController.java index b13f079d..23e85818 100644 --- a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/QueryStationStatusController.java +++ b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/QueryStationStatusController.java @@ -46,9 +46,9 @@ public class QueryStationStatusController { if (null != chargingStationDto) { pileIds = chargingStationDto.getPiles(); } + boolean existsGun = false; + List connectorStatusInfos = new ArrayList<>(); for (String pileId : pileIds) { - boolean existsGun = false; - List connectorStatusInfos = new ArrayList<>(); for (String value : gunsIds) { if (pileId.equals(value.substring(0, 14))) { existsGun = true; @@ -63,12 +63,12 @@ public class QueryStationStatusController { connectorStatusInfos.add(connectorStatusInfo); } } - if (existsGun) { - StationStatusInfo stationStatusInfo = new StationStatusInfo(); - stationStatusInfo.setStationID(stationID); - stationStatusInfo.setConnectorStatusInfos(connectorStatusInfos); - stationStatusInfos.add(stationStatusInfo); - } + } + if (existsGun) { + StationStatusInfo stationStatusInfo = new StationStatusInfo(); + stationStatusInfo.setStationID(stationID); + stationStatusInfo.setConnectorStatusInfos(connectorStatusInfos); + stationStatusInfos.add(stationStatusInfo); } } @@ -79,7 +79,7 @@ public class QueryStationStatusController { } CommonResponse resp = new CommonResponse(); resp.setRet("0"); - resp.setMsg(""); + resp.setMsg("Query station status success"); resp.setData(JSONUtil.toJSONString(stationStatusInfoWrappers)); return resp; } diff --git a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/QueryTokenController.java b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/QueryTokenController.java index 4d8d9992..5ebd15d1 100644 --- a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/QueryTokenController.java +++ b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/api/QueryTokenController.java @@ -1,15 +1,14 @@ package com.xhpc.evcs.api; -import com.fasterxml.jackson.databind.JsonNode; -import com.xhpc.evcs.config.EvcsFilter; import com.xhpc.evcs.domain.AuthSecretToken; +import com.xhpc.evcs.domain.XhpcInternetUser; import com.xhpc.evcs.dto.CommonResponse; import com.xhpc.evcs.dto.TokenRequest; import com.xhpc.evcs.dto.TokenResponse; import com.xhpc.evcs.jpa.AuthSecretTokenRepository; +import com.xhpc.evcs.jpa.XhpcInternetUserRepository; import com.xhpc.evcs.utils.JSONUtil; import lombok.extern.slf4j.Slf4j; -import org.joda.time.DateTime; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -17,7 +16,10 @@ import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RestController; import java.io.IOException; -import java.nio.charset.StandardCharsets; +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.time.temporal.ChronoUnit; import java.util.Calendar; import java.util.Date; import java.util.UUID; @@ -28,6 +30,8 @@ public class QueryTokenController { @Autowired private AuthSecretTokenRepository authSecretTokenRepository; + @Autowired + private XhpcInternetUserRepository xhpcInternetUserRepository; @PostMapping("/v1/query_token") public CommonResponse queryToken(@RequestHeader(value = "enc.out", defaultValue = "true") String encout, @@ -37,55 +41,66 @@ public class QueryTokenController { CommonResponse resp = new CommonResponse(); resp.setRet("0"); resp.setMsg(""); + String decodedData = (String) tokenRequest.getAdditionalProperties().get("Data"); + try { + tokenRequest = JSONUtil.readParams(decodedData, TokenRequest.class); + } catch (Exception e) { + log.error("invalid Data string: {}", decodedData); + } String operatorID = tokenRequest.getOperatorId(); TokenResponse tokenResponse = new TokenResponse(); tokenResponse.setOperatorId("MA6DFCTD5"); tokenResponse.setSuccStat(0); tokenResponse.setFailReason(0); String data = null; - AuthSecretToken authSecretTokenIn = - authSecretTokenRepository.findByOperatorId3irdptyAndSecretTokenTypeAndOperatorSecret( - operatorID, AuthSecretToken.SECRET_TOKEN_TYPE_IN, tokenRequest.getOperatorSecret()).orElse(null); - if (authSecretTokenIn == null) { - resp.setRet("4003"); - resp.setMsg("Invalid OperatorID/Secret"); - tokenResponse.setSuccStat(1); - tokenResponse.setFailReason(2); - resp.setData(data); - } else { - String token; - if (authSecretTokenIn.getTokenExpiry() != null && !authSecretTokenIn.getTokenExpiry().before(Calendar.getInstance().getTime())) { - token = authSecretTokenIn.getToken(); - } else { - token = UUID.randomUUID().toString().replaceAll("-", ""); - authSecretTokenIn.setToken(token); - authSecretTokenIn.setTokenExpiry(getTokenExpiry()); - authSecretTokenRepository.save(authSecretTokenIn); + XhpcInternetUser xhpcInternetUser = + xhpcInternetUserRepository.findByOperatorIdEvcsAndCooperationStartTimeBeforeAndCooperationEndTimeAfter(tokenRequest.getOperatorId(), Instant.now(), Instant.now()); + if (xhpcInternetUser != null) { + String operatorSecret = tokenRequest.getOperatorSecret(); + if (operatorSecret == null) { + operatorSecret = tokenRequest.getOperatorSecret(); } - tokenResponse.setAccessToken(token); - tokenResponse.setTokenAvailableTime(7200); - tokenResponse.setSuccStat(0); - tokenResponse.setFailReason(0); - resp.setMsg("Query token success"); - resp.setData(JSONUtil.toJSONString(tokenResponse)); - byte[] buf = JSONUtil.toJSONString(resp).getBytes(StandardCharsets.UTF_8); - log.debug("out.plain: {}", new String(buf, StandardCharsets.UTF_8)); - if (!encout.equalsIgnoreCase("false") || !authSecretTokenIn.isEncrypt()) { - final JsonNode encrypt = EvcsFilter.encryptRespOut(authSecretTokenIn.getDataSecret(), - authSecretTokenIn.getDataSecretIV(), authSecretTokenIn.getSigSecret(), buf); - resp.setData(encrypt.get("Data")); - resp.setSig(encrypt.get("Sig").asText()); - log.debug("out.enc: {}", resp); + AuthSecretToken authSecretTokenIn = + authSecretTokenRepository.findByOperatorId3irdptyAndSecretTokenTypeAndOperatorSecret( + operatorID, AuthSecretToken.SECRET_TOKEN_TYPE_IN, operatorSecret).orElse(null); + if (authSecretTokenIn == null) { + resp.setRet("4003"); + resp.setMsg("Invalid OperatorID/Secret"); + tokenResponse.setSuccStat(1); + tokenResponse.setFailReason(2); + resp.setData(data); + } else { + String token; + if (authSecretTokenIn.getTokenExpiry() != null && !authSecretTokenIn.getTokenExpiry().before(Calendar.getInstance().getTime())) { + token = authSecretTokenIn.getToken(); + } else { + token = UUID.randomUUID().toString().replaceAll("-", ""); + authSecretTokenIn.setToken(token); + authSecretTokenIn.setTokenExpiry(getTokenExpiry(xhpcInternetUser)); + authSecretTokenRepository.save(authSecretTokenIn); + } + tokenResponse.setAccessToken(token); + Instant te = authSecretTokenIn.getTokenExpiry().toInstant(); + tokenResponse.setTokenAvailableTime(Long.valueOf(ChronoUnit.SECONDS.between(Instant.now(), te)).intValue()); + tokenResponse.setSuccStat(0); + tokenResponse.setFailReason(0); + resp.setMsg("Query token success"); + resp.setData(JSONUtil.toJSONString(tokenResponse)); } } return resp; } - private Date getTokenExpiry() { + private Date getTokenExpiry(XhpcInternetUser xhpcInternetUser) { - DateTime dt = new DateTime(); - dt = dt.plusSeconds(7200); - return dt.toDate(); + Instant cooperationEndTime = xhpcInternetUser.getCooperationEndTime(); + LocalDateTime now = LocalDateTime.now(); + Instant tokenEndtime = now.plusSeconds(7200).toInstant(ZoneId.systemDefault().getRules().getOffset(now)); + if (tokenEndtime.isAfter(cooperationEndTime)) { + return Date.from(cooperationEndTime); + } else { + return Date.from(tokenEndtime); + } } } diff --git a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/config/EvcsFilter.java b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/config/EvcsFilter.java index bf3d2d27..5510631c 100644 --- a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/config/EvcsFilter.java +++ b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/config/EvcsFilter.java @@ -79,7 +79,10 @@ public class EvcsFilter extends OncePerRequestFilter { AuthSecretToken authSecretTokenIn; Date now = Calendar.getInstance().getTime(); ContentCachingResponseWrapper responseWrapper = new ContentCachingResponseWrapper(response); - if (authorization != null && authorization.startsWith("Bearer ")) { + if (servletPath.endsWith("query_token")) { + handleQueryToken(request, response, chain, requestWrapper, bodyString, commonRequest, operatorId, + responseWrapper); + } else if (authorization != null && authorization.startsWith("Bearer ")) { String token = authorization.substring(7); authSecretTokenIn = authSecretTokenRepository.findByOperatorId3irdptyAndSecretTokenTypeAndTokenExpiryGreaterThan( @@ -94,41 +97,6 @@ public class EvcsFilter extends OncePerRequestFilter { chain.doFilter(requestWrapper, responseWrapper); return; } - } else if (authorization == null) { //todo giv't better arrangement - if (servletPath.endsWith("/query_token")) { - authSecretTokenIn = authSecretTokenRepository.findByOperatorId3irdptyAndSecretTokenType(operatorId, - AuthSecretToken.SECRET_TOKEN_TYPE_IN).orElse(null); - if (authSecretTokenIn == null) { - CommonResponse resp = new CommonResponse(); - resp.setRet("4003"); - resp.setMsg("Invalid OperatorID"); - String data = JSONUtil.toJSONString(resp); - response.getOutputStream().write(data.getBytes(StandardCharsets.UTF_8)); - -// response.setStatus(403); - responseWrapper = new ContentCachingResponseWrapper(response); - chain.doFilter(requestWrapper, responseWrapper); - return; - } else { - final byte[] decrypt; - try { - decrypt = decrypt(request, authSecretTokenIn, commonRequest, bodyString); - } catch (BadPaddingException | InvalidAlgorithmParameterException | NoSuchAlgorithmException | IllegalBlockSizeException | NoSuchPaddingException | InvalidKeyException e) { - e.printStackTrace(); - CommonResponse resp = new CommonResponse(); - resp.setRet("4003"); - resp.setMsg("Invalid Encryption"); - String data = JSONUtil.toJSONString(resp); - response.getOutputStream().write(data.getBytes(StandardCharsets.UTF_8)); - - chain.doFilter(requestWrapper, responseWrapper); - return; - } - ((HttpServletRequestRepeatReadWrapper) requestWrapper).setBody(decrypt); - chain.doFilter(requestWrapper, response); - return; - } - } } //decrypt request byte[] decryptedReq = null; @@ -136,22 +104,26 @@ public class EvcsFilter extends OncePerRequestFilter { CommonResponse resp = new CommonResponse(); authSecretTokenIn = authSecretTokenRepository.findByOperatorId3irdptyAndSecretTokenType(operatorId, AuthSecretToken.SECRET_TOKEN_TYPE_IN).orElse(null); - if (authSecretTokenIn != null - && now.before(authSecretTokenIn.getTokenExpiry()) - && authorization != null && authorization.substring(7).equals(authSecretTokenIn.getToken())) { - try { - if (authSecretTokenIn.isEncrypt() && !"false".equals(encin)) { - decryptedReq = decrypt(request, authSecretTokenIn, commonRequest, bodyString); - } else { - decryptedReq = commonRequest.getData().getBytes(StandardCharsets.UTF_8); + if (authSecretTokenIn != null) { + if (servletPath.endsWith("query_token") || + (now.before(authSecretTokenIn.getTokenExpiry()) + && authorization != null && authorization.substring(7).equals(authSecretTokenIn.getToken()))) { + try { + if (authSecretTokenIn.isEncrypt() && !"false".equals(encin)) { + decryptedReq = decrypt(request, authSecretTokenIn, commonRequest, bodyString); + } else { + String data = commonRequest.getData(); + if (data == null) data = bodyString; + decryptedReq = data.getBytes(StandardCharsets.UTF_8); + } + commonRequest.setData(new String(decryptedReq)); + log.debug("in.dec: {}", commonRequest); + } catch (BadPaddingException | InvalidAlgorithmParameterException | NoSuchAlgorithmException | IllegalBlockSizeException | NoSuchPaddingException | InvalidKeyException e) { + erroMsg = e.getMessage(); } - commonRequest.setData(new String(decryptedReq)); - log.debug("in.dec: {}", commonRequest); - } catch (BadPaddingException | InvalidAlgorithmParameterException | NoSuchAlgorithmException | IllegalBlockSizeException | NoSuchPaddingException | InvalidKeyException e) { - erroMsg = e.getMessage(); + } else { + erroMsg = "Authorization error, check OperatorID or token expiry"; } - } else { - erroMsg = "Authorization error, check OperatorID or token expiry"; } if (decryptedReq != null && decryptedReq.length > 0) { requestWrapper = new HttpServletRequestWritableWrapper(request, @@ -193,11 +165,47 @@ public class EvcsFilter extends OncePerRequestFilter { resp.setMsg("Encryption error"); String data = JSONUtil.toJSONString(resp); response.getOutputStream().write(data.getBytes(StandardCharsets.UTF_8)); - chain.doFilter(requestWrapper, responseWrapper); +// chain.doFilter(requestWrapper, responseWrapper); } } } + private void handleQueryToken(HttpServletRequest request, + HttpServletResponse response, FilterChain chain, + ServletRequest requestWrapper, String bodyString, CommonRequest commonRequest, + String operatorId, + ContentCachingResponseWrapper responseWrapper) throws IOException, ServletException { + + AuthSecretToken authSecretTokenIn = authSecretTokenRepository.findByOperatorId3irdptyAndSecretTokenType(operatorId, + AuthSecretToken.SECRET_TOKEN_TYPE_IN).orElse(null); + if (authSecretTokenIn == null) { + CommonResponse resp = new CommonResponse(); + resp.setRet("4003"); + resp.setMsg("Invalid OperatorID"); + String data = JSONUtil.toJSONString(resp); + response.getOutputStream().write(data.getBytes(StandardCharsets.UTF_8)); +// response.setStatus(403); + responseWrapper = new ContentCachingResponseWrapper(response); +// chain.doFilter(requestWrapper, responseWrapper); + } else { + final byte[] decrypt; + try { + decrypt = decrypt(request, authSecretTokenIn, commonRequest, bodyString); + } catch (BadPaddingException | InvalidAlgorithmParameterException | NoSuchAlgorithmException | IllegalBlockSizeException | NoSuchPaddingException | InvalidKeyException e) { + e.printStackTrace(); + CommonResponse resp = new CommonResponse(); + resp.setRet("4003"); + resp.setMsg("Invalid Encryption"); + String data = JSONUtil.toJSONString(resp); + response.getOutputStream().write(data.getBytes(StandardCharsets.UTF_8)); +// chain.doFilter(requestWrapper, responseWrapper); + return; + } + ((HttpServletRequestRepeatReadWrapper) requestWrapper).setBody(decrypt); +// chain.doFilter(requestWrapper, response); + } + } + private byte[] internalError() { CommonResponse resp = new CommonResponse(); @@ -295,11 +303,13 @@ public class EvcsFilter extends OncePerRequestFilter { JsonNode timestampNode = rootNode.path("TimeStamp"); JsonNode seqNode = rootNode.path("Seq"); if (!dataNode.isNull()) { - String computedSig = HMAC.hmacDigest( - operatorIDNode.asText().concat(dataNode.asText()).concat(timestampNode.asText()).concat(seqNode.asText()), - authSecretToken.getSigSecret()); - if ((encin == null || !"false".equals(encin)) && !computedSig.equals(sigNode.asText())) { - throw new InvalidAlgorithmParameterException("Illegal Sig, computed: ".concat(computedSig)); + if (!dataNode.asText().startsWith("{")) { + String computedSig = HMAC.hmacDigest( + operatorIDNode.asText().concat(dataNode.asText()).concat(timestampNode.asText()).concat(seqNode.asText()), + authSecretToken.getSigSecret()); + if ((encin == null || !"false".equals(encin)) && !computedSig.equals(sigNode.asText())) { + throw new InvalidAlgorithmParameterException("Illegal Sig, computed: ".concat(computedSig)); + } } String rawData = dataNode.asText(); String decryptedData = rawData; diff --git a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/jpa/XhpcInternetUserRepository.java b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/jpa/XhpcInternetUserRepository.java new file mode 100644 index 00000000..c1469354 --- /dev/null +++ b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/jpa/XhpcInternetUserRepository.java @@ -0,0 +1,19 @@ +package com.xhpc.evcs.jpa; + +import com.xhpc.evcs.domain.XhpcInternetUser; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; +import org.springframework.data.repository.query.QueryByExampleExecutor; +import org.springframework.stereotype.Repository; + +import java.time.Instant; + +@Repository +public interface XhpcInternetUserRepository extends JpaRepository, + QueryByExampleExecutor, JpaSpecificationExecutor { + + XhpcInternetUser findByOperatorIdEvcsAndCooperationStartTimeBeforeAndCooperationEndTimeAfter(String operatorId3rdpty, + Instant now, Instant now2); + + +} diff --git a/evcs-modules/pom.xml b/evcs-modules/pom.xml index 05ac9269..e4654c73 100644 --- a/evcs-modules/pom.xml +++ b/evcs-modules/pom.xml @@ -14,8 +14,8 @@ 1.0 - evcs-core evcs-common + evcs-core diff --git a/xhpc-modules/xhpc-common/src/main/java/com/xhpc/common/api/PileOrderService.java b/xhpc-modules/xhpc-common/src/main/java/com/xhpc/common/api/PileOrderService.java index 0adb8c16..56f9a2c6 100644 --- a/xhpc-modules/xhpc-common/src/main/java/com/xhpc/common/api/PileOrderService.java +++ b/xhpc-modules/xhpc-common/src/main/java/com/xhpc/common/api/PileOrderService.java @@ -67,5 +67,10 @@ public interface PileOrderService { @GetMapping(value = "/chargeOrder/pileStartUpBy3rd") - R pileStartUpBy3rd(@RequestParam(value = "internetSerialNumber") String internetSerialNumber, @RequestParam(value = "driverId") String driverId, @RequestParam(value = "chargingAmt") Integer chargingAmt, @RequestParam(value = "plateNum", required = false) String plateNum, @RequestParam(value = "status") Integer status, @RequestParam(value = "connectorId") String connectorId); + R pileStartUpBy3rd(@RequestParam(value = "internetSerialNumber") String internetSerialNumber, + @RequestParam(value = "driverId", required = false) String driverId, + @RequestParam(value = "chargingAmt", required = false, defaultValue = "500") Integer chargingAmt, + @RequestParam(value = "plateNum", required = false) String plateNum, + @RequestParam(value = "status") Integer status, + @RequestParam(value = "connectorId") String connectorId); } diff --git a/xhpc-modules/xhpc-common/src/main/java/com/xhpc/common/api/factory/PileOrderFallbackFactory.java b/xhpc-modules/xhpc-common/src/main/java/com/xhpc/common/api/factory/PileOrderFallbackFactory.java index b9c99658..3f76c1d5 100644 --- a/xhpc-modules/xhpc-common/src/main/java/com/xhpc/common/api/factory/PileOrderFallbackFactory.java +++ b/xhpc-modules/xhpc-common/src/main/java/com/xhpc/common/api/factory/PileOrderFallbackFactory.java @@ -54,7 +54,7 @@ public class PileOrderFallbackFactory implements FallbackFactory cacheOrder = REDIS.getCacheMap(orderkey); - List realtimeDataList = (List) cacheOrder.get("realtimeDataList"); if (!orderNo.equals("00000000000000000000000000000000") && statusInt == 3) { + List realtimeDataList = (List) cacheOrder.get("realtimeDataList"); cacheGun.put("idleCnt", 0); if (realtimeDataList == null) { realtimeDataList = new ArrayList<>(); @@ -177,14 +174,22 @@ public class RealtimeDataLogic implements ServiceLogic { Integer idleCnt = (Integer) cacheGun.get("idleCnt"); idleCnt = idleCnt == null ? 0 : idleCnt; idleCnt++; - if (idleCnt > 3 && orderkey != null) { - Map problematicOrder = REDIS.getCacheMap(orderkey); - Object orderData = problematicOrder.get("orderData"); - String status = (String) problematicOrder.get("status"); - if (!isInteger(status) && !status.equals("充电中") && orderData == null) { - pileOrderService.abnormalOrder(orderNo); - cacheGun.put("orderkey", null); - idleCnt = 0; + if (idleCnt > 3) { + if (orderkey != null) { + Map problematicOrder = REDIS.getCacheMap(orderkey); + Object orderData = problematicOrder.get("orderData"); + String status = (String) problematicOrder.get("status"); + if (!isInteger(status) && !status.equals("充电中") && orderData == null) { + pileOrderService.abnormalOrder(orderNo); + log.error("abnormal order[{}]", orderNo); + cacheGun.put("orderkey", null); + idleCnt = 0; + } + } else { + Collection cacheOrderKyes = REDIS.keys("order:".concat(terminalId).concat("*")); + for (String cacheOrderKye : cacheOrderKyes) { + + } } } cacheGun.put("idleCnt", idleCnt);