Commit 0da50031 authored by 周昊's avatar 周昊

1、开发对接ai算法启停接口

parent d12cd6c4
......@@ -15,12 +15,12 @@ public class AlgorithmSceneStatus extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** 算法key值 */
private String algorithmKey;
/** 场景id */
private Long sceneId;
/** 算法key值 */
private String algorithmKey;
/** 摄像头列表json */
@Excel(name = "摄像头列表json")
private String cameraList;
......@@ -69,8 +69,8 @@ public class AlgorithmSceneStatus extends BaseEntity
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
.append("algorithmKey", getAlgorithmKey())
.append("sceneId", getSceneId())
.append("algorithmKey", getAlgorithmKey())
.append("cameraList", getCameraList())
.append("frameSecond", getFrameSecond())
.toString();
......
package com.ruoyi.algorithm.domain.dto;
import lombok.Data;
/**
* @author 周昊
* @desc ...
* @date 2023-05-10 14:36:40
*/
@Data
public class AlgorithmSceneStatusCameraListDto {
//摄像头rtsp地址
private String rtsp;
//摄像头第几个 从0开始
private Integer sort;
//阈值
private Integer threshold;
}
package com.ruoyi.algorithm.mapper;
import java.util.List;
import com.ruoyi.algorithm.domain.AlgorithmSceneBase;
import com.ruoyi.algorithm.domain.AlgorithmSceneStatus;
import com.ruoyi.algorithm.domain.dto.AlgorithmSceneStatusCameraListDto;
import org.apache.ibatis.annotations.Param;
/**
* 算法启动摄像头配置Mapper接口
......@@ -46,16 +50,12 @@ public interface AlgorithmSceneStatusMapper
/**
* 删除算法启动摄像头配置
*
* @param algorithmKey 算法启动摄像头配置主键
* @param sceneId 场景id
* @return 结果
*/
public int deleteAlgorithmSceneStatusByAlgorithmKey(String algorithmKey);
public int deleteAlgorithmSceneStatusBySceneId(@Param("sceneId") Long sceneId);
/**
* 批量删除算法启动摄像头配置
*
* @param algorithmKeys 需要删除的数据主键集合
* @return 结果
*/
public int deleteAlgorithmSceneStatusByAlgorithmKeys(String[] algorithmKeys);
public AlgorithmSceneStatus selectAlgorithmSceneBase(@Param("sceneId") Long sceneId);
public List<AlgorithmSceneStatusCameraListDto> selectCameraList(@Param("sceneId") Long sceneId);
}
package com.ruoyi.algorithm.service;
import java.util.List;
import com.ruoyi.algorithm.domain.AlgorithmSceneStatus;
/**
* 算法启动摄像头配置Service接口
*
*
* @author ruoyi
* @date 2023-04-26
*/
public interface IAlgorithmSceneStatusService
{
/**
* 查询算法启动摄像头配置
*
* @param algorithmKey 算法启动摄像头配置主键
* @return 算法启动摄像头配置
*/
public AlgorithmSceneStatus selectAlgorithmSceneStatusByAlgorithmKey(String algorithmKey);
public interface IAlgorithmSceneStatusService {
public AlgorithmSceneStatus createBySceneId(Long sceneId);
/**
* 查询算法启动摄像头配置列表
*
* @param algorithmSceneStatus 算法启动摄像头配置
* @return 算法启动摄像头配置集合
*/
public List<AlgorithmSceneStatus> selectAlgorithmSceneStatusList(AlgorithmSceneStatus algorithmSceneStatus);
/**
* 新增算法启动摄像头配置
*
* @param algorithmSceneStatus 算法启动摄像头配置
* @return 结果
*/
public int insertAlgorithmSceneStatus(AlgorithmSceneStatus algorithmSceneStatus);
/**
* 修改算法启动摄像头配置
*
* @param algorithmSceneStatus 算法启动摄像头配置
* @return 结果
*/
public int updateAlgorithmSceneStatus(AlgorithmSceneStatus algorithmSceneStatus);
/**
* 批量删除算法启动摄像头配置
*
* @param algorithmKeys 需要删除的算法启动摄像头配置主键集合
* @return 结果
*/
public int deleteAlgorithmSceneStatusByAlgorithmKeys(String[] algorithmKeys);
/**
* 删除算法启动摄像头配置信息
*
* @param algorithmKey 算法启动摄像头配置主键
* @return 结果
*/
public int deleteAlgorithmSceneStatusByAlgorithmKey(String algorithmKey);
public int deleteBySceneId(Long sceneId);
}
package com.ruoyi.algorithm.service.impl;
import java.util.HashMap;
import java.util.List;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.ruoyi.algorithm.domain.dto.AlgorithmSceneListDto;
import com.ruoyi.algorithm.service.IAlgorithmSceneStatusService;
import com.ruoyi.algorithm.utils.FlinkRestApiUtil;
import com.ruoyi.common.config.AiRestApiConfig;
import com.ruoyi.common.config.FlinkConfig;
import com.ruoyi.common.exception.ServiceException;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -15,6 +19,8 @@ import com.ruoyi.algorithm.mapper.AlgorithmSceneBaseMapper;
import com.ruoyi.algorithm.domain.AlgorithmSceneBase;
import com.ruoyi.algorithm.service.IAlgorithmSceneBaseService;
import javax.annotation.Resource;
/**
* 算法场景Service业务层处理
*
......@@ -26,6 +32,9 @@ public class AlgorithmSceneBaseServiceImpl implements IAlgorithmSceneBaseService
@Autowired
private AlgorithmSceneBaseMapper algorithmSceneBaseMapper;
@Resource
private IAlgorithmSceneStatusService algorithmSceneStatusService;
/**
* 查询算法场景
*
......@@ -104,6 +113,11 @@ public class AlgorithmSceneBaseServiceImpl implements IAlgorithmSceneBaseService
if (sceneBase.getStatus().equals(algorithmSceneBase.getStatus())) {
throw new ServiceException("场景状态错误,请刷新后再试!");
}
//通知算法启动停止
sendAi(algorithmSceneBase.getId(), algorithmSceneBase.getStatus());
//启动、取消flink流处理
AlgorithmSceneBase newSceneBase = new AlgorithmSceneBase();
newSceneBase.setId(algorithmSceneBase.getId());
newSceneBase.setStatus(algorithmSceneBase.getStatus());
......@@ -115,7 +129,7 @@ public class AlgorithmSceneBaseServiceImpl implements IAlgorithmSceneBaseService
JSONObject jsonObject = JSONUtil.parseObj(result);
String jobId = jsonObject.getStr("job");
newSceneBase.setJobId(jobId);
}else {
} else {
// flink 取消job
String s = FlinkRestApiUtil.cancelJob(sceneBase.getJobId());
}
......@@ -123,4 +137,24 @@ public class AlgorithmSceneBaseServiceImpl implements IAlgorithmSceneBaseService
updateAlgorithmSceneBase(newSceneBase);
return 1;
}
private void sendAi(Long sceneId, String status) {
String statusKey;
//启动
if ("0".equals(status)) {
//生成ai表数据
algorithmSceneStatusService.createBySceneId(sceneId);
statusKey = "run";
} else {
//停止,删除ai表数据
algorithmSceneStatusService.deleteBySceneId(sceneId);
statusKey = "stop";
}
//通知ai算法
String url = "http://{}:{}/{}?sceneId={}";
url = StrUtil.format(url, AiRestApiConfig.getHost(), AiRestApiConfig.getPort(), statusKey, sceneId);
HttpUtil.post(url, new HashMap<>());
return;
}
}
package com.ruoyi.algorithm.service.impl;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.algorithm.mapper.AlgorithmSceneStatusMapper;
import cn.hutool.json.JSONUtil;
import com.ruoyi.algorithm.domain.AlgorithmSceneStatus;
import com.ruoyi.algorithm.domain.dto.AlgorithmSceneStatusCameraListDto;
import com.ruoyi.algorithm.mapper.AlgorithmSceneStatusMapper;
import com.ruoyi.algorithm.service.IAlgorithmSceneStatusService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* 算法启动摄像头配置Service业务层处理
*
*
* @author ruoyi
* @date 2023-04-26
*/
@Service
public class AlgorithmSceneStatusServiceImpl implements IAlgorithmSceneStatusService
{
public class AlgorithmSceneStatusServiceImpl implements IAlgorithmSceneStatusService {
@Autowired
private AlgorithmSceneStatusMapper algorithmSceneStatusMapper;
/**
* 查询算法启动摄像头配置
*
* @param algorithmKey 算法启动摄像头配置主键
* @return 算法启动摄像头配置
*/
@Override
public AlgorithmSceneStatus selectAlgorithmSceneStatusByAlgorithmKey(String algorithmKey)
{
return algorithmSceneStatusMapper.selectAlgorithmSceneStatusByAlgorithmKey(algorithmKey);
}
/**
* 查询算法启动摄像头配置列表
*
* @param algorithmSceneStatus 算法启动摄像头配置
* @return 算法启动摄像头配置
*/
@Override
public List<AlgorithmSceneStatus> selectAlgorithmSceneStatusList(AlgorithmSceneStatus algorithmSceneStatus)
{
return algorithmSceneStatusMapper.selectAlgorithmSceneStatusList(algorithmSceneStatus);
}
/**
* 新增算法启动摄像头配置
*
* @param algorithmSceneStatus 算法启动摄像头配置
* @return 结果
*/
@Override
public int insertAlgorithmSceneStatus(AlgorithmSceneStatus algorithmSceneStatus)
{
return algorithmSceneStatusMapper.insertAlgorithmSceneStatus(algorithmSceneStatus);
}
/**
* 修改算法启动摄像头配置
*
* @param algorithmSceneStatus 算法启动摄像头配置
* @return 结果
*/
@Override
public int updateAlgorithmSceneStatus(AlgorithmSceneStatus algorithmSceneStatus)
{
return algorithmSceneStatusMapper.updateAlgorithmSceneStatus(algorithmSceneStatus);
}
/**
* 批量删除算法启动摄像头配置
*
* @param algorithmKeys 需要删除的算法启动摄像头配置主键
* @return 结果
*/
@Override
public int deleteAlgorithmSceneStatusByAlgorithmKeys(String[] algorithmKeys)
{
return algorithmSceneStatusMapper.deleteAlgorithmSceneStatusByAlgorithmKeys(algorithmKeys);
public AlgorithmSceneStatus createBySceneId(Long sceneId) {
//清空当前sceneId数据
algorithmSceneStatusMapper.deleteAlgorithmSceneStatusBySceneId(sceneId);
//生成全新的数据并插入
AlgorithmSceneStatus algorithmSceneStatus = algorithmSceneStatusMapper.selectAlgorithmSceneBase(sceneId);
List<AlgorithmSceneStatusCameraListDto> cameraList = algorithmSceneStatusMapper.selectCameraList(sceneId);
for (int i = 0; i < cameraList.size(); i++) {
cameraList.get(i).setSort(i);
}
algorithmSceneStatus.setCameraList(JSONUtil.toJsonStr(cameraList));
algorithmSceneStatusMapper.insertAlgorithmSceneStatus(algorithmSceneStatus);
return algorithmSceneStatus;
}
/**
* 删除算法启动摄像头配置信息
*
* @param algorithmKey 算法启动摄像头配置主键
* @return 结果
*/
@Override
public int deleteAlgorithmSceneStatusByAlgorithmKey(String algorithmKey)
{
return algorithmSceneStatusMapper.deleteAlgorithmSceneStatusByAlgorithmKey(algorithmKey);
public int deleteBySceneId(Long sceneId) {
return algorithmSceneStatusMapper.deleteAlgorithmSceneStatusBySceneId(sceneId);
}
}
......@@ -143,3 +143,10 @@ flink:
# 启动参数
programArgs: --sceneId {}
# ai平台发送接口设置
airestapi:
#地址
host: localhost
# 端口,默认为8081
port: 8081
......@@ -4,7 +4,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.algorithm.mapper.AlgorithmSceneStatusMapper">
<resultMap type="AlgorithmSceneStatus" id="AlgorithmSceneStatusResult">
<resultMap type="com.ruoyi.algorithm.domain.AlgorithmSceneStatus" id="AlgorithmSceneStatusResult">
<result property="algorithmKey" column="algorithm_key" />
<result property="sceneId" column="scene_id" />
<result property="cameraList" column="camera_list" />
......@@ -27,7 +27,28 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<include refid="selectAlgorithmSceneStatusVo"/>
where algorithm_key = #{algorithmKey}
</select>
<select id="selectAlgorithmSceneBase" resultType="com.ruoyi.algorithm.domain.AlgorithmSceneStatus">
SELECT
asb.id AS sceneId,
ab.algorithm_key AS algorithmKey,
asb.frame_second AS frameSecond
FROM
algorithm_scene_base asb
LEFT JOIN algorithm_base ab ON ab.id = asb.algorithm_id
WHERE
asb.id = #{sceneId}
</select>
<select id="selectCameraList" resultType="com.ruoyi.algorithm.domain.dto.AlgorithmSceneStatusCameraListDto">
SELECT
acb.rtsp AS rtsp,
60 AS threshold
FROM
algorithm_scene_base asb
LEFT JOIN algorithm_camera_base acb ON FIND_IN_SET( acb.id, asb.camera_id_list )
WHERE
asb.id = #{sceneId}
</select>
<insert id="insertAlgorithmSceneStatus" parameterType="AlgorithmSceneStatus">
insert into algorithm_scene_status
<trim prefix="(" suffix=")" suffixOverrides=",">
......@@ -54,14 +75,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
where algorithm_key = #{algorithmKey}
</update>
<delete id="deleteAlgorithmSceneStatusByAlgorithmKey" parameterType="String">
delete from algorithm_scene_status where algorithm_key = #{algorithmKey}
</delete>
<delete id="deleteAlgorithmSceneStatusByAlgorithmKeys" parameterType="String">
delete from algorithm_scene_status where algorithm_key in
<foreach item="algorithmKey" collection="array" open="(" separator="," close=")">
#{algorithmKey}
</foreach>
<delete id="deleteAlgorithmSceneStatusBySceneId" parameterType="Long">
delete from algorithm_scene_status where scene_id = #{sceneId}
</delete>
</mapper>
\ No newline at end of file
package com.ruoyi.common.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* flink相关配置
*
* @author ruoyi
*/
@Component
@ConfigurationProperties(prefix = "airestapi")
public class AiRestApiConfig
{
/** 地址 */
private static String host;
/** 端口 */
private static String port;
public static String getHost() {
return host;
}
public void setHost(String host) {
AiRestApiConfig.host = host;
}
public static String getPort() {
return port;
}
public void setPort(String port) {
AiRestApiConfig.port = port;
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment