diff --git a/README.md b/README.md index 430796e..8dbc9a5 100644 --- a/README.md +++ b/README.md @@ -9,3 +9,7 @@ #### 其他 >* [git地址](http://192.168.0.203:8080/gitbucket) >* [本地免登地址](http://localhost:8083/route/mockToken) + +AView 对接问题 +1.用户设备关联关系 + 对应返回 device_list是否为设备国标号 \ No newline at end of file diff --git a/README.md b/README.md index 430796e..8dbc9a5 100644 --- a/README.md +++ b/README.md @@ -9,3 +9,7 @@ #### 其他 >* [git地址](http://192.168.0.203:8080/gitbucket) >* [本地免登地址](http://localhost:8083/route/mockToken) + +AView 对接问题 +1.用户设备关联关系 + 对应返回 device_list是否为设备国标号 \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/pom.xml b/casic-device-sync/casic-device-aview/pom.xml index 0a3c5fa..94fb9e5 100644 --- a/casic-device-sync/casic-device-aview/pom.xml +++ b/casic-device-sync/casic-device-aview/pom.xml @@ -33,6 +33,21 @@ ${boot.version} provided + + com.casic + casic-http + ${core.version} + + + com.casic + casic-admin-group + ${admin.version} + + + com.casic + casic-server + ${pro.version} + diff --git a/README.md b/README.md index 430796e..8dbc9a5 100644 --- a/README.md +++ b/README.md @@ -9,3 +9,7 @@ #### 其他 >* [git地址](http://192.168.0.203:8080/gitbucket) >* [本地免登地址](http://localhost:8083/route/mockToken) + +AView 对接问题 +1.用户设备关联关系 + 对应返回 device_list是否为设备国标号 \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/pom.xml b/casic-device-sync/casic-device-aview/pom.xml index 0a3c5fa..94fb9e5 100644 --- a/casic-device-sync/casic-device-aview/pom.xml +++ b/casic-device-sync/casic-device-aview/pom.xml @@ -33,6 +33,21 @@ ${boot.version} provided + + com.casic + casic-http + ${core.version} + + + com.casic + casic-admin-group + ${admin.version} + + + com.casic + casic-server + ${pro.version} + diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java new file mode 100644 index 0000000..195cba2 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.device.controller; + +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import com.casic.missiles.modular.device.dto.stream.StreamRequestDTO; +import com.casic.missiles.modular.device.service.IAvSyncService; +import io.swagger.annotations.Api; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +@Api(tags = "AV平台代理接口") +@RestController +@RequestMapping("/route") +public class AvRouteController { + @Resource + private IAvSyncService avSyncService; + + @PostMapping("/open/v1/api/streams") + public Object streams(@RequestBody StreamRequestDTO requestDTO) { + Object object = avSyncService.getStreams(requestDTO); + if (object == null) { + ResponseDataDTO respDTO = ResponseDataDTO.error("流读取失败,请稍后重试!"); + respDTO.setMessage("流读取失败,请稍后重试!"); + return respDTO; + } + return ResponseDataDTO.success(avSyncService.getStreams(requestDTO)); + } + + @DeleteMapping("/open/v1/api/streams/{id}") + public Object stopStreams(@PathVariable("id") String id) { + Object object = avSyncService.stopStreams(id); + return ResponseDataDTO.success(object); + } + + @PostMapping("/open/v1/api/streams/{id}/heart") + public Object heart(@PathVariable("id") String id) { + Object object = avSyncService.heart(id); + if (object == null) { + ResponseDataDTO respDTO = ResponseDataDTO.error("流心跳失败,请稍后重试!"); + respDTO.setMessage("流心跳失败,请稍后重试!"); + return respDTO; + } + return ResponseDataDTO.success(object); + } +} \ No newline at end of file diff --git a/README.md b/README.md index 430796e..8dbc9a5 100644 --- a/README.md +++ b/README.md @@ -9,3 +9,7 @@ #### 其他 >* [git地址](http://192.168.0.203:8080/gitbucket) >* [本地免登地址](http://localhost:8083/route/mockToken) + +AView 对接问题 +1.用户设备关联关系 + 对应返回 device_list是否为设备国标号 \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/pom.xml b/casic-device-sync/casic-device-aview/pom.xml index 0a3c5fa..94fb9e5 100644 --- a/casic-device-sync/casic-device-aview/pom.xml +++ b/casic-device-sync/casic-device-aview/pom.xml @@ -33,6 +33,21 @@ ${boot.version} provided + + com.casic + casic-http + ${core.version} + + + com.casic + casic-admin-group + ${admin.version} + + + com.casic + casic-server + ${pro.version} + diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java new file mode 100644 index 0000000..195cba2 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.device.controller; + +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import com.casic.missiles.modular.device.dto.stream.StreamRequestDTO; +import com.casic.missiles.modular.device.service.IAvSyncService; +import io.swagger.annotations.Api; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +@Api(tags = "AV平台代理接口") +@RestController +@RequestMapping("/route") +public class AvRouteController { + @Resource + private IAvSyncService avSyncService; + + @PostMapping("/open/v1/api/streams") + public Object streams(@RequestBody StreamRequestDTO requestDTO) { + Object object = avSyncService.getStreams(requestDTO); + if (object == null) { + ResponseDataDTO respDTO = ResponseDataDTO.error("流读取失败,请稍后重试!"); + respDTO.setMessage("流读取失败,请稍后重试!"); + return respDTO; + } + return ResponseDataDTO.success(avSyncService.getStreams(requestDTO)); + } + + @DeleteMapping("/open/v1/api/streams/{id}") + public Object stopStreams(@PathVariable("id") String id) { + Object object = avSyncService.stopStreams(id); + return ResponseDataDTO.success(object); + } + + @PostMapping("/open/v1/api/streams/{id}/heart") + public Object heart(@PathVariable("id") String id) { + Object object = avSyncService.heart(id); + if (object == null) { + ResponseDataDTO respDTO = ResponseDataDTO.error("流心跳失败,请稍后重试!"); + respDTO.setMessage("流心跳失败,请稍后重试!"); + return respDTO; + } + return ResponseDataDTO.success(object); + } +} \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java new file mode 100644 index 0000000..97bde9f --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java @@ -0,0 +1,49 @@ +package com.casic.missiles.modular.device.dto; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; + +/** + * 艾薇设备对象DTO + */ +@Data +public class AvDeviceDTO { + // 设备ID + private Long id; + + // 设备名称 + private String name; + + // 设备唯一国标序列号 + private String sn; + + // 设备类型 + private Integer type; + + // 设备版本号 + private String version; + + // 安全等级 + @JSONField(name = "secure_level") + private String secureLevel; + + // 设备状态 + private Integer status; + + // 云台类型 + private Integer ptzType; + + // 朝向 + private Integer orientation; + + // 创建时间 + @JSONField(name = "gmt_created") + private String gmtCreated; + + // 修改时间 + @JSONField(name = "gmt_modified") + private String gmtModified; + + // 数据状态 + private Integer state; +} diff --git a/README.md b/README.md index 430796e..8dbc9a5 100644 --- a/README.md +++ b/README.md @@ -9,3 +9,7 @@ #### 其他 >* [git地址](http://192.168.0.203:8080/gitbucket) >* [本地免登地址](http://localhost:8083/route/mockToken) + +AView 对接问题 +1.用户设备关联关系 + 对应返回 device_list是否为设备国标号 \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/pom.xml b/casic-device-sync/casic-device-aview/pom.xml index 0a3c5fa..94fb9e5 100644 --- a/casic-device-sync/casic-device-aview/pom.xml +++ b/casic-device-sync/casic-device-aview/pom.xml @@ -33,6 +33,21 @@ ${boot.version} provided + + com.casic + casic-http + ${core.version} + + + com.casic + casic-admin-group + ${admin.version} + + + com.casic + casic-server + ${pro.version} + diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java new file mode 100644 index 0000000..195cba2 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.device.controller; + +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import com.casic.missiles.modular.device.dto.stream.StreamRequestDTO; +import com.casic.missiles.modular.device.service.IAvSyncService; +import io.swagger.annotations.Api; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +@Api(tags = "AV平台代理接口") +@RestController +@RequestMapping("/route") +public class AvRouteController { + @Resource + private IAvSyncService avSyncService; + + @PostMapping("/open/v1/api/streams") + public Object streams(@RequestBody StreamRequestDTO requestDTO) { + Object object = avSyncService.getStreams(requestDTO); + if (object == null) { + ResponseDataDTO respDTO = ResponseDataDTO.error("流读取失败,请稍后重试!"); + respDTO.setMessage("流读取失败,请稍后重试!"); + return respDTO; + } + return ResponseDataDTO.success(avSyncService.getStreams(requestDTO)); + } + + @DeleteMapping("/open/v1/api/streams/{id}") + public Object stopStreams(@PathVariable("id") String id) { + Object object = avSyncService.stopStreams(id); + return ResponseDataDTO.success(object); + } + + @PostMapping("/open/v1/api/streams/{id}/heart") + public Object heart(@PathVariable("id") String id) { + Object object = avSyncService.heart(id); + if (object == null) { + ResponseDataDTO respDTO = ResponseDataDTO.error("流心跳失败,请稍后重试!"); + respDTO.setMessage("流心跳失败,请稍后重试!"); + return respDTO; + } + return ResponseDataDTO.success(object); + } +} \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java new file mode 100644 index 0000000..97bde9f --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java @@ -0,0 +1,49 @@ +package com.casic.missiles.modular.device.dto; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; + +/** + * 艾薇设备对象DTO + */ +@Data +public class AvDeviceDTO { + // 设备ID + private Long id; + + // 设备名称 + private String name; + + // 设备唯一国标序列号 + private String sn; + + // 设备类型 + private Integer type; + + // 设备版本号 + private String version; + + // 安全等级 + @JSONField(name = "secure_level") + private String secureLevel; + + // 设备状态 + private Integer status; + + // 云台类型 + private Integer ptzType; + + // 朝向 + private Integer orientation; + + // 创建时间 + @JSONField(name = "gmt_created") + private String gmtCreated; + + // 修改时间 + @JSONField(name = "gmt_modified") + private String gmtModified; + + // 数据状态 + private Integer state; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java new file mode 100644 index 0000000..9a05183 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java @@ -0,0 +1,10 @@ +package com.casic.missiles.modular.device.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class AvPageResponse { + private List items; +} diff --git a/README.md b/README.md index 430796e..8dbc9a5 100644 --- a/README.md +++ b/README.md @@ -9,3 +9,7 @@ #### 其他 >* [git地址](http://192.168.0.203:8080/gitbucket) >* [本地免登地址](http://localhost:8083/route/mockToken) + +AView 对接问题 +1.用户设备关联关系 + 对应返回 device_list是否为设备国标号 \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/pom.xml b/casic-device-sync/casic-device-aview/pom.xml index 0a3c5fa..94fb9e5 100644 --- a/casic-device-sync/casic-device-aview/pom.xml +++ b/casic-device-sync/casic-device-aview/pom.xml @@ -33,6 +33,21 @@ ${boot.version} provided + + com.casic + casic-http + ${core.version} + + + com.casic + casic-admin-group + ${admin.version} + + + com.casic + casic-server + ${pro.version} + diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java new file mode 100644 index 0000000..195cba2 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.device.controller; + +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import com.casic.missiles.modular.device.dto.stream.StreamRequestDTO; +import com.casic.missiles.modular.device.service.IAvSyncService; +import io.swagger.annotations.Api; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +@Api(tags = "AV平台代理接口") +@RestController +@RequestMapping("/route") +public class AvRouteController { + @Resource + private IAvSyncService avSyncService; + + @PostMapping("/open/v1/api/streams") + public Object streams(@RequestBody StreamRequestDTO requestDTO) { + Object object = avSyncService.getStreams(requestDTO); + if (object == null) { + ResponseDataDTO respDTO = ResponseDataDTO.error("流读取失败,请稍后重试!"); + respDTO.setMessage("流读取失败,请稍后重试!"); + return respDTO; + } + return ResponseDataDTO.success(avSyncService.getStreams(requestDTO)); + } + + @DeleteMapping("/open/v1/api/streams/{id}") + public Object stopStreams(@PathVariable("id") String id) { + Object object = avSyncService.stopStreams(id); + return ResponseDataDTO.success(object); + } + + @PostMapping("/open/v1/api/streams/{id}/heart") + public Object heart(@PathVariable("id") String id) { + Object object = avSyncService.heart(id); + if (object == null) { + ResponseDataDTO respDTO = ResponseDataDTO.error("流心跳失败,请稍后重试!"); + respDTO.setMessage("流心跳失败,请稍后重试!"); + return respDTO; + } + return ResponseDataDTO.success(object); + } +} \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java new file mode 100644 index 0000000..97bde9f --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java @@ -0,0 +1,49 @@ +package com.casic.missiles.modular.device.dto; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; + +/** + * 艾薇设备对象DTO + */ +@Data +public class AvDeviceDTO { + // 设备ID + private Long id; + + // 设备名称 + private String name; + + // 设备唯一国标序列号 + private String sn; + + // 设备类型 + private Integer type; + + // 设备版本号 + private String version; + + // 安全等级 + @JSONField(name = "secure_level") + private String secureLevel; + + // 设备状态 + private Integer status; + + // 云台类型 + private Integer ptzType; + + // 朝向 + private Integer orientation; + + // 创建时间 + @JSONField(name = "gmt_created") + private String gmtCreated; + + // 修改时间 + @JSONField(name = "gmt_modified") + private String gmtModified; + + // 数据状态 + private Integer state; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java new file mode 100644 index 0000000..9a05183 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java @@ -0,0 +1,10 @@ +package com.casic.missiles.modular.device.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class AvPageResponse { + private List items; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java new file mode 100644 index 0000000..098dda4 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.device.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class DeviceRelationshipDTO { + private Long user_id; + private String device_list; + private List deviceList; +} diff --git a/README.md b/README.md index 430796e..8dbc9a5 100644 --- a/README.md +++ b/README.md @@ -9,3 +9,7 @@ #### 其他 >* [git地址](http://192.168.0.203:8080/gitbucket) >* [本地免登地址](http://localhost:8083/route/mockToken) + +AView 对接问题 +1.用户设备关联关系 + 对应返回 device_list是否为设备国标号 \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/pom.xml b/casic-device-sync/casic-device-aview/pom.xml index 0a3c5fa..94fb9e5 100644 --- a/casic-device-sync/casic-device-aview/pom.xml +++ b/casic-device-sync/casic-device-aview/pom.xml @@ -33,6 +33,21 @@ ${boot.version} provided + + com.casic + casic-http + ${core.version} + + + com.casic + casic-admin-group + ${admin.version} + + + com.casic + casic-server + ${pro.version} + diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java new file mode 100644 index 0000000..195cba2 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.device.controller; + +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import com.casic.missiles.modular.device.dto.stream.StreamRequestDTO; +import com.casic.missiles.modular.device.service.IAvSyncService; +import io.swagger.annotations.Api; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +@Api(tags = "AV平台代理接口") +@RestController +@RequestMapping("/route") +public class AvRouteController { + @Resource + private IAvSyncService avSyncService; + + @PostMapping("/open/v1/api/streams") + public Object streams(@RequestBody StreamRequestDTO requestDTO) { + Object object = avSyncService.getStreams(requestDTO); + if (object == null) { + ResponseDataDTO respDTO = ResponseDataDTO.error("流读取失败,请稍后重试!"); + respDTO.setMessage("流读取失败,请稍后重试!"); + return respDTO; + } + return ResponseDataDTO.success(avSyncService.getStreams(requestDTO)); + } + + @DeleteMapping("/open/v1/api/streams/{id}") + public Object stopStreams(@PathVariable("id") String id) { + Object object = avSyncService.stopStreams(id); + return ResponseDataDTO.success(object); + } + + @PostMapping("/open/v1/api/streams/{id}/heart") + public Object heart(@PathVariable("id") String id) { + Object object = avSyncService.heart(id); + if (object == null) { + ResponseDataDTO respDTO = ResponseDataDTO.error("流心跳失败,请稍后重试!"); + respDTO.setMessage("流心跳失败,请稍后重试!"); + return respDTO; + } + return ResponseDataDTO.success(object); + } +} \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java new file mode 100644 index 0000000..97bde9f --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java @@ -0,0 +1,49 @@ +package com.casic.missiles.modular.device.dto; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; + +/** + * 艾薇设备对象DTO + */ +@Data +public class AvDeviceDTO { + // 设备ID + private Long id; + + // 设备名称 + private String name; + + // 设备唯一国标序列号 + private String sn; + + // 设备类型 + private Integer type; + + // 设备版本号 + private String version; + + // 安全等级 + @JSONField(name = "secure_level") + private String secureLevel; + + // 设备状态 + private Integer status; + + // 云台类型 + private Integer ptzType; + + // 朝向 + private Integer orientation; + + // 创建时间 + @JSONField(name = "gmt_created") + private String gmtCreated; + + // 修改时间 + @JSONField(name = "gmt_modified") + private String gmtModified; + + // 数据状态 + private Integer state; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java new file mode 100644 index 0000000..9a05183 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java @@ -0,0 +1,10 @@ +package com.casic.missiles.modular.device.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class AvPageResponse { + private List items; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java new file mode 100644 index 0000000..098dda4 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.device.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class DeviceRelationshipDTO { + private Long user_id; + private String device_list; + private List deviceList; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java new file mode 100644 index 0000000..74e6a9b --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java @@ -0,0 +1,9 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +@Data +public class AvPageRep { + private Integer total; + private T list; +} diff --git a/README.md b/README.md index 430796e..8dbc9a5 100644 --- a/README.md +++ b/README.md @@ -9,3 +9,7 @@ #### 其他 >* [git地址](http://192.168.0.203:8080/gitbucket) >* [本地免登地址](http://localhost:8083/route/mockToken) + +AView 对接问题 +1.用户设备关联关系 + 对应返回 device_list是否为设备国标号 \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/pom.xml b/casic-device-sync/casic-device-aview/pom.xml index 0a3c5fa..94fb9e5 100644 --- a/casic-device-sync/casic-device-aview/pom.xml +++ b/casic-device-sync/casic-device-aview/pom.xml @@ -33,6 +33,21 @@ ${boot.version} provided + + com.casic + casic-http + ${core.version} + + + com.casic + casic-admin-group + ${admin.version} + + + com.casic + casic-server + ${pro.version} + diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java new file mode 100644 index 0000000..195cba2 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.device.controller; + +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import com.casic.missiles.modular.device.dto.stream.StreamRequestDTO; +import com.casic.missiles.modular.device.service.IAvSyncService; +import io.swagger.annotations.Api; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +@Api(tags = "AV平台代理接口") +@RestController +@RequestMapping("/route") +public class AvRouteController { + @Resource + private IAvSyncService avSyncService; + + @PostMapping("/open/v1/api/streams") + public Object streams(@RequestBody StreamRequestDTO requestDTO) { + Object object = avSyncService.getStreams(requestDTO); + if (object == null) { + ResponseDataDTO respDTO = ResponseDataDTO.error("流读取失败,请稍后重试!"); + respDTO.setMessage("流读取失败,请稍后重试!"); + return respDTO; + } + return ResponseDataDTO.success(avSyncService.getStreams(requestDTO)); + } + + @DeleteMapping("/open/v1/api/streams/{id}") + public Object stopStreams(@PathVariable("id") String id) { + Object object = avSyncService.stopStreams(id); + return ResponseDataDTO.success(object); + } + + @PostMapping("/open/v1/api/streams/{id}/heart") + public Object heart(@PathVariable("id") String id) { + Object object = avSyncService.heart(id); + if (object == null) { + ResponseDataDTO respDTO = ResponseDataDTO.error("流心跳失败,请稍后重试!"); + respDTO.setMessage("流心跳失败,请稍后重试!"); + return respDTO; + } + return ResponseDataDTO.success(object); + } +} \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java new file mode 100644 index 0000000..97bde9f --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java @@ -0,0 +1,49 @@ +package com.casic.missiles.modular.device.dto; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; + +/** + * 艾薇设备对象DTO + */ +@Data +public class AvDeviceDTO { + // 设备ID + private Long id; + + // 设备名称 + private String name; + + // 设备唯一国标序列号 + private String sn; + + // 设备类型 + private Integer type; + + // 设备版本号 + private String version; + + // 安全等级 + @JSONField(name = "secure_level") + private String secureLevel; + + // 设备状态 + private Integer status; + + // 云台类型 + private Integer ptzType; + + // 朝向 + private Integer orientation; + + // 创建时间 + @JSONField(name = "gmt_created") + private String gmtCreated; + + // 修改时间 + @JSONField(name = "gmt_modified") + private String gmtModified; + + // 数据状态 + private Integer state; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java new file mode 100644 index 0000000..9a05183 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java @@ -0,0 +1,10 @@ +package com.casic.missiles.modular.device.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class AvPageResponse { + private List items; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java new file mode 100644 index 0000000..098dda4 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.device.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class DeviceRelationshipDTO { + private Long user_id; + private String device_list; + private List deviceList; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java new file mode 100644 index 0000000..74e6a9b --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java @@ -0,0 +1,9 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +@Data +public class AvPageRep { + private Integer total; + private T list; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java new file mode 100644 index 0000000..900ae4a --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +/** + * 分页请求DTO + */ +@Data +public class AvPageRequest { + private int page; + private int paging; + private int limit; + +} diff --git a/README.md b/README.md index 430796e..8dbc9a5 100644 --- a/README.md +++ b/README.md @@ -9,3 +9,7 @@ #### 其他 >* [git地址](http://192.168.0.203:8080/gitbucket) >* [本地免登地址](http://localhost:8083/route/mockToken) + +AView 对接问题 +1.用户设备关联关系 + 对应返回 device_list是否为设备国标号 \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/pom.xml b/casic-device-sync/casic-device-aview/pom.xml index 0a3c5fa..94fb9e5 100644 --- a/casic-device-sync/casic-device-aview/pom.xml +++ b/casic-device-sync/casic-device-aview/pom.xml @@ -33,6 +33,21 @@ ${boot.version} provided + + com.casic + casic-http + ${core.version} + + + com.casic + casic-admin-group + ${admin.version} + + + com.casic + casic-server + ${pro.version} + diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java new file mode 100644 index 0000000..195cba2 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.device.controller; + +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import com.casic.missiles.modular.device.dto.stream.StreamRequestDTO; +import com.casic.missiles.modular.device.service.IAvSyncService; +import io.swagger.annotations.Api; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +@Api(tags = "AV平台代理接口") +@RestController +@RequestMapping("/route") +public class AvRouteController { + @Resource + private IAvSyncService avSyncService; + + @PostMapping("/open/v1/api/streams") + public Object streams(@RequestBody StreamRequestDTO requestDTO) { + Object object = avSyncService.getStreams(requestDTO); + if (object == null) { + ResponseDataDTO respDTO = ResponseDataDTO.error("流读取失败,请稍后重试!"); + respDTO.setMessage("流读取失败,请稍后重试!"); + return respDTO; + } + return ResponseDataDTO.success(avSyncService.getStreams(requestDTO)); + } + + @DeleteMapping("/open/v1/api/streams/{id}") + public Object stopStreams(@PathVariable("id") String id) { + Object object = avSyncService.stopStreams(id); + return ResponseDataDTO.success(object); + } + + @PostMapping("/open/v1/api/streams/{id}/heart") + public Object heart(@PathVariable("id") String id) { + Object object = avSyncService.heart(id); + if (object == null) { + ResponseDataDTO respDTO = ResponseDataDTO.error("流心跳失败,请稍后重试!"); + respDTO.setMessage("流心跳失败,请稍后重试!"); + return respDTO; + } + return ResponseDataDTO.success(object); + } +} \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java new file mode 100644 index 0000000..97bde9f --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java @@ -0,0 +1,49 @@ +package com.casic.missiles.modular.device.dto; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; + +/** + * 艾薇设备对象DTO + */ +@Data +public class AvDeviceDTO { + // 设备ID + private Long id; + + // 设备名称 + private String name; + + // 设备唯一国标序列号 + private String sn; + + // 设备类型 + private Integer type; + + // 设备版本号 + private String version; + + // 安全等级 + @JSONField(name = "secure_level") + private String secureLevel; + + // 设备状态 + private Integer status; + + // 云台类型 + private Integer ptzType; + + // 朝向 + private Integer orientation; + + // 创建时间 + @JSONField(name = "gmt_created") + private String gmtCreated; + + // 修改时间 + @JSONField(name = "gmt_modified") + private String gmtModified; + + // 数据状态 + private Integer state; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java new file mode 100644 index 0000000..9a05183 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java @@ -0,0 +1,10 @@ +package com.casic.missiles.modular.device.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class AvPageResponse { + private List items; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java new file mode 100644 index 0000000..098dda4 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.device.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class DeviceRelationshipDTO { + private Long user_id; + private String device_list; + private List deviceList; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java new file mode 100644 index 0000000..74e6a9b --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java @@ -0,0 +1,9 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +@Data +public class AvPageRep { + private Integer total; + private T list; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java new file mode 100644 index 0000000..900ae4a --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +/** + * 分页请求DTO + */ +@Data +public class AvPageRequest { + private int page; + private int paging; + private int limit; + +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java new file mode 100644 index 0000000..f1c1e7a --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +/** + * mvp返回基类封装 + * + * @param + */ +@Data +public class AvResponseDTO { + private T data; + private Integer code; + private String msg; +} diff --git a/README.md b/README.md index 430796e..8dbc9a5 100644 --- a/README.md +++ b/README.md @@ -9,3 +9,7 @@ #### 其他 >* [git地址](http://192.168.0.203:8080/gitbucket) >* [本地免登地址](http://localhost:8083/route/mockToken) + +AView 对接问题 +1.用户设备关联关系 + 对应返回 device_list是否为设备国标号 \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/pom.xml b/casic-device-sync/casic-device-aview/pom.xml index 0a3c5fa..94fb9e5 100644 --- a/casic-device-sync/casic-device-aview/pom.xml +++ b/casic-device-sync/casic-device-aview/pom.xml @@ -33,6 +33,21 @@ ${boot.version} provided + + com.casic + casic-http + ${core.version} + + + com.casic + casic-admin-group + ${admin.version} + + + com.casic + casic-server + ${pro.version} + diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java new file mode 100644 index 0000000..195cba2 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.device.controller; + +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import com.casic.missiles.modular.device.dto.stream.StreamRequestDTO; +import com.casic.missiles.modular.device.service.IAvSyncService; +import io.swagger.annotations.Api; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +@Api(tags = "AV平台代理接口") +@RestController +@RequestMapping("/route") +public class AvRouteController { + @Resource + private IAvSyncService avSyncService; + + @PostMapping("/open/v1/api/streams") + public Object streams(@RequestBody StreamRequestDTO requestDTO) { + Object object = avSyncService.getStreams(requestDTO); + if (object == null) { + ResponseDataDTO respDTO = ResponseDataDTO.error("流读取失败,请稍后重试!"); + respDTO.setMessage("流读取失败,请稍后重试!"); + return respDTO; + } + return ResponseDataDTO.success(avSyncService.getStreams(requestDTO)); + } + + @DeleteMapping("/open/v1/api/streams/{id}") + public Object stopStreams(@PathVariable("id") String id) { + Object object = avSyncService.stopStreams(id); + return ResponseDataDTO.success(object); + } + + @PostMapping("/open/v1/api/streams/{id}/heart") + public Object heart(@PathVariable("id") String id) { + Object object = avSyncService.heart(id); + if (object == null) { + ResponseDataDTO respDTO = ResponseDataDTO.error("流心跳失败,请稍后重试!"); + respDTO.setMessage("流心跳失败,请稍后重试!"); + return respDTO; + } + return ResponseDataDTO.success(object); + } +} \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java new file mode 100644 index 0000000..97bde9f --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java @@ -0,0 +1,49 @@ +package com.casic.missiles.modular.device.dto; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; + +/** + * 艾薇设备对象DTO + */ +@Data +public class AvDeviceDTO { + // 设备ID + private Long id; + + // 设备名称 + private String name; + + // 设备唯一国标序列号 + private String sn; + + // 设备类型 + private Integer type; + + // 设备版本号 + private String version; + + // 安全等级 + @JSONField(name = "secure_level") + private String secureLevel; + + // 设备状态 + private Integer status; + + // 云台类型 + private Integer ptzType; + + // 朝向 + private Integer orientation; + + // 创建时间 + @JSONField(name = "gmt_created") + private String gmtCreated; + + // 修改时间 + @JSONField(name = "gmt_modified") + private String gmtModified; + + // 数据状态 + private Integer state; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java new file mode 100644 index 0000000..9a05183 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java @@ -0,0 +1,10 @@ +package com.casic.missiles.modular.device.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class AvPageResponse { + private List items; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java new file mode 100644 index 0000000..098dda4 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.device.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class DeviceRelationshipDTO { + private Long user_id; + private String device_list; + private List deviceList; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java new file mode 100644 index 0000000..74e6a9b --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java @@ -0,0 +1,9 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +@Data +public class AvPageRep { + private Integer total; + private T list; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java new file mode 100644 index 0000000..900ae4a --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +/** + * 分页请求DTO + */ +@Data +public class AvPageRequest { + private int page; + private int paging; + private int limit; + +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java new file mode 100644 index 0000000..f1c1e7a --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +/** + * mvp返回基类封装 + * + * @param + */ +@Data +public class AvResponseDTO { + private T data; + private Integer code; + private String msg; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamRequestDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamRequestDTO.java new file mode 100644 index 0000000..69e88ce --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamRequestDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.device.dto.stream; + +import lombok.Data; + +@Data +public class StreamRequestDTO { + private String device_id; + private String stream_type; + private String quality; + private int from; + private int to; +} diff --git a/README.md b/README.md index 430796e..8dbc9a5 100644 --- a/README.md +++ b/README.md @@ -9,3 +9,7 @@ #### 其他 >* [git地址](http://192.168.0.203:8080/gitbucket) >* [本地免登地址](http://localhost:8083/route/mockToken) + +AView 对接问题 +1.用户设备关联关系 + 对应返回 device_list是否为设备国标号 \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/pom.xml b/casic-device-sync/casic-device-aview/pom.xml index 0a3c5fa..94fb9e5 100644 --- a/casic-device-sync/casic-device-aview/pom.xml +++ b/casic-device-sync/casic-device-aview/pom.xml @@ -33,6 +33,21 @@ ${boot.version} provided + + com.casic + casic-http + ${core.version} + + + com.casic + casic-admin-group + ${admin.version} + + + com.casic + casic-server + ${pro.version} + diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java new file mode 100644 index 0000000..195cba2 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.device.controller; + +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import com.casic.missiles.modular.device.dto.stream.StreamRequestDTO; +import com.casic.missiles.modular.device.service.IAvSyncService; +import io.swagger.annotations.Api; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +@Api(tags = "AV平台代理接口") +@RestController +@RequestMapping("/route") +public class AvRouteController { + @Resource + private IAvSyncService avSyncService; + + @PostMapping("/open/v1/api/streams") + public Object streams(@RequestBody StreamRequestDTO requestDTO) { + Object object = avSyncService.getStreams(requestDTO); + if (object == null) { + ResponseDataDTO respDTO = ResponseDataDTO.error("流读取失败,请稍后重试!"); + respDTO.setMessage("流读取失败,请稍后重试!"); + return respDTO; + } + return ResponseDataDTO.success(avSyncService.getStreams(requestDTO)); + } + + @DeleteMapping("/open/v1/api/streams/{id}") + public Object stopStreams(@PathVariable("id") String id) { + Object object = avSyncService.stopStreams(id); + return ResponseDataDTO.success(object); + } + + @PostMapping("/open/v1/api/streams/{id}/heart") + public Object heart(@PathVariable("id") String id) { + Object object = avSyncService.heart(id); + if (object == null) { + ResponseDataDTO respDTO = ResponseDataDTO.error("流心跳失败,请稍后重试!"); + respDTO.setMessage("流心跳失败,请稍后重试!"); + return respDTO; + } + return ResponseDataDTO.success(object); + } +} \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java new file mode 100644 index 0000000..97bde9f --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java @@ -0,0 +1,49 @@ +package com.casic.missiles.modular.device.dto; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; + +/** + * 艾薇设备对象DTO + */ +@Data +public class AvDeviceDTO { + // 设备ID + private Long id; + + // 设备名称 + private String name; + + // 设备唯一国标序列号 + private String sn; + + // 设备类型 + private Integer type; + + // 设备版本号 + private String version; + + // 安全等级 + @JSONField(name = "secure_level") + private String secureLevel; + + // 设备状态 + private Integer status; + + // 云台类型 + private Integer ptzType; + + // 朝向 + private Integer orientation; + + // 创建时间 + @JSONField(name = "gmt_created") + private String gmtCreated; + + // 修改时间 + @JSONField(name = "gmt_modified") + private String gmtModified; + + // 数据状态 + private Integer state; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java new file mode 100644 index 0000000..9a05183 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java @@ -0,0 +1,10 @@ +package com.casic.missiles.modular.device.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class AvPageResponse { + private List items; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java new file mode 100644 index 0000000..098dda4 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.device.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class DeviceRelationshipDTO { + private Long user_id; + private String device_list; + private List deviceList; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java new file mode 100644 index 0000000..74e6a9b --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java @@ -0,0 +1,9 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +@Data +public class AvPageRep { + private Integer total; + private T list; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java new file mode 100644 index 0000000..900ae4a --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +/** + * 分页请求DTO + */ +@Data +public class AvPageRequest { + private int page; + private int paging; + private int limit; + +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java new file mode 100644 index 0000000..f1c1e7a --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +/** + * mvp返回基类封装 + * + * @param + */ +@Data +public class AvResponseDTO { + private T data; + private Integer code; + private String msg; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamRequestDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamRequestDTO.java new file mode 100644 index 0000000..69e88ce --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamRequestDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.device.dto.stream; + +import lombok.Data; + +@Data +public class StreamRequestDTO { + private String device_id; + private String stream_type; + private String quality; + private int from; + private int to; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamStopRequestDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamStopRequestDTO.java new file mode 100644 index 0000000..9cf94b1 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamStopRequestDTO.java @@ -0,0 +1,11 @@ +package com.casic.missiles.modular.device.dto.stream; + +import lombok.Data; + +@Data +public class StreamStopRequestDTO { + private String id; + private String type; + private StreamRequestDTO request; + private String url; +} diff --git a/README.md b/README.md index 430796e..8dbc9a5 100644 --- a/README.md +++ b/README.md @@ -9,3 +9,7 @@ #### 其他 >* [git地址](http://192.168.0.203:8080/gitbucket) >* [本地免登地址](http://localhost:8083/route/mockToken) + +AView 对接问题 +1.用户设备关联关系 + 对应返回 device_list是否为设备国标号 \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/pom.xml b/casic-device-sync/casic-device-aview/pom.xml index 0a3c5fa..94fb9e5 100644 --- a/casic-device-sync/casic-device-aview/pom.xml +++ b/casic-device-sync/casic-device-aview/pom.xml @@ -33,6 +33,21 @@ ${boot.version} provided + + com.casic + casic-http + ${core.version} + + + com.casic + casic-admin-group + ${admin.version} + + + com.casic + casic-server + ${pro.version} + diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java new file mode 100644 index 0000000..195cba2 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.device.controller; + +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import com.casic.missiles.modular.device.dto.stream.StreamRequestDTO; +import com.casic.missiles.modular.device.service.IAvSyncService; +import io.swagger.annotations.Api; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +@Api(tags = "AV平台代理接口") +@RestController +@RequestMapping("/route") +public class AvRouteController { + @Resource + private IAvSyncService avSyncService; + + @PostMapping("/open/v1/api/streams") + public Object streams(@RequestBody StreamRequestDTO requestDTO) { + Object object = avSyncService.getStreams(requestDTO); + if (object == null) { + ResponseDataDTO respDTO = ResponseDataDTO.error("流读取失败,请稍后重试!"); + respDTO.setMessage("流读取失败,请稍后重试!"); + return respDTO; + } + return ResponseDataDTO.success(avSyncService.getStreams(requestDTO)); + } + + @DeleteMapping("/open/v1/api/streams/{id}") + public Object stopStreams(@PathVariable("id") String id) { + Object object = avSyncService.stopStreams(id); + return ResponseDataDTO.success(object); + } + + @PostMapping("/open/v1/api/streams/{id}/heart") + public Object heart(@PathVariable("id") String id) { + Object object = avSyncService.heart(id); + if (object == null) { + ResponseDataDTO respDTO = ResponseDataDTO.error("流心跳失败,请稍后重试!"); + respDTO.setMessage("流心跳失败,请稍后重试!"); + return respDTO; + } + return ResponseDataDTO.success(object); + } +} \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java new file mode 100644 index 0000000..97bde9f --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java @@ -0,0 +1,49 @@ +package com.casic.missiles.modular.device.dto; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; + +/** + * 艾薇设备对象DTO + */ +@Data +public class AvDeviceDTO { + // 设备ID + private Long id; + + // 设备名称 + private String name; + + // 设备唯一国标序列号 + private String sn; + + // 设备类型 + private Integer type; + + // 设备版本号 + private String version; + + // 安全等级 + @JSONField(name = "secure_level") + private String secureLevel; + + // 设备状态 + private Integer status; + + // 云台类型 + private Integer ptzType; + + // 朝向 + private Integer orientation; + + // 创建时间 + @JSONField(name = "gmt_created") + private String gmtCreated; + + // 修改时间 + @JSONField(name = "gmt_modified") + private String gmtModified; + + // 数据状态 + private Integer state; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java new file mode 100644 index 0000000..9a05183 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java @@ -0,0 +1,10 @@ +package com.casic.missiles.modular.device.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class AvPageResponse { + private List items; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java new file mode 100644 index 0000000..098dda4 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.device.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class DeviceRelationshipDTO { + private Long user_id; + private String device_list; + private List deviceList; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java new file mode 100644 index 0000000..74e6a9b --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java @@ -0,0 +1,9 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +@Data +public class AvPageRep { + private Integer total; + private T list; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java new file mode 100644 index 0000000..900ae4a --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +/** + * 分页请求DTO + */ +@Data +public class AvPageRequest { + private int page; + private int paging; + private int limit; + +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java new file mode 100644 index 0000000..f1c1e7a --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +/** + * mvp返回基类封装 + * + * @param + */ +@Data +public class AvResponseDTO { + private T data; + private Integer code; + private String msg; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamRequestDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamRequestDTO.java new file mode 100644 index 0000000..69e88ce --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamRequestDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.device.dto.stream; + +import lombok.Data; + +@Data +public class StreamRequestDTO { + private String device_id; + private String stream_type; + private String quality; + private int from; + private int to; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamStopRequestDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamStopRequestDTO.java new file mode 100644 index 0000000..9cf94b1 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamStopRequestDTO.java @@ -0,0 +1,11 @@ +package com.casic.missiles.modular.device.dto.stream; + +import lombok.Data; + +@Data +public class StreamStopRequestDTO { + private String id; + private String type; + private StreamRequestDTO request; + private String url; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvDataStateEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvDataStateEnum.java new file mode 100644 index 0000000..e1a6658 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvDataStateEnum.java @@ -0,0 +1,72 @@ +package com.casic.missiles.modular.device.enums; + +/** + * 数据状态 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvDataStateEnum { + + TYPE0(0, "有效",0), + DEL(1, "无效",1); + + Integer code; + String message; + Integer type; + AvDataStateEnum(Integer code, String message, Integer type) { + this.code = code; + this.message = message; + this.type = type; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public static String valueOfs(Integer value) { + if (value == null) { + return ""; + } else { + for (AvDataStateEnum ms : AvDataStateEnum.values()) { + if (ms.getCode().equals(value)) { + return ms.getMessage(); + } + } + return ""; + } + } + + public static AvDataStateEnum valueOfType(Integer value) { + if (value == null) { + return TYPE0; + } else { + for (AvDataStateEnum ms : AvDataStateEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return TYPE0; + } + } +} diff --git a/README.md b/README.md index 430796e..8dbc9a5 100644 --- a/README.md +++ b/README.md @@ -9,3 +9,7 @@ #### 其他 >* [git地址](http://192.168.0.203:8080/gitbucket) >* [本地免登地址](http://localhost:8083/route/mockToken) + +AView 对接问题 +1.用户设备关联关系 + 对应返回 device_list是否为设备国标号 \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/pom.xml b/casic-device-sync/casic-device-aview/pom.xml index 0a3c5fa..94fb9e5 100644 --- a/casic-device-sync/casic-device-aview/pom.xml +++ b/casic-device-sync/casic-device-aview/pom.xml @@ -33,6 +33,21 @@ ${boot.version} provided + + com.casic + casic-http + ${core.version} + + + com.casic + casic-admin-group + ${admin.version} + + + com.casic + casic-server + ${pro.version} + diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java new file mode 100644 index 0000000..195cba2 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.device.controller; + +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import com.casic.missiles.modular.device.dto.stream.StreamRequestDTO; +import com.casic.missiles.modular.device.service.IAvSyncService; +import io.swagger.annotations.Api; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +@Api(tags = "AV平台代理接口") +@RestController +@RequestMapping("/route") +public class AvRouteController { + @Resource + private IAvSyncService avSyncService; + + @PostMapping("/open/v1/api/streams") + public Object streams(@RequestBody StreamRequestDTO requestDTO) { + Object object = avSyncService.getStreams(requestDTO); + if (object == null) { + ResponseDataDTO respDTO = ResponseDataDTO.error("流读取失败,请稍后重试!"); + respDTO.setMessage("流读取失败,请稍后重试!"); + return respDTO; + } + return ResponseDataDTO.success(avSyncService.getStreams(requestDTO)); + } + + @DeleteMapping("/open/v1/api/streams/{id}") + public Object stopStreams(@PathVariable("id") String id) { + Object object = avSyncService.stopStreams(id); + return ResponseDataDTO.success(object); + } + + @PostMapping("/open/v1/api/streams/{id}/heart") + public Object heart(@PathVariable("id") String id) { + Object object = avSyncService.heart(id); + if (object == null) { + ResponseDataDTO respDTO = ResponseDataDTO.error("流心跳失败,请稍后重试!"); + respDTO.setMessage("流心跳失败,请稍后重试!"); + return respDTO; + } + return ResponseDataDTO.success(object); + } +} \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java new file mode 100644 index 0000000..97bde9f --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java @@ -0,0 +1,49 @@ +package com.casic.missiles.modular.device.dto; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; + +/** + * 艾薇设备对象DTO + */ +@Data +public class AvDeviceDTO { + // 设备ID + private Long id; + + // 设备名称 + private String name; + + // 设备唯一国标序列号 + private String sn; + + // 设备类型 + private Integer type; + + // 设备版本号 + private String version; + + // 安全等级 + @JSONField(name = "secure_level") + private String secureLevel; + + // 设备状态 + private Integer status; + + // 云台类型 + private Integer ptzType; + + // 朝向 + private Integer orientation; + + // 创建时间 + @JSONField(name = "gmt_created") + private String gmtCreated; + + // 修改时间 + @JSONField(name = "gmt_modified") + private String gmtModified; + + // 数据状态 + private Integer state; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java new file mode 100644 index 0000000..9a05183 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java @@ -0,0 +1,10 @@ +package com.casic.missiles.modular.device.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class AvPageResponse { + private List items; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java new file mode 100644 index 0000000..098dda4 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.device.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class DeviceRelationshipDTO { + private Long user_id; + private String device_list; + private List deviceList; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java new file mode 100644 index 0000000..74e6a9b --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java @@ -0,0 +1,9 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +@Data +public class AvPageRep { + private Integer total; + private T list; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java new file mode 100644 index 0000000..900ae4a --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +/** + * 分页请求DTO + */ +@Data +public class AvPageRequest { + private int page; + private int paging; + private int limit; + +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java new file mode 100644 index 0000000..f1c1e7a --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +/** + * mvp返回基类封装 + * + * @param + */ +@Data +public class AvResponseDTO { + private T data; + private Integer code; + private String msg; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamRequestDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamRequestDTO.java new file mode 100644 index 0000000..69e88ce --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamRequestDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.device.dto.stream; + +import lombok.Data; + +@Data +public class StreamRequestDTO { + private String device_id; + private String stream_type; + private String quality; + private int from; + private int to; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamStopRequestDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamStopRequestDTO.java new file mode 100644 index 0000000..9cf94b1 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamStopRequestDTO.java @@ -0,0 +1,11 @@ +package com.casic.missiles.modular.device.dto.stream; + +import lombok.Data; + +@Data +public class StreamStopRequestDTO { + private String id; + private String type; + private StreamRequestDTO request; + private String url; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvDataStateEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvDataStateEnum.java new file mode 100644 index 0000000..e1a6658 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvDataStateEnum.java @@ -0,0 +1,72 @@ +package com.casic.missiles.modular.device.enums; + +/** + * 数据状态 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvDataStateEnum { + + TYPE0(0, "有效",0), + DEL(1, "无效",1); + + Integer code; + String message; + Integer type; + AvDataStateEnum(Integer code, String message, Integer type) { + this.code = code; + this.message = message; + this.type = type; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public static String valueOfs(Integer value) { + if (value == null) { + return ""; + } else { + for (AvDataStateEnum ms : AvDataStateEnum.values()) { + if (ms.getCode().equals(value)) { + return ms.getMessage(); + } + } + return ""; + } + } + + public static AvDataStateEnum valueOfType(Integer value) { + if (value == null) { + return TYPE0; + } else { + for (AvDataStateEnum ms : AvDataStateEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return TYPE0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvPtzTypeEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvPtzTypeEnum.java new file mode 100644 index 0000000..fdcb08d --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvPtzTypeEnum.java @@ -0,0 +1,73 @@ +package com.casic.missiles.modular.device.enums; + +/** + * wvp设备类型转换 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvPtzTypeEnum { + + TYPE0(0, "枪机",0), + TYPE1(1, "半球",1), + TYPE2(2, "球机",2); + + Integer code; + String message; + Integer type; + AvPtzTypeEnum(Integer code, String message, Integer type) { + this.code = code; + this.message = message; + this.type = type; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public static String valueOfs(Integer value) { + if (value == null) { + return ""; + } else { + for (AvPtzTypeEnum ms : AvPtzTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms.getMessage(); + } + } + return ""; + } + } + + public static AvPtzTypeEnum valueOfType(Integer value) { + if (value == null) { + return TYPE0; + } else { + for (AvPtzTypeEnum ms : AvPtzTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return TYPE0; + } + } +} diff --git a/README.md b/README.md index 430796e..8dbc9a5 100644 --- a/README.md +++ b/README.md @@ -9,3 +9,7 @@ #### 其他 >* [git地址](http://192.168.0.203:8080/gitbucket) >* [本地免登地址](http://localhost:8083/route/mockToken) + +AView 对接问题 +1.用户设备关联关系 + 对应返回 device_list是否为设备国标号 \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/pom.xml b/casic-device-sync/casic-device-aview/pom.xml index 0a3c5fa..94fb9e5 100644 --- a/casic-device-sync/casic-device-aview/pom.xml +++ b/casic-device-sync/casic-device-aview/pom.xml @@ -33,6 +33,21 @@ ${boot.version} provided + + com.casic + casic-http + ${core.version} + + + com.casic + casic-admin-group + ${admin.version} + + + com.casic + casic-server + ${pro.version} + diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java new file mode 100644 index 0000000..195cba2 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.device.controller; + +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import com.casic.missiles.modular.device.dto.stream.StreamRequestDTO; +import com.casic.missiles.modular.device.service.IAvSyncService; +import io.swagger.annotations.Api; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +@Api(tags = "AV平台代理接口") +@RestController +@RequestMapping("/route") +public class AvRouteController { + @Resource + private IAvSyncService avSyncService; + + @PostMapping("/open/v1/api/streams") + public Object streams(@RequestBody StreamRequestDTO requestDTO) { + Object object = avSyncService.getStreams(requestDTO); + if (object == null) { + ResponseDataDTO respDTO = ResponseDataDTO.error("流读取失败,请稍后重试!"); + respDTO.setMessage("流读取失败,请稍后重试!"); + return respDTO; + } + return ResponseDataDTO.success(avSyncService.getStreams(requestDTO)); + } + + @DeleteMapping("/open/v1/api/streams/{id}") + public Object stopStreams(@PathVariable("id") String id) { + Object object = avSyncService.stopStreams(id); + return ResponseDataDTO.success(object); + } + + @PostMapping("/open/v1/api/streams/{id}/heart") + public Object heart(@PathVariable("id") String id) { + Object object = avSyncService.heart(id); + if (object == null) { + ResponseDataDTO respDTO = ResponseDataDTO.error("流心跳失败,请稍后重试!"); + respDTO.setMessage("流心跳失败,请稍后重试!"); + return respDTO; + } + return ResponseDataDTO.success(object); + } +} \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java new file mode 100644 index 0000000..97bde9f --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java @@ -0,0 +1,49 @@ +package com.casic.missiles.modular.device.dto; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; + +/** + * 艾薇设备对象DTO + */ +@Data +public class AvDeviceDTO { + // 设备ID + private Long id; + + // 设备名称 + private String name; + + // 设备唯一国标序列号 + private String sn; + + // 设备类型 + private Integer type; + + // 设备版本号 + private String version; + + // 安全等级 + @JSONField(name = "secure_level") + private String secureLevel; + + // 设备状态 + private Integer status; + + // 云台类型 + private Integer ptzType; + + // 朝向 + private Integer orientation; + + // 创建时间 + @JSONField(name = "gmt_created") + private String gmtCreated; + + // 修改时间 + @JSONField(name = "gmt_modified") + private String gmtModified; + + // 数据状态 + private Integer state; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java new file mode 100644 index 0000000..9a05183 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java @@ -0,0 +1,10 @@ +package com.casic.missiles.modular.device.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class AvPageResponse { + private List items; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java new file mode 100644 index 0000000..098dda4 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.device.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class DeviceRelationshipDTO { + private Long user_id; + private String device_list; + private List deviceList; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java new file mode 100644 index 0000000..74e6a9b --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java @@ -0,0 +1,9 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +@Data +public class AvPageRep { + private Integer total; + private T list; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java new file mode 100644 index 0000000..900ae4a --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +/** + * 分页请求DTO + */ +@Data +public class AvPageRequest { + private int page; + private int paging; + private int limit; + +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java new file mode 100644 index 0000000..f1c1e7a --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +/** + * mvp返回基类封装 + * + * @param + */ +@Data +public class AvResponseDTO { + private T data; + private Integer code; + private String msg; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamRequestDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamRequestDTO.java new file mode 100644 index 0000000..69e88ce --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamRequestDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.device.dto.stream; + +import lombok.Data; + +@Data +public class StreamRequestDTO { + private String device_id; + private String stream_type; + private String quality; + private int from; + private int to; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamStopRequestDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamStopRequestDTO.java new file mode 100644 index 0000000..9cf94b1 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamStopRequestDTO.java @@ -0,0 +1,11 @@ +package com.casic.missiles.modular.device.dto.stream; + +import lombok.Data; + +@Data +public class StreamStopRequestDTO { + private String id; + private String type; + private StreamRequestDTO request; + private String url; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvDataStateEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvDataStateEnum.java new file mode 100644 index 0000000..e1a6658 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvDataStateEnum.java @@ -0,0 +1,72 @@ +package com.casic.missiles.modular.device.enums; + +/** + * 数据状态 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvDataStateEnum { + + TYPE0(0, "有效",0), + DEL(1, "无效",1); + + Integer code; + String message; + Integer type; + AvDataStateEnum(Integer code, String message, Integer type) { + this.code = code; + this.message = message; + this.type = type; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public static String valueOfs(Integer value) { + if (value == null) { + return ""; + } else { + for (AvDataStateEnum ms : AvDataStateEnum.values()) { + if (ms.getCode().equals(value)) { + return ms.getMessage(); + } + } + return ""; + } + } + + public static AvDataStateEnum valueOfType(Integer value) { + if (value == null) { + return TYPE0; + } else { + for (AvDataStateEnum ms : AvDataStateEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return TYPE0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvPtzTypeEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvPtzTypeEnum.java new file mode 100644 index 0000000..fdcb08d --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvPtzTypeEnum.java @@ -0,0 +1,73 @@ +package com.casic.missiles.modular.device.enums; + +/** + * wvp设备类型转换 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvPtzTypeEnum { + + TYPE0(0, "枪机",0), + TYPE1(1, "半球",1), + TYPE2(2, "球机",2); + + Integer code; + String message; + Integer type; + AvPtzTypeEnum(Integer code, String message, Integer type) { + this.code = code; + this.message = message; + this.type = type; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public static String valueOfs(Integer value) { + if (value == null) { + return ""; + } else { + for (AvPtzTypeEnum ms : AvPtzTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms.getMessage(); + } + } + return ""; + } + } + + public static AvPtzTypeEnum valueOfType(Integer value) { + if (value == null) { + return TYPE0; + } else { + for (AvPtzTypeEnum ms : AvPtzTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return TYPE0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvSecretLevelEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvSecretLevelEnum.java new file mode 100644 index 0000000..39e8524 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvSecretLevelEnum.java @@ -0,0 +1,60 @@ +package com.casic.missiles.modular.device.enums; + +/** + * Av主数据密集对应关系枚举 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvSecretLevelEnum { + s("999", "未定密", 999, "未定密"), + s0("0", "公开", 0, "公开"), + s1("1", "内部", 1, "内部"), + s2("2", "秘密", 2, "秘密"), + s3("3", "机密", 3, "机密"); + + String code; + Integer currCode; + String message; + String currMsg; + + AvSecretLevelEnum(String code, String message, Integer currCode, String currMsg) { + this.code = code; + this.currCode = currCode; + this.message = message; + this.currMsg = currMsg; + } + + public Integer getCurrCode() { + return currCode; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public static AvSecretLevelEnum valueOfCode(String value) { + if (value == null) { + return s0; + } else { + for (AvSecretLevelEnum ms : AvSecretLevelEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return s0; + } + } +} diff --git a/README.md b/README.md index 430796e..8dbc9a5 100644 --- a/README.md +++ b/README.md @@ -9,3 +9,7 @@ #### 其他 >* [git地址](http://192.168.0.203:8080/gitbucket) >* [本地免登地址](http://localhost:8083/route/mockToken) + +AView 对接问题 +1.用户设备关联关系 + 对应返回 device_list是否为设备国标号 \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/pom.xml b/casic-device-sync/casic-device-aview/pom.xml index 0a3c5fa..94fb9e5 100644 --- a/casic-device-sync/casic-device-aview/pom.xml +++ b/casic-device-sync/casic-device-aview/pom.xml @@ -33,6 +33,21 @@ ${boot.version} provided + + com.casic + casic-http + ${core.version} + + + com.casic + casic-admin-group + ${admin.version} + + + com.casic + casic-server + ${pro.version} + diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java new file mode 100644 index 0000000..195cba2 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.device.controller; + +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import com.casic.missiles.modular.device.dto.stream.StreamRequestDTO; +import com.casic.missiles.modular.device.service.IAvSyncService; +import io.swagger.annotations.Api; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +@Api(tags = "AV平台代理接口") +@RestController +@RequestMapping("/route") +public class AvRouteController { + @Resource + private IAvSyncService avSyncService; + + @PostMapping("/open/v1/api/streams") + public Object streams(@RequestBody StreamRequestDTO requestDTO) { + Object object = avSyncService.getStreams(requestDTO); + if (object == null) { + ResponseDataDTO respDTO = ResponseDataDTO.error("流读取失败,请稍后重试!"); + respDTO.setMessage("流读取失败,请稍后重试!"); + return respDTO; + } + return ResponseDataDTO.success(avSyncService.getStreams(requestDTO)); + } + + @DeleteMapping("/open/v1/api/streams/{id}") + public Object stopStreams(@PathVariable("id") String id) { + Object object = avSyncService.stopStreams(id); + return ResponseDataDTO.success(object); + } + + @PostMapping("/open/v1/api/streams/{id}/heart") + public Object heart(@PathVariable("id") String id) { + Object object = avSyncService.heart(id); + if (object == null) { + ResponseDataDTO respDTO = ResponseDataDTO.error("流心跳失败,请稍后重试!"); + respDTO.setMessage("流心跳失败,请稍后重试!"); + return respDTO; + } + return ResponseDataDTO.success(object); + } +} \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java new file mode 100644 index 0000000..97bde9f --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java @@ -0,0 +1,49 @@ +package com.casic.missiles.modular.device.dto; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; + +/** + * 艾薇设备对象DTO + */ +@Data +public class AvDeviceDTO { + // 设备ID + private Long id; + + // 设备名称 + private String name; + + // 设备唯一国标序列号 + private String sn; + + // 设备类型 + private Integer type; + + // 设备版本号 + private String version; + + // 安全等级 + @JSONField(name = "secure_level") + private String secureLevel; + + // 设备状态 + private Integer status; + + // 云台类型 + private Integer ptzType; + + // 朝向 + private Integer orientation; + + // 创建时间 + @JSONField(name = "gmt_created") + private String gmtCreated; + + // 修改时间 + @JSONField(name = "gmt_modified") + private String gmtModified; + + // 数据状态 + private Integer state; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java new file mode 100644 index 0000000..9a05183 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java @@ -0,0 +1,10 @@ +package com.casic.missiles.modular.device.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class AvPageResponse { + private List items; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java new file mode 100644 index 0000000..098dda4 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.device.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class DeviceRelationshipDTO { + private Long user_id; + private String device_list; + private List deviceList; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java new file mode 100644 index 0000000..74e6a9b --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java @@ -0,0 +1,9 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +@Data +public class AvPageRep { + private Integer total; + private T list; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java new file mode 100644 index 0000000..900ae4a --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +/** + * 分页请求DTO + */ +@Data +public class AvPageRequest { + private int page; + private int paging; + private int limit; + +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java new file mode 100644 index 0000000..f1c1e7a --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +/** + * mvp返回基类封装 + * + * @param + */ +@Data +public class AvResponseDTO { + private T data; + private Integer code; + private String msg; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamRequestDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamRequestDTO.java new file mode 100644 index 0000000..69e88ce --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamRequestDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.device.dto.stream; + +import lombok.Data; + +@Data +public class StreamRequestDTO { + private String device_id; + private String stream_type; + private String quality; + private int from; + private int to; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamStopRequestDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamStopRequestDTO.java new file mode 100644 index 0000000..9cf94b1 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamStopRequestDTO.java @@ -0,0 +1,11 @@ +package com.casic.missiles.modular.device.dto.stream; + +import lombok.Data; + +@Data +public class StreamStopRequestDTO { + private String id; + private String type; + private StreamRequestDTO request; + private String url; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvDataStateEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvDataStateEnum.java new file mode 100644 index 0000000..e1a6658 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvDataStateEnum.java @@ -0,0 +1,72 @@ +package com.casic.missiles.modular.device.enums; + +/** + * 数据状态 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvDataStateEnum { + + TYPE0(0, "有效",0), + DEL(1, "无效",1); + + Integer code; + String message; + Integer type; + AvDataStateEnum(Integer code, String message, Integer type) { + this.code = code; + this.message = message; + this.type = type; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public static String valueOfs(Integer value) { + if (value == null) { + return ""; + } else { + for (AvDataStateEnum ms : AvDataStateEnum.values()) { + if (ms.getCode().equals(value)) { + return ms.getMessage(); + } + } + return ""; + } + } + + public static AvDataStateEnum valueOfType(Integer value) { + if (value == null) { + return TYPE0; + } else { + for (AvDataStateEnum ms : AvDataStateEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return TYPE0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvPtzTypeEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvPtzTypeEnum.java new file mode 100644 index 0000000..fdcb08d --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvPtzTypeEnum.java @@ -0,0 +1,73 @@ +package com.casic.missiles.modular.device.enums; + +/** + * wvp设备类型转换 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvPtzTypeEnum { + + TYPE0(0, "枪机",0), + TYPE1(1, "半球",1), + TYPE2(2, "球机",2); + + Integer code; + String message; + Integer type; + AvPtzTypeEnum(Integer code, String message, Integer type) { + this.code = code; + this.message = message; + this.type = type; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public static String valueOfs(Integer value) { + if (value == null) { + return ""; + } else { + for (AvPtzTypeEnum ms : AvPtzTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms.getMessage(); + } + } + return ""; + } + } + + public static AvPtzTypeEnum valueOfType(Integer value) { + if (value == null) { + return TYPE0; + } else { + for (AvPtzTypeEnum ms : AvPtzTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return TYPE0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvSecretLevelEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvSecretLevelEnum.java new file mode 100644 index 0000000..39e8524 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvSecretLevelEnum.java @@ -0,0 +1,60 @@ +package com.casic.missiles.modular.device.enums; + +/** + * Av主数据密集对应关系枚举 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvSecretLevelEnum { + s("999", "未定密", 999, "未定密"), + s0("0", "公开", 0, "公开"), + s1("1", "内部", 1, "内部"), + s2("2", "秘密", 2, "秘密"), + s3("3", "机密", 3, "机密"); + + String code; + Integer currCode; + String message; + String currMsg; + + AvSecretLevelEnum(String code, String message, Integer currCode, String currMsg) { + this.code = code; + this.currCode = currCode; + this.message = message; + this.currMsg = currMsg; + } + + public Integer getCurrCode() { + return currCode; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public static AvSecretLevelEnum valueOfCode(String value) { + if (value == null) { + return s0; + } else { + for (AvSecretLevelEnum ms : AvSecretLevelEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return s0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvStatusTypeEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvStatusTypeEnum.java new file mode 100644 index 0000000..ddccd52 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvStatusTypeEnum.java @@ -0,0 +1,72 @@ +package com.casic.missiles.modular.device.enums; + +/** + * wvp设备类型转换 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvStatusTypeEnum { + + TYPE0(0, "离线",0), + TYPE1(1, "在线",1); + + Integer code; + String message; + Integer type; + AvStatusTypeEnum(Integer code, String message, Integer type) { + this.code = code; + this.message = message; + this.type = type; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public static String valueOfs(Integer value) { + if (value == null) { + return ""; + } else { + for (AvStatusTypeEnum ms : AvStatusTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms.getMessage(); + } + } + return ""; + } + } + + public static AvStatusTypeEnum valueOfType(Integer value) { + if (value == null) { + return TYPE0; + } else { + for (AvStatusTypeEnum ms : AvStatusTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return TYPE0; + } + } +} diff --git a/README.md b/README.md index 430796e..8dbc9a5 100644 --- a/README.md +++ b/README.md @@ -9,3 +9,7 @@ #### 其他 >* [git地址](http://192.168.0.203:8080/gitbucket) >* [本地免登地址](http://localhost:8083/route/mockToken) + +AView 对接问题 +1.用户设备关联关系 + 对应返回 device_list是否为设备国标号 \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/pom.xml b/casic-device-sync/casic-device-aview/pom.xml index 0a3c5fa..94fb9e5 100644 --- a/casic-device-sync/casic-device-aview/pom.xml +++ b/casic-device-sync/casic-device-aview/pom.xml @@ -33,6 +33,21 @@ ${boot.version} provided + + com.casic + casic-http + ${core.version} + + + com.casic + casic-admin-group + ${admin.version} + + + com.casic + casic-server + ${pro.version} + diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java new file mode 100644 index 0000000..195cba2 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.device.controller; + +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import com.casic.missiles.modular.device.dto.stream.StreamRequestDTO; +import com.casic.missiles.modular.device.service.IAvSyncService; +import io.swagger.annotations.Api; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +@Api(tags = "AV平台代理接口") +@RestController +@RequestMapping("/route") +public class AvRouteController { + @Resource + private IAvSyncService avSyncService; + + @PostMapping("/open/v1/api/streams") + public Object streams(@RequestBody StreamRequestDTO requestDTO) { + Object object = avSyncService.getStreams(requestDTO); + if (object == null) { + ResponseDataDTO respDTO = ResponseDataDTO.error("流读取失败,请稍后重试!"); + respDTO.setMessage("流读取失败,请稍后重试!"); + return respDTO; + } + return ResponseDataDTO.success(avSyncService.getStreams(requestDTO)); + } + + @DeleteMapping("/open/v1/api/streams/{id}") + public Object stopStreams(@PathVariable("id") String id) { + Object object = avSyncService.stopStreams(id); + return ResponseDataDTO.success(object); + } + + @PostMapping("/open/v1/api/streams/{id}/heart") + public Object heart(@PathVariable("id") String id) { + Object object = avSyncService.heart(id); + if (object == null) { + ResponseDataDTO respDTO = ResponseDataDTO.error("流心跳失败,请稍后重试!"); + respDTO.setMessage("流心跳失败,请稍后重试!"); + return respDTO; + } + return ResponseDataDTO.success(object); + } +} \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java new file mode 100644 index 0000000..97bde9f --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java @@ -0,0 +1,49 @@ +package com.casic.missiles.modular.device.dto; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; + +/** + * 艾薇设备对象DTO + */ +@Data +public class AvDeviceDTO { + // 设备ID + private Long id; + + // 设备名称 + private String name; + + // 设备唯一国标序列号 + private String sn; + + // 设备类型 + private Integer type; + + // 设备版本号 + private String version; + + // 安全等级 + @JSONField(name = "secure_level") + private String secureLevel; + + // 设备状态 + private Integer status; + + // 云台类型 + private Integer ptzType; + + // 朝向 + private Integer orientation; + + // 创建时间 + @JSONField(name = "gmt_created") + private String gmtCreated; + + // 修改时间 + @JSONField(name = "gmt_modified") + private String gmtModified; + + // 数据状态 + private Integer state; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java new file mode 100644 index 0000000..9a05183 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java @@ -0,0 +1,10 @@ +package com.casic.missiles.modular.device.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class AvPageResponse { + private List items; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java new file mode 100644 index 0000000..098dda4 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.device.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class DeviceRelationshipDTO { + private Long user_id; + private String device_list; + private List deviceList; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java new file mode 100644 index 0000000..74e6a9b --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java @@ -0,0 +1,9 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +@Data +public class AvPageRep { + private Integer total; + private T list; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java new file mode 100644 index 0000000..900ae4a --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +/** + * 分页请求DTO + */ +@Data +public class AvPageRequest { + private int page; + private int paging; + private int limit; + +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java new file mode 100644 index 0000000..f1c1e7a --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +/** + * mvp返回基类封装 + * + * @param + */ +@Data +public class AvResponseDTO { + private T data; + private Integer code; + private String msg; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamRequestDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamRequestDTO.java new file mode 100644 index 0000000..69e88ce --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamRequestDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.device.dto.stream; + +import lombok.Data; + +@Data +public class StreamRequestDTO { + private String device_id; + private String stream_type; + private String quality; + private int from; + private int to; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamStopRequestDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamStopRequestDTO.java new file mode 100644 index 0000000..9cf94b1 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamStopRequestDTO.java @@ -0,0 +1,11 @@ +package com.casic.missiles.modular.device.dto.stream; + +import lombok.Data; + +@Data +public class StreamStopRequestDTO { + private String id; + private String type; + private StreamRequestDTO request; + private String url; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvDataStateEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvDataStateEnum.java new file mode 100644 index 0000000..e1a6658 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvDataStateEnum.java @@ -0,0 +1,72 @@ +package com.casic.missiles.modular.device.enums; + +/** + * 数据状态 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvDataStateEnum { + + TYPE0(0, "有效",0), + DEL(1, "无效",1); + + Integer code; + String message; + Integer type; + AvDataStateEnum(Integer code, String message, Integer type) { + this.code = code; + this.message = message; + this.type = type; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public static String valueOfs(Integer value) { + if (value == null) { + return ""; + } else { + for (AvDataStateEnum ms : AvDataStateEnum.values()) { + if (ms.getCode().equals(value)) { + return ms.getMessage(); + } + } + return ""; + } + } + + public static AvDataStateEnum valueOfType(Integer value) { + if (value == null) { + return TYPE0; + } else { + for (AvDataStateEnum ms : AvDataStateEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return TYPE0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvPtzTypeEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvPtzTypeEnum.java new file mode 100644 index 0000000..fdcb08d --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvPtzTypeEnum.java @@ -0,0 +1,73 @@ +package com.casic.missiles.modular.device.enums; + +/** + * wvp设备类型转换 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvPtzTypeEnum { + + TYPE0(0, "枪机",0), + TYPE1(1, "半球",1), + TYPE2(2, "球机",2); + + Integer code; + String message; + Integer type; + AvPtzTypeEnum(Integer code, String message, Integer type) { + this.code = code; + this.message = message; + this.type = type; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public static String valueOfs(Integer value) { + if (value == null) { + return ""; + } else { + for (AvPtzTypeEnum ms : AvPtzTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms.getMessage(); + } + } + return ""; + } + } + + public static AvPtzTypeEnum valueOfType(Integer value) { + if (value == null) { + return TYPE0; + } else { + for (AvPtzTypeEnum ms : AvPtzTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return TYPE0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvSecretLevelEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvSecretLevelEnum.java new file mode 100644 index 0000000..39e8524 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvSecretLevelEnum.java @@ -0,0 +1,60 @@ +package com.casic.missiles.modular.device.enums; + +/** + * Av主数据密集对应关系枚举 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvSecretLevelEnum { + s("999", "未定密", 999, "未定密"), + s0("0", "公开", 0, "公开"), + s1("1", "内部", 1, "内部"), + s2("2", "秘密", 2, "秘密"), + s3("3", "机密", 3, "机密"); + + String code; + Integer currCode; + String message; + String currMsg; + + AvSecretLevelEnum(String code, String message, Integer currCode, String currMsg) { + this.code = code; + this.currCode = currCode; + this.message = message; + this.currMsg = currMsg; + } + + public Integer getCurrCode() { + return currCode; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public static AvSecretLevelEnum valueOfCode(String value) { + if (value == null) { + return s0; + } else { + for (AvSecretLevelEnum ms : AvSecretLevelEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return s0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvStatusTypeEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvStatusTypeEnum.java new file mode 100644 index 0000000..ddccd52 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvStatusTypeEnum.java @@ -0,0 +1,72 @@ +package com.casic.missiles.modular.device.enums; + +/** + * wvp设备类型转换 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvStatusTypeEnum { + + TYPE0(0, "离线",0), + TYPE1(1, "在线",1); + + Integer code; + String message; + Integer type; + AvStatusTypeEnum(Integer code, String message, Integer type) { + this.code = code; + this.message = message; + this.type = type; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public static String valueOfs(Integer value) { + if (value == null) { + return ""; + } else { + for (AvStatusTypeEnum ms : AvStatusTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms.getMessage(); + } + } + return ""; + } + } + + public static AvStatusTypeEnum valueOfType(Integer value) { + if (value == null) { + return TYPE0; + } else { + for (AvStatusTypeEnum ms : AvStatusTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return TYPE0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvUrlEnums.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvUrlEnums.java new file mode 100644 index 0000000..04b38ad --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvUrlEnums.java @@ -0,0 +1,37 @@ +package com.casic.missiles.modular.device.enums; + +/** + * 设备媒体 + */ +public enum AvUrlEnums { + DEVICE("/open/v1/api/devices","设备信息查询"), + STREAM("/open/v1/api/streams","创建流"), + STREAM_STOP("/open/v1/api/streams/%s","停止流"), + HEART("/open/v1/api/streams/%s/heartbeat","发送心跳"), + DICT("/open/v1/api/dictionary_datas","字典查询"), + USER_DEVICE_RELATION("/open/v1/api/user_device_relationships","用户设备关联关系"); + + private String url; + private String name; + + AvUrlEnums(String url, String name) { + this.url = url; + this.name = name; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/README.md b/README.md index 430796e..8dbc9a5 100644 --- a/README.md +++ b/README.md @@ -9,3 +9,7 @@ #### 其他 >* [git地址](http://192.168.0.203:8080/gitbucket) >* [本地免登地址](http://localhost:8083/route/mockToken) + +AView 对接问题 +1.用户设备关联关系 + 对应返回 device_list是否为设备国标号 \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/pom.xml b/casic-device-sync/casic-device-aview/pom.xml index 0a3c5fa..94fb9e5 100644 --- a/casic-device-sync/casic-device-aview/pom.xml +++ b/casic-device-sync/casic-device-aview/pom.xml @@ -33,6 +33,21 @@ ${boot.version} provided + + com.casic + casic-http + ${core.version} + + + com.casic + casic-admin-group + ${admin.version} + + + com.casic + casic-server + ${pro.version} + diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java new file mode 100644 index 0000000..195cba2 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.device.controller; + +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import com.casic.missiles.modular.device.dto.stream.StreamRequestDTO; +import com.casic.missiles.modular.device.service.IAvSyncService; +import io.swagger.annotations.Api; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +@Api(tags = "AV平台代理接口") +@RestController +@RequestMapping("/route") +public class AvRouteController { + @Resource + private IAvSyncService avSyncService; + + @PostMapping("/open/v1/api/streams") + public Object streams(@RequestBody StreamRequestDTO requestDTO) { + Object object = avSyncService.getStreams(requestDTO); + if (object == null) { + ResponseDataDTO respDTO = ResponseDataDTO.error("流读取失败,请稍后重试!"); + respDTO.setMessage("流读取失败,请稍后重试!"); + return respDTO; + } + return ResponseDataDTO.success(avSyncService.getStreams(requestDTO)); + } + + @DeleteMapping("/open/v1/api/streams/{id}") + public Object stopStreams(@PathVariable("id") String id) { + Object object = avSyncService.stopStreams(id); + return ResponseDataDTO.success(object); + } + + @PostMapping("/open/v1/api/streams/{id}/heart") + public Object heart(@PathVariable("id") String id) { + Object object = avSyncService.heart(id); + if (object == null) { + ResponseDataDTO respDTO = ResponseDataDTO.error("流心跳失败,请稍后重试!"); + respDTO.setMessage("流心跳失败,请稍后重试!"); + return respDTO; + } + return ResponseDataDTO.success(object); + } +} \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java new file mode 100644 index 0000000..97bde9f --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java @@ -0,0 +1,49 @@ +package com.casic.missiles.modular.device.dto; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; + +/** + * 艾薇设备对象DTO + */ +@Data +public class AvDeviceDTO { + // 设备ID + private Long id; + + // 设备名称 + private String name; + + // 设备唯一国标序列号 + private String sn; + + // 设备类型 + private Integer type; + + // 设备版本号 + private String version; + + // 安全等级 + @JSONField(name = "secure_level") + private String secureLevel; + + // 设备状态 + private Integer status; + + // 云台类型 + private Integer ptzType; + + // 朝向 + private Integer orientation; + + // 创建时间 + @JSONField(name = "gmt_created") + private String gmtCreated; + + // 修改时间 + @JSONField(name = "gmt_modified") + private String gmtModified; + + // 数据状态 + private Integer state; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java new file mode 100644 index 0000000..9a05183 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java @@ -0,0 +1,10 @@ +package com.casic.missiles.modular.device.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class AvPageResponse { + private List items; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java new file mode 100644 index 0000000..098dda4 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.device.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class DeviceRelationshipDTO { + private Long user_id; + private String device_list; + private List deviceList; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java new file mode 100644 index 0000000..74e6a9b --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java @@ -0,0 +1,9 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +@Data +public class AvPageRep { + private Integer total; + private T list; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java new file mode 100644 index 0000000..900ae4a --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +/** + * 分页请求DTO + */ +@Data +public class AvPageRequest { + private int page; + private int paging; + private int limit; + +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java new file mode 100644 index 0000000..f1c1e7a --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +/** + * mvp返回基类封装 + * + * @param + */ +@Data +public class AvResponseDTO { + private T data; + private Integer code; + private String msg; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamRequestDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamRequestDTO.java new file mode 100644 index 0000000..69e88ce --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamRequestDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.device.dto.stream; + +import lombok.Data; + +@Data +public class StreamRequestDTO { + private String device_id; + private String stream_type; + private String quality; + private int from; + private int to; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamStopRequestDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamStopRequestDTO.java new file mode 100644 index 0000000..9cf94b1 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamStopRequestDTO.java @@ -0,0 +1,11 @@ +package com.casic.missiles.modular.device.dto.stream; + +import lombok.Data; + +@Data +public class StreamStopRequestDTO { + private String id; + private String type; + private StreamRequestDTO request; + private String url; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvDataStateEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvDataStateEnum.java new file mode 100644 index 0000000..e1a6658 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvDataStateEnum.java @@ -0,0 +1,72 @@ +package com.casic.missiles.modular.device.enums; + +/** + * 数据状态 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvDataStateEnum { + + TYPE0(0, "有效",0), + DEL(1, "无效",1); + + Integer code; + String message; + Integer type; + AvDataStateEnum(Integer code, String message, Integer type) { + this.code = code; + this.message = message; + this.type = type; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public static String valueOfs(Integer value) { + if (value == null) { + return ""; + } else { + for (AvDataStateEnum ms : AvDataStateEnum.values()) { + if (ms.getCode().equals(value)) { + return ms.getMessage(); + } + } + return ""; + } + } + + public static AvDataStateEnum valueOfType(Integer value) { + if (value == null) { + return TYPE0; + } else { + for (AvDataStateEnum ms : AvDataStateEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return TYPE0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvPtzTypeEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvPtzTypeEnum.java new file mode 100644 index 0000000..fdcb08d --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvPtzTypeEnum.java @@ -0,0 +1,73 @@ +package com.casic.missiles.modular.device.enums; + +/** + * wvp设备类型转换 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvPtzTypeEnum { + + TYPE0(0, "枪机",0), + TYPE1(1, "半球",1), + TYPE2(2, "球机",2); + + Integer code; + String message; + Integer type; + AvPtzTypeEnum(Integer code, String message, Integer type) { + this.code = code; + this.message = message; + this.type = type; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public static String valueOfs(Integer value) { + if (value == null) { + return ""; + } else { + for (AvPtzTypeEnum ms : AvPtzTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms.getMessage(); + } + } + return ""; + } + } + + public static AvPtzTypeEnum valueOfType(Integer value) { + if (value == null) { + return TYPE0; + } else { + for (AvPtzTypeEnum ms : AvPtzTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return TYPE0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvSecretLevelEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvSecretLevelEnum.java new file mode 100644 index 0000000..39e8524 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvSecretLevelEnum.java @@ -0,0 +1,60 @@ +package com.casic.missiles.modular.device.enums; + +/** + * Av主数据密集对应关系枚举 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvSecretLevelEnum { + s("999", "未定密", 999, "未定密"), + s0("0", "公开", 0, "公开"), + s1("1", "内部", 1, "内部"), + s2("2", "秘密", 2, "秘密"), + s3("3", "机密", 3, "机密"); + + String code; + Integer currCode; + String message; + String currMsg; + + AvSecretLevelEnum(String code, String message, Integer currCode, String currMsg) { + this.code = code; + this.currCode = currCode; + this.message = message; + this.currMsg = currMsg; + } + + public Integer getCurrCode() { + return currCode; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public static AvSecretLevelEnum valueOfCode(String value) { + if (value == null) { + return s0; + } else { + for (AvSecretLevelEnum ms : AvSecretLevelEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return s0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvStatusTypeEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvStatusTypeEnum.java new file mode 100644 index 0000000..ddccd52 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvStatusTypeEnum.java @@ -0,0 +1,72 @@ +package com.casic.missiles.modular.device.enums; + +/** + * wvp设备类型转换 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvStatusTypeEnum { + + TYPE0(0, "离线",0), + TYPE1(1, "在线",1); + + Integer code; + String message; + Integer type; + AvStatusTypeEnum(Integer code, String message, Integer type) { + this.code = code; + this.message = message; + this.type = type; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public static String valueOfs(Integer value) { + if (value == null) { + return ""; + } else { + for (AvStatusTypeEnum ms : AvStatusTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms.getMessage(); + } + } + return ""; + } + } + + public static AvStatusTypeEnum valueOfType(Integer value) { + if (value == null) { + return TYPE0; + } else { + for (AvStatusTypeEnum ms : AvStatusTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return TYPE0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvUrlEnums.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvUrlEnums.java new file mode 100644 index 0000000..04b38ad --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvUrlEnums.java @@ -0,0 +1,37 @@ +package com.casic.missiles.modular.device.enums; + +/** + * 设备媒体 + */ +public enum AvUrlEnums { + DEVICE("/open/v1/api/devices","设备信息查询"), + STREAM("/open/v1/api/streams","创建流"), + STREAM_STOP("/open/v1/api/streams/%s","停止流"), + HEART("/open/v1/api/streams/%s/heartbeat","发送心跳"), + DICT("/open/v1/api/dictionary_datas","字典查询"), + USER_DEVICE_RELATION("/open/v1/api/user_device_relationships","用户设备关联关系"); + + private String url; + private String name; + + AvUrlEnums(String url, String name) { + this.url = url; + this.name = name; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/AvDefaultHttpHeaderHandler.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/AvDefaultHttpHeaderHandler.java new file mode 100644 index 0000000..53f0a5c --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/AvDefaultHttpHeaderHandler.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.device.http; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.modular.system.handler.DefaultHttpHeaderHandler; +import org.apache.http.client.methods.HttpRequestBase; + +public class AvDefaultHttpHeaderHandler extends DefaultHttpHeaderHandler { + public void setHeader(HttpRequestBase base, String token) { + base.addHeader("Content-type", DEFAULT_CONTEXTTYPE); + if (StrUtil.isNotEmpty(token)) { + base.addHeader("X-OApi-Token", token); + } + } +} diff --git a/README.md b/README.md index 430796e..8dbc9a5 100644 --- a/README.md +++ b/README.md @@ -9,3 +9,7 @@ #### 其他 >* [git地址](http://192.168.0.203:8080/gitbucket) >* [本地免登地址](http://localhost:8083/route/mockToken) + +AView 对接问题 +1.用户设备关联关系 + 对应返回 device_list是否为设备国标号 \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/pom.xml b/casic-device-sync/casic-device-aview/pom.xml index 0a3c5fa..94fb9e5 100644 --- a/casic-device-sync/casic-device-aview/pom.xml +++ b/casic-device-sync/casic-device-aview/pom.xml @@ -33,6 +33,21 @@ ${boot.version} provided + + com.casic + casic-http + ${core.version} + + + com.casic + casic-admin-group + ${admin.version} + + + com.casic + casic-server + ${pro.version} + diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java new file mode 100644 index 0000000..195cba2 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.device.controller; + +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import com.casic.missiles.modular.device.dto.stream.StreamRequestDTO; +import com.casic.missiles.modular.device.service.IAvSyncService; +import io.swagger.annotations.Api; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +@Api(tags = "AV平台代理接口") +@RestController +@RequestMapping("/route") +public class AvRouteController { + @Resource + private IAvSyncService avSyncService; + + @PostMapping("/open/v1/api/streams") + public Object streams(@RequestBody StreamRequestDTO requestDTO) { + Object object = avSyncService.getStreams(requestDTO); + if (object == null) { + ResponseDataDTO respDTO = ResponseDataDTO.error("流读取失败,请稍后重试!"); + respDTO.setMessage("流读取失败,请稍后重试!"); + return respDTO; + } + return ResponseDataDTO.success(avSyncService.getStreams(requestDTO)); + } + + @DeleteMapping("/open/v1/api/streams/{id}") + public Object stopStreams(@PathVariable("id") String id) { + Object object = avSyncService.stopStreams(id); + return ResponseDataDTO.success(object); + } + + @PostMapping("/open/v1/api/streams/{id}/heart") + public Object heart(@PathVariable("id") String id) { + Object object = avSyncService.heart(id); + if (object == null) { + ResponseDataDTO respDTO = ResponseDataDTO.error("流心跳失败,请稍后重试!"); + respDTO.setMessage("流心跳失败,请稍后重试!"); + return respDTO; + } + return ResponseDataDTO.success(object); + } +} \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java new file mode 100644 index 0000000..97bde9f --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java @@ -0,0 +1,49 @@ +package com.casic.missiles.modular.device.dto; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; + +/** + * 艾薇设备对象DTO + */ +@Data +public class AvDeviceDTO { + // 设备ID + private Long id; + + // 设备名称 + private String name; + + // 设备唯一国标序列号 + private String sn; + + // 设备类型 + private Integer type; + + // 设备版本号 + private String version; + + // 安全等级 + @JSONField(name = "secure_level") + private String secureLevel; + + // 设备状态 + private Integer status; + + // 云台类型 + private Integer ptzType; + + // 朝向 + private Integer orientation; + + // 创建时间 + @JSONField(name = "gmt_created") + private String gmtCreated; + + // 修改时间 + @JSONField(name = "gmt_modified") + private String gmtModified; + + // 数据状态 + private Integer state; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java new file mode 100644 index 0000000..9a05183 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java @@ -0,0 +1,10 @@ +package com.casic.missiles.modular.device.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class AvPageResponse { + private List items; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java new file mode 100644 index 0000000..098dda4 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.device.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class DeviceRelationshipDTO { + private Long user_id; + private String device_list; + private List deviceList; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java new file mode 100644 index 0000000..74e6a9b --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java @@ -0,0 +1,9 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +@Data +public class AvPageRep { + private Integer total; + private T list; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java new file mode 100644 index 0000000..900ae4a --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +/** + * 分页请求DTO + */ +@Data +public class AvPageRequest { + private int page; + private int paging; + private int limit; + +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java new file mode 100644 index 0000000..f1c1e7a --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +/** + * mvp返回基类封装 + * + * @param + */ +@Data +public class AvResponseDTO { + private T data; + private Integer code; + private String msg; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamRequestDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamRequestDTO.java new file mode 100644 index 0000000..69e88ce --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamRequestDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.device.dto.stream; + +import lombok.Data; + +@Data +public class StreamRequestDTO { + private String device_id; + private String stream_type; + private String quality; + private int from; + private int to; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamStopRequestDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamStopRequestDTO.java new file mode 100644 index 0000000..9cf94b1 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamStopRequestDTO.java @@ -0,0 +1,11 @@ +package com.casic.missiles.modular.device.dto.stream; + +import lombok.Data; + +@Data +public class StreamStopRequestDTO { + private String id; + private String type; + private StreamRequestDTO request; + private String url; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvDataStateEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvDataStateEnum.java new file mode 100644 index 0000000..e1a6658 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvDataStateEnum.java @@ -0,0 +1,72 @@ +package com.casic.missiles.modular.device.enums; + +/** + * 数据状态 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvDataStateEnum { + + TYPE0(0, "有效",0), + DEL(1, "无效",1); + + Integer code; + String message; + Integer type; + AvDataStateEnum(Integer code, String message, Integer type) { + this.code = code; + this.message = message; + this.type = type; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public static String valueOfs(Integer value) { + if (value == null) { + return ""; + } else { + for (AvDataStateEnum ms : AvDataStateEnum.values()) { + if (ms.getCode().equals(value)) { + return ms.getMessage(); + } + } + return ""; + } + } + + public static AvDataStateEnum valueOfType(Integer value) { + if (value == null) { + return TYPE0; + } else { + for (AvDataStateEnum ms : AvDataStateEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return TYPE0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvPtzTypeEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvPtzTypeEnum.java new file mode 100644 index 0000000..fdcb08d --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvPtzTypeEnum.java @@ -0,0 +1,73 @@ +package com.casic.missiles.modular.device.enums; + +/** + * wvp设备类型转换 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvPtzTypeEnum { + + TYPE0(0, "枪机",0), + TYPE1(1, "半球",1), + TYPE2(2, "球机",2); + + Integer code; + String message; + Integer type; + AvPtzTypeEnum(Integer code, String message, Integer type) { + this.code = code; + this.message = message; + this.type = type; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public static String valueOfs(Integer value) { + if (value == null) { + return ""; + } else { + for (AvPtzTypeEnum ms : AvPtzTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms.getMessage(); + } + } + return ""; + } + } + + public static AvPtzTypeEnum valueOfType(Integer value) { + if (value == null) { + return TYPE0; + } else { + for (AvPtzTypeEnum ms : AvPtzTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return TYPE0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvSecretLevelEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvSecretLevelEnum.java new file mode 100644 index 0000000..39e8524 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvSecretLevelEnum.java @@ -0,0 +1,60 @@ +package com.casic.missiles.modular.device.enums; + +/** + * Av主数据密集对应关系枚举 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvSecretLevelEnum { + s("999", "未定密", 999, "未定密"), + s0("0", "公开", 0, "公开"), + s1("1", "内部", 1, "内部"), + s2("2", "秘密", 2, "秘密"), + s3("3", "机密", 3, "机密"); + + String code; + Integer currCode; + String message; + String currMsg; + + AvSecretLevelEnum(String code, String message, Integer currCode, String currMsg) { + this.code = code; + this.currCode = currCode; + this.message = message; + this.currMsg = currMsg; + } + + public Integer getCurrCode() { + return currCode; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public static AvSecretLevelEnum valueOfCode(String value) { + if (value == null) { + return s0; + } else { + for (AvSecretLevelEnum ms : AvSecretLevelEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return s0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvStatusTypeEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvStatusTypeEnum.java new file mode 100644 index 0000000..ddccd52 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvStatusTypeEnum.java @@ -0,0 +1,72 @@ +package com.casic.missiles.modular.device.enums; + +/** + * wvp设备类型转换 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvStatusTypeEnum { + + TYPE0(0, "离线",0), + TYPE1(1, "在线",1); + + Integer code; + String message; + Integer type; + AvStatusTypeEnum(Integer code, String message, Integer type) { + this.code = code; + this.message = message; + this.type = type; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public static String valueOfs(Integer value) { + if (value == null) { + return ""; + } else { + for (AvStatusTypeEnum ms : AvStatusTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms.getMessage(); + } + } + return ""; + } + } + + public static AvStatusTypeEnum valueOfType(Integer value) { + if (value == null) { + return TYPE0; + } else { + for (AvStatusTypeEnum ms : AvStatusTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return TYPE0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvUrlEnums.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvUrlEnums.java new file mode 100644 index 0000000..04b38ad --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvUrlEnums.java @@ -0,0 +1,37 @@ +package com.casic.missiles.modular.device.enums; + +/** + * 设备媒体 + */ +public enum AvUrlEnums { + DEVICE("/open/v1/api/devices","设备信息查询"), + STREAM("/open/v1/api/streams","创建流"), + STREAM_STOP("/open/v1/api/streams/%s","停止流"), + HEART("/open/v1/api/streams/%s/heartbeat","发送心跳"), + DICT("/open/v1/api/dictionary_datas","字典查询"), + USER_DEVICE_RELATION("/open/v1/api/user_device_relationships","用户设备关联关系"); + + private String url; + private String name; + + AvUrlEnums(String url, String name) { + this.url = url; + this.name = name; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/AvDefaultHttpHeaderHandler.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/AvDefaultHttpHeaderHandler.java new file mode 100644 index 0000000..53f0a5c --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/AvDefaultHttpHeaderHandler.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.device.http; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.modular.system.handler.DefaultHttpHeaderHandler; +import org.apache.http.client.methods.HttpRequestBase; + +public class AvDefaultHttpHeaderHandler extends DefaultHttpHeaderHandler { + public void setHeader(HttpRequestBase base, String token) { + base.addHeader("Content-type", DEFAULT_CONTEXTTYPE); + if (StrUtil.isNotEmpty(token)) { + base.addHeader("X-OApi-Token", token); + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/HttpGetWithEntity.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/HttpGetWithEntity.java new file mode 100644 index 0000000..b8abf8f --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/HttpGetWithEntity.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.device.http; + +import org.apache.http.client.methods.HttpEntityEnclosingRequestBase; + +import java.net.URI; + +public class HttpGetWithEntity extends HttpEntityEnclosingRequestBase { + + public HttpGetWithEntity(URI uri) { + this.setURI(uri); + } + + public HttpGetWithEntity(String uri) { + this.setURI(URI.create(uri)); + } + + public String getMethod() { + return "GET"; + } +} diff --git a/README.md b/README.md index 430796e..8dbc9a5 100644 --- a/README.md +++ b/README.md @@ -9,3 +9,7 @@ #### 其他 >* [git地址](http://192.168.0.203:8080/gitbucket) >* [本地免登地址](http://localhost:8083/route/mockToken) + +AView 对接问题 +1.用户设备关联关系 + 对应返回 device_list是否为设备国标号 \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/pom.xml b/casic-device-sync/casic-device-aview/pom.xml index 0a3c5fa..94fb9e5 100644 --- a/casic-device-sync/casic-device-aview/pom.xml +++ b/casic-device-sync/casic-device-aview/pom.xml @@ -33,6 +33,21 @@ ${boot.version} provided + + com.casic + casic-http + ${core.version} + + + com.casic + casic-admin-group + ${admin.version} + + + com.casic + casic-server + ${pro.version} + diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java new file mode 100644 index 0000000..195cba2 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.device.controller; + +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import com.casic.missiles.modular.device.dto.stream.StreamRequestDTO; +import com.casic.missiles.modular.device.service.IAvSyncService; +import io.swagger.annotations.Api; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +@Api(tags = "AV平台代理接口") +@RestController +@RequestMapping("/route") +public class AvRouteController { + @Resource + private IAvSyncService avSyncService; + + @PostMapping("/open/v1/api/streams") + public Object streams(@RequestBody StreamRequestDTO requestDTO) { + Object object = avSyncService.getStreams(requestDTO); + if (object == null) { + ResponseDataDTO respDTO = ResponseDataDTO.error("流读取失败,请稍后重试!"); + respDTO.setMessage("流读取失败,请稍后重试!"); + return respDTO; + } + return ResponseDataDTO.success(avSyncService.getStreams(requestDTO)); + } + + @DeleteMapping("/open/v1/api/streams/{id}") + public Object stopStreams(@PathVariable("id") String id) { + Object object = avSyncService.stopStreams(id); + return ResponseDataDTO.success(object); + } + + @PostMapping("/open/v1/api/streams/{id}/heart") + public Object heart(@PathVariable("id") String id) { + Object object = avSyncService.heart(id); + if (object == null) { + ResponseDataDTO respDTO = ResponseDataDTO.error("流心跳失败,请稍后重试!"); + respDTO.setMessage("流心跳失败,请稍后重试!"); + return respDTO; + } + return ResponseDataDTO.success(object); + } +} \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java new file mode 100644 index 0000000..97bde9f --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java @@ -0,0 +1,49 @@ +package com.casic.missiles.modular.device.dto; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; + +/** + * 艾薇设备对象DTO + */ +@Data +public class AvDeviceDTO { + // 设备ID + private Long id; + + // 设备名称 + private String name; + + // 设备唯一国标序列号 + private String sn; + + // 设备类型 + private Integer type; + + // 设备版本号 + private String version; + + // 安全等级 + @JSONField(name = "secure_level") + private String secureLevel; + + // 设备状态 + private Integer status; + + // 云台类型 + private Integer ptzType; + + // 朝向 + private Integer orientation; + + // 创建时间 + @JSONField(name = "gmt_created") + private String gmtCreated; + + // 修改时间 + @JSONField(name = "gmt_modified") + private String gmtModified; + + // 数据状态 + private Integer state; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java new file mode 100644 index 0000000..9a05183 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java @@ -0,0 +1,10 @@ +package com.casic.missiles.modular.device.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class AvPageResponse { + private List items; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java new file mode 100644 index 0000000..098dda4 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.device.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class DeviceRelationshipDTO { + private Long user_id; + private String device_list; + private List deviceList; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java new file mode 100644 index 0000000..74e6a9b --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java @@ -0,0 +1,9 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +@Data +public class AvPageRep { + private Integer total; + private T list; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java new file mode 100644 index 0000000..900ae4a --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +/** + * 分页请求DTO + */ +@Data +public class AvPageRequest { + private int page; + private int paging; + private int limit; + +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java new file mode 100644 index 0000000..f1c1e7a --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +/** + * mvp返回基类封装 + * + * @param + */ +@Data +public class AvResponseDTO { + private T data; + private Integer code; + private String msg; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamRequestDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamRequestDTO.java new file mode 100644 index 0000000..69e88ce --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamRequestDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.device.dto.stream; + +import lombok.Data; + +@Data +public class StreamRequestDTO { + private String device_id; + private String stream_type; + private String quality; + private int from; + private int to; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamStopRequestDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamStopRequestDTO.java new file mode 100644 index 0000000..9cf94b1 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamStopRequestDTO.java @@ -0,0 +1,11 @@ +package com.casic.missiles.modular.device.dto.stream; + +import lombok.Data; + +@Data +public class StreamStopRequestDTO { + private String id; + private String type; + private StreamRequestDTO request; + private String url; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvDataStateEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvDataStateEnum.java new file mode 100644 index 0000000..e1a6658 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvDataStateEnum.java @@ -0,0 +1,72 @@ +package com.casic.missiles.modular.device.enums; + +/** + * 数据状态 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvDataStateEnum { + + TYPE0(0, "有效",0), + DEL(1, "无效",1); + + Integer code; + String message; + Integer type; + AvDataStateEnum(Integer code, String message, Integer type) { + this.code = code; + this.message = message; + this.type = type; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public static String valueOfs(Integer value) { + if (value == null) { + return ""; + } else { + for (AvDataStateEnum ms : AvDataStateEnum.values()) { + if (ms.getCode().equals(value)) { + return ms.getMessage(); + } + } + return ""; + } + } + + public static AvDataStateEnum valueOfType(Integer value) { + if (value == null) { + return TYPE0; + } else { + for (AvDataStateEnum ms : AvDataStateEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return TYPE0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvPtzTypeEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvPtzTypeEnum.java new file mode 100644 index 0000000..fdcb08d --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvPtzTypeEnum.java @@ -0,0 +1,73 @@ +package com.casic.missiles.modular.device.enums; + +/** + * wvp设备类型转换 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvPtzTypeEnum { + + TYPE0(0, "枪机",0), + TYPE1(1, "半球",1), + TYPE2(2, "球机",2); + + Integer code; + String message; + Integer type; + AvPtzTypeEnum(Integer code, String message, Integer type) { + this.code = code; + this.message = message; + this.type = type; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public static String valueOfs(Integer value) { + if (value == null) { + return ""; + } else { + for (AvPtzTypeEnum ms : AvPtzTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms.getMessage(); + } + } + return ""; + } + } + + public static AvPtzTypeEnum valueOfType(Integer value) { + if (value == null) { + return TYPE0; + } else { + for (AvPtzTypeEnum ms : AvPtzTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return TYPE0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvSecretLevelEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvSecretLevelEnum.java new file mode 100644 index 0000000..39e8524 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvSecretLevelEnum.java @@ -0,0 +1,60 @@ +package com.casic.missiles.modular.device.enums; + +/** + * Av主数据密集对应关系枚举 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvSecretLevelEnum { + s("999", "未定密", 999, "未定密"), + s0("0", "公开", 0, "公开"), + s1("1", "内部", 1, "内部"), + s2("2", "秘密", 2, "秘密"), + s3("3", "机密", 3, "机密"); + + String code; + Integer currCode; + String message; + String currMsg; + + AvSecretLevelEnum(String code, String message, Integer currCode, String currMsg) { + this.code = code; + this.currCode = currCode; + this.message = message; + this.currMsg = currMsg; + } + + public Integer getCurrCode() { + return currCode; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public static AvSecretLevelEnum valueOfCode(String value) { + if (value == null) { + return s0; + } else { + for (AvSecretLevelEnum ms : AvSecretLevelEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return s0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvStatusTypeEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvStatusTypeEnum.java new file mode 100644 index 0000000..ddccd52 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvStatusTypeEnum.java @@ -0,0 +1,72 @@ +package com.casic.missiles.modular.device.enums; + +/** + * wvp设备类型转换 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvStatusTypeEnum { + + TYPE0(0, "离线",0), + TYPE1(1, "在线",1); + + Integer code; + String message; + Integer type; + AvStatusTypeEnum(Integer code, String message, Integer type) { + this.code = code; + this.message = message; + this.type = type; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public static String valueOfs(Integer value) { + if (value == null) { + return ""; + } else { + for (AvStatusTypeEnum ms : AvStatusTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms.getMessage(); + } + } + return ""; + } + } + + public static AvStatusTypeEnum valueOfType(Integer value) { + if (value == null) { + return TYPE0; + } else { + for (AvStatusTypeEnum ms : AvStatusTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return TYPE0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvUrlEnums.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvUrlEnums.java new file mode 100644 index 0000000..04b38ad --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvUrlEnums.java @@ -0,0 +1,37 @@ +package com.casic.missiles.modular.device.enums; + +/** + * 设备媒体 + */ +public enum AvUrlEnums { + DEVICE("/open/v1/api/devices","设备信息查询"), + STREAM("/open/v1/api/streams","创建流"), + STREAM_STOP("/open/v1/api/streams/%s","停止流"), + HEART("/open/v1/api/streams/%s/heartbeat","发送心跳"), + DICT("/open/v1/api/dictionary_datas","字典查询"), + USER_DEVICE_RELATION("/open/v1/api/user_device_relationships","用户设备关联关系"); + + private String url; + private String name; + + AvUrlEnums(String url, String name) { + this.url = url; + this.name = name; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/AvDefaultHttpHeaderHandler.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/AvDefaultHttpHeaderHandler.java new file mode 100644 index 0000000..53f0a5c --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/AvDefaultHttpHeaderHandler.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.device.http; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.modular.system.handler.DefaultHttpHeaderHandler; +import org.apache.http.client.methods.HttpRequestBase; + +public class AvDefaultHttpHeaderHandler extends DefaultHttpHeaderHandler { + public void setHeader(HttpRequestBase base, String token) { + base.addHeader("Content-type", DEFAULT_CONTEXTTYPE); + if (StrUtil.isNotEmpty(token)) { + base.addHeader("X-OApi-Token", token); + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/HttpGetWithEntity.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/HttpGetWithEntity.java new file mode 100644 index 0000000..b8abf8f --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/HttpGetWithEntity.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.device.http; + +import org.apache.http.client.methods.HttpEntityEnclosingRequestBase; + +import java.net.URI; + +public class HttpGetWithEntity extends HttpEntityEnclosingRequestBase { + + public HttpGetWithEntity(URI uri) { + this.setURI(uri); + } + + public HttpGetWithEntity(String uri) { + this.setURI(URI.create(uri)); + } + + public String getMethod() { + return "GET"; + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/IAvSyncService.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/IAvSyncService.java new file mode 100644 index 0000000..13c3203 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/IAvSyncService.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.device.service; + +import com.casic.missiles.modular.device.dto.stream.StreamRequestDTO; + +public interface IAvSyncService { + /** + * Dc706设备信息同步 + */ + void syncDcDevices(String token); + + /** + * 创建流 + * + * @param streamRequestDTO + * @return + */ + Object getStreams(StreamRequestDTO streamRequestDTO); + + /** + * 停止流 + * + * @param id + * @return + */ + Object stopStreams(String id); + + /** + * 发送心跳 + * + * @param id 设备国标号 + * @return + */ + Object heart(String id); + + /** + * 设备权限更新 + */ + void loadUserDeviceRelationships(); +} diff --git a/README.md b/README.md index 430796e..8dbc9a5 100644 --- a/README.md +++ b/README.md @@ -9,3 +9,7 @@ #### 其他 >* [git地址](http://192.168.0.203:8080/gitbucket) >* [本地免登地址](http://localhost:8083/route/mockToken) + +AView 对接问题 +1.用户设备关联关系 + 对应返回 device_list是否为设备国标号 \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/pom.xml b/casic-device-sync/casic-device-aview/pom.xml index 0a3c5fa..94fb9e5 100644 --- a/casic-device-sync/casic-device-aview/pom.xml +++ b/casic-device-sync/casic-device-aview/pom.xml @@ -33,6 +33,21 @@ ${boot.version} provided + + com.casic + casic-http + ${core.version} + + + com.casic + casic-admin-group + ${admin.version} + + + com.casic + casic-server + ${pro.version} + diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java new file mode 100644 index 0000000..195cba2 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.device.controller; + +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import com.casic.missiles.modular.device.dto.stream.StreamRequestDTO; +import com.casic.missiles.modular.device.service.IAvSyncService; +import io.swagger.annotations.Api; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +@Api(tags = "AV平台代理接口") +@RestController +@RequestMapping("/route") +public class AvRouteController { + @Resource + private IAvSyncService avSyncService; + + @PostMapping("/open/v1/api/streams") + public Object streams(@RequestBody StreamRequestDTO requestDTO) { + Object object = avSyncService.getStreams(requestDTO); + if (object == null) { + ResponseDataDTO respDTO = ResponseDataDTO.error("流读取失败,请稍后重试!"); + respDTO.setMessage("流读取失败,请稍后重试!"); + return respDTO; + } + return ResponseDataDTO.success(avSyncService.getStreams(requestDTO)); + } + + @DeleteMapping("/open/v1/api/streams/{id}") + public Object stopStreams(@PathVariable("id") String id) { + Object object = avSyncService.stopStreams(id); + return ResponseDataDTO.success(object); + } + + @PostMapping("/open/v1/api/streams/{id}/heart") + public Object heart(@PathVariable("id") String id) { + Object object = avSyncService.heart(id); + if (object == null) { + ResponseDataDTO respDTO = ResponseDataDTO.error("流心跳失败,请稍后重试!"); + respDTO.setMessage("流心跳失败,请稍后重试!"); + return respDTO; + } + return ResponseDataDTO.success(object); + } +} \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java new file mode 100644 index 0000000..97bde9f --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java @@ -0,0 +1,49 @@ +package com.casic.missiles.modular.device.dto; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; + +/** + * 艾薇设备对象DTO + */ +@Data +public class AvDeviceDTO { + // 设备ID + private Long id; + + // 设备名称 + private String name; + + // 设备唯一国标序列号 + private String sn; + + // 设备类型 + private Integer type; + + // 设备版本号 + private String version; + + // 安全等级 + @JSONField(name = "secure_level") + private String secureLevel; + + // 设备状态 + private Integer status; + + // 云台类型 + private Integer ptzType; + + // 朝向 + private Integer orientation; + + // 创建时间 + @JSONField(name = "gmt_created") + private String gmtCreated; + + // 修改时间 + @JSONField(name = "gmt_modified") + private String gmtModified; + + // 数据状态 + private Integer state; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java new file mode 100644 index 0000000..9a05183 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java @@ -0,0 +1,10 @@ +package com.casic.missiles.modular.device.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class AvPageResponse { + private List items; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java new file mode 100644 index 0000000..098dda4 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.device.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class DeviceRelationshipDTO { + private Long user_id; + private String device_list; + private List deviceList; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java new file mode 100644 index 0000000..74e6a9b --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java @@ -0,0 +1,9 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +@Data +public class AvPageRep { + private Integer total; + private T list; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java new file mode 100644 index 0000000..900ae4a --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +/** + * 分页请求DTO + */ +@Data +public class AvPageRequest { + private int page; + private int paging; + private int limit; + +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java new file mode 100644 index 0000000..f1c1e7a --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +/** + * mvp返回基类封装 + * + * @param + */ +@Data +public class AvResponseDTO { + private T data; + private Integer code; + private String msg; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamRequestDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamRequestDTO.java new file mode 100644 index 0000000..69e88ce --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamRequestDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.device.dto.stream; + +import lombok.Data; + +@Data +public class StreamRequestDTO { + private String device_id; + private String stream_type; + private String quality; + private int from; + private int to; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamStopRequestDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamStopRequestDTO.java new file mode 100644 index 0000000..9cf94b1 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamStopRequestDTO.java @@ -0,0 +1,11 @@ +package com.casic.missiles.modular.device.dto.stream; + +import lombok.Data; + +@Data +public class StreamStopRequestDTO { + private String id; + private String type; + private StreamRequestDTO request; + private String url; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvDataStateEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvDataStateEnum.java new file mode 100644 index 0000000..e1a6658 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvDataStateEnum.java @@ -0,0 +1,72 @@ +package com.casic.missiles.modular.device.enums; + +/** + * 数据状态 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvDataStateEnum { + + TYPE0(0, "有效",0), + DEL(1, "无效",1); + + Integer code; + String message; + Integer type; + AvDataStateEnum(Integer code, String message, Integer type) { + this.code = code; + this.message = message; + this.type = type; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public static String valueOfs(Integer value) { + if (value == null) { + return ""; + } else { + for (AvDataStateEnum ms : AvDataStateEnum.values()) { + if (ms.getCode().equals(value)) { + return ms.getMessage(); + } + } + return ""; + } + } + + public static AvDataStateEnum valueOfType(Integer value) { + if (value == null) { + return TYPE0; + } else { + for (AvDataStateEnum ms : AvDataStateEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return TYPE0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvPtzTypeEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvPtzTypeEnum.java new file mode 100644 index 0000000..fdcb08d --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvPtzTypeEnum.java @@ -0,0 +1,73 @@ +package com.casic.missiles.modular.device.enums; + +/** + * wvp设备类型转换 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvPtzTypeEnum { + + TYPE0(0, "枪机",0), + TYPE1(1, "半球",1), + TYPE2(2, "球机",2); + + Integer code; + String message; + Integer type; + AvPtzTypeEnum(Integer code, String message, Integer type) { + this.code = code; + this.message = message; + this.type = type; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public static String valueOfs(Integer value) { + if (value == null) { + return ""; + } else { + for (AvPtzTypeEnum ms : AvPtzTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms.getMessage(); + } + } + return ""; + } + } + + public static AvPtzTypeEnum valueOfType(Integer value) { + if (value == null) { + return TYPE0; + } else { + for (AvPtzTypeEnum ms : AvPtzTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return TYPE0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvSecretLevelEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvSecretLevelEnum.java new file mode 100644 index 0000000..39e8524 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvSecretLevelEnum.java @@ -0,0 +1,60 @@ +package com.casic.missiles.modular.device.enums; + +/** + * Av主数据密集对应关系枚举 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvSecretLevelEnum { + s("999", "未定密", 999, "未定密"), + s0("0", "公开", 0, "公开"), + s1("1", "内部", 1, "内部"), + s2("2", "秘密", 2, "秘密"), + s3("3", "机密", 3, "机密"); + + String code; + Integer currCode; + String message; + String currMsg; + + AvSecretLevelEnum(String code, String message, Integer currCode, String currMsg) { + this.code = code; + this.currCode = currCode; + this.message = message; + this.currMsg = currMsg; + } + + public Integer getCurrCode() { + return currCode; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public static AvSecretLevelEnum valueOfCode(String value) { + if (value == null) { + return s0; + } else { + for (AvSecretLevelEnum ms : AvSecretLevelEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return s0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvStatusTypeEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvStatusTypeEnum.java new file mode 100644 index 0000000..ddccd52 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvStatusTypeEnum.java @@ -0,0 +1,72 @@ +package com.casic.missiles.modular.device.enums; + +/** + * wvp设备类型转换 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvStatusTypeEnum { + + TYPE0(0, "离线",0), + TYPE1(1, "在线",1); + + Integer code; + String message; + Integer type; + AvStatusTypeEnum(Integer code, String message, Integer type) { + this.code = code; + this.message = message; + this.type = type; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public static String valueOfs(Integer value) { + if (value == null) { + return ""; + } else { + for (AvStatusTypeEnum ms : AvStatusTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms.getMessage(); + } + } + return ""; + } + } + + public static AvStatusTypeEnum valueOfType(Integer value) { + if (value == null) { + return TYPE0; + } else { + for (AvStatusTypeEnum ms : AvStatusTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return TYPE0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvUrlEnums.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvUrlEnums.java new file mode 100644 index 0000000..04b38ad --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvUrlEnums.java @@ -0,0 +1,37 @@ +package com.casic.missiles.modular.device.enums; + +/** + * 设备媒体 + */ +public enum AvUrlEnums { + DEVICE("/open/v1/api/devices","设备信息查询"), + STREAM("/open/v1/api/streams","创建流"), + STREAM_STOP("/open/v1/api/streams/%s","停止流"), + HEART("/open/v1/api/streams/%s/heartbeat","发送心跳"), + DICT("/open/v1/api/dictionary_datas","字典查询"), + USER_DEVICE_RELATION("/open/v1/api/user_device_relationships","用户设备关联关系"); + + private String url; + private String name; + + AvUrlEnums(String url, String name) { + this.url = url; + this.name = name; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/AvDefaultHttpHeaderHandler.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/AvDefaultHttpHeaderHandler.java new file mode 100644 index 0000000..53f0a5c --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/AvDefaultHttpHeaderHandler.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.device.http; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.modular.system.handler.DefaultHttpHeaderHandler; +import org.apache.http.client.methods.HttpRequestBase; + +public class AvDefaultHttpHeaderHandler extends DefaultHttpHeaderHandler { + public void setHeader(HttpRequestBase base, String token) { + base.addHeader("Content-type", DEFAULT_CONTEXTTYPE); + if (StrUtil.isNotEmpty(token)) { + base.addHeader("X-OApi-Token", token); + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/HttpGetWithEntity.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/HttpGetWithEntity.java new file mode 100644 index 0000000..b8abf8f --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/HttpGetWithEntity.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.device.http; + +import org.apache.http.client.methods.HttpEntityEnclosingRequestBase; + +import java.net.URI; + +public class HttpGetWithEntity extends HttpEntityEnclosingRequestBase { + + public HttpGetWithEntity(URI uri) { + this.setURI(uri); + } + + public HttpGetWithEntity(String uri) { + this.setURI(URI.create(uri)); + } + + public String getMethod() { + return "GET"; + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/IAvSyncService.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/IAvSyncService.java new file mode 100644 index 0000000..13c3203 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/IAvSyncService.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.device.service; + +import com.casic.missiles.modular.device.dto.stream.StreamRequestDTO; + +public interface IAvSyncService { + /** + * Dc706设备信息同步 + */ + void syncDcDevices(String token); + + /** + * 创建流 + * + * @param streamRequestDTO + * @return + */ + Object getStreams(StreamRequestDTO streamRequestDTO); + + /** + * 停止流 + * + * @param id + * @return + */ + Object stopStreams(String id); + + /** + * 发送心跳 + * + * @param id 设备国标号 + * @return + */ + Object heart(String id); + + /** + * 设备权限更新 + */ + void loadUserDeviceRelationships(); +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/impl/AvSyncServiceImpl.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/impl/AvSyncServiceImpl.java new file mode 100644 index 0000000..25e3340 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/impl/AvSyncServiceImpl.java @@ -0,0 +1,179 @@ +package com.casic.missiles.modular.device.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.casic.missiles.core.application.service.AbstractUserService; +import com.casic.missiles.modular.device.dto.AvDeviceDTO; +import com.casic.missiles.modular.device.dto.DeviceRelationshipDTO; +import com.casic.missiles.modular.device.dto.page.AvPageRequest; +import com.casic.missiles.modular.device.dto.stream.StreamRequestDTO; +import com.casic.missiles.modular.device.enums.AvDataStateEnum; +import com.casic.missiles.modular.device.enums.AvPtzTypeEnum; +import com.casic.missiles.modular.device.enums.AvSecretLevelEnum; +import com.casic.missiles.modular.device.enums.AvStatusTypeEnum; +import com.casic.missiles.modular.device.model.BusDeviceInfo; +import com.casic.missiles.modular.device.service.IAvSyncService; +import com.casic.missiles.modular.device.service.IBusDeviceInfoService; +import com.casic.missiles.modular.device.service.ISysGroupDeviceService; +import com.casic.missiles.modular.device.util.AvUtil; +import com.casic.missiles.modular.system.model.SysUserGroup; +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.modular.system.service.ISysUserGroupService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; +@Slf4j +@Service +public class AvSyncServiceImpl implements IAvSyncService { + @Value("${casic.video.av.url:-1}") + private String avUrl; + @Value("${casic.video.av.token:-1}") + private String avToken; + @Resource + private IBusDeviceInfoService deviceInfoService; + @Resource + private AbstractUserService abstractUserService; + + @Resource + private ISysUserGroupService userGroupService; + @Resource + private ISysGroupDeviceService sysGroupDeviceService; + + @Override + public void syncDcDevices(String token) { + AvPageRequest avPageRequest = new AvPageRequest(); + avPageRequest.setPage(1); + avPageRequest.setPaging(1); + + //全量查询设备信息 + List deviceDTOS = AvUtil.selectDevices(avUrl, token, avPageRequest); + + if (CollectionUtil.isNotEmpty(deviceDTOS)) { + for (AvDeviceDTO dcDeviceDTO : deviceDTOS) { + BusDeviceInfo busDeviceInfo = this.convertDevice(dcDeviceDTO); + + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(BusDeviceInfo::getCameraIndexCode, dcDeviceDTO.getSn()); + this.deviceInfoService.saveOrUpdate(busDeviceInfo, query); + } + + List deviceSns = deviceDTOS.stream().filter(dto -> AvDataStateEnum.DEL.equals(dto.getState())).map(AvDeviceDTO::getSn).collect(Collectors.toList()); + + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.in(BusDeviceInfo::getCameraIndexCode, deviceSns); + if (CollectionUtil.isNotEmpty(deviceSns)) { + this.deviceInfoService.remove(query); + } + } + +// AvUtil.dict(avUrl,avToken); + } + + /** + * 流地址请求 + * + * @param streamRequestDTO + * @return + */ + @Override + public Object getStreams(StreamRequestDTO streamRequestDTO) { + return AvUtil.selectStreams(avUrl, avToken, streamRequestDTO); + } + + @Override + public Object stopStreams(String id) { + return AvUtil.stopStreams(avUrl, avToken, id); + } + + @Override + public Object heart(String id) { + return AvUtil.heart(avUrl, avToken, id); + } + + @Transactional + @Override + public void loadUserDeviceRelationships() { + + List relationshipDTOS = AvUtil.userDeviceRelationships(avUrl, avToken); + log.info("loadUserDeviceRelationships: {}", relationshipDTOS); + + for (DeviceRelationshipDTO relationshipDTO : relationshipDTOS) { + + //检索用户信息 + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(User::getSyncId, relationshipDTO.getUser_id()); + List users = abstractUserService.list(query); + + if (users != null&&users.size() > 0) { + User user = users.get(0); + //创建用户组 + LambdaQueryWrapper groupQuery = new LambdaQueryWrapper<>(); + String groupName = user.getName() + user.getId(); + groupQuery.eq(SysUserGroup::getGroupName, groupName); + SysUserGroup sysUserGroup = userGroupService.getOne(groupQuery); + + if (sysUserGroup == null) { + sysUserGroup = genSysUserGroup(groupName, user); + List userIds = new ArrayList<>(); + userIds.add(user.getId()); + userGroupService.createSysUserGroup(sysUserGroup, userIds); + } + + LambdaQueryWrapper deviceQuery = new LambdaQueryWrapper<>(); + deviceQuery.in(BusDeviceInfo::getCameraIndexCode, relationshipDTO.getDeviceList()); + List busDeviceInfos = deviceInfoService.list(deviceQuery); + + if (CollectionUtil.isNotEmpty(busDeviceInfos)) { + List list = busDeviceInfos.stream().map(BusDeviceInfo::getId).collect(Collectors.toList()); + sysGroupDeviceService.batchIncremental(sysUserGroup.getId(), list); + } + + }else{ + log.error("loadUserDeviceRelationships is empty: {}", relationshipDTO.getUser_id()); + } + } + } + + private SysUserGroup genSysUserGroup(String groupName, User user) { + SysUserGroup sysUserGroup = new SysUserGroup(); + sysUserGroup.setGroupName(groupName); + sysUserGroup.setCreateTime(new Date()); + sysUserGroup.setCreateId(user.getId()); + sysUserGroup.setDeptId(user.getDeptId()); + sysUserGroup.setDescription("默认创建分组,不可修改!"); + sysUserGroup.setSafe(0); + return sysUserGroup; + } + + /** + * 设备类型数据转换 + * + * @param dto 艾薇设备信息 + * @return + */ + private BusDeviceInfo convertDevice(AvDeviceDTO dto) { + BusDeviceInfo info = new BusDeviceInfo(); + info.setCreateTime(new Date()); + info.setUpdateTime(new Date()); + + //转换为本地密级编码 + info.setSecretLevel(AvSecretLevelEnum.valueOfCode(dto.getSecureLevel()).getCurrCode()); + + info.setDeviceStatus(AvStatusTypeEnum.valueOfType(dto.getStatus()).getType()); + info.setCameraIndexCode(dto.getSn()); + info.setMonitorName(dto.getName()); + + //PTZ type类型 + info.setDeviceType(AvPtzTypeEnum.valueOfType(dto.getPtzType()).getType() + ""); + info.setBfFlag(0); + + return info; + } +} diff --git a/README.md b/README.md index 430796e..8dbc9a5 100644 --- a/README.md +++ b/README.md @@ -9,3 +9,7 @@ #### 其他 >* [git地址](http://192.168.0.203:8080/gitbucket) >* [本地免登地址](http://localhost:8083/route/mockToken) + +AView 对接问题 +1.用户设备关联关系 + 对应返回 device_list是否为设备国标号 \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/pom.xml b/casic-device-sync/casic-device-aview/pom.xml index 0a3c5fa..94fb9e5 100644 --- a/casic-device-sync/casic-device-aview/pom.xml +++ b/casic-device-sync/casic-device-aview/pom.xml @@ -33,6 +33,21 @@ ${boot.version} provided + + com.casic + casic-http + ${core.version} + + + com.casic + casic-admin-group + ${admin.version} + + + com.casic + casic-server + ${pro.version} + diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java new file mode 100644 index 0000000..195cba2 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.device.controller; + +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import com.casic.missiles.modular.device.dto.stream.StreamRequestDTO; +import com.casic.missiles.modular.device.service.IAvSyncService; +import io.swagger.annotations.Api; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +@Api(tags = "AV平台代理接口") +@RestController +@RequestMapping("/route") +public class AvRouteController { + @Resource + private IAvSyncService avSyncService; + + @PostMapping("/open/v1/api/streams") + public Object streams(@RequestBody StreamRequestDTO requestDTO) { + Object object = avSyncService.getStreams(requestDTO); + if (object == null) { + ResponseDataDTO respDTO = ResponseDataDTO.error("流读取失败,请稍后重试!"); + respDTO.setMessage("流读取失败,请稍后重试!"); + return respDTO; + } + return ResponseDataDTO.success(avSyncService.getStreams(requestDTO)); + } + + @DeleteMapping("/open/v1/api/streams/{id}") + public Object stopStreams(@PathVariable("id") String id) { + Object object = avSyncService.stopStreams(id); + return ResponseDataDTO.success(object); + } + + @PostMapping("/open/v1/api/streams/{id}/heart") + public Object heart(@PathVariable("id") String id) { + Object object = avSyncService.heart(id); + if (object == null) { + ResponseDataDTO respDTO = ResponseDataDTO.error("流心跳失败,请稍后重试!"); + respDTO.setMessage("流心跳失败,请稍后重试!"); + return respDTO; + } + return ResponseDataDTO.success(object); + } +} \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java new file mode 100644 index 0000000..97bde9f --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java @@ -0,0 +1,49 @@ +package com.casic.missiles.modular.device.dto; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; + +/** + * 艾薇设备对象DTO + */ +@Data +public class AvDeviceDTO { + // 设备ID + private Long id; + + // 设备名称 + private String name; + + // 设备唯一国标序列号 + private String sn; + + // 设备类型 + private Integer type; + + // 设备版本号 + private String version; + + // 安全等级 + @JSONField(name = "secure_level") + private String secureLevel; + + // 设备状态 + private Integer status; + + // 云台类型 + private Integer ptzType; + + // 朝向 + private Integer orientation; + + // 创建时间 + @JSONField(name = "gmt_created") + private String gmtCreated; + + // 修改时间 + @JSONField(name = "gmt_modified") + private String gmtModified; + + // 数据状态 + private Integer state; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java new file mode 100644 index 0000000..9a05183 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java @@ -0,0 +1,10 @@ +package com.casic.missiles.modular.device.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class AvPageResponse { + private List items; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java new file mode 100644 index 0000000..098dda4 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.device.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class DeviceRelationshipDTO { + private Long user_id; + private String device_list; + private List deviceList; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java new file mode 100644 index 0000000..74e6a9b --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java @@ -0,0 +1,9 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +@Data +public class AvPageRep { + private Integer total; + private T list; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java new file mode 100644 index 0000000..900ae4a --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +/** + * 分页请求DTO + */ +@Data +public class AvPageRequest { + private int page; + private int paging; + private int limit; + +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java new file mode 100644 index 0000000..f1c1e7a --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +/** + * mvp返回基类封装 + * + * @param + */ +@Data +public class AvResponseDTO { + private T data; + private Integer code; + private String msg; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamRequestDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamRequestDTO.java new file mode 100644 index 0000000..69e88ce --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamRequestDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.device.dto.stream; + +import lombok.Data; + +@Data +public class StreamRequestDTO { + private String device_id; + private String stream_type; + private String quality; + private int from; + private int to; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamStopRequestDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamStopRequestDTO.java new file mode 100644 index 0000000..9cf94b1 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamStopRequestDTO.java @@ -0,0 +1,11 @@ +package com.casic.missiles.modular.device.dto.stream; + +import lombok.Data; + +@Data +public class StreamStopRequestDTO { + private String id; + private String type; + private StreamRequestDTO request; + private String url; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvDataStateEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvDataStateEnum.java new file mode 100644 index 0000000..e1a6658 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvDataStateEnum.java @@ -0,0 +1,72 @@ +package com.casic.missiles.modular.device.enums; + +/** + * 数据状态 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvDataStateEnum { + + TYPE0(0, "有效",0), + DEL(1, "无效",1); + + Integer code; + String message; + Integer type; + AvDataStateEnum(Integer code, String message, Integer type) { + this.code = code; + this.message = message; + this.type = type; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public static String valueOfs(Integer value) { + if (value == null) { + return ""; + } else { + for (AvDataStateEnum ms : AvDataStateEnum.values()) { + if (ms.getCode().equals(value)) { + return ms.getMessage(); + } + } + return ""; + } + } + + public static AvDataStateEnum valueOfType(Integer value) { + if (value == null) { + return TYPE0; + } else { + for (AvDataStateEnum ms : AvDataStateEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return TYPE0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvPtzTypeEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvPtzTypeEnum.java new file mode 100644 index 0000000..fdcb08d --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvPtzTypeEnum.java @@ -0,0 +1,73 @@ +package com.casic.missiles.modular.device.enums; + +/** + * wvp设备类型转换 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvPtzTypeEnum { + + TYPE0(0, "枪机",0), + TYPE1(1, "半球",1), + TYPE2(2, "球机",2); + + Integer code; + String message; + Integer type; + AvPtzTypeEnum(Integer code, String message, Integer type) { + this.code = code; + this.message = message; + this.type = type; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public static String valueOfs(Integer value) { + if (value == null) { + return ""; + } else { + for (AvPtzTypeEnum ms : AvPtzTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms.getMessage(); + } + } + return ""; + } + } + + public static AvPtzTypeEnum valueOfType(Integer value) { + if (value == null) { + return TYPE0; + } else { + for (AvPtzTypeEnum ms : AvPtzTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return TYPE0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvSecretLevelEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvSecretLevelEnum.java new file mode 100644 index 0000000..39e8524 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvSecretLevelEnum.java @@ -0,0 +1,60 @@ +package com.casic.missiles.modular.device.enums; + +/** + * Av主数据密集对应关系枚举 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvSecretLevelEnum { + s("999", "未定密", 999, "未定密"), + s0("0", "公开", 0, "公开"), + s1("1", "内部", 1, "内部"), + s2("2", "秘密", 2, "秘密"), + s3("3", "机密", 3, "机密"); + + String code; + Integer currCode; + String message; + String currMsg; + + AvSecretLevelEnum(String code, String message, Integer currCode, String currMsg) { + this.code = code; + this.currCode = currCode; + this.message = message; + this.currMsg = currMsg; + } + + public Integer getCurrCode() { + return currCode; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public static AvSecretLevelEnum valueOfCode(String value) { + if (value == null) { + return s0; + } else { + for (AvSecretLevelEnum ms : AvSecretLevelEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return s0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvStatusTypeEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvStatusTypeEnum.java new file mode 100644 index 0000000..ddccd52 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvStatusTypeEnum.java @@ -0,0 +1,72 @@ +package com.casic.missiles.modular.device.enums; + +/** + * wvp设备类型转换 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvStatusTypeEnum { + + TYPE0(0, "离线",0), + TYPE1(1, "在线",1); + + Integer code; + String message; + Integer type; + AvStatusTypeEnum(Integer code, String message, Integer type) { + this.code = code; + this.message = message; + this.type = type; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public static String valueOfs(Integer value) { + if (value == null) { + return ""; + } else { + for (AvStatusTypeEnum ms : AvStatusTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms.getMessage(); + } + } + return ""; + } + } + + public static AvStatusTypeEnum valueOfType(Integer value) { + if (value == null) { + return TYPE0; + } else { + for (AvStatusTypeEnum ms : AvStatusTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return TYPE0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvUrlEnums.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvUrlEnums.java new file mode 100644 index 0000000..04b38ad --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvUrlEnums.java @@ -0,0 +1,37 @@ +package com.casic.missiles.modular.device.enums; + +/** + * 设备媒体 + */ +public enum AvUrlEnums { + DEVICE("/open/v1/api/devices","设备信息查询"), + STREAM("/open/v1/api/streams","创建流"), + STREAM_STOP("/open/v1/api/streams/%s","停止流"), + HEART("/open/v1/api/streams/%s/heartbeat","发送心跳"), + DICT("/open/v1/api/dictionary_datas","字典查询"), + USER_DEVICE_RELATION("/open/v1/api/user_device_relationships","用户设备关联关系"); + + private String url; + private String name; + + AvUrlEnums(String url, String name) { + this.url = url; + this.name = name; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/AvDefaultHttpHeaderHandler.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/AvDefaultHttpHeaderHandler.java new file mode 100644 index 0000000..53f0a5c --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/AvDefaultHttpHeaderHandler.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.device.http; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.modular.system.handler.DefaultHttpHeaderHandler; +import org.apache.http.client.methods.HttpRequestBase; + +public class AvDefaultHttpHeaderHandler extends DefaultHttpHeaderHandler { + public void setHeader(HttpRequestBase base, String token) { + base.addHeader("Content-type", DEFAULT_CONTEXTTYPE); + if (StrUtil.isNotEmpty(token)) { + base.addHeader("X-OApi-Token", token); + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/HttpGetWithEntity.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/HttpGetWithEntity.java new file mode 100644 index 0000000..b8abf8f --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/HttpGetWithEntity.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.device.http; + +import org.apache.http.client.methods.HttpEntityEnclosingRequestBase; + +import java.net.URI; + +public class HttpGetWithEntity extends HttpEntityEnclosingRequestBase { + + public HttpGetWithEntity(URI uri) { + this.setURI(uri); + } + + public HttpGetWithEntity(String uri) { + this.setURI(URI.create(uri)); + } + + public String getMethod() { + return "GET"; + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/IAvSyncService.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/IAvSyncService.java new file mode 100644 index 0000000..13c3203 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/IAvSyncService.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.device.service; + +import com.casic.missiles.modular.device.dto.stream.StreamRequestDTO; + +public interface IAvSyncService { + /** + * Dc706设备信息同步 + */ + void syncDcDevices(String token); + + /** + * 创建流 + * + * @param streamRequestDTO + * @return + */ + Object getStreams(StreamRequestDTO streamRequestDTO); + + /** + * 停止流 + * + * @param id + * @return + */ + Object stopStreams(String id); + + /** + * 发送心跳 + * + * @param id 设备国标号 + * @return + */ + Object heart(String id); + + /** + * 设备权限更新 + */ + void loadUserDeviceRelationships(); +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/impl/AvSyncServiceImpl.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/impl/AvSyncServiceImpl.java new file mode 100644 index 0000000..25e3340 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/impl/AvSyncServiceImpl.java @@ -0,0 +1,179 @@ +package com.casic.missiles.modular.device.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.casic.missiles.core.application.service.AbstractUserService; +import com.casic.missiles.modular.device.dto.AvDeviceDTO; +import com.casic.missiles.modular.device.dto.DeviceRelationshipDTO; +import com.casic.missiles.modular.device.dto.page.AvPageRequest; +import com.casic.missiles.modular.device.dto.stream.StreamRequestDTO; +import com.casic.missiles.modular.device.enums.AvDataStateEnum; +import com.casic.missiles.modular.device.enums.AvPtzTypeEnum; +import com.casic.missiles.modular.device.enums.AvSecretLevelEnum; +import com.casic.missiles.modular.device.enums.AvStatusTypeEnum; +import com.casic.missiles.modular.device.model.BusDeviceInfo; +import com.casic.missiles.modular.device.service.IAvSyncService; +import com.casic.missiles.modular.device.service.IBusDeviceInfoService; +import com.casic.missiles.modular.device.service.ISysGroupDeviceService; +import com.casic.missiles.modular.device.util.AvUtil; +import com.casic.missiles.modular.system.model.SysUserGroup; +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.modular.system.service.ISysUserGroupService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; +@Slf4j +@Service +public class AvSyncServiceImpl implements IAvSyncService { + @Value("${casic.video.av.url:-1}") + private String avUrl; + @Value("${casic.video.av.token:-1}") + private String avToken; + @Resource + private IBusDeviceInfoService deviceInfoService; + @Resource + private AbstractUserService abstractUserService; + + @Resource + private ISysUserGroupService userGroupService; + @Resource + private ISysGroupDeviceService sysGroupDeviceService; + + @Override + public void syncDcDevices(String token) { + AvPageRequest avPageRequest = new AvPageRequest(); + avPageRequest.setPage(1); + avPageRequest.setPaging(1); + + //全量查询设备信息 + List deviceDTOS = AvUtil.selectDevices(avUrl, token, avPageRequest); + + if (CollectionUtil.isNotEmpty(deviceDTOS)) { + for (AvDeviceDTO dcDeviceDTO : deviceDTOS) { + BusDeviceInfo busDeviceInfo = this.convertDevice(dcDeviceDTO); + + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(BusDeviceInfo::getCameraIndexCode, dcDeviceDTO.getSn()); + this.deviceInfoService.saveOrUpdate(busDeviceInfo, query); + } + + List deviceSns = deviceDTOS.stream().filter(dto -> AvDataStateEnum.DEL.equals(dto.getState())).map(AvDeviceDTO::getSn).collect(Collectors.toList()); + + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.in(BusDeviceInfo::getCameraIndexCode, deviceSns); + if (CollectionUtil.isNotEmpty(deviceSns)) { + this.deviceInfoService.remove(query); + } + } + +// AvUtil.dict(avUrl,avToken); + } + + /** + * 流地址请求 + * + * @param streamRequestDTO + * @return + */ + @Override + public Object getStreams(StreamRequestDTO streamRequestDTO) { + return AvUtil.selectStreams(avUrl, avToken, streamRequestDTO); + } + + @Override + public Object stopStreams(String id) { + return AvUtil.stopStreams(avUrl, avToken, id); + } + + @Override + public Object heart(String id) { + return AvUtil.heart(avUrl, avToken, id); + } + + @Transactional + @Override + public void loadUserDeviceRelationships() { + + List relationshipDTOS = AvUtil.userDeviceRelationships(avUrl, avToken); + log.info("loadUserDeviceRelationships: {}", relationshipDTOS); + + for (DeviceRelationshipDTO relationshipDTO : relationshipDTOS) { + + //检索用户信息 + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(User::getSyncId, relationshipDTO.getUser_id()); + List users = abstractUserService.list(query); + + if (users != null&&users.size() > 0) { + User user = users.get(0); + //创建用户组 + LambdaQueryWrapper groupQuery = new LambdaQueryWrapper<>(); + String groupName = user.getName() + user.getId(); + groupQuery.eq(SysUserGroup::getGroupName, groupName); + SysUserGroup sysUserGroup = userGroupService.getOne(groupQuery); + + if (sysUserGroup == null) { + sysUserGroup = genSysUserGroup(groupName, user); + List userIds = new ArrayList<>(); + userIds.add(user.getId()); + userGroupService.createSysUserGroup(sysUserGroup, userIds); + } + + LambdaQueryWrapper deviceQuery = new LambdaQueryWrapper<>(); + deviceQuery.in(BusDeviceInfo::getCameraIndexCode, relationshipDTO.getDeviceList()); + List busDeviceInfos = deviceInfoService.list(deviceQuery); + + if (CollectionUtil.isNotEmpty(busDeviceInfos)) { + List list = busDeviceInfos.stream().map(BusDeviceInfo::getId).collect(Collectors.toList()); + sysGroupDeviceService.batchIncremental(sysUserGroup.getId(), list); + } + + }else{ + log.error("loadUserDeviceRelationships is empty: {}", relationshipDTO.getUser_id()); + } + } + } + + private SysUserGroup genSysUserGroup(String groupName, User user) { + SysUserGroup sysUserGroup = new SysUserGroup(); + sysUserGroup.setGroupName(groupName); + sysUserGroup.setCreateTime(new Date()); + sysUserGroup.setCreateId(user.getId()); + sysUserGroup.setDeptId(user.getDeptId()); + sysUserGroup.setDescription("默认创建分组,不可修改!"); + sysUserGroup.setSafe(0); + return sysUserGroup; + } + + /** + * 设备类型数据转换 + * + * @param dto 艾薇设备信息 + * @return + */ + private BusDeviceInfo convertDevice(AvDeviceDTO dto) { + BusDeviceInfo info = new BusDeviceInfo(); + info.setCreateTime(new Date()); + info.setUpdateTime(new Date()); + + //转换为本地密级编码 + info.setSecretLevel(AvSecretLevelEnum.valueOfCode(dto.getSecureLevel()).getCurrCode()); + + info.setDeviceStatus(AvStatusTypeEnum.valueOfType(dto.getStatus()).getType()); + info.setCameraIndexCode(dto.getSn()); + info.setMonitorName(dto.getName()); + + //PTZ type类型 + info.setDeviceType(AvPtzTypeEnum.valueOfType(dto.getPtzType()).getType() + ""); + info.setBfFlag(0); + + return info; + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/util/AvHttpUtils.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/util/AvHttpUtils.java new file mode 100644 index 0000000..083d88a --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/util/AvHttpUtils.java @@ -0,0 +1,331 @@ +package com.casic.missiles.modular.device.util; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.modular.device.http.HttpGetWithEntity; +import com.casic.missiles.modular.system.handler.DefaultHttpHeaderHandler; +import org.apache.http.NameValuePair; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpDelete; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.util.EntityUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +public class AvHttpUtils { + + public static String sendGetJson(String url, Map param, String token, DefaultHttpHeaderHandler handler) { + try { + StringBuffer query = new StringBuffer(); + String var14 = sendGetEntityData(url, handler.getChartSet(), param, token, handler); + return var14; + } catch (Exception var10) { + Exception e = var10; + e.printStackTrace(); + System.out.println("发送GET请求出现异常!" + e); + return ""; + } finally { + ; + } + } + public static String sendGet(String url, Map param, String token, DefaultHttpHeaderHandler handler) { + try { + StringBuffer query = new StringBuffer(); + Iterator var5 = param.entrySet().iterator(); + + while(var5.hasNext()) { + Map.Entry kv = (Map.Entry)var5.next(); + query.append(URLEncoder.encode((String)kv.getKey(), handler.getChartSet()) + "="); + query.append(URLEncoder.encode((String)kv.getValue(), handler.getChartSet()) + "&"); + } + + if (query.lastIndexOf("&") > 0) { + query.deleteCharAt(query.length() - 1); + } + + String urlNameString = url + "?" + query.toString(); + String var14 = sendGetData(urlNameString, handler.getChartSet(), token, handler); + return var14; + } catch (Exception var10) { + Exception e = var10; + e.printStackTrace(); + System.out.println("发送GET请求出现异常!" + e); + return ""; + } finally { + ; + } + } + public static String sendPost(String url, Map param, String token, DefaultHttpHeaderHandler httpHeaderHandler) { + return sendPostDataByMap(url, param, "utf8", token, httpHeaderHandler); + } + public static String sendPostDataByMap(String url, Map map, String encoding, String token, DefaultHttpHeaderHandler httpHeaderHandler) { + String result = ""; + CloseableHttpResponse response = null; + CloseableHttpClient httpClient = null; + HttpPost httpPost = null; + + try { + httpClient = HttpClients.createDefault(); + httpPost = new HttpPost(url); + httpPost.setHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)"); + httpHeaderHandler.setHeader(httpPost, token); + if (httpHeaderHandler.isJson()) { + jsonParams(map, httpPost); + } else { + formParams(map, httpPost, httpHeaderHandler.getChartSet()); + } + + response = httpClient.execute(httpPost); + if (response.getStatusLine().getStatusCode() == 200) { + result = EntityUtils.toString(response.getEntity(), httpHeaderHandler.getChartSet()); + } + } catch (Exception var22) { + Exception e = var22; + System.out.println("发送GET请求出现异常!" + e); + e.printStackTrace(); + } finally { + IOException e; + try { + if (response != null) { + response.close(); + } + + httpPost.releaseConnection(); + httpClient.close(); + } catch (IOException var21) { + e = var21; + e.printStackTrace(); + } + + if (httpClient != null) { + try { + httpClient.close(); + } catch (IOException var20) { + e = var20; + e.printStackTrace(); + } + } + + } + + return result; + } + public static String sendGetData(String url, String encoding, String token, DefaultHttpHeaderHandler httpHeaderHandler) { + String result = ""; + CloseableHttpResponse response = null; + if (httpHeaderHandler == null) { + httpHeaderHandler = new DefaultHttpHeaderHandler(); + } + + CloseableHttpClient httpClient = null; + + try { + httpClient = HttpClients.createDefault(); + HttpGet httpGet = new HttpGet(url); + httpHeaderHandler.setHeader(httpGet, token); + response = httpClient.execute(httpGet); + if (response.getStatusLine().getStatusCode() == 200) { + result = EntityUtils.toString(response.getEntity(), encoding); + } + } catch (Exception var20) { + Exception e = var20; + e.printStackTrace(); + System.out.println("发送GET请求出现异常!" + e); + } finally { + IOException e; + if (response != null) { + try { + response.close(); + } catch (IOException var19) { + e = var19; + e.printStackTrace(); + } + } + + if (httpClient != null) { + try { + httpClient.close(); + } catch (IOException var18) { + e = var18; + e.printStackTrace(); + } + } + + } + + return result; + } + public static String sendGetEntityData(String url, String encoding, Map param, String token, DefaultHttpHeaderHandler httpHeaderHandler) { + String result = ""; + CloseableHttpResponse response = null; + if (httpHeaderHandler == null) { + httpHeaderHandler = new DefaultHttpHeaderHandler(); + } + CloseableHttpClient httpClient =null; + try { + httpClient = HttpClients.createDefault(); + HttpGetWithEntity httpGet = new HttpGetWithEntity(url); + httpHeaderHandler.setHeader(httpGet, token); + if (httpHeaderHandler.isJson()) { + jsonParams(param, httpGet); + } else { + formParams(param, httpGet, httpHeaderHandler.getChartSet()); + } + response = httpClient.execute(httpGet); + if (response.getStatusLine().getStatusCode() == 200) { + result = EntityUtils.toString(response.getEntity(), encoding); + } + } catch (Exception var16) { + Exception e = var16; + e.printStackTrace(); + System.out.println("发送GET请求出现异常!" + e); + } finally { + if (response != null) { + try { + response.close(); + } catch (IOException var15) { + IOException e = var15; + e.printStackTrace(); + } + } + if (httpClient != null) { + try { + httpClient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + } + + return result; + } + + public static String sendDelete(String url, Map param, String token, DefaultHttpHeaderHandler handler) { + try { + StringBuffer query = new StringBuffer(); + Iterator var5 = param.entrySet().iterator(); + + while (var5.hasNext()) { + Map.Entry kv = (Map.Entry) var5.next(); + query.append(URLEncoder.encode((String) kv.getKey(), handler.getChartSet()) + "="); + query.append(URLEncoder.encode((String) kv.getValue(), handler.getChartSet()) + "&"); + } + + if (query.lastIndexOf("&") > 0) { + query.deleteCharAt(query.length() - 1); + } + String urlNameString = url + "?" + query.toString(); + String var14 = sendDeleteData(urlNameString, handler.getChartSet(), token, handler); + return var14; + } catch (Exception var10) { + Exception e = var10; + e.printStackTrace(); + System.out.println("发送GET请求出现异常!" + e); + return ""; + } finally { + ; + } + } + private static final Logger logger = LoggerFactory.getLogger(AvUtil.class); + /** + * http 请求 + * + * @param url + * @param encoding + * @param token + * @param httpHeaderHandler + * @return + */ + public static String sendDeleteData(String url, String encoding, String token, DefaultHttpHeaderHandler httpHeaderHandler) { + String result = ""; + CloseableHttpResponse response = null; + if (httpHeaderHandler == null) { + httpHeaderHandler = new DefaultHttpHeaderHandler(); + } + CloseableHttpClient httpClient = null; + try { + httpClient = HttpClients.createDefault(); + HttpDelete httpGet = new HttpDelete(url); + httpHeaderHandler.setHeader(httpGet, token); + response = httpClient.execute(httpGet); + if (response.getStatusLine().getStatusCode() == 200) { + logger.info("----------------------------------:"+EntityUtils.toString(response.getEntity(), encoding)); + result = EntityUtils.toString(response.getEntity(), encoding); + } + } catch (Exception var16) { + Exception e = var16; + e.printStackTrace(); + } finally { + if (response != null) { + try { + response.close(); + } catch (IOException var15) { + IOException e = var15; + e.printStackTrace(); + } + } + if (httpClient != null) { + try { + httpClient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return result; + } + public static void jsonParams(Map map, HttpPost post) { + String paramJson = JSONObject.toJSONString(map); + StringEntity stringEntity = new StringEntity(paramJson, ContentType.create("application/json", "UTF-8")); + post.setEntity(stringEntity); + } + + public static void formParams(Map map, HttpPost post, String chartSet) throws UnsupportedEncodingException { + List nameValuePairs = new ArrayList(); + if (map != null) { + Iterator var4 = map.entrySet().iterator(); + + while(var4.hasNext()) { + Map.Entry entry = (Map.Entry)var4.next(); + nameValuePairs.add(new BasicNameValuePair((String)entry.getKey(), (String)entry.getValue())); + } + } + + post.setEntity(new UrlEncodedFormEntity(nameValuePairs, chartSet)); + } + public static void jsonParams(Map map, HttpGetWithEntity post) { + String paramJson = JSONObject.toJSONString(map); + StringEntity stringEntity = new StringEntity(paramJson, ContentType.create("application/json", "UTF-8")); + + post.setEntity(stringEntity); + } + + public static void formParams(Map map, HttpGetWithEntity post, String chartSet) throws UnsupportedEncodingException { + List nameValuePairs = new ArrayList(); + if (map != null) { + Iterator var4 = map.entrySet().iterator(); + + while (var4.hasNext()) { + Map.Entry entry = (Map.Entry) var4.next(); + nameValuePairs.add(new BasicNameValuePair((String) entry.getKey(), (String) entry.getValue())); + } + } + + post.setEntity(new UrlEncodedFormEntity(nameValuePairs, chartSet)); + } +} \ No newline at end of file diff --git a/README.md b/README.md index 430796e..8dbc9a5 100644 --- a/README.md +++ b/README.md @@ -9,3 +9,7 @@ #### 其他 >* [git地址](http://192.168.0.203:8080/gitbucket) >* [本地免登地址](http://localhost:8083/route/mockToken) + +AView 对接问题 +1.用户设备关联关系 + 对应返回 device_list是否为设备国标号 \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/pom.xml b/casic-device-sync/casic-device-aview/pom.xml index 0a3c5fa..94fb9e5 100644 --- a/casic-device-sync/casic-device-aview/pom.xml +++ b/casic-device-sync/casic-device-aview/pom.xml @@ -33,6 +33,21 @@ ${boot.version} provided + + com.casic + casic-http + ${core.version} + + + com.casic + casic-admin-group + ${admin.version} + + + com.casic + casic-server + ${pro.version} + diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java new file mode 100644 index 0000000..195cba2 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.device.controller; + +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import com.casic.missiles.modular.device.dto.stream.StreamRequestDTO; +import com.casic.missiles.modular.device.service.IAvSyncService; +import io.swagger.annotations.Api; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +@Api(tags = "AV平台代理接口") +@RestController +@RequestMapping("/route") +public class AvRouteController { + @Resource + private IAvSyncService avSyncService; + + @PostMapping("/open/v1/api/streams") + public Object streams(@RequestBody StreamRequestDTO requestDTO) { + Object object = avSyncService.getStreams(requestDTO); + if (object == null) { + ResponseDataDTO respDTO = ResponseDataDTO.error("流读取失败,请稍后重试!"); + respDTO.setMessage("流读取失败,请稍后重试!"); + return respDTO; + } + return ResponseDataDTO.success(avSyncService.getStreams(requestDTO)); + } + + @DeleteMapping("/open/v1/api/streams/{id}") + public Object stopStreams(@PathVariable("id") String id) { + Object object = avSyncService.stopStreams(id); + return ResponseDataDTO.success(object); + } + + @PostMapping("/open/v1/api/streams/{id}/heart") + public Object heart(@PathVariable("id") String id) { + Object object = avSyncService.heart(id); + if (object == null) { + ResponseDataDTO respDTO = ResponseDataDTO.error("流心跳失败,请稍后重试!"); + respDTO.setMessage("流心跳失败,请稍后重试!"); + return respDTO; + } + return ResponseDataDTO.success(object); + } +} \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java new file mode 100644 index 0000000..97bde9f --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java @@ -0,0 +1,49 @@ +package com.casic.missiles.modular.device.dto; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; + +/** + * 艾薇设备对象DTO + */ +@Data +public class AvDeviceDTO { + // 设备ID + private Long id; + + // 设备名称 + private String name; + + // 设备唯一国标序列号 + private String sn; + + // 设备类型 + private Integer type; + + // 设备版本号 + private String version; + + // 安全等级 + @JSONField(name = "secure_level") + private String secureLevel; + + // 设备状态 + private Integer status; + + // 云台类型 + private Integer ptzType; + + // 朝向 + private Integer orientation; + + // 创建时间 + @JSONField(name = "gmt_created") + private String gmtCreated; + + // 修改时间 + @JSONField(name = "gmt_modified") + private String gmtModified; + + // 数据状态 + private Integer state; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java new file mode 100644 index 0000000..9a05183 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java @@ -0,0 +1,10 @@ +package com.casic.missiles.modular.device.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class AvPageResponse { + private List items; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java new file mode 100644 index 0000000..098dda4 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.device.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class DeviceRelationshipDTO { + private Long user_id; + private String device_list; + private List deviceList; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java new file mode 100644 index 0000000..74e6a9b --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java @@ -0,0 +1,9 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +@Data +public class AvPageRep { + private Integer total; + private T list; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java new file mode 100644 index 0000000..900ae4a --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +/** + * 分页请求DTO + */ +@Data +public class AvPageRequest { + private int page; + private int paging; + private int limit; + +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java new file mode 100644 index 0000000..f1c1e7a --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +/** + * mvp返回基类封装 + * + * @param + */ +@Data +public class AvResponseDTO { + private T data; + private Integer code; + private String msg; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamRequestDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamRequestDTO.java new file mode 100644 index 0000000..69e88ce --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamRequestDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.device.dto.stream; + +import lombok.Data; + +@Data +public class StreamRequestDTO { + private String device_id; + private String stream_type; + private String quality; + private int from; + private int to; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamStopRequestDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamStopRequestDTO.java new file mode 100644 index 0000000..9cf94b1 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamStopRequestDTO.java @@ -0,0 +1,11 @@ +package com.casic.missiles.modular.device.dto.stream; + +import lombok.Data; + +@Data +public class StreamStopRequestDTO { + private String id; + private String type; + private StreamRequestDTO request; + private String url; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvDataStateEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvDataStateEnum.java new file mode 100644 index 0000000..e1a6658 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvDataStateEnum.java @@ -0,0 +1,72 @@ +package com.casic.missiles.modular.device.enums; + +/** + * 数据状态 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvDataStateEnum { + + TYPE0(0, "有效",0), + DEL(1, "无效",1); + + Integer code; + String message; + Integer type; + AvDataStateEnum(Integer code, String message, Integer type) { + this.code = code; + this.message = message; + this.type = type; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public static String valueOfs(Integer value) { + if (value == null) { + return ""; + } else { + for (AvDataStateEnum ms : AvDataStateEnum.values()) { + if (ms.getCode().equals(value)) { + return ms.getMessage(); + } + } + return ""; + } + } + + public static AvDataStateEnum valueOfType(Integer value) { + if (value == null) { + return TYPE0; + } else { + for (AvDataStateEnum ms : AvDataStateEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return TYPE0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvPtzTypeEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvPtzTypeEnum.java new file mode 100644 index 0000000..fdcb08d --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvPtzTypeEnum.java @@ -0,0 +1,73 @@ +package com.casic.missiles.modular.device.enums; + +/** + * wvp设备类型转换 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvPtzTypeEnum { + + TYPE0(0, "枪机",0), + TYPE1(1, "半球",1), + TYPE2(2, "球机",2); + + Integer code; + String message; + Integer type; + AvPtzTypeEnum(Integer code, String message, Integer type) { + this.code = code; + this.message = message; + this.type = type; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public static String valueOfs(Integer value) { + if (value == null) { + return ""; + } else { + for (AvPtzTypeEnum ms : AvPtzTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms.getMessage(); + } + } + return ""; + } + } + + public static AvPtzTypeEnum valueOfType(Integer value) { + if (value == null) { + return TYPE0; + } else { + for (AvPtzTypeEnum ms : AvPtzTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return TYPE0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvSecretLevelEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvSecretLevelEnum.java new file mode 100644 index 0000000..39e8524 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvSecretLevelEnum.java @@ -0,0 +1,60 @@ +package com.casic.missiles.modular.device.enums; + +/** + * Av主数据密集对应关系枚举 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvSecretLevelEnum { + s("999", "未定密", 999, "未定密"), + s0("0", "公开", 0, "公开"), + s1("1", "内部", 1, "内部"), + s2("2", "秘密", 2, "秘密"), + s3("3", "机密", 3, "机密"); + + String code; + Integer currCode; + String message; + String currMsg; + + AvSecretLevelEnum(String code, String message, Integer currCode, String currMsg) { + this.code = code; + this.currCode = currCode; + this.message = message; + this.currMsg = currMsg; + } + + public Integer getCurrCode() { + return currCode; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public static AvSecretLevelEnum valueOfCode(String value) { + if (value == null) { + return s0; + } else { + for (AvSecretLevelEnum ms : AvSecretLevelEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return s0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvStatusTypeEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvStatusTypeEnum.java new file mode 100644 index 0000000..ddccd52 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvStatusTypeEnum.java @@ -0,0 +1,72 @@ +package com.casic.missiles.modular.device.enums; + +/** + * wvp设备类型转换 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvStatusTypeEnum { + + TYPE0(0, "离线",0), + TYPE1(1, "在线",1); + + Integer code; + String message; + Integer type; + AvStatusTypeEnum(Integer code, String message, Integer type) { + this.code = code; + this.message = message; + this.type = type; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public static String valueOfs(Integer value) { + if (value == null) { + return ""; + } else { + for (AvStatusTypeEnum ms : AvStatusTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms.getMessage(); + } + } + return ""; + } + } + + public static AvStatusTypeEnum valueOfType(Integer value) { + if (value == null) { + return TYPE0; + } else { + for (AvStatusTypeEnum ms : AvStatusTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return TYPE0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvUrlEnums.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvUrlEnums.java new file mode 100644 index 0000000..04b38ad --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvUrlEnums.java @@ -0,0 +1,37 @@ +package com.casic.missiles.modular.device.enums; + +/** + * 设备媒体 + */ +public enum AvUrlEnums { + DEVICE("/open/v1/api/devices","设备信息查询"), + STREAM("/open/v1/api/streams","创建流"), + STREAM_STOP("/open/v1/api/streams/%s","停止流"), + HEART("/open/v1/api/streams/%s/heartbeat","发送心跳"), + DICT("/open/v1/api/dictionary_datas","字典查询"), + USER_DEVICE_RELATION("/open/v1/api/user_device_relationships","用户设备关联关系"); + + private String url; + private String name; + + AvUrlEnums(String url, String name) { + this.url = url; + this.name = name; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/AvDefaultHttpHeaderHandler.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/AvDefaultHttpHeaderHandler.java new file mode 100644 index 0000000..53f0a5c --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/AvDefaultHttpHeaderHandler.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.device.http; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.modular.system.handler.DefaultHttpHeaderHandler; +import org.apache.http.client.methods.HttpRequestBase; + +public class AvDefaultHttpHeaderHandler extends DefaultHttpHeaderHandler { + public void setHeader(HttpRequestBase base, String token) { + base.addHeader("Content-type", DEFAULT_CONTEXTTYPE); + if (StrUtil.isNotEmpty(token)) { + base.addHeader("X-OApi-Token", token); + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/HttpGetWithEntity.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/HttpGetWithEntity.java new file mode 100644 index 0000000..b8abf8f --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/HttpGetWithEntity.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.device.http; + +import org.apache.http.client.methods.HttpEntityEnclosingRequestBase; + +import java.net.URI; + +public class HttpGetWithEntity extends HttpEntityEnclosingRequestBase { + + public HttpGetWithEntity(URI uri) { + this.setURI(uri); + } + + public HttpGetWithEntity(String uri) { + this.setURI(URI.create(uri)); + } + + public String getMethod() { + return "GET"; + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/IAvSyncService.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/IAvSyncService.java new file mode 100644 index 0000000..13c3203 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/IAvSyncService.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.device.service; + +import com.casic.missiles.modular.device.dto.stream.StreamRequestDTO; + +public interface IAvSyncService { + /** + * Dc706设备信息同步 + */ + void syncDcDevices(String token); + + /** + * 创建流 + * + * @param streamRequestDTO + * @return + */ + Object getStreams(StreamRequestDTO streamRequestDTO); + + /** + * 停止流 + * + * @param id + * @return + */ + Object stopStreams(String id); + + /** + * 发送心跳 + * + * @param id 设备国标号 + * @return + */ + Object heart(String id); + + /** + * 设备权限更新 + */ + void loadUserDeviceRelationships(); +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/impl/AvSyncServiceImpl.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/impl/AvSyncServiceImpl.java new file mode 100644 index 0000000..25e3340 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/impl/AvSyncServiceImpl.java @@ -0,0 +1,179 @@ +package com.casic.missiles.modular.device.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.casic.missiles.core.application.service.AbstractUserService; +import com.casic.missiles.modular.device.dto.AvDeviceDTO; +import com.casic.missiles.modular.device.dto.DeviceRelationshipDTO; +import com.casic.missiles.modular.device.dto.page.AvPageRequest; +import com.casic.missiles.modular.device.dto.stream.StreamRequestDTO; +import com.casic.missiles.modular.device.enums.AvDataStateEnum; +import com.casic.missiles.modular.device.enums.AvPtzTypeEnum; +import com.casic.missiles.modular.device.enums.AvSecretLevelEnum; +import com.casic.missiles.modular.device.enums.AvStatusTypeEnum; +import com.casic.missiles.modular.device.model.BusDeviceInfo; +import com.casic.missiles.modular.device.service.IAvSyncService; +import com.casic.missiles.modular.device.service.IBusDeviceInfoService; +import com.casic.missiles.modular.device.service.ISysGroupDeviceService; +import com.casic.missiles.modular.device.util.AvUtil; +import com.casic.missiles.modular.system.model.SysUserGroup; +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.modular.system.service.ISysUserGroupService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; +@Slf4j +@Service +public class AvSyncServiceImpl implements IAvSyncService { + @Value("${casic.video.av.url:-1}") + private String avUrl; + @Value("${casic.video.av.token:-1}") + private String avToken; + @Resource + private IBusDeviceInfoService deviceInfoService; + @Resource + private AbstractUserService abstractUserService; + + @Resource + private ISysUserGroupService userGroupService; + @Resource + private ISysGroupDeviceService sysGroupDeviceService; + + @Override + public void syncDcDevices(String token) { + AvPageRequest avPageRequest = new AvPageRequest(); + avPageRequest.setPage(1); + avPageRequest.setPaging(1); + + //全量查询设备信息 + List deviceDTOS = AvUtil.selectDevices(avUrl, token, avPageRequest); + + if (CollectionUtil.isNotEmpty(deviceDTOS)) { + for (AvDeviceDTO dcDeviceDTO : deviceDTOS) { + BusDeviceInfo busDeviceInfo = this.convertDevice(dcDeviceDTO); + + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(BusDeviceInfo::getCameraIndexCode, dcDeviceDTO.getSn()); + this.deviceInfoService.saveOrUpdate(busDeviceInfo, query); + } + + List deviceSns = deviceDTOS.stream().filter(dto -> AvDataStateEnum.DEL.equals(dto.getState())).map(AvDeviceDTO::getSn).collect(Collectors.toList()); + + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.in(BusDeviceInfo::getCameraIndexCode, deviceSns); + if (CollectionUtil.isNotEmpty(deviceSns)) { + this.deviceInfoService.remove(query); + } + } + +// AvUtil.dict(avUrl,avToken); + } + + /** + * 流地址请求 + * + * @param streamRequestDTO + * @return + */ + @Override + public Object getStreams(StreamRequestDTO streamRequestDTO) { + return AvUtil.selectStreams(avUrl, avToken, streamRequestDTO); + } + + @Override + public Object stopStreams(String id) { + return AvUtil.stopStreams(avUrl, avToken, id); + } + + @Override + public Object heart(String id) { + return AvUtil.heart(avUrl, avToken, id); + } + + @Transactional + @Override + public void loadUserDeviceRelationships() { + + List relationshipDTOS = AvUtil.userDeviceRelationships(avUrl, avToken); + log.info("loadUserDeviceRelationships: {}", relationshipDTOS); + + for (DeviceRelationshipDTO relationshipDTO : relationshipDTOS) { + + //检索用户信息 + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(User::getSyncId, relationshipDTO.getUser_id()); + List users = abstractUserService.list(query); + + if (users != null&&users.size() > 0) { + User user = users.get(0); + //创建用户组 + LambdaQueryWrapper groupQuery = new LambdaQueryWrapper<>(); + String groupName = user.getName() + user.getId(); + groupQuery.eq(SysUserGroup::getGroupName, groupName); + SysUserGroup sysUserGroup = userGroupService.getOne(groupQuery); + + if (sysUserGroup == null) { + sysUserGroup = genSysUserGroup(groupName, user); + List userIds = new ArrayList<>(); + userIds.add(user.getId()); + userGroupService.createSysUserGroup(sysUserGroup, userIds); + } + + LambdaQueryWrapper deviceQuery = new LambdaQueryWrapper<>(); + deviceQuery.in(BusDeviceInfo::getCameraIndexCode, relationshipDTO.getDeviceList()); + List busDeviceInfos = deviceInfoService.list(deviceQuery); + + if (CollectionUtil.isNotEmpty(busDeviceInfos)) { + List list = busDeviceInfos.stream().map(BusDeviceInfo::getId).collect(Collectors.toList()); + sysGroupDeviceService.batchIncremental(sysUserGroup.getId(), list); + } + + }else{ + log.error("loadUserDeviceRelationships is empty: {}", relationshipDTO.getUser_id()); + } + } + } + + private SysUserGroup genSysUserGroup(String groupName, User user) { + SysUserGroup sysUserGroup = new SysUserGroup(); + sysUserGroup.setGroupName(groupName); + sysUserGroup.setCreateTime(new Date()); + sysUserGroup.setCreateId(user.getId()); + sysUserGroup.setDeptId(user.getDeptId()); + sysUserGroup.setDescription("默认创建分组,不可修改!"); + sysUserGroup.setSafe(0); + return sysUserGroup; + } + + /** + * 设备类型数据转换 + * + * @param dto 艾薇设备信息 + * @return + */ + private BusDeviceInfo convertDevice(AvDeviceDTO dto) { + BusDeviceInfo info = new BusDeviceInfo(); + info.setCreateTime(new Date()); + info.setUpdateTime(new Date()); + + //转换为本地密级编码 + info.setSecretLevel(AvSecretLevelEnum.valueOfCode(dto.getSecureLevel()).getCurrCode()); + + info.setDeviceStatus(AvStatusTypeEnum.valueOfType(dto.getStatus()).getType()); + info.setCameraIndexCode(dto.getSn()); + info.setMonitorName(dto.getName()); + + //PTZ type类型 + info.setDeviceType(AvPtzTypeEnum.valueOfType(dto.getPtzType()).getType() + ""); + info.setBfFlag(0); + + return info; + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/util/AvHttpUtils.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/util/AvHttpUtils.java new file mode 100644 index 0000000..083d88a --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/util/AvHttpUtils.java @@ -0,0 +1,331 @@ +package com.casic.missiles.modular.device.util; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.modular.device.http.HttpGetWithEntity; +import com.casic.missiles.modular.system.handler.DefaultHttpHeaderHandler; +import org.apache.http.NameValuePair; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpDelete; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.util.EntityUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +public class AvHttpUtils { + + public static String sendGetJson(String url, Map param, String token, DefaultHttpHeaderHandler handler) { + try { + StringBuffer query = new StringBuffer(); + String var14 = sendGetEntityData(url, handler.getChartSet(), param, token, handler); + return var14; + } catch (Exception var10) { + Exception e = var10; + e.printStackTrace(); + System.out.println("发送GET请求出现异常!" + e); + return ""; + } finally { + ; + } + } + public static String sendGet(String url, Map param, String token, DefaultHttpHeaderHandler handler) { + try { + StringBuffer query = new StringBuffer(); + Iterator var5 = param.entrySet().iterator(); + + while(var5.hasNext()) { + Map.Entry kv = (Map.Entry)var5.next(); + query.append(URLEncoder.encode((String)kv.getKey(), handler.getChartSet()) + "="); + query.append(URLEncoder.encode((String)kv.getValue(), handler.getChartSet()) + "&"); + } + + if (query.lastIndexOf("&") > 0) { + query.deleteCharAt(query.length() - 1); + } + + String urlNameString = url + "?" + query.toString(); + String var14 = sendGetData(urlNameString, handler.getChartSet(), token, handler); + return var14; + } catch (Exception var10) { + Exception e = var10; + e.printStackTrace(); + System.out.println("发送GET请求出现异常!" + e); + return ""; + } finally { + ; + } + } + public static String sendPost(String url, Map param, String token, DefaultHttpHeaderHandler httpHeaderHandler) { + return sendPostDataByMap(url, param, "utf8", token, httpHeaderHandler); + } + public static String sendPostDataByMap(String url, Map map, String encoding, String token, DefaultHttpHeaderHandler httpHeaderHandler) { + String result = ""; + CloseableHttpResponse response = null; + CloseableHttpClient httpClient = null; + HttpPost httpPost = null; + + try { + httpClient = HttpClients.createDefault(); + httpPost = new HttpPost(url); + httpPost.setHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)"); + httpHeaderHandler.setHeader(httpPost, token); + if (httpHeaderHandler.isJson()) { + jsonParams(map, httpPost); + } else { + formParams(map, httpPost, httpHeaderHandler.getChartSet()); + } + + response = httpClient.execute(httpPost); + if (response.getStatusLine().getStatusCode() == 200) { + result = EntityUtils.toString(response.getEntity(), httpHeaderHandler.getChartSet()); + } + } catch (Exception var22) { + Exception e = var22; + System.out.println("发送GET请求出现异常!" + e); + e.printStackTrace(); + } finally { + IOException e; + try { + if (response != null) { + response.close(); + } + + httpPost.releaseConnection(); + httpClient.close(); + } catch (IOException var21) { + e = var21; + e.printStackTrace(); + } + + if (httpClient != null) { + try { + httpClient.close(); + } catch (IOException var20) { + e = var20; + e.printStackTrace(); + } + } + + } + + return result; + } + public static String sendGetData(String url, String encoding, String token, DefaultHttpHeaderHandler httpHeaderHandler) { + String result = ""; + CloseableHttpResponse response = null; + if (httpHeaderHandler == null) { + httpHeaderHandler = new DefaultHttpHeaderHandler(); + } + + CloseableHttpClient httpClient = null; + + try { + httpClient = HttpClients.createDefault(); + HttpGet httpGet = new HttpGet(url); + httpHeaderHandler.setHeader(httpGet, token); + response = httpClient.execute(httpGet); + if (response.getStatusLine().getStatusCode() == 200) { + result = EntityUtils.toString(response.getEntity(), encoding); + } + } catch (Exception var20) { + Exception e = var20; + e.printStackTrace(); + System.out.println("发送GET请求出现异常!" + e); + } finally { + IOException e; + if (response != null) { + try { + response.close(); + } catch (IOException var19) { + e = var19; + e.printStackTrace(); + } + } + + if (httpClient != null) { + try { + httpClient.close(); + } catch (IOException var18) { + e = var18; + e.printStackTrace(); + } + } + + } + + return result; + } + public static String sendGetEntityData(String url, String encoding, Map param, String token, DefaultHttpHeaderHandler httpHeaderHandler) { + String result = ""; + CloseableHttpResponse response = null; + if (httpHeaderHandler == null) { + httpHeaderHandler = new DefaultHttpHeaderHandler(); + } + CloseableHttpClient httpClient =null; + try { + httpClient = HttpClients.createDefault(); + HttpGetWithEntity httpGet = new HttpGetWithEntity(url); + httpHeaderHandler.setHeader(httpGet, token); + if (httpHeaderHandler.isJson()) { + jsonParams(param, httpGet); + } else { + formParams(param, httpGet, httpHeaderHandler.getChartSet()); + } + response = httpClient.execute(httpGet); + if (response.getStatusLine().getStatusCode() == 200) { + result = EntityUtils.toString(response.getEntity(), encoding); + } + } catch (Exception var16) { + Exception e = var16; + e.printStackTrace(); + System.out.println("发送GET请求出现异常!" + e); + } finally { + if (response != null) { + try { + response.close(); + } catch (IOException var15) { + IOException e = var15; + e.printStackTrace(); + } + } + if (httpClient != null) { + try { + httpClient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + } + + return result; + } + + public static String sendDelete(String url, Map param, String token, DefaultHttpHeaderHandler handler) { + try { + StringBuffer query = new StringBuffer(); + Iterator var5 = param.entrySet().iterator(); + + while (var5.hasNext()) { + Map.Entry kv = (Map.Entry) var5.next(); + query.append(URLEncoder.encode((String) kv.getKey(), handler.getChartSet()) + "="); + query.append(URLEncoder.encode((String) kv.getValue(), handler.getChartSet()) + "&"); + } + + if (query.lastIndexOf("&") > 0) { + query.deleteCharAt(query.length() - 1); + } + String urlNameString = url + "?" + query.toString(); + String var14 = sendDeleteData(urlNameString, handler.getChartSet(), token, handler); + return var14; + } catch (Exception var10) { + Exception e = var10; + e.printStackTrace(); + System.out.println("发送GET请求出现异常!" + e); + return ""; + } finally { + ; + } + } + private static final Logger logger = LoggerFactory.getLogger(AvUtil.class); + /** + * http 请求 + * + * @param url + * @param encoding + * @param token + * @param httpHeaderHandler + * @return + */ + public static String sendDeleteData(String url, String encoding, String token, DefaultHttpHeaderHandler httpHeaderHandler) { + String result = ""; + CloseableHttpResponse response = null; + if (httpHeaderHandler == null) { + httpHeaderHandler = new DefaultHttpHeaderHandler(); + } + CloseableHttpClient httpClient = null; + try { + httpClient = HttpClients.createDefault(); + HttpDelete httpGet = new HttpDelete(url); + httpHeaderHandler.setHeader(httpGet, token); + response = httpClient.execute(httpGet); + if (response.getStatusLine().getStatusCode() == 200) { + logger.info("----------------------------------:"+EntityUtils.toString(response.getEntity(), encoding)); + result = EntityUtils.toString(response.getEntity(), encoding); + } + } catch (Exception var16) { + Exception e = var16; + e.printStackTrace(); + } finally { + if (response != null) { + try { + response.close(); + } catch (IOException var15) { + IOException e = var15; + e.printStackTrace(); + } + } + if (httpClient != null) { + try { + httpClient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return result; + } + public static void jsonParams(Map map, HttpPost post) { + String paramJson = JSONObject.toJSONString(map); + StringEntity stringEntity = new StringEntity(paramJson, ContentType.create("application/json", "UTF-8")); + post.setEntity(stringEntity); + } + + public static void formParams(Map map, HttpPost post, String chartSet) throws UnsupportedEncodingException { + List nameValuePairs = new ArrayList(); + if (map != null) { + Iterator var4 = map.entrySet().iterator(); + + while(var4.hasNext()) { + Map.Entry entry = (Map.Entry)var4.next(); + nameValuePairs.add(new BasicNameValuePair((String)entry.getKey(), (String)entry.getValue())); + } + } + + post.setEntity(new UrlEncodedFormEntity(nameValuePairs, chartSet)); + } + public static void jsonParams(Map map, HttpGetWithEntity post) { + String paramJson = JSONObject.toJSONString(map); + StringEntity stringEntity = new StringEntity(paramJson, ContentType.create("application/json", "UTF-8")); + + post.setEntity(stringEntity); + } + + public static void formParams(Map map, HttpGetWithEntity post, String chartSet) throws UnsupportedEncodingException { + List nameValuePairs = new ArrayList(); + if (map != null) { + Iterator var4 = map.entrySet().iterator(); + + while (var4.hasNext()) { + Map.Entry entry = (Map.Entry) var4.next(); + nameValuePairs.add(new BasicNameValuePair((String) entry.getKey(), (String) entry.getValue())); + } + } + + post.setEntity(new UrlEncodedFormEntity(nameValuePairs, chartSet)); + } +} \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/util/AvUtil.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/util/AvUtil.java new file mode 100644 index 0000000..9575627 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/util/AvUtil.java @@ -0,0 +1,171 @@ +package com.casic.missiles.modular.device.util; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.TypeReference; +import com.casic.missiles.modular.device.dto.AvDeviceDTO; +import com.casic.missiles.modular.device.dto.AvPageResponse; +import com.casic.missiles.modular.device.dto.DeviceRelationshipDTO; +import com.casic.missiles.modular.device.dto.page.AvPageRequest; +import com.casic.missiles.modular.device.dto.stream.StreamRequestDTO; +import com.casic.missiles.modular.device.enums.AvUrlEnums; +import com.casic.missiles.modular.device.http.AvDefaultHttpHeaderHandler; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 艾薇对接工具类 + */ +public class AvUtil { + private static final Logger logger = LoggerFactory.getLogger(AvUtil.class); + + /** + * 设备列表读取 + * + * @param baseUrl av流媒体地址 + * @param token 认证令牌 + * @param pageRequest 请求体 + * @return + */ + public static List selectDevices(String baseUrl, String token, AvPageRequest pageRequest) { + AvDefaultHttpHeaderHandler dcDefaultHttpHeaderHandler = new AvDefaultHttpHeaderHandler(); + dcDefaultHttpHeaderHandler.setJson(true); + Map param = new HashMap<>(); + param.put("page", pageRequest.getPage() + ""); + param.put("paging", pageRequest.getPaging() + ""); + param.put("limit", "100000"); + param.put("token", token); + String res = AvHttpUtils.sendGet(baseUrl + AvUrlEnums.DEVICE.getUrl(), param, token, dcDefaultHttpHeaderHandler); + logger.info("selectDevices:{}", res); + if (StrUtil.isEmpty(res)) { + logger.error("av device sync error!"); + } + AvPageResponse deviceDTOS = JSON.parseObject(res, new TypeReference() { + }); + return deviceDTOS.getItems(); + } + + /** + * 创建流 + * + * @param baseUrl av流媒体地址 + * @param token 认证令牌 + * @param streamRequestDTO 请求体 + * @return + */ + public static Object selectStreams(String baseUrl, String token, StreamRequestDTO streamRequestDTO) { + + Map param = new HashMap<>(); + param.put("device_id", streamRequestDTO.getDevice_id() + ""); + param.put("stream_type", streamRequestDTO.getStream_type() + ""); + param.put("quality", streamRequestDTO.getQuality() + ""); + param.put("token", token); + param.put("from", streamRequestDTO.getFrom() + ""); + param.put("to", streamRequestDTO.getTo() + ""); + logger.info("url:{}", baseUrl + AvUrlEnums.STREAM.getUrl()); + AvDefaultHttpHeaderHandler dcDefaultHttpHeaderHandler = new AvDefaultHttpHeaderHandler(); + dcDefaultHttpHeaderHandler.setJson(true); + String res = AvHttpUtils.sendPost(baseUrl + AvUrlEnums.STREAM.getUrl(), param, token, dcDefaultHttpHeaderHandler); + + if (StrUtil.isEmpty(res)) { + logger.error("av stream error:{}", streamRequestDTO.getDevice_id()); + return null; + } + return JSON.parseObject(res); + } + + /** + * 发送心跳 + * + * @param avUrl + * @param avToken + * @return + */ + public static Object dict(String avUrl, String avToken) { + AvDefaultHttpHeaderHandler dcDefaultHttpHeaderHandler = new AvDefaultHttpHeaderHandler(); + dcDefaultHttpHeaderHandler.setJson(true); + Map param = new HashMap<>(); + String res = AvHttpUtils.sendGet(avUrl + AvUrlEnums.DICT.getUrl(), param, avToken, dcDefaultHttpHeaderHandler); + logger.info("av dict:{}", res); + return null; + } + + /** + * 发送心跳 + * + * @param avUrl + * @param avToken + * @param id + * @return + */ + public static Object heart(String avUrl, String avToken, String id) { + AvDefaultHttpHeaderHandler dcDefaultHttpHeaderHandler = new AvDefaultHttpHeaderHandler(); + dcDefaultHttpHeaderHandler.setJson(true); + Map param = new HashMap<>(); +// param.put("id", id); +// param.put("token", avToken); + String res = AvHttpUtils.sendGet(avUrl + String.format(AvUrlEnums.HEART.getUrl(), id), param, avToken, dcDefaultHttpHeaderHandler); + if (StrUtil.isEmpty(res)) { + logger.error("av heart error:{}", id); + return null; + } + return JSON.parseObject(res); + } + + /** + * 停止流 + * + * @param avUrl 艾薇流媒体地址 + * @param avToken 认证令牌 + * @param id 国标ID + * @return + */ + public static Object stopStreams(String avUrl, String avToken, String id) { + AvDefaultHttpHeaderHandler dcDefaultHttpHeaderHandler = new AvDefaultHttpHeaderHandler(); + dcDefaultHttpHeaderHandler.setJson(true); + Map param = new HashMap<>(); + //param.put("id", id); + String res = AvHttpUtils.sendDelete(avUrl + String.format(AvUrlEnums.STREAM_STOP.getUrl(), id), param, avToken, dcDefaultHttpHeaderHandler); + + if (StrUtil.isEmpty(res)) { + logger.error("av stopStreams error:{}", id); + return null; + } + return JSON.parseObject(res); + } + + /** + * 用户设备关系 + * + * @param avUrl 艾薇流媒体地址 + * @param avToken 认证令牌 + * @return + */ + public static List userDeviceRelationships(String avUrl, String avToken) { + + AvDefaultHttpHeaderHandler avDefaultHttpHeaderHandler = new AvDefaultHttpHeaderHandler(); + avDefaultHttpHeaderHandler.setJson(true); + Map param = new HashMap<>(); + String res = AvHttpUtils.sendGetJson(avUrl + AvUrlEnums.USER_DEVICE_RELATION.getUrl(), param, avToken, avDefaultHttpHeaderHandler); + if (StrUtil.isEmpty(res)) { + logger.error("av userDeviceRelationships error"); + return null; + } + + List deviceDTOS = JSON.parseObject(res, new TypeReference>() { + }); + if (CollectionUtil.isNotEmpty(deviceDTOS)) { + for (DeviceRelationshipDTO deviceDTO : deviceDTOS) { + if (StrUtil.isNotEmpty(deviceDTO.getDevice_list())) { + deviceDTO.setDeviceList(StrUtil.split(deviceDTO.getDevice_list(), ",")); + } + } + } + return deviceDTOS; + } +} \ No newline at end of file diff --git a/README.md b/README.md index 430796e..8dbc9a5 100644 --- a/README.md +++ b/README.md @@ -9,3 +9,7 @@ #### 其他 >* [git地址](http://192.168.0.203:8080/gitbucket) >* [本地免登地址](http://localhost:8083/route/mockToken) + +AView 对接问题 +1.用户设备关联关系 + 对应返回 device_list是否为设备国标号 \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/pom.xml b/casic-device-sync/casic-device-aview/pom.xml index 0a3c5fa..94fb9e5 100644 --- a/casic-device-sync/casic-device-aview/pom.xml +++ b/casic-device-sync/casic-device-aview/pom.xml @@ -33,6 +33,21 @@ ${boot.version} provided + + com.casic + casic-http + ${core.version} + + + com.casic + casic-admin-group + ${admin.version} + + + com.casic + casic-server + ${pro.version} + diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java new file mode 100644 index 0000000..195cba2 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.device.controller; + +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import com.casic.missiles.modular.device.dto.stream.StreamRequestDTO; +import com.casic.missiles.modular.device.service.IAvSyncService; +import io.swagger.annotations.Api; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +@Api(tags = "AV平台代理接口") +@RestController +@RequestMapping("/route") +public class AvRouteController { + @Resource + private IAvSyncService avSyncService; + + @PostMapping("/open/v1/api/streams") + public Object streams(@RequestBody StreamRequestDTO requestDTO) { + Object object = avSyncService.getStreams(requestDTO); + if (object == null) { + ResponseDataDTO respDTO = ResponseDataDTO.error("流读取失败,请稍后重试!"); + respDTO.setMessage("流读取失败,请稍后重试!"); + return respDTO; + } + return ResponseDataDTO.success(avSyncService.getStreams(requestDTO)); + } + + @DeleteMapping("/open/v1/api/streams/{id}") + public Object stopStreams(@PathVariable("id") String id) { + Object object = avSyncService.stopStreams(id); + return ResponseDataDTO.success(object); + } + + @PostMapping("/open/v1/api/streams/{id}/heart") + public Object heart(@PathVariable("id") String id) { + Object object = avSyncService.heart(id); + if (object == null) { + ResponseDataDTO respDTO = ResponseDataDTO.error("流心跳失败,请稍后重试!"); + respDTO.setMessage("流心跳失败,请稍后重试!"); + return respDTO; + } + return ResponseDataDTO.success(object); + } +} \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java new file mode 100644 index 0000000..97bde9f --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java @@ -0,0 +1,49 @@ +package com.casic.missiles.modular.device.dto; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; + +/** + * 艾薇设备对象DTO + */ +@Data +public class AvDeviceDTO { + // 设备ID + private Long id; + + // 设备名称 + private String name; + + // 设备唯一国标序列号 + private String sn; + + // 设备类型 + private Integer type; + + // 设备版本号 + private String version; + + // 安全等级 + @JSONField(name = "secure_level") + private String secureLevel; + + // 设备状态 + private Integer status; + + // 云台类型 + private Integer ptzType; + + // 朝向 + private Integer orientation; + + // 创建时间 + @JSONField(name = "gmt_created") + private String gmtCreated; + + // 修改时间 + @JSONField(name = "gmt_modified") + private String gmtModified; + + // 数据状态 + private Integer state; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java new file mode 100644 index 0000000..9a05183 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java @@ -0,0 +1,10 @@ +package com.casic.missiles.modular.device.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class AvPageResponse { + private List items; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java new file mode 100644 index 0000000..098dda4 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.device.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class DeviceRelationshipDTO { + private Long user_id; + private String device_list; + private List deviceList; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java new file mode 100644 index 0000000..74e6a9b --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java @@ -0,0 +1,9 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +@Data +public class AvPageRep { + private Integer total; + private T list; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java new file mode 100644 index 0000000..900ae4a --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +/** + * 分页请求DTO + */ +@Data +public class AvPageRequest { + private int page; + private int paging; + private int limit; + +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java new file mode 100644 index 0000000..f1c1e7a --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +/** + * mvp返回基类封装 + * + * @param + */ +@Data +public class AvResponseDTO { + private T data; + private Integer code; + private String msg; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamRequestDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamRequestDTO.java new file mode 100644 index 0000000..69e88ce --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamRequestDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.device.dto.stream; + +import lombok.Data; + +@Data +public class StreamRequestDTO { + private String device_id; + private String stream_type; + private String quality; + private int from; + private int to; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamStopRequestDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamStopRequestDTO.java new file mode 100644 index 0000000..9cf94b1 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamStopRequestDTO.java @@ -0,0 +1,11 @@ +package com.casic.missiles.modular.device.dto.stream; + +import lombok.Data; + +@Data +public class StreamStopRequestDTO { + private String id; + private String type; + private StreamRequestDTO request; + private String url; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvDataStateEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvDataStateEnum.java new file mode 100644 index 0000000..e1a6658 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvDataStateEnum.java @@ -0,0 +1,72 @@ +package com.casic.missiles.modular.device.enums; + +/** + * 数据状态 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvDataStateEnum { + + TYPE0(0, "有效",0), + DEL(1, "无效",1); + + Integer code; + String message; + Integer type; + AvDataStateEnum(Integer code, String message, Integer type) { + this.code = code; + this.message = message; + this.type = type; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public static String valueOfs(Integer value) { + if (value == null) { + return ""; + } else { + for (AvDataStateEnum ms : AvDataStateEnum.values()) { + if (ms.getCode().equals(value)) { + return ms.getMessage(); + } + } + return ""; + } + } + + public static AvDataStateEnum valueOfType(Integer value) { + if (value == null) { + return TYPE0; + } else { + for (AvDataStateEnum ms : AvDataStateEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return TYPE0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvPtzTypeEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvPtzTypeEnum.java new file mode 100644 index 0000000..fdcb08d --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvPtzTypeEnum.java @@ -0,0 +1,73 @@ +package com.casic.missiles.modular.device.enums; + +/** + * wvp设备类型转换 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvPtzTypeEnum { + + TYPE0(0, "枪机",0), + TYPE1(1, "半球",1), + TYPE2(2, "球机",2); + + Integer code; + String message; + Integer type; + AvPtzTypeEnum(Integer code, String message, Integer type) { + this.code = code; + this.message = message; + this.type = type; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public static String valueOfs(Integer value) { + if (value == null) { + return ""; + } else { + for (AvPtzTypeEnum ms : AvPtzTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms.getMessage(); + } + } + return ""; + } + } + + public static AvPtzTypeEnum valueOfType(Integer value) { + if (value == null) { + return TYPE0; + } else { + for (AvPtzTypeEnum ms : AvPtzTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return TYPE0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvSecretLevelEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvSecretLevelEnum.java new file mode 100644 index 0000000..39e8524 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvSecretLevelEnum.java @@ -0,0 +1,60 @@ +package com.casic.missiles.modular.device.enums; + +/** + * Av主数据密集对应关系枚举 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvSecretLevelEnum { + s("999", "未定密", 999, "未定密"), + s0("0", "公开", 0, "公开"), + s1("1", "内部", 1, "内部"), + s2("2", "秘密", 2, "秘密"), + s3("3", "机密", 3, "机密"); + + String code; + Integer currCode; + String message; + String currMsg; + + AvSecretLevelEnum(String code, String message, Integer currCode, String currMsg) { + this.code = code; + this.currCode = currCode; + this.message = message; + this.currMsg = currMsg; + } + + public Integer getCurrCode() { + return currCode; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public static AvSecretLevelEnum valueOfCode(String value) { + if (value == null) { + return s0; + } else { + for (AvSecretLevelEnum ms : AvSecretLevelEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return s0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvStatusTypeEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvStatusTypeEnum.java new file mode 100644 index 0000000..ddccd52 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvStatusTypeEnum.java @@ -0,0 +1,72 @@ +package com.casic.missiles.modular.device.enums; + +/** + * wvp设备类型转换 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvStatusTypeEnum { + + TYPE0(0, "离线",0), + TYPE1(1, "在线",1); + + Integer code; + String message; + Integer type; + AvStatusTypeEnum(Integer code, String message, Integer type) { + this.code = code; + this.message = message; + this.type = type; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public static String valueOfs(Integer value) { + if (value == null) { + return ""; + } else { + for (AvStatusTypeEnum ms : AvStatusTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms.getMessage(); + } + } + return ""; + } + } + + public static AvStatusTypeEnum valueOfType(Integer value) { + if (value == null) { + return TYPE0; + } else { + for (AvStatusTypeEnum ms : AvStatusTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return TYPE0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvUrlEnums.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvUrlEnums.java new file mode 100644 index 0000000..04b38ad --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvUrlEnums.java @@ -0,0 +1,37 @@ +package com.casic.missiles.modular.device.enums; + +/** + * 设备媒体 + */ +public enum AvUrlEnums { + DEVICE("/open/v1/api/devices","设备信息查询"), + STREAM("/open/v1/api/streams","创建流"), + STREAM_STOP("/open/v1/api/streams/%s","停止流"), + HEART("/open/v1/api/streams/%s/heartbeat","发送心跳"), + DICT("/open/v1/api/dictionary_datas","字典查询"), + USER_DEVICE_RELATION("/open/v1/api/user_device_relationships","用户设备关联关系"); + + private String url; + private String name; + + AvUrlEnums(String url, String name) { + this.url = url; + this.name = name; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/AvDefaultHttpHeaderHandler.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/AvDefaultHttpHeaderHandler.java new file mode 100644 index 0000000..53f0a5c --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/AvDefaultHttpHeaderHandler.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.device.http; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.modular.system.handler.DefaultHttpHeaderHandler; +import org.apache.http.client.methods.HttpRequestBase; + +public class AvDefaultHttpHeaderHandler extends DefaultHttpHeaderHandler { + public void setHeader(HttpRequestBase base, String token) { + base.addHeader("Content-type", DEFAULT_CONTEXTTYPE); + if (StrUtil.isNotEmpty(token)) { + base.addHeader("X-OApi-Token", token); + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/HttpGetWithEntity.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/HttpGetWithEntity.java new file mode 100644 index 0000000..b8abf8f --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/HttpGetWithEntity.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.device.http; + +import org.apache.http.client.methods.HttpEntityEnclosingRequestBase; + +import java.net.URI; + +public class HttpGetWithEntity extends HttpEntityEnclosingRequestBase { + + public HttpGetWithEntity(URI uri) { + this.setURI(uri); + } + + public HttpGetWithEntity(String uri) { + this.setURI(URI.create(uri)); + } + + public String getMethod() { + return "GET"; + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/IAvSyncService.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/IAvSyncService.java new file mode 100644 index 0000000..13c3203 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/IAvSyncService.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.device.service; + +import com.casic.missiles.modular.device.dto.stream.StreamRequestDTO; + +public interface IAvSyncService { + /** + * Dc706设备信息同步 + */ + void syncDcDevices(String token); + + /** + * 创建流 + * + * @param streamRequestDTO + * @return + */ + Object getStreams(StreamRequestDTO streamRequestDTO); + + /** + * 停止流 + * + * @param id + * @return + */ + Object stopStreams(String id); + + /** + * 发送心跳 + * + * @param id 设备国标号 + * @return + */ + Object heart(String id); + + /** + * 设备权限更新 + */ + void loadUserDeviceRelationships(); +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/impl/AvSyncServiceImpl.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/impl/AvSyncServiceImpl.java new file mode 100644 index 0000000..25e3340 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/impl/AvSyncServiceImpl.java @@ -0,0 +1,179 @@ +package com.casic.missiles.modular.device.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.casic.missiles.core.application.service.AbstractUserService; +import com.casic.missiles.modular.device.dto.AvDeviceDTO; +import com.casic.missiles.modular.device.dto.DeviceRelationshipDTO; +import com.casic.missiles.modular.device.dto.page.AvPageRequest; +import com.casic.missiles.modular.device.dto.stream.StreamRequestDTO; +import com.casic.missiles.modular.device.enums.AvDataStateEnum; +import com.casic.missiles.modular.device.enums.AvPtzTypeEnum; +import com.casic.missiles.modular.device.enums.AvSecretLevelEnum; +import com.casic.missiles.modular.device.enums.AvStatusTypeEnum; +import com.casic.missiles.modular.device.model.BusDeviceInfo; +import com.casic.missiles.modular.device.service.IAvSyncService; +import com.casic.missiles.modular.device.service.IBusDeviceInfoService; +import com.casic.missiles.modular.device.service.ISysGroupDeviceService; +import com.casic.missiles.modular.device.util.AvUtil; +import com.casic.missiles.modular.system.model.SysUserGroup; +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.modular.system.service.ISysUserGroupService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; +@Slf4j +@Service +public class AvSyncServiceImpl implements IAvSyncService { + @Value("${casic.video.av.url:-1}") + private String avUrl; + @Value("${casic.video.av.token:-1}") + private String avToken; + @Resource + private IBusDeviceInfoService deviceInfoService; + @Resource + private AbstractUserService abstractUserService; + + @Resource + private ISysUserGroupService userGroupService; + @Resource + private ISysGroupDeviceService sysGroupDeviceService; + + @Override + public void syncDcDevices(String token) { + AvPageRequest avPageRequest = new AvPageRequest(); + avPageRequest.setPage(1); + avPageRequest.setPaging(1); + + //全量查询设备信息 + List deviceDTOS = AvUtil.selectDevices(avUrl, token, avPageRequest); + + if (CollectionUtil.isNotEmpty(deviceDTOS)) { + for (AvDeviceDTO dcDeviceDTO : deviceDTOS) { + BusDeviceInfo busDeviceInfo = this.convertDevice(dcDeviceDTO); + + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(BusDeviceInfo::getCameraIndexCode, dcDeviceDTO.getSn()); + this.deviceInfoService.saveOrUpdate(busDeviceInfo, query); + } + + List deviceSns = deviceDTOS.stream().filter(dto -> AvDataStateEnum.DEL.equals(dto.getState())).map(AvDeviceDTO::getSn).collect(Collectors.toList()); + + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.in(BusDeviceInfo::getCameraIndexCode, deviceSns); + if (CollectionUtil.isNotEmpty(deviceSns)) { + this.deviceInfoService.remove(query); + } + } + +// AvUtil.dict(avUrl,avToken); + } + + /** + * 流地址请求 + * + * @param streamRequestDTO + * @return + */ + @Override + public Object getStreams(StreamRequestDTO streamRequestDTO) { + return AvUtil.selectStreams(avUrl, avToken, streamRequestDTO); + } + + @Override + public Object stopStreams(String id) { + return AvUtil.stopStreams(avUrl, avToken, id); + } + + @Override + public Object heart(String id) { + return AvUtil.heart(avUrl, avToken, id); + } + + @Transactional + @Override + public void loadUserDeviceRelationships() { + + List relationshipDTOS = AvUtil.userDeviceRelationships(avUrl, avToken); + log.info("loadUserDeviceRelationships: {}", relationshipDTOS); + + for (DeviceRelationshipDTO relationshipDTO : relationshipDTOS) { + + //检索用户信息 + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(User::getSyncId, relationshipDTO.getUser_id()); + List users = abstractUserService.list(query); + + if (users != null&&users.size() > 0) { + User user = users.get(0); + //创建用户组 + LambdaQueryWrapper groupQuery = new LambdaQueryWrapper<>(); + String groupName = user.getName() + user.getId(); + groupQuery.eq(SysUserGroup::getGroupName, groupName); + SysUserGroup sysUserGroup = userGroupService.getOne(groupQuery); + + if (sysUserGroup == null) { + sysUserGroup = genSysUserGroup(groupName, user); + List userIds = new ArrayList<>(); + userIds.add(user.getId()); + userGroupService.createSysUserGroup(sysUserGroup, userIds); + } + + LambdaQueryWrapper deviceQuery = new LambdaQueryWrapper<>(); + deviceQuery.in(BusDeviceInfo::getCameraIndexCode, relationshipDTO.getDeviceList()); + List busDeviceInfos = deviceInfoService.list(deviceQuery); + + if (CollectionUtil.isNotEmpty(busDeviceInfos)) { + List list = busDeviceInfos.stream().map(BusDeviceInfo::getId).collect(Collectors.toList()); + sysGroupDeviceService.batchIncremental(sysUserGroup.getId(), list); + } + + }else{ + log.error("loadUserDeviceRelationships is empty: {}", relationshipDTO.getUser_id()); + } + } + } + + private SysUserGroup genSysUserGroup(String groupName, User user) { + SysUserGroup sysUserGroup = new SysUserGroup(); + sysUserGroup.setGroupName(groupName); + sysUserGroup.setCreateTime(new Date()); + sysUserGroup.setCreateId(user.getId()); + sysUserGroup.setDeptId(user.getDeptId()); + sysUserGroup.setDescription("默认创建分组,不可修改!"); + sysUserGroup.setSafe(0); + return sysUserGroup; + } + + /** + * 设备类型数据转换 + * + * @param dto 艾薇设备信息 + * @return + */ + private BusDeviceInfo convertDevice(AvDeviceDTO dto) { + BusDeviceInfo info = new BusDeviceInfo(); + info.setCreateTime(new Date()); + info.setUpdateTime(new Date()); + + //转换为本地密级编码 + info.setSecretLevel(AvSecretLevelEnum.valueOfCode(dto.getSecureLevel()).getCurrCode()); + + info.setDeviceStatus(AvStatusTypeEnum.valueOfType(dto.getStatus()).getType()); + info.setCameraIndexCode(dto.getSn()); + info.setMonitorName(dto.getName()); + + //PTZ type类型 + info.setDeviceType(AvPtzTypeEnum.valueOfType(dto.getPtzType()).getType() + ""); + info.setBfFlag(0); + + return info; + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/util/AvHttpUtils.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/util/AvHttpUtils.java new file mode 100644 index 0000000..083d88a --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/util/AvHttpUtils.java @@ -0,0 +1,331 @@ +package com.casic.missiles.modular.device.util; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.modular.device.http.HttpGetWithEntity; +import com.casic.missiles.modular.system.handler.DefaultHttpHeaderHandler; +import org.apache.http.NameValuePair; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpDelete; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.util.EntityUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +public class AvHttpUtils { + + public static String sendGetJson(String url, Map param, String token, DefaultHttpHeaderHandler handler) { + try { + StringBuffer query = new StringBuffer(); + String var14 = sendGetEntityData(url, handler.getChartSet(), param, token, handler); + return var14; + } catch (Exception var10) { + Exception e = var10; + e.printStackTrace(); + System.out.println("发送GET请求出现异常!" + e); + return ""; + } finally { + ; + } + } + public static String sendGet(String url, Map param, String token, DefaultHttpHeaderHandler handler) { + try { + StringBuffer query = new StringBuffer(); + Iterator var5 = param.entrySet().iterator(); + + while(var5.hasNext()) { + Map.Entry kv = (Map.Entry)var5.next(); + query.append(URLEncoder.encode((String)kv.getKey(), handler.getChartSet()) + "="); + query.append(URLEncoder.encode((String)kv.getValue(), handler.getChartSet()) + "&"); + } + + if (query.lastIndexOf("&") > 0) { + query.deleteCharAt(query.length() - 1); + } + + String urlNameString = url + "?" + query.toString(); + String var14 = sendGetData(urlNameString, handler.getChartSet(), token, handler); + return var14; + } catch (Exception var10) { + Exception e = var10; + e.printStackTrace(); + System.out.println("发送GET请求出现异常!" + e); + return ""; + } finally { + ; + } + } + public static String sendPost(String url, Map param, String token, DefaultHttpHeaderHandler httpHeaderHandler) { + return sendPostDataByMap(url, param, "utf8", token, httpHeaderHandler); + } + public static String sendPostDataByMap(String url, Map map, String encoding, String token, DefaultHttpHeaderHandler httpHeaderHandler) { + String result = ""; + CloseableHttpResponse response = null; + CloseableHttpClient httpClient = null; + HttpPost httpPost = null; + + try { + httpClient = HttpClients.createDefault(); + httpPost = new HttpPost(url); + httpPost.setHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)"); + httpHeaderHandler.setHeader(httpPost, token); + if (httpHeaderHandler.isJson()) { + jsonParams(map, httpPost); + } else { + formParams(map, httpPost, httpHeaderHandler.getChartSet()); + } + + response = httpClient.execute(httpPost); + if (response.getStatusLine().getStatusCode() == 200) { + result = EntityUtils.toString(response.getEntity(), httpHeaderHandler.getChartSet()); + } + } catch (Exception var22) { + Exception e = var22; + System.out.println("发送GET请求出现异常!" + e); + e.printStackTrace(); + } finally { + IOException e; + try { + if (response != null) { + response.close(); + } + + httpPost.releaseConnection(); + httpClient.close(); + } catch (IOException var21) { + e = var21; + e.printStackTrace(); + } + + if (httpClient != null) { + try { + httpClient.close(); + } catch (IOException var20) { + e = var20; + e.printStackTrace(); + } + } + + } + + return result; + } + public static String sendGetData(String url, String encoding, String token, DefaultHttpHeaderHandler httpHeaderHandler) { + String result = ""; + CloseableHttpResponse response = null; + if (httpHeaderHandler == null) { + httpHeaderHandler = new DefaultHttpHeaderHandler(); + } + + CloseableHttpClient httpClient = null; + + try { + httpClient = HttpClients.createDefault(); + HttpGet httpGet = new HttpGet(url); + httpHeaderHandler.setHeader(httpGet, token); + response = httpClient.execute(httpGet); + if (response.getStatusLine().getStatusCode() == 200) { + result = EntityUtils.toString(response.getEntity(), encoding); + } + } catch (Exception var20) { + Exception e = var20; + e.printStackTrace(); + System.out.println("发送GET请求出现异常!" + e); + } finally { + IOException e; + if (response != null) { + try { + response.close(); + } catch (IOException var19) { + e = var19; + e.printStackTrace(); + } + } + + if (httpClient != null) { + try { + httpClient.close(); + } catch (IOException var18) { + e = var18; + e.printStackTrace(); + } + } + + } + + return result; + } + public static String sendGetEntityData(String url, String encoding, Map param, String token, DefaultHttpHeaderHandler httpHeaderHandler) { + String result = ""; + CloseableHttpResponse response = null; + if (httpHeaderHandler == null) { + httpHeaderHandler = new DefaultHttpHeaderHandler(); + } + CloseableHttpClient httpClient =null; + try { + httpClient = HttpClients.createDefault(); + HttpGetWithEntity httpGet = new HttpGetWithEntity(url); + httpHeaderHandler.setHeader(httpGet, token); + if (httpHeaderHandler.isJson()) { + jsonParams(param, httpGet); + } else { + formParams(param, httpGet, httpHeaderHandler.getChartSet()); + } + response = httpClient.execute(httpGet); + if (response.getStatusLine().getStatusCode() == 200) { + result = EntityUtils.toString(response.getEntity(), encoding); + } + } catch (Exception var16) { + Exception e = var16; + e.printStackTrace(); + System.out.println("发送GET请求出现异常!" + e); + } finally { + if (response != null) { + try { + response.close(); + } catch (IOException var15) { + IOException e = var15; + e.printStackTrace(); + } + } + if (httpClient != null) { + try { + httpClient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + } + + return result; + } + + public static String sendDelete(String url, Map param, String token, DefaultHttpHeaderHandler handler) { + try { + StringBuffer query = new StringBuffer(); + Iterator var5 = param.entrySet().iterator(); + + while (var5.hasNext()) { + Map.Entry kv = (Map.Entry) var5.next(); + query.append(URLEncoder.encode((String) kv.getKey(), handler.getChartSet()) + "="); + query.append(URLEncoder.encode((String) kv.getValue(), handler.getChartSet()) + "&"); + } + + if (query.lastIndexOf("&") > 0) { + query.deleteCharAt(query.length() - 1); + } + String urlNameString = url + "?" + query.toString(); + String var14 = sendDeleteData(urlNameString, handler.getChartSet(), token, handler); + return var14; + } catch (Exception var10) { + Exception e = var10; + e.printStackTrace(); + System.out.println("发送GET请求出现异常!" + e); + return ""; + } finally { + ; + } + } + private static final Logger logger = LoggerFactory.getLogger(AvUtil.class); + /** + * http 请求 + * + * @param url + * @param encoding + * @param token + * @param httpHeaderHandler + * @return + */ + public static String sendDeleteData(String url, String encoding, String token, DefaultHttpHeaderHandler httpHeaderHandler) { + String result = ""; + CloseableHttpResponse response = null; + if (httpHeaderHandler == null) { + httpHeaderHandler = new DefaultHttpHeaderHandler(); + } + CloseableHttpClient httpClient = null; + try { + httpClient = HttpClients.createDefault(); + HttpDelete httpGet = new HttpDelete(url); + httpHeaderHandler.setHeader(httpGet, token); + response = httpClient.execute(httpGet); + if (response.getStatusLine().getStatusCode() == 200) { + logger.info("----------------------------------:"+EntityUtils.toString(response.getEntity(), encoding)); + result = EntityUtils.toString(response.getEntity(), encoding); + } + } catch (Exception var16) { + Exception e = var16; + e.printStackTrace(); + } finally { + if (response != null) { + try { + response.close(); + } catch (IOException var15) { + IOException e = var15; + e.printStackTrace(); + } + } + if (httpClient != null) { + try { + httpClient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return result; + } + public static void jsonParams(Map map, HttpPost post) { + String paramJson = JSONObject.toJSONString(map); + StringEntity stringEntity = new StringEntity(paramJson, ContentType.create("application/json", "UTF-8")); + post.setEntity(stringEntity); + } + + public static void formParams(Map map, HttpPost post, String chartSet) throws UnsupportedEncodingException { + List nameValuePairs = new ArrayList(); + if (map != null) { + Iterator var4 = map.entrySet().iterator(); + + while(var4.hasNext()) { + Map.Entry entry = (Map.Entry)var4.next(); + nameValuePairs.add(new BasicNameValuePair((String)entry.getKey(), (String)entry.getValue())); + } + } + + post.setEntity(new UrlEncodedFormEntity(nameValuePairs, chartSet)); + } + public static void jsonParams(Map map, HttpGetWithEntity post) { + String paramJson = JSONObject.toJSONString(map); + StringEntity stringEntity = new StringEntity(paramJson, ContentType.create("application/json", "UTF-8")); + + post.setEntity(stringEntity); + } + + public static void formParams(Map map, HttpGetWithEntity post, String chartSet) throws UnsupportedEncodingException { + List nameValuePairs = new ArrayList(); + if (map != null) { + Iterator var4 = map.entrySet().iterator(); + + while (var4.hasNext()) { + Map.Entry entry = (Map.Entry) var4.next(); + nameValuePairs.add(new BasicNameValuePair((String) entry.getKey(), (String) entry.getValue())); + } + } + + post.setEntity(new UrlEncodedFormEntity(nameValuePairs, chartSet)); + } +} \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/util/AvUtil.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/util/AvUtil.java new file mode 100644 index 0000000..9575627 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/util/AvUtil.java @@ -0,0 +1,171 @@ +package com.casic.missiles.modular.device.util; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.TypeReference; +import com.casic.missiles.modular.device.dto.AvDeviceDTO; +import com.casic.missiles.modular.device.dto.AvPageResponse; +import com.casic.missiles.modular.device.dto.DeviceRelationshipDTO; +import com.casic.missiles.modular.device.dto.page.AvPageRequest; +import com.casic.missiles.modular.device.dto.stream.StreamRequestDTO; +import com.casic.missiles.modular.device.enums.AvUrlEnums; +import com.casic.missiles.modular.device.http.AvDefaultHttpHeaderHandler; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 艾薇对接工具类 + */ +public class AvUtil { + private static final Logger logger = LoggerFactory.getLogger(AvUtil.class); + + /** + * 设备列表读取 + * + * @param baseUrl av流媒体地址 + * @param token 认证令牌 + * @param pageRequest 请求体 + * @return + */ + public static List selectDevices(String baseUrl, String token, AvPageRequest pageRequest) { + AvDefaultHttpHeaderHandler dcDefaultHttpHeaderHandler = new AvDefaultHttpHeaderHandler(); + dcDefaultHttpHeaderHandler.setJson(true); + Map param = new HashMap<>(); + param.put("page", pageRequest.getPage() + ""); + param.put("paging", pageRequest.getPaging() + ""); + param.put("limit", "100000"); + param.put("token", token); + String res = AvHttpUtils.sendGet(baseUrl + AvUrlEnums.DEVICE.getUrl(), param, token, dcDefaultHttpHeaderHandler); + logger.info("selectDevices:{}", res); + if (StrUtil.isEmpty(res)) { + logger.error("av device sync error!"); + } + AvPageResponse deviceDTOS = JSON.parseObject(res, new TypeReference() { + }); + return deviceDTOS.getItems(); + } + + /** + * 创建流 + * + * @param baseUrl av流媒体地址 + * @param token 认证令牌 + * @param streamRequestDTO 请求体 + * @return + */ + public static Object selectStreams(String baseUrl, String token, StreamRequestDTO streamRequestDTO) { + + Map param = new HashMap<>(); + param.put("device_id", streamRequestDTO.getDevice_id() + ""); + param.put("stream_type", streamRequestDTO.getStream_type() + ""); + param.put("quality", streamRequestDTO.getQuality() + ""); + param.put("token", token); + param.put("from", streamRequestDTO.getFrom() + ""); + param.put("to", streamRequestDTO.getTo() + ""); + logger.info("url:{}", baseUrl + AvUrlEnums.STREAM.getUrl()); + AvDefaultHttpHeaderHandler dcDefaultHttpHeaderHandler = new AvDefaultHttpHeaderHandler(); + dcDefaultHttpHeaderHandler.setJson(true); + String res = AvHttpUtils.sendPost(baseUrl + AvUrlEnums.STREAM.getUrl(), param, token, dcDefaultHttpHeaderHandler); + + if (StrUtil.isEmpty(res)) { + logger.error("av stream error:{}", streamRequestDTO.getDevice_id()); + return null; + } + return JSON.parseObject(res); + } + + /** + * 发送心跳 + * + * @param avUrl + * @param avToken + * @return + */ + public static Object dict(String avUrl, String avToken) { + AvDefaultHttpHeaderHandler dcDefaultHttpHeaderHandler = new AvDefaultHttpHeaderHandler(); + dcDefaultHttpHeaderHandler.setJson(true); + Map param = new HashMap<>(); + String res = AvHttpUtils.sendGet(avUrl + AvUrlEnums.DICT.getUrl(), param, avToken, dcDefaultHttpHeaderHandler); + logger.info("av dict:{}", res); + return null; + } + + /** + * 发送心跳 + * + * @param avUrl + * @param avToken + * @param id + * @return + */ + public static Object heart(String avUrl, String avToken, String id) { + AvDefaultHttpHeaderHandler dcDefaultHttpHeaderHandler = new AvDefaultHttpHeaderHandler(); + dcDefaultHttpHeaderHandler.setJson(true); + Map param = new HashMap<>(); +// param.put("id", id); +// param.put("token", avToken); + String res = AvHttpUtils.sendGet(avUrl + String.format(AvUrlEnums.HEART.getUrl(), id), param, avToken, dcDefaultHttpHeaderHandler); + if (StrUtil.isEmpty(res)) { + logger.error("av heart error:{}", id); + return null; + } + return JSON.parseObject(res); + } + + /** + * 停止流 + * + * @param avUrl 艾薇流媒体地址 + * @param avToken 认证令牌 + * @param id 国标ID + * @return + */ + public static Object stopStreams(String avUrl, String avToken, String id) { + AvDefaultHttpHeaderHandler dcDefaultHttpHeaderHandler = new AvDefaultHttpHeaderHandler(); + dcDefaultHttpHeaderHandler.setJson(true); + Map param = new HashMap<>(); + //param.put("id", id); + String res = AvHttpUtils.sendDelete(avUrl + String.format(AvUrlEnums.STREAM_STOP.getUrl(), id), param, avToken, dcDefaultHttpHeaderHandler); + + if (StrUtil.isEmpty(res)) { + logger.error("av stopStreams error:{}", id); + return null; + } + return JSON.parseObject(res); + } + + /** + * 用户设备关系 + * + * @param avUrl 艾薇流媒体地址 + * @param avToken 认证令牌 + * @return + */ + public static List userDeviceRelationships(String avUrl, String avToken) { + + AvDefaultHttpHeaderHandler avDefaultHttpHeaderHandler = new AvDefaultHttpHeaderHandler(); + avDefaultHttpHeaderHandler.setJson(true); + Map param = new HashMap<>(); + String res = AvHttpUtils.sendGetJson(avUrl + AvUrlEnums.USER_DEVICE_RELATION.getUrl(), param, avToken, avDefaultHttpHeaderHandler); + if (StrUtil.isEmpty(res)) { + logger.error("av userDeviceRelationships error"); + return null; + } + + List deviceDTOS = JSON.parseObject(res, new TypeReference>() { + }); + if (CollectionUtil.isNotEmpty(deviceDTOS)) { + for (DeviceRelationshipDTO deviceDTO : deviceDTOS) { + if (StrUtil.isNotEmpty(deviceDTO.getDevice_list())) { + deviceDTO.setDeviceList(StrUtil.split(deviceDTO.getDevice_list(), ",")); + } + } + } + return deviceDTOS; + } +} \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/task/AvTask.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/task/AvTask.java new file mode 100644 index 0000000..46ccc41 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/task/AvTask.java @@ -0,0 +1,46 @@ +package com.casic.missiles.modular.task; + +import com.casic.missiles.modular.device.service.IAvSyncService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +@Slf4j +@Component +public class AvTask { + + @Resource + private IAvSyncService deviceStatusService; + @Value("${casic.video.av.open:-1}") + private Boolean open; + @Value("${casic.video.av.token:-1}") + private String token; + + /** + * 设备信息同步0 + * 每30分钟采集一次 + */ + @Scheduled(cron = "${casic.video.av.deviceCorn}") + public void device() { + //更新组织机构信息 + log.info("av sdk 设备信息同步"); + if (open) { + deviceStatusService.syncDcDevices(token); + } + log.info("av sdk 设备同步结束"); + } + + @Scheduled(cron = "${casic.video.av.deviceStatusCorn}") + public void deviceRefreshToken() { + //更新组织机构信息 + log.info("av 设备状态刷新"); + if (open) { + deviceStatusService.loadUserDeviceRelationships(); + } + + log.info("av 设备状态刷新"); + } +} \ No newline at end of file diff --git a/README.md b/README.md index 430796e..8dbc9a5 100644 --- a/README.md +++ b/README.md @@ -9,3 +9,7 @@ #### 其他 >* [git地址](http://192.168.0.203:8080/gitbucket) >* [本地免登地址](http://localhost:8083/route/mockToken) + +AView 对接问题 +1.用户设备关联关系 + 对应返回 device_list是否为设备国标号 \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/pom.xml b/casic-device-sync/casic-device-aview/pom.xml index 0a3c5fa..94fb9e5 100644 --- a/casic-device-sync/casic-device-aview/pom.xml +++ b/casic-device-sync/casic-device-aview/pom.xml @@ -33,6 +33,21 @@ ${boot.version} provided + + com.casic + casic-http + ${core.version} + + + com.casic + casic-admin-group + ${admin.version} + + + com.casic + casic-server + ${pro.version} + diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java new file mode 100644 index 0000000..195cba2 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.device.controller; + +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import com.casic.missiles.modular.device.dto.stream.StreamRequestDTO; +import com.casic.missiles.modular.device.service.IAvSyncService; +import io.swagger.annotations.Api; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +@Api(tags = "AV平台代理接口") +@RestController +@RequestMapping("/route") +public class AvRouteController { + @Resource + private IAvSyncService avSyncService; + + @PostMapping("/open/v1/api/streams") + public Object streams(@RequestBody StreamRequestDTO requestDTO) { + Object object = avSyncService.getStreams(requestDTO); + if (object == null) { + ResponseDataDTO respDTO = ResponseDataDTO.error("流读取失败,请稍后重试!"); + respDTO.setMessage("流读取失败,请稍后重试!"); + return respDTO; + } + return ResponseDataDTO.success(avSyncService.getStreams(requestDTO)); + } + + @DeleteMapping("/open/v1/api/streams/{id}") + public Object stopStreams(@PathVariable("id") String id) { + Object object = avSyncService.stopStreams(id); + return ResponseDataDTO.success(object); + } + + @PostMapping("/open/v1/api/streams/{id}/heart") + public Object heart(@PathVariable("id") String id) { + Object object = avSyncService.heart(id); + if (object == null) { + ResponseDataDTO respDTO = ResponseDataDTO.error("流心跳失败,请稍后重试!"); + respDTO.setMessage("流心跳失败,请稍后重试!"); + return respDTO; + } + return ResponseDataDTO.success(object); + } +} \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java new file mode 100644 index 0000000..97bde9f --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java @@ -0,0 +1,49 @@ +package com.casic.missiles.modular.device.dto; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; + +/** + * 艾薇设备对象DTO + */ +@Data +public class AvDeviceDTO { + // 设备ID + private Long id; + + // 设备名称 + private String name; + + // 设备唯一国标序列号 + private String sn; + + // 设备类型 + private Integer type; + + // 设备版本号 + private String version; + + // 安全等级 + @JSONField(name = "secure_level") + private String secureLevel; + + // 设备状态 + private Integer status; + + // 云台类型 + private Integer ptzType; + + // 朝向 + private Integer orientation; + + // 创建时间 + @JSONField(name = "gmt_created") + private String gmtCreated; + + // 修改时间 + @JSONField(name = "gmt_modified") + private String gmtModified; + + // 数据状态 + private Integer state; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java new file mode 100644 index 0000000..9a05183 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java @@ -0,0 +1,10 @@ +package com.casic.missiles.modular.device.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class AvPageResponse { + private List items; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java new file mode 100644 index 0000000..098dda4 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.device.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class DeviceRelationshipDTO { + private Long user_id; + private String device_list; + private List deviceList; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java new file mode 100644 index 0000000..74e6a9b --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java @@ -0,0 +1,9 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +@Data +public class AvPageRep { + private Integer total; + private T list; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java new file mode 100644 index 0000000..900ae4a --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +/** + * 分页请求DTO + */ +@Data +public class AvPageRequest { + private int page; + private int paging; + private int limit; + +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java new file mode 100644 index 0000000..f1c1e7a --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +/** + * mvp返回基类封装 + * + * @param + */ +@Data +public class AvResponseDTO { + private T data; + private Integer code; + private String msg; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamRequestDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamRequestDTO.java new file mode 100644 index 0000000..69e88ce --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamRequestDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.device.dto.stream; + +import lombok.Data; + +@Data +public class StreamRequestDTO { + private String device_id; + private String stream_type; + private String quality; + private int from; + private int to; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamStopRequestDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamStopRequestDTO.java new file mode 100644 index 0000000..9cf94b1 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamStopRequestDTO.java @@ -0,0 +1,11 @@ +package com.casic.missiles.modular.device.dto.stream; + +import lombok.Data; + +@Data +public class StreamStopRequestDTO { + private String id; + private String type; + private StreamRequestDTO request; + private String url; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvDataStateEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvDataStateEnum.java new file mode 100644 index 0000000..e1a6658 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvDataStateEnum.java @@ -0,0 +1,72 @@ +package com.casic.missiles.modular.device.enums; + +/** + * 数据状态 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvDataStateEnum { + + TYPE0(0, "有效",0), + DEL(1, "无效",1); + + Integer code; + String message; + Integer type; + AvDataStateEnum(Integer code, String message, Integer type) { + this.code = code; + this.message = message; + this.type = type; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public static String valueOfs(Integer value) { + if (value == null) { + return ""; + } else { + for (AvDataStateEnum ms : AvDataStateEnum.values()) { + if (ms.getCode().equals(value)) { + return ms.getMessage(); + } + } + return ""; + } + } + + public static AvDataStateEnum valueOfType(Integer value) { + if (value == null) { + return TYPE0; + } else { + for (AvDataStateEnum ms : AvDataStateEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return TYPE0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvPtzTypeEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvPtzTypeEnum.java new file mode 100644 index 0000000..fdcb08d --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvPtzTypeEnum.java @@ -0,0 +1,73 @@ +package com.casic.missiles.modular.device.enums; + +/** + * wvp设备类型转换 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvPtzTypeEnum { + + TYPE0(0, "枪机",0), + TYPE1(1, "半球",1), + TYPE2(2, "球机",2); + + Integer code; + String message; + Integer type; + AvPtzTypeEnum(Integer code, String message, Integer type) { + this.code = code; + this.message = message; + this.type = type; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public static String valueOfs(Integer value) { + if (value == null) { + return ""; + } else { + for (AvPtzTypeEnum ms : AvPtzTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms.getMessage(); + } + } + return ""; + } + } + + public static AvPtzTypeEnum valueOfType(Integer value) { + if (value == null) { + return TYPE0; + } else { + for (AvPtzTypeEnum ms : AvPtzTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return TYPE0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvSecretLevelEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvSecretLevelEnum.java new file mode 100644 index 0000000..39e8524 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvSecretLevelEnum.java @@ -0,0 +1,60 @@ +package com.casic.missiles.modular.device.enums; + +/** + * Av主数据密集对应关系枚举 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvSecretLevelEnum { + s("999", "未定密", 999, "未定密"), + s0("0", "公开", 0, "公开"), + s1("1", "内部", 1, "内部"), + s2("2", "秘密", 2, "秘密"), + s3("3", "机密", 3, "机密"); + + String code; + Integer currCode; + String message; + String currMsg; + + AvSecretLevelEnum(String code, String message, Integer currCode, String currMsg) { + this.code = code; + this.currCode = currCode; + this.message = message; + this.currMsg = currMsg; + } + + public Integer getCurrCode() { + return currCode; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public static AvSecretLevelEnum valueOfCode(String value) { + if (value == null) { + return s0; + } else { + for (AvSecretLevelEnum ms : AvSecretLevelEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return s0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvStatusTypeEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvStatusTypeEnum.java new file mode 100644 index 0000000..ddccd52 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvStatusTypeEnum.java @@ -0,0 +1,72 @@ +package com.casic.missiles.modular.device.enums; + +/** + * wvp设备类型转换 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvStatusTypeEnum { + + TYPE0(0, "离线",0), + TYPE1(1, "在线",1); + + Integer code; + String message; + Integer type; + AvStatusTypeEnum(Integer code, String message, Integer type) { + this.code = code; + this.message = message; + this.type = type; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public static String valueOfs(Integer value) { + if (value == null) { + return ""; + } else { + for (AvStatusTypeEnum ms : AvStatusTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms.getMessage(); + } + } + return ""; + } + } + + public static AvStatusTypeEnum valueOfType(Integer value) { + if (value == null) { + return TYPE0; + } else { + for (AvStatusTypeEnum ms : AvStatusTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return TYPE0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvUrlEnums.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvUrlEnums.java new file mode 100644 index 0000000..04b38ad --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvUrlEnums.java @@ -0,0 +1,37 @@ +package com.casic.missiles.modular.device.enums; + +/** + * 设备媒体 + */ +public enum AvUrlEnums { + DEVICE("/open/v1/api/devices","设备信息查询"), + STREAM("/open/v1/api/streams","创建流"), + STREAM_STOP("/open/v1/api/streams/%s","停止流"), + HEART("/open/v1/api/streams/%s/heartbeat","发送心跳"), + DICT("/open/v1/api/dictionary_datas","字典查询"), + USER_DEVICE_RELATION("/open/v1/api/user_device_relationships","用户设备关联关系"); + + private String url; + private String name; + + AvUrlEnums(String url, String name) { + this.url = url; + this.name = name; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/AvDefaultHttpHeaderHandler.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/AvDefaultHttpHeaderHandler.java new file mode 100644 index 0000000..53f0a5c --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/AvDefaultHttpHeaderHandler.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.device.http; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.modular.system.handler.DefaultHttpHeaderHandler; +import org.apache.http.client.methods.HttpRequestBase; + +public class AvDefaultHttpHeaderHandler extends DefaultHttpHeaderHandler { + public void setHeader(HttpRequestBase base, String token) { + base.addHeader("Content-type", DEFAULT_CONTEXTTYPE); + if (StrUtil.isNotEmpty(token)) { + base.addHeader("X-OApi-Token", token); + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/HttpGetWithEntity.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/HttpGetWithEntity.java new file mode 100644 index 0000000..b8abf8f --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/HttpGetWithEntity.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.device.http; + +import org.apache.http.client.methods.HttpEntityEnclosingRequestBase; + +import java.net.URI; + +public class HttpGetWithEntity extends HttpEntityEnclosingRequestBase { + + public HttpGetWithEntity(URI uri) { + this.setURI(uri); + } + + public HttpGetWithEntity(String uri) { + this.setURI(URI.create(uri)); + } + + public String getMethod() { + return "GET"; + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/IAvSyncService.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/IAvSyncService.java new file mode 100644 index 0000000..13c3203 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/IAvSyncService.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.device.service; + +import com.casic.missiles.modular.device.dto.stream.StreamRequestDTO; + +public interface IAvSyncService { + /** + * Dc706设备信息同步 + */ + void syncDcDevices(String token); + + /** + * 创建流 + * + * @param streamRequestDTO + * @return + */ + Object getStreams(StreamRequestDTO streamRequestDTO); + + /** + * 停止流 + * + * @param id + * @return + */ + Object stopStreams(String id); + + /** + * 发送心跳 + * + * @param id 设备国标号 + * @return + */ + Object heart(String id); + + /** + * 设备权限更新 + */ + void loadUserDeviceRelationships(); +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/impl/AvSyncServiceImpl.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/impl/AvSyncServiceImpl.java new file mode 100644 index 0000000..25e3340 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/impl/AvSyncServiceImpl.java @@ -0,0 +1,179 @@ +package com.casic.missiles.modular.device.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.casic.missiles.core.application.service.AbstractUserService; +import com.casic.missiles.modular.device.dto.AvDeviceDTO; +import com.casic.missiles.modular.device.dto.DeviceRelationshipDTO; +import com.casic.missiles.modular.device.dto.page.AvPageRequest; +import com.casic.missiles.modular.device.dto.stream.StreamRequestDTO; +import com.casic.missiles.modular.device.enums.AvDataStateEnum; +import com.casic.missiles.modular.device.enums.AvPtzTypeEnum; +import com.casic.missiles.modular.device.enums.AvSecretLevelEnum; +import com.casic.missiles.modular.device.enums.AvStatusTypeEnum; +import com.casic.missiles.modular.device.model.BusDeviceInfo; +import com.casic.missiles.modular.device.service.IAvSyncService; +import com.casic.missiles.modular.device.service.IBusDeviceInfoService; +import com.casic.missiles.modular.device.service.ISysGroupDeviceService; +import com.casic.missiles.modular.device.util.AvUtil; +import com.casic.missiles.modular.system.model.SysUserGroup; +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.modular.system.service.ISysUserGroupService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; +@Slf4j +@Service +public class AvSyncServiceImpl implements IAvSyncService { + @Value("${casic.video.av.url:-1}") + private String avUrl; + @Value("${casic.video.av.token:-1}") + private String avToken; + @Resource + private IBusDeviceInfoService deviceInfoService; + @Resource + private AbstractUserService abstractUserService; + + @Resource + private ISysUserGroupService userGroupService; + @Resource + private ISysGroupDeviceService sysGroupDeviceService; + + @Override + public void syncDcDevices(String token) { + AvPageRequest avPageRequest = new AvPageRequest(); + avPageRequest.setPage(1); + avPageRequest.setPaging(1); + + //全量查询设备信息 + List deviceDTOS = AvUtil.selectDevices(avUrl, token, avPageRequest); + + if (CollectionUtil.isNotEmpty(deviceDTOS)) { + for (AvDeviceDTO dcDeviceDTO : deviceDTOS) { + BusDeviceInfo busDeviceInfo = this.convertDevice(dcDeviceDTO); + + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(BusDeviceInfo::getCameraIndexCode, dcDeviceDTO.getSn()); + this.deviceInfoService.saveOrUpdate(busDeviceInfo, query); + } + + List deviceSns = deviceDTOS.stream().filter(dto -> AvDataStateEnum.DEL.equals(dto.getState())).map(AvDeviceDTO::getSn).collect(Collectors.toList()); + + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.in(BusDeviceInfo::getCameraIndexCode, deviceSns); + if (CollectionUtil.isNotEmpty(deviceSns)) { + this.deviceInfoService.remove(query); + } + } + +// AvUtil.dict(avUrl,avToken); + } + + /** + * 流地址请求 + * + * @param streamRequestDTO + * @return + */ + @Override + public Object getStreams(StreamRequestDTO streamRequestDTO) { + return AvUtil.selectStreams(avUrl, avToken, streamRequestDTO); + } + + @Override + public Object stopStreams(String id) { + return AvUtil.stopStreams(avUrl, avToken, id); + } + + @Override + public Object heart(String id) { + return AvUtil.heart(avUrl, avToken, id); + } + + @Transactional + @Override + public void loadUserDeviceRelationships() { + + List relationshipDTOS = AvUtil.userDeviceRelationships(avUrl, avToken); + log.info("loadUserDeviceRelationships: {}", relationshipDTOS); + + for (DeviceRelationshipDTO relationshipDTO : relationshipDTOS) { + + //检索用户信息 + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(User::getSyncId, relationshipDTO.getUser_id()); + List users = abstractUserService.list(query); + + if (users != null&&users.size() > 0) { + User user = users.get(0); + //创建用户组 + LambdaQueryWrapper groupQuery = new LambdaQueryWrapper<>(); + String groupName = user.getName() + user.getId(); + groupQuery.eq(SysUserGroup::getGroupName, groupName); + SysUserGroup sysUserGroup = userGroupService.getOne(groupQuery); + + if (sysUserGroup == null) { + sysUserGroup = genSysUserGroup(groupName, user); + List userIds = new ArrayList<>(); + userIds.add(user.getId()); + userGroupService.createSysUserGroup(sysUserGroup, userIds); + } + + LambdaQueryWrapper deviceQuery = new LambdaQueryWrapper<>(); + deviceQuery.in(BusDeviceInfo::getCameraIndexCode, relationshipDTO.getDeviceList()); + List busDeviceInfos = deviceInfoService.list(deviceQuery); + + if (CollectionUtil.isNotEmpty(busDeviceInfos)) { + List list = busDeviceInfos.stream().map(BusDeviceInfo::getId).collect(Collectors.toList()); + sysGroupDeviceService.batchIncremental(sysUserGroup.getId(), list); + } + + }else{ + log.error("loadUserDeviceRelationships is empty: {}", relationshipDTO.getUser_id()); + } + } + } + + private SysUserGroup genSysUserGroup(String groupName, User user) { + SysUserGroup sysUserGroup = new SysUserGroup(); + sysUserGroup.setGroupName(groupName); + sysUserGroup.setCreateTime(new Date()); + sysUserGroup.setCreateId(user.getId()); + sysUserGroup.setDeptId(user.getDeptId()); + sysUserGroup.setDescription("默认创建分组,不可修改!"); + sysUserGroup.setSafe(0); + return sysUserGroup; + } + + /** + * 设备类型数据转换 + * + * @param dto 艾薇设备信息 + * @return + */ + private BusDeviceInfo convertDevice(AvDeviceDTO dto) { + BusDeviceInfo info = new BusDeviceInfo(); + info.setCreateTime(new Date()); + info.setUpdateTime(new Date()); + + //转换为本地密级编码 + info.setSecretLevel(AvSecretLevelEnum.valueOfCode(dto.getSecureLevel()).getCurrCode()); + + info.setDeviceStatus(AvStatusTypeEnum.valueOfType(dto.getStatus()).getType()); + info.setCameraIndexCode(dto.getSn()); + info.setMonitorName(dto.getName()); + + //PTZ type类型 + info.setDeviceType(AvPtzTypeEnum.valueOfType(dto.getPtzType()).getType() + ""); + info.setBfFlag(0); + + return info; + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/util/AvHttpUtils.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/util/AvHttpUtils.java new file mode 100644 index 0000000..083d88a --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/util/AvHttpUtils.java @@ -0,0 +1,331 @@ +package com.casic.missiles.modular.device.util; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.modular.device.http.HttpGetWithEntity; +import com.casic.missiles.modular.system.handler.DefaultHttpHeaderHandler; +import org.apache.http.NameValuePair; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpDelete; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.util.EntityUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +public class AvHttpUtils { + + public static String sendGetJson(String url, Map param, String token, DefaultHttpHeaderHandler handler) { + try { + StringBuffer query = new StringBuffer(); + String var14 = sendGetEntityData(url, handler.getChartSet(), param, token, handler); + return var14; + } catch (Exception var10) { + Exception e = var10; + e.printStackTrace(); + System.out.println("发送GET请求出现异常!" + e); + return ""; + } finally { + ; + } + } + public static String sendGet(String url, Map param, String token, DefaultHttpHeaderHandler handler) { + try { + StringBuffer query = new StringBuffer(); + Iterator var5 = param.entrySet().iterator(); + + while(var5.hasNext()) { + Map.Entry kv = (Map.Entry)var5.next(); + query.append(URLEncoder.encode((String)kv.getKey(), handler.getChartSet()) + "="); + query.append(URLEncoder.encode((String)kv.getValue(), handler.getChartSet()) + "&"); + } + + if (query.lastIndexOf("&") > 0) { + query.deleteCharAt(query.length() - 1); + } + + String urlNameString = url + "?" + query.toString(); + String var14 = sendGetData(urlNameString, handler.getChartSet(), token, handler); + return var14; + } catch (Exception var10) { + Exception e = var10; + e.printStackTrace(); + System.out.println("发送GET请求出现异常!" + e); + return ""; + } finally { + ; + } + } + public static String sendPost(String url, Map param, String token, DefaultHttpHeaderHandler httpHeaderHandler) { + return sendPostDataByMap(url, param, "utf8", token, httpHeaderHandler); + } + public static String sendPostDataByMap(String url, Map map, String encoding, String token, DefaultHttpHeaderHandler httpHeaderHandler) { + String result = ""; + CloseableHttpResponse response = null; + CloseableHttpClient httpClient = null; + HttpPost httpPost = null; + + try { + httpClient = HttpClients.createDefault(); + httpPost = new HttpPost(url); + httpPost.setHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)"); + httpHeaderHandler.setHeader(httpPost, token); + if (httpHeaderHandler.isJson()) { + jsonParams(map, httpPost); + } else { + formParams(map, httpPost, httpHeaderHandler.getChartSet()); + } + + response = httpClient.execute(httpPost); + if (response.getStatusLine().getStatusCode() == 200) { + result = EntityUtils.toString(response.getEntity(), httpHeaderHandler.getChartSet()); + } + } catch (Exception var22) { + Exception e = var22; + System.out.println("发送GET请求出现异常!" + e); + e.printStackTrace(); + } finally { + IOException e; + try { + if (response != null) { + response.close(); + } + + httpPost.releaseConnection(); + httpClient.close(); + } catch (IOException var21) { + e = var21; + e.printStackTrace(); + } + + if (httpClient != null) { + try { + httpClient.close(); + } catch (IOException var20) { + e = var20; + e.printStackTrace(); + } + } + + } + + return result; + } + public static String sendGetData(String url, String encoding, String token, DefaultHttpHeaderHandler httpHeaderHandler) { + String result = ""; + CloseableHttpResponse response = null; + if (httpHeaderHandler == null) { + httpHeaderHandler = new DefaultHttpHeaderHandler(); + } + + CloseableHttpClient httpClient = null; + + try { + httpClient = HttpClients.createDefault(); + HttpGet httpGet = new HttpGet(url); + httpHeaderHandler.setHeader(httpGet, token); + response = httpClient.execute(httpGet); + if (response.getStatusLine().getStatusCode() == 200) { + result = EntityUtils.toString(response.getEntity(), encoding); + } + } catch (Exception var20) { + Exception e = var20; + e.printStackTrace(); + System.out.println("发送GET请求出现异常!" + e); + } finally { + IOException e; + if (response != null) { + try { + response.close(); + } catch (IOException var19) { + e = var19; + e.printStackTrace(); + } + } + + if (httpClient != null) { + try { + httpClient.close(); + } catch (IOException var18) { + e = var18; + e.printStackTrace(); + } + } + + } + + return result; + } + public static String sendGetEntityData(String url, String encoding, Map param, String token, DefaultHttpHeaderHandler httpHeaderHandler) { + String result = ""; + CloseableHttpResponse response = null; + if (httpHeaderHandler == null) { + httpHeaderHandler = new DefaultHttpHeaderHandler(); + } + CloseableHttpClient httpClient =null; + try { + httpClient = HttpClients.createDefault(); + HttpGetWithEntity httpGet = new HttpGetWithEntity(url); + httpHeaderHandler.setHeader(httpGet, token); + if (httpHeaderHandler.isJson()) { + jsonParams(param, httpGet); + } else { + formParams(param, httpGet, httpHeaderHandler.getChartSet()); + } + response = httpClient.execute(httpGet); + if (response.getStatusLine().getStatusCode() == 200) { + result = EntityUtils.toString(response.getEntity(), encoding); + } + } catch (Exception var16) { + Exception e = var16; + e.printStackTrace(); + System.out.println("发送GET请求出现异常!" + e); + } finally { + if (response != null) { + try { + response.close(); + } catch (IOException var15) { + IOException e = var15; + e.printStackTrace(); + } + } + if (httpClient != null) { + try { + httpClient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + } + + return result; + } + + public static String sendDelete(String url, Map param, String token, DefaultHttpHeaderHandler handler) { + try { + StringBuffer query = new StringBuffer(); + Iterator var5 = param.entrySet().iterator(); + + while (var5.hasNext()) { + Map.Entry kv = (Map.Entry) var5.next(); + query.append(URLEncoder.encode((String) kv.getKey(), handler.getChartSet()) + "="); + query.append(URLEncoder.encode((String) kv.getValue(), handler.getChartSet()) + "&"); + } + + if (query.lastIndexOf("&") > 0) { + query.deleteCharAt(query.length() - 1); + } + String urlNameString = url + "?" + query.toString(); + String var14 = sendDeleteData(urlNameString, handler.getChartSet(), token, handler); + return var14; + } catch (Exception var10) { + Exception e = var10; + e.printStackTrace(); + System.out.println("发送GET请求出现异常!" + e); + return ""; + } finally { + ; + } + } + private static final Logger logger = LoggerFactory.getLogger(AvUtil.class); + /** + * http 请求 + * + * @param url + * @param encoding + * @param token + * @param httpHeaderHandler + * @return + */ + public static String sendDeleteData(String url, String encoding, String token, DefaultHttpHeaderHandler httpHeaderHandler) { + String result = ""; + CloseableHttpResponse response = null; + if (httpHeaderHandler == null) { + httpHeaderHandler = new DefaultHttpHeaderHandler(); + } + CloseableHttpClient httpClient = null; + try { + httpClient = HttpClients.createDefault(); + HttpDelete httpGet = new HttpDelete(url); + httpHeaderHandler.setHeader(httpGet, token); + response = httpClient.execute(httpGet); + if (response.getStatusLine().getStatusCode() == 200) { + logger.info("----------------------------------:"+EntityUtils.toString(response.getEntity(), encoding)); + result = EntityUtils.toString(response.getEntity(), encoding); + } + } catch (Exception var16) { + Exception e = var16; + e.printStackTrace(); + } finally { + if (response != null) { + try { + response.close(); + } catch (IOException var15) { + IOException e = var15; + e.printStackTrace(); + } + } + if (httpClient != null) { + try { + httpClient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return result; + } + public static void jsonParams(Map map, HttpPost post) { + String paramJson = JSONObject.toJSONString(map); + StringEntity stringEntity = new StringEntity(paramJson, ContentType.create("application/json", "UTF-8")); + post.setEntity(stringEntity); + } + + public static void formParams(Map map, HttpPost post, String chartSet) throws UnsupportedEncodingException { + List nameValuePairs = new ArrayList(); + if (map != null) { + Iterator var4 = map.entrySet().iterator(); + + while(var4.hasNext()) { + Map.Entry entry = (Map.Entry)var4.next(); + nameValuePairs.add(new BasicNameValuePair((String)entry.getKey(), (String)entry.getValue())); + } + } + + post.setEntity(new UrlEncodedFormEntity(nameValuePairs, chartSet)); + } + public static void jsonParams(Map map, HttpGetWithEntity post) { + String paramJson = JSONObject.toJSONString(map); + StringEntity stringEntity = new StringEntity(paramJson, ContentType.create("application/json", "UTF-8")); + + post.setEntity(stringEntity); + } + + public static void formParams(Map map, HttpGetWithEntity post, String chartSet) throws UnsupportedEncodingException { + List nameValuePairs = new ArrayList(); + if (map != null) { + Iterator var4 = map.entrySet().iterator(); + + while (var4.hasNext()) { + Map.Entry entry = (Map.Entry) var4.next(); + nameValuePairs.add(new BasicNameValuePair((String) entry.getKey(), (String) entry.getValue())); + } + } + + post.setEntity(new UrlEncodedFormEntity(nameValuePairs, chartSet)); + } +} \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/util/AvUtil.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/util/AvUtil.java new file mode 100644 index 0000000..9575627 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/util/AvUtil.java @@ -0,0 +1,171 @@ +package com.casic.missiles.modular.device.util; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.TypeReference; +import com.casic.missiles.modular.device.dto.AvDeviceDTO; +import com.casic.missiles.modular.device.dto.AvPageResponse; +import com.casic.missiles.modular.device.dto.DeviceRelationshipDTO; +import com.casic.missiles.modular.device.dto.page.AvPageRequest; +import com.casic.missiles.modular.device.dto.stream.StreamRequestDTO; +import com.casic.missiles.modular.device.enums.AvUrlEnums; +import com.casic.missiles.modular.device.http.AvDefaultHttpHeaderHandler; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 艾薇对接工具类 + */ +public class AvUtil { + private static final Logger logger = LoggerFactory.getLogger(AvUtil.class); + + /** + * 设备列表读取 + * + * @param baseUrl av流媒体地址 + * @param token 认证令牌 + * @param pageRequest 请求体 + * @return + */ + public static List selectDevices(String baseUrl, String token, AvPageRequest pageRequest) { + AvDefaultHttpHeaderHandler dcDefaultHttpHeaderHandler = new AvDefaultHttpHeaderHandler(); + dcDefaultHttpHeaderHandler.setJson(true); + Map param = new HashMap<>(); + param.put("page", pageRequest.getPage() + ""); + param.put("paging", pageRequest.getPaging() + ""); + param.put("limit", "100000"); + param.put("token", token); + String res = AvHttpUtils.sendGet(baseUrl + AvUrlEnums.DEVICE.getUrl(), param, token, dcDefaultHttpHeaderHandler); + logger.info("selectDevices:{}", res); + if (StrUtil.isEmpty(res)) { + logger.error("av device sync error!"); + } + AvPageResponse deviceDTOS = JSON.parseObject(res, new TypeReference() { + }); + return deviceDTOS.getItems(); + } + + /** + * 创建流 + * + * @param baseUrl av流媒体地址 + * @param token 认证令牌 + * @param streamRequestDTO 请求体 + * @return + */ + public static Object selectStreams(String baseUrl, String token, StreamRequestDTO streamRequestDTO) { + + Map param = new HashMap<>(); + param.put("device_id", streamRequestDTO.getDevice_id() + ""); + param.put("stream_type", streamRequestDTO.getStream_type() + ""); + param.put("quality", streamRequestDTO.getQuality() + ""); + param.put("token", token); + param.put("from", streamRequestDTO.getFrom() + ""); + param.put("to", streamRequestDTO.getTo() + ""); + logger.info("url:{}", baseUrl + AvUrlEnums.STREAM.getUrl()); + AvDefaultHttpHeaderHandler dcDefaultHttpHeaderHandler = new AvDefaultHttpHeaderHandler(); + dcDefaultHttpHeaderHandler.setJson(true); + String res = AvHttpUtils.sendPost(baseUrl + AvUrlEnums.STREAM.getUrl(), param, token, dcDefaultHttpHeaderHandler); + + if (StrUtil.isEmpty(res)) { + logger.error("av stream error:{}", streamRequestDTO.getDevice_id()); + return null; + } + return JSON.parseObject(res); + } + + /** + * 发送心跳 + * + * @param avUrl + * @param avToken + * @return + */ + public static Object dict(String avUrl, String avToken) { + AvDefaultHttpHeaderHandler dcDefaultHttpHeaderHandler = new AvDefaultHttpHeaderHandler(); + dcDefaultHttpHeaderHandler.setJson(true); + Map param = new HashMap<>(); + String res = AvHttpUtils.sendGet(avUrl + AvUrlEnums.DICT.getUrl(), param, avToken, dcDefaultHttpHeaderHandler); + logger.info("av dict:{}", res); + return null; + } + + /** + * 发送心跳 + * + * @param avUrl + * @param avToken + * @param id + * @return + */ + public static Object heart(String avUrl, String avToken, String id) { + AvDefaultHttpHeaderHandler dcDefaultHttpHeaderHandler = new AvDefaultHttpHeaderHandler(); + dcDefaultHttpHeaderHandler.setJson(true); + Map param = new HashMap<>(); +// param.put("id", id); +// param.put("token", avToken); + String res = AvHttpUtils.sendGet(avUrl + String.format(AvUrlEnums.HEART.getUrl(), id), param, avToken, dcDefaultHttpHeaderHandler); + if (StrUtil.isEmpty(res)) { + logger.error("av heart error:{}", id); + return null; + } + return JSON.parseObject(res); + } + + /** + * 停止流 + * + * @param avUrl 艾薇流媒体地址 + * @param avToken 认证令牌 + * @param id 国标ID + * @return + */ + public static Object stopStreams(String avUrl, String avToken, String id) { + AvDefaultHttpHeaderHandler dcDefaultHttpHeaderHandler = new AvDefaultHttpHeaderHandler(); + dcDefaultHttpHeaderHandler.setJson(true); + Map param = new HashMap<>(); + //param.put("id", id); + String res = AvHttpUtils.sendDelete(avUrl + String.format(AvUrlEnums.STREAM_STOP.getUrl(), id), param, avToken, dcDefaultHttpHeaderHandler); + + if (StrUtil.isEmpty(res)) { + logger.error("av stopStreams error:{}", id); + return null; + } + return JSON.parseObject(res); + } + + /** + * 用户设备关系 + * + * @param avUrl 艾薇流媒体地址 + * @param avToken 认证令牌 + * @return + */ + public static List userDeviceRelationships(String avUrl, String avToken) { + + AvDefaultHttpHeaderHandler avDefaultHttpHeaderHandler = new AvDefaultHttpHeaderHandler(); + avDefaultHttpHeaderHandler.setJson(true); + Map param = new HashMap<>(); + String res = AvHttpUtils.sendGetJson(avUrl + AvUrlEnums.USER_DEVICE_RELATION.getUrl(), param, avToken, avDefaultHttpHeaderHandler); + if (StrUtil.isEmpty(res)) { + logger.error("av userDeviceRelationships error"); + return null; + } + + List deviceDTOS = JSON.parseObject(res, new TypeReference>() { + }); + if (CollectionUtil.isNotEmpty(deviceDTOS)) { + for (DeviceRelationshipDTO deviceDTO : deviceDTOS) { + if (StrUtil.isNotEmpty(deviceDTO.getDevice_list())) { + deviceDTO.setDeviceList(StrUtil.split(deviceDTO.getDevice_list(), ",")); + } + } + } + return deviceDTOS; + } +} \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/task/AvTask.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/task/AvTask.java new file mode 100644 index 0000000..46ccc41 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/task/AvTask.java @@ -0,0 +1,46 @@ +package com.casic.missiles.modular.task; + +import com.casic.missiles.modular.device.service.IAvSyncService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +@Slf4j +@Component +public class AvTask { + + @Resource + private IAvSyncService deviceStatusService; + @Value("${casic.video.av.open:-1}") + private Boolean open; + @Value("${casic.video.av.token:-1}") + private String token; + + /** + * 设备信息同步0 + * 每30分钟采集一次 + */ + @Scheduled(cron = "${casic.video.av.deviceCorn}") + public void device() { + //更新组织机构信息 + log.info("av sdk 设备信息同步"); + if (open) { + deviceStatusService.syncDcDevices(token); + } + log.info("av sdk 设备同步结束"); + } + + @Scheduled(cron = "${casic.video.av.deviceStatusCorn}") + public void deviceRefreshToken() { + //更新组织机构信息 + log.info("av 设备状态刷新"); + if (open) { + deviceStatusService.loadUserDeviceRelationships(); + } + + log.info("av 设备状态刷新"); + } +} \ No newline at end of file diff --git a/casic-device-sync/casic-device-dc/src/main/java/com/casic/missiles/modular/http/DcDefaultHttpHeaderHandler.java b/casic-device-sync/casic-device-dc/src/main/java/com/casic/missiles/modular/http/DcDefaultHttpHeaderHandler.java index 550b9d4..e3ee94f 100644 --- a/casic-device-sync/casic-device-dc/src/main/java/com/casic/missiles/modular/http/DcDefaultHttpHeaderHandler.java +++ b/casic-device-sync/casic-device-dc/src/main/java/com/casic/missiles/modular/http/DcDefaultHttpHeaderHandler.java @@ -12,4 +12,6 @@ } } + + } diff --git a/README.md b/README.md index 430796e..8dbc9a5 100644 --- a/README.md +++ b/README.md @@ -9,3 +9,7 @@ #### 其他 >* [git地址](http://192.168.0.203:8080/gitbucket) >* [本地免登地址](http://localhost:8083/route/mockToken) + +AView 对接问题 +1.用户设备关联关系 + 对应返回 device_list是否为设备国标号 \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/pom.xml b/casic-device-sync/casic-device-aview/pom.xml index 0a3c5fa..94fb9e5 100644 --- a/casic-device-sync/casic-device-aview/pom.xml +++ b/casic-device-sync/casic-device-aview/pom.xml @@ -33,6 +33,21 @@ ${boot.version} provided + + com.casic + casic-http + ${core.version} + + + com.casic + casic-admin-group + ${admin.version} + + + com.casic + casic-server + ${pro.version} + diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java new file mode 100644 index 0000000..195cba2 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.device.controller; + +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import com.casic.missiles.modular.device.dto.stream.StreamRequestDTO; +import com.casic.missiles.modular.device.service.IAvSyncService; +import io.swagger.annotations.Api; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +@Api(tags = "AV平台代理接口") +@RestController +@RequestMapping("/route") +public class AvRouteController { + @Resource + private IAvSyncService avSyncService; + + @PostMapping("/open/v1/api/streams") + public Object streams(@RequestBody StreamRequestDTO requestDTO) { + Object object = avSyncService.getStreams(requestDTO); + if (object == null) { + ResponseDataDTO respDTO = ResponseDataDTO.error("流读取失败,请稍后重试!"); + respDTO.setMessage("流读取失败,请稍后重试!"); + return respDTO; + } + return ResponseDataDTO.success(avSyncService.getStreams(requestDTO)); + } + + @DeleteMapping("/open/v1/api/streams/{id}") + public Object stopStreams(@PathVariable("id") String id) { + Object object = avSyncService.stopStreams(id); + return ResponseDataDTO.success(object); + } + + @PostMapping("/open/v1/api/streams/{id}/heart") + public Object heart(@PathVariable("id") String id) { + Object object = avSyncService.heart(id); + if (object == null) { + ResponseDataDTO respDTO = ResponseDataDTO.error("流心跳失败,请稍后重试!"); + respDTO.setMessage("流心跳失败,请稍后重试!"); + return respDTO; + } + return ResponseDataDTO.success(object); + } +} \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java new file mode 100644 index 0000000..97bde9f --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java @@ -0,0 +1,49 @@ +package com.casic.missiles.modular.device.dto; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; + +/** + * 艾薇设备对象DTO + */ +@Data +public class AvDeviceDTO { + // 设备ID + private Long id; + + // 设备名称 + private String name; + + // 设备唯一国标序列号 + private String sn; + + // 设备类型 + private Integer type; + + // 设备版本号 + private String version; + + // 安全等级 + @JSONField(name = "secure_level") + private String secureLevel; + + // 设备状态 + private Integer status; + + // 云台类型 + private Integer ptzType; + + // 朝向 + private Integer orientation; + + // 创建时间 + @JSONField(name = "gmt_created") + private String gmtCreated; + + // 修改时间 + @JSONField(name = "gmt_modified") + private String gmtModified; + + // 数据状态 + private Integer state; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java new file mode 100644 index 0000000..9a05183 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java @@ -0,0 +1,10 @@ +package com.casic.missiles.modular.device.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class AvPageResponse { + private List items; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java new file mode 100644 index 0000000..098dda4 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.device.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class DeviceRelationshipDTO { + private Long user_id; + private String device_list; + private List deviceList; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java new file mode 100644 index 0000000..74e6a9b --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java @@ -0,0 +1,9 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +@Data +public class AvPageRep { + private Integer total; + private T list; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java new file mode 100644 index 0000000..900ae4a --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +/** + * 分页请求DTO + */ +@Data +public class AvPageRequest { + private int page; + private int paging; + private int limit; + +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java new file mode 100644 index 0000000..f1c1e7a --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +/** + * mvp返回基类封装 + * + * @param + */ +@Data +public class AvResponseDTO { + private T data; + private Integer code; + private String msg; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamRequestDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamRequestDTO.java new file mode 100644 index 0000000..69e88ce --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamRequestDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.device.dto.stream; + +import lombok.Data; + +@Data +public class StreamRequestDTO { + private String device_id; + private String stream_type; + private String quality; + private int from; + private int to; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamStopRequestDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamStopRequestDTO.java new file mode 100644 index 0000000..9cf94b1 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamStopRequestDTO.java @@ -0,0 +1,11 @@ +package com.casic.missiles.modular.device.dto.stream; + +import lombok.Data; + +@Data +public class StreamStopRequestDTO { + private String id; + private String type; + private StreamRequestDTO request; + private String url; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvDataStateEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvDataStateEnum.java new file mode 100644 index 0000000..e1a6658 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvDataStateEnum.java @@ -0,0 +1,72 @@ +package com.casic.missiles.modular.device.enums; + +/** + * 数据状态 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvDataStateEnum { + + TYPE0(0, "有效",0), + DEL(1, "无效",1); + + Integer code; + String message; + Integer type; + AvDataStateEnum(Integer code, String message, Integer type) { + this.code = code; + this.message = message; + this.type = type; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public static String valueOfs(Integer value) { + if (value == null) { + return ""; + } else { + for (AvDataStateEnum ms : AvDataStateEnum.values()) { + if (ms.getCode().equals(value)) { + return ms.getMessage(); + } + } + return ""; + } + } + + public static AvDataStateEnum valueOfType(Integer value) { + if (value == null) { + return TYPE0; + } else { + for (AvDataStateEnum ms : AvDataStateEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return TYPE0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvPtzTypeEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvPtzTypeEnum.java new file mode 100644 index 0000000..fdcb08d --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvPtzTypeEnum.java @@ -0,0 +1,73 @@ +package com.casic.missiles.modular.device.enums; + +/** + * wvp设备类型转换 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvPtzTypeEnum { + + TYPE0(0, "枪机",0), + TYPE1(1, "半球",1), + TYPE2(2, "球机",2); + + Integer code; + String message; + Integer type; + AvPtzTypeEnum(Integer code, String message, Integer type) { + this.code = code; + this.message = message; + this.type = type; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public static String valueOfs(Integer value) { + if (value == null) { + return ""; + } else { + for (AvPtzTypeEnum ms : AvPtzTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms.getMessage(); + } + } + return ""; + } + } + + public static AvPtzTypeEnum valueOfType(Integer value) { + if (value == null) { + return TYPE0; + } else { + for (AvPtzTypeEnum ms : AvPtzTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return TYPE0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvSecretLevelEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvSecretLevelEnum.java new file mode 100644 index 0000000..39e8524 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvSecretLevelEnum.java @@ -0,0 +1,60 @@ +package com.casic.missiles.modular.device.enums; + +/** + * Av主数据密集对应关系枚举 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvSecretLevelEnum { + s("999", "未定密", 999, "未定密"), + s0("0", "公开", 0, "公开"), + s1("1", "内部", 1, "内部"), + s2("2", "秘密", 2, "秘密"), + s3("3", "机密", 3, "机密"); + + String code; + Integer currCode; + String message; + String currMsg; + + AvSecretLevelEnum(String code, String message, Integer currCode, String currMsg) { + this.code = code; + this.currCode = currCode; + this.message = message; + this.currMsg = currMsg; + } + + public Integer getCurrCode() { + return currCode; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public static AvSecretLevelEnum valueOfCode(String value) { + if (value == null) { + return s0; + } else { + for (AvSecretLevelEnum ms : AvSecretLevelEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return s0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvStatusTypeEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvStatusTypeEnum.java new file mode 100644 index 0000000..ddccd52 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvStatusTypeEnum.java @@ -0,0 +1,72 @@ +package com.casic.missiles.modular.device.enums; + +/** + * wvp设备类型转换 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvStatusTypeEnum { + + TYPE0(0, "离线",0), + TYPE1(1, "在线",1); + + Integer code; + String message; + Integer type; + AvStatusTypeEnum(Integer code, String message, Integer type) { + this.code = code; + this.message = message; + this.type = type; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public static String valueOfs(Integer value) { + if (value == null) { + return ""; + } else { + for (AvStatusTypeEnum ms : AvStatusTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms.getMessage(); + } + } + return ""; + } + } + + public static AvStatusTypeEnum valueOfType(Integer value) { + if (value == null) { + return TYPE0; + } else { + for (AvStatusTypeEnum ms : AvStatusTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return TYPE0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvUrlEnums.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvUrlEnums.java new file mode 100644 index 0000000..04b38ad --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvUrlEnums.java @@ -0,0 +1,37 @@ +package com.casic.missiles.modular.device.enums; + +/** + * 设备媒体 + */ +public enum AvUrlEnums { + DEVICE("/open/v1/api/devices","设备信息查询"), + STREAM("/open/v1/api/streams","创建流"), + STREAM_STOP("/open/v1/api/streams/%s","停止流"), + HEART("/open/v1/api/streams/%s/heartbeat","发送心跳"), + DICT("/open/v1/api/dictionary_datas","字典查询"), + USER_DEVICE_RELATION("/open/v1/api/user_device_relationships","用户设备关联关系"); + + private String url; + private String name; + + AvUrlEnums(String url, String name) { + this.url = url; + this.name = name; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/AvDefaultHttpHeaderHandler.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/AvDefaultHttpHeaderHandler.java new file mode 100644 index 0000000..53f0a5c --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/AvDefaultHttpHeaderHandler.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.device.http; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.modular.system.handler.DefaultHttpHeaderHandler; +import org.apache.http.client.methods.HttpRequestBase; + +public class AvDefaultHttpHeaderHandler extends DefaultHttpHeaderHandler { + public void setHeader(HttpRequestBase base, String token) { + base.addHeader("Content-type", DEFAULT_CONTEXTTYPE); + if (StrUtil.isNotEmpty(token)) { + base.addHeader("X-OApi-Token", token); + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/HttpGetWithEntity.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/HttpGetWithEntity.java new file mode 100644 index 0000000..b8abf8f --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/HttpGetWithEntity.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.device.http; + +import org.apache.http.client.methods.HttpEntityEnclosingRequestBase; + +import java.net.URI; + +public class HttpGetWithEntity extends HttpEntityEnclosingRequestBase { + + public HttpGetWithEntity(URI uri) { + this.setURI(uri); + } + + public HttpGetWithEntity(String uri) { + this.setURI(URI.create(uri)); + } + + public String getMethod() { + return "GET"; + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/IAvSyncService.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/IAvSyncService.java new file mode 100644 index 0000000..13c3203 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/IAvSyncService.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.device.service; + +import com.casic.missiles.modular.device.dto.stream.StreamRequestDTO; + +public interface IAvSyncService { + /** + * Dc706设备信息同步 + */ + void syncDcDevices(String token); + + /** + * 创建流 + * + * @param streamRequestDTO + * @return + */ + Object getStreams(StreamRequestDTO streamRequestDTO); + + /** + * 停止流 + * + * @param id + * @return + */ + Object stopStreams(String id); + + /** + * 发送心跳 + * + * @param id 设备国标号 + * @return + */ + Object heart(String id); + + /** + * 设备权限更新 + */ + void loadUserDeviceRelationships(); +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/impl/AvSyncServiceImpl.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/impl/AvSyncServiceImpl.java new file mode 100644 index 0000000..25e3340 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/impl/AvSyncServiceImpl.java @@ -0,0 +1,179 @@ +package com.casic.missiles.modular.device.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.casic.missiles.core.application.service.AbstractUserService; +import com.casic.missiles.modular.device.dto.AvDeviceDTO; +import com.casic.missiles.modular.device.dto.DeviceRelationshipDTO; +import com.casic.missiles.modular.device.dto.page.AvPageRequest; +import com.casic.missiles.modular.device.dto.stream.StreamRequestDTO; +import com.casic.missiles.modular.device.enums.AvDataStateEnum; +import com.casic.missiles.modular.device.enums.AvPtzTypeEnum; +import com.casic.missiles.modular.device.enums.AvSecretLevelEnum; +import com.casic.missiles.modular.device.enums.AvStatusTypeEnum; +import com.casic.missiles.modular.device.model.BusDeviceInfo; +import com.casic.missiles.modular.device.service.IAvSyncService; +import com.casic.missiles.modular.device.service.IBusDeviceInfoService; +import com.casic.missiles.modular.device.service.ISysGroupDeviceService; +import com.casic.missiles.modular.device.util.AvUtil; +import com.casic.missiles.modular.system.model.SysUserGroup; +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.modular.system.service.ISysUserGroupService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; +@Slf4j +@Service +public class AvSyncServiceImpl implements IAvSyncService { + @Value("${casic.video.av.url:-1}") + private String avUrl; + @Value("${casic.video.av.token:-1}") + private String avToken; + @Resource + private IBusDeviceInfoService deviceInfoService; + @Resource + private AbstractUserService abstractUserService; + + @Resource + private ISysUserGroupService userGroupService; + @Resource + private ISysGroupDeviceService sysGroupDeviceService; + + @Override + public void syncDcDevices(String token) { + AvPageRequest avPageRequest = new AvPageRequest(); + avPageRequest.setPage(1); + avPageRequest.setPaging(1); + + //全量查询设备信息 + List deviceDTOS = AvUtil.selectDevices(avUrl, token, avPageRequest); + + if (CollectionUtil.isNotEmpty(deviceDTOS)) { + for (AvDeviceDTO dcDeviceDTO : deviceDTOS) { + BusDeviceInfo busDeviceInfo = this.convertDevice(dcDeviceDTO); + + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(BusDeviceInfo::getCameraIndexCode, dcDeviceDTO.getSn()); + this.deviceInfoService.saveOrUpdate(busDeviceInfo, query); + } + + List deviceSns = deviceDTOS.stream().filter(dto -> AvDataStateEnum.DEL.equals(dto.getState())).map(AvDeviceDTO::getSn).collect(Collectors.toList()); + + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.in(BusDeviceInfo::getCameraIndexCode, deviceSns); + if (CollectionUtil.isNotEmpty(deviceSns)) { + this.deviceInfoService.remove(query); + } + } + +// AvUtil.dict(avUrl,avToken); + } + + /** + * 流地址请求 + * + * @param streamRequestDTO + * @return + */ + @Override + public Object getStreams(StreamRequestDTO streamRequestDTO) { + return AvUtil.selectStreams(avUrl, avToken, streamRequestDTO); + } + + @Override + public Object stopStreams(String id) { + return AvUtil.stopStreams(avUrl, avToken, id); + } + + @Override + public Object heart(String id) { + return AvUtil.heart(avUrl, avToken, id); + } + + @Transactional + @Override + public void loadUserDeviceRelationships() { + + List relationshipDTOS = AvUtil.userDeviceRelationships(avUrl, avToken); + log.info("loadUserDeviceRelationships: {}", relationshipDTOS); + + for (DeviceRelationshipDTO relationshipDTO : relationshipDTOS) { + + //检索用户信息 + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(User::getSyncId, relationshipDTO.getUser_id()); + List users = abstractUserService.list(query); + + if (users != null&&users.size() > 0) { + User user = users.get(0); + //创建用户组 + LambdaQueryWrapper groupQuery = new LambdaQueryWrapper<>(); + String groupName = user.getName() + user.getId(); + groupQuery.eq(SysUserGroup::getGroupName, groupName); + SysUserGroup sysUserGroup = userGroupService.getOne(groupQuery); + + if (sysUserGroup == null) { + sysUserGroup = genSysUserGroup(groupName, user); + List userIds = new ArrayList<>(); + userIds.add(user.getId()); + userGroupService.createSysUserGroup(sysUserGroup, userIds); + } + + LambdaQueryWrapper deviceQuery = new LambdaQueryWrapper<>(); + deviceQuery.in(BusDeviceInfo::getCameraIndexCode, relationshipDTO.getDeviceList()); + List busDeviceInfos = deviceInfoService.list(deviceQuery); + + if (CollectionUtil.isNotEmpty(busDeviceInfos)) { + List list = busDeviceInfos.stream().map(BusDeviceInfo::getId).collect(Collectors.toList()); + sysGroupDeviceService.batchIncremental(sysUserGroup.getId(), list); + } + + }else{ + log.error("loadUserDeviceRelationships is empty: {}", relationshipDTO.getUser_id()); + } + } + } + + private SysUserGroup genSysUserGroup(String groupName, User user) { + SysUserGroup sysUserGroup = new SysUserGroup(); + sysUserGroup.setGroupName(groupName); + sysUserGroup.setCreateTime(new Date()); + sysUserGroup.setCreateId(user.getId()); + sysUserGroup.setDeptId(user.getDeptId()); + sysUserGroup.setDescription("默认创建分组,不可修改!"); + sysUserGroup.setSafe(0); + return sysUserGroup; + } + + /** + * 设备类型数据转换 + * + * @param dto 艾薇设备信息 + * @return + */ + private BusDeviceInfo convertDevice(AvDeviceDTO dto) { + BusDeviceInfo info = new BusDeviceInfo(); + info.setCreateTime(new Date()); + info.setUpdateTime(new Date()); + + //转换为本地密级编码 + info.setSecretLevel(AvSecretLevelEnum.valueOfCode(dto.getSecureLevel()).getCurrCode()); + + info.setDeviceStatus(AvStatusTypeEnum.valueOfType(dto.getStatus()).getType()); + info.setCameraIndexCode(dto.getSn()); + info.setMonitorName(dto.getName()); + + //PTZ type类型 + info.setDeviceType(AvPtzTypeEnum.valueOfType(dto.getPtzType()).getType() + ""); + info.setBfFlag(0); + + return info; + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/util/AvHttpUtils.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/util/AvHttpUtils.java new file mode 100644 index 0000000..083d88a --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/util/AvHttpUtils.java @@ -0,0 +1,331 @@ +package com.casic.missiles.modular.device.util; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.modular.device.http.HttpGetWithEntity; +import com.casic.missiles.modular.system.handler.DefaultHttpHeaderHandler; +import org.apache.http.NameValuePair; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpDelete; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.util.EntityUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +public class AvHttpUtils { + + public static String sendGetJson(String url, Map param, String token, DefaultHttpHeaderHandler handler) { + try { + StringBuffer query = new StringBuffer(); + String var14 = sendGetEntityData(url, handler.getChartSet(), param, token, handler); + return var14; + } catch (Exception var10) { + Exception e = var10; + e.printStackTrace(); + System.out.println("发送GET请求出现异常!" + e); + return ""; + } finally { + ; + } + } + public static String sendGet(String url, Map param, String token, DefaultHttpHeaderHandler handler) { + try { + StringBuffer query = new StringBuffer(); + Iterator var5 = param.entrySet().iterator(); + + while(var5.hasNext()) { + Map.Entry kv = (Map.Entry)var5.next(); + query.append(URLEncoder.encode((String)kv.getKey(), handler.getChartSet()) + "="); + query.append(URLEncoder.encode((String)kv.getValue(), handler.getChartSet()) + "&"); + } + + if (query.lastIndexOf("&") > 0) { + query.deleteCharAt(query.length() - 1); + } + + String urlNameString = url + "?" + query.toString(); + String var14 = sendGetData(urlNameString, handler.getChartSet(), token, handler); + return var14; + } catch (Exception var10) { + Exception e = var10; + e.printStackTrace(); + System.out.println("发送GET请求出现异常!" + e); + return ""; + } finally { + ; + } + } + public static String sendPost(String url, Map param, String token, DefaultHttpHeaderHandler httpHeaderHandler) { + return sendPostDataByMap(url, param, "utf8", token, httpHeaderHandler); + } + public static String sendPostDataByMap(String url, Map map, String encoding, String token, DefaultHttpHeaderHandler httpHeaderHandler) { + String result = ""; + CloseableHttpResponse response = null; + CloseableHttpClient httpClient = null; + HttpPost httpPost = null; + + try { + httpClient = HttpClients.createDefault(); + httpPost = new HttpPost(url); + httpPost.setHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)"); + httpHeaderHandler.setHeader(httpPost, token); + if (httpHeaderHandler.isJson()) { + jsonParams(map, httpPost); + } else { + formParams(map, httpPost, httpHeaderHandler.getChartSet()); + } + + response = httpClient.execute(httpPost); + if (response.getStatusLine().getStatusCode() == 200) { + result = EntityUtils.toString(response.getEntity(), httpHeaderHandler.getChartSet()); + } + } catch (Exception var22) { + Exception e = var22; + System.out.println("发送GET请求出现异常!" + e); + e.printStackTrace(); + } finally { + IOException e; + try { + if (response != null) { + response.close(); + } + + httpPost.releaseConnection(); + httpClient.close(); + } catch (IOException var21) { + e = var21; + e.printStackTrace(); + } + + if (httpClient != null) { + try { + httpClient.close(); + } catch (IOException var20) { + e = var20; + e.printStackTrace(); + } + } + + } + + return result; + } + public static String sendGetData(String url, String encoding, String token, DefaultHttpHeaderHandler httpHeaderHandler) { + String result = ""; + CloseableHttpResponse response = null; + if (httpHeaderHandler == null) { + httpHeaderHandler = new DefaultHttpHeaderHandler(); + } + + CloseableHttpClient httpClient = null; + + try { + httpClient = HttpClients.createDefault(); + HttpGet httpGet = new HttpGet(url); + httpHeaderHandler.setHeader(httpGet, token); + response = httpClient.execute(httpGet); + if (response.getStatusLine().getStatusCode() == 200) { + result = EntityUtils.toString(response.getEntity(), encoding); + } + } catch (Exception var20) { + Exception e = var20; + e.printStackTrace(); + System.out.println("发送GET请求出现异常!" + e); + } finally { + IOException e; + if (response != null) { + try { + response.close(); + } catch (IOException var19) { + e = var19; + e.printStackTrace(); + } + } + + if (httpClient != null) { + try { + httpClient.close(); + } catch (IOException var18) { + e = var18; + e.printStackTrace(); + } + } + + } + + return result; + } + public static String sendGetEntityData(String url, String encoding, Map param, String token, DefaultHttpHeaderHandler httpHeaderHandler) { + String result = ""; + CloseableHttpResponse response = null; + if (httpHeaderHandler == null) { + httpHeaderHandler = new DefaultHttpHeaderHandler(); + } + CloseableHttpClient httpClient =null; + try { + httpClient = HttpClients.createDefault(); + HttpGetWithEntity httpGet = new HttpGetWithEntity(url); + httpHeaderHandler.setHeader(httpGet, token); + if (httpHeaderHandler.isJson()) { + jsonParams(param, httpGet); + } else { + formParams(param, httpGet, httpHeaderHandler.getChartSet()); + } + response = httpClient.execute(httpGet); + if (response.getStatusLine().getStatusCode() == 200) { + result = EntityUtils.toString(response.getEntity(), encoding); + } + } catch (Exception var16) { + Exception e = var16; + e.printStackTrace(); + System.out.println("发送GET请求出现异常!" + e); + } finally { + if (response != null) { + try { + response.close(); + } catch (IOException var15) { + IOException e = var15; + e.printStackTrace(); + } + } + if (httpClient != null) { + try { + httpClient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + } + + return result; + } + + public static String sendDelete(String url, Map param, String token, DefaultHttpHeaderHandler handler) { + try { + StringBuffer query = new StringBuffer(); + Iterator var5 = param.entrySet().iterator(); + + while (var5.hasNext()) { + Map.Entry kv = (Map.Entry) var5.next(); + query.append(URLEncoder.encode((String) kv.getKey(), handler.getChartSet()) + "="); + query.append(URLEncoder.encode((String) kv.getValue(), handler.getChartSet()) + "&"); + } + + if (query.lastIndexOf("&") > 0) { + query.deleteCharAt(query.length() - 1); + } + String urlNameString = url + "?" + query.toString(); + String var14 = sendDeleteData(urlNameString, handler.getChartSet(), token, handler); + return var14; + } catch (Exception var10) { + Exception e = var10; + e.printStackTrace(); + System.out.println("发送GET请求出现异常!" + e); + return ""; + } finally { + ; + } + } + private static final Logger logger = LoggerFactory.getLogger(AvUtil.class); + /** + * http 请求 + * + * @param url + * @param encoding + * @param token + * @param httpHeaderHandler + * @return + */ + public static String sendDeleteData(String url, String encoding, String token, DefaultHttpHeaderHandler httpHeaderHandler) { + String result = ""; + CloseableHttpResponse response = null; + if (httpHeaderHandler == null) { + httpHeaderHandler = new DefaultHttpHeaderHandler(); + } + CloseableHttpClient httpClient = null; + try { + httpClient = HttpClients.createDefault(); + HttpDelete httpGet = new HttpDelete(url); + httpHeaderHandler.setHeader(httpGet, token); + response = httpClient.execute(httpGet); + if (response.getStatusLine().getStatusCode() == 200) { + logger.info("----------------------------------:"+EntityUtils.toString(response.getEntity(), encoding)); + result = EntityUtils.toString(response.getEntity(), encoding); + } + } catch (Exception var16) { + Exception e = var16; + e.printStackTrace(); + } finally { + if (response != null) { + try { + response.close(); + } catch (IOException var15) { + IOException e = var15; + e.printStackTrace(); + } + } + if (httpClient != null) { + try { + httpClient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return result; + } + public static void jsonParams(Map map, HttpPost post) { + String paramJson = JSONObject.toJSONString(map); + StringEntity stringEntity = new StringEntity(paramJson, ContentType.create("application/json", "UTF-8")); + post.setEntity(stringEntity); + } + + public static void formParams(Map map, HttpPost post, String chartSet) throws UnsupportedEncodingException { + List nameValuePairs = new ArrayList(); + if (map != null) { + Iterator var4 = map.entrySet().iterator(); + + while(var4.hasNext()) { + Map.Entry entry = (Map.Entry)var4.next(); + nameValuePairs.add(new BasicNameValuePair((String)entry.getKey(), (String)entry.getValue())); + } + } + + post.setEntity(new UrlEncodedFormEntity(nameValuePairs, chartSet)); + } + public static void jsonParams(Map map, HttpGetWithEntity post) { + String paramJson = JSONObject.toJSONString(map); + StringEntity stringEntity = new StringEntity(paramJson, ContentType.create("application/json", "UTF-8")); + + post.setEntity(stringEntity); + } + + public static void formParams(Map map, HttpGetWithEntity post, String chartSet) throws UnsupportedEncodingException { + List nameValuePairs = new ArrayList(); + if (map != null) { + Iterator var4 = map.entrySet().iterator(); + + while (var4.hasNext()) { + Map.Entry entry = (Map.Entry) var4.next(); + nameValuePairs.add(new BasicNameValuePair((String) entry.getKey(), (String) entry.getValue())); + } + } + + post.setEntity(new UrlEncodedFormEntity(nameValuePairs, chartSet)); + } +} \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/util/AvUtil.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/util/AvUtil.java new file mode 100644 index 0000000..9575627 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/util/AvUtil.java @@ -0,0 +1,171 @@ +package com.casic.missiles.modular.device.util; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.TypeReference; +import com.casic.missiles.modular.device.dto.AvDeviceDTO; +import com.casic.missiles.modular.device.dto.AvPageResponse; +import com.casic.missiles.modular.device.dto.DeviceRelationshipDTO; +import com.casic.missiles.modular.device.dto.page.AvPageRequest; +import com.casic.missiles.modular.device.dto.stream.StreamRequestDTO; +import com.casic.missiles.modular.device.enums.AvUrlEnums; +import com.casic.missiles.modular.device.http.AvDefaultHttpHeaderHandler; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 艾薇对接工具类 + */ +public class AvUtil { + private static final Logger logger = LoggerFactory.getLogger(AvUtil.class); + + /** + * 设备列表读取 + * + * @param baseUrl av流媒体地址 + * @param token 认证令牌 + * @param pageRequest 请求体 + * @return + */ + public static List selectDevices(String baseUrl, String token, AvPageRequest pageRequest) { + AvDefaultHttpHeaderHandler dcDefaultHttpHeaderHandler = new AvDefaultHttpHeaderHandler(); + dcDefaultHttpHeaderHandler.setJson(true); + Map param = new HashMap<>(); + param.put("page", pageRequest.getPage() + ""); + param.put("paging", pageRequest.getPaging() + ""); + param.put("limit", "100000"); + param.put("token", token); + String res = AvHttpUtils.sendGet(baseUrl + AvUrlEnums.DEVICE.getUrl(), param, token, dcDefaultHttpHeaderHandler); + logger.info("selectDevices:{}", res); + if (StrUtil.isEmpty(res)) { + logger.error("av device sync error!"); + } + AvPageResponse deviceDTOS = JSON.parseObject(res, new TypeReference() { + }); + return deviceDTOS.getItems(); + } + + /** + * 创建流 + * + * @param baseUrl av流媒体地址 + * @param token 认证令牌 + * @param streamRequestDTO 请求体 + * @return + */ + public static Object selectStreams(String baseUrl, String token, StreamRequestDTO streamRequestDTO) { + + Map param = new HashMap<>(); + param.put("device_id", streamRequestDTO.getDevice_id() + ""); + param.put("stream_type", streamRequestDTO.getStream_type() + ""); + param.put("quality", streamRequestDTO.getQuality() + ""); + param.put("token", token); + param.put("from", streamRequestDTO.getFrom() + ""); + param.put("to", streamRequestDTO.getTo() + ""); + logger.info("url:{}", baseUrl + AvUrlEnums.STREAM.getUrl()); + AvDefaultHttpHeaderHandler dcDefaultHttpHeaderHandler = new AvDefaultHttpHeaderHandler(); + dcDefaultHttpHeaderHandler.setJson(true); + String res = AvHttpUtils.sendPost(baseUrl + AvUrlEnums.STREAM.getUrl(), param, token, dcDefaultHttpHeaderHandler); + + if (StrUtil.isEmpty(res)) { + logger.error("av stream error:{}", streamRequestDTO.getDevice_id()); + return null; + } + return JSON.parseObject(res); + } + + /** + * 发送心跳 + * + * @param avUrl + * @param avToken + * @return + */ + public static Object dict(String avUrl, String avToken) { + AvDefaultHttpHeaderHandler dcDefaultHttpHeaderHandler = new AvDefaultHttpHeaderHandler(); + dcDefaultHttpHeaderHandler.setJson(true); + Map param = new HashMap<>(); + String res = AvHttpUtils.sendGet(avUrl + AvUrlEnums.DICT.getUrl(), param, avToken, dcDefaultHttpHeaderHandler); + logger.info("av dict:{}", res); + return null; + } + + /** + * 发送心跳 + * + * @param avUrl + * @param avToken + * @param id + * @return + */ + public static Object heart(String avUrl, String avToken, String id) { + AvDefaultHttpHeaderHandler dcDefaultHttpHeaderHandler = new AvDefaultHttpHeaderHandler(); + dcDefaultHttpHeaderHandler.setJson(true); + Map param = new HashMap<>(); +// param.put("id", id); +// param.put("token", avToken); + String res = AvHttpUtils.sendGet(avUrl + String.format(AvUrlEnums.HEART.getUrl(), id), param, avToken, dcDefaultHttpHeaderHandler); + if (StrUtil.isEmpty(res)) { + logger.error("av heart error:{}", id); + return null; + } + return JSON.parseObject(res); + } + + /** + * 停止流 + * + * @param avUrl 艾薇流媒体地址 + * @param avToken 认证令牌 + * @param id 国标ID + * @return + */ + public static Object stopStreams(String avUrl, String avToken, String id) { + AvDefaultHttpHeaderHandler dcDefaultHttpHeaderHandler = new AvDefaultHttpHeaderHandler(); + dcDefaultHttpHeaderHandler.setJson(true); + Map param = new HashMap<>(); + //param.put("id", id); + String res = AvHttpUtils.sendDelete(avUrl + String.format(AvUrlEnums.STREAM_STOP.getUrl(), id), param, avToken, dcDefaultHttpHeaderHandler); + + if (StrUtil.isEmpty(res)) { + logger.error("av stopStreams error:{}", id); + return null; + } + return JSON.parseObject(res); + } + + /** + * 用户设备关系 + * + * @param avUrl 艾薇流媒体地址 + * @param avToken 认证令牌 + * @return + */ + public static List userDeviceRelationships(String avUrl, String avToken) { + + AvDefaultHttpHeaderHandler avDefaultHttpHeaderHandler = new AvDefaultHttpHeaderHandler(); + avDefaultHttpHeaderHandler.setJson(true); + Map param = new HashMap<>(); + String res = AvHttpUtils.sendGetJson(avUrl + AvUrlEnums.USER_DEVICE_RELATION.getUrl(), param, avToken, avDefaultHttpHeaderHandler); + if (StrUtil.isEmpty(res)) { + logger.error("av userDeviceRelationships error"); + return null; + } + + List deviceDTOS = JSON.parseObject(res, new TypeReference>() { + }); + if (CollectionUtil.isNotEmpty(deviceDTOS)) { + for (DeviceRelationshipDTO deviceDTO : deviceDTOS) { + if (StrUtil.isNotEmpty(deviceDTO.getDevice_list())) { + deviceDTO.setDeviceList(StrUtil.split(deviceDTO.getDevice_list(), ",")); + } + } + } + return deviceDTOS; + } +} \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/task/AvTask.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/task/AvTask.java new file mode 100644 index 0000000..46ccc41 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/task/AvTask.java @@ -0,0 +1,46 @@ +package com.casic.missiles.modular.task; + +import com.casic.missiles.modular.device.service.IAvSyncService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +@Slf4j +@Component +public class AvTask { + + @Resource + private IAvSyncService deviceStatusService; + @Value("${casic.video.av.open:-1}") + private Boolean open; + @Value("${casic.video.av.token:-1}") + private String token; + + /** + * 设备信息同步0 + * 每30分钟采集一次 + */ + @Scheduled(cron = "${casic.video.av.deviceCorn}") + public void device() { + //更新组织机构信息 + log.info("av sdk 设备信息同步"); + if (open) { + deviceStatusService.syncDcDevices(token); + } + log.info("av sdk 设备同步结束"); + } + + @Scheduled(cron = "${casic.video.av.deviceStatusCorn}") + public void deviceRefreshToken() { + //更新组织机构信息 + log.info("av 设备状态刷新"); + if (open) { + deviceStatusService.loadUserDeviceRelationships(); + } + + log.info("av 设备状态刷新"); + } +} \ No newline at end of file diff --git a/casic-device-sync/casic-device-dc/src/main/java/com/casic/missiles/modular/http/DcDefaultHttpHeaderHandler.java b/casic-device-sync/casic-device-dc/src/main/java/com/casic/missiles/modular/http/DcDefaultHttpHeaderHandler.java index 550b9d4..e3ee94f 100644 --- a/casic-device-sync/casic-device-dc/src/main/java/com/casic/missiles/modular/http/DcDefaultHttpHeaderHandler.java +++ b/casic-device-sync/casic-device-dc/src/main/java/com/casic/missiles/modular/http/DcDefaultHttpHeaderHandler.java @@ -12,4 +12,6 @@ } } + + } diff --git a/casic-server-sync/src/main/java/com/casic/missiles/modular/device/controller/GateController.java b/casic-server-sync/src/main/java/com/casic/missiles/modular/device/controller/GateController.java index 1108110..efd28e1 100644 --- a/casic-server-sync/src/main/java/com/casic/missiles/modular/device/controller/GateController.java +++ b/casic-server-sync/src/main/java/com/casic/missiles/modular/device/controller/GateController.java @@ -58,9 +58,9 @@ return; } -// String dn = new String(request.getHeader("dnname").getBytes("ISO8859-1"), "UTF-8"); -// String account = getValueByDn(dn, key1); - String account = x; + String dn = new String(request.getHeader("dnname").getBytes("ISO8859-1"), "UTF-8"); + String account = getValueByDn(dn, key1); +// String account = x; //token自定义 CasicCustomToken token = new CasicCustomToken(account, "password"); token.setType(LoginType.NO_PASSWD); diff --git a/README.md b/README.md index 430796e..8dbc9a5 100644 --- a/README.md +++ b/README.md @@ -9,3 +9,7 @@ #### 其他 >* [git地址](http://192.168.0.203:8080/gitbucket) >* [本地免登地址](http://localhost:8083/route/mockToken) + +AView 对接问题 +1.用户设备关联关系 + 对应返回 device_list是否为设备国标号 \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/pom.xml b/casic-device-sync/casic-device-aview/pom.xml index 0a3c5fa..94fb9e5 100644 --- a/casic-device-sync/casic-device-aview/pom.xml +++ b/casic-device-sync/casic-device-aview/pom.xml @@ -33,6 +33,21 @@ ${boot.version} provided + + com.casic + casic-http + ${core.version} + + + com.casic + casic-admin-group + ${admin.version} + + + com.casic + casic-server + ${pro.version} + diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java new file mode 100644 index 0000000..195cba2 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.device.controller; + +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import com.casic.missiles.modular.device.dto.stream.StreamRequestDTO; +import com.casic.missiles.modular.device.service.IAvSyncService; +import io.swagger.annotations.Api; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +@Api(tags = "AV平台代理接口") +@RestController +@RequestMapping("/route") +public class AvRouteController { + @Resource + private IAvSyncService avSyncService; + + @PostMapping("/open/v1/api/streams") + public Object streams(@RequestBody StreamRequestDTO requestDTO) { + Object object = avSyncService.getStreams(requestDTO); + if (object == null) { + ResponseDataDTO respDTO = ResponseDataDTO.error("流读取失败,请稍后重试!"); + respDTO.setMessage("流读取失败,请稍后重试!"); + return respDTO; + } + return ResponseDataDTO.success(avSyncService.getStreams(requestDTO)); + } + + @DeleteMapping("/open/v1/api/streams/{id}") + public Object stopStreams(@PathVariable("id") String id) { + Object object = avSyncService.stopStreams(id); + return ResponseDataDTO.success(object); + } + + @PostMapping("/open/v1/api/streams/{id}/heart") + public Object heart(@PathVariable("id") String id) { + Object object = avSyncService.heart(id); + if (object == null) { + ResponseDataDTO respDTO = ResponseDataDTO.error("流心跳失败,请稍后重试!"); + respDTO.setMessage("流心跳失败,请稍后重试!"); + return respDTO; + } + return ResponseDataDTO.success(object); + } +} \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java new file mode 100644 index 0000000..97bde9f --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java @@ -0,0 +1,49 @@ +package com.casic.missiles.modular.device.dto; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; + +/** + * 艾薇设备对象DTO + */ +@Data +public class AvDeviceDTO { + // 设备ID + private Long id; + + // 设备名称 + private String name; + + // 设备唯一国标序列号 + private String sn; + + // 设备类型 + private Integer type; + + // 设备版本号 + private String version; + + // 安全等级 + @JSONField(name = "secure_level") + private String secureLevel; + + // 设备状态 + private Integer status; + + // 云台类型 + private Integer ptzType; + + // 朝向 + private Integer orientation; + + // 创建时间 + @JSONField(name = "gmt_created") + private String gmtCreated; + + // 修改时间 + @JSONField(name = "gmt_modified") + private String gmtModified; + + // 数据状态 + private Integer state; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java new file mode 100644 index 0000000..9a05183 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java @@ -0,0 +1,10 @@ +package com.casic.missiles.modular.device.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class AvPageResponse { + private List items; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java new file mode 100644 index 0000000..098dda4 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.device.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class DeviceRelationshipDTO { + private Long user_id; + private String device_list; + private List deviceList; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java new file mode 100644 index 0000000..74e6a9b --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java @@ -0,0 +1,9 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +@Data +public class AvPageRep { + private Integer total; + private T list; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java new file mode 100644 index 0000000..900ae4a --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +/** + * 分页请求DTO + */ +@Data +public class AvPageRequest { + private int page; + private int paging; + private int limit; + +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java new file mode 100644 index 0000000..f1c1e7a --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +/** + * mvp返回基类封装 + * + * @param + */ +@Data +public class AvResponseDTO { + private T data; + private Integer code; + private String msg; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamRequestDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamRequestDTO.java new file mode 100644 index 0000000..69e88ce --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamRequestDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.device.dto.stream; + +import lombok.Data; + +@Data +public class StreamRequestDTO { + private String device_id; + private String stream_type; + private String quality; + private int from; + private int to; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamStopRequestDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamStopRequestDTO.java new file mode 100644 index 0000000..9cf94b1 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamStopRequestDTO.java @@ -0,0 +1,11 @@ +package com.casic.missiles.modular.device.dto.stream; + +import lombok.Data; + +@Data +public class StreamStopRequestDTO { + private String id; + private String type; + private StreamRequestDTO request; + private String url; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvDataStateEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvDataStateEnum.java new file mode 100644 index 0000000..e1a6658 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvDataStateEnum.java @@ -0,0 +1,72 @@ +package com.casic.missiles.modular.device.enums; + +/** + * 数据状态 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvDataStateEnum { + + TYPE0(0, "有效",0), + DEL(1, "无效",1); + + Integer code; + String message; + Integer type; + AvDataStateEnum(Integer code, String message, Integer type) { + this.code = code; + this.message = message; + this.type = type; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public static String valueOfs(Integer value) { + if (value == null) { + return ""; + } else { + for (AvDataStateEnum ms : AvDataStateEnum.values()) { + if (ms.getCode().equals(value)) { + return ms.getMessage(); + } + } + return ""; + } + } + + public static AvDataStateEnum valueOfType(Integer value) { + if (value == null) { + return TYPE0; + } else { + for (AvDataStateEnum ms : AvDataStateEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return TYPE0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvPtzTypeEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvPtzTypeEnum.java new file mode 100644 index 0000000..fdcb08d --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvPtzTypeEnum.java @@ -0,0 +1,73 @@ +package com.casic.missiles.modular.device.enums; + +/** + * wvp设备类型转换 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvPtzTypeEnum { + + TYPE0(0, "枪机",0), + TYPE1(1, "半球",1), + TYPE2(2, "球机",2); + + Integer code; + String message; + Integer type; + AvPtzTypeEnum(Integer code, String message, Integer type) { + this.code = code; + this.message = message; + this.type = type; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public static String valueOfs(Integer value) { + if (value == null) { + return ""; + } else { + for (AvPtzTypeEnum ms : AvPtzTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms.getMessage(); + } + } + return ""; + } + } + + public static AvPtzTypeEnum valueOfType(Integer value) { + if (value == null) { + return TYPE0; + } else { + for (AvPtzTypeEnum ms : AvPtzTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return TYPE0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvSecretLevelEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvSecretLevelEnum.java new file mode 100644 index 0000000..39e8524 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvSecretLevelEnum.java @@ -0,0 +1,60 @@ +package com.casic.missiles.modular.device.enums; + +/** + * Av主数据密集对应关系枚举 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvSecretLevelEnum { + s("999", "未定密", 999, "未定密"), + s0("0", "公开", 0, "公开"), + s1("1", "内部", 1, "内部"), + s2("2", "秘密", 2, "秘密"), + s3("3", "机密", 3, "机密"); + + String code; + Integer currCode; + String message; + String currMsg; + + AvSecretLevelEnum(String code, String message, Integer currCode, String currMsg) { + this.code = code; + this.currCode = currCode; + this.message = message; + this.currMsg = currMsg; + } + + public Integer getCurrCode() { + return currCode; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public static AvSecretLevelEnum valueOfCode(String value) { + if (value == null) { + return s0; + } else { + for (AvSecretLevelEnum ms : AvSecretLevelEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return s0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvStatusTypeEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvStatusTypeEnum.java new file mode 100644 index 0000000..ddccd52 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvStatusTypeEnum.java @@ -0,0 +1,72 @@ +package com.casic.missiles.modular.device.enums; + +/** + * wvp设备类型转换 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvStatusTypeEnum { + + TYPE0(0, "离线",0), + TYPE1(1, "在线",1); + + Integer code; + String message; + Integer type; + AvStatusTypeEnum(Integer code, String message, Integer type) { + this.code = code; + this.message = message; + this.type = type; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public static String valueOfs(Integer value) { + if (value == null) { + return ""; + } else { + for (AvStatusTypeEnum ms : AvStatusTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms.getMessage(); + } + } + return ""; + } + } + + public static AvStatusTypeEnum valueOfType(Integer value) { + if (value == null) { + return TYPE0; + } else { + for (AvStatusTypeEnum ms : AvStatusTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return TYPE0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvUrlEnums.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvUrlEnums.java new file mode 100644 index 0000000..04b38ad --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvUrlEnums.java @@ -0,0 +1,37 @@ +package com.casic.missiles.modular.device.enums; + +/** + * 设备媒体 + */ +public enum AvUrlEnums { + DEVICE("/open/v1/api/devices","设备信息查询"), + STREAM("/open/v1/api/streams","创建流"), + STREAM_STOP("/open/v1/api/streams/%s","停止流"), + HEART("/open/v1/api/streams/%s/heartbeat","发送心跳"), + DICT("/open/v1/api/dictionary_datas","字典查询"), + USER_DEVICE_RELATION("/open/v1/api/user_device_relationships","用户设备关联关系"); + + private String url; + private String name; + + AvUrlEnums(String url, String name) { + this.url = url; + this.name = name; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/AvDefaultHttpHeaderHandler.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/AvDefaultHttpHeaderHandler.java new file mode 100644 index 0000000..53f0a5c --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/AvDefaultHttpHeaderHandler.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.device.http; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.modular.system.handler.DefaultHttpHeaderHandler; +import org.apache.http.client.methods.HttpRequestBase; + +public class AvDefaultHttpHeaderHandler extends DefaultHttpHeaderHandler { + public void setHeader(HttpRequestBase base, String token) { + base.addHeader("Content-type", DEFAULT_CONTEXTTYPE); + if (StrUtil.isNotEmpty(token)) { + base.addHeader("X-OApi-Token", token); + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/HttpGetWithEntity.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/HttpGetWithEntity.java new file mode 100644 index 0000000..b8abf8f --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/HttpGetWithEntity.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.device.http; + +import org.apache.http.client.methods.HttpEntityEnclosingRequestBase; + +import java.net.URI; + +public class HttpGetWithEntity extends HttpEntityEnclosingRequestBase { + + public HttpGetWithEntity(URI uri) { + this.setURI(uri); + } + + public HttpGetWithEntity(String uri) { + this.setURI(URI.create(uri)); + } + + public String getMethod() { + return "GET"; + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/IAvSyncService.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/IAvSyncService.java new file mode 100644 index 0000000..13c3203 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/IAvSyncService.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.device.service; + +import com.casic.missiles.modular.device.dto.stream.StreamRequestDTO; + +public interface IAvSyncService { + /** + * Dc706设备信息同步 + */ + void syncDcDevices(String token); + + /** + * 创建流 + * + * @param streamRequestDTO + * @return + */ + Object getStreams(StreamRequestDTO streamRequestDTO); + + /** + * 停止流 + * + * @param id + * @return + */ + Object stopStreams(String id); + + /** + * 发送心跳 + * + * @param id 设备国标号 + * @return + */ + Object heart(String id); + + /** + * 设备权限更新 + */ + void loadUserDeviceRelationships(); +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/impl/AvSyncServiceImpl.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/impl/AvSyncServiceImpl.java new file mode 100644 index 0000000..25e3340 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/impl/AvSyncServiceImpl.java @@ -0,0 +1,179 @@ +package com.casic.missiles.modular.device.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.casic.missiles.core.application.service.AbstractUserService; +import com.casic.missiles.modular.device.dto.AvDeviceDTO; +import com.casic.missiles.modular.device.dto.DeviceRelationshipDTO; +import com.casic.missiles.modular.device.dto.page.AvPageRequest; +import com.casic.missiles.modular.device.dto.stream.StreamRequestDTO; +import com.casic.missiles.modular.device.enums.AvDataStateEnum; +import com.casic.missiles.modular.device.enums.AvPtzTypeEnum; +import com.casic.missiles.modular.device.enums.AvSecretLevelEnum; +import com.casic.missiles.modular.device.enums.AvStatusTypeEnum; +import com.casic.missiles.modular.device.model.BusDeviceInfo; +import com.casic.missiles.modular.device.service.IAvSyncService; +import com.casic.missiles.modular.device.service.IBusDeviceInfoService; +import com.casic.missiles.modular.device.service.ISysGroupDeviceService; +import com.casic.missiles.modular.device.util.AvUtil; +import com.casic.missiles.modular.system.model.SysUserGroup; +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.modular.system.service.ISysUserGroupService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; +@Slf4j +@Service +public class AvSyncServiceImpl implements IAvSyncService { + @Value("${casic.video.av.url:-1}") + private String avUrl; + @Value("${casic.video.av.token:-1}") + private String avToken; + @Resource + private IBusDeviceInfoService deviceInfoService; + @Resource + private AbstractUserService abstractUserService; + + @Resource + private ISysUserGroupService userGroupService; + @Resource + private ISysGroupDeviceService sysGroupDeviceService; + + @Override + public void syncDcDevices(String token) { + AvPageRequest avPageRequest = new AvPageRequest(); + avPageRequest.setPage(1); + avPageRequest.setPaging(1); + + //全量查询设备信息 + List deviceDTOS = AvUtil.selectDevices(avUrl, token, avPageRequest); + + if (CollectionUtil.isNotEmpty(deviceDTOS)) { + for (AvDeviceDTO dcDeviceDTO : deviceDTOS) { + BusDeviceInfo busDeviceInfo = this.convertDevice(dcDeviceDTO); + + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(BusDeviceInfo::getCameraIndexCode, dcDeviceDTO.getSn()); + this.deviceInfoService.saveOrUpdate(busDeviceInfo, query); + } + + List deviceSns = deviceDTOS.stream().filter(dto -> AvDataStateEnum.DEL.equals(dto.getState())).map(AvDeviceDTO::getSn).collect(Collectors.toList()); + + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.in(BusDeviceInfo::getCameraIndexCode, deviceSns); + if (CollectionUtil.isNotEmpty(deviceSns)) { + this.deviceInfoService.remove(query); + } + } + +// AvUtil.dict(avUrl,avToken); + } + + /** + * 流地址请求 + * + * @param streamRequestDTO + * @return + */ + @Override + public Object getStreams(StreamRequestDTO streamRequestDTO) { + return AvUtil.selectStreams(avUrl, avToken, streamRequestDTO); + } + + @Override + public Object stopStreams(String id) { + return AvUtil.stopStreams(avUrl, avToken, id); + } + + @Override + public Object heart(String id) { + return AvUtil.heart(avUrl, avToken, id); + } + + @Transactional + @Override + public void loadUserDeviceRelationships() { + + List relationshipDTOS = AvUtil.userDeviceRelationships(avUrl, avToken); + log.info("loadUserDeviceRelationships: {}", relationshipDTOS); + + for (DeviceRelationshipDTO relationshipDTO : relationshipDTOS) { + + //检索用户信息 + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(User::getSyncId, relationshipDTO.getUser_id()); + List users = abstractUserService.list(query); + + if (users != null&&users.size() > 0) { + User user = users.get(0); + //创建用户组 + LambdaQueryWrapper groupQuery = new LambdaQueryWrapper<>(); + String groupName = user.getName() + user.getId(); + groupQuery.eq(SysUserGroup::getGroupName, groupName); + SysUserGroup sysUserGroup = userGroupService.getOne(groupQuery); + + if (sysUserGroup == null) { + sysUserGroup = genSysUserGroup(groupName, user); + List userIds = new ArrayList<>(); + userIds.add(user.getId()); + userGroupService.createSysUserGroup(sysUserGroup, userIds); + } + + LambdaQueryWrapper deviceQuery = new LambdaQueryWrapper<>(); + deviceQuery.in(BusDeviceInfo::getCameraIndexCode, relationshipDTO.getDeviceList()); + List busDeviceInfos = deviceInfoService.list(deviceQuery); + + if (CollectionUtil.isNotEmpty(busDeviceInfos)) { + List list = busDeviceInfos.stream().map(BusDeviceInfo::getId).collect(Collectors.toList()); + sysGroupDeviceService.batchIncremental(sysUserGroup.getId(), list); + } + + }else{ + log.error("loadUserDeviceRelationships is empty: {}", relationshipDTO.getUser_id()); + } + } + } + + private SysUserGroup genSysUserGroup(String groupName, User user) { + SysUserGroup sysUserGroup = new SysUserGroup(); + sysUserGroup.setGroupName(groupName); + sysUserGroup.setCreateTime(new Date()); + sysUserGroup.setCreateId(user.getId()); + sysUserGroup.setDeptId(user.getDeptId()); + sysUserGroup.setDescription("默认创建分组,不可修改!"); + sysUserGroup.setSafe(0); + return sysUserGroup; + } + + /** + * 设备类型数据转换 + * + * @param dto 艾薇设备信息 + * @return + */ + private BusDeviceInfo convertDevice(AvDeviceDTO dto) { + BusDeviceInfo info = new BusDeviceInfo(); + info.setCreateTime(new Date()); + info.setUpdateTime(new Date()); + + //转换为本地密级编码 + info.setSecretLevel(AvSecretLevelEnum.valueOfCode(dto.getSecureLevel()).getCurrCode()); + + info.setDeviceStatus(AvStatusTypeEnum.valueOfType(dto.getStatus()).getType()); + info.setCameraIndexCode(dto.getSn()); + info.setMonitorName(dto.getName()); + + //PTZ type类型 + info.setDeviceType(AvPtzTypeEnum.valueOfType(dto.getPtzType()).getType() + ""); + info.setBfFlag(0); + + return info; + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/util/AvHttpUtils.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/util/AvHttpUtils.java new file mode 100644 index 0000000..083d88a --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/util/AvHttpUtils.java @@ -0,0 +1,331 @@ +package com.casic.missiles.modular.device.util; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.modular.device.http.HttpGetWithEntity; +import com.casic.missiles.modular.system.handler.DefaultHttpHeaderHandler; +import org.apache.http.NameValuePair; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpDelete; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.util.EntityUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +public class AvHttpUtils { + + public static String sendGetJson(String url, Map param, String token, DefaultHttpHeaderHandler handler) { + try { + StringBuffer query = new StringBuffer(); + String var14 = sendGetEntityData(url, handler.getChartSet(), param, token, handler); + return var14; + } catch (Exception var10) { + Exception e = var10; + e.printStackTrace(); + System.out.println("发送GET请求出现异常!" + e); + return ""; + } finally { + ; + } + } + public static String sendGet(String url, Map param, String token, DefaultHttpHeaderHandler handler) { + try { + StringBuffer query = new StringBuffer(); + Iterator var5 = param.entrySet().iterator(); + + while(var5.hasNext()) { + Map.Entry kv = (Map.Entry)var5.next(); + query.append(URLEncoder.encode((String)kv.getKey(), handler.getChartSet()) + "="); + query.append(URLEncoder.encode((String)kv.getValue(), handler.getChartSet()) + "&"); + } + + if (query.lastIndexOf("&") > 0) { + query.deleteCharAt(query.length() - 1); + } + + String urlNameString = url + "?" + query.toString(); + String var14 = sendGetData(urlNameString, handler.getChartSet(), token, handler); + return var14; + } catch (Exception var10) { + Exception e = var10; + e.printStackTrace(); + System.out.println("发送GET请求出现异常!" + e); + return ""; + } finally { + ; + } + } + public static String sendPost(String url, Map param, String token, DefaultHttpHeaderHandler httpHeaderHandler) { + return sendPostDataByMap(url, param, "utf8", token, httpHeaderHandler); + } + public static String sendPostDataByMap(String url, Map map, String encoding, String token, DefaultHttpHeaderHandler httpHeaderHandler) { + String result = ""; + CloseableHttpResponse response = null; + CloseableHttpClient httpClient = null; + HttpPost httpPost = null; + + try { + httpClient = HttpClients.createDefault(); + httpPost = new HttpPost(url); + httpPost.setHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)"); + httpHeaderHandler.setHeader(httpPost, token); + if (httpHeaderHandler.isJson()) { + jsonParams(map, httpPost); + } else { + formParams(map, httpPost, httpHeaderHandler.getChartSet()); + } + + response = httpClient.execute(httpPost); + if (response.getStatusLine().getStatusCode() == 200) { + result = EntityUtils.toString(response.getEntity(), httpHeaderHandler.getChartSet()); + } + } catch (Exception var22) { + Exception e = var22; + System.out.println("发送GET请求出现异常!" + e); + e.printStackTrace(); + } finally { + IOException e; + try { + if (response != null) { + response.close(); + } + + httpPost.releaseConnection(); + httpClient.close(); + } catch (IOException var21) { + e = var21; + e.printStackTrace(); + } + + if (httpClient != null) { + try { + httpClient.close(); + } catch (IOException var20) { + e = var20; + e.printStackTrace(); + } + } + + } + + return result; + } + public static String sendGetData(String url, String encoding, String token, DefaultHttpHeaderHandler httpHeaderHandler) { + String result = ""; + CloseableHttpResponse response = null; + if (httpHeaderHandler == null) { + httpHeaderHandler = new DefaultHttpHeaderHandler(); + } + + CloseableHttpClient httpClient = null; + + try { + httpClient = HttpClients.createDefault(); + HttpGet httpGet = new HttpGet(url); + httpHeaderHandler.setHeader(httpGet, token); + response = httpClient.execute(httpGet); + if (response.getStatusLine().getStatusCode() == 200) { + result = EntityUtils.toString(response.getEntity(), encoding); + } + } catch (Exception var20) { + Exception e = var20; + e.printStackTrace(); + System.out.println("发送GET请求出现异常!" + e); + } finally { + IOException e; + if (response != null) { + try { + response.close(); + } catch (IOException var19) { + e = var19; + e.printStackTrace(); + } + } + + if (httpClient != null) { + try { + httpClient.close(); + } catch (IOException var18) { + e = var18; + e.printStackTrace(); + } + } + + } + + return result; + } + public static String sendGetEntityData(String url, String encoding, Map param, String token, DefaultHttpHeaderHandler httpHeaderHandler) { + String result = ""; + CloseableHttpResponse response = null; + if (httpHeaderHandler == null) { + httpHeaderHandler = new DefaultHttpHeaderHandler(); + } + CloseableHttpClient httpClient =null; + try { + httpClient = HttpClients.createDefault(); + HttpGetWithEntity httpGet = new HttpGetWithEntity(url); + httpHeaderHandler.setHeader(httpGet, token); + if (httpHeaderHandler.isJson()) { + jsonParams(param, httpGet); + } else { + formParams(param, httpGet, httpHeaderHandler.getChartSet()); + } + response = httpClient.execute(httpGet); + if (response.getStatusLine().getStatusCode() == 200) { + result = EntityUtils.toString(response.getEntity(), encoding); + } + } catch (Exception var16) { + Exception e = var16; + e.printStackTrace(); + System.out.println("发送GET请求出现异常!" + e); + } finally { + if (response != null) { + try { + response.close(); + } catch (IOException var15) { + IOException e = var15; + e.printStackTrace(); + } + } + if (httpClient != null) { + try { + httpClient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + } + + return result; + } + + public static String sendDelete(String url, Map param, String token, DefaultHttpHeaderHandler handler) { + try { + StringBuffer query = new StringBuffer(); + Iterator var5 = param.entrySet().iterator(); + + while (var5.hasNext()) { + Map.Entry kv = (Map.Entry) var5.next(); + query.append(URLEncoder.encode((String) kv.getKey(), handler.getChartSet()) + "="); + query.append(URLEncoder.encode((String) kv.getValue(), handler.getChartSet()) + "&"); + } + + if (query.lastIndexOf("&") > 0) { + query.deleteCharAt(query.length() - 1); + } + String urlNameString = url + "?" + query.toString(); + String var14 = sendDeleteData(urlNameString, handler.getChartSet(), token, handler); + return var14; + } catch (Exception var10) { + Exception e = var10; + e.printStackTrace(); + System.out.println("发送GET请求出现异常!" + e); + return ""; + } finally { + ; + } + } + private static final Logger logger = LoggerFactory.getLogger(AvUtil.class); + /** + * http 请求 + * + * @param url + * @param encoding + * @param token + * @param httpHeaderHandler + * @return + */ + public static String sendDeleteData(String url, String encoding, String token, DefaultHttpHeaderHandler httpHeaderHandler) { + String result = ""; + CloseableHttpResponse response = null; + if (httpHeaderHandler == null) { + httpHeaderHandler = new DefaultHttpHeaderHandler(); + } + CloseableHttpClient httpClient = null; + try { + httpClient = HttpClients.createDefault(); + HttpDelete httpGet = new HttpDelete(url); + httpHeaderHandler.setHeader(httpGet, token); + response = httpClient.execute(httpGet); + if (response.getStatusLine().getStatusCode() == 200) { + logger.info("----------------------------------:"+EntityUtils.toString(response.getEntity(), encoding)); + result = EntityUtils.toString(response.getEntity(), encoding); + } + } catch (Exception var16) { + Exception e = var16; + e.printStackTrace(); + } finally { + if (response != null) { + try { + response.close(); + } catch (IOException var15) { + IOException e = var15; + e.printStackTrace(); + } + } + if (httpClient != null) { + try { + httpClient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return result; + } + public static void jsonParams(Map map, HttpPost post) { + String paramJson = JSONObject.toJSONString(map); + StringEntity stringEntity = new StringEntity(paramJson, ContentType.create("application/json", "UTF-8")); + post.setEntity(stringEntity); + } + + public static void formParams(Map map, HttpPost post, String chartSet) throws UnsupportedEncodingException { + List nameValuePairs = new ArrayList(); + if (map != null) { + Iterator var4 = map.entrySet().iterator(); + + while(var4.hasNext()) { + Map.Entry entry = (Map.Entry)var4.next(); + nameValuePairs.add(new BasicNameValuePair((String)entry.getKey(), (String)entry.getValue())); + } + } + + post.setEntity(new UrlEncodedFormEntity(nameValuePairs, chartSet)); + } + public static void jsonParams(Map map, HttpGetWithEntity post) { + String paramJson = JSONObject.toJSONString(map); + StringEntity stringEntity = new StringEntity(paramJson, ContentType.create("application/json", "UTF-8")); + + post.setEntity(stringEntity); + } + + public static void formParams(Map map, HttpGetWithEntity post, String chartSet) throws UnsupportedEncodingException { + List nameValuePairs = new ArrayList(); + if (map != null) { + Iterator var4 = map.entrySet().iterator(); + + while (var4.hasNext()) { + Map.Entry entry = (Map.Entry) var4.next(); + nameValuePairs.add(new BasicNameValuePair((String) entry.getKey(), (String) entry.getValue())); + } + } + + post.setEntity(new UrlEncodedFormEntity(nameValuePairs, chartSet)); + } +} \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/util/AvUtil.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/util/AvUtil.java new file mode 100644 index 0000000..9575627 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/util/AvUtil.java @@ -0,0 +1,171 @@ +package com.casic.missiles.modular.device.util; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.TypeReference; +import com.casic.missiles.modular.device.dto.AvDeviceDTO; +import com.casic.missiles.modular.device.dto.AvPageResponse; +import com.casic.missiles.modular.device.dto.DeviceRelationshipDTO; +import com.casic.missiles.modular.device.dto.page.AvPageRequest; +import com.casic.missiles.modular.device.dto.stream.StreamRequestDTO; +import com.casic.missiles.modular.device.enums.AvUrlEnums; +import com.casic.missiles.modular.device.http.AvDefaultHttpHeaderHandler; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 艾薇对接工具类 + */ +public class AvUtil { + private static final Logger logger = LoggerFactory.getLogger(AvUtil.class); + + /** + * 设备列表读取 + * + * @param baseUrl av流媒体地址 + * @param token 认证令牌 + * @param pageRequest 请求体 + * @return + */ + public static List selectDevices(String baseUrl, String token, AvPageRequest pageRequest) { + AvDefaultHttpHeaderHandler dcDefaultHttpHeaderHandler = new AvDefaultHttpHeaderHandler(); + dcDefaultHttpHeaderHandler.setJson(true); + Map param = new HashMap<>(); + param.put("page", pageRequest.getPage() + ""); + param.put("paging", pageRequest.getPaging() + ""); + param.put("limit", "100000"); + param.put("token", token); + String res = AvHttpUtils.sendGet(baseUrl + AvUrlEnums.DEVICE.getUrl(), param, token, dcDefaultHttpHeaderHandler); + logger.info("selectDevices:{}", res); + if (StrUtil.isEmpty(res)) { + logger.error("av device sync error!"); + } + AvPageResponse deviceDTOS = JSON.parseObject(res, new TypeReference() { + }); + return deviceDTOS.getItems(); + } + + /** + * 创建流 + * + * @param baseUrl av流媒体地址 + * @param token 认证令牌 + * @param streamRequestDTO 请求体 + * @return + */ + public static Object selectStreams(String baseUrl, String token, StreamRequestDTO streamRequestDTO) { + + Map param = new HashMap<>(); + param.put("device_id", streamRequestDTO.getDevice_id() + ""); + param.put("stream_type", streamRequestDTO.getStream_type() + ""); + param.put("quality", streamRequestDTO.getQuality() + ""); + param.put("token", token); + param.put("from", streamRequestDTO.getFrom() + ""); + param.put("to", streamRequestDTO.getTo() + ""); + logger.info("url:{}", baseUrl + AvUrlEnums.STREAM.getUrl()); + AvDefaultHttpHeaderHandler dcDefaultHttpHeaderHandler = new AvDefaultHttpHeaderHandler(); + dcDefaultHttpHeaderHandler.setJson(true); + String res = AvHttpUtils.sendPost(baseUrl + AvUrlEnums.STREAM.getUrl(), param, token, dcDefaultHttpHeaderHandler); + + if (StrUtil.isEmpty(res)) { + logger.error("av stream error:{}", streamRequestDTO.getDevice_id()); + return null; + } + return JSON.parseObject(res); + } + + /** + * 发送心跳 + * + * @param avUrl + * @param avToken + * @return + */ + public static Object dict(String avUrl, String avToken) { + AvDefaultHttpHeaderHandler dcDefaultHttpHeaderHandler = new AvDefaultHttpHeaderHandler(); + dcDefaultHttpHeaderHandler.setJson(true); + Map param = new HashMap<>(); + String res = AvHttpUtils.sendGet(avUrl + AvUrlEnums.DICT.getUrl(), param, avToken, dcDefaultHttpHeaderHandler); + logger.info("av dict:{}", res); + return null; + } + + /** + * 发送心跳 + * + * @param avUrl + * @param avToken + * @param id + * @return + */ + public static Object heart(String avUrl, String avToken, String id) { + AvDefaultHttpHeaderHandler dcDefaultHttpHeaderHandler = new AvDefaultHttpHeaderHandler(); + dcDefaultHttpHeaderHandler.setJson(true); + Map param = new HashMap<>(); +// param.put("id", id); +// param.put("token", avToken); + String res = AvHttpUtils.sendGet(avUrl + String.format(AvUrlEnums.HEART.getUrl(), id), param, avToken, dcDefaultHttpHeaderHandler); + if (StrUtil.isEmpty(res)) { + logger.error("av heart error:{}", id); + return null; + } + return JSON.parseObject(res); + } + + /** + * 停止流 + * + * @param avUrl 艾薇流媒体地址 + * @param avToken 认证令牌 + * @param id 国标ID + * @return + */ + public static Object stopStreams(String avUrl, String avToken, String id) { + AvDefaultHttpHeaderHandler dcDefaultHttpHeaderHandler = new AvDefaultHttpHeaderHandler(); + dcDefaultHttpHeaderHandler.setJson(true); + Map param = new HashMap<>(); + //param.put("id", id); + String res = AvHttpUtils.sendDelete(avUrl + String.format(AvUrlEnums.STREAM_STOP.getUrl(), id), param, avToken, dcDefaultHttpHeaderHandler); + + if (StrUtil.isEmpty(res)) { + logger.error("av stopStreams error:{}", id); + return null; + } + return JSON.parseObject(res); + } + + /** + * 用户设备关系 + * + * @param avUrl 艾薇流媒体地址 + * @param avToken 认证令牌 + * @return + */ + public static List userDeviceRelationships(String avUrl, String avToken) { + + AvDefaultHttpHeaderHandler avDefaultHttpHeaderHandler = new AvDefaultHttpHeaderHandler(); + avDefaultHttpHeaderHandler.setJson(true); + Map param = new HashMap<>(); + String res = AvHttpUtils.sendGetJson(avUrl + AvUrlEnums.USER_DEVICE_RELATION.getUrl(), param, avToken, avDefaultHttpHeaderHandler); + if (StrUtil.isEmpty(res)) { + logger.error("av userDeviceRelationships error"); + return null; + } + + List deviceDTOS = JSON.parseObject(res, new TypeReference>() { + }); + if (CollectionUtil.isNotEmpty(deviceDTOS)) { + for (DeviceRelationshipDTO deviceDTO : deviceDTOS) { + if (StrUtil.isNotEmpty(deviceDTO.getDevice_list())) { + deviceDTO.setDeviceList(StrUtil.split(deviceDTO.getDevice_list(), ",")); + } + } + } + return deviceDTOS; + } +} \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/task/AvTask.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/task/AvTask.java new file mode 100644 index 0000000..46ccc41 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/task/AvTask.java @@ -0,0 +1,46 @@ +package com.casic.missiles.modular.task; + +import com.casic.missiles.modular.device.service.IAvSyncService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +@Slf4j +@Component +public class AvTask { + + @Resource + private IAvSyncService deviceStatusService; + @Value("${casic.video.av.open:-1}") + private Boolean open; + @Value("${casic.video.av.token:-1}") + private String token; + + /** + * 设备信息同步0 + * 每30分钟采集一次 + */ + @Scheduled(cron = "${casic.video.av.deviceCorn}") + public void device() { + //更新组织机构信息 + log.info("av sdk 设备信息同步"); + if (open) { + deviceStatusService.syncDcDevices(token); + } + log.info("av sdk 设备同步结束"); + } + + @Scheduled(cron = "${casic.video.av.deviceStatusCorn}") + public void deviceRefreshToken() { + //更新组织机构信息 + log.info("av 设备状态刷新"); + if (open) { + deviceStatusService.loadUserDeviceRelationships(); + } + + log.info("av 设备状态刷新"); + } +} \ No newline at end of file diff --git a/casic-device-sync/casic-device-dc/src/main/java/com/casic/missiles/modular/http/DcDefaultHttpHeaderHandler.java b/casic-device-sync/casic-device-dc/src/main/java/com/casic/missiles/modular/http/DcDefaultHttpHeaderHandler.java index 550b9d4..e3ee94f 100644 --- a/casic-device-sync/casic-device-dc/src/main/java/com/casic/missiles/modular/http/DcDefaultHttpHeaderHandler.java +++ b/casic-device-sync/casic-device-dc/src/main/java/com/casic/missiles/modular/http/DcDefaultHttpHeaderHandler.java @@ -12,4 +12,6 @@ } } + + } diff --git a/casic-server-sync/src/main/java/com/casic/missiles/modular/device/controller/GateController.java b/casic-server-sync/src/main/java/com/casic/missiles/modular/device/controller/GateController.java index 1108110..efd28e1 100644 --- a/casic-server-sync/src/main/java/com/casic/missiles/modular/device/controller/GateController.java +++ b/casic-server-sync/src/main/java/com/casic/missiles/modular/device/controller/GateController.java @@ -58,9 +58,9 @@ return; } -// String dn = new String(request.getHeader("dnname").getBytes("ISO8859-1"), "UTF-8"); -// String account = getValueByDn(dn, key1); - String account = x; + String dn = new String(request.getHeader("dnname").getBytes("ISO8859-1"), "UTF-8"); + String account = getValueByDn(dn, key1); +// String account = x; //token自定义 CasicCustomToken token = new CasicCustomToken(account, "password"); token.setType(LoginType.NO_PASSWD); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/device/service/ISysGroupDeviceService.java b/casic-server/src/main/java/com/casic/missiles/modular/device/service/ISysGroupDeviceService.java index 2bf6155..724ce26 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/device/service/ISysGroupDeviceService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/device/service/ISysGroupDeviceService.java @@ -29,4 +29,12 @@ * @param relDTO */ void batchAdd(GroupRelDTO relDTO); + + + /** + * 增量更新 + * @param groupId + * @param deviceIds + */ + void batchIncremental(Long groupId, List deviceIds); } diff --git a/README.md b/README.md index 430796e..8dbc9a5 100644 --- a/README.md +++ b/README.md @@ -9,3 +9,7 @@ #### 其他 >* [git地址](http://192.168.0.203:8080/gitbucket) >* [本地免登地址](http://localhost:8083/route/mockToken) + +AView 对接问题 +1.用户设备关联关系 + 对应返回 device_list是否为设备国标号 \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/pom.xml b/casic-device-sync/casic-device-aview/pom.xml index 0a3c5fa..94fb9e5 100644 --- a/casic-device-sync/casic-device-aview/pom.xml +++ b/casic-device-sync/casic-device-aview/pom.xml @@ -33,6 +33,21 @@ ${boot.version} provided + + com.casic + casic-http + ${core.version} + + + com.casic + casic-admin-group + ${admin.version} + + + com.casic + casic-server + ${pro.version} + diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java new file mode 100644 index 0000000..195cba2 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.device.controller; + +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import com.casic.missiles.modular.device.dto.stream.StreamRequestDTO; +import com.casic.missiles.modular.device.service.IAvSyncService; +import io.swagger.annotations.Api; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +@Api(tags = "AV平台代理接口") +@RestController +@RequestMapping("/route") +public class AvRouteController { + @Resource + private IAvSyncService avSyncService; + + @PostMapping("/open/v1/api/streams") + public Object streams(@RequestBody StreamRequestDTO requestDTO) { + Object object = avSyncService.getStreams(requestDTO); + if (object == null) { + ResponseDataDTO respDTO = ResponseDataDTO.error("流读取失败,请稍后重试!"); + respDTO.setMessage("流读取失败,请稍后重试!"); + return respDTO; + } + return ResponseDataDTO.success(avSyncService.getStreams(requestDTO)); + } + + @DeleteMapping("/open/v1/api/streams/{id}") + public Object stopStreams(@PathVariable("id") String id) { + Object object = avSyncService.stopStreams(id); + return ResponseDataDTO.success(object); + } + + @PostMapping("/open/v1/api/streams/{id}/heart") + public Object heart(@PathVariable("id") String id) { + Object object = avSyncService.heart(id); + if (object == null) { + ResponseDataDTO respDTO = ResponseDataDTO.error("流心跳失败,请稍后重试!"); + respDTO.setMessage("流心跳失败,请稍后重试!"); + return respDTO; + } + return ResponseDataDTO.success(object); + } +} \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java new file mode 100644 index 0000000..97bde9f --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java @@ -0,0 +1,49 @@ +package com.casic.missiles.modular.device.dto; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; + +/** + * 艾薇设备对象DTO + */ +@Data +public class AvDeviceDTO { + // 设备ID + private Long id; + + // 设备名称 + private String name; + + // 设备唯一国标序列号 + private String sn; + + // 设备类型 + private Integer type; + + // 设备版本号 + private String version; + + // 安全等级 + @JSONField(name = "secure_level") + private String secureLevel; + + // 设备状态 + private Integer status; + + // 云台类型 + private Integer ptzType; + + // 朝向 + private Integer orientation; + + // 创建时间 + @JSONField(name = "gmt_created") + private String gmtCreated; + + // 修改时间 + @JSONField(name = "gmt_modified") + private String gmtModified; + + // 数据状态 + private Integer state; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java new file mode 100644 index 0000000..9a05183 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java @@ -0,0 +1,10 @@ +package com.casic.missiles.modular.device.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class AvPageResponse { + private List items; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java new file mode 100644 index 0000000..098dda4 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.device.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class DeviceRelationshipDTO { + private Long user_id; + private String device_list; + private List deviceList; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java new file mode 100644 index 0000000..74e6a9b --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java @@ -0,0 +1,9 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +@Data +public class AvPageRep { + private Integer total; + private T list; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java new file mode 100644 index 0000000..900ae4a --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +/** + * 分页请求DTO + */ +@Data +public class AvPageRequest { + private int page; + private int paging; + private int limit; + +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java new file mode 100644 index 0000000..f1c1e7a --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +/** + * mvp返回基类封装 + * + * @param + */ +@Data +public class AvResponseDTO { + private T data; + private Integer code; + private String msg; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamRequestDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamRequestDTO.java new file mode 100644 index 0000000..69e88ce --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamRequestDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.device.dto.stream; + +import lombok.Data; + +@Data +public class StreamRequestDTO { + private String device_id; + private String stream_type; + private String quality; + private int from; + private int to; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamStopRequestDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamStopRequestDTO.java new file mode 100644 index 0000000..9cf94b1 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamStopRequestDTO.java @@ -0,0 +1,11 @@ +package com.casic.missiles.modular.device.dto.stream; + +import lombok.Data; + +@Data +public class StreamStopRequestDTO { + private String id; + private String type; + private StreamRequestDTO request; + private String url; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvDataStateEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvDataStateEnum.java new file mode 100644 index 0000000..e1a6658 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvDataStateEnum.java @@ -0,0 +1,72 @@ +package com.casic.missiles.modular.device.enums; + +/** + * 数据状态 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvDataStateEnum { + + TYPE0(0, "有效",0), + DEL(1, "无效",1); + + Integer code; + String message; + Integer type; + AvDataStateEnum(Integer code, String message, Integer type) { + this.code = code; + this.message = message; + this.type = type; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public static String valueOfs(Integer value) { + if (value == null) { + return ""; + } else { + for (AvDataStateEnum ms : AvDataStateEnum.values()) { + if (ms.getCode().equals(value)) { + return ms.getMessage(); + } + } + return ""; + } + } + + public static AvDataStateEnum valueOfType(Integer value) { + if (value == null) { + return TYPE0; + } else { + for (AvDataStateEnum ms : AvDataStateEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return TYPE0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvPtzTypeEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvPtzTypeEnum.java new file mode 100644 index 0000000..fdcb08d --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvPtzTypeEnum.java @@ -0,0 +1,73 @@ +package com.casic.missiles.modular.device.enums; + +/** + * wvp设备类型转换 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvPtzTypeEnum { + + TYPE0(0, "枪机",0), + TYPE1(1, "半球",1), + TYPE2(2, "球机",2); + + Integer code; + String message; + Integer type; + AvPtzTypeEnum(Integer code, String message, Integer type) { + this.code = code; + this.message = message; + this.type = type; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public static String valueOfs(Integer value) { + if (value == null) { + return ""; + } else { + for (AvPtzTypeEnum ms : AvPtzTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms.getMessage(); + } + } + return ""; + } + } + + public static AvPtzTypeEnum valueOfType(Integer value) { + if (value == null) { + return TYPE0; + } else { + for (AvPtzTypeEnum ms : AvPtzTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return TYPE0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvSecretLevelEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvSecretLevelEnum.java new file mode 100644 index 0000000..39e8524 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvSecretLevelEnum.java @@ -0,0 +1,60 @@ +package com.casic.missiles.modular.device.enums; + +/** + * Av主数据密集对应关系枚举 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvSecretLevelEnum { + s("999", "未定密", 999, "未定密"), + s0("0", "公开", 0, "公开"), + s1("1", "内部", 1, "内部"), + s2("2", "秘密", 2, "秘密"), + s3("3", "机密", 3, "机密"); + + String code; + Integer currCode; + String message; + String currMsg; + + AvSecretLevelEnum(String code, String message, Integer currCode, String currMsg) { + this.code = code; + this.currCode = currCode; + this.message = message; + this.currMsg = currMsg; + } + + public Integer getCurrCode() { + return currCode; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public static AvSecretLevelEnum valueOfCode(String value) { + if (value == null) { + return s0; + } else { + for (AvSecretLevelEnum ms : AvSecretLevelEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return s0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvStatusTypeEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvStatusTypeEnum.java new file mode 100644 index 0000000..ddccd52 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvStatusTypeEnum.java @@ -0,0 +1,72 @@ +package com.casic.missiles.modular.device.enums; + +/** + * wvp设备类型转换 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvStatusTypeEnum { + + TYPE0(0, "离线",0), + TYPE1(1, "在线",1); + + Integer code; + String message; + Integer type; + AvStatusTypeEnum(Integer code, String message, Integer type) { + this.code = code; + this.message = message; + this.type = type; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public static String valueOfs(Integer value) { + if (value == null) { + return ""; + } else { + for (AvStatusTypeEnum ms : AvStatusTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms.getMessage(); + } + } + return ""; + } + } + + public static AvStatusTypeEnum valueOfType(Integer value) { + if (value == null) { + return TYPE0; + } else { + for (AvStatusTypeEnum ms : AvStatusTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return TYPE0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvUrlEnums.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvUrlEnums.java new file mode 100644 index 0000000..04b38ad --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvUrlEnums.java @@ -0,0 +1,37 @@ +package com.casic.missiles.modular.device.enums; + +/** + * 设备媒体 + */ +public enum AvUrlEnums { + DEVICE("/open/v1/api/devices","设备信息查询"), + STREAM("/open/v1/api/streams","创建流"), + STREAM_STOP("/open/v1/api/streams/%s","停止流"), + HEART("/open/v1/api/streams/%s/heartbeat","发送心跳"), + DICT("/open/v1/api/dictionary_datas","字典查询"), + USER_DEVICE_RELATION("/open/v1/api/user_device_relationships","用户设备关联关系"); + + private String url; + private String name; + + AvUrlEnums(String url, String name) { + this.url = url; + this.name = name; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/AvDefaultHttpHeaderHandler.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/AvDefaultHttpHeaderHandler.java new file mode 100644 index 0000000..53f0a5c --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/AvDefaultHttpHeaderHandler.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.device.http; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.modular.system.handler.DefaultHttpHeaderHandler; +import org.apache.http.client.methods.HttpRequestBase; + +public class AvDefaultHttpHeaderHandler extends DefaultHttpHeaderHandler { + public void setHeader(HttpRequestBase base, String token) { + base.addHeader("Content-type", DEFAULT_CONTEXTTYPE); + if (StrUtil.isNotEmpty(token)) { + base.addHeader("X-OApi-Token", token); + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/HttpGetWithEntity.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/HttpGetWithEntity.java new file mode 100644 index 0000000..b8abf8f --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/HttpGetWithEntity.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.device.http; + +import org.apache.http.client.methods.HttpEntityEnclosingRequestBase; + +import java.net.URI; + +public class HttpGetWithEntity extends HttpEntityEnclosingRequestBase { + + public HttpGetWithEntity(URI uri) { + this.setURI(uri); + } + + public HttpGetWithEntity(String uri) { + this.setURI(URI.create(uri)); + } + + public String getMethod() { + return "GET"; + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/IAvSyncService.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/IAvSyncService.java new file mode 100644 index 0000000..13c3203 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/IAvSyncService.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.device.service; + +import com.casic.missiles.modular.device.dto.stream.StreamRequestDTO; + +public interface IAvSyncService { + /** + * Dc706设备信息同步 + */ + void syncDcDevices(String token); + + /** + * 创建流 + * + * @param streamRequestDTO + * @return + */ + Object getStreams(StreamRequestDTO streamRequestDTO); + + /** + * 停止流 + * + * @param id + * @return + */ + Object stopStreams(String id); + + /** + * 发送心跳 + * + * @param id 设备国标号 + * @return + */ + Object heart(String id); + + /** + * 设备权限更新 + */ + void loadUserDeviceRelationships(); +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/impl/AvSyncServiceImpl.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/impl/AvSyncServiceImpl.java new file mode 100644 index 0000000..25e3340 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/impl/AvSyncServiceImpl.java @@ -0,0 +1,179 @@ +package com.casic.missiles.modular.device.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.casic.missiles.core.application.service.AbstractUserService; +import com.casic.missiles.modular.device.dto.AvDeviceDTO; +import com.casic.missiles.modular.device.dto.DeviceRelationshipDTO; +import com.casic.missiles.modular.device.dto.page.AvPageRequest; +import com.casic.missiles.modular.device.dto.stream.StreamRequestDTO; +import com.casic.missiles.modular.device.enums.AvDataStateEnum; +import com.casic.missiles.modular.device.enums.AvPtzTypeEnum; +import com.casic.missiles.modular.device.enums.AvSecretLevelEnum; +import com.casic.missiles.modular.device.enums.AvStatusTypeEnum; +import com.casic.missiles.modular.device.model.BusDeviceInfo; +import com.casic.missiles.modular.device.service.IAvSyncService; +import com.casic.missiles.modular.device.service.IBusDeviceInfoService; +import com.casic.missiles.modular.device.service.ISysGroupDeviceService; +import com.casic.missiles.modular.device.util.AvUtil; +import com.casic.missiles.modular.system.model.SysUserGroup; +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.modular.system.service.ISysUserGroupService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; +@Slf4j +@Service +public class AvSyncServiceImpl implements IAvSyncService { + @Value("${casic.video.av.url:-1}") + private String avUrl; + @Value("${casic.video.av.token:-1}") + private String avToken; + @Resource + private IBusDeviceInfoService deviceInfoService; + @Resource + private AbstractUserService abstractUserService; + + @Resource + private ISysUserGroupService userGroupService; + @Resource + private ISysGroupDeviceService sysGroupDeviceService; + + @Override + public void syncDcDevices(String token) { + AvPageRequest avPageRequest = new AvPageRequest(); + avPageRequest.setPage(1); + avPageRequest.setPaging(1); + + //全量查询设备信息 + List deviceDTOS = AvUtil.selectDevices(avUrl, token, avPageRequest); + + if (CollectionUtil.isNotEmpty(deviceDTOS)) { + for (AvDeviceDTO dcDeviceDTO : deviceDTOS) { + BusDeviceInfo busDeviceInfo = this.convertDevice(dcDeviceDTO); + + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(BusDeviceInfo::getCameraIndexCode, dcDeviceDTO.getSn()); + this.deviceInfoService.saveOrUpdate(busDeviceInfo, query); + } + + List deviceSns = deviceDTOS.stream().filter(dto -> AvDataStateEnum.DEL.equals(dto.getState())).map(AvDeviceDTO::getSn).collect(Collectors.toList()); + + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.in(BusDeviceInfo::getCameraIndexCode, deviceSns); + if (CollectionUtil.isNotEmpty(deviceSns)) { + this.deviceInfoService.remove(query); + } + } + +// AvUtil.dict(avUrl,avToken); + } + + /** + * 流地址请求 + * + * @param streamRequestDTO + * @return + */ + @Override + public Object getStreams(StreamRequestDTO streamRequestDTO) { + return AvUtil.selectStreams(avUrl, avToken, streamRequestDTO); + } + + @Override + public Object stopStreams(String id) { + return AvUtil.stopStreams(avUrl, avToken, id); + } + + @Override + public Object heart(String id) { + return AvUtil.heart(avUrl, avToken, id); + } + + @Transactional + @Override + public void loadUserDeviceRelationships() { + + List relationshipDTOS = AvUtil.userDeviceRelationships(avUrl, avToken); + log.info("loadUserDeviceRelationships: {}", relationshipDTOS); + + for (DeviceRelationshipDTO relationshipDTO : relationshipDTOS) { + + //检索用户信息 + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(User::getSyncId, relationshipDTO.getUser_id()); + List users = abstractUserService.list(query); + + if (users != null&&users.size() > 0) { + User user = users.get(0); + //创建用户组 + LambdaQueryWrapper groupQuery = new LambdaQueryWrapper<>(); + String groupName = user.getName() + user.getId(); + groupQuery.eq(SysUserGroup::getGroupName, groupName); + SysUserGroup sysUserGroup = userGroupService.getOne(groupQuery); + + if (sysUserGroup == null) { + sysUserGroup = genSysUserGroup(groupName, user); + List userIds = new ArrayList<>(); + userIds.add(user.getId()); + userGroupService.createSysUserGroup(sysUserGroup, userIds); + } + + LambdaQueryWrapper deviceQuery = new LambdaQueryWrapper<>(); + deviceQuery.in(BusDeviceInfo::getCameraIndexCode, relationshipDTO.getDeviceList()); + List busDeviceInfos = deviceInfoService.list(deviceQuery); + + if (CollectionUtil.isNotEmpty(busDeviceInfos)) { + List list = busDeviceInfos.stream().map(BusDeviceInfo::getId).collect(Collectors.toList()); + sysGroupDeviceService.batchIncremental(sysUserGroup.getId(), list); + } + + }else{ + log.error("loadUserDeviceRelationships is empty: {}", relationshipDTO.getUser_id()); + } + } + } + + private SysUserGroup genSysUserGroup(String groupName, User user) { + SysUserGroup sysUserGroup = new SysUserGroup(); + sysUserGroup.setGroupName(groupName); + sysUserGroup.setCreateTime(new Date()); + sysUserGroup.setCreateId(user.getId()); + sysUserGroup.setDeptId(user.getDeptId()); + sysUserGroup.setDescription("默认创建分组,不可修改!"); + sysUserGroup.setSafe(0); + return sysUserGroup; + } + + /** + * 设备类型数据转换 + * + * @param dto 艾薇设备信息 + * @return + */ + private BusDeviceInfo convertDevice(AvDeviceDTO dto) { + BusDeviceInfo info = new BusDeviceInfo(); + info.setCreateTime(new Date()); + info.setUpdateTime(new Date()); + + //转换为本地密级编码 + info.setSecretLevel(AvSecretLevelEnum.valueOfCode(dto.getSecureLevel()).getCurrCode()); + + info.setDeviceStatus(AvStatusTypeEnum.valueOfType(dto.getStatus()).getType()); + info.setCameraIndexCode(dto.getSn()); + info.setMonitorName(dto.getName()); + + //PTZ type类型 + info.setDeviceType(AvPtzTypeEnum.valueOfType(dto.getPtzType()).getType() + ""); + info.setBfFlag(0); + + return info; + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/util/AvHttpUtils.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/util/AvHttpUtils.java new file mode 100644 index 0000000..083d88a --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/util/AvHttpUtils.java @@ -0,0 +1,331 @@ +package com.casic.missiles.modular.device.util; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.modular.device.http.HttpGetWithEntity; +import com.casic.missiles.modular.system.handler.DefaultHttpHeaderHandler; +import org.apache.http.NameValuePair; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpDelete; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.util.EntityUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +public class AvHttpUtils { + + public static String sendGetJson(String url, Map param, String token, DefaultHttpHeaderHandler handler) { + try { + StringBuffer query = new StringBuffer(); + String var14 = sendGetEntityData(url, handler.getChartSet(), param, token, handler); + return var14; + } catch (Exception var10) { + Exception e = var10; + e.printStackTrace(); + System.out.println("发送GET请求出现异常!" + e); + return ""; + } finally { + ; + } + } + public static String sendGet(String url, Map param, String token, DefaultHttpHeaderHandler handler) { + try { + StringBuffer query = new StringBuffer(); + Iterator var5 = param.entrySet().iterator(); + + while(var5.hasNext()) { + Map.Entry kv = (Map.Entry)var5.next(); + query.append(URLEncoder.encode((String)kv.getKey(), handler.getChartSet()) + "="); + query.append(URLEncoder.encode((String)kv.getValue(), handler.getChartSet()) + "&"); + } + + if (query.lastIndexOf("&") > 0) { + query.deleteCharAt(query.length() - 1); + } + + String urlNameString = url + "?" + query.toString(); + String var14 = sendGetData(urlNameString, handler.getChartSet(), token, handler); + return var14; + } catch (Exception var10) { + Exception e = var10; + e.printStackTrace(); + System.out.println("发送GET请求出现异常!" + e); + return ""; + } finally { + ; + } + } + public static String sendPost(String url, Map param, String token, DefaultHttpHeaderHandler httpHeaderHandler) { + return sendPostDataByMap(url, param, "utf8", token, httpHeaderHandler); + } + public static String sendPostDataByMap(String url, Map map, String encoding, String token, DefaultHttpHeaderHandler httpHeaderHandler) { + String result = ""; + CloseableHttpResponse response = null; + CloseableHttpClient httpClient = null; + HttpPost httpPost = null; + + try { + httpClient = HttpClients.createDefault(); + httpPost = new HttpPost(url); + httpPost.setHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)"); + httpHeaderHandler.setHeader(httpPost, token); + if (httpHeaderHandler.isJson()) { + jsonParams(map, httpPost); + } else { + formParams(map, httpPost, httpHeaderHandler.getChartSet()); + } + + response = httpClient.execute(httpPost); + if (response.getStatusLine().getStatusCode() == 200) { + result = EntityUtils.toString(response.getEntity(), httpHeaderHandler.getChartSet()); + } + } catch (Exception var22) { + Exception e = var22; + System.out.println("发送GET请求出现异常!" + e); + e.printStackTrace(); + } finally { + IOException e; + try { + if (response != null) { + response.close(); + } + + httpPost.releaseConnection(); + httpClient.close(); + } catch (IOException var21) { + e = var21; + e.printStackTrace(); + } + + if (httpClient != null) { + try { + httpClient.close(); + } catch (IOException var20) { + e = var20; + e.printStackTrace(); + } + } + + } + + return result; + } + public static String sendGetData(String url, String encoding, String token, DefaultHttpHeaderHandler httpHeaderHandler) { + String result = ""; + CloseableHttpResponse response = null; + if (httpHeaderHandler == null) { + httpHeaderHandler = new DefaultHttpHeaderHandler(); + } + + CloseableHttpClient httpClient = null; + + try { + httpClient = HttpClients.createDefault(); + HttpGet httpGet = new HttpGet(url); + httpHeaderHandler.setHeader(httpGet, token); + response = httpClient.execute(httpGet); + if (response.getStatusLine().getStatusCode() == 200) { + result = EntityUtils.toString(response.getEntity(), encoding); + } + } catch (Exception var20) { + Exception e = var20; + e.printStackTrace(); + System.out.println("发送GET请求出现异常!" + e); + } finally { + IOException e; + if (response != null) { + try { + response.close(); + } catch (IOException var19) { + e = var19; + e.printStackTrace(); + } + } + + if (httpClient != null) { + try { + httpClient.close(); + } catch (IOException var18) { + e = var18; + e.printStackTrace(); + } + } + + } + + return result; + } + public static String sendGetEntityData(String url, String encoding, Map param, String token, DefaultHttpHeaderHandler httpHeaderHandler) { + String result = ""; + CloseableHttpResponse response = null; + if (httpHeaderHandler == null) { + httpHeaderHandler = new DefaultHttpHeaderHandler(); + } + CloseableHttpClient httpClient =null; + try { + httpClient = HttpClients.createDefault(); + HttpGetWithEntity httpGet = new HttpGetWithEntity(url); + httpHeaderHandler.setHeader(httpGet, token); + if (httpHeaderHandler.isJson()) { + jsonParams(param, httpGet); + } else { + formParams(param, httpGet, httpHeaderHandler.getChartSet()); + } + response = httpClient.execute(httpGet); + if (response.getStatusLine().getStatusCode() == 200) { + result = EntityUtils.toString(response.getEntity(), encoding); + } + } catch (Exception var16) { + Exception e = var16; + e.printStackTrace(); + System.out.println("发送GET请求出现异常!" + e); + } finally { + if (response != null) { + try { + response.close(); + } catch (IOException var15) { + IOException e = var15; + e.printStackTrace(); + } + } + if (httpClient != null) { + try { + httpClient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + } + + return result; + } + + public static String sendDelete(String url, Map param, String token, DefaultHttpHeaderHandler handler) { + try { + StringBuffer query = new StringBuffer(); + Iterator var5 = param.entrySet().iterator(); + + while (var5.hasNext()) { + Map.Entry kv = (Map.Entry) var5.next(); + query.append(URLEncoder.encode((String) kv.getKey(), handler.getChartSet()) + "="); + query.append(URLEncoder.encode((String) kv.getValue(), handler.getChartSet()) + "&"); + } + + if (query.lastIndexOf("&") > 0) { + query.deleteCharAt(query.length() - 1); + } + String urlNameString = url + "?" + query.toString(); + String var14 = sendDeleteData(urlNameString, handler.getChartSet(), token, handler); + return var14; + } catch (Exception var10) { + Exception e = var10; + e.printStackTrace(); + System.out.println("发送GET请求出现异常!" + e); + return ""; + } finally { + ; + } + } + private static final Logger logger = LoggerFactory.getLogger(AvUtil.class); + /** + * http 请求 + * + * @param url + * @param encoding + * @param token + * @param httpHeaderHandler + * @return + */ + public static String sendDeleteData(String url, String encoding, String token, DefaultHttpHeaderHandler httpHeaderHandler) { + String result = ""; + CloseableHttpResponse response = null; + if (httpHeaderHandler == null) { + httpHeaderHandler = new DefaultHttpHeaderHandler(); + } + CloseableHttpClient httpClient = null; + try { + httpClient = HttpClients.createDefault(); + HttpDelete httpGet = new HttpDelete(url); + httpHeaderHandler.setHeader(httpGet, token); + response = httpClient.execute(httpGet); + if (response.getStatusLine().getStatusCode() == 200) { + logger.info("----------------------------------:"+EntityUtils.toString(response.getEntity(), encoding)); + result = EntityUtils.toString(response.getEntity(), encoding); + } + } catch (Exception var16) { + Exception e = var16; + e.printStackTrace(); + } finally { + if (response != null) { + try { + response.close(); + } catch (IOException var15) { + IOException e = var15; + e.printStackTrace(); + } + } + if (httpClient != null) { + try { + httpClient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return result; + } + public static void jsonParams(Map map, HttpPost post) { + String paramJson = JSONObject.toJSONString(map); + StringEntity stringEntity = new StringEntity(paramJson, ContentType.create("application/json", "UTF-8")); + post.setEntity(stringEntity); + } + + public static void formParams(Map map, HttpPost post, String chartSet) throws UnsupportedEncodingException { + List nameValuePairs = new ArrayList(); + if (map != null) { + Iterator var4 = map.entrySet().iterator(); + + while(var4.hasNext()) { + Map.Entry entry = (Map.Entry)var4.next(); + nameValuePairs.add(new BasicNameValuePair((String)entry.getKey(), (String)entry.getValue())); + } + } + + post.setEntity(new UrlEncodedFormEntity(nameValuePairs, chartSet)); + } + public static void jsonParams(Map map, HttpGetWithEntity post) { + String paramJson = JSONObject.toJSONString(map); + StringEntity stringEntity = new StringEntity(paramJson, ContentType.create("application/json", "UTF-8")); + + post.setEntity(stringEntity); + } + + public static void formParams(Map map, HttpGetWithEntity post, String chartSet) throws UnsupportedEncodingException { + List nameValuePairs = new ArrayList(); + if (map != null) { + Iterator var4 = map.entrySet().iterator(); + + while (var4.hasNext()) { + Map.Entry entry = (Map.Entry) var4.next(); + nameValuePairs.add(new BasicNameValuePair((String) entry.getKey(), (String) entry.getValue())); + } + } + + post.setEntity(new UrlEncodedFormEntity(nameValuePairs, chartSet)); + } +} \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/util/AvUtil.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/util/AvUtil.java new file mode 100644 index 0000000..9575627 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/util/AvUtil.java @@ -0,0 +1,171 @@ +package com.casic.missiles.modular.device.util; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.TypeReference; +import com.casic.missiles.modular.device.dto.AvDeviceDTO; +import com.casic.missiles.modular.device.dto.AvPageResponse; +import com.casic.missiles.modular.device.dto.DeviceRelationshipDTO; +import com.casic.missiles.modular.device.dto.page.AvPageRequest; +import com.casic.missiles.modular.device.dto.stream.StreamRequestDTO; +import com.casic.missiles.modular.device.enums.AvUrlEnums; +import com.casic.missiles.modular.device.http.AvDefaultHttpHeaderHandler; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 艾薇对接工具类 + */ +public class AvUtil { + private static final Logger logger = LoggerFactory.getLogger(AvUtil.class); + + /** + * 设备列表读取 + * + * @param baseUrl av流媒体地址 + * @param token 认证令牌 + * @param pageRequest 请求体 + * @return + */ + public static List selectDevices(String baseUrl, String token, AvPageRequest pageRequest) { + AvDefaultHttpHeaderHandler dcDefaultHttpHeaderHandler = new AvDefaultHttpHeaderHandler(); + dcDefaultHttpHeaderHandler.setJson(true); + Map param = new HashMap<>(); + param.put("page", pageRequest.getPage() + ""); + param.put("paging", pageRequest.getPaging() + ""); + param.put("limit", "100000"); + param.put("token", token); + String res = AvHttpUtils.sendGet(baseUrl + AvUrlEnums.DEVICE.getUrl(), param, token, dcDefaultHttpHeaderHandler); + logger.info("selectDevices:{}", res); + if (StrUtil.isEmpty(res)) { + logger.error("av device sync error!"); + } + AvPageResponse deviceDTOS = JSON.parseObject(res, new TypeReference() { + }); + return deviceDTOS.getItems(); + } + + /** + * 创建流 + * + * @param baseUrl av流媒体地址 + * @param token 认证令牌 + * @param streamRequestDTO 请求体 + * @return + */ + public static Object selectStreams(String baseUrl, String token, StreamRequestDTO streamRequestDTO) { + + Map param = new HashMap<>(); + param.put("device_id", streamRequestDTO.getDevice_id() + ""); + param.put("stream_type", streamRequestDTO.getStream_type() + ""); + param.put("quality", streamRequestDTO.getQuality() + ""); + param.put("token", token); + param.put("from", streamRequestDTO.getFrom() + ""); + param.put("to", streamRequestDTO.getTo() + ""); + logger.info("url:{}", baseUrl + AvUrlEnums.STREAM.getUrl()); + AvDefaultHttpHeaderHandler dcDefaultHttpHeaderHandler = new AvDefaultHttpHeaderHandler(); + dcDefaultHttpHeaderHandler.setJson(true); + String res = AvHttpUtils.sendPost(baseUrl + AvUrlEnums.STREAM.getUrl(), param, token, dcDefaultHttpHeaderHandler); + + if (StrUtil.isEmpty(res)) { + logger.error("av stream error:{}", streamRequestDTO.getDevice_id()); + return null; + } + return JSON.parseObject(res); + } + + /** + * 发送心跳 + * + * @param avUrl + * @param avToken + * @return + */ + public static Object dict(String avUrl, String avToken) { + AvDefaultHttpHeaderHandler dcDefaultHttpHeaderHandler = new AvDefaultHttpHeaderHandler(); + dcDefaultHttpHeaderHandler.setJson(true); + Map param = new HashMap<>(); + String res = AvHttpUtils.sendGet(avUrl + AvUrlEnums.DICT.getUrl(), param, avToken, dcDefaultHttpHeaderHandler); + logger.info("av dict:{}", res); + return null; + } + + /** + * 发送心跳 + * + * @param avUrl + * @param avToken + * @param id + * @return + */ + public static Object heart(String avUrl, String avToken, String id) { + AvDefaultHttpHeaderHandler dcDefaultHttpHeaderHandler = new AvDefaultHttpHeaderHandler(); + dcDefaultHttpHeaderHandler.setJson(true); + Map param = new HashMap<>(); +// param.put("id", id); +// param.put("token", avToken); + String res = AvHttpUtils.sendGet(avUrl + String.format(AvUrlEnums.HEART.getUrl(), id), param, avToken, dcDefaultHttpHeaderHandler); + if (StrUtil.isEmpty(res)) { + logger.error("av heart error:{}", id); + return null; + } + return JSON.parseObject(res); + } + + /** + * 停止流 + * + * @param avUrl 艾薇流媒体地址 + * @param avToken 认证令牌 + * @param id 国标ID + * @return + */ + public static Object stopStreams(String avUrl, String avToken, String id) { + AvDefaultHttpHeaderHandler dcDefaultHttpHeaderHandler = new AvDefaultHttpHeaderHandler(); + dcDefaultHttpHeaderHandler.setJson(true); + Map param = new HashMap<>(); + //param.put("id", id); + String res = AvHttpUtils.sendDelete(avUrl + String.format(AvUrlEnums.STREAM_STOP.getUrl(), id), param, avToken, dcDefaultHttpHeaderHandler); + + if (StrUtil.isEmpty(res)) { + logger.error("av stopStreams error:{}", id); + return null; + } + return JSON.parseObject(res); + } + + /** + * 用户设备关系 + * + * @param avUrl 艾薇流媒体地址 + * @param avToken 认证令牌 + * @return + */ + public static List userDeviceRelationships(String avUrl, String avToken) { + + AvDefaultHttpHeaderHandler avDefaultHttpHeaderHandler = new AvDefaultHttpHeaderHandler(); + avDefaultHttpHeaderHandler.setJson(true); + Map param = new HashMap<>(); + String res = AvHttpUtils.sendGetJson(avUrl + AvUrlEnums.USER_DEVICE_RELATION.getUrl(), param, avToken, avDefaultHttpHeaderHandler); + if (StrUtil.isEmpty(res)) { + logger.error("av userDeviceRelationships error"); + return null; + } + + List deviceDTOS = JSON.parseObject(res, new TypeReference>() { + }); + if (CollectionUtil.isNotEmpty(deviceDTOS)) { + for (DeviceRelationshipDTO deviceDTO : deviceDTOS) { + if (StrUtil.isNotEmpty(deviceDTO.getDevice_list())) { + deviceDTO.setDeviceList(StrUtil.split(deviceDTO.getDevice_list(), ",")); + } + } + } + return deviceDTOS; + } +} \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/task/AvTask.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/task/AvTask.java new file mode 100644 index 0000000..46ccc41 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/task/AvTask.java @@ -0,0 +1,46 @@ +package com.casic.missiles.modular.task; + +import com.casic.missiles.modular.device.service.IAvSyncService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +@Slf4j +@Component +public class AvTask { + + @Resource + private IAvSyncService deviceStatusService; + @Value("${casic.video.av.open:-1}") + private Boolean open; + @Value("${casic.video.av.token:-1}") + private String token; + + /** + * 设备信息同步0 + * 每30分钟采集一次 + */ + @Scheduled(cron = "${casic.video.av.deviceCorn}") + public void device() { + //更新组织机构信息 + log.info("av sdk 设备信息同步"); + if (open) { + deviceStatusService.syncDcDevices(token); + } + log.info("av sdk 设备同步结束"); + } + + @Scheduled(cron = "${casic.video.av.deviceStatusCorn}") + public void deviceRefreshToken() { + //更新组织机构信息 + log.info("av 设备状态刷新"); + if (open) { + deviceStatusService.loadUserDeviceRelationships(); + } + + log.info("av 设备状态刷新"); + } +} \ No newline at end of file diff --git a/casic-device-sync/casic-device-dc/src/main/java/com/casic/missiles/modular/http/DcDefaultHttpHeaderHandler.java b/casic-device-sync/casic-device-dc/src/main/java/com/casic/missiles/modular/http/DcDefaultHttpHeaderHandler.java index 550b9d4..e3ee94f 100644 --- a/casic-device-sync/casic-device-dc/src/main/java/com/casic/missiles/modular/http/DcDefaultHttpHeaderHandler.java +++ b/casic-device-sync/casic-device-dc/src/main/java/com/casic/missiles/modular/http/DcDefaultHttpHeaderHandler.java @@ -12,4 +12,6 @@ } } + + } diff --git a/casic-server-sync/src/main/java/com/casic/missiles/modular/device/controller/GateController.java b/casic-server-sync/src/main/java/com/casic/missiles/modular/device/controller/GateController.java index 1108110..efd28e1 100644 --- a/casic-server-sync/src/main/java/com/casic/missiles/modular/device/controller/GateController.java +++ b/casic-server-sync/src/main/java/com/casic/missiles/modular/device/controller/GateController.java @@ -58,9 +58,9 @@ return; } -// String dn = new String(request.getHeader("dnname").getBytes("ISO8859-1"), "UTF-8"); -// String account = getValueByDn(dn, key1); - String account = x; + String dn = new String(request.getHeader("dnname").getBytes("ISO8859-1"), "UTF-8"); + String account = getValueByDn(dn, key1); +// String account = x; //token自定义 CasicCustomToken token = new CasicCustomToken(account, "password"); token.setType(LoginType.NO_PASSWD); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/device/service/ISysGroupDeviceService.java b/casic-server/src/main/java/com/casic/missiles/modular/device/service/ISysGroupDeviceService.java index 2bf6155..724ce26 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/device/service/ISysGroupDeviceService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/device/service/ISysGroupDeviceService.java @@ -29,4 +29,12 @@ * @param relDTO */ void batchAdd(GroupRelDTO relDTO); + + + /** + * 增量更新 + * @param groupId + * @param deviceIds + */ + void batchIncremental(Long groupId, List deviceIds); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java index 0216c1e..1c58177 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java @@ -86,7 +86,10 @@ AuthUser user = abstractPermissionContext.getAuthService().getLoginUser(); QueryWrapper pageQuery = query((QueryWrapper) query, "id", user.getId(), user.getRoleTips()); - pageQuery.le("secret_level", user.getSecretLevel()); + if (!user.getRoleTips().contains(adminRole)) { + pageQuery.le("secret_level", user.getSecretLevel()); + } + DataScope dataScope = abstractPermissionContext.getAuthService().getLoginUserDataScope(); if (!ScopeEnums.ALL_TYPE.getCode().equals(dataScope.getScopeEnums().getCode())) { pageQuery.in("dept_id", dataScope.getDeptIds()); @@ -217,7 +220,7 @@ if (!ScopeEnums.ALL_TYPE.getCode().equals(scope.getScopeEnums())) { deptQuery.in(Dept::getId, scope.getDeptIds()); } - + deptQuery.orderByAsc(Dept::getNum); List deptList = abstractPermissionContext.getDeptService().list(deptQuery); List deptDTOS = new ArrayList<>(); List rootIds = new ArrayList<>(); @@ -235,8 +238,12 @@ //挂载设备信息 QueryWrapper deviceQuery = new QueryWrapper<>(); deviceQuery.eq("dept_id", deptDTO.getId()); - //判定只可查看以下密级 - deviceQuery.le("secret_level", user.getSecretLevel()); + + //判定只可查看以下密级 安全管理员除外 + if (!user.getRoleTips().contains(adminRole)) { + deviceQuery.le("secret_level", user.getSecretLevel()); + } + deviceQuery.orderByAsc("create_time"); List deviceInfos = this.list(deviceQuery); deptDTO.setChildrenNodes(deviceInfos.stream().map(this::createDeptDTO).collect(Collectors.toList())); @@ -293,7 +300,9 @@ if (StrUtil.isEmpty(result.getArea()) || !areaMap.containsKey(Convert.toLong(result.getArea()))) { errors.add("第" + index + "行所属区域编码不存在!"); } - + if(StrUtil.isNotEmpty(result.getLocation())&&result.getLocation().length()>120){ + errors.add("第" + index + "行详细位置过长!"); + } //商米校验 if(SysEnum.sm.getCode().equals(sysType)){ if(StrUtil.isEmpty(result.getNvrManufactureType())){ diff --git a/README.md b/README.md index 430796e..8dbc9a5 100644 --- a/README.md +++ b/README.md @@ -9,3 +9,7 @@ #### 其他 >* [git地址](http://192.168.0.203:8080/gitbucket) >* [本地免登地址](http://localhost:8083/route/mockToken) + +AView 对接问题 +1.用户设备关联关系 + 对应返回 device_list是否为设备国标号 \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/pom.xml b/casic-device-sync/casic-device-aview/pom.xml index 0a3c5fa..94fb9e5 100644 --- a/casic-device-sync/casic-device-aview/pom.xml +++ b/casic-device-sync/casic-device-aview/pom.xml @@ -33,6 +33,21 @@ ${boot.version} provided + + com.casic + casic-http + ${core.version} + + + com.casic + casic-admin-group + ${admin.version} + + + com.casic + casic-server + ${pro.version} + diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java new file mode 100644 index 0000000..195cba2 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.device.controller; + +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import com.casic.missiles.modular.device.dto.stream.StreamRequestDTO; +import com.casic.missiles.modular.device.service.IAvSyncService; +import io.swagger.annotations.Api; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +@Api(tags = "AV平台代理接口") +@RestController +@RequestMapping("/route") +public class AvRouteController { + @Resource + private IAvSyncService avSyncService; + + @PostMapping("/open/v1/api/streams") + public Object streams(@RequestBody StreamRequestDTO requestDTO) { + Object object = avSyncService.getStreams(requestDTO); + if (object == null) { + ResponseDataDTO respDTO = ResponseDataDTO.error("流读取失败,请稍后重试!"); + respDTO.setMessage("流读取失败,请稍后重试!"); + return respDTO; + } + return ResponseDataDTO.success(avSyncService.getStreams(requestDTO)); + } + + @DeleteMapping("/open/v1/api/streams/{id}") + public Object stopStreams(@PathVariable("id") String id) { + Object object = avSyncService.stopStreams(id); + return ResponseDataDTO.success(object); + } + + @PostMapping("/open/v1/api/streams/{id}/heart") + public Object heart(@PathVariable("id") String id) { + Object object = avSyncService.heart(id); + if (object == null) { + ResponseDataDTO respDTO = ResponseDataDTO.error("流心跳失败,请稍后重试!"); + respDTO.setMessage("流心跳失败,请稍后重试!"); + return respDTO; + } + return ResponseDataDTO.success(object); + } +} \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java new file mode 100644 index 0000000..97bde9f --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java @@ -0,0 +1,49 @@ +package com.casic.missiles.modular.device.dto; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; + +/** + * 艾薇设备对象DTO + */ +@Data +public class AvDeviceDTO { + // 设备ID + private Long id; + + // 设备名称 + private String name; + + // 设备唯一国标序列号 + private String sn; + + // 设备类型 + private Integer type; + + // 设备版本号 + private String version; + + // 安全等级 + @JSONField(name = "secure_level") + private String secureLevel; + + // 设备状态 + private Integer status; + + // 云台类型 + private Integer ptzType; + + // 朝向 + private Integer orientation; + + // 创建时间 + @JSONField(name = "gmt_created") + private String gmtCreated; + + // 修改时间 + @JSONField(name = "gmt_modified") + private String gmtModified; + + // 数据状态 + private Integer state; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java new file mode 100644 index 0000000..9a05183 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java @@ -0,0 +1,10 @@ +package com.casic.missiles.modular.device.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class AvPageResponse { + private List items; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java new file mode 100644 index 0000000..098dda4 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.device.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class DeviceRelationshipDTO { + private Long user_id; + private String device_list; + private List deviceList; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java new file mode 100644 index 0000000..74e6a9b --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java @@ -0,0 +1,9 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +@Data +public class AvPageRep { + private Integer total; + private T list; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java new file mode 100644 index 0000000..900ae4a --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +/** + * 分页请求DTO + */ +@Data +public class AvPageRequest { + private int page; + private int paging; + private int limit; + +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java new file mode 100644 index 0000000..f1c1e7a --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +/** + * mvp返回基类封装 + * + * @param + */ +@Data +public class AvResponseDTO { + private T data; + private Integer code; + private String msg; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamRequestDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamRequestDTO.java new file mode 100644 index 0000000..69e88ce --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamRequestDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.device.dto.stream; + +import lombok.Data; + +@Data +public class StreamRequestDTO { + private String device_id; + private String stream_type; + private String quality; + private int from; + private int to; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamStopRequestDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamStopRequestDTO.java new file mode 100644 index 0000000..9cf94b1 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamStopRequestDTO.java @@ -0,0 +1,11 @@ +package com.casic.missiles.modular.device.dto.stream; + +import lombok.Data; + +@Data +public class StreamStopRequestDTO { + private String id; + private String type; + private StreamRequestDTO request; + private String url; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvDataStateEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvDataStateEnum.java new file mode 100644 index 0000000..e1a6658 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvDataStateEnum.java @@ -0,0 +1,72 @@ +package com.casic.missiles.modular.device.enums; + +/** + * 数据状态 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvDataStateEnum { + + TYPE0(0, "有效",0), + DEL(1, "无效",1); + + Integer code; + String message; + Integer type; + AvDataStateEnum(Integer code, String message, Integer type) { + this.code = code; + this.message = message; + this.type = type; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public static String valueOfs(Integer value) { + if (value == null) { + return ""; + } else { + for (AvDataStateEnum ms : AvDataStateEnum.values()) { + if (ms.getCode().equals(value)) { + return ms.getMessage(); + } + } + return ""; + } + } + + public static AvDataStateEnum valueOfType(Integer value) { + if (value == null) { + return TYPE0; + } else { + for (AvDataStateEnum ms : AvDataStateEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return TYPE0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvPtzTypeEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvPtzTypeEnum.java new file mode 100644 index 0000000..fdcb08d --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvPtzTypeEnum.java @@ -0,0 +1,73 @@ +package com.casic.missiles.modular.device.enums; + +/** + * wvp设备类型转换 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvPtzTypeEnum { + + TYPE0(0, "枪机",0), + TYPE1(1, "半球",1), + TYPE2(2, "球机",2); + + Integer code; + String message; + Integer type; + AvPtzTypeEnum(Integer code, String message, Integer type) { + this.code = code; + this.message = message; + this.type = type; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public static String valueOfs(Integer value) { + if (value == null) { + return ""; + } else { + for (AvPtzTypeEnum ms : AvPtzTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms.getMessage(); + } + } + return ""; + } + } + + public static AvPtzTypeEnum valueOfType(Integer value) { + if (value == null) { + return TYPE0; + } else { + for (AvPtzTypeEnum ms : AvPtzTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return TYPE0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvSecretLevelEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvSecretLevelEnum.java new file mode 100644 index 0000000..39e8524 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvSecretLevelEnum.java @@ -0,0 +1,60 @@ +package com.casic.missiles.modular.device.enums; + +/** + * Av主数据密集对应关系枚举 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvSecretLevelEnum { + s("999", "未定密", 999, "未定密"), + s0("0", "公开", 0, "公开"), + s1("1", "内部", 1, "内部"), + s2("2", "秘密", 2, "秘密"), + s3("3", "机密", 3, "机密"); + + String code; + Integer currCode; + String message; + String currMsg; + + AvSecretLevelEnum(String code, String message, Integer currCode, String currMsg) { + this.code = code; + this.currCode = currCode; + this.message = message; + this.currMsg = currMsg; + } + + public Integer getCurrCode() { + return currCode; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public static AvSecretLevelEnum valueOfCode(String value) { + if (value == null) { + return s0; + } else { + for (AvSecretLevelEnum ms : AvSecretLevelEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return s0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvStatusTypeEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvStatusTypeEnum.java new file mode 100644 index 0000000..ddccd52 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvStatusTypeEnum.java @@ -0,0 +1,72 @@ +package com.casic.missiles.modular.device.enums; + +/** + * wvp设备类型转换 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvStatusTypeEnum { + + TYPE0(0, "离线",0), + TYPE1(1, "在线",1); + + Integer code; + String message; + Integer type; + AvStatusTypeEnum(Integer code, String message, Integer type) { + this.code = code; + this.message = message; + this.type = type; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public static String valueOfs(Integer value) { + if (value == null) { + return ""; + } else { + for (AvStatusTypeEnum ms : AvStatusTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms.getMessage(); + } + } + return ""; + } + } + + public static AvStatusTypeEnum valueOfType(Integer value) { + if (value == null) { + return TYPE0; + } else { + for (AvStatusTypeEnum ms : AvStatusTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return TYPE0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvUrlEnums.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvUrlEnums.java new file mode 100644 index 0000000..04b38ad --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvUrlEnums.java @@ -0,0 +1,37 @@ +package com.casic.missiles.modular.device.enums; + +/** + * 设备媒体 + */ +public enum AvUrlEnums { + DEVICE("/open/v1/api/devices","设备信息查询"), + STREAM("/open/v1/api/streams","创建流"), + STREAM_STOP("/open/v1/api/streams/%s","停止流"), + HEART("/open/v1/api/streams/%s/heartbeat","发送心跳"), + DICT("/open/v1/api/dictionary_datas","字典查询"), + USER_DEVICE_RELATION("/open/v1/api/user_device_relationships","用户设备关联关系"); + + private String url; + private String name; + + AvUrlEnums(String url, String name) { + this.url = url; + this.name = name; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/AvDefaultHttpHeaderHandler.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/AvDefaultHttpHeaderHandler.java new file mode 100644 index 0000000..53f0a5c --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/AvDefaultHttpHeaderHandler.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.device.http; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.modular.system.handler.DefaultHttpHeaderHandler; +import org.apache.http.client.methods.HttpRequestBase; + +public class AvDefaultHttpHeaderHandler extends DefaultHttpHeaderHandler { + public void setHeader(HttpRequestBase base, String token) { + base.addHeader("Content-type", DEFAULT_CONTEXTTYPE); + if (StrUtil.isNotEmpty(token)) { + base.addHeader("X-OApi-Token", token); + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/HttpGetWithEntity.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/HttpGetWithEntity.java new file mode 100644 index 0000000..b8abf8f --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/HttpGetWithEntity.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.device.http; + +import org.apache.http.client.methods.HttpEntityEnclosingRequestBase; + +import java.net.URI; + +public class HttpGetWithEntity extends HttpEntityEnclosingRequestBase { + + public HttpGetWithEntity(URI uri) { + this.setURI(uri); + } + + public HttpGetWithEntity(String uri) { + this.setURI(URI.create(uri)); + } + + public String getMethod() { + return "GET"; + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/IAvSyncService.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/IAvSyncService.java new file mode 100644 index 0000000..13c3203 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/IAvSyncService.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.device.service; + +import com.casic.missiles.modular.device.dto.stream.StreamRequestDTO; + +public interface IAvSyncService { + /** + * Dc706设备信息同步 + */ + void syncDcDevices(String token); + + /** + * 创建流 + * + * @param streamRequestDTO + * @return + */ + Object getStreams(StreamRequestDTO streamRequestDTO); + + /** + * 停止流 + * + * @param id + * @return + */ + Object stopStreams(String id); + + /** + * 发送心跳 + * + * @param id 设备国标号 + * @return + */ + Object heart(String id); + + /** + * 设备权限更新 + */ + void loadUserDeviceRelationships(); +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/impl/AvSyncServiceImpl.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/impl/AvSyncServiceImpl.java new file mode 100644 index 0000000..25e3340 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/impl/AvSyncServiceImpl.java @@ -0,0 +1,179 @@ +package com.casic.missiles.modular.device.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.casic.missiles.core.application.service.AbstractUserService; +import com.casic.missiles.modular.device.dto.AvDeviceDTO; +import com.casic.missiles.modular.device.dto.DeviceRelationshipDTO; +import com.casic.missiles.modular.device.dto.page.AvPageRequest; +import com.casic.missiles.modular.device.dto.stream.StreamRequestDTO; +import com.casic.missiles.modular.device.enums.AvDataStateEnum; +import com.casic.missiles.modular.device.enums.AvPtzTypeEnum; +import com.casic.missiles.modular.device.enums.AvSecretLevelEnum; +import com.casic.missiles.modular.device.enums.AvStatusTypeEnum; +import com.casic.missiles.modular.device.model.BusDeviceInfo; +import com.casic.missiles.modular.device.service.IAvSyncService; +import com.casic.missiles.modular.device.service.IBusDeviceInfoService; +import com.casic.missiles.modular.device.service.ISysGroupDeviceService; +import com.casic.missiles.modular.device.util.AvUtil; +import com.casic.missiles.modular.system.model.SysUserGroup; +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.modular.system.service.ISysUserGroupService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; +@Slf4j +@Service +public class AvSyncServiceImpl implements IAvSyncService { + @Value("${casic.video.av.url:-1}") + private String avUrl; + @Value("${casic.video.av.token:-1}") + private String avToken; + @Resource + private IBusDeviceInfoService deviceInfoService; + @Resource + private AbstractUserService abstractUserService; + + @Resource + private ISysUserGroupService userGroupService; + @Resource + private ISysGroupDeviceService sysGroupDeviceService; + + @Override + public void syncDcDevices(String token) { + AvPageRequest avPageRequest = new AvPageRequest(); + avPageRequest.setPage(1); + avPageRequest.setPaging(1); + + //全量查询设备信息 + List deviceDTOS = AvUtil.selectDevices(avUrl, token, avPageRequest); + + if (CollectionUtil.isNotEmpty(deviceDTOS)) { + for (AvDeviceDTO dcDeviceDTO : deviceDTOS) { + BusDeviceInfo busDeviceInfo = this.convertDevice(dcDeviceDTO); + + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(BusDeviceInfo::getCameraIndexCode, dcDeviceDTO.getSn()); + this.deviceInfoService.saveOrUpdate(busDeviceInfo, query); + } + + List deviceSns = deviceDTOS.stream().filter(dto -> AvDataStateEnum.DEL.equals(dto.getState())).map(AvDeviceDTO::getSn).collect(Collectors.toList()); + + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.in(BusDeviceInfo::getCameraIndexCode, deviceSns); + if (CollectionUtil.isNotEmpty(deviceSns)) { + this.deviceInfoService.remove(query); + } + } + +// AvUtil.dict(avUrl,avToken); + } + + /** + * 流地址请求 + * + * @param streamRequestDTO + * @return + */ + @Override + public Object getStreams(StreamRequestDTO streamRequestDTO) { + return AvUtil.selectStreams(avUrl, avToken, streamRequestDTO); + } + + @Override + public Object stopStreams(String id) { + return AvUtil.stopStreams(avUrl, avToken, id); + } + + @Override + public Object heart(String id) { + return AvUtil.heart(avUrl, avToken, id); + } + + @Transactional + @Override + public void loadUserDeviceRelationships() { + + List relationshipDTOS = AvUtil.userDeviceRelationships(avUrl, avToken); + log.info("loadUserDeviceRelationships: {}", relationshipDTOS); + + for (DeviceRelationshipDTO relationshipDTO : relationshipDTOS) { + + //检索用户信息 + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(User::getSyncId, relationshipDTO.getUser_id()); + List users = abstractUserService.list(query); + + if (users != null&&users.size() > 0) { + User user = users.get(0); + //创建用户组 + LambdaQueryWrapper groupQuery = new LambdaQueryWrapper<>(); + String groupName = user.getName() + user.getId(); + groupQuery.eq(SysUserGroup::getGroupName, groupName); + SysUserGroup sysUserGroup = userGroupService.getOne(groupQuery); + + if (sysUserGroup == null) { + sysUserGroup = genSysUserGroup(groupName, user); + List userIds = new ArrayList<>(); + userIds.add(user.getId()); + userGroupService.createSysUserGroup(sysUserGroup, userIds); + } + + LambdaQueryWrapper deviceQuery = new LambdaQueryWrapper<>(); + deviceQuery.in(BusDeviceInfo::getCameraIndexCode, relationshipDTO.getDeviceList()); + List busDeviceInfos = deviceInfoService.list(deviceQuery); + + if (CollectionUtil.isNotEmpty(busDeviceInfos)) { + List list = busDeviceInfos.stream().map(BusDeviceInfo::getId).collect(Collectors.toList()); + sysGroupDeviceService.batchIncremental(sysUserGroup.getId(), list); + } + + }else{ + log.error("loadUserDeviceRelationships is empty: {}", relationshipDTO.getUser_id()); + } + } + } + + private SysUserGroup genSysUserGroup(String groupName, User user) { + SysUserGroup sysUserGroup = new SysUserGroup(); + sysUserGroup.setGroupName(groupName); + sysUserGroup.setCreateTime(new Date()); + sysUserGroup.setCreateId(user.getId()); + sysUserGroup.setDeptId(user.getDeptId()); + sysUserGroup.setDescription("默认创建分组,不可修改!"); + sysUserGroup.setSafe(0); + return sysUserGroup; + } + + /** + * 设备类型数据转换 + * + * @param dto 艾薇设备信息 + * @return + */ + private BusDeviceInfo convertDevice(AvDeviceDTO dto) { + BusDeviceInfo info = new BusDeviceInfo(); + info.setCreateTime(new Date()); + info.setUpdateTime(new Date()); + + //转换为本地密级编码 + info.setSecretLevel(AvSecretLevelEnum.valueOfCode(dto.getSecureLevel()).getCurrCode()); + + info.setDeviceStatus(AvStatusTypeEnum.valueOfType(dto.getStatus()).getType()); + info.setCameraIndexCode(dto.getSn()); + info.setMonitorName(dto.getName()); + + //PTZ type类型 + info.setDeviceType(AvPtzTypeEnum.valueOfType(dto.getPtzType()).getType() + ""); + info.setBfFlag(0); + + return info; + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/util/AvHttpUtils.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/util/AvHttpUtils.java new file mode 100644 index 0000000..083d88a --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/util/AvHttpUtils.java @@ -0,0 +1,331 @@ +package com.casic.missiles.modular.device.util; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.modular.device.http.HttpGetWithEntity; +import com.casic.missiles.modular.system.handler.DefaultHttpHeaderHandler; +import org.apache.http.NameValuePair; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpDelete; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.util.EntityUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +public class AvHttpUtils { + + public static String sendGetJson(String url, Map param, String token, DefaultHttpHeaderHandler handler) { + try { + StringBuffer query = new StringBuffer(); + String var14 = sendGetEntityData(url, handler.getChartSet(), param, token, handler); + return var14; + } catch (Exception var10) { + Exception e = var10; + e.printStackTrace(); + System.out.println("发送GET请求出现异常!" + e); + return ""; + } finally { + ; + } + } + public static String sendGet(String url, Map param, String token, DefaultHttpHeaderHandler handler) { + try { + StringBuffer query = new StringBuffer(); + Iterator var5 = param.entrySet().iterator(); + + while(var5.hasNext()) { + Map.Entry kv = (Map.Entry)var5.next(); + query.append(URLEncoder.encode((String)kv.getKey(), handler.getChartSet()) + "="); + query.append(URLEncoder.encode((String)kv.getValue(), handler.getChartSet()) + "&"); + } + + if (query.lastIndexOf("&") > 0) { + query.deleteCharAt(query.length() - 1); + } + + String urlNameString = url + "?" + query.toString(); + String var14 = sendGetData(urlNameString, handler.getChartSet(), token, handler); + return var14; + } catch (Exception var10) { + Exception e = var10; + e.printStackTrace(); + System.out.println("发送GET请求出现异常!" + e); + return ""; + } finally { + ; + } + } + public static String sendPost(String url, Map param, String token, DefaultHttpHeaderHandler httpHeaderHandler) { + return sendPostDataByMap(url, param, "utf8", token, httpHeaderHandler); + } + public static String sendPostDataByMap(String url, Map map, String encoding, String token, DefaultHttpHeaderHandler httpHeaderHandler) { + String result = ""; + CloseableHttpResponse response = null; + CloseableHttpClient httpClient = null; + HttpPost httpPost = null; + + try { + httpClient = HttpClients.createDefault(); + httpPost = new HttpPost(url); + httpPost.setHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)"); + httpHeaderHandler.setHeader(httpPost, token); + if (httpHeaderHandler.isJson()) { + jsonParams(map, httpPost); + } else { + formParams(map, httpPost, httpHeaderHandler.getChartSet()); + } + + response = httpClient.execute(httpPost); + if (response.getStatusLine().getStatusCode() == 200) { + result = EntityUtils.toString(response.getEntity(), httpHeaderHandler.getChartSet()); + } + } catch (Exception var22) { + Exception e = var22; + System.out.println("发送GET请求出现异常!" + e); + e.printStackTrace(); + } finally { + IOException e; + try { + if (response != null) { + response.close(); + } + + httpPost.releaseConnection(); + httpClient.close(); + } catch (IOException var21) { + e = var21; + e.printStackTrace(); + } + + if (httpClient != null) { + try { + httpClient.close(); + } catch (IOException var20) { + e = var20; + e.printStackTrace(); + } + } + + } + + return result; + } + public static String sendGetData(String url, String encoding, String token, DefaultHttpHeaderHandler httpHeaderHandler) { + String result = ""; + CloseableHttpResponse response = null; + if (httpHeaderHandler == null) { + httpHeaderHandler = new DefaultHttpHeaderHandler(); + } + + CloseableHttpClient httpClient = null; + + try { + httpClient = HttpClients.createDefault(); + HttpGet httpGet = new HttpGet(url); + httpHeaderHandler.setHeader(httpGet, token); + response = httpClient.execute(httpGet); + if (response.getStatusLine().getStatusCode() == 200) { + result = EntityUtils.toString(response.getEntity(), encoding); + } + } catch (Exception var20) { + Exception e = var20; + e.printStackTrace(); + System.out.println("发送GET请求出现异常!" + e); + } finally { + IOException e; + if (response != null) { + try { + response.close(); + } catch (IOException var19) { + e = var19; + e.printStackTrace(); + } + } + + if (httpClient != null) { + try { + httpClient.close(); + } catch (IOException var18) { + e = var18; + e.printStackTrace(); + } + } + + } + + return result; + } + public static String sendGetEntityData(String url, String encoding, Map param, String token, DefaultHttpHeaderHandler httpHeaderHandler) { + String result = ""; + CloseableHttpResponse response = null; + if (httpHeaderHandler == null) { + httpHeaderHandler = new DefaultHttpHeaderHandler(); + } + CloseableHttpClient httpClient =null; + try { + httpClient = HttpClients.createDefault(); + HttpGetWithEntity httpGet = new HttpGetWithEntity(url); + httpHeaderHandler.setHeader(httpGet, token); + if (httpHeaderHandler.isJson()) { + jsonParams(param, httpGet); + } else { + formParams(param, httpGet, httpHeaderHandler.getChartSet()); + } + response = httpClient.execute(httpGet); + if (response.getStatusLine().getStatusCode() == 200) { + result = EntityUtils.toString(response.getEntity(), encoding); + } + } catch (Exception var16) { + Exception e = var16; + e.printStackTrace(); + System.out.println("发送GET请求出现异常!" + e); + } finally { + if (response != null) { + try { + response.close(); + } catch (IOException var15) { + IOException e = var15; + e.printStackTrace(); + } + } + if (httpClient != null) { + try { + httpClient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + } + + return result; + } + + public static String sendDelete(String url, Map param, String token, DefaultHttpHeaderHandler handler) { + try { + StringBuffer query = new StringBuffer(); + Iterator var5 = param.entrySet().iterator(); + + while (var5.hasNext()) { + Map.Entry kv = (Map.Entry) var5.next(); + query.append(URLEncoder.encode((String) kv.getKey(), handler.getChartSet()) + "="); + query.append(URLEncoder.encode((String) kv.getValue(), handler.getChartSet()) + "&"); + } + + if (query.lastIndexOf("&") > 0) { + query.deleteCharAt(query.length() - 1); + } + String urlNameString = url + "?" + query.toString(); + String var14 = sendDeleteData(urlNameString, handler.getChartSet(), token, handler); + return var14; + } catch (Exception var10) { + Exception e = var10; + e.printStackTrace(); + System.out.println("发送GET请求出现异常!" + e); + return ""; + } finally { + ; + } + } + private static final Logger logger = LoggerFactory.getLogger(AvUtil.class); + /** + * http 请求 + * + * @param url + * @param encoding + * @param token + * @param httpHeaderHandler + * @return + */ + public static String sendDeleteData(String url, String encoding, String token, DefaultHttpHeaderHandler httpHeaderHandler) { + String result = ""; + CloseableHttpResponse response = null; + if (httpHeaderHandler == null) { + httpHeaderHandler = new DefaultHttpHeaderHandler(); + } + CloseableHttpClient httpClient = null; + try { + httpClient = HttpClients.createDefault(); + HttpDelete httpGet = new HttpDelete(url); + httpHeaderHandler.setHeader(httpGet, token); + response = httpClient.execute(httpGet); + if (response.getStatusLine().getStatusCode() == 200) { + logger.info("----------------------------------:"+EntityUtils.toString(response.getEntity(), encoding)); + result = EntityUtils.toString(response.getEntity(), encoding); + } + } catch (Exception var16) { + Exception e = var16; + e.printStackTrace(); + } finally { + if (response != null) { + try { + response.close(); + } catch (IOException var15) { + IOException e = var15; + e.printStackTrace(); + } + } + if (httpClient != null) { + try { + httpClient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return result; + } + public static void jsonParams(Map map, HttpPost post) { + String paramJson = JSONObject.toJSONString(map); + StringEntity stringEntity = new StringEntity(paramJson, ContentType.create("application/json", "UTF-8")); + post.setEntity(stringEntity); + } + + public static void formParams(Map map, HttpPost post, String chartSet) throws UnsupportedEncodingException { + List nameValuePairs = new ArrayList(); + if (map != null) { + Iterator var4 = map.entrySet().iterator(); + + while(var4.hasNext()) { + Map.Entry entry = (Map.Entry)var4.next(); + nameValuePairs.add(new BasicNameValuePair((String)entry.getKey(), (String)entry.getValue())); + } + } + + post.setEntity(new UrlEncodedFormEntity(nameValuePairs, chartSet)); + } + public static void jsonParams(Map map, HttpGetWithEntity post) { + String paramJson = JSONObject.toJSONString(map); + StringEntity stringEntity = new StringEntity(paramJson, ContentType.create("application/json", "UTF-8")); + + post.setEntity(stringEntity); + } + + public static void formParams(Map map, HttpGetWithEntity post, String chartSet) throws UnsupportedEncodingException { + List nameValuePairs = new ArrayList(); + if (map != null) { + Iterator var4 = map.entrySet().iterator(); + + while (var4.hasNext()) { + Map.Entry entry = (Map.Entry) var4.next(); + nameValuePairs.add(new BasicNameValuePair((String) entry.getKey(), (String) entry.getValue())); + } + } + + post.setEntity(new UrlEncodedFormEntity(nameValuePairs, chartSet)); + } +} \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/util/AvUtil.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/util/AvUtil.java new file mode 100644 index 0000000..9575627 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/util/AvUtil.java @@ -0,0 +1,171 @@ +package com.casic.missiles.modular.device.util; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.TypeReference; +import com.casic.missiles.modular.device.dto.AvDeviceDTO; +import com.casic.missiles.modular.device.dto.AvPageResponse; +import com.casic.missiles.modular.device.dto.DeviceRelationshipDTO; +import com.casic.missiles.modular.device.dto.page.AvPageRequest; +import com.casic.missiles.modular.device.dto.stream.StreamRequestDTO; +import com.casic.missiles.modular.device.enums.AvUrlEnums; +import com.casic.missiles.modular.device.http.AvDefaultHttpHeaderHandler; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 艾薇对接工具类 + */ +public class AvUtil { + private static final Logger logger = LoggerFactory.getLogger(AvUtil.class); + + /** + * 设备列表读取 + * + * @param baseUrl av流媒体地址 + * @param token 认证令牌 + * @param pageRequest 请求体 + * @return + */ + public static List selectDevices(String baseUrl, String token, AvPageRequest pageRequest) { + AvDefaultHttpHeaderHandler dcDefaultHttpHeaderHandler = new AvDefaultHttpHeaderHandler(); + dcDefaultHttpHeaderHandler.setJson(true); + Map param = new HashMap<>(); + param.put("page", pageRequest.getPage() + ""); + param.put("paging", pageRequest.getPaging() + ""); + param.put("limit", "100000"); + param.put("token", token); + String res = AvHttpUtils.sendGet(baseUrl + AvUrlEnums.DEVICE.getUrl(), param, token, dcDefaultHttpHeaderHandler); + logger.info("selectDevices:{}", res); + if (StrUtil.isEmpty(res)) { + logger.error("av device sync error!"); + } + AvPageResponse deviceDTOS = JSON.parseObject(res, new TypeReference() { + }); + return deviceDTOS.getItems(); + } + + /** + * 创建流 + * + * @param baseUrl av流媒体地址 + * @param token 认证令牌 + * @param streamRequestDTO 请求体 + * @return + */ + public static Object selectStreams(String baseUrl, String token, StreamRequestDTO streamRequestDTO) { + + Map param = new HashMap<>(); + param.put("device_id", streamRequestDTO.getDevice_id() + ""); + param.put("stream_type", streamRequestDTO.getStream_type() + ""); + param.put("quality", streamRequestDTO.getQuality() + ""); + param.put("token", token); + param.put("from", streamRequestDTO.getFrom() + ""); + param.put("to", streamRequestDTO.getTo() + ""); + logger.info("url:{}", baseUrl + AvUrlEnums.STREAM.getUrl()); + AvDefaultHttpHeaderHandler dcDefaultHttpHeaderHandler = new AvDefaultHttpHeaderHandler(); + dcDefaultHttpHeaderHandler.setJson(true); + String res = AvHttpUtils.sendPost(baseUrl + AvUrlEnums.STREAM.getUrl(), param, token, dcDefaultHttpHeaderHandler); + + if (StrUtil.isEmpty(res)) { + logger.error("av stream error:{}", streamRequestDTO.getDevice_id()); + return null; + } + return JSON.parseObject(res); + } + + /** + * 发送心跳 + * + * @param avUrl + * @param avToken + * @return + */ + public static Object dict(String avUrl, String avToken) { + AvDefaultHttpHeaderHandler dcDefaultHttpHeaderHandler = new AvDefaultHttpHeaderHandler(); + dcDefaultHttpHeaderHandler.setJson(true); + Map param = new HashMap<>(); + String res = AvHttpUtils.sendGet(avUrl + AvUrlEnums.DICT.getUrl(), param, avToken, dcDefaultHttpHeaderHandler); + logger.info("av dict:{}", res); + return null; + } + + /** + * 发送心跳 + * + * @param avUrl + * @param avToken + * @param id + * @return + */ + public static Object heart(String avUrl, String avToken, String id) { + AvDefaultHttpHeaderHandler dcDefaultHttpHeaderHandler = new AvDefaultHttpHeaderHandler(); + dcDefaultHttpHeaderHandler.setJson(true); + Map param = new HashMap<>(); +// param.put("id", id); +// param.put("token", avToken); + String res = AvHttpUtils.sendGet(avUrl + String.format(AvUrlEnums.HEART.getUrl(), id), param, avToken, dcDefaultHttpHeaderHandler); + if (StrUtil.isEmpty(res)) { + logger.error("av heart error:{}", id); + return null; + } + return JSON.parseObject(res); + } + + /** + * 停止流 + * + * @param avUrl 艾薇流媒体地址 + * @param avToken 认证令牌 + * @param id 国标ID + * @return + */ + public static Object stopStreams(String avUrl, String avToken, String id) { + AvDefaultHttpHeaderHandler dcDefaultHttpHeaderHandler = new AvDefaultHttpHeaderHandler(); + dcDefaultHttpHeaderHandler.setJson(true); + Map param = new HashMap<>(); + //param.put("id", id); + String res = AvHttpUtils.sendDelete(avUrl + String.format(AvUrlEnums.STREAM_STOP.getUrl(), id), param, avToken, dcDefaultHttpHeaderHandler); + + if (StrUtil.isEmpty(res)) { + logger.error("av stopStreams error:{}", id); + return null; + } + return JSON.parseObject(res); + } + + /** + * 用户设备关系 + * + * @param avUrl 艾薇流媒体地址 + * @param avToken 认证令牌 + * @return + */ + public static List userDeviceRelationships(String avUrl, String avToken) { + + AvDefaultHttpHeaderHandler avDefaultHttpHeaderHandler = new AvDefaultHttpHeaderHandler(); + avDefaultHttpHeaderHandler.setJson(true); + Map param = new HashMap<>(); + String res = AvHttpUtils.sendGetJson(avUrl + AvUrlEnums.USER_DEVICE_RELATION.getUrl(), param, avToken, avDefaultHttpHeaderHandler); + if (StrUtil.isEmpty(res)) { + logger.error("av userDeviceRelationships error"); + return null; + } + + List deviceDTOS = JSON.parseObject(res, new TypeReference>() { + }); + if (CollectionUtil.isNotEmpty(deviceDTOS)) { + for (DeviceRelationshipDTO deviceDTO : deviceDTOS) { + if (StrUtil.isNotEmpty(deviceDTO.getDevice_list())) { + deviceDTO.setDeviceList(StrUtil.split(deviceDTO.getDevice_list(), ",")); + } + } + } + return deviceDTOS; + } +} \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/task/AvTask.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/task/AvTask.java new file mode 100644 index 0000000..46ccc41 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/task/AvTask.java @@ -0,0 +1,46 @@ +package com.casic.missiles.modular.task; + +import com.casic.missiles.modular.device.service.IAvSyncService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +@Slf4j +@Component +public class AvTask { + + @Resource + private IAvSyncService deviceStatusService; + @Value("${casic.video.av.open:-1}") + private Boolean open; + @Value("${casic.video.av.token:-1}") + private String token; + + /** + * 设备信息同步0 + * 每30分钟采集一次 + */ + @Scheduled(cron = "${casic.video.av.deviceCorn}") + public void device() { + //更新组织机构信息 + log.info("av sdk 设备信息同步"); + if (open) { + deviceStatusService.syncDcDevices(token); + } + log.info("av sdk 设备同步结束"); + } + + @Scheduled(cron = "${casic.video.av.deviceStatusCorn}") + public void deviceRefreshToken() { + //更新组织机构信息 + log.info("av 设备状态刷新"); + if (open) { + deviceStatusService.loadUserDeviceRelationships(); + } + + log.info("av 设备状态刷新"); + } +} \ No newline at end of file diff --git a/casic-device-sync/casic-device-dc/src/main/java/com/casic/missiles/modular/http/DcDefaultHttpHeaderHandler.java b/casic-device-sync/casic-device-dc/src/main/java/com/casic/missiles/modular/http/DcDefaultHttpHeaderHandler.java index 550b9d4..e3ee94f 100644 --- a/casic-device-sync/casic-device-dc/src/main/java/com/casic/missiles/modular/http/DcDefaultHttpHeaderHandler.java +++ b/casic-device-sync/casic-device-dc/src/main/java/com/casic/missiles/modular/http/DcDefaultHttpHeaderHandler.java @@ -12,4 +12,6 @@ } } + + } diff --git a/casic-server-sync/src/main/java/com/casic/missiles/modular/device/controller/GateController.java b/casic-server-sync/src/main/java/com/casic/missiles/modular/device/controller/GateController.java index 1108110..efd28e1 100644 --- a/casic-server-sync/src/main/java/com/casic/missiles/modular/device/controller/GateController.java +++ b/casic-server-sync/src/main/java/com/casic/missiles/modular/device/controller/GateController.java @@ -58,9 +58,9 @@ return; } -// String dn = new String(request.getHeader("dnname").getBytes("ISO8859-1"), "UTF-8"); -// String account = getValueByDn(dn, key1); - String account = x; + String dn = new String(request.getHeader("dnname").getBytes("ISO8859-1"), "UTF-8"); + String account = getValueByDn(dn, key1); +// String account = x; //token自定义 CasicCustomToken token = new CasicCustomToken(account, "password"); token.setType(LoginType.NO_PASSWD); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/device/service/ISysGroupDeviceService.java b/casic-server/src/main/java/com/casic/missiles/modular/device/service/ISysGroupDeviceService.java index 2bf6155..724ce26 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/device/service/ISysGroupDeviceService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/device/service/ISysGroupDeviceService.java @@ -29,4 +29,12 @@ * @param relDTO */ void batchAdd(GroupRelDTO relDTO); + + + /** + * 增量更新 + * @param groupId + * @param deviceIds + */ + void batchIncremental(Long groupId, List deviceIds); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java index 0216c1e..1c58177 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java @@ -86,7 +86,10 @@ AuthUser user = abstractPermissionContext.getAuthService().getLoginUser(); QueryWrapper pageQuery = query((QueryWrapper) query, "id", user.getId(), user.getRoleTips()); - pageQuery.le("secret_level", user.getSecretLevel()); + if (!user.getRoleTips().contains(adminRole)) { + pageQuery.le("secret_level", user.getSecretLevel()); + } + DataScope dataScope = abstractPermissionContext.getAuthService().getLoginUserDataScope(); if (!ScopeEnums.ALL_TYPE.getCode().equals(dataScope.getScopeEnums().getCode())) { pageQuery.in("dept_id", dataScope.getDeptIds()); @@ -217,7 +220,7 @@ if (!ScopeEnums.ALL_TYPE.getCode().equals(scope.getScopeEnums())) { deptQuery.in(Dept::getId, scope.getDeptIds()); } - + deptQuery.orderByAsc(Dept::getNum); List deptList = abstractPermissionContext.getDeptService().list(deptQuery); List deptDTOS = new ArrayList<>(); List rootIds = new ArrayList<>(); @@ -235,8 +238,12 @@ //挂载设备信息 QueryWrapper deviceQuery = new QueryWrapper<>(); deviceQuery.eq("dept_id", deptDTO.getId()); - //判定只可查看以下密级 - deviceQuery.le("secret_level", user.getSecretLevel()); + + //判定只可查看以下密级 安全管理员除外 + if (!user.getRoleTips().contains(adminRole)) { + deviceQuery.le("secret_level", user.getSecretLevel()); + } + deviceQuery.orderByAsc("create_time"); List deviceInfos = this.list(deviceQuery); deptDTO.setChildrenNodes(deviceInfos.stream().map(this::createDeptDTO).collect(Collectors.toList())); @@ -293,7 +300,9 @@ if (StrUtil.isEmpty(result.getArea()) || !areaMap.containsKey(Convert.toLong(result.getArea()))) { errors.add("第" + index + "行所属区域编码不存在!"); } - + if(StrUtil.isNotEmpty(result.getLocation())&&result.getLocation().length()>120){ + errors.add("第" + index + "行详细位置过长!"); + } //商米校验 if(SysEnum.sm.getCode().equals(sysType)){ if(StrUtil.isEmpty(result.getNvrManufactureType())){ diff --git a/casic-server/src/main/java/com/casic/missiles/modular/device/service/impl/DeviceGroupInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/device/service/impl/DeviceGroupInfoServiceImpl.java index 81eaf4a..cfac743 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/device/service/impl/DeviceGroupInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/device/service/impl/DeviceGroupInfoServiceImpl.java @@ -116,8 +116,21 @@ return true; } + @Transactional + @Override + public boolean removeById(Serializable id) { + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.in(SysGroupDevice::getGroupId, id); + sysGroupDeviceService.remove(query); + return super.removeById(id); + } + + @Transactional @Override public boolean removeByIds(Collection idList) { + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.in(SysGroupDevice::getGroupId, idList); + sysGroupDeviceService.remove(query); return groupService.removeByIds(idList); } diff --git a/README.md b/README.md index 430796e..8dbc9a5 100644 --- a/README.md +++ b/README.md @@ -9,3 +9,7 @@ #### 其他 >* [git地址](http://192.168.0.203:8080/gitbucket) >* [本地免登地址](http://localhost:8083/route/mockToken) + +AView 对接问题 +1.用户设备关联关系 + 对应返回 device_list是否为设备国标号 \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/pom.xml b/casic-device-sync/casic-device-aview/pom.xml index 0a3c5fa..94fb9e5 100644 --- a/casic-device-sync/casic-device-aview/pom.xml +++ b/casic-device-sync/casic-device-aview/pom.xml @@ -33,6 +33,21 @@ ${boot.version} provided + + com.casic + casic-http + ${core.version} + + + com.casic + casic-admin-group + ${admin.version} + + + com.casic + casic-server + ${pro.version} + diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java new file mode 100644 index 0000000..195cba2 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.device.controller; + +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import com.casic.missiles.modular.device.dto.stream.StreamRequestDTO; +import com.casic.missiles.modular.device.service.IAvSyncService; +import io.swagger.annotations.Api; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +@Api(tags = "AV平台代理接口") +@RestController +@RequestMapping("/route") +public class AvRouteController { + @Resource + private IAvSyncService avSyncService; + + @PostMapping("/open/v1/api/streams") + public Object streams(@RequestBody StreamRequestDTO requestDTO) { + Object object = avSyncService.getStreams(requestDTO); + if (object == null) { + ResponseDataDTO respDTO = ResponseDataDTO.error("流读取失败,请稍后重试!"); + respDTO.setMessage("流读取失败,请稍后重试!"); + return respDTO; + } + return ResponseDataDTO.success(avSyncService.getStreams(requestDTO)); + } + + @DeleteMapping("/open/v1/api/streams/{id}") + public Object stopStreams(@PathVariable("id") String id) { + Object object = avSyncService.stopStreams(id); + return ResponseDataDTO.success(object); + } + + @PostMapping("/open/v1/api/streams/{id}/heart") + public Object heart(@PathVariable("id") String id) { + Object object = avSyncService.heart(id); + if (object == null) { + ResponseDataDTO respDTO = ResponseDataDTO.error("流心跳失败,请稍后重试!"); + respDTO.setMessage("流心跳失败,请稍后重试!"); + return respDTO; + } + return ResponseDataDTO.success(object); + } +} \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java new file mode 100644 index 0000000..97bde9f --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java @@ -0,0 +1,49 @@ +package com.casic.missiles.modular.device.dto; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; + +/** + * 艾薇设备对象DTO + */ +@Data +public class AvDeviceDTO { + // 设备ID + private Long id; + + // 设备名称 + private String name; + + // 设备唯一国标序列号 + private String sn; + + // 设备类型 + private Integer type; + + // 设备版本号 + private String version; + + // 安全等级 + @JSONField(name = "secure_level") + private String secureLevel; + + // 设备状态 + private Integer status; + + // 云台类型 + private Integer ptzType; + + // 朝向 + private Integer orientation; + + // 创建时间 + @JSONField(name = "gmt_created") + private String gmtCreated; + + // 修改时间 + @JSONField(name = "gmt_modified") + private String gmtModified; + + // 数据状态 + private Integer state; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java new file mode 100644 index 0000000..9a05183 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java @@ -0,0 +1,10 @@ +package com.casic.missiles.modular.device.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class AvPageResponse { + private List items; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java new file mode 100644 index 0000000..098dda4 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.device.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class DeviceRelationshipDTO { + private Long user_id; + private String device_list; + private List deviceList; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java new file mode 100644 index 0000000..74e6a9b --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java @@ -0,0 +1,9 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +@Data +public class AvPageRep { + private Integer total; + private T list; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java new file mode 100644 index 0000000..900ae4a --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +/** + * 分页请求DTO + */ +@Data +public class AvPageRequest { + private int page; + private int paging; + private int limit; + +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java new file mode 100644 index 0000000..f1c1e7a --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +/** + * mvp返回基类封装 + * + * @param + */ +@Data +public class AvResponseDTO { + private T data; + private Integer code; + private String msg; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamRequestDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamRequestDTO.java new file mode 100644 index 0000000..69e88ce --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamRequestDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.device.dto.stream; + +import lombok.Data; + +@Data +public class StreamRequestDTO { + private String device_id; + private String stream_type; + private String quality; + private int from; + private int to; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamStopRequestDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamStopRequestDTO.java new file mode 100644 index 0000000..9cf94b1 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamStopRequestDTO.java @@ -0,0 +1,11 @@ +package com.casic.missiles.modular.device.dto.stream; + +import lombok.Data; + +@Data +public class StreamStopRequestDTO { + private String id; + private String type; + private StreamRequestDTO request; + private String url; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvDataStateEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvDataStateEnum.java new file mode 100644 index 0000000..e1a6658 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvDataStateEnum.java @@ -0,0 +1,72 @@ +package com.casic.missiles.modular.device.enums; + +/** + * 数据状态 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvDataStateEnum { + + TYPE0(0, "有效",0), + DEL(1, "无效",1); + + Integer code; + String message; + Integer type; + AvDataStateEnum(Integer code, String message, Integer type) { + this.code = code; + this.message = message; + this.type = type; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public static String valueOfs(Integer value) { + if (value == null) { + return ""; + } else { + for (AvDataStateEnum ms : AvDataStateEnum.values()) { + if (ms.getCode().equals(value)) { + return ms.getMessage(); + } + } + return ""; + } + } + + public static AvDataStateEnum valueOfType(Integer value) { + if (value == null) { + return TYPE0; + } else { + for (AvDataStateEnum ms : AvDataStateEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return TYPE0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvPtzTypeEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvPtzTypeEnum.java new file mode 100644 index 0000000..fdcb08d --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvPtzTypeEnum.java @@ -0,0 +1,73 @@ +package com.casic.missiles.modular.device.enums; + +/** + * wvp设备类型转换 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvPtzTypeEnum { + + TYPE0(0, "枪机",0), + TYPE1(1, "半球",1), + TYPE2(2, "球机",2); + + Integer code; + String message; + Integer type; + AvPtzTypeEnum(Integer code, String message, Integer type) { + this.code = code; + this.message = message; + this.type = type; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public static String valueOfs(Integer value) { + if (value == null) { + return ""; + } else { + for (AvPtzTypeEnum ms : AvPtzTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms.getMessage(); + } + } + return ""; + } + } + + public static AvPtzTypeEnum valueOfType(Integer value) { + if (value == null) { + return TYPE0; + } else { + for (AvPtzTypeEnum ms : AvPtzTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return TYPE0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvSecretLevelEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvSecretLevelEnum.java new file mode 100644 index 0000000..39e8524 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvSecretLevelEnum.java @@ -0,0 +1,60 @@ +package com.casic.missiles.modular.device.enums; + +/** + * Av主数据密集对应关系枚举 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvSecretLevelEnum { + s("999", "未定密", 999, "未定密"), + s0("0", "公开", 0, "公开"), + s1("1", "内部", 1, "内部"), + s2("2", "秘密", 2, "秘密"), + s3("3", "机密", 3, "机密"); + + String code; + Integer currCode; + String message; + String currMsg; + + AvSecretLevelEnum(String code, String message, Integer currCode, String currMsg) { + this.code = code; + this.currCode = currCode; + this.message = message; + this.currMsg = currMsg; + } + + public Integer getCurrCode() { + return currCode; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public static AvSecretLevelEnum valueOfCode(String value) { + if (value == null) { + return s0; + } else { + for (AvSecretLevelEnum ms : AvSecretLevelEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return s0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvStatusTypeEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvStatusTypeEnum.java new file mode 100644 index 0000000..ddccd52 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvStatusTypeEnum.java @@ -0,0 +1,72 @@ +package com.casic.missiles.modular.device.enums; + +/** + * wvp设备类型转换 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvStatusTypeEnum { + + TYPE0(0, "离线",0), + TYPE1(1, "在线",1); + + Integer code; + String message; + Integer type; + AvStatusTypeEnum(Integer code, String message, Integer type) { + this.code = code; + this.message = message; + this.type = type; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public static String valueOfs(Integer value) { + if (value == null) { + return ""; + } else { + for (AvStatusTypeEnum ms : AvStatusTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms.getMessage(); + } + } + return ""; + } + } + + public static AvStatusTypeEnum valueOfType(Integer value) { + if (value == null) { + return TYPE0; + } else { + for (AvStatusTypeEnum ms : AvStatusTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return TYPE0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvUrlEnums.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvUrlEnums.java new file mode 100644 index 0000000..04b38ad --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvUrlEnums.java @@ -0,0 +1,37 @@ +package com.casic.missiles.modular.device.enums; + +/** + * 设备媒体 + */ +public enum AvUrlEnums { + DEVICE("/open/v1/api/devices","设备信息查询"), + STREAM("/open/v1/api/streams","创建流"), + STREAM_STOP("/open/v1/api/streams/%s","停止流"), + HEART("/open/v1/api/streams/%s/heartbeat","发送心跳"), + DICT("/open/v1/api/dictionary_datas","字典查询"), + USER_DEVICE_RELATION("/open/v1/api/user_device_relationships","用户设备关联关系"); + + private String url; + private String name; + + AvUrlEnums(String url, String name) { + this.url = url; + this.name = name; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/AvDefaultHttpHeaderHandler.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/AvDefaultHttpHeaderHandler.java new file mode 100644 index 0000000..53f0a5c --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/AvDefaultHttpHeaderHandler.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.device.http; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.modular.system.handler.DefaultHttpHeaderHandler; +import org.apache.http.client.methods.HttpRequestBase; + +public class AvDefaultHttpHeaderHandler extends DefaultHttpHeaderHandler { + public void setHeader(HttpRequestBase base, String token) { + base.addHeader("Content-type", DEFAULT_CONTEXTTYPE); + if (StrUtil.isNotEmpty(token)) { + base.addHeader("X-OApi-Token", token); + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/HttpGetWithEntity.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/HttpGetWithEntity.java new file mode 100644 index 0000000..b8abf8f --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/HttpGetWithEntity.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.device.http; + +import org.apache.http.client.methods.HttpEntityEnclosingRequestBase; + +import java.net.URI; + +public class HttpGetWithEntity extends HttpEntityEnclosingRequestBase { + + public HttpGetWithEntity(URI uri) { + this.setURI(uri); + } + + public HttpGetWithEntity(String uri) { + this.setURI(URI.create(uri)); + } + + public String getMethod() { + return "GET"; + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/IAvSyncService.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/IAvSyncService.java new file mode 100644 index 0000000..13c3203 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/IAvSyncService.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.device.service; + +import com.casic.missiles.modular.device.dto.stream.StreamRequestDTO; + +public interface IAvSyncService { + /** + * Dc706设备信息同步 + */ + void syncDcDevices(String token); + + /** + * 创建流 + * + * @param streamRequestDTO + * @return + */ + Object getStreams(StreamRequestDTO streamRequestDTO); + + /** + * 停止流 + * + * @param id + * @return + */ + Object stopStreams(String id); + + /** + * 发送心跳 + * + * @param id 设备国标号 + * @return + */ + Object heart(String id); + + /** + * 设备权限更新 + */ + void loadUserDeviceRelationships(); +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/impl/AvSyncServiceImpl.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/impl/AvSyncServiceImpl.java new file mode 100644 index 0000000..25e3340 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/impl/AvSyncServiceImpl.java @@ -0,0 +1,179 @@ +package com.casic.missiles.modular.device.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.casic.missiles.core.application.service.AbstractUserService; +import com.casic.missiles.modular.device.dto.AvDeviceDTO; +import com.casic.missiles.modular.device.dto.DeviceRelationshipDTO; +import com.casic.missiles.modular.device.dto.page.AvPageRequest; +import com.casic.missiles.modular.device.dto.stream.StreamRequestDTO; +import com.casic.missiles.modular.device.enums.AvDataStateEnum; +import com.casic.missiles.modular.device.enums.AvPtzTypeEnum; +import com.casic.missiles.modular.device.enums.AvSecretLevelEnum; +import com.casic.missiles.modular.device.enums.AvStatusTypeEnum; +import com.casic.missiles.modular.device.model.BusDeviceInfo; +import com.casic.missiles.modular.device.service.IAvSyncService; +import com.casic.missiles.modular.device.service.IBusDeviceInfoService; +import com.casic.missiles.modular.device.service.ISysGroupDeviceService; +import com.casic.missiles.modular.device.util.AvUtil; +import com.casic.missiles.modular.system.model.SysUserGroup; +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.modular.system.service.ISysUserGroupService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; +@Slf4j +@Service +public class AvSyncServiceImpl implements IAvSyncService { + @Value("${casic.video.av.url:-1}") + private String avUrl; + @Value("${casic.video.av.token:-1}") + private String avToken; + @Resource + private IBusDeviceInfoService deviceInfoService; + @Resource + private AbstractUserService abstractUserService; + + @Resource + private ISysUserGroupService userGroupService; + @Resource + private ISysGroupDeviceService sysGroupDeviceService; + + @Override + public void syncDcDevices(String token) { + AvPageRequest avPageRequest = new AvPageRequest(); + avPageRequest.setPage(1); + avPageRequest.setPaging(1); + + //全量查询设备信息 + List deviceDTOS = AvUtil.selectDevices(avUrl, token, avPageRequest); + + if (CollectionUtil.isNotEmpty(deviceDTOS)) { + for (AvDeviceDTO dcDeviceDTO : deviceDTOS) { + BusDeviceInfo busDeviceInfo = this.convertDevice(dcDeviceDTO); + + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(BusDeviceInfo::getCameraIndexCode, dcDeviceDTO.getSn()); + this.deviceInfoService.saveOrUpdate(busDeviceInfo, query); + } + + List deviceSns = deviceDTOS.stream().filter(dto -> AvDataStateEnum.DEL.equals(dto.getState())).map(AvDeviceDTO::getSn).collect(Collectors.toList()); + + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.in(BusDeviceInfo::getCameraIndexCode, deviceSns); + if (CollectionUtil.isNotEmpty(deviceSns)) { + this.deviceInfoService.remove(query); + } + } + +// AvUtil.dict(avUrl,avToken); + } + + /** + * 流地址请求 + * + * @param streamRequestDTO + * @return + */ + @Override + public Object getStreams(StreamRequestDTO streamRequestDTO) { + return AvUtil.selectStreams(avUrl, avToken, streamRequestDTO); + } + + @Override + public Object stopStreams(String id) { + return AvUtil.stopStreams(avUrl, avToken, id); + } + + @Override + public Object heart(String id) { + return AvUtil.heart(avUrl, avToken, id); + } + + @Transactional + @Override + public void loadUserDeviceRelationships() { + + List relationshipDTOS = AvUtil.userDeviceRelationships(avUrl, avToken); + log.info("loadUserDeviceRelationships: {}", relationshipDTOS); + + for (DeviceRelationshipDTO relationshipDTO : relationshipDTOS) { + + //检索用户信息 + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(User::getSyncId, relationshipDTO.getUser_id()); + List users = abstractUserService.list(query); + + if (users != null&&users.size() > 0) { + User user = users.get(0); + //创建用户组 + LambdaQueryWrapper groupQuery = new LambdaQueryWrapper<>(); + String groupName = user.getName() + user.getId(); + groupQuery.eq(SysUserGroup::getGroupName, groupName); + SysUserGroup sysUserGroup = userGroupService.getOne(groupQuery); + + if (sysUserGroup == null) { + sysUserGroup = genSysUserGroup(groupName, user); + List userIds = new ArrayList<>(); + userIds.add(user.getId()); + userGroupService.createSysUserGroup(sysUserGroup, userIds); + } + + LambdaQueryWrapper deviceQuery = new LambdaQueryWrapper<>(); + deviceQuery.in(BusDeviceInfo::getCameraIndexCode, relationshipDTO.getDeviceList()); + List busDeviceInfos = deviceInfoService.list(deviceQuery); + + if (CollectionUtil.isNotEmpty(busDeviceInfos)) { + List list = busDeviceInfos.stream().map(BusDeviceInfo::getId).collect(Collectors.toList()); + sysGroupDeviceService.batchIncremental(sysUserGroup.getId(), list); + } + + }else{ + log.error("loadUserDeviceRelationships is empty: {}", relationshipDTO.getUser_id()); + } + } + } + + private SysUserGroup genSysUserGroup(String groupName, User user) { + SysUserGroup sysUserGroup = new SysUserGroup(); + sysUserGroup.setGroupName(groupName); + sysUserGroup.setCreateTime(new Date()); + sysUserGroup.setCreateId(user.getId()); + sysUserGroup.setDeptId(user.getDeptId()); + sysUserGroup.setDescription("默认创建分组,不可修改!"); + sysUserGroup.setSafe(0); + return sysUserGroup; + } + + /** + * 设备类型数据转换 + * + * @param dto 艾薇设备信息 + * @return + */ + private BusDeviceInfo convertDevice(AvDeviceDTO dto) { + BusDeviceInfo info = new BusDeviceInfo(); + info.setCreateTime(new Date()); + info.setUpdateTime(new Date()); + + //转换为本地密级编码 + info.setSecretLevel(AvSecretLevelEnum.valueOfCode(dto.getSecureLevel()).getCurrCode()); + + info.setDeviceStatus(AvStatusTypeEnum.valueOfType(dto.getStatus()).getType()); + info.setCameraIndexCode(dto.getSn()); + info.setMonitorName(dto.getName()); + + //PTZ type类型 + info.setDeviceType(AvPtzTypeEnum.valueOfType(dto.getPtzType()).getType() + ""); + info.setBfFlag(0); + + return info; + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/util/AvHttpUtils.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/util/AvHttpUtils.java new file mode 100644 index 0000000..083d88a --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/util/AvHttpUtils.java @@ -0,0 +1,331 @@ +package com.casic.missiles.modular.device.util; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.modular.device.http.HttpGetWithEntity; +import com.casic.missiles.modular.system.handler.DefaultHttpHeaderHandler; +import org.apache.http.NameValuePair; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpDelete; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.util.EntityUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +public class AvHttpUtils { + + public static String sendGetJson(String url, Map param, String token, DefaultHttpHeaderHandler handler) { + try { + StringBuffer query = new StringBuffer(); + String var14 = sendGetEntityData(url, handler.getChartSet(), param, token, handler); + return var14; + } catch (Exception var10) { + Exception e = var10; + e.printStackTrace(); + System.out.println("发送GET请求出现异常!" + e); + return ""; + } finally { + ; + } + } + public static String sendGet(String url, Map param, String token, DefaultHttpHeaderHandler handler) { + try { + StringBuffer query = new StringBuffer(); + Iterator var5 = param.entrySet().iterator(); + + while(var5.hasNext()) { + Map.Entry kv = (Map.Entry)var5.next(); + query.append(URLEncoder.encode((String)kv.getKey(), handler.getChartSet()) + "="); + query.append(URLEncoder.encode((String)kv.getValue(), handler.getChartSet()) + "&"); + } + + if (query.lastIndexOf("&") > 0) { + query.deleteCharAt(query.length() - 1); + } + + String urlNameString = url + "?" + query.toString(); + String var14 = sendGetData(urlNameString, handler.getChartSet(), token, handler); + return var14; + } catch (Exception var10) { + Exception e = var10; + e.printStackTrace(); + System.out.println("发送GET请求出现异常!" + e); + return ""; + } finally { + ; + } + } + public static String sendPost(String url, Map param, String token, DefaultHttpHeaderHandler httpHeaderHandler) { + return sendPostDataByMap(url, param, "utf8", token, httpHeaderHandler); + } + public static String sendPostDataByMap(String url, Map map, String encoding, String token, DefaultHttpHeaderHandler httpHeaderHandler) { + String result = ""; + CloseableHttpResponse response = null; + CloseableHttpClient httpClient = null; + HttpPost httpPost = null; + + try { + httpClient = HttpClients.createDefault(); + httpPost = new HttpPost(url); + httpPost.setHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)"); + httpHeaderHandler.setHeader(httpPost, token); + if (httpHeaderHandler.isJson()) { + jsonParams(map, httpPost); + } else { + formParams(map, httpPost, httpHeaderHandler.getChartSet()); + } + + response = httpClient.execute(httpPost); + if (response.getStatusLine().getStatusCode() == 200) { + result = EntityUtils.toString(response.getEntity(), httpHeaderHandler.getChartSet()); + } + } catch (Exception var22) { + Exception e = var22; + System.out.println("发送GET请求出现异常!" + e); + e.printStackTrace(); + } finally { + IOException e; + try { + if (response != null) { + response.close(); + } + + httpPost.releaseConnection(); + httpClient.close(); + } catch (IOException var21) { + e = var21; + e.printStackTrace(); + } + + if (httpClient != null) { + try { + httpClient.close(); + } catch (IOException var20) { + e = var20; + e.printStackTrace(); + } + } + + } + + return result; + } + public static String sendGetData(String url, String encoding, String token, DefaultHttpHeaderHandler httpHeaderHandler) { + String result = ""; + CloseableHttpResponse response = null; + if (httpHeaderHandler == null) { + httpHeaderHandler = new DefaultHttpHeaderHandler(); + } + + CloseableHttpClient httpClient = null; + + try { + httpClient = HttpClients.createDefault(); + HttpGet httpGet = new HttpGet(url); + httpHeaderHandler.setHeader(httpGet, token); + response = httpClient.execute(httpGet); + if (response.getStatusLine().getStatusCode() == 200) { + result = EntityUtils.toString(response.getEntity(), encoding); + } + } catch (Exception var20) { + Exception e = var20; + e.printStackTrace(); + System.out.println("发送GET请求出现异常!" + e); + } finally { + IOException e; + if (response != null) { + try { + response.close(); + } catch (IOException var19) { + e = var19; + e.printStackTrace(); + } + } + + if (httpClient != null) { + try { + httpClient.close(); + } catch (IOException var18) { + e = var18; + e.printStackTrace(); + } + } + + } + + return result; + } + public static String sendGetEntityData(String url, String encoding, Map param, String token, DefaultHttpHeaderHandler httpHeaderHandler) { + String result = ""; + CloseableHttpResponse response = null; + if (httpHeaderHandler == null) { + httpHeaderHandler = new DefaultHttpHeaderHandler(); + } + CloseableHttpClient httpClient =null; + try { + httpClient = HttpClients.createDefault(); + HttpGetWithEntity httpGet = new HttpGetWithEntity(url); + httpHeaderHandler.setHeader(httpGet, token); + if (httpHeaderHandler.isJson()) { + jsonParams(param, httpGet); + } else { + formParams(param, httpGet, httpHeaderHandler.getChartSet()); + } + response = httpClient.execute(httpGet); + if (response.getStatusLine().getStatusCode() == 200) { + result = EntityUtils.toString(response.getEntity(), encoding); + } + } catch (Exception var16) { + Exception e = var16; + e.printStackTrace(); + System.out.println("发送GET请求出现异常!" + e); + } finally { + if (response != null) { + try { + response.close(); + } catch (IOException var15) { + IOException e = var15; + e.printStackTrace(); + } + } + if (httpClient != null) { + try { + httpClient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + } + + return result; + } + + public static String sendDelete(String url, Map param, String token, DefaultHttpHeaderHandler handler) { + try { + StringBuffer query = new StringBuffer(); + Iterator var5 = param.entrySet().iterator(); + + while (var5.hasNext()) { + Map.Entry kv = (Map.Entry) var5.next(); + query.append(URLEncoder.encode((String) kv.getKey(), handler.getChartSet()) + "="); + query.append(URLEncoder.encode((String) kv.getValue(), handler.getChartSet()) + "&"); + } + + if (query.lastIndexOf("&") > 0) { + query.deleteCharAt(query.length() - 1); + } + String urlNameString = url + "?" + query.toString(); + String var14 = sendDeleteData(urlNameString, handler.getChartSet(), token, handler); + return var14; + } catch (Exception var10) { + Exception e = var10; + e.printStackTrace(); + System.out.println("发送GET请求出现异常!" + e); + return ""; + } finally { + ; + } + } + private static final Logger logger = LoggerFactory.getLogger(AvUtil.class); + /** + * http 请求 + * + * @param url + * @param encoding + * @param token + * @param httpHeaderHandler + * @return + */ + public static String sendDeleteData(String url, String encoding, String token, DefaultHttpHeaderHandler httpHeaderHandler) { + String result = ""; + CloseableHttpResponse response = null; + if (httpHeaderHandler == null) { + httpHeaderHandler = new DefaultHttpHeaderHandler(); + } + CloseableHttpClient httpClient = null; + try { + httpClient = HttpClients.createDefault(); + HttpDelete httpGet = new HttpDelete(url); + httpHeaderHandler.setHeader(httpGet, token); + response = httpClient.execute(httpGet); + if (response.getStatusLine().getStatusCode() == 200) { + logger.info("----------------------------------:"+EntityUtils.toString(response.getEntity(), encoding)); + result = EntityUtils.toString(response.getEntity(), encoding); + } + } catch (Exception var16) { + Exception e = var16; + e.printStackTrace(); + } finally { + if (response != null) { + try { + response.close(); + } catch (IOException var15) { + IOException e = var15; + e.printStackTrace(); + } + } + if (httpClient != null) { + try { + httpClient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return result; + } + public static void jsonParams(Map map, HttpPost post) { + String paramJson = JSONObject.toJSONString(map); + StringEntity stringEntity = new StringEntity(paramJson, ContentType.create("application/json", "UTF-8")); + post.setEntity(stringEntity); + } + + public static void formParams(Map map, HttpPost post, String chartSet) throws UnsupportedEncodingException { + List nameValuePairs = new ArrayList(); + if (map != null) { + Iterator var4 = map.entrySet().iterator(); + + while(var4.hasNext()) { + Map.Entry entry = (Map.Entry)var4.next(); + nameValuePairs.add(new BasicNameValuePair((String)entry.getKey(), (String)entry.getValue())); + } + } + + post.setEntity(new UrlEncodedFormEntity(nameValuePairs, chartSet)); + } + public static void jsonParams(Map map, HttpGetWithEntity post) { + String paramJson = JSONObject.toJSONString(map); + StringEntity stringEntity = new StringEntity(paramJson, ContentType.create("application/json", "UTF-8")); + + post.setEntity(stringEntity); + } + + public static void formParams(Map map, HttpGetWithEntity post, String chartSet) throws UnsupportedEncodingException { + List nameValuePairs = new ArrayList(); + if (map != null) { + Iterator var4 = map.entrySet().iterator(); + + while (var4.hasNext()) { + Map.Entry entry = (Map.Entry) var4.next(); + nameValuePairs.add(new BasicNameValuePair((String) entry.getKey(), (String) entry.getValue())); + } + } + + post.setEntity(new UrlEncodedFormEntity(nameValuePairs, chartSet)); + } +} \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/util/AvUtil.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/util/AvUtil.java new file mode 100644 index 0000000..9575627 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/util/AvUtil.java @@ -0,0 +1,171 @@ +package com.casic.missiles.modular.device.util; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.TypeReference; +import com.casic.missiles.modular.device.dto.AvDeviceDTO; +import com.casic.missiles.modular.device.dto.AvPageResponse; +import com.casic.missiles.modular.device.dto.DeviceRelationshipDTO; +import com.casic.missiles.modular.device.dto.page.AvPageRequest; +import com.casic.missiles.modular.device.dto.stream.StreamRequestDTO; +import com.casic.missiles.modular.device.enums.AvUrlEnums; +import com.casic.missiles.modular.device.http.AvDefaultHttpHeaderHandler; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 艾薇对接工具类 + */ +public class AvUtil { + private static final Logger logger = LoggerFactory.getLogger(AvUtil.class); + + /** + * 设备列表读取 + * + * @param baseUrl av流媒体地址 + * @param token 认证令牌 + * @param pageRequest 请求体 + * @return + */ + public static List selectDevices(String baseUrl, String token, AvPageRequest pageRequest) { + AvDefaultHttpHeaderHandler dcDefaultHttpHeaderHandler = new AvDefaultHttpHeaderHandler(); + dcDefaultHttpHeaderHandler.setJson(true); + Map param = new HashMap<>(); + param.put("page", pageRequest.getPage() + ""); + param.put("paging", pageRequest.getPaging() + ""); + param.put("limit", "100000"); + param.put("token", token); + String res = AvHttpUtils.sendGet(baseUrl + AvUrlEnums.DEVICE.getUrl(), param, token, dcDefaultHttpHeaderHandler); + logger.info("selectDevices:{}", res); + if (StrUtil.isEmpty(res)) { + logger.error("av device sync error!"); + } + AvPageResponse deviceDTOS = JSON.parseObject(res, new TypeReference() { + }); + return deviceDTOS.getItems(); + } + + /** + * 创建流 + * + * @param baseUrl av流媒体地址 + * @param token 认证令牌 + * @param streamRequestDTO 请求体 + * @return + */ + public static Object selectStreams(String baseUrl, String token, StreamRequestDTO streamRequestDTO) { + + Map param = new HashMap<>(); + param.put("device_id", streamRequestDTO.getDevice_id() + ""); + param.put("stream_type", streamRequestDTO.getStream_type() + ""); + param.put("quality", streamRequestDTO.getQuality() + ""); + param.put("token", token); + param.put("from", streamRequestDTO.getFrom() + ""); + param.put("to", streamRequestDTO.getTo() + ""); + logger.info("url:{}", baseUrl + AvUrlEnums.STREAM.getUrl()); + AvDefaultHttpHeaderHandler dcDefaultHttpHeaderHandler = new AvDefaultHttpHeaderHandler(); + dcDefaultHttpHeaderHandler.setJson(true); + String res = AvHttpUtils.sendPost(baseUrl + AvUrlEnums.STREAM.getUrl(), param, token, dcDefaultHttpHeaderHandler); + + if (StrUtil.isEmpty(res)) { + logger.error("av stream error:{}", streamRequestDTO.getDevice_id()); + return null; + } + return JSON.parseObject(res); + } + + /** + * 发送心跳 + * + * @param avUrl + * @param avToken + * @return + */ + public static Object dict(String avUrl, String avToken) { + AvDefaultHttpHeaderHandler dcDefaultHttpHeaderHandler = new AvDefaultHttpHeaderHandler(); + dcDefaultHttpHeaderHandler.setJson(true); + Map param = new HashMap<>(); + String res = AvHttpUtils.sendGet(avUrl + AvUrlEnums.DICT.getUrl(), param, avToken, dcDefaultHttpHeaderHandler); + logger.info("av dict:{}", res); + return null; + } + + /** + * 发送心跳 + * + * @param avUrl + * @param avToken + * @param id + * @return + */ + public static Object heart(String avUrl, String avToken, String id) { + AvDefaultHttpHeaderHandler dcDefaultHttpHeaderHandler = new AvDefaultHttpHeaderHandler(); + dcDefaultHttpHeaderHandler.setJson(true); + Map param = new HashMap<>(); +// param.put("id", id); +// param.put("token", avToken); + String res = AvHttpUtils.sendGet(avUrl + String.format(AvUrlEnums.HEART.getUrl(), id), param, avToken, dcDefaultHttpHeaderHandler); + if (StrUtil.isEmpty(res)) { + logger.error("av heart error:{}", id); + return null; + } + return JSON.parseObject(res); + } + + /** + * 停止流 + * + * @param avUrl 艾薇流媒体地址 + * @param avToken 认证令牌 + * @param id 国标ID + * @return + */ + public static Object stopStreams(String avUrl, String avToken, String id) { + AvDefaultHttpHeaderHandler dcDefaultHttpHeaderHandler = new AvDefaultHttpHeaderHandler(); + dcDefaultHttpHeaderHandler.setJson(true); + Map param = new HashMap<>(); + //param.put("id", id); + String res = AvHttpUtils.sendDelete(avUrl + String.format(AvUrlEnums.STREAM_STOP.getUrl(), id), param, avToken, dcDefaultHttpHeaderHandler); + + if (StrUtil.isEmpty(res)) { + logger.error("av stopStreams error:{}", id); + return null; + } + return JSON.parseObject(res); + } + + /** + * 用户设备关系 + * + * @param avUrl 艾薇流媒体地址 + * @param avToken 认证令牌 + * @return + */ + public static List userDeviceRelationships(String avUrl, String avToken) { + + AvDefaultHttpHeaderHandler avDefaultHttpHeaderHandler = new AvDefaultHttpHeaderHandler(); + avDefaultHttpHeaderHandler.setJson(true); + Map param = new HashMap<>(); + String res = AvHttpUtils.sendGetJson(avUrl + AvUrlEnums.USER_DEVICE_RELATION.getUrl(), param, avToken, avDefaultHttpHeaderHandler); + if (StrUtil.isEmpty(res)) { + logger.error("av userDeviceRelationships error"); + return null; + } + + List deviceDTOS = JSON.parseObject(res, new TypeReference>() { + }); + if (CollectionUtil.isNotEmpty(deviceDTOS)) { + for (DeviceRelationshipDTO deviceDTO : deviceDTOS) { + if (StrUtil.isNotEmpty(deviceDTO.getDevice_list())) { + deviceDTO.setDeviceList(StrUtil.split(deviceDTO.getDevice_list(), ",")); + } + } + } + return deviceDTOS; + } +} \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/task/AvTask.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/task/AvTask.java new file mode 100644 index 0000000..46ccc41 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/task/AvTask.java @@ -0,0 +1,46 @@ +package com.casic.missiles.modular.task; + +import com.casic.missiles.modular.device.service.IAvSyncService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +@Slf4j +@Component +public class AvTask { + + @Resource + private IAvSyncService deviceStatusService; + @Value("${casic.video.av.open:-1}") + private Boolean open; + @Value("${casic.video.av.token:-1}") + private String token; + + /** + * 设备信息同步0 + * 每30分钟采集一次 + */ + @Scheduled(cron = "${casic.video.av.deviceCorn}") + public void device() { + //更新组织机构信息 + log.info("av sdk 设备信息同步"); + if (open) { + deviceStatusService.syncDcDevices(token); + } + log.info("av sdk 设备同步结束"); + } + + @Scheduled(cron = "${casic.video.av.deviceStatusCorn}") + public void deviceRefreshToken() { + //更新组织机构信息 + log.info("av 设备状态刷新"); + if (open) { + deviceStatusService.loadUserDeviceRelationships(); + } + + log.info("av 设备状态刷新"); + } +} \ No newline at end of file diff --git a/casic-device-sync/casic-device-dc/src/main/java/com/casic/missiles/modular/http/DcDefaultHttpHeaderHandler.java b/casic-device-sync/casic-device-dc/src/main/java/com/casic/missiles/modular/http/DcDefaultHttpHeaderHandler.java index 550b9d4..e3ee94f 100644 --- a/casic-device-sync/casic-device-dc/src/main/java/com/casic/missiles/modular/http/DcDefaultHttpHeaderHandler.java +++ b/casic-device-sync/casic-device-dc/src/main/java/com/casic/missiles/modular/http/DcDefaultHttpHeaderHandler.java @@ -12,4 +12,6 @@ } } + + } diff --git a/casic-server-sync/src/main/java/com/casic/missiles/modular/device/controller/GateController.java b/casic-server-sync/src/main/java/com/casic/missiles/modular/device/controller/GateController.java index 1108110..efd28e1 100644 --- a/casic-server-sync/src/main/java/com/casic/missiles/modular/device/controller/GateController.java +++ b/casic-server-sync/src/main/java/com/casic/missiles/modular/device/controller/GateController.java @@ -58,9 +58,9 @@ return; } -// String dn = new String(request.getHeader("dnname").getBytes("ISO8859-1"), "UTF-8"); -// String account = getValueByDn(dn, key1); - String account = x; + String dn = new String(request.getHeader("dnname").getBytes("ISO8859-1"), "UTF-8"); + String account = getValueByDn(dn, key1); +// String account = x; //token自定义 CasicCustomToken token = new CasicCustomToken(account, "password"); token.setType(LoginType.NO_PASSWD); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/device/service/ISysGroupDeviceService.java b/casic-server/src/main/java/com/casic/missiles/modular/device/service/ISysGroupDeviceService.java index 2bf6155..724ce26 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/device/service/ISysGroupDeviceService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/device/service/ISysGroupDeviceService.java @@ -29,4 +29,12 @@ * @param relDTO */ void batchAdd(GroupRelDTO relDTO); + + + /** + * 增量更新 + * @param groupId + * @param deviceIds + */ + void batchIncremental(Long groupId, List deviceIds); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java index 0216c1e..1c58177 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java @@ -86,7 +86,10 @@ AuthUser user = abstractPermissionContext.getAuthService().getLoginUser(); QueryWrapper pageQuery = query((QueryWrapper) query, "id", user.getId(), user.getRoleTips()); - pageQuery.le("secret_level", user.getSecretLevel()); + if (!user.getRoleTips().contains(adminRole)) { + pageQuery.le("secret_level", user.getSecretLevel()); + } + DataScope dataScope = abstractPermissionContext.getAuthService().getLoginUserDataScope(); if (!ScopeEnums.ALL_TYPE.getCode().equals(dataScope.getScopeEnums().getCode())) { pageQuery.in("dept_id", dataScope.getDeptIds()); @@ -217,7 +220,7 @@ if (!ScopeEnums.ALL_TYPE.getCode().equals(scope.getScopeEnums())) { deptQuery.in(Dept::getId, scope.getDeptIds()); } - + deptQuery.orderByAsc(Dept::getNum); List deptList = abstractPermissionContext.getDeptService().list(deptQuery); List deptDTOS = new ArrayList<>(); List rootIds = new ArrayList<>(); @@ -235,8 +238,12 @@ //挂载设备信息 QueryWrapper deviceQuery = new QueryWrapper<>(); deviceQuery.eq("dept_id", deptDTO.getId()); - //判定只可查看以下密级 - deviceQuery.le("secret_level", user.getSecretLevel()); + + //判定只可查看以下密级 安全管理员除外 + if (!user.getRoleTips().contains(adminRole)) { + deviceQuery.le("secret_level", user.getSecretLevel()); + } + deviceQuery.orderByAsc("create_time"); List deviceInfos = this.list(deviceQuery); deptDTO.setChildrenNodes(deviceInfos.stream().map(this::createDeptDTO).collect(Collectors.toList())); @@ -293,7 +300,9 @@ if (StrUtil.isEmpty(result.getArea()) || !areaMap.containsKey(Convert.toLong(result.getArea()))) { errors.add("第" + index + "行所属区域编码不存在!"); } - + if(StrUtil.isNotEmpty(result.getLocation())&&result.getLocation().length()>120){ + errors.add("第" + index + "行详细位置过长!"); + } //商米校验 if(SysEnum.sm.getCode().equals(sysType)){ if(StrUtil.isEmpty(result.getNvrManufactureType())){ diff --git a/casic-server/src/main/java/com/casic/missiles/modular/device/service/impl/DeviceGroupInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/device/service/impl/DeviceGroupInfoServiceImpl.java index 81eaf4a..cfac743 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/device/service/impl/DeviceGroupInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/device/service/impl/DeviceGroupInfoServiceImpl.java @@ -116,8 +116,21 @@ return true; } + @Transactional + @Override + public boolean removeById(Serializable id) { + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.in(SysGroupDevice::getGroupId, id); + sysGroupDeviceService.remove(query); + return super.removeById(id); + } + + @Transactional @Override public boolean removeByIds(Collection idList) { + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.in(SysGroupDevice::getGroupId, idList); + sysGroupDeviceService.remove(query); return groupService.removeByIds(idList); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/device/service/impl/SysGroupDeviceServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/device/service/impl/SysGroupDeviceServiceImpl.java index 71f595d..b900519 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/device/service/impl/SysGroupDeviceServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/device/service/impl/SysGroupDeviceServiceImpl.java @@ -11,7 +11,6 @@ import com.casic.missiles.modular.device.model.SysGroupDevice; import com.casic.missiles.modular.device.service.ISysGroupDeviceService; import com.casic.missiles.modular.system.dto.GroupUserRelDTO; -import com.casic.missiles.modular.system.model.SysGroupRelUser; import com.casic.missiles.modular.system.service.ISysGroupRelUserService; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -19,6 +18,7 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; +import java.util.stream.Collectors; /** @@ -51,7 +51,7 @@ } //删除 QueryWrapper query = new QueryWrapper<>(); - query.eq("group_id",relDTO.getGroupId()); + query.eq("group_id", relDTO.getGroupId()); this.remove(query); //添加设备信息 List groupDevices = new ArrayList<>(); @@ -71,6 +71,38 @@ } + @Override + public void batchIncremental(Long groupId, List deviceIds) { + List groupDevices = this.list(new LambdaQueryWrapper().eq(SysGroupDevice::getGroupId, groupId)); + if (CollectionUtil.isEmpty(groupDevices)) { + saveDevices(groupId, deviceIds); + } else { + List oldDevices = groupDevices.stream().map(SysGroupDevice::getDeviceId).collect(Collectors.toList()); + List delIds = CollectionUtil.subtractToList(oldDevices, deviceIds); + List saveDevices = CollectionUtil.subtractToList(deviceIds, oldDevices); + + LambdaQueryWrapper delQuery = new LambdaQueryWrapper<>(); + delQuery.eq(SysGroupDevice::getGroupId, groupId); + delQuery.in(SysGroupDevice::getDeviceId, delIds); + if (CollectionUtil.isNotEmpty(delIds)) { + this.remove(delQuery); + } + saveDevices(groupId, saveDevices); + } + } + + private void saveDevices(Long groupId, List saveDevices) { + List saves = new ArrayList<>(); + for (Long deviceId : saveDevices) { + SysGroupDevice sysGroupDevice = new SysGroupDevice(); + sysGroupDevice.setDeviceId(deviceId); + sysGroupDevice.setGroupId(groupId); + sysGroupDevice.setCreateTime(new Date()); + saves.add(sysGroupDevice); + } + this.saveOrUpdateBatchList(saves); + } + private void saveOrUpdateBatchList(List groupDevices) { for (SysGroupDevice groupDevice : groupDevices) { LambdaQueryWrapper query = new LambdaQueryWrapper<>(); diff --git a/README.md b/README.md index 430796e..8dbc9a5 100644 --- a/README.md +++ b/README.md @@ -9,3 +9,7 @@ #### 其他 >* [git地址](http://192.168.0.203:8080/gitbucket) >* [本地免登地址](http://localhost:8083/route/mockToken) + +AView 对接问题 +1.用户设备关联关系 + 对应返回 device_list是否为设备国标号 \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/pom.xml b/casic-device-sync/casic-device-aview/pom.xml index 0a3c5fa..94fb9e5 100644 --- a/casic-device-sync/casic-device-aview/pom.xml +++ b/casic-device-sync/casic-device-aview/pom.xml @@ -33,6 +33,21 @@ ${boot.version} provided + + com.casic + casic-http + ${core.version} + + + com.casic + casic-admin-group + ${admin.version} + + + com.casic + casic-server + ${pro.version} + diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java new file mode 100644 index 0000000..195cba2 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/controller/AvRouteController.java @@ -0,0 +1,45 @@ +package com.casic.missiles.modular.device.controller; + +import com.casic.missiles.model.response.dto.ResponseDataDTO; +import com.casic.missiles.modular.device.dto.stream.StreamRequestDTO; +import com.casic.missiles.modular.device.service.IAvSyncService; +import io.swagger.annotations.Api; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +@Api(tags = "AV平台代理接口") +@RestController +@RequestMapping("/route") +public class AvRouteController { + @Resource + private IAvSyncService avSyncService; + + @PostMapping("/open/v1/api/streams") + public Object streams(@RequestBody StreamRequestDTO requestDTO) { + Object object = avSyncService.getStreams(requestDTO); + if (object == null) { + ResponseDataDTO respDTO = ResponseDataDTO.error("流读取失败,请稍后重试!"); + respDTO.setMessage("流读取失败,请稍后重试!"); + return respDTO; + } + return ResponseDataDTO.success(avSyncService.getStreams(requestDTO)); + } + + @DeleteMapping("/open/v1/api/streams/{id}") + public Object stopStreams(@PathVariable("id") String id) { + Object object = avSyncService.stopStreams(id); + return ResponseDataDTO.success(object); + } + + @PostMapping("/open/v1/api/streams/{id}/heart") + public Object heart(@PathVariable("id") String id) { + Object object = avSyncService.heart(id); + if (object == null) { + ResponseDataDTO respDTO = ResponseDataDTO.error("流心跳失败,请稍后重试!"); + respDTO.setMessage("流心跳失败,请稍后重试!"); + return respDTO; + } + return ResponseDataDTO.success(object); + } +} \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java new file mode 100644 index 0000000..97bde9f --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvDeviceDTO.java @@ -0,0 +1,49 @@ +package com.casic.missiles.modular.device.dto; + +import com.alibaba.fastjson.annotation.JSONField; +import lombok.Data; + +/** + * 艾薇设备对象DTO + */ +@Data +public class AvDeviceDTO { + // 设备ID + private Long id; + + // 设备名称 + private String name; + + // 设备唯一国标序列号 + private String sn; + + // 设备类型 + private Integer type; + + // 设备版本号 + private String version; + + // 安全等级 + @JSONField(name = "secure_level") + private String secureLevel; + + // 设备状态 + private Integer status; + + // 云台类型 + private Integer ptzType; + + // 朝向 + private Integer orientation; + + // 创建时间 + @JSONField(name = "gmt_created") + private String gmtCreated; + + // 修改时间 + @JSONField(name = "gmt_modified") + private String gmtModified; + + // 数据状态 + private Integer state; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java new file mode 100644 index 0000000..9a05183 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/AvPageResponse.java @@ -0,0 +1,10 @@ +package com.casic.missiles.modular.device.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class AvPageResponse { + private List items; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java new file mode 100644 index 0000000..098dda4 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/DeviceRelationshipDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.device.dto; + +import lombok.Data; + +import java.util.List; + +@Data +public class DeviceRelationshipDTO { + private Long user_id; + private String device_list; + private List deviceList; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java new file mode 100644 index 0000000..74e6a9b --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRep.java @@ -0,0 +1,9 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +@Data +public class AvPageRep { + private Integer total; + private T list; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java new file mode 100644 index 0000000..900ae4a --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvPageRequest.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +/** + * 分页请求DTO + */ +@Data +public class AvPageRequest { + private int page; + private int paging; + private int limit; + +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java new file mode 100644 index 0000000..f1c1e7a --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/page/AvResponseDTO.java @@ -0,0 +1,15 @@ +package com.casic.missiles.modular.device.dto.page; + +import lombok.Data; + +/** + * mvp返回基类封装 + * + * @param + */ +@Data +public class AvResponseDTO { + private T data; + private Integer code; + private String msg; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamRequestDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamRequestDTO.java new file mode 100644 index 0000000..69e88ce --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamRequestDTO.java @@ -0,0 +1,12 @@ +package com.casic.missiles.modular.device.dto.stream; + +import lombok.Data; + +@Data +public class StreamRequestDTO { + private String device_id; + private String stream_type; + private String quality; + private int from; + private int to; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamStopRequestDTO.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamStopRequestDTO.java new file mode 100644 index 0000000..9cf94b1 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/dto/stream/StreamStopRequestDTO.java @@ -0,0 +1,11 @@ +package com.casic.missiles.modular.device.dto.stream; + +import lombok.Data; + +@Data +public class StreamStopRequestDTO { + private String id; + private String type; + private StreamRequestDTO request; + private String url; +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvDataStateEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvDataStateEnum.java new file mode 100644 index 0000000..e1a6658 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvDataStateEnum.java @@ -0,0 +1,72 @@ +package com.casic.missiles.modular.device.enums; + +/** + * 数据状态 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvDataStateEnum { + + TYPE0(0, "有效",0), + DEL(1, "无效",1); + + Integer code; + String message; + Integer type; + AvDataStateEnum(Integer code, String message, Integer type) { + this.code = code; + this.message = message; + this.type = type; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public static String valueOfs(Integer value) { + if (value == null) { + return ""; + } else { + for (AvDataStateEnum ms : AvDataStateEnum.values()) { + if (ms.getCode().equals(value)) { + return ms.getMessage(); + } + } + return ""; + } + } + + public static AvDataStateEnum valueOfType(Integer value) { + if (value == null) { + return TYPE0; + } else { + for (AvDataStateEnum ms : AvDataStateEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return TYPE0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvPtzTypeEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvPtzTypeEnum.java new file mode 100644 index 0000000..fdcb08d --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvPtzTypeEnum.java @@ -0,0 +1,73 @@ +package com.casic.missiles.modular.device.enums; + +/** + * wvp设备类型转换 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvPtzTypeEnum { + + TYPE0(0, "枪机",0), + TYPE1(1, "半球",1), + TYPE2(2, "球机",2); + + Integer code; + String message; + Integer type; + AvPtzTypeEnum(Integer code, String message, Integer type) { + this.code = code; + this.message = message; + this.type = type; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public static String valueOfs(Integer value) { + if (value == null) { + return ""; + } else { + for (AvPtzTypeEnum ms : AvPtzTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms.getMessage(); + } + } + return ""; + } + } + + public static AvPtzTypeEnum valueOfType(Integer value) { + if (value == null) { + return TYPE0; + } else { + for (AvPtzTypeEnum ms : AvPtzTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return TYPE0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvSecretLevelEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvSecretLevelEnum.java new file mode 100644 index 0000000..39e8524 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvSecretLevelEnum.java @@ -0,0 +1,60 @@ +package com.casic.missiles.modular.device.enums; + +/** + * Av主数据密集对应关系枚举 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvSecretLevelEnum { + s("999", "未定密", 999, "未定密"), + s0("0", "公开", 0, "公开"), + s1("1", "内部", 1, "内部"), + s2("2", "秘密", 2, "秘密"), + s3("3", "机密", 3, "机密"); + + String code; + Integer currCode; + String message; + String currMsg; + + AvSecretLevelEnum(String code, String message, Integer currCode, String currMsg) { + this.code = code; + this.currCode = currCode; + this.message = message; + this.currMsg = currMsg; + } + + public Integer getCurrCode() { + return currCode; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public static AvSecretLevelEnum valueOfCode(String value) { + if (value == null) { + return s0; + } else { + for (AvSecretLevelEnum ms : AvSecretLevelEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return s0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvStatusTypeEnum.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvStatusTypeEnum.java new file mode 100644 index 0000000..ddccd52 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvStatusTypeEnum.java @@ -0,0 +1,72 @@ +package com.casic.missiles.modular.device.enums; + +/** + * wvp设备类型转换 + * + * @author lwh + * @Date 2017年1月10日 下午9:54:13 + */ +public enum AvStatusTypeEnum { + + TYPE0(0, "离线",0), + TYPE1(1, "在线",1); + + Integer code; + String message; + Integer type; + AvStatusTypeEnum(Integer code, String message, Integer type) { + this.code = code; + this.message = message; + this.type = type; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Integer getType() { + return type; + } + + public void setType(Integer type) { + this.type = type; + } + + public static String valueOfs(Integer value) { + if (value == null) { + return ""; + } else { + for (AvStatusTypeEnum ms : AvStatusTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms.getMessage(); + } + } + return ""; + } + } + + public static AvStatusTypeEnum valueOfType(Integer value) { + if (value == null) { + return TYPE0; + } else { + for (AvStatusTypeEnum ms : AvStatusTypeEnum.values()) { + if (ms.getCode().equals(value)) { + return ms; + } + } + return TYPE0; + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvUrlEnums.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvUrlEnums.java new file mode 100644 index 0000000..04b38ad --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/enums/AvUrlEnums.java @@ -0,0 +1,37 @@ +package com.casic.missiles.modular.device.enums; + +/** + * 设备媒体 + */ +public enum AvUrlEnums { + DEVICE("/open/v1/api/devices","设备信息查询"), + STREAM("/open/v1/api/streams","创建流"), + STREAM_STOP("/open/v1/api/streams/%s","停止流"), + HEART("/open/v1/api/streams/%s/heartbeat","发送心跳"), + DICT("/open/v1/api/dictionary_datas","字典查询"), + USER_DEVICE_RELATION("/open/v1/api/user_device_relationships","用户设备关联关系"); + + private String url; + private String name; + + AvUrlEnums(String url, String name) { + this.url = url; + this.name = name; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/AvDefaultHttpHeaderHandler.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/AvDefaultHttpHeaderHandler.java new file mode 100644 index 0000000..53f0a5c --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/AvDefaultHttpHeaderHandler.java @@ -0,0 +1,14 @@ +package com.casic.missiles.modular.device.http; + +import cn.hutool.core.util.StrUtil; +import com.casic.missiles.modular.system.handler.DefaultHttpHeaderHandler; +import org.apache.http.client.methods.HttpRequestBase; + +public class AvDefaultHttpHeaderHandler extends DefaultHttpHeaderHandler { + public void setHeader(HttpRequestBase base, String token) { + base.addHeader("Content-type", DEFAULT_CONTEXTTYPE); + if (StrUtil.isNotEmpty(token)) { + base.addHeader("X-OApi-Token", token); + } + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/HttpGetWithEntity.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/HttpGetWithEntity.java new file mode 100644 index 0000000..b8abf8f --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/http/HttpGetWithEntity.java @@ -0,0 +1,20 @@ +package com.casic.missiles.modular.device.http; + +import org.apache.http.client.methods.HttpEntityEnclosingRequestBase; + +import java.net.URI; + +public class HttpGetWithEntity extends HttpEntityEnclosingRequestBase { + + public HttpGetWithEntity(URI uri) { + this.setURI(uri); + } + + public HttpGetWithEntity(String uri) { + this.setURI(URI.create(uri)); + } + + public String getMethod() { + return "GET"; + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/IAvSyncService.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/IAvSyncService.java new file mode 100644 index 0000000..13c3203 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/IAvSyncService.java @@ -0,0 +1,39 @@ +package com.casic.missiles.modular.device.service; + +import com.casic.missiles.modular.device.dto.stream.StreamRequestDTO; + +public interface IAvSyncService { + /** + * Dc706设备信息同步 + */ + void syncDcDevices(String token); + + /** + * 创建流 + * + * @param streamRequestDTO + * @return + */ + Object getStreams(StreamRequestDTO streamRequestDTO); + + /** + * 停止流 + * + * @param id + * @return + */ + Object stopStreams(String id); + + /** + * 发送心跳 + * + * @param id 设备国标号 + * @return + */ + Object heart(String id); + + /** + * 设备权限更新 + */ + void loadUserDeviceRelationships(); +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/impl/AvSyncServiceImpl.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/impl/AvSyncServiceImpl.java new file mode 100644 index 0000000..25e3340 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/service/impl/AvSyncServiceImpl.java @@ -0,0 +1,179 @@ +package com.casic.missiles.modular.device.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.casic.missiles.core.application.service.AbstractUserService; +import com.casic.missiles.modular.device.dto.AvDeviceDTO; +import com.casic.missiles.modular.device.dto.DeviceRelationshipDTO; +import com.casic.missiles.modular.device.dto.page.AvPageRequest; +import com.casic.missiles.modular.device.dto.stream.StreamRequestDTO; +import com.casic.missiles.modular.device.enums.AvDataStateEnum; +import com.casic.missiles.modular.device.enums.AvPtzTypeEnum; +import com.casic.missiles.modular.device.enums.AvSecretLevelEnum; +import com.casic.missiles.modular.device.enums.AvStatusTypeEnum; +import com.casic.missiles.modular.device.model.BusDeviceInfo; +import com.casic.missiles.modular.device.service.IAvSyncService; +import com.casic.missiles.modular.device.service.IBusDeviceInfoService; +import com.casic.missiles.modular.device.service.ISysGroupDeviceService; +import com.casic.missiles.modular.device.util.AvUtil; +import com.casic.missiles.modular.system.model.SysUserGroup; +import com.casic.missiles.modular.system.model.User; +import com.casic.missiles.modular.system.service.ISysUserGroupService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; +@Slf4j +@Service +public class AvSyncServiceImpl implements IAvSyncService { + @Value("${casic.video.av.url:-1}") + private String avUrl; + @Value("${casic.video.av.token:-1}") + private String avToken; + @Resource + private IBusDeviceInfoService deviceInfoService; + @Resource + private AbstractUserService abstractUserService; + + @Resource + private ISysUserGroupService userGroupService; + @Resource + private ISysGroupDeviceService sysGroupDeviceService; + + @Override + public void syncDcDevices(String token) { + AvPageRequest avPageRequest = new AvPageRequest(); + avPageRequest.setPage(1); + avPageRequest.setPaging(1); + + //全量查询设备信息 + List deviceDTOS = AvUtil.selectDevices(avUrl, token, avPageRequest); + + if (CollectionUtil.isNotEmpty(deviceDTOS)) { + for (AvDeviceDTO dcDeviceDTO : deviceDTOS) { + BusDeviceInfo busDeviceInfo = this.convertDevice(dcDeviceDTO); + + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(BusDeviceInfo::getCameraIndexCode, dcDeviceDTO.getSn()); + this.deviceInfoService.saveOrUpdate(busDeviceInfo, query); + } + + List deviceSns = deviceDTOS.stream().filter(dto -> AvDataStateEnum.DEL.equals(dto.getState())).map(AvDeviceDTO::getSn).collect(Collectors.toList()); + + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.in(BusDeviceInfo::getCameraIndexCode, deviceSns); + if (CollectionUtil.isNotEmpty(deviceSns)) { + this.deviceInfoService.remove(query); + } + } + +// AvUtil.dict(avUrl,avToken); + } + + /** + * 流地址请求 + * + * @param streamRequestDTO + * @return + */ + @Override + public Object getStreams(StreamRequestDTO streamRequestDTO) { + return AvUtil.selectStreams(avUrl, avToken, streamRequestDTO); + } + + @Override + public Object stopStreams(String id) { + return AvUtil.stopStreams(avUrl, avToken, id); + } + + @Override + public Object heart(String id) { + return AvUtil.heart(avUrl, avToken, id); + } + + @Transactional + @Override + public void loadUserDeviceRelationships() { + + List relationshipDTOS = AvUtil.userDeviceRelationships(avUrl, avToken); + log.info("loadUserDeviceRelationships: {}", relationshipDTOS); + + for (DeviceRelationshipDTO relationshipDTO : relationshipDTOS) { + + //检索用户信息 + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.eq(User::getSyncId, relationshipDTO.getUser_id()); + List users = abstractUserService.list(query); + + if (users != null&&users.size() > 0) { + User user = users.get(0); + //创建用户组 + LambdaQueryWrapper groupQuery = new LambdaQueryWrapper<>(); + String groupName = user.getName() + user.getId(); + groupQuery.eq(SysUserGroup::getGroupName, groupName); + SysUserGroup sysUserGroup = userGroupService.getOne(groupQuery); + + if (sysUserGroup == null) { + sysUserGroup = genSysUserGroup(groupName, user); + List userIds = new ArrayList<>(); + userIds.add(user.getId()); + userGroupService.createSysUserGroup(sysUserGroup, userIds); + } + + LambdaQueryWrapper deviceQuery = new LambdaQueryWrapper<>(); + deviceQuery.in(BusDeviceInfo::getCameraIndexCode, relationshipDTO.getDeviceList()); + List busDeviceInfos = deviceInfoService.list(deviceQuery); + + if (CollectionUtil.isNotEmpty(busDeviceInfos)) { + List list = busDeviceInfos.stream().map(BusDeviceInfo::getId).collect(Collectors.toList()); + sysGroupDeviceService.batchIncremental(sysUserGroup.getId(), list); + } + + }else{ + log.error("loadUserDeviceRelationships is empty: {}", relationshipDTO.getUser_id()); + } + } + } + + private SysUserGroup genSysUserGroup(String groupName, User user) { + SysUserGroup sysUserGroup = new SysUserGroup(); + sysUserGroup.setGroupName(groupName); + sysUserGroup.setCreateTime(new Date()); + sysUserGroup.setCreateId(user.getId()); + sysUserGroup.setDeptId(user.getDeptId()); + sysUserGroup.setDescription("默认创建分组,不可修改!"); + sysUserGroup.setSafe(0); + return sysUserGroup; + } + + /** + * 设备类型数据转换 + * + * @param dto 艾薇设备信息 + * @return + */ + private BusDeviceInfo convertDevice(AvDeviceDTO dto) { + BusDeviceInfo info = new BusDeviceInfo(); + info.setCreateTime(new Date()); + info.setUpdateTime(new Date()); + + //转换为本地密级编码 + info.setSecretLevel(AvSecretLevelEnum.valueOfCode(dto.getSecureLevel()).getCurrCode()); + + info.setDeviceStatus(AvStatusTypeEnum.valueOfType(dto.getStatus()).getType()); + info.setCameraIndexCode(dto.getSn()); + info.setMonitorName(dto.getName()); + + //PTZ type类型 + info.setDeviceType(AvPtzTypeEnum.valueOfType(dto.getPtzType()).getType() + ""); + info.setBfFlag(0); + + return info; + } +} diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/util/AvHttpUtils.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/util/AvHttpUtils.java new file mode 100644 index 0000000..083d88a --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/util/AvHttpUtils.java @@ -0,0 +1,331 @@ +package com.casic.missiles.modular.device.util; + +import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.modular.device.http.HttpGetWithEntity; +import com.casic.missiles.modular.system.handler.DefaultHttpHeaderHandler; +import org.apache.http.NameValuePair; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpDelete; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.ContentType; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.util.EntityUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +public class AvHttpUtils { + + public static String sendGetJson(String url, Map param, String token, DefaultHttpHeaderHandler handler) { + try { + StringBuffer query = new StringBuffer(); + String var14 = sendGetEntityData(url, handler.getChartSet(), param, token, handler); + return var14; + } catch (Exception var10) { + Exception e = var10; + e.printStackTrace(); + System.out.println("发送GET请求出现异常!" + e); + return ""; + } finally { + ; + } + } + public static String sendGet(String url, Map param, String token, DefaultHttpHeaderHandler handler) { + try { + StringBuffer query = new StringBuffer(); + Iterator var5 = param.entrySet().iterator(); + + while(var5.hasNext()) { + Map.Entry kv = (Map.Entry)var5.next(); + query.append(URLEncoder.encode((String)kv.getKey(), handler.getChartSet()) + "="); + query.append(URLEncoder.encode((String)kv.getValue(), handler.getChartSet()) + "&"); + } + + if (query.lastIndexOf("&") > 0) { + query.deleteCharAt(query.length() - 1); + } + + String urlNameString = url + "?" + query.toString(); + String var14 = sendGetData(urlNameString, handler.getChartSet(), token, handler); + return var14; + } catch (Exception var10) { + Exception e = var10; + e.printStackTrace(); + System.out.println("发送GET请求出现异常!" + e); + return ""; + } finally { + ; + } + } + public static String sendPost(String url, Map param, String token, DefaultHttpHeaderHandler httpHeaderHandler) { + return sendPostDataByMap(url, param, "utf8", token, httpHeaderHandler); + } + public static String sendPostDataByMap(String url, Map map, String encoding, String token, DefaultHttpHeaderHandler httpHeaderHandler) { + String result = ""; + CloseableHttpResponse response = null; + CloseableHttpClient httpClient = null; + HttpPost httpPost = null; + + try { + httpClient = HttpClients.createDefault(); + httpPost = new HttpPost(url); + httpPost.setHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)"); + httpHeaderHandler.setHeader(httpPost, token); + if (httpHeaderHandler.isJson()) { + jsonParams(map, httpPost); + } else { + formParams(map, httpPost, httpHeaderHandler.getChartSet()); + } + + response = httpClient.execute(httpPost); + if (response.getStatusLine().getStatusCode() == 200) { + result = EntityUtils.toString(response.getEntity(), httpHeaderHandler.getChartSet()); + } + } catch (Exception var22) { + Exception e = var22; + System.out.println("发送GET请求出现异常!" + e); + e.printStackTrace(); + } finally { + IOException e; + try { + if (response != null) { + response.close(); + } + + httpPost.releaseConnection(); + httpClient.close(); + } catch (IOException var21) { + e = var21; + e.printStackTrace(); + } + + if (httpClient != null) { + try { + httpClient.close(); + } catch (IOException var20) { + e = var20; + e.printStackTrace(); + } + } + + } + + return result; + } + public static String sendGetData(String url, String encoding, String token, DefaultHttpHeaderHandler httpHeaderHandler) { + String result = ""; + CloseableHttpResponse response = null; + if (httpHeaderHandler == null) { + httpHeaderHandler = new DefaultHttpHeaderHandler(); + } + + CloseableHttpClient httpClient = null; + + try { + httpClient = HttpClients.createDefault(); + HttpGet httpGet = new HttpGet(url); + httpHeaderHandler.setHeader(httpGet, token); + response = httpClient.execute(httpGet); + if (response.getStatusLine().getStatusCode() == 200) { + result = EntityUtils.toString(response.getEntity(), encoding); + } + } catch (Exception var20) { + Exception e = var20; + e.printStackTrace(); + System.out.println("发送GET请求出现异常!" + e); + } finally { + IOException e; + if (response != null) { + try { + response.close(); + } catch (IOException var19) { + e = var19; + e.printStackTrace(); + } + } + + if (httpClient != null) { + try { + httpClient.close(); + } catch (IOException var18) { + e = var18; + e.printStackTrace(); + } + } + + } + + return result; + } + public static String sendGetEntityData(String url, String encoding, Map param, String token, DefaultHttpHeaderHandler httpHeaderHandler) { + String result = ""; + CloseableHttpResponse response = null; + if (httpHeaderHandler == null) { + httpHeaderHandler = new DefaultHttpHeaderHandler(); + } + CloseableHttpClient httpClient =null; + try { + httpClient = HttpClients.createDefault(); + HttpGetWithEntity httpGet = new HttpGetWithEntity(url); + httpHeaderHandler.setHeader(httpGet, token); + if (httpHeaderHandler.isJson()) { + jsonParams(param, httpGet); + } else { + formParams(param, httpGet, httpHeaderHandler.getChartSet()); + } + response = httpClient.execute(httpGet); + if (response.getStatusLine().getStatusCode() == 200) { + result = EntityUtils.toString(response.getEntity(), encoding); + } + } catch (Exception var16) { + Exception e = var16; + e.printStackTrace(); + System.out.println("发送GET请求出现异常!" + e); + } finally { + if (response != null) { + try { + response.close(); + } catch (IOException var15) { + IOException e = var15; + e.printStackTrace(); + } + } + if (httpClient != null) { + try { + httpClient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + } + + return result; + } + + public static String sendDelete(String url, Map param, String token, DefaultHttpHeaderHandler handler) { + try { + StringBuffer query = new StringBuffer(); + Iterator var5 = param.entrySet().iterator(); + + while (var5.hasNext()) { + Map.Entry kv = (Map.Entry) var5.next(); + query.append(URLEncoder.encode((String) kv.getKey(), handler.getChartSet()) + "="); + query.append(URLEncoder.encode((String) kv.getValue(), handler.getChartSet()) + "&"); + } + + if (query.lastIndexOf("&") > 0) { + query.deleteCharAt(query.length() - 1); + } + String urlNameString = url + "?" + query.toString(); + String var14 = sendDeleteData(urlNameString, handler.getChartSet(), token, handler); + return var14; + } catch (Exception var10) { + Exception e = var10; + e.printStackTrace(); + System.out.println("发送GET请求出现异常!" + e); + return ""; + } finally { + ; + } + } + private static final Logger logger = LoggerFactory.getLogger(AvUtil.class); + /** + * http 请求 + * + * @param url + * @param encoding + * @param token + * @param httpHeaderHandler + * @return + */ + public static String sendDeleteData(String url, String encoding, String token, DefaultHttpHeaderHandler httpHeaderHandler) { + String result = ""; + CloseableHttpResponse response = null; + if (httpHeaderHandler == null) { + httpHeaderHandler = new DefaultHttpHeaderHandler(); + } + CloseableHttpClient httpClient = null; + try { + httpClient = HttpClients.createDefault(); + HttpDelete httpGet = new HttpDelete(url); + httpHeaderHandler.setHeader(httpGet, token); + response = httpClient.execute(httpGet); + if (response.getStatusLine().getStatusCode() == 200) { + logger.info("----------------------------------:"+EntityUtils.toString(response.getEntity(), encoding)); + result = EntityUtils.toString(response.getEntity(), encoding); + } + } catch (Exception var16) { + Exception e = var16; + e.printStackTrace(); + } finally { + if (response != null) { + try { + response.close(); + } catch (IOException var15) { + IOException e = var15; + e.printStackTrace(); + } + } + if (httpClient != null) { + try { + httpClient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return result; + } + public static void jsonParams(Map map, HttpPost post) { + String paramJson = JSONObject.toJSONString(map); + StringEntity stringEntity = new StringEntity(paramJson, ContentType.create("application/json", "UTF-8")); + post.setEntity(stringEntity); + } + + public static void formParams(Map map, HttpPost post, String chartSet) throws UnsupportedEncodingException { + List nameValuePairs = new ArrayList(); + if (map != null) { + Iterator var4 = map.entrySet().iterator(); + + while(var4.hasNext()) { + Map.Entry entry = (Map.Entry)var4.next(); + nameValuePairs.add(new BasicNameValuePair((String)entry.getKey(), (String)entry.getValue())); + } + } + + post.setEntity(new UrlEncodedFormEntity(nameValuePairs, chartSet)); + } + public static void jsonParams(Map map, HttpGetWithEntity post) { + String paramJson = JSONObject.toJSONString(map); + StringEntity stringEntity = new StringEntity(paramJson, ContentType.create("application/json", "UTF-8")); + + post.setEntity(stringEntity); + } + + public static void formParams(Map map, HttpGetWithEntity post, String chartSet) throws UnsupportedEncodingException { + List nameValuePairs = new ArrayList(); + if (map != null) { + Iterator var4 = map.entrySet().iterator(); + + while (var4.hasNext()) { + Map.Entry entry = (Map.Entry) var4.next(); + nameValuePairs.add(new BasicNameValuePair((String) entry.getKey(), (String) entry.getValue())); + } + } + + post.setEntity(new UrlEncodedFormEntity(nameValuePairs, chartSet)); + } +} \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/util/AvUtil.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/util/AvUtil.java new file mode 100644 index 0000000..9575627 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/device/util/AvUtil.java @@ -0,0 +1,171 @@ +package com.casic.missiles.modular.device.util; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.TypeReference; +import com.casic.missiles.modular.device.dto.AvDeviceDTO; +import com.casic.missiles.modular.device.dto.AvPageResponse; +import com.casic.missiles.modular.device.dto.DeviceRelationshipDTO; +import com.casic.missiles.modular.device.dto.page.AvPageRequest; +import com.casic.missiles.modular.device.dto.stream.StreamRequestDTO; +import com.casic.missiles.modular.device.enums.AvUrlEnums; +import com.casic.missiles.modular.device.http.AvDefaultHttpHeaderHandler; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 艾薇对接工具类 + */ +public class AvUtil { + private static final Logger logger = LoggerFactory.getLogger(AvUtil.class); + + /** + * 设备列表读取 + * + * @param baseUrl av流媒体地址 + * @param token 认证令牌 + * @param pageRequest 请求体 + * @return + */ + public static List selectDevices(String baseUrl, String token, AvPageRequest pageRequest) { + AvDefaultHttpHeaderHandler dcDefaultHttpHeaderHandler = new AvDefaultHttpHeaderHandler(); + dcDefaultHttpHeaderHandler.setJson(true); + Map param = new HashMap<>(); + param.put("page", pageRequest.getPage() + ""); + param.put("paging", pageRequest.getPaging() + ""); + param.put("limit", "100000"); + param.put("token", token); + String res = AvHttpUtils.sendGet(baseUrl + AvUrlEnums.DEVICE.getUrl(), param, token, dcDefaultHttpHeaderHandler); + logger.info("selectDevices:{}", res); + if (StrUtil.isEmpty(res)) { + logger.error("av device sync error!"); + } + AvPageResponse deviceDTOS = JSON.parseObject(res, new TypeReference() { + }); + return deviceDTOS.getItems(); + } + + /** + * 创建流 + * + * @param baseUrl av流媒体地址 + * @param token 认证令牌 + * @param streamRequestDTO 请求体 + * @return + */ + public static Object selectStreams(String baseUrl, String token, StreamRequestDTO streamRequestDTO) { + + Map param = new HashMap<>(); + param.put("device_id", streamRequestDTO.getDevice_id() + ""); + param.put("stream_type", streamRequestDTO.getStream_type() + ""); + param.put("quality", streamRequestDTO.getQuality() + ""); + param.put("token", token); + param.put("from", streamRequestDTO.getFrom() + ""); + param.put("to", streamRequestDTO.getTo() + ""); + logger.info("url:{}", baseUrl + AvUrlEnums.STREAM.getUrl()); + AvDefaultHttpHeaderHandler dcDefaultHttpHeaderHandler = new AvDefaultHttpHeaderHandler(); + dcDefaultHttpHeaderHandler.setJson(true); + String res = AvHttpUtils.sendPost(baseUrl + AvUrlEnums.STREAM.getUrl(), param, token, dcDefaultHttpHeaderHandler); + + if (StrUtil.isEmpty(res)) { + logger.error("av stream error:{}", streamRequestDTO.getDevice_id()); + return null; + } + return JSON.parseObject(res); + } + + /** + * 发送心跳 + * + * @param avUrl + * @param avToken + * @return + */ + public static Object dict(String avUrl, String avToken) { + AvDefaultHttpHeaderHandler dcDefaultHttpHeaderHandler = new AvDefaultHttpHeaderHandler(); + dcDefaultHttpHeaderHandler.setJson(true); + Map param = new HashMap<>(); + String res = AvHttpUtils.sendGet(avUrl + AvUrlEnums.DICT.getUrl(), param, avToken, dcDefaultHttpHeaderHandler); + logger.info("av dict:{}", res); + return null; + } + + /** + * 发送心跳 + * + * @param avUrl + * @param avToken + * @param id + * @return + */ + public static Object heart(String avUrl, String avToken, String id) { + AvDefaultHttpHeaderHandler dcDefaultHttpHeaderHandler = new AvDefaultHttpHeaderHandler(); + dcDefaultHttpHeaderHandler.setJson(true); + Map param = new HashMap<>(); +// param.put("id", id); +// param.put("token", avToken); + String res = AvHttpUtils.sendGet(avUrl + String.format(AvUrlEnums.HEART.getUrl(), id), param, avToken, dcDefaultHttpHeaderHandler); + if (StrUtil.isEmpty(res)) { + logger.error("av heart error:{}", id); + return null; + } + return JSON.parseObject(res); + } + + /** + * 停止流 + * + * @param avUrl 艾薇流媒体地址 + * @param avToken 认证令牌 + * @param id 国标ID + * @return + */ + public static Object stopStreams(String avUrl, String avToken, String id) { + AvDefaultHttpHeaderHandler dcDefaultHttpHeaderHandler = new AvDefaultHttpHeaderHandler(); + dcDefaultHttpHeaderHandler.setJson(true); + Map param = new HashMap<>(); + //param.put("id", id); + String res = AvHttpUtils.sendDelete(avUrl + String.format(AvUrlEnums.STREAM_STOP.getUrl(), id), param, avToken, dcDefaultHttpHeaderHandler); + + if (StrUtil.isEmpty(res)) { + logger.error("av stopStreams error:{}", id); + return null; + } + return JSON.parseObject(res); + } + + /** + * 用户设备关系 + * + * @param avUrl 艾薇流媒体地址 + * @param avToken 认证令牌 + * @return + */ + public static List userDeviceRelationships(String avUrl, String avToken) { + + AvDefaultHttpHeaderHandler avDefaultHttpHeaderHandler = new AvDefaultHttpHeaderHandler(); + avDefaultHttpHeaderHandler.setJson(true); + Map param = new HashMap<>(); + String res = AvHttpUtils.sendGetJson(avUrl + AvUrlEnums.USER_DEVICE_RELATION.getUrl(), param, avToken, avDefaultHttpHeaderHandler); + if (StrUtil.isEmpty(res)) { + logger.error("av userDeviceRelationships error"); + return null; + } + + List deviceDTOS = JSON.parseObject(res, new TypeReference>() { + }); + if (CollectionUtil.isNotEmpty(deviceDTOS)) { + for (DeviceRelationshipDTO deviceDTO : deviceDTOS) { + if (StrUtil.isNotEmpty(deviceDTO.getDevice_list())) { + deviceDTO.setDeviceList(StrUtil.split(deviceDTO.getDevice_list(), ",")); + } + } + } + return deviceDTOS; + } +} \ No newline at end of file diff --git a/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/task/AvTask.java b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/task/AvTask.java new file mode 100644 index 0000000..46ccc41 --- /dev/null +++ b/casic-device-sync/casic-device-aview/src/main/java/com/casic/missiles/modular/task/AvTask.java @@ -0,0 +1,46 @@ +package com.casic.missiles.modular.task; + +import com.casic.missiles.modular.device.service.IAvSyncService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +@Slf4j +@Component +public class AvTask { + + @Resource + private IAvSyncService deviceStatusService; + @Value("${casic.video.av.open:-1}") + private Boolean open; + @Value("${casic.video.av.token:-1}") + private String token; + + /** + * 设备信息同步0 + * 每30分钟采集一次 + */ + @Scheduled(cron = "${casic.video.av.deviceCorn}") + public void device() { + //更新组织机构信息 + log.info("av sdk 设备信息同步"); + if (open) { + deviceStatusService.syncDcDevices(token); + } + log.info("av sdk 设备同步结束"); + } + + @Scheduled(cron = "${casic.video.av.deviceStatusCorn}") + public void deviceRefreshToken() { + //更新组织机构信息 + log.info("av 设备状态刷新"); + if (open) { + deviceStatusService.loadUserDeviceRelationships(); + } + + log.info("av 设备状态刷新"); + } +} \ No newline at end of file diff --git a/casic-device-sync/casic-device-dc/src/main/java/com/casic/missiles/modular/http/DcDefaultHttpHeaderHandler.java b/casic-device-sync/casic-device-dc/src/main/java/com/casic/missiles/modular/http/DcDefaultHttpHeaderHandler.java index 550b9d4..e3ee94f 100644 --- a/casic-device-sync/casic-device-dc/src/main/java/com/casic/missiles/modular/http/DcDefaultHttpHeaderHandler.java +++ b/casic-device-sync/casic-device-dc/src/main/java/com/casic/missiles/modular/http/DcDefaultHttpHeaderHandler.java @@ -12,4 +12,6 @@ } } + + } diff --git a/casic-server-sync/src/main/java/com/casic/missiles/modular/device/controller/GateController.java b/casic-server-sync/src/main/java/com/casic/missiles/modular/device/controller/GateController.java index 1108110..efd28e1 100644 --- a/casic-server-sync/src/main/java/com/casic/missiles/modular/device/controller/GateController.java +++ b/casic-server-sync/src/main/java/com/casic/missiles/modular/device/controller/GateController.java @@ -58,9 +58,9 @@ return; } -// String dn = new String(request.getHeader("dnname").getBytes("ISO8859-1"), "UTF-8"); -// String account = getValueByDn(dn, key1); - String account = x; + String dn = new String(request.getHeader("dnname").getBytes("ISO8859-1"), "UTF-8"); + String account = getValueByDn(dn, key1); +// String account = x; //token自定义 CasicCustomToken token = new CasicCustomToken(account, "password"); token.setType(LoginType.NO_PASSWD); diff --git a/casic-server/src/main/java/com/casic/missiles/modular/device/service/ISysGroupDeviceService.java b/casic-server/src/main/java/com/casic/missiles/modular/device/service/ISysGroupDeviceService.java index 2bf6155..724ce26 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/device/service/ISysGroupDeviceService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/device/service/ISysGroupDeviceService.java @@ -29,4 +29,12 @@ * @param relDTO */ void batchAdd(GroupRelDTO relDTO); + + + /** + * 增量更新 + * @param groupId + * @param deviceIds + */ + void batchIncremental(Long groupId, List deviceIds); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java index 0216c1e..1c58177 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/device/service/impl/BusDeviceInfoServiceImpl.java @@ -86,7 +86,10 @@ AuthUser user = abstractPermissionContext.getAuthService().getLoginUser(); QueryWrapper pageQuery = query((QueryWrapper) query, "id", user.getId(), user.getRoleTips()); - pageQuery.le("secret_level", user.getSecretLevel()); + if (!user.getRoleTips().contains(adminRole)) { + pageQuery.le("secret_level", user.getSecretLevel()); + } + DataScope dataScope = abstractPermissionContext.getAuthService().getLoginUserDataScope(); if (!ScopeEnums.ALL_TYPE.getCode().equals(dataScope.getScopeEnums().getCode())) { pageQuery.in("dept_id", dataScope.getDeptIds()); @@ -217,7 +220,7 @@ if (!ScopeEnums.ALL_TYPE.getCode().equals(scope.getScopeEnums())) { deptQuery.in(Dept::getId, scope.getDeptIds()); } - + deptQuery.orderByAsc(Dept::getNum); List deptList = abstractPermissionContext.getDeptService().list(deptQuery); List deptDTOS = new ArrayList<>(); List rootIds = new ArrayList<>(); @@ -235,8 +238,12 @@ //挂载设备信息 QueryWrapper deviceQuery = new QueryWrapper<>(); deviceQuery.eq("dept_id", deptDTO.getId()); - //判定只可查看以下密级 - deviceQuery.le("secret_level", user.getSecretLevel()); + + //判定只可查看以下密级 安全管理员除外 + if (!user.getRoleTips().contains(adminRole)) { + deviceQuery.le("secret_level", user.getSecretLevel()); + } + deviceQuery.orderByAsc("create_time"); List deviceInfos = this.list(deviceQuery); deptDTO.setChildrenNodes(deviceInfos.stream().map(this::createDeptDTO).collect(Collectors.toList())); @@ -293,7 +300,9 @@ if (StrUtil.isEmpty(result.getArea()) || !areaMap.containsKey(Convert.toLong(result.getArea()))) { errors.add("第" + index + "行所属区域编码不存在!"); } - + if(StrUtil.isNotEmpty(result.getLocation())&&result.getLocation().length()>120){ + errors.add("第" + index + "行详细位置过长!"); + } //商米校验 if(SysEnum.sm.getCode().equals(sysType)){ if(StrUtil.isEmpty(result.getNvrManufactureType())){ diff --git a/casic-server/src/main/java/com/casic/missiles/modular/device/service/impl/DeviceGroupInfoServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/device/service/impl/DeviceGroupInfoServiceImpl.java index 81eaf4a..cfac743 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/device/service/impl/DeviceGroupInfoServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/device/service/impl/DeviceGroupInfoServiceImpl.java @@ -116,8 +116,21 @@ return true; } + @Transactional + @Override + public boolean removeById(Serializable id) { + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.in(SysGroupDevice::getGroupId, id); + sysGroupDeviceService.remove(query); + return super.removeById(id); + } + + @Transactional @Override public boolean removeByIds(Collection idList) { + LambdaQueryWrapper query = new LambdaQueryWrapper<>(); + query.in(SysGroupDevice::getGroupId, idList); + sysGroupDeviceService.remove(query); return groupService.removeByIds(idList); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/device/service/impl/SysGroupDeviceServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/device/service/impl/SysGroupDeviceServiceImpl.java index 71f595d..b900519 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/device/service/impl/SysGroupDeviceServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/device/service/impl/SysGroupDeviceServiceImpl.java @@ -11,7 +11,6 @@ import com.casic.missiles.modular.device.model.SysGroupDevice; import com.casic.missiles.modular.device.service.ISysGroupDeviceService; import com.casic.missiles.modular.system.dto.GroupUserRelDTO; -import com.casic.missiles.modular.system.model.SysGroupRelUser; import com.casic.missiles.modular.system.service.ISysGroupRelUserService; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -19,6 +18,7 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; +import java.util.stream.Collectors; /** @@ -51,7 +51,7 @@ } //删除 QueryWrapper query = new QueryWrapper<>(); - query.eq("group_id",relDTO.getGroupId()); + query.eq("group_id", relDTO.getGroupId()); this.remove(query); //添加设备信息 List groupDevices = new ArrayList<>(); @@ -71,6 +71,38 @@ } + @Override + public void batchIncremental(Long groupId, List deviceIds) { + List groupDevices = this.list(new LambdaQueryWrapper().eq(SysGroupDevice::getGroupId, groupId)); + if (CollectionUtil.isEmpty(groupDevices)) { + saveDevices(groupId, deviceIds); + } else { + List oldDevices = groupDevices.stream().map(SysGroupDevice::getDeviceId).collect(Collectors.toList()); + List delIds = CollectionUtil.subtractToList(oldDevices, deviceIds); + List saveDevices = CollectionUtil.subtractToList(deviceIds, oldDevices); + + LambdaQueryWrapper delQuery = new LambdaQueryWrapper<>(); + delQuery.eq(SysGroupDevice::getGroupId, groupId); + delQuery.in(SysGroupDevice::getDeviceId, delIds); + if (CollectionUtil.isNotEmpty(delIds)) { + this.remove(delQuery); + } + saveDevices(groupId, saveDevices); + } + } + + private void saveDevices(Long groupId, List saveDevices) { + List saves = new ArrayList<>(); + for (Long deviceId : saveDevices) { + SysGroupDevice sysGroupDevice = new SysGroupDevice(); + sysGroupDevice.setDeviceId(deviceId); + sysGroupDevice.setGroupId(groupId); + sysGroupDevice.setCreateTime(new Date()); + saves.add(sysGroupDevice); + } + this.saveOrUpdateBatchList(saves); + } + private void saveOrUpdateBatchList(List groupDevices) { for (SysGroupDevice groupDevice : groupDevices) { LambdaQueryWrapper query = new LambdaQueryWrapper<>(); diff --git a/casic-web/src/main/resources/config/application.yml b/casic-web/src/main/resources/config/application.yml index af87b9b..848f547 100644 --- a/casic-web/src/main/resources/config/application.yml +++ b/casic-web/src/main/resources/config/application.yml @@ -44,7 +44,7 @@ uploadPath: C:\casic\tmp\ video: admin: - role: administrator + role: administrator #安全管理员角色标识 安全管理员可看未定密数据 dc: corn: refreshToken: 0 */5 * * * * @@ -60,6 +60,12 @@ open: true areaCorn: 0 */60 * * * * deviceCorn: 0 */10 * * * * + av: + open: true + url: http://192.168.83.42:18080 + token: 234456 + deviceCorn: 0 */20 * * * * + deviceStatusCorn: 0 */5 * * * * wvp: #wvp视频平台配置信息 open: true url: http://192.168.83.42:18080