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>