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>