Jelajahi Sumber

添加门禁记录分页、门禁记录数量查询、rtsp以时间形式回放录像、HLS、RTMP录像回放接口

邵洋 1 tahun lalu
induk
melakukan
f64f250a58

+ 98 - 0
visualization-service/src/main/java/com/zksy/visualization/controller/AccessControlController.java

@@ -6,6 +6,8 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import com.zksy.common.core.domain.Result;
 import com.zksy.visualization.config.IccConfigProperty;
 import com.zksy.visualization.domain.request.AccessControlRequest;
+import com.zksy.visualization.domain.request.AccessQueryNumberRequest;
+import com.zksy.visualization.domain.request.AccessRecordQueryRequest;
 import com.zksy.visualization.domain.request.DevicePageRequest;
 import com.zksy.visualization.domain.response.DevicePageResponse;
 import io.swagger.annotations.Api;
@@ -91,4 +93,100 @@ public class AccessControlController {
         }
         return Result.error("请求失败");
     }
+    @ApiOperation(value = "门禁记录分页")
+    @PostMapping("/getAccessControlPage")
+    public Result getAccessControlPage(AccessRecordQueryRequest request){
+        ObjectMapper objectMapper = new ObjectMapper();
+        String jsonParams = null;
+        try {
+            jsonParams = objectMapper.writeValueAsString(request);
+        } catch (JsonProcessingException e) {
+            log.error("JSON序列化失败: {}", e);
+            return Result.error("请求失败");
+        }
+        String authorization = redisTemplate
+                .opsForValue()
+                .get("Authorization:" + iccConfigProperty.getUsername());
+        // 创建请求体
+        RequestBody body = RequestBody.create(jsonParams, JSON);
+        // 构建请求
+        Request requestHttp = new Request.Builder()
+                .url("https://" + iccConfigProperty.getHost() + "/evo-apigw/evo-accesscontrol/"+ iccConfigProperty.getVersion()+"/card/accessControl/swingCardRecord/bycondition/combined")
+                .addHeader("Authorization", authorization)
+                .post(body)
+                .build();
+        // 发送请求
+        try (Response response = httpClient.newCall(requestHttp).execute()) {
+            if (!response.isSuccessful()) {
+                return Result.error("请求失败");
+            }
+            ResponseBody responseBody = response.body();
+            if (responseBody != null) {
+                String responseString = responseBody.string();
+                JsonNode rootNode = objectMapper.readTree(responseString);
+                JsonNode success = rootNode.path("success");
+                if("true".equals(success.asText())) {
+                    JsonNode dataNode = rootNode.path("data");
+                    if (dataNode != null) {
+                        return Result.ok(dataNode);
+                    } else {
+                        return Result.ok(null);
+                    }
+                }else {
+                    return Result.error("门禁记录分页查询失败");
+                }
+            }
+        } catch (IOException e) {
+            log.error("请求失败: {}", e);
+        }
+        return Result.error("请求失败");
+    }
+    @ApiOperation(value = "门禁记录数量查询")
+    @PostMapping("/getAccessControlNumber")
+    public Result getAccessControlNumber(AccessQueryNumberRequest request){
+        ObjectMapper objectMapper = new ObjectMapper();
+        String jsonParams = null;
+        try {
+            jsonParams = objectMapper.writeValueAsString(request);
+        } catch (JsonProcessingException e) {
+            log.error("JSON序列化失败: {}", e);
+            return Result.error("请求失败");
+        }
+        String authorization = redisTemplate
+                .opsForValue()
+                .get("Authorization:" + iccConfigProperty.getUsername());
+        // 创建请求体
+        RequestBody body = RequestBody.create(jsonParams, JSON);
+        // 构建请求
+        Request requestHttp = new Request.Builder()
+                .url("https://" + iccConfigProperty.getHost() + "/evo-apigw/evo-accesscontrol/"+ iccConfigProperty.getVersion()+"/card/accessControl/swingCardRecord/bycondition/combinedCount")
+                .addHeader("Authorization", authorization)
+                .post(body)
+                .build();
+        // 发送请求
+        try (Response response = httpClient.newCall(requestHttp).execute()) {
+            if (!response.isSuccessful()) {
+                return Result.error("请求失败");
+            }
+            ResponseBody responseBody = response.body();
+            if (responseBody != null) {
+                String responseString = responseBody.string();
+                JsonNode rootNode = objectMapper.readTree(responseString);
+                JsonNode success = rootNode.path("success");
+                if("true".equals(success.asText())) {
+                    JsonNode dataNode = rootNode.path("data");
+                    if (dataNode != null) {
+                        return Result.ok(dataNode);
+                    } else {
+                        return Result.ok(null);
+                    }
+                }else {
+                    return Result.error("门禁记录数量查询失败");
+                }
+            }
+        } catch (IOException e) {
+            log.error("请求失败: {}", e);
+        }
+        return Result.error("请求失败");
+    }
 }

+ 172 - 1
visualization-service/src/main/java/com/zksy/visualization/controller/RealTimePreviewVideoController.java

@@ -5,7 +5,7 @@ import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.zksy.common.core.domain.Result;
 import com.zksy.visualization.config.IccConfigProperty;
-import com.zksy.visualization.domain.request.RtspUrlRequest;
+import com.zksy.visualization.domain.request.*;
 import com.zksy.visualization.domain.response.RtspUrlResponse;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -18,6 +18,9 @@ import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 import java.io.IOException;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
 
 /**
  * @author Administrator
@@ -117,4 +120,172 @@ public class RealTimePreviewVideoController {
         }
         return response;
     }*/
+/*    @ApiOperation(value = "rtsp以文件形式回放录像")
+    @PostMapping("/getRTSPFileReplay")
+    public Result getRTSPFileReplay(VideoRecordQueryRequest request){
+        ObjectMapper objectMapper = new ObjectMapper();
+        String jsonParams = null;
+        try {
+            jsonParams = objectMapper.writeValueAsString(request);
+        } catch (JsonProcessingException e) {
+            log.error("JSON序列化失败: {}", e);
+            return Result.error("请求失败");
+        }
+        String authorization = redisTemplate
+                .opsForValue()
+                .get("Authorization:" + iccConfigProperty.getUsername());
+        // 创建请求体
+        RequestBody body = RequestBody.create(jsonParams, JSON);
+        // 构建请求
+        Request requestHttp = new Request.Builder()
+                .url("https://" + iccConfigProperty.getHost() + "/evo-apigw/admin/API/SS/Playback/StartPlaybackByFile")
+                .addHeader("Authorization", authorization)
+                .post(body)
+                .build();
+        // 发送请求
+        try (Response response = httpClient.newCall(requestHttp).execute()) {
+            if (!response.isSuccessful()) {
+                return Result.error("请求失败");
+            }
+            ResponseBody responseBody = response.body();
+            if (responseBody != null) {
+                String responseString = responseBody.string();
+                JsonNode rootNode = objectMapper.readTree(responseString);
+                JsonNode success = rootNode.path("success");
+                if("true".equals(success.asText())) {
+                    JsonNode dataNode = rootNode.path("data");
+                    if (dataNode != null) {
+                        return Result.ok(dataNode);
+                    } else {
+                        return Result.ok(null);
+                    }
+                }else {
+                    return Result.error("rtsp以文件形式回放录像失败");
+                }
+            }
+        } catch (IOException e) {
+            log.error("请求失败: {}", e);
+        }
+        return Result.error("请求失败");
+    }*/
+    @ApiOperation(value = "rtsp以时间形式回放录像")
+    @PostMapping("/getRTSPDateReplay")
+    public Result getRTSPDateReplay(VideoRecordDateQueryRequest request){
+        String startTime = DateToTimeStamp(request.getData().getStartTime());
+        String endTime = DateToTimeStamp(request.getData().getEndTime());
+        request.getData().setStartTime(startTime);
+        request.getData().setEndTime(endTime);
+        ObjectMapper objectMapper = new ObjectMapper();
+        String jsonParams = null;
+        try {
+            jsonParams = objectMapper.writeValueAsString(request);
+        } catch (JsonProcessingException e) {
+            log.error("JSON序列化失败: {}", e);
+            return Result.error("请求失败");
+        }
+        String authorization = redisTemplate
+                .opsForValue()
+                .get("Authorization:" + iccConfigProperty.getUsername());
+        // 创建请求体
+        RequestBody body = RequestBody.create(jsonParams, JSON);
+        // 构建请求
+        Request requestHttp = new Request.Builder()
+                .url("https://" + iccConfigProperty.getHost() + "/evo-apigw/admin/API/SS/Playback/StartPlaybackByTime")
+                .addHeader("Authorization", authorization)
+                .post(body)
+                .build();
+        // 发送请求
+        try (Response response = httpClient.newCall(requestHttp).execute()) {
+            if (!response.isSuccessful()) {
+                return Result.error("请求失败");
+            }
+            ResponseBody responseBody = response.body();
+            if (responseBody != null) {
+                String responseString = responseBody.string();
+                JsonNode rootNode = objectMapper.readTree(responseString);
+                JsonNode success = rootNode.path("success");
+                if("true".equals(success.asText())) {
+                    JsonNode dataNode = rootNode.path("data");
+                    if (dataNode != null) {
+                        return Result.ok(dataNode);
+                    } else {
+                        return Result.ok(null);
+                    }
+                }else {
+                    return Result.error("rtsp以时间形式回放录像失败");
+                }
+            }
+        } catch (IOException e) {
+            log.error("请求失败: {}", e);
+        }
+        return Result.error("请求失败");
+    }
+    @ApiOperation(value = "HLS、RTMP录像回放(FLV不支持)")
+    @PostMapping("/getHRReplay")
+    public Result getHRReplay(VideoRecordHRQueryRequest request){
+        ObjectMapper objectMapper = new ObjectMapper();
+        String jsonParams = null;
+        try {
+            jsonParams = objectMapper.writeValueAsString(request);
+        } catch (JsonProcessingException e) {
+            log.error("JSON序列化失败: {}", e);
+            return Result.error("请求失败");
+        }
+        String authorization = redisTemplate
+                .opsForValue()
+                .get("Authorization:" + iccConfigProperty.getUsername());
+        // 创建请求体
+        RequestBody body = RequestBody.create(jsonParams, JSON);
+        // 构建请求
+        Request requestHttp = new Request.Builder()
+                .url("https://" + iccConfigProperty.getHost() + "/evo-apigw/admin/API/video/stream/record")
+                .addHeader("Authorization", authorization)
+                .post(body)
+                .build();
+        // 发送请求
+        try (Response response = httpClient.newCall(requestHttp).execute()) {
+            if (!response.isSuccessful()) {
+                return Result.error("请求失败");
+            }
+            ResponseBody responseBody = response.body();
+            if (responseBody != null) {
+                String responseString = responseBody.string();
+                JsonNode rootNode = objectMapper.readTree(responseString);
+                JsonNode success = rootNode.path("success");
+                if("true".equals(success.asText())) {
+                    JsonNode dataNode = rootNode.path("data");
+                    if (dataNode != null) {
+                        return Result.ok(dataNode);
+                    } else {
+                        return Result.ok(null);
+                    }
+                }else {
+                    JsonNode code = rootNode.path("code");
+                    if("2239".equals(code.asText())){
+                        return Result.error("未查询到录像");
+                    }else {
+                        return Result.error("HLS、RTMP录像回放(FLV不支持)失败");
+                    }
+                }
+            }
+        } catch (IOException e) {
+            log.error("请求失败: {}", e);
+        }
+        return Result.error("请求失败");
+    }
+
+    public String DateToTimeStamp(String dateTimeString){
+        // 定义日期格式
+        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        try {
+            // 解析字符串为Date对象
+            Date date = dateFormat.parse(dateTimeString);
+            // 将Date对象转换为时间戳(秒)
+            long timestamp = date.getTime() / 1000;
+            return String.valueOf(timestamp);
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return dateTimeString;
+    }
 }

+ 74 - 0
visualization-service/src/main/java/com/zksy/visualization/domain/request/AccessQueryNumberRequest.java

@@ -0,0 +1,74 @@
+package com.zksy.visualization.domain.request;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.util.List;
+
+@Data
+@ApiModel(description = "门禁记录查询请求参数")
+public class AccessQueryNumberRequest {
+
+    @ApiModelProperty(value = "页码", required = true)
+    private Integer pageNum;
+
+    @ApiModelProperty(value = "分页大小", required = true)
+    private String pageSize;
+
+    @ApiModelProperty(value = "查询开始时间,格式:yyyy-MM-dd HH:mm:ss,不送默认从当前时间点减30天")
+    private String startSwingTime;
+
+    @ApiModelProperty(value = "查询结束时间,格式:yyyy-MM-dd HH:mm:ss")
+    private String endSwingTime;
+
+    @ApiModelProperty(value = "入库开始时间,格式:yyyy-MM-dd HH:mm:ss,V1.1.4新增")
+    private String startCreateTime;
+
+    @ApiModelProperty(value = "入库结束时间,格式:yyyy-MM-dd HH:mm:ss,V1.1.4新增")
+    private String endCreateTime;
+
+    @ApiModelProperty(value = "开门类型, 详见 开门类型 字典")
+    private Integer openType;
+
+    @ApiModelProperty(value = "开门类型多选, V1.1.4新增,详见 开门类型 字典")
+    private List<Integer> openTypes;
+
+    @ApiModelProperty(value = "卡片类型, 不传-全部, 0-IC卡, 1-有源RFID, 2-CPU卡")
+    private String category;
+
+    @ApiModelProperty(value = "人员名称, 仅允许汉字字母数字 -_.@", example = "张三_123")
+    private String personName;
+
+    @ApiModelProperty(value = "人员编号, 人员编号仅支持字母或数字", example = "A123456")
+    private String personCode;
+
+    @ApiModelProperty(value = "通道编码列表(可通过设备管理接口获取unitType为7的channels)", example = "[\"channel1\",\"channel2\"]")
+    private List<String> channelCodes;
+
+    @ApiModelProperty(value = "部门id, 部门间\",\"分隔", example = "dept1,dept2")
+    private String deptIds;
+
+    @ApiModelProperty(value = "卡号, 可以使字母或数字", example = "ABCD1234")
+    private String cardNumber;
+
+    @ApiModelProperty(value = "事件类型, 不传-全部, 1-进门, 2-出门, 3-进/出门", allowableValues = "1,2,3")
+    private String enterOrExit;
+
+    @ApiModelProperty(value = "开门结果, 不传-全部, 0-失败,1-成功", allowableValues = "0,1")
+    private Integer openResult;
+
+    @ApiModelProperty(value = "是否超温")
+    private Boolean overTemp;
+
+    @ApiModelProperty(value = "体温低限")
+    private Float curTempStart;
+
+    @ApiModelProperty(value = "体温高限")
+    private Float curTempEnd;
+
+    @ApiModelProperty(value = "口罩状态 :1-未识别,2-没带口罩,3-带口罩", allowableValues = "1,2,3")
+    private Integer maskState;
+
+    @ApiModelProperty(value = "访客筛选,1 - 只查询访客记录 2 - 只查询非访客记录", allowableValues = "1,2")
+    private Integer visitorFilter;
+}

+ 74 - 0
visualization-service/src/main/java/com/zksy/visualization/domain/request/AccessRecordQueryRequest.java

@@ -0,0 +1,74 @@
+package com.zksy.visualization.domain.request;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.util.List;
+
+@Data
+@ApiModel(description = "门禁记录查询请求参数")
+public class AccessRecordQueryRequest {
+
+    @ApiModelProperty(value = "页码,正整数", required = true)
+    private Integer pageNum;
+
+    @ApiModelProperty(value = "分页大小,正整数", required = true)
+    private Integer pageSize;
+
+    @ApiModelProperty(value = "查询开始时间,格式:yyyy-MM-dd HH:mm:ss,不送默认从当前时间点减30天")
+    private String startSwingTime;
+
+    @ApiModelProperty(value = "查询结束时间,格式:yyyy-MM-dd HH:mm:ss,不送默认是当前时间点")
+    private String endSwingTime;
+
+    @ApiModelProperty(value = "入库开始时间,格式:yyyy-MM-dd HH:mm:ss,V1.1.4新增")
+    private String startCreateTime;
+
+    @ApiModelProperty(value = "入库结束时间,格式:yyyy-MM-dd HH:mm:ss,V1.1.4新增")
+    private String endCreateTime;
+
+    @ApiModelProperty(value = "开门类型, 详见 开门类型 字典")
+    private Integer openType;
+
+    @ApiModelProperty(value = "开门类型多选, 详见 开门类型 字典,V1.1.4新增")
+    private List<Integer> openTypes;
+
+    @ApiModelProperty(value = "卡片类型, 不传-全部, 0-IC卡, 1-有源RFID, 2-CPU卡")
+    private String category;
+
+    @ApiModelProperty(value = "人员名称,仅允许汉字字母数字 -_.@", example = "张三_123")
+    private String personName;
+
+    @ApiModelProperty(value = "人员编号,人员编号仅支持字母或数字", example = "A123456")
+    private String personCode;
+
+    @ApiModelProperty(value = "通道编码列表(可通过设备管理接口获取unitType为7的channels)", example = "[\"channel1\",\"channel2\"]")
+    private List<String> channelCodes;
+
+    @ApiModelProperty(value = "部门ID, 部门间\",\"分隔", example = "dept1,dept2")
+    private String deptIds;
+
+    @ApiModelProperty(value = "卡号,字母或数字", example = "ABCD1234")
+    private String cardNumber;
+
+    @ApiModelProperty(value = "事件类型, 不传-全部, 1-进门, 2出门, 3-进/出门", allowableValues = "1,2,3")
+    private Integer enterOrExit;
+
+    @ApiModelProperty(value = "开门结果, 不传-全部, 1-成功, 0-失败", allowableValues = "0,1")
+    private Integer openResult;
+
+    @ApiModelProperty(value = "是否超温")
+    private Boolean overTemp;
+
+    @ApiModelProperty(value = "体温低限")
+    private Float curTempStart;
+
+    @ApiModelProperty(value = "体温高限")
+    private Float curTempEnd;
+
+    @ApiModelProperty(value = "口罩状态 3-带口罩,2—没带口罩,1-未识别", allowableValues = "1,2,3")
+    private Integer maskState;
+
+    @ApiModelProperty(value = "访客筛选,1 - 只查询访客记录 2 - 只查询非访客记录", allowableValues = "1,2")
+    private Integer visitorFilter;
+}

+ 34 - 0
visualization-service/src/main/java/com/zksy/visualization/domain/request/VideoRecordDateQueryRequest.java

@@ -0,0 +1,34 @@
+package com.zksy.visualization.domain.request;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel(description = "rtsp以时间形式回放录像请求参数")
+public class VideoRecordDateQueryRequest {
+
+    @ApiModelProperty(value = "Json对象", required = true)
+    private Data data;
+
+    @lombok.Data
+    public static class Data {
+        @ApiModelProperty(value = "视频通道编码,第一个$后数字代表通道类型,必须是1", required = true)
+        private String channelId;
+
+        @ApiModelProperty(value = "录像来源:2=设备,3=中心", required = true, allowableValues = "2,3")
+        private String recordSource;
+
+        @ApiModelProperty(value = "开始时间, 格式:yyyy-MM-dd HH:mm:ss, 时间必须大于等于在实际录像文件的开始时间", required = true)
+        private String startTime;
+
+        @ApiModelProperty(value = "结束时间, 格式:yyyy-MM-dd HH:mm:ss,时间必须小于等于在实际录像文件的结束时间,startTime与endTime不能跨文件", required = true)
+        private String endTime;
+
+        @ApiModelProperty(value = "码流类型:1=主码流, 2=辅码流,3=辅码流2", required = true, allowableValues = "1,2,3")
+        private String streamType;
+
+        @ApiModelProperty(value = "录像类型:1=远程录像,2=报警录像,6=定时录像(和查询到的类型保持一致即可)", required = true, allowableValues = "1,2,6")
+        private String recordType;
+    }
+}

+ 39 - 0
visualization-service/src/main/java/com/zksy/visualization/domain/request/VideoRecordHRQueryRequest.java

@@ -0,0 +1,39 @@
+package com.zksy.visualization.domain.request;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Objects;
+
+@Data
+@ApiModel(description = "HLS、RTMP录像回放(FLV不支持)请求参数")
+public class VideoRecordHRQueryRequest {
+
+    @ApiModelProperty(value = "Json对象", required = true)
+    private Data data;
+
+    @lombok.Data
+    public static class Data {
+        @ApiModelProperty(value = "视频通道编码,第一个$后数字代表通道类型,必须是1", required = true)
+        private String channelId;
+
+        @ApiModelProperty(value = "码流类型:1=主码流, 2=辅码流,3=辅码流2", required = true, allowableValues = "1,2,3")
+        private String streamType;
+
+        @ApiModelProperty(value = "格式类型,hls、hlss、rtmp; hls:http m3u8流,端口默认7086; hlss:https m3u8流,端口默认7096; rtmp:rtmp流,端口默认1975;", required = true, allowableValues = "hls,hlss,rtmp")
+        private String type;
+
+        @ApiModelProperty(value = "录像类型,1-普通录像;2-报警录像;其他录像类型接口不支持,建议参考HLS拼接参考HLS录像回放拼接方式或RTMP拼接参考RTMP录像回放拼接方式获取流地址说明", required = true, allowableValues = "1,2")
+        private String recordType;
+
+        @ApiModelProperty(value = "开始时间, 格式:yyyy-MM-dd HH:mm:ss ,时间必须大于等于在实际录像文件的开始时间", required = true)
+        private String beginTime;
+
+        @ApiModelProperty(value = "结束时间, 格式:yyyy-MM-dd HH:mm:ss,时间必须小于等于在实际录像文件的结束时间,beginTime与endTime不能跨文件", required = true)
+        private String endTime;
+
+        @ApiModelProperty(value = "录像来源:2:设备 device, 3:中心 center", required = true, allowableValues = "2,3")
+        private String recordSource;
+    }
+}

+ 48 - 0
visualization-service/src/main/java/com/zksy/visualization/domain/request/VideoRecordQueryRequest.java

@@ -0,0 +1,48 @@
+package com.zksy.visualization.domain.request;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Objects;
+
+@Data
+@ApiModel(description = "录像文件查询请求参数")
+public class VideoRecordQueryRequest {
+
+    @ApiModelProperty(value = "Json对象", required = true)
+    private Data data;
+
+    @lombok.Data
+    public static class Data {
+        @ApiModelProperty(value = "视频通道编码,第一个$后数字代表通道类型,必须是1", required = true)
+        private String channelId;
+
+        @ApiModelProperty(value = "录像来源:2=设备,3=中心", required = true)
+        private String recordSource;
+
+        @ApiModelProperty(value = "开始时间(时间戳:单位秒), 时间必须大于等于在实际录像文件的开始时间", required = true)
+        private String startTime;
+
+        @ApiModelProperty(value = "结束时间(时间戳:单位秒),时间必须小于等于在实际录像文件的结束时间,startTime与endTime不能跨文件", required = true)
+        private String endTime;
+
+        @ApiModelProperty(value = "码流类型:1=主码流, 2=辅码流,3=辅码流2", required = true)
+        private String streamType;
+
+        @ApiModelProperty(value = "录像类型:0=全部录像,1=远程录像,2=报警录像,6=定时录像(和查询到的类型保持一致即可)", required = true)
+        private String recordType;
+
+        @ApiModelProperty(value = "录像文件名称")
+        private String fileName;
+
+        @ApiModelProperty(value = "SS服务ID", required = true)
+        private String ssId;
+
+        @ApiModelProperty(value = "磁盘ID")
+        private String diskId;
+
+        @ApiModelProperty(value = "码流处理", required = true)
+        private String streamId;
+    }
+}