Quellcode durchsuchen

智能安防集成应用系统

hanzhengyi vor 3 Tagen
Ursprung
Commit
f078c4aa77
100 geänderte Dateien mit 5023 neuen und 0 gelöschten Zeilen
  1. 2 0
      pom.xml
  2. 21 0
      service-sas/pom.xml
  3. 28 0
      service-sas/service-sas-api/pom.xml
  4. 90 0
      service-sas/service-sas-biz/pom.xml
  5. 47 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/ServiceSasApplication.java
  6. 45 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/controller/web/SasActivationController.java
  7. 44 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/controller/web/SasAgboxConfigController.java
  8. 66 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/controller/web/SasAlarmGroupController.java
  9. 82 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/controller/web/SasDeviceController.java
  10. 78 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/controller/web/SasEventGroupController.java
  11. 39 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/controller/web/SasEventPriorityController.java
  12. 28 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/controller/web/SasHomepageController.java
  13. 60 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/controller/web/SasIntelligentController.java
  14. 90 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/controller/web/SasMapController.java
  15. 39 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/controller/web/SasMapNavigateController.java
  16. 44 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/controller/web/SasNetworkConfigController.java
  17. 128 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/controller/web/SasOneStandardSixRealitiesController.java
  18. 125 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/controller/web/SasPersonnelController.java
  19. 44 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/controller/web/SasSystemConfigController.java
  20. 79 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/controller/web/SasSystemController.java
  21. 35 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/controller/web/SasVideoPatrolController.java
  22. 42 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/controller/web/SasVideoStreamController.java
  23. 45 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/domain/SasAcquisitionEvent.java
  24. 48 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/domain/SasAlarsasEvent.java
  25. 27 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/domain/SasAlarsasGroupType.java
  26. 42 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/domain/SasBuilding.java
  27. 49 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/domain/SasCollectionEvent.java
  28. 65 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/domain/SasConfig.java
  29. 74 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/domain/SasDevice.java
  30. 58 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/domain/SasEntranceEvent.java
  31. 53 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/domain/SasEventTypeGroup.java
  32. 34 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/domain/SasFollowPerson.java
  33. 64 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/domain/SasHouse.java
  34. 57 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/domain/SasMapDevice.java
  35. 44 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/domain/SasMaps.java
  36. 62 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/domain/SasParkingEvent.java
  37. 58 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/domain/SasPatrolEvent.java
  38. 104 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/domain/SasPerson.java
  39. 64 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/domain/SasSnapEvent.java
  40. 73 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/domain/SasSystesasActivation.java
  41. 70 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/domain/SasSystesasConfig.java
  42. 65 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/domain/SasSystesasWlanConfig.java
  43. 34 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/domain/SasVersionAdmin.java
  44. 58 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/domain/SasVillage.java
  45. 8 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/mapper/SasAcquisitionEventMapper.java
  46. 8 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/mapper/SasAlarsasEventMapper.java
  47. 11 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/mapper/SasAlarsasGroupTypeMapper.java
  48. 11 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/mapper/SasBuildingMapper.java
  49. 8 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/mapper/SasCollectionEventMapper.java
  50. 11 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/mapper/SasConfigMapper.java
  51. 11 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/mapper/SasDeviceMapper.java
  52. 8 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/mapper/SasEntranceEventMapper.java
  53. 11 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/mapper/SasEventTypeGroupMapper.java
  54. 11 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/mapper/SasFollowPersonMapper.java
  55. 11 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/mapper/SasHouseMapper.java
  56. 8 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/mapper/SasMapDeviceMapper.java
  57. 8 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/mapper/SasMapsMapper.java
  58. 8 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/mapper/SasParkingEventMapper.java
  59. 8 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/mapper/SasPatrolEventMapper.java
  60. 11 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/mapper/SasPersonMapper.java
  61. 8 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/mapper/SasSnapEventMapper.java
  62. 11 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/mapper/SasSystesasActivationMapper.java
  63. 11 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/mapper/SasSystesasConfigMapper.java
  64. 11 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/mapper/SasSystesasWlanConfigMapper.java
  65. 11 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/mapper/SasVersionAdminMapper.java
  66. 11 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/mapper/SasVillageMapper.java
  67. 22 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/service/SasAlarsasGroupTypeService.java
  68. 21 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/service/SasConfigService.java
  69. 42 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/service/SasDeviceService.java
  70. 15 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/service/SasEventPriorityService.java
  71. 22 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/service/SasEventTypeGroupService.java
  72. 9 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/service/SasHomepageService.java
  73. 21 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/service/SasIntelligentService.java
  74. 12 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/service/SasMapNavigateService.java
  75. 24 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/service/SasMapService.java
  76. 76 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/service/SasOneStandardSixRealitiesService.java
  77. 73 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/service/SasPersonnelService.java
  78. 49 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/service/SasSystemService.java
  79. 24 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/service/SasSystesasActivationService.java
  80. 21 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/service/SasSystesasConfigService.java
  81. 21 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/service/SasSystesasWlanConfigService.java
  82. 15 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/service/SasVideoPatrolService.java
  83. 22 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/service/SasVideoStreamService.java
  84. 81 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/service/impl/SasAlarsasGroupTypeServiceImpl.java
  85. 47 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/service/impl/SasConfigServiceImpl.java
  86. 156 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/service/impl/SasDeviceServiceImpl.java
  87. 75 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/service/impl/SasEventPriorityServiceImpl.java
  88. 88 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/service/impl/SasEventTypeGroupServiceImpl.java
  89. 76 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/service/impl/SasHomepageServiceImpl.java
  90. 264 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/service/impl/SasIntelligentServiceImpl.java
  91. 97 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/service/impl/SasMapNavigateServiceImpl.java
  92. 116 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/service/impl/SasMapServiceImpl.java
  93. 259 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/service/impl/SasOneStandardSixRealitiesServiceImpl.java
  94. 185 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/service/impl/SasPersonnelServiceImpl.java
  95. 126 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/service/impl/SasSystemServiceImpl.java
  96. 51 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/service/impl/SasSystesasActivationServiceImpl.java
  97. 47 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/service/impl/SasSystesasConfigServiceImpl.java
  98. 47 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/service/impl/SasSystesasWlanConfigServiceImpl.java
  99. 67 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/service/impl/SasVideoPatrolServiceImpl.java
  100. 33 0
      service-sas/service-sas-biz/src/main/java/com/usky/sas/service/impl/SasVideoStreamServiceImpl.java

+ 2 - 0
pom.xml

@@ -100,6 +100,8 @@
 
     <module>service-cdi</module>
 
+    <module>service-sas</module>
+
   </modules>
           
   

+ 21 - 0
service-sas/pom.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>usky-modules</artifactId>
+        <groupId>com.usky</groupId>
+        <version>0.0.1</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>service-sas</artifactId>
+
+    <packaging>pom</packaging>
+    <version>0.0.1</version>
+
+    <modules>
+        <module>service-sas-biz</module>
+        <module>service-sas-api</module>
+    </modules>
+</project>
+

+ 28 - 0
service-sas/service-sas-api/pom.xml

@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>service-sas</artifactId>
+        <groupId>com.usky</groupId>
+        <version>0.0.1</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>service-sas-api</artifactId>
+    <!-- SpringCloud Openfeign -->
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-openfeign</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.usky</groupId>
+            <artifactId>usky-common-core</artifactId>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <finalName>${project.artifactId}</finalName>
+    </build>
+
+</project>
+

+ 90 - 0
service-sas/service-sas-biz/pom.xml

@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>service-sas</artifactId>
+        <groupId>com.usky</groupId>
+        <version>0.0.1</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>service-sas-biz</artifactId>
+    <dependencies>
+        <dependency>
+            <groupId>com.usky</groupId>
+            <artifactId>common-cloud-starter</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.usky</groupId>
+            <artifactId>service-sas-api</artifactId>
+            <version>0.0.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <!-- Pagehelper -->
+        <dependency>
+            <groupId>com.github.pagehelper</groupId>
+            <artifactId>pagehelper-spring-boot-starter</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.usky</groupId>
+            <artifactId>ruoyi-common-core</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.usky</groupId>
+            <artifactId>service-system-api</artifactId>
+            <version>0.0.1</version>
+        </dependency>
+
+        <!-- Excel & Word 工具 -->
+        <dependency>
+            <groupId>cn.afterturn</groupId>
+            <artifactId>easypoi-spring-boot-starter</artifactId>
+            <version>4.1.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.usky</groupId>
+            <artifactId>ruoyi-common-swagger</artifactId>
+        </dependency>
+
+    </dependencies>
+
+    <build>
+        <finalName>${project.artifactId}</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>2.2.6.RELEASE</version>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>com.github.shalousun</groupId>
+                <artifactId>smart-doc-maven-plugin</artifactId>
+                <version>2.1.1</version>
+                <configuration>
+                    <!--指定生成文档的使用的配置文件,配置文件放在自己的项目中-->
+                    <configFile>./src/main/resources/smart-doc.json</configFile>
+                    <!--指定项目名称-->
+                    <projectName>sas</projectName>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
+

+ 47 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/ServiceSasApplication.java

@@ -0,0 +1,47 @@
+package com.usky.sas;
+
+import com.ruoyi.common.swagger.annotation.EnableCustomSwagger2;
+import org.mybatis.spring.annotation.MapperScan;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.context.ConfigurableApplicationContext;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.core.env.Environment;
+import org.springframework.scheduling.annotation.EnableAsync;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+
+/**
+ * SAS 模块启动类
+ *
+ * @author han
+ */
+@EnableCustomSwagger2
+@EnableFeignClients(basePackages = "com.usky")
+@MapperScan(value = "com.usky.sas.mapper")
+@ComponentScan("com.usky")
+@SpringBootApplication
+@EnableAsync
+public class ServiceSasApplication {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(ServiceSasApplication.class);
+
+    public static void main(String[] args) throws UnknownHostException {
+        ConfigurableApplicationContext application = SpringApplication.run(ServiceSasApplication.class, args);
+        Environment env = application.getEnvironment();
+        String ip = InetAddress.getLocalHost().getHostAddress();
+        String port = env.getProperty("server.port");
+        String path = env.getProperty("server.servlet.context-path");
+        LOGGER.info("\n----------------------------------------------------------\n\t" +
+                "Application is running! Access URLs:\n\t" +
+                "Local: \t\thttp://localhost:" + port + (null == path ? "" : path) + "/\n\t" +
+                "External: \thttp://" + ip + ":" + port + (null == path ? "" : path) + "/\n\t" +
+                "Api: \t\thttp://" + ip + ":" + port + (null == path ? "" : path) + "/swagger-ui/index.html\n\t" +
+                "----------------------------------------------------------");
+    }
+}
+

+ 45 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/controller/web/SasActivationController.java

@@ -0,0 +1,45 @@
+package com.usky.sas.controller.web;
+
+import com.usky.common.core.bean.ApiResult;
+import com.usky.sas.domain.SasSystesasActivation;
+import com.usky.sas.service.SasSystesasActivationService;
+import lombok.Data;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 系统激活接口
+ *
+ * 对应 API 文档:POST /prod-api/service-sas/activate
+ */
+@RestController
+@RequestMapping
+public class SasActivationController {
+
+    @Autowired
+    private SasSystesasActivationService activationService;
+
+    @PostMapping("/activate")
+    public ApiResult<ActivationResponse> activate(@RequestBody ActivationRequest request) {
+        SasSystesasActivation activation = activationService.activate(request.getLicenseKey());
+        ActivationResponse resp = new ActivationResponse();
+        resp.setIsPerpetual(Boolean.TRUE.equals(activation.getIsPerpetual()));
+        resp.setValidityTime(activation.getValidityTime());
+        return ApiResult.success(resp);
+    }
+
+    @Data
+    public static class ActivationRequest {
+        private String licenseKey;
+    }
+
+    @Data
+    public static class ActivationResponse {
+        private Boolean isPerpetual;
+        private java.time.LocalDateTime validityTime;
+    }
+}
+

+ 44 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/controller/web/SasAgboxConfigController.java

@@ -0,0 +1,44 @@
+package com.usky.sas.controller.web;
+
+import com.usky.common.core.bean.ApiResult;
+import com.usky.sas.domain.SasConfig;
+import com.usky.sas.service.SasConfigService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * Agbox/Metabus 配置接口
+ *
+ * 对应 API 文档:
+ * GET /prod-api/service-sas/agbox/config
+ * PUT /prod-api/service-sas/agbox/config
+ */
+@RestController
+@RequestMapping("/agbox")
+public class SasAgboxConfigController {
+
+    @Autowired
+    private SasConfigService sasConfigService;
+
+    /**
+     * 查询 Agbox/Metabus 配置
+     */
+    @GetMapping("/config")
+    public ApiResult<SasConfig> getConfig() {
+        return ApiResult.success(sasConfigService.getConfig());
+    }
+
+    /**
+     * 编辑 Agbox/Metabus 配置
+     */
+    @PutMapping("/config")
+    public ApiResult<Void> updateConfig(@RequestBody SasConfig config) {
+        sasConfigService.updateConfig(config);
+        return ApiResult.success();
+    }
+}
+

+ 66 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/controller/web/SasAlarmGroupController.java

@@ -0,0 +1,66 @@
+package com.usky.sas.controller.web;
+
+import com.usky.common.core.bean.ApiResult;
+import com.usky.common.core.bean.CommonPage;
+import com.usky.sas.domain.SasAlarsasGroupType;
+import com.usky.sas.service.SasAlarsasGroupTypeService;
+import com.usky.sas.service.vo.AlarmGroupPageRequest;
+import com.usky.sas.service.vo.AlarmGroupSaveRequest;
+import lombok.Data;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 报警联动配置接口
+ *
+ * 对应 API 文档:
+ * GET /prod-api/service-sas/alarm/group
+ * POST /prod-api/service-sas/alarm/group
+ * PUT /prod-api/service-sas/alarm/group/{id}
+ * DELETE /prod-api/service-sas/alarm/group/{id}
+ */
+@RestController
+@RequestMapping("/alarm/group")
+public class SasAlarmGroupController {
+
+    @Autowired
+    private SasAlarsasGroupTypeService alarsasGroupTypeService;
+
+    @GetMapping
+    public ApiResult<CommonPage<SasAlarsasGroupType>> page(AlarmGroupPageRequest request) {
+        return ApiResult.success(alarsasGroupTypeService.page(request));
+    }
+
+    @PostMapping
+    public ApiResult<CreateResponse> create(@RequestBody AlarmGroupSaveRequest request) {
+        String id = alarsasGroupTypeService.create(request);
+        CreateResponse resp = new CreateResponse();
+        resp.setId(id);
+        return ApiResult.success(resp);
+    }
+
+    @PutMapping("/{id}")
+    public ApiResult<Void> update(@PathVariable("id") String id, @RequestBody AlarmGroupSaveRequest request) {
+        alarsasGroupTypeService.update(id, request);
+        return ApiResult.success();
+    }
+
+    @DeleteMapping("/{id}")
+    public ApiResult<Void> delete(@PathVariable("id") String id) {
+        alarsasGroupTypeService.delete(id);
+        return ApiResult.success();
+    }
+
+    @Data
+    public static class CreateResponse {
+        private String id;
+    }
+}
+

+ 82 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/controller/web/SasDeviceController.java

@@ -0,0 +1,82 @@
+package com.usky.sas.controller.web;
+
+import com.usky.common.core.bean.ApiResult;
+import com.usky.common.core.bean.CommonPage;
+import com.usky.sas.service.SasDeviceService;
+import com.usky.sas.service.vo.DeviceConfigPageRequest;
+import com.usky.sas.service.vo.DeviceConfigSaveRequest;
+import com.usky.sas.service.vo.DeviceConfigVO;
+import com.usky.sas.service.vo.DeviceHeartbeatRequest;
+import com.usky.sas.service.vo.DeviceHeartbeatResponse;
+import lombok.Data;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 设备心跳接口
+ *
+ * 对应 API 文档:
+ * GET /prod-api/service-sas/device/heartbeat
+ */
+@RestController
+@RequestMapping("/device")
+public class SasDeviceController {
+
+    @Autowired
+    private SasDeviceService sasDeviceService;
+
+    @GetMapping("/heartbeat")
+    public ApiResult<CommonPage<DeviceHeartbeatResponse>> heartbeat(DeviceHeartbeatRequest request) {
+        return ApiResult.success(sasDeviceService.heartbeatPage(request));
+    }
+
+    /**
+     * 设备配置分页查询
+     */
+    @GetMapping("/config")
+    public ApiResult<CommonPage<DeviceConfigVO>> configPage(DeviceConfigPageRequest request) {
+        return ApiResult.success(sasDeviceService.configPage(request));
+    }
+
+    /**
+     * 新增设备配置
+     */
+    @PostMapping("/config")
+    public ApiResult<CreateDeviceResponse> createConfig(@RequestBody DeviceConfigSaveRequest request) {
+        String id = sasDeviceService.createConfig(request);
+        CreateDeviceResponse resp = new CreateDeviceResponse();
+        resp.setId(id);
+        return ApiResult.success(resp);
+    }
+
+    /**
+     * 编辑设备配置
+     */
+    @PutMapping("/config/{id}")
+    public ApiResult<Void> updateConfig(@PathVariable("id") String id, @RequestBody DeviceConfigSaveRequest request) {
+        sasDeviceService.updateConfig(id, request);
+        return ApiResult.success();
+    }
+
+    /**
+     * 删除设备配置
+     */
+    @DeleteMapping("/config/{id}")
+    public ApiResult<Void> deleteConfig(@PathVariable("id") String id) {
+        sasDeviceService.deleteConfig(id);
+        return ApiResult.success();
+    }
+
+    @Data
+    public static class CreateDeviceResponse {
+        private String id;
+    }
+}
+

+ 78 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/controller/web/SasEventGroupController.java

@@ -0,0 +1,78 @@
+package com.usky.sas.controller.web;
+
+import com.usky.common.core.bean.ApiResult;
+import com.usky.common.core.bean.CommonPage;
+import com.usky.sas.domain.SasEventTypeGroup;
+import com.usky.sas.service.SasEventTypeGroupService;
+import com.usky.sas.service.vo.EventGroupPageRequest;
+import com.usky.sas.service.vo.EventGroupSaveRequest;
+import lombok.Data;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 事件组配置接口
+ *
+ * 对应 API 文档:
+ * GET /prod-api/service-sas/event/group
+ * POST /prod-api/service-sas/event/group
+ * PUT /prod-api/service-sas/event/group/{id}
+ * DELETE /prod-api/service-sas/event/group/{id}
+ */
+@RestController
+@RequestMapping("/event/group")
+public class SasEventGroupController {
+
+    @Autowired
+    private SasEventTypeGroupService eventTypeGroupService;
+
+    /**
+     * 事件组分页查询
+     */
+    @GetMapping
+    public ApiResult<CommonPage<SasEventTypeGroup>> page(EventGroupPageRequest request) {
+        return ApiResult.success(eventTypeGroupService.page(request));
+    }
+
+    /**
+     * 新增事件组
+     */
+    @PostMapping
+    public ApiResult<CreateResponse> create(@RequestBody EventGroupSaveRequest request) {
+        String id = eventTypeGroupService.create(request);
+        CreateResponse resp = new CreateResponse();
+        resp.setId(id);
+        return ApiResult.success(resp);
+    }
+
+    /**
+     * 编辑事件组
+     */
+    @PutMapping("/{id}")
+    public ApiResult<Void> update(@PathVariable("id") String id, @RequestBody EventGroupSaveRequest request) {
+        eventTypeGroupService.update(id, request);
+        return ApiResult.success();
+    }
+
+    /**
+     * 删除事件组
+     */
+    @DeleteMapping("/{id}")
+    public ApiResult<Void> delete(@PathVariable("id") String id) {
+        eventTypeGroupService.delete(id);
+        return ApiResult.success();
+    }
+
+    @Data
+    public static class CreateResponse {
+        private String id;
+    }
+}
+

+ 39 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/controller/web/SasEventPriorityController.java

@@ -0,0 +1,39 @@
+package com.usky.sas.controller.web;
+
+import com.usky.common.core.bean.ApiResult;
+import com.usky.sas.service.SasEventPriorityService;
+import com.usky.sas.service.vo.EventPriorityConfigRequest;
+import com.usky.sas.service.vo.EventPriorityConfigResponse;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 事件优先级配置接口
+ *
+ * 对应 API 文档:
+ * GET /prod-api/service-sas/event/priority
+ * PUT /prod-api/service-sas/event/priority
+ */
+@RestController
+@RequestMapping("/event/priority")
+public class SasEventPriorityController {
+
+    @Autowired
+    private SasEventPriorityService eventPriorityService;
+
+    @GetMapping
+    public ApiResult<EventPriorityConfigResponse> getConfig() {
+        return ApiResult.success(eventPriorityService.getConfig());
+    }
+
+    @PutMapping
+    public ApiResult<Void> updateConfig(@RequestBody EventPriorityConfigRequest request) {
+        eventPriorityService.updateConfig(request);
+        return ApiResult.success();
+    }
+}
+

+ 28 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/controller/web/SasHomepageController.java

@@ -0,0 +1,28 @@
+package com.usky.sas.controller.web;
+
+import com.usky.common.core.bean.ApiResult;
+import com.usky.sas.service.SasHomepageService;
+import com.usky.sas.service.vo.HomepageInfoResponse;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 首页信息接口
+ *
+ * GET /prod-api/service-sas/homepage/info
+ */
+@RestController
+@RequestMapping("/homepage")
+public class SasHomepageController {
+
+    @Autowired
+    private SasHomepageService sasHomepageService;
+
+    @GetMapping("/info")
+    public ApiResult<HomepageInfoResponse> getInfo() {
+        return ApiResult.success(sasHomepageService.getHomepageInfo());
+    }
+}
+

+ 60 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/controller/web/SasIntelligentController.java

@@ -0,0 +1,60 @@
+package com.usky.sas.controller.web;
+
+import com.usky.common.core.bean.ApiResult;
+import com.usky.common.core.bean.CommonPage;
+import com.usky.sas.service.SasIntelligentService;
+import com.usky.sas.service.vo.IntelligentEventItem;
+import com.usky.sas.service.vo.IntelligentEventPageRequest;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 智能分析接口
+ *
+ * GET /prod-api/service-sas/intelligent/events
+ * GET /prod-api/service-sas/intelligent/snap
+ * GET /prod-api/service-sas/intelligent/alarm
+ * GET /prod-api/service-sas/intelligent/entrance
+ * GET /prod-api/service-sas/intelligent/parking
+ * GET /prod-api/service-sas/intelligent/patrol
+ */
+@RestController
+@RequestMapping("/intelligent")
+public class SasIntelligentController {
+
+    @Autowired
+    private SasIntelligentService sasIntelligentService;
+
+    @GetMapping("/events")
+    public ApiResult<CommonPage<IntelligentEventItem>> events(IntelligentEventPageRequest request) {
+        return ApiResult.success(sasIntelligentService.queryEvents(request));
+    }
+
+    @GetMapping("/snap")
+    public ApiResult<CommonPage<IntelligentEventItem>> snap(IntelligentEventPageRequest request) {
+        return ApiResult.success(sasIntelligentService.querySnap(request));
+    }
+
+    @GetMapping("/alarm")
+    public ApiResult<CommonPage<IntelligentEventItem>> alarm(IntelligentEventPageRequest request) {
+        return ApiResult.success(sasIntelligentService.queryAlarm(request));
+    }
+
+    @GetMapping("/entrance")
+    public ApiResult<CommonPage<IntelligentEventItem>> entrance(IntelligentEventPageRequest request) {
+        return ApiResult.success(sasIntelligentService.queryEntrance(request));
+    }
+
+    @GetMapping("/parking")
+    public ApiResult<CommonPage<IntelligentEventItem>> parking(IntelligentEventPageRequest request) {
+        return ApiResult.success(sasIntelligentService.queryParking(request));
+    }
+
+    @GetMapping("/patrol")
+    public ApiResult<CommonPage<IntelligentEventItem>> patrol(IntelligentEventPageRequest request) {
+        return ApiResult.success(sasIntelligentService.queryPatrol(request));
+    }
+}
+

+ 90 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/controller/web/SasMapController.java

@@ -0,0 +1,90 @@
+package com.usky.sas.controller.web;
+
+import com.usky.common.core.bean.ApiResult;
+import com.usky.common.core.bean.CommonPage;
+import com.usky.sas.domain.SasMaps;
+import com.usky.sas.service.SasMapService;
+import com.usky.sas.service.vo.MapDeviceBindRequest;
+import com.usky.sas.service.vo.MapPageRequest;
+import com.usky.sas.service.vo.MapSaveRequest;
+import lombok.Data;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 电子地图配置接口
+ *
+ * 对应 API 文档:
+ * GET /prod-api/service-sas/map
+ * POST /prod-api/service-sas/map
+ * PUT /prod-api/service-sas/map/{id}
+ * DELETE /prod-api/service-sas/map/{id}
+ * POST /prod-api/service-sas/map/{mapId}/device
+ * DELETE /prod-api/service-sas/map/{mapId}/device/{deviceId}
+ */
+@RestController
+@RequestMapping("/map")
+public class SasMapController {
+
+    @Autowired
+    private SasMapService sasMapService;
+
+    @GetMapping
+    public ApiResult<CommonPage<SasMaps>> page(MapPageRequest request) {
+        return ApiResult.success(sasMapService.page(request));
+    }
+
+    @PostMapping
+    public ApiResult<CreateMapResponse> create(@RequestBody MapSaveRequest request) {
+        String id = sasMapService.create(request);
+        CreateMapResponse resp = new CreateMapResponse();
+        resp.setId(id);
+        return ApiResult.success(resp);
+    }
+
+    @PutMapping("/{id}")
+    public ApiResult<Void> update(@PathVariable("id") String id, @RequestBody MapSaveRequest request) {
+        sasMapService.update(id, request);
+        return ApiResult.success();
+    }
+
+    @DeleteMapping("/{id}")
+    public ApiResult<Void> delete(@PathVariable("id") String id) {
+        sasMapService.delete(id);
+        return ApiResult.success();
+    }
+
+    @PostMapping("/{mapId}/device")
+    public ApiResult<CreateMapDeviceResponse> bindDevice(@PathVariable("mapId") String mapId,
+                                                         @RequestBody MapDeviceBindRequest request) {
+        String id = sasMapService.bindDevice(mapId, request);
+        CreateMapDeviceResponse resp = new CreateMapDeviceResponse();
+        resp.setId(id);
+        return ApiResult.success(resp);
+    }
+
+    @DeleteMapping("/{mapId}/device/{deviceId}")
+    public ApiResult<Void> unbindDevice(@PathVariable("mapId") String mapId,
+                                        @PathVariable("deviceId") String deviceId) {
+        sasMapService.unbindDevice(mapId, deviceId);
+        return ApiResult.success();
+    }
+
+    @Data
+    public static class CreateMapResponse {
+        private String id;
+    }
+
+    @Data
+    public static class CreateMapDeviceResponse {
+        private String id;
+    }
+}
+

+ 39 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/controller/web/SasMapNavigateController.java

@@ -0,0 +1,39 @@
+package com.usky.sas.controller.web;
+
+import com.usky.common.core.bean.ApiResult;
+import com.usky.sas.service.SasMapNavigateService;
+import com.usky.sas.service.vo.MapDeviceDetailResponse;
+import com.usky.sas.service.vo.MapNavigateResponse;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 电子地图导航接口
+ *
+ * GET /prod-api/service-sas/map/navigate
+ * GET /prod-api/service-sas/map/device/{deviceId}/detail
+ */
+@RestController
+@RequestMapping("/map")
+public class SasMapNavigateController {
+
+    @Autowired
+    private SasMapNavigateService sasMapNavigateService;
+
+    @GetMapping("/navigate")
+    public ApiResult<MapNavigateResponse> navigate(@RequestParam("mapId") String mapId,
+                                                   @RequestParam(value = "x", required = false) Double x,
+                                                   @RequestParam(value = "y", required = false) Double y) {
+        return ApiResult.success(sasMapNavigateService.navigate(mapId, x, y));
+    }
+
+    @GetMapping("/device/{deviceId}/detail")
+    public ApiResult<MapDeviceDetailResponse> deviceDetail(@PathVariable("deviceId") String deviceId) {
+        return ApiResult.success(sasMapNavigateService.deviceDetail(deviceId));
+    }
+}
+

+ 44 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/controller/web/SasNetworkConfigController.java

@@ -0,0 +1,44 @@
+package com.usky.sas.controller.web;
+
+import com.usky.common.core.bean.ApiResult;
+import com.usky.sas.domain.SasSystesasWlanConfig;
+import com.usky.sas.service.SasSystesasWlanConfigService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 网络配置接口
+ *
+ * 对应 API 文档:
+ * GET /prod-api/service-sas/network/config
+ * PUT /prod-api/service-sas/network/config
+ */
+@RestController
+@RequestMapping("/network")
+public class SasNetworkConfigController {
+
+    @Autowired
+    private SasSystesasWlanConfigService wlanConfigService;
+
+    /**
+     * 查询网络配置
+     */
+    @GetMapping("/config")
+    public ApiResult<SasSystesasWlanConfig> getConfig() {
+        return ApiResult.success(wlanConfigService.getConfig());
+    }
+
+    /**
+     * 编辑网络配置
+     */
+    @PutMapping("/config")
+    public ApiResult<Void> updateConfig(@RequestBody SasSystesasWlanConfig config) {
+        wlanConfigService.updateConfig(config);
+        return ApiResult.success();
+    }
+}
+

+ 128 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/controller/web/SasOneStandardSixRealitiesController.java

@@ -0,0 +1,128 @@
+package com.usky.sas.controller.web;
+
+import com.usky.common.core.bean.ApiResult;
+import com.usky.common.core.bean.CommonPage;
+import com.usky.sas.service.SasOneStandardSixRealitiesService;
+import com.usky.sas.service.vo.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 一标六实接口
+ *
+ * 对应 API 文档:
+ * /prod-api/service-sas/one-standard-six-realities/...
+ */
+@RestController
+@RequestMapping("/one-standard-six-realities")
+public class SasOneStandardSixRealitiesController {
+
+    @Autowired
+    private SasOneStandardSixRealitiesService sasOneStandardSixRealitiesService;
+
+    /**
+     * 1.1 查询实有力量信息
+     */
+    @GetMapping("/power")
+    public ApiResult<CommonPage<PowerListItem>> power(OneStandardSixRealitiesPageRequest request) {
+        return ApiResult.success(sasOneStandardSixRealitiesService.powerPage(request));
+    }
+
+    /**
+     * 1.2 同步实有力量
+     */
+    @PostMapping("/powerSync")
+    public ApiResult<Integer> powerSync() {
+        return ApiResult.success(sasOneStandardSixRealitiesService.syncPower());
+    }
+
+    /**
+     * 2.1 查询实有设施信息
+     */
+    @GetMapping("/facility")
+    public ApiResult<CommonPage<FacilityListItem>> facility(OneStandardSixRealitiesPageRequest request) {
+        return ApiResult.success(sasOneStandardSixRealitiesService.facilityPage(request));
+    }
+
+    /**
+     * 2.2 同步实有设施
+     */
+    @PostMapping("/facilitySync")
+    public ApiResult<Integer> facilitySync() {
+        return ApiResult.success(sasOneStandardSixRealitiesService.syncFacility());
+    }
+
+    /**
+     * 3.1 查询出入口信息
+     */
+    @GetMapping("/entrance")
+    public ApiResult<CommonPage<EntranceListItem>> entrance(OneStandardSixRealitiesPageRequest request) {
+        return ApiResult.success(sasOneStandardSixRealitiesService.entrancePage(request));
+    }
+
+    /**
+     * 3.2 同步出入口
+     */
+    @PostMapping("/entranceSync")
+    public ApiResult<Integer> entranceSync() {
+        return ApiResult.success(sasOneStandardSixRealitiesService.syncEntrance());
+    }
+
+    /**
+     * 4.1 查询区域信息
+     */
+    @GetMapping("/area")
+    public ApiResult<CommonPage<AreaListItem>> area(OneStandardSixRealitiesPageRequest request) {
+        return ApiResult.success(sasOneStandardSixRealitiesService.areaPage(request));
+    }
+
+    /**
+     * 4.2 同步区域信息
+     */
+    @PostMapping("/areaSync")
+    public ApiResult<Integer> areaSync() {
+        return ApiResult.success(sasOneStandardSixRealitiesService.syncArea());
+    }
+
+    /**
+     * 5.1 查询房屋信息
+     */
+    @GetMapping("/house")
+    public ApiResult<CommonPage<HouseListItem>> house(OneStandardSixRealitiesPageRequest request) {
+        return ApiResult.success(sasOneStandardSixRealitiesService.housePage(request));
+    }
+
+    /**
+     * 5.2 同步房屋信息
+     */
+    @PostMapping("/houseSync")
+    public ApiResult<Integer> houseSync() {
+        return ApiResult.success(sasOneStandardSixRealitiesService.syncHouse());
+    }
+
+    /**
+     * 6.1 查询地块信息
+     */
+    @GetMapping("/village")
+    public ApiResult<CommonPage<VillageListItem>> village(OneStandardSixRealitiesPageRequest request) {
+        return ApiResult.success(sasOneStandardSixRealitiesService.villagePage(request));
+    }
+
+    /**
+     * 6.2 同步地块信息
+     */
+    @PostMapping("/villageSync")
+    public ApiResult<Integer> villageSync() {
+        return ApiResult.success(sasOneStandardSixRealitiesService.syncVillage());
+    }
+
+    /**
+     * 6.3 设置默认地块
+     */
+    @PutMapping("/villageDefault/{villageCode}")
+    public ApiResult<Void> setVillageDefault(@PathVariable("villageCode") String villageCode) {
+        sasOneStandardSixRealitiesService.setVillageDefault(villageCode);
+        return ApiResult.success();
+    }
+}
+

+ 125 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/controller/web/SasPersonnelController.java

@@ -0,0 +1,125 @@
+package com.usky.sas.controller.web;
+
+import com.usky.common.core.bean.ApiResult;
+import com.usky.common.core.bean.CommonPage;
+import com.usky.sas.service.SasPersonnelService;
+import com.usky.sas.service.vo.PersonnelDetailResponse;
+import com.usky.sas.service.vo.PersonnelListItem;
+import com.usky.sas.service.vo.PersonnelPageRequest;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 人员管理接口
+ *
+ * 对应 API 文档:
+ * /prod-api/service-sas/personnel/...
+ */
+@RestController
+@RequestMapping("/personnel")
+public class SasPersonnelController {
+
+    @Autowired
+    private SasPersonnelService sasPersonnelService;
+
+    /**
+     * 1.1 查询白名单人员信息
+     */
+    @GetMapping("/whitelist")
+    public ApiResult<CommonPage<PersonnelListItem>> whitelist(PersonnelPageRequest request) {
+        return ApiResult.success(sasPersonnelService.whitelistPage(request));
+    }
+
+    /**
+     * 1.2 同步白名单
+     */
+    @PostMapping("/whitelistSync")
+    public ApiResult<Integer> whitelistSync() {
+        return ApiResult.success(sasPersonnelService.syncWhitelist());
+    }
+
+    /**
+     * 1.3 查询白名单人员详情
+     */
+    @GetMapping("/whitelist/{personCode}")
+    public ApiResult<PersonnelDetailResponse> whitelistDetail(@PathVariable("personCode") String personCode) {
+        return ApiResult.success(sasPersonnelService.whitelistDetail(personCode));
+    }
+
+    /**
+     * 2.1 查询黑名单人员信息
+     */
+    @GetMapping("/blacklist")
+    public ApiResult<CommonPage<PersonnelListItem>> blacklist(PersonnelPageRequest request) {
+        return ApiResult.success(sasPersonnelService.blacklistPage(request));
+    }
+
+    /**
+     * 2.2 同步黑名单
+     */
+    @PostMapping("/blacklistSync")
+    public ApiResult<Integer> blacklistSync() {
+        return ApiResult.success(sasPersonnelService.syncBlacklist());
+    }
+
+    /**
+     * 2.3 查询黑名单人员详情
+     */
+    @GetMapping("/blacklist/{personCode}")
+    public ApiResult<PersonnelDetailResponse> blacklistDetail(@PathVariable("personCode") String personCode) {
+        return ApiResult.success(sasPersonnelService.blacklistDetail(personCode));
+    }
+
+    /**
+     * 3.1 查询在册人员信息
+     */
+    @GetMapping("/registered")
+    public ApiResult<CommonPage<PersonnelListItem>> registered(PersonnelPageRequest request) {
+        return ApiResult.success(sasPersonnelService.registeredPage(request));
+    }
+
+    /**
+     * 3.2 同步在册人员
+     */
+    @PostMapping("/registeredSync")
+    public ApiResult<Integer> registeredSync() {
+        return ApiResult.success(sasPersonnelService.syncRegistered());
+    }
+
+    /**
+     * 3.3 查询在册人员详情
+     */
+    @GetMapping("/registered/{personCode}")
+    public ApiResult<PersonnelDetailResponse> registeredDetail(@PathVariable("personCode") String personCode) {
+        return ApiResult.success(sasPersonnelService.registeredDetail(personCode));
+    }
+
+    /**
+     * 4.1 查询关注人员信息
+     */
+    @GetMapping("/follow")
+    public ApiResult<CommonPage<PersonnelListItem>> follow(PersonnelPageRequest request) {
+        return ApiResult.success(sasPersonnelService.followPage(request));
+    }
+
+    /**
+     * 4.2 同步关注人员
+     */
+    @PostMapping("/followSync")
+    public ApiResult<Integer> followSync() {
+        return ApiResult.success(sasPersonnelService.syncFollow());
+    }
+
+    /**
+     * 4.3 查询关注人员详情
+     */
+    @GetMapping("/follow/{personCode}")
+    public ApiResult<PersonnelDetailResponse> followDetail(@PathVariable("personCode") String personCode) {
+        return ApiResult.success(sasPersonnelService.followDetail(personCode));
+    }
+}
+

+ 44 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/controller/web/SasSystemConfigController.java

@@ -0,0 +1,44 @@
+package com.usky.sas.controller.web;
+
+import com.usky.common.core.bean.ApiResult;
+import com.usky.sas.domain.SasSystesasConfig;
+import com.usky.sas.service.SasSystesasConfigService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 系统配置接口
+ *
+ * 对应 API 文档:
+ * GET /prod-api/service-sas/system/config
+ * PUT /prod-api/service-sas/system/config
+ */
+@RestController
+@RequestMapping("/system")
+public class SasSystemConfigController {
+
+    @Autowired
+    private SasSystesasConfigService systesasConfigService;
+
+    /**
+     * 查询系统配置
+     */
+    @GetMapping("/config")
+    public ApiResult<SasSystesasConfig> getConfig() {
+        return ApiResult.success(systesasConfigService.getConfig());
+    }
+
+    /**
+     * 编辑系统配置
+     */
+    @PutMapping("/config")
+    public ApiResult<Void> updateConfig(@RequestBody SasSystesasConfig config) {
+        systesasConfigService.updateConfig(config);
+        return ApiResult.success();
+    }
+}
+

+ 79 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/controller/web/SasSystemController.java

@@ -0,0 +1,79 @@
+package com.usky.sas.controller.web;
+
+import com.usky.common.core.bean.ApiResult;
+import com.usky.common.core.bean.CommonPage;
+import com.usky.sas.service.SasSystemService;
+import com.usky.sas.service.vo.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 系统信息 / 版本 / 备份 接口
+ *
+ * 对应 API 文档:
+ * /prod-api/service-sas/system/...
+ */
+@RestController
+public class SasSystemController {
+
+    @Autowired
+    private SasSystemService sasSystemService;
+
+    /**
+     * 1.1 查询系统信息
+     */
+    @GetMapping("/system/info")
+    public ApiResult<SystemInfoResponse> systemInfo() {
+        return ApiResult.success(sasSystemService.getSystemInfo());
+    }
+
+    /**
+     * 2.1 查询系统版本
+     */
+    @GetMapping("/system/version")
+    public ApiResult<VersionInfoResponse> systemVersion() {
+        return ApiResult.success(sasSystemService.getVersionInfo());
+    }
+
+    /**
+     * 2.2 升级系统版本
+     */
+    @PostMapping("/system/versionUpgrade")
+    public ApiResult<VersionInfoResponse> systemVersionUpgrade() {
+        return ApiResult.success(sasSystemService.upgradeVersion());
+    }
+
+    /**
+     * 3.1 备份数据库
+     */
+    @PostMapping("/system/backupBd")
+    public ApiResult<BackupDbResponse> backupDatabase() {
+        return ApiResult.success(sasSystemService.backupDatabase());
+    }
+
+    /**
+     * 3.2 查询备份文件列表
+     */
+    @GetMapping("/system/backupList")
+    public ApiResult<CommonPage<BackupFileItem>> backupList(BackupListPageRequest request) {
+        return ApiResult.success(sasSystemService.backupList(request));
+    }
+
+    /**
+     * 3.3 恢复数据库
+     */
+    @PostMapping("/system/backupRestore")
+    public ApiResult<Void> backupRestore(@RequestBody BackupRestoreRequest request) {
+        sasSystemService.restoreDatabase(request);
+        return ApiResult.success();
+    }
+
+    /**
+     * 3.4 下载备份文件
+     */
+    @GetMapping("/system/backupDownload/{fileName}")
+    public ApiResult<String> backupDownload(@PathVariable("fileName") String fileName) {
+        return ApiResult.success(sasSystemService.downloadBackup(fileName));
+    }
+}
+

+ 35 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/controller/web/SasVideoPatrolController.java

@@ -0,0 +1,35 @@
+package com.usky.sas.controller.web;
+
+import com.usky.common.core.bean.ApiResult;
+import com.usky.sas.service.SasVideoPatrolService;
+import com.usky.sas.service.vo.PatrolConfigResponse;
+import com.usky.sas.service.vo.VideoProtectionConfigResponse;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 视频导出防护 & 实时电子巡检 控制器
+ *
+ * GET /prod-api/service-sas/video/protection
+ * GET /prod-api/service-sas/patrol/config
+ */
+@RestController
+@RequestMapping
+public class SasVideoPatrolController {
+
+    @Autowired
+    private SasVideoPatrolService sasVideoPatrolService;
+
+    @GetMapping("/video/protection")
+    public ApiResult<VideoProtectionConfigResponse> getVideoProtectionConfig() {
+        return ApiResult.success(sasVideoPatrolService.getVideoProtectionConfig());
+    }
+
+    @GetMapping("/patrol/config")
+    public ApiResult<PatrolConfigResponse> getPatrolConfig() {
+        return ApiResult.success(sasVideoPatrolService.getPatrolConfig());
+    }
+}
+

+ 42 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/controller/web/SasVideoStreamController.java

@@ -0,0 +1,42 @@
+package com.usky.sas.controller.web;
+
+import com.usky.common.core.bean.ApiResult;
+import com.usky.sas.service.SasVideoStreamService;
+import com.usky.sas.service.vo.LiveStreamResponse;
+import com.usky.sas.service.vo.PlaybackStreamResponse;
+import com.usky.sas.service.vo.VideoStreamRequest;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 视频流接口
+ *
+ * 对应 API 文档:
+ * /prod-api/service-sas/video/...
+ */
+@RestController
+@RequestMapping("/video")
+public class SasVideoStreamController {
+
+    @Autowired
+    private SasVideoStreamService sasVideoStreamService;
+
+    /**
+     * 实时直播流
+     */
+    @GetMapping("/liveStream")
+    public ApiResult<LiveStreamResponse> liveStream(VideoStreamRequest request) {
+        return ApiResult.success(sasVideoStreamService.liveStream(request));
+    }
+
+    /**
+     * 回放流
+     */
+    @GetMapping("/playbackStream")
+    public ApiResult<PlaybackStreamResponse> playbackStream(VideoStreamRequest request) {
+        return ApiResult.success(sasVideoStreamService.playbackStream(request));
+    }
+}
+

+ 45 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/domain/SasAcquisitionEvent.java

@@ -0,0 +1,45 @@
+package com.usky.sas.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * 数据采集设备事件表
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("sas_acquisition_event")
+public class SasAcquisitionEvent implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "event_id")
+    private String eventId;
+
+    private String deviceId;
+
+    private Integer channel;
+
+    private LocalDateTime triggerTime;
+
+    private Integer eventCode;
+
+    private String note;
+
+    private String picId;
+
+    private String gisId;
+
+    private BigDecimal total;
+
+    private LocalDateTime createTime;
+
+    private LocalDateTime updateTime;
+}
+

+ 48 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/domain/SasAlarsasEvent.java

@@ -0,0 +1,48 @@
+package com.usky.sas.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * 入侵紧急报警事件表
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("sas_alarsas_event")
+public class SasAlarsasEvent implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "event_id")
+    private String eventId;
+
+    private String deviceId;
+
+    private Integer channel;
+
+    private LocalDateTime triggerTime;
+
+    private Integer eventCode;
+
+    private String note;
+
+    private String picId;
+
+    private String gisId;
+
+    private String relPerson;
+
+    private String dealPerson;
+
+    private LocalDateTime createTime;
+
+    private LocalDateTime updateTime;
+
+    private Integer eventSystem;
+}
+

+ 27 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/domain/SasAlarsasGroupType.java

@@ -0,0 +1,27 @@
+package com.usky.sas.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+
+/**
+ * 报警联动组类型表
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("sas_alarsas_group_type")
+public class SasAlarsasGroupType implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id")
+    private String id;
+
+    private String name;
+
+    private String note;
+}
+

+ 42 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/domain/SasBuilding.java

@@ -0,0 +1,42 @@
+package com.usky.sas.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * 区域信息表
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("sas_building")
+public class SasBuilding implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "building_code")
+    private String buildingCode;
+
+    private String buildingNo;
+
+    private Integer floorTotal;
+
+    private Integer houseTotal;
+
+    private String note;
+
+    private String gisId;
+
+    private String villageCode;
+
+    private Integer placeType;
+
+    private LocalDateTime createTime;
+
+    private LocalDateTime updateTime;
+}
+

+ 49 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/domain/SasCollectionEvent.java

@@ -0,0 +1,49 @@
+package com.usky.sas.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * 状态采集探测事件表
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("sas_collection_event")
+public class SasCollectionEvent implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "event_id")
+    private String eventId;
+
+    private String deviceId;
+
+    private Integer channel;
+
+    private LocalDateTime triggerTime;
+
+    private Integer eventCode;
+
+    private String note;
+
+    private String picId;
+
+    private String scenePicId;
+
+    private BigDecimal val;
+
+    private String gisId;
+
+    private BigDecimal total;
+
+    private LocalDateTime createTime;
+
+    private LocalDateTime updateTime;
+}
+

+ 65 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/domain/SasConfig.java

@@ -0,0 +1,65 @@
+package com.usky.sas.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * Agbox/Metabus配置表
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("sas_config")
+public class SasConfig implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.INPUT)
+    private Integer id;
+
+    /**
+     * 秘钥
+     */
+    private String keyds;
+
+    /**
+     * ip地址
+     */
+    private String host;
+
+    /**
+     * ip端口
+     */
+    private String port;
+
+    /**
+     * mqtt用户名
+     */
+    private String username;
+
+    /**
+     * mqtt用户密码
+     */
+    private String password;
+
+    /**
+     * 是否安全传输 true:启用 false:不启用
+     */
+    private Boolean isTsl;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updateTime;
+}
+

+ 74 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/domain/SasDevice.java

@@ -0,0 +1,74 @@
+package com.usky.sas.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * 设备信息表
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("sas_device")
+public class SasDevice implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id")
+    private String id;
+
+    private String deviceId;
+
+    private Integer channel;
+
+    private Integer deviceType;
+
+    private String ipAddr;
+
+    private String remoteIpcIpAddr;
+
+    private String macAddr;
+
+    private Integer port;
+
+    private String username;
+
+    private String password;
+
+    private Boolean shield;
+
+    private String villageCode;
+
+    private String houseCode;
+
+    private String address;
+
+    private String gisId;
+
+    private Integer videoProtocol;
+
+    private Integer videoType;
+
+    private String bindingIpc;
+
+    private Boolean isBinding;
+
+    private String videoGroupType;
+
+    private String alarsasGroupType;
+
+    private String videoSourceToken;
+
+    private String note;
+
+    private LocalDateTime triggerTime;
+
+    private LocalDateTime createTime;
+
+    private LocalDateTime updateTime;
+}
+

+ 58 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/domain/SasEntranceEvent.java

@@ -0,0 +1,58 @@
+package com.usky.sas.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * 出入门禁控制事件表
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("sas_entrance_event")
+public class SasEntranceEvent implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "event_id")
+    private String eventId;
+
+    private String deviceId;
+
+    private Integer channel;
+
+    private Integer certifiedType;
+
+    private String certifiedNo;
+
+    private String name;
+
+    private String phone;
+
+    private LocalDateTime triggerTime;
+
+    private Integer eventCode;
+
+    private Integer certifiedTypeCode;
+
+    private String cardId;
+
+    private String visit;
+
+    private String houseCode;
+
+    private Integer similarity;
+
+    private String note;
+
+    private String picId;
+
+    private LocalDateTime createTime;
+
+    private LocalDateTime updateTime;
+}
+

+ 53 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/domain/SasEventTypeGroup.java

@@ -0,0 +1,53 @@
+package com.usky.sas.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * 事件类型分组表
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("sas_event_type_group")
+public class SasEventTypeGroup implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id")
+    private String id;
+
+    /**
+     * 事件分组名称
+     */
+    private String name;
+
+    /**
+     * 设备事件类型
+     */
+    private Integer deviceType;
+
+    /**
+     * 事件类型(编码,逗号隔开)
+     */
+    private String eventCodes;
+
+    /**
+     * 事件等级
+     */
+    private Integer eventLevel;
+
+    private LocalDateTime createTime;
+
+    private LocalDateTime updateTime;
+
+    /**
+     * 是否能删除:true可删 false不可删
+     */
+    private Boolean canDel;
+}
+

+ 34 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/domain/SasFollowPerson.java

@@ -0,0 +1,34 @@
+package com.usky.sas.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * 关注人员表
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("sas_follow_person")
+public class SasFollowPerson implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "person_code")
+    private String personCode;
+
+    private Integer followPeopleType;
+
+    private String name;
+
+    private LocalDateTime createTime;
+
+    private LocalDateTime updateTime;
+
+    private String picId;
+}
+

+ 64 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/domain/SasHouse.java

@@ -0,0 +1,64 @@
+package com.usky.sas.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * 部位信息表(房屋信息)
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("sas_house")
+public class SasHouse implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "house_code")
+    private String houseCode;
+
+    private Integer floor;
+
+    private String houseNo;
+
+    private Integer houseLabelCode;
+
+    private String houseLabel;
+
+    private Integer housePurposeCode;
+
+    private String housePurpose;
+
+    private String note;
+
+    private Boolean isPublic;
+
+    private Boolean isAction;
+
+    private Integer systesasTypeCode;
+
+    private String buildingCode;
+
+    private String gisId;
+
+    private Integer personNumber;
+
+    private Integer houseArea;
+
+    private String villageCode;
+
+    private String tags;
+
+    private Integer placeTypeId;
+
+    private String houseName;
+
+    private LocalDateTime createTime;
+
+    private LocalDateTime updateTime;
+}
+

+ 57 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/domain/SasMapDevice.java

@@ -0,0 +1,57 @@
+package com.usky.sas.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * 电子地图设备表
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("sas_map_device")
+public class SasMapDevice implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id")
+    private String id;
+
+    private String deviceId;
+
+    private String imgId;
+
+    private String type;
+
+    private String backgroundColor;
+
+    private BigDecimal x;
+
+    private BigDecimal y;
+
+    private Double width;
+
+    private Double height;
+
+    private Double angle;
+
+    private String fontColor;
+
+    private Integer thickness;
+
+    private Integer fontSize;
+
+    private String text;
+
+    private String mapId;
+
+    private LocalDateTime createTime;
+
+    private LocalDateTime updateTime;
+}
+

+ 44 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/domain/SasMaps.java

@@ -0,0 +1,44 @@
+package com.usky.sas.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * 地图导航表
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("sas_maps")
+public class SasMaps implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id")
+    private String id;
+
+    private String name;
+
+    private Integer type;
+
+    private String remark;
+
+    private String parentId;
+
+    private Double width;
+
+    private Double height;
+
+    private Boolean isMask;
+
+    private String backImgId;
+
+    private LocalDateTime createTime;
+
+    private LocalDateTime updateTime;
+}
+

+ 62 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/domain/SasParkingEvent.java

@@ -0,0 +1,62 @@
+package com.usky.sas.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * 停车场车牌抓拍事件表
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("sas_parking_event")
+public class SasParkingEvent implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "event_id")
+    private String eventId;
+
+    private String deviceId;
+
+    private Integer channel;
+
+    private LocalDateTime triggerTime;
+
+    private Integer eventCode;
+
+    private String note;
+
+    private String platePicId;
+
+    private String eventPicId;
+
+    private String gisId;
+
+    private LocalDateTime createTime;
+
+    private LocalDateTime updateTime;
+
+    private Integer eventSystem;
+
+    private String entranceCode;
+
+    private String plateNo;
+
+    private Integer plateType;
+
+    private String plateColor;
+
+    private Integer carType;
+
+    private Integer accessType;
+
+    private Integer carTypeCode;
+
+    private Integer similarity;
+}
+

+ 58 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/domain/SasPatrolEvent.java

@@ -0,0 +1,58 @@
+package com.usky.sas.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * 实时电子巡检事件表
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("sas_patrol_event")
+public class SasPatrolEvent implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "event_id")
+    private String eventId;
+
+    private String deviceId;
+
+    private Integer channel;
+
+    private LocalDateTime triggerTime;
+
+    private Integer eventCode;
+
+    private String note;
+
+    private String picId;
+
+    private String gisId;
+
+    private String relPerson;
+
+    private String dealPerson;
+
+    private LocalDateTime createTime;
+
+    private LocalDateTime updateTime;
+
+    private Integer eventSystem;
+
+    private String name;
+
+    private Integer credentialType;
+
+    private String credentialNo;
+
+    private String userParasasId;
+
+    private String typeName;
+}
+

+ 104 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/domain/SasPerson.java

@@ -0,0 +1,104 @@
+package com.usky.sas.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * 人员信息表
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("sas_person")
+public class SasPerson implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "person_code")
+    private String personCode;
+
+    private String cardNumber;
+
+    private Integer credentialType;
+
+    private String credentialNo;
+
+    private String name;
+
+    private String carCode;
+
+    private String labelCode;
+
+    private Integer msgSourceCode;
+
+    private String powerCode;
+
+    private Boolean realPopulation;
+
+    private String picId;
+
+    private String phone1;
+
+    private String phone1Id;
+
+    private String phone2;
+
+    private String phone2Id;
+
+    private String phone3;
+
+    private String phone3Id;
+
+    private Integer peopleTypeCode;
+
+    private LocalDateTime updateTime;
+
+    private LocalDateTime createTime;
+
+    private String companyCode;
+
+    private Integer source;
+
+    private String domicileId;
+
+    private String origin;
+
+    private String residenceId;
+
+    private Integer educationCode;
+
+    private Integer maritalStatusCode;
+
+    private String spouseName;
+
+    private Integer spouseType;
+
+    private String spouseNo;
+
+    private String nationalityCode;
+
+    private LocalDateTime entryTime;
+
+    private String surnameEng;
+
+    private String nameEng;
+
+    private String securityCardNo;
+
+    private Integer securityDutiesCode;
+
+    private Integer entranceTypeCode;
+
+    private String placeOfBirth;
+
+    private Integer personTypeCode;
+
+    private Integer functions;
+
+    private Integer personEntranceTypeCode;
+}
+

+ 64 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/domain/SasSnapEvent.java

@@ -0,0 +1,64 @@
+package com.usky.sas.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * 实时智能分析事件表
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("sas_snap_event")
+public class SasSnapEvent implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "event_id")
+    private String eventId;
+
+    private String deviceId;
+
+    private Integer channel;
+
+    private LocalDateTime triggerTime;
+
+    private Integer eventCode;
+
+    private String note;
+
+    private String scenePicId;
+
+    private String eventPicId;
+
+    private String gisId;
+
+    private String relPerson;
+
+    private String dealPerson;
+
+    private LocalDateTime createTime;
+
+    private LocalDateTime updateTime;
+
+    private Integer eventSystem;
+
+    private Integer similarity;
+
+    private Boolean notify;
+
+    private String feature;
+
+    private Boolean scene;
+
+    private String personCode;
+
+    private String prepersonId;
+
+    private Integer count;
+}
+

+ 73 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/domain/SasSystesasActivation.java

@@ -0,0 +1,73 @@
+package com.usky.sas.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * 系统激活信息表
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("sas_systesas_activation")
+public class SasSystesasActivation implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "id", type = IdType.INPUT)
+    private Integer id;
+
+    /**
+     * 激活码
+     */
+    private String licenseKey;
+
+    /**
+     * 是否永久:true永久 false非永久
+     */
+    private Boolean isPerpetual;
+
+    /**
+     * 激活时间
+     */
+    private LocalDateTime activationTime;
+
+    /**
+     * 到期时间
+     */
+    private LocalDateTime validityTime;
+
+    /**
+     * 授权模块
+     */
+    private String authorizationModule;
+
+    /**
+     * 设备激活状态
+     */
+    private Integer status;
+
+    /**
+     * 客户端id
+     */
+    private String clientId;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updateTime;
+}
+

+ 70 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/domain/SasSystesasConfig.java

@@ -0,0 +1,70 @@
+package com.usky.sas.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * 系统配置表
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("sas_systesas_config")
+public class SasSystesasConfig implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * agent服务器地址
+     */
+    private String owlAgentHost;
+
+    /**
+     * 服务器地址
+     */
+    private String systesasHost;
+
+    /**
+     * 视频服务器地址
+     */
+    private String videoServerHost;
+
+    /**
+     * 网关名称
+     */
+    private String gatewayName;
+
+    /**
+     * 数据保留天数
+     */
+    private Integer daysToKeepHistory;
+
+    /**
+     * 是否显示人员照片
+     */
+    private Boolean maskAvatar;
+
+    /**
+     * 是否显示身份证信息
+     */
+    private Boolean maskIdCardNo;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updateTime;
+}
+

+ 65 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/domain/SasSystesasWlanConfig.java

@@ -0,0 +1,65 @@
+package com.usky.sas.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * 网络配置表
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("sas_systesas_wlan_config")
+public class SasSystesasWlanConfig implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.INPUT)
+    private Integer id;
+
+    /**
+     * 网络名称
+     */
+    private String name;
+
+    /**
+     * IP地址
+     */
+    private String ipAddr;
+
+    /**
+     * 网关地址
+     */
+    private String gatewayAddr;
+
+    /**
+     * 子网掩码
+     */
+    private String subnetMask;
+
+    /**
+     * DNS
+     */
+    private String dns;
+
+    /**
+     * 状态:true启用 false未启用
+     */
+    private Boolean status;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updateTime;
+}
+

+ 34 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/domain/SasVersionAdmin.java

@@ -0,0 +1,34 @@
+package com.usky.sas.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * 版本更新表
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("sas_version_admin")
+public class SasVersionAdmin implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id")
+    private Long id;
+
+    private String jarVersion;
+
+    private String vueVersion;
+
+    private String durationOfUpdate;
+
+    private LocalDateTime createTime;
+
+    private LocalDateTime updateTime;
+}
+

+ 58 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/domain/SasVillage.java

@@ -0,0 +1,58 @@
+package com.usky.sas.domain;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * 地块信息表
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("sas_village")
+public class SasVillage implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "village_code")
+    private String villageCode;
+
+    private String villageName;
+
+    private String address;
+
+    private LocalDateTime updateTime;
+
+    private Long provinceCode;
+
+    private Long cityCode;
+
+    private Long districtCode;
+
+    private Long streetCode;
+
+    private String roadCode;
+
+    private String policeStationCode;
+
+    private LocalDateTime createTime;
+
+    private String companyCode;
+
+    private String companyName;
+
+    private String picUrlId;
+
+    private String gisId;
+
+    private String gisAreaId;
+
+    private String areaGis;
+
+    private Boolean isDefault;
+}
+

+ 8 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/mapper/SasAcquisitionEventMapper.java

@@ -0,0 +1,8 @@
+package com.usky.sas.mapper;
+
+import com.usky.common.mybatis.core.CrudMapper;
+import com.usky.sas.domain.SasAcquisitionEvent;
+
+public interface SasAcquisitionEventMapper extends CrudMapper<SasAcquisitionEvent> {
+}
+

+ 8 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/mapper/SasAlarsasEventMapper.java

@@ -0,0 +1,8 @@
+package com.usky.sas.mapper;
+
+import com.usky.common.mybatis.core.CrudMapper;
+import com.usky.sas.domain.SasAlarsasEvent;
+
+public interface SasAlarsasEventMapper extends CrudMapper<SasAlarsasEvent> {
+}
+

+ 11 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/mapper/SasAlarsasGroupTypeMapper.java

@@ -0,0 +1,11 @@
+package com.usky.sas.mapper;
+
+import com.usky.common.mybatis.core.CrudMapper;
+import com.usky.sas.domain.SasAlarsasGroupType;
+
+/**
+ * 报警联动组类型 Mapper 接口
+ */
+public interface SasAlarsasGroupTypeMapper extends CrudMapper<SasAlarsasGroupType> {
+}
+

+ 11 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/mapper/SasBuildingMapper.java

@@ -0,0 +1,11 @@
+package com.usky.sas.mapper;
+
+import com.usky.common.mybatis.core.CrudMapper;
+import com.usky.sas.domain.SasBuilding;
+
+/**
+ * 区域信息 Mapper 接口
+ */
+public interface SasBuildingMapper extends CrudMapper<SasBuilding> {
+}
+

+ 8 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/mapper/SasCollectionEventMapper.java

@@ -0,0 +1,8 @@
+package com.usky.sas.mapper;
+
+import com.usky.common.mybatis.core.CrudMapper;
+import com.usky.sas.domain.SasCollectionEvent;
+
+public interface SasCollectionEventMapper extends CrudMapper<SasCollectionEvent> {
+}
+

+ 11 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/mapper/SasConfigMapper.java

@@ -0,0 +1,11 @@
+package com.usky.sas.mapper;
+
+import com.usky.common.mybatis.core.CrudMapper;
+import com.usky.sas.domain.SasConfig;
+
+/**
+ * Agbox/Metabus配置 Mapper 接口
+ */
+public interface SasConfigMapper extends CrudMapper<SasConfig> {
+}
+

+ 11 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/mapper/SasDeviceMapper.java

@@ -0,0 +1,11 @@
+package com.usky.sas.mapper;
+
+import com.usky.common.mybatis.core.CrudMapper;
+import com.usky.sas.domain.SasDevice;
+
+/**
+ * 设备信息 Mapper 接口
+ */
+public interface SasDeviceMapper extends CrudMapper<SasDevice> {
+}
+

+ 8 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/mapper/SasEntranceEventMapper.java

@@ -0,0 +1,8 @@
+package com.usky.sas.mapper;
+
+import com.usky.common.mybatis.core.CrudMapper;
+import com.usky.sas.domain.SasEntranceEvent;
+
+public interface SasEntranceEventMapper extends CrudMapper<SasEntranceEvent> {
+}
+

+ 11 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/mapper/SasEventTypeGroupMapper.java

@@ -0,0 +1,11 @@
+package com.usky.sas.mapper;
+
+import com.usky.common.mybatis.core.CrudMapper;
+import com.usky.sas.domain.SasEventTypeGroup;
+
+/**
+ * 事件类型分组 Mapper 接口
+ */
+public interface SasEventTypeGroupMapper extends CrudMapper<SasEventTypeGroup> {
+}
+

+ 11 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/mapper/SasFollowPersonMapper.java

@@ -0,0 +1,11 @@
+package com.usky.sas.mapper;
+
+import com.usky.common.mybatis.core.CrudMapper;
+import com.usky.sas.domain.SasFollowPerson;
+
+/**
+ * 关注人员 Mapper 接口
+ */
+public interface SasFollowPersonMapper extends CrudMapper<SasFollowPerson> {
+}
+

+ 11 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/mapper/SasHouseMapper.java

@@ -0,0 +1,11 @@
+package com.usky.sas.mapper;
+
+import com.usky.common.mybatis.core.CrudMapper;
+import com.usky.sas.domain.SasHouse;
+
+/**
+ * 房屋信息 Mapper 接口
+ */
+public interface SasHouseMapper extends CrudMapper<SasHouse> {
+}
+

+ 8 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/mapper/SasMapDeviceMapper.java

@@ -0,0 +1,8 @@
+package com.usky.sas.mapper;
+
+import com.usky.common.mybatis.core.CrudMapper;
+import com.usky.sas.domain.SasMapDevice;
+
+public interface SasMapDeviceMapper extends CrudMapper<SasMapDevice> {
+}
+

+ 8 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/mapper/SasMapsMapper.java

@@ -0,0 +1,8 @@
+package com.usky.sas.mapper;
+
+import com.usky.common.mybatis.core.CrudMapper;
+import com.usky.sas.domain.SasMaps;
+
+public interface SasMapsMapper extends CrudMapper<SasMaps> {
+}
+

+ 8 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/mapper/SasParkingEventMapper.java

@@ -0,0 +1,8 @@
+package com.usky.sas.mapper;
+
+import com.usky.common.mybatis.core.CrudMapper;
+import com.usky.sas.domain.SasParkingEvent;
+
+public interface SasParkingEventMapper extends CrudMapper<SasParkingEvent> {
+}
+

+ 8 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/mapper/SasPatrolEventMapper.java

@@ -0,0 +1,8 @@
+package com.usky.sas.mapper;
+
+import com.usky.common.mybatis.core.CrudMapper;
+import com.usky.sas.domain.SasPatrolEvent;
+
+public interface SasPatrolEventMapper extends CrudMapper<SasPatrolEvent> {
+}
+

+ 11 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/mapper/SasPersonMapper.java

@@ -0,0 +1,11 @@
+package com.usky.sas.mapper;
+
+import com.usky.common.mybatis.core.CrudMapper;
+import com.usky.sas.domain.SasPerson;
+
+/**
+ * 人员信息 Mapper 接口
+ */
+public interface SasPersonMapper extends CrudMapper<SasPerson> {
+}
+

+ 8 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/mapper/SasSnapEventMapper.java

@@ -0,0 +1,8 @@
+package com.usky.sas.mapper;
+
+import com.usky.common.mybatis.core.CrudMapper;
+import com.usky.sas.domain.SasSnapEvent;
+
+public interface SasSnapEventMapper extends CrudMapper<SasSnapEvent> {
+}
+

+ 11 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/mapper/SasSystesasActivationMapper.java

@@ -0,0 +1,11 @@
+package com.usky.sas.mapper;
+
+import com.usky.common.mybatis.core.CrudMapper;
+import com.usky.sas.domain.SasSystesasActivation;
+
+/**
+ * 系统激活信息 Mapper 接口
+ */
+public interface SasSystesasActivationMapper extends CrudMapper<SasSystesasActivation> {
+}
+

+ 11 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/mapper/SasSystesasConfigMapper.java

@@ -0,0 +1,11 @@
+package com.usky.sas.mapper;
+
+import com.usky.common.mybatis.core.CrudMapper;
+import com.usky.sas.domain.SasSystesasConfig;
+
+/**
+ * 系统配置 Mapper 接口
+ */
+public interface SasSystesasConfigMapper extends CrudMapper<SasSystesasConfig> {
+}
+

+ 11 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/mapper/SasSystesasWlanConfigMapper.java

@@ -0,0 +1,11 @@
+package com.usky.sas.mapper;
+
+import com.usky.common.mybatis.core.CrudMapper;
+import com.usky.sas.domain.SasSystesasWlanConfig;
+
+/**
+ * 网络配置 Mapper 接口
+ */
+public interface SasSystesasWlanConfigMapper extends CrudMapper<SasSystesasWlanConfig> {
+}
+

+ 11 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/mapper/SasVersionAdminMapper.java

@@ -0,0 +1,11 @@
+package com.usky.sas.mapper;
+
+import com.usky.common.mybatis.core.CrudMapper;
+import com.usky.sas.domain.SasVersionAdmin;
+
+/**
+ * 版本更新 Mapper 接口
+ */
+public interface SasVersionAdminMapper extends CrudMapper<SasVersionAdmin> {
+}
+

+ 11 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/mapper/SasVillageMapper.java

@@ -0,0 +1,11 @@
+package com.usky.sas.mapper;
+
+import com.usky.common.mybatis.core.CrudMapper;
+import com.usky.sas.domain.SasVillage;
+
+/**
+ * 地块信息 Mapper 接口
+ */
+public interface SasVillageMapper extends CrudMapper<SasVillage> {
+}
+

+ 22 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/service/SasAlarsasGroupTypeService.java

@@ -0,0 +1,22 @@
+package com.usky.sas.service;
+
+import com.usky.common.core.bean.CommonPage;
+import com.usky.common.mybatis.core.CrudService;
+import com.usky.sas.domain.SasAlarsasGroupType;
+import com.usky.sas.service.vo.AlarmGroupPageRequest;
+import com.usky.sas.service.vo.AlarmGroupSaveRequest;
+
+/**
+ * 报警联动组类型 服务接口
+ */
+public interface SasAlarsasGroupTypeService extends CrudService<SasAlarsasGroupType> {
+
+    CommonPage<SasAlarsasGroupType> page(AlarmGroupPageRequest request);
+
+    String create(AlarmGroupSaveRequest request);
+
+    void update(String id, AlarmGroupSaveRequest request);
+
+    void delete(String id);
+}
+

+ 21 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/service/SasConfigService.java

@@ -0,0 +1,21 @@
+package com.usky.sas.service;
+
+import com.usky.common.mybatis.core.CrudService;
+import com.usky.sas.domain.SasConfig;
+
+/**
+ * Agbox/Metabus配置 服务接口
+ */
+public interface SasConfigService extends CrudService<SasConfig> {
+
+    /**
+     * 查询配置(单条)
+     */
+    SasConfig getConfig();
+
+    /**
+     * 更新配置
+     */
+    void updateConfig(SasConfig config);
+}
+

+ 42 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/service/SasDeviceService.java

@@ -0,0 +1,42 @@
+package com.usky.sas.service;
+
+import com.usky.common.core.bean.CommonPage;
+import com.usky.common.mybatis.core.CrudService;
+import com.usky.sas.domain.SasDevice;
+import com.usky.sas.service.vo.DeviceConfigPageRequest;
+import com.usky.sas.service.vo.DeviceConfigSaveRequest;
+import com.usky.sas.service.vo.DeviceConfigVO;
+import com.usky.sas.service.vo.DeviceHeartbeatRequest;
+import com.usky.sas.service.vo.DeviceHeartbeatResponse;
+
+/**
+ * 设备信息 服务接口
+ */
+public interface SasDeviceService extends CrudService<SasDevice> {
+
+    /**
+     * 设备心跳分页查询
+     */
+    CommonPage<DeviceHeartbeatResponse> heartbeatPage(DeviceHeartbeatRequest request);
+
+    /**
+     * 设备配置分页查询
+     */
+    CommonPage<DeviceConfigVO> configPage(DeviceConfigPageRequest request);
+
+    /**
+     * 新增设备配置
+     */
+    String createConfig(DeviceConfigSaveRequest request);
+
+    /**
+     * 编辑设备配置
+     */
+    void updateConfig(String id, DeviceConfigSaveRequest request);
+
+    /**
+     * 删除设备配置
+     */
+    void deleteConfig(String id);
+}
+

+ 15 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/service/SasEventPriorityService.java

@@ -0,0 +1,15 @@
+package com.usky.sas.service;
+
+import com.usky.sas.service.vo.EventPriorityConfigRequest;
+import com.usky.sas.service.vo.EventPriorityConfigResponse;
+
+/**
+ * 事件优先级配置 服务接口
+ */
+public interface SasEventPriorityService {
+
+    EventPriorityConfigResponse getConfig();
+
+    void updateConfig(EventPriorityConfigRequest request);
+}
+

+ 22 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/service/SasEventTypeGroupService.java

@@ -0,0 +1,22 @@
+package com.usky.sas.service;
+
+import com.usky.common.core.bean.CommonPage;
+import com.usky.common.mybatis.core.CrudService;
+import com.usky.sas.domain.SasEventTypeGroup;
+import com.usky.sas.service.vo.EventGroupPageRequest;
+import com.usky.sas.service.vo.EventGroupSaveRequest;
+
+/**
+ * 事件类型分组 服务接口
+ */
+public interface SasEventTypeGroupService extends CrudService<SasEventTypeGroup> {
+
+    CommonPage<SasEventTypeGroup> page(EventGroupPageRequest request);
+
+    String create(EventGroupSaveRequest request);
+
+    void update(String id, EventGroupSaveRequest request);
+
+    void delete(String id);
+}
+

+ 9 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/service/SasHomepageService.java

@@ -0,0 +1,9 @@
+package com.usky.sas.service;
+
+import com.usky.sas.service.vo.HomepageInfoResponse;
+
+public interface SasHomepageService {
+
+    HomepageInfoResponse getHomepageInfo();
+}
+

+ 21 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/service/SasIntelligentService.java

@@ -0,0 +1,21 @@
+package com.usky.sas.service;
+
+import com.usky.common.core.bean.CommonPage;
+import com.usky.sas.service.vo.IntelligentEventItem;
+import com.usky.sas.service.vo.IntelligentEventPageRequest;
+
+public interface SasIntelligentService {
+
+    CommonPage<IntelligentEventItem> queryEvents(IntelligentEventPageRequest request);
+
+    CommonPage<IntelligentEventItem> querySnap(IntelligentEventPageRequest request);
+
+    CommonPage<IntelligentEventItem> queryAlarm(IntelligentEventPageRequest request);
+
+    CommonPage<IntelligentEventItem> queryEntrance(IntelligentEventPageRequest request);
+
+    CommonPage<IntelligentEventItem> queryParking(IntelligentEventPageRequest request);
+
+    CommonPage<IntelligentEventItem> queryPatrol(IntelligentEventPageRequest request);
+}
+

+ 12 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/service/SasMapNavigateService.java

@@ -0,0 +1,12 @@
+package com.usky.sas.service;
+
+import com.usky.sas.service.vo.MapDeviceDetailResponse;
+import com.usky.sas.service.vo.MapNavigateResponse;
+
+public interface SasMapNavigateService {
+
+    MapNavigateResponse navigate(String mapId, Double x, Double y);
+
+    MapDeviceDetailResponse deviceDetail(String deviceId);
+}
+

+ 24 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/service/SasMapService.java

@@ -0,0 +1,24 @@
+package com.usky.sas.service;
+
+import com.usky.common.core.bean.CommonPage;
+import com.usky.common.mybatis.core.CrudService;
+import com.usky.sas.domain.SasMaps;
+import com.usky.sas.service.vo.MapDeviceBindRequest;
+import com.usky.sas.service.vo.MapPageRequest;
+import com.usky.sas.service.vo.MapSaveRequest;
+
+public interface SasMapService extends CrudService<SasMaps> {
+
+    CommonPage<SasMaps> page(MapPageRequest request);
+
+    String create(MapSaveRequest request);
+
+    void update(String id, MapSaveRequest request);
+
+    void delete(String id);
+
+    String bindDevice(String mapId, MapDeviceBindRequest request);
+
+    void unbindDevice(String mapId, String deviceId);
+}
+

+ 76 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/service/SasOneStandardSixRealitiesService.java

@@ -0,0 +1,76 @@
+package com.usky.sas.service;
+
+import com.usky.common.core.bean.CommonPage;
+import com.usky.sas.service.vo.*;
+
+/**
+ * 一标六实 服务接口
+ */
+public interface SasOneStandardSixRealitiesService {
+
+    /**
+     * 1.1 实有力量分页查询
+     */
+    CommonPage<PowerListItem> powerPage(OneStandardSixRealitiesPageRequest request);
+
+    /**
+     * 1.2 同步实有力量
+     */
+    int syncPower();
+
+    /**
+     * 2.1 实有设施分页查询
+     */
+    CommonPage<FacilityListItem> facilityPage(OneStandardSixRealitiesPageRequest request);
+
+    /**
+     * 2.2 同步实有设施
+     */
+    int syncFacility();
+
+    /**
+     * 3.1 出入口分页查询
+     */
+    CommonPage<EntranceListItem> entrancePage(OneStandardSixRealitiesPageRequest request);
+
+    /**
+     * 3.2 同步出入口
+     */
+    int syncEntrance();
+
+    /**
+     * 4.1 区域信息分页查询
+     */
+    CommonPage<AreaListItem> areaPage(OneStandardSixRealitiesPageRequest request);
+
+    /**
+     * 4.2 同步区域信息
+     */
+    int syncArea();
+
+    /**
+     * 5.1 房屋信息分页查询
+     */
+    CommonPage<HouseListItem> housePage(OneStandardSixRealitiesPageRequest request);
+
+    /**
+     * 5.2 同步房屋信息
+     */
+    int syncHouse();
+
+    /**
+     * 6.1 地块信息分页查询
+     */
+    CommonPage<VillageListItem> villagePage(OneStandardSixRealitiesPageRequest request);
+
+    /**
+     * 6.2 同步地块信息
+     */
+    int syncVillage();
+
+    /**
+     * 6.3 设置默认地块
+     */
+    void setVillageDefault(String villageCode);
+}
+

+ 73 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/service/SasPersonnelService.java

@@ -0,0 +1,73 @@
+package com.usky.sas.service;
+
+import com.usky.common.core.bean.CommonPage;
+import com.usky.sas.service.vo.PersonnelDetailResponse;
+import com.usky.sas.service.vo.PersonnelListItem;
+import com.usky.sas.service.vo.PersonnelPageRequest;
+
+/**
+ * 人员管理 服务接口
+ */
+public interface SasPersonnelService {
+
+    /**
+     * 白名单分页查询
+     */
+    CommonPage<PersonnelListItem> whitelistPage(PersonnelPageRequest request);
+
+    /**
+     * 同步白名单
+     */
+    int syncWhitelist();
+
+    /**
+     * 白名单详情
+     */
+    PersonnelDetailResponse whitelistDetail(String personCode);
+
+    /**
+     * 黑名单分页查询
+     */
+    CommonPage<PersonnelListItem> blacklistPage(PersonnelPageRequest request);
+
+    /**
+     * 同步黑名单
+     */
+    int syncBlacklist();
+
+    /**
+     * 黑名单详情
+     */
+    PersonnelDetailResponse blacklistDetail(String personCode);
+
+    /**
+     * 在册人员分页查询
+     */
+    CommonPage<PersonnelListItem> registeredPage(PersonnelPageRequest request);
+
+    /**
+     * 同步在册人员
+     */
+    int syncRegistered();
+
+    /**
+     * 在册人员详情
+     */
+    PersonnelDetailResponse registeredDetail(String personCode);
+
+    /**
+     * 关注人员分页查询
+     */
+    CommonPage<PersonnelListItem> followPage(PersonnelPageRequest request);
+
+    /**
+     * 同步关注人员
+     */
+    int syncFollow();
+
+    /**
+     * 关注人员详情
+     */
+    PersonnelDetailResponse followDetail(String personCode);
+}
+

+ 49 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/service/SasSystemService.java

@@ -0,0 +1,49 @@
+package com.usky.sas.service;
+
+import com.usky.common.core.bean.CommonPage;
+import com.usky.sas.service.vo.*;
+
+/**
+ * 系统信息 / 版本 / 备份 服务接口
+ */
+public interface SasSystemService {
+
+    /**
+     * 查询系统信息总览
+     */
+    SystemInfoResponse getSystemInfo();
+
+    /**
+     * 查询系统版本
+     */
+    VersionInfoResponse getVersionInfo();
+
+    /**
+     * 升级系统版本
+     */
+    VersionInfoResponse upgradeVersion();
+
+    /**
+     * 备份数据库
+     */
+    BackupDbResponse backupDatabase();
+
+    /**
+     * 查询备份文件列表
+     */
+    CommonPage<BackupFileItem> backupList(BackupListPageRequest request);
+
+    /**
+     * 恢复数据库
+     */
+    void restoreDatabase(BackupRestoreRequest request);
+
+    /**
+     * 下载备份文件
+     *
+     * @param fileName 备份文件名
+     * @return 文件路径或访问地址
+     */
+    String downloadBackup(String fileName);
+}
+

+ 24 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/service/SasSystesasActivationService.java

@@ -0,0 +1,24 @@
+package com.usky.sas.service;
+
+import com.usky.common.mybatis.core.CrudService;
+import com.usky.sas.domain.SasSystesasActivation;
+
+/**
+ * 系统激活 服务接口
+ */
+public interface SasSystesasActivationService extends CrudService<SasSystesasActivation> {
+
+    /**
+     * 激活系统
+     *
+     * @param licenseKey 激活码
+     * @return 激活信息
+     */
+    SasSystesasActivation activate(String licenseKey);
+
+    /**
+     * 查询当前激活信息
+     */
+    SasSystesasActivation currentActivation();
+}
+

+ 21 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/service/SasSystesasConfigService.java

@@ -0,0 +1,21 @@
+package com.usky.sas.service;
+
+import com.usky.common.mybatis.core.CrudService;
+import com.usky.sas.domain.SasSystesasConfig;
+
+/**
+ * 系统配置 服务接口
+ */
+public interface SasSystesasConfigService extends CrudService<SasSystesasConfig> {
+
+    /**
+     * 查询系统配置(单条)
+     */
+    SasSystesasConfig getConfig();
+
+    /**
+     * 更新系统配置
+     */
+    void updateConfig(SasSystesasConfig config);
+}
+

+ 21 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/service/SasSystesasWlanConfigService.java

@@ -0,0 +1,21 @@
+package com.usky.sas.service;
+
+import com.usky.common.mybatis.core.CrudService;
+import com.usky.sas.domain.SasSystesasWlanConfig;
+
+/**
+ * 网络配置 服务接口
+ */
+public interface SasSystesasWlanConfigService extends CrudService<SasSystesasWlanConfig> {
+
+    /**
+     * 查询网络配置(单条)
+     */
+    SasSystesasWlanConfig getConfig();
+
+    /**
+     * 更新网络配置
+     */
+    void updateConfig(SasSystesasWlanConfig config);
+}
+

+ 15 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/service/SasVideoPatrolService.java

@@ -0,0 +1,15 @@
+package com.usky.sas.service;
+
+import com.usky.sas.service.vo.PatrolConfigResponse;
+import com.usky.sas.service.vo.VideoProtectionConfigResponse;
+
+/**
+ * 视频导出防护 & 实时电子巡检 服务
+ */
+public interface SasVideoPatrolService {
+
+    VideoProtectionConfigResponse getVideoProtectionConfig();
+
+    PatrolConfigResponse getPatrolConfig();
+}
+

+ 22 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/service/SasVideoStreamService.java

@@ -0,0 +1,22 @@
+package com.usky.sas.service;
+
+import com.usky.sas.service.vo.LiveStreamResponse;
+import com.usky.sas.service.vo.PlaybackStreamResponse;
+import com.usky.sas.service.vo.VideoStreamRequest;
+
+/**
+ * 视频流 服务接口
+ */
+public interface SasVideoStreamService {
+
+    /**
+     * 实时直播流
+     */
+    LiveStreamResponse liveStream(VideoStreamRequest request);
+
+    /**
+     * 回放流
+     */
+    PlaybackStreamResponse playbackStream(VideoStreamRequest request);
+}
+

+ 81 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/service/impl/SasAlarsasGroupTypeServiceImpl.java

@@ -0,0 +1,81 @@
+package com.usky.sas.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.usky.common.core.bean.CommonPage;
+import com.usky.common.mybatis.core.AbstractCrudService;
+import com.usky.sas.domain.SasAlarsasGroupType;
+import com.usky.sas.domain.SasDevice;
+import com.usky.sas.mapper.SasAlarsasGroupTypeMapper;
+import com.usky.sas.service.SasAlarsasGroupTypeService;
+import com.usky.sas.service.SasDeviceService;
+import com.usky.sas.service.vo.AlarmGroupPageRequest;
+import com.usky.sas.service.vo.AlarmGroupSaveRequest;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.UUID;
+
+@Service
+public class SasAlarsasGroupTypeServiceImpl extends AbstractCrudService<SasAlarsasGroupTypeMapper, SasAlarsasGroupType>
+        implements SasAlarsasGroupTypeService {
+
+    @Autowired
+    private SasDeviceService sasDeviceService;
+
+    @Override
+    public CommonPage<SasAlarsasGroupType> page(AlarmGroupPageRequest request) {
+        IPage<SasAlarsasGroupType> page = new Page<>(request.getPage(), request.getPageSize());
+        page = this.page(page);
+        return new CommonPage<>(page.getRecords(), page.getTotal(), page.getCurrent(), page.getSize());
+    }
+
+    @Override
+    public String create(AlarmGroupSaveRequest request) {
+        String id = UUID.randomUUID().toString();
+        SasAlarsasGroupType group = new SasAlarsasGroupType();
+        group.setId(id);
+        group.setName(request.getName());
+        group.setNote(request.getNote());
+        this.save(group);
+
+        bindDevices(id, request.getDeviceIds());
+        return id;
+    }
+
+    @Override
+    public void update(String id, AlarmGroupSaveRequest request) {
+        SasAlarsasGroupType group = this.getById(id);
+        if (group == null) {
+            return;
+        }
+        group.setName(request.getName());
+        group.setNote(request.getNote());
+        this.updateById(group);
+
+        bindDevices(id, request.getDeviceIds());
+    }
+
+    @Override
+    public void delete(String id) {
+        this.removeById(id);
+    }
+
+    private void bindDevices(String groupId, List<String> deviceIds) {
+        if (deviceIds == null) {
+            return;
+        }
+        for (String deviceId : deviceIds) {
+            SasDevice device = sasDeviceService.getById(deviceId);
+            if (device == null) {
+                continue;
+            }
+            device.setAlarsasGroupType(groupId);
+            device.setUpdateTime(LocalDateTime.now());
+            sasDeviceService.updateById(device);
+        }
+    }
+}
+

+ 47 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/service/impl/SasConfigServiceImpl.java

@@ -0,0 +1,47 @@
+package com.usky.sas.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.usky.common.mybatis.core.AbstractCrudService;
+import com.usky.sas.domain.SasConfig;
+import com.usky.sas.mapper.SasConfigMapper;
+import com.usky.sas.service.SasConfigService;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+
+/**
+ * Agbox/Metabus配置 服务实现
+ */
+@Service
+public class SasConfigServiceImpl extends AbstractCrudService<SasConfigMapper, SasConfig>
+        implements SasConfigService {
+
+    @Override
+    public SasConfig getConfig() {
+        LambdaQueryWrapper<SasConfig> wrapper = new LambdaQueryWrapper<>();
+        wrapper.last("limit 1");
+        return this.getOne(wrapper, false);
+    }
+
+    @Override
+    public void updateConfig(SasConfig config) {
+        LocalDateTime now = LocalDateTime.now();
+        SasConfig exist = null;
+        if (config.getId() != null) {
+            exist = this.getById(config.getId());
+        } else {
+            exist = getConfig();
+        }
+        if (exist == null) {
+            config.setCreateTime(now);
+            config.setUpdateTime(now);
+            this.save(config);
+        } else {
+            config.setId(exist.getId());
+            config.setCreateTime(exist.getCreateTime());
+            config.setUpdateTime(now);
+            this.updateById(config);
+        }
+    }
+}
+

+ 156 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/service/impl/SasDeviceServiceImpl.java

@@ -0,0 +1,156 @@
+package com.usky.sas.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.usky.common.core.bean.CommonPage;
+import com.usky.common.mybatis.core.AbstractCrudService;
+import com.usky.sas.domain.SasDevice;
+import com.usky.sas.mapper.SasDeviceMapper;
+import com.usky.sas.service.SasDeviceService;
+import com.usky.sas.service.vo.DeviceConfigPageRequest;
+import com.usky.sas.service.vo.DeviceConfigSaveRequest;
+import com.usky.sas.service.vo.DeviceConfigVO;
+import com.usky.sas.service.vo.DeviceHeartbeatRequest;
+import com.usky.sas.service.vo.DeviceHeartbeatResponse;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.time.temporal.ChronoUnit;
+import java.util.List;
+import java.util.UUID;
+import java.util.stream.Collectors;
+
+/**
+ * 设备信息 服务实现
+ */
+@Service
+public class SasDeviceServiceImpl extends AbstractCrudService<SasDeviceMapper, SasDevice>
+        implements SasDeviceService {
+
+    @Override
+    public CommonPage<DeviceHeartbeatResponse> heartbeatPage(DeviceHeartbeatRequest request) {
+        IPage<SasDevice> page = new Page<>(request.getPage(), request.getPageSize());
+        QueryWrapper<SasDevice> wrapper = new QueryWrapper<>();
+        if (request.getDeviceId() != null && !request.getDeviceId().isEmpty()) {
+            wrapper.lambda().eq(SasDevice::getDeviceId, request.getDeviceId());
+        }
+        if (request.getDeviceType() != null) {
+            wrapper.lambda().eq(SasDevice::getDeviceType, request.getDeviceType());
+        }
+        wrapper.orderByDesc("trigger_time");
+        page = this.page(page, wrapper);
+
+        List<DeviceHeartbeatResponse> list = page.getRecords().stream().map(d -> {
+            DeviceHeartbeatResponse vo = new DeviceHeartbeatResponse();
+            vo.setId(d.getId());
+            vo.setDeviceId(d.getDeviceId());
+            vo.setDeviceType(d.getDeviceType());
+            vo.setIpAddr(d.getIpAddr());
+            vo.setTriggerTime(d.getTriggerTime());
+            vo.setLastHeartbeat(d.getTriggerTime());
+            if (d.getTriggerTime() != null) {
+                long seconds = ChronoUnit.SECONDS.between(d.getTriggerTime(), LocalDateTime.now());
+                vo.setStatus(seconds <= 60 ? "online" : "offline");
+            } else {
+                vo.setStatus("offline");
+            }
+            return vo;
+        }).collect(Collectors.toList());
+
+        return new CommonPage<>(list, page.getTotal(), page.getCurrent(), page.getSize());
+    }
+
+    @Override
+    public CommonPage<DeviceConfigVO> configPage(DeviceConfigPageRequest request) {
+        IPage<SasDevice> page = new Page<>(request.getPage(), request.getPageSize());
+        QueryWrapper<SasDevice> wrapper = new QueryWrapper<>();
+        if (request.getAlarmGroupType() != null && !request.getAlarmGroupType().isEmpty()) {
+            wrapper.lambda().eq(SasDevice::getAlarsasGroupType, request.getAlarmGroupType());
+        }
+        if (request.getVideoGroupType() != null && !request.getVideoGroupType().isEmpty()) {
+            wrapper.lambda().eq(SasDevice::getVideoGroupType, request.getVideoGroupType());
+        }
+        if (request.getDeviceType() != null) {
+            wrapper.lambda().eq(SasDevice::getDeviceType, request.getDeviceType());
+        }
+        if (request.getDeviceId() != null && !request.getDeviceId().isEmpty()) {
+            wrapper.lambda().eq(SasDevice::getDeviceId, request.getDeviceId());
+        }
+        if (request.getIpAddr() != null && !request.getIpAddr().isEmpty()) {
+            wrapper.lambda().eq(SasDevice::getIpAddr, request.getIpAddr());
+        }
+        wrapper.orderByDesc("create_time");
+        page = this.page(page, wrapper);
+
+        List<DeviceConfigVO> list = page.getRecords().stream().map(this::toConfigVO).collect(Collectors.toList());
+        return new CommonPage<>(list, page.getTotal(), page.getCurrent(), page.getSize());
+    }
+
+    @Override
+    public String createConfig(DeviceConfigSaveRequest request) {
+        SasDevice device = new SasDevice();
+        device.setId(UUID.randomUUID().toString());
+        applyConfig(device, request);
+        LocalDateTime now = LocalDateTime.now();
+        device.setCreateTime(now);
+        device.setUpdateTime(now);
+        this.save(device);
+        return device.getId();
+    }
+
+    @Override
+    public void updateConfig(String id, DeviceConfigSaveRequest request) {
+        SasDevice device = this.getById(id);
+        if (device == null) {
+            return;
+        }
+        applyConfig(device, request);
+        device.setUpdateTime(LocalDateTime.now());
+        this.updateById(device);
+    }
+
+    @Override
+    public void deleteConfig(String id) {
+        this.removeById(id);
+    }
+
+    private void applyConfig(SasDevice device, DeviceConfigSaveRequest request) {
+        device.setDeviceId(request.getDeviceId());
+        device.setChannel(request.getChannel());
+        device.setDeviceType(request.getDeviceType());
+        device.setIpAddr(request.getIpAddr());
+        device.setPort(request.getPort());
+        device.setUsername(request.getUsername());
+        device.setPassword(request.getPassword());
+        device.setShield(request.getShield());
+        device.setVillageCode(request.getVillageCode());
+        device.setHouseCode(request.getHouseCode());
+        device.setAddress(request.getAddress());
+        device.setVideoGroupType(request.getVideoGroupType());
+        device.setAlarsasGroupType(request.getAlarmGroupType());
+        device.setNote(request.getNote());
+    }
+
+    private DeviceConfigVO toConfigVO(SasDevice d) {
+        DeviceConfigVO vo = new DeviceConfigVO();
+        vo.setId(d.getId());
+        vo.setDeviceId(d.getDeviceId());
+        vo.setChannel(d.getChannel());
+        vo.setDeviceType(d.getDeviceType());
+        vo.setIpAddr(d.getIpAddr());
+        vo.setPort(d.getPort());
+        vo.setUsername(d.getUsername());
+        vo.setShield(d.getShield());
+        vo.setVillageCode(d.getVillageCode());
+        vo.setHouseCode(d.getHouseCode());
+        vo.setAddress(d.getAddress());
+        vo.setVideoGroupType(d.getVideoGroupType());
+        vo.setAlarmGroupType(d.getAlarsasGroupType());
+        vo.setNote(d.getNote());
+        vo.setCreateTime(d.getCreateTime());
+        vo.setUpdateTime(d.getUpdateTime());
+        return vo;
+    }
+}
+

+ 75 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/service/impl/SasEventPriorityServiceImpl.java

@@ -0,0 +1,75 @@
+package com.usky.sas.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.usky.sas.domain.SasEventTypeGroup;
+import com.usky.sas.service.SasEventPriorityService;
+import com.usky.sas.service.SasEventTypeGroupService;
+import com.usky.sas.service.vo.EventPriorityConfigRequest;
+import com.usky.sas.service.vo.EventPriorityConfigResponse;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 事件优先级配置 服务实现
+ *
+ * 说明:这里直接基于事件组上的 eventLevel 字段做分类:
+ * 1: urgent, 2: high, 3: normal, 其他: none
+ */
+@Service
+public class SasEventPriorityServiceImpl implements SasEventPriorityService {
+
+    @Autowired
+    private SasEventTypeGroupService eventTypeGroupService;
+
+    @Override
+    public EventPriorityConfigResponse getConfig() {
+        List<SasEventTypeGroup> all = eventTypeGroupService.list(new LambdaQueryWrapper<>());
+        EventPriorityConfigResponse resp = new EventPriorityConfigResponse();
+        resp.setUrgent(filterByLevel(all, 1));
+        resp.setHigh(filterByLevel(all, 2));
+        resp.setNormal(filterByLevel(all, 3));
+        resp.setNone(filterByLevel(all, null));
+        return resp;
+    }
+
+    private List<String> filterByLevel(List<SasEventTypeGroup> all, Integer level) {
+        List<String> ids = new ArrayList<>();
+        for (SasEventTypeGroup g : all) {
+            Integer lv = g.getEventLevel();
+            if (level == null) {
+                if (lv == null || (lv != 1 && lv != 2 && lv != 3)) {
+                    ids.add(g.getId());
+                }
+            } else if (level.equals(lv)) {
+                ids.add(g.getId());
+            }
+        }
+        return ids;
+    }
+
+    @Override
+    public void updateConfig(EventPriorityConfigRequest request) {
+        updateLevel(request.getUrgent(), 1);
+        updateLevel(request.getHigh(), 2);
+        updateLevel(request.getNormal(), 3);
+        updateLevel(request.getNone(), null);
+    }
+
+    private void updateLevel(List<String> ids, Integer level) {
+        if (ids == null) {
+            return;
+        }
+        for (String id : ids) {
+            SasEventTypeGroup group = eventTypeGroupService.getById(id);
+            if (group == null) {
+                continue;
+            }
+            group.setEventLevel(level);
+            eventTypeGroupService.updateById(group);
+        }
+    }
+}
+

+ 88 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/service/impl/SasEventTypeGroupServiceImpl.java

@@ -0,0 +1,88 @@
+package com.usky.sas.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.usky.common.core.bean.CommonPage;
+import com.usky.common.mybatis.core.AbstractCrudService;
+import com.usky.sas.domain.SasEventTypeGroup;
+import com.usky.sas.mapper.SasEventTypeGroupMapper;
+import com.usky.sas.service.SasEventTypeGroupService;
+import com.usky.sas.service.vo.EventGroupPageRequest;
+import com.usky.sas.service.vo.EventGroupSaveRequest;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.util.UUID;
+import java.util.stream.Collectors;
+
+@Service
+public class SasEventTypeGroupServiceImpl extends AbstractCrudService<SasEventTypeGroupMapper, SasEventTypeGroup>
+        implements SasEventTypeGroupService {
+
+    @Override
+    public CommonPage<SasEventTypeGroup> page(EventGroupPageRequest request) {
+        IPage<SasEventTypeGroup> page = new Page<>(request.getPage(), request.getPageSize());
+        LambdaQueryWrapper<SasEventTypeGroup> wrapper = new LambdaQueryWrapper<>();
+        if (request.getDeviceType() != null) {
+            wrapper.eq(SasEventTypeGroup::getDeviceType, request.getDeviceType());
+        }
+        if (request.getName() != null && !request.getName().isEmpty()) {
+            wrapper.like(SasEventTypeGroup::getName, request.getName());
+        }
+        wrapper.orderByDesc(SasEventTypeGroup::getCreateTime);
+        page = this.page(page, wrapper);
+        return new CommonPage<>(page.getRecords(), page.getTotal(), page.getCurrent(), page.getSize());
+    }
+
+    @Override
+    public String create(EventGroupSaveRequest request) {
+        SasEventTypeGroup group = new SasEventTypeGroup();
+        group.setId(UUID.randomUUID().toString());
+        group.setName(request.getName());
+        group.setDeviceType(request.getDeviceType());
+        if (request.getEventCodes() != null) {
+            group.setEventCodes(request.getEventCodes().stream()
+                    .map(String::valueOf)
+                    .collect(Collectors.joining(",")));
+        }
+        group.setEventLevel(request.getEventLevel());
+        group.setCanDel(true);
+        LocalDateTime now = LocalDateTime.now();
+        group.setCreateTime(now);
+        group.setUpdateTime(now);
+        this.save(group);
+        return group.getId();
+    }
+
+    @Override
+    public void update(String id, EventGroupSaveRequest request) {
+        SasEventTypeGroup group = this.getById(id);
+        if (group == null) {
+            return;
+        }
+        group.setName(request.getName());
+        group.setDeviceType(request.getDeviceType());
+        if (request.getEventCodes() != null) {
+            group.setEventCodes(request.getEventCodes().stream()
+                    .map(String::valueOf)
+                    .collect(Collectors.joining(",")));
+        }
+        group.setEventLevel(request.getEventLevel());
+        group.setUpdateTime(LocalDateTime.now());
+        this.updateById(group);
+    }
+
+    @Override
+    public void delete(String id) {
+        SasEventTypeGroup group = this.getById(id);
+        if (group == null) {
+            return;
+        }
+        if (Boolean.FALSE.equals(group.getCanDel())) {
+            return;
+        }
+        this.removeById(id);
+    }
+}
+

+ 76 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/service/impl/SasHomepageServiceImpl.java

@@ -0,0 +1,76 @@
+package com.usky.sas.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.usky.sas.domain.SasCollectionEvent;
+import com.usky.sas.domain.SasDevice;
+import com.usky.sas.mapper.SasCollectionEventMapper;
+import com.usky.sas.mapper.SasDeviceMapper;
+import com.usky.sas.service.SasHomepageService;
+import com.usky.sas.service.vo.HomepageInfoResponse;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.temporal.ChronoUnit;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Service
+public class SasHomepageServiceImpl implements SasHomepageService {
+
+    @Autowired
+    private SasDeviceMapper sasDeviceMapper;
+
+    @Autowired
+    private SasCollectionEventMapper sasCollectionEventMapper;
+
+    @Override
+    public HomepageInfoResponse getHomepageInfo() {
+        List<SasDevice> devices = sasDeviceMapper.selectList(Wrappers.lambdaQuery());
+
+        HomepageInfoResponse resp = new HomepageInfoResponse();
+        resp.setCameras(devices.stream().map(this::toCameraItem).collect(Collectors.toList()));
+
+        HomepageInfoResponse.Statistics stat = new HomepageInfoResponse.Statistics();
+        stat.setTotalDevices((long) devices.size());
+        stat.setOnlineDevices(devices.stream().filter(this::isOnline).count());
+
+        LocalDateTime startOfDay = LocalDateTime.of(LocalDate.now(), LocalTime.MIN);
+        LocalDateTime endOfDay = LocalDateTime.of(LocalDate.now(), LocalTime.MAX);
+        LambdaQueryWrapper<SasCollectionEvent> wrapper = Wrappers.lambdaQuery();
+        wrapper.between(SasCollectionEvent::getTriggerTime, startOfDay, endOfDay);
+        long todayEvents = sasCollectionEventMapper.selectCount(wrapper);
+        stat.setTodayEvents(todayEvents);
+
+        // 暂无单独报警事件表,这里先与今日事件数保持一致
+        stat.setAlarmEvents(todayEvents);
+
+        resp.setStatistics(stat);
+        return resp;
+    }
+
+    private HomepageInfoResponse.CameraItem toCameraItem(SasDevice d) {
+        HomepageInfoResponse.CameraItem c = new HomepageInfoResponse.CameraItem();
+        c.setId(d.getId());
+        c.setName(d.getDeviceId());
+        c.setIpAddr(d.getIpAddr());
+        c.setStatus(isOnline(d) ? "online" : "offline");
+        if (d.getIpAddr() != null) {
+            c.setLiveUrl("rtsp://" + d.getIpAddr() + ":554/stream");
+        }
+        c.setPlaybackUrl("http://192.168.10.151/playback");
+        return c;
+    }
+
+    private boolean isOnline(SasDevice d) {
+        if (d.getTriggerTime() == null) {
+            return false;
+        }
+        long seconds = ChronoUnit.SECONDS.between(d.getTriggerTime(), LocalDateTime.now());
+        return seconds <= 60;
+    }
+}
+

+ 264 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/service/impl/SasIntelligentServiceImpl.java

@@ -0,0 +1,264 @@
+package com.usky.sas.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.usky.common.core.bean.CommonPage;
+import com.usky.sas.domain.SasAlarsasEvent;
+import com.usky.sas.domain.SasEntranceEvent;
+import com.usky.sas.domain.SasParkingEvent;
+import com.usky.sas.domain.SasPatrolEvent;
+import com.usky.sas.domain.SasSnapEvent;
+import com.usky.sas.mapper.SasAlarsasEventMapper;
+import com.usky.sas.mapper.SasEntranceEventMapper;
+import com.usky.sas.mapper.SasParkingEventMapper;
+import com.usky.sas.mapper.SasPatrolEventMapper;
+import com.usky.sas.mapper.SasSnapEventMapper;
+import com.usky.sas.service.SasIntelligentService;
+import com.usky.sas.service.vo.IntelligentEventItem;
+import com.usky.sas.service.vo.IntelligentEventPageRequest;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Service
+public class SasIntelligentServiceImpl implements SasIntelligentService {
+
+    @Autowired
+    private SasSnapEventMapper sasSnapEventMapper;
+
+    @Autowired
+    private SasAlarsasEventMapper sasAlarsasEventMapper;
+
+    @Autowired
+    private SasEntranceEventMapper sasEntranceEventMapper;
+
+    @Autowired
+    private SasParkingEventMapper sasParkingEventMapper;
+
+    @Autowired
+    private SasPatrolEventMapper sasPatrolEventMapper;
+
+    @Override
+    public CommonPage<IntelligentEventItem> queryEvents(IntelligentEventPageRequest request) {
+        // 按 eventType 分发
+        switch (request.getEventType()) {
+            case "snap":
+                return querySnap(request);
+            case "alarm":
+                return queryAlarm(request);
+            case "entrance":
+                return queryEntrance(request);
+            case "parking":
+                return queryParking(request);
+            case "patrol":
+                return queryPatrol(request);
+            default:
+                return querySnap(request);
+        }
+    }
+
+    @Override
+    public CommonPage<IntelligentEventItem> querySnap(IntelligentEventPageRequest request) {
+        IPage<SasSnapEvent> page = new Page<>(request.getPage(), request.getPageSize());
+        LambdaQueryWrapper<SasSnapEvent> wrapper = buildSnapWrapper(request);
+        page = sasSnapEventMapper.selectPage(page, wrapper);
+        List<IntelligentEventItem> list = page.getRecords().stream().map(this::fromSnap).collect(Collectors.toList());
+        return new CommonPage<>(list, page.getTotal(), page.getCurrent(), page.getSize());
+    }
+
+    @Override
+    public CommonPage<IntelligentEventItem> queryAlarm(IntelligentEventPageRequest request) {
+        IPage<SasAlarsasEvent> page = new Page<>(request.getPage(), request.getPageSize());
+        LambdaQueryWrapper<SasAlarsasEvent> wrapper = buildAlarmWrapper(request);
+        page = sasAlarsasEventMapper.selectPage(page, wrapper);
+        List<IntelligentEventItem> list = page.getRecords().stream().map(this::fromAlarm).collect(Collectors.toList());
+        return new CommonPage<>(list, page.getTotal(), page.getCurrent(), page.getSize());
+    }
+
+    @Override
+    public CommonPage<IntelligentEventItem> queryEntrance(IntelligentEventPageRequest request) {
+        IPage<SasEntranceEvent> page = new Page<>(request.getPage(), request.getPageSize());
+        LambdaQueryWrapper<SasEntranceEvent> wrapper = buildEntranceWrapper(request);
+        page = sasEntranceEventMapper.selectPage(page, wrapper);
+        List<IntelligentEventItem> list = page.getRecords().stream().map(this::fromEntrance).collect(Collectors.toList());
+        return new CommonPage<>(list, page.getTotal(), page.getCurrent(), page.getSize());
+    }
+
+    @Override
+    public CommonPage<IntelligentEventItem> queryParking(IntelligentEventPageRequest request) {
+        IPage<SasParkingEvent> page = new Page<>(request.getPage(), request.getPageSize());
+        LambdaQueryWrapper<SasParkingEvent> wrapper = buildParkingWrapper(request);
+        page = sasParkingEventMapper.selectPage(page, wrapper);
+        List<IntelligentEventItem> list = page.getRecords().stream().map(this::fromParking).collect(Collectors.toList());
+        return new CommonPage<>(list, page.getTotal(), page.getCurrent(), page.getSize());
+    }
+
+    @Override
+    public CommonPage<IntelligentEventItem> queryPatrol(IntelligentEventPageRequest request) {
+        IPage<SasPatrolEvent> page = new Page<>(request.getPage(), request.getPageSize());
+        LambdaQueryWrapper<SasPatrolEvent> wrapper = buildPatrolWrapper(request);
+        page = sasPatrolEventMapper.selectPage(page, wrapper);
+        List<IntelligentEventItem> list = page.getRecords().stream().map(this::fromPatrol).collect(Collectors.toList());
+        return new CommonPage<>(list, page.getTotal(), page.getCurrent(), page.getSize());
+    }
+
+    private LambdaQueryWrapper<SasSnapEvent> buildSnapWrapper(IntelligentEventPageRequest request) {
+        LambdaQueryWrapper<SasSnapEvent> wrapper = new LambdaQueryWrapper<>();
+        if (request.getDeviceId() != null && !request.getDeviceId().isEmpty()) {
+            wrapper.eq(SasSnapEvent::getDeviceId, request.getDeviceId());
+        }
+        if (request.getStartTime() != null) {
+            wrapper.ge(SasSnapEvent::getTriggerTime, request.getStartTime());
+        }
+        if (request.getEndTime() != null) {
+            wrapper.le(SasSnapEvent::getTriggerTime, request.getEndTime());
+        }
+        wrapper.orderByDesc(SasSnapEvent::getTriggerTime);
+        return wrapper;
+    }
+
+    private LambdaQueryWrapper<SasAlarsasEvent> buildAlarmWrapper(IntelligentEventPageRequest request) {
+        LambdaQueryWrapper<SasAlarsasEvent> wrapper = new LambdaQueryWrapper<>();
+        if (request.getDeviceId() != null && !request.getDeviceId().isEmpty()) {
+            wrapper.eq(SasAlarsasEvent::getDeviceId, request.getDeviceId());
+        }
+        if (request.getStartTime() != null) {
+            wrapper.ge(SasAlarsasEvent::getTriggerTime, request.getStartTime());
+        }
+        if (request.getEndTime() != null) {
+            wrapper.le(SasAlarsasEvent::getTriggerTime, request.getEndTime());
+        }
+        wrapper.orderByDesc(SasAlarsasEvent::getTriggerTime);
+        return wrapper;
+    }
+
+    private LambdaQueryWrapper<SasEntranceEvent> buildEntranceWrapper(IntelligentEventPageRequest request) {
+        LambdaQueryWrapper<SasEntranceEvent> wrapper = new LambdaQueryWrapper<>();
+        if (request.getDeviceId() != null && !request.getDeviceId().isEmpty()) {
+            wrapper.eq(SasEntranceEvent::getDeviceId, request.getDeviceId());
+        }
+        if (request.getStartTime() != null) {
+            wrapper.ge(SasEntranceEvent::getTriggerTime, request.getStartTime());
+        }
+        if (request.getEndTime() != null) {
+            wrapper.le(SasEntranceEvent::getTriggerTime, request.getEndTime());
+        }
+        wrapper.orderByDesc(SasEntranceEvent::getTriggerTime);
+        return wrapper;
+    }
+
+    private LambdaQueryWrapper<SasParkingEvent> buildParkingWrapper(IntelligentEventPageRequest request) {
+        LambdaQueryWrapper<SasParkingEvent> wrapper = new LambdaQueryWrapper<>();
+        if (request.getDeviceId() != null && !request.getDeviceId().isEmpty()) {
+            wrapper.eq(SasParkingEvent::getDeviceId, request.getDeviceId());
+        }
+        if (request.getStartTime() != null) {
+            wrapper.ge(SasParkingEvent::getTriggerTime, request.getStartTime());
+        }
+        if (request.getEndTime() != null) {
+            wrapper.le(SasParkingEvent::getTriggerTime, request.getEndTime());
+        }
+        wrapper.orderByDesc(SasParkingEvent::getTriggerTime);
+        return wrapper;
+    }
+
+    private LambdaQueryWrapper<SasPatrolEvent> buildPatrolWrapper(IntelligentEventPageRequest request) {
+        LambdaQueryWrapper<SasPatrolEvent> wrapper = new LambdaQueryWrapper<>();
+        if (request.getDeviceId() != null && !request.getDeviceId().isEmpty()) {
+            wrapper.eq(SasPatrolEvent::getDeviceId, request.getDeviceId());
+        }
+        if (request.getStartTime() != null) {
+            wrapper.ge(SasPatrolEvent::getTriggerTime, request.getStartTime());
+        }
+        if (request.getEndTime() != null) {
+            wrapper.le(SasPatrolEvent::getTriggerTime, request.getEndTime());
+        }
+        wrapper.orderByDesc(SasPatrolEvent::getTriggerTime);
+        return wrapper;
+    }
+
+    private IntelligentEventItem fromSnap(SasSnapEvent e) {
+        IntelligentEventItem item = new IntelligentEventItem();
+        item.setEventId(e.getEventId());
+        item.setDeviceId(e.getDeviceId());
+        item.setChannel(e.getChannel());
+        item.setTriggerTime(e.getTriggerTime());
+        item.setEventCode(e.getEventCode());
+        item.setScenePicId(e.getScenePicId());
+        item.setEventPicId(e.getEventPicId());
+        item.setSimilarity(e.getSimilarity());
+        item.setPersonCode(e.getPersonCode());
+        item.setNotify(e.getNotify());
+        item.setScene(e.getScene());
+        return item;
+    }
+
+    private IntelligentEventItem fromAlarm(SasAlarsasEvent e) {
+        IntelligentEventItem item = new IntelligentEventItem();
+        item.setEventId(e.getEventId());
+        item.setDeviceId(e.getDeviceId());
+        item.setChannel(e.getChannel());
+        item.setTriggerTime(e.getTriggerTime());
+        item.setEventCode(e.getEventCode());
+        item.setPicId(e.getPicId());
+        item.setRelPerson(e.getRelPerson());
+        item.setDealPerson(e.getDealPerson());
+        item.setEventSystem(e.getEventSystem());
+        return item;
+    }
+
+    private IntelligentEventItem fromEntrance(SasEntranceEvent e) {
+        IntelligentEventItem item = new IntelligentEventItem();
+        item.setEventId(e.getEventId());
+        item.setDeviceId(e.getDeviceId());
+        item.setChannel(e.getChannel());
+        item.setCertifiedType(e.getCertifiedType());
+        item.setCertifiedNo(e.getCertifiedNo());
+        item.setPersonName(e.getName());
+        item.setPhone(e.getPhone());
+        item.setTriggerTime(e.getTriggerTime());
+        item.setEventCode(e.getEventCode());
+        item.setCardId(e.getCardId());
+        item.setSimilarity(e.getSimilarity());
+        item.setPicId(e.getPicId());
+        return item;
+    }
+
+    private IntelligentEventItem fromParking(SasParkingEvent e) {
+        IntelligentEventItem item = new IntelligentEventItem();
+        item.setEventId(e.getEventId());
+        item.setDeviceId(e.getDeviceId());
+        item.setChannel(e.getChannel());
+        item.setTriggerTime(e.getTriggerTime());
+        item.setEventCode(e.getEventCode());
+        item.setEntranceCode(e.getEntranceCode());
+        item.setPlateNo(e.getPlateNo());
+        item.setPlateType(e.getPlateType());
+        item.setPlateColor(e.getPlateColor());
+        item.setCarType(e.getCarType());
+        item.setAccessType(e.getAccessType());
+        item.setSimilarity(e.getSimilarity());
+        item.setPicId(e.getPlatePicId());
+        item.setEventPicId(e.getEventPicId());
+        return item;
+    }
+
+    private IntelligentEventItem fromPatrol(SasPatrolEvent e) {
+        IntelligentEventItem item = new IntelligentEventItem();
+        item.setEventId(e.getEventId());
+        item.setDeviceId(e.getDeviceId());
+        item.setChannel(e.getChannel());
+        item.setTriggerTime(e.getTriggerTime());
+        item.setEventCode(e.getEventCode());
+        item.setName(e.getName());
+        item.setCredentialType(e.getCredentialType());
+        item.setCredentialNo(e.getCredentialNo());
+        item.setTypeName(e.getTypeName());
+        item.setPicId(e.getPicId());
+        return item;
+    }
+}
+

+ 97 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/service/impl/SasMapNavigateServiceImpl.java

@@ -0,0 +1,97 @@
+package com.usky.sas.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.usky.sas.domain.SasDevice;
+import com.usky.sas.domain.SasMapDevice;
+import com.usky.sas.domain.SasMaps;
+import com.usky.sas.mapper.SasDeviceMapper;
+import com.usky.sas.mapper.SasMapDeviceMapper;
+import com.usky.sas.mapper.SasMapsMapper;
+import com.usky.sas.service.SasMapNavigateService;
+import com.usky.sas.service.vo.MapDeviceDetailResponse;
+import com.usky.sas.service.vo.MapNavigateResponse;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.time.temporal.ChronoUnit;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Service
+public class SasMapNavigateServiceImpl implements SasMapNavigateService {
+
+    @Autowired
+    private SasMapsMapper sasMapsMapper;
+
+    @Autowired
+    private SasMapDeviceMapper sasMapDeviceMapper;
+
+    @Autowired
+    private SasDeviceMapper sasDeviceMapper;
+
+    @Override
+    public MapNavigateResponse navigate(String mapId, Double x, Double y) {
+        SasMaps map = sasMapsMapper.selectById(mapId);
+        if (map == null) {
+            return null;
+        }
+        LambdaQueryWrapper<SasMapDevice> wrapper = Wrappers.lambdaQuery();
+        wrapper.eq(SasMapDevice::getMapId, mapId);
+        List<SasMapDevice> mapDevices = sasMapDeviceMapper.selectList(wrapper);
+
+        MapNavigateResponse resp = new MapNavigateResponse();
+        MapNavigateResponse.MapInfo mapInfo = new MapNavigateResponse.MapInfo();
+        mapInfo.setId(map.getId());
+        mapInfo.setName(map.getName());
+        // 这里仅返回图片ID,真实 URL 可由前端拼接
+        mapInfo.setBackImgUrl(map.getBackImgId());
+        resp.setMap(mapInfo);
+
+        resp.setDevices(mapDevices.stream().map(d -> {
+            MapNavigateResponse.MapDeviceInfo md = new MapNavigateResponse.MapDeviceInfo();
+            md.setId(d.getId());
+            md.setDeviceId(d.getDeviceId());
+            md.setDeviceName(d.getText());
+            md.setDeviceType(d.getType());
+            md.setX(d.getX() != null ? d.getX().doubleValue() : null);
+            md.setY(d.getY() != null ? d.getY().doubleValue() : null);
+            SasDevice device = sasDeviceMapper.selectById(d.getDeviceId());
+            md.setStatus(isOnline(device) ? "online" : "offline");
+            return md;
+        }).collect(Collectors.toList()));
+
+        return resp;
+    }
+
+    @Override
+    public MapDeviceDetailResponse deviceDetail(String deviceId) {
+        SasDevice device = sasDeviceMapper.selectById(deviceId);
+        if (device == null) {
+            return null;
+        }
+        MapDeviceDetailResponse resp = new MapDeviceDetailResponse();
+        resp.setId(device.getId());
+        resp.setDeviceId(device.getDeviceId());
+        resp.setName(device.getDeviceId());
+        resp.setType("camera");
+        resp.setIpAddr(device.getIpAddr());
+        resp.setStatus(isOnline(device) ? "online" : "offline");
+        if (device.getIpAddr() != null) {
+            resp.setLiveUrl("rtsp://" + device.getIpAddr() + ":554/stream");
+        }
+        resp.setPlaybackUrl("http://192.168.10.151/playback");
+        resp.setAddress(device.getAddress());
+        return resp;
+    }
+
+    private boolean isOnline(SasDevice d) {
+        if (d == null || d.getTriggerTime() == null) {
+            return false;
+        }
+        long seconds = ChronoUnit.SECONDS.between(d.getTriggerTime(), LocalDateTime.now());
+        return seconds <= 60;
+    }
+}
+

+ 116 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/service/impl/SasMapServiceImpl.java

@@ -0,0 +1,116 @@
+package com.usky.sas.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.usky.common.core.bean.CommonPage;
+import com.usky.common.mybatis.core.AbstractCrudService;
+import com.usky.sas.domain.SasMapDevice;
+import com.usky.sas.domain.SasMaps;
+import com.usky.sas.mapper.SasMapDeviceMapper;
+import com.usky.sas.mapper.SasMapsMapper;
+import com.usky.sas.service.SasMapService;
+import com.usky.sas.service.vo.MapDeviceBindRequest;
+import com.usky.sas.service.vo.MapPageRequest;
+import com.usky.sas.service.vo.MapSaveRequest;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.UUID;
+
+@Service
+public class SasMapServiceImpl extends AbstractCrudService<SasMapsMapper, SasMaps>
+        implements SasMapService {
+
+    @Autowired
+    private SasMapDeviceMapper mapDeviceMapper;
+
+    @Override
+    public CommonPage<SasMaps> page(MapPageRequest request) {
+        IPage<SasMaps> page = new Page<>(request.getPage(), request.getPageSize());
+        LambdaQueryWrapper<SasMaps> wrapper = new LambdaQueryWrapper<>();
+        if (request.getParentId() != null) {
+            wrapper.eq(SasMaps::getParentId, request.getParentId());
+        }
+        wrapper.orderByDesc(SasMaps::getCreateTime);
+        page = this.page(page, wrapper);
+        return new CommonPage<>(page.getRecords(), page.getTotal(), page.getCurrent(), page.getSize());
+    }
+
+    @Override
+    public String create(MapSaveRequest request) {
+        SasMaps map = new SasMaps();
+        String id = UUID.randomUUID().toString();
+        map.setId(id);
+        applyMap(map, request);
+        LocalDateTime now = LocalDateTime.now();
+        map.setCreateTime(now);
+        map.setUpdateTime(now);
+        this.save(map);
+        return id;
+    }
+
+    @Override
+    public void update(String id, MapSaveRequest request) {
+        SasMaps map = this.getById(id);
+        if (map == null) {
+            return;
+        }
+        applyMap(map, request);
+        map.setUpdateTime(LocalDateTime.now());
+        this.updateById(map);
+    }
+
+    @Override
+    public void delete(String id) {
+        this.removeById(id);
+    }
+
+    @Override
+    public String bindDevice(String mapId, MapDeviceBindRequest request) {
+        SasMapDevice mapDevice = new SasMapDevice();
+        String id = UUID.randomUUID().toString();
+        mapDevice.setId(id);
+        mapDevice.setMapId(mapId);
+        mapDevice.setDeviceId(request.getDeviceId());
+        mapDevice.setImgId(request.getImgId());
+        mapDevice.setType(request.getType());
+        if (request.getX() != null) {
+            mapDevice.setX(BigDecimal.valueOf(request.getX()));
+        }
+        if (request.getY() != null) {
+            mapDevice.setY(BigDecimal.valueOf(request.getY()));
+        }
+        mapDevice.setWidth(request.getWidth());
+        mapDevice.setHeight(request.getHeight());
+        mapDevice.setAngle(request.getAngle());
+        mapDevice.setText(request.getText());
+        LocalDateTime now = LocalDateTime.now();
+        mapDevice.setCreateTime(now);
+        mapDevice.setUpdateTime(now);
+        mapDeviceMapper.insert(mapDevice);
+        return id;
+    }
+
+    @Override
+    public void unbindDevice(String mapId, String deviceId) {
+        LambdaQueryWrapper<SasMapDevice> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(SasMapDevice::getMapId, mapId)
+                .eq(SasMapDevice::getDeviceId, deviceId);
+        mapDeviceMapper.delete(wrapper);
+    }
+
+    private void applyMap(SasMaps map, MapSaveRequest request) {
+        map.setName(request.getName());
+        map.setType(request.getType());
+        map.setRemark(request.getRemark());
+        map.setParentId(request.getParentId());
+        map.setWidth(request.getWidth());
+        map.setHeight(request.getHeight());
+        map.setIsMask(request.getIsMask());
+        map.setBackImgId(request.getBackImgId());
+    }
+}
+

+ 259 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/service/impl/SasOneStandardSixRealitiesServiceImpl.java

@@ -0,0 +1,259 @@
+package com.usky.sas.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.usky.common.core.bean.CommonPage;
+import com.usky.sas.domain.SasBuilding;
+import com.usky.sas.domain.SasHouse;
+import com.usky.sas.domain.SasPerson;
+import com.usky.sas.domain.SasVillage;
+import com.usky.sas.mapper.SasBuildingMapper;
+import com.usky.sas.mapper.SasHouseMapper;
+import com.usky.sas.mapper.SasPersonMapper;
+import com.usky.sas.mapper.SasVillageMapper;
+import com.usky.sas.service.SasOneStandardSixRealitiesService;
+import com.usky.sas.service.vo.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Service
+public class SasOneStandardSixRealitiesServiceImpl implements SasOneStandardSixRealitiesService {
+
+    @Autowired
+    private SasPersonMapper sasPersonMapper;
+
+    @Autowired
+    private SasBuildingMapper sasBuildingMapper;
+
+    @Autowired
+    private SasHouseMapper sasHouseMapper;
+
+    @Autowired
+    private SasVillageMapper sasVillageMapper;
+
+    @Override
+    public CommonPage<PowerListItem> powerPage(OneStandardSixRealitiesPageRequest request) {
+        IPage<SasPerson> page = new Page<>(request.getPage(), request.getPageSize());
+        LambdaQueryWrapper<SasPerson> wrapper = new LambdaQueryWrapper<>();
+        // 这里简单按 power_code 是否非空作为实有力量筛选,占位实现
+        wrapper.isNotNull(SasPerson::getPowerCode);
+        page = sasPersonMapper.selectPage(page, wrapper);
+        List<SasPerson> records = page.getRecords();
+        if (records == null) {
+            records = Collections.emptyList();
+        }
+        List<PowerListItem> list = records.stream()
+                .map(this::fromPersonToPower)
+                .collect(Collectors.toList());
+        return new CommonPage<>(list, page.getTotal(), page.getCurrent(), page.getSize());
+    }
+
+    @Override
+    public int syncPower() {
+        // 预留与 agbox 同步实现
+        return 0;
+    }
+
+    @Override
+    public CommonPage<FacilityListItem> facilityPage(OneStandardSixRealitiesPageRequest request) {
+        // 当前库中未定义独立的实有设施表,这里先返回空分页,预留后续实现
+        return new CommonPage<>(Collections.emptyList(), 0L, request.getPage().longValue(), request.getPageSize().longValue());
+    }
+
+    @Override
+    public int syncFacility() {
+        // 预留与 agbox 同步实现
+        return 0;
+    }
+
+    @Override
+    public CommonPage<EntranceListItem> entrancePage(OneStandardSixRealitiesPageRequest request) {
+        // 当前库中未定义出入口基础表,这里先返回空分页,预留后续实现
+        return new CommonPage<>(Collections.emptyList(), 0L, request.getPage().longValue(), request.getPageSize().longValue());
+    }
+
+    @Override
+    public int syncEntrance() {
+        // 预留与 agbox 同步实现
+        return 0;
+    }
+
+    @Override
+    public CommonPage<AreaListItem> areaPage(OneStandardSixRealitiesPageRequest request) {
+        IPage<SasBuilding> page = new Page<>(request.getPage(), request.getPageSize());
+        LambdaQueryWrapper<SasBuilding> wrapper = new LambdaQueryWrapper<>();
+        if (request.getVillageCode() != null && !request.getVillageCode().isEmpty()) {
+            wrapper.eq(SasBuilding::getVillageCode, request.getVillageCode());
+        }
+        page = sasBuildingMapper.selectPage(page, wrapper);
+        List<SasBuilding> records = page.getRecords();
+        if (records == null) {
+            records = Collections.emptyList();
+        }
+        List<AreaListItem> list = records.stream()
+                .map(this::fromBuildingToArea)
+                .collect(Collectors.toList());
+        return new CommonPage<>(list, page.getTotal(), page.getCurrent(), page.getSize());
+    }
+
+    @Override
+    public int syncArea() {
+        // 预留与 agbox 同步实现
+        return 0;
+    }
+
+    @Override
+    public CommonPage<HouseListItem> housePage(OneStandardSixRealitiesPageRequest request) {
+        IPage<SasHouse> page = new Page<>(request.getPage(), request.getPageSize());
+        LambdaQueryWrapper<SasHouse> wrapper = new LambdaQueryWrapper<>();
+        if (request.getBuildingCode() != null && !request.getBuildingCode().isEmpty()) {
+            wrapper.eq(SasHouse::getBuildingCode, request.getBuildingCode());
+        }
+        if (request.getVillageCode() != null && !request.getVillageCode().isEmpty()) {
+            wrapper.eq(SasHouse::getVillageCode, request.getVillageCode());
+        }
+        if (request.getHouseNo() != null && !request.getHouseNo().isEmpty()) {
+            wrapper.eq(SasHouse::getHouseNo, request.getHouseNo());
+        }
+        page = sasHouseMapper.selectPage(page, wrapper);
+        List<SasHouse> records = page.getRecords();
+        if (records == null) {
+            records = Collections.emptyList();
+        }
+        List<HouseListItem> list = records.stream()
+                .map(this::fromHouseToHouseItem)
+                .collect(Collectors.toList());
+        return new CommonPage<>(list, page.getTotal(), page.getCurrent(), page.getSize());
+    }
+
+    @Override
+    public int syncHouse() {
+        // 预留与 agbox 同步实现
+        return 0;
+    }
+
+    @Override
+    public CommonPage<VillageListItem> villagePage(OneStandardSixRealitiesPageRequest request) {
+        IPage<SasVillage> page = new Page<>(request.getPage(), request.getPageSize());
+        LambdaQueryWrapper<SasVillage> wrapper = new LambdaQueryWrapper<>();
+        if (request.getVillageName() != null && !request.getVillageName().isEmpty()) {
+            wrapper.like(SasVillage::getVillageName, request.getVillageName());
+        }
+        if (request.getIsDefault() != null) {
+            wrapper.eq(SasVillage::getIsDefault, request.getIsDefault());
+        }
+        page = sasVillageMapper.selectPage(page, wrapper);
+        List<SasVillage> records = page.getRecords();
+        if (records == null) {
+            records = Collections.emptyList();
+        }
+        List<VillageListItem> list = records.stream()
+                .map(this::fromVillageToVillageItem)
+                .collect(Collectors.toList());
+        return new CommonPage<>(list, page.getTotal(), page.getCurrent(), page.getSize());
+    }
+
+    @Override
+    public int syncVillage() {
+        // 预留与 agbox 同步实现
+        return 0;
+    }
+
+    @Override
+    public void setVillageDefault(String villageCode) {
+        SasVillage village = sasVillageMapper.selectById(villageCode);
+        if (village == null) {
+            return;
+        }
+        // 清除原默认
+        LambdaQueryWrapper<SasVillage> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(SasVillage::getIsDefault, true);
+        List<SasVillage> list = sasVillageMapper.selectList(wrapper);
+        for (SasVillage v : list) {
+            v.setIsDefault(false);
+            sasVillageMapper.updateById(v);
+        }
+        // 设置新的默认
+        village.setIsDefault(true);
+        sasVillageMapper.updateById(village);
+    }
+
+    private PowerListItem fromPersonToPower(SasPerson p) {
+        PowerListItem item = new PowerListItem();
+        item.setPersonCode(p.getPersonCode());
+        item.setName(p.getName());
+        item.setPowerCode(p.getPowerCode());
+        item.setPowerName(null);
+        item.setSecurityCardNo(p.getSecurityCardNo());
+        item.setSecurityDutiesCode(p.getSecurityDutiesCode() == null ? null : String.valueOf(p.getSecurityDutiesCode()));
+        item.setUpdateTime(p.getUpdateTime());
+        return item;
+    }
+
+    private AreaListItem fromBuildingToArea(SasBuilding b) {
+        AreaListItem item = new AreaListItem();
+        item.setBuildingCode(b.getBuildingCode());
+        item.setBuildingNo(b.getBuildingNo());
+        item.setFloorTotal(b.getFloorTotal());
+        item.setHouseTotal(b.getHouseTotal());
+        item.setNote(b.getNote());
+        item.setGisId(b.getGisId());
+        item.setVillageCode(b.getVillageCode());
+        item.setPlaceType(b.getPlaceType());
+        item.setCreateTime(b.getCreateTime());
+        item.setUpdateTime(b.getUpdateTime());
+        return item;
+    }
+
+    private HouseListItem fromHouseToHouseItem(SasHouse h) {
+        HouseListItem item = new HouseListItem();
+        item.setHouseCode(h.getHouseCode());
+        item.setHouseNo(h.getHouseNo());
+        item.setHouseName(h.getHouseName());
+        item.setFloor(h.getFloor());
+        item.setHouseLabelCode(h.getHouseLabelCode());
+        item.setHouseLabel(h.getHouseLabel());
+        item.setHousePurposeCode(h.getHousePurposeCode());
+        item.setHousePurpose(h.getHousePurpose());
+        item.setNote(h.getNote());
+        item.setIsPublic(h.getIsPublic());
+        item.setIsAction(h.getIsAction());
+        item.setSystemTypeCode(h.getSystesasTypeCode());
+        item.setBuildingCode(h.getBuildingCode());
+        item.setGisId(h.getGisId());
+        item.setPersonNumber(h.getPersonNumber());
+        item.setHouseArea(h.getHouseArea());
+        item.setVillageCode(h.getVillageCode());
+        item.setTags(h.getTags());
+        item.setCreateTime(h.getCreateTime());
+        item.setUpdateTime(h.getUpdateTime());
+        return item;
+    }
+
+    private VillageListItem fromVillageToVillageItem(SasVillage v) {
+        VillageListItem item = new VillageListItem();
+        item.setVillageCode(v.getVillageCode());
+        item.setVillageName(v.getVillageName());
+        item.setAddress(v.getAddress());
+        item.setProvinceCode(v.getProvinceCode());
+        item.setCityCode(v.getCityCode());
+        item.setDistrictCode(v.getDistrictCode());
+        item.setStreetCode(v.getStreetCode());
+        item.setPoliceStationCode(v.getPoliceStationCode());
+        item.setCompanyCode(v.getCompanyCode());
+        item.setCompanyName(v.getCompanyName());
+        item.setPicUrlId(v.getPicUrlId());
+        item.setGisId(v.getGisId());
+        item.setGisAreaId(v.getGisAreaId());
+        item.setIsDefault(v.getIsDefault());
+        item.setCreateTime(v.getCreateTime());
+        item.setUpdateTime(v.getUpdateTime());
+        return item;
+    }
+}
+

+ 185 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/service/impl/SasPersonnelServiceImpl.java

@@ -0,0 +1,185 @@
+package com.usky.sas.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.usky.common.core.bean.CommonPage;
+import com.usky.sas.domain.SasFollowPerson;
+import com.usky.sas.domain.SasPerson;
+import com.usky.sas.mapper.SasFollowPersonMapper;
+import com.usky.sas.mapper.SasPersonMapper;
+import com.usky.sas.service.SasPersonnelService;
+import com.usky.sas.service.vo.PersonnelDetailResponse;
+import com.usky.sas.service.vo.PersonnelListItem;
+import com.usky.sas.service.vo.PersonnelPageRequest;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Service
+public class SasPersonnelServiceImpl implements SasPersonnelService {
+
+    @Autowired
+    private SasPersonMapper sasPersonMapper;
+
+    @Autowired
+    private SasFollowPersonMapper sasFollowPersonMapper;
+
+    @Override
+    public CommonPage<PersonnelListItem> whitelistPage(PersonnelPageRequest request) {
+        // 目前按人员表简单分页,后续可根据白名单标识补充筛选条件
+        return buildPersonPage(request);
+    }
+
+    @Override
+    public int syncWhitelist() {
+        // 预留与 agbox 同步实现
+        return 0;
+    }
+
+    @Override
+    public PersonnelDetailResponse whitelistDetail(String personCode) {
+        return buildPersonDetail(personCode);
+    }
+
+    @Override
+    public CommonPage<PersonnelListItem> blacklistPage(PersonnelPageRequest request) {
+        // 目前按人员表简单分页,后续可根据黑名单标识补充筛选条件
+        return buildPersonPage(request);
+    }
+
+    @Override
+    public int syncBlacklist() {
+        // 预留与 agbox 同步实现
+        return 0;
+    }
+
+    @Override
+    public PersonnelDetailResponse blacklistDetail(String personCode) {
+        return buildPersonDetail(personCode);
+    }
+
+    @Override
+    public CommonPage<PersonnelListItem> registeredPage(PersonnelPageRequest request) {
+        // 在册人员同样基于人员表,后续可根据在册标识补充筛选条件
+        return buildPersonPage(request);
+    }
+
+    @Override
+    public int syncRegistered() {
+        // 预留与 agbox 同步实现
+        return 0;
+    }
+
+    @Override
+    public PersonnelDetailResponse registeredDetail(String personCode) {
+        return buildPersonDetail(personCode);
+    }
+
+    @Override
+    public CommonPage<PersonnelListItem> followPage(PersonnelPageRequest request) {
+        IPage<SasFollowPerson> page = new Page<>(request.getPage(), request.getPageSize());
+        LambdaQueryWrapper<SasFollowPerson> wrapper = new LambdaQueryWrapper<>();
+        if (request.getName() != null && !request.getName().isEmpty()) {
+            wrapper.like(SasFollowPerson::getName, request.getName());
+        }
+        if (request.getPersonCode() != null && !request.getPersonCode().isEmpty()) {
+            wrapper.eq(SasFollowPerson::getPersonCode, request.getPersonCode());
+        }
+        page = sasFollowPersonMapper.selectPage(page, wrapper);
+        List<PersonnelListItem> list = page.getRecords().stream()
+                .map(this::fromFollowPerson)
+                .collect(Collectors.toList());
+        return new CommonPage<>(list, page.getTotal(), page.getCurrent(), page.getSize());
+    }
+
+    @Override
+    public int syncFollow() {
+        // 预留与 agbox 同步实现
+        return 0;
+    }
+
+    @Override
+    public PersonnelDetailResponse followDetail(String personCode) {
+        SasFollowPerson followPerson = sasFollowPersonMapper.selectById(personCode);
+        if (followPerson == null) {
+            return null;
+        }
+        PersonnelDetailResponse detail = new PersonnelDetailResponse();
+        detail.setPersonCode(followPerson.getPersonCode());
+        detail.setName(followPerson.getName());
+        detail.setPicId(followPerson.getPicId());
+        detail.setUpdateTime(followPerson.getUpdateTime());
+        return detail;
+    }
+
+    private CommonPage<PersonnelListItem> buildPersonPage(PersonnelPageRequest request) {
+        IPage<SasPerson> page = new Page<>(request.getPage(), request.getPageSize());
+        LambdaQueryWrapper<SasPerson> wrapper = new LambdaQueryWrapper<>();
+        if (request.getName() != null && !request.getName().isEmpty()) {
+            wrapper.like(SasPerson::getName, request.getName());
+        }
+        if (request.getPersonCode() != null && !request.getPersonCode().isEmpty()) {
+            wrapper.eq(SasPerson::getPersonCode, request.getPersonCode());
+        }
+        wrapper.orderByDesc(SasPerson::getUpdateTime);
+        page = sasPersonMapper.selectPage(page, wrapper);
+        List<SasPerson> records = page.getRecords();
+        if (records == null) {
+            records = Collections.emptyList();
+        }
+        List<PersonnelListItem> list = records.stream()
+                .map(this::fromPerson)
+                .collect(Collectors.toList());
+        return new CommonPage<>(list, page.getTotal(), page.getCurrent(), page.getSize());
+    }
+
+    private PersonnelDetailResponse buildPersonDetail(String personCode) {
+        SasPerson person = sasPersonMapper.selectById(personCode);
+        if (person == null) {
+            return null;
+        }
+        PersonnelDetailResponse detail = new PersonnelDetailResponse();
+        detail.setPersonCode(person.getPersonCode());
+        detail.setName(person.getName());
+        detail.setCredentialType(person.getCredentialType());
+        detail.setCredentialNo(person.getCredentialNo());
+        detail.setPicId(person.getPicId());
+        detail.setPhone1(person.getPhone1());
+        detail.setPhone2(person.getPhone2());
+        detail.setPeopleTypeCode(person.getPeopleTypeCode());
+        detail.setEducationCode(person.getEducationCode());
+        detail.setMaritalStatusCode(person.getMaritalStatusCode());
+        detail.setNationalityCode(person.getNationalityCode());
+        detail.setOrigin(person.getOrigin());
+        detail.setPlaceOfBirth(person.getPlaceOfBirth());
+        detail.setUpdateTime(person.getUpdateTime());
+        return detail;
+    }
+
+    private PersonnelListItem fromPerson(SasPerson p) {
+        PersonnelListItem item = new PersonnelListItem();
+        item.setPersonCode(p.getPersonCode());
+        item.setName(p.getName());
+        item.setCredentialType(p.getCredentialType());
+        item.setCredentialNo(p.getCredentialNo());
+        item.setPeopleTypeCode(p.getPeopleTypeCode());
+        item.setPicId(p.getPicId());
+        item.setUpdateTime(p.getUpdateTime());
+        return item;
+    }
+
+    private PersonnelListItem fromFollowPerson(SasFollowPerson p) {
+        PersonnelListItem item = new PersonnelListItem();
+        item.setPersonCode(p.getPersonCode());
+        item.setName(p.getName());
+        item.setFollowPeopleType(p.getFollowPeopleType());
+        item.setPicId(p.getPicId());
+        item.setUpdateTime(p.getUpdateTime());
+        return item;
+    }
+}
+

+ 126 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/service/impl/SasSystemServiceImpl.java

@@ -0,0 +1,126 @@
+package com.usky.sas.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.usky.common.core.bean.CommonPage;
+import com.usky.sas.domain.SasVersionAdmin;
+import com.usky.sas.mapper.SasVersionAdminMapper;
+import com.usky.sas.service.SasSystemService;
+import com.usky.sas.service.vo.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Service
+public class SasSystemServiceImpl implements SasSystemService {
+
+    @Autowired
+    private SasVersionAdminMapper sasVersionAdminMapper;
+
+    @Override
+    public SystemInfoResponse getSystemInfo() {
+        SystemInfoResponse resp = new SystemInfoResponse();
+
+        // systemInfo 占位实现
+        SystemInfoResponse.SystemInfo systemInfo = new SystemInfoResponse.SystemInfo();
+        systemInfo.setId("client_001");
+        systemInfo.setName("系统客户端");
+        systemInfo.setCreateTime(LocalDateTime.now());
+        systemInfo.setUpdateTime(LocalDateTime.now());
+        resp.setSystemInfo(systemInfo);
+
+        // versionInfo 从 sas_version_admin 取第一条
+        VersionInfoResponse version = getVersionInfo();
+        if (version != null) {
+            SystemInfoResponse.VersionInfo vi = new SystemInfoResponse.VersionInfo();
+            vi.setId(version.getId());
+            vi.setJarVersion(version.getJarVersion());
+            vi.setVueVersion(version.getVueVersion());
+            vi.setDurationOfUpdate(version.getDurationOfUpdate());
+            vi.setCreateTime(version.getCreateTime());
+            vi.setUpdateTime(version.getUpdateTime());
+            resp.setVersionInfo(vi);
+        }
+
+        // backupInfo 占位实现:目前仅返回空列表
+        SystemInfoResponse.BackupInfo backupInfo = new SystemInfoResponse.BackupInfo();
+        backupInfo.setLastBackupTime(null);
+        backupInfo.setBackupFiles(Collections.emptyList());
+        resp.setBackupInfo(backupInfo);
+
+        return resp;
+    }
+
+    @Override
+    public VersionInfoResponse getVersionInfo() {
+        LambdaQueryWrapper<SasVersionAdmin> wrapper = new LambdaQueryWrapper<>();
+        wrapper.orderByDesc(SasVersionAdmin::getUpdateTime).last("limit 1");
+        List<SasVersionAdmin> list = sasVersionAdminMapper.selectList(wrapper);
+        if (list == null || list.isEmpty()) {
+            return null;
+        }
+        SasVersionAdmin entity = list.get(0);
+        VersionInfoResponse resp = new VersionInfoResponse();
+        resp.setId(entity.getId());
+        resp.setJarVersion(entity.getJarVersion());
+        resp.setVueVersion(entity.getVueVersion());
+        resp.setDurationOfUpdate(entity.getDurationOfUpdate());
+        resp.setCreateTime(entity.getCreateTime());
+        resp.setUpdateTime(entity.getUpdateTime());
+        return resp;
+    }
+
+    @Override
+    public VersionInfoResponse upgradeVersion() {
+        // 占位实现:简单创建/更新一条版本记录为“最新版本”
+        SasVersionAdmin entity = new SasVersionAdmin();
+        entity.setJarVersion("1.0.1");
+        entity.setVueVersion("1.0.1");
+        entity.setDurationOfUpdate("5分钟");
+        entity.setUpdateTime(LocalDateTime.now());
+        entity.setCreateTime(LocalDateTime.now());
+        sasVersionAdminMapper.insert(entity);
+        VersionInfoResponse resp = new VersionInfoResponse();
+        resp.setId(entity.getId());
+        resp.setJarVersion(entity.getJarVersion());
+        resp.setVueVersion(entity.getVueVersion());
+        resp.setDurationOfUpdate(entity.getDurationOfUpdate());
+        resp.setCreateTime(entity.getCreateTime());
+        resp.setUpdateTime(entity.getUpdateTime());
+        return resp;
+    }
+
+    @Override
+    public BackupDbResponse backupDatabase() {
+        // 占位实现:仅返回一个示例结果
+        BackupDbResponse resp = new BackupDbResponse();
+        resp.setFileName("backup_" + LocalDateTime.now().toString().replace(":", "").replace("-", "") + ".sql");
+        resp.setFilePath("/backup/" + resp.getFileName());
+        resp.setFileSize("0MB");
+        return resp;
+    }
+
+    @Override
+    public CommonPage<BackupFileItem> backupList(BackupListPageRequest request) {
+        // 占位实现:返回空列表
+        List<BackupFileItem> list = Collections.emptyList();
+        return new CommonPage<>(list, 0L, request.getPage().longValue(), request.getPageSize().longValue());
+    }
+
+    @Override
+    public void restoreDatabase(BackupRestoreRequest request) {
+        // 占位实现:不做任何操作
+    }
+
+    @Override
+    public String downloadBackup(String fileName) {
+        // 占位实现:返回文件的预期路径
+        return "/backup/" + fileName;
+    }
+}
+

+ 51 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/service/impl/SasSystesasActivationServiceImpl.java

@@ -0,0 +1,51 @@
+package com.usky.sas.service.impl;
+
+import com.usky.common.mybatis.core.AbstractCrudService;
+import com.usky.sas.domain.SasSystesasActivation;
+import com.usky.sas.mapper.SasSystesasActivationMapper;
+import com.usky.sas.service.SasSystesasActivationService;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+
+/**
+ * 系统激活 服务实现
+ */
+@Service
+public class SasSystesasActivationServiceImpl extends AbstractCrudService<SasSystesasActivationMapper, SasSystesasActivation>
+        implements SasSystesasActivationService {
+
+    private static final Integer DEFAULT_ID = 1;
+
+    @Override
+    public SasSystesasActivation activate(String licenseKey) {
+        SasSystesasActivation activation = this.getById(DEFAULT_ID);
+        LocalDateTime now = LocalDateTime.now();
+        if (activation == null) {
+            activation = new SasSystesasActivation();
+            activation.setId(DEFAULT_ID);
+            activation.setCreateTime(now);
+        }
+        activation.setLicenseKey(licenseKey);
+        activation.setActivationTime(now);
+        activation.setUpdateTime(now);
+        if (activation.getIsPerpetual() == null) {
+            activation.setIsPerpetual(false);
+        }
+        if (activation.getValidityTime() == null && !Boolean.TRUE.equals(activation.getIsPerpetual())) {
+            activation.setValidityTime(now.plusYears(1));
+        }
+        if (this.getById(DEFAULT_ID) == null) {
+            this.save(activation);
+        } else {
+            this.updateById(activation);
+        }
+        return activation;
+    }
+
+    @Override
+    public SasSystesasActivation currentActivation() {
+        return this.getById(DEFAULT_ID);
+    }
+}
+

+ 47 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/service/impl/SasSystesasConfigServiceImpl.java

@@ -0,0 +1,47 @@
+package com.usky.sas.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.usky.common.mybatis.core.AbstractCrudService;
+import com.usky.sas.domain.SasSystesasConfig;
+import com.usky.sas.mapper.SasSystesasConfigMapper;
+import com.usky.sas.service.SasSystesasConfigService;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+
+/**
+ * 系统配置 服务实现
+ */
+@Service
+public class SasSystesasConfigServiceImpl extends AbstractCrudService<SasSystesasConfigMapper, SasSystesasConfig>
+        implements SasSystesasConfigService {
+
+    @Override
+    public SasSystesasConfig getConfig() {
+        LambdaQueryWrapper<SasSystesasConfig> wrapper = new LambdaQueryWrapper<>();
+        wrapper.last("limit 1");
+        return this.getOne(wrapper, false);
+    }
+
+    @Override
+    public void updateConfig(SasSystesasConfig config) {
+        LocalDateTime now = LocalDateTime.now();
+        SasSystesasConfig exist = null;
+        if (config.getId() != null) {
+            exist = this.getById(config.getId());
+        } else {
+            exist = getConfig();
+        }
+        if (exist == null) {
+            config.setCreateTime(now);
+            config.setUpdateTime(now);
+            this.save(config);
+        } else {
+            config.setId(exist.getId());
+            config.setCreateTime(exist.getCreateTime());
+            config.setUpdateTime(now);
+            this.updateById(config);
+        }
+    }
+}
+

+ 47 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/service/impl/SasSystesasWlanConfigServiceImpl.java

@@ -0,0 +1,47 @@
+package com.usky.sas.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.usky.common.mybatis.core.AbstractCrudService;
+import com.usky.sas.domain.SasSystesasWlanConfig;
+import com.usky.sas.mapper.SasSystesasWlanConfigMapper;
+import com.usky.sas.service.SasSystesasWlanConfigService;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+
+/**
+ * 网络配置 服务实现
+ */
+@Service
+public class SasSystesasWlanConfigServiceImpl extends AbstractCrudService<SasSystesasWlanConfigMapper, SasSystesasWlanConfig>
+        implements SasSystesasWlanConfigService {
+
+    @Override
+    public SasSystesasWlanConfig getConfig() {
+        LambdaQueryWrapper<SasSystesasWlanConfig> wrapper = new LambdaQueryWrapper<>();
+        wrapper.last("limit 1");
+        return this.getOne(wrapper, false);
+    }
+
+    @Override
+    public void updateConfig(SasSystesasWlanConfig config) {
+        LocalDateTime now = LocalDateTime.now();
+        SasSystesasWlanConfig exist = null;
+        if (config.getId() != null) {
+            exist = this.getById(config.getId());
+        } else {
+            exist = getConfig();
+        }
+        if (exist == null) {
+            config.setCreateTime(now);
+            config.setUpdateTime(now);
+            this.save(config);
+        } else {
+            config.setId(exist.getId());
+            config.setCreateTime(exist.getCreateTime());
+            config.setUpdateTime(now);
+            this.updateById(config);
+        }
+    }
+}
+

+ 67 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/service/impl/SasVideoPatrolServiceImpl.java

@@ -0,0 +1,67 @@
+package com.usky.sas.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.usky.sas.domain.SasAcquisitionEvent;
+import com.usky.sas.domain.SasCollectionEvent;
+import com.usky.sas.mapper.SasAcquisitionEventMapper;
+import com.usky.sas.mapper.SasCollectionEventMapper;
+import com.usky.sas.service.SasVideoPatrolService;
+import com.usky.sas.service.vo.PatrolConfigResponse;
+import com.usky.sas.service.vo.VideoProtectionConfigResponse;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Service
+public class SasVideoPatrolServiceImpl implements SasVideoPatrolService {
+
+    @Autowired
+    private SasCollectionEventMapper collectionEventMapper;
+
+    @Autowired
+    private SasAcquisitionEventMapper acquisitionEventMapper;
+
+    @Override
+    public VideoProtectionConfigResponse getVideoProtectionConfig() {
+        LambdaQueryWrapper<SasCollectionEvent> wrapper = Wrappers.lambdaQuery();
+        wrapper.orderByDesc(SasCollectionEvent::getTriggerTime).last("limit 20");
+        List<SasCollectionEvent> list = collectionEventMapper.selectList(wrapper);
+
+        VideoProtectionConfigResponse resp = new VideoProtectionConfigResponse();
+        resp.setEnabled(true);
+        resp.setEvents(list.stream().map(e -> {
+            VideoProtectionConfigResponse.EventItem item = new VideoProtectionConfigResponse.EventItem();
+            item.setEventId(e.getEventId());
+            item.setDeviceId(e.getDeviceId());
+            item.setTriggerTime(e.getTriggerTime());
+            item.setEventCode(e.getEventCode());
+            return item;
+        }).collect(Collectors.toList()));
+        return resp;
+    }
+
+    @Override
+    public PatrolConfigResponse getPatrolConfig() {
+        LambdaQueryWrapper<SasAcquisitionEvent> wrapper = Wrappers.lambdaQuery();
+        wrapper.orderByDesc(SasAcquisitionEvent::getTriggerTime).last("limit 20");
+        List<SasAcquisitionEvent> list = acquisitionEventMapper.selectList(wrapper);
+
+        PatrolConfigResponse resp = new PatrolConfigResponse();
+        resp.setEnabled(true);
+        resp.setEvents(list.stream().map(e -> {
+            PatrolConfigResponse.EventItem item = new PatrolConfigResponse.EventItem();
+            item.setEventId(e.getEventId());
+            item.setDeviceId(e.getDeviceId());
+            // 名称暂无法从库直接获取,这里留空
+            item.setName(null);
+            item.setTriggerTime(e.getTriggerTime());
+            item.setEventCode(e.getEventCode());
+            return item;
+        }).collect(Collectors.toList()));
+        return resp;
+    }
+}
+

+ 33 - 0
service-sas/service-sas-biz/src/main/java/com/usky/sas/service/impl/SasVideoStreamServiceImpl.java

@@ -0,0 +1,33 @@
+package com.usky.sas.service.impl;
+
+import com.usky.sas.service.SasVideoStreamService;
+import com.usky.sas.service.vo.LiveStreamResponse;
+import com.usky.sas.service.vo.PlaybackStreamResponse;
+import com.usky.sas.service.vo.VideoStreamRequest;
+import org.springframework.stereotype.Service;
+
+/**
+ * 视频流服务占位实现
+ */
+@Service
+public class SasVideoStreamServiceImpl implements SasVideoStreamService {
+
+    @Override
+    public LiveStreamResponse liveStream(VideoStreamRequest request) {
+        LiveStreamResponse resp = new LiveStreamResponse();
+        resp.setRtspUrl("rtsp://example/live/" + request.getDeviceId() + ":" + request.getChannel());
+        resp.setHlsUrl("http://example/hls/live_" + request.getDeviceId() + "_" + request.getChannel() + ".m3u8");
+        resp.setFlvUrl("http://example/flv/live_" + request.getDeviceId() + "_" + request.getChannel() + ".flv");
+        return resp;
+    }
+
+    @Override
+    public PlaybackStreamResponse playbackStream(VideoStreamRequest request) {
+        PlaybackStreamResponse resp = new PlaybackStreamResponse();
+        resp.setRtspUrl("rtsp://example/playback/" + request.getDeviceId());
+        resp.setHlsUrl("http://example/hls/playback_" + request.getDeviceId() + ".m3u8");
+        resp.setFlvUrl("http://example/flv/playback_" + request.getDeviceId() + ".flv");
+        return resp;
+    }
+}
+

Einige Dateien werden nicht angezeigt, da zu viele Dateien in diesem Diff geändert wurden.