Browse Source

星逻算法-调用安全帽识别-保存数据

pull/7/head
时子升 4 weeks ago
parent
commit
7e301851c7
  1. 2
      dk-modules/business/src/main/java/org/dromara/business/domain/BusinessAlertConstructInfo.java
  2. 60
      dk-modules/business/src/main/java/org/dromara/business/service/impl/BusinessAlertServiceImpl.java
  3. 32
      dk-modules/sample/src/main/java/org/dromara/sample/manage/config/XingluoApiConfig.java
  4. 68
      dk-modules/sample/src/main/java/org/dromara/sample/manage/config/XingluoApiEnum.java
  5. 83
      dk-modules/sample/src/main/java/org/dromara/sample/manage/config/xingluoApiType.json
  6. 172
      dk-modules/sample/src/main/java/org/dromara/sample/manage/controller/SampleEngineRecordController.java
  7. 17
      dk-modules/sample/src/main/java/org/dromara/sample/manage/model/entity/EngineRecordEntity.java
  8. 5
      dk-modules/sample/src/main/java/org/dromara/sample/manage/model/entity/TaskJobEntity.java
  9. 9
      dk-modules/sample/src/main/java/org/dromara/sample/manage/model/entity/WarningRecordEntity.java
  10. 6
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/EngineRecordServiceImpl.java
  11. 146
      dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/SampleEngineRecordServiceImpl.java

2
dk-modules/business/src/main/java/org/dromara/business/domain/BusinessAlertConstructInfo.java

@ -22,7 +22,7 @@ public class BusinessAlertConstructInfo extends TenantEntity {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
/** /**
* *
*/ */
@TableId(value = "id") @TableId(value = "id")
private Long id; private Long id;

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

@ -1,7 +1,9 @@
package org.dromara.business.service.impl; package org.dromara.business.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.collection.ListUtil; import cn.hutool.core.collection.ListUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@ -18,6 +20,7 @@ import org.dromara.business.api.domain.vo.RemoteBusinessAlertConstructInfo;
import org.dromara.business.api.domain.vo.RemoteBusinessAlertVo; import org.dromara.business.api.domain.vo.RemoteBusinessAlertVo;
import org.dromara.business.config.ProjectTablePrefixConfig; import org.dromara.business.config.ProjectTablePrefixConfig;
import org.dromara.business.domain.BusinessAlert; import org.dromara.business.domain.BusinessAlert;
import org.dromara.business.domain.BusinessAlertConstructInfo;
import org.dromara.business.domain.bo.BusinessAlertBo; import org.dromara.business.domain.bo.BusinessAlertBo;
import org.dromara.business.domain.vo.BusinessAlertConstructInfoVo; import org.dromara.business.domain.vo.BusinessAlertConstructInfoVo;
import org.dromara.business.domain.vo.BusinessAlertVo; import org.dromara.business.domain.vo.BusinessAlertVo;
@ -181,9 +184,11 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService {
alert.setCreateTime(new Date()); alert.setCreateTime(new Date());
alert.setHandleType(BusinessStatusEnum.VERIFY.getStatus()); alert.setHandleType(BusinessStatusEnum.VERIFY.getStatus());
RemoteBusinessAlertConstructInfo remoteAlertConstructInfo = alert.getRemoteAlertConstructInfo(); RemoteBusinessAlertConstructInfo remoteAlertConstructInfo = alert.getRemoteAlertConstructInfo();
BusinessAlertConstructInfoVo alertConstructInfoVo = new BusinessAlertConstructInfoVo(); if(BeanUtil.isNotEmpty(remoteAlertConstructInfo)){
BeanUtils.copyProperties(alert.getRemoteAlertConstructInfo(), alertConstructInfoVo); BusinessAlertConstructInfoVo alertConstructInfoVo = new BusinessAlertConstructInfoVo();
businessAlert.setAlertConstructInfoVo(alertConstructInfoVo); BeanUtils.copyProperties(remoteAlertConstructInfo, alertConstructInfoVo);
businessAlert.setAlertConstructInfoVo(alertConstructInfoVo);
}
BeanUtils.copyProperties(alert, businessAlert); BeanUtils.copyProperties(alert, businessAlert);
if(!StrUtil.equals("default", activeProfile)){ if(!StrUtil.equals("default", activeProfile)){
businessAlert.setBusinessType(2); businessAlert.setBusinessType(2);
@ -291,6 +296,8 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService {
} }
Page<BusinessAlert> page = this.baseMapper.pageBusinessAlert(pageQuery.build(), wrapper, ptPrefix); Page<BusinessAlert> page = this.baseMapper.pageBusinessAlert(pageQuery.build(), wrapper, ptPrefix);
//拼接-预警扩展施工信息
setupConstructInfo(page.getRecords(), page);
try {//预警管理查询图片 try {//预警管理查询图片
page.getRecords().forEach(businessAlertVo->{ page.getRecords().forEach(businessAlertVo->{
@ -329,6 +336,8 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService {
Page<BusinessAlert> page = this.baseMapper.pageBusinessAlertCancel(pageQuery.build(), wrapper, ptPrefix); Page<BusinessAlert> page = this.baseMapper.pageBusinessAlertCancel(pageQuery.build(), wrapper, ptPrefix);
//拼接-预警扩展施工信息
setupConstructInfo(page.getRecords(), page);
try { try {
page.getRecords().forEach(businessAlertVo->{ page.getRecords().forEach(businessAlertVo->{
if (businessAlertVo.getBusinessType() == 2){ if (businessAlertVo.getBusinessType() == 2){
@ -367,6 +376,9 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService {
Page<BusinessAlert> page = this.baseMapper.pageBusinessAlertFinish(pageQuery.build(), wrapper, ptPrefix); Page<BusinessAlert> page = this.baseMapper.pageBusinessAlertFinish(pageQuery.build(), wrapper, ptPrefix);
//拼接-预警扩展施工信息
setupConstructInfo(page.getRecords(), page);
try { try {
page.getRecords().forEach(businessAlertVo->{ page.getRecords().forEach(businessAlertVo->{
if (businessAlertVo.getBusinessType() == 2){ if (businessAlertVo.getBusinessType() == 2){
@ -418,6 +430,9 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService {
}); });
} }
//拼接-预警扩展施工信息
setupConstructInfo(records, page);
try { try {
page.getRecords().forEach(businessAlertVo->{ page.getRecords().forEach(businessAlertVo->{
if (businessAlertVo.getBusinessType() == 2){ if (businessAlertVo.getBusinessType() == 2){
@ -452,6 +467,9 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService {
Page<BusinessAlert> page = this.baseMapper.pageBusinessAlertHandle(pageQuery.build(), wrapper, ptPrefix); Page<BusinessAlert> page = this.baseMapper.pageBusinessAlertHandle(pageQuery.build(), wrapper, ptPrefix);
//拼接-预警扩展施工信息
setupConstructInfo(page.getRecords(), page);
try { try {
page.getRecords().forEach(businessAlertVo->{ page.getRecords().forEach(businessAlertVo->{
businessAlertVo.setHandleType(null); businessAlertVo.setHandleType(null);
@ -471,6 +489,21 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService {
return TableDataInfo.build(page); return TableDataInfo.build(page);
} }
private void setupConstructInfo(List<BusinessAlert> records, Page<BusinessAlert> page) {
List<Long> alertIds = records.stream().map(BusinessAlert::getId).collect(Collectors.toList());
if(alertIds.isEmpty()){
return;
}
LambdaQueryWrapper<BusinessAlertConstructInfo> qw = new LambdaQueryWrapper<BusinessAlertConstructInfo>();
qw.in(BusinessAlertConstructInfo::getBusinessAlertId, alertIds);
List<BusinessAlertConstructInfoVo> constructInfoVoList = businessAlertConstructInfoMapper.selectVoList(qw,BusinessAlertConstructInfoVo.class);
for (BusinessAlert record : page.getRecords()) {
BusinessAlertConstructInfoVo businessAlertConstructInfoVo = constructInfoVoList.stream().filter(item -> item.getBusinessAlertId().equals(record.getId())).findFirst().orElse(null);
record.setAlertConstructInfoVo(businessAlertConstructInfoVo);
}
}
/** /**
* 构建wrapper * 构建wrapper
@ -914,8 +947,20 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService {
LambdaUpdateWrapper<BusinessAlert> wrapper = new LambdaUpdateWrapper<>(); LambdaUpdateWrapper<BusinessAlert> wrapper = new LambdaUpdateWrapper<>();
wrapper.eq(BusinessAlert::getHandleType,BusinessStatusEnum.VERIFY.getStatus()); wrapper.eq(BusinessAlert::getHandleType,BusinessStatusEnum.VERIFY.getStatus());
wrapper.in(BusinessAlert::getId, alertIdList); wrapper.in(BusinessAlert::getId, alertIdList);
List<BusinessAlert> businessAlerts = this.baseMapper.selectList(wrapper);
// 删除文件 - 仅处理ai识别文件删除
for (BusinessAlert businessAlert : businessAlerts) {
if(businessAlert.getBusinessType().equals(2)){
try {
MinioUtil.deleteFile(businessAlert.getImages(), MinIOConstants.BUCKET_DKCY);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
return this.baseMapper.delete(wrapper) > 0; boolean b = this.baseMapper.delete(wrapper) > 0;
return b;
} }
@Override @Override
@ -1019,6 +1064,13 @@ public class BusinessAlertServiceImpl implements IBusinessAlertService {
List<BusinessAlert> businessAlerts = this.baseMapper.listTodoAlert(wrapper, ptPrefix); List<BusinessAlert> businessAlerts = this.baseMapper.listTodoAlert(wrapper, ptPrefix);
BusinessAlert businessAlert = businessAlerts.stream().filter(p -> p.getId().equals(alertId)).findFirst().get(); BusinessAlert businessAlert = businessAlerts.stream().filter(p -> p.getId().equals(alertId)).findFirst().get();
//拼接-预警扩展施工信息
QueryWrapper<BusinessAlertConstructInfo> qw = new QueryWrapper<BusinessAlertConstructInfo>();
qw.eq("business_alert_id", businessAlert.getId());
List<BusinessAlertConstructInfoVo> constructInfoVoList = businessAlertConstructInfoMapper.selectVoList(qw);
if(!constructInfoVoList.isEmpty()){
businessAlert.setAlertConstructInfoVo(constructInfoVoList.getFirst());
}
try { try {
if (businessAlert.getBusinessType() == 2){ if (businessAlert.getBusinessType() == 2){

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

@ -0,0 +1,32 @@
package org.dromara.sample.manage.config;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.StrUtil;
import io.minio.*;
import io.minio.http.Method;
import lombok.Data;
import lombok.Getter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
import java.io.InputStream;
import java.util.HashMap;
@Data
@Component
@ConfigurationProperties(prefix="xingluoapi")
public class XingluoApiConfig {
@Value("${xingluoapi.engineLogin:http://60.204.247.65:8100/Third/Login}")
private String engineLogin;
@Value("${xingluoapi.engineCallbackUrl:http://121.237.178.63:11100/sample/manage/api/v1/saEngineRecord/some}")
private String engineCallbackUrl;
@Value("${xingluoapi.engineStart:http://60.204.247.65:8100/Third/Engine/Start}")
private String engineStart;
@Value("${xingluoapi.engineStop:http://60.204.247.65:8100/Third/Engine/Stop}")
private String engineStop;
}

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

@ -0,0 +1,68 @@
package org.dromara.sample.manage.config;
public enum XingluoApiEnum {
SAFETY_HELMET(2004, "可见光","是否佩戴安全帽","安全帽预警","2004_ext",2004, 1899717400907046939l,"SafetyHelmet","安全帽"),
SAFETY_HARNESS(2003, "可见光","是否佩戴安全绳","安全绳预警","2003_ext",2003, 1899717400907046940l,"SafetyHarness","安全带");
private final Integer id;
private final String sence;
private final String type;
private final String typeStr; //类型描述
private final String extraType;
private final Integer senceId;
private final Long aiLabelId; //ailabel对照数据
private final String aiType;
private final String aiName;
XingluoApiEnum(Integer id, String sence, String type, String typeStr, String extraType, Integer senceId, Long aiLabelId,String aiType, String aiName) {
this.id = id;
this.sence = sence;
this.type = type;
this.typeStr = typeStr;
this.extraType = extraType;
this.senceId = senceId;
this.aiLabelId = aiLabelId;
this.aiType = aiType;
this.aiName = aiName;
}
public Integer getId() {
return id;
}
public String getSence() {
return sence;
}
public String getType() {
return type;
}
public String getTypeStr() {
return typeStr;
}
public String getExtraType() {
return extraType;
}
public Integer getSenceId() {
return senceId;
}
public Long getAiLabelId() {
return aiLabelId;
}
public String getAiType() {
return aiType;
}
public String getAiName() {
return aiName;
}
}

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

@ -0,0 +1,83 @@
{
"code": 200,
"message": "操作成功",
"data": [
{
"id": 2022,
"sence": "可见光",
"type": "秸秆焚烧(烟、火、焚后痕迹)",
"model": "01",
"difficult": 0,
"extra_type": "2010_12",
"if_open": 1,
"user": "xuzhou_ai",
"sence_id": 2022,
"conf": 0.7,
"aiConfig": 0
},
{
"id": 2023,
"sence": "可见光",
"type": "烟火识别",
"model": "01",
"difficult": 0,
"extra_type": "2010_13",
"if_open": 1,
"user": "xuzhou_ai",
"sence_id": 2023,
"conf": 0.7,
"aiConfig": 0
},
{
"id": 2003,
"sence": "可见光",
"type": "是否佩戴安全绳",
"model": "01",
"difficult": 0,
"extra_type": "2003_ext",
"if_open": 1,
"user": "xuzhou_ai",
"sence_id": 2003,
"conf": 0.7,
"aiConfig": 0
},
{
"id": 2004,
"sence": "可见光",
"type": "是否佩戴安全帽",
"model": "01",
"difficult": 0,
"extra_type": "2004_ext",
"if_open": 1,
"user": "xuzhou_ai",
"sence_id": 2004,
"conf": 0.7,
"aiConfig": 0
},
{
"id": 2034,
"sence": "可见光",
"type": "路面车辆计数",
"model": "01",
"difficult": 0,
"extra_type": "2010_24",
"if_open": 1,
"user": "xuzhou_ai",
"sence_id": 2034,
"conf": 0.7,
"aiConfig": 0
},
{
"id": 2015,
"sence": "可见光",
"type": "多类型车辆计数",
"model": "01",
"difficult": 0,
"extra_type": "2010_5",
"if_open": 1,
"user": "xuzhou_ai",
"sence_id": 2015,
"conf": 0.7
}
]
}

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

@ -1,30 +1,59 @@
package org.dromara.sample.manage.controller; package org.dromara.sample.manage.controller;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.alibaba.nacos.common.utils.CollectionUtils; import com.alibaba.nacos.common.utils.CollectionUtils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
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 lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference;
import org.dromara.business.api.RemoteBusinessAlertService;
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.common.sdk.common.HttpResultResponse; import org.dromara.common.sdk.common.HttpResultResponse;
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.CallBackDTO;
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.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.ISampleEngineRecordService; import org.dromara.sample.manage.service.ISampleEngineRecordService;
import org.dromara.sample.manage.service.ISampleWarningRecordService; import org.dromara.sample.manage.service.ISampleWarningRecordService;
import org.dromara.sample.media.constant.MinIOConstants;
import org.dromara.sample.wayline.mapper.IWaylineJobMapper;
import org.dromara.sample.wayline.model.entity.WaylineJobEntity;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Optional;
/** /**
* @author sean.zhou * @author sean.zhou
* @version 0.1 * @version 0.1
* @date 2021/11/15 * @date 2021/11/15
*/ */
@RequiredArgsConstructor
@RestController @RestController
@Slf4j @Slf4j
@RequestMapping("${url.manage.prefix}${url.manage.version}/saEngineRecord") @RequestMapping("${url.manage.prefix}${url.manage.version}/saEngineRecord")
@ -37,6 +66,16 @@ public class SampleEngineRecordController {
@Autowired @Autowired
private ISampleWarningRecordService sampleWarningRecordService; private ISampleWarningRecordService sampleWarningRecordService;
@Autowired
private IDeviceService deviceService;
@DubboReference
private final RemoteBusinessAlertService businessAlertService;
@Autowired
private final IWaylineJobMapper waylineJobMapper;
/** /**
* 启动星罗引擎 * 启动星罗引擎
* Get the topology list of all online devices in one workspace. * Get the topology list of all online devices in one workspace.
@ -55,23 +94,142 @@ public class SampleEngineRecordController {
return HttpResultResponse.success(); return HttpResultResponse.success();
} }
@Resource
ITaskJobMapper taskJobMapper;
@PostMapping("/some") @PostMapping("/some")
@Operation(summary = "存储推流的预警(对外接口)。", description = "存储推流的预警(对外接口)。") @Operation(summary = "存储推流的预警(对外接口)。", description = "存储推流的预警(对外接口)。")
public void some(@RequestBody CallBackDTO callBackVo){ // public void some(@RequestBody CallBackDTO callBackVo){
WarningRecordEntity warningRecord = new WarningRecordEntity(); public void some(@RequestBody JSONObject resObject){
List<WarningRecordEntity> list = new ArrayList<>(); 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())){ if (CollectionUtils.isNotEmpty(callBackVo.getEvents())){
for (EventsDTO eventsVo :callBackVo.getEvents()){ for (EventsDTO eventsVo :callBackVo.getEvents()){ //一个事件一个图片
WarningRecordEntity warningRecord = new WarningRecordEntity();
warningRecord.setTaskId(callBackVo.getTaskId()); warningRecord.setTaskId(callBackVo.getTaskId());
warningRecord.setAlgoId(eventsVo.getAlgoId()); warningRecord.setAlgoId(eventsVo.getAlgoId());
warningRecord.setEventId(eventsVo.getEventId()); warningRecord.setEventId(eventsVo.getEventId());
warningRecord.setExtraType(eventsVo.getExtraType()); warningRecord.setExtraType(eventsVo.getExtraType());
warningRecord.setPicUrl(eventsVo.getPicUrl()); warningRecord.setPicUrl(eventsVo.getPicUrl());
// warningRecord.setPicUrl("http://114.235.183.147:9090/api/v1/download-shared-object/aHR0cDovLzEyNy4wLjAuMTo5MDAwL2RrY3kvbWVkaWFmaWxlL2U1YjhjZTNhLTM1NjItNDBlMC1iMjQ0LTkxNTU0ZDljMTdhZC9ESklfMjAyNTA1MjExMzIzXzAwMV9lNWI4Y2UzYS0zNTYyLTQwZTAtYjI0NC05MTU1NGQ5YzE3YWQvREpJXzIwMjUwNTIxMTMyNjEwXzAwMDFfVi5qcGVnP1gtQW16LUFsZ29yaXRobT1BV1M0LUhNQUMtU0hBMjU2JlgtQW16LUNyZWRlbnRpYWw9QVI5MEk5QkxXWVZBWkRLOUowVjElMkYyMDI1MDUyMiUyRnVzLWVhc3QtMSUyRnMzJTJGYXdzNF9yZXF1ZXN0JlgtQW16LURhdGU9MjAyNTA1MjJUMTUxNzAxWiZYLUFtei1FeHBpcmVzPTQzMjAwJlgtQW16LVNlY3VyaXR5LVRva2VuPWV5SmhiR2NpT2lKSVV6VXhNaUlzSW5SNWNDSTZJa3BYVkNKOS5leUpoWTJObGMzTkxaWGtpT2lKQlVqa3dTVGxDVEZkWlZrRmFSRXM1U2pCV01TSXNJbVY0Y0NJNk1UYzBOemsyT0RneE9Dd2ljR0Z5Wlc1MElqb2lZV1J0YVc0aWZRLkh1N1VaVkhuS19EUWhfR1lnLVB0cVhBNFpJTHpPTk1vTkZ3by1YalI0N0R3U3VnZ2NyRC1EdXkxeEdfM3FmWXdRQmdPd29Ca2xGVTRYLWpvNncxY0lRJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZ2ZXJzaW9uSWQ9bnVsbCZYLUFtei1TaWduYXR1cmU9MjNmZjdhZWViNTJlZjk4ZWFmMTg5OTg4MjQzNDk5ZTRiYzgwNzI5ZWU1MzJkM2M2MTdlMDFmM2U3ODZlZDA1OQ");
warningRecord.setTimestamp(eventsVo.getTimestamp()); warningRecord.setTimestamp(eventsVo.getTimestamp());
list.add(warningRecord); warningRecordList.add(warningRecord);
} }
sampleWarningRecordService.saveBatch(list); sampleWarningRecordService.saveBatch(warningRecordList);
System.out.println(callBackVo);
//保存数据到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");
}
//预警基础信息扩展
// 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);
} }
} }
} }

17
dk-modules/sample/src/main/java/org/dromara/sample/manage/model/entity/EngineRecordEntity.java

@ -30,12 +30,23 @@ public class EngineRecordEntity implements Serializable {
@TableField(value = "device_sn") @TableField(value = "device_sn")
private String deviceSn; private String deviceSn;
/**
* 算法类型
*/
@TableField(value = "extra_type") @TableField(value = "extra_type")
private String extraType; private String extraType;
//引擎任务id 格式:qMx86W2tE
@TableField(value = "task_id") @TableField(value = "task_id")
private String taskId; private String taskId;
//任务批次号 格式: WX20250526918312
//(是调用其他接口中的关键字, 也就是飞行所关联的业务逻辑单据号)
@TableField(value = "mission_batch")
private String missionBatch;
@TableField(fill = FieldFill.INSERT) @TableField(fill = FieldFill.INSERT)
private Date createTime; private Date createTime;
@ -45,4 +56,10 @@ public class EngineRecordEntity implements Serializable {
@TableField(value = "push_url") @TableField(value = "push_url")
private String pushUrl; private String pushUrl;
@TableField(value = "stop_res_data")
private String stopResData;
@TableField(value = "stop_res_data_str")
private String stopResDataStr;
} }

5
dk-modules/sample/src/main/java/org/dromara/sample/manage/model/entity/TaskJobEntity.java

@ -30,4 +30,9 @@ public class TaskJobEntity implements Serializable {
private String jobId; private String jobId;
private String deviceSn;
@TableField(fill = FieldFill.INSERT)
private Date createTime;
} }

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

@ -1,14 +1,12 @@
package org.dromara.sample.manage.model.entity; package org.dromara.sample.manage.model.entity;
import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.*;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors; import lombok.experimental.Accessors;
import java.io.Serializable; import java.io.Serializable;
import java.util.Date;
/** /**
* 设备对象-用于存储设备对象 iot_device * 设备对象-用于存储设备对象 iot_device
@ -44,4 +42,7 @@ public class WarningRecordEntity implements Serializable {
@TableField(value = "timestamp") @TableField(value = "timestamp")
private Integer timestamp;//事件时间戳,单位:毫秒") private Integer timestamp;//事件时间戳,单位:毫秒")
@TableField(fill = FieldFill.INSERT)
private Date createTime;
} }

6
dk-modules/sample/src/main/java/org/dromara/sample/manage/service/impl/EngineRecordServiceImpl.java

@ -95,6 +95,7 @@ public class EngineRecordServiceImpl implements IEngineRecordService {
JSONObject jsonObj = new JSONObject(); JSONObject jsonObj = new JSONObject();
jsonObj.put("username", sanitize("xuzhou_ai")); // sanitize函数见下文 jsonObj.put("username", sanitize("xuzhou_ai")); // sanitize函数见下文
jsonObj.put("password", sanitize(md5)); jsonObj.put("password", sanitize(md5));
//{"code":200,"message":"操作成功","data":{"token":"eyJhbGciOiJSUzI1NiJ9.eyJpYXQiOjE3NDc5NjY2NzksImV4cCI6MTc1MDU1ODY3OSwidWlkIjoiT2tUV0NyWWxZSSIsInRoaXJkIjoxfQ.lkOSgcWES1ViKmeVht6b1AKuw6MbxPxsmGVeuahy4QZfWkv8y8Ac80bkvZMVBQD_-DmcwK3HXOslrWI5_uHDuBRO2phB6BGXzqkb4GKvLsZMGI-Wrc4tHyZ-ojQ67uhWVUgnjFK4OnMsf5U9LxAxe0XJZQWwrm8KAh9Zb0iD4gY"}}
String responseBody = PostRequest(jsonObj, "http://60.204.247.65:8100/Third/Login"); String responseBody = PostRequest(jsonObj, "http://60.204.247.65:8100/Third/Login");
JSONObject jsonObject = new JSONObject(responseBody); JSONObject jsonObject = new JSONObject(responseBody);
// 逐层获取 data -> token // 逐层获取 data -> token
@ -107,6 +108,7 @@ public class EngineRecordServiceImpl implements IEngineRecordService {
try { try {
URI uri = new URIBuilder("http://60.204.247.65:8100/V2/AI/WX/User/Scene") URI uri = new URIBuilder("http://60.204.247.65:8100/V2/AI/WX/User/Scene")
.build(); .build();
//{"code":200,"message":"操作成功","data":[{"scene":"可见光","id":2}]}
sceneResponseBody = GetRequest(uri, token); sceneResponseBody = GetRequest(uri, token);
} catch (URISyntaxException e) { } catch (URISyntaxException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
@ -115,6 +117,7 @@ public class EngineRecordServiceImpl implements IEngineRecordService {
// 逐层获取 data -> token // 逐层获取 data -> token
JSONObject data1 = jsonObject.getJSONObject("data"); JSONObject data1 = jsonObject.getJSONObject("data");
String scene = data1.getString("scene"); String scene = data1.getString("scene");
// String scene = jsonObject1.getJSONArray("data").getJSONObject(0).getString("scene");
//查询场景算法 //查询场景算法
List<String> extra_type_list = new ArrayList<>(); List<String> extra_type_list = new ArrayList<>();
@ -125,6 +128,7 @@ public class EngineRecordServiceImpl implements IEngineRecordService {
.build(); .build();
algorithmResponseBody = GetRequest(uri, token); algorithmResponseBody = GetRequest(uri, token);
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 response = mapper.readValue(algorithmResponseBody,ExtraTypeResponse.class); ExtraTypeResponse response = mapper.readValue(algorithmResponseBody,ExtraTypeResponse.class);
List<ExtraType> list = response.getData(); List<ExtraType> list = response.getData();
for (ExtraType extraType : list) { for (ExtraType extraType : list) {
@ -181,7 +185,7 @@ public class EngineRecordServiceImpl implements IEngineRecordService {
if(dataObj != null && dataObj instanceof Integer) { if(dataObj != null && dataObj instanceof Integer) {
int data = (Integer) dataObj; int data = (Integer) dataObj;
if (data ==1){ if (data ==1){
mapper.delete(new LambdaQueryWrapper<EngineRecordEntity>().eq(EngineRecordEntity::getDeviceSn, objectMap.get("device_sn"))); mapper.delete(new LambdaQueryWrapper<EngineRecordEntity>().eq(EngineRecordEntity::getDeviceSn, objectMap.get("deviceSn")));
}else { }else {
throw new RuntimeException("关闭引擎失败!"); throw new RuntimeException("关闭引擎失败!");
} }

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

@ -1,6 +1,7 @@
package org.dromara.sample.manage.service.impl; package org.dromara.sample.manage.service.impl;
import cn.hutool.core.map.MapUtil; import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.StrUtil;
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;
@ -10,27 +11,29 @@ 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;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.entity.StringEntity; 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.sample.common.util.Md5Utils; import org.dromara.sample.common.util.Md5Utils;
import org.dromara.sample.manage.config.XingluoApiConfig;
import org.dromara.sample.manage.mapper.IDeviceMapper;
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.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.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.system.api.RemoteConfigService;
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.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.net.URI; import java.net.URI;
import java.net.URISyntaxException;
import java.util.*; import java.util.*;
import static org.apache.commons.compress.utils.ArchiveUtils.sanitize; import static org.apache.commons.compress.utils.ArchiveUtils.sanitize;
@ -40,81 +43,58 @@ import static org.apache.commons.compress.utils.ArchiveUtils.sanitize;
@Transactional @Transactional
public class SampleEngineRecordServiceImpl implements ISampleEngineRecordService { public class SampleEngineRecordServiceImpl implements ISampleEngineRecordService {
@Resource @Resource
ISampleEngineRecordMapper mapper; ISampleEngineRecordMapper engineRecordMapper;
@Resource @Resource
ITaskJobMapper taskJobMapper; ITaskJobMapper taskJobMapper;
@Autowired
private XingluoApiConfig xingluoApiConfig;
@DubboReference @DubboReference
private RemoteConfigService remoteConfigService; private RemoteConfigService remoteConfigService;
@Override @Override
public Map<String, Object> startEngine(Map<String, Object> objectMap){ public Map<String, Object> startEngine(Map<String, Object> objectMap){
EngineRecordEntity record = new EngineRecordEntity(); EngineRecordEntity record = new EngineRecordEntity();
String ip = remoteConfigService.selectStreamIp(); String ip = remoteConfigService.selectStreamIp();
//获取token String md5 = Md5Utils.hash("xuzhou_ai"); //获取token + 设置请求Header和Body(如JSON)
//设置请求Header和Body(如JSON)
String md5 = Md5Utils.hash("xuzhou_ai");
JSONObject jsonObj = new JSONObject(); JSONObject jsonObj = new JSONObject();
jsonObj.put("username", sanitize("xuzhou_ai")); // sanitize函数见下文 jsonObj.put("username", sanitize("xuzhou_ai")); // sanitize函数见下文
jsonObj.put("password", sanitize(md5)); jsonObj.put("password", sanitize(md5));
String responseBody = PostRequest(jsonObj, "http://60.204.247.65:8100/Third/Login",""); String responseBody = PostRequest(jsonObj, xingluoApiConfig.getEngineLogin(),""); //"http://60.204.247.65:8100/Third/Login"
JSONObject jsonObject = new JSONObject(responseBody); JSONObject jsonObject = new JSONObject(responseBody);
// 逐层获取 data -> token // 逐层获取 data -> token
JSONObject data = jsonObject.getJSONObject("data"); JSONObject data = jsonObject.getJSONObject("data");
String token = data.getString("token"); String token = data.getString("token");
String sceneResponseBody = null; String sceneResponseBody = null;
String algorithmResponseBody = null; String algorithmResponseBody = null;
String taskId = "";
String missionBatch = "";
String deviceSn = MapUtil.getStr(objectMap, "deviceSn", "");
//查询用户开通的场景 //查询用户开通的场景
if (StringUtils.isNotEmpty(token)){ if (StringUtils.isNotEmpty(token)){
// try {
// URI uri = new URIBuilder("http://60.204.247.65:8100/V2/AI/WX/User/Scene")
// .build();
// sceneResponseBody = GetRequest(uri, token);
// } catch (URISyntaxException e) {
// throw new RuntimeException(e);
// }
// EngineTypeResponse engineTypeResponse = null;
// try {
// ObjectMapper mapper = new ObjectMapper();
// engineTypeResponse = mapper.readValue(sceneResponseBody, EngineTypeResponse.class);
// } catch (JsonProcessingException e) {
// throw new RuntimeException(e);
// }
//// JSONObject jsonObject1 = new JSONObject(sceneResponseBody);
// // 逐层获取 data -> token
//// JSONObject data1 = jsonObject1.getJSONObject("data");
// String scene = engineTypeResponse.getData().getScene();
//
// //查询场景算法
// List<String> extra_type_list = new ArrayList<>();
// try {
// URI uri = new URIBuilder("http://60.204.247.65:8100/V2/AI/WX/User/ExtraType/Get")
// .addParameter("scene",scene)
// .addParameter("if_open","1")
// .build();
// algorithmResponseBody = GetRequest(uri, token);
// ObjectMapper mapper = new ObjectMapper();
// ExtraTypeResponse response = mapper.readValue(algorithmResponseBody,ExtraTypeResponse.class);
// List<ExtraType> list = response.getData();
// for (ExtraType extraType : list) {
// extra_type_list.add(extraType.getExtra_type());
// break;
// }
// } catch (URISyntaxException | JsonProcessingException e) {
// throw new RuntimeException(e);
// }
JSONObject jsonObj2 = new JSONObject(); JSONObject jsonObj2 = new JSONObject();
String type = objectMap.get("type").toString(); String type = objectMap.get("type").toString();
if (StringUtils.isNotEmpty(type)){ if (StringUtils.isNotEmpty(type)){ //2004_ext 算法名称
List<String> list = Arrays.asList(type.split(",")); List<String> list = Arrays.asList(type.split(","));
jsonObj2.put("scene", "可见光"); // sanitize函数见下文 jsonObj2.put("scene", "可见光"); // sanitize函数见下文
jsonObj2.put("callback_url", "http://114.235.183.162:9888/ces/iot/deviceLog/some"); jsonObj2.put("callback_url", xingluoApiConfig.getEngineCallbackUrl());//"http://121.237.178.63:11100/sample/manage/api/v1/saEngineRecord/some"
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("push_url", "rtmp://"+ip+"/live/livesteam/"+objectMap.get("rtmpUrl")+"ai1"); jsonObj2.put("input_url", "rtmp://"+ip+"/live/livesteam/"+objectMap.get("rtmpUrl"));//预览接口必须要传rtmp,不能是flv
// jsonObj2.put("play_url", objectMap.get("play_url")); String pushUrl = "rtmp://" + ip + "/live/livesteam/" + objectMap.get("rtmpUrl") + "ai1";
String responseBody2 = PostRequest(jsonObj2, "http://60.204.247.65:8100/Third/Engine/Start",token); jsonObj2.put("push_url", pushUrl); //推流接口有时候不稳定,需要检查SRS服务
// 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":"AI开启失败","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"}}
*/
String responseBody2 = PostRequest(jsonObj2, xingluoApiConfig.getEngineStart(),token); //"http://60.204.247.65:8100/Third/Engine/Start"
ObjectMapper mapper1 = new ObjectMapper(); ObjectMapper mapper1 = new ObjectMapper();
EngineResponse response = null; EngineResponse response = null;
try { try {
@ -125,28 +105,32 @@ public class SampleEngineRecordServiceImpl implements ISampleEngineRecordService
} catch (JsonProcessingException e) { } catch (JsonProcessingException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
taskId = response.getData().getTask_id();
missionBatch = response.getData().getMission_batch();
objectMap.put("task_id",response.getData().getTask_id()); objectMap.put("task_id",response.getData().getTask_id());
record.setPushUrl(objectMap.get("rtmpUrl").toString()); record.setDeviceSn(deviceSn);
record.setTaskId(MapUtil.getStr(objectMap,"task_id",""));
record.setDeviceSn(MapUtil.getStr(objectMap,"deviceSn",""));
record.setTaskId(response.getData().getTask_id());
record.setExtraType(objectMap.get("type").toString()); record.setExtraType(objectMap.get("type").toString());
record.setPushUrl(objectMap.get("rtmpUrl").toString());
record.setTaskId(taskId); //MapUtil.getStr(objectMap,"task_id","")
record .setMissionBatch(missionBatch);
record.setPushUrl(pushUrl);
System.out.print(objectMap); System.out.print(objectMap);
} }
} }
Map<String, Object> map = new HashMap(); //添加启动引擎记录
engineRecordMapper.insert(record);
Map<String, Object> map = new HashMap();
map.put("push_url", "http://"+ip+":1985/rtc/v1/whep/?app=live/livesteam&stream="+objectMap.get("rtmpUrl")+"ai1"); map.put("push_url", "http://"+ip+":1985/rtc/v1/whep/?app=live/livesteam&stream="+objectMap.get("rtmpUrl")+"ai1");
map.put("task_id", taskId);//objectMap.get("task_id")
map.put("task_id", objectMap.get("task_id"));
//添加启动引擎记录
mapper.insert(record);
//添加任务id和jobid关联关系 //添加任务id和jobid关联关系
TaskJobEntity taskJobEntity = new TaskJobEntity(); TaskJobEntity taskJobEntity = new TaskJobEntity();
taskJobEntity.setJobId(objectMap.get("jobId").toString()); taskJobEntity.setJobId(objectMap.get("jobId").toString());
taskJobEntity.setTaskId(objectMap.get("task_id").toString()); taskJobEntity.setTaskId(objectMap.get("task_id").toString());
taskJobEntity.setDeviceSn(deviceSn);
taskJobMapper.insert(taskJobEntity); taskJobMapper.insert(taskJobEntity);
return map; return map;
} }
@ -154,7 +138,13 @@ public class SampleEngineRecordServiceImpl implements ISampleEngineRecordService
@Override @Override
public void closeEngine(Map<String, Object> objectMap) { public void closeEngine(Map<String, Object> objectMap) {
JSONObject jsonObj2 = new JSONObject(); JSONObject jsonObj2 = new JSONObject();
EngineRecordEntity record = mapper.selectOne(new LambdaQueryWrapper<EngineRecordEntity>().eq(EngineRecordEntity::getDeviceSn, objectMap.get("deviceSn"))); String taskId = (String)objectMap.get("taskId");
String deviceSn = (String)objectMap.get("deviceSn");
LambdaQueryWrapper<EngineRecordEntity> engineRecordQW = new LambdaQueryWrapper<EngineRecordEntity>();
engineRecordQW.eq(EngineRecordEntity::getTaskId, taskId);
engineRecordQW.eq(EngineRecordEntity::getDeviceSn,deviceSn);
engineRecordQW.orderByDesc(EngineRecordEntity::getCreateTime);
EngineRecordEntity record = engineRecordMapper.selectOne(engineRecordQW);
if (record == null){ if (record == null){
// throw new RuntimeException("关闭引擎失败!"); // throw new RuntimeException("关闭引擎失败!");
}else { }else {
@ -164,18 +154,40 @@ public class SampleEngineRecordServiceImpl implements ISampleEngineRecordService
JSONObject jsonObj = new JSONObject(); JSONObject jsonObj = new JSONObject();
jsonObj.put("username", sanitize("xuzhou_ai")); // sanitize函数见下文 jsonObj.put("username", sanitize("xuzhou_ai")); // sanitize函数见下文
jsonObj.put("password", sanitize(md5)); jsonObj.put("password", sanitize(md5));
String responseBody = PostRequest(jsonObj, "http://60.204.247.65:8100/Third/Login",""); //{"code":200,"message":"操作成功","data":{"token":"eyJhbGciOiJSUzI1NiJ9.eyJpYXQiOjE3NDgyNDM0MDgsImV4cCI6MTc1MDgzNTQwOCwidWlkIjoiT2tUV0NyWWxZSSIsInRoaXJkIjoxfQ.LZI1jEl7wyUquXJrApynEE7aUdpqiiqy8VD_3nm215I0dgkGTtDWa3PO26pDWFzw40kNPI5JwWuZBjEtroLAOEQtmhsI9BId5aw605D5jGQ69U6JTa7q095eJxIT2I7rMwAjMGqOtxDfRyw_U-GJPTA4nE4uy98yCXG56FBnrY8"}}
String responseBody = PostRequest(jsonObj, xingluoApiConfig.getEngineLogin(),"");//"http://60.204.247.65:8100/Third/Login"
JSONObject jsonObject = new JSONObject(responseBody); JSONObject jsonObject = new JSONObject(responseBody);
// 逐层获取 data -> token // 逐层获取 data -> token
JSONObject data = jsonObject.getJSONObject("data"); JSONObject data = jsonObject.getJSONObject("data");
String token = data.getString("token"); String token = data.getString("token");
jsonObj2.put("task_id", record.getTaskId()); // sanitize函数见下文 jsonObj2.put("task_id", record.getTaskId()); // sanitize函数见下文
String responseBody2 = PostRequest(jsonObj2, "http://60.204.247.65:8100/Third/Engine/Stop",token); //{"code":200,"message":"操作成功","data":0}
String responseBody2 = PostRequest(jsonObj2, xingluoApiConfig.getEngineStop(),token); //"http://60.204.247.65:8100/Third/Engine/Stop"
JSONObject json = new JSONObject(responseBody2); JSONObject json = new JSONObject(responseBody2);
String resData = json.getString("data");
String resDataStr = "";
// String resDataStr = StrUtil.equals(resData,"1") ? "停止成功" : "停止失败";
switch (resData){
case "":
resDataStr = "停止成功(长时间未关闭)";
break;
case "0":
resDataStr = "停止失败";
break;
case "1":
resDataStr = "停止成功";
break;
}
EngineRecordEntity engineRecordUpdate = new EngineRecordEntity();
engineRecordUpdate.setId(record.getId());
engineRecordUpdate.setStopResData(resData);
engineRecordUpdate.setStopResDataStr(resDataStr);
engineRecordMapper.updateById(engineRecordUpdate);
// 方式2:安全获取(先判空再转换) // 方式2:安全获取(先判空再转换)
Object dataObj = json.get("data"); /* Object dataObj = json.get("data");
if(dataObj != null && dataObj instanceof Integer) { if(dataObj != null && dataObj instanceof Integer) {
int data1 = (Integer) dataObj; int data1 = (Integer) dataObj;
if (data1 ==1){ if (data1 ==1){
@ -185,11 +197,9 @@ public class SampleEngineRecordServiceImpl implements ISampleEngineRecordService
} }
} else { } else {
throw new RuntimeException("关闭引擎失败!"); throw new RuntimeException("关闭引擎失败!");
} }*/
} }
} }

Loading…
Cancel
Save