WIP: 停止充电逻辑优化

This commit is contained in:
ZZ 2021-11-23 12:04:29 +08:00
parent 5f110d23ec
commit f929a6d305
7 changed files with 60 additions and 94 deletions

View File

@ -41,55 +41,36 @@ public class QueryStopChargeController {
public CommonResponse queryStopCharge(@RequestBody CommonRequest<QueryStopChargeRequest> commonRequest) throws IOException {
QueryStopChargeRequest queryStopChargeRequest = JSONUtil.readParams(commonRequest.getData(), QueryStopChargeRequest.class);
// 获取充电订单号 充电订单号是一个27位的数字
// evcs电订单号(27位)
String startChargeSeq = queryStopChargeRequest.getStartChargeSeq();
//封装实体类数据
QueryStopChargeResponse queryStopChargeResponse = new QueryStopChargeResponse();
queryStopChargeResponse.setStartChargeSeq(startChargeSeq);
//判断三方的订单号是否在我们的内部有对应的订单
//判断三方的订单号是否存在
EtOrderMapping etOrderMapping = etOrderMappingRepo.findByEvcsOrderNo(startChargeSeq).orElse(null);
if (etOrderMapping == null) {
//充电订单状态
queryStopChargeResponse.setStartChargeSeqStat(5);
//操作结果
queryStopChargeResponse.setSuccStat(1);
//5 are custom value, means "error startChargeSeq"
queryStopChargeResponse.setFailReason(10);
//转换为json对象
String data = null;
try {
data = JSONUtil.toJSONString(queryStopChargeResponse);
} catch (JsonProcessingException e) {
e.printStackTrace();
System.out.println("json转换出问题了");
}
CommonResponse commonResponse = new CommonResponse();
commonResponse.setRet("1");
commonResponse.setMsg("请求停止充电失败:错误的充电订单号");
commonResponse.setData(data);
return commonResponse;
return failCommonResponse(queryStopChargeResponse);
}
String xhOrderNo = etOrderMapping.getXhOrderNo();
String pushOrderkey = "pushOrder:".concat(xhOrderNo);
Map<String, Object> pushOrder = REDIS.getCacheMap(pushOrderkey);
if (pushOrder == null || (pushOrder.get("isStopNotified") != null && !(Boolean) pushOrder.get("isStopNotified"))) {
pushOrder.put("isStopNotified", false);
REDIS.setCacheMap(pushOrderkey, pushOrder);
return failCommonResponse(queryStopChargeResponse);
}
//充电设备接口编码枪编码
String connectorId = queryStopChargeRequest.getConnectorId();
//获取桩编码
String pileNum = connectorId.substring(0, connectorId.length() - 2);
//从数据库中查询对应的桩的版本信息
XhpcChargingPile pileInfo = XhpcChargingPileRepository.findBySerialNumber(pileNum).orElse(null);
String versionNum = pileInfo.getCommunicationProtocolVersion() != null ? pileInfo.getCommunicationProtocolVersion() : "0A";
String versionNum = pileInfo.getCommunicationProtocolVersion() != null ? pileInfo.getCommunicationProtocolVersion() :
"0A";
//给对应的枪发送停止充电指令
R r = powerPileService.stopCharging(xhOrderNo, pileNum, connectorId, versionNum);
// 判断停止指令发送是否成功
if (r.getCode() != 200) {
//向redis中放入停止充电指令没有下发成功的标识
Map<String, Object> pushOrder = REDIS.getCacheMap("pushOrder:".concat(xhOrderNo));
pushOrder.put("stopCommandSent", false);
REDIS.setCacheMap("pushOrder:".concat(xhOrderNo), pushOrder);
REDIS.setCacheMap(pushOrderkey, pushOrder);
//充电订单状态
queryStopChargeResponse.setStartChargeSeqStat(5);
//操作结果
@ -110,57 +91,41 @@ public class QueryStopChargeController {
//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转换出问题了");
}
String data = JSONUtil.toJSONString(queryStopChargeResponse);
CommonResponse commonResponse = new CommonResponse();
commonResponse.setRet("1");
commonResponse.setMsg("请求停止充电失败");
commonResponse.setData(data);
return commonResponse;
}
//设置该订单已经被停止的标识
Map<String, Object> order = REDIS.getCacheMap("order:" + xhOrderNo);
order.replace("status", "已结束");
REDIS.setCacheMap("order:" + xhOrderNo, order);
//设置推送停止充电订单所需要的数据
Map<String, Object> pushOrder = REDIS.getCacheMap("pushOrder:".concat(xhOrderNo));
pushOrder.put("stopCommandSent", false);
pushOrder.put("internetSerialNumber", startChargeSeq);
REDIS.setCacheMap("pushOrder:".concat(xhOrderNo), pushOrder);
//充电订单状态
REDIS.setCacheMap("order:".concat(xhOrderNo), order);
REDIS.setCacheMap(pushOrderkey, 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转换出问题了");
}
String data = JSONUtil.toJSONString(queryStopChargeResponse);
CommonResponse commonResponse = new CommonResponse();
commonResponse.setRet("0");
commonResponse.setMsg("请求停止充电成功");
commonResponse.setData(data);
return commonResponse;
}
private CommonResponse failCommonResponse(QueryStopChargeResponse queryStopChargeResponse) throws JsonProcessingException {
queryStopChargeResponse.setStartChargeSeqStat(5);
queryStopChargeResponse.setSuccStat(1);
queryStopChargeResponse.setFailReason(0);
String data = JSONUtil.toJSONString(queryStopChargeResponse);
CommonResponse commonResponse = new CommonResponse();
commonResponse.setRet("1");
commonResponse.setMsg("请求停止充电失败:错误的充电订单号");
commonResponse.setData(data);
return commonResponse;
}

View File

@ -46,8 +46,8 @@ public class CheckChargeOrders extends CoreDispatcher {
for (String pushOrderKey : pushOrders) {
Map<String, Object> pushOrder = REDIS.getCacheMap(pushOrderKey);
Boolean stopCommandSent = (Boolean) pushOrder.get("stopCommandSent");
if (stopCommandSent == null || !stopCommandSent) {
Boolean isStopNotified = (Boolean) pushOrder.get("isStopNotified");
if (isStopNotified != null && isStopNotified) {
continue;
}
String orderNo = pushOrderKey.substring(10);
@ -56,7 +56,9 @@ public class CheckChargeOrders extends CoreDispatcher {
if (operatorId3rdpty == null) {
continue;
}
AuthSecretToken authSecretTokenOut = authSecretTokenRepository.findByOperatorId3irdptyAndSecretTokenType(operatorId3rdpty, SECRET_TOKEN_TYPE_OUT).orElse(null);
AuthSecretToken authSecretTokenOut =
authSecretTokenRepository.findByOperatorId3irdptyAndSecretTokenType(operatorId3rdpty,
SECRET_TOKEN_TYPE_OUT).orElse(null);
if (authSecretTokenOut == null) {
continue;
}
@ -64,7 +66,7 @@ public class CheckChargeOrders extends CoreDispatcher {
//封装数据的实体类
CheckChargeOrderRequestData checkChargeOrder = new CheckChargeOrderRequestData();
//判断是否是结束了的充电订单
if (stopCommandSent) {
if (isStopNotified) {
//订单对账流水号内部对应的第三方充电订单号
CacheOrderData orderData = (CacheOrderData) order.get("orderData");
String internetSerialNumber = (String) pushOrder.get("internetSerialNumber");

View File

@ -52,8 +52,8 @@ public class NotificationChargeOrderInfo extends CoreDispatcher {
for (String pushOrderKey : pushOrders) {
Map<String, Object> pushOrder = REDIS.getCacheMap(pushOrderKey);
Boolean stopCommandSent = (Boolean) pushOrder.get("stopCommandSent");
if (stopCommandSent == null || !stopCommandSent) {
Boolean isStopNotified = (Boolean) pushOrder.get("isStopNotified");
if (isStopNotified) {
continue;
}
String orderNo = pushOrderKey.substring(10);
@ -62,7 +62,9 @@ public class NotificationChargeOrderInfo extends CoreDispatcher {
if (operatorId3rdpty == null) {
continue;
}
AuthSecretToken authSecretTokenOut = authSecretTokenRepository.findByOperatorId3irdptyAndSecretTokenType(operatorId3rdpty, SECRET_TOKEN_TYPE_OUT).orElse(null);
AuthSecretToken authSecretTokenOut =
authSecretTokenRepository.findByOperatorId3irdptyAndSecretTokenType(operatorId3rdpty,
SECRET_TOKEN_TYPE_OUT).orElse(null);
if (authSecretTokenOut == null) {
continue;
}
@ -70,7 +72,7 @@ public class NotificationChargeOrderInfo extends CoreDispatcher {
//封装数据的实体类
ChargeOrderInfo chargeOrderInfo = new ChargeOrderInfo();
//判断是否是结束了的充电订单
if (stopCommandSent) {
if (isStopNotified) {
//充电订单号内部对应的第三方充电订单号
CacheOrderData orderData = (CacheOrderData) order.get("orderData");
String internetSerialNumber = (String) pushOrder.get("internetSerialNumber");

View File

@ -18,6 +18,7 @@ import org.springframework.stereotype.Component;
import java.util.List;
import static com.xhpc.common.data.redis.StaticBeanUtil.REDIS;
import static com.xhpc.evcs.domain.AuthSecretToken.SECRET_TOKEN_TYPE_OUT;
/**
@ -31,7 +32,7 @@ public class NotificationChargeOrderInfoTask extends CoreDispatcher {
@Autowired
private AuthSecretTokenRepository authSecretTokenRepository;
private Logger logger = LoggerFactory.getLogger(NotificationChargeOrderInfoTask.class);
private final Logger logger = LoggerFactory.getLogger(NotificationChargeOrderInfoTask.class);
@Scheduled(fixedRate = 1000 * 15)
public void run() throws JsonProcessingException {
@ -53,6 +54,7 @@ public class NotificationChargeOrderInfoTask extends CoreDispatcher {
horder.setConfirmResult(pushResp.getConfirmResult());
logger.info("3rd part order {} push result: {}", horder.getSerialNumber(), pushResp.getConfirmResult());
xhpcHistoryOrderRepository.save(horder);
REDIS.setCacheMapValue("pushOrder:".concat(horder.getSerialNumber()), "horderpushed", true);
} else {
logger.error("3dp[{}] order[{}/{}] push fail", operatorId3rdptyEvcs,
horder.getSerialNumber(), horder.getInternetSerialNumber());

View File

@ -52,8 +52,8 @@ public class NotificationStopChargeResultTask extends CoreDispatcher {
CacheOrderData orderData = REDIS.getCacheMapValue(orderkey, "orderData");
if (orderData != null) {
Map<String, Object> pushOrder = REDIS.getCacheMap(pushOrderKey);
Boolean stopCommandSent = (Boolean) pushOrder.get("stopCommandSent");
if (stopCommandSent == null || !stopCommandSent) {
Boolean isStopNotified = (Boolean) pushOrder.get("isStopNotified");
if (isStopNotified == null || !isStopNotified) {
String internetSerialNumber = (String) pushOrder.get("internetSerialNumber");
String operatorId3rdpty = internetSerialNumber.substring(0, 9);
AuthSecretToken authSecretTokenOut =
@ -75,15 +75,8 @@ public class NotificationStopChargeResultTask extends CoreDispatcher {
String result = ok(commonRequest, "/notification_stop_charge_result", authSecretTokenOut);
ChargeResultResponse chargeResultResponse = DTOJsonHelper.parseResponseData(result,
ChargeResultResponse.class, authSecretTokenOut);
if (chargeResultResponse != null) {
succStat = chargeResultResponse.getSuccStat();
//推送成功则排除这个已推送的订单否则则继续推送该订单
//将stopCommandSent置为null表示推送成功之后该订单都不进行推送
if (succStat == 0) {
pushOrder.replace("stopCommandSent", true);
REDIS.setCacheMap(pushOrderKey, pushOrder);
}
}
pushOrder.put("isStopNotified", true);
REDIS.setCacheMap(pushOrderKey, pushOrder);
}
}
}

View File

@ -29,7 +29,7 @@ import static com.xhpc.pp.utils.security.CacheDataUtils.reflectTranslate;
@Component("OrderDataLogic")
public class OrderDataLogic implements ServiceLogic {
private static Logger log = LoggerFactory.getLogger(OrderDataLogic.class);
private static final Logger log = LoggerFactory.getLogger(OrderDataLogic.class);
@Autowired
private PileOrderService pileOrderService;
@ -68,7 +68,10 @@ public class OrderDataLogic implements ServiceLogic {
String resultStr =
"6815".concat(req.get("seqhex").toString()).concat("0040").concat(orderNo).concat(ServiceResult.HEX_00);
resultStr = resultStr.concat(CRCCalculator.calcCrc(resultStr));
final R r = pileOrderService.pileEndOrder(orderNo); //todo 优化 通知第三方
if (orderNo.equals("00000000000000000000000000000000")) {
return new ServiceResult(HexUtils.toBytes(resultStr), ServiceResult.OK);
}
final R r = pileOrderService.pileEndOrder(orderNo);
if (r.getCode() == 200)
return new ServiceResult(HexUtils.toBytes(resultStr), ServiceResult.OK);
else

View File

@ -48,7 +48,7 @@ public class RealtimeDataLogic implements ServiceLogic {
@Autowired
private ChargingController chargingController;
private static Logger log = LoggerFactory.getLogger(RealtimeDataLogic.class);
private static final Logger log = LoggerFactory.getLogger(RealtimeDataLogic.class);
public static final String[] stable = {"离线", "故障", "空闲", "充电中"};
public static final String[] pvgstable = {"", "", "未知"};
@ -159,7 +159,7 @@ public class RealtimeDataLogic implements ServiceLogic {
HashMap<String, String> paramMap = new HashMap<>();
paramMap.put("battery", stopSoc.toString());
paramMap.put("phone", tel);
paramMap.put("content", "【小华充电】尊敬的用户你的车辆已充电达至设定的SOC(" + stopSoc.toString() + "%)" +
paramMap.put("content", "【小华充电】尊敬的用户你的车辆已充电达至设定的SOC(" + stopSoc + "%)" +
"已自动停止充电,请您尽快将车辆挪走以方便他人使用充电桩,谢谢合作。");
smsService.sendNotice(paramMap);
cacheOrder.put("socalerted", "true");
@ -188,14 +188,13 @@ public class RealtimeDataLogic implements ServiceLogic {
if (errorfreecnt == 2) {
CacheRealtimeData cacheRData = REDIS.getCacheObject(orderkey.concat(".lord"));
R r = null;
final String stopResult = (String) cacheOrder.get("stopResult");
if (cacheRData == null) {
r = pileOrderService.abnormalOrder(orderNo); //todo 优化 通知第三方
} else if ("01".equals(stopResult)) {
r = pileOrderService.abnormalOrder(orderNo);
} else {
CacheOrderData lordAsOd = new CacheOrderData(cacheRData, (String) cacheOrder.get("orderstarttime"),
(Integer) cacheOrder.get("startSoc"), (Integer) cacheOrder.get("stopSoc"));
cacheOrder.put("orderData", lordAsOd);
r = pileOrderService.pileEndOrder(orderNo); //todo 优化 通知第三方
r = pileOrderService.pileEndOrder(orderNo);
REDIS.setCacheMap(orderkey, cacheOrder);
}
if (r == null || r.getCode() != 200) {
@ -215,13 +214,13 @@ public class RealtimeDataLogic implements ServiceLogic {
idleCnt = idleCnt == null ? 0 : idleCnt;
idleCnt++;
if (idleCnt > 3) {
if (orderkey != null) {
if (orderkey != null && orderkey.length() > 0) {
Map<String, Object> problematicOrder = REDIS.getCacheMap(orderkey);
Object orderData = problematicOrder.get("orderData");
String status = (String) problematicOrder.get("status");
if (!isInteger(status) && !status.equals("充电中") && orderData == null) {
String lorder = orderkey.replace("order:", "");
pileOrderService.abnormalOrder(lorder); //todo 优化 通知第三方
pileOrderService.abnormalOrder(lorder);
log.error("abnormal.2 order[{}]", lorder);
cacheGun.put("orderkey", null);
idleCnt = 0;