From eea1272d42e8d0719bf57802c4536c8b2bd072224fd3bf22390126ddbcb07564 Mon Sep 17 00:00:00 2001 From: attiya <2413103649@qq.com> Date: Fri, 5 Dec 2025 10:45:04 +0800 Subject: [PATCH] =?UTF-8?q?=E8=BD=A6=E8=BE=86=E5=9C=A8=E7=BA=BF=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/EbikeBikeOrderController.java | 28 ++++++++++++- .../model/dto/EbikeOrderBikeListDto.java | 5 +++ .../service/EbikeBikeOrderService.java | 10 ++++- .../impl/EbikeBikeOrderServiceImpl.java | 19 ++++++++- .../cdzy/operations/utils/EmqxApiClient.java | 41 ++++++++++--------- .../EbikeOperationsApplicationTests.java | 18 +------- 6 files changed, 81 insertions(+), 40 deletions(-) diff --git a/ebike-operations/src/main/java/com/cdzy/operations/controller/EbikeBikeOrderController.java b/ebike-operations/src/main/java/com/cdzy/operations/controller/EbikeBikeOrderController.java index 2cf3137..0a0bf3f 100644 --- a/ebike-operations/src/main/java/com/cdzy/operations/controller/EbikeBikeOrderController.java +++ b/ebike-operations/src/main/java/com/cdzy/operations/controller/EbikeBikeOrderController.java @@ -23,6 +23,7 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; +import java.io.IOException; import java.util.List; import java.util.Objects; @@ -118,6 +119,17 @@ public class EbikeBikeOrderController { return JsonResult.success(); } +// /** +// * 完成巡检工单。 +// * +// * @return 结果 +// */ +// @PostMapping("doInspection") +// public JsonResult doInspection() { +// ebikeBikeOrderService.doInspection(inspectionSwapOrderVo); +// return JsonResult.success(); +// } + /** * 生成调度工单。 * @@ -201,7 +213,7 @@ public class EbikeBikeOrderController { } /** - * 更换电池(换电工单用) + * 更换电池(换电工单用,完成换电工单) * * @return 操作结果 */ @@ -211,13 +223,25 @@ public class EbikeBikeOrderController { return JsonResult.success(); } +// /** +// * 完成调度工单。 +// * +// * @param bikeCode 车辆编号 +// * @return 结果 +// */ +// @GetMapping("bikeDispatch") +// public JsonResult bikeDispatch(@NotNull(message = "车辆编号不能为空") String bikeCode,@NotNull(message = "站点ID不能为空")Long siteId) { +// ebikeBikeOrderService.bikeDispatch(bikeCode,siteId); +// return JsonResult.success(); +// } + /** * 车辆列表(工单用) * * @return 操作结果 */ @GetMapping("bikeList") - public JsonResult> bikeList(@RequestParam("regionId") Long regionId) { + public JsonResult> bikeList(@RequestParam("regionId") Long regionId) throws IOException { List list = ebikeBikeOrderService.bikeList(regionId); return JsonResult.success(list); } diff --git a/ebike-operations/src/main/java/com/cdzy/operations/model/dto/EbikeOrderBikeListDto.java b/ebike-operations/src/main/java/com/cdzy/operations/model/dto/EbikeOrderBikeListDto.java index 603e37b..0d42685 100644 --- a/ebike-operations/src/main/java/com/cdzy/operations/model/dto/EbikeOrderBikeListDto.java +++ b/ebike-operations/src/main/java/com/cdzy/operations/model/dto/EbikeOrderBikeListDto.java @@ -82,4 +82,9 @@ public class EbikeOrderBikeListDto implements Serializable { * 是否有维修工单 */ private Boolean hasRepairOrder; + + /** + * 是否在线 + */ + private Boolean online; } diff --git a/ebike-operations/src/main/java/com/cdzy/operations/service/EbikeBikeOrderService.java b/ebike-operations/src/main/java/com/cdzy/operations/service/EbikeBikeOrderService.java index 2ccd5a3..b6deaeb 100644 --- a/ebike-operations/src/main/java/com/cdzy/operations/service/EbikeBikeOrderService.java +++ b/ebike-operations/src/main/java/com/cdzy/operations/service/EbikeBikeOrderService.java @@ -11,6 +11,7 @@ import com.cdzy.operations.model.vo.InspectionSwapOrderVo; import com.mybatisflex.core.service.IService; import org.springframework.web.multipart.MultipartFile; +import java.io.IOException; import java.util.List; /** @@ -103,5 +104,12 @@ public interface EbikeBikeOrderService extends IService { * @param regionId 运营区ID * @return 列表 */ - List bikeList(Long regionId); + List bikeList(Long regionId) throws IOException; + + /** + * 完成调度 + * @param bikeCode 车辆编号 + * @param siteId 站点ID + */ + void bikeDispatch(String bikeCode, Long siteId); } diff --git a/ebike-operations/src/main/java/com/cdzy/operations/service/impl/EbikeBikeOrderServiceImpl.java b/ebike-operations/src/main/java/com/cdzy/operations/service/impl/EbikeBikeOrderServiceImpl.java index 2fc4933..63f8c77 100644 --- a/ebike-operations/src/main/java/com/cdzy/operations/service/impl/EbikeBikeOrderServiceImpl.java +++ b/ebike-operations/src/main/java/com/cdzy/operations/service/impl/EbikeBikeOrderServiceImpl.java @@ -15,9 +15,12 @@ import com.cdzy.operations.model.vo.EbikeBatteryClaimReturnVo; import com.cdzy.operations.model.vo.FaultOrderVo; import com.cdzy.operations.model.vo.InspectionSwapOrderVo; import com.cdzy.operations.service.EbikeBikeOrderService; +import com.cdzy.operations.utils.EmqxApiClient; import com.cdzy.operations.utils.GeoCodingUtil; import com.cdzy.operations.utils.MinioUtil; import com.cdzy.operations.utils.RedisUtil; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.node.ObjectNode; import com.mybatisflex.core.keygen.impl.SnowFlakeIDKeyGenerator; import com.mybatisflex.core.query.QueryMethods; import com.mybatisflex.core.query.QueryWrapper; @@ -29,6 +32,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; +import java.io.IOException; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.*; @@ -416,7 +420,7 @@ public class EbikeBikeOrderServiceImpl extends ServiceImpl bikeList(Long regionId) { + public List bikeList(Long regionId) throws IOException { QueryWrapper queryWrapper = QueryWrapper.create() .select( EBIKE_BIKE_INFO.BIKE_CODE, @@ -470,19 +474,32 @@ public class EbikeBikeOrderServiceImpl extends ServiceImpl list = bikeInfoMapper.selectListByQueryAs(queryWrapper, EbikeOrderBikeListDto.class); List snList = list.stream().map(EbikeOrderBikeListDto::getEcuSn).toList(); Map objectMap = redisUtil.batchGetEcuWithMap(snList); + ObjectNode clientsOnline = EmqxApiClient.isClientsOnline(snList); list.forEach(e -> { ResGPSDto resGPSDto = (ResGPSDto) objectMap.get(e.getEcuSn()); if (resGPSDto != null) { e.setSoc(resGPSDto.getSoc()); } + JsonNode jsonNode = clientsOnline.get(e.getEcuSn()); + if (jsonNode != null) { + e.setOnline(Boolean.TRUE); + }else { + e.setOnline(Boolean.FALSE); + } }); return list; } + @Override + public void bikeDispatch(String bikeCode, Long siteId) { + + } + EbikeBikeInfo checkBikeCode(String bikeCode) { QueryWrapper queryWrapper = QueryWrapper.create() .where(EBIKE_BIKE_INFO.BIKE_CODE.eq(bikeCode)) diff --git a/ebike-operations/src/main/java/com/cdzy/operations/utils/EmqxApiClient.java b/ebike-operations/src/main/java/com/cdzy/operations/utils/EmqxApiClient.java index fe02f97..322a3db 100644 --- a/ebike-operations/src/main/java/com/cdzy/operations/utils/EmqxApiClient.java +++ b/ebike-operations/src/main/java/com/cdzy/operations/utils/EmqxApiClient.java @@ -76,37 +76,40 @@ public class EmqxApiClient { .build(); String response = executeRequest(request); - JsonNode jsonNode = mapper.readValue(response,JsonNode.class); - try { - JsonNode node = jsonNode.get("code"); - if (node!=null && node.asInt() != 200) { - return false; - } - }catch (Exception e){ - return false; - } + JsonNode jsonNode = mapper.readValue(response, JsonNode.class); + try { + JsonNode node = jsonNode.get("code"); + if (node != null && node.asInt() != 200) { + return false; + } + } catch (Exception e) { + return false; + } return jsonNode.get("connected").asBoolean(); } // 查询设备在线状态 public static ObjectNode isClientsOnline(List clientsIds) throws IOException { //TODO:数量问题可以考虑分批处理 - Request request = buildClientsRequest("/clients?" ,clientsIds) + Request request = buildClientsRequest("/clients?", clientsIds) .get() .build(); String response = executeRequest(request); - JsonNode json = mapper.readValue(response,JsonNode.class); - String data = json.get("data").asText(); - List> list = mapper.readValue(data, List.class); + JsonNode json = mapper.readValue(response, JsonNode.class); + JsonNode dataNode = json.get("data"); ObjectNode jsonResult = mapper.createObjectNode(); - list.forEach(e->{ - boolean connected =(Boolean) e.get("connected"); + ArrayNode list = (dataNode != null && dataNode.isArray()) ? (ArrayNode) dataNode : mapper.createArrayNode(); + if (list.isEmpty()) { + return jsonResult; + } + list.forEach(e -> { + boolean connected = e.get("connected").asBoolean(); ObjectNode jsonObject = mapper.createObjectNode(); - String clientid = (String) e.get("clientid"); + String client = e.get("clientid").asText(); jsonObject.put("connected", connected); - jsonObject.put("ecuSn", clientid); - jsonResult.put(clientid,jsonObject); + jsonObject.put("ecuSn", client); + jsonResult.put(client, jsonObject); }); return jsonResult; } @@ -143,7 +146,7 @@ public class EmqxApiClient { // 添加订阅 public void addSubscription(String clientId, String topic, int qos) throws IOException { - ObjectNode json = mapper.createObjectNode(); + ObjectNode json = mapper.createObjectNode(); json.put("topic", topic); json.put("qos", qos); diff --git a/ebike-operations/src/test/java/com/cdzy/operations/EbikeOperationsApplicationTests.java b/ebike-operations/src/test/java/com/cdzy/operations/EbikeOperationsApplicationTests.java index be7c478..620f26f 100644 --- a/ebike-operations/src/test/java/com/cdzy/operations/EbikeOperationsApplicationTests.java +++ b/ebike-operations/src/test/java/com/cdzy/operations/EbikeOperationsApplicationTests.java @@ -1,32 +1,16 @@ package com.cdzy.operations; -import com.cdzy.operations.utils.RedisUtil; -import com.mybatisflex.core.keygen.impl.SnowFlakeIDKeyGenerator; -import jakarta.annotation.Resource; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; -import java.util.concurrent.TimeUnit; - @SpringBootTest class EbikeOperationsApplicationTests { - @Resource - RedisUtil redisUtil; - @Test - void contextLoads(){ - SnowFlakeIDKeyGenerator generator = new SnowFlakeIDKeyGenerator(); - long nextId = generator.nextId(); - redisUtil.saveDispatchOrder(nextId, "2", 5L, TimeUnit.MINUTES); - System.out.println(nextId); + void contextLoads() { } - @Test - void deleteDispatchOrder(){ - redisUtil.deleteDispatchOrder(351467314753310720L); - } }