cdm100构建、通电、断电功能实现

This commit is contained in:
attiya 2025-09-28 14:38:13 +08:00
parent a5d1f2bdfd
commit 705250d288
9 changed files with 268 additions and 6 deletions

View File

@ -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<EbikeBatteryInfoDto> list = bikeInfoService.getOperationalBatteryList();
return JsonResult.success(list);
}
/**
* 断电
* @param ecuSn ecuSn
* @return 结果
*/
@GetMapping("outage")
public DeferredResult<JsonResult<?>> outage(@RequestParam(required = true)String ecuSn) {
DeferredResult<JsonResult<?>> 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<JsonResult<?>> energize(@RequestParam(required = true)String ecuSn) {
DeferredResult<JsonResult<?>> 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;
}
}

View File

@ -6,6 +6,16 @@ package com.cdzy.ebikemaintenance.enums;
*/ */
public interface CmdCode { public interface CmdCode {
/**
* 通电
*/
String ENERGIZE = "energize";
/**
* 断电
*/
String OUTAGE = "outage";
/** /**
* 寻车指令 * 寻车指令
*/ */

View File

@ -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;
}

View File

@ -35,6 +35,8 @@ public class EbikeBatteryInfo implements Serializable {
@Id @Id
private String batteryId; private String batteryId;
private String orgId;
/** /**
* 电池编号 * 电池编号
*/ */

View File

@ -2,6 +2,7 @@ package com.cdzy.ebikemaintenance.service;
import com.cdzy.common.model.EcuSnDto; import com.cdzy.common.model.EcuSnDto;
import com.cdzy.common.model.JsonResult; 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.request.*;
import com.cdzy.ebikemaintenance.model.dto.response.*; import com.cdzy.ebikemaintenance.model.dto.response.*;
import com.cdzy.ebikemaintenance.model.dto.response.ResEbikeBikeComDto; import com.cdzy.ebikemaintenance.model.dto.response.ResEbikeBikeComDto;
@ -320,4 +321,10 @@ public interface EbikeBikeInfoService extends IService<EbikeBikeInfo> {
* @return 列表 * @return 列表
*/ */
List<ResEbikeInfoRegionDto> getOperationalBikeListWithGpsByRegionId(List<Long> operationRegionIds); List<ResEbikeInfoRegionDto> getOperationalBikeListWithGpsByRegionId(List<Long> operationRegionIds);
/**
* 获取电池定位信息
* @return 列表
*/
List<EbikeBatteryInfoDto> getOperationalBatteryList();
} }

View File

@ -12,6 +12,7 @@ import com.cdzy.common.utils.CoordinateUtil;
import com.cdzy.ebikemaintenance.controller.EbikeInfoCoreController; import com.cdzy.ebikemaintenance.controller.EbikeInfoCoreController;
import com.cdzy.ebikemaintenance.enums.EbikeStatus; import com.cdzy.ebikemaintenance.enums.EbikeStatus;
import com.cdzy.ebikemaintenance.mapper.*; 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.EbikeDispatchRecordsDto;
import com.cdzy.ebikemaintenance.model.dto.request.*; import com.cdzy.ebikemaintenance.model.dto.request.*;
import com.cdzy.ebikemaintenance.model.dto.response.*; import com.cdzy.ebikemaintenance.model.dto.response.*;
@ -1614,6 +1615,36 @@ public class EbikeBikeInfoServiceImpl extends ServiceImpl<EbikeBikeInfoMapper, E
return map.values().stream().toList(); return map.values().stream().toList();
} }
@Override
public List<EbikeBatteryInfoDto> 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<EbikeBatteryInfoDto> list = ebikeBikeInfoMapper.selectListByQueryAs(query, EbikeBatteryInfoDto.class);
if (list == null || list.isEmpty()) {
return List.of();
}
Map<String, EbikeBatteryInfoDto> map = list.stream().filter(entity -> entity.getEcuSn() != null).collect(Collectors.toMap(
EbikeBatteryInfoDto::getEcuSn,
Function.identity(),
(oldVal, newVal) -> newVal // 重复键时覆盖旧值
));
List<String> strings = map.keySet().stream().toList();
List<Object> 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) { private void modifyMaintenanceStatus(String bikeCode) {
//是否存在维修中的订单数据 //是否存在维修中的订单数据
int i = ebikeBikeInfoMapper.selectOrderCount(bikeCode); int i = ebikeBikeInfoMapper.selectOrderCount(bikeCode);

View File

@ -13,6 +13,7 @@ import com.cdzy.ebikemaintenance.utils.RedisUtil;
import com.mybatisflex.core.query.QueryWrapper; import com.mybatisflex.core.query.QueryWrapper;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.geo.Point; import org.springframework.data.geo.Point;
@ -36,6 +37,8 @@ class EbikeSeversetestApplicationTests {
@Resource @Resource
RedisUtil redisUtil; RedisUtil redisUtil;
@Autowired
private EbikeCmdMapper ebikeCmdMapper;
@Test @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 @Test
void addParam() { void addParam() {
EbikeParam param = new EbikeParam(); EbikeParam param = new EbikeParam();
param.setParamName("idx"); param.setParamName("Dsg");
param.setCmdId("271826173502169088"); param.setCmdId("329795562900504576");
param.setLevel(2); param.setLevel(2);
param.setValueType(3); param.setValueType(1);
param.setParentId(271827039835688960L); param.setParentId(329796190976593920L);
ebikeParamMapper.insert(param); ebikeParamMapper.insert(param);
System.out.println(param.getParamId()); System.out.println(param.getParamId());
} }
@ -58,8 +71,8 @@ class EbikeSeversetestApplicationTests {
@Test @Test
void addParamValue() { void addParamValue() {
EbikeParamValue paramValue = new EbikeParamValue(); EbikeParamValue paramValue = new EbikeParamValue();
paramValue.setParamValue("8"); paramValue.setParamValue("0");
paramValue.setParamId(271827551599529984L); paramValue.setParamId(329796780322373632L);
ebikeParamValueMapper.insert(paramValue); ebikeParamValueMapper.insert(paramValue);
} }

View File

@ -1,13 +1,41 @@
package com.cdzy.ebikereport; 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.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.geo.Point;
@SpringBootTest @SpringBootTest
class EbikeReportApplicationTests { class EbikeReportApplicationTests {
@Test @Test
void contextLoads() { 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);
} }
} }

View File

@ -1,5 +1,7 @@
package com.cdzy.user; 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.Generator;
import com.mybatisflex.codegen.config.GlobalConfig; import com.mybatisflex.codegen.config.GlobalConfig;
import com.mybatisflex.core.keygen.impl.SnowFlakeIDKeyGenerator; import com.mybatisflex.core.keygen.impl.SnowFlakeIDKeyGenerator;
@ -94,4 +96,11 @@ class EbikeUserApplicationTests {
// 返回配置 // 返回配置
return globalConfig; return globalConfig;
} }
@Test
public void testTokenSession(){
String loginId = StpUtil.getLoginId("kjbSzme9yQvGKVegcfsMDBtCjrgEWvXC");
LoginDto object = (LoginDto)StpUtil.getSession().get(loginId);
System.out.println(object);
}
} }