代码检查

This commit is contained in:
attiya 2025-05-22 16:55:54 +08:00
parent 77489ee59d
commit 074b3bd8a3
4 changed files with 471 additions and 8 deletions

View File

@ -22,6 +22,7 @@ import java.util.UUID;
import java.util.concurrent.*;
import static com.cdzy.ebikemaintenance.model.pojo.table.EbikeCmdTableDef.EBIKE_CMD;
import static com.cdzy.ebikemaintenance.model.pojo.table.EbikeEcuInfoTableDef.EBIKE_ECU_INFO;
import static com.cdzy.ebikemaintenance.model.pojo.table.EbikeParamTableDef.EBIKE_PARAM;
import static com.cdzy.ebikemaintenance.model.pojo.table.EbikeParamValueTableDef.EBIKE_PARAM_VALUE;
@ -43,7 +44,7 @@ public class EbikeCoreHandler {
/**
* 下发命令
* 根据ecuId下发命令
*
* @param ecuID 中控ID
* @return 一致性返回
@ -87,6 +88,45 @@ public class EbikeCoreHandler {
return future;
}
/**
* 根据eucSn下发命令
*
* @param ecuSn 中控编号
* @return 一致性返回
*/
public CompletableFuture<String> executeCommand(String ecuSn, String cmdCode) {
CompletableFuture<String> future = new CompletableFuture<>();
EbikeEcuInfoService ebikeEcuInfoService = SpringContextHolder.getBean(EbikeEcuInfoService.class);
QueryWrapper queryWrapper = QueryWrapper.create()
.where(EBIKE_ECU_INFO.ECU_SN.eq(ecuSn));
EbikeEcuInfo ebikeEcuInfo = ebikeEcuInfoService.getOne(queryWrapper);
if (ebikeEcuInfo == null) {
throw new RuntimeException("中控编号错误");
}
CMDMsg cmdMsg = new CMDMsg();
cmdMsg.setDeviceId(ecuSn);
cmdMsg.setGroup(ebikeEcuInfo.getOperatorCode());
String tid = UUID.randomUUID().toString().replace("-", "");
String command = getCommand(cmdCode, tid);
cmdMsg.setCommand(command);
// 注册响应监听
pendingRequests.put(tid, future);
String string = JSONObject.toJSONString(cmdMsg);
producer.send("command", string);
// 设置超时任务30秒未响应则超时
timeoutScheduler.schedule(() -> {
CompletableFuture<String> timedOutFuture = pendingRequests.remove(tid);
if (timedOutFuture != null) {
timedOutFuture.completeExceptionally(new TimeoutException("超时未响应"));
}
}, 5, TimeUnit.SECONDS);
return future;
}
/**
* kafka信息统一处理
*

View File

@ -5,11 +5,11 @@ import com.alibaba.fastjson2.JSONObject;
import com.cdzy.common.enums.Code;
import com.cdzy.common.model.CoreResult;
import com.cdzy.common.model.JsonResult;
import com.cdzy.common.model.ResGPSDto;
import com.cdzy.ebikemaintenance.component.EbikeCoreHandler;
import com.cdzy.ebikemaintenance.enums.CmdCode;
import com.cdzy.ebikemaintenance.mapper.EbikeErrorMsgMapper;
import com.cdzy.ebikemaintenance.model.dto.request.ReqEbikeBikeComDto;
import com.cdzy.common.model.ResGPSDto;
import com.cdzy.ebikemaintenance.model.pojo.EbikeEcuInfo;
import com.cdzy.ebikemaintenance.model.pojo.EbikeErrorMsg;
import com.cdzy.ebikemaintenance.service.EbikeBikeComService;
@ -33,7 +33,7 @@ import java.io.IOException;
import static com.cdzy.ebikemaintenance.model.pojo.table.EbikeErrorMsgTableDef.EBIKE_ERROR_MSG;
/**
* 测试中控控制层
* 车俩详情测试中控控制层
*
* @author attiya
* @since 2025-03-18
@ -41,7 +41,7 @@ import static com.cdzy.ebikemaintenance.model.pojo.table.EbikeErrorMsgTableDef.E
@RestController
@RequestMapping("/core")
@Validated
public class EbikeCoreController {
public class EbikeInfoCoreController {
@Resource
private EbikeCoreHandler ebikeCoreService;

View File

@ -0,0 +1,423 @@
package com.cdzy.ebikemaintenance.controller;
import com.alibaba.fastjson2.JSONObject;
import com.cdzy.common.enums.Code;
import com.cdzy.common.model.CoreResult;
import com.cdzy.common.model.JsonResult;
import com.cdzy.common.model.ResGPSDto;
import com.cdzy.ebikemaintenance.component.EbikeCoreHandler;
import com.cdzy.ebikemaintenance.enums.CmdCode;
import com.cdzy.ebikemaintenance.mapper.EbikeErrorMsgMapper;
import com.cdzy.ebikemaintenance.model.pojo.EbikeErrorMsg;
import com.cdzy.ebikemaintenance.utils.EmqxApiClient;
import com.cdzy.ebikemaintenance.utils.RedisUtil;
import com.mybatisflex.core.query.QueryWrapper;
import jakarta.annotation.Resource;
import jakarta.validation.constraints.NotNull;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.request.async.DeferredResult;
import java.io.IOException;
import static com.cdzy.ebikemaintenance.model.pojo.table.EbikeErrorMsgTableDef.EBIKE_ERROR_MSG;
/**
* 测试中控控制层
*
* @author attiya
* @since 2025-03-18
*/
@RestController
@RequestMapping("/testCore")
@Validated
public class EbikeTestCoreController {
@Resource
private EbikeCoreHandler ebikeCoreService;
@Resource
private RedisUtil redisUtil;
@Resource
private EbikeErrorMsgMapper errorMsgMapper;
/**
* 设备是否在线
*
* @return 执行结构
*/
@GetMapping("online")
public JsonResult<?> online(@RequestParam("ecuSn") String ecuSn) throws IOException {
boolean online = EmqxApiClient.isClientOnline(ecuSn);
CoreResult result = online ? CoreResult.online() : CoreResult.offline();
return JsonResult.success(result);
}
/**
* 寻车铃
*
* @return 执行结构
*/
@GetMapping("findEbike")
public DeferredResult<JsonResult<?>> findEbike(@RequestParam("ecuSn") String ecuSn) {
DeferredResult<JsonResult<?>> deferredResult = new DeferredResult<>(5000L); // 5秒超时
ebikeCoreService.executeCommand(ecuSn, CmdCode.VIDEO_5).whenComplete((response, ex) -> {
if (ex != null) {
CoreResult result = CoreResult.failed(ex.getMessage());
deferredResult.setResult(JsonResult.success(result));
} else {
JSONObject jsonObject = JSONObject.parseObject(response);
Integer code = jsonObject.getInteger("code");
if (code == 0) {
CoreResult success = CoreResult.success();
deferredResult.setResult(JsonResult.success(success));
} else {
QueryWrapper queryWrapper = QueryWrapper.create().where(EBIKE_ERROR_MSG.CODE.eq(code));
EbikeErrorMsg ebikeErrorMsg = errorMsgMapper.selectOneByQuery(queryWrapper);
CoreResult failed = CoreResult.failed(code, ebikeErrorMsg.getMsg());
deferredResult.setResult(JsonResult.success(failed));
}
}
});
return deferredResult;
}
/**
* GPS定位
*
* @return 执行结构
*/
@GetMapping("gps")
public DeferredResult<JsonResult<?>> gps(@RequestParam("ecuSn") String ecuSn) {
DeferredResult<JsonResult<?>> deferredResult = new DeferredResult<>(5000L); // 5秒超时
ebikeCoreService.executeCommand(ecuSn, CmdCode.GPS).whenComplete((response, ex) -> {
if (ex != null) {
CoreResult result = CoreResult.failed(ex.getMessage());
deferredResult.setResult(JsonResult.success(result));
} else {
JSONObject jsonObject = JSONObject.parseObject(response);
Integer code = jsonObject.getInteger("code");
if (code == 0) {
CoreResult success = CoreResult.success();
deferredResult.setResult(JsonResult.success(success));
} else {
QueryWrapper queryWrapper = QueryWrapper.create().where(EBIKE_ERROR_MSG.CODE.eq(code));
EbikeErrorMsg ebikeErrorMsg = errorMsgMapper.selectOneByQuery(queryWrapper);
CoreResult failed = CoreResult.failed(code, ebikeErrorMsg.getMsg());
deferredResult.setResult(JsonResult.success(failed));
}
}
});
return deferredResult;
}
/**
* 获取GPS定位信息
*
* @return 执行结构
*/
@GetMapping("gpsMsg")
public JsonResult<?> gpsMsg(@NotNull(message = "中控SN码不能为空") @RequestParam("ecuSn") String ecuSn) {
String jsonString = JSONObject.toJSONString(redisUtil.get(ecuSn));
ResGPSDto resGpsDto = JSONObject.parseObject(jsonString, ResGPSDto.class);
return JsonResult.success(resGpsDto);
}
/**
* 打开电池仓
*
* @return 执行结构
*/
@GetMapping("openBatteryLock")
public DeferredResult<JsonResult<?>> openBatteryLock(@RequestParam("ecuSn") String ecuSn) {
DeferredResult<JsonResult<?>> deferredResult = new DeferredResult<>(5000L); // 5秒超时
ebikeCoreService.executeCommand(ecuSn, CmdCode.OPEN_BATTERY_LOCK).whenComplete((response, ex) -> {
if (ex != null) {
CoreResult result = CoreResult.failed(ex.getMessage());
deferredResult.setResult(JsonResult.success(result));
} else {
JSONObject jsonObject = JSONObject.parseObject(response);
Integer code = jsonObject.getInteger("code");
if (code == Code.COMMAND_SUCCESS) {
CoreResult success = CoreResult.success();
deferredResult.setResult(JsonResult.success(success));
} else {
QueryWrapper queryWrapper = QueryWrapper.create().where(EBIKE_ERROR_MSG.CODE.eq(code));
EbikeErrorMsg ebikeErrorMsg = errorMsgMapper.selectOneByQuery(queryWrapper);
CoreResult failed = CoreResult.failed(code, ebikeErrorMsg.getMsg());
deferredResult.setResult(JsonResult.success(failed));
}
}
});
return deferredResult;
}
/**
* 关闭电池仓
*
* @return 执行结构
*/
@GetMapping("closeBatteryLock")
public DeferredResult<JsonResult<?>> closeBatteryLock(@RequestParam("ecuSn") String ecuSn) {
DeferredResult<JsonResult<?>> deferredResult = new DeferredResult<>(5000L); // 5秒超时
ebikeCoreService.executeCommand(ecuSn, CmdCode.CLOSE_BATTERY_LOCK).whenComplete((response, ex) -> {
if (ex != null) {
CoreResult result = CoreResult.failed(ex.getMessage());
deferredResult.setResult(JsonResult.success(result));
} else {
JSONObject jsonObject = JSONObject.parseObject(response);
Integer code = jsonObject.getInteger("code");
if (code == Code.COMMAND_SUCCESS) {
CoreResult success = CoreResult.success();
deferredResult.setResult(JsonResult.success(success));
} else {
QueryWrapper queryWrapper = QueryWrapper.create().where(EBIKE_ERROR_MSG.CODE.eq(code));
EbikeErrorMsg ebikeErrorMsg = errorMsgMapper.selectOneByQuery(queryWrapper);
CoreResult failed = CoreResult.failed(code, ebikeErrorMsg.getMsg());
deferredResult.setResult(JsonResult.success(failed));
}
}
});
return deferredResult;
}
/**
* 关锁
*
* @return 执行结构
*/
@GetMapping("lock")
public DeferredResult<JsonResult<?>> lock(@RequestParam("ecuSn") String ecuSn) {
DeferredResult<JsonResult<?>> deferredResult = new DeferredResult<>(5000L); // 5秒超时
ebikeCoreService.executeCommand(ecuSn, CmdCode.LOCK).whenComplete((response, ex) -> {
if (ex != null) {
CoreResult result = CoreResult.failed(ex.getMessage());
deferredResult.setResult(JsonResult.success(result));
} else {
JSONObject jsonObject = JSONObject.parseObject(response);
Integer code = jsonObject.getInteger("code");
if (code == 0) {
CoreResult success = CoreResult.success();
deferredResult.setResult(JsonResult.success(success));
} else {
QueryWrapper queryWrapper = QueryWrapper.create().where(EBIKE_ERROR_MSG.CODE.eq(code));
EbikeErrorMsg ebikeErrorMsg = errorMsgMapper.selectOneByQuery(queryWrapper);
CoreResult failed = CoreResult.failed(code, ebikeErrorMsg.getMsg());
deferredResult.setResult(JsonResult.success(failed));
}
}
});
return deferredResult;
}
/**
* 开锁
*
* @return 执行结构
*/
@GetMapping("unlock")
public DeferredResult<JsonResult<?>> unlock(@RequestParam("ecuSn") String ecuSn) {
DeferredResult<JsonResult<?>> deferredResult = new DeferredResult<>(5000L); // 5秒超时
ebikeCoreService.executeCommand(ecuSn, CmdCode.UNLOCK).whenComplete((response, ex) -> {
if (ex != null) {
CoreResult result = CoreResult.failed(ex.getMessage());
deferredResult.setResult(JsonResult.success(result));
} else {
JSONObject jsonObject = JSONObject.parseObject(response);
Integer code = jsonObject.getInteger("code");
if (code == 0) {
CoreResult success = CoreResult.success();
deferredResult.setResult(JsonResult.success(success));
} else {
QueryWrapper queryWrapper = QueryWrapper.create().where(EBIKE_ERROR_MSG.CODE.eq(code));
EbikeErrorMsg ebikeErrorMsg = errorMsgMapper.selectOneByQuery(queryWrapper);
CoreResult failed = CoreResult.failed(code, ebikeErrorMsg.getMsg());
deferredResult.setResult(JsonResult.success(failed));
}
}
});
return deferredResult;
}
/**
* 打开头盔
*
* @return 执行结构
*/
@GetMapping("openHelmet")
public DeferredResult<JsonResult<?>> openHelmet(@RequestParam("ecuSn") String ecuSn) {
DeferredResult<JsonResult<?>> deferredResult = new DeferredResult<>(5000L); // 5秒超时
ebikeCoreService.executeCommand(ecuSn, CmdCode.OPEN_HEMET).whenComplete((response, ex) -> {
if (ex != null) {
CoreResult result = CoreResult.failed(ex.getMessage());
deferredResult.setResult(JsonResult.success(result));
} else {
JSONObject jsonObject = JSONObject.parseObject(response);
Integer code = jsonObject.getInteger("code");
if (code == 0) {
CoreResult success = CoreResult.success();
deferredResult.setResult(JsonResult.success(success));
} else {
QueryWrapper queryWrapper = QueryWrapper.create().where(EBIKE_ERROR_MSG.CODE.eq(code));
EbikeErrorMsg ebikeErrorMsg = errorMsgMapper.selectOneByQuery(queryWrapper);
CoreResult failed = CoreResult.failed(code, ebikeErrorMsg.getMsg());
deferredResult.setResult(JsonResult.success(failed));
}
}
});
return deferredResult;
}
/**
* 摄像头还车
*
* @return 执行结构
*/
@GetMapping("cameraReturn")
public DeferredResult<JsonResult<?>> cameraReturn(@RequestParam("ecuSn") String ecuSn) {
DeferredResult<JsonResult<?>> deferredResult = new DeferredResult<>(5000L); // 5秒超时
ebikeCoreService.executeCommand(ecuSn, CmdCode.CAMERA_RETURN).whenComplete((response, ex) -> {
if (ex != null) {
CoreResult result = CoreResult.failed(ex.getMessage());
deferredResult.setResult(JsonResult.success(result));
} else {
JSONObject jsonObject = JSONObject.parseObject(response);
Integer code = jsonObject.getInteger("code");
if (code == 0) {
CoreResult success = CoreResult.success();
deferredResult.setResult(JsonResult.success(success));
} else {
QueryWrapper queryWrapper = QueryWrapper.create().where(EBIKE_ERROR_MSG.CODE.eq(code));
EbikeErrorMsg ebikeErrorMsg = errorMsgMapper.selectOneByQuery(queryWrapper);
CoreResult failed = CoreResult.failed(code, ebikeErrorMsg.getMsg());
deferredResult.setResult(JsonResult.success(failed));
}
}
});
return deferredResult;
}
/**
* 取消设防
*
* @return 执行结构
*/
@GetMapping("cancelAntiTheft")
public DeferredResult<JsonResult<?>> cancelAntiTheft(@RequestParam("ecuSn") String ecuSn) {
DeferredResult<JsonResult<?>> deferredResult = new DeferredResult<>(5000L); // 5秒超时
ebikeCoreService.executeCommand(ecuSn, CmdCode.CANCEL_ANTI_THEFT).whenComplete((response, ex) -> {
if (ex != null) {
CoreResult result = CoreResult.failed(ex.getMessage());
deferredResult.setResult(JsonResult.success(result));
} else {
JSONObject jsonObject = JSONObject.parseObject(response);
Integer code = jsonObject.getInteger("code");
if (code == 0) {
CoreResult success = CoreResult.success();
deferredResult.setResult(JsonResult.success(success));
} else {
QueryWrapper queryWrapper = QueryWrapper.create().where(EBIKE_ERROR_MSG.CODE.eq(code));
EbikeErrorMsg ebikeErrorMsg = errorMsgMapper.selectOneByQuery(queryWrapper);
CoreResult failed = CoreResult.failed(code, ebikeErrorMsg.getMsg());
deferredResult.setResult(JsonResult.success(failed));
}
}
});
return deferredResult;
}
/**
* 关闭电源
*
* @return 执行结构
*/
@GetMapping("powerOff")
public DeferredResult<JsonResult<?>> powerOff(@RequestParam("ecuSn") String ecuSn) {
DeferredResult<JsonResult<?>> deferredResult = new DeferredResult<>(5000L); // 5秒超时
ebikeCoreService.executeCommand(ecuSn, CmdCode.GPS).whenComplete((response, ex) -> {
if (ex != null) {
CoreResult result = CoreResult.failed(ex.getMessage());
deferredResult.setResult(JsonResult.success(result));
} else {
JSONObject jsonObject = JSONObject.parseObject(response);
Integer code = jsonObject.getInteger("code");
if (code == 0) {
CoreResult success = CoreResult.success();
deferredResult.setResult(JsonResult.success(success));
} else {
QueryWrapper queryWrapper = QueryWrapper.create().where(EBIKE_ERROR_MSG.CODE.eq(code));
EbikeErrorMsg ebikeErrorMsg = errorMsgMapper.selectOneByQuery(queryWrapper);
CoreResult failed = CoreResult.failed(code, ebikeErrorMsg.getMsg());
deferredResult.setResult(JsonResult.success(failed));
}
}
});
return deferredResult;
}
/**
* 远程重启
*
* @return 执行结构
*/
@GetMapping("restart")
public DeferredResult<JsonResult<?>> restart(@RequestParam("ecuSn") String ecuSn) {
DeferredResult<JsonResult<?>> deferredResult = new DeferredResult<>(5000L); // 5秒超时
ebikeCoreService.executeCommand(ecuSn, CmdCode.RESTART).whenComplete((response, ex) -> {
if (ex != null) {
CoreResult result = CoreResult.failed(ex.getMessage());
deferredResult.setResult(JsonResult.success(result));
} else {
JSONObject jsonObject = JSONObject.parseObject(response);
Integer code = jsonObject.getInteger("code");
if (code == 0) {
CoreResult success = CoreResult.success();
deferredResult.setResult(JsonResult.success(success));
} else {
QueryWrapper queryWrapper = QueryWrapper.create().where(EBIKE_ERROR_MSG.CODE.eq(code));
EbikeErrorMsg ebikeErrorMsg = errorMsgMapper.selectOneByQuery(queryWrapper);
CoreResult failed = CoreResult.failed(code, ebikeErrorMsg.getMsg());
deferredResult.setResult(JsonResult.success(failed));
}
}
});
return deferredResult;
}
/**
* 临时锁车
*
* @return 执行结构
*/
@GetMapping("tempLock")
public DeferredResult<JsonResult<?>> tempLock(@RequestParam("ecuSn") String ecuSn) {
DeferredResult<JsonResult<?>> deferredResult = new DeferredResult<>(5000L); // 5秒超时
ebikeCoreService.executeCommand(ecuSn, CmdCode.TEMP_LOCK).whenComplete((response, ex) -> {
if (ex != null) {
CoreResult result = CoreResult.failed(ex.getMessage());
deferredResult.setResult(JsonResult.success(result));
} else {
JSONObject jsonObject = JSONObject.parseObject(response);
Integer code = jsonObject.getInteger("code");
if (code == 0) {
CoreResult success = CoreResult.success();
deferredResult.setResult(JsonResult.success(success));
} else {
QueryWrapper queryWrapper = QueryWrapper.create().where(EBIKE_ERROR_MSG.CODE.eq(code));
EbikeErrorMsg ebikeErrorMsg = errorMsgMapper.selectOneByQuery(queryWrapper);
CoreResult failed = CoreResult.failed(code, ebikeErrorMsg.getMsg());
deferredResult.setResult(JsonResult.success(failed));
}
}
});
return deferredResult;
}
}

View File

@ -10,7 +10,7 @@ import com.cdzy.common.model.JsonResult;
import com.cdzy.common.model.PageParam;
import com.cdzy.common.model.ResGPSDto;
import com.cdzy.common.utils.CoordinateUtil;
import com.cdzy.ebikemaintenance.controller.EbikeCoreController;
import com.cdzy.ebikemaintenance.controller.EbikeInfoCoreController;
import com.cdzy.ebikemaintenance.mapper.*;
import com.cdzy.ebikemaintenance.model.dto.request.*;
import com.cdzy.ebikemaintenance.model.dto.response.*;
@ -35,7 +35,6 @@ import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.apache.kafka.common.errors.ResourceNotFoundException;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
@ -61,7 +60,8 @@ import static com.cdzy.ebikemaintenance.model.pojo.table.EbikeBikeOrderTableDef.
import static com.cdzy.ebikemaintenance.model.pojo.table.EbikeCarStatusInfoTableDef.EBIKE_CAR_STATUS_INFO;
import static com.cdzy.ebikemaintenance.model.pojo.table.EbikeDispatchRecordsTableDef.EBIKE_DISPATCH_RECORDS;
import static com.cdzy.ebikemaintenance.model.pojo.table.EbikeEcuInfoTableDef.EBIKE_ECU_INFO;
import static com.mybatisflex.core.query.QueryMethods.*;
import static com.mybatisflex.core.query.QueryMethods.max;
import static com.mybatisflex.core.query.QueryMethods.select;
/**
* 车辆基本信息 服务层实现
@ -112,7 +112,7 @@ public class EbikeBikeInfoServiceImpl extends ServiceImpl<EbikeBikeInfoMapper, E
private RedisUtil redisUtil;
@Resource
private EbikeCoreController ebikeCoreController;
private EbikeInfoCoreController ebikeCoreController;
@Resource
private MinioUtil minioUtil;