Преглед на файлове

Merge remote-tracking branch 'origin/likeadmin' into likeadmin

zhanghao преди 6 месеца
родител
ревизия
e97f899703
променени са 64 файла, в които са добавени 1282 реда и са изтрити 1296 реда
  1. 7 0
      pom.xml
  2. 2 0
      taphole-admin/src/main/java/com/sckj/admin/controller/AlbumsController.java
  3. 2 0
      taphole-admin/src/main/java/com/sckj/admin/controller/ArtCateController.java
  4. 2 0
      taphole-admin/src/main/java/com/sckj/admin/controller/ArticleController.java
  5. 1 1
      taphole-admin/src/main/java/com/sckj/admin/controller/CrontabController.java
  6. 2 0
      taphole-admin/src/main/java/com/sckj/admin/controller/channel/ChannelH5Controller.java
  7. 2 0
      taphole-admin/src/main/java/com/sckj/admin/controller/channel/ChannelMpController.java
  8. 2 0
      taphole-admin/src/main/java/com/sckj/admin/controller/channel/ChannelOaCallBackController.java
  9. 2 0
      taphole-admin/src/main/java/com/sckj/admin/controller/channel/ChannelOaController.java
  10. 2 0
      taphole-admin/src/main/java/com/sckj/admin/controller/channel/ChannelOaMenuController.java
  11. 2 0
      taphole-admin/src/main/java/com/sckj/admin/controller/channel/ChannelOaReplyDefaultController.java
  12. 2 0
      taphole-admin/src/main/java/com/sckj/admin/controller/channel/ChannelOaReplyFollowController.java
  13. 2 0
      taphole-admin/src/main/java/com/sckj/admin/controller/channel/ChannelOaReplyKeywordController.java
  14. 2 0
      taphole-admin/src/main/java/com/sckj/admin/controller/channel/ChannelOpController.java
  15. 2 0
      taphole-admin/src/main/java/com/sckj/admin/controller/decorate/DecorateDataController.java
  16. 2 0
      taphole-admin/src/main/java/com/sckj/admin/controller/decorate/DecoratePagesController.java
  17. 2 0
      taphole-admin/src/main/java/com/sckj/admin/controller/decorate/DecorateTabbarController.java
  18. 3 1
      taphole-admin/src/main/java/com/sckj/admin/controller/finance/FinanceRechargerController.java
  19. 3 1
      taphole-admin/src/main/java/com/sckj/admin/controller/finance/FinanceRefundController.java
  20. 3 1
      taphole-admin/src/main/java/com/sckj/admin/controller/finance/FinanceWalletController.java
  21. 3 1
      taphole-admin/src/main/java/com/sckj/admin/controller/marketing/MarketingRechargeController.java
  22. 2 0
      taphole-admin/src/main/java/com/sckj/admin/controller/setting/SettingNoticeController.java
  23. 2 0
      taphole-admin/src/main/java/com/sckj/admin/controller/setting/SettingPaymentController.java
  24. 2 0
      taphole-admin/src/main/java/com/sckj/admin/controller/setting/SettingSearchController.java
  25. 9 6
      taphole-admin/src/main/resources/application-dev.yml
  26. 1 1
      taphole-admin/src/main/resources/application.yml
  27. 0 0
      taphole-admin/src/main/resources/loadFFmpeg.properties
  28. 175 119
      taphole-camera/src/main/java/com.sckj.camera/aop/HikCameraAspect.java
  29. 0 105
      taphole-camera/src/main/java/com.sckj.camera/common/CommonKit.java
  30. 0 26
      taphole-camera/src/main/java/com.sckj.camera/config/CameraAsync.java
  31. 193 0
      taphole-camera/src/main/java/com.sckj.camera/controller/CameraController.java
  32. 5 7
      taphole-camera/src/main/java/com.sckj.camera/controller/CameraFileController.java
  33. 9 8
      taphole-camera/src/main/java/com.sckj.camera/controller/CameraFlowController.java
  34. 0 66
      taphole-camera/src/main/java/com.sckj.camera/controller/DeviceController.java
  35. 0 202
      taphole-camera/src/main/java/com.sckj.camera/controller/HikCameraController.java
  36. 19 4
      taphole-camera/src/main/java/com.sckj.camera/hik/HCNetSDK.java
  37. 15 5
      taphole-camera/src/main/java/com.sckj.camera/hik/HCNetTools.java
  38. 56 0
      taphole-camera/src/main/java/com.sckj.camera/manager/CameraProperties.java
  39. 19 29
      taphole-camera/src/main/java/com.sckj.camera/manager/HikCameraManager.java
  40. 6 18
      taphole-camera/src/main/java/com.sckj.camera/model/dto/CameraDTO.java
  41. 0 23
      taphole-camera/src/main/java/com.sckj.camera/model/dto/PlayControlDTO.java
  42. 10 30
      taphole-camera/src/main/java/com.sckj.camera/model/dto/ResultDTO.java
  43. 34 12
      taphole-camera/src/main/java/com.sckj.camera/model/entity/Camera.java
  44. 12 11
      taphole-camera/src/main/java/com.sckj.camera/model/entity/CameraFile.java
  45. 5 15
      taphole-camera/src/main/java/com.sckj.camera/model/entity/CameraFlow.java
  46. 0 1
      taphole-camera/src/main/java/com.sckj.camera/model/mapper/CameraFileMapper.java
  47. 1 1
      taphole-camera/src/main/java/com.sckj.camera/model/mapper/CameraFlowMapper.java
  48. 1 1
      taphole-camera/src/main/java/com.sckj.camera/model/mapper/CameraMapper.java
  49. 0 26
      taphole-camera/src/main/java/com.sckj.camera/model/view/CameraTreeVO.java
  50. 14 13
      taphole-camera/src/main/java/com.sckj.camera/service/CameraFileServiceImpl.java
  51. 15 13
      taphole-camera/src/main/java/com.sckj.camera/service/CameraFlowServiceImpl.java
  52. 390 0
      taphole-camera/src/main/java/com.sckj.camera/service/CameraServiceImpl.java
  53. 0 49
      taphole-camera/src/main/java/com.sckj.camera/service/DeviceServiceImpl.java
  54. 40 15
      taphole-camera/src/main/java/com.sckj.camera/service/FFmpegServiceImpl.java
  55. 0 434
      taphole-camera/src/main/java/com.sckj.camera/service/HikCameraServiceImpl.java
  56. 1 1
      taphole-camera/src/main/java/com.sckj.camera/util/FlowUtils.java
  57. 7 1
      taphole-camera/src/main/java/com.sckj.camera/util/HikCameraUtils.java
  58. 1 11
      taphole-camera/src/main/resources/mapper/CameraFileMapper.xml
  59. 1 20
      taphole-camera/src/main/resources/mapper/CameraFlowMapper.xml
  60. 1 18
      taphole-camera/src/main/resources/mapper/CameraMapper.xml
  61. 25 0
      taphole-common/pom.xml
  62. 36 0
      taphole-common/src/main/java/com/sckj/common/aop/CameraLogin.java
  63. 123 0
      taphole-common/src/main/java/com/sckj/common/entity/BaseEntity.java
  64. 2 0
      taphole-generator/src/main/java/com/sckj/generator/controller/GenController.java

+ 7 - 0
pom.xml

@@ -59,6 +59,7 @@
         <weixin.version>4.4.0</weixin.version>
         <knife4j>3.0.3</knife4j>
         <socketio>2.0.3</socketio>
+        <druid.version>1.2.23</druid.version>
     </properties>
 
     <!-- 依赖声明 -->
@@ -268,6 +269,12 @@
                 <version>${socketio}</version>
             </dependency>
 
+            <!-- 阿里数据库连接池 -->
+            <dependency>
+                <groupId>com.alibaba</groupId>
+                <artifactId>druid-spring-boot-starter</artifactId>
+                <version>${druid.version}</version>
+            </dependency>
 
 
             <!-- 全局工具 -->

+ 2 - 0
taphole-admin/src/main/java/com/sckj/admin/controller/AlbumsController.java

@@ -17,12 +17,14 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
+import springfox.documentation.annotations.ApiIgnore;
 
 import javax.annotation.Resource;
 
 @RestController
 @RequestMapping("api/albums")
 @Api(tags = "相册数据管理")
+@ApiIgnore
 public class AlbumsController {
 
     @Resource

+ 2 - 0
taphole-admin/src/main/java/com/sckj/admin/controller/ArtCateController.java

@@ -16,6 +16,7 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
+import springfox.documentation.annotations.ApiIgnore;
 
 import javax.annotation.Resource;
 import java.util.List;
@@ -23,6 +24,7 @@ import java.util.List;
 @RestController
 @RequestMapping("api/article/cate")
 @Api(tags = "文章分类管理")
+@ApiIgnore
 public class ArtCateController {
 
     @Resource

+ 2 - 0
taphole-admin/src/main/java/com/sckj/admin/controller/ArticleController.java

@@ -16,12 +16,14 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
+import springfox.documentation.annotations.ApiIgnore;
 
 import javax.annotation.Resource;
 
 @RestController
 @RequestMapping("api/article")
 @Api(tags = "文章数据管理")
+@ApiIgnore
 public class ArticleController {
 
     @Resource

+ 1 - 1
taphole-admin/src/main/java/com/sckj/admin/controller/CrontabController.java

@@ -21,7 +21,7 @@ import javax.annotation.Resource;
 
 @RestController
 @RequestMapping("api/crontab")
-@Api(tags = "计划任务管理")
+@Api(tags = "计划任务管理",hidden = true)
 public class CrontabController {
 
     @Resource

+ 2 - 0
taphole-admin/src/main/java/com/sckj/admin/controller/channel/ChannelH5Controller.java

@@ -9,12 +9,14 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
+import springfox.documentation.annotations.ApiIgnore;
 
 import javax.annotation.Resource;
 
 @RestController
 @RequestMapping("api/channel/h5")
 @Api(tags = "移动渠道设置")
+@ApiIgnore
 public class ChannelH5Controller {
 
     @Resource

+ 2 - 0
taphole-admin/src/main/java/com/sckj/admin/controller/channel/ChannelMpController.java

@@ -9,12 +9,14 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
+import springfox.documentation.annotations.ApiIgnore;
 
 import javax.annotation.Resource;
 
 @RestController
 @RequestMapping("api/channel/mp")
 @Api(tags = "微信程序渠道")
+@ApiIgnore
 public class ChannelMpController {
 
     @Resource

+ 2 - 0
taphole-admin/src/main/java/com/sckj/admin/controller/channel/ChannelOaCallBackController.java

@@ -5,6 +5,7 @@ import com.sckj.common.aop.NotLogin;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.web.bind.annotation.*;
+import springfox.documentation.annotations.ApiIgnore;
 
 import javax.annotation.Resource;
 
@@ -12,6 +13,7 @@ import javax.annotation.Resource;
 @RestController
 @RequestMapping("api/channel/oa/callback")
 @Api(tags = "公众号服务器验证及消息回复")
+@ApiIgnore
 public class ChannelOaCallBackController {
 
     @Resource

+ 2 - 0
taphole-admin/src/main/java/com/sckj/admin/controller/channel/ChannelOaController.java

@@ -9,12 +9,14 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
+import springfox.documentation.annotations.ApiIgnore;
 
 import javax.annotation.Resource;
 
 @RestController
 @RequestMapping("api/channel/oa")
 @Api(tags = "公众号渠道设置")
+@ApiIgnore
 public class ChannelOaController {
 
     @Resource

+ 2 - 0
taphole-admin/src/main/java/com/sckj/admin/controller/channel/ChannelOaMenuController.java

@@ -6,6 +6,7 @@ import com.sckj.common.core.AjaxResult;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.web.bind.annotation.*;
+import springfox.documentation.annotations.ApiIgnore;
 
 import javax.annotation.Resource;
 import java.util.List;
@@ -13,6 +14,7 @@ import java.util.List;
 @RestController
 @RequestMapping("api/channel/oaMenu")
 @Api(tags = "公众号菜单管理")
+@ApiIgnore
 public class ChannelOaMenuController {
 
     @Resource

+ 2 - 0
taphole-admin/src/main/java/com/sckj/admin/controller/channel/ChannelOaReplyDefaultController.java

@@ -12,12 +12,14 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
+import springfox.documentation.annotations.ApiIgnore;
 
 import javax.annotation.Resource;
 
 @RestController
 @RequestMapping("api/channel/oaReplyDefault")
 @Api(tags = "公众号默认回复")
+@ApiIgnore
 public class ChannelOaReplyDefaultController {
 
     @Resource

+ 2 - 0
taphole-admin/src/main/java/com/sckj/admin/controller/channel/ChannelOaReplyFollowController.java

@@ -12,12 +12,14 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
+import springfox.documentation.annotations.ApiIgnore;
 
 import javax.annotation.Resource;
 
 @RestController
 @RequestMapping("api/channel/oaReplyFollow")
 @Api(tags = "公众号关注回复")
+@ApiIgnore
 public class ChannelOaReplyFollowController {
 
     @Resource

+ 2 - 0
taphole-admin/src/main/java/com/sckj/admin/controller/channel/ChannelOaReplyKeywordController.java

@@ -12,12 +12,14 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
+import springfox.documentation.annotations.ApiIgnore;
 
 import javax.annotation.Resource;
 
 @RestController
 @RequestMapping("api/channel/oaReplyKeyword")
 @Api(tags = "公众号关键回复")
+@ApiIgnore
 public class ChannelOaReplyKeywordController {
 
     @Resource

+ 2 - 0
taphole-admin/src/main/java/com/sckj/admin/controller/channel/ChannelOpController.java

@@ -8,12 +8,14 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
+import springfox.documentation.annotations.ApiIgnore;
 
 import javax.annotation.Resource;
 
 @RestController
 @RequestMapping("api/channel/op")
 @Api(tags = "微信开放渠道")
+@ApiIgnore
 public class ChannelOpController {
 
     @Resource

+ 2 - 0
taphole-admin/src/main/java/com/sckj/admin/controller/decorate/DecorateDataController.java

@@ -10,6 +10,7 @@ import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
+import springfox.documentation.annotations.ApiIgnore;
 
 import javax.annotation.Resource;
 import java.util.List;
@@ -17,6 +18,7 @@ import java.util.List;
 @RestController
 @RequestMapping("api/decorate/data")
 @Api(tags = "装修数据管理")
+@ApiIgnore
 public class DecorateDataController {
 
     @Resource

+ 2 - 0
taphole-admin/src/main/java/com/sckj/admin/controller/decorate/DecoratePagesController.java

@@ -10,12 +10,14 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
+import springfox.documentation.annotations.ApiIgnore;
 
 import javax.annotation.Resource;
 
 @RestController
 @RequestMapping("api/decorate/pages")
 @Api(tags = "装修页面管理")
+@ApiIgnore
 public class DecoratePagesController {
 
     @Resource

+ 2 - 0
taphole-admin/src/main/java/com/sckj/admin/controller/decorate/DecorateTabbarController.java

@@ -9,12 +9,14 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
+import springfox.documentation.annotations.ApiIgnore;
 
 import javax.annotation.Resource;
 
 @RestController
 @RequestMapping("api/decorate/tabbar")
 @Api(tags = "装修导航管理")
+@ApiIgnore
 public class DecorateTabbarController {
 
     @Resource

+ 3 - 1
taphole-admin/src/main/java/com/sckj/admin/controller/finance/FinanceRechargerController.java

@@ -13,12 +13,14 @@ import io.swagger.annotations.ApiModelProperty;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
+import springfox.documentation.annotations.ApiIgnore;
 
 import javax.annotation.Resource;
 
 @RestController
 @RequestMapping("api/finance/recharger")
-@Api("充值记录管理")
+@Api(tags = "充值记录管理")
+@ApiIgnore
 public class FinanceRechargerController {
 
     @Resource

+ 3 - 1
taphole-admin/src/main/java/com/sckj/admin/controller/finance/FinanceRefundController.java

@@ -15,13 +15,15 @@ import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
+import springfox.documentation.annotations.ApiIgnore;
 
 import javax.annotation.Resource;
 import java.util.List;
 
 @RestController
 @RequestMapping("api/finance/refund")
-@Api("退款记录管理")
+@Api(tags = "退款记录管理")
+@ApiIgnore
 public class FinanceRefundController {
 
     @Resource

+ 3 - 1
taphole-admin/src/main/java/com/sckj/admin/controller/finance/FinanceWalletController.java

@@ -12,12 +12,14 @@ import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
+import springfox.documentation.annotations.ApiIgnore;
 
 import javax.annotation.Resource;
 
 @RestController
 @RequestMapping("api/finance/wallet")
-@Api("余额明细管理")
+@Api(tags = "余额明细管理")
+@ApiIgnore
 public class FinanceWalletController {
 
     @Resource

+ 3 - 1
taphole-admin/src/main/java/com/sckj/admin/controller/marketing/MarketingRechargeController.java

@@ -8,12 +8,14 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiModelProperty;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
+import springfox.documentation.annotations.ApiIgnore;
 
 import javax.annotation.Resource;
 
 @RestController
 @RequestMapping("api/marketing/recharge")
-@Api("营销充值管理")
+@Api(tags = "营销充值管理")
+@ApiIgnore
 public class MarketingRechargeController {
 
     @Resource

+ 2 - 0
taphole-admin/src/main/java/com/sckj/admin/controller/setting/SettingNoticeController.java

@@ -10,6 +10,7 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
+import springfox.documentation.annotations.ApiIgnore;
 
 import javax.annotation.Resource;
 import java.util.List;
@@ -18,6 +19,7 @@ import java.util.Map;
 @RestController
 @RequestMapping("api/setting/notice")
 @Api(tags = "配置消息通知")
+@ApiIgnore
 public class SettingNoticeController {
 
     @Resource

+ 2 - 0
taphole-admin/src/main/java/com/sckj/admin/controller/setting/SettingPaymentController.java

@@ -12,6 +12,7 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
+import springfox.documentation.annotations.ApiIgnore;
 
 import javax.annotation.Resource;
 import java.util.List;
@@ -19,6 +20,7 @@ import java.util.List;
 @RestController
 @RequestMapping("api/setting/payment")
 @Api(tags = "配置支付参数")
+@ApiIgnore
 public class SettingPaymentController {
 
     @Resource

+ 2 - 0
taphole-admin/src/main/java/com/sckj/admin/controller/setting/SettingSearchController.java

@@ -9,12 +9,14 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
+import springfox.documentation.annotations.ApiIgnore;
 
 import javax.annotation.Resource;
 
 @RestController
 @RequestMapping("api/setting/search")
 @Api(tags = "配置热门搜索")
+@ApiIgnore
 public class SettingSearchController {
 
     @Resource

+ 9 - 6
taphole-admin/src/main/resources/application-dev.yml

@@ -1,6 +1,6 @@
 # 项目配置
 like:
-  upload-directory: /www/uploads/likeadmin-java/ # 上传目录
+  upload-directory: D:/opt/camera
 
 # 服务配置
 server:
@@ -13,7 +13,7 @@ spring:
   # 数据源配置
   datasource:
     url: jdbc:mysql://112.124.32.131:3306/taphole?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false
-    type: com.zaxxer.hikari.HikariDataSource # 数据源类型
+    type: com.alibaba.druid.pool.DruidDataSource # 数据源类型
     driver-class-name: com.mysql.jdbc.Driver # MySql的驱动
     username: root # 数据库账号
     password: lghr4ELx6GuN2Xp9 # 数据库密码
@@ -34,12 +34,15 @@ spring:
 #mybatis-plus:
 #    configuration:
 #      log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
-app:
+camera:
   filepath: D:/opt/camera
+  rtmp:
+    rtmphost: 127.0.0.1:1935
+    httphost: 127.0.0.1:80
 
-rtmp:
-  rtmphost: 127.0.0.1:1935
-  httphost: 127.0.0.1:7080
+#rtmp:
+#    rtmphost: 127.0.0.1:1935
+#    httphost: 127.0.0.1:80
 
 socketio:
   host: 127.0.0.1		#主机名,默认是 0.0.0.0 (这个设不设置无所谓,因为后面的 SocketConfig 类一般不用设置这个)

+ 1 - 1
taphole-admin/src/main/resources/application.yml

@@ -1,6 +1,6 @@
 # 项目配置
 like:
-  upload-directory: /www/uploads/likeadmin-java/ # 上传目录
+  #upload-directory: /www/uploads/likeadmin-java/ # 上传目录
   # 验证码配置
   captcha:
     # 是否开启验证码

+ 0 - 0
taphole-camera/src/main/resources/loadFFmpeg.properties → taphole-admin/src/main/resources/loadFFmpeg.properties


+ 175 - 119
taphole-camera/src/main/java/com.sckj.camera/aop/HikCameraAspect.java

@@ -1,119 +1,175 @@
-package com.sckj.camera.aop;//package com.sckj.camera.aop;
-//
-//
-//import com.sckj.camera.common.HikCameraUtils;
-//import com.sckj.camera.model.dto.CameraDTO;
-//import com.sckj.camera.model.dto.ResultDTO;
-//import com.sckj.camera.model.entity.Camera;
-//import com.sckj.camera.service.DeviceServiceImpl;
-//import com.sckj.camera.hik.HCNetTools;
-//import org.aspectj.lang.ProceedingJoinPoint;
-//import org.aspectj.lang.annotation.Around;
-//import org.aspectj.lang.annotation.Aspect;
-//import org.slf4j.Logger;
-//import org.slf4j.LoggerFactory;
-//import org.springframework.beans.factory.annotation.Autowired;
-//import org.springframework.stereotype.Component;
-//
-//import java.util.List;
-//
-///**
-// * 海康设备登陆AOP切面
-// */
-//@Aspect
-//@Component
-//public class HikCameraAspect {
-//
-//    @Autowired
-//    private DeviceServiceImpl deviceService;
-//
-//    private final Logger logger = LoggerFactory.getLogger(HikCameraAspect.class);
-//
-//    @Around(value = "execution(* com.sckj.camera.service.HikCameraServiceImpl.*(..))")
-//    public Object aroundCamera(ProceedingJoinPoint joinPoint) throws RuntimeException {
-//
-//        Object result = null;
-//
-//        try {
-//            Object[] args = joinPoint.getArgs();
-//            if (args.length < 1) {
-//                throw new Throwable("无传入参数");
-//            }
-//
-//            if (args[0] != null & args[0] instanceof CameraDTO) {
-//                CameraDTO cameraDTO = (CameraDTO) args[0];
-//                Camera camera = deviceService.findOne(cameraDTO.getId());
-//
-//                if (camera == null) { throw new Throwable("未查询到指定设备"); }
-//
-//                cameraDTO.setAccount(camera.getAccount());
-//                cameraDTO.setPassword(camera.getPassword());
-//                cameraDTO.setIp(camera.getIp());
-//                cameraDTO.setPort(camera.getPort());
-//                cameraDTO.setType(camera.getType());
-//
-//                //设备登录
-//                int code = login(cameraDTO);
-//                args[0] = cameraDTO;
-//
-//                switch (code) {
-//                    case 0:
-//                        //成功登录
-//                        result = joinPoint.proceed(args);
-//                        ResultDTO resultDTO = (ResultDTO)result;
-//                        //针对异步方法,交给异步方法去注销
-//                        if (!resultDTO.getMsg().equals("Async")) {
-//                            logout(cameraDTO);
-//                        }
-//                        break;
-//                    case 4:
-//                        //获取通道失败
-//                        logout(cameraDTO);
-//                        result = new ResultDTO("", HikCameraUtils.resultNames[code],"");
-//                        break;
-//                    default:
-//                        //注册失败
-//                        result = new ResultDTO("",HikCameraUtils.resultNames[code],"");
-//                }
-//                return result;
-//            } else {
-//                throw new Throwable("传入参数异常");
-//            }
-//
-//        } catch (Throwable e) {
-//            logger.error("目标方法执行异常,目标类:" + joinPoint.getTarget() + "方法:" + joinPoint.getSignature().getName(), e);
-//            throw new RuntimeException("系统繁忙,请稍后再试!");
-//        }
-//    }
-//
-//    public int login(CameraDTO cameraDTO) {
-//        cameraDTO.setHcTool(new HCNetTools());
-//        HCNetTools hcTool = cameraDTO.getHcTool();
-//
-//        int code = 0;
-//        if(hcTool.initDevices() == 1) {
-//            code = 1;//初始化失败
-//            return code;
-//        }
-//
-//        int regSuc = hcTool.deviceLogin(cameraDTO.getAccount(),cameraDTO.getPassword(),cameraDTO.getIp(),cameraDTO.getPort());
-//        if(regSuc != 0) {
-//            code = regSuc;//注册失败
-//            return code;
-//        }
-//
-//        List<String> channelList;
-//        channelList = hcTool.getChannelNumber();
-//        cameraDTO.setChannelList(channelList);
-//        if (channelList.size() == 0) {
-//            code = 4;
-//        }
-//
-//        return code;
-//    }
-//
-//    public void logout(CameraDTO cameraDTO) {
-//        cameraDTO.getHcTool().deviceLogout();
-//    }
-//
-//}
+package com.sckj.camera.aop;
+
+
+import com.sckj.camera.service.CameraServiceImpl;
+import com.sckj.camera.model.dto.CameraDTO;
+import com.sckj.camera.model.dto.ResultDTO;
+import com.sckj.camera.model.entity.Camera;
+import com.sckj.camera.hik.HCNetTools;
+import com.sckj.camera.util.HikCameraUtils;
+import com.sckj.common.aop.CameraLogin;
+import com.sckj.common.exception.OperateException;
+import org.apache.commons.lang3.ObjectUtils;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.EnableAspectJAutoProxy;
+import org.springframework.core.annotation.AnnotationUtils;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Objects;
+
+import static com.sckj.common.aop.CameraLogin.Operation.VIDEO_DOWNLOAD;
+
+/**
+ * 海康设备登陆AOP切面
+ */
+@EnableAspectJAutoProxy(proxyTargetClass = true)
+@Aspect
+@Component
+public class HikCameraAspect {
+
+    @Autowired
+    private CameraServiceImpl cameraService;
+
+    private final Logger logger = LoggerFactory.getLogger(HikCameraAspect.class);
+
+    @Around(value = "@annotation(com.sckj.common.aop.CameraLogin)"
+            + "|| @within(com.sckj.common.aop.CameraLogin)")
+    public Object aroundCamera(ProceedingJoinPoint joinPoint) throws RuntimeException {
+        Object result = null;
+        try {
+            Object[] args = joinPoint.getArgs();
+            if (args.length < 1) {
+                throw new RuntimeException("无传入参数");
+            }
+
+            if (args[0] != null & args[0] instanceof CameraDTO) {
+                CameraLogin cameraLog = getCameraLogin(joinPoint);
+                CameraLogin.Operation type = cameraLog.type();
+                if (!cameraLog.loginCamera()) {
+                    return joinPoint.proceed(args);
+                }
+                CameraDTO cameraDTO = (CameraDTO) args[0];
+                Camera camera = cameraService.getById(cameraDTO.getId());
+                if (camera == null) {
+                    throw new OperateException("未查询到设备ID为" + cameraDTO.getId() + "的设备");
+                }
+                BeanUtils.copyProperties(camera, cameraDTO);
+                //设备登录
+                int code = login(cameraDTO, type);
+                args[0] = cameraDTO;
+                switch (code) {
+                    case 0:
+                        int channelNumber = -1;
+                        //必须是监控设备
+                        if (1 == cameraDTO.getType()) {
+                            //有VCR录像机
+                            if (ObjectUtils.isNotEmpty(cameraDTO.getVcr())) {
+                                channelNumber = HikCameraUtils.getIpcChannel(cameraDTO.getChannelList(), cameraDTO.getIp());
+                            } else {
+                              //没有VCR录像机
+                                channelNumber = HikCameraUtils.analyzeChannel(cameraDTO.getChannelList().get(0));
+                            }
+                        }
+
+                        //所在通道或者在录像机的通道
+                        cameraDTO.setChannelNumber(channelNumber);
+                        //成功登录
+                        result = joinPoint.proceed(args);
+                        break;
+                    case 4:
+                        //获取通道失败
+                        logout(cameraDTO);
+                        result = new ResultDTO("", HikCameraUtils.resultNames[code], "");
+                        break;
+                    default:
+                        //注册失败
+                        result = new ResultDTO("", HikCameraUtils.resultNames[code], "");
+                }
+                return result;
+            } else {
+                throw new OperateException("传入参数异常");
+            }
+
+        } catch (Throwable e) {
+            logger.error("目标方法执行异常,目标类:" + joinPoint.getTarget() + "方法:" + joinPoint.getSignature().getName(), e);
+            throw new RuntimeException("系统繁忙,请稍后再试!");
+        }
+    }
+
+
+    /**
+     *
+     */
+    public CameraLogin getCameraLogin(ProceedingJoinPoint point) {
+        MethodSignature signature = (MethodSignature) point.getSignature();
+        CameraLogin cameraLog = AnnotationUtils.findAnnotation(signature.getMethod(), CameraLogin.class);
+        if (Objects.nonNull(cameraLog)) {
+            return cameraLog;
+        }
+
+        return AnnotationUtils.findAnnotation(signature.getDeclaringType(), CameraLogin.class);
+    }
+
+    /***
+     * 设备登录
+     * @param cameraDTO
+     * @return
+     */
+    public int login(CameraDTO cameraDTO,  CameraLogin.Operation type) {
+        cameraDTO.setHcTool(new HCNetTools());
+        HCNetTools hcTool = cameraDTO.getHcTool();
+
+        int code = 0;
+        if (hcTool.initDevices() == 1) {
+            code = 1;//初始化失败
+            return code;
+        }
+        int regSuc = -1;
+        switch (type) {
+            //只用到摄像机功能
+            case REAL_STREAM:
+            case CATCH_PICTURE:
+                regSuc = hcTool.deviceLogin(cameraDTO.getIp(), cameraDTO.getPort(), cameraDTO.getAccount(), cameraDTO.getPassword());
+                break;
+            default:
+                Camera vcr = cameraService.getById(cameraDTO.getVcrId());
+                if (ObjectUtils.isEmpty(vcr)) {
+                    throw new OperateException(cameraDTO.getNo() + "请配置有效的录像机ID");
+                }
+                cameraDTO.setVcr(vcr);
+                regSuc = hcTool.deviceLogin(cameraDTO.getVcr().getIp(), cameraDTO.getVcr().getPort(), cameraDTO.getVcr().getAccount(), cameraDTO.getVcr().getPassword());
+                break;
+        }
+
+        if (regSuc != 0) {
+            code = regSuc;//注册失败
+            return code;
+        }
+
+        List<String> channelList;
+        channelList = hcTool.getChannelNumber();
+        cameraDTO.setChannelList(channelList);
+        if (channelList.size() == 0) {
+            code = 4;
+        }
+
+        return code;
+    }
+
+    /***
+     * 设备登出
+     * @param cameraDTO
+     */
+    public void logout(CameraDTO cameraDTO) {
+        cameraDTO.getHcTool().deviceLogout();
+    }
+
+}

+ 0 - 105
taphole-camera/src/main/java/com.sckj.camera/common/CommonKit.java

@@ -1,105 +0,0 @@
-package com.sckj.camera.common;
-
-import java.net.*;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.LinkedHashMap;
-import java.util.List;
-
-public class CommonKit {
-
-    /**
-     * 根据前端传递的集合参数中取到指定属性的值
-     */
-    public static List getCols(List vo, String colName) {
-        List<String> list = new ArrayList<>();
-        for (Object obj : vo) {
-            list.add((String) ((LinkedHashMap) obj).get(colName));
-        }
-        return list;
-    }
-
-    public static String join(String[] strs , String separator){
-        String result = "";
-        for (int i = 0; i < strs.length; i++) {
-            if(i == 0){
-                result += strs[i];
-            }else{
-                result += separator+strs[i];
-            }
-        }
-        return result;
-    }
-
-    /**
-     * 获取项目webapp目录
-     * @return
-     */
-    public static String getLibPath(){
-        String path = System.getProperty("user.dir") + "/config/lib/linux/libhcnetsdk.so";
-        //String path = CommonKit.class.getClassLoader().getResource("").getPath().substring(1) + "lib\\win\\HCNetSDK.dll";
-        return path;
-	}
-
-    /**
-     * 获取本机ip
-     * @return
-     */
-    public static String getServerIp() {
-        // 获取操作系统类型
-        String sysType = System.getProperties().getProperty("os.name");
-        String ip;
-        if (sysType.toLowerCase().startsWith("win")) {  // 如果是Windows系统,获取本地IP地址
-            String localIP = null;
-            try {
-                localIP = InetAddress.getLocalHost().getHostAddress();
-            } catch (UnknownHostException e) {
-                e.printStackTrace();
-            }
-            if (localIP != null) {
-                return localIP;
-            }
-        } else {
-            ip = getIpByEthNum("eth0"); // 兼容Linux
-            if (ip != null) {
-                return ip;
-            }
-        }
-        return "获取服务器IP错误";
-    }
-
-    /**
-     * 根据网络接口获取IP地址
-     * @param ethNum 网络接口名,Linux下是eth0
-     * @return
-     */
-    private static String getIpByEthNum(String ethNum) {
-        try {
-            Enumeration allNetInterfaces = NetworkInterface.getNetworkInterfaces();
-            InetAddress ip;
-            while (allNetInterfaces.hasMoreElements()) {
-                NetworkInterface netInterface = (NetworkInterface) allNetInterfaces.nextElement();
-                if (ethNum.equals(netInterface.getName())) {
-                    Enumeration addresses = netInterface.getInetAddresses();
-                    while (addresses.hasMoreElements()) {
-                        ip = (InetAddress) addresses.nextElement();
-                        if (ip != null && ip instanceof Inet4Address) {
-                            return ip.getHostAddress();
-                        }
-                    }
-                }
-            }
-        } catch (SocketException e) {
-            e.printStackTrace();
-        }
-        return "获取服务器IP错误";
-    }
-
-    public static void main(String[] args) {
-        String ip = "10.192.44.101";
-        String[] a = ip.split("\\.");
-        String b = CommonKit.join(a,"");
-        System.out.println(a+b);
-    }
-
-}

+ 0 - 26
taphole-camera/src/main/java/com.sckj.camera/config/CameraAsync.java

@@ -1,26 +0,0 @@
-package com.sckj.camera.config;//package com.sckj.camera.config;
-//
-//import org.springframework.context.annotation.Bean;
-//import org.springframework.context.annotation.Configuration;
-//import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
-//
-//import java.util.concurrent.Executor;
-//import java.util.concurrent.ThreadPoolExecutor;
-//
-//@Configuration
-//public class CameraAsync {
-//    @Bean(name = "taskExecutor")
-//    public Executor taskExecutor() {
-//        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
-//        executor.setCorePoolSize(15);
-//        executor.setMaxPoolSize(50);
-//        executor.setQueueCapacity(150);
-//
-//        executor.setKeepAliveSeconds(60);
-//        executor.setThreadNamePrefix("camExecutor-");
-//        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
-//        executor.setWaitForTasksToCompleteOnShutdown(true);
-//        executor.setAwaitTerminationSeconds(60);
-//        return executor;
-//    }
-//}

+ 193 - 0
taphole-camera/src/main/java/com.sckj.camera/controller/CameraController.java

@@ -0,0 +1,193 @@
+package com.sckj.camera.controller;
+
+import com.github.pagehelper.PageHelper;
+import com.sckj.camera.model.dto.CameraDTO;
+import com.sckj.camera.model.dto.HistoryDTO;
+import com.sckj.camera.model.dto.ResultDTO;
+import com.sckj.camera.model.entity.Camera;
+import com.sckj.camera.service.CameraServiceImpl;
+import com.sckj.camera.util.LocalDateUtils;
+import com.sckj.common.core.AjaxResult;
+import com.sckj.common.validate.commons.PageValidate;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.format.annotation.DateTimeFormat;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Date;
+
+@Api(tags = "相机设备")
+@RestController
+@RequestMapping(value = "/camera")
+public class CameraController {
+
+    @Autowired
+    private CameraServiceImpl cameraService;
+
+
+    @ApiOperation("相机设备分页信息")
+    @PostMapping("/list")
+    public AjaxResult list(@Validated PageValidate pageValidate,
+                               @Validated Camera camera) {
+        PageHelper.startPage(pageValidate.getPageNo(),pageValidate.getPageSize());
+        return AjaxResult.success(cameraService.list());
+    }
+
+    @ApiOperation("查询相机设备")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "cameraId", value = "相机设备Id", paramType = "query", dataType = "Long"),
+    })
+    @PostMapping("/detail")
+    public AjaxResult detail(Long cameraId) {
+        return AjaxResult.success(cameraService.getById(cameraId));
+    }
+
+
+    //@Log(title = "文章分类新增")
+    @ApiOperation("相机信息新增")
+    @PostMapping("/add")
+    public AjaxResult add(@Validated @RequestBody  Camera camera) {
+        cameraService.add(camera);
+        return AjaxResult.success();
+    }
+
+    @ApiOperation("相机信息编辑")
+    @PostMapping("/edit")
+    public AjaxResult edit(@Validated @RequestBody Camera camera) {
+        cameraService.edit(camera);
+        return AjaxResult.success();
+    }
+
+    @ApiOperation("相机信息删除")
+    @PostMapping("/del")
+    public AjaxResult del(@RequestBody Long id) {
+        cameraService.removeById(id);
+        return AjaxResult.success();
+    }
+
+
+    @ApiOperation("获取设备通道信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "设备id", paramType = "query", dataType = "Long")
+    })
+    @PostMapping("/getChannel")
+    public AjaxResult getChannel(Long id) {
+        CameraDTO cameraDTO = new CameraDTO();
+        cameraDTO.setId(id);
+        ResultDTO result = cameraService.getChannel(cameraDTO);
+        return AjaxResult.success(result);
+    }
+
+    @ApiOperation("开始推流")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "设备id", paramType = "query", dataType = "Long")
+    })
+    @PostMapping("/startTranscode")
+    public AjaxResult startTranscode(Long id) {
+        CameraDTO cameraDTO = new CameraDTO();
+        cameraDTO.setId(id);
+        ResultDTO result = cameraService.startTranscode(cameraDTO);
+        return AjaxResult.success(result);
+    }
+
+    /**
+     * 回放推流
+     * @param id 相机id
+     * @return ResultDTO
+     */
+    @ApiOperation("回放推流")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "设备id", paramType = "query", dataType = "Long"),
+            @ApiImplicitParam(name = "startTime", value = "起始时间", paramType = "query", dataType = "Date"),
+            @ApiImplicitParam(name = "endTime", value = "结束时间", paramType = "query", dataType = "Date")
+    })
+    @PostMapping("/startBackTranscode")
+    public AjaxResult startBackTranscode(Long id,
+                                         @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date startTime,
+                                         @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date endTime) {
+        CameraDTO cameraDTO = new CameraDTO();
+        cameraDTO.setId(id);
+
+        cameraDTO.setHistoryDTO(new HistoryDTO(LocalDateUtils.dateToLocalDateTime(startTime), LocalDateUtils.dateToLocalDateTime(endTime)));
+        ResultDTO result = cameraService.startBackTranscode(cameraDTO);
+        return AjaxResult.success(result);
+    }
+
+    /**
+     * 抓图
+     * @return ResultDTO
+     */
+    @ApiOperation("抓图")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "设备id", paramType = "query", dataType = "Long"),
+            @ApiImplicitParam(name = "ipc", value = "nvr的ipc摄像机ip地址", paramType = "query", dataType = "String")
+    })
+    @PostMapping("/catchPic")
+    public AjaxResult catchPic(CameraDTO cameraDTO){
+        ResultDTO result = cameraService.catchPic(cameraDTO);
+        return AjaxResult.success(result);
+    }
+
+    /**
+     * 视频下载
+     * @return ResultDTO
+     */
+    @ApiOperation("视频下载")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "设备id", paramType = "query", dataType = "Long"),
+            @ApiImplicitParam(name = "startTime", value = "起始时间", paramType = "query", dataType = "Date"),
+            @ApiImplicitParam(name = "endTime", value = "结束时间", paramType = "query", dataType = "Date")
+    })
+    @GetMapping("/downloadVideo")
+    public AjaxResult downloadVideo(Long id,
+                                    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date startTime,
+                                    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date endTime) {
+        CameraDTO cameraDTO = new CameraDTO();
+        cameraDTO.setId(id);
+        cameraDTO.setHistoryDTO(new HistoryDTO(LocalDateUtils.dateToLocalDateTime(startTime), LocalDateUtils.dateToLocalDateTime(endTime)));
+        ResultDTO result = cameraService.downloadBack(cameraDTO);
+        return AjaxResult.success(result);
+    }
+
+    /**
+     * 获取录像文件信息
+     * @return ResultDTO
+     */
+    @ApiOperation("获取录像文件信息")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "设备id", paramType = "query", dataType = "Long"),
+            @ApiImplicitParam(name = "startTime", value = "起始时间", paramType = "query", dataType = "Date"),
+            @ApiImplicitParam(name = "endTime", value = "结束时间", paramType = "query", dataType = "Date")
+    })
+    @GetMapping("/getVideoFileList")
+    public AjaxResult getVideoFileList(Long id,
+                                       @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date startTime,
+                                       @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date endTime) {
+        CameraDTO cameraDTO = new CameraDTO();
+        cameraDTO.setId(id);
+        cameraDTO.setHistoryDTO(new HistoryDTO(LocalDateUtils.dateToLocalDateTime(startTime), LocalDateUtils.dateToLocalDateTime(endTime)));
+        ResultDTO result = cameraService.getVideoFileList(cameraDTO);
+        return AjaxResult.success(result);
+    }
+
+    /**
+     * 关闭ffmpeg进程
+     * @param id 相机id
+     * @return Boolean
+     */
+    @ApiOperation("关闭进程")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "FlowId", paramType = "query", dataType = "Long")
+    })
+    @PostMapping("/stopRtmp")
+    public AjaxResult stopRtmp(Long id){
+        Boolean result = cameraService.stopRtmp(id);
+        return AjaxResult.success(result);
+    }
+
+
+}

+ 5 - 7
taphole-camera/src/main/java/com.sckj.camera/controller/CameraFileController.java

@@ -1,9 +1,7 @@
 package com.sckj.camera.controller;
 
-import com.sckj.camera.model.entity.CameraFile;
 import com.sckj.camera.service.CameraFileServiceImpl;
 import com.sckj.common.core.AjaxResult;
-import com.sckj.common.core.PageResult;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
@@ -19,7 +17,7 @@ import javax.servlet.http.HttpServletResponse;
  */
 @Api(tags = "文件上传下载")
 @RestController
-@RequestMapping(value = "/camerafile", produces = { "application/json;charset=utf-8" })
+@RequestMapping(value = "/camerafile")
 public class CameraFileController {
 
     @Autowired
@@ -33,7 +31,7 @@ public class CameraFileController {
      */
     @ApiOperation(value = "下载文件")
     @ApiImplicitParam(name = "id", value = "内容ID", required = true, paramType = "path", dataType = "int")
-    @GetMapping("/{id}")
+    @PostMapping("/{id}")
     public void getFile(@PathVariable Integer id, HttpServletResponse response) {
         cameraFileService.downloadFile(id, response);
     }
@@ -50,7 +48,7 @@ public class CameraFileController {
             @ApiImplicitParam(name = "fileName", value = "下载文件显示名", required = true, paramType = "query", dataType = "string"),
             @ApiImplicitParam(name = "filePath", value = "文件路径,由接口提供", required = true, paramType = "query", dataType = "string")
     })
-    @GetMapping("/getFile")
+    @PostMapping("/getFile")
     public void getFileByPath(String fileName, String filePath, HttpServletResponse response) {
 //        Assert.isBlank(filePath, "文件路径不可为空");
 //        HAssert.isBlank(fileName, "文件名称不可为空");
@@ -64,8 +62,8 @@ public class CameraFileController {
      */
     @ApiOperation("删除文件")
     @ApiImplicitParam(name = "id", value = "文件ID", paramType = "path", dataType = "int")
-    @DeleteMapping("/{id}")
-    public AjaxResult delete(@PathVariable Integer id) {
+    @PostMapping("/del")
+    public AjaxResult del(@PathVariable Integer id) {
         cameraFileService.deleteFile(id);
         return AjaxResult.success();
     }

+ 9 - 8
taphole-camera/src/main/java/com.sckj.camera/controller/FlowController.java → taphole-camera/src/main/java/com.sckj.camera/controller/CameraFlowController.java

@@ -1,6 +1,6 @@
 package com.sckj.camera.controller;
 
-import com.sckj.camera.service.FlowServiceImpl;
+import com.sckj.camera.service.CameraFlowServiceImpl;
 import com.sckj.common.core.AjaxResult;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
@@ -8,28 +8,29 @@ import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
 @Api(tags = "视频流")
 @RestController
 @RequestMapping(value = "/flow")
-public class FlowController    {
+public class CameraFlowController {
 
     @Autowired
-    private FlowServiceImpl flowService;
+    private CameraFlowServiceImpl flowService;
 
     /**
      * 停止并删除推流
-     * @param tasker 推流名
+     * @param taskName 推流名
      */
     @ApiOperation("关闭进程")
     @ApiImplicitParams({
-            @ApiImplicitParam(name = "tasker", value = "推流名", paramType = "query", dataType = "String")
+            @ApiImplicitParam(name = "taskName", value = "推流名", paramType = "query", dataType = "String")
     })
     @GetMapping("/stopByTasker")
-    public AjaxResult stopByTasker(String tasker){
-        flowService.stopByTasker(tasker);
+    public AjaxResult stopByTasker(String taskName){
+        flowService.stopByTaskName(taskName);
         return  AjaxResult.success();
     }
 
@@ -69,7 +70,7 @@ public class FlowController    {
     @ApiImplicitParams({
             @ApiImplicitParam(name = "tasker", value = "推流名", paramType = "query", dataType = "String")
     })
-    @GetMapping("/notification")
+    @PostMapping("/notification")
     public AjaxResult notification(String tasker){
         flowService.notification(tasker);
         return  AjaxResult.success();

+ 0 - 66
taphole-camera/src/main/java/com.sckj.camera/controller/DeviceController.java

@@ -1,66 +0,0 @@
-package com.sckj.camera.controller;
-
-import com.github.pagehelper.PageHelper;
-import com.sckj.camera.model.entity.Camera;
-import com.sckj.camera.service.DeviceServiceImpl;
-import com.sckj.common.core.AjaxResult;
-import com.sckj.common.validate.commons.PageValidate;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiImplicitParam;
-import io.swagger.annotations.ApiImplicitParams;
-import io.swagger.annotations.ApiOperation;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-@Api(tags = "相机设备")
-@RestController
-@RequestMapping(value = "/camera")
-public class DeviceController  {
-
-    @Autowired
-    private DeviceServiceImpl deviceService;
-
-    @ApiOperation("相机设备分页信息(by试验台ID)")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "testerId", value = "试验台id", paramType = "query", dataType = "String"),
-    })
-    @GetMapping("/list")
-    public AjaxResult list(@Validated PageValidate pageValidate,
-                               @Validated Camera searchValidate) {
-        PageHelper.startPage(pageValidate.getPageNo(),pageValidate.getPageSize());
-        return AjaxResult.success(deviceService.list());
-    }
-
-
-    @ApiOperation("查询相机设备")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "cameraId", value = "相机设备Id", paramType = "query", dataType = "Integer"),
-    })
-    @GetMapping("/findCamera")
-    public AjaxResult findCamera(Integer cameraId) {
-        return AjaxResult.success(deviceService.getById(cameraId));
-    }
-
-    @ApiOperation("更新相机设备信息")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "camera", value = "相机设备信息", paramType = "body", dataType = "Camera"),
-    })
-    @PostMapping("/updateCamera")
-    public AjaxResult updateCamera(@RequestBody Camera camera) {
-        deviceService.updateCamera(camera);
-        return AjaxResult.success();
-    }
-
-    @ApiOperation("删除相机设备信息")
-    @ApiImplicitParams({
-            @ApiImplicitParam(name = "cameraId", value = "相机设备Id", paramType = "query", dataType = "Integer"),
-    })
-    @GetMapping("/deleteCamera")
-    public AjaxResult deleteCamera(Integer cameraId) {
-        deviceService.removeById(cameraId);
-        return AjaxResult.success();
-    }
-
-
-}

+ 0 - 202
taphole-camera/src/main/java/com.sckj.camera/controller/HikCameraController.java

@@ -1,202 +0,0 @@
-package com.sckj.camera.controller;
-
-import com.sckj.camera.model.dto.CameraDTO;
-import com.sckj.camera.model.dto.HistoryDTO;
-import com.sckj.camera.model.dto.PlayControlDTO;
-import com.sckj.camera.model.dto.ResultDTO;
-import com.sckj.camera.util.LocalDateUtils;
-import com.sckj.camera.service.HikCameraServiceImpl;
-import com.sckj.common.core.AjaxResult;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiImplicitParam;
-import io.swagger.annotations.ApiImplicitParams;
-import io.swagger.annotations.ApiOperation;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.format.annotation.DateTimeFormat;
-import org.springframework.web.bind.annotation.GetMapping;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
-import org.springframework.web.bind.annotation.RestController;
-
-import java.util.Date;
-
-@Api(tags = "海康相机控制")
-@RestController
-@RequestMapping(value = "/hikcamera")
-public class HikCameraController  {
-
-	@Autowired
-	private HikCameraServiceImpl hikCameraService;
-
-	@ApiOperation("获取设备通道信息")
-	@ApiImplicitParams({
-			@ApiImplicitParam(name = "id", value = "设备id", paramType = "query", dataType = "Integer")
-	})
-	@GetMapping("/getChannel")
-	public AjaxResult getChannel(Integer id) {
-		CameraDTO cameraDTO = new CameraDTO();
-		cameraDTO.setCameraId(id);
-		ResultDTO result = hikCameraService.getChannel(cameraDTO);
-		return AjaxResult.success(result);
-	}
-
-	@ApiOperation("开始推流")
-	@ApiImplicitParams({
-			@ApiImplicitParam(name = "id", value = "设备id", paramType = "query", dataType = "Integer"),
-			@ApiImplicitParam(name = "ipc", value = "nvr的ipc摄像机ip地址", paramType = "query", dataType = "String")
-	})
-	@GetMapping("/startTranscode")
-	public AjaxResult startTranscode(Integer id, @RequestParam(required = false) String ipc) {
-		CameraDTO cameraDTO = new CameraDTO();
-		cameraDTO.setCameraId(id);
-		if (StringUtils.isNotBlank(ipc)) {
-			cameraDTO.setIpcAddress(ipc);
-		}
-		ResultDTO result = hikCameraService.startTranscode(cameraDTO);
-	 	return AjaxResult.success(result);
-	}
-
-	/**
-	 * 回放推流
-	 * @param id 相机id
-	 * @return ResultDTO
-	 */
-	@ApiOperation("回放推流")
-	@ApiImplicitParams({
-			@ApiImplicitParam(name = "id", value = "设备id", paramType = "query", dataType = "Integer"),
-			@ApiImplicitParam(name = "ipc", value = "nvr的ipc摄像机ip地址", paramType = "query", dataType = "String"),
-			@ApiImplicitParam(name = "startTime", value = "起始时间", paramType = "query", dataType = "Date"),
-			@ApiImplicitParam(name = "endTime", value = "结束时间", paramType = "query", dataType = "Date")
-	})
-	@GetMapping("/startBackTranscode")
-	public AjaxResult startBackTranscode(Integer id,
-                                                      @RequestParam(required = false) String ipc,
-                                                      @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date startTime,
-                                                      @RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date endTime) {
-		CameraDTO cameraDTO = new CameraDTO();
-		cameraDTO.setCameraId(id);
-		if (StringUtils.isNotBlank(ipc)) {
-			cameraDTO.setIpcAddress(ipc);
-		}
-		cameraDTO.setHistoryDTO(new HistoryDTO(LocalDateUtils.dateToLocalDateTime(startTime), LocalDateUtils.dateToLocalDateTime(endTime)));
-		ResultDTO result = hikCameraService.startBackTranscode(cameraDTO);
-		return AjaxResult.success(result);
-	}
-
-	/**
-	 * 抓图
-	 * @return ResultDTO
-	 */
-	@ApiOperation("抓图")
-	@ApiImplicitParams({
-			@ApiImplicitParam(name = "id", value = "设备id", paramType = "query", dataType = "Integer"),
-			@ApiImplicitParam(name = "ipc", value = "nvr的ipc摄像机ip地址", paramType = "query", dataType = "String")
-	})
-	@GetMapping("/catchPic")
-	public AjaxResult catchPic(CameraDTO cameraDTO){
-		ResultDTO result = hikCameraService.catchPic(cameraDTO);
-		return AjaxResult.success(result);
-	}
-
-	/**
-	 * 视频下载
-	 * @return ResultDTO
-	 */
-	@ApiOperation("视频下载")
-	@ApiImplicitParams({
-			@ApiImplicitParam(name = "id", value = "设备id", paramType = "query", dataType = "Integer"),
-			@ApiImplicitParam(name = "ipc", value = "nvr的ipc摄像机ip地址", paramType = "query", dataType = "String"),
-			@ApiImplicitParam(name = "startTime", value = "起始时间", paramType = "query", dataType = "Date"),
-			@ApiImplicitParam(name = "endTime", value = "结束时间", paramType = "query", dataType = "Date")
-	})
-	@GetMapping("/downloadVideo")
-	public AjaxResult downloadVideo(Integer id,
-                                                 @RequestParam(required = false) String ipc,
-                                                 @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date startTime,
-                                                 @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date endTime) {
-		CameraDTO cameraDTO = new CameraDTO();
-		cameraDTO.setCameraId(id);
-		if (StringUtils.isNotBlank(ipc)) {
-			cameraDTO.setIpcAddress(ipc);
-		}
-		cameraDTO.setHistoryDTO(new HistoryDTO(LocalDateUtils.dateToLocalDateTime(startTime), LocalDateUtils.dateToLocalDateTime(endTime)));
-		ResultDTO result = hikCameraService.downloadBack(cameraDTO);
-		return AjaxResult.success(result);
-	}
-
-	/**
-	 * 获取录像文件信息
-	 * @return ResultDTO
-	 */
-	@ApiOperation("获取录像文件信息")
-	@ApiImplicitParams({
-			@ApiImplicitParam(name = "id", value = "设备id", paramType = "query", dataType = "Integer"),
-			@ApiImplicitParam(name = "ipc", value = "nvr的ipc摄像机ip地址", paramType = "query", dataType = "String"),
-			@ApiImplicitParam(name = "startTime", value = "起始时间", paramType = "query", dataType = "Date"),
-			@ApiImplicitParam(name = "endTime", value = "结束时间", paramType = "query", dataType = "Date")
-	})
-	@GetMapping("/getVideoFileList")
-	public AjaxResult getVideoFileList(Integer id,
-                                                    @RequestParam(required = false) String ipc,
-                                                    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date startTime,
-                                                    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date endTime) {
-		CameraDTO cameraDTO = new CameraDTO();
-		cameraDTO.setCameraId(id);
-		if (StringUtils.isNotBlank(ipc)) {
-			cameraDTO.setIpcAddress(ipc);
-		}
-		cameraDTO.setHistoryDTO(new HistoryDTO(LocalDateUtils.dateToLocalDateTime(startTime), LocalDateUtils.dateToLocalDateTime(endTime)));
-		ResultDTO result = hikCameraService.getVideoFileList(cameraDTO);
-		return AjaxResult.success(result);
-	}
-
-	/**
-	 * 云台控制
-	 * @param id 相机id
-	 * @param ipc nvr的ipc摄像机ip地址
-	 * @return ResultDTO
-	 */
-	@ApiOperation("云台控制")
-	@ApiImplicitParams({
-			@ApiImplicitParam(name = "id", value = "设备id", paramType = "query", dataType = "Integer"),
-			@ApiImplicitParam(name = "ipc", value = "nvr的ipc摄像机ip地址", paramType = "query", dataType = "String"),
-			@ApiImplicitParam(name = "mill", value = "云台动作时间(ms)", paramType = "query", dataType = "Integer"),
-			@ApiImplicitParam(name = "command", value = "云台动指令", paramType = "query", dataType = "String"),
-	})
-	@GetMapping("/playControl")
-	public AjaxResult playControl(Integer id, String ipc, Integer mill, String command){
-
-		CameraDTO cameraDTO = new CameraDTO();
-		cameraDTO.setCameraId(id);
-		if (StringUtils.isNotBlank(ipc)) {
-			cameraDTO.setIpcAddress(ipc);
-		}
-		if (mill != null && StringUtils.isNotBlank(command)) {
-			if (mill > 0) {
-				cameraDTO.setPlayControlDTO(new PlayControlDTO(mill,command));
-			}
-		} else {
-			ResultDTO result = new ResultDTO();
-			result.setMsg("错误:云台控制传入参数错误");
-		}
-		ResultDTO result = hikCameraService.playControl(cameraDTO);
-		return AjaxResult.success(result);
-	}
-
-	/**
-	 * 关闭ffmpeg进程
-	 * @param id 相机id
-	 * @return Boolean
-	 */
-	@ApiOperation("关闭进程")
-	@ApiImplicitParams({
-			@ApiImplicitParam(name = "id", value = "相机id", paramType = "query", dataType = "Integer")
-	})
-	@GetMapping("/stopRtmp")
-	public AjaxResult stopRtmp(Integer id){
-		Boolean result = hikCameraService.stopRtmp(id);
-		return AjaxResult.success(result);
-	}
-
-}

+ 19 - 4
taphole-camera/src/main/java/com.sckj.camera/hik/HCNetSDK.java

@@ -12,7 +12,6 @@
 package com.sckj.camera.hik;
 
 
-import com.sckj.camera.common.CommonKit;
 import com.sun.jna.*;
 import com.sun.jna.examples.win32.GDI32.RECT;
 import com.sun.jna.examples.win32.W32API;
@@ -20,15 +19,31 @@ import com.sun.jna.examples.win32.W32API.HWND;
 import com.sun.jna.ptr.ByteByReference;
 import com.sun.jna.ptr.IntByReference;
 import com.sun.jna.ptr.ShortByReference;
+import com.sun.jna.win32.StdCallLibrary;
+import org.springframework.core.io.ClassPathResource;
 
+import java.net.URL;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 
 //SDK接口说明,HCNetSDK.dll
-public interface HCNetSDK extends Library {
+public interface HCNetSDK extends  StdCallLibrary {
 
-	HCNetSDK INSTANCE = (HCNetSDK) Native.loadLibrary(CommonKit.getLibPath(),HCNetSDK.class);
+	/**
+	 * 获取硬件库包
+	 * @return
+	 */
+	static String getLibPath(){
+		URL url = HCNetTools.isWindows() ?
+				HCNetSDK.class.getResource( "/lib/win/HCNetSDK.dll") :
+				HCNetSDK.class.getResource( "/lib/linux/libhcnetsdk.so");
+		ClassPathResource resource = new ClassPathResource("/lib/win/HCNetSDK.dll");
+
+		return resource != null ? resource.getPath(): null;
+	}
+
+	HCNetSDK INSTANCE =  (HCNetSDK)Native.loadLibrary("D:\\project\\xiha\\taphole\\taphole-camera\\src\\main\\resources\\lib\\win\\HCNetSDK.dll",HCNetSDK.class);
 
 	/***宏定义***/
 	//常量
@@ -6681,7 +6696,7 @@ DVR实现巡航数据结构
 	/***API函数声明,详细说明见API手册***/
 	public static interface FRealDataCallBack_V30 extends Callback {
 		public void invoke(int lRealHandle, int dwDataType,
-                           ByteByReference pBuffer, int dwBufSize, Pointer pUser);
+						   ByteByReference pBuffer, int dwBufSize, Pointer pUser);
 	}
 
 	public static interface FMSGCallBack extends Callback {

+ 15 - 5
taphole-camera/src/main/java/com.sckj.camera/hik/HCNetTools.java

@@ -63,7 +63,7 @@ public class HCNetTools {
 	 * @param port     端口
 	 * @return 结果
 	 */
-	public int deviceLogin(String name, String password, String ip, String port) {
+	public int deviceLogin(String ip, String port,String name, String password) {
 
 		if (bRealPlay) {//判断当前是否在预览
 			return 2;//"注册新用户请先停止当前预览";
@@ -88,6 +88,8 @@ public class HCNetTools {
 		return 0;
 	}
 
+
+
 	/**
 	 * 注销登陆
 	 */
@@ -163,7 +165,6 @@ public class HCNetTools {
 	 * @param channel 通道号
 	 */
 	public boolean getDVRPic(int channel, String path) {
-
 		HCNetSDK.NET_DVR_WORKSTATE_V30 devwork = new HCNetSDK.NET_DVR_WORKSTATE_V30();
 		if (!hCNetSDK.NET_DVR_GetDVRWorkState_V30(lUserID, devwork)) {
 			// 返回Boolean值,判断是否获取设备能力
@@ -177,6 +178,7 @@ public class HCNetTools {
 		jpeg.wPicQuality = 0;
 		IntByReference a = new IntByReference();
 		//需要加入通道
+		//byte[] bytes = path.getBytes(StandardCharsets.UTF_8);
 		boolean ok = hCNetSDK.NET_DVR_CaptureJPEGPicture(lUserID,channel,jpeg,path);
 		if (ok) {
 			logger.info("hksdk(抓图)-结果状态值(0表示成功):" + hCNetSDK.NET_DVR_GetLastError());
@@ -196,11 +198,11 @@ public class HCNetTools {
 		loadHandle = hCNetSDK.NET_DVR_GetFileByTime(lUserID, channel, getHkTime(startTime), getHkTime(endTime), filePath);
 		if (loadHandle >= 0) {
 			//开始下载
-			boolean downloadFlag = hCNetSDK.NET_DVR_PlayBackControl(loadHandle, hCNetSDK.NET_DVR_PLAYSTART, 0, null);
+			boolean downloadFlag = hCNetSDK.NET_DVR_PlayBackControl(loadHandle, HCNetSDK.NET_DVR_PLAYSTART, 0, null);
 			int tmp = -1;
 			IntByReference pos = new IntByReference(0);
 			while (loadHandle >= 0) {
-				boolean backFlag = hCNetSDK.NET_DVR_PlayBackControl(loadHandle, hCNetSDK.NET_DVR_PLAYGETPOS, 0, pos);
+				boolean backFlag = hCNetSDK.NET_DVR_PlayBackControl(loadHandle, HCNetSDK.NET_DVR_PLAYGETPOS, 0, pos);
 				if (!backFlag) {//防止单个线程死循环
 					return downloadFlag;
 				}
@@ -250,7 +252,7 @@ public class HCNetTools {
 		m_strFilecond.lChannel = channel;//通道号
 
 		int lFindFile = hCNetSDK.NET_DVR_FindFile_V30(lUserID, m_strFilecond);
-		HCNetSDK.NET_DVR_FINDDATA_V30 strFile = new HCNetSDK.NET_DVR_FINDDATA_V30();
+		HCNetSDK.NET_DVR_FINDDATA_V30 strFile;
 		if (lFindFile < 0) {
 			String err = hCNetSDK.NET_DVR_GetErrorMsg(m_err);
 			logger.warn("获取录像文件错误!错误原因:" + m_err.getValue() + "," + err);
@@ -348,4 +350,12 @@ public class HCNetTools {
 		return structTime;
 	}
 
+	public static boolean isLinux() {
+		return System.getProperty("os.name").toLowerCase().contains("linux");
+	}
+
+	public static boolean isWindows() {
+		return System.getProperty("os.name").toLowerCase().contains("windows");
+	}
+
 }

+ 56 - 0
taphole-camera/src/main/java/com.sckj.camera/manager/CameraProperties.java

@@ -0,0 +1,56 @@
+package com.sckj.camera.manager;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+/**
+ * @Author sckj
+ * @Date 2024-10-15 下午 04:42
+ * @Description camera属性
+ */
+@Component
+@ConfigurationProperties(prefix = "camera")
+public class CameraProperties {
+
+    private String filepath;
+
+    private CameraRtmp rtmp;
+
+    public static class CameraRtmp{
+        private String rtmphost;
+
+        private String httphost;
+
+        public String getRtmphost() {
+            return rtmphost;
+        }
+
+        public String getHttphost() {
+            return httphost;
+        }
+
+        public void setRtmphost(String rtmphost) {
+            this.rtmphost = rtmphost;
+        }
+
+        public void setHttphost(String httphost) {
+            this.httphost = httphost;
+        }
+    }
+
+    public String getFilepath() {
+        return filepath;
+    }
+
+    public void setFilepath(String filepath) {
+        this.filepath = filepath;
+    }
+
+    public CameraRtmp getRtmp() {
+        return rtmp;
+    }
+
+    public void setRtmp(CameraRtmp rtmp) {
+        this.rtmp = rtmp;
+    }
+}

+ 19 - 29
taphole-camera/src/main/java/com.sckj.camera/manager/HikCameraManager.java

@@ -1,7 +1,8 @@
 package com.sckj.camera.manager;
 
-import com.sckj.camera.model.dto.CameraDTO;
 import com.sckj.camera.hik.HCNetTools;
+import com.sckj.camera.model.dto.CameraDTO;
+import com.sckj.camera.model.entity.CameraFile;
 import com.sckj.camera.service.CameraFileServiceImpl;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -15,6 +16,7 @@ import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Paths;
 import java.time.LocalDateTime;
+import java.util.Date;
 
 @Service
 public class HikCameraManager {
@@ -24,7 +26,7 @@ public class HikCameraManager {
     @Autowired
     private CameraFileServiceImpl cameraFileService;
 
-    @Value("${app.filepath}")
+    @Value("${camera.filepath}")
     private String rootPath;
 
     @Async
@@ -36,43 +38,31 @@ public class HikCameraManager {
         LocalDateTime endTime = cameraDTO.getHistoryDTO().getEndTime();
 
         try {
+            CameraFile cameraFile = cameraFileService.saveFileInfo(name, path, 0L, "2");
             boolean success = hcTool.downloadBack(startTime,endTime,filePath,channel);
-            if (success) {
-                long size = new File(filePath).length();
-                if (size > 0) {
-                    cameraFileService.saveFileInfo(name,path,size);
-                } else {
-                    Files.delete(Paths.get(filePath));
-                    logger.info("删除文件:" + filePath);
-                }
+            long size = new File(filePath).length();
+            cameraFile.setUpdateTime(new Date());
+            if (success && size > 0) {
+//                if (size > 0) {
+//                    cameraFileService.saveFileInfo(name,path,size,"2");
+//                } else {
+//                    Files.delete(Paths.get(filePath));
+//                    logger.info("删除文件:" + filePath);
+//                }
+                logger.info("下载成功");
+                cameraFile.setStatus("1");
             } else {
+                cameraFile.setStatus("2");
                 logger.info("下载失败");
             }
+            cameraFileService.updateById(cameraFile);
         } catch (InterruptedException ex) {
             logger.error("线程异常:", ex);
-        } catch (IOException ex2) {
+        } catch (Exception ex2) {
             logger.error("文件删除异常", ex2);
         } finally {
             hcTool.deviceLogout();
         }
     }
 
-    @Async
-    public void playControlAsync(CameraDTO cameraDTO, int channel) {
-        HCNetTools hcTool = cameraDTO.getHcTool();
-        int mills = cameraDTO.getPlayControlDTO().getMill();
-        String command = cameraDTO.getPlayControlDTO().getCommand();
-
-        try {
-            boolean success = hcTool.playControl(command,mills,channel);
-            if (!success) {
-                logger.info("控制失败");
-            }
-        } catch (InterruptedException ex) {
-            logger.error("线程异常:", ex);
-        } finally {
-            hcTool.deviceLogout();
-        }
-    }
-
 }

+ 6 - 18
taphole-camera/src/main/java/com.sckj.camera/model/dto/CameraDTO.java

@@ -3,9 +3,11 @@ package com.sckj.camera.model.dto;
 
 import com.sckj.camera.hik.HCNetTools;
 import com.sckj.camera.model.entity.Camera;
+import lombok.Data;
 
 import java.util.List;
 
+@Data
 public class CameraDTO extends Camera {
 
     private List<String> channelList;
@@ -14,24 +16,10 @@ public class CameraDTO extends Camera {
 
     private HistoryDTO historyDTO;
 
-    private PlayControlDTO playControlDTO;
+    //所在的通道
+    private int channelNumber;
 
-    //需要录像机查询的摄像头ip地址
-    private String ipcAddress;
-
-    public List<String> getChannelList() { return channelList; }
-    public void setChannelList(List<String> channelList) { this.channelList = channelList; }
-
-    public HCNetTools getHcTool() { return hcTool; }
-    public void setHcTool(HCNetTools hcTool) { this.hcTool = hcTool; }
-
-    public HistoryDTO getHistoryDTO() { return historyDTO; }
-    public void setHistoryDTO(HistoryDTO historyDTO) { this.historyDTO = historyDTO; }
-
-    public PlayControlDTO getPlayControlDTO() { return playControlDTO; }
-    public void setPlayControlDTO(PlayControlDTO playControlDTO) { this.playControlDTO = playControlDTO; }
-
-    public String getIpcAddress() { return ipcAddress; }
-    public void setIpcAddress(String ipcAddress) { this.ipcAddress = ipcAddress; }
+    //所属的VCR
+    private Camera vcr;
 
 }

+ 0 - 23
taphole-camera/src/main/java/com.sckj.camera/model/dto/PlayControlDTO.java

@@ -1,23 +0,0 @@
-package com.sckj.camera.model.dto;
-
-public class PlayControlDTO {
-
-    //云台控制动作时间
-    private Integer mill;
-
-    //控制指令
-    private String command;
-
-    public PlayControlDTO() {}
-
-    public PlayControlDTO(Integer mill, String command) {
-        this.mill = mill;
-        this.command = command;
-    }
-
-    public Integer getMill() { return mill; }
-    public void setMill(Integer mill) { this.mill = mill; }
-
-    public String getCommand() { return command; }
-    public void setCommand(String command) { this.command = command; }
-}

+ 10 - 30
taphole-camera/src/main/java/com.sckj.camera/model/dto/ResultDTO.java

@@ -1,45 +1,25 @@
 package com.sckj.camera.model.dto;
 
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+@Data
+@AllArgsConstructor
 public class ResultDTO {
 
-    private String tasker;
+    private String taskName;
     private Object msg;
     private String rtmpUrl;
     private String flvUrl;
+    private String hlsUrl;
 
     public ResultDTO() {}
 
-    public ResultDTO(String tasker, String msg, String rtmpUrl) {
-        this.tasker = tasker;
-        this.msg = msg;
-        this.rtmpUrl = rtmpUrl;
-    }
-
-    public String getTasker() {
-        return tasker;
-    }
-
-    public void setTasker(String tasker) {
-        this.tasker = tasker;
-    }
-
-    public Object getMsg() {
-        return msg;
-    }
-
-    public void setMsg(Object msg) {
+    public ResultDTO(String taskName,String msg,String rtmpUrl) {
+        this.taskName = taskName;
         this.msg = msg;
-    }
-
-    public String getRtmpUrl() {
-        return rtmpUrl;
-    }
-
-    public void setRtmpUrl(String rtmpUrl) {
         this.rtmpUrl = rtmpUrl;
     }
+     
 
-    public String getFlvUrl() { return flvUrl; }
-
-    public void setFlvUrl(String flvUrl) { this.flvUrl = flvUrl; }
 }

+ 34 - 12
taphole-camera/src/main/java/com.sckj.camera/model/entity/Camera.java

@@ -4,48 +4,70 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.sckj.common.entity.BaseEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import javax.validation.constraints.NotBlank;
 import java.util.Date;
 
 @TableName(value = "t_camera")
 @Data
-public class Camera {
+@ApiModel("计划任务实体")
+public class Camera extends BaseEntity {
     //主键id
     @TableId(type = IdType.AUTO)
-    @TableField(value = "camera_id")
-    private Integer cameraId;
+    @NotBlank(message = "主键")
+    private Long id;
 
     //设备编号(或者序列号之类的)
+    @NotBlank(message = "设备编号不能为空")
+    @ApiModelProperty("设备编号")
     private String no;
 
-    //设备类型(0-摄像头 1-NVR录像机)
-    private Integer type;
-
-    //摄像头设备所属NVR录像机设备的id
-    @TableField(value = "nvr_id")
-    private Integer nvrId;
-
     //登录用户名
+    @ApiModelProperty("登录用户名")
     private String account;
 
     //登录密码
+    @ApiModelProperty("登录密码")
     private String password;
 
     //ip地址
+    @NotBlank(message = "ip地址不能为空")
+    @ApiModelProperty("ip地址")
     private String ip;
 
     //端口
+    @NotBlank(message = "端口号不能为空")
+    @ApiModelProperty("端口号")
     private String port;
 
     //设备名称
+    @NotBlank(message = "设备名称不能为空")
     private String name;
 
+    //设备型号
+    @NotBlank(message = "设备型号不能为空")
+    @ApiModelProperty("设备型号")
+    private String model;
+
+    //安装位置
+    @NotBlank(message = "安装位置不能为空")
+    @ApiModelProperty("安装位置")
+    private String location;
+
     //设备启用标志
-    private Byte enable;
+    private String status;
 
+    //所属录像机id
+    private Long vcrId;
 
-    private Date createTime;
+    //设备类型(1-摄像头 2-NVR录像机)
+    private Integer type;
 
+    //品牌 (1-海康,目前只有海康)
+    private String brand;
 
 }

+ 12 - 11
taphole-camera/src/main/java/com.sckj.camera/model/entity/CameraFile.java

@@ -4,30 +4,31 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.sckj.common.entity.BaseEntity;
 import lombok.Data;
 
 import java.util.Date;
 
 @TableName(value = "t_camera_file")
 @Data
-public class CameraFile {
+public class CameraFile extends BaseEntity {
     @TableId(type = IdType.AUTO)
     private Integer id;
 
-    @TableField(value = "file_name")
-    private String fileName;
+    @TableField(value = "camera_id")
+    private Long cameraId;
 
-    @TableField(value = "file_path")
-    private String filePath;
+    private String name;
 
-    @TableField(value = "file_size")
-    private Long fileSize;
+    private String path;
 
-    @TableField(value = "file_alias")
-    private String fileAlias;
+    private Long size;
 
-    @TableField(value = "create_time")
-    private Date createTime;
+    private String alias;
 
+    //文件类型 1图片 2视频
+    private String type;
+
+    private String status;
 
 }

+ 5 - 15
taphole-camera/src/main/java/com.sckj.camera/model/entity/CameraFlow.java

@@ -4,26 +4,25 @@ import com.baomidou.mybatisplus.annotation.IdType;
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.sckj.common.entity.BaseEntity;
 import lombok.Data;
 
 import java.util.Date;
 
 @TableName(value = "t_camera_flow")
 @Data
-public class CameraFlow {
+public class CameraFlow extends BaseEntity {
     @TableId(type = IdType.AUTO)
     private Integer id;
 
     @TableField(value = "camera_id")
-    private Integer cameraId;
-
-    @TableField(value = "camera_ipc")
-    private String cameraIpc;
+    private Long cameraId;
 
     /**
      * ffmpeg推流任务Name
      */
-    private String tasker;
+    @TableField(value = "task_name")
+    private String taskName;
 
     /**
      * 0-SDK 1-GB28182
@@ -47,13 +46,4 @@ public class CameraFlow {
     @TableField(value = "flow_record")
     private Integer flowRecord;
 
-    private String record;
-
-    @TableField(value = "update_time")
-    private Date updateTime;
-
-    @TableField(value = "create_time")
-    private Date createTime;
-
-
 }

+ 0 - 1
taphole-camera/src/main/java/com.sckj.camera/model/mapper/CameraFileMapper.java

@@ -1,6 +1,5 @@
 package com.sckj.camera.model.mapper;
 
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.sckj.camera.model.entity.CameraFile;
 import com.sckj.common.core.basics.IBaseMapper;
 

+ 1 - 1
taphole-camera/src/main/java/com.sckj.camera/model/mapper/CameraFlowMapper.java

@@ -1,9 +1,9 @@
 package com.sckj.camera.model.mapper;
 
 
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.sckj.camera.model.entity.CameraFlow;
 import com.sckj.common.core.basics.IBaseMapper;
 
 public interface CameraFlowMapper  extends IBaseMapper<CameraFlow> {
+
 }

+ 1 - 1
taphole-camera/src/main/java/com.sckj.camera/model/mapper/CameraMapper.java

@@ -1,9 +1,9 @@
 package com.sckj.camera.model.mapper;
 
 
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.sckj.camera.model.entity.Camera;
 import com.sckj.common.core.basics.IBaseMapper;
 
 public interface CameraMapper   extends IBaseMapper<Camera> {
+
 }

+ 0 - 26
taphole-camera/src/main/java/com.sckj.camera/model/view/CameraTreeVO.java

@@ -1,26 +0,0 @@
-package com.sckj.camera.model.view;
-
-
-import com.sckj.camera.model.entity.Camera;
-
-import java.util.List;
-
-public class CameraTreeVO {
-
-    private Camera nvr;
-    private List<Camera> cameraList;
-
-    public Camera getNvr() {
-        return nvr;
-    }
-    public void setNvr(Camera nvr) {
-        this.nvr = nvr;
-    }
-
-    public List<Camera> getCameraList() {
-        return cameraList;
-    }
-    public void setCameraList(List<Camera> cameraList) {
-        this.cameraList = cameraList;
-    }
-}

+ 14 - 13
taphole-camera/src/main/java/com.sckj.camera/service/CameraFileServiceImpl.java

@@ -27,13 +27,13 @@ public class CameraFileServiceImpl extends ServiceImpl<CameraFileMapper, CameraF
 
     private Logger logger = LoggerFactory.getLogger(CameraFileServiceImpl.class);
 
-    @Value("${app.filepath}")
+    @Value("${camera.filepath}")
     private String rootPath;
 
     public String getRootPath() {
-        //if (!rootPath.endsWith(File.separator)) {
-            //rootPath += File.separator;
-        //}
+        if (!rootPath.endsWith(File.separator)) {
+            rootPath += File.separator;
+        }
         return rootPath;
     }
 
@@ -51,7 +51,7 @@ public class CameraFileServiceImpl extends ServiceImpl<CameraFileMapper, CameraF
         return -1;
     }
 
-    public CameraFile writeFile(byte[] bytes, String path, String name) {
+    public CameraFile writeFile(byte[] bytes, String path, String name,String type) {
         //存储到本地
         File file = new File(rootPath + path + name);
         int size = bytes.length;
@@ -71,7 +71,7 @@ public class CameraFileServiceImpl extends ServiceImpl<CameraFileMapper, CameraF
                 }
             }
         }
-        return saveFileInfo(name, path, (long)size);
+        return saveFileInfo(name, path, (long)size,type);
     }
 
     /**
@@ -82,13 +82,14 @@ public class CameraFileServiceImpl extends ServiceImpl<CameraFileMapper, CameraF
      * @param size
      * @return
      */
-    public CameraFile saveFileInfo(String name, String path, Long size) {
+    public CameraFile saveFileInfo(String name, String path, Long size,String type) {
         CameraFile fu = new CameraFile();
-        fu.setFileName(name);
-        fu.setFileSize(size);
-        fu.setFilePath(path);
+        fu.setName(name);
+        fu.setSize(size);
+        fu.setPath(path);
         fu.setCreateTime(new Date());
-       // super.save(fu);
+        fu.setType(type);
+        save(fu);
         return fu;
     }
 
@@ -142,7 +143,7 @@ public class CameraFileServiceImpl extends ServiceImpl<CameraFileMapper, CameraF
         if (fileUpload == null) {
             throw new ServiceException("文件信息不存在");
         }
-        this.downloadFromPath(fileUpload.getFilePath(), fileUpload.getFileName(), response);
+        this.downloadFromPath(fileUpload.getPath(), fileUpload.getName(), response);
     }
 
     /**
@@ -291,7 +292,7 @@ public class CameraFileServiceImpl extends ServiceImpl<CameraFileMapper, CameraF
         }
 
         try {
-            Path path = Paths.get(rootPath + fileInfo.getFilePath() + fileInfo.getFileName());
+            Path path = Paths.get(rootPath + fileInfo.getPath() + fileInfo.getName());
             Files.delete(path);
         } catch (IOException e) {
             logger.warn("删除失败:" + e.getMessage());

+ 15 - 13
taphole-camera/src/main/java/com.sckj.camera/service/FlowServiceImpl.java → taphole-camera/src/main/java/com.sckj.camera/service/CameraFlowServiceImpl.java

@@ -1,34 +1,35 @@
 package com.sckj.camera.service;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.sckj.camera.model.entity.CameraFlow;
 import com.sckj.camera.model.mapper.CameraFlowMapper;
+import org.apache.commons.lang3.ObjectUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.List;
+
 @Service
 @Transactional
-public class FlowServiceImpl extends ServiceImpl<CameraFlowMapper, CameraFlow> {
+public class CameraFlowServiceImpl extends ServiceImpl<CameraFlowMapper, CameraFlow> {
 
-    @Value("${app.filepath}")
+    @Value("${camera.filepath}")
     private String rootPath;
 
-    @Autowired
-    private DeviceServiceImpl deviceService;
-
-    @Autowired
-    private CameraFileServiceImpl cameraFileService;
-
-    @Autowired
-    private FFmpegServiceImpl ffmpegService;
 
+    public CameraFlow findByRtmpUrl(String rtmp) {
+        QueryWrapper<CameraFlow> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("rtmp", rtmp);
 
+        List<CameraFlow> cameraFlows = baseMapper.selectList(queryWrapper);
+        if (ObjectUtils.isNotEmpty(cameraFlows)) {
+            return cameraFlows.get(0);
+        }
 
-
-    public CameraFlow findByRtmpUrl(String url) {
 //        HTCriteria<CameraFlow> criteria = HTCriteria.getInstance(CameraFlow.class);
 //        if (StringUtils.isNotBlank(url)) {
 //            criteria.andEqualTo(CameraFlow::getRtmp, url);
@@ -40,7 +41,8 @@ public class FlowServiceImpl extends ServiceImpl<CameraFlowMapper, CameraFlow> {
         return null;
     }
 
-    public void stopByTasker(String tasker) {
+    public void stopByTaskName(String taskName) {
+
 //        if (StringUtils.isNotBlank(tasker)) {
 //            HTCriteria<CameraFlow> criteria = HTCriteria.getInstance(CameraFlow.class);
 //            criteria.andEqualTo(CameraFlow::getTasker,tasker);

+ 390 - 0
taphole-camera/src/main/java/com.sckj.camera/service/CameraServiceImpl.java

@@ -0,0 +1,390 @@
+package com.sckj.camera.service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sckj.camera.hik.HCNetTools;
+import com.sckj.camera.manager.CameraProperties;
+import com.sckj.camera.manager.HikCameraManager;
+import com.sckj.camera.model.dto.CameraDTO;
+import com.sckj.camera.model.dto.ResultDTO;
+import com.sckj.camera.model.entity.Camera;
+import com.sckj.camera.model.entity.CameraFile;
+import com.sckj.camera.model.entity.CameraFlow;
+import com.sckj.camera.model.mapper.CameraMapper;
+import com.sckj.camera.util.FlowUtils;
+import com.sckj.camera.util.HikCameraUtils;
+import com.sckj.common.aop.CameraLogin;
+import com.sckj.common.exception.OperateException;
+import com.sckj.common.util.UrlUtils;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.annotation.Resource;
+import java.io.File;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Service
+@Transactional
+public class CameraServiceImpl extends ServiceImpl<CameraMapper, Camera> {
+
+    private final Logger logger = LoggerFactory.getLogger(CameraServiceImpl.class);
+
+    @Autowired
+    private CameraFlowServiceImpl flowService;
+
+    @Autowired
+    private FFmpegServiceImpl ffmpegService;
+
+    @Autowired
+    private CameraFileServiceImpl cameraFileService;
+
+    @Autowired
+    private HikCameraManager hikCameraManager;
+
+    @Resource
+    private CameraProperties cameraProperties;
+
+    public void add(Camera camera) {
+        save(camera);
+    }
+
+
+    public void edit(Camera camera) {
+        updateById(camera);
+    }
+
+    @CameraLogin
+    public ResultDTO getChannel(CameraDTO cameraDTO) {
+        ResultDTO resultDTO = new ResultDTO();
+        StringBuilder str = new StringBuilder();
+        for (int i = 0; i < cameraDTO.getChannelList().size(); i++) {
+            if (i == cameraDTO.getChannelList().size() - 1) {
+                str.append(cameraDTO.getChannelList().get(i));
+            } else {
+                str.append(cameraDTO.getChannelList().get(i)).append("&");
+            }
+        }
+        resultDTO.setMsg(str.toString());
+        System.out.println(cameraProperties);
+        return resultDTO;
+    }
+
+    /**
+     * 开始推流(rtsp->rtmp)
+     *
+     * @param cameraDTO 相机信息
+     * @return ResultDTO
+     */
+    @CameraLogin
+    public ResultDTO startTranscode(CameraDTO cameraDTO) {
+        ResultDTO resultDTO = new ResultDTO();
+        if (ObjectUtils.isEmpty(cameraDTO)) {
+            resultDTO.setMsg("未找到设备");
+            return resultDTO;
+        }
+
+        String appName = cameraDTO.getAccount() + cameraDTO.getIp().replace(".", "");
+
+//            if (channelNumber == -1) {
+//                logger.info("实时流-未搜索到ip:" + cameraDTO.getIp() + ", ipc:" + cameraDTO.getIpcAddress() + " 的设备");
+//            }
+
+        String rtmpUrl = "rtmp://" + cameraProperties.getRtmp().getRtmphost() + "/live/" + appName; //rtmp链
+        String flvUrl = "http://" + cameraProperties.getRtmp().getHttphost() + "/live/" + appName + ".flv"; //http-flv链
+        String hlsUrl = "http://" + cameraProperties.getRtmp().getHttphost() + "/live/" + appName + "/hls.m3u8"; //hls链
+
+        boolean runFlag = ffmpegService.taskerIsRun(appName);
+        CameraFlow cameraFlow = flowService.findByRtmpUrl(rtmpUrl);
+        if (cameraFlow != null && !runFlag) {
+            flowService.removeById(cameraFlow.getId());
+        }
+
+        if (runFlag) {
+            //已推流
+            if (cameraFlow != null) {
+                resultDTO.setTaskName(appName);
+                resultDTO.setMsg(HikCameraUtils.resultNames[0]);
+                resultDTO.setRtmpUrl(rtmpUrl);
+                resultDTO.setFlvUrl(flvUrl);
+                resultDTO.setHlsUrl(hlsUrl);
+                cameraFlow.setClient(cameraFlow.getClient() + 1);
+                flowService.updateById(cameraFlow);
+            } else {
+                //停止推流
+                flowService.stopByTaskName(appName);
+                resultDTO.setMsg("推流失败");
+                return resultDTO;
+            }
+        } else {
+            //未推流
+            String channelNumberStr = cameraDTO.getChannelNumber() + "02"; //新通道(2012年之后设备,02代表子码流)
+
+            String rtspName = cameraDTO.getAccount() + ":" + cameraDTO.getPassword() + "@" + cameraDTO.getIp() + ":554/" + channelNumberStr + "?transportmode=unicast"; //新码流
+            String rtmpName = cameraProperties.getRtmp().getRtmphost() + "/live/"; //rtmp服务器推流入口
+
+            String tasker = ffmpegService.startTranscoding(appName, rtspName, rtmpName);
+            if (StringUtils.isNotEmpty(tasker)) {
+                resultDTO.setTaskName(tasker);
+                resultDTO.setMsg(HikCameraUtils.resultNames[0]);
+                resultDTO.setRtmpUrl(rtmpUrl);
+                resultDTO.setFlvUrl(flvUrl);
+                resultDTO.setHlsUrl(hlsUrl);
+
+                //添加流记录
+                cameraFlow = new CameraFlow();
+                cameraFlow.setCameraId(cameraDTO.getId());
+                cameraFlow.setTaskName(tasker);
+                cameraFlow.setFlowType(FlowUtils.FlowType.HIK.ordinal());
+                cameraFlow.setRtsp("rtsp://" + rtspName);
+                cameraFlow.setRtmp(rtmpUrl);
+                cameraFlow.setFlv(flvUrl);
+                cameraFlow.setClient(1);
+                cameraFlow.setCreateTime(new Date());
+                cameraFlow.setUpdateTime(new Date());
+                flowService.save(cameraFlow);
+            } else {
+                resultDTO.setMsg("推流失败");
+                return resultDTO;
+            }
+        }
+        return resultDTO;
+
+    }
+
+    /**
+     * 回放推流
+     *
+     * @param cameraDTO 相机信息
+     * @return ResultDTO
+     */
+    @CameraLogin(type = CameraLogin.Operation.BACK_STREAM)
+    public ResultDTO startBackTranscode(CameraDTO cameraDTO) {
+        ResultDTO resultDTO = new ResultDTO();
+
+        String startTime, endTime;
+
+        DateTimeFormatter sdf = DateTimeFormatter.ofPattern("yyyyMMdd't'HHmmss'z'");
+        if (cameraDTO.getHistoryDTO().getEndTime() != null) {
+            startTime = sdf.format(cameraDTO.getHistoryDTO().getStartTime());
+            endTime = sdf.format(cameraDTO.getHistoryDTO().getEndTime());
+        } else {
+            startTime = sdf.format(cameraDTO.getHistoryDTO().getStartTime());
+            endTime = null;
+        }
+        String appName;
+        if (cameraDTO.getType() == 1) {
+            //摄像机
+            appName = "history" + cameraDTO.getVcr().getAccount() + cameraDTO.getVcr().getIp().replace(".", "") + "to" + cameraDTO.getIp().replace(".", "") + "start" + startTime + "end" + endTime;
+        } else {
+            throw new OperateException("目前只支持录像机回放数据");
+            //NVR
+            //appName = "history" + cameraDTO.getAccount() + cameraDTO.getIp().replace(".", "") + "to" + cameraDTO.getIpcAddress().replace(".", "") + "start" + startTime + "end" + endTime;
+            //channelNumber = HikCameraUtils.getIpcChannel(cameraDTO.getChannelList(), cameraDTO.getIpcAddress());
+        }
+
+//        if (channelNumber == -1) {
+//            logger.info("历史流-未搜索到ip:" + cameraDTO.getIp() + ", ipc:" + cameraDTO.getIpcAddress() + " 的设备");
+//        }
+        String rtmpUrl = "rtmp://" + cameraProperties.getRtmp().getRtmphost() + "/live/" + appName; //rtmp链
+        String flvUrl = "http://" + cameraProperties.getRtmp().getHttphost() + "/live/" + appName + ".flv"; //http-flv链
+        String hlsUrl = "http://" + cameraProperties.getRtmp().getHttphost() + "/live/" + appName + "/hls.m3u8"; //hls链
+
+        boolean runFlag = ffmpegService.taskerIsRun(appName);
+        CameraFlow cameraFlow = flowService.findByRtmpUrl(rtmpUrl);
+        if (cameraFlow != null && !runFlag) {
+            flowService.removeById(cameraFlow.getId());
+        }
+
+        if (runFlag) {
+            //已推流
+            if (cameraFlow != null) {
+                resultDTO.setTaskName(appName);
+                resultDTO.setMsg(HikCameraUtils.resultNames[0]);
+                resultDTO.setRtmpUrl(rtmpUrl);
+                resultDTO.setFlvUrl(flvUrl);
+                resultDTO.setHlsUrl(hlsUrl);
+                cameraFlow.setClient(cameraFlow.getClient() + 1);
+                flowService.updateById(cameraFlow);
+            } else {
+                //停止推流
+                flowService.stopByTaskName(appName);
+                resultDTO.setMsg("推流失败");
+                return resultDTO;
+            }
+        } else {
+            //未推流
+            String channelNumberStr = cameraDTO.getChannelNumber() + "01"; //回放流只有主码流
+            String rtspName;
+            if (endTime != null) {
+                rtspName = cameraDTO.getVcr().getAccount() + ":" + cameraDTO.getVcr().getPassword() + "@" + cameraDTO.getVcr().getIp() + ":554/Streaming/tracks/" + channelNumberStr + "?starttime=" + startTime + "&endtime=" + endTime;
+            } else {
+                rtspName = cameraDTO.getVcr().getAccount() + ":" + cameraDTO.getVcr().getPassword() + "@" + cameraDTO.getVcr().getIp() + ":554/Streaming/tracks/" + channelNumberStr + "?starttime=" + startTime;
+            }
+            String rtmpName = cameraProperties.getRtmp().getRtmphost() + "/live/"; //rtmp服务器推流入口
+
+            String tasker = ffmpegService.startTranscoding(appName, rtspName, rtmpName);
+            if (StringUtils.isNotEmpty(tasker)) {
+                resultDTO.setTaskName(tasker);
+                resultDTO.setMsg(HikCameraUtils.resultNames[0]);
+                resultDTO.setRtmpUrl(rtmpUrl);
+                resultDTO.setFlvUrl(flvUrl);
+                resultDTO.setHlsUrl(hlsUrl);
+
+                //添加流记录
+                cameraFlow = new CameraFlow();
+                cameraFlow.setCameraId(cameraDTO.getId());
+//                    if (cameraDTO.getType() == 0) {
+//                        cameraFlow.setCameraIpc(cameraDTO.getIp());
+//                    } else {
+//                        cameraFlow.setCameraIpc(cameraDTO.getIpcAddress());
+//                    }
+                cameraFlow.setTaskName(tasker);
+                cameraFlow.setFlowType(FlowUtils.FlowType.HIK.ordinal());
+                cameraFlow.setRtsp("rtsp://" + rtspName);
+                cameraFlow.setRtmp(rtmpUrl);
+                cameraFlow.setFlv(flvUrl);
+                cameraFlow.setHls(hlsUrl);
+                cameraFlow.setClient(1);
+                cameraFlow.setCreateTime(new Date());
+                cameraFlow.setUpdateTime(new Date());
+                flowService.save(cameraFlow);
+            } else {
+                resultDTO.setMsg("推流失败");
+                return resultDTO;
+            }
+        }
+        return resultDTO;
+    }
+
+    /**
+     * 抓图
+     *
+     * @param cameraDTO 相机信息
+     */
+    @CameraLogin(type = CameraLogin.Operation.CATCH_PICTURE)
+    public ResultDTO catchPic(CameraDTO cameraDTO) {
+        ResultDTO resultDTO = new ResultDTO();
+        if (ObjectUtils.isEmpty(cameraDTO)) {
+            resultDTO.setMsg("未找到设备");
+            return resultDTO;
+        }
+
+        String pathName;
+        if (cameraDTO.getType() == 1) {
+            //摄像机
+            pathName = cameraDTO.getIp().replace(".", "");
+        } else {
+            //NVR
+            resultDTO.setMsg("NVR设备不支持抓图");
+            return resultDTO;
+        }
+
+        HCNetTools hcTool = cameraDTO.getHcTool();
+        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
+        String name = dtf.format(LocalDateTime.now()) + ".jpg";
+        String path = "/picture/" + pathName + "/";
+        String filePath = cameraProperties.getFilepath() + path + name;
+        cameraFileService.pathCreator(cameraProperties.getFilepath() + path);
+        CameraFile cameraFile = cameraFileService.saveFileInfo(name, path, 0L, "1");
+        boolean success = hcTool.getDVRPic(cameraDTO.getChannelNumber(), filePath);
+        cameraFile.setUpdateTime(new Date());
+        long size = new File(filePath).length();
+        if (success && size > 0) {
+            resultDTO.setMsg(UrlUtils.toAbsoluteUrl(path + name));
+            cameraFile.setStatus("1");
+        } else {
+            cameraFile.setStatus("2");
+        }
+        cameraFileService.updateById(cameraFile);
+        return resultDTO;
+    }
+
+    /**
+     * 视频回放下载
+     *
+     * @param cameraDTO
+     */
+    @CameraLogin(type = CameraLogin.Operation.VIDEO_DOWNLOAD)
+    public ResultDTO downloadBack(CameraDTO cameraDTO) {
+        ResultDTO resultDTO = new ResultDTO();
+        String pathName;
+        if (cameraDTO.getType() == 1) {
+            //摄像机
+            pathName = cameraDTO.getIp().replace(".", "");
+        } else {
+            //NVR
+            throw new OperateException("不支持视频回放下载");
+        }
+
+        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
+        String name = dtf.format(cameraDTO.getHistoryDTO().getStartTime()) + "TO" + dtf.format(cameraDTO.getHistoryDTO().getEndTime()) + ".mp4";
+        String path = "/video/" + pathName + "/";
+        cameraFileService.pathCreator(cameraProperties.getFilepath() + path);
+        Integer fileId = cameraFileService.findByPathAndName(path, name);
+        if (fileId > 0) {
+            resultDTO.setMsg(fileId.toString());
+            return resultDTO;
+        }
+        hikCameraManager.downloadVideoAsync(cameraDTO, path, name, cameraDTO.getChannelNumber() + 32);
+        resultDTO.setMsg(UrlUtils.toAbsoluteUrl(path + name));
+        return resultDTO;
+    }
+
+
+    /**
+     * 获取视频列表
+     *
+     * @param cameraDTO
+     * @return
+     */
+    @CameraLogin(type = CameraLogin.Operation.VIDEO_DOWNLOAD)
+    public ResultDTO getVideoFileList(CameraDTO cameraDTO) {
+        ResultDTO resultDTO = new ResultDTO();
+
+        if (cameraDTO != null) {
+//            int channelNumber = 1;
+//            if (cameraDTO.getType() == 1) {
+//                //摄像机
+//                channelNumber = HikCameraUtils.analyzeChannel(cameraDTO.getChannelList().get(0));
+//            } else {
+//                //NVR
+//                channelNumber = HikCameraUtils.getIpcChannel(cameraDTO.getChannelList(), cameraDTO.getIpcAddress());
+//                channelNumber = channelNumber + 32; //远程录像的通道号从33开始
+//            }
+            HCNetTools hcTool = cameraDTO.getHcTool();
+            List<HashMap<String, String>> map = hcTool.getVideoFileList(cameraDTO.getHistoryDTO().getStartTime(), cameraDTO.getHistoryDTO().getEndTime(), cameraDTO.getChannelNumber() + 32);
+            resultDTO.setMsg(map);
+            return resultDTO;
+        } else {
+            resultDTO.setMsg("未找到设备");
+            return resultDTO;
+        }
+    }
+
+    /**
+     * 停止推流
+     *
+     * @param id 相机id
+     */
+    public Boolean stopRtmp(Long id) {
+        if (id == null) {
+            return true;
+        }
+        CameraFlow camera = flowService.getById(id);
+        if (camera != null) {
+            return ffmpegService.stopTranscoding(camera.getTaskName());
+        } else {
+            return true;
+        }
+    }
+
+}

+ 0 - 49
taphole-camera/src/main/java/com.sckj.camera/service/DeviceServiceImpl.java

@@ -1,49 +0,0 @@
-package com.sckj.camera.service;
-
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.sckj.camera.model.entity.Camera;
-import com.sckj.camera.model.mapper.CameraMapper;
-import org.apache.commons.lang3.ObjectUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-@Service
-@Transactional
-public class DeviceServiceImpl extends ServiceImpl<CameraMapper, Camera> {
-
-//    public Camera findPage(String type) {
-//        Map<String,Object> map = new HashMap<>();
-//
-//        if (StringUtils.isNotBlank((type))) {
-//            map.put("type",type);
-//        }else{
-//            map.put("type",0);
-//        }
-//        List<Camera> cameras = baseMapper.selectByMap(map);
-//        if(ObjectUtils.isNotEmpty(cameras)){
-//            return cameras.get(0);
-//        }
-//        return null;
-//    }
-
-
-
-    public void updateCamera(Camera camera) {
-        if (camera.getCameraId() != null) {
-            //更新相机设备信息
-            updateById(camera);
-        } else {
-            //添加相机设备信息
-            camera.setCreateTime(new Date());
-            save(camera);
-        }
-    }
-
-
-}

+ 40 - 15
taphole-camera/src/main/java/com.sckj.camera/service/FFmpegServiceImpl.java

@@ -4,6 +4,7 @@ import cc.eguid.FFmpegCommandManager.FFmpegManager;
 import cc.eguid.FFmpegCommandManager.FFmpegManagerImpl;
 import org.springframework.stereotype.Service;
 
+import javax.annotation.PostConstruct;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -12,6 +13,11 @@ public class FFmpegServiceImpl {
 
     private FFmpegManager manager;
 
+    @PostConstruct
+    public void init() {
+        manager = new FFmpegManagerImpl();
+    }
+
     /**
      * 开始推流
      * @param appName 进程名称,为相机ip去"."
@@ -20,25 +26,11 @@ public class FFmpegServiceImpl {
      * @return String
      */
     public String startTranscoding(String appName, String rtspName, String rtmpName)  {
-        if(manager == null){
-            manager = new FFmpegManagerImpl();
-        }
         if(taskerIsRun(appName)) {
             return appName; //如果进程存在,则直接返回进程名
         }
-        Map<String, String> map = new HashMap<>();
-
-        map.put("appName", appName); //进程名
-        map.put("input", "rtsp://" + rtspName);
-        map.put("output", "rtmp://" + rtmpName);
-        map.put("codec", "h264");
-        map.put("fmt", "flv");
-        map.put("fps", "24");
-        map.put("rs", "720x480");
-        map.put("twoPart", "1");
         // 执行任务,id就是appName,如果执行失败返回为null
-        String start = manager.start(appName,"ffmpeg -allowed_media_types video -rtsp_transport tcp -i rtsp://" + rtspName + " -c:v libx264 -f flv -r 24 -g 24 -s 720x480 rtmp://" + rtmpName + appName);
-        //String start = com.github.cbyzzy.manager.start(map);
+        String start = manager.start(appName,"ffmpeg -i rtsp://" + rtspName + " -c copy -f flv rtmp://" + rtmpName + appName);
         return start;
     }
 
@@ -75,4 +67,37 @@ public class FFmpegServiceImpl {
         return (manager.queryAll().size()>0 && manager.query(appName) != null);
     }
 
+
+    /**
+     * 下载是屁
+     * @param appName 进程名称,为相机ip去"."
+     * @param rtspName rtsp流
+     * @param videoPath 文件路径
+     * @return String
+     */
+    public String downloadVideo(String appName, String rtspName, String videoPath)  {
+        if(taskerIsRun(appName)) {
+            return appName; //如果进程存在,则直接返回进程名
+        }
+        // 执行任务,id就是appName,如果执行失败返回为null
+        String start = manager.start(appName,"ffmpeg -i rtsp://" + rtspName + " " + videoPath);
+        return start;
+    }
+
+    /**
+     * 抓图
+     * @param appName 进程名称,为相机ip去"."
+     * @param rtspName rtsp流
+     * @param picPath 文件路径
+     * @return String
+     */
+    public String catchPicture(String appName, String rtspName, String picPath)  {
+        if(taskerIsRun(appName)) {
+            return appName; //如果进程存在,则直接返回进程名
+        }
+        // 执行任务,id就是appName,如果执行失败返回为null
+        String start = manager.start(appName,"ffmpeg -i rtsp://" + rtspName + " -frames:v 1 -f image2 " + picPath);
+        return start;
+    }
+
 }  

+ 0 - 434
taphole-camera/src/main/java/com.sckj.camera/service/HikCameraServiceImpl.java

@@ -1,434 +0,0 @@
-package com.sckj.camera.service;
-
-import com.sckj.camera.common.FlowUtils;
-import com.sckj.camera.common.HikCameraUtils;
-import com.sckj.camera.manager.HikCameraManager;
-import com.sckj.camera.model.dto.CameraDTO;
-import com.sckj.camera.model.dto.ResultDTO;
-import com.sckj.camera.model.entity.Camera;
-import com.sckj.camera.model.entity.CameraFile;
-import com.sckj.camera.model.entity.CameraFlow;
-import com.sckj.camera.hik.HCNetTools;
-import org.apache.commons.lang3.ObjectUtils;
-import org.apache.commons.lang3.StringUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.BeanUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Service;
-
-import java.io.File;
-import java.time.LocalDateTime;
-import java.time.format.DateTimeFormatter;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-
-@Service
-public class HikCameraServiceImpl {
-
-    private final Logger logger = LoggerFactory.getLogger(HikCameraServiceImpl.class);
-
-    @Autowired
-    private DeviceServiceImpl deviceService;
-
-    @Autowired
-    private FlowServiceImpl flowService;
-
-    @Autowired
-    private FFmpegServiceImpl ffmpegService;
-
-    @Autowired
-    private CameraFileServiceImpl cameraFileService;
-
-    @Autowired
-    private HikCameraManager hikCameraManager;
-
-
-    @Value("${app.filepath}")
-    private String rootPath;
-
-    @Value("${rtmp.rtmphost}")
-    private String rtmpServer;
-
-    @Value("${rtmp.httphost}")
-    private String httpServer;
-
-    public ResultDTO getChannel(CameraDTO cameraDTO) {
-        ResultDTO resultDTO = new ResultDTO();
-        StringBuilder str = new StringBuilder();
-        for (int i = 0;i < cameraDTO.getChannelList().size();i++) {
-            if (i == cameraDTO.getChannelList().size() - 1) {
-                str.append(cameraDTO.getChannelList().get(i));
-            } else {
-                str.append(cameraDTO.getChannelList().get(i)).append("&");
-            }
-        }
-        resultDTO.setMsg(str.toString());
-        return resultDTO;
-    }
-
-    /**
-     * 开始推流(rtsp->rtmp)
-     * @param cameraDTO 相机信息
-     * @return ResultDTO
-     */
-    public ResultDTO startTranscode(CameraDTO cameraDTO) {
-        ResultDTO resultDTO = new ResultDTO();
-        Camera camera = deviceService.getById(cameraDTO.getCameraId());
-        if(ObjectUtils.isNotEmpty(camera)){
-            BeanUtils.copyProperties(camera,cameraDTO);
-        }
-        cameraDTO.setChannelList(Arrays.asList("1"));
-
-        if (cameraDTO != null) {
-            String appName;
-            int channelNumber;
-            if (cameraDTO.getType() == 0) {
-                //摄像机
-                appName = cameraDTO.getAccount() + cameraDTO.getIp().replace(".","");
-                channelNumber = HikCameraUtils.analyzeChannel(cameraDTO.getChannelList().get(0));
-            } else {
-                //NVR
-                appName = cameraDTO.getAccount() + cameraDTO.getIp().replace(".","") + "to" + cameraDTO.getIpcAddress().replace(".","");
-                channelNumber = HikCameraUtils.getIpcChannel(cameraDTO.getChannelList(),cameraDTO.getIpcAddress());
-            }
-            if (channelNumber == -1) {
-                logger.info("实时流-未搜索到ip:" + cameraDTO.getIp() + ", ipc:" + cameraDTO.getIpcAddress() + " 的设备");
-            }
-
-            String rtmpUrl = "rtmp://"+ rtmpServer + "/live/" + appName; //rtmp链
-            String flvUrl = "http://" + httpServer + "/live/" + appName + ".flv"; //http-flv链
-
-            boolean runFlag = ffmpegService.taskerIsRun(appName);
-            CameraFlow cameraFlow = flowService.findByRtmpUrl(rtmpUrl);
-            if (cameraFlow != null && !runFlag) {
-                flowService.removeById(cameraFlow.getId());
-            }
-
-            if (runFlag) {
-                //已推流
-                if (cameraFlow != null) {
-                    resultDTO.setTasker(appName);
-                    resultDTO.setMsg(HikCameraUtils.resultNames[0]);
-                    resultDTO.setRtmpUrl(rtmpUrl);
-                    resultDTO.setFlvUrl(flvUrl);
-                    cameraFlow.setClient(cameraFlow.getClient() + 1);
-                    flowService.updateById(cameraFlow);
-                } else {
-                    //停止推流
-                    flowService.stopByTasker(appName);
-                    resultDTO.setMsg("推流失败");
-                    return resultDTO;
-                }
-            } else {
-                //未推流
-                //String channelNumberStr = "ch"+channelNumber; //旧通道(2012年之前设备)
-                channelNumber = 1;
-                String channelNumberStr = channelNumber + "02"; //新通道(2012年之后设备,02代表子码流)
-
-                //String rtspName = cameraDTO.getAccount() + ":" + cameraDTO.getPassword() + "@" + cameraDTO.getIp() + ":554/Streaming/Channels/" + channelNumberStr + "/sub/av_stream"); //旧码流(子码流)
-                String rtspName = cameraDTO.getAccount() + ":" + cameraDTO.getPassword() + "@" + cameraDTO.getIp() + ":554/Streaming/Channels/" + channelNumberStr + "?transportmode=unicast"; //新码流
-                String rtmpName = rtmpServer + "/live/"; //rtmp服务器推流入口
-
-                String tasker= ffmpegService.startTranscoding(appName,rtspName,rtmpName);
-                if (StringUtils.isNotEmpty(tasker)) {
-                    resultDTO.setTasker(tasker);
-                    resultDTO.setMsg(HikCameraUtils.resultNames[0]);
-                    resultDTO.setRtmpUrl(rtmpUrl);
-                    resultDTO.setFlvUrl(flvUrl);
-
-                    //添加流记录
-                    cameraFlow = new CameraFlow();
-                    cameraFlow.setCameraId(cameraDTO.getCameraId());
-                    if (cameraDTO.getType() == 0) {
-                        cameraFlow.setCameraIpc(cameraDTO.getIp());
-                    } else {
-                        cameraFlow.setCameraIpc(cameraDTO.getIpcAddress());
-                    }
-                    cameraFlow.setTasker(tasker);
-                    cameraFlow.setFlowType(FlowUtils.FlowType.HIK.ordinal());
-                    cameraFlow.setRtsp("rtsp://" + rtspName);
-                    cameraFlow.setRtmp(rtmpUrl);
-                    cameraFlow.setFlv(flvUrl);
-                    cameraFlow.setClient(1);
-                    cameraFlow.setCreateTime(new Date());
-                    cameraFlow.setUpdateTime(new Date());
-                    flowService.save(cameraFlow);
-                } else {
-                    resultDTO.setMsg("推流失败");
-                    return resultDTO;
-                }
-            }
-            return resultDTO;
-        } else {
-            resultDTO.setMsg("未找到设备");
-            return resultDTO;
-        }
-    }
-
-    /**
-     * 回放推流
-     * @param cameraDTO 相机信息
-     * @return ResultDTO
-     */
-    public ResultDTO startBackTranscode(CameraDTO cameraDTO) {
-        ResultDTO resultDTO = new ResultDTO();
-
-        if (cameraDTO != null) {
-
-            String startTime,endTime;
-
-            DateTimeFormatter sdf = DateTimeFormatter.ofPattern("yyyyMMdd't'HHmmss'z'");
-            if (cameraDTO.getHistoryDTO().getEndTime() != null) {
-                startTime = sdf.format(cameraDTO.getHistoryDTO().getStartTime());
-                endTime = sdf.format(cameraDTO.getHistoryDTO().getEndTime());
-            } else {
-                startTime = sdf.format(cameraDTO.getHistoryDTO().getStartTime());
-                endTime = null;
-            }
-
-            String appName;
-            int channelNumber;
-            if (cameraDTO.getType() == 0) {
-                //摄像机
-                appName = "history" + cameraDTO.getAccount() + cameraDTO.getIp().replace(".", "") + "start" + startTime + "end" + endTime;
-                channelNumber = HikCameraUtils.analyzeChannel(cameraDTO.getChannelList().get(0));
-            } else {
-                //NVR
-                appName = "history" + cameraDTO.getAccount() + cameraDTO.getIp().replace(".", "") + "to" + cameraDTO.getIpcAddress().replace(".", "") + "start" + startTime + "end" + endTime;
-                channelNumber = HikCameraUtils.getIpcChannel(cameraDTO.getChannelList(), cameraDTO.getIpcAddress());
-            }
-
-            if (channelNumber == -1) {
-                logger.info("历史流-未搜索到ip:" + cameraDTO.getIp() + ", ipc:" + cameraDTO.getIpcAddress() + " 的设备");
-            }
-            String rtmpUrl = "rtmp://"+ rtmpServer + "/live/" + appName; //rtmp链
-            String flvUrl = "http://" + httpServer + "/live/" + appName + ".flv"; //http-flv链
-
-            boolean runFlag = ffmpegService.taskerIsRun(appName);
-            CameraFlow cameraFlow = flowService.findByRtmpUrl(rtmpUrl);
-            if (cameraFlow != null && !runFlag) {
-                flowService.removeById(cameraFlow.getId());
-            }
-
-            if (runFlag) {
-                //已推流
-                if (cameraFlow != null) {
-                    resultDTO.setTasker(appName);
-                    resultDTO.setMsg(HikCameraUtils.resultNames[0]);
-                    resultDTO.setRtmpUrl(rtmpUrl);
-                    resultDTO.setFlvUrl(flvUrl);
-                    cameraFlow.setClient(cameraFlow.getClient() + 1);
-                    flowService.updateById(cameraFlow);
-                } else {
-                    //停止推流
-                    flowService.stopByTasker(appName);
-                    resultDTO.setMsg("推流失败");
-                    return resultDTO;
-                }
-            } else {
-                //未推流
-                String channelNumberStr = channelNumber + "01"; //回放流只有主码流
-                String rtspName;
-                if (endTime != null) {
-                    rtspName = cameraDTO.getAccount() + ":" + cameraDTO.getPassword() + "@" + cameraDTO.getIp() + ":554/Streaming/tracks/" + channelNumberStr + "?starttime=" + startTime + "&endtime=" + endTime;
-                } else {
-                    rtspName = cameraDTO.getAccount() + ":" + cameraDTO.getPassword() + "@" + cameraDTO.getIp() + ":554/Streaming/tracks/" + channelNumberStr + "?starttime=" + startTime;
-                }
-                String rtmpName = rtmpServer + "/live/"; //rtmp服务器推流入口
-
-                String tasker= ffmpegService.startTranscoding(appName,rtspName,rtmpName);
-                if (StringUtils.isNotEmpty(tasker)) {
-                    resultDTO.setTasker(tasker);
-                    resultDTO.setMsg(HikCameraUtils.resultNames[0]);
-                    resultDTO.setRtmpUrl(rtmpUrl);
-                    resultDTO.setFlvUrl(flvUrl);
-
-                    //添加流记录
-                    cameraFlow = new CameraFlow();
-                    cameraFlow.setCameraId(cameraDTO.getCameraId());
-                    if (cameraDTO.getType() == 0) {
-                        cameraFlow.setCameraIpc(cameraDTO.getIp());
-                    } else {
-                        cameraFlow.setCameraIpc(cameraDTO.getIpcAddress());
-                    }
-                    cameraFlow.setTasker(tasker);
-                    cameraFlow.setFlowType(FlowUtils.FlowType.HIK.ordinal());
-                    cameraFlow.setRtsp("rtsp://" + rtspName);
-                    cameraFlow.setRtmp(rtmpUrl);
-                    cameraFlow.setFlv(flvUrl);
-                    cameraFlow.setClient(1);
-                    cameraFlow.setCreateTime(new Date());
-                    cameraFlow.setUpdateTime(new Date());
-                    flowService.save(cameraFlow);
-                } else {
-                    resultDTO.setMsg("推流失败");
-                    return resultDTO;
-                }
-            }
-            return resultDTO;
-        } else {
-            resultDTO.setMsg("未找到设备");
-            return resultDTO;
-        }
-    }
-
-    /**
-     * 抓图
-    * @param cameraDTO 相机信息
-     */
-    public ResultDTO catchPic(CameraDTO cameraDTO) {
-        ResultDTO resultDTO = new ResultDTO();
-
-        if (cameraDTO != null) {
-
-            String pathName;
-            int channelNumber;
-            if (cameraDTO.getType() == 0) {
-                //摄像机
-                pathName = cameraDTO.getIp().replace(".", "");
-                channelNumber = HikCameraUtils.analyzeChannel(cameraDTO.getChannelList().get(0));
-            } else {
-                //NVR
-                resultDTO.setMsg("NVR设备不支持抓图");
-                return resultDTO;
-            }
-
-            HCNetTools hcTool = cameraDTO.getHcTool();
-            DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
-            String name = dtf.format(LocalDateTime.now()) + ".jpg";
-            String path = "/picture/" + pathName + "/";
-            String filePath = rootPath + path + name;
-            cameraFileService.pathCreator(rootPath + path);
-            boolean success = hcTool.getDVRPic(channelNumber,filePath);
-
-            if (success) {
-                long size = new File(filePath).length();
-                CameraFile cameraFile = cameraFileService.saveFileInfo(name,path,size);
-                resultDTO.setMsg(cameraFile.getId().toString());
-            }
-            return resultDTO;
-        } else {
-            resultDTO.setMsg("未找到设备");
-            return resultDTO;
-        }
-    }
-
-    /**
-     * 视频回放下载
-     * @param cameraDTO
-     */
-    public ResultDTO downloadBack(CameraDTO cameraDTO) {
-        ResultDTO resultDTO = new ResultDTO();
-
-        if (cameraDTO != null) {
-
-            String pathName;
-            int channelNumber;
-            if (cameraDTO.getType() == 0) {
-                //摄像机
-                pathName = cameraDTO.getIp().replace(".", "");
-                channelNumber = HikCameraUtils.analyzeChannel(cameraDTO.getChannelList().get(0));
-            } else {
-                //NVR
-                pathName = cameraDTO.getIpcAddress().replace(".", "");
-                channelNumber = HikCameraUtils.getIpcChannel(cameraDTO.getChannelList(), cameraDTO.getIpcAddress());
-                channelNumber = channelNumber + 32; //远程下载的通道号从32开始
-            }
-
-            DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
-            String name = dtf.format(cameraDTO.getHistoryDTO().getStartTime()) + "TO" + dtf.format(cameraDTO.getHistoryDTO().getEndTime()) + ".mp4";
-            String path = "/video/" + pathName + "/";
-            cameraFileService.pathCreator(rootPath + path);
-            Integer fileId = cameraFileService.findByPathAndName(path,name);
-            if (fileId > 0) {
-                resultDTO.setMsg(fileId.toString());
-                return resultDTO;
-            }
-            hikCameraManager.downloadVideoAsync(cameraDTO,path,name,channelNumber);
-            resultDTO.setMsg("Async");
-            return resultDTO;
-        } else {
-            resultDTO.setMsg("未找到设备");
-            return resultDTO;
-        }
-    }
-
-    /**
-     * 获取视频列表
-     * @param cameraDTO
-     * @return
-     */
-    public ResultDTO getVideoFileList(CameraDTO cameraDTO) {
-        ResultDTO resultDTO = new ResultDTO();
-
-        if (cameraDTO != null) {
-            int channelNumber;
-            if (cameraDTO.getType() == 0) {
-                //摄像机
-                channelNumber = HikCameraUtils.analyzeChannel(cameraDTO.getChannelList().get(0));
-            } else {
-                //NVR
-                channelNumber = HikCameraUtils.getIpcChannel(cameraDTO.getChannelList(), cameraDTO.getIpcAddress());
-                channelNumber = channelNumber + 32; //远程录像的通道号从33开始
-            }
-            HCNetTools hcTool = cameraDTO.getHcTool();
-            List<HashMap<String, String>> map = hcTool.getVideoFileList(cameraDTO.getHistoryDTO().getStartTime(),cameraDTO.getHistoryDTO().getEndTime(),channelNumber);
-            resultDTO.setMsg(map);
-            return resultDTO;
-        } else {
-            resultDTO.setMsg("未找到设备");
-            return resultDTO;
-        }
-    }
-
-    /**
-     * 云台控制
-     * @param cameraDTO 相机信息
-     */
-    public ResultDTO playControl(CameraDTO cameraDTO) {
-        ResultDTO resultDTO = new ResultDTO();
-
-        if (cameraDTO != null) {
-
-            int channelNumber;
-            if (cameraDTO.getType() == 0) {
-                //摄像机
-                channelNumber = HikCameraUtils.analyzeChannel(cameraDTO.getChannelList().get(0));
-            } else {
-                //NVR
-                resultDTO.setMsg("NVR设备不支持云台控制");
-                return resultDTO;
-            }
-            hikCameraManager.playControlAsync(cameraDTO,channelNumber);
-            resultDTO.setMsg("Async");
-            return resultDTO;
-        } else {
-            resultDTO.setMsg("未找到设备");
-            return resultDTO;
-        }
-    }
-
-    /**
-     * 停止推流
-     * @param id 相机id
-     */
-    public Boolean stopRtmp(Integer id) {
-        if (id == null) {
-            return true;
-        }
-
-        Camera camera = deviceService.getById(id);
-
-        if (camera != null) {
-            String appName = camera.getAccount() + camera.getIp().replace(".","");
-            return ffmpegService.stopTranscoding(appName);
-        } else {
-            return true;
-        }
-    }
-
-}

+ 1 - 1
taphole-camera/src/main/java/com.sckj.camera/common/FlowUtils.java → taphole-camera/src/main/java/com.sckj.camera/util/FlowUtils.java

@@ -1,4 +1,4 @@
-package com.sckj.camera.common;
+package com.sckj.camera.util;
 
 public class FlowUtils {
     public enum FlowType {

+ 7 - 1
taphole-camera/src/main/java/com.sckj.camera/common/HikCameraUtils.java → taphole-camera/src/main/java/com.sckj.camera/util/HikCameraUtils.java

@@ -1,4 +1,4 @@
-package com.sckj.camera.common;
+package com.sckj.camera.util;
 
 import org.apache.commons.lang3.StringUtils;
 
@@ -29,6 +29,12 @@ public class HikCameraUtils {
         return iChannelNum;
     }
 
+    /***
+     * 根据IP获取通道号
+     * @param channelList
+     * @param ipcAddress
+     * @return
+     */
     public static int getIpcChannel(List<String> channelList, String ipcAddress) {
         int iChannelNum = -1;
         for(String channel:channelList) {

+ 1 - 11
taphole-camera/src/main/resources/mapper/CameraFileMapper.xml

@@ -1,15 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.sckj.camera.model.mapper.CameraFileMapper">
-  <resultMap id="BaseResultMap" type="com.sckj.camera.model.entity.CameraFile">
-    <!--
-      WARNING - @mbg.generated
-    -->
-    <id column="id" jdbcType="INTEGER" property="id" />
-    <result column="file_name" jdbcType="VARCHAR" property="fileName" />
-    <result column="file_path" jdbcType="VARCHAR" property="filePath" />
-    <result column="file_size" jdbcType="BIGINT" property="fileSize" />
-    <result column="file_alias" jdbcType="VARCHAR" property="fileAlias" />
-    <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
-  </resultMap>
+
 </mapper>

+ 1 - 20
taphole-camera/src/main/resources/mapper/CameraFlowMapper.xml

@@ -1,24 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.sckj.camera.model.mapper.CameraFlowMapper">
-  <resultMap id="BaseResultMap" type="com.sckj.camera.model.entity.CameraFlow">
-    <!--
-      WARNING - @mbg.generated
-    -->
-    <id column="id" jdbcType="INTEGER" property="id" />
-    <result column="camera_id" jdbcType="INTEGER" property="cameraId" />
-    <result column="camera_ipc" jdbcType="VARCHAR" property="cameraIpc" />
-    <result column="tasker" jdbcType="VARCHAR" property="tasker" />
-    <result column="flow_type" jdbcType="INTEGER" property="flowType" />
-    <result column="rtsp" jdbcType="VARCHAR" property="rtsp" />
-    <result column="rtmp" jdbcType="VARCHAR" property="rtmp" />
-    <result column="flv" jdbcType="VARCHAR" property="flv" />
-    <result column="ws_flv" jdbcType="VARCHAR" property="wsFlv" />
-    <result column="hls" jdbcType="VARCHAR" property="hls" />
-    <result column="client" jdbcType="INTEGER" property="client" />
-    <result column="flow_record" jdbcType="INTEGER" property="flowRecord" />
-    <result column="record" jdbcType="VARCHAR" property="record" />
-    <result column="update_time" jdbcType="TIMESTAMP" property="updateTime" />
-    <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
-  </resultMap>
+
 </mapper>

+ 1 - 18
taphole-camera/src/main/resources/mapper/CameraMapper.xml

@@ -1,22 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.sckj.camera.model.mapper.CameraMapper">
-  <resultMap id="BaseResultMap" type="com.sckj.camera.model.entity.Camera">
-    <!--
-      WARNING - @mbg.generated
-    -->
-    <id column="id" jdbcType="INTEGER" property="id" />
-    <result column="no" jdbcType="VARCHAR" property="no" />
-    <result column="type" jdbcType="INTEGER" property="type" />
-    <result column="belong_nvr_id" jdbcType="INTEGER" property="belongNvrId" />
-    <result column="account" jdbcType="VARCHAR" property="account" />
-    <result column="password" jdbcType="VARCHAR" property="password" />
-    <result column="ip" jdbcType="VARCHAR" property="ip" />
-    <result column="port" jdbcType="VARCHAR" property="port" />
-    <result column="name" jdbcType="VARCHAR" property="name" />
-    <result column="ptz_control" jdbcType="TINYINT" property="ptzControl" />
-    <result column="enable" jdbcType="TINYINT" property="enable" />
-    <result column="tester_id" jdbcType="VARCHAR" property="testerId" />
-    <result column="create_time" jdbcType="TIMESTAMP" property="createTime" />
-  </resultMap>
+
 </mapper>

+ 25 - 0
taphole-common/pom.xml

@@ -226,6 +226,31 @@
             <artifactId>netty-socketio</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>org.aspectj</groupId>
+            <artifactId>aspectjweaver</artifactId>
+        </dependency>
+
+        <!-- https://mvnrepository.com/artifact/net.java.dev.jna/jna -->
+        <dependency>
+            <groupId>net.java.dev.jna</groupId>
+            <artifactId>jna</artifactId>
+            <version>3.0.9</version>
+        </dependency>
+
+        <!-- 阿里数据库连接池 -->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid-spring-boot-starter</artifactId>
+        </dependency>
+
+        <!-- SaToken-Redis -->
+        <dependency>
+            <groupId>cn.dev33</groupId>
+            <artifactId>sa-token-dao-redis-jackson</artifactId>
+        </dependency>
+
+
     </dependencies>
 
 </project>

+ 36 - 0
taphole-common/src/main/java/com/sckj/common/aop/CameraLogin.java

@@ -0,0 +1,36 @@
+package com.sckj.common.aop;
+
+import java.lang.annotation.*;
+
+/**
+ * 摄像设备登录
+ */
+@Target({ ElementType.METHOD, ElementType.TYPE })
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+@Inherited
+public @interface CameraLogin {
+
+    enum Operation{
+       //   实时录像    回放录像    抓图        视频下载
+        REAL_STREAM,BACK_STREAM,CATCH_PICTURE,VIDEO_DOWNLOAD
+    }
+
+    /**
+     * 是否登录
+     *
+     * @return String
+     */
+    boolean loginCamera() default true;
+
+
+    /***
+     * 1 实时录像 RealStream
+     * 2 回放录像 BackStream
+     * 3 抓图
+     * 4 视频下载
+     * @return
+     */
+    Operation type() default Operation.REAL_STREAM;
+
+}

+ 123 - 0
taphole-common/src/main/java/com/sckj/common/entity/BaseEntity.java

@@ -0,0 +1,123 @@
+package com.sckj.common.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Entity基类
+ * 
+ * @author sckj
+ */
+public class BaseEntity implements Serializable
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 搜索值 */
+    @JsonIgnore
+    @TableField(exist = false)
+    private String searchValue;
+
+    /** 创建者 */
+    private String createBy;
+
+    /** 创建时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    /** 更新者 */
+    private String updateBy;
+
+    /** 更新时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
+    /** 备注 */
+    @TableField(exist = false)
+    private String remark;
+
+    /** 请求参数 */
+    @JsonInclude(JsonInclude.Include.NON_EMPTY)
+    @TableField(exist = false)
+    private Map<String, Object> params;
+
+    public String getSearchValue()
+    {
+        return searchValue;
+    }
+
+    public void setSearchValue(String searchValue)
+    {
+        this.searchValue = searchValue;
+    }
+
+    public String getCreateBy()
+    {
+        return createBy;
+    }
+
+    public void setCreateBy(String createBy)
+    {
+        this.createBy = createBy;
+    }
+
+    public Date getCreateTime()
+    {
+        return createTime;
+    }
+
+    public void setCreateTime(Date createTime)
+    {
+        this.createTime = createTime;
+    }
+
+    public String getUpdateBy()
+    {
+        return updateBy;
+    }
+
+    public void setUpdateBy(String updateBy)
+    {
+        this.updateBy = updateBy;
+    }
+
+    public Date getUpdateTime()
+    {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Date updateTime)
+    {
+        this.updateTime = updateTime;
+    }
+
+    public String getRemark()
+    {
+        return remark;
+    }
+
+    public void setRemark(String remark)
+    {
+        this.remark = remark;
+    }
+
+    public Map<String, Object> getParams()
+    {
+        if (params == null)
+        {
+            params = new HashMap<>();
+        }
+        return params;
+    }
+
+    public void setParams(Map<String, Object> params)
+    {
+        this.params = params;
+    }
+}

+ 2 - 0
taphole-generator/src/main/java/com/sckj/generator/controller/GenController.java

@@ -13,6 +13,7 @@ import com.sckj.generator.validate.PageParam;
 import com.sckj.generator.vo.DbColumnVo;
 import com.sckj.generator.vo.DbTableVo;
 import com.sckj.generator.vo.GenTableVo;
+import io.swagger.annotations.Api;
 import org.apache.commons.io.IOUtils;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
@@ -25,6 +26,7 @@ import java.util.Map;
 
 @RestController
 @RequestMapping("/api/gen")
+@Api(tags = "代码生成")
 public class GenController {
 
     @Resource