Browse Source

Merge remote-tracking branch 'origin/dev' into dev

pull/7/head
杨威 2 weeks ago
parent
commit
a99fa8d8f5
  1. 20
      dk-api/api-business/src/main/java/org/dromara/business/api/domain/RemoteBusinessAlertRequest.java
  2. 2
      dk-api/api-system/src/main/java/org/dromara/system/api/RemoteConfigService.java
  3. 6
      dk-common/common-cloudsdk/src/main/java/org/dromara/common/sdk/cloudapi/psdk/PsdkWidgetValue.java
  4. 57
      dk-modules/business/src/main/java/org/dromara/business/controller/BusinessAlertController.java
  5. 3
      dk-modules/business/src/main/java/org/dromara/business/service/IBusinessAlertService.java
  6. 98
      dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessAlertServiceImpl.java
  7. 16
      dk-modules/sample/src/main/java/org/dromara/sample/feign/RemoteBusinessAlertFeign.java
  8. 18
      dk-modules/sample/src/main/java/org/dromara/sample/feign/RemoteConfigFeign.java
  9. 16
      dk-modules/sample/src/main/java/org/dromara/sample/manage/config/XingluoApiEnum.java
  10. 32
      dk-modules/sample/src/main/java/org/dromara/sample/manage/config/xingluoApiType.json
  11. 151
      dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/SampleEngineRecordController.java
  12. 8
      dk-modules/sample/src/main/java/org/dromara/sample/manage/model/entity/WarningRecordEntity.java
  13. 4
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/ISampleEngineRecordService.java
  14. 280
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/SampleEngineRecordServiceImpl.java
  15. 5
      dk-modules/system/src/main/java/org/dromara/system/controller/system/SysConfigController.java
  16. 12
      dk-modules/system/src/main/java/org/dromara/system/controller/system/SysDictDataController.java
  17. 5
      dk-modules/system/src/main/java/org/dromara/system/dubbo/RemoteConfigServiceImpl.java
  18. 2
      dk-modules/system/src/main/java/org/dromara/system/service/ISysConfigService.java
  19. 10
      dk-modules/system/src/main/java/org/dromara/system/service/impl/SysConfigServiceImpl.java

20
dk-api/api-business/src/main/java/org/dromara/business/api/domain/RemoteBusinessAlertRequest.java

@ -0,0 +1,20 @@
package org.dromara.business.api.domain;
import lombok.Data;
import org.dromara.business.api.domain.vo.RemoteBusinessAlertVo;
import java.util.List;
/**
* 预警任务对象 business_alert
*
* @author LionLi
* @date 2025-02-27
*/
@Data
public class RemoteBusinessAlertRequest {
private List<RemoteBusinessAlertVo> alertVoList;
private String activeProfile;
}

2
dk-api/api-system/src/main/java/org/dromara/system/api/RemoteConfigService.java

@ -23,6 +23,8 @@ public interface RemoteConfigService {
*/ */
String selectStreamIp(); String selectStreamIp();
boolean selectXingluoAutoSubmit();
// List<String> selectStreamType(String deviceSn); // List<String> selectStreamType(String deviceSn);
} }

6
dk-common/common-cloudsdk/src/main/java/org/dromara/common/sdk/cloudapi/psdk/PsdkWidgetValue.java

@ -35,7 +35,7 @@ public class PsdkWidgetValue {
private PsdkSpeaker psdkSpeaker; private PsdkSpeaker psdkSpeaker;
@JsonProperty("values") @JsonProperty("values")
private List<String> values; private List<Object> values;
public PsdkWidgetValue() { public PsdkWidgetValue() {
} }
@ -99,11 +99,11 @@ public class PsdkWidgetValue {
return this; return this;
} }
public List<String> getValues() { public List<Object> getValues() {
return values; return values;
} }
public PsdkWidgetValue setValues(List<String> values) { public PsdkWidgetValue setValues(List<Object> values) {
this.values = values; this.values = values;
return this; return this;
} }

57
dk-modules/business/src/main/java/org/dromara/business/controller/BusinessAlertController.java

@ -1,40 +1,31 @@
package org.dromara.business.controller; package org.dromara.business.controller;
import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.convert.Convert; import cn.hutool.json.JSONObject;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.nacos.client.utils.TenantUtil;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.apache.dubbo.config.annotation.DubboReference; import org.apache.dubbo.config.annotation.DubboReference;
import org.dromara.business.api.domain.RemoteBusinessAlertRequest;
import org.dromara.business.domain.BusinessAlert; import org.dromara.business.domain.BusinessAlert;
import org.dromara.business.domain.bo.BusinessAlertBo; import org.dromara.business.domain.bo.BusinessAlertBo;
import org.dromara.business.domain.vo.BusinessAlertVo; import org.dromara.business.domain.vo.BusinessAlertVo;
import org.dromara.business.service.IBusinessAlertService; import org.dromara.business.service.IBusinessAlertService;
import org.dromara.business.utils.MinioUntil;
import org.dromara.business.utils.constants.MinIOConstants;
import org.dromara.common.core.domain.R; import org.dromara.common.core.domain.R;
import org.dromara.common.core.utils.DateUtils;
import org.dromara.common.log.annotation.Log; import org.dromara.common.log.annotation.Log;
import org.dromara.common.log.enums.BusinessType; import org.dromara.common.log.enums.BusinessType;
import org.dromara.common.mybatis.core.page.PageQuery; import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.common.tenant.helper.TenantHelper;
import org.dromara.common.web.core.BaseController; import org.dromara.common.web.core.BaseController;
import org.dromara.system.api.RemoteNoticeService; import org.dromara.system.api.RemoteNoticeService;
import org.dromara.system.api.RemoteSubmailConfigService; import org.dromara.system.api.RemoteSubmailConfigService;
import org.dromara.system.api.domain.bo.RemoteNoticeBo;
import org.dromara.workflow.api.RemoteWorkflowService; import org.dromara.workflow.api.RemoteWorkflowService;
import org.dromara.workflow.api.domain.RemoteStartProcess;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.io.IOException; import java.io.IOException;
import java.util.Date;
import java.util.List; import java.util.List;
/** /**
@ -123,35 +114,10 @@ public class BusinessAlertController extends BaseController {
@Operation(summary ="预警推送-实时预警模块专用",description = "预警推送-实时预警模块专用") @Operation(summary ="预警推送-实时预警模块专用",description = "预警推送-实时预警模块专用")
@GetMapping("/pushAlert") @GetMapping("/pushAlert")
public R pushAlert(Long alertId,@RequestParam(required = false) String deptId,@RequestParam(required = false)String deptName) { public R pushAlert(Long alertId,@RequestParam(required = false) String deptId,@RequestParam(required = false)String deptName) {
BusinessAlert businessAlert= businessAlertService.getBusinessAlert(alertId);
if(!ObjectUtil.hasEmpty(deptId,deptName)){ businessAlertService.pushAlert(alertId,deptId,deptName);
businessAlert.setDeptName(deptName);
businessAlert.setDeptId(deptId);
}
businessAlert.setCreateTime(new Date());
//businessAlert.setJobName(deptName + businessAlert.getLabelCn() + DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss",businessAlert.getCreateTime()));
businessAlertService.updateBusinessAlert(businessAlert);
RemoteStartProcess startProcess = new RemoteStartProcess();
startProcess.setBusinessId(String.valueOf(businessAlert.getId()));
startProcess.setFlowCode("alertChz");
remoteWorkflowService.startWorkFlowBatch(List.of(startProcess));
RemoteNoticeBo remoteNoticeBo = new RemoteNoticeBo();
remoteNoticeBo.setNoticeTitle(businessAlert.getDeptName()+"产生预警,预警类型["+businessAlert.getLabelCn()+"],请立即查看");
remoteNoticeBo.setNoticeType("3");
remoteNoticeBo.setNoticeContent(businessAlert.getDeptName()+"产生预警,预警类型["+businessAlert.getLabelCn()+"],请立即查看");
remoteNoticeBo.setStatus("0");
remoteNoticeBo.setIsRead(0);
remoteNoticeBo.setCreateBy(1L);
remoteNoticeBo.setCreateDept(1L);
remoteNoticeBo.setCreateTime(businessAlert.getCreateTime());
if (businessAlert.getBusinessType() == 2){
businessAlert.setImages(MinioUntil.getObjectUrlOne(MinIOConstants.BUCKET_DKCY, businessAlert.getImages(), 3600).toString());
}
remoteNoticeBo.setDeviceSn(businessAlert.getDeviceSn());
businessAlert.setDeviceSn(businessAlert.getDeviceSn());
remoteNoticeBo.setParam(JSON.toJSONString(businessAlert));
remoteNoticeService.saveNotice(remoteNoticeBo);
remoteSubmailConfigService.remoteCmdSend("smsMultixsend", JSON.toJSONString(businessAlert));
return R.ok(); return R.ok();
} }
@ -198,6 +164,15 @@ public class BusinessAlertController extends BaseController {
businessAlertService.exportAlert(bo,response); businessAlertService.exportAlert(bo,response);
} }
@PostMapping("/saveBusinessAlert")
// public Boolean saveBusinessAlert(List<RemoteBusinessAlertVo> alertVoList, String activeProfile) {
// public Boolean saveBusinessAlert(@RequestBody RemoteBusinessAlertRequest requestObj) {
public Boolean saveBusinessAlert(@RequestBody JSONObject requestJSON) {
// return businessAlertService.batchAddBusinessAlert(alertVoList, activeProfile);
RemoteBusinessAlertRequest requestObj = JSONUtil.toBean(requestJSON, RemoteBusinessAlertRequest.class);
return businessAlertService.batchAddBusinessAlert(requestObj.getAlertVoList(), requestObj.getActiveProfile());
}
// @Operation(summary ="ai实时流预警保存-用于演示",description = "ai实时流预警保存-用于演示") // @Operation(summary ="ai实时流预警保存-用于演示",description = "ai实时流预警保存-用于演示")

3
dk-modules/business/src/main/java/org/dromara/business/service/IBusinessAlertService.java

@ -106,4 +106,7 @@ public interface IBusinessAlertService {
TableDataInfo<BusinessAlertVo> listAiVerifyAlert(BusinessAlertVo vo,PageQuery pageQuery); TableDataInfo<BusinessAlertVo> listAiVerifyAlert(BusinessAlertVo vo,PageQuery pageQuery);
void exportAlert(BusinessAlertBo bo, HttpServletResponse response) throws IOException; void exportAlert(BusinessAlertBo bo, HttpServletResponse response) throws IOException;
void pushAlert(Long alertId, String deptId, String deptName);
} }

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

@ -46,9 +46,8 @@ import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.resource.api.RemoteMessageService; import org.dromara.resource.api.RemoteMessageService;
import org.dromara.system.api.RemoteLabelPostService; import org.dromara.system.api.*;
import org.dromara.system.api.RemoteSubmailConfigService; import org.dromara.system.api.domain.bo.RemoteNoticeBo;
import org.dromara.system.api.RemoteUserService;
import org.dromara.system.api.domain.vo.RemoteAiLabelPostVo; import org.dromara.system.api.domain.vo.RemoteAiLabelPostVo;
import org.dromara.system.api.domain.vo.RemoteUserVo; import org.dromara.system.api.domain.vo.RemoteUserVo;
import org.dromara.business.domain.BusinessAlertConstructInfoOss; import org.dromara.business.domain.BusinessAlertConstructInfoOss;
@ -122,6 +121,13 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService {
@DubboReference @DubboReference
private final RemoteMessageService remoteMessageService; private final RemoteMessageService remoteMessageService;
@DubboReference
private RemoteConfigService remoteConfigService;
@DubboReference(timeout = 30000)
private RemoteNoticeService remoteNoticeService;
/** /**
* 新增预警任务 * 新增预警任务
* *
@ -217,16 +223,8 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService {
List<RemoteUserVo> remoteUserVos = remoteUserService.selectUsersByDeptIds(deptIds); List<RemoteUserVo> remoteUserVos = remoteUserService.selectUsersByDeptIds(deptIds);
List<Long> userIds = remoteUserVos.stream().map(RemoteUserVo::getUserId).collect(Collectors.toList()); List<Long> userIds = remoteUserVos.stream().map(RemoteUserVo::getUserId).collect(Collectors.toList());
JSONObject jsonObject = new JSONObject();
String imagePreviewUrl = MinioUntil.getObjectUrlOne(MinIOConstants.BUCKET_DKCY, alertVo.getImages(), 3600).toString(); String imagePreviewUrl = MinioUntil.getObjectUrlOne(MinIOConstants.BUCKET_DKCY, alertVo.getImages(), 3600).toString();
jsonObject.put("deptId", alert.getDeptId()); JSONObject jsonObject = setupBusinessAlertSSEObj( alert, imagePreviewUrl);
jsonObject.put("deptName", alert.getDeptName());
jsonObject.put("images", imagePreviewUrl);
jsonObject.put("labelCn", alert.getLabelCn());
jsonObject.put("lat", alert.getLat());
jsonObject.put("lng", alert.getLng());
jsonObject.put("createTime", ObjectUtil.isNotEmpty(alert.getCreateTime()) ? alert.getCreateTime() : new Date());
jsonObject.put("jobName", alert.getJobName());
remoteMessageService.publishMessage(userIds, jsonObject.toString() ); remoteMessageService.publishMessage(userIds, jsonObject.toString() );
System.out.println("已发送:"+ "预警内容:"+ jsonObject.toString()); System.out.println("已发送:"+ "预警内容:"+ jsonObject.toString());
} }
@ -249,6 +247,20 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService {
} }
/** 预警信息转jsonObj给前台提示预警 **/
private static JSONObject setupBusinessAlertSSEObj( BusinessAlert alert, String imagePreviewUrl) {
JSONObject jsonObject = new JSONObject();
jsonObject.put("deptId", alert.getDeptId());
jsonObject.put("deptName", alert.getDeptName());
jsonObject.put("images", imagePreviewUrl);
jsonObject.put("labelCn", alert.getLabelCn());
jsonObject.put("lat", alert.getLat());
jsonObject.put("lng", alert.getLng());
jsonObject.put("createTime", ObjectUtil.isNotEmpty(alert.getCreateTime()) ? alert.getCreateTime() : new Date());
jsonObject.put("jobName", alert.getJobName());
return jsonObject;
}
/** /**
* 批量添加 * 批量添加
* @param alertVoList 预警任务 * @param alertVoList 预警任务
@ -279,6 +291,22 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService {
}).toList(); }).toList();
boolean b = this.baseMapper.insertBatch(businessAlerts); boolean b = this.baseMapper.insertBatch(businessAlerts);
//推送消息-基于部门-找用户 发送json格式 --此时没有deptId,无效预警
for (BusinessAlert alert : businessAlerts) {
if(ObjectUtil.isEmpty(alert.getDeptId())){
continue;
}
ArrayList<Long> deptIds = new ArrayList<>();
deptIds.add(Long.parseLong(alert.getDeptId()));
List<RemoteUserVo> remoteUserVos = remoteUserService.selectUsersByDeptIds(deptIds);
List<Long> userIds = remoteUserVos.stream().map(RemoteUserVo::getUserId).collect(Collectors.toList());
String imagePreviewUrl = MinioUntil.getObjectUrlOne(MinIOConstants.BUCKET_DKCY, alert.getImages(), 3600).toString();
JSONObject jsonObject = setupBusinessAlertSSEObj(alert, imagePreviewUrl);
remoteMessageService.publishMessage(userIds, jsonObject.toString() );
}
/*List<BusinessAlertConstructInfo> alertConstructInfoList = businessAlerts.stream().map(alert -> { /*List<BusinessAlertConstructInfo> alertConstructInfoList = businessAlerts.stream().map(alert -> {
BusinessAlertConstructInfoVo alertConstructInfoVo = alert.getAlertConstructInfoVo(); BusinessAlertConstructInfoVo alertConstructInfoVo = alert.getAlertConstructInfoVo();
BusinessAlertConstructInfo businessAlertConstructInfo = new BusinessAlertConstructInfo(); BusinessAlertConstructInfo businessAlertConstructInfo = new BusinessAlertConstructInfo();
@ -288,6 +316,19 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService {
}).collect(Collectors.toList()); }).collect(Collectors.toList());
businessAlertConstructInfoMapper.insertBatch(alertConstructInfoList);*/ businessAlertConstructInfoMapper.insertBatch(alertConstructInfoList);*/
//基于系统参数判断是否要自动提交
boolean submitFlag = remoteConfigService.selectXingluoAutoSubmit();
if(submitFlag){
System.out.println("记录内容提交");
String collect = alertVoList.stream().map(RemoteBusinessAlertVo::getLabelCn).collect(Collectors.joining(","));
System.out.println(collect);
for (BusinessAlert businessAlert : businessAlerts) {
// this.pushAlert(businessAlert.getAlertId(),);
}
}
return b; return b;
} }
@ -997,6 +1038,39 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService {
} }
} }
@Override
public void pushAlert(Long alertId, String deptId, String deptName) {
BusinessAlert businessAlert= this.getBusinessAlert(alertId);
if(!ObjectUtil.hasEmpty(deptId,deptName)){
businessAlert.setDeptName(deptName);
businessAlert.setDeptId(deptId);
}
businessAlert.setCreateTime(new Date());
//businessAlert.setJobName(deptName + businessAlert.getLabelCn() + DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss",businessAlert.getCreateTime()));
this.updateBusinessAlert(businessAlert);
RemoteStartProcess startProcess = new RemoteStartProcess();
startProcess.setBusinessId(String.valueOf(businessAlert.getId()));
startProcess.setFlowCode("alertChz");
remoteWorkflowService.startWorkFlowBatch(List.of(startProcess));
RemoteNoticeBo remoteNoticeBo = new RemoteNoticeBo();
remoteNoticeBo.setNoticeTitle(businessAlert.getDeptName()+"产生预警,预警类型["+businessAlert.getLabelCn()+"],请立即查看");
remoteNoticeBo.setNoticeType("3");
remoteNoticeBo.setNoticeContent(businessAlert.getDeptName()+"产生预警,预警类型["+businessAlert.getLabelCn()+"],请立即查看");
remoteNoticeBo.setStatus("0");
remoteNoticeBo.setIsRead(0);
remoteNoticeBo.setCreateBy(1L);
remoteNoticeBo.setCreateDept(1L);
remoteNoticeBo.setCreateTime(businessAlert.getCreateTime());
if (businessAlert.getBusinessType() == 2){
businessAlert.setImages(MinioUntil.getObjectUrlOne(MinIOConstants.BUCKET_DKCY, businessAlert.getImages(), 3600).toString());
}
remoteNoticeBo.setDeviceSn(businessAlert.getDeviceSn());
businessAlert.setDeviceSn(businessAlert.getDeviceSn());
remoteNoticeBo.setParam(JSON.toJSONString(businessAlert));
remoteNoticeService.saveNotice(remoteNoticeBo);
remoteSubmailConfigService.remoteCmdSend("smsMultixsend", JSON.toJSONString(businessAlert));
}
// 压缩图片方法 // 压缩图片方法
private static BufferedImage compressImage(BufferedImage originalImage, int targetWidth, int targetHeight) { private static BufferedImage compressImage(BufferedImage originalImage, int targetWidth, int targetHeight) {

16
dk-modules/sample/src/main/java/org/dromara/sample/feign/RemoteBusinessAlertFeign.java

@ -0,0 +1,16 @@
package org.dromara.sample.feign;
import cn.hutool.json.JSONObject;
import org.dromara.business.api.domain.RemoteBusinessAlertRequest;
import org.dromara.common.core.domain.R;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@FeignClient(name = "gateway",path = "business")
public interface RemoteBusinessAlertFeign {
@PostMapping("/saveBusinessAlert")
// public R<Boolean> saveBusinessAlert(@RequestBody RemoteBusinessAlertRequest requestObj);
public R<Boolean> saveBusinessAlert(@RequestBody JSONObject requestObj);
}

18
dk-modules/sample/src/main/java/org/dromara/sample/feign/RemoteConfigFeign.java

@ -0,0 +1,18 @@
package org.dromara.sample.feign;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
@FeignClient(name = "gateway",path = "system")
public interface RemoteConfigFeign {
@GetMapping("/config/configKeyFeign/{configKey}")
String getConfigKey(@PathVariable String configKey);
}

16
dk-modules/sample/src/main/java/org/dromara/sample/manage/config/XingluoApiEnum.java

@ -1,9 +1,21 @@
package org.dromara.sample.manage.config; package org.dromara.sample.manage.config;
public enum XingluoApiEnum { public enum XingluoApiEnum {
//2022 秸秆焚烧(烟、火、焚后痕迹) fire ----------
FIRE(2022, "可见光","秸秆焚烧","秸秆燃烧预警","2010_12",2022, 1899717400907046931l,"fire","秸秆燃烧"),
//2023 烟火识别 ------
FIREWORKS(2022, "可见光","烟火识别","烟火识别预警","2010_13",2023, 1899717400907046931l,"fire","烟火识别"),
//2003 佩戴安全带 ------ A null object appeared
SAFETY_HARNESS(2003, "可见光","是否佩戴安全带","安全带预警","2003_ext",2003, 1899717400907046940l,"SafetyHarness","安全带"),
//2024 安全帽 ------- A null object appeared
SAFETY_HELMET(2004, "可见光","是否佩戴安全帽","安全帽预警","2004_ext",2004, 1899717400907046939l,"SafetyHelmet","安全帽"), SAFETY_HELMET(2004, "可见光","是否佩戴安全帽","安全帽预警","2004_ext",2004, 1899717400907046939l,"SafetyHelmet","安全帽"),
SAFETY_HARNESS(2003, "可见光","是否佩戴安全绳","安全绳预警","2003_ext",2003, 1899717400907046940l,"SafetyHarness","安全带"), //2034 路面车辆计数
CARCOUNT(2034, "可见光","路面车辆计数","路面车辆计数","2010_24",2034, 1899717400907046953l,"carCount","路面车辆计数"),
//2015 多类型车辆计数
CARCOUNTMULTITYPE(2015, "可见光","多类型车辆计数","多类型车辆计数","2010_5",2015, 1899717400907046953l,"carCountMultiType","多类型车辆计数"),
//2016 多类型车辆拥堵聚集
CARMULTITYPEJAM(2016, "可见光","多类型车辆拥堵聚集","多类型车辆拥堵聚集","2010_6",2016, 1899717400907046955l,"carMultiTypeJam","多类型车辆拥堵聚集"),
//2039 无人机安全帽检测 ---------
SAFETY_HELMET_NEW(2039, "可见光","无人机安全帽检测","安全帽预警","2010_29",2039, 1899717400907046939l,"SafetyHelmet","安全帽"); SAFETY_HELMET_NEW(2039, "可见光","无人机安全帽检测","安全帽预警","2010_29",2039, 1899717400907046939l,"SafetyHelmet","安全帽");

32
dk-modules/sample/src/main/java/org/dromara/sample/manage/config/xingluoApiType.json

@ -6,11 +6,11 @@
"id": 2022, "id": 2022,
"sence": "可见光", "sence": "可见光",
"type": "秸秆焚烧(烟、火、焚后痕迹)", "type": "秸秆焚烧(烟、火、焚后痕迹)",
"extra_type": "2010_12",
"model": "01", "model": "01",
"user": "xuzhou_ai",
"difficult": 0, "difficult": 0,
"extra_type": "2010_12",
"if_open": 1, "if_open": 1,
"user": "xuzhou_ai",
"sence_id": 2022, "sence_id": 2022,
"conf": 0.7, "conf": 0.7,
"aiConfig": 0 "aiConfig": 0
@ -19,11 +19,11 @@
"id": 2023, "id": 2023,
"sence": "可见光", "sence": "可见光",
"type": "烟火识别", "type": "烟火识别",
"extra_type": "2010_13",
"model": "01", "model": "01",
"user": "xuzhou_ai",
"difficult": 0, "difficult": 0,
"extra_type": "2010_13",
"if_open": 1, "if_open": 1,
"user": "xuzhou_ai",
"sence_id": 2023, "sence_id": 2023,
"conf": 0.7, "conf": 0.7,
"aiConfig": 0 "aiConfig": 0
@ -32,11 +32,11 @@
"id": 2003, "id": 2003,
"sence": "可见光", "sence": "可见光",
"type": "是否佩戴安全绳", "type": "是否佩戴安全绳",
"extra_type": "2003_ext",
"model": "01", "model": "01",
"user": "xuzhou_ai",
"difficult": 0, "difficult": 0,
"extra_type": "2003_ext",
"if_open": 1, "if_open": 1,
"user": "xuzhou_ai",
"sence_id": 2003, "sence_id": 2003,
"conf": 0.7, "conf": 0.7,
"aiConfig": 0 "aiConfig": 0
@ -45,11 +45,11 @@
"id": 2004, "id": 2004,
"sence": "可见光", "sence": "可见光",
"type": "是否佩戴安全帽", "type": "是否佩戴安全帽",
"extra_type": "2004_ext",
"model": "01", "model": "01",
"user": "xuzhou_ai",
"difficult": 0, "difficult": 0,
"extra_type": "2004_ext",
"if_open": 1, "if_open": 1,
"user": "xuzhou_ai",
"sence_id": 2004, "sence_id": 2004,
"conf": 0.7, "conf": 0.7,
"aiConfig": 1 "aiConfig": 1
@ -58,11 +58,11 @@
"id": 2034, "id": 2034,
"sence": "可见光", "sence": "可见光",
"type": "路面车辆计数", "type": "路面车辆计数",
"extra_type": "2010_24",
"model": "01", "model": "01",
"user": "xuzhou_ai",
"difficult": 0, "difficult": 0,
"extra_type": "2010_24",
"if_open": 1, "if_open": 1,
"user": "xuzhou_ai",
"sence_id": 2034, "sence_id": 2034,
"conf": 0.7, "conf": 0.7,
"aiConfig": 0 "aiConfig": 0
@ -71,11 +71,11 @@
"id": 2015, "id": 2015,
"sence": "可见光", "sence": "可见光",
"type": "多类型车辆计数", "type": "多类型车辆计数",
"extra_type": "2010_5",
"model": "01", "model": "01",
"user": "xuzhou_ai",
"difficult": 0, "difficult": 0,
"extra_type": "2010_5",
"if_open": 1, "if_open": 1,
"user": "xuzhou_ai",
"sence_id": 2015, "sence_id": 2015,
"conf": 0.7, "conf": 0.7,
"aiConfig": 0 "aiConfig": 0
@ -84,11 +84,11 @@
"id": 2016, "id": 2016,
"sence": "可见光", "sence": "可见光",
"type": "多类型车辆拥堵聚集", "type": "多类型车辆拥堵聚集",
"extra_type": "2010_6",
"model": "01", "model": "01",
"user": "xuzhou_ai",
"difficult": 0, "difficult": 0,
"extra_type": "2010_6",
"if_open": 1, "if_open": 1,
"user": "xuzhou_ai",
"sence_id": 2016, "sence_id": 2016,
"conf": 0.7, "conf": 0.7,
"aiConfig": 0 "aiConfig": 0
@ -97,11 +97,11 @@
"id": 2039, "id": 2039,
"sence": "可见光", "sence": "可见光",
"type": "无人机安全帽检测", "type": "无人机安全帽检测",
"extra_type": "2010_29",
"model": "01", "model": "01",
"user": "xuzhou_ai",
"difficult": 0, "difficult": 0,
"extra_type": "2010_29",
"if_open": 1, "if_open": 1,
"user": "xuzhou_ai",
"sence_id": 2039, "sence_id": 2039,
"conf": 0.7, "conf": 0.7,
"aiConfig": 0 "aiConfig": 0

151
dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/SampleEngineRecordController.java

@ -19,11 +19,13 @@ import org.dromara.common.oss.core.OssClient;
import org.dromara.common.oss.entity.UploadResult; import org.dromara.common.oss.entity.UploadResult;
import org.dromara.common.oss.factory.OssFactory; import org.dromara.common.oss.factory.OssFactory;
import org.dromara.common.sdk.common.HttpResultResponse; import org.dromara.common.sdk.common.HttpResultResponse;
import org.dromara.sample.feign.RemoteSystemFeign;
import org.dromara.sample.manage.config.XingluoApiEnum; import org.dromara.sample.manage.config.XingluoApiEnum;
import org.dromara.sample.manage.mapper.ITaskJobMapper; import org.dromara.sample.manage.mapper.ITaskJobMapper;
import org.dromara.sample.manage.model.dto.CallBackDTO; import org.dromara.sample.manage.model.dto.CallBackDTO;
import org.dromara.sample.manage.model.dto.DeviceDTO; import org.dromara.sample.manage.model.dto.DeviceDTO;
import org.dromara.sample.manage.model.dto.EventsDTO; import org.dromara.sample.manage.model.dto.EventsDTO;
import org.dromara.sample.manage.model.dto.ObjectsDTO;
import org.dromara.sample.manage.model.entity.TaskJobEntity; import org.dromara.sample.manage.model.entity.TaskJobEntity;
import org.dromara.sample.manage.model.entity.WarningRecordEntity; import org.dromara.sample.manage.model.entity.WarningRecordEntity;
import org.dromara.sample.manage.service.IDeviceService; import org.dromara.sample.manage.service.IDeviceService;
@ -47,13 +49,14 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
import java.util.stream.Collectors;
/** /**
* @author sean.zhou * @author sean.zhou
* @version 0.1 * @version 0.1
* @date 2021/11/15 * @date 2021/11/15
*/ */
@RequiredArgsConstructor //@RequiredArgsConstructor
@RestController @RestController
@Slf4j @Slf4j
@RequestMapping("${url.manage.prefix}${url.manage.version}/saEngineRecord") @RequestMapping("${url.manage.prefix}${url.manage.version}/saEngineRecord")
@ -63,17 +66,11 @@ public class SampleEngineRecordController {
@Autowired @Autowired
private ISampleEngineRecordService sampleEngineRecordService; private ISampleEngineRecordService sampleEngineRecordService;
@Autowired
private ISampleWarningRecordService sampleWarningRecordService;
@Autowired @Autowired
private IDeviceService deviceService; private IDeviceService deviceService;
@DubboReference
private final RemoteBusinessAlertService businessAlertService;
@Autowired @Autowired
private final IWaylineJobMapper waylineJobMapper; private RemoteSystemFeign remoteSystemFeign;
/** /**
* 获取场景算法 * 获取场景算法
@ -104,141 +101,23 @@ public class SampleEngineRecordController {
return HttpResultResponse.success(); return HttpResultResponse.success();
} }
@Resource // @Resource
ITaskJobMapper taskJobMapper; // ITaskJobMapper taskJobMapper;
/**
* 回调数据
*{"events":[{"algoId":2022,"eventId":"NMwuELxmSA","extraType":"2010_12","frame":{"height":1080,"width":1920},"objects":[{"attrImage":"","attrName":"","attrText":"","classId":"3399529","trackId":"576g4","x":829,"y":638}],"picUrl":"https://dispatch-base-test.oss-cn-shanghai.aliyuncs.com/ai/report/29847/rsISeqAgsK/BzSdPemeNi/events/NMwuELxmSA.jpg?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20250607T102241Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Credential=LTAI5tLSJ1Jd91LeBLkeuQJx%2F20250607%2Fcn-shanghai%2Fs3%2Faws4_request&X-Amz-Signature=d7cf99add75296a285854bbf2bb8a112b80d76a46a7653a350c26ba154c82865"}],"taskId":"rsISeqAgsK"}
*
* @param resObject
*/
@PostMapping("/some") @PostMapping("/some")
@Operation(summary = "存储推流的预警(对外接口)。", description = "存储推流的预警(对外接口)。") @Operation(summary = "存储推流的预警(对外接口)。", description = "存储推流的预警(对外接口)。")
// public void some(@RequestBody CallBackDTO callBackVo){ // public void some(@RequestBody CallBackDTO callBackVo){
public void some(@RequestBody JSONObject resObject){ public void some(@RequestBody JSONObject resObject){
JSONObject entries = new JSONObject(resObject);
CallBackDTO callBackVo = JSONUtil.toBean(resObject, CallBackDTO.class);
String str = entries.getStr("taskId");
// System.out.println(entries.toString());
if(StrUtil.isBlank(str)){
return;
}
List<WarningRecordEntity> warningRecordList = new ArrayList<>();
// String fileUrlStr = "mediafile/e5b8ce3a-3562-40e0-b244-91554d9c17ad/DJI_202505211323_001_e5b8ce3a-3562-40e0-b244-91554d9c17ad/DJI_20250521132610_0001_V.jpeg";
// String fileUrl = fileService.getObjectUrlOne(MinIOConstants.BUCKET_DKCY, fileUrlStr, 360000).toString();
if (CollectionUtils.isNotEmpty(callBackVo.getEvents())){
for (EventsDTO eventsVo :callBackVo.getEvents()){ //一个事件一个图片
WarningRecordEntity warningRecord = new WarningRecordEntity();
warningRecord.setTaskId(callBackVo.getTaskId());
warningRecord.setAlgoId(eventsVo.getAlgoId());
warningRecord.setEventId(eventsVo.getEventId());
warningRecord.setExtraType(eventsVo.getExtraType());
warningRecord.setPicUrl(eventsVo.getPicUrl());
// warningRecord.setPicUrl("http://114.235.183.147:9090/api/v1/download-shared-object/aHR0cDovLzEyNy4wLjAuMTo5MDAwL2RrY3kvbWVkaWFmaWxlL2U1YjhjZTNhLTM1NjItNDBlMC1iMjQ0LTkxNTU0ZDljMTdhZC9ESklfMjAyNTA1MjExMzIzXzAwMV9lNWI4Y2UzYS0zNTYyLTQwZTAtYjI0NC05MTU1NGQ5YzE3YWQvREpJXzIwMjUwNTIxMTMyNjEwXzAwMDFfVi5qcGVnP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QVI5MEk5QkxXWVZBWkRLOUowVjElMkYyMDI1MDUyMiUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNTA1MjJUMTUxNzAxWiZYLUFtei1FeHBpcmVzPTQzMjAwJlgtQW16LVNlY3VyaXR5LVRva2VuPWV5SmhiR2NpT2lKSVV6VXhNaUlzSW5SNWNDSTZJa3BYVkNKOS5leUpoWTJObGMzTkxaWGtpT2lKQlVqa3dTVGxDVEZkWlZrRmFSRXM1U2pCV01TSXNJbVY0Y0NJNk1UYzBOemsyT0RneE9Dd2ljR0Z5Wlc1MElqb2lZV1J0YVc0aWZRLkh1N1VaVkhuS19EUWhfR1lnLVB0cVhBNFpJTHpPTk1vTkZ3by1YalI0N0R3U3VnZ2NyRC1EdXkxeEdfM3FmWXdRQmdPd29Ca2xGVTRYLWpvNncxY0lRJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZ2ZXJzaW9uSWQ9bnVsbCZYLUFtei1TaWduYXR1cmU9MjNmZjdhZWViNTJlZjk4ZWFmMTg5OTg4MjQzNDk5ZTRiYzgwNzI5ZWU1MzJkM2M2MTdlMDFmM2U3ODZlZDA1OQ");
warningRecord.setTimestamp(eventsVo.getTimestamp());
warningRecordList.add(warningRecord);
}
sampleWarningRecordService.saveBatch(warningRecordList);
//保存数据到BusinessAlert
String activeProfile = "w_nantong";
ArrayList<RemoteBusinessAlertVo> alertVoList = new ArrayList<>();
for (WarningRecordEntity warningRecordEntity : warningRecordList) {
RemoteBusinessAlertVo remoteBusinessAlertVo = new RemoteBusinessAlertVo();
String deviceSn = "";
if(null != warningRecordEntity.getTaskId()){
LambdaQueryWrapper<TaskJobEntity> qw = new LambdaQueryWrapper<>(TaskJobEntity.class);
qw.eq(TaskJobEntity::getTaskId, warningRecordEntity.getTaskId());
qw.orderByDesc(TaskJobEntity::getCreateTime);
qw.last("limit 1");
TaskJobEntity taskJobEntity = taskJobMapper.selectOne(qw); //taskjob,找最新得一条任务
if(BeanUtil.isNotEmpty(taskJobEntity)){
String jobId = taskJobEntity.getJobId();
deviceSn = taskJobEntity.getDeviceSn();
if(StrUtil.isNotEmpty(jobId)){
LambdaQueryWrapper<WaylineJobEntity> waylineJobQuery = new LambdaQueryWrapper<>();
waylineJobQuery.eq(WaylineJobEntity::getJobId,jobId); //jobId是unique唯一
WaylineJobEntity waylineJobEntity = waylineJobMapper.selectOne(waylineJobQuery);
if(BeanUtil.isEmpty(waylineJobEntity)){ //找不到航线-不处理预警
continue;
}
remoteBusinessAlertVo.setJobId(waylineJobEntity.getJobId());
remoteBusinessAlertVo.setJobName(waylineJobEntity.getName());
}
}
}
remoteBusinessAlertVo.setLat("");
remoteBusinessAlertVo.setLng("");
if(StrUtil.isNotEmpty(deviceSn)){
Optional<DeviceDTO> deviceBySn = deviceService.getDeviceBySn(deviceSn);
DeviceDTO deviceDTO = deviceBySn.isPresent() ? deviceBySn.get() : null;
remoteBusinessAlertVo.setLat(deviceDTO.getLatitude()+ "");
remoteBusinessAlertVo.setLng(deviceDTO.getLongitude()+ "");
// remoteBusinessAlertVo.setLat("34.20912175973148");
// remoteBusinessAlertVo.setLng("117.2260332850499");
} Integer insertCount = sampleEngineRecordService.dealAlertData(resObject);
//预警基础信息扩展
// remoteBusinessAlertVo.setAlertType("1"); //1:图片比对预警 2:AI实时预警
// remoteBusinessAlertVo.setJobName(warningRecordEntity.getTaskId());//todo 需要查job信息。填jobName
remoteBusinessAlertVo.setAssign(false);
String minioUrl = saveAliyunPreviewToMinio(warningRecordEntity.getPicUrl(),deviceSn, MinIOConstants.BUCKET_DKCY);
remoteBusinessAlertVo.setImages(minioUrl);
// remoteBusinessAlertVo.setMaxImages("");//mateFileUrl
// remoteBusinessAlertVo.setMateSourceImgUrl("");//mateFileUrl
setupLabelInfo(warningRecordEntity, remoteBusinessAlertVo);//设置标签信息
remoteBusinessAlertVo.setTaskContent("");
remoteBusinessAlertVo.setHandleType("waiting");
// remoteBusinessAlertVo.setDeptId(aiCompareEntity.getCreateDept()+"");
// remoteBusinessAlertVo.setDeptName(aiCompareEntity.getDeptName());
remoteBusinessAlertVo.setHandleNum(0);
//businessAlertConstructInfo数据
alertVoList.add(remoteBusinessAlertVo);
}
businessAlertService.saveBusinessAlert(alertVoList,activeProfile);
}
}
private static void setupLabelInfo(WarningRecordEntity warningRecordEntity, RemoteBusinessAlertVo remoteBusinessAlertVo) {
// String extraType = XingluoApiEnum.SAFETY_HARNESS.getExtraType();
switch (warningRecordEntity.getExtraType()){
case "2004_ext":
remoteBusinessAlertVo.setLabelCn(XingluoApiEnum.SAFETY_HELMET.getTypeStr());//安全帽预警
remoteBusinessAlertVo.setLabelEn(XingluoApiEnum.SAFETY_HELMET.getAiType()); //SafetyHelmet
break;
case "2003_ext":
remoteBusinessAlertVo.setLabelCn(XingluoApiEnum.SAFETY_HARNESS.getTypeStr());//安全绳预警
remoteBusinessAlertVo.setLabelEn(XingluoApiEnum.SAFETY_HARNESS.getAiType()); //SafetyHarness
break;
}
} }
public String saveAliyunPreviewToMinio(String aliyunUrl,String deviceSn, String minioBucket) {
try {
URL url = new URL(aliyunUrl);
URLConnection conn = url.openConnection();
conn.setConnectTimeout(3_500);
conn.setReadTimeout(3_500);
InputStream inputStream = conn.getInputStream();
long fileSize = conn.getContentLengthLong();
String fileName = FileUtil.getName(url.getPath());
String path = url.getPath().replace(fileName, deviceSn+ fileName); // eg: /ai/report/29847/{deviceSn+xxx.jpg}
String originalFileName = path.substring(path.lastIndexOf("/") + 1); // qwfbGaBixI.jpg
String suffix = originalFileName.contains(".") ? originalFileName.substring(originalFileName.lastIndexOf(".")) : ".jpg"; // fallback
// String newFileName = IdUtils.fastUUID() + suffix;
OssClient minioClient = OssFactory.instance(minioBucket);
UploadResult result = minioClient.upload(inputStream, path, fileSize, MimeTypeUtils.IMAGE_JPG);
// MinioUtil.uploadFile(path,inputStream,);
inputStream.close();
return path; // 返回 MinIO 的访问地址
} catch (IOException e) {
throw new RuntimeException("上传图片失败", e);
}
}
} }

8
dk-modules/sample/src/main/java/org/dromara/sample/manage/model/entity/WarningRecordEntity.java

@ -19,7 +19,6 @@ import java.util.Date;
@EqualsAndHashCode(callSuper = false) @EqualsAndHashCode(callSuper = false)
@Accessors(chain = true) @Accessors(chain = true)
public class WarningRecordEntity implements Serializable { public class WarningRecordEntity implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(type = IdType.AUTO) @TableId(type = IdType.AUTO)
private String id; private String id;
@ -45,4 +44,11 @@ public class WarningRecordEntity implements Serializable {
@TableField(fill = FieldFill.INSERT) @TableField(fill = FieldFill.INSERT)
private Date createTime; private Date createTime;
@TableField(value = "track_ids")
private String trackIds;
@TableField(value = "remark")
private String remark;
} }

4
dk-modules/sample/src/main/java/org/dromara/sample/manage/service/ISampleEngineRecordService.java

@ -1,5 +1,7 @@
package org.dromara.sample.manage.service; package org.dromara.sample.manage.service;
import cn.hutool.json.JSONObject;
import java.util.Map; import java.util.Map;
public interface ISampleEngineRecordService { public interface ISampleEngineRecordService {
@ -8,4 +10,6 @@ public interface ISampleEngineRecordService {
void closeEngine(Map<String,Object> objectMap); void closeEngine(Map<String,Object> objectMap);
Map<String, Object> extractType(Map<String, Object> objectMap); Map<String, Object> extractType(Map<String, Object> objectMap);
Integer dealAlertData(JSONObject resObject);
} }

280
dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/SampleEngineRecordServiceImpl.java

@ -1,13 +1,19 @@
package org.dromara.sample.manage.service.impl; package org.dromara.sample.manage.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.map.MapUtil; import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.nacos.common.utils.CollectionUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import io.seata.common.util.StringUtils; import io.seata.common.util.StringUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; 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.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost; import org.apache.http.client.methods.HttpPost;
@ -16,30 +22,49 @@ import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients; import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils; import org.apache.http.util.EntityUtils;
import org.dromara.business.api.domain.RemoteBusinessAlertRequest;
import org.dromara.business.api.domain.vo.RemoteBusinessAlertVo;
import org.dromara.common.core.utils.file.MimeTypeUtils;
import org.dromara.common.oss.core.OssClient;
import org.dromara.common.oss.entity.UploadResult;
import org.dromara.common.oss.factory.OssFactory;
import org.dromara.sample.common.util.Md5Utils; import org.dromara.sample.common.util.Md5Utils;
import org.dromara.sample.feign.RemoteBusinessAlertFeign;
import org.dromara.sample.feign.RemoteConfigFeign;
import org.dromara.sample.feign.RemoteSystemFeign;
import org.dromara.sample.manage.config.XingluoApiConfig; import org.dromara.sample.manage.config.XingluoApiConfig;
import org.dromara.sample.manage.mapper.IDeviceMapper; import org.dromara.sample.manage.config.XingluoApiEnum;
import org.dromara.sample.manage.mapper.ISampleEngineRecordMapper; import org.dromara.sample.manage.mapper.ISampleEngineRecordMapper;
import org.dromara.sample.manage.mapper.ITaskJobMapper; import org.dromara.sample.manage.mapper.ITaskJobMapper;
import org.dromara.sample.manage.mapper.SampleWarningRecordMapper;
import org.dromara.sample.manage.model.dto.*; import org.dromara.sample.manage.model.dto.*;
import org.dromara.sample.manage.model.entity.EngineRecordEntity; import org.dromara.sample.manage.model.entity.EngineRecordEntity;
import org.dromara.sample.manage.model.entity.TaskJobEntity; import org.dromara.sample.manage.model.entity.TaskJobEntity;
import org.dromara.sample.manage.model.entity.WarningRecordEntity;
import org.dromara.sample.manage.service.IDeviceService; import org.dromara.sample.manage.service.IDeviceService;
import org.dromara.sample.manage.service.ISampleEngineRecordService; import org.dromara.sample.manage.service.ISampleEngineRecordService;
import org.dromara.system.api.RemoteConfigService; import org.dromara.sample.media.constant.MinIOConstants;
import org.dromara.sample.wayline.mapper.IWaylineJobMapper;
import org.dromara.sample.wayline.model.entity.WaylineJobEntity;
import org.json.JSONArray; import org.json.JSONArray;
import org.json.JSONObject; import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource; import jakarta.annotation.Resource;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI; import java.net.URI;
import java.net.URISyntaxException; import java.net.URISyntaxException;
import java.net.URL;
import java.net.URLConnection;
import java.util.*; import java.util.*;
import java.util.stream.Collectors;
import static org.apache.commons.compress.utils.ArchiveUtils.sanitize; import static org.apache.commons.compress.utils.ArchiveUtils.sanitize;
@RequiredArgsConstructor
@Service @Service
@Slf4j @Slf4j
@Transactional @Transactional
@ -50,14 +75,32 @@ public class SampleEngineRecordServiceImpl implements ISampleEngineRecordService
@Resource @Resource
ITaskJobMapper taskJobMapper; ITaskJobMapper taskJobMapper;
@Resource
SampleWarningRecordMapper sampleWarningRecordMapper;
@Autowired @Autowired
private XingluoApiConfig xingluoApiConfig; private XingluoApiConfig xingluoApiConfig;
@Autowired @Autowired
private IDeviceService deviceService; private IDeviceService deviceService;
@DubboReference // @Autowired
private RemoteConfigService remoteConfigService; // private ISampleWarningRecordService sampleWarningRecordService;
// @Autowired
private final IWaylineJobMapper waylineJobMapper;
@Resource
private RemoteConfigFeign remoteConfigFeign;
@Resource
private RemoteSystemFeign remoteSystemFeign;
@Resource
private RemoteBusinessAlertFeign remoteBusinessAlertFeign;
@Override @Override
public Map<String, Object> extractType(Map<String, Object> objectMap) { public Map<String, Object> extractType(Map<String, Object> objectMap) {
@ -103,7 +146,8 @@ public class SampleEngineRecordServiceImpl implements ISampleEngineRecordService
ObjectMapper mapper = new ObjectMapper(); ObjectMapper mapper = new ObjectMapper();
//ExtraTypeResponse(code=200, message=操作成功, data=[ExtraType(id=2022, sence=可见光, type=秸秆焚烧(烟、火、焚后痕迹), extra_type=2010_12, model=01, user=xuzhou_ai, difficult=0, if_open=1, sence_id=2022, conf=0.7, aiConfig=0), ExtraType(id=2023, sence=可见光, type=烟火识别, extra_type=2010_13, model=01, user=xuzhou_ai, difficult=0, if_open=1, sence_id=2023, conf=0.7, aiConfig=0), ExtraType(id=2003, sence=可见光, type=是否佩戴安全绳, extra_type=2003_ext, model=01, user=xuzhou_ai, difficult=0, if_open=1, sence_id=2003, conf=0.7, aiConfig=0), ExtraType(id=2004, sence=可见光, type=是否佩戴安全帽, extra_type=2004_ext, model=01, user=xuzhou_ai, difficult=0, if_open=1, sence_id=2004, conf=0.7, aiConfig=1), ExtraType(id=2034, sence=可见光, type=路面车辆计数, extra_type=2010_24, model=01, user=xuzhou_ai, difficult=0, if_open=1, sence_id=2034, conf=0.7, aiConfig=0), ExtraType(id=2015, sence=可见光, type=多类型车辆计数, extra_type=2010_5, model=01, user=xuzhou_ai, difficult=0, if_open=1, sence_id=2015, conf=0.7, aiConfig=0), ExtraType(id=2016, sence=可见光, type=多类型车辆拥堵聚集, extra_type=2010_6, model=01, user=xuzhou_ai, difficult=0, if_open=1, sence_id=2016, conf=0.7, aiConfig=0)]) //ExtraTypeResponse(code=200, message=操作成功, data=[ExtraType(id=2022, sence=可见光, type=秸秆焚烧(烟、火、焚后痕迹), extra_type=2010_12, model=01, user=xuzhou_ai, difficult=0, if_open=1, sence_id=2022, conf=0.7, aiConfig=0), ExtraType(id=2023, sence=可见光, type=烟火识别, extra_type=2010_13, model=01, user=xuzhou_ai, difficult=0, if_open=1, sence_id=2023, conf=0.7, aiConfig=0), ExtraType(id=2003, sence=可见光, type=是否佩戴安全绳, extra_type=2003_ext, model=01, user=xuzhou_ai, difficult=0, if_open=1, sence_id=2003, conf=0.7, aiConfig=0), ExtraType(id=2004, sence=可见光, type=是否佩戴安全帽, extra_type=2004_ext, model=01, user=xuzhou_ai, difficult=0, if_open=1, sence_id=2004, conf=0.7, aiConfig=1), ExtraType(id=2034, sence=可见光, type=路面车辆计数, extra_type=2010_24, model=01, user=xuzhou_ai, difficult=0, if_open=1, sence_id=2034, conf=0.7, aiConfig=0), ExtraType(id=2015, sence=可见光, type=多类型车辆计数, extra_type=2010_5, model=01, user=xuzhou_ai, difficult=0, if_open=1, sence_id=2015, conf=0.7, aiConfig=0), ExtraType(id=2016, sence=可见光, type=多类型车辆拥堵聚集, extra_type=2010_6, model=01, user=xuzhou_ai, difficult=0, if_open=1, sence_id=2016, conf=0.7, aiConfig=0)])
ExtraTypeResponse response = mapper.readValue(algorithmResponseBody,ExtraTypeResponse.class); ExtraTypeResponse response = mapper.readValue(algorithmResponseBody,ExtraTypeResponse.class);
System.out.println(response);
System.out.println(JSONUtil.toJsonStr(response));
List<ExtraType> list = response.getData(); List<ExtraType> list = response.getData();
for (ExtraType extraType : list) { for (ExtraType extraType : list) {
extra_type_list.add(extraType.getExtra_type()); extra_type_list.add(extraType.getExtra_type());
@ -119,8 +163,14 @@ public class SampleEngineRecordServiceImpl implements ISampleEngineRecordService
@Override @Override
public Map<String, Object> startEngine(Map<String, Object> objectMap){ public Map<String, Object> startEngine(Map<String, Object> objectMap){
System.out.println("objectMap" + objectMap);
// String configKey = remoteSystemFeign.getConfigKey("xingluo.auto.submit");//通
// System.out.println("configKey"+configKey);
EngineRecordEntity record = new EngineRecordEntity(); EngineRecordEntity record = new EngineRecordEntity();
String ip = remoteConfigService.selectStreamIp(); // String ip = remoteConfigService.selectStreamIp();
String ip = remoteConfigFeign.getConfigKey("stream");
System.out.println(ip);
ip = "121.237.182.235";//服务器使用ip
String md5 = Md5Utils.hash("xuzhou_ai"); //获取token + 设置请求Header和Body(如JSON) String md5 = Md5Utils.hash("xuzhou_ai"); //获取token + 设置请求Header和Body(如JSON)
JSONObject jsonObj = new JSONObject(); JSONObject jsonObj = new JSONObject();
jsonObj.put("username", sanitize("xuzhou_ai")); // sanitize函数见下文 jsonObj.put("username", sanitize("xuzhou_ai")); // sanitize函数见下文
@ -146,6 +196,7 @@ public class SampleEngineRecordServiceImpl implements ISampleEngineRecordService
//查询用户开通的场景 //查询用户开通的场景
Object rtmpUrlParam = objectMap.get("rtmpUrl"); Object rtmpUrlParam = objectMap.get("rtmpUrl");
String pushUrl = "rtmp://" + ip + "/live/livesteam/" + rtmpUrl + "ai1";
if (StringUtils.isNotEmpty(token)){ if (StringUtils.isNotEmpty(token)){
JSONObject jsonObj2 = new JSONObject(); JSONObject jsonObj2 = new JSONObject();
String type = objectMap.get("type").toString(); String type = objectMap.get("type").toString();
@ -156,8 +207,8 @@ public class SampleEngineRecordServiceImpl implements ISampleEngineRecordService
jsonObj2.put("extra_type_list",new JSONArray(list)); jsonObj2.put("extra_type_list",new JSONArray(list));
// jsonObj2.put("input_url","http://"+ip+":19008/live/livesteam/"+objectMap.get("rtmpUrl")+".flv"); // jsonObj2.put("input_url","http://"+ip+":19008/live/livesteam/"+objectMap.get("rtmpUrl")+".flv");
jsonObj2.put("input_url", "rtmp://"+ip+"/live/livesteam/"+ rtmpUrl);//预览接口必须要传rtmp,不能是flv jsonObj2.put("input_url", "rtmp://"+ip+"/live/livesteam/"+ rtmpUrl);//预览接口必须要传rtmp,不能是flv
String pushUrl = "rtmp://" + ip + "/live/livesteam/" + rtmpUrl + "ai1";
jsonObj2.put("push_url", pushUrl); //推流接口有时候不稳定,需要检查SRS服务 jsonObj2.put("push_url", pushUrl); //推流接口有时候不稳定,需要检查SRS服务
// live.setUrl(url.toString().replace("rtmp", "webrtc"));
// jsonObj2.put("play_url", objectMap.get("play_url")); //play_url不必传, play和push是一对, play 其实是冗余的, 方便记录更详细的日志 // jsonObj2.put("play_url", objectMap.get("play_url")); //play_url不必传, play和push是一对, play 其实是冗余的, 方便记录更详细的日志
/** /**
* {"code":500,"message":"任务启动错误:can not open input stream http://114.235.183.163:19008/live/livesteam/7CTXN2T00B07C5-165-0-7.flv","data":null} * {"code":500,"message":"任务启动错误:can not open input stream http://114.235.183.163:19008/live/livesteam/7CTXN2T00B07C5-165-0-7.flv","data":null}
@ -165,7 +216,15 @@ public class SampleEngineRecordServiceImpl implements ISampleEngineRecordService
* {"code":500,"message":"任务启动错误:can not open output rtmp://114.235.183.163/live/livesteam/7CTXN2T00B07C5-165-0-7ai1","data":null} * {"code":500,"message":"任务启动错误:can not open output rtmp://114.235.183.163/live/livesteam/7CTXN2T00B07C5-165-0-7ai1","data":null}
* {"code":200,"message":"操作成功","data":{"task_id":"NOZGoIIubQ","mission_batch":"WX1748254304635"}} * {"code":200,"message":"操作成功","data":{"task_id":"NOZGoIIubQ","mission_batch":"WX1748254304635"}}
*/ */
//测试环境,直接接收url,跳过无人机
// Object rtmpUrlParam = objectMap.get("inputUrl");
// jsonObj2.put("input_url", "rtmp://114.235.183.163/live/livesteam/1581F6Q8X24CE00G02S4-81-0-0");//预览接口必须要传rtmp,不能是flv
// jsonObj2.put("push_url", "rtmp://114.235.183.163/live/livesteam/1581F6Q8X24CE00G02S4-81-0-0ai1");//预览接口必须要传rtmp,不能是flv
System.out.println(jsonObj2.toString());
String responseBody2 = PostRequest(jsonObj2, xingluoApiConfig.getEngineStart(),token); //"http://60.204.247.65:8100/Third/Engine/Start" String responseBody2 = PostRequest(jsonObj2, xingluoApiConfig.getEngineStart(),token); //"http://60.204.247.65:8100/Third/Engine/Start"
System.out.println(responseBody2);
ObjectMapper mapper1 = new ObjectMapper(); ObjectMapper mapper1 = new ObjectMapper();
EngineResponse response = null; EngineResponse response = null;
try { try {
@ -194,12 +253,17 @@ public class SampleEngineRecordServiceImpl implements ISampleEngineRecordService
engineRecordMapper.insert(record); engineRecordMapper.insert(record);
Map<String, Object> map = new HashMap(); Map<String, Object> map = new HashMap();
map.put("push_url", "http://"+ip+":1985/rtc/v1/whep/?app=live/livesteam&stream="+ rtmpUrl +"ai1"); // map.put("push_url", "http://"+ip+":1985/rtc/v1/whep/?app=live/livesteam&stream="+ rtmpUrl +"ai1");
// live.setUrl(url.toString().replace("rtmp", "webrtc"));
map.put("push_url", pushUrl.replaceFirst("rtmp", "webrtc"));
map.put("task_id", taskId);//objectMap.get("task_id") map.put("task_id", taskId);//objectMap.get("task_id")
//添加任务id和jobid关联关系 //添加任务id和jobid关联关系
TaskJobEntity taskJobEntity = new TaskJobEntity(); TaskJobEntity taskJobEntity = new TaskJobEntity();
taskJobEntity.setJobId(objectMap.get("jobId").toString());
String jobIdStr = MapUtil.getStr(objectMap, "jobId");
jobIdStr = StrUtil.isEmpty(jobIdStr) ? "-1" : jobIdStr; //没有航线,默认-1
taskJobEntity.setJobId(jobIdStr);
taskJobEntity.setTaskId(objectMap.get("task_id").toString()); taskJobEntity.setTaskId(objectMap.get("task_id").toString());
taskJobEntity.setDeviceSn(deviceSn); taskJobEntity.setDeviceSn(deviceSn);
taskJobMapper.insert(taskJobEntity); taskJobMapper.insert(taskJobEntity);
@ -274,9 +338,196 @@ public class SampleEngineRecordServiceImpl implements ISampleEngineRecordService
} }
@Override
public Integer dealAlertData(cn.hutool.json.JSONObject resObject) {
cn.hutool.json.JSONObject entries = new cn.hutool.json.JSONObject(resObject);
CallBackDTO callBackVo = JSONUtil.toBean(resObject, CallBackDTO.class);
String taskIdStr = entries.getStr("taskId");
if(StrUtil.isBlank(taskIdStr)){return 0;} //无任务ID拦截
if(callBackVo.getEvents().isEmpty()){ return 0;}
//基于历史记录,找相同设备- trackId是否相同,不同才保存, (每次记录中eventId都不同,所以不做参考)
//同一图片上传可能包含多个物体,传值可能是 h1v93,或者fdi32,或者h1v93,fdi32, 只要trackIds不同,就保存记录
List<WarningRecordEntity> warningRecordList = new ArrayList<>();
// String fileUrlStr = "mediafile/e5b8ce3a-3562-40e0-b244-91554d9c17ad/DJI_202505211323_001_e5b8ce3a-3562-40e0-b244-91554d9c17ad/DJI_20250521132610_0001_V.jpeg";
// String fileUrl = fileService.getObjectUrlOne(MinIOConstants.BUCKET_DKCY, fileUrlStr, 360000).toString();
if (CollectionUtils.isEmpty(callBackVo.getEvents())){return 0;} //空事件拦截
/** 传值转WarningRecord记录 **/
for (EventsDTO eventsVo : callBackVo.getEvents()){ //一个事件一个图片
String extraTypeStr = eventsVo.getExtraType();
String trackIds = eventsVo.getObjects().stream().map(ObjectsDTO::getTrackId).collect(Collectors.joining(","));
// Long count = sampleWarningRecordService.lambdaQuery()
// .eq(WarningRecordEntity::getTaskId, taskIdStr)
// .eq(WarningRecordEntity::getExtraType, extraTypeStr)
// .eq(WarningRecordEntity::getTrackIds, trackIds)
// .count();
LambdaQueryWrapper<WarningRecordEntity> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(WarningRecordEntity::getTaskId, taskIdStr)
.eq(WarningRecordEntity::getExtraType, extraTypeStr)
.eq(WarningRecordEntity::getTrackIds, trackIds);
Long count = sampleWarningRecordMapper.selectCount(queryWrapper);
if(count > 0){continue;}
WarningRecordEntity warningRecord = new WarningRecordEntity();
warningRecord.setTaskId(callBackVo.getTaskId());
warningRecord.setAlgoId(eventsVo.getAlgoId());
warningRecord.setEventId(eventsVo.getEventId());
warningRecord.setExtraType(eventsVo.getExtraType());
warningRecord.setPicUrl(eventsVo.getPicUrl());
// warningRecord.setPicUrl("http://114.235.183.147:9090/api/v1/download-shared-object/aHR0cDovLzEyNy4wLjAuMTo5MDAwL2RrY3kvbWVkaWFmaWxlL2U1YjhjZTNhLTM1NjItNDBlMC1iMjQ0LTkxNTU0ZDljMTdhZC9ESklfMjAyNTA1MjExMzIzXzAwMV9lNWI4Y2UzYS0zNTYyLTQwZTAtYjI0NC05MTU1NGQ5YzE3YWQvREpJXzIwMjUwNTIxMTMyNjEwXzAwMDFfVi5qcGVnP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QVI5MEk5QkxXWVZBWkRLOUowVjElMkYyMDI1MDUyMiUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNTA1MjJUMTUxNzAxWiZYLUFtei1FeHBpcmVzPTQzMjAwJlgtQW16LVNlY3VyaXR5LVRva2VuPWV5SmhiR2NpT2lKSVV6VXhNaUlzSW5SNWNDSTZJa3BYVkNKOS5leUpoWTJObGMzTkxaWGtpT2lKQlVqa3dTVGxDVEZkWlZrRmFSRXM1U2pCV01TSXNJbVY0Y0NJNk1UYzBOemsyT0RneE9Dd2ljR0Z5Wlc1MElqb2lZV1J0YVc0aWZRLkh1N1VaVkhuS19EUWhfR1lnLVB0cVhBNFpJTHpPTk1vTkZ3by1YalI0N0R3U3VnZ2NyRC1EdXkxeEdfM3FmWXdRQmdPd29Ca2xGVTRYLWpvNncxY0lRJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZ2ZXJzaW9uSWQ9bnVsbCZYLUFtei1TaWduYXR1cmU9MjNmZjdhZWViNTJlZjk4ZWFmMTg5OTg4MjQzNDk5ZTRiYzgwNzI5ZWU1MzJkM2M2MTdlMDFmM2U3ODZlZDA1OQ");
warningRecord.setTimestamp(eventsVo.getTimestamp());
String objJsonStr = JSONUtil.toJsonStr(eventsVo.getObjects());
warningRecord.setRemark(objJsonStr);
warningRecord.setTrackIds(trackIds);
// System.out.println(JSONUtil.toJsonStr(eventsVo.getObjects()));
warningRecordList.add(warningRecord);
}
// sampleWarningRecordService.saveBatch(warningRecordList);
sampleWarningRecordMapper.insert(warningRecordList);
/** WarningRecord转 businessAlert记录 **/
//保存数据到BusinessAlert
String activeProfile = "w_nantong";
ArrayList<RemoteBusinessAlertVo> alertVoList = new ArrayList<>();
for (WarningRecordEntity warningRecordEntity : warningRecordList) {
RemoteBusinessAlertVo remoteBusinessAlertVo = new RemoteBusinessAlertVo();
if(ObjectUtil.isEmpty(warningRecordEntity.getTaskId())){ continue;} //空数据跳过
setupLabelInfo(warningRecordEntity, remoteBusinessAlertVo);//设置标签信息
//查找最新任务TaskJob
LambdaQueryWrapper<TaskJobEntity> taskJobquery = new LambdaQueryWrapper<>(TaskJobEntity.class)
.eq(TaskJobEntity::getTaskId, warningRecordEntity.getTaskId())
.orderByDesc(TaskJobEntity::getCreateTime)
.last("limit 1");
TaskJobEntity taskJobEntity = taskJobMapper.selectOne(taskJobquery);
String deviceSn = "";
if(BeanUtil.isNotEmpty(taskJobEntity)){
String jobId = taskJobEntity.getJobId();
deviceSn = taskJobEntity.getDeviceSn();
if(StrUtil.equals("-1",jobId)){ //没有jobId,给个默认名称
remoteBusinessAlertVo.setJobId("-1");
remoteBusinessAlertVo.setJobName("手动飞行" + "-" +remoteBusinessAlertVo.getLabelCn()+ DateUtil.format(new Date(), "yyyy-MM-dd HH:mm:ss"));
} else if(StrUtil.isNotEmpty(jobId)){
LambdaQueryWrapper<WaylineJobEntity> waylineJobQuery = new LambdaQueryWrapper<>();
waylineJobQuery.eq(WaylineJobEntity::getJobId,jobId); //jobId是unique唯一
WaylineJobEntity waylineJobEntity = waylineJobMapper.selectOne(waylineJobQuery);
if(BeanUtil.isEmpty(waylineJobEntity)){continue;} //找不到航线-不处理预警
remoteBusinessAlertVo.setJobId(waylineJobEntity.getJobId());
remoteBusinessAlertVo.setJobName(waylineJobEntity.getName());
}
}
remoteBusinessAlertVo.setLat("");
remoteBusinessAlertVo.setLng("");
if(StrUtil.isNotEmpty(deviceSn)){
Optional<DeviceDTO> deviceBySn = deviceService.getDeviceBySn(deviceSn);
DeviceDTO deviceDTO = deviceBySn.isPresent() ? deviceBySn.get() : null;
remoteBusinessAlertVo.setLat(deviceDTO.getLatitude()+ ""); //34.20912175973148
remoteBusinessAlertVo.setLng(deviceDTO.getLongitude()+ "");//117.2260332850499
}
//预警基础信息扩展
// remoteBusinessAlertVo.setAlertType("1"); //1:图片比对预警 2:AI实时预警
remoteBusinessAlertVo.setAssign(false);
String minioUrl = saveAliyunPreviewToMinio(warningRecordEntity.getPicUrl(),deviceSn, MinIOConstants.BUCKET_DKCY);
remoteBusinessAlertVo.setImages(minioUrl);
// remoteBusinessAlertVo.setMaxImages("");//mateFileUrl
// remoteBusinessAlertVo.setMateSourceImgUrl("");//mateFileUrl
remoteBusinessAlertVo.setTaskContent("");
remoteBusinessAlertVo.setHandleType("waiting");
// remoteBusinessAlertVo.setDeptId(aiCompareEntity.getCreateDept()+"");//暂时没有
// remoteBusinessAlertVo.setDeptName(aiCompareEntity.getDeptName());
remoteBusinessAlertVo.setHandleNum(0);
//businessAlertConstructInfo数据
alertVoList.add(remoteBusinessAlertVo);
}
// businessAlertService.saveBusinessAlert(alertVoList,activeProfile); //远程触发预警消息
RemoteBusinessAlertRequest remoteBusinessAlertRequest = new RemoteBusinessAlertRequest();
remoteBusinessAlertRequest.setAlertVoList(alertVoList);
remoteBusinessAlertRequest.setActiveProfile(activeProfile);
cn.hutool.json.JSONObject requestObj = new cn.hutool.json.JSONObject(remoteBusinessAlertRequest);
remoteBusinessAlertFeign.saveBusinessAlert(requestObj);
return callBackVo.getEvents().size();
}
//基于算法名称赋值
private static void setupLabelInfo(WarningRecordEntity warningRecordEntity, RemoteBusinessAlertVo remoteBusinessAlertVo) {
// String extraType = XingluoApiEnum.SAFETY_HARNESS.getExtraType();
switch (warningRecordEntity.getExtraType()){
case "2010_12": //秸秆焚烧 ------
remoteBusinessAlertVo.setLabelCn(XingluoApiEnum.FIRE.getTypeStr());
remoteBusinessAlertVo.setLabelEn(XingluoApiEnum.FIRE.getAiType());
break;
case "2010_13": //烟火识别
remoteBusinessAlertVo.setLabelCn(XingluoApiEnum.FIREWORKS.getTypeStr());
remoteBusinessAlertVo.setLabelEn(XingluoApiEnum.FIREWORKS.getAiType());
break;
case "2003_ext": //安全带预警 ------
remoteBusinessAlertVo.setLabelCn(XingluoApiEnum.SAFETY_HARNESS.getTypeStr());
remoteBusinessAlertVo.setLabelEn(XingluoApiEnum.SAFETY_HARNESS.getAiType());
break;
case "2004_ext"://安全帽预警 -----
remoteBusinessAlertVo.setLabelCn(XingluoApiEnum.SAFETY_HELMET.getTypeStr());
remoteBusinessAlertVo.setLabelEn(XingluoApiEnum.SAFETY_HELMET.getAiType());
break;
case "2010_24"://路面车辆计数
remoteBusinessAlertVo.setLabelCn(XingluoApiEnum.CARCOUNT.getTypeStr());
remoteBusinessAlertVo.setLabelEn(XingluoApiEnum.CARCOUNT.getAiType());
break;
case "2010_5"://多类型车辆计数
remoteBusinessAlertVo.setLabelCn(XingluoApiEnum.CARCOUNTMULTITYPE.getTypeStr());
remoteBusinessAlertVo.setLabelEn(XingluoApiEnum.CARCOUNTMULTITYPE.getAiType());
break;
case "2010_6"://多类型车辆拥堵聚集
remoteBusinessAlertVo.setLabelCn(XingluoApiEnum.CARMULTITYPEJAM.getTypeStr());
remoteBusinessAlertVo.setLabelEn(XingluoApiEnum.CARMULTITYPEJAM.getAiType());
break;
case "2010_29": //无人机安全帽检测 ------
remoteBusinessAlertVo.setLabelCn(XingluoApiEnum.SAFETY_HELMET_NEW.getTypeStr());//安全帽预警-新
remoteBusinessAlertVo.setLabelEn(XingluoApiEnum.SAFETY_HELMET_NEW.getAiType()); //SafetyHelmet
break;
}
}
public String saveAliyunPreviewToMinio(String aliyunUrl,String deviceSn, String minioBucket) {
try {
URL url = new URL(aliyunUrl);
URLConnection conn = url.openConnection();
conn.setConnectTimeout(3_500);
conn.setReadTimeout(3_500);
InputStream inputStream = conn.getInputStream();
long fileSize = conn.getContentLengthLong();
String fileName = FileUtil.getName(url.getPath());
String path = url.getPath().replace(fileName, deviceSn+ fileName); // eg: /ai/report/29847/{deviceSn+xxx.jpg}
String originalFileName = path.substring(path.lastIndexOf("/") + 1); // qwfbGaBixI.jpg
String suffix = originalFileName.contains(".") ? originalFileName.substring(originalFileName.lastIndexOf(".")) : ".jpg"; // fallback
// String newFileName = IdUtils.fastUUID() + suffix;
OssClient minioClient = OssFactory.instance(minioBucket);
UploadResult result = minioClient.upload(inputStream, path, fileSize, MimeTypeUtils.IMAGE_JPG);
// MinioUtil.uploadFile(path,inputStream,);
inputStream.close();
return path; // 返回 MinIO 的访问地址
} catch (IOException e) {
throw new RuntimeException("上传图片失败", e);
}
}
public String PostRequest( JSONObject jsonObj, String url, String token //通用提交
) { public String PostRequest( JSONObject jsonObj, String url, String token) {
try (CloseableHttpClient httpClient = HttpClients.createDefault()) { try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
// 1. 创建POST请求对象 // 1. 创建POST请求对象
HttpPost post = new HttpPost(url); HttpPost post = new HttpPost(url);
@ -301,8 +552,7 @@ public class SampleEngineRecordServiceImpl implements ISampleEngineRecordService
} }
public String GetRequest(URI uri, String token public String GetRequest(URI uri, String token) {
) {
try (CloseableHttpClient httpClient = HttpClients.createDefault()) { try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
// URI uri = new URIBuilder("https://api.example.com/data") // URI uri = new URIBuilder("https://api.example.com/data")
// .addParameter("param1", "value1") // .addParameter("param1", "value1")

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

@ -73,6 +73,11 @@ public class SysConfigController extends BaseController {
return R.ok("操作成功", configService.selectConfigByKey(configKey)); return R.ok("操作成功", configService.selectConfigByKey(configKey));
} }
@GetMapping(value = "/configKeyFeign/{configKey}")
public String getConfigKeyFeign(@PathVariable String configKey) {
return configService.selectConfigByKey(configKey);
}
/** /**
* 新增参数配置 * 新增参数配置
*/ */

12
dk-modules/system/src/main/java/org/dromara/system/controller/system/SysDictDataController.java

@ -14,12 +14,14 @@ import org.dromara.system.domain.bo.SysDictDataBo;
import org.dromara.system.domain.vo.SysDictDataVo; import org.dromara.system.domain.vo.SysDictDataVo;
import org.dromara.system.service.ISysDictDataService; import org.dromara.system.service.ISysDictDataService;
import org.dromara.system.service.ISysDictTypeService; import org.dromara.system.service.ISysDictTypeService;
import org.springframework.http.MediaType;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
/** /**
* 数据字典信息 * 数据字典信息
@ -80,6 +82,16 @@ public class SysDictDataController extends BaseController {
return R.ok(data); return R.ok(data);
} }
@PostMapping(value = "/selectDataByType")
public R<List<String>> selectDataByType(@RequestParam String dictType) {
List<SysDictDataVo> data = dictTypeService.selectDictDataByType(dictType);
List<String> collect = data.stream().map(SysDictDataVo::getRemark).collect(Collectors.toList());
if (ObjectUtil.isNull(data)) {
data = new ArrayList<>();
}
return R.ok(collect);
}
/** /**
* 新增字典类型 * 新增字典类型
*/ */

5
dk-modules/system/src/main/java/org/dromara/system/dubbo/RemoteConfigServiceImpl.java

@ -38,6 +38,11 @@ public class RemoteConfigServiceImpl implements RemoteConfigService {
return ip; return ip;
} }
@Override
public boolean selectXingluoAutoSubmit() {
return sysConfigService.selectXingluoAutoSubmit();
}
// @Override // @Override
// public List<String> selectStreamType(String deviceSn) { // public List<String> selectStreamType(String deviceSn) {
// List<String> list =sysConfigService.selectStreamType(deviceSn); // List<String> list =sysConfigService.selectStreamType(deviceSn);

2
dk-modules/system/src/main/java/org/dromara/system/service/ISysConfigService.java

@ -88,4 +88,6 @@ public interface ISysConfigService {
List<String> selectStreamType(String deviceSn); List<String> selectStreamType(String deviceSn);
boolean selectXingluoAutoSubmit();
} }

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

@ -2,6 +2,7 @@ package org.dromara.system.service.impl;
import cn.hutool.core.convert.Convert; import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@ -219,4 +220,13 @@ public class SysConfigServiceImpl implements ISysConfigService {
return collect; return collect;
} }
@Override
public boolean selectXingluoAutoSubmit() {
SysConfig sysConfig = baseMapper.selectOne(new LambdaQueryWrapper<SysConfig>().eq(SysConfig::getConfigKey, "xingluo.auto.submit"));
if(ObjectUtil.isNotNull(sysConfig) && ObjectUtil.isNotEmpty(sysConfig.getConfigValue())) {
return StrUtil.equals(sysConfig.getConfigValue(),"true");
}
return false;
}
} }

Loading…
Cancel
Save