wl
2022-12-07 a9be2e0bfbd8e716207fc467e2699d9caec76a7c
feat: 实时视频Api
fix: 事件Api 视频点位api 视频巡查api
10个文件已修改
3个文件已添加
487 ■■■■■ 已修改文件
ycl-platform/src/main/java/com/ycl/controller/cockpit/aiIot/AIIotController.java 42 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/controller/cockpit/enforcementEvents/EnforcementEventsController.java 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/controller/platformApi/AlarmController.java 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/mapper/caseHandler/BaseCaseMapper.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/service/caseHandler/IBaseCaseService.java 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/service/caseHandler/impl/BaseCaseServiceImpl.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/util/VideoUtil.java 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/vo/casePool/BaseCaseVO.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/vo/cockpit/aiIot/AIIotVO.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/vo/cockpit/aiIot/VideoVO.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/vo/cockpit/enforcementEvents/EnforcementEventsVO.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/vo/cockpit/enforcementEvents/EventVO.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/resources/mapper/caseHandler/BaseCaseMapper.xml 78 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/controller/cockpit/aiIot/AIIotController.java
@@ -1,16 +1,18 @@
package com.ycl.controller.cockpit.aiIot;
import com.ycl.api.CommonResult;
import com.ycl.service.video.impl.IVideoPointService;
import com.ycl.util.CheckApiUtil;
import com.ycl.util.VideoUtil;
import com.ycl.vo.cockpit.CockpitVO;
import com.ycl.vo.cockpit.aiIot.AIIotVO;
import com.ycl.vo.cockpit.aiIot.VideoVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@@ -18,6 +20,7 @@
import java.math.RoundingMode;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
 * @author Lyq
@@ -31,6 +34,11 @@
    @Resource
    private CheckApiUtil checkApiUtil;
    @Autowired
    private IVideoPointService iVideoPointService;
    @Autowired
    private VideoUtil videoUtil;
    @ApiOperation(value = "监测数据")
    @GetMapping("/detection")
@@ -47,23 +55,19 @@
    @ApiOperation(value = "实时视频监控")
    @GetMapping("/video")
    public CommonResult<List<AIIotVO.VideoVO>> video(@Validated CockpitVO params) {
        checkApiUtil.cockpit(params);
        List<AIIotVO.VideoVO> videoVOS = new ArrayList<>();
        AIIotVO.VideoVO a = null;
        for (int i = 0; i < 4; i++) {
            a = new AIIotVO.VideoVO();
            a.setLongitude("32.11");
            a.setLatitude("106.111");
            a.setName("设备一");
            a.setResourceId("012");
            a.setBrand("大华");
            a.setModel("球机");
            a.setIp("10.23.14.2");
            a.setUrl("http://10.23.14.2:12001");
            videoVOS.add(a);
        }
        return CommonResult.success(videoVOS);
    public CommonResult video(@Validated CockpitVO params) {
        //checkApiUtil.cockpit(params);
        return CommonResult.success(iVideoPointService.list().stream().map(item -> {
            VideoVO videoVO = new VideoVO();
            videoVO.setName(item.getName());
            videoVO.setBrand(item.getEquipmentBrand());
            videoVO.setModel(item.getEquipmentModel());
            videoVO.setIp(item.getEquipmentIp());
            videoVO.setLatitude(item.getLatitude().toString());
            videoVO.setLongitude(item.getLongitude().toString());
            videoVO.setUrl(videoUtil.getVideo(item.getPlatResourceId(), "HLS", 0));
            return videoVO;
        }).collect(Collectors.toList()));
    }
    @ApiOperation(value = "AI算法效能")
ycl-platform/src/main/java/com/ycl/controller/cockpit/enforcementEvents/EnforcementEventsController.java
@@ -1,11 +1,13 @@
package com.ycl.controller.cockpit.enforcementEvents;
import com.ycl.api.CommonResult;
import com.ycl.service.caseHandler.IBaseCaseService;
import com.ycl.util.CheckApiUtil;
import com.ycl.vo.cockpit.CockpitVO;
import com.ycl.vo.cockpit.enforcementEvents.EnforcementEventsVO;
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.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@@ -30,6 +32,9 @@
public class EnforcementEventsController {
    @Resource
    private CheckApiUtil checkApiUtil;
    @Autowired
    IBaseCaseService iBaseCaseService;
    @ApiOperation(value = "执法事件统计")
    @GetMapping("/statistics")
@@ -137,18 +142,11 @@
    public CommonResult<EnforcementEventsVO.InfoVO> info(@Validated CockpitVO params) {
        checkApiUtil.cockpit(params);
        EnforcementEventsVO.InfoVO infoVO = new EnforcementEventsVO.InfoVO();
        EnforcementEventsVO.EventVO eventVO = new EnforcementEventsVO.EventVO();
        infoVO.setToday(5);
        infoVO.setWeek(10);
        infoVO.setDispatch(20);
        infoVO.setIdentification(20);
        eventVO.setDescription("事件描述");
        eventVO.setAddress("事发地址");
        eventVO.setAlarmTime("2022-10-15 16:12:13");
        eventVO.setPoint("1号点位");
        eventVO.setPicture("http://12.2.23.4/xx.png");
        eventVO.setSource("AI识别");
        infoVO.setEvent(eventVO);
        infoVO.setToday(iBaseCaseService.dayCount());
        infoVO.setWeek(iBaseCaseService.weekCount());
        infoVO.setDispatch(iBaseCaseService.dispatchCount());
        infoVO.setIdentification(iBaseCaseService.alCount());
        infoVO.setEvent(iBaseCaseService.selectEventList(params.getBeginTime(),params.getEndTime()));
        return CommonResult.success(infoVO);
    }
ycl-platform/src/main/java/com/ycl/controller/platformApi/AlarmController.java
@@ -1,29 +1,17 @@
package com.ycl.controller.platformApi;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.ycl.api.CommonResult;
import com.ycl.dto.v1.Req.FirstReq;
import com.ycl.dto.v1.Req.SecondReq;
import com.ycl.dto.v1.Res.FirstRes;
import com.ycl.dto.video.AlarmParam;
import com.ycl.enums.common.ResultCode;
import com.ycl.service.video.IVideoAlarmReportService;
import com.ycl.utils.MD5Util;
import com.ycl.util.VideoUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.SneakyThrows;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.*;
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.DefaultResponseErrorHandler;
import org.springframework.web.client.RestTemplate;
import java.net.URI;
/**
 * @author admin
@@ -33,19 +21,11 @@
@RequestMapping("/API")
public class AlarmController {
    @Value("${videoPoint.url}")
    private String url;
    @Value("${videoPoint.userName}")
    private String userName;
    @Value("${videoPoint.passWord}")
    private String passWord;
    @Value("${videoPoint.ip}")
    private String ip;
    private IVideoAlarmReportService videoAlarmReportService;
    @Autowired
    private VideoUtil videoUtil;
    @Autowired
    public void setVideoAlarmReportService(IVideoAlarmReportService videoAlarmReportService) {
@@ -59,77 +39,19 @@
        return new CommonResult(ResultCode.SUCCESS.getCode(), ResultCode.SUCCESS.getMessage());
    }
    @GetMapping("/Video/{code}/{subType}")
    @GetMapping("/video")
    @ApiOperation(value = "设备获取监控地址")
    @SneakyThrows
    public CommonResult getMonitorAddress(@PathVariable String code, @PathVariable Integer subType,
    public CommonResult getMonitorAddress(@RequestParam String code,
                                          @RequestParam(required = false) Integer subType,
                                          @RequestParam(required = false) String scheme) {
        String clientType = "winpc";
        String reqUrl = "/videoService/accounts/authorize";
        String deviceUrl = "/videoService/devicesManager/devices";
        if (subType == null) {
            subType = 1;
        }
        if (!StringUtils.isNotBlank(scheme)) {
        if (StringUtils.isBlank(scheme)) {
            scheme = "RTSP";
        }
        String monitorUrl = "/videoService/realmonitor/uri?subType=" + subType + "&scheme=" + scheme + "&channelId=";
        RestTemplate restTemplate = new RestTemplate();
        restTemplate.setErrorHandler(new DefaultResponseErrorHandler() {
            @Override
            public boolean hasError(HttpStatus status) {
                return super.hasError(status);
            }
            @Override
            public void handleError(URI url, HttpMethod method, ClientHttpResponse response) {
            }
        });
        SimpleClientHttpRequestFactory simpleClientHttpRequestFactory = new SimpleClientHttpRequestFactory();
        simpleClientHttpRequestFactory.setOutputStreaming(false);
        restTemplate.setRequestFactory(simpleClientHttpRequestFactory);
        //请求头
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.setContentType(MediaType.APPLICATION_JSON);
        //第一次权限请求体
        FirstReq firstReq = new FirstReq();
        firstReq.setIpAddress(ip);
        firstReq.setUserName(userName);
        firstReq.setClientType(clientType);
        ObjectMapper objectMapper = new ObjectMapper();
        HttpEntity<String> firstEntity = new HttpEntity<>(objectMapper.writeValueAsString(firstReq), httpHeaders);
        ResponseEntity<String> responseEntity = restTemplate.postForEntity(url + reqUrl, firstEntity, String.class);
        FirstRes firstRes = objectMapper.readValue(responseEntity.getBody(), FirstRes.class);
        String signature = MD5Util.md5Encrypt(passWord);
        signature = MD5Util.md5Encrypt(userName + signature);
        signature = MD5Util.md5Encrypt(signature);
        signature = MD5Util.md5Encrypt(userName + ":" + firstRes.getRealm() + ":" + signature);
        signature = MD5Util.md5Encrypt(signature + ":" + firstRes.getRandomKey());
        SecondReq secondReq = new SecondReq();
        secondReq.setIpAddress(ip);
        secondReq.setEncryptType(firstRes.getEncryptType());
        secondReq.setSignature(signature);
        secondReq.setRandomKey(firstRes.getRandomKey());
        secondReq.setClientType(clientType);
        secondReq.setUserName(userName);
        HttpEntity<String> secondEntity = new HttpEntity<>(objectMapper.writeValueAsString(secondReq), httpHeaders);
        ResponseEntity<String> secondResEntity = restTemplate.postForEntity(url + reqUrl, secondEntity, String.class);
        HttpHeaders deviceHeaders = new HttpHeaders();
        deviceHeaders.add("X-Subject-Token", objectMapper.readTree(secondResEntity.getBody()).get("token").textValue());
        HttpEntity<Object> deviceEntity = new HttpEntity<>(deviceHeaders);
        ResponseEntity<String> exchange = restTemplate.exchange(url + deviceUrl + "/" + code, HttpMethod.GET, deviceEntity, String.class);
        String channelId = objectMapper.readTree(objectMapper.readTree(objectMapper.readTree(exchange.getBody()).get("encoderUnit").toString()).get("channels").get(0).toString()).get("channelId").textValue();
        ResponseEntity<String> monitorReq = restTemplate.exchange(url + monitorUrl + channelId, HttpMethod.GET, deviceEntity, String.class);
        return CommonResult.successApi(objectMapper.readTree(monitorReq.getBody()).get("url"));
        return CommonResult.successApi(videoUtil.getVideo(code, scheme, subType));
    }
}
ycl-platform/src/main/java/com/ycl/mapper/caseHandler/BaseCaseMapper.java
@@ -10,6 +10,8 @@
import com.ycl.vo.casePool.CasePoolIllegalBuildingVO;
import com.ycl.vo.casePool.CasePoolViolationVO;
import com.ycl.vo.casePool.QueryForViolationVO;
import com.ycl.vo.cockpit.enforcementEvents.EnforcementEventsVO;
import com.ycl.vo.cockpit.enforcementEvents.EventVO;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@@ -37,4 +39,14 @@
    List<QueryForViolationVO> selectViolationPage(QueryForViolationParam queryForViolationParam);
    Page<BaseCaseVO> selectVideoInspection(Page<Object> objectPage);
    Integer dayCount();
    Integer weekCount();
    Integer dispatchCount();
    List<EventVO> selectEventList(String beginTime, String endTime);
    Integer alCount();
}
ycl-platform/src/main/java/com/ycl/service/caseHandler/IBaseCaseService.java
@@ -9,6 +9,7 @@
import com.ycl.entity.caseHandler.BaseCaseDetail;
import com.ycl.vo.casePool.BaseCaseVO;
import com.ycl.vo.casePool.QueryForViolationVO;
import com.ycl.vo.cockpit.enforcementEvents.EventVO;
import java.util.ArrayList;
import java.util.List;
@@ -37,9 +38,10 @@
    Page listIllegalBuilding(Page page, Integer state, Integer resource);
    Boolean saveViolationCase(ViolationParam violationParam,Long id);
    Boolean saveViolationCase(ViolationParam violationParam, Long id);
    Boolean saveIllegalBuildingCase(IllegalBuildingParam illegalBuildingParam, Long id);
    /**
     * 同步案件进度
     *
@@ -54,7 +56,7 @@
    ArrayList<String> listCaseImages(Integer id, Integer type);
    void endCase(Long caseId, String result,String opinion);
    void endCase(Long caseId, String result, String opinion);
    Page<BaseCase> selectPage(Page<BaseCase> setSize, String number, Integer streetId, Integer categories, String startTime, String endTime, String site);
@@ -64,7 +66,17 @@
    Page<BaseCaseVO> selectVideoInspection(Integer current);
    Map<String,Object> selectCount();
    Map<String, Object> selectCount();
    Boolean updateCase(ViolationParam violationParam);
    Integer dayCount();
    Integer weekCount();
    Integer dispatchCount();
    Integer alCount();
    List<EventVO> selectEventList(String beginTime, String endTime);
}
ycl-platform/src/main/java/com/ycl/service/caseHandler/impl/BaseCaseServiceImpl.java
@@ -31,6 +31,8 @@
import com.ycl.service.caseHandler.IViolationsService;
import com.ycl.service.video.IVideoAlarmReportService;
import com.ycl.vo.casePool.*;
import com.ycl.vo.cockpit.enforcementEvents.EnforcementEventsVO;
import com.ycl.vo.cockpit.enforcementEvents.EventVO;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
@@ -414,7 +416,11 @@
    public Map<String, Object> selectCount() {
        HashMap<String, Object> map = new HashMap<>();
        Long review = baseCaseMapper.selectCount(new LambdaQueryWrapper<BaseCase>().eq(BaseCase::getState, 1));
        Long register = baseCaseMapper.selectCount(new LambdaQueryWrapper<BaseCase>().in(BaseCase::getState, 2,6));
        Long study = baseCaseMapper.selectCount(new LambdaQueryWrapper<BaseCase>().eq(BaseCase::getState, 3));
        map.put("review", review);
        map.put("register",register);
        map.put("study",study);
        return map;
    }
@@ -442,4 +448,29 @@
        }
        return violationsMapper.insert(violations) == 1 ? true : false;
    }
    @Override
    public Integer dayCount() {
        return baseCaseMapper.dayCount();
    }
    @Override
    public Integer weekCount() {
        return baseCaseMapper.weekCount();
    }
    @Override
    public Integer dispatchCount() {
        return baseCaseMapper.dispatchCount();
    }
    @Override
    public Integer alCount() {
        return baseCaseMapper.alCount();
    }
    @Override
    public List<EventVO> selectEventList(String beginTime, String endTime) {
        return baseCaseMapper.selectEventList(beginTime,endTime);
    }
}
ycl-platform/src/main/java/com/ycl/util/VideoUtil.java
New file
@@ -0,0 +1,99 @@
package com.ycl.util;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.ycl.api.CommonResult;
import com.ycl.dto.v1.Req.FirstReq;
import com.ycl.dto.v1.Req.SecondReq;
import com.ycl.dto.v1.Res.FirstRes;
import com.ycl.utils.MD5Util;
import lombok.SneakyThrows;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.*;
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.client.DefaultResponseErrorHandler;
import org.springframework.web.client.RestTemplate;
import java.net.URI;
@Component
public class VideoUtil {
    @Value("${videoPoint.url}")
    private  String url;
    @Value("${videoPoint.userName}")
    private  String userName;
    @Value("${videoPoint.passWord}")
    private  String passWord;
    @Value("${videoPoint.ip}")
    private  String ip;
    @SneakyThrows
    public  String getVideo(String code, String scheme,Integer subType) {
        String clientType = "winpc";
        String reqUrl = "/videoService/accounts/authorize";
        String deviceUrl = "/videoService/devicesManager/devices";
        String monitorUrl = "/videoService/realmonitor/uri?subType=" + subType + "&scheme=" + scheme + "&channelId=";
        RestTemplate restTemplate = new RestTemplate();
        restTemplate.setErrorHandler(new DefaultResponseErrorHandler() {
            @Override
            public boolean hasError(HttpStatus status) {
                return super.hasError(status);
            }
            @Override
            public void handleError(URI url, HttpMethod method, ClientHttpResponse response) {
            }
        });
        SimpleClientHttpRequestFactory simpleClientHttpRequestFactory = new SimpleClientHttpRequestFactory();
        simpleClientHttpRequestFactory.setOutputStreaming(false);
        restTemplate.setRequestFactory(simpleClientHttpRequestFactory);
        //请求头
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.setContentType(MediaType.APPLICATION_JSON);
        //第一次权限请求体
        FirstReq firstReq = new FirstReq();
        firstReq.setIpAddress(ip);
        firstReq.setUserName(userName);
        firstReq.setClientType(clientType);
        ObjectMapper objectMapper = new ObjectMapper();
        HttpEntity<String> firstEntity = new HttpEntity<>(objectMapper.writeValueAsString(firstReq), httpHeaders);
        ResponseEntity<String> responseEntity = restTemplate.postForEntity(url + reqUrl, firstEntity, String.class);
        FirstRes firstRes = objectMapper.readValue(responseEntity.getBody(), FirstRes.class);
        String signature = MD5Util.md5Encrypt(passWord);
        signature = MD5Util.md5Encrypt(userName + signature);
        signature = MD5Util.md5Encrypt(signature);
        signature = MD5Util.md5Encrypt(userName + ":" + firstRes.getRealm() + ":" + signature);
        signature = MD5Util.md5Encrypt(signature + ":" + firstRes.getRandomKey());
        SecondReq secondReq = new SecondReq();
        secondReq.setIpAddress(ip);
        secondReq.setEncryptType(firstRes.getEncryptType());
        secondReq.setSignature(signature);
        secondReq.setRandomKey(firstRes.getRandomKey());
        secondReq.setClientType(clientType);
        secondReq.setUserName(userName);
        HttpEntity<String> secondEntity = new HttpEntity<>(objectMapper.writeValueAsString(secondReq), httpHeaders);
        ResponseEntity<String> secondResEntity = restTemplate.postForEntity(url + reqUrl, secondEntity, String.class);
        HttpHeaders deviceHeaders = new HttpHeaders();
        deviceHeaders.add("X-Subject-Token", objectMapper.readTree(secondResEntity.getBody()).get("token").textValue());
        HttpEntity<Object> deviceEntity = new HttpEntity<>(deviceHeaders);
        ResponseEntity<String> exchange = restTemplate.exchange(url + deviceUrl + "/" + code, HttpMethod.GET, deviceEntity, String.class);
        String channelId = objectMapper.readTree(objectMapper.readTree(objectMapper.readTree(exchange.getBody()).get("encoderUnit").toString()).get("channels").get(0).toString()).get("channelId").textValue();
        ResponseEntity<String> monitorReq = restTemplate.exchange(url + monitorUrl + channelId, HttpMethod.GET, deviceEntity, String.class);
        return objectMapper.readTree(monitorReq.getBody()).get("url").textValue();
    }
}
ycl-platform/src/main/java/com/ycl/vo/casePool/BaseCaseVO.java
@@ -7,6 +7,7 @@
@Data
public class BaseCaseVO {
    private Integer baseId;
    private String code;
    private String name;
    private String urlAddress;
ycl-platform/src/main/java/com/ycl/vo/cockpit/aiIot/AIIotVO.java
@@ -30,26 +30,7 @@
        private Integer slagCar;
    }
    @ApiModel(description = "实时监控")
    @Data
    public static class VideoVO {
        @ApiModelProperty(value = "点位经度")
        private String longitude;
        @ApiModelProperty(value = "点位纬度")
        private String latitude;
        @ApiModelProperty(value = "点位名称")
        private String name;
        @ApiModelProperty(value = "设备唯一编码")
        private String resourceId;
        @ApiModelProperty(value = "设备品牌")
        private String brand;
        @ApiModelProperty(value = "设备型号")
        private String model;
        @ApiModelProperty(value = "设备IP地址")
        private String ip;
        @ApiModelProperty(value = "URL地址")
        private String url;
    }
    @ApiModel(description = "AI算法效能")
    @Data
ycl-platform/src/main/java/com/ycl/vo/cockpit/aiIot/VideoVO.java
New file
@@ -0,0 +1,26 @@
package com.ycl.vo.cockpit.aiIot;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel(value = "实时监控")
public class VideoVO {
    @ApiModelProperty(value = "点位经度")
    private String longitude;
    @ApiModelProperty(value = "点位纬度")
    private String latitude;
    @ApiModelProperty(value = "点位名称")
    private String name;
    @ApiModelProperty(value = "设备唯一编码")
    private String resourceId;
    @ApiModelProperty(value = "设备品牌")
    private String brand;
    @ApiModelProperty(value = "设备型号")
    private String model;
    @ApiModelProperty(value = "设备IP地址")
    private String ip;
    @ApiModelProperty(value = "URL地址")
    private String url;
}
ycl-platform/src/main/java/com/ycl/vo/cockpit/enforcementEvents/EnforcementEventsVO.java
@@ -83,25 +83,6 @@
        @ApiModelProperty(value = "AI识别的事件总数")
        private Integer identification;
        @ApiModelProperty(value = "具体事件的数据信息")
        private EnforcementEventsVO.EventVO event;
        private List<EventVO> event;
    }
    @Data
    @ApiModel(description = "具体事件的数据信息")
    public static class EventVO {
        @ApiModelProperty(value = "事件描述")
        private String description;
        @ApiModelProperty(value = "事发地点")
        private String address;
        @ApiModelProperty(value = "发生时间")
        private String alarmTime;
        @ApiModelProperty(value = "关联摄像点位")
        private String point;
        @ApiModelProperty(value = "监控画面")
        private String picture;
        @ApiModelProperty(value = "来源")
        private String source;
    }
}
ycl-platform/src/main/java/com/ycl/vo/cockpit/enforcementEvents/EventVO.java
New file
@@ -0,0 +1,20 @@
package com.ycl.vo.cockpit.enforcementEvents;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class EventVO {
    @ApiModelProperty(value = "事件描述")
    private String description;
    @ApiModelProperty(value = "事发地点")
    private String address;
    @ApiModelProperty(value = "发生时间")
    private String alarmTime;
    @ApiModelProperty(value = "关联摄像点位")
    private String point;
    @ApiModelProperty(value = "监控画面")
    private String picture;
    @ApiModelProperty(value = "来源")
    private String source;
}
ycl-platform/src/main/resources/mapper/caseHandler/BaseCaseMapper.xml
@@ -229,26 +229,70 @@
    </select>
    <select id="selectVideoInspection" resultType="com.ycl.vo.casePool.BaseCaseVO">
        SELECT t1.id         as baseId,
               t1.`code`,
               t3.`name`,
               t3.url_address,
               t3.longitude,
               t3.latitude,
               t4.pic_data,
               t5.`name`     as grade,
               t6.`name`     as street,
               t7.`name`     as community,
               t1.alarm_time as alarmTime
        FROM ums_base_case t1
                 LEFT JOIN ums_violations t2 ON t1.id = t2.id
                 LEFT JOIN ums_video_point t3 on t2.video_point_id = t3.id
                 LEFT JOIN ums_video_alarm_report t4 on t4.id = t2.video_alarm_report_id
                 LEFT JOIN ums_data_dictionary t5 on t5.id = t2.grade_id
                 LEFT JOIN ums_sccg_region t6 on t6.id = t1.street_id
                 LEFT JOIN ums_sccg_region t7 on t7.id = t1.community_id
        WHERE t1.state = 1
        group by t1.id
    </select>
    <select id="dayCount" resultType="java.lang.Integer">
        select count(1)
        from ums_base_case
        where to_days(create_time) = TO_DAYS(now());
    </select>
    <select id="weekCount" resultType="java.lang.Integer">
        select count(1)
        from ums_base_case
        WHERE YEARWEEK(date_format(create_time, '%Y-%m-%d')) = YEARWEEK(now());;
    </select>
    <select id="dispatchCount" resultType="java.lang.Integer">
        select count(1)
        FROM
            ums_base_case t1
                LEFT JOIN ums_dispose_record t2 ON t1.id = t2.base_case_id
        WHERE
            t2.workflow_config_step_id =1
    </select>
    <select id="alCount" resultType="java.lang.Integer">
        select count(1)
        FROM
            ums_base_case WHERE event_source=1;
    </select>
    <select id="selectEventList" resultType="com.ycl.vo.cockpit.enforcementEvents.EventVO">
        SELECT
            t1.`code`,
            t3.`name`,
            t3.url_address,
            t3.longitude,
            t3.latitude,
            t4.pic_data,
            t5.`name` as grade,
            t6.`name` as street,
            t7.`name` as community,
            t1.alarm_time as alarmTime
            t1.alarm_time,
            ( CASE WHEN t1.event_source = 1 THEN "视频巡查" WHEN t1.event_source = 2 THEN "人工上报" ELSE "其他" END ) AS source,
            t1.site AS address,
            t2.description,
            t3.`name` AS point,
            t4.pic_data AS picture
        FROM
            ums_base_case t1
                LEFT JOIN ums_violations t2 ON t1.id = t2.id
                LEFT JOIN ums_video_point t3 on t2.video_point_id=t3.id
                LEFT JOIN ums_video_alarm_report t4 on t4.id=t2.video_alarm_report_id
                LEFT JOIN ums_data_dictionary t5 on t5.id=t2.grade_id
                LEFT JOIN ums_data_dictionary t6 on t6.id=t1.street_id
                LEFT JOIN ums_data_dictionary t7 on t7.id=t1.community_id
        WHERE t1.state=1
       group by t1.id
                LEFT JOIN ums_video_point t3 ON t3.id = t2.video_point_id
                LEFT JOIN ums_video_alarm_report t4 ON t4.id = t2.video_alarm_report_id
        <where>
            <if test="beginTime !=''and beginTime!=null and endTime!=''and endTime!=null">
                t1.create_time BETWEEN #{beginTime}
                AND #{endTime}
            </if>
        </where>
    </select>
</mapper>