todo:第三方对接

This commit is contained in:
wen 2021-10-29 16:12:16 +08:00
parent 30ea3829f4
commit 912745b0bf
6 changed files with 187 additions and 25 deletions

View File

@ -14,7 +14,7 @@ public class ChargeResultRequest {
@JsonProperty("StartChargeSeq")
String startChargeSeq;
@JsonProperty("StartChargeSeqStat")
String startChargeSeqStat;
Integer startChargeSeqStat;
@JsonProperty("ConnectorID")
String connectorID;
@JsonProperty("SuccStat")

View File

@ -126,6 +126,8 @@ public class QueryEquipBusinessPolicyController {
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;
}

View File

@ -3,11 +3,13 @@ package com.xhpc.evcs.api;
import com.xhpc.common.api.PileOrderService;
import com.xhpc.common.core.domain.R;
import com.xhpc.evcs.domain.AuthSecretToken;
import com.xhpc.evcs.domain.EtOrderMapping;
import com.xhpc.evcs.dto.CommonRequest;
import com.xhpc.evcs.dto.CommonResponse;
import com.xhpc.evcs.dto.StartChargeRequest;
import com.xhpc.evcs.dto.StartChargeResponse;
import com.xhpc.evcs.jpa.AuthSecretTokenRepository;
import com.xhpc.evcs.jpa.OrderMappingRepository;
import com.xhpc.evcs.utils.JSONUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
@ -26,6 +28,8 @@ public class QueryStartChargeController {
@Autowired
AuthSecretTokenRepository authSecretTokenRepository;
@Autowired
private OrderMappingRepository etOrderMappingRepo;
@Autowired
private PileOrderService pileOrderService;
@PostMapping(value = "/v1/query_start_charge")
@ -55,15 +59,20 @@ public class QueryStartChargeController {
startChargeResponse.setFailReason(0);
startChargeResponse.setStartChargeSeqStat(5);
} else {
EtOrderMapping etOrderMapping = new EtOrderMapping();
etOrderMapping.setEvcsOrderNo(startChargeSeq);
// etOrderMapping.setXhOrderNo(xhOrderNo);//todo 鸿运
etOrderMappingRepo.save(etOrderMapping);
startChargeResponse.setStartChargeSeqStat(2);
startChargeResponse.setSuccStat(0);
startChargeResponse.setFailReason(0);
//insert a gunStatusData to redis
Map<String, Object> gunStatus = new HashMap<>();
Map<String, Object> pushOrder = new HashMap<>();
//0 means charging.
gunStatus.put("status", 0);
gunStatus.put("orderNo", (String) res.getData());
REDIS.setCacheMap("gunStatus:", gunStatus);
pushOrder.put("status", 0);
String orderNo = (String) res.getData();
pushOrder.put("internetSerialNumber", startChargeRequest.getStartChargeSeq());
REDIS.setCacheMap("pushOrder:".concat(orderNo), pushOrder);
}
resp.setRet(String.valueOf(res.getCode()));
}

View File

@ -2,9 +2,13 @@ package com.xhpc.evcs.api;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.xhpc.common.api.PowerPileService;
import com.xhpc.common.core.domain.R;
import com.xhpc.evcs.domain.EtOrderMapping;
import com.xhpc.evcs.dto.CommonRequest;
import com.xhpc.evcs.dto.CommonResponse;
import com.xhpc.evcs.dto.QueryStopChargeRequest;
import com.xhpc.evcs.dto.QueryStopChargeResponse;
import com.xhpc.evcs.jpa.OrderMappingRepository;
import com.xhpc.evcs.utils.JSONUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@ -12,6 +16,8 @@ import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import static com.xhpc.common.data.redis.StaticBeanUtil.REDIS;
@ -23,10 +29,15 @@ public class QueryStopChargeController {
@Autowired
PowerPileService powerPileService;
//三方订单与redis内部订单映射表
@Autowired
private OrderMappingRepository etOrderMappingRepo;
@PostMapping("/v1/query_stop_charge")
public CommonResponse queryStopCharge(@RequestBody QueryStopChargeRequest queryStopChargeRequest) {
//充电订单号
public CommonResponse queryStopCharge(@RequestBody CommonRequest<QueryStopChargeRequest> commonRequest) throws IOException {
QueryStopChargeRequest queryStopChargeRequest = JSONUtil.readParams(commonRequest.getData(), QueryStopChargeRequest.class);
//充电订单号 //todo 充电订单号是一个27位的数字
String chargingOrderSeq = queryStopChargeRequest.getStartChargeSeq();
//充电设备接口编码枪编码
String connectorId = queryStopChargeRequest.getConnectorId();
@ -38,9 +49,16 @@ public class QueryStopChargeController {
String vesrionNum = (String) pile.get("vesrion");
//给对应的枪发送停止充电指令
powerPileService.stopCharging(chargingOrderSeq, pileNum, connectorId, "0A"); //ToDo 暂时写死
R r = powerPileService.stopCharging(chargingOrderSeq, pileNum, connectorId, "0A");//ToDo 暂时写死
//todo 判断停止指令发送是否成功
EtOrderMapping etOrderMapping = etOrderMappingRepo.findByEvcsOrderNo(chargingOrderSeq).orElse(null);
if (etOrderMapping != null) {
Map<String, Object> pushOrder = new HashMap<>();
pushOrder.put("stopCommandSent", false);
REDIS.setCacheMap("pushOrder:".concat(etOrderMapping.getXhOrderNo()), pushOrder);
}
//Todo 获取Redis中的充电状态来判断是否启动成功
//获取Redis中的充电订单
if (true) {
//设置Redis中的充电订单为已结束
Map<String, Object> order = REDIS.getCacheMap("order:" + chargingOrderSeq);

View File

@ -6,9 +6,13 @@ import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.repository.query.QueryByExampleExecutor;
import org.springframework.stereotype.Repository;
import java.util.Optional;
@Repository
public interface OrderMappingRepository extends JpaRepository<EtOrderMapping, String>,
QueryByExampleExecutor<EtOrderMapping>, JpaSpecificationExecutor<EtOrderMapping> {
Optional<EtOrderMapping> findByEvcsOrderNo(String chargingOrderSeq);
}

View File

@ -9,14 +9,17 @@ import com.xhpc.evcs.jpa.AuthSecretTokenRepository;
import com.xhpc.evcs.utils.JSONUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import static com.xhpc.common.data.redis.StaticBeanUtil.REDIS;
import static com.xhpc.evcs.domain.AuthSecretToken.SECRET_TOKEN_TYPE_OUT;
@Component
public class NotificationStopChargeResultTask extends CoreDispatcher {
@Autowired
@ -25,11 +28,61 @@ public class NotificationStopChargeResultTask extends CoreDispatcher {
@Scheduled(fixedRate = 1000 * 20)
public void run() throws IOException {
notifyService();
notifyService3();
}
public void notifyService3() throws JsonProcessingException {
//获取Redis中的所有订单状态数据
Collection<String> pushOrders = REDIS.keys("pushOrder:*");
for (String pushOrderKey : pushOrders) {
Map<String, Object> pushOrder = REDIS.getCacheMap(pushOrderKey);
Boolean stopCommandSent = (Boolean) pushOrder.get("stopCommandSent");
if (stopCommandSent == null) {
continue;
}
String orderNo = pushOrderKey.substring(10);
Map<String, Object> order = REDIS.getCacheMap("order:" + orderNo);
String operatorId3rdpty = (String) order.get("operatorId3rdpty"); //todo zz
if (operatorId3rdpty == null) {
continue;
}
AuthSecretToken authSecretTokenOut = authSecretTokenRepository.findByOperatorId3irdptyAndSecretTokenType(operatorId3rdpty, SECRET_TOKEN_TYPE_OUT).orElse(null);
if (authSecretTokenOut == null) {
continue;
}
CommonRequest<ChargeResultRequest> chargeResultRequestCommonRequest = new CommonRequest<>();
ChargeResultRequest chargeResultRequest = new ChargeResultRequest();
if (stopCommandSent) {
//获取内部的充电订单号
//通过充电订单号获取指定的订单
//判断订单充电状态
// 获取指定的订单的数据
CacheOrderData orderData = (CacheOrderData) order.get("orderData");
String internetSerialNumber = (String) pushOrder.get("internetSerialNumber");
int succStat = 0;
int failReason = 0;
chargeResultRequest.setStartChargeSeq(internetSerialNumber);
chargeResultRequest.setConnectorID(orderNo.substring(0, 14));
if (orderData != null) {
//使用指定包装类封装数据
chargeResultRequest.setStartChargeSeqStat(4);
chargeResultRequest.setSuccStat(succStat);
chargeResultRequest.setFailReason(failReason);
//将其转换为json
REDIS.deleteObject(pushOrderKey);
}
} else { // todo wenhui
chargeResultRequest.setStartChargeSeqStat((Integer) pushOrder.get("status"));
}
String jsonData = JSONUtil.toJSONString(chargeResultRequest);
chargeResultRequestCommonRequest.setData(jsonData);
String result = ok(chargeResultRequestCommonRequest, "/notification_stop_charge_result", authSecretTokenOut, operatorId3rdpty);
}
}
/**
* 获取充电订单号
* 获取充电订单状态
@ -48,23 +101,23 @@ public class NotificationStopChargeResultTask extends CoreDispatcher {
//20秒检测一次Redis中的数据状态并推送
//获取Redis中的所有订单状态数据
List<Object> orderStatusList = REDIS.getCacheList("orderStatus:*");
List<Object> orderStatusDataList = REDIS.getCacheList("orderStatusData:*");
//使用for循环遍历所有订单状态数据找到已结束的充电订单
for (int i = 0; i < orderStatusList.size() - 1; i++) {
for (int i = 0; i < orderStatusDataList.size() - 1; i++) {
//获取订单数据
Map<String, Object> orderStatus = (Map<String, Object>) orderStatusList.get(i);
Map<String, Object> orderStatusData = (Map<String, Object>) orderStatusDataList.get(i);
//判断该订单数据是否已经被推送过了,如果已经推送过了则不在推送
Boolean isPush = (Boolean) orderStatus.get("isPush");
Boolean isPush = (Boolean) orderStatusData.get("isPush");
if (!isPush) {
//获取内部的充电订单号
String orderNo = (String) orderStatus.get("orderNo");
String orderNo = (String) orderStatusData.get("orderNo");
//通过充电订单号获取指定的订单
Map<String, Object> order = REDIS.getCacheMap("order:" + orderNo);
//判断订单充电状态
String status = (String) order.get("status");
if (status.equals("已结束")) {
String chargingStatus = (String) order.get("chargingStatus");
if (chargingStatus.equals("已结束")) {
//获取指定的订单的数据
CacheOrderData orderData = (CacheOrderData) order.get("orderData");
//获取充电设备接口编码
@ -78,8 +131,8 @@ public class NotificationStopChargeResultTask extends CoreDispatcher {
//使用指定包装类封装数据
ChargeResultRequest chargeResultRequest = new ChargeResultRequest();
chargeResultRequest.setStartChargeSeq(null);
chargeResultRequest.setStartChargeSeqStat(status);
chargeResultRequest.setStartChargeSeq(null); //todo 使用朱老师工具缩减成27位
chargeResultRequest.setStartChargeSeqStat(4);
chargeResultRequest.setConnectorID(gunSerial);
chargeResultRequest.setSuccStat(succStat);
chargeResultRequest.setFailReason(failReason);
@ -99,12 +152,12 @@ public class NotificationStopChargeResultTask extends CoreDispatcher {
//推送数据
//operatorId第三方的 我们场站运营商的
ok(chargeResultRequestCommonRequest, "/notification_stop_charge_result", authSecretTokenOut, null);
ok(chargeResultRequestCommonRequest, "/notification_stop_charge_result", authSecretTokenOut, "MA6DFCTD5");
// TODO: 2021/10/21 设置该订单数据已经被推送的标识符
orderStatus.put("isPush", true);
// 获取对应的orderStatus的Key
//REDIS.setCacheMap("",orderStatus);
//设置该订单数据已经被推送的标识符
orderStatusData.put("isPush", true);
String statusDataNum = (String) orderStatusData.get("statusDataNum");
REDIS.setCacheMap("orderStatusData:" + statusDataNum, orderStatusData);
}
// TODO:如果充电状态为停止中
@ -113,6 +166,82 @@ public class NotificationStopChargeResultTask extends CoreDispatcher {
}
}
}
//第二种更快的逻辑
// public void notifyService2() {
//
//
//
// //20秒检测一次Redis中的数据状态并推送
//
// //获取Redis中的所有未推送的订单状态数据
// Collection<String> keys1 = REDIS.keys("orderStatusData:F*");
//
// List<Object> orderStatusDataList = REDIS.getCacheList("orderStatusData:F");
// Collection<String> keys = REDIS.keys("orderStatusData:*F");
//
// //使用for循环遍历所有未推送订单状态数据
// for (int i = 0; i < orderStatusDataList.size() - 1; i++) {
//
// //获取订单数据
// Map<String, Object> orderStatusData = (Map<String, Object>) orderStatusDataList.get(i);
//
// //获取内部的充电订单号
// String orderNo = (String) orderStatusData.get("orderNo");
// //通过充电订单号获取指定的订单
// Map<String, Object> order = REDIS.getCacheMap("order:" + orderNo);
// //判断订单充电状态
// String chargingStatus = (String) order.get("chargingStatus");
// if (chargingStatus.equals("已结束")) {
// //获取指定的订单的数据
// CacheOrderData orderData = (CacheOrderData) order.get("orderData");
// //获取充电设备接口编码
// String pileNo = orderData.getPileNo();
// String gunId = orderData.getGunId();
// String gunSerial = pileNo + gunId;
// //设置成功标识
// int succStat = 0;
// //设置停止失败原因
// int failReason = 0;
//
// //使用指定包装类封装数据
// ChargeResultRequest chargeResultRequest = new ChargeResultRequest();
// chargeResultRequest.setStartChargeSeq(null); //todo 使用朱老师工具缩减成27位
// chargeResultRequest.setStartChargeSeqStat(chargingStatus);
// chargeResultRequest.setConnectorID(gunSerial);
// chargeResultRequest.setSuccStat(succStat);
// chargeResultRequest.setFailReason(failReason);
// //将其转换为json
// String jsonData = null;
// try {
// jsonData = JSONUtil.toJSONString(chargeResultRequest);
// } catch (JsonProcessingException e) {
// e.printStackTrace();
// System.out.println("转换成Json失败");
// }
//
// //将包装类塞入要发送的请求的包装类中
// //泛型为放入json数据的实体类类型
// CommonRequest<ChargeResultRequest> chargeResultRequestCommonRequest = new CommonRequest<>();
// chargeResultRequestCommonRequest.setData(jsonData);
//
// //推送数据
// //operatorId第三方的 我们场站运营商的
// ok(chargeResultRequestCommonRequest, "/notification_stop_charge_result", "765367656", null);
//
// //往该订单所对应的订单状态数据上添加已经被推送的标识符以避开下次扫描
// REDIS.setCacheMap("orderStatusData:"+orderNo+"T",orderStatusData);
// System.out.println("已完成");
// }
//
// // TODO:如果充电状态为停止中
//
//
// }
//
//
// }
}