zhanghua
2023-03-16 7fc2d4db0603bfe826a8ddb8259ecfd88d30f192
接口优化
12个文件已修改
2个文件已添加
274 ■■■■■ 已修改文件
ycl-platform/src/main/java/com/ycl/controller/cockpit/aiIot/AIIotController.java 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/dto/allot/EfficiencyDto.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/mapper/allot/EfficiencyMapper.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/service/allot/IEfficiencyService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/service/allot/impl/EfficiencyServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/util/CheckApiUtil.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/util/VideoUtil.java 139 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/vo/cockpit/aiIot/AIIotStatisticsRecordVO.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/vo/cockpit/aiIot/AIIotStatisticsVO.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/vo/cockpit/aiIot/AIIotVO.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/vo/cockpit/aiIot/EfficiencyVO.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/java/com/ycl/vo/cockpit/enforcementEvents/EventVO.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/resources/mapper/allot/EfficiencyMapper.xml 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ycl-platform/src/main/resources/mapper/caseHandler/BaseCaseMapper.xml 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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=&regionId=&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=&regionId=&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">