diff --git a/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/dto/CancelOrderRequest.java b/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/dto/CancelOrderRequest.java new file mode 100644 index 00000000..ed266087 --- /dev/null +++ b/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/dto/CancelOrderRequest.java @@ -0,0 +1,19 @@ +package com.xhpc.evcs.dto; + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * @Author HongYun on 2021/11/8 + */ +@Getter +@Setter +@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY, getterVisibility = JsonAutoDetect.Visibility.NONE, + setterVisibility = JsonAutoDetect.Visibility.NONE, creatorVisibility = JsonAutoDetect.Visibility.NONE) +public class CancelOrderRequest { + + @JsonProperty("StartChargeSeq") + private String startChargeSeq; +} diff --git a/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/dto/CancelOrderResponse.java b/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/dto/CancelOrderResponse.java new file mode 100644 index 00000000..5e09baf7 --- /dev/null +++ b/evcs-modules/evcs-common/src/main/java/com/xhpc/evcs/dto/CancelOrderResponse.java @@ -0,0 +1,19 @@ +package com.xhpc.evcs.dto; + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * @Author HongYun on 2021/11/8 + */ +@Getter +@Setter +@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY, getterVisibility = JsonAutoDetect.Visibility.NONE, + setterVisibility = JsonAutoDetect.Visibility.NONE, creatorVisibility = JsonAutoDetect.Visibility.NONE) +public class CancelOrderResponse { + + @JsonProperty("SuccStat") + private Integer succStat; +} diff --git a/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/notification/NotificationCancelOrderTask.java b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/notification/NotificationCancelOrderTask.java new file mode 100644 index 00000000..a38683ca --- /dev/null +++ b/evcs-modules/evcs-core/src/main/java/com/xhpc/evcs/notification/NotificationCancelOrderTask.java @@ -0,0 +1,95 @@ +package com.xhpc.evcs.notification; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.xhpc.evcs.domain.AuthSecretToken; +import com.xhpc.evcs.dto.*; +import com.xhpc.evcs.jpa.AuthSecretTokenRepository; +import com.xhpc.evcs.utils.JSONUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import static com.xhpc.common.data.redis.StaticBeanUtil.REDIS; +import static com.xhpc.evcs.domain.AuthSecretToken.SECRET_TOKEN_TYPE_OUT; + +/** + * @Author HongYun on 2021/11/8 + */ +@Component +public class NotificationCancelOrderTask extends CoreDispatcher { + + @Autowired + private AuthSecretTokenRepository authSecretTokenRepository; + + private Logger logger = LoggerFactory.getLogger(NotificationChargeOrderInfoTask.class); + + @Scheduled(fixedRate = 1000 * 15) + public void run() throws JsonProcessingException { + + //Getting the orders, which need to be notified. + Collection ordersNotFilter = REDIS.keys("order:*"); + List ordersNeedToNotify = new ArrayList<>(); + for (String order : ordersNotFilter) { + String startStatus = REDIS.getCacheMapValue(order, "startStatus"); + if ("失败".equals(startStatus)) { + ordersNeedToNotify.add(order); + } + } + + //Getting the internetSerialNumbers, which need to be notified. + List internetSerialNumbers = new ArrayList<>(); + Collection pushOrders = REDIS.keys("pushOrder:*"); + List orderMaybeNeedToDelete = new ArrayList<>(); + for (String order : ordersNeedToNotify) { + String tempOrder = "pushOrder:" + order.substring(6); + if (pushOrders.contains(tempOrder)) { + String internetSerialNumber = REDIS.getCacheMapValue(tempOrder, "internetSerialNumber"); + if (null != internetSerialNumber) { + internetSerialNumbers.add(internetSerialNumber); + orderMaybeNeedToDelete.add(order); + } + } + } + + //Making notify. + for (int i = 0; i < internetSerialNumbers.size(); i++) { + String internetSerialNumber = internetSerialNumbers.get(i); + String orderNo = orderMaybeNeedToDelete.get(i); + String operatorId = internetSerialNumber.substring(0, 9); + AuthSecretToken authSecretTokenOut = authSecretTokenRepository.findByOperatorId3irdptyAndSecretTokenType(operatorId, SECRET_TOKEN_TYPE_OUT).orElse(null); + if (null != authSecretTokenOut) { + CancelOrderRequest cancelOrderRequest = new CancelOrderRequest(); + cancelOrderRequest.setStartChargeSeq(internetSerialNumber); + notify(cancelOrderRequest, authSecretTokenOut, orderNo); + } + } + + } + + public void notify(CancelOrderRequest cancelOrderRequest, AuthSecretToken authSecretTokenOut, String orderNo) throws JsonProcessingException { + + String operatorIdEvcs = "MA6DFCTD5"; + String data = JSONUtil.toJSONString(cancelOrderRequest); + logger.debug(data); + CommonRequest commonRequest = new CommonRequest<>(); + commonRequest.setOperatorId(operatorIdEvcs); + commonRequest.setData(data); + String responseBody = ok(commonRequest, "/notification_cancel_order", authSecretTokenOut, operatorIdEvcs); + CancelOrderResponse cancelOrderResponse = DTOJsonHelper.parseResponseData(responseBody, + CancelOrderResponse.class, authSecretTokenOut); + if (null != cancelOrderResponse) { + Integer succStat = cancelOrderResponse.getSuccStat(); + if (null != succStat) { + if (0 == succStat) { + REDIS.deleteObject(orderNo); + } + } + } + } +}