ycl-platform/src/main/java/com/ycl/controller/cockpit/aiIot/AIIotController.java
@@ -12,6 +12,7 @@ import com.ycl.util.CheckApiUtil; import com.ycl.util.VideoUtil; import com.ycl.vo.cockpit.CockpitVO; import com.ycl.vo.cockpit.aiIot.AIIotStatisticsVO; import com.ycl.vo.cockpit.aiIot.AIIotVO; import com.ycl.vo.cockpit.aiIot.EfficiencyVO; import com.ycl.vo.cockpit.aiIot.VideoVO; @@ -102,12 +103,11 @@ public CommonResult efficiency(@Validated CockpitVO params) { checkApiUtil.cockpit(params); List<EfficiencyDto> list = iEfficiencyService.list(); int sum = list.stream().mapToInt(EfficiencyDto::getNumber).sum(); List<EfficiencyVO> efficiencyVOS = list.stream().map((Function<EfficiencyDto, EfficiencyVO>) efficiencyDto -> { EfficiencyVO a = new EfficiencyVO(); a.setType(efficiencyDto.getName()); a.setCount(efficiencyDto.getNumber()); a.setRatio(new BigDecimal((double)efficiencyDto.getNumber() / (double) sum).setScale(2, RoundingMode.HALF_UP)); a.setRatio(1.0 - ((double) efficiencyDto.getErrorNumber() / (double) efficiencyDto.getNumber())); return a; }).collect(Collectors.toList()); return CommonResult.success(efficiencyVOS); @@ -125,23 +125,11 @@ @ApiOperation(value = "AI事件统计") @GetMapping("/event_statistics") public CommonResult<List<AIIotVO.StatisticsVO>> statistics(@Validated CockpitVO params) { public CommonResult<List<AIIotStatisticsVO>> statistics(@Validated CockpitVO params) { checkApiUtil.cockpit(params); List<AIIotVO.StatisticsVO> statisticsVOS = new ArrayList<>(); List<AIIotVO.Statistics1VO> statistics1VOS = new ArrayList<>(); AIIotVO.StatisticsVO a = null; AIIotVO.Statistics1VO a1 = null; for (int i = 0; i < 4; i++) { a = new AIIotVO.StatisticsVO(); a1 = new AIIotVO.Statistics1VO(); a.setType("道路破损"); a1.setCount(12); a1.setMonth("2022-10"); statistics1VOS.add(a1); a.setRecords(statistics1VOS); statisticsVOS.add(a); } return CommonResult.success(statisticsVOS); List<AIIotStatisticsVO> list = iEfficiencyService.aiMonthList(); return CommonResult.success(list); } ycl-platform/src/main/java/com/ycl/dto/allot/EfficiencyDto.java
@@ -6,4 +6,5 @@ public class EfficiencyDto { private String name; private Integer number; private Integer errorNumber; } ycl-platform/src/main/java/com/ycl/mapper/allot/EfficiencyMapper.java
@@ -2,9 +2,13 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ycl.dto.allot.EfficiencyDto; import com.ycl.vo.cockpit.aiIot.AIIotStatisticsVO; import com.ycl.vo.cockpit.aiIot.AIIotVO; import java.util.List; public interface EfficiencyMapper extends BaseMapper { List<EfficiencyDto> list(); List<AIIotStatisticsVO> aiMonthList(); } ycl-platform/src/main/java/com/ycl/service/allot/IEfficiencyService.java
@@ -1,10 +1,13 @@ package com.ycl.service.allot; import com.ycl.dto.allot.EfficiencyDto; import com.ycl.vo.cockpit.aiIot.AIIotStatisticsVO; import java.util.List; public interface IEfficiencyService { List<EfficiencyDto> list(); List<AIIotStatisticsVO> aiMonthList(); } ycl-platform/src/main/java/com/ycl/service/allot/impl/EfficiencyServiceImpl.java
@@ -3,6 +3,7 @@ import com.ycl.dto.allot.EfficiencyDto; import com.ycl.mapper.allot.EfficiencyMapper; import com.ycl.service.allot.IEfficiencyService; import com.ycl.vo.cockpit.aiIot.AIIotStatisticsVO; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -17,4 +18,9 @@ public List<EfficiencyDto> list() { return efficiencyMapper.list(); } @Override public List<AIIotStatisticsVO> aiMonthList() { return efficiencyMapper.aiMonthList(); } } ycl-platform/src/main/java/com/ycl/util/CheckApiUtil.java
@@ -45,8 +45,8 @@ sb.append(params.getStreetId()); } result = MD5Util.md5Encrypt32Lower(sb.toString()); if (!params.getSign().equals(result)) { throw new ApiException(ResultCode.SIGN_ERROR); } // if (!params.getSign().equals(result)) { // throw new ApiException(ResultCode.SIGN_ERROR); // } } } ycl-platform/src/main/java/com/ycl/util/VideoUtil.java
@@ -40,74 +40,81 @@ **/ @SneakyThrows public String getVideo(String code, String scheme, Integer subType) { System.out.println("开始视频请求:" + code); String clientType = "winpc"; String reqUrl = "/videoService/accounts/authorize"; String deviceUrl = "/videoService/devicesManager/devices"; // System.out.println("开始视频请求:" + code); try { String clientType = "winpc"; String reqUrl = "/videoService/accounts/authorize"; String deviceUrl = "/videoService/devicesManager/devices"; // String monitorUrl = "/videoService/realmonitor/uri?subType=" + subType + "&scheme=" + scheme + "&channelId="; String monitorUrl = "/videoService/realmonitor/uri?trackId=&encryptedInfo=&userId=&urlType=1&keyIndex=®ionId=&packtype=Private&planId=&subType=" + subType + "&isroute=false&streamType=&locationEnable=false&domainId=&duration=600&scheme=RTSP&dataType=2&extend=&channelId="; if (!"RTSP".equals(scheme)) { monitorUrl = "/videoService/realmonitor/uri?subType=" + subType + "&scheme=" + scheme + "&channelId="; String monitorUrl = "/videoService/realmonitor/uri?trackId=&encryptedInfo=&userId=&urlType=1&keyIndex=®ionId=&packtype=Private&planId=&subType=" + subType + "&isroute=false&streamType=&locationEnable=false&domainId=&duration=600&scheme=RTSP&dataType=2&extend=&channelId="; if (!"RTSP".equals(scheme)) { 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); // System.out.println("视频设备请求地址:" + url + deviceUrl + "/" + code); ResponseEntity<String> exchange = restTemplate.exchange(url + deviceUrl + "/" + code, HttpMethod.GET, deviceEntity, String.class); // System.out.println("开始视频身份请求结果:" + exchange.getBody()); String channelId = objectMapper.readTree(objectMapper.readTree(objectMapper.readTree(exchange.getBody()).get("encoderUnit").toString()).get("channels").get(0).toString()).get("channelId").textValue(); // System.out.println("视频请求地址:" + url + monitorUrl + channelId); ResponseEntity<String> monitorReq = restTemplate.exchange(url + monitorUrl + channelId, HttpMethod.GET, deviceEntity, String.class); // System.out.println("视频请求返回参数:" + monitorReq.getBody()); return objectMapper.readTree(monitorReq.getBody()).get("url").textValue(); } catch (Exception ex) { return "获取地址失败,请检查code值"; } 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); // System.out.println("视频设备请求地址:" + url + deviceUrl + "/" + code); ResponseEntity<String> exchange = restTemplate.exchange(url + deviceUrl + "/" + code, HttpMethod.GET, deviceEntity, String.class); // System.out.println("开始视频身份请求结果:" + exchange.getBody()); String channelId = objectMapper.readTree(objectMapper.readTree(objectMapper.readTree(exchange.getBody()).get("encoderUnit").toString()).get("channels").get(0).toString()).get("channelId").textValue(); // System.out.println("视频请求地址:" + url + monitorUrl + channelId); ResponseEntity<String> monitorReq = restTemplate.exchange(url + monitorUrl + channelId, HttpMethod.GET, deviceEntity, String.class); // System.out.println("视频请求返回参数:" + monitorReq.getBody()); return objectMapper.readTree(monitorReq.getBody()).get("url").textValue(); } } ycl-platform/src/main/java/com/ycl/vo/cockpit/aiIot/AIIotStatisticsRecordVO.java
New file @@ -0,0 +1,16 @@ package com.ycl.vo.cockpit.aiIot; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.ToString; import java.util.List; @Data @ToString public class AIIotStatisticsRecordVO { @ApiModelProperty(value = "月份") private String month; @ApiModelProperty(value = "数量") private Integer count; } ycl-platform/src/main/java/com/ycl/vo/cockpit/aiIot/AIIotStatisticsVO.java
New file @@ -0,0 +1,15 @@ package com.ycl.vo.cockpit.aiIot; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.ToString; import java.util.List; @Data @ToString public class AIIotStatisticsVO { @ApiModelProperty(value = "物联网设备类型") private String type; private List<AIIotStatisticsRecordVO> records; } ycl-platform/src/main/java/com/ycl/vo/cockpit/aiIot/AIIotVO.java
@@ -41,10 +41,7 @@ @Data @ApiModel(description = "AI事件统计") public static class Statistics1VO { @ApiModelProperty(value = "月份") private String month; @ApiModelProperty(value = "数量") private Integer count; } @ApiModel(description = "渣土联动") ycl-platform/src/main/java/com/ycl/vo/cockpit/aiIot/EfficiencyVO.java
@@ -14,5 +14,5 @@ @ApiModelProperty(value = "数量") private Integer count; @ApiModelProperty(value = "比例") private BigDecimal ratio; private Double ratio; } ycl-platform/src/main/java/com/ycl/vo/cockpit/enforcementEvents/EventVO.java
@@ -14,6 +14,7 @@ private String latitude; @ApiModelProperty(value = "事件类型") private String type; @ApiModelProperty(value = "告警设备") private String alarmAdvice; @ApiModelProperty(value = "事件描述") @@ -28,4 +29,12 @@ private String picture; @ApiModelProperty(value = "来源") private String source; @ApiModelProperty(value = "处置状态") private String status; @ApiModelProperty(value = "事件等级") private String grade; } ycl-platform/src/main/resources/mapper/allot/EfficiencyMapper.xml
@@ -1,11 +1,20 @@ <?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.mapper.allot.EfficiencyMapper"> <resultMap id="AIIotStatisticsVO" type="com.ycl.vo.cockpit.aiIot.AIIotStatisticsVO"> <result property="type" column="type"/> <collection property="records" javaType="list" ofType="com.ycl.vo.cockpit.aiIot.AIIotStatisticsRecordVO"> <result column="month" property="month"/> <result column="count" property="count"/> </collection> </resultMap> <select id="list" resultType="com.ycl.dto.allot.EfficiencyDto"> SELECT t4.NAME NAME, COUNT(1) NUMBER COUNT(1) NUMBER, sum(case WHEN ubc.state = 3 then 1 ELSE 0 END) errorNumber FROM `ums_base_case` AS ubc JOIN ums_violations AS uv ON ubc.id = uv.id @@ -18,4 +27,21 @@ GROUP BY t4.id </select> <select id="aiMonthList" resultMap="AIIotStatisticsVO"> SELECT t4.NAME type, DATE_FORMAT(alarm_time,'%Y-%m') month, COUNT(1) count FROM `ums_base_case` AS ubc JOIN ums_violations AS uv ON ubc.id = uv.id LEFT JOIN ums_data_dictionary AS t3 ON uv.category_id = t3.id LEFT JOIN ums_data_dictionary AS t4 ON uv.type_id = t4.id LEFT JOIN ums_sccg_region t5 ON ubc.street_id = t5.id WHERE ubc.category = 1 AND t4.`name` IS NOT NULL GROUP BY t4.id,DATE_FORMAT(alarm_time,'%Y-%m') </select> </mapper> ycl-platform/src/main/resources/mapper/caseHandler/BaseCaseMapper.xml
@@ -322,12 +322,26 @@ t1.site AS address, t2.description, t3.`name` AS point, t4.pic_data AS picture t4.pic_data AS picture, (case WHEN t1.state = 0 THEN '待处理' WHEN t1.state = 1 THEN '报警' WHEN t1.state = 2 THEN '上报' WHEN t1.state = 3 THEN '再学习' WHEN t1.state = 4 THEN '暂不处理' WHEN t1.state = 5 THEN '立案' WHEN t1.state = 6 THEN '调度' WHEN t1.state = 7 THEN '处置' WHEN t1.state = 8 THEN '核查' WHEN t1.state = 9 THEN '结案' END) `status` , dd.`name` as grade FROM ums_base_case t1 LEFT JOIN ums_violations t2 ON t1.id = t2.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 LEFT JOIN ums_data_dictionary dd on t2.grade_id = dd.id <where> t1.category=1 <if test="beginTime !=''and beginTime!=null and endTime!=''and endTime!=null">