diff --git a/ebike-maintenance/src/main/java/com/cdzy/ebikemaintenance/component/EbikeCoreHandler.java b/ebike-maintenance/src/main/java/com/cdzy/ebikemaintenance/component/EbikeCoreHandler.java index 354cbd72..6bf81639 100644 --- a/ebike-maintenance/src/main/java/com/cdzy/ebikemaintenance/component/EbikeCoreHandler.java +++ b/ebike-maintenance/src/main/java/com/cdzy/ebikemaintenance/component/EbikeCoreHandler.java @@ -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 executeCommand(String ecuSn, String cmdCode) { + CompletableFuture 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 timedOutFuture = pendingRequests.remove(tid); + if (timedOutFuture != null) { + timedOutFuture.completeExceptionally(new TimeoutException("超时未响应")); + } + }, 5, TimeUnit.SECONDS); + return future; + } + /** * kafka信息统一处理 * diff --git a/ebike-maintenance/src/main/java/com/cdzy/ebikemaintenance/controller/EbikeCoreController.java b/ebike-maintenance/src/main/java/com/cdzy/ebikemaintenance/controller/EbikeInfoCoreController.java similarity index 99% rename from ebike-maintenance/src/main/java/com/cdzy/ebikemaintenance/controller/EbikeCoreController.java rename to ebike-maintenance/src/main/java/com/cdzy/ebikemaintenance/controller/EbikeInfoCoreController.java index cc0b56f9..78009fa5 100644 --- a/ebike-maintenance/src/main/java/com/cdzy/ebikemaintenance/controller/EbikeCoreController.java +++ b/ebike-maintenance/src/main/java/com/cdzy/ebikemaintenance/controller/EbikeInfoCoreController.java @@ -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; diff --git a/ebike-maintenance/src/main/java/com/cdzy/ebikemaintenance/controller/EbikeTestCoreController.java b/ebike-maintenance/src/main/java/com/cdzy/ebikemaintenance/controller/EbikeTestCoreController.java new file mode 100644 index 00000000..54a8c55c --- /dev/null +++ b/ebike-maintenance/src/main/java/com/cdzy/ebikemaintenance/controller/EbikeTestCoreController.java @@ -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> findEbike(@RequestParam("ecuSn") String ecuSn) { + DeferredResult> 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> gps(@RequestParam("ecuSn") String ecuSn) { + DeferredResult> 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> openBatteryLock(@RequestParam("ecuSn") String ecuSn) { + DeferredResult> 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> closeBatteryLock(@RequestParam("ecuSn") String ecuSn) { + DeferredResult> 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> lock(@RequestParam("ecuSn") String ecuSn) { + DeferredResult> 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> unlock(@RequestParam("ecuSn") String ecuSn) { + DeferredResult> 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> openHelmet(@RequestParam("ecuSn") String ecuSn) { + DeferredResult> 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> cameraReturn(@RequestParam("ecuSn") String ecuSn) { + DeferredResult> 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> cancelAntiTheft(@RequestParam("ecuSn") String ecuSn) { + DeferredResult> 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> powerOff(@RequestParam("ecuSn") String ecuSn) { + DeferredResult> 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> restart(@RequestParam("ecuSn") String ecuSn) { + DeferredResult> 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> tempLock(@RequestParam("ecuSn") String ecuSn) { + DeferredResult> 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; + } +} diff --git a/ebike-maintenance/src/main/java/com/cdzy/ebikemaintenance/service/impl/EbikeBikeInfoServiceImpl.java b/ebike-maintenance/src/main/java/com/cdzy/ebikemaintenance/service/impl/EbikeBikeInfoServiceImpl.java index 102db603..8272ff5d 100644 --- a/ebike-maintenance/src/main/java/com/cdzy/ebikemaintenance/service/impl/EbikeBikeInfoServiceImpl.java +++ b/ebike-maintenance/src/main/java/com/cdzy/ebikemaintenance/service/impl/EbikeBikeInfoServiceImpl.java @@ -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