feat:飞行日志接入

This commit is contained in:
sugus 2025-10-15 14:09:01 +08:00
parent b954940576
commit 3488f86386
7 changed files with 80 additions and 27 deletions

View File

@ -16,7 +16,7 @@ public enum AircraftDeviceBrandEnum {
SF("SF", "顺丰"),
FNZZ("FNZZ", "蜂鸟"),
FNZZ("FNZZ", "蜂鸟"),
;

View File

@ -13,12 +13,12 @@ import org.springframework.data.mongodb.core.mapping.Document;
import java.io.Serializable;
/**
* 无人机状态信息DTO
* 蜂鸟智造-无人机文本日志
*/
@Data
@Document(collection = "fnzz_aircraft_log")
@CompoundIndex(name = "uavUUID_timestamp_idx", def = "{'uavUUID': 1, 'timestampString': -1}")
@ApiModel(description = "无人机状态信息")
@ApiModel(description = "蜂鸟智造-无人机文本日志")
public class FNZZAircraftLog extends AbstractAircraftTextLog implements Serializable {

View File

@ -2,11 +2,13 @@ package com.aircraft.modules.aircraft.domain.dto;
import com.alibaba.fastjson2.annotation.JSONField;
import io.swagger.annotations.ApiModelProperty;
import lombok.Builder;
import lombok.Data;
import javax.validation.constraints.NotNull;
@Data
@Builder
public class AircraftLogPageDTO {

View File

@ -40,4 +40,7 @@ public class AircraftDevicePageVO extends AircraftDevice {
@ApiModelProperty(value = "设备图片(只返回一张)")
private String deviceImg;
@ApiModelProperty(value = "无人机状态")
private String state;
}

View File

@ -19,38 +19,44 @@ public interface AircraftLogService<T extends AbstractAircraftTextLog> {
*
* @return
*/
abstract boolean support(AircraftDeviceBrandEnum deviceBrandEnum);
boolean support(AircraftDeviceBrandEnum deviceBrandEnum);
/**
* 文本日志接收-统一存到mongodb
*/
void textLogReceive(T aircraftLog);
/**
* 视频日志接收
*/
void videoLogReceive(T aircraftLog);
/**
* 分页查询飞行文本日志列表
*
* @param dto
* @return
*/
abstract PageResult<AircraftLogPageVO> page(AircraftLogPageDTO dto);
/**
* 文本日志接收-统一存到mongodb
*/
abstract void textLogReceive(T aircraftLog);
/**
* 视频日志接收
*/
public abstract void videoLogReceive(T aircraftLog);
PageResult<AircraftLogPageVO> page(AircraftLogPageDTO dto);
/**
* 根据ID获取文本日志详情
* @param id
* @return
*/
public Map<String, Object> getTextLogDetailById(String id);
Map<String, Object> getTextLogDetailById(String id);
/**
* 根据最后一条飞行文本日志获取飞行状态
* @param dto
* @return
*/
String getStateByTextLog(AircraftLogPageDTO dto);
}

View File

@ -20,10 +20,6 @@ import javax.annotation.Resource;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@ -54,6 +50,7 @@ public abstract class AbstractAircraftLogServiceImpl<T extends AbstractAircraftT
*/
protected abstract String getTimeKey();
/**
* 后置处理 - 转换状态等子类可重写
*/
@ -94,6 +91,39 @@ public abstract class AbstractAircraftLogServiceImpl<T extends AbstractAircraftT
}
@Override
public String getStateByTextLog(AircraftLogPageDTO dto) {
try {
Query query = buildQuery(dto, getModelKey(), getTimeKey());
//只查一条
dto.setPage(1);
dto.setSize(1);
List<T> content = List.of();
// 执行查询
// 设置分页和排序
query.with(Sort.by(Sort.Direction.DESC, getTimeKey()));
content = mongotemplate.find(query, getEntityClass());
AircraftLogPageVO vo = content.stream()
.map(this::convertToVO)
.toList().stream().findFirst().orElse(null);
if (null != vo) {
return vo.getState();
}
} catch (Exception e) {
//ignore
}
return null;
}
/**
* 应用分页逻辑
*/
@ -115,7 +145,7 @@ public abstract class AbstractAircraftLogServiceImpl<T extends AbstractAircraftT
* 判断是否不需要分页
*/
protected boolean isNoPagination(AircraftLogPageDTO dto) {
return dto.getPage() < 0 || dto.getSize() < 0;
return !(dto.getPage() > 0 && dto.getSize() > 0);
}
/**

View File

@ -4,13 +4,17 @@ import com.aircraft.domain.dto.AttachmentMaterialDTO;
import com.aircraft.exception.BadRequestException;
import com.aircraft.modules.aircraft.domain.AircraftDevice;
import com.aircraft.modules.aircraft.domain.dto.AircraftDevicePageDTO;
import com.aircraft.modules.aircraft.domain.dto.AircraftLogPageDTO;
import com.aircraft.modules.aircraft.domain.vo.AircraftDevicePageVO;
import com.aircraft.modules.aircraft.mapper.AircraftDeviceMapper;
import com.aircraft.modules.aircraft.service.AircraftDeviceService;
import com.aircraft.modules.aircraft.service.AircraftLogStrategyFactory;
import com.aircraft.modules.system.domain.AttachmentMaterial;
import com.aircraft.modules.system.service.IAttachmentMaterialService;
import com.aircraft.utils.CommonConstant;
import com.aircraft.utils.PageResult;
import com.aircraft.utils.SecurityUtils;
import com.aircraft.utils.enums.AircraftDeviceBrandEnum;
import com.aircraft.utils.enums.UserTypeEnum;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
@ -38,6 +42,7 @@ import java.util.List;
public class AircraftDeviceServiceImpl extends ServiceImpl<AircraftDeviceMapper, AircraftDevice> implements AircraftDeviceService {
private final IAttachmentMaterialService attachmentMaterialService;
private final AircraftLogStrategyFactory aircraftLogStrategyFactory;
//todo 枚举
private final String BUSINESS_TYPE = "aircraft_device";
@ -63,6 +68,13 @@ public class AircraftDeviceServiceImpl extends ServiceImpl<AircraftDeviceMapper,
.oneOpt()
.map(AttachmentMaterial::getFileFullPath)
.ifPresent(item::setDeviceImg);
//获取无人机状态 查日志最后一条记录
aircraftLogStrategyFactory.getAllStrategies()
.stream()
.filter(aircraftLogService -> aircraftLogService.support(AircraftDeviceBrandEnum.find(item.getBrand())))
.findFirst()
.map(service -> service.getStateByTextLog(AircraftLogPageDTO.builder().model(item.getModel()).build()))
.ifPresent(item::setState);
});
}
return iPage;