处理发送命令后超时报错,但是车辆启动的问题

This commit is contained in:
邱贞招 2024-11-21 16:14:38 +08:00
parent ef093e84c3
commit e405734501
2 changed files with 59 additions and 29 deletions

View File

@ -226,7 +226,7 @@ iot:
# iot秘钥
accessKey: dJqF0qYhUbK/o1Pr9I5qxNoP14FlJLC+BFK2ZTjUX+lnKwoNYvBYsM/7Xu1ERIzSkUoxVkP/N1RMvGlBKMoBtA==
# 超时响应时间(秒)
timeout: 5
timeout: 10
# token过期时间
daysToExpire: 100
# 推送消息token

View File

@ -882,34 +882,8 @@ public class AsDeviceServiceImpl extends ServiceImpl<AsDeviceMapper, AsDevice> i
}
String sessionId = IdUtils.randomUUIDByDigit(8);
AsDevice asDevice = asDeviceMapper.selectAsDeviceBySn(orderVo.getSn());
/** 1.获取token*/
String token = Token.getToken();
String finalOrderNo = orderNo;
if(!"true".equals(orderVo.getIsBluetooth())){
/** 2.发送命令*/
ResponseVo responseVo = sendCommandWithResp(asDevice.getMac(), token, IotConstants.COMMAND_OPEN+IotConstants.COMMAND_FREQUENCY_5, "编号开锁", finalOrderNo);
if(responseVo.getCode() != 0){
// todo asDevice.getMac()
log.info("【扫码/编号开锁骑行】发送开锁命令失败,通过api重新查询状态");
throw new ServiceException("【扫码/编号开锁骑行】发送开锁命令失败");
}
}else{
asDevice.setLongitude(orderVo.getLon());
asDevice.setLatitude(orderVo.getLat());
asDevice.setLastTime(DateUtils.getNowDate());
}
/** 3.更新车辆状态*/
asDevice.setLockStatus(ServiceConstants.LOCK_STATUS_OPEN);
asDevice.setStatus(ServiceConstants.VEHICLE_STATUS_IN_USING);
asDevice.setIsAdminUnlocking("0");
int device = asDeviceMapper.updateAsDevice(asDevice);
if(device==0){
log.info("【扫码/编号开锁骑行】更新车辆状态失败");
throw new ServiceException("【扫码/编号开锁骑行】更新车辆状态失败");
}
/** 4.如果有预约订单则更新订单的预约结束时间,如果没有预约,则创建订单*/
EtOrder order = etOrderService.selectEtOrderByOrderNo(finalOrderNo);
EtOrder order = etOrderService.selectEtOrderByOrderNo(orderNo);
if(ObjectUtil.isNotNull(order)){//有订单号可能是套餐也可能是有预约
if(ObjectUtil.isNotNull(order.getRuleId())){//套餐
log.info("【扫码/编号开锁骑行】---预约扫码骑行");
@ -931,7 +905,7 @@ public class AsDeviceServiceImpl extends ServiceImpl<AsDeviceMapper, AsDevice> i
}
}else{
log.info("【扫码/编号开锁骑行】---无订单号,正常开锁骑行订单");
order = etOrderService.createOrder(orderVo, finalOrderNo);
order = etOrderService.createOrder(orderVo, orderNo);
int etOrder = etOrderService.insertEtOrder(order);
if(etOrder==0){
log.info("【扫码/编号开锁骑行】保存订单失败");
@ -944,12 +918,68 @@ public class AsDeviceServiceImpl extends ServiceImpl<AsDeviceMapper, AsDevice> i
log.info("【扫码/编号开锁骑行】记录行程失败");
throw new ServiceException("【扫码/编号开锁骑行】记录行程失败");
}
/** 1.获取token*/
String token = Token.getToken();
if(!"true".equals(orderVo.getIsBluetooth())){
/** 2.发送命令*/
ResponseVo responseVo = sendCommandWithResp(asDevice.getMac(), token, IotConstants.COMMAND_OPEN+IotConstants.COMMAND_FREQUENCY_5, "编号开锁", orderNo);
if(responseVo.getCode() != 0){
// 开锁失败的处理
boolean b = failHandle(responseVo, asDevice, token);
}
}else{
asDevice.setLongitude(orderVo.getLon());
asDevice.setLatitude(orderVo.getLat());
asDevice.setLastTime(DateUtils.getNowDate());
}
/** 3.更新车辆状态*/
asDevice.setLockStatus(ServiceConstants.LOCK_STATUS_OPEN);
asDevice.setStatus(ServiceConstants.VEHICLE_STATUS_IN_USING);
asDevice.setIsAdminUnlocking("0");
int device = asDeviceMapper.updateAsDevice(asDevice);
if(device==0){
log.info("【扫码/编号开锁骑行】更新车辆状态失败");
throw new ServiceException("【扫码/编号开锁骑行】更新车辆状态失败");
}
log.info("【扫码/编号开锁骑行】车辆开锁成功");
response.setOrderNo(orderNo);
response.setSessionId(sessionId);
return response;
}
private boolean failHandle(ResponseVo responseVo, AsDevice asDevice, String token) throws InterruptedException {
// todo asDevice.getMac() 2秒之后重新发送命令 10500
if(responseVo.getCode() == 10500){
log.info("【扫码/编号开锁骑行】发送开锁命令失败,隔两秒之后通过api重新查询状态");
// 2秒之后执行以下代码
Thread.sleep(2000);
DataPointRes datapoints = historyDatapoints(asDevice.getMac(), token);
if(datapoints.getCode() == 0){
Data data = datapoints.getData();
List<Datastream> datastreams = data.getDevices();
for (Datastream datastream: datastreams) {
List<Datapoint> datapointList = datastream.getDatastreams();
if(ObjectUtil.isNotNull(datapointList)){
for (Datapoint datapoint:datapointList) {
if(datapoint.getId().equals(IotConstants.ONENET_LOCATION)){
String string = JSON.toJSONString(datapoint.getValue());
if(StrUtil.isNotBlank(string)){
LocationVo locationVo = JSONObject.parseObject(string, LocationVo.class);
log.info("【发送开锁命令失败,通过api重新查询状态】 locationVo---【{}】" , JSON.toJSONString(locationVo));
if(locationVo.getStatus() == 1){
log.info("【车已经打开了】");
return true;
}
}
}
}
}
}
}
}
throw new ServiceException("【扫码/编号开锁骑行】发送开锁命令失败");
}
/**
* 管理员开锁
*/