zhanghua
2022-09-20 148a0727739c3f61e1a15bf36d5489cb77d4c5f3
视频报警接口
2个文件已修改
9个文件已添加
358 ■■■■■ 已修改文件
ycl-common/src/main/java/com/ycl/api/CommonResult.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-common/src/main/java/com/ycl/enums/common/ResultCode.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/controller/platformApi/AlarmController.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/dto/videoAlarm/AlarmDataParam.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/dto/videoAlarm/AlarmParam.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/dto/videoAlarm/CameraInfParam.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/entity/videoAlarm/VideoAlarmReport.java 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/mapper/videoAlarm/VideoAlarmReportMapper.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/service/videoAlarm/IVideoAlarmReportService.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/service/videoAlarm/impl/VideoAlarmReportServiceImpl.java 60 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/resources/mapper/videoAlarm/VideoAlarmReportDao.xml 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-common/src/main/java/com/ycl/api/CommonResult.java
@@ -13,12 +13,18 @@
    protected CommonResult() {
    }
    public CommonResult(long code, String message) {
        this.code = code;
        this.message = message;
    }
    protected CommonResult(long code, String message, T data) {
        this.code = code;
        this.message = message;
        this.data = data;
    }
    /**
     * 成功返回结果
     *
ycl-common/src/main/java/com/ycl/enums/common/ResultCode.java
@@ -9,6 +9,7 @@
 * @since 2022-09-06
 */
public enum ResultCode implements IErrorCode {
    API_SUCCESS(0, "操作成功"),
    SUCCESS(200, "操作成功"),
    FAILED(500, "操作失败"),
    VALIDATE_FAILED(404, "参数检验失败"),
ycl-platform/src/main/java/com/ycl/controller/platformApi/AlarmController.java
New file
@@ -0,0 +1,38 @@
package com.ycl.controller.platformApi;
import com.ycl.api.CommonResult;
import com.ycl.dto.videoAlarm.AlarmParam;
import com.ycl.enums.common.ResultCode;
import com.ycl.service.videoAlarm.IVideoAlarmReportService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * @author admin
 */
@Api(tags = "第三方接口-报警")
@RestController
@RequestMapping("/API")
public class AlarmController {
    private IVideoAlarmReportService videoAlarmReportService;
    @Autowired
    public void setVideoAlarmReportService(IVideoAlarmReportService videoAlarmReportService) {
        this.videoAlarmReportService = videoAlarmReportService;
    }
    @ApiOperation("视频报警推送API")
    @PostMapping("/AlarmReport")
    public CommonResult alarmReport(@RequestBody @Validated AlarmParam alarmParam) {
        videoAlarmReportService.save(alarmParam);
        return new CommonResult(ResultCode.SUCCESS.getCode(), ResultCode.SUCCESS.getMessage());
    }
}
ycl-platform/src/main/java/com/ycl/dto/videoAlarm/AlarmDataParam.java
New file
@@ -0,0 +1,41 @@
package com.ycl.dto.videoAlarm;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
/**
 * AlarmDataParam
 *
 * @version V1.0
 * @author: AI
 * @date: 2022-09-20 16:55
 **/
@Data
public class AlarmDataParam {
    /**
     * 报警时间
     */
    @JsonProperty("AlarmTime")
    private String alarmTime;
    /**
     * 报警ID
     */
    @JsonProperty("AlarmID")
    private String alarmID;
    /**
     * 算法类型码
     */
    @JsonProperty("AlgoType")
    private Integer algoType;
    /**
     * 算法类型名称
     */
    @JsonProperty("AlgoName")
    private String algoName;
    /**
     * 算法检出对象信息(通常一个视频分析服务报警只包含一个目标信息。图片类多目标检测类算法除外。)
     */
    @JsonProperty("AlarmObject")
    private Object alarmObject;
}
ycl-platform/src/main/java/com/ycl/dto/videoAlarm/AlarmParam.java
New file
@@ -0,0 +1,32 @@
package com.ycl.dto.videoAlarm;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.util.List;
/**
 * AlarmParam
 *
 * @version V1.0
 * @author: AI
 * @date: 2022-09-20 16:55
 **/
@Data
public class AlarmParam {
    /**
     * 报警相机(视频分析服务器所配置的用于获取视频的采集参数,该组参数用于平台方分辨判定对应的报警节点)
     */
    @JsonProperty("CameraInf")
    private CameraInfParam cameraInf;
    /**
     * 报警图片(BASE64编码后的JPG数据)
     */
    @JsonProperty("PicData")
    private String picData;
    /**
     * 报警信息(通常行为类算法报警一次只会包含一个报警信息。纯单帧图片检测类分析服务有可能会出现同一张图,对应多个不同算法的检测结果的情况,从而上报多个报警信息)
     */
    @JsonProperty("AlarmData")
    private List<AlarmDataParam> alarmData;
}
ycl-platform/src/main/java/com/ycl/dto/videoAlarm/CameraInfParam.java
New file
@@ -0,0 +1,47 @@
package com.ycl.dto.videoAlarm;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.models.auth.In;
import lombok.Data;
/**
 * CameraInfParam
 *
 * @version V1.0
 * @author: AI
 * @date: 2022-09-20 16:55
 **/
@Data
public class CameraInfParam {
    /**
     * 设备或者平台地址
     */
    @JsonProperty("IP")
    private String ip;
    /**
     * 设备或者平台端口
     */
    @JsonProperty("Port")
    private Integer port;
    /**
     * 登录到设备或者平台的用户
     */
    @JsonProperty("User")
    private String user;
    /**
     * 登录到设备或者平台的密码
     */
    @JsonProperty("Password")
    private String password;
    /**
     * 如果登录视频设备获取视频,则这里通常为通道号。
     */
    @JsonProperty("Channel")
    private String channel;
    /**
     * 平台上对应该相机的唯一资源ID
     */
    @JsonProperty("PlatResourceID")
    private String platResourceID;
}
ycl-platform/src/main/java/com/ycl/entity/videoAlarm/VideoAlarmReport.java
New file
@@ -0,0 +1,80 @@
package com.ycl.entity.videoAlarm;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
/**
 * VideoAlarmReport
 *
 * @author: AI
 * @date:  2022-09-20 17:14
 * @version V1.0
**/
@TableName("ums_video_alarm_report")
@Data
@NoArgsConstructor
@AllArgsConstructor
@ApiModel(value = "视频报警推送记录表", description = "")
@Builder
public class VideoAlarmReport {
    @ApiModelProperty("$column.comment")
    @TableField("owner")
    private Integer id;
    @ApiModelProperty("访问地址")
    @TableField("ip")
    private String ip;
    @ApiModelProperty("访问端口")
    @TableField("port")
    private Integer port;
    @ApiModelProperty("登录用户")
    @TableField("user")
    private String user;
    @ApiModelProperty("登录密码")
    @TableField("password")
    private String password;
    @ApiModelProperty("视频通道")
    @TableField("channel")
    private String channel;
    @ApiModelProperty("平台上对应的资源ID")
    @TableField("plat_resource_id")
    private String platResourceId;
    @ApiModelProperty("报警图片")
    @TableField("pic_data")
    private String picData;
    @ApiModelProperty("报警时间")
    @TableField("alarm_time")
    private LocalDateTime alarmTime;
    @ApiModelProperty("$column.comment")
    @TableField("alarm_id")
    private String alarmId;
    @ApiModelProperty("算法类型码")
    @TableField("algo_type")
    private Integer algoType;
    @ApiModelProperty("算法类型名称")
    @TableField("algo_name")
    private String algoName;
    @ApiModelProperty("算法检出对象在图片中的坐标")
    @TableField("alarm_obj")
    private String alarmObj;
}
ycl-platform/src/main/java/com/ycl/mapper/videoAlarm/VideoAlarmReportMapper.java
New file
@@ -0,0 +1,7 @@
package com.ycl.mapper.videoAlarm;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ycl.entity.videoAlarm.VideoAlarmReport;
public interface VideoAlarmReportMapper extends BaseMapper<VideoAlarmReport> {
}
ycl-platform/src/main/java/com/ycl/service/videoAlarm/IVideoAlarmReportService.java
New file
@@ -0,0 +1,25 @@
package com.ycl.service.videoAlarm;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ycl.dto.videoAlarm.AlarmParam;
import com.ycl.entity.videoAlarm.VideoAlarmReport;
import java.util.List;
/**
 * 视频报警推送记录表(UmsVideoAlarmReport)表服务接口
 *
 * @author
 * @since 2022-09-20 17:10:39
 */
public interface IVideoAlarmReportService extends IService<VideoAlarmReport> {
    /**
     * 保存数据
     *
     * @param alarmParam
     * @return void
     * @author AI
     * @date 2022-09-20 17:36
     */
    void save(AlarmParam alarmParam);
}
ycl-platform/src/main/java/com/ycl/service/videoAlarm/impl/VideoAlarmReportServiceImpl.java
New file
@@ -0,0 +1,60 @@
package com.ycl.service.videoAlarm.impl;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ycl.dto.videoAlarm.AlarmDataParam;
import com.ycl.dto.videoAlarm.AlarmParam;
import com.ycl.dto.videoAlarm.CameraInfParam;
import com.ycl.entity.videoAlarm.VideoAlarmReport;
import com.ycl.mapper.videoAlarm.VideoAlarmReportMapper;
import com.ycl.service.videoAlarm.IVideoAlarmReportService;
import org.springframework.stereotype.Service;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Date;
/**
 * VideoAlarmReportServiceImpl
 *
 * @version V1.0
 * @author: AI
 * @date: 2022-09-20 17:36
 **/
@Service
public class VideoAlarmReportServiceImpl extends ServiceImpl<VideoAlarmReportMapper, VideoAlarmReport> implements IVideoAlarmReportService {
    @Override
    public void save(AlarmParam alarmParam) {
        if (alarmParam != null && alarmParam.getAlarmData().size() > 0) {
            CameraInfParam cameraInf = alarmParam.getCameraInf();
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
            String picData = "{}";
            for (int i = 0; i < alarmParam.getAlarmData().size(); i++) {
                AlarmDataParam alarmData = alarmParam.getAlarmData().get(i);
                /******************** 处理图片 **********************/
                try {
                    Date date = sdf.parse(alarmData.getAlarmTime());
                    Instant instant = date.toInstant();
                    ZoneId zoneId = ZoneId.systemDefault();
                    VideoAlarmReport videoAlarmReport = VideoAlarmReport.builder()
                            .ip(cameraInf.getIp()).port(cameraInf.getPort())
                            .user(cameraInf.getUser()).password(cameraInf.getPassword())
                            .channel(cameraInf.getChannel()).platResourceId(cameraInf.getPlatResourceID())
                            .picData(picData).alarmTime(instant.atZone(zoneId).toLocalDateTime())
                            .alarmId(alarmData.getAlarmID()).algoType(alarmData.getAlgoType())
                            .algoName(alarmData.getAlgoName()).alarmObj(JSON.toJSONString(alarmData.getAlarmObject()))
                            .build();
                    baseMapper.insert(videoAlarmReport);
                } catch (ParseException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
ycl-platform/src/main/resources/mapper/videoAlarm/VideoAlarmReportDao.xml
New file
@@ -0,0 +1,21 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ycl.dao.UmsVideoAlarmReportDao">
    <resultMap type="com.ycl.entity.videoAlarm.VideoAlarmReport" id="VideoAlarmReportMap">
        <result property="id" column="id"/>
        <result property="ip" column="ip"/>
        <result property="port" column="port"/>
        <result property="user" column="user"/>
        <result property="password" column="password"/>
        <result property="channel" column="channel"/>
        <result property="platResourceId" column="plat_resource_id"/>
        <result property="picData" column="pic_data"/>
        <result property="alarmTime" column="alarm_time"/>
        <result property="alarmId" column="alarm_id"/>
        <result property="algoType" column="algo_type"/>
        <result property="algoName" column="algo_name"/>
        <result property="alarmObj" column="alarm_obj"/>
    </resultMap>
</mapper>