吴远 4 days ago
parent
commit
8de3dd6711
  1. 9
      dk-api/api-system/src/main/java/org/dromara/system/api/RemoteDepartBoundaryService.java
  2. 54
      dk-api/api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteSysDepartBoundaryVo.java
  3. 4
      dk-common/common-core/src/main/java/org/dromara/common/core/constant/AiCompareStatusConstants.java
  4. 46
      dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessAlertServiceImpl.java
  5. 5
      dk-modules/sample/src/main/java/org/dromara/sample/configuration/LingxiuMqttMessageProcessor.java
  6. 93
      dk-modules/sample/src/main/java/org/dromara/sample/configuration/LingxiuMqttMessageProcessorImpl.java
  7. 22
      dk-modules/sample/src/main/java/org/dromara/sample/configuration/LingxiuMqttStartupRunner.java
  8. 45
      dk-modules/sample/src/main/java/org/dromara/sample/configuration/MqttLingxiuConfig.java
  9. 45
      dk-modules/sample/src/main/java/org/dromara/sample/configuration/MqttLingxiuSubscriber.java
  10. 3
      dk-modules/sample/src/main/java/org/dromara/sample/wayline/controller/AiCompareController.java
  11. 128
      dk-modules/sample/src/main/java/org/dromara/sample/wayline/controller/WaylineJobAtmosphereController.java
  12. 127
      dk-modules/sample/src/main/java/org/dromara/sample/wayline/domain/WaylineJobAtmosphere.java
  13. 178
      dk-modules/sample/src/main/java/org/dromara/sample/wayline/domain/bo/WaylineJobAtmosphereBo.java
  14. 210
      dk-modules/sample/src/main/java/org/dromara/sample/wayline/domain/vo/WaylineJobAtmosphereVo.java
  15. 15
      dk-modules/sample/src/main/java/org/dromara/sample/wayline/mapper/WaylineJobAtmosphereMapper.java
  16. 2
      dk-modules/sample/src/main/java/org/dromara/sample/wayline/model/dto/FrameDTO.java
  17. 2
      dk-modules/sample/src/main/java/org/dromara/sample/wayline/model/dto/WaylineJobDTO.java
  18. 2
      dk-modules/sample/src/main/java/org/dromara/sample/wayline/service/IAiCompareService.java
  19. 74
      dk-modules/sample/src/main/java/org/dromara/sample/wayline/service/IWaylineJobAtmosphereService.java
  20. 132
      dk-modules/sample/src/main/java/org/dromara/sample/wayline/service/impl/AiCompareServiceImpl.java
  21. 188
      dk-modules/sample/src/main/java/org/dromara/sample/wayline/service/impl/WaylineJobAtmosphereServiceImpl.java
  22. 1
      dk-modules/sample/src/main/java/org/dromara/sample/wayline/service/impl/WaylineJobServiceImpl.java
  23. 7
      dk-modules/sample/src/main/resources/mapper/WaylineJobAtmosphereMapper.xml
  24. 8
      dk-modules/system/src/main/java/org/dromara/system/controller/system/SysConfigController.java
  25. 31
      dk-modules/system/src/main/java/org/dromara/system/dubbo/RemoteDepartBoundaryServiceImpl.java
  26. 6
      dk-modules/system/src/main/java/org/dromara/system/service/impl/SysConfigServiceImpl.java

9
dk-api/api-system/src/main/java/org/dromara/system/api/RemoteDepartBoundaryService.java

@ -0,0 +1,9 @@
package org.dromara.system.api;
import org.dromara.system.api.domain.vo.RemoteSysDepartBoundaryVo;
import java.util.List;
public interface RemoteDepartBoundaryService {
List<RemoteSysDepartBoundaryVo> listDepartBoundaryByLngAndLat(Double lng, Double lat);
}

54
dk-api/api-system/src/main/java/org/dromara/system/api/domain/vo/RemoteSysDepartBoundaryVo.java

@ -0,0 +1,54 @@
package org.dromara.system.api.domain.vo;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serial;
import java.io.Serializable;
import java.util.List;
@Data
@NoArgsConstructor
public class RemoteSysDepartBoundaryVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
private Long id;
/**机构ID*/
private Long deptId;
/**机构/部门名称*/
private String deptName;
/**部门全路径*/
private String namePath;
/**边界*/
private String boundary;
/**
* 区域类别 areaType: 0市级 1区级() 2镇级(街道) 3村级
*/
private Integer areaType;
/**
* 父类id
*/
private Long parentId;
/**删除状态(0,正常,1已删除)*/
private String delFlag;
private List<Long> deptIds;
}

4
dk-common/common-core/src/main/java/org/dromara/common/core/constant/AiCompareStatusConstants.java

@ -33,4 +33,8 @@ public interface AiCompareStatusConstants {
String QUEUW_TYPE_0="0";
String QUEUW_TYPE_1="1";
/** 平台类型 2:天眼巡*/
Integer COMPARETYPE=2;
}

46
dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessAlertServiceImpl.java

@ -49,10 +49,7 @@ import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.resource.api.RemoteMessageService;
import org.dromara.system.api.*;
import org.dromara.system.api.domain.bo.RemoteNoticeBo;
import org.dromara.system.api.domain.vo.RemoteAiLabelPostVo;
import org.dromara.system.api.domain.vo.RemoteDeptVo;
import org.dromara.system.api.domain.vo.RemotePostVo;
import org.dromara.system.api.domain.vo.RemoteUserVo;
import org.dromara.system.api.domain.vo.*;
import org.dromara.business.domain.BusinessAlertConstructInfoOss;
import org.dromara.business.mapper.BusinessAlertConstructInfoOssMapper;
import org.dromara.system.api.model.RoleDTO;
@ -140,7 +137,8 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService {
@DubboReference(timeout = 30000)
RemoteDataScopeService remoteDataScopeService;
@DubboReference(timeout = 30000)
RemoteDepartBoundaryService remoteDepartBoundaryService;
/**
* 新增预警任务
*
@ -282,7 +280,7 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService {
*/
@Override
public Boolean batchAddBusinessAlert(List<RemoteBusinessAlertVo> alertVoList, String activeProfile, Long pushDeptId) {
List<BusinessAlert> businessAlerts = alertVoList.stream().map(alert -> {
List<BusinessAlert> businessAlerts = alertVoList.parallelStream().map(alert -> {
BusinessAlert businessAlert = new BusinessAlert();
alert.setCreateTime(new Date());
alert.setHandleType(BusinessStatusEnum.VERIFY.getStatus());
@ -300,7 +298,13 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService {
//查询历史预警
List<BusinessAlert> businessAlertList = this.listHandleHistory(alert.getLng(), alert.getLat(), DateUtils.parseDateToStr(FormatsType.YYYY_MM_DD_HH_MM_SS, alert.getCreateTime()));
businessAlert.setHandleNum(businessAlertList.size());
//查询预警所在的部门
List<RemoteSysDepartBoundaryVo> boundaryVoList = remoteDepartBoundaryService.listDepartBoundaryByLngAndLat(Convert.toDouble(alert.getLng()), Convert.toDouble(alert.getLat()));
if(!boundaryVoList.isEmpty()){
RemoteSysDepartBoundaryVo boundaryVo = boundaryVoList.get(boundaryVoList.size() - 1);
businessAlert.setDeptId(Convert.toStr(boundaryVo.getDeptId()));
businessAlert.setDeptName(boundaryVo.getDeptName());
}
return businessAlert;
}).toList();
@ -1017,7 +1021,7 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService {
throw new RuntimeException("没有可查看的预警数据!");
}
wrapper.eq("t.business_type",1);
// wrapper.eq("t.business_type",1);
//根据前端查询条件查询
List<BusinessAlert> alertList = this.baseMapper.exportAlert(wrapper,ptPrefix);
@ -1052,7 +1056,8 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService {
businessAlert.setMaxMateSourceImgUrl(MinioUntil.getObjectUrlOne(MinIOConstants.BUCKET_ALERT, businessAlert.getMaxMateSourceImgUrl(), 3600).toString());
businessAlert.setMateSourceImgUrl(MinioUntil.getObjectUrlOne(MinIOConstants.BUCKET_ALERT, businessAlert.getMateSourceImgUrl(), 3600).toString());
}else {
businessAlert.setImages(MinioUntil.getObjectUrlOne(MinIOConstants.BUCKET_ALERT, businessAlert.getImages(), 3600).toString());
//url渲染快(只要不报错),base64模式超级卡慢
businessAlert.setImages(MinioUntil.getObjectUrlOne(MinIOConstants.BUCKET_DKCY, businessAlert.getImages(), 3600).toString()); // 9001/dkcy//ai/report/ > 9001/dkcy/ai/report/
}
//获取指南针
@ -1083,6 +1088,17 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService {
if (bo.getExportType().equalsIgnoreCase("world")){
/**
* http://114.235.183.147:9001/dkcy//ai/report/29847/xwoKJvrqpp/zDASKjUVlN/events/8UUXN2B00A00SKdlfHClDieQ.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20250614T061025Z&X-Amz-SignedHeaders=host&X-Amz-Credential=wuyuan%40yf%2F20250614%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Expires=3600&X-Amz-Signature=a90766f63fbecebf99fd50fed5ac018458225d5df0f6afee39b5c58b6447b16e
* 特殊字符里有特殊符号图片处理报错 class com.spire.doc.packages.sprghs: The string contains invalid characters
* 先处理 businessType=2的数据
*/
for (BusinessAlert businessAlert : alertList) {
if(ObjectUtil.equals(businessAlert.getBusinessType(),2)){
businessAlert.setImages(imageUrlToBase64(businessAlert.getImages()));
}
}
//生成word
FreemarkerUtil.renderTplFileToWord("预警导出.docx","alert.ftl",resultMap,response);
} else if (bo.getExportType().equalsIgnoreCase("pdf")) {
@ -1094,6 +1110,18 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService {
}
}
// 图片url转base64
public static String imageUrlToBase64(String imageUrl) {
try (InputStream in = new URL(imageUrl).openStream()) {
byte[] bytes = in.readAllBytes();
return Base64.getEncoder().encodeToString(bytes);
} catch (Exception e) {
e.printStackTrace();
return "";
}
}
@Override
public void pushAlert(Long alertId, String deptId, String deptName) {
BusinessAlert businessAlert= this.getBusinessAlert(alertId);

5
dk-modules/sample/src/main/java/org/dromara/sample/configuration/LingxiuMqttMessageProcessor.java

@ -0,0 +1,5 @@
package org.dromara.sample.configuration;
public interface LingxiuMqttMessageProcessor {
void process(String topic, String payload);
}

93
dk-modules/sample/src/main/java/org/dromara/sample/configuration/LingxiuMqttMessageProcessorImpl.java

@ -0,0 +1,93 @@
package org.dromara.sample.configuration;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.dromara.sample.manage.mapper.IDevicePayloadMapper;
import org.dromara.sample.manage.model.dto.DevicePayloadDTO;
import org.dromara.sample.manage.model.entity.DevicePayloadEntity;
import org.dromara.sample.manage.service.IDevicePayloadService;
import org.dromara.sample.wayline.domain.WaylineJobAtmosphere;
import org.dromara.sample.wayline.domain.bo.WaylineJobAtmosphereBo;
import org.dromara.sample.wayline.model.dto.WaylineJobDTO;
import org.dromara.sample.wayline.model.entity.WaylineJobEntity;
import org.dromara.sample.wayline.service.IWaylineJobAtmosphereService;
import org.dromara.sample.wayline.service.IWaylineJobService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.Optional;
@Slf4j
@Component
@RequiredArgsConstructor
public class LingxiuMqttMessageProcessorImpl implements LingxiuMqttMessageProcessor{
private final IWaylineJobAtmosphereService waylineJobAtmosphereService;
private final IWaylineJobService waylineJobService;
private final IDevicePayloadService devicePayloadService;
@Autowired
private final IDevicePayloadMapper devicePayloadMapper;
@Override
public void process(String topic, String payload) {
log.info("处理灵嗅MQTT数据 topic={}, payload={}", topic, payload);
// {"serial":"37c12953","sequence":12,"sateNum":0,"hdop":0,"utcTime":"2025-06-17-01-37-22","latitude":34.270486,"longitude":117.149302,"altitude":0.03,"temperature":29.61,"humidity":21.37,"pressure":100071.42,"airData":{"SO2(ppm)":0,"NO2(ppm)":0,"Ox(ppm)":0,"PM1.0(ug/m3)":14,"PM2.5(ug/m3)":35,"PM10(ug/m3)":46}}
// if(1==1){ //关闭数据
// return;
// }
try {
JSONObject json = JSONUtil.parseObj(payload);
System.out.println("json打印"+json);
JSONObject airData = json.getJSONObject("airData");
String utcTimeStr = json.getStr("utcTime");
//"airData":{"SO2(ppm)":0,"NO2(ppm)":0,"Ox(ppm)":0,"PM1.0(ug/m3)":16,"PM2.5(ug/m3)":39,"PM10(ug/m3)":51}
//找默认数据
WaylineJobAtmosphereBo jobAtmosphere = JSONUtil.toBean(json, WaylineJobAtmosphereBo.class);
jobAtmosphere.setAirData(JSONUtil.toJsonStr(airData));
jobAtmosphere.setUtcTimeStr(utcTimeStr);
LambdaQueryWrapper<DevicePayloadEntity> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(DevicePayloadEntity::getPayloadSn,jobAtmosphere.getSerial());
DevicePayloadEntity devicePayloadEntity = devicePayloadMapper.selectOne(queryWrapper);
String deviceSn = devicePayloadEntity.getDeviceSn();
System.out.println(deviceSn);
// List<DevicePayloadDTO> devicePayloadEntitiesByDeviceSn = devicePayloadService.getDevicePayloadEntitiesByDeviceSn("");
// String sn = json.getStr("8UUXN3100A01WS");//8UUXN3100A01WS 8UUXN2T00A01R8
// 查找无人机/wayline信息
WaylineJobDTO waylineJobDTO = waylineJobService.getJobByDockSn(deviceSn);
// waylineJobService.getid
// Optional<WaylineJobDTO> jobOpt = waylineJobService.getJobByJobInternalId(sn);
// if (jobOpt.isPresent()) {
// waylineJobAtmosphereService.handleAdd(jobOpt.get(), json);
// } else {
// log.warn("找不到对应无人机任务:sn={}", sn);
// }
// "{\"SO2(ppm)\":0,\"NO2(ppm)\":0,\"Ox(ppm)\":0,\"PM1.0(ug/m3)\":16,\"PM2.5(ug/m3)\":38,\"PM10(ug/m3)\":48}"
if(ObjectUtil.isNotEmpty(waylineJobDTO)){
jobAtmosphere.setWaylineJobId((long)waylineJobDTO.getId());
jobAtmosphere.setWaylineName(waylineJobDTO.getWaylineName());
jobAtmosphere.setJobId(waylineJobDTO.getJobId());
jobAtmosphere.setName(waylineJobDTO.getJobName());
jobAtmosphere.setFileId(waylineJobDTO.getFileId());
jobAtmosphere.setWorkspaceId(waylineJobDTO.getWorkspaceId());
jobAtmosphere.setDockSn(waylineJobDTO.getDockSn());
// BeanUtil.copyProperties();
waylineJobAtmosphereService.insertByBo(jobAtmosphere);
}
} catch (Exception e) {
log.error("处理灵嗅MQTT消息异常", e);
}
}
}

22
dk-modules/sample/src/main/java/org/dromara/sample/configuration/LingxiuMqttStartupRunner.java

@ -0,0 +1,22 @@
package org.dromara.sample.configuration;
import lombok.RequiredArgsConstructor;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
@Component
@RequiredArgsConstructor
public class LingxiuMqttStartupRunner implements ApplicationRunner {
private final MqttLingxiuSubscriber subscriber;
@Override
public void run(ApplicationArguments args) {
try {
subscriber.subscribe();
} catch (Exception e) {
System.err.println("启动灵嗅 MQTT 订阅失败"+ e);
}
}
}

45
dk-modules/sample/src/main/java/org/dromara/sample/configuration/MqttLingxiuConfig.java

@ -0,0 +1,45 @@
package org.dromara.sample.configuration;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MqttLingxiuConfig {
@Value("${lingxiu.mqtt.broker}")
private String brokerUrl;
@Value("${lingxiu.mqtt.clientId}")
private String clientId;
@Value("${lingxiu.mqtt.username}")
private String username;
@Value("${lingxiu.mqtt.password}")
private String password;
@Bean
public MqttClient lingxiuMqttClient() throws MqttException {
MqttClient client = new MqttClient(brokerUrl, clientId, new MemoryPersistence());
MqttConnectOptions options = new MqttConnectOptions();
options.setUserName(username);
options.setPassword(password.toCharArray());
options.setAutomaticReconnect(true);
options.setCleanSession(true);
client.connect(options);
return client;
}
@Bean
public MqttLingxiuSubscriber mqttLingxiuSubscriber(MqttClient client,
LingxiuMqttMessageProcessor processor) {
return new MqttLingxiuSubscriber(client, processor);
}
}

45
dk-modules/sample/src/main/java/org/dromara/sample/configuration/MqttLingxiuSubscriber.java

@ -0,0 +1,45 @@
package org.dromara.sample.configuration;
import lombok.extern.slf4j.Slf4j;
import org.eclipse.paho.client.mqttv3.*;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
@Slf4j
public class MqttLingxiuSubscriber {
private final MqttClient client;
private final LingxiuMqttMessageProcessor processor;
public MqttLingxiuSubscriber(MqttClient client, LingxiuMqttMessageProcessor processor) {
this.client = client;
this.processor = processor;
}
public void subscribe() throws MqttException {
String[] topics = new String[]{"/topic/#"};
client.setCallback(new MqttCallback() {
@Override
public void connectionLost(Throwable cause) {
log.warn("灵嗅MQTT连接断开", cause);
}
@Override
public void messageArrived(String topic, MqttMessage message) {
String payload = new String(message.getPayload(), StandardCharsets.UTF_8);
log.info("MQTT 收到消息:{} -> {}", topic, payload);
processor.process(topic, payload); // 业务分发
}
@Override
public void deliveryComplete(IMqttDeliveryToken token) {}
});
for (String topic : topics) {
client.subscribe(topic, 1);
}
}
}

3
dk-modules/sample/src/main/java/org/dromara/sample/wayline/controller/AiCompareController.java

@ -189,11 +189,12 @@ public class AiCompareController extends BaseController {
/**
*
* 删除验证列表预警
* @param ids 主键
* @param ids 主键
* * */
@SaCheckPermission("sample:compare:delAlertList")
@DeleteMapping("/delAlertList")
public R<Void> delAlertList(Long ids) {
return toAjax(aiCompareService.delAlertList(List.of(ids)));
}

128
dk-modules/sample/src/main/java/org/dromara/sample/wayline/controller/WaylineJobAtmosphereController.java

@ -0,0 +1,128 @@
package org.dromara.sample.wayline.controller;
import java.util.List;
import java.util.Optional;
import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.dromara.common.sdk.common.HttpResultResponse;
import org.dromara.sample.wayline.model.dto.WaylineJobDTO;
import org.dromara.sample.wayline.service.IWaylineJobService;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.dromara.common.idempotent.annotation.RepeatSubmit;
import org.dromara.common.log.annotation.Log;
import org.dromara.common.web.core.BaseController;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.core.domain.R;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.excel.utils.ExcelUtil;
import org.dromara.sample.wayline.domain.vo.WaylineJobAtmosphereVo;
import org.dromara.sample.wayline.domain.bo.WaylineJobAtmosphereBo;
import org.dromara.sample.wayline.service.IWaylineJobAtmosphereService;
import org.dromara.common.mybatis.core.page.TableDataInfo;
/**
* 无人机任务-空气质量
* 前端访问路由地址为:/sample/WaylineJobAtmosphere
*
* @author szs
* @date 2025-06-16
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/WaylineJobAtmosphere")
public class WaylineJobAtmosphereController extends BaseController {
private final IWaylineJobAtmosphereService waylineJobAtmosphereService;
private final IWaylineJobService waylineJobService;
/**
* 查询无人机任务-空气质量列表
*/
@SaCheckPermission("sample:WaylineJobAtmosphere:list")
@GetMapping("/list")
public TableDataInfo<WaylineJobAtmosphereVo> list(WaylineJobAtmosphereBo bo, PageQuery pageQuery) {
return waylineJobAtmosphereService.queryPageList(bo, pageQuery);
}
@GetMapping("/list/demo")
public List<WaylineJobAtmosphereVo> demoList(WaylineJobAtmosphereBo bo, PageQuery pageQuery) {
List<WaylineJobAtmosphereVo> demoList= waylineJobAtmosphereService.demoList(bo);
return demoList;
}
/**
* 导出无人机任务-空气质量列表
*/
@SaCheckPermission("sample:WaylineJobAtmosphere:export")
@Log(title = "无人机任务-空气质量", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(WaylineJobAtmosphereBo bo, HttpServletResponse response) {
List<WaylineJobAtmosphereVo> list = waylineJobAtmosphereService.queryList(bo);
ExcelUtil.exportExcel(list, "无人机任务-空气质量", WaylineJobAtmosphereVo.class, response);
}
/**
* 获取无人机任务-空气质量详细信息
*
* @param id 主键
*/
@SaCheckPermission("sample:WaylineJobAtmosphere:query")
@GetMapping("/{id}")
public R<WaylineJobAtmosphereVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
return R.ok(waylineJobAtmosphereService.queryById(id));
}
/**
* 新增无人机任务-空气质量
*/
@SaCheckPermission("sample:WaylineJobAtmosphere:add")
@Log(title = "无人机任务-空气质量", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody WaylineJobAtmosphereBo bo) {
// Optional<WaylineJobDTO> waylineJobDTO = waylineJobService.getJobByJobInternalId(objectMap.get("jobId").toString());
// map.put("jobId",objectMap.get("jobId"));
// if (!waylineJobDTO.isEmpty()){
// map.put("jobName",waylineJobDTO.get().getJobName());
// }else {
// map.put("jobName",null);
// }
// waylineJobService.getJobByDockSn("");
return toAjax(waylineJobAtmosphereService.insertByBo(bo));
}
/**
* 修改无人机任务-空气质量
*/
@SaCheckPermission("sample:WaylineJobAtmosphere:edit")
@Log(title = "无人机任务-空气质量", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody WaylineJobAtmosphereBo bo) {
return toAjax(waylineJobAtmosphereService.updateByBo(bo));
}
/**
* 删除无人机任务-空气质量
*
* @param ids 主键串
*/
@SaCheckPermission("sample:WaylineJobAtmosphere:remove")
@Log(title = "无人机任务-空气质量", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(waylineJobAtmosphereService.deleteWithValidByIds(List.of(ids), true));
}
}

127
dk-modules/sample/src/main/java/org/dromara/sample/wayline/domain/WaylineJobAtmosphere.java

@ -0,0 +1,127 @@
package org.dromara.sample.wayline.domain;
import cn.hutool.json.JSONObject;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.io.Serial;
/**
* 无人机任务-空气质量对象 wayline_job_atmosphere
*
* @author szs
* @date 2025-06-16
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
@TableName("wayline_job_atmosphere")
public class WaylineJobAtmosphere implements Serializable {
@TableId(value = "id", type = IdType.AUTO)
private Long id;
@TableField("wayline_job_id")
private Long waylineJobId; //无人机任务ID
@TableField("job_id")
private String jobId; //任务UUID
@TableField("name")
private String name;//任务名称
@TableField("file_id")
private String fileId; //航线id 对应wayline_id 字段
@TableField("wayline_name")
private String waylineName;//航线名称
@TableField("dock_sn")
private String dockSn; //机场sn
@TableField("drone_sn")
private String droneSn;//无人机sn
@TableField("workspace_id")
private String workspaceId;//工作区id
@TableField("task_type")
private Long taskType;//任务类型
@TableField("begin_time")
private Date beginTime;//计划的开始时间
@TableField("end_time")
private Date endTime; //计划的结束时间
@TableField("serial")
private String serial; //负载设备序列号
@TableField("sequence")
private Long sequence;//数据序列号
@TableField("sate_num")
private Long sateNum; //卫星数量
@TableField("hdop")
private Long hdop; //水平精度因子
@TableField("utc_time_str")
private String utcTimeStr; //UTC时间
@TableField("latitude")
private Float latitude; //纬度
@TableField("longitude")
private Float longitude;//经度
@TableField("altitude")
private Float altitude;//海拔高度
@TableField("temperature")
private Float temperature; //温度
@TableField("humidity")
private Float humidity;//湿度
@TableField("pressure")
private Float pressure;//气压
// @TableField(value = "air_data", typeHandler = JacksonTypeHandler.class)
@TableField("air_data")
private String airData;//空气质量数据
@TableField("error_code")
private Long errorCode;//错误码
@TableField("status")
private Long status;//状态 1:待处理;2: 进行中;3:成功;4: 取消;5:失败
@TableField("parent_id")
private String parentId; //父级ID
@TableField("job_type")
private Long jobType;//任务类型 1:手动任务,2:自动任务,3:指令飞行,4:工单飞行
@TableField("pro_id")
private Long proId; //proID
@TableField(value = "create_time", fill = FieldFill.INSERT)
private Date createTime;
@TableField(value = "update_time", fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
}

178
dk-modules/sample/src/main/java/org/dromara/sample/wayline/domain/bo/WaylineJobAtmosphereBo.java

@ -0,0 +1,178 @@
package org.dromara.sample.wayline.domain.bo;
import cn.hutool.json.JSONObject;
import org.dromara.sample.wayline.domain.WaylineJobAtmosphere;
import org.dromara.common.mybatis.core.domain.BaseEntity;
import org.dromara.common.core.validate.AddGroup;
import org.dromara.common.core.validate.EditGroup;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
import java.util.Date;
/**
* 无人机任务-空气质量业务对象 wayline_job_atmosphere
*
* @author szs
* @date 2025-06-16
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = WaylineJobAtmosphere.class, reverseConvertGenerate = false)
public class WaylineJobAtmosphereBo extends BaseEntity {
/**
* ID
*/
private Long id;
/**
* 无人机任务ID
*/
// @NotNull(message = "无人机任务ID不能为空", groups = { AddGroup.class, EditGroup.class })
private Long waylineJobId;
/**
* 任务UUID
*/
// @NotBlank(message = "任务UUID不能为空", groups = { AddGroup.class, EditGroup.class })
private String jobId;
/**
* 任务名称
*/
// @NotBlank(message = "任务名称不能为空", groups = { AddGroup.class, EditGroup.class })
private String name;
/**
* 航线id 对应wayline_id 字段
*/
// @NotBlank(message = "航线id 对应wayline_id 字段不能为空", groups = { AddGroup.class, EditGroup.class })
private String fileId;
/**
* 航线名称
*/
private String waylineName;
/**
* 机场sn
*/
// @NotBlank(message = "机场sn不能为空", groups = { AddGroup.class, EditGroup.class })
private String dockSn;
/**
* 无人机sn
*/
private String droneSn;
/**
* 工作区id
*/
// @NotBlank(message = "工作区id不能为空", groups = { AddGroup.class, EditGroup.class })
private String workspaceId;
/**
* 任务类型
*/
private Long taskType;
/**
* 计划的开始时间
*/
private Date beginTime;
/**
* 计划的结束时间
*/
private Date endTime;
/**
* 负载设备序列号
*/
// @NotBlank(message = "负载设备序列号不能为空", groups = { AddGroup.class, EditGroup.class })
private String serial;
/**
* 数据序列号
*/
private Long sequence;
/**
* 卫星数量
*/
private Long sateNum;
/**
* 水平精度因子
*/
private Long hdop;
/**
* UTC时间
*/
private String utcTimeStr;
/**
* 纬度
*/
private Float latitude;
/**
* 经度
*/
private Float longitude;
/**
* 海拔高度
*/
private Float altitude;
/**
* 温度
*/
private Float temperature;
/**
* 湿度
*/
private Float humidity;
/**
* 气压
*/
private Float pressure;
/**
* 空气质量数据
*/
private String airData;
/**
* 错误码
*/
private Long errorCode;
/**
* 1:待处理;2: 进行中;3:成功;4: 取消;5:失败
*/
private Long status;
/**
* 父级ID
*/
private String parentId;
/**
* 1:手动任务2自动任务3指令飞行4工单飞行
*/
private Long jobType;
/**
* proID
*/
private Long proId;
}

210
dk-modules/sample/src/main/java/org/dromara/sample/wayline/domain/vo/WaylineJobAtmosphereVo.java

@ -0,0 +1,210 @@
package org.dromara.sample.wayline.domain.vo;
import java.util.Date;
import cn.hutool.json.JSONObject;
import com.fasterxml.jackson.annotation.JsonProperty;
import org.dromara.sample.wayline.domain.WaylineJobAtmosphere;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Map;
/**
* 无人机任务-空气质量视图对象 wayline_job_atmosphere
*
* @author szs
* @date 2025-06-16
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = WaylineJobAtmosphere.class)
public class WaylineJobAtmosphereVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* ID
*/
@ExcelProperty(value = "ID")
private Long id;
/**
* 无人机任务ID
*/
@ExcelProperty(value = "无人机任务ID")
private Long waylineJobId;
/**
* 任务UUID
*/
@ExcelProperty(value = "任务UUID")
private String jobId;
/**
* 任务名称
*/
@ExcelProperty(value = "任务名称")
private String name;
/**
* 航线id 对应wayline_id 字段
*/
@ExcelProperty(value = "航线id 对应wayline_id 字段")
private String fileId;
/**
* 航线名称
*/
@ExcelProperty(value = "航线名称")
private String waylineName;
/**
* 机场sn
*/
@ExcelProperty(value = "机场sn")
private String dockSn;
/**
* 无人机sn
*/
@ExcelProperty(value = "无人机sn")
private String droneSn;
/**
* 工作区id
*/
@ExcelProperty(value = "工作区id")
private String workspaceId;
/**
* 任务类型
*/
@ExcelProperty(value = "任务类型")
private Long taskType;
/**
* 计划的开始时间
*/
@ExcelProperty(value = "计划的开始时间")
private Date beginTime;
/**
* 计划的结束时间
*/
@ExcelProperty(value = "计划的结束时间")
private Date endTime;
/**
* 负载设备序列号
*/
@ExcelProperty(value = "负载设备序列号")
private String serial;
/**
* 数据序列号
*/
@ExcelProperty(value = "数据序列号")
private Long sequence;
/**
* 卫星数量
*/
@ExcelProperty(value = "卫星数量")
private Long sateNum;
/**
* 水平精度因子
*/
@ExcelProperty(value = "水平精度因子")
private Long hdop;
/**
* UTC时间
*/
@ExcelProperty(value = "UTC时间")
private String utcTimeStr;
/**
* 纬度
*/
@ExcelProperty(value = "纬度")
private Float latitude;
/**
* 经度
*/
@ExcelProperty(value = "经度")
private Float longitude;
/**
* 海拔高度
*/
@ExcelProperty(value = "海拔高度")
private Float altitude;
/**
* 温度
*/
@ExcelProperty(value = "温度")
private Float temperature;
/**
* 湿度
*/
@ExcelProperty(value = "湿度")
private Float humidity;
/**
* 气压
*/
@ExcelProperty(value = "气压")
private Float pressure;
/**
* 空气质量数据
*/
@ExcelProperty(value = "空气质量数据")
// @JsonProperty("air_data") //无效
private String airData;
private JSONObject airDataJson;
/**
* 错误码
*/
@ExcelProperty(value = "错误码")
private Long errorCode;
/**
* 1:待处理;2: 进行中;3:成功;4: 取消;5:失败
*/
@ExcelProperty(value = "1:待处理;2: 进行中;3:成功;4: 取消;5:失败")
private Long status;
/**
* 父级ID
*/
@ExcelProperty(value = "父级ID")
private String parentId;
/**
* 1:手动任务2自动任务3指令飞行4工单飞行
*/
@ExcelProperty(value = "1:手动任务,2:自动任务,3:指令飞行,4:工单飞行")
private Long jobType;
/**
* proID
*/
@ExcelProperty(value = "proID")
private Long proId;
}

15
dk-modules/sample/src/main/java/org/dromara/sample/wayline/mapper/WaylineJobAtmosphereMapper.java

@ -0,0 +1,15 @@
package org.dromara.sample.wayline.mapper;
import org.dromara.sample.wayline.domain.WaylineJobAtmosphere;
import org.dromara.sample.wayline.domain.vo.WaylineJobAtmosphereVo;
import org.dromara.common.mybatis.core.mapper.BaseMapperPlus;
/**
* 无人机任务-空气质量Mapper接口
*
* @author szs
* @date 2025-06-16
*/
public interface WaylineJobAtmosphereMapper extends BaseMapperPlus<WaylineJobAtmosphere, WaylineJobAtmosphereVo> {
}

2
dk-modules/sample/src/main/java/org/dromara/sample/wayline/model/dto/FrameDTO.java

@ -48,4 +48,6 @@ public class FrameDTO {
/**模板图片*/
private String mateFileUrl;
private Integer compareType;
}

2
dk-modules/sample/src/main/java/org/dromara/sample/wayline/model/dto/WaylineJobDTO.java

@ -23,6 +23,8 @@ import java.util.List;
@Builder
public class WaylineJobDTO {
private Integer id;
private String jobId;
private String jobName;

2
dk-modules/sample/src/main/java/org/dromara/sample/wayline/service/IAiCompareService.java

@ -30,7 +30,7 @@ public interface IAiCompareService {
Boolean pictureFrame(Map<String,Object>objectMap);
Boolean expose(List<Map<String,Object>> mapList);
Boolean alert(Map<String,Object>map);
AiCompareEntity selectById(Long id);
List<RemoteBusinessAlertVo> alertList(String jobId);
Boolean delAlertList(List<Long>ids);

74
dk-modules/sample/src/main/java/org/dromara/sample/wayline/service/IWaylineJobAtmosphereService.java

@ -0,0 +1,74 @@
package org.dromara.sample.wayline.service;
import cn.hutool.json.JSONObject;
import org.dromara.sample.wayline.domain.vo.WaylineJobAtmosphereVo;
import org.dromara.sample.wayline.domain.bo.WaylineJobAtmosphereBo;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.sample.wayline.model.dto.WaylineJobDTO;
import java.util.Collection;
import java.util.List;
/**
* 无人机任务-空气质量Service接口
*
* @author szs
* @date 2025-06-16
*/
public interface IWaylineJobAtmosphereService {
/**
* 查询无人机任务-空气质量
*
* @param id 主键
* @return 无人机任务-空气质量
*/
WaylineJobAtmosphereVo queryById(Long id);
/**
* 分页查询无人机任务-空气质量列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 无人机任务-空气质量分页列表
*/
TableDataInfo<WaylineJobAtmosphereVo> queryPageList(WaylineJobAtmosphereBo bo, PageQuery pageQuery);
/**
* 查询符合条件的无人机任务-空气质量列表
*
* @param bo 查询条件
* @return 无人机任务-空气质量列表
*/
List<WaylineJobAtmosphereVo> queryList(WaylineJobAtmosphereBo bo);
/**
* 新增无人机任务-空气质量
*
* @param bo 无人机任务-空气质量
* @return 是否新增成功
*/
Boolean insertByBo(WaylineJobAtmosphereBo bo);
/**
* 修改无人机任务-空气质量
*
* @param bo 无人机任务-空气质量
* @return 是否修改成功
*/
Boolean updateByBo(WaylineJobAtmosphereBo bo);
/**
* 校验并批量删除无人机任务-空气质量信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
void handleAdd(WaylineJobDTO waylineJobDTO, JSONObject json);
List<WaylineJobAtmosphereVo> demoList(WaylineJobAtmosphereBo bo);
}

132
dk-modules/sample/src/main/java/org/dromara/sample/wayline/service/impl/AiCompareServiceImpl.java

@ -5,6 +5,7 @@ import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
@ -14,6 +15,12 @@ import io.minio.StatObjectArgs;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.dromara.business.api.RemoteBusinessAlertService;
import org.dromara.business.api.domain.bo.RemoteBusinessAlertBo;
import org.dromara.business.api.domain.vo.RemoteBusinessAlertConstructInfo;
@ -28,6 +35,8 @@ import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.sdk.mqtt.CommonTopicRequest;
import org.dromara.common.sdk.mqtt.MqttGatewayPublish;
import org.dromara.common.sdk.mqtt.TopicConst;
import org.dromara.sample.feign.RemoteConfigFeign;
import org.dromara.sample.feign.RemoteSystemFeign;
import org.dromara.sample.media.constant.MinIOConstants;
import org.dromara.sample.media.service.IFileService;
import org.dromara.sample.wayline.mapper.IAiCompareMapper;
@ -43,10 +52,13 @@ import org.dromara.sample.wayline.service.IAiCompareService;
import org.dromara.system.api.model.LoginUser;
import org.dromara.workflow.api.RemoteWorkflowService;
import org.dromara.workflow.api.domain.RemoteStartProcess;
import org.jetbrains.annotations.Nullable;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.io.IOException;
import java.net.URI;
import java.util.*;
import java.util.stream.Collectors;
@ -68,8 +80,9 @@ public class AiCompareServiceImpl implements IAiCompareService {
@DubboReference
private final RemoteBusinessAlertService businessAlertService;
private final RemoteSystemFeign remoteSystemFeign;
@DubboReference(timeout = 30000)
private RemoteWorkflowService remoteWorkflowService;
private final RemoteWorkflowService remoteWorkflowService;
@Override
public TableDataInfo<AiCompareEntity> queryPageList(AiCompareDTO bo, PageQuery pageQuery) {
@ -84,11 +97,11 @@ public class AiCompareServiceImpl implements IAiCompareService {
.like(StringUtils.isNotBlank(bo.getDeptName()), "lower(dept_name)", StringUtils.lowerCase(bo.getDeptName()))
.like(StringUtils.isNotBlank(bo.getJobName()), "lower(job_name)", StringUtils.lowerCase(bo.getJobName()))
.between(params.get("beginTime") != null && params.get("endTime") != null,
"create_time", params.get("beginTime"), params.get("endTime")).orderByDesc("create_time");
"create_time", params.get("beginTime"), params.get("endTime")).orderByDesc("create_time")
.gt(ObjectUtil.isNotEmpty(bo.getCreateTime()),"create_time",bo.getCreateTime());
return wrapper;
}
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean insertByBo(List<Map<String,Object>> compareDTOList) {
if(compareDTOList.isEmpty()){
throw new RuntimeException("未选择比对数据");
@ -131,19 +144,53 @@ public class AiCompareServiceImpl implements IAiCompareService {
if(jobEntityList.isEmpty()){
throw new RuntimeException("("+serviceInfo.getWaylineName()+")未找到对应的模板");
}else {
aiCompareEntity.setTemplateId(jobEntityList.get(0).getJobId());
templateId=jobEntityList.get(0).getJobId();
aiCompareEntity.setTemplateId(templateId);
}
}
aiCompareMapper.insert(aiCompareEntity);
String topic = TopicConst.IMAGE +TopicConst.COMPARE;
List<AiCompareMediaFileDTO> mediaFileDTOS = listMediaFile(aiCompareEntity.getJobId(),aiCompareEntity.getId(),43200,false);
mqttGatewayPublish.publish(topic, new CommonTopicRequest().setData(mediaFileDTOS),1);
String compareUrl = remoteSystemFeign.getConfigKeyFeign("ai_algorithm_compare");
if(StrUtil.isNotEmpty(compareUrl)){
//添加到算法平台
Map<String,Object>compareMap = new HashMap<>();
compareMap.put("id",aiCompareEntity.getId());
compareMap.put("totalNum",aiCompareEntity.getTotalNum());
compareMap.put("compareType",AiCompareStatusConstants.COMPARETYPE);
compareMap.put("compareName",aiCompareEntity.getWaylineName());
compareMap.put("parm",mediaFileDTOS);
compareMap.put("mateTask",templateId);
try(CloseableHttpClient httpClient = HttpClients.createDefault()) {
HttpPost httpPost =new HttpPost();
httpPost.setHeader("Content-Type","application/json");
httpPost.setURI(URI.create(compareUrl));
httpPost.setEntity(new StringEntity(JSON.toJSONString(compareMap), "UTF-8"));
CloseableHttpResponse response = httpClient.execute(httpPost);
String resp = EntityUtils.toString(response.getEntity(), "utf-8");
}catch (IOException e) {
e.printStackTrace();
}
}else {
String topic = TopicConst.IMAGE +TopicConst.COMPARE;
mqttGatewayPublish.publish(topic, new CommonTopicRequest().setData(mediaFileDTOS),1);
}
// insertList.add(aiCompareEntity);
}
// List<BatchResult> resultList = aiCompareMapper.insertOrUpdate(insertList, 10);
List<Long> list =compareDTOList.stream().map(e->Convert.toLong(e.get("queueId"))).collect(Collectors.toList());
return aiCompareQueueService.updateStatus(list,AiCompareStatusConstants.QUEUW_TYPE_1);
}
@Nullable
private static Object getId(Map<String, Object> compareMap, AiCompareEntity aiCompareEntity) {
return compareMap.put("id", aiCompareEntity.getId());
}
public List<AiCompareMediaFileDTO> listMediaFile(String jobId,Long compareId,Integer seconds ,boolean isIllegal){
List<AiCompareMediaFileDTO> mediaFileDTOList = aiCompareMapper.listMediaFile(jobId,compareId);
if(!mediaFileDTOList.isEmpty()){
@ -166,8 +213,8 @@ public class AiCompareServiceImpl implements IAiCompareService {
@Override
public Boolean update(Map<String,Object> compareDTO) {
AiCompareEntity aiCompareEntity =new AiCompareEntity();
Long id = compareDTO.containsKey("id") ? Convert.toLong(compareDTO.get("id")) : null;
AiCompareEntity aiCompareEntity = aiCompareMapper.selectById(id);
String templateId = compareDTO.containsKey("templateId") ? Convert.toStr(compareDTO.get("templateId")) : null;
aiCompareEntity.setId(id);
if(StrUtil.isNotEmpty(templateId)){
@ -176,9 +223,36 @@ public class AiCompareServiceImpl implements IAiCompareService {
aiCompareEntity.setStatus(AiCompareStatusConstants.COMPARE_STATUS_1);
int i = aiCompareMapper.updateById(aiCompareEntity);
AiCompareEntity compareEntity = aiCompareMapper.selectById(id);
String topic = TopicConst.IMAGE +TopicConst.COMPARE;
List<AiCompareMediaFileDTO> mediaFileDTOS = listMediaFile(compareEntity.getJobId(),compareEntity.getId(),43200,false);
mqttGatewayPublish.publish(topic, new CommonTopicRequest().setData(mediaFileDTOS),1);
//平台url
String compareUrl = remoteSystemFeign.getConfigKeyFeign("ai_algorithm_compare");
if(StrUtil.isNotEmpty(compareUrl)){
//添加到算法平台
Map<String,Object>compareMap = new HashMap<>();
compareMap.put("id",aiCompareEntity.getId());
compareMap.put("totalNum",aiCompareEntity.getTotalNum());
compareMap.put("compareType",AiCompareStatusConstants.COMPARETYPE);
compareMap.put("compareName",aiCompareEntity.getWaylineName());
compareMap.put("parm",mediaFileDTOS);
compareMap.put("mateTask",templateId);
try(CloseableHttpClient httpClient = HttpClients.createDefault()) {
HttpPost httpPost =new HttpPost();
httpPost.setHeader("Content-Type","application/json");
httpPost.setURI(URI.create(compareUrl));
httpPost.setEntity(new StringEntity(JSON.toJSONString(compareMap), "UTF-8"));
CloseableHttpResponse response = httpClient.execute(httpPost);
String resp = EntityUtils.toString(response.getEntity(), "utf-8");
}catch (IOException e) {
e.printStackTrace();
}
}else {
System.out.println("mqtt推送");
String topic = TopicConst.IMAGE +TopicConst.COMPARE;
mqttGatewayPublish.publish(topic, new CommonTopicRequest().setData(mediaFileDTOS),1);
}
return i>0;
}
@ -220,15 +294,35 @@ public class AiCompareServiceImpl implements IAiCompareService {
String originMateFileUrl = frameDTO.getMateFileUrl();
String mateFileUrl = fileService.getObjectUrlOne(MinIOConstants.BUCKET_MEDIAFILE, originMateFileUrl, 3600).toString();
frameDTO.setMateFileUrl(mateFileUrl);
String topic = TopicConst.IMAGE +TopicConst.FRAME;
// if(StrUtil.equals(activeProfile,"w_fengxianranqi"))
// activeProfile="w_fengxianranqi"
String activeProfile = MapUtil.getStr(objectMap, "activeProfile", "default");
if (StrUtil.equals("default", activeProfile)) {
/* String topic = TopicConst.IMAGE +TopicConst.FRAME;
//发送mqtt给算法,处理完
mqttGatewayPublish.publish(topic, new CommonTopicRequest().setData(frameDTO), 1);
mqttGatewayPublish.publish(topic, new CommonTopicRequest().setData(frameDTO), 1);*/
//添加到算法平台
String compareUrl = remoteSystemFeign.getConfigKeyFeign("ai_algorithm_frame");
if(StrUtil.isNotEmpty(compareUrl)){
frameDTO.setCompareType(AiCompareStatusConstants.COMPARETYPE);
try(CloseableHttpClient httpClient = HttpClients.createDefault()) {
HttpPost httpPost =new HttpPost();
httpPost.setHeader("Content-Type","application/json");
httpPost.setURI(URI.create(compareUrl));
httpPost.setEntity(new StringEntity(JSON.toJSONString(frameDTO), "UTF-8"));
CloseableHttpResponse response = httpClient.execute(httpPost);
String resp = EntityUtils.toString(response.getEntity(), "utf-8");
}catch (IOException e) {
e.printStackTrace();
}
}else {
String topic = TopicConst.IMAGE +TopicConst.FRAME;
//发送mqtt给算法,处理完
mqttGatewayPublish.publish(topic, new CommonTopicRequest().setData(frameDTO), 1);
}
} else {
//图片处理
@ -351,6 +445,11 @@ public class AiCompareServiceImpl implements IAiCompareService {
return businessAlertService.saveBusinessAlert(handleList,"default");
}
@Override
public AiCompareEntity selectById(Long id) {
return aiCompareMapper.selectById(id);
}
@Override
public List<RemoteBusinessAlertVo> alertList(String jobId) {
RemoteBusinessAlertBo businessAlertBo = new RemoteBusinessAlertBo();
@ -360,6 +459,13 @@ public class AiCompareServiceImpl implements IAiCompareService {
@Override
public Boolean delAlertList(List<Long> ids) {
/* AiCompareEntity aiCompareEntity =aiCompareMapper.selectById(compareId);
aiCompareEntity.setStatus(AiCompareStatusConstants.COMPARE_STATUS_4);
List<RemoteBusinessAlertVo> alertList = alertList(aiCompareEntity.getJobId());
if(alertList.isEmpty()){
aiCompareMapper.updateById(aiCompareEntity);
}*/
return businessAlertService.deleteAlert(ids);
}

188
dk-modules/sample/src/main/java/org/dromara/sample/wayline/service/impl/WaylineJobAtmosphereServiceImpl.java

@ -0,0 +1,188 @@
package org.dromara.sample.wayline.service.impl;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.dromara.sample.wayline.model.dto.WaylineJobDTO;
import org.springframework.stereotype.Service;
import org.dromara.sample.wayline.domain.bo.WaylineJobAtmosphereBo;
import org.dromara.sample.wayline.domain.vo.WaylineJobAtmosphereVo;
import org.dromara.sample.wayline.domain.WaylineJobAtmosphere;
import org.dromara.sample.wayline.mapper.WaylineJobAtmosphereMapper;
import org.dromara.sample.wayline.service.IWaylineJobAtmosphereService;
import java.util.List;
import java.util.Map;
import java.util.Collection;
/**
* 无人机任务-空气质量Service业务层处理
*
* @author szs
* @date 2025-06-16
*/
@RequiredArgsConstructor
@Service
public class WaylineJobAtmosphereServiceImpl implements IWaylineJobAtmosphereService {
private final WaylineJobAtmosphereMapper baseMapper;
/**
* 查询无人机任务-空气质量
*
* @param id 主键
* @return 无人机任务-空气质量
*/
@Override
public WaylineJobAtmosphereVo queryById(Long id){
return baseMapper.selectVoById(id);
}
/**
* 分页查询无人机任务-空气质量列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 无人机任务-空气质量分页列表
*/
@Override
public TableDataInfo<WaylineJobAtmosphereVo> queryPageList(WaylineJobAtmosphereBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<WaylineJobAtmosphere> lqw = buildQueryWrapper(bo);
Page<WaylineJobAtmosphereVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
//转换airData让前台处理
for (WaylineJobAtmosphereVo record : result.getRecords()) {
if(ObjectUtil.isNotEmpty(record.getAirData())){
record.setAirDataJson(JSONUtil.parseObj(record.getAirData()));
}
}
return TableDataInfo.build(result);
}
/**
* 查询符合条件的无人机任务-空气质量列表
*
* @param bo 查询条件
* @return 无人机任务-空气质量列表
*/
@Override
public List<WaylineJobAtmosphereVo> queryList(WaylineJobAtmosphereBo bo) {
LambdaQueryWrapper<WaylineJobAtmosphere> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<WaylineJobAtmosphere> buildQueryWrapper(WaylineJobAtmosphereBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<WaylineJobAtmosphere> lqw = Wrappers.lambdaQuery();
lqw.eq(bo.getWaylineJobId() != null, WaylineJobAtmosphere::getWaylineJobId, bo.getWaylineJobId());
lqw.eq(StringUtils.isNotBlank(bo.getJobId()), WaylineJobAtmosphere::getJobId, bo.getJobId());
lqw.like(StringUtils.isNotBlank(bo.getName()), WaylineJobAtmosphere::getName, bo.getName());
lqw.eq(StringUtils.isNotBlank(bo.getFileId()), WaylineJobAtmosphere::getFileId, bo.getFileId());
lqw.like(StringUtils.isNotBlank(bo.getWaylineName()), WaylineJobAtmosphere::getWaylineName, bo.getWaylineName());
lqw.eq(StringUtils.isNotBlank(bo.getDockSn()), WaylineJobAtmosphere::getDockSn, bo.getDockSn());
lqw.eq(StringUtils.isNotBlank(bo.getDroneSn()), WaylineJobAtmosphere::getDroneSn, bo.getDroneSn());
lqw.eq(StringUtils.isNotBlank(bo.getWorkspaceId()), WaylineJobAtmosphere::getWorkspaceId, bo.getWorkspaceId());
lqw.eq(bo.getTaskType() != null, WaylineJobAtmosphere::getTaskType, bo.getTaskType());
lqw.eq(bo.getBeginTime() != null, WaylineJobAtmosphere::getBeginTime, bo.getBeginTime());
lqw.eq(bo.getEndTime() != null, WaylineJobAtmosphere::getEndTime, bo.getEndTime());
lqw.eq(StringUtils.isNotBlank(bo.getSerial()), WaylineJobAtmosphere::getSerial, bo.getSerial());
lqw.eq(bo.getSequence() != null, WaylineJobAtmosphere::getSequence, bo.getSequence());
lqw.eq(bo.getSateNum() != null, WaylineJobAtmosphere::getSateNum, bo.getSateNum());
lqw.eq(bo.getHdop() != null, WaylineJobAtmosphere::getHdop, bo.getHdop());
lqw.eq(bo.getUtcTimeStr() != null, WaylineJobAtmosphere::getUtcTimeStr, bo.getUtcTimeStr());
lqw.eq(bo.getLatitude() != null, WaylineJobAtmosphere::getLatitude, bo.getLatitude());
lqw.eq(bo.getLongitude() != null, WaylineJobAtmosphere::getLongitude, bo.getLongitude());
lqw.eq(bo.getAltitude() != null, WaylineJobAtmosphere::getAltitude, bo.getAltitude());
lqw.eq(bo.getTemperature() != null, WaylineJobAtmosphere::getTemperature, bo.getTemperature());
lqw.eq(bo.getHumidity() != null, WaylineJobAtmosphere::getHumidity, bo.getHumidity());
lqw.eq(bo.getPressure() != null, WaylineJobAtmosphere::getPressure, bo.getPressure());
// lqw.eq(JSONUtil.isTypeJSONObject(bo.getAirData().toString()), WaylineJobAtmosphere::getAirData, bo.getAirData());
lqw.eq(bo.getErrorCode() != null, WaylineJobAtmosphere::getErrorCode, bo.getErrorCode());
lqw.eq(bo.getStatus() != null, WaylineJobAtmosphere::getStatus, bo.getStatus());
lqw.eq(StringUtils.isNotBlank(bo.getParentId()), WaylineJobAtmosphere::getParentId, bo.getParentId());
lqw.eq(bo.getJobType() != null, WaylineJobAtmosphere::getJobType, bo.getJobType());
lqw.eq(bo.getProId() != null, WaylineJobAtmosphere::getProId, bo.getProId());
return lqw;
}
/**
* 新增无人机任务-空气质量
*
* @param bo 无人机任务-空气质量
* @return 是否新增成功
*/
@Override
public Boolean insertByBo(WaylineJobAtmosphereBo bo) {
WaylineJobAtmosphere add = MapstructUtils.convert(bo, WaylineJobAtmosphere.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
}
return flag;
}
/**
* 修改无人机任务-空气质量
*
* @param bo 无人机任务-空气质量
* @return 是否修改成功
*/
@Override
public Boolean updateByBo(WaylineJobAtmosphereBo bo) {
WaylineJobAtmosphere update = MapstructUtils.convert(bo, WaylineJobAtmosphere.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(WaylineJobAtmosphere entity){
//TODO 做一些数据校验,如唯一约束
}
/**
* 校验并批量删除无人机任务-空气质量信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteByIds(ids) > 0;
}
@Override
public void handleAdd(WaylineJobDTO waylineJobDTO, JSONObject json) {
System.out.println(waylineJobDTO);
System.out.println(json);
}
@Override
public List<WaylineJobAtmosphereVo> demoList(WaylineJobAtmosphereBo bo) {
LambdaQueryWrapper<WaylineJobAtmosphere> wrapper = new LambdaQueryWrapper<>();
wrapper.gt(WaylineJobAtmosphere::getId, 1240);
wrapper.lt(WaylineJobAtmosphere::getId, 2495);
List<WaylineJobAtmosphereVo> waylineJobAtmosphereVos = baseMapper.selectVoList(wrapper);
//转换airData让前台处理
for (WaylineJobAtmosphereVo record : waylineJobAtmosphereVos) {
if(ObjectUtil.isNotEmpty(record.getAirData())){
record.setAirDataJson(JSONUtil.parseObj(record.getAirData()));
}
}
return waylineJobAtmosphereVos;
}
}

1
dk-modules/sample/src/main/java/org/dromara/sample/wayline/service/impl/WaylineJobServiceImpl.java

@ -293,6 +293,7 @@ public class WaylineJobServiceImpl implements IWaylineJobService {
}
WaylineJobDTO.WaylineJobDTOBuilder builder = WaylineJobDTO.builder()
.id(entity.getId())
.jobId(entity.getJobId())
.jobName(entity.getName())
.fileId(entity.getFileId())

7
dk-modules/sample/src/main/resources/mapper/WaylineJobAtmosphereMapper.xml

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.dromara.sample.wayline.mapper.WaylineJobAtmosphereMapper">
</mapper>

8
dk-modules/system/src/main/java/org/dromara/system/controller/system/SysConfigController.java

@ -86,9 +86,9 @@ public class SysConfigController extends BaseController {
@Log(title = "参数管理", businessType = BusinessType.INSERT)
@PostMapping
public R<Void> add(@Validated @RequestBody SysConfigBo config) {
if (!configService.checkConfigKeyUnique(config)) {
/*if (!configService.checkConfigKeyUnique(config)) {
return R.fail("新增参数'" + config.getConfigName() + "'失败,参数键名已存在");
}
}*/
configService.insertConfig(config);
return R.ok();
}
@ -100,9 +100,9 @@ public class SysConfigController extends BaseController {
@Log(title = "参数管理", businessType = BusinessType.UPDATE)
@PutMapping
public R<Void> edit(@Validated @RequestBody SysConfigBo config) {
if (!configService.checkConfigKeyUnique(config)) {
/*if (!configService.checkConfigKeyUnique(config)) {
return R.fail("修改参数'" + config.getConfigName() + "'失败,参数键名已存在");
}
}*/
configService.updateConfig(config);
return R.ok();
}

31
dk-modules/system/src/main/java/org/dromara/system/dubbo/RemoteDepartBoundaryServiceImpl.java

@ -0,0 +1,31 @@
package org.dromara.system.dubbo;
import lombok.RequiredArgsConstructor;
import org.apache.dubbo.config.annotation.DubboService;
import org.dromara.common.core.utils.MapstructUtils;
import org.dromara.system.api.RemoteDepartBoundaryService;
import org.dromara.system.api.domain.vo.RemoteSocialVo;
import org.dromara.system.api.domain.vo.RemoteSysDepartBoundaryVo;
import org.dromara.system.domain.SysDepartBoundary;
import org.dromara.system.domain.vo.SysSocialVo;
import org.dromara.system.service.ISysDepartBoundaryService;
import org.dromara.system.service.ISysDeptService;
import org.springframework.stereotype.Service;
import java.util.List;
import static kotlin.reflect.jvm.internal.impl.builtins.StandardNames.FqNames.list;
@RequiredArgsConstructor
@Service
@DubboService
public class RemoteDepartBoundaryServiceImpl implements RemoteDepartBoundaryService {
private final ISysDepartBoundaryService sysDepartBoundaryService;
@Override
public List<RemoteSysDepartBoundaryVo> listDepartBoundaryByLngAndLat(Double lng, Double lat) {
List<SysDepartBoundary> boundaryList = sysDepartBoundaryService.listDepartBoundaryByLngAndLat(lng, lat);
return MapstructUtils.convert(boundaryList, RemoteSysDepartBoundaryVo.class);
}
}

6
dk-modules/system/src/main/java/org/dromara/system/service/impl/SysConfigServiceImpl.java

@ -67,7 +67,7 @@ public class SysConfigServiceImpl implements ISysConfigService {
* @param configKey 参数key
* @return 参数键值
*/
@Cacheable(cacheNames = CacheNames.SYS_CONFIG, key = "#configKey")
/*@Cacheable(cacheNames = CacheNames.SYS_CONFIG, key = "#configKey")*/
@Override
public String selectConfigByKey(String configKey) {
SysConfig retConfig = baseMapper.selectOne(new LambdaQueryWrapper<SysConfig>()
@ -125,7 +125,7 @@ public class SysConfigServiceImpl implements ISysConfigService {
* @param bo 参数配置信息
* @return 结果
*/
@CachePut(cacheNames = CacheNames.SYS_CONFIG, key = "#bo.configKey")
/*@CachePut(cacheNames = CacheNames.SYS_CONFIG, key = "#bo.configKey")*/
@Override
public String insertConfig(SysConfigBo bo) {
SysConfig config = MapstructUtils.convert(bo, SysConfig.class);
@ -142,7 +142,7 @@ public class SysConfigServiceImpl implements ISysConfigService {
* @param bo 参数配置信息
* @return 结果
*/
@CachePut(cacheNames = CacheNames.SYS_CONFIG, key = "#bo.configKey")
/* @CachePut(cacheNames = CacheNames.SYS_CONFIG, key = "#bo.configKey")*/
@Override
public String updateConfig(SysConfigBo bo) {
int row = 0;

Loading…
Cancel
Save