完成query_stop_charge接口

完成notification_stop_charge_result接口
This commit is contained in:
wen 2021-11-01 11:09:01 +08:00
parent af42f2011e
commit 3b5314db40
4 changed files with 132 additions and 207 deletions

View File

@ -119,6 +119,10 @@
<artifactId>druid-spring-boot-starter</artifactId> <artifactId>druid-spring-boot-starter</artifactId>
<version>${druid.version}</version> <version>${druid.version}</version>
</dependency> </dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
</dependencies> </dependencies>
<properties> <properties>
<maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.source>1.8</maven.compiler.source>

View File

@ -4,11 +4,13 @@ import com.fasterxml.jackson.core.JsonProcessingException;
import com.xhpc.common.api.PowerPileService; import com.xhpc.common.api.PowerPileService;
import com.xhpc.common.core.domain.R; import com.xhpc.common.core.domain.R;
import com.xhpc.evcs.domain.EtOrderMapping; import com.xhpc.evcs.domain.EtOrderMapping;
import com.xhpc.evcs.domain.XhpcChargingPile;
import com.xhpc.evcs.dto.CommonRequest; import com.xhpc.evcs.dto.CommonRequest;
import com.xhpc.evcs.dto.CommonResponse; import com.xhpc.evcs.dto.CommonResponse;
import com.xhpc.evcs.dto.QueryStopChargeRequest; import com.xhpc.evcs.dto.QueryStopChargeRequest;
import com.xhpc.evcs.dto.QueryStopChargeResponse; import com.xhpc.evcs.dto.QueryStopChargeResponse;
import com.xhpc.evcs.jpa.OrderMappingRepository; import com.xhpc.evcs.jpa.OrderMappingRepository;
import com.xhpc.evcs.jpa.XhpcChargingPileRepository;
import com.xhpc.evcs.utils.JSONUtil; import com.xhpc.evcs.utils.JSONUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -33,48 +35,32 @@ public class QueryStopChargeController {
@Autowired @Autowired
private OrderMappingRepository etOrderMappingRepo; private OrderMappingRepository etOrderMappingRepo;
@Autowired
private XhpcChargingPileRepository XhpcChargingPileRepository;
@PostMapping("/v1/query_stop_charge") @PostMapping("/v1/query_stop_charge")
public CommonResponse queryStopCharge(@RequestBody CommonRequest<QueryStopChargeRequest> commonRequest) throws IOException { public CommonResponse queryStopCharge(@RequestBody CommonRequest<QueryStopChargeRequest> commonRequest) throws IOException {
QueryStopChargeRequest queryStopChargeRequest = JSONUtil.readParams(commonRequest.getData(), QueryStopChargeRequest.class); QueryStopChargeRequest queryStopChargeRequest = JSONUtil.readParams(commonRequest.getData(), QueryStopChargeRequest.class);
//充电订单号 //todo 充电订单号是一个27位的数字 // 获取充电订单号 充电订单号是一个27位的数字
String chargingOrderSeq = queryStopChargeRequest.getStartChargeSeq(); String startChargeSeq = queryStopChargeRequest.getStartChargeSeq();
//充电设备接口编码枪编码
String connectorId = queryStopChargeRequest.getConnectorId();
//获取桩编码
String pileNum = connectorId.substring(0, connectorId.length() - 2);
//从桩上面获取版本号
//获取Redis中的桩信息
Map<String, Object> pile = REDIS.getCacheMap("pile:" + pileNum);
String vesrionNum = (String) pile.get("vesrion");
//给对应的枪发送停止充电指令 //封装实体类数据
R r = powerPileService.stopCharging(chargingOrderSeq, pileNum, connectorId, "0A");//ToDo 暂时写死 QueryStopChargeResponse queryStopChargeResponse = new QueryStopChargeResponse();
//todo 判断停止指令发送是否成功 queryStopChargeResponse.setStartChargeSeq(startChargeSeq);
EtOrderMapping etOrderMapping = etOrderMappingRepo.findByEvcsOrderNo(chargingOrderSeq).orElse(null);
//判断三方的订单号是否在我们的内部有对应的订单
EtOrderMapping etOrderMapping = etOrderMappingRepo.findByEvcsOrderNo(startChargeSeq).orElse(null);
if (etOrderMapping != null) { if (etOrderMapping != null) {
Map<String, Object> pushOrder = new HashMap<>(); Map<String, Object> pushOrder = new HashMap<>();
pushOrder.put("stopCommandSent", false); pushOrder.put("stopCommandSent", false);
REDIS.setCacheMap("pushOrder:".concat(etOrderMapping.getXhOrderNo()), pushOrder); REDIS.setCacheMap("pushOrder:".concat(etOrderMapping.getXhOrderNo()), pushOrder);
}
//Todo 获取Redis中的充电状态来判断是否启动成功
//获取Redis中的充电订单
if (true) {
//设置Redis中的充电订单为已结束
Map<String, Object> order = REDIS.getCacheMap("order:" + chargingOrderSeq);
order.replace("status", "已结束");
REDIS.setCacheMap("order:" + chargingOrderSeq, order);
//封装实体类数据
QueryStopChargeResponse queryStopChargeResponse = new QueryStopChargeResponse();
//充电订单号
queryStopChargeResponse.setStartChargeSeq(chargingOrderSeq);
//充电订单状态 //充电订单状态
queryStopChargeResponse.setStartChargeSeqStat(4); queryStopChargeResponse.setStartChargeSeqStat(5);
//操作结果 //操作结果
queryStopChargeResponse.setSuccStat(0); queryStopChargeResponse.setSuccStat(1);
//失败原因 //5 are custom value, means "error startChargeSeq"
queryStopChargeResponse.setFailReason(0); queryStopChargeResponse.setFailReason(10);
//转换为json对象 //转换为json对象
String data = null; String data = null;
@ -87,16 +73,95 @@ public class QueryStopChargeController {
CommonResponse commonResponse = new CommonResponse(); CommonResponse commonResponse = new CommonResponse();
commonResponse.setRet("0"); commonResponse.setRet("0");
commonResponse.setMsg("请求停止充电成功"); commonResponse.setMsg("请求停止充电失败:错误的充电订单号");
commonResponse.setData(data); commonResponse.setData(data);
return commonResponse; return commonResponse;
} else { }
String xhOrderNo = etOrderMapping.getXhOrderNo();
return null; //充电设备接口编码枪编码
String connectorId = queryStopChargeRequest.getConnectorId();
//获取桩编码
String pileNum = connectorId.substring(0, connectorId.length() - 2);
//从数据库中查询对应的桩的版本信息
XhpcChargingPile pileInfo = XhpcChargingPileRepository.findBySerialNumber(pileNum).orElse(null);
String versionNum = null;
if (pileInfo != null) {
versionNum = pileInfo.getCommunicationProtocolVersion();
} }
//给对应的枪发送停止充电指令
R r = powerPileService.stopCharging(xhOrderNo, pileNum, connectorId, versionNum);
// 判断停止指令发送是否成功
if (r.getCode() != 200) {
//充电订单状态
queryStopChargeResponse.setStartChargeSeqStat(5);
//操作结果
queryStopChargeResponse.setSuccStat(1);
//失败原因
String errorMsg = r.getMsg();
if (errorMsg.contains("未注册")) {
queryStopChargeResponse.setFailReason(1);
}
if (errorMsg.contains("离线")) {
queryStopChargeResponse.setFailReason(2);
}
if (errorMsg.contains("订单号")) {
//4 means error orderNumber
queryStopChargeResponse.setFailReason(4);
}
if (errorMsg.contains("端口")) {
//5 means port is not charging
queryStopChargeResponse.setFailReason(5);
}
//充电订单状态
queryStopChargeResponse.setStartChargeSeqStat(4);
//操作结果
queryStopChargeResponse.setSuccStat(1);
String data = null;
try {
data = JSONUtil.toJSONString(queryStopChargeResponse);
} catch (JsonProcessingException e) {
e.printStackTrace();
System.out.println("json转换出问题了");
}
CommonResponse commonResponse = new CommonResponse();
commonResponse.setRet("0");
commonResponse.setMsg("请求停止充电失败");
commonResponse.setData(data);
}
//设置该订单已经被停止的标识
Map<String, Object> order = REDIS.getCacheMap("order:" + xhOrderNo);
order.replace("status", "已结束");
REDIS.setCacheMap("order:" + xhOrderNo, order);
HashMap<String, Object> pushOrder = new HashMap<>(16);
pushOrder.put("stopCommandSent", true);
REDIS.setCacheMap("pushOrder:".concat(xhOrderNo), pushOrder);
//充电订单状态
queryStopChargeResponse.setStartChargeSeqStat(3);
//操作结果
queryStopChargeResponse.setSuccStat(0);
//失败原因
queryStopChargeResponse.setFailReason(0);
//转换为json对象
String data = null;
try {
data = JSONUtil.toJSONString(queryStopChargeResponse);
} catch (JsonProcessingException e) {
e.printStackTrace();
System.out.println("json转换出问题了");
}
CommonResponse commonResponse = new CommonResponse();
commonResponse.setRet("0");
commonResponse.setMsg("请求停止充电成功");
commonResponse.setData(data);
return commonResponse;
} }
} }

View File

@ -6,8 +6,18 @@ import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.repository.query.QueryByExampleExecutor; import org.springframework.data.repository.query.QueryByExampleExecutor;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import java.util.Optional;
@Repository @Repository
public interface XhpcChargingPileRepository extends JpaRepository<XhpcChargingPile, String>, public interface XhpcChargingPileRepository extends JpaRepository<XhpcChargingPile, String>,
QueryByExampleExecutor<XhpcChargingPile>, JpaSpecificationExecutor<XhpcChargingPile> { QueryByExampleExecutor<XhpcChargingPile>, JpaSpecificationExecutor<XhpcChargingPile> {
/**
* 通过桩的序列号来查询查询指定的桩的信息
*
* @param pileNum 桩的序列号
* @return 返回一条桩数据
*/
Optional<XhpcChargingPile> findBySerialNumber(String pileNum);
} }

View File

@ -13,7 +13,6 @@ import org.springframework.stereotype.Component;
import java.io.IOException; import java.io.IOException;
import java.util.Collection; import java.util.Collection;
import java.util.List;
import java.util.Map; import java.util.Map;
import static com.xhpc.common.data.redis.StaticBeanUtil.REDIS; import static com.xhpc.common.data.redis.StaticBeanUtil.REDIS;
@ -31,7 +30,17 @@ public class NotificationStopChargeResultTask extends CoreDispatcher {
notifyService3(); notifyService3();
} }
/**
* 获取充电订单号
* 获取充电订单状态
* 获取充电设备接口编码
* 获取成功标识
* 获取停止失败原因
* 推送过去
* <p>
* 出现异常逻辑
* 如果当充电桩因为异常停止充电时那么谁告诉我订单是个异常订单
*/
public void notifyService3() throws JsonProcessingException { public void notifyService3() throws JsonProcessingException {
//获取Redis中的所有订单状态数据 //获取Redis中的所有订单状态数据
@ -62,186 +71,23 @@ public class NotificationStopChargeResultTask extends CoreDispatcher {
// 获取指定的订单的数据 // 获取指定的订单的数据
CacheOrderData orderData = (CacheOrderData) order.get("orderData"); CacheOrderData orderData = (CacheOrderData) order.get("orderData");
String internetSerialNumber = (String) pushOrder.get("internetSerialNumber"); String internetSerialNumber = (String) pushOrder.get("internetSerialNumber");
int succStat = 0;
int failReason = 0;
chargeResultRequest.setStartChargeSeq(internetSerialNumber); chargeResultRequest.setStartChargeSeq(internetSerialNumber);
chargeResultRequest.setConnectorID(orderNo.substring(0, 14)); chargeResultRequest.setConnectorID(orderNo.substring(0, 14));
if (orderData != null) { if (orderData != null) {
//使用指定包装类封装数据 //使用指定包装类封装数据
int succStat = 0;
int failReason = 0;
chargeResultRequest.setStartChargeSeqStat(4); chargeResultRequest.setStartChargeSeqStat(4);
chargeResultRequest.setSuccStat(succStat); chargeResultRequest.setSuccStat(succStat);
chargeResultRequest.setFailReason(failReason); chargeResultRequest.setFailReason(failReason);
//将其转换为json //将其转换为json
REDIS.deleteObject(pushOrderKey); 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);
}
}
/**
* 获取充电订单号
* 获取充电订单状态
* 获取充电设备接口编码
* 获取成功标识
* 获取停止失败原因
* 推送过去
* <p>
* 出现异常逻辑
* 如果当充电桩因为异常停止充电时那么谁告诉我订单是个异常订单
*/
public void notifyService() {
List<AuthSecretToken> authSecretTokenOutList = authSecretTokenRepository.findBySecretTokenType(SECRET_TOKEN_TYPE_OUT);
for (AuthSecretToken authSecretTokenOut : authSecretTokenOutList) {
//20秒检测一次Redis中的数据状态并推送
//获取Redis中的所有订单状态数据
List<Object> orderStatusDataList = REDIS.getCacheList("orderStatusData:*");
//使用for循环遍历所有订单状态数据找到已结束的充电订单
for (int i = 0; i < orderStatusDataList.size() - 1; i++) {
//获取订单数据
Map<String, Object> orderStatusData = (Map<String, Object>) orderStatusDataList.get(i);
//判断该订单数据是否已经被推送过了,如果已经推送过了则不在推送
Boolean isPush = (Boolean) orderStatusData.get("isPush");
if (!isPush) {
//获取内部的充电订单号
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(4);
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", authSecretTokenOut, "MA6DFCTD5");
//设置该订单数据已经被推送的标识符
orderStatusData.put("isPush", true);
String statusDataNum = (String) orderStatusData.get("statusDataNum");
REDIS.setCacheMap("orderStatusData:" + statusDataNum, orderStatusData);
}
// TODO:如果充电状态为停止中
String jsonData = JSONUtil.toJSONString(chargeResultRequest);
chargeResultRequestCommonRequest.setData(jsonData);
String result = ok(chargeResultRequestCommonRequest, "/notification_stop_charge_result", authSecretTokenOut, operatorId3rdpty);
} }
} }
} }
} }
//第二种更快的逻辑
// 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:如果充电状态为停止中
//
//
// }
//
//
// }
} }