Procházet zdrojové kódy

Merge branch 'develop' of gitadmin/tuoheng_lc into release

tags/v1.2.0^2
wanjing před 1 rokem
rodič
revize
f04ca37ca8
3 změnil soubory, kde provedl 251 přidání a 186 odebrání
  1. +20
    -11
      tuoheng-admin/src/main/java/com/tuoheng/admin/service/impl/MissionServiceImpl.java
  2. +10
    -175
      tuoheng-admin/src/main/java/com/tuoheng/admin/service/impl/QuestionServiceImpl.java
  3. +221
    -0
      tuoheng-admin/src/main/java/com/tuoheng/admin/service/third/dsp/DspCallBackService.java

+ 20
- 11
tuoheng-admin/src/main/java/com/tuoheng/admin/service/impl/MissionServiceImpl.java Zobrazit soubor

@@ -205,6 +205,24 @@ public class MissionServiceImpl extends BaseServiceImpl<ThMissionMapper, ThMissi
log.info("修改飞行状态:{}",JSONObject.toJSONString(thMissionUpdate));
return thMissionMapper.updateById(thMissionUpdate) > 0;
}else if(AirPortTaskStatusEnum.WAIT.getCode()==missionStatusRequest.getStatus()){
// 机场飞行完成,立即修改任务状态为已完成
ThMission thMission = thMissionMapper.selectOne(new LambdaQueryWrapper<ThMission>()
.eq(ThMission::getId, missionStatusRequest.getRequestId())
.eq(ThMission::getMark, MarkEnum.VALID.getCode()));
ThMission thMissionUpdate = new ThMission(UpdateOrCreateEnum.UPDATE.getCode());
thMissionUpdate.setId(Integer.parseInt(missionStatusRequest.getRequestId()));
thMissionUpdate.setStatus(TaskStatusEnum.COMPLETE.getCode());
thMissionUpdate.setExecutionEndTime(new Date());
try {
AirWeatherVO weather = inspectionService.getWeather(thMission.getAirportId());
String weatherStr = WeatherUtil.getWeather(weather);
thMissionUpdate.setWeather(weatherStr);
} catch (Exception e){
thMissionUpdate.setWeather("");
log.info("获取天气信息失败,请重试");
}
thMissionMapper.updateById(thMissionUpdate);

//硬件停止后,停止AI分析
return stopAI(missionStatusRequest);
}else{
@@ -259,17 +277,8 @@ public class MissionServiceImpl extends BaseServiceImpl<ThMissionMapper, ThMissi
thMissionUpdate.setId(thMission.getId());
thMissionUpdate.setMileage(missionStatusRequest.getMileage());
boolean result=false;
try {
AirWeatherVO weather = inspectionService.getWeather(thMission.getAirportId());
String weatherStr = WeatherUtil.getWeather(weather);
thMissionUpdate.setWeather(weatherStr);
}catch (Exception e){
thMissionUpdate.setWeather("");
log.info("获取天气信息失败,请重试");
}

//任务调用完成之后,调用发送通道,请求DSP关闭请求
//调用DSP接口
// 任务调用完成之后,调用发送通道,请求DSP关闭请求
// 调用DSP接口
JSONObject jsonObject = new JSONObject();
jsonObject.put("requestId",thMission.getRequestId());
JSONObject responseJson=new JSONObject();

+ 10
- 175
tuoheng-admin/src/main/java/com/tuoheng/admin/service/impl/QuestionServiceImpl.java Zobrazit soubor

@@ -17,6 +17,7 @@ import com.tuoheng.admin.enums.*;
import com.tuoheng.admin.mapper.*;
import com.tuoheng.admin.service.IQuestionService;
import com.tuoheng.admin.service.IQuestionTypeService;
import com.tuoheng.admin.service.third.dsp.DspCallBackService;
import com.tuoheng.admin.service.warning.IWarningService;
import com.tuoheng.admin.service.warning.WarningServiceImpl;
import com.tuoheng.admin.utils.GaodeUtil;
@@ -68,10 +69,7 @@ public class QuestionServiceImpl extends BaseServiceImpl<QuestionMapper, Questio
private IQuestionTypeService questionTypeService;

@Autowired
private WarningMapper warningMapper;

@Autowired
private IWarningService iWarningService;
private DspCallBackService dspCallBackService;

private final static SimpleDateFormat dateformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

@@ -267,13 +265,6 @@ public class QuestionServiceImpl extends BaseServiceImpl<QuestionMapper, Questio
public JsonResult<List<QuestionTypeCountVO>> analyzeType(Integer missionId) {
List<QuestionTypeCountVO> questionTypeCountList = questionMapper.analyzeType
(missionId, ShiroUtils.getTenantId());

//id
//name
//code
//type
//content

//添加问题的分类
List<QuestionType> questionTypeList = new ArrayList<>();
try {
@@ -291,172 +282,16 @@ public class QuestionServiceImpl extends BaseServiceImpl<QuestionMapper, Questio
return JsonResult.success(questionTypeCountList);
}

@Override
public JsonResult process(String requestId, CallbackRequest callbackRequest) throws ServiceException {

ThMission mission = getThMission(requestId);
Boolean aBoolean = saveQuestion(callbackRequest, mission);
//如果任务已经完成就修改任务状态
ThMission thMissionUpdate = new ThMission(UpdateOrCreateEnum.UPDATE.getCode());

thMissionUpdate.setProgressbar(callbackRequest.getProgress());
if (aBoolean) {
setComplate(callbackRequest, mission, thMissionUpdate);
} else {
setTaskStatusEnum(thMissionUpdate, TaskStatusEnum.FAIL, mission);
}
return JsonResult.success();
}

private void setTaskStatusEnum(ThMission thMissionUpdate, TaskStatusEnum statusEnum, ThMission mission) {
thMissionUpdate.setStatus(statusEnum.getCode());
thMissionUpdate.setId(mission.getId());
thMissionUpdate.setExecutionEndTime(new Date());
missionMapper.updateById(thMissionUpdate);
}

private void setComplate(CallbackRequest callbackRequest, ThMission mission, ThMission thMissionUpdate) {
if (callbackRequest.getAnalyseStatus() == AiAnalyseStatusEnum.SUCCESS.getCode() || callbackRequest.getAnalyseStatus() == AiAnalyseStatusEnum.SUCCESS_TIMEOUT.getCode()) {
//这边存回放的视频地址
thMissionUpdate.setVideoUrl(callbackRequest.getVideoUrl());
thMissionUpdate.setAiVideoUrl(callbackRequest.getAiVideoUrl());

if (callbackRequest.getAnalyseStatus() == AiAnalyseStatusEnum.SUCCESS_TIMEOUT.getCode()) {
thMissionUpdate.setAnalyseStatus(AiAnalyseStatusEnum.SUCCESS_TIMEOUT.getCode());
} else {
thMissionUpdate.setAnalyseStatus(AiAnalyseStatusEnum.SUCCESS.getCode());
}
setTaskStatusEnum(thMissionUpdate, TaskStatusEnum.COMPLETE, mission);
} else if (callbackRequest.getAnalyseStatus() == AiAnalyseStatusEnum.FAILED.getCode()) {
setTaskStatusEnum(thMissionUpdate, TaskStatusEnum.FAIL, mission);
} else {
thMissionUpdate.setAnalyseStatus(AiAnalyseStatusEnum.RUNNING.getCode());
setTaskStatusEnum(thMissionUpdate, TaskStatusEnum.FLIGHT, mission);
}

}

private Boolean saveQuestion(CallbackRequest callbackRequest, ThMission mission) {
List<CallbackRequest.QuestionFilesDTO> questionFiles = callbackRequest.getQuestionFiles();
//获取当前飞行坐标,存问题的经纬度
List<ThInspection> flightDataList = getThInspections(mission);
List<Question> questionList = getQuestionList(mission, questionFiles, flightDataList);
if (questionList.size() == 0) {
return true;
}
boolean flag = this.saveBatch(questionList);
//保存问题数据时调用saveWarningData方法保存预警数据入库
this.saveWarningData(questionList);
log.info("预警表数据入库结束, {}", flag);
return flag;
}

private List<ThInspection> getThInspections(ThMission mission) {
return inspectionMapper.selectList(new LambdaQueryWrapper<ThInspection>()
.eq(ThInspection::getMissionId, mission.getId())
.eq(ThInspection::getMark, MarkTypeEnum.VALID.getCode())
.orderByDesc(ThInspection::getCreateTime));
}

private List<Question> getQuestionList(ThMission mission, List<CallbackRequest.QuestionFilesDTO> questionFiles, List<ThInspection> flightDataList) {
List<Question> questionList = new ArrayList<>();
if (ObjectUtil.isEmpty(questionFiles)) {
return questionList;
}

List<QuestionType> questionType = questionTypeService.getQuestionType();
Map<String, QuestionType> typeMap = new HashMap<>();
for (QuestionType type : questionType) {
typeMap.put(type.getCode(), type);
}
for (CallbackRequest.QuestionFilesDTO questionFile : questionFiles) {
Question question = new Question(UpdateOrCreateEnum.CREATE.getCode());
BeanUtils.copyProperties(questionFile, question);
ThInspection flightDataByTime = getFlightDataByTime(flightDataList, questionFile.getAnalyseTime().getTime());
question.setMissionId(mission.getId());
question.setTenantId(mission.getTenantId());
question.setMissionName(mission.getName());
question.setLat(flightDataByTime.getLat());
question.setLng(flightDataByTime.getLng());
//待确认
question.setStatus(QuestionStatusEnum.NOTREVIEWED.getCode());
//问题类型
QuestionType questionTypeInfo = typeMap.get(questionFile.getQuestionCode());
question.setType(ObjectUtil.isNotEmpty(questionTypeInfo) ? questionTypeInfo.getCode() : "");
question.setQuestionName(ObjectUtil.isNotEmpty(questionTypeInfo) ? questionTypeInfo.getContent() : "");
question.setQuestionDesc(ObjectUtil.isNotEmpty(questionTypeInfo) ? questionTypeInfo.getDescription() : "");
questionList.add(question);
}
return questionList;
}

//根据获取的问题列表问题类型code为002004,添加数据入库到预警表
private Boolean saveWarningData(List<Question> questionList) {
log.info("预警表数据入库开始...");
List<Warning> warningList = new ArrayList<>();
List<QuestionType> questionType = questionTypeService.getQuestionType();
Map<String, QuestionType> typeMap = new HashMap<>();
for (QuestionType type : questionType) {
typeMap.put(type.getCode(), type);
}
//调用添加问题列表接口
for (Question question : questionList) {
Warning warning = new Warning();
//问题类型为火灾隐患时添加数据
if (question.getType().equals(QuestionTypeEnum.Q4.getCode()) || question.getType().equals(QuestionTypeEnum.Q3.getCode())) {
warning.setTenantId(question.getTenantId());
warning.setDiscoveryWay(DiscoveryWayEnum.UAV_PATROL.getCode());
warning.setStatus(WarningStatusEnum.WAIT_CONFIRM.getCode());
warning.setQuestionId(question.getId());
warning.setCreateUser(question.getCreateUser());
warning.setCreateTime(question.getCreateTime());
warning.setMark(MarkTypeEnum.VALID.getCode());
if(StringUtils.isNotEmpty(question.getLng()) && StringUtils.isNotEmpty(question.getLat())){
String gaodeAddress = GaodeUtil.getGaodeAddress(question.getLng(), question.getLat());
warning.setLocation(gaodeAddress);
}
warningList.add(warning);
}
}
return iWarningService.saveBatch(warningList);
}

private ThMission getThMission(String requestId) {
LambdaQueryWrapper<ThMission> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper
.eq(ThMission::getMark, MarkTypeEnum.VALID.getCode())
.eq(ThMission::getRequestId, requestId)
.eq(ThMission::getStatus, TaskStatusEnum.FLIGHT.getCode())
.orderByDesc(ThMission::getExecutionStartTime);
List<ThMission> thMissions = missionMapper.selectList(lambdaQueryWrapper);
if (ObjectUtil.isEmpty(thMissions) || thMissions.size() == 0) {
throw new ServiceException(HttpStatus.BAD_REQUEST.value(), "正在执行的任务不存在!");
}
return thMissions.get(0);
}


/**
* 获取飞行坐标
*
* @param inspectionList 飞行坐标集合
* @param time 当前时间
* @return 当前飞行对象
* DSP分析处理逻辑
* @param requestId
* @param callbackRequest
* @return
* @throws ServiceException
*/
private ThInspection getFlightDataByTime(List<ThInspection> inspectionList, long time) {
if (CollectionUtils.isEmpty(inspectionList)) {
throw new ServiceException(HttpStatus.BAD_REQUEST.value(), "获取无人机飞行坐标失败!");
}
List<ThInspection> inspectionData = new ArrayList<>();
for (ThInspection thInspection : inspectionList) {
if (thInspection.getUpdateTime().getTime() <= time) {
inspectionData.add(thInspection);
}
}
if (CollectionUtils.isEmpty(inspectionData)) {
throw new ServiceException(HttpStatus.BAD_REQUEST.value(), "获取无人机飞行坐标失败!");
}
return inspectionData.get(0);
@Override
public JsonResult process(String requestId, CallbackRequest callbackRequest) throws ServiceException {
return dspCallBackService.process(requestId, callbackRequest);
}

}

+ 221
- 0
tuoheng-admin/src/main/java/com/tuoheng/admin/service/third/dsp/DspCallBackService.java Zobrazit soubor

@@ -0,0 +1,221 @@
package com.tuoheng.admin.service.third.dsp;

import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.tuoheng.admin.entity.domain.*;
import com.tuoheng.admin.entity.request.CallbackRequest;
import com.tuoheng.admin.enums.*;
import com.tuoheng.admin.mapper.QuestionMapper;
import com.tuoheng.admin.mapper.ThInspectionMapper;
import com.tuoheng.admin.mapper.ThMissionMapper;
import com.tuoheng.admin.service.IQuestionTypeService;
import com.tuoheng.admin.service.warning.IWarningService;
import com.tuoheng.admin.utils.GaodeUtil;
import com.tuoheng.common.exception.ServiceException;
import com.tuoheng.common.utils.JsonResult;
import com.tuoheng.common.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Slf4j
@Service
public class DspCallBackService {

@Autowired
private ThMissionMapper missionMapper;

@Autowired
private ThInspectionMapper inspectionMapper;

@Autowired
private QuestionMapper questionMapper;

@Autowired
private IQuestionTypeService questionTypeService;

@Autowired
private IWarningService warningService;

public JsonResult process(String requestId, CallbackRequest callbackRequest) throws ServiceException {
ThMission mission = this.getThMission(requestId);

// 保存DSP分析出来的问题
this.saveQuestion(callbackRequest, mission);

// 修改分析状态
ThMission thMissionUpdate = new ThMission(UpdateOrCreateEnum.UPDATE.getCode());
thMissionUpdate.setId(mission.getId());
thMissionUpdate.setProgressbar(callbackRequest.getProgress());
this.setAnalyseData(callbackRequest, thMissionUpdate);
Integer count = missionMapper.updateById(thMissionUpdate);
if (count <= 0) {
log.info("DSP分析,修改分析状态失败");
}
return JsonResult.success();
}

/**
* 获取任务
* @param requestId
* @return
*/
private ThMission getThMission(String requestId) {
LambdaQueryWrapper<ThMission> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(ThMission::getMark, MarkTypeEnum.VALID.getCode())
.eq(ThMission::getRequestId, requestId)
// .eq(ThMission::getStatus, TaskStatusEnum.FLIGHT.getCode())
.orderByDesc(ThMission::getExecutionStartTime);
List<ThMission> thMissions = missionMapper.selectList(lambdaQueryWrapper);
if (ObjectUtil.isEmpty(thMissions) || thMissions.size() == 0) {
throw new ServiceException(HttpStatus.BAD_REQUEST.value(), "任务不存在!");
}
return thMissions.get(0);
}

/**
*
* 设置dsp回调返回的数据
* 1、DSP分析状态
* 2、DSP分析完成,设置视频地址
*
* @param callbackRequest
* @param thMissionUpdate
*/
private void setAnalyseData(CallbackRequest callbackRequest, ThMission thMissionUpdate) {
if (callbackRequest.getAnalyseStatus() == AiAnalyseStatusEnum.SUCCESS.getCode() || callbackRequest.getAnalyseStatus() == AiAnalyseStatusEnum.SUCCESS_TIMEOUT.getCode()) {
//这边存回放的视频地址
thMissionUpdate.setVideoUrl(callbackRequest.getVideoUrl());
thMissionUpdate.setAiVideoUrl(callbackRequest.getAiVideoUrl());
if (callbackRequest.getAnalyseStatus() == AiAnalyseStatusEnum.SUCCESS_TIMEOUT.getCode()) {
thMissionUpdate.setAnalyseStatus(AiAnalyseStatusEnum.SUCCESS_TIMEOUT.getCode());
} else {
thMissionUpdate.setAnalyseStatus(AiAnalyseStatusEnum.SUCCESS.getCode());
}
} else if (callbackRequest.getAnalyseStatus() == AiAnalyseStatusEnum.FAILED.getCode()) {
thMissionUpdate.setAnalyseStatus(AiAnalyseStatusEnum.FAILED.getCode());
} else {
thMissionUpdate.setAnalyseStatus(AiAnalyseStatusEnum.RUNNING.getCode());
}
}

private Boolean saveQuestion(CallbackRequest callbackRequest, ThMission mission) {
List<CallbackRequest.QuestionFilesDTO> questionFiles = callbackRequest.getQuestionFiles();
//获取当前飞行坐标,存问题的经纬度
List<ThInspection> flightDataList = getThInspections(mission);
List<Question> questionList = getQuestionList(mission, questionFiles, flightDataList);
if (questionList.size() == 0) {
return true;
}
boolean flag = false;
for (Question question : questionList) {
questionMapper.insert(question);
}
//保存问题数据时调用saveWarningData方法保存预警数据入库
this.saveWarningData(questionList);
log.info("预警表数据入库结束, {}", flag);
return flag;
}

private List<ThInspection> getThInspections(ThMission mission) {
return inspectionMapper.selectList(new LambdaQueryWrapper<ThInspection>()
.eq(ThInspection::getMissionId, mission.getId())
.eq(ThInspection::getMark, MarkTypeEnum.VALID.getCode())
.orderByDesc(ThInspection::getCreateTime));
}

private List<Question> getQuestionList(ThMission mission, List<CallbackRequest.QuestionFilesDTO> questionFiles, List<ThInspection> flightDataList) {
List<Question> questionList = new ArrayList<>();
if (ObjectUtil.isEmpty(questionFiles)) {
return questionList;
}

List<QuestionType> questionType = questionTypeService.getQuestionType();
Map<String, QuestionType> typeMap = new HashMap<>();
for (QuestionType type : questionType) {
typeMap.put(type.getCode(), type);
}
for (CallbackRequest.QuestionFilesDTO questionFile : questionFiles) {
Question question = new Question(UpdateOrCreateEnum.CREATE.getCode());
BeanUtils.copyProperties(questionFile, question);
ThInspection flightDataByTime = getFlightDataByTime(flightDataList, questionFile.getAnalyseTime().getTime());
question.setMissionId(mission.getId());
question.setTenantId(mission.getTenantId());
question.setMissionName(mission.getName());
question.setLat(flightDataByTime.getLat());
question.setLng(flightDataByTime.getLng());
//待确认
question.setStatus(QuestionStatusEnum.NOTREVIEWED.getCode());
//问题类型
QuestionType questionTypeInfo = typeMap.get(questionFile.getQuestionCode());
question.setType(ObjectUtil.isNotEmpty(questionTypeInfo) ? questionTypeInfo.getCode() : "");
question.setQuestionName(ObjectUtil.isNotEmpty(questionTypeInfo) ? questionTypeInfo.getContent() : "");
question.setQuestionDesc(ObjectUtil.isNotEmpty(questionTypeInfo) ? questionTypeInfo.getDescription() : "");
questionList.add(question);
}
return questionList;
}

//根据获取的问题列表问题类型code为002004,添加数据入库到预警表
private Boolean saveWarningData(List<Question> questionList) {
log.info("预警表数据入库开始...");
List<Warning> warningList = new ArrayList<>();
List<QuestionType> questionType = questionTypeService.getQuestionType();
Map<String, QuestionType> typeMap = new HashMap<>();
for (QuestionType type : questionType) {
typeMap.put(type.getCode(), type);
}
//调用添加问题列表接口
for (Question question : questionList) {
Warning warning = new Warning();
//问题类型为火灾隐患时添加数据
if (question.getType().equals(QuestionTypeEnum.Q4.getCode()) || question.getType().equals(QuestionTypeEnum.Q3.getCode())) {
warning.setTenantId(question.getTenantId());
warning.setMissionId(question.getMissionId());
warning.setDiscoveryWay(DiscoveryWayEnum.UAV_PATROL.getCode());
warning.setStatus(WarningStatusEnum.WAIT_CONFIRM.getCode());
warning.setQuestionId(question.getId());
warning.setCreateUser(question.getCreateUser());
warning.setCreateTime(question.getCreateTime());
warning.setMark(MarkTypeEnum.VALID.getCode());
if(StringUtils.isNotEmpty(question.getLng()) && StringUtils.isNotEmpty(question.getLat())){
String gaodeAddress = GaodeUtil.getGaodeAddress(question.getLng(), question.getLat());
warning.setLocation(gaodeAddress);
}
warningList.add(warning);
}
}
return warningService.saveBatch(warningList);
}

/**
* 获取飞行坐标
*
* @param inspectionList 飞行坐标集合
* @param time 当前时间
* @return 当前飞行对象
*/
private ThInspection getFlightDataByTime(List<ThInspection> inspectionList, long time) {
if (CollectionUtils.isEmpty(inspectionList)) {
throw new ServiceException(HttpStatus.BAD_REQUEST.value(), "获取无人机飞行坐标失败!");
}
List<ThInspection> inspectionData = new ArrayList<>();
for (ThInspection thInspection : inspectionList) {
if (thInspection.getUpdateTime().getTime() <= time) {
inspectionData.add(thInspection);
}
}
if (CollectionUtils.isEmpty(inspectionData)) {
throw new ServiceException(HttpStatus.BAD_REQUEST.value(), "获取无人机飞行坐标失败!");
}
return inspectionData.get(0);
}
}

Načítá se…
Zrušit
Uložit