首页车辆列表、监听代码变动

This commit is contained in:
attiya 2025-12-04 16:20:44 +08:00
parent 93e9992041
commit 08d6256fd5
5 changed files with 121 additions and 21 deletions

View File

@ -39,24 +39,22 @@ public class SafeOrderExpirationListener {
*/ */
public void handleOrderExpiration(String expiredKey) { public void handleOrderExpiration(String expiredKey) {
// 验证是否为工单键 // 验证是否为工单键
if (!expiredKey.startsWith(RedisUtil.BIKE_DISPATCH_ORDER_PREFIX)) { if (expiredKey.startsWith(RedisUtil.BIKE_DISPATCH_ORDER_PREFIX)) {
return; // 提取订单ID
String orderId = extractOrderIdFromKey(expiredKey);
if (orderId == null) {
return;
}
log.info("实例 {} 接收到工单过期事件: orderId={}",
instanceManager.getInstanceId(), orderId);
// 异步处理避免阻塞监听线程
CompletableFuture.runAsync(() -> processExpiredOrderSafely(orderId)).exceptionally(e -> {
log.error("处理过期工单异常: orderId={}", orderId, e);
return null;
});
} }
// 提取订单ID
String orderId = extractOrderIdFromKey(expiredKey);
if (orderId == null) {
return;
}
log.info("实例 {} 接收到工单过期事件: orderId={}",
instanceManager.getInstanceId(), orderId);
// 异步处理避免阻塞监听线程
CompletableFuture.runAsync(() -> processExpiredOrderSafely(orderId)).exceptionally(e -> {
log.error("处理过期工单异常: orderId={}", orderId, e);
return null;
});
} }
/** /**

View File

@ -6,6 +6,7 @@ import com.cdzy.common.model.request.PageParam;
import com.cdzy.common.model.response.JsonResult; import com.cdzy.common.model.response.JsonResult;
import com.cdzy.operations.enums.BikeOrderHandleState; import com.cdzy.operations.enums.BikeOrderHandleState;
import com.cdzy.operations.model.dto.EbikeBikeOrderInfoDto; import com.cdzy.operations.model.dto.EbikeBikeOrderInfoDto;
import com.cdzy.operations.model.dto.EbikeOrderBikeListDto;
import com.cdzy.operations.model.dto.EbikeBikeOrderPageDto; import com.cdzy.operations.model.dto.EbikeBikeOrderPageDto;
import com.cdzy.operations.model.dto.EbikeOrderBikeInfoDto; import com.cdzy.operations.model.dto.EbikeOrderBikeInfoDto;
import com.cdzy.operations.model.vo.EbikeBatteryChangeVo; import com.cdzy.operations.model.vo.EbikeBatteryChangeVo;
@ -22,6 +23,7 @@ import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import java.util.List;
import java.util.Objects; import java.util.Objects;
import static com.cdzy.operations.model.entity.table.EbikeBikeInfoTableDef.EBIKE_BIKE_INFO; import static com.cdzy.operations.model.entity.table.EbikeBikeInfoTableDef.EBIKE_BIKE_INFO;
@ -209,6 +211,17 @@ public class EbikeBikeOrderController {
return JsonResult.success(); return JsonResult.success();
} }
/**
* 车辆列表工单用
*
* @return 操作结果
*/
@GetMapping("bikeList")
public JsonResult<List<EbikeOrderBikeListDto>> bikeList(@RequestParam("regionId") Long regionId) {
List<EbikeOrderBikeListDto> list = ebikeBikeOrderService.bikeList(regionId);
return JsonResult.success(list);
}
/** /**
* 车辆详情工单用 * 车辆详情工单用
* *

View File

@ -0,0 +1,62 @@
package com.cdzy.operations.model.dto;
import com.cdzy.operations.handler.PGpointDeserializer;
import com.cdzy.operations.handler.PGpointSerializer;
import com.cdzy.operations.handler.PGpointTypeHandler;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.mybatisflex.annotation.Column;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.postgresql.geometric.PGpoint;
import java.io.Serial;
import java.io.Serializable;
/**
* 工单信息 实体类
*
* @author attiya
* @since 2025-11-24
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class EbikeOrderBikeListDto implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 车辆编号
*/
private String bikeCode;
/**
* 中控编号
*/
private String ecuSn;
/**
* 定位
*/
@Column(typeHandler = PGpointTypeHandler.class)
@JsonSerialize(using = PGpointSerializer.class)
@JsonDeserialize(using = PGpointDeserializer.class)
private PGpoint location;
/**
* 车辆使用状态
*/
private Integer usageStatus;
/**
* 外接电池电量该值由控制器提供若控制器不支持此值为0
*/
private Integer soc;
}

View File

@ -1,6 +1,7 @@
package com.cdzy.operations.service; package com.cdzy.operations.service;
import com.cdzy.operations.model.dto.EbikeBikeOrderInfoDto; import com.cdzy.operations.model.dto.EbikeBikeOrderInfoDto;
import com.cdzy.operations.model.dto.EbikeOrderBikeListDto;
import com.cdzy.operations.model.dto.EbikeOrderBikeInfoDto; import com.cdzy.operations.model.dto.EbikeOrderBikeInfoDto;
import com.cdzy.operations.model.entity.EbikeBikeOrder; import com.cdzy.operations.model.entity.EbikeBikeOrder;
import com.cdzy.operations.model.vo.EbikeBatteryChangeVo; import com.cdzy.operations.model.vo.EbikeBatteryChangeVo;
@ -10,6 +11,8 @@ import com.cdzy.operations.model.vo.InspectionSwapOrderVo;
import com.mybatisflex.core.service.IService; import com.mybatisflex.core.service.IService;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import java.util.List;
/** /**
* 工单信息 服务层 * 工单信息 服务层
* *
@ -94,4 +97,11 @@ public interface EbikeBikeOrderService extends IService<EbikeBikeOrder> {
* @return 详情 * @return 详情
*/ */
EbikeOrderBikeInfoDto bikeInfo(String bikeCode); EbikeOrderBikeInfoDto bikeInfo(String bikeCode);
/**
* 获取车辆列表
* @param regionId 运营区ID
* @return 列表
*/
List<EbikeOrderBikeListDto> bikeList(Long regionId);
} }

View File

@ -7,6 +7,7 @@ import com.cdzy.common.model.dto.ResGPSDto;
import com.cdzy.operations.enums.*; import com.cdzy.operations.enums.*;
import com.cdzy.operations.mapper.*; import com.cdzy.operations.mapper.*;
import com.cdzy.operations.model.dto.EbikeBikeOrderInfoDto; import com.cdzy.operations.model.dto.EbikeBikeOrderInfoDto;
import com.cdzy.operations.model.dto.EbikeOrderBikeListDto;
import com.cdzy.operations.model.dto.EbikeOrderBikeInfoDto; import com.cdzy.operations.model.dto.EbikeOrderBikeInfoDto;
import com.cdzy.operations.model.entity.*; import com.cdzy.operations.model.entity.*;
import com.cdzy.operations.model.vo.EbikeBatteryChangeVo; import com.cdzy.operations.model.vo.EbikeBatteryChangeVo;
@ -29,10 +30,7 @@ import org.springframework.web.multipart.MultipartFile;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.math.RoundingMode; import java.math.RoundingMode;
import java.util.ArrayList; import java.util.*;
import java.util.List;
import java.util.Objects;
import java.util.UUID;
import static com.cdzy.operations.model.entity.table.EbikeBatteryInfoTableDef.EBIKE_BATTERY_INFO; import static com.cdzy.operations.model.entity.table.EbikeBatteryInfoTableDef.EBIKE_BATTERY_INFO;
import static com.cdzy.operations.model.entity.table.EbikeBikeInfoTableDef.EBIKE_BIKE_INFO; import static com.cdzy.operations.model.entity.table.EbikeBikeInfoTableDef.EBIKE_BIKE_INFO;
@ -412,6 +410,25 @@ public class EbikeBikeOrderServiceImpl extends ServiceImpl<EbikeBikeOrderMapper,
return bikeInfo; return bikeInfo;
} }
@Override
public List<EbikeOrderBikeListDto> bikeList(Long regionId) {
QueryWrapper queryWrapper = QueryWrapper.create()
.select(EBIKE_BIKE_INFO.BIKE_CODE,EBIKE_BIKE_INFO.LOCATION,EBIKE_BIKE_INFO.USAGE_STATUS,EBIKE_ECU_INFO.ECU_SN)
.where(EBIKE_BIKE_INFO.REGION_ID.eq(regionId))
.where(EBIKE_BIKE_INFO.STATUS.eq(BikeStatus.LAUNCH))
.leftJoin(EBIKE_ECU_INFO).on(EBIKE_ECU_INFO.ECU_ID.eq(EBIKE_BIKE_INFO.ECU_ID));
List<EbikeOrderBikeListDto> list = bikeInfoMapper.selectListByQueryAs(queryWrapper, EbikeOrderBikeListDto.class);
List<String> snList = list.stream().map(EbikeOrderBikeListDto::getEcuSn).toList();
Map<String, Object> objectMap = redisUtil.batchGetEcuWithMap(snList);
list.forEach(e->{
ResGPSDto resGPSDto = (ResGPSDto)objectMap.get(e.getEcuSn());
if (resGPSDto != null){
e.setSoc(resGPSDto.getSoc());
}
});
return list;
}
EbikeBikeInfo checkBikeCode(String bikeCode) { EbikeBikeInfo checkBikeCode(String bikeCode) {
QueryWrapper queryWrapper = QueryWrapper.create() QueryWrapper queryWrapper = QueryWrapper.create()
.where(EBIKE_BIKE_INFO.BIKE_CODE.eq(bikeCode)) .where(EBIKE_BIKE_INFO.BIKE_CODE.eq(bikeCode))