diff --git a/dk-api/api-business/src/main/java/org/dromara/business/api/domain/RemoteBusinessAlertRequest.java b/dk-api/api-business/src/main/java/org/dromara/business/api/domain/RemoteBusinessAlertRequest.java new file mode 100644 index 0000000..81b8ae1 --- /dev/null +++ b/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 alertVoList; + private String activeProfile; + +} diff --git a/dk-api/api-system/src/main/java/org/dromara/system/api/RemoteConfigService.java b/dk-api/api-system/src/main/java/org/dromara/system/api/RemoteConfigService.java index dbf88c8..42e1dc6 100644 --- a/dk-api/api-system/src/main/java/org/dromara/system/api/RemoteConfigService.java +++ b/dk-api/api-system/src/main/java/org/dromara/system/api/RemoteConfigService.java @@ -23,6 +23,8 @@ public interface RemoteConfigService { */ String selectStreamIp(); + boolean selectXingluoAutoSubmit(); + // List selectStreamType(String deviceSn); } diff --git a/dk-common/common-cloudsdk/src/main/java/org/dromara/common/sdk/cloudapi/psdk/PsdkWidgetValue.java b/dk-common/common-cloudsdk/src/main/java/org/dromara/common/sdk/cloudapi/psdk/PsdkWidgetValue.java index 1de1384..c7f30a7 100644 --- a/dk-common/common-cloudsdk/src/main/java/org/dromara/common/sdk/cloudapi/psdk/PsdkWidgetValue.java +++ b/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; @JsonProperty("values") - private List values; + private List values; public PsdkWidgetValue() { } @@ -99,11 +99,11 @@ public class PsdkWidgetValue { return this; } - public List getValues() { + public List getValues() { return values; } - public PsdkWidgetValue setValues(List values) { + public PsdkWidgetValue setValues(List values) { this.values = values; return this; } diff --git a/dk-modules/business/src/main/java/org/dromara/business/controller/BusinessAlertController.java b/dk-modules/business/src/main/java/org/dromara/business/controller/BusinessAlertController.java index dcf8487..34f84ad 100644 --- a/dk-modules/business/src/main/java/org/dromara/business/controller/BusinessAlertController.java +++ b/dk-modules/business/src/main/java/org/dromara/business/controller/BusinessAlertController.java @@ -1,40 +1,31 @@ package org.dromara.business.controller; import cn.dev33.satoken.annotation.SaCheckPermission; -import cn.hutool.core.convert.Convert; -import cn.hutool.core.util.ObjectUtil; -import com.alibaba.fastjson.JSON; -import com.alibaba.nacos.client.utils.TenantUtil; +import cn.hutool.json.JSONObject; +import cn.hutool.json.JSONUtil; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; 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.bo.BusinessAlertBo; import org.dromara.business.domain.vo.BusinessAlertVo; 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.utils.DateUtils; import org.dromara.common.log.annotation.Log; import org.dromara.common.log.enums.BusinessType; import org.dromara.common.mybatis.core.page.PageQuery; 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.system.api.RemoteNoticeService; 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.domain.RemoteStartProcess; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.io.IOException; -import java.util.Date; import java.util.List; /** @@ -123,35 +114,10 @@ public class BusinessAlertController extends BaseController { @Operation(summary ="预警推送-实时预警模块专用",description = "预警推送-实时预警模块专用") @GetMapping("/pushAlert") 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)){ - 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)); + + businessAlertService.pushAlert(alertId,deptId,deptName); + + return R.ok(); } @@ -198,6 +164,15 @@ public class BusinessAlertController extends BaseController { businessAlertService.exportAlert(bo,response); } + @PostMapping("/saveBusinessAlert") +// public Boolean saveBusinessAlert(List 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实时流预警保存-用于演示") diff --git a/dk-modules/business/src/main/java/org/dromara/business/service/IBusinessAlertService.java b/dk-modules/business/src/main/java/org/dromara/business/service/IBusinessAlertService.java index e153936..1ef5e4a 100644 --- a/dk-modules/business/src/main/java/org/dromara/business/service/IBusinessAlertService.java +++ b/dk-modules/business/src/main/java/org/dromara/business/service/IBusinessAlertService.java @@ -106,4 +106,7 @@ public interface IBusinessAlertService { TableDataInfo listAiVerifyAlert(BusinessAlertVo vo,PageQuery pageQuery); void exportAlert(BusinessAlertBo bo, HttpServletResponse response) throws IOException; + + void pushAlert(Long alertId, String deptId, String deptName); + } diff --git a/dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessAlertServiceImpl.java b/dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessAlertServiceImpl.java index 53018e2..c796b5a 100644 --- a/dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessAlertServiceImpl.java +++ b/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.satoken.utils.LoginHelper; import org.dromara.resource.api.RemoteMessageService; -import org.dromara.system.api.RemoteLabelPostService; -import org.dromara.system.api.RemoteSubmailConfigService; -import org.dromara.system.api.RemoteUserService; +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.RemoteUserVo; import org.dromara.business.domain.BusinessAlertConstructInfoOss; @@ -122,6 +121,13 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService { @DubboReference private final RemoteMessageService remoteMessageService; + @DubboReference + private RemoteConfigService remoteConfigService; + + @DubboReference(timeout = 30000) + private RemoteNoticeService remoteNoticeService; + + /** * 新增预警任务 * @@ -217,16 +223,8 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService { List remoteUserVos = remoteUserService.selectUsersByDeptIds(deptIds); List userIds = remoteUserVos.stream().map(RemoteUserVo::getUserId).collect(Collectors.toList()); - JSONObject jsonObject = new JSONObject(); String imagePreviewUrl = MinioUntil.getObjectUrlOne(MinIOConstants.BUCKET_DKCY, alertVo.getImages(), 3600).toString(); - 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()); + JSONObject jsonObject = setupBusinessAlertSSEObj( alert, imagePreviewUrl); remoteMessageService.publishMessage(userIds, 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 预警任务 @@ -279,6 +291,22 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService { }).toList(); boolean b = this.baseMapper.insertBatch(businessAlerts); + + //推送消息-基于部门-找用户 发送json格式 --此时没有deptId,无效预警 + for (BusinessAlert alert : businessAlerts) { + if(ObjectUtil.isEmpty(alert.getDeptId())){ + continue; + } + ArrayList deptIds = new ArrayList<>(); + deptIds.add(Long.parseLong(alert.getDeptId())); + List remoteUserVos = remoteUserService.selectUsersByDeptIds(deptIds); + List 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 alertConstructInfoList = businessAlerts.stream().map(alert -> { BusinessAlertConstructInfoVo alertConstructInfoVo = alert.getAlertConstructInfoVo(); BusinessAlertConstructInfo businessAlertConstructInfo = new BusinessAlertConstructInfo(); @@ -288,6 +316,19 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService { }).collect(Collectors.toList()); 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; } @@ -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) { diff --git a/dk-modules/sample/src/main/java/org/dromara/sample/feign/RemoteBusinessAlertFeign.java b/dk-modules/sample/src/main/java/org/dromara/sample/feign/RemoteBusinessAlertFeign.java new file mode 100644 index 0000000..863090d --- /dev/null +++ b/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 saveBusinessAlert(@RequestBody RemoteBusinessAlertRequest requestObj); + public R saveBusinessAlert(@RequestBody JSONObject requestObj); +} diff --git a/dk-modules/sample/src/main/java/org/dromara/sample/feign/RemoteConfigFeign.java b/dk-modules/sample/src/main/java/org/dromara/sample/feign/RemoteConfigFeign.java new file mode 100644 index 0000000..c23cc2a --- /dev/null +++ b/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); + + +} diff --git a/dk-modules/sample/src/main/java/org/dromara/sample/manage/config/XingluoApiEnum.java b/dk-modules/sample/src/main/java/org/dromara/sample/manage/config/XingluoApiEnum.java index ceba707..b6e37cc 100644 --- a/dk-modules/sample/src/main/java/org/dromara/sample/manage/config/XingluoApiEnum.java +++ b/dk-modules/sample/src/main/java/org/dromara/sample/manage/config/XingluoApiEnum.java @@ -1,9 +1,21 @@ package org.dromara.sample.manage.config; 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_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","安全帽"); diff --git a/dk-modules/sample/src/main/java/org/dromara/sample/manage/config/xingluoApiType.json b/dk-modules/sample/src/main/java/org/dromara/sample/manage/config/xingluoApiType.json index 5adc08d..149fc3e 100644 --- a/dk-modules/sample/src/main/java/org/dromara/sample/manage/config/xingluoApiType.json +++ b/dk-modules/sample/src/main/java/org/dromara/sample/manage/config/xingluoApiType.json @@ -6,11 +6,11 @@ "id": 2022, "sence": "可见光", "type": "秸秆焚烧(烟、火、焚后痕迹)", + "extra_type": "2010_12", "model": "01", + "user": "xuzhou_ai", "difficult": 0, - "extra_type": "2010_12", "if_open": 1, - "user": "xuzhou_ai", "sence_id": 2022, "conf": 0.7, "aiConfig": 0 @@ -19,11 +19,11 @@ "id": 2023, "sence": "可见光", "type": "烟火识别", + "extra_type": "2010_13", "model": "01", + "user": "xuzhou_ai", "difficult": 0, - "extra_type": "2010_13", "if_open": 1, - "user": "xuzhou_ai", "sence_id": 2023, "conf": 0.7, "aiConfig": 0 @@ -32,11 +32,11 @@ "id": 2003, "sence": "可见光", "type": "是否佩戴安全绳", + "extra_type": "2003_ext", "model": "01", + "user": "xuzhou_ai", "difficult": 0, - "extra_type": "2003_ext", "if_open": 1, - "user": "xuzhou_ai", "sence_id": 2003, "conf": 0.7, "aiConfig": 0 @@ -45,11 +45,11 @@ "id": 2004, "sence": "可见光", "type": "是否佩戴安全帽", + "extra_type": "2004_ext", "model": "01", + "user": "xuzhou_ai", "difficult": 0, - "extra_type": "2004_ext", "if_open": 1, - "user": "xuzhou_ai", "sence_id": 2004, "conf": 0.7, "aiConfig": 1 @@ -58,11 +58,11 @@ "id": 2034, "sence": "可见光", "type": "路面车辆计数", + "extra_type": "2010_24", "model": "01", + "user": "xuzhou_ai", "difficult": 0, - "extra_type": "2010_24", "if_open": 1, - "user": "xuzhou_ai", "sence_id": 2034, "conf": 0.7, "aiConfig": 0 @@ -71,11 +71,11 @@ "id": 2015, "sence": "可见光", "type": "多类型车辆计数", + "extra_type": "2010_5", "model": "01", + "user": "xuzhou_ai", "difficult": 0, - "extra_type": "2010_5", "if_open": 1, - "user": "xuzhou_ai", "sence_id": 2015, "conf": 0.7, "aiConfig": 0 @@ -84,11 +84,11 @@ "id": 2016, "sence": "可见光", "type": "多类型车辆拥堵聚集", + "extra_type": "2010_6", "model": "01", + "user": "xuzhou_ai", "difficult": 0, - "extra_type": "2010_6", "if_open": 1, - "user": "xuzhou_ai", "sence_id": 2016, "conf": 0.7, "aiConfig": 0 @@ -97,11 +97,11 @@ "id": 2039, "sence": "可见光", "type": "无人机安全帽检测", + "extra_type": "2010_29", "model": "01", + "user": "xuzhou_ai", "difficult": 0, - "extra_type": "2010_29", "if_open": 1, - "user": "xuzhou_ai", "sence_id": 2039, "conf": 0.7, "aiConfig": 0 diff --git a/dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/SampleEngineRecordController.java b/dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/SampleEngineRecordController.java index 148d409..dc809ab 100644 --- a/dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/SampleEngineRecordController.java +++ b/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.factory.OssFactory; 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.mapper.ITaskJobMapper; import org.dromara.sample.manage.model.dto.CallBackDTO; import org.dromara.sample.manage.model.dto.DeviceDTO; 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.WarningRecordEntity; import org.dromara.sample.manage.service.IDeviceService; @@ -47,13 +49,14 @@ import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.stream.Collectors; /** * @author sean.zhou * @version 0.1 * @date 2021/11/15 */ -@RequiredArgsConstructor +//@RequiredArgsConstructor @RestController @Slf4j @RequestMapping("${url.manage.prefix}${url.manage.version}/saEngineRecord") @@ -63,17 +66,11 @@ public class SampleEngineRecordController { @Autowired private ISampleEngineRecordService sampleEngineRecordService; - @Autowired - private ISampleWarningRecordService sampleWarningRecordService; - @Autowired private IDeviceService deviceService; - - @DubboReference - private final RemoteBusinessAlertService businessAlertService; - @Autowired - private final IWaylineJobMapper waylineJobMapper; + private RemoteSystemFeign remoteSystemFeign; + /** * 获取场景算法 @@ -104,141 +101,23 @@ public class SampleEngineRecordController { return HttpResultResponse.success(); } - @Resource - ITaskJobMapper taskJobMapper; +// @Resource +// 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") @Operation(summary = "存储推流的预警(对外接口)。", description = "存储推流的预警(对外接口)。") // public void some(@RequestBody CallBackDTO callBackVo){ 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 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 alertVoList = new ArrayList<>(); - - for (WarningRecordEntity warningRecordEntity : warningRecordList) { - RemoteBusinessAlertVo remoteBusinessAlertVo = new RemoteBusinessAlertVo(); - String deviceSn = ""; - if(null != warningRecordEntity.getTaskId()){ - LambdaQueryWrapper 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 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 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"); - } - - //预警基础信息扩展 -// 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; - } + Integer insertCount = sampleEngineRecordService.dealAlertData(resObject); } - 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); - } - } - } diff --git a/dk-modules/sample/src/main/java/org/dromara/sample/manage/model/entity/WarningRecordEntity.java b/dk-modules/sample/src/main/java/org/dromara/sample/manage/model/entity/WarningRecordEntity.java index e291833..3d0577e 100644 --- a/dk-modules/sample/src/main/java/org/dromara/sample/manage/model/entity/WarningRecordEntity.java +++ b/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) @Accessors(chain = true) public class WarningRecordEntity implements Serializable { - private static final long serialVersionUID = 1L; @TableId(type = IdType.AUTO) private String id; @@ -45,4 +44,11 @@ public class WarningRecordEntity implements Serializable { @TableField(fill = FieldFill.INSERT) private Date createTime; + @TableField(value = "track_ids") + private String trackIds; + + + @TableField(value = "remark") + private String remark; + } diff --git a/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/ISampleEngineRecordService.java b/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/ISampleEngineRecordService.java index fa05a3b..b65480d 100644 --- a/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/ISampleEngineRecordService.java +++ b/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/ISampleEngineRecordService.java @@ -1,5 +1,7 @@ package org.dromara.sample.manage.service; +import cn.hutool.json.JSONObject; + import java.util.Map; public interface ISampleEngineRecordService { @@ -8,4 +10,6 @@ public interface ISampleEngineRecordService { void closeEngine(Map objectMap); Map extractType(Map objectMap); + + Integer dealAlertData(JSONObject resObject); } diff --git a/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/SampleEngineRecordServiceImpl.java b/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/SampleEngineRecordServiceImpl.java index 5c3e104..69d3850 100644 --- a/dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/SampleEngineRecordServiceImpl.java +++ b/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; +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.util.ObjectUtil; 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.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import io.seata.common.util.StringUtils; +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.HttpGet; 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.HttpClients; 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.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.mapper.IDeviceMapper; +import org.dromara.sample.manage.config.XingluoApiEnum; import org.dromara.sample.manage.mapper.ISampleEngineRecordMapper; 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.entity.EngineRecordEntity; 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.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.JSONObject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; 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.URISyntaxException; +import java.net.URL; +import java.net.URLConnection; import java.util.*; +import java.util.stream.Collectors; import static org.apache.commons.compress.utils.ArchiveUtils.sanitize; +@RequiredArgsConstructor @Service @Slf4j @Transactional @@ -50,14 +75,32 @@ public class SampleEngineRecordServiceImpl implements ISampleEngineRecordService @Resource ITaskJobMapper taskJobMapper; + @Resource + SampleWarningRecordMapper sampleWarningRecordMapper; + @Autowired private XingluoApiConfig xingluoApiConfig; @Autowired private IDeviceService deviceService; - @DubboReference - private RemoteConfigService remoteConfigService; +// @Autowired +// private ISampleWarningRecordService sampleWarningRecordService; + +// @Autowired + private final IWaylineJobMapper waylineJobMapper; + + @Resource + private RemoteConfigFeign remoteConfigFeign; + + @Resource + private RemoteSystemFeign remoteSystemFeign; + + + @Resource + private RemoteBusinessAlertFeign remoteBusinessAlertFeign; + + @Override public Map extractType(Map objectMap) { @@ -103,7 +146,8 @@ public class SampleEngineRecordServiceImpl implements ISampleEngineRecordService 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 response = mapper.readValue(algorithmResponseBody,ExtraTypeResponse.class); - System.out.println(response); + + System.out.println(JSONUtil.toJsonStr(response)); List list = response.getData(); for (ExtraType extraType : list) { extra_type_list.add(extraType.getExtra_type()); @@ -119,8 +163,14 @@ public class SampleEngineRecordServiceImpl implements ISampleEngineRecordService @Override public Map startEngine(Map objectMap){ + System.out.println("objectMap" + objectMap); +// String configKey = remoteSystemFeign.getConfigKey("xingluo.auto.submit");//通 +// System.out.println("configKey"+configKey); 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) JSONObject jsonObj = new JSONObject(); jsonObj.put("username", sanitize("xuzhou_ai")); // sanitize函数见下文 @@ -146,6 +196,7 @@ public class SampleEngineRecordServiceImpl implements ISampleEngineRecordService //查询用户开通的场景 Object rtmpUrlParam = objectMap.get("rtmpUrl"); + String pushUrl = "rtmp://" + ip + "/live/livesteam/" + rtmpUrl + "ai1"; if (StringUtils.isNotEmpty(token)){ JSONObject jsonObj2 = new JSONObject(); 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("input_url","http://"+ip+":19008/live/livesteam/"+objectMap.get("rtmpUrl")+".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服务 +// live.setUrl(url.toString().replace("rtmp", "webrtc")); // 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} @@ -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":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" + System.out.println(responseBody2); ObjectMapper mapper1 = new ObjectMapper(); EngineResponse response = null; try { @@ -194,12 +253,17 @@ public class SampleEngineRecordServiceImpl implements ISampleEngineRecordService engineRecordMapper.insert(record); Map 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") //添加任务id和jobid关联关系 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.setDeviceSn(deviceSn); 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 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 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 alertVoList = new ArrayList<>(); + + for (WarningRecordEntity warningRecordEntity : warningRecordList) { + RemoteBusinessAlertVo remoteBusinessAlertVo = new RemoteBusinessAlertVo(); + if(ObjectUtil.isEmpty(warningRecordEntity.getTaskId())){ continue;} //空数据跳过 + + setupLabelInfo(warningRecordEntity, remoteBusinessAlertVo);//设置标签信息 + + //查找最新任务TaskJob + LambdaQueryWrapper 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 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 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()) { // 1. 创建POST请求对象 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()) { // URI uri = new URIBuilder("https://api.example.com/data") // .addParameter("param1", "value1") diff --git a/dk-modules/system/src/main/java/org/dromara/system/controller/system/SysConfigController.java b/dk-modules/system/src/main/java/org/dromara/system/controller/system/SysConfigController.java index 58c66dd..abd524d 100644 --- a/dk-modules/system/src/main/java/org/dromara/system/controller/system/SysConfigController.java +++ b/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)); } + @GetMapping(value = "/configKeyFeign/{configKey}") + public String getConfigKeyFeign(@PathVariable String configKey) { + return configService.selectConfigByKey(configKey); + } + /** * 新增参数配置 */ diff --git a/dk-modules/system/src/main/java/org/dromara/system/controller/system/SysDictDataController.java b/dk-modules/system/src/main/java/org/dromara/system/controller/system/SysDictDataController.java index 917d993..2bf1f4b 100644 --- a/dk-modules/system/src/main/java/org/dromara/system/controller/system/SysDictDataController.java +++ b/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.service.ISysDictDataService; import org.dromara.system.service.ISysDictTypeService; +import org.springframework.http.MediaType; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import jakarta.servlet.http.HttpServletResponse; import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; /** * 数据字典信息 @@ -80,6 +82,16 @@ public class SysDictDataController extends BaseController { return R.ok(data); } + @PostMapping(value = "/selectDataByType") + public R> selectDataByType(@RequestParam String dictType) { + List data = dictTypeService.selectDictDataByType(dictType); + List collect = data.stream().map(SysDictDataVo::getRemark).collect(Collectors.toList()); + if (ObjectUtil.isNull(data)) { + data = new ArrayList<>(); + } + return R.ok(collect); + } + /** * 新增字典类型 */ diff --git a/dk-modules/system/src/main/java/org/dromara/system/dubbo/RemoteConfigServiceImpl.java b/dk-modules/system/src/main/java/org/dromara/system/dubbo/RemoteConfigServiceImpl.java index e82b872..8ba79cc 100644 --- a/dk-modules/system/src/main/java/org/dromara/system/dubbo/RemoteConfigServiceImpl.java +++ b/dk-modules/system/src/main/java/org/dromara/system/dubbo/RemoteConfigServiceImpl.java @@ -38,6 +38,11 @@ public class RemoteConfigServiceImpl implements RemoteConfigService { return ip; } + @Override + public boolean selectXingluoAutoSubmit() { + return sysConfigService.selectXingluoAutoSubmit(); + } + // @Override // public List selectStreamType(String deviceSn) { // List list =sysConfigService.selectStreamType(deviceSn); diff --git a/dk-modules/system/src/main/java/org/dromara/system/service/ISysConfigService.java b/dk-modules/system/src/main/java/org/dromara/system/service/ISysConfigService.java index 981170b..5c7cee9 100644 --- a/dk-modules/system/src/main/java/org/dromara/system/service/ISysConfigService.java +++ b/dk-modules/system/src/main/java/org/dromara/system/service/ISysConfigService.java @@ -88,4 +88,6 @@ public interface ISysConfigService { List selectStreamType(String deviceSn); + boolean selectXingluoAutoSubmit(); + } diff --git a/dk-modules/system/src/main/java/org/dromara/system/service/impl/SysConfigServiceImpl.java b/dk-modules/system/src/main/java/org/dromara/system/service/impl/SysConfigServiceImpl.java index e99a3d1..c6f0b78 100644 --- a/dk-modules/system/src/main/java/org/dromara/system/service/impl/SysConfigServiceImpl.java +++ b/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.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; @@ -219,4 +220,13 @@ public class SysConfigServiceImpl implements ISysConfigService { return collect; } + @Override + public boolean selectXingluoAutoSubmit() { + SysConfig sysConfig = baseMapper.selectOne(new LambdaQueryWrapper().eq(SysConfig::getConfigKey, "xingluo.auto.submit")); + if(ObjectUtil.isNotNull(sysConfig) && ObjectUtil.isNotEmpty(sysConfig.getConfigValue())) { + return StrUtil.equals(sysConfig.getConfigValue(),"true"); + } + return false; + } + }