From 705250d288adb04ae87fb3c8022393ef66e129a2 Mon Sep 17 00:00:00 2001 From: attiya <2413103649@qq.com> Date: Sun, 28 Sep 2025 14:38:13 +0800 Subject: [PATCH] =?UTF-8?q?cdm100=E6=9E=84=E5=BB=BA=E3=80=81=E9=80=9A?= =?UTF-8?q?=E7=94=B5=E3=80=81=E6=96=AD=E7=94=B5=E5=8A=9F=E8=83=BD=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/EbikeBatteryController.java | 113 ++++++++++++++++++ .../cdzy/ebikemaintenance/enums/CmdCode.java | 10 ++ .../model/dto/EbikeBatteryInfoDto.java | 49 ++++++++ .../model/pojo/EbikeBatteryInfo.java | 2 + .../service/EbikeBikeInfoService.java | 7 ++ .../impl/EbikeBikeInfoServiceImpl.java | 31 +++++ .../EbikeSeversetestApplicationTests.java | 25 +++- .../EbikeReportApplicationTests.java | 28 +++++ .../cdzy/user/EbikeUserApplicationTests.java | 9 ++ 9 files changed, 268 insertions(+), 6 deletions(-) create mode 100644 ebike-maintenance/src/main/java/com/cdzy/ebikemaintenance/controller/EbikeBatteryController.java create mode 100644 ebike-maintenance/src/main/java/com/cdzy/ebikemaintenance/model/dto/EbikeBatteryInfoDto.java diff --git a/ebike-maintenance/src/main/java/com/cdzy/ebikemaintenance/controller/EbikeBatteryController.java b/ebike-maintenance/src/main/java/com/cdzy/ebikemaintenance/controller/EbikeBatteryController.java new file mode 100644 index 00000000..28e07821 --- /dev/null +++ b/ebike-maintenance/src/main/java/com/cdzy/ebikemaintenance/controller/EbikeBatteryController.java @@ -0,0 +1,113 @@ +package com.cdzy.ebikemaintenance.controller; + +import com.alibaba.fastjson2.JSONObject; +import com.cdzy.common.model.CoreResult; +import com.cdzy.common.model.JsonResult; +import com.cdzy.ebikemaintenance.component.EbikeCoreHandler; +import com.cdzy.ebikemaintenance.enums.CmdCode; +import com.cdzy.ebikemaintenance.mapper.EbikeErrorMsgMapper; +import com.cdzy.ebikemaintenance.model.dto.EbikeBatteryInfoDto; +import com.cdzy.ebikemaintenance.model.pojo.EbikeErrorMsg; +import com.cdzy.ebikemaintenance.service.EbikeBikeInfoService; +import com.mybatisflex.core.query.QueryWrapper; +import jakarta.annotation.Resource; +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.util.List; + +import static com.cdzy.ebikemaintenance.model.pojo.table.EbikeErrorMsgTableDef.EBIKE_ERROR_MSG; + +/** + * 电池监控控制层。 + * + * @author attiya + * @since 2025-03-26 + */ +@RestController +@RequestMapping("/ebikeBattery") +public class EbikeBatteryController { + + @Resource + private EbikeBikeInfoService bikeInfoService; + + @Resource + private EbikeCoreHandler coreHandler; + + @Resource + private EbikeErrorMsgMapper errorMsgMapper; + + + /** + * 获取电池定位信息列表 + * @return 列表 + */ + @GetMapping("list") + public JsonResult list() { + List list = bikeInfoService.getOperationalBatteryList(); + return JsonResult.success(list); + } + + /** + * 断电 + * @param ecuSn ecuSn + * @return 结果 + */ + @GetMapping("outage") + public DeferredResult> outage(@RequestParam(required = true)String ecuSn) { + DeferredResult> deferredResult = new DeferredResult<>(5000L); // 5秒超时 + coreHandler.executeCommand(ecuSn, CmdCode.OUTAGE).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; + } + + /** + * 通电 + * @param ecuSn ecuSn + * @return 结果 + */ + @GetMapping("energize") + public DeferredResult> energize(@RequestParam(required = true)String ecuSn) { + DeferredResult> deferredResult = new DeferredResult<>(5000L); // 5秒超时 + coreHandler.executeCommand(ecuSn, CmdCode.ENERGIZE).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/enums/CmdCode.java b/ebike-maintenance/src/main/java/com/cdzy/ebikemaintenance/enums/CmdCode.java index d3374f4d..3e67b8ad 100644 --- a/ebike-maintenance/src/main/java/com/cdzy/ebikemaintenance/enums/CmdCode.java +++ b/ebike-maintenance/src/main/java/com/cdzy/ebikemaintenance/enums/CmdCode.java @@ -6,6 +6,16 @@ package com.cdzy.ebikemaintenance.enums; */ public interface CmdCode { + /** + * 通电 + */ + String ENERGIZE = "energize"; + + /** + * 断电 + */ + String OUTAGE = "outage"; + /** * 寻车指令 */ diff --git a/ebike-maintenance/src/main/java/com/cdzy/ebikemaintenance/model/dto/EbikeBatteryInfoDto.java b/ebike-maintenance/src/main/java/com/cdzy/ebikemaintenance/model/dto/EbikeBatteryInfoDto.java new file mode 100644 index 00000000..5131d245 --- /dev/null +++ b/ebike-maintenance/src/main/java/com/cdzy/ebikemaintenance/model/dto/EbikeBatteryInfoDto.java @@ -0,0 +1,49 @@ +package com.cdzy.ebikemaintenance.model.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serial; +import java.io.Serializable; + +/** + * 实体类。 + * + * @author attiya + * @since 2025-03-26 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class EbikeBatteryInfoDto implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + private Long batteryId; + + private String ecuSn; + + /** + * 经度 + */ + private Double longitude; + + /** + * 纬度 + */ + private Double latitude; + + /** + * 电池电量 + */ + private Integer soc; + + /** + * 是否放电 + */ + private String mosState; +} diff --git a/ebike-maintenance/src/main/java/com/cdzy/ebikemaintenance/model/pojo/EbikeBatteryInfo.java b/ebike-maintenance/src/main/java/com/cdzy/ebikemaintenance/model/pojo/EbikeBatteryInfo.java index 7776c9e4..96ed1abf 100644 --- a/ebike-maintenance/src/main/java/com/cdzy/ebikemaintenance/model/pojo/EbikeBatteryInfo.java +++ b/ebike-maintenance/src/main/java/com/cdzy/ebikemaintenance/model/pojo/EbikeBatteryInfo.java @@ -35,6 +35,8 @@ public class EbikeBatteryInfo implements Serializable { @Id private String batteryId; + private String orgId; + /** * 电池编号 */ diff --git a/ebike-maintenance/src/main/java/com/cdzy/ebikemaintenance/service/EbikeBikeInfoService.java b/ebike-maintenance/src/main/java/com/cdzy/ebikemaintenance/service/EbikeBikeInfoService.java index bebdf510..d88f7233 100644 --- a/ebike-maintenance/src/main/java/com/cdzy/ebikemaintenance/service/EbikeBikeInfoService.java +++ b/ebike-maintenance/src/main/java/com/cdzy/ebikemaintenance/service/EbikeBikeInfoService.java @@ -2,6 +2,7 @@ package com.cdzy.ebikemaintenance.service; import com.cdzy.common.model.EcuSnDto; import com.cdzy.common.model.JsonResult; +import com.cdzy.ebikemaintenance.model.dto.EbikeBatteryInfoDto; import com.cdzy.ebikemaintenance.model.dto.request.*; import com.cdzy.ebikemaintenance.model.dto.response.*; import com.cdzy.ebikemaintenance.model.dto.response.ResEbikeBikeComDto; @@ -320,4 +321,10 @@ public interface EbikeBikeInfoService extends IService { * @return 列表 */ List getOperationalBikeListWithGpsByRegionId(List operationRegionIds); + + /** + * 获取电池定位信息 + * @return 列表 + */ + List getOperationalBatteryList(); } 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 5f114f68..d2077634 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 @@ -12,6 +12,7 @@ import com.cdzy.common.utils.CoordinateUtil; import com.cdzy.ebikemaintenance.controller.EbikeInfoCoreController; import com.cdzy.ebikemaintenance.enums.EbikeStatus; import com.cdzy.ebikemaintenance.mapper.*; +import com.cdzy.ebikemaintenance.model.dto.EbikeBatteryInfoDto; import com.cdzy.ebikemaintenance.model.dto.EbikeDispatchRecordsDto; import com.cdzy.ebikemaintenance.model.dto.request.*; import com.cdzy.ebikemaintenance.model.dto.response.*; @@ -1614,6 +1615,36 @@ public class EbikeBikeInfoServiceImpl extends ServiceImpl getOperationalBatteryList() { + QueryWrapper query = QueryWrapper.create() + .select(EBIKE_BATTERY_INFO.BATTERY_ID, EBIKE_ECU_INFO.ECU_SN) + .leftJoin(EBIKE_ECU_INFO).on(EBIKE_BIKE_INFO.ECU_ID.eq(EBIKE_ECU_INFO.ECU_ID)) + .leftJoin(EBIKE_BATTERY_INFO).on(EBIKE_BIKE_INFO.BATTERY_ID.eq(EBIKE_BATTERY_INFO.BATTERY_ID)) + .where(EBIKE_BIKE_INFO.STATE.in(new String[]{"2", "3", "4"})) + .where(EBIKE_BIKE_INFO.IS_IN_WAREHOUSE.eq("0")); + List list = ebikeBikeInfoMapper.selectListByQueryAs(query, EbikeBatteryInfoDto.class); + if (list == null || list.isEmpty()) { + return List.of(); + } + Map map = list.stream().filter(entity -> entity.getEcuSn() != null).collect(Collectors.toMap( + EbikeBatteryInfoDto::getEcuSn, + Function.identity(), + (oldVal, newVal) -> newVal // 重复键时覆盖旧值 + )); + List strings = map.keySet().stream().toList(); + List all = redisUtil.getAll(strings); + all.forEach(obj -> { + ResGPSDto resGPSDto = JSON.toJavaObject(obj, ResGPSDto.class); + EbikeBatteryInfoDto batteryInfoDto = map.get(resGPSDto.getEcuSn()); + batteryInfoDto.setLatitude(resGPSDto.getLatitude()); + batteryInfoDto.setLongitude(resGPSDto.getLongitude()); + batteryInfoDto.setSoc(resGPSDto.getSoc()); + batteryInfoDto.setMosState(resGPSDto.getMosState()==0?"关闭":"打开"); + }); + return map.values().stream().toList(); + } + private void modifyMaintenanceStatus(String bikeCode) { //是否存在维修中的订单数据 int i = ebikeBikeInfoMapper.selectOrderCount(bikeCode); diff --git a/ebike-maintenance/src/test/java/com/cdzy/ebikemaintenance/EbikeSeversetestApplicationTests.java b/ebike-maintenance/src/test/java/com/cdzy/ebikemaintenance/EbikeSeversetestApplicationTests.java index 423f26ff..fc76a833 100644 --- a/ebike-maintenance/src/test/java/com/cdzy/ebikemaintenance/EbikeSeversetestApplicationTests.java +++ b/ebike-maintenance/src/test/java/com/cdzy/ebikemaintenance/EbikeSeversetestApplicationTests.java @@ -13,6 +13,7 @@ import com.cdzy.ebikemaintenance.utils.RedisUtil; import com.mybatisflex.core.query.QueryWrapper; import jakarta.annotation.Resource; import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.geo.Point; @@ -36,6 +37,8 @@ class EbikeSeversetestApplicationTests { @Resource RedisUtil redisUtil; + @Autowired + private EbikeCmdMapper ebikeCmdMapper; @Test @@ -43,14 +46,24 @@ class EbikeSeversetestApplicationTests { } + @Test + void addCmd() { + EbikeCmd param = new EbikeCmd(); + param.setCmdCode("outage"); + param.setDescribe("电池断电"); + param.setCmdName("电池断电"); + ebikeCmdMapper.insert(param); + System.out.println(param.getCmdId()); + } + @Test void addParam() { EbikeParam param = new EbikeParam(); - param.setParamName("idx"); - param.setCmdId("271826173502169088"); + param.setParamName("Dsg"); + param.setCmdId("329795562900504576"); param.setLevel(2); - param.setValueType(3); - param.setParentId(271827039835688960L); + param.setValueType(1); + param.setParentId(329796190976593920L); ebikeParamMapper.insert(param); System.out.println(param.getParamId()); } @@ -58,8 +71,8 @@ class EbikeSeversetestApplicationTests { @Test void addParamValue() { EbikeParamValue paramValue = new EbikeParamValue(); - paramValue.setParamValue("8"); - paramValue.setParamId(271827551599529984L); + paramValue.setParamValue("0"); + paramValue.setParamId(329796780322373632L); ebikeParamValueMapper.insert(paramValue); } diff --git a/ebike-report/src/test/java/com/cdzy/ebikereport/EbikeReportApplicationTests.java b/ebike-report/src/test/java/com/cdzy/ebikereport/EbikeReportApplicationTests.java index 014772c9..72e5ba42 100644 --- a/ebike-report/src/test/java/com/cdzy/ebikereport/EbikeReportApplicationTests.java +++ b/ebike-report/src/test/java/com/cdzy/ebikereport/EbikeReportApplicationTests.java @@ -1,13 +1,41 @@ package com.cdzy.ebikereport; +import com.alibaba.fastjson2.JSONObject; +import com.cdzy.common.model.EbikeTracking; +import com.cdzy.common.model.ResGPSDto; +import com.cdzy.common.utils.CoordinateUtil; +import com.cdzy.ebikereport.enums.BitSwitch; +import com.cdzy.ebikereport.utils.BinaryUtil; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.data.geo.Point; @SpringBootTest class EbikeReportApplicationTests { @Test void contextLoads() { + + Integer number = 131082; + String binary = BinaryUtil.to32BitBinary(number); + binary = new StringBuilder(binary).reverse().toString(); + System.out.println(binary); + char helmet = binary.charAt(BitSwitch.IS_HELMET_EXIT); + char acc = binary.charAt(BitSwitch.ACC_ON); + System.out.println(acc); + char wheelLocked = binary.charAt(BitSwitch.IS_WHEEL_LOCKED); + char setLocked = binary.charAt(BitSwitch.IS_SEAT_LOCKED); + char isHelmetLocked = binary.charAt(BitSwitch.IS_HELMET_LOCKED); + char isWheelSpin = binary.charAt(BitSwitch.IS_WHEEL_SPIN); + char isMoving = binary.charAt(BitSwitch.IS_MOVING); + ResGPSDto resGpsDto = new ResGPSDto(); + resGpsDto.setHelmetExit(helmet); + resGpsDto.setAccOn(acc); + resGpsDto.setWheelLocked(wheelLocked); + resGpsDto.setSeatLocked(setLocked); + resGpsDto.setIsHelmetLocked(isHelmetLocked); + resGpsDto.setIsWheelSpin(isWheelSpin); + resGpsDto.setIsMoving(isMoving); } } diff --git a/ebike-user/src/test/java/com/cdzy/user/EbikeUserApplicationTests.java b/ebike-user/src/test/java/com/cdzy/user/EbikeUserApplicationTests.java index baab5c00..701ee77f 100644 --- a/ebike-user/src/test/java/com/cdzy/user/EbikeUserApplicationTests.java +++ b/ebike-user/src/test/java/com/cdzy/user/EbikeUserApplicationTests.java @@ -1,5 +1,7 @@ package com.cdzy.user; +import cn.dev33.satoken.stp.StpUtil; +import com.cdzy.user.model.dto.LoginDto; import com.mybatisflex.codegen.Generator; import com.mybatisflex.codegen.config.GlobalConfig; import com.mybatisflex.core.keygen.impl.SnowFlakeIDKeyGenerator; @@ -94,4 +96,11 @@ class EbikeUserApplicationTests { // 返回配置 return globalConfig; } + + @Test + public void testTokenSession(){ + String loginId = StpUtil.getLoginId("kjbSzme9yQvGKVegcfsMDBtCjrgEWvXC"); + LoginDto object = (LoginDto)StpUtil.getSession().get(loginId); + System.out.println(object); + } }