Bladeren bron

Merge branch 'master' into fu-dev

fuyuchuan 6 maanden geleden
bovenliggende
commit
b732ebfcf2
100 gewijzigde bestanden met toevoegingen van 5564 en 25 verwijderingen
  1. 3 0
      pom.xml
  2. 20 0
      service-cockpit/pom.xml
  3. 146 0
      service-cockpit/service-cockpit-biz/pom.xml
  4. 66 0
      service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/RuoYiSystemApplication.java
  5. 13 0
      service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/ServletInitializer.java
  6. 118 0
      service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/common/base/BaseController.java
  7. 24 0
      service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/common/config/CorsConfig.java
  8. 2 0
      service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/common/config/DateStringConvert.java
  9. 20 0
      service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/common/config/MybatisPlusConfig.java
  10. 2 0
      service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/common/config/StringDateConverter.java
  11. 72 0
      service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/common/config/V2Config.java
  12. 104 0
      service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/common/domain/AjaxResult.java
  13. 84 0
      service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/common/domain/ResultTable.java
  14. 50 0
      service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/common/domain/Tablepar.java
  15. 21 0
      service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/common/interceptor/Interceptor.java
  16. 91 0
      service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/common/interceptor/WebMvcConfig.java
  17. 108 0
      service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/controller/MybatisGeneratorUtils.java
  18. 87 0
      service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/controller/web/ApiController.java
  19. 376 0
      service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/controller/web/FileController.java
  20. 257 0
      service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/controller/web/GoviewProjectController.java
  21. 21 0
      service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/controller/web/Indexcontroller.java
  22. 20 0
      service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/controller/web/SysUserController.java
  23. 16 0
      service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/mapper/GoviewProjectDataMapper.java
  24. 16 0
      service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/mapper/GoviewProjectMapper.java
  25. 17 0
      service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/mapper/SysFileMapper.java
  26. 16 0
      service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/mapper/SysUserMapper.java
  27. 48 0
      service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/model/GoviewProject.java
  28. 39 0
      service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/model/GoviewProjectData.java
  29. 119 0
      service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/model/SysFile.java
  30. 39 0
      service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/model/SysUser.java
  31. 119 0
      service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/model/vo/GoviewProjectVo.java
  32. 70 0
      service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/model/vo/SysFileVo.java
  33. 18 0
      service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/service/IGoviewProjectDataService.java
  34. 16 0
      service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/service/IGoviewProjectService.java
  35. 18 0
      service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/service/ISysFileService.java
  36. 16 0
      service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/service/ISysUserService.java
  37. 33 0
      service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/service/impl/GoviewProjectDataServiceImpl.java
  38. 20 0
      service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/service/impl/GoviewProjectServiceImpl.java
  39. 30 0
      service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/service/impl/SysFileServiceImpl.java
  40. 20 0
      service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/service/impl/SysUserServiceImpl.java
  41. 252 0
      service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/util/ConvertUtil.java
  42. 39 0
      service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/util/MybatisPlusGenerator.java
  43. 74 0
      service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/util/SaTokenUtil.java
  44. 155 0
      service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/util/SnowflakeIdWorker.java
  45. 16 0
      service-cockpit/service-cockpit-biz/src/main/resources/application-dev.yml
  46. 110 0
      service-cockpit/service-cockpit-biz/src/main/resources/application.yml
  47. 25 0
      service-cockpit/service-cockpit-biz/src/main/resources/bootstrap.yml
  48. 5 0
      service-cockpit/service-cockpit-biz/src/main/resources/mapper/GoviewProjectDataMapper.xml
  49. 5 0
      service-cockpit/service-cockpit-biz/src/main/resources/mapper/GoviewProjectMapper.xml
  50. 5 0
      service-cockpit/service-cockpit-biz/src/main/resources/mapper/SysFileMapper.xml
  51. 5 0
      service-cockpit/service-cockpit-biz/src/main/resources/mapper/SysUserMapper.xml
  52. 17 0
      service-eg/pom.xml
  53. 29 0
      service-eg/service-eg-api/pom.xml
  54. 16 0
      service-eg/service-eg-api/src/main/java/com/usky/eg/RemoteEgService.java
  55. 43 0
      service-eg/service-eg-api/src/main/java/com/usky/eg/domain/DeviceDataWriteVO.java
  56. 29 0
      service-eg/service-eg-api/src/main/java/com/usky/eg/factory/RemoteEgFallbackFactory.java
  57. 96 0
      service-eg/service-eg-biz/pom.xml
  58. 50 0
      service-eg/service-eg-biz/src/main/java/com/usky/eg/ApplicationRun.java
  59. 105 0
      service-eg/service-eg-biz/src/main/java/com/usky/eg/MybatisGenerator.java
  60. 81 0
      service-eg/service-eg-biz/src/main/java/com/usky/eg/controller/web/EgDeviceController.java
  61. 41 0
      service-eg/service-eg-biz/src/main/java/com/usky/eg/controller/web/EgRecordController.java
  62. 116 0
      service-eg/service-eg-biz/src/main/java/com/usky/eg/domain/EgDevice.java
  63. 115 0
      service-eg/service-eg-biz/src/main/java/com/usky/eg/domain/EgRecord.java
  64. 86 0
      service-eg/service-eg-biz/src/main/java/com/usky/eg/domain/MeetingFace.java
  65. 32 0
      service-eg/service-eg-biz/src/main/java/com/usky/eg/domain/MeetingFaceDevice.java
  66. 27 0
      service-eg/service-eg-biz/src/main/java/com/usky/eg/mapper/EgDeviceMapper.java
  67. 16 0
      service-eg/service-eg-biz/src/main/java/com/usky/eg/mapper/EgRecordMapper.java
  68. 18 0
      service-eg/service-eg-biz/src/main/java/com/usky/eg/mapper/MeetingFaceDeviceMapper.java
  69. 18 0
      service-eg/service-eg-biz/src/main/java/com/usky/eg/mapper/MeetingFaceMapper.java
  70. 31 0
      service-eg/service-eg-biz/src/main/java/com/usky/eg/service/EgDeviceService.java
  71. 22 0
      service-eg/service-eg-biz/src/main/java/com/usky/eg/service/EgRecordService.java
  72. 218 0
      service-eg/service-eg-biz/src/main/java/com/usky/eg/service/impl/EgDeviceServiceImpl.java
  73. 113 0
      service-eg/service-eg-biz/src/main/java/com/usky/eg/service/impl/EgRecordServiceImpl.java
  74. 43 0
      service-eg/service-eg-biz/src/main/java/com/usky/eg/service/vo/EgDeviceRequestVO.java
  75. 42 0
      service-eg/service-eg-biz/src/main/java/com/usky/eg/service/vo/EgRecordRequestVO.java
  76. 25 0
      service-eg/service-eg-biz/src/main/resources/bootstrap.yml
  77. 108 0
      service-eg/service-eg-biz/src/main/resources/doc/index.adoc
  78. 74 0
      service-eg/service-eg-biz/src/main/resources/logback.xml
  79. 58 0
      service-eg/service-eg-biz/src/main/resources/mapper/eg/EgDeviceMapper.xml
  80. 23 0
      service-eg/service-eg-biz/src/main/resources/mapper/eg/EgRecordMapper.xml
  81. 11 0
      service-eg/service-eg-biz/src/main/resources/mapper/eg/MeetingFaceDeviceMapper.xml
  82. 21 0
      service-eg/service-eg-biz/src/main/resources/mapper/eg/MeetingFaceMapper.xml
  83. 15 0
      service-eg/service-eg-biz/src/main/resources/smart-doc.json
  84. 3 3
      service-fire/service-fire-biz/src/main/java/com/usky/fire/controller/web/PatrolInspectionPlanController.java
  85. 1 0
      service-fire/service-fire-biz/src/main/java/com/usky/fire/service/impl/PatrolInspectionEventServiceImpl.java
  86. 28 0
      service-iot/service-iot-api/src/main/java/com/usky/iot/RemoteIotTaskService.java
  87. 56 0
      service-iot/service-iot-api/src/main/java/com/usky/iot/factory/RemoteIotTaskFactory.java
  88. 5 0
      service-iot/service-iot-biz/pom.xml
  89. 4 4
      service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/MybatisGeneratorUtils.java
  90. 67 0
      service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/api/ServiceIotTaskApi.java
  91. 118 0
      service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/DeviceHttpController.java
  92. 12 0
      service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/DmpDeviceInfoController.java
  93. 74 0
      service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/DmpProductCommandController.java
  94. 16 16
      service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/TaskController.java
  95. 91 0
      service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/VcDeviceController.java
  96. 74 0
      service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/VcDeviceGroupController.java
  97. 80 0
      service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/VcStreamController.java
  98. 8 2
      service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/WeChatController.java
  99. 10 0
      service-iot/service-iot-biz/src/main/java/com/usky/iot/domain/DmpDeviceInfo.java
  100. 112 0
      service-iot/service-iot-biz/src/main/java/com/usky/iot/domain/DmpProductCommand.java

+ 3 - 0
pom.xml

@@ -84,6 +84,9 @@
 
     <module>service-job</module>
 
+
+    <module>service-eg</module>
+
   </modules>
           
   

+ 20 - 0
service-cockpit/pom.xml

@@ -0,0 +1,20 @@
+<?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-iot</artifactId>
+
+    <packaging>pom</packaging>
+    <version>0.0.1</version>
+
+    <modules>
+        <module>service-iot-biz</module>
+        <module>service-iot-api</module>
+    </modules>
+</project>

+ 146 - 0
service-cockpit/service-cockpit-biz/pom.xml

@@ -0,0 +1,146 @@
+<?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-iot</artifactId>
+        <groupId>com.usky</groupId>
+        <version>0.0.1</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>service-iot-biz</artifactId>
+    <dependencies>
+        <dependency>
+            <groupId>com.usky</groupId>
+            <artifactId>common-cloud-starter</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.usky</groupId>
+            <artifactId>service-backend-api</artifactId>
+            <version>0.0.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.usky</groupId>
+            <artifactId>service-iot-api</artifactId>
+            <version>0.0.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>cn.afterturn</groupId>
+            <artifactId>easypoi-spring-boot-starter</artifactId>
+            <version>4.1.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>aliyun-java-sdk-core</artifactId>
+            <version>4.5.16</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
+            <version>1.1.0</version>
+        </dependency>
+
+        <!--MQTT依赖-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-integration</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.integration</groupId>
+            <artifactId>spring-integration-mqtt</artifactId>
+        </dependency>
+        <!--websocket依赖-->
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-websocket</artifactId>
+            <version>5.2.8.RELEASE</version>
+        </dependency>
+        <dependency>
+            <groupId>com.usky</groupId>
+            <artifactId>service-agbox-api</artifactId>
+            <version>0.0.1</version>
+            <scope>compile</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>com.usky</groupId>
+            <artifactId>service-system-api</artifactId>
+            <version>0.0.1</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.github.binarywang</groupId>
+            <artifactId>weixin-java-mp</artifactId>
+            <version>4.3.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-amqp</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.usky</groupId>
+            <artifactId>service-alarm-api</artifactId>
+            <version>0.0.1</version>
+            <scope>compile</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>com.usky</groupId>
+            <artifactId>ruoyi-common-core</artifactId>
+        </dependency>
+
+        <!--钉钉-->
+        <!--获取企业accessToken(企业内部应用) 新版SDK-->
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>dingtalk</artifactId>
+            <version>2.1.34</version>
+        </dependency>
+        <!--旧版SDK-->
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>alibaba-dingtalk-service-sdk</artifactId>
+            <version>2.0.0</version>
+        </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>test</projectName>
+                    <!--                    <excludes>-->
+                    <!--                        <exclude>com.bizmatics:product-service-provider</exclude>-->
+                    <!--                        <exclude>cn.afterturn:easypoi-web</exclude>-->
+                    <!--                    </excludes>-->
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 66 - 0
service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/RuoYiSystemApplication.java

@@ -0,0 +1,66 @@
+package com.usky.iot;
+
+
+
+import com.usky.iot.constant.constant;
+import io.swagger.annotations.SwaggerDefinition;
+import lombok.val;
+import me.chanjar.weixin.mp.api.WxMpService;
+import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
+import me.chanjar.weixin.mp.config.impl.WxMpMapConfigImpl;
+import org.mybatis.spring.annotation.MapperScan;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.amqp.rabbit.annotation.EnableRabbit;
+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.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.core.env.Environment;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+
+/**
+ * 系统模块
+ * 
+ * @author ruoyi
+ */
+
+//@EnableSwagger2
+@EnableFeignClients(basePackages = "com.usky")
+@MapperScan(value = "com.usky.iot.mapper")
+@ComponentScan("com.usky")
+@SpringBootApplication
+@EnableRabbit
+public class RuoYiSystemApplication
+{
+    private static final Logger LOGGER = LoggerFactory.getLogger(RuoYiSystemApplication.class);
+
+    @Bean
+    public WxMpService wxMpService(){
+        WxMpMapConfigImpl wxMpMapConfig = new WxMpMapConfigImpl();
+        wxMpMapConfig.setAppId(constant.WE_CHAT_APP_ID);
+        wxMpMapConfig.setSecret(constant.WE_CHAT_SECRET);
+        val wxMpService = new WxMpServiceImpl();
+        wxMpService.setWxMpConfigStorage(wxMpMapConfig);
+
+        return wxMpService;
+    }
+
+    public static void main(String[] args) throws UnknownHostException {
+        ConfigurableApplicationContext application = SpringApplication.run(RuoYiSystemApplication.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" +
+                "----------------------------------------------------------");
+    }
+}

+ 13 - 0
service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/ServletInitializer.java

@@ -0,0 +1,13 @@
+package cn.com;
+
+import org.springframework.boot.builder.SpringApplicationBuilder;
+import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
+
+public class ServletInitializer extends SpringBootServletInitializer {
+
+	@Override
+	protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
+		return application.sources(GogoApplication.class);
+	}
+
+}

+ 118 - 0
service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/common/base/BaseController.java

@@ -0,0 +1,118 @@
+package cn.com.v2.common.base;
+
+import org.springframework.web.bind.WebDataBinder;
+import org.springframework.web.bind.annotation.InitBinder;
+
+import cn.com.v2.common.domain.AjaxResult;
+
+import java.beans.PropertyEditorSupport;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * web层通用数据处理
+ * 
+ * @ClassName: BaseController
+ * @author fuce
+ * @date 2018年8月18日
+ *
+ */
+
+public class BaseController {
+
+	/**
+	 * 将前台传递过来的日期格式的字符串,自动转化为Date类型
+	 */
+	@InitBinder
+	public void initBinder(WebDataBinder binder) {
+		// SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+		// dateFormat.setLenient(false);
+		binder.registerCustomEditor(Date.class, new MyDateEditor());
+	}
+
+	private class MyDateEditor extends PropertyEditorSupport {
+		@Override
+		public void setAsText(String text) throws IllegalArgumentException {
+			// 通过两次异常的处理可以,绑定两次日期的格式
+			SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+			Date date = null;
+			try {
+				date = format.parse(text);
+			} catch (ParseException e) {
+				format = new SimpleDateFormat("yyyy-MM-dd");
+				try {
+					date = format.parse(text);
+				} catch (ParseException e1) {
+					format = new SimpleDateFormat("yyyy/MM/dd H:mm");
+					try {
+						date = format.parse(text);
+					} catch (ParseException e2) {
+						e2.printStackTrace();
+					}
+				}
+			}
+			setValue(date);
+		}
+	}
+
+	/**
+	 * 响应返回结果
+	 * 
+	 * @param rows 影响行数
+	 * @return 操作结果
+	 */
+	protected AjaxResult toAjax(int rows) {
+		return rows > 0 ? success() : error();
+	}
+
+	/**
+	 * 返回成功
+	 */
+	public AjaxResult success() {
+		return AjaxResult.success();
+	}
+
+	/**
+	 * 返回失败消息
+	 */
+	public AjaxResult error() {
+		return AjaxResult.error();
+	}
+
+	public AjaxResult successData(int code, Object value) {
+		AjaxResult json = new AjaxResult();
+		json.put("code", code);
+		json.put("data", value);
+		return json;
+	}
+
+	/**
+	 * 返回成功消息
+	 */
+	public AjaxResult success(String message) {
+		return AjaxResult.success(message);
+	}
+
+	/**
+	 * 返回失败消息
+	 */
+	public AjaxResult error(String message) {
+		return AjaxResult.error(message);
+	}
+
+	/**
+	 * 返回错误码消息
+	 */
+	public AjaxResult error(int code, String message) {
+		return AjaxResult.error(code, message);
+	}
+
+	/**
+	 * 返回object数据
+	 */
+	public AjaxResult retobject(int code, Object data) {
+		return AjaxResult.successData(code, data);
+	}
+
+}

+ 24 - 0
service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/common/config/CorsConfig.java

@@ -0,0 +1,24 @@
+package cn.com.v2.common.config;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.CorsRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+//重写WebMvcConfigurer实现全局跨域配置
+@Configuration
+public class CorsConfig implements WebMvcConfigurer{
+	@Override
+    public void addCorsMappings(CorsRegistry registry) {
+        	registry.addMapping("/**")
+            // 是否发送Cookie
+            .allowCredentials(true)
+            // 放行哪些原始域
+            .allowedOrigins("*")
+            // 放行哪些请求方式
+            .allowedMethods("GET", "POST", "PUT", "DELETE")
+            // 放行哪些原始请求头部信息
+            .allowedHeaders("*")
+            // 暴露哪些头部信息
+            .exposedHeaders("*");
+    }
+}

+ 2 - 0
service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/common/config/DateStringConvert.java

@@ -0,0 +1,2 @@
+package com.usky.cockpit.common.config;public class DateStringConvert {
+}

+ 20 - 0
service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/common/config/MybatisPlusConfig.java

@@ -0,0 +1,20 @@
+package cn.com.v2.common.config;
+
+import com.baomidou.mybatisplus.annotation.DbType;
+import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class MybatisPlusConfig {
+	 /**
+     * 新的分页插件,一缓和二缓遵循mybatis的规则,
+     */
+    @Bean
+    public MybatisPlusInterceptor mybatisPlusInterceptor() {
+        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
+        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.SQLITE));
+        return interceptor;
+    }
+}

+ 2 - 0
service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/common/config/StringDateConverter.java

@@ -0,0 +1,2 @@
+package com.usky.cockpit.common.config;public class StringDateConverter {
+}

+ 72 - 0
service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/common/config/V2Config.java

@@ -0,0 +1,72 @@
+package cn.com.v2.common.config;
+
+import java.util.Map;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.stereotype.Component;
+
+/**
+ * 读取项目相关配置
+ * 
+ * @author fuce
+ */
+@Component
+@ConfigurationProperties(prefix = "v2")
+public class V2Config {
+
+	/**
+	 * 存储路径
+	 */
+	private String fileurl;
+	/**
+	 * 请求url
+	 */
+	private String httpurl;
+	/**
+	 * 虚拟路径map
+	 */
+	private Map<String, String> xnljmap;
+	
+	/**
+	 * 默认文件格式
+	 */
+	private String defaultFormat;
+	
+
+	public String getFileurl() {
+		return fileurl;
+	}
+
+	public void setFileurl(String fileurl) {
+		this.fileurl = fileurl;
+	}
+
+	
+
+	
+
+	public String getHttpurl() {
+		return httpurl;
+	}
+
+	public void setHttpurl(String httpurl) {
+		this.httpurl = httpurl;
+	}
+
+	public Map<String, String> getXnljmap() {
+		return xnljmap;
+	}
+
+	public void setXnljmap(Map<String, String> xnljmap) {
+		this.xnljmap = xnljmap;
+	}
+
+	public String getDefaultFormat() {
+		return defaultFormat;
+	}
+
+	public void setDefaultFormat(String defaultFormat) {
+		this.defaultFormat = defaultFormat;
+	}
+	
+	
+}

+ 104 - 0
service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/common/domain/AjaxResult.java

@@ -0,0 +1,104 @@
+package cn.com.v2.common.domain;
+
+import java.util.HashMap;
+
+/**
+* @ClassName: AjaxResult
+* @Description: ajax操作消息提醒
+* @author fuce
+* @date 2018年8月18日
+*
+ */
+public class AjaxResult extends HashMap<String, Object>
+{
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 初始化一个新创建的 Message 对象
+     */
+    public AjaxResult()
+    {
+    }
+
+    /**
+     * 返回错误消息
+     * 
+     * @return 错误消息
+     */
+    public static AjaxResult error()
+    {
+        return error(500, "操作失败");
+    }
+
+    /**
+     * 返回错误消息
+     * 
+     * @param msg 内容
+     * @return 错误消息
+     */
+    public static AjaxResult error(String msg)
+    {
+        return error(500, msg);
+    }
+
+    /**
+     * 返回错误消息
+     * 
+     * @param code 错误码
+     * @param msg 内容
+     * @return 错误消息
+     */
+    public static AjaxResult error(int code, String msg)
+    {
+        AjaxResult json = new AjaxResult();
+        json.put("code", code);
+        json.put("msg", msg);
+        return json;
+    }
+
+    /**
+     * 返回成功消息
+     * 
+     * @param msg 内容
+     * @return 成功消息
+     */
+    public static AjaxResult success(String msg)
+    {
+        AjaxResult json = new AjaxResult();
+        json.put("msg", msg);
+        json.put("code", 200);
+        return json;
+    }
+    
+    /**
+     * 返回成功消息
+     * 
+     * @return 成功消息
+     */
+    public static AjaxResult success()
+    {
+        return AjaxResult.success("操作成功");
+    }
+    
+    public static AjaxResult successData(int code, Object value){
+    	 AjaxResult json = new AjaxResult();
+    	 json.put("code", code);
+         json.put("data", value);
+         return json;
+    }
+   
+    
+    /**
+     * 返回成功消息
+     * 
+     * @param key 键值
+     * @param value 内容
+     * @return 成功消息
+     */
+    @Override
+    public AjaxResult put(String key, Object value)
+    {
+        super.put(key, value);
+        return this;
+    }
+}

+ 84 - 0
service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/common/domain/ResultTable.java

@@ -0,0 +1,84 @@
+package cn.com.v2.common.domain;
+
+public class ResultTable {
+     /**
+     * 状态码
+     * */
+    private Integer code;
+
+    /**
+     * 提示消息
+     * */
+    private String msg;
+
+    /**
+     * 消息总量
+     * */
+    private Long count;
+
+    /**
+     * 数据对象
+     * */
+    private Object data;
+
+    public Integer getCode() {
+        return code;
+    }
+
+    public void setCode(Integer code) {
+        this.code = code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+
+    public Long getCount() {
+        return count;
+    }
+
+    public void setCount(Long count) {
+        this.count = count;
+    }
+
+    public Object getData() {
+        return data;
+    }
+
+    public void setData(Object data) {
+        this.data = data;
+    }
+
+    /**
+     * 构 建
+     * */
+    public static ResultTable pageTable(long count,Object data){
+        ResultTable resultTable = new ResultTable();
+        resultTable.setData(data);
+        resultTable.setCode(0);
+        resultTable.setCount(count);
+        if(data!=null) {
+       	 resultTable.setMsg("获取成功");
+       }else {
+       	 resultTable.setMsg("获取失败");
+       }
+        return resultTable;
+    }
+
+    public static ResultTable dataTable(Object data){
+        ResultTable resultTable = new ResultTable();
+        resultTable.setData(data);
+        resultTable.setCode(0);
+        if(data!=null) {
+        	 resultTable.setMsg("获取成功");
+        }else {
+        	 resultTable.setMsg("获取失败");
+        }
+       
+        return resultTable;
+    }
+}

+ 50 - 0
service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/common/domain/Tablepar.java

@@ -0,0 +1,50 @@
+package cn.com.v2.common.domain;
+
+/**
+ * boostrap table post 参数
+ * @author fc
+ *
+ */
+public class Tablepar {
+	private int page;//页码
+	private int limit;//数量
+	private String orderByColumn;//排序字段
+	private String isAsc;//排序字符 asc desc 
+	private String searchText;//列表table里面的搜索
+
+	public int getPage() {
+		return page;
+	}
+
+	public void setPage(int page) {
+		this.page = page;
+	}
+
+	public int getLimit() {
+		return limit;
+	}
+
+	public void setLimit(int limit) {
+		this.limit = limit;
+	}
+
+	public String getOrderByColumn() {
+		return orderByColumn;
+	}
+	public void setOrderByColumn(String orderByColumn) {
+		this.orderByColumn = orderByColumn;
+	}
+	public String getIsAsc() {
+		return isAsc;
+	}
+	public void setIsAsc(String isAsc) {
+		this.isAsc = isAsc;
+	}
+	public String getSearchText() {
+		return searchText;
+	}
+	public void setSearchText(String searchText) {
+		this.searchText = searchText;
+	}
+
+}

+ 21 - 0
service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/common/interceptor/Interceptor.java

@@ -0,0 +1,21 @@
+package cn.com.v2.common.interceptor;
+
+import org.springframework.web.servlet.HandlerInterceptor;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * 拦截器
+ */
+public class Interceptor implements HandlerInterceptor {
+    /**
+     * 在请求处理之前进行调用(Controller方法调用之前)
+     */
+	@Override
+    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
+       
+        return true;//如果设置为false时,被请求时,拦截器执行到此处将不会继续操作
+        //如果设置为true时,请求将会继续执行后面的操作
+    }
+
+}

+ 91 - 0
service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/common/interceptor/WebMvcConfig.java

@@ -0,0 +1,91 @@
+package cn.com.v2.common.interceptor;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.CorsRegistry;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
+
+import cn.com.v2.common.config.V2Config;
+import cn.hutool.core.util.ArrayUtil;
+
+@Configuration
+public class WebMvcConfig extends WebMvcConfigurationSupport {
+ 
+	@Autowired
+	private V2Config v2Config;
+    @Override
+    public void addResourceHandlers(ResourceHandlerRegistry registry) {
+        registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/");
+        registry.addResourceHandler("error.html").addResourceLocations("classpath:/META-INF/resources/static/error.html");
+        registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
+        
+        List<String> list1=new ArrayList<String>();
+        List<String> list2=new ArrayList<String>();
+        
+        Map<String, String> map= v2Config.getXnljmap();
+        
+        Set<String> set = map.keySet();
+        for (String o : set) {
+            list1.add("/"+o+"/**");
+            list2.add(map.get(o));
+        }
+    	registry.addResourceHandler(ArrayUtil.toArray(list1, String.class)).addResourceLocations(ArrayUtil.toArray(list2, String.class));
+    }
+    
+
+    /**
+     * 重写addCorsMappings()解决跨域问题
+     * 配置:允许http请求进行跨域访问
+     *
+     * @param registry
+     */
+    @Override
+    public void addCorsMappings(CorsRegistry registry) {
+    	
+    	// 设置允许多个域名请求
+        //String[] allowDomains = {"http://www.toheart.xin","http://192.168.11.213:8080","http://localhost:8080"};
+    	
+        //指哪些接口URL需要增加跨域设置
+        registry.addMapping("/**")
+                //.allowedOrigins("*")//指的是前端哪些域名被允许跨域
+                .allowedOriginPatterns("*")
+                //需要带cookie等凭证时,设置为true,就会把cookie的相关信息带上
+                .allowCredentials(true)
+                //指的是允许哪些方法
+                .allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS")
+                //cookie的失效时间,单位为秒(s),若设置为-1,则关闭浏览器就失效
+                .maxAge(3600);
+    }
+    
+    /**
+     * 重写addInterceptors()实现拦截器
+     * 配置:要拦截的路径以及不拦截的路径
+     *
+     * @param registry
+     */
+    @Override
+    public void addInterceptors(InterceptorRegistry registry) {
+        //注册Interceptor拦截器(Interceptor这个类是我们自己写的拦截器类)
+        InterceptorRegistration registration = registry.addInterceptor(new Interceptor());
+        //addPathPatterns()方法添加需要拦截的路径
+        //所有路径都被拦截
+        registration.addPathPatterns("/**");
+        //excludePathPatterns()方法添加不拦截的路径
+        
+        
+        String[] excludePatterns = new String[]{"/error","/error.html","/swagger-resources/**", "/webjars/**", "/v2/**", "/swagger-ui.html/**",
+                "/api", "/api-docs", "/api-docs/**", "/doc.html/**",
+                "/api/file/*"};
+        
+        //添加不拦截路径
+        registration.excludePathPatterns(excludePatterns);
+    }
+ 
+}

+ 108 - 0
service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/controller/MybatisGeneratorUtils.java

@@ -0,0 +1,108 @@
+package com.usky.iot.controller;//package com.usky.iot.controller;//package com.usky.dm.controller.web.business;//package com.usky.dm.controller.web;
+
+
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import com.baomidou.mybatisplus.generator.AutoGenerator;
+import com.baomidou.mybatisplus.generator.InjectionConfig;
+import com.baomidou.mybatisplus.generator.config.*;
+import com.baomidou.mybatisplus.generator.config.po.TableInfo;
+import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author yq
+ * @date 2021/7/6 11:42
+ */
+public class MybatisGeneratorUtils {
+    public static void main(String[] args) {
+
+            shell("service-iot","service-iot-biz");
+    }
+
+    private static void shell(String parentName,String model) {
+
+        AutoGenerator mpg = new AutoGenerator();
+        //1、全局配置
+        GlobalConfig gc = new GlobalConfig();
+//        File file = new File(model);
+//        String path = file.getAbsolutePath();
+        String projectPath = System.getProperty("user.dir");
+        projectPath+="/"+parentName;
+        projectPath+="/"+model;
+        gc.setOutputDir(projectPath+ "/src/main/java");  //生成路径(一般都是生成在此项目的src/main/java下面)
+        //修改为自己的名字
+        gc.setAuthor("han"); //设置作者
+        gc.setOpen(false);
+        gc.setFileOverride(true); //第二次生成会把第一次生成的覆盖掉
+        gc.setServiceName("%sService"); //生成的service接口名字首字母是否为I,这样设置就没有
+        gc.setBaseResultMap(true); //生成resultMap
+        mpg.setGlobalConfig(gc);
+
+        //2、数据源配置
+        //修改数据源
+        DataSourceConfig dsc = new DataSourceConfig();
+        dsc.setUrl("jdbc:mysql://172.16.120.165:3306/usky-cloud?useUnicode=true&serverTimezone=GMT&useSSL=false&characterEncoding=utf8");
+        dsc.setDriverName("com.mysql.jdbc.Driver");
+        dsc.setUsername("usky");
+        dsc.setPassword("Yt#75Usky");
+        mpg.setDataSource(dsc);
+
+        // 3、包配置
+        PackageConfig pc = new PackageConfig();
+        pc.setParent("com.usky.iot");
+        pc.setController("controller.web");
+        pc.setEntity("domain");
+        pc.setMapper("mapper");
+        pc.setService("service");
+        pc.setServiceImpl("service.impl");
+//        pc.setXml("mapper.demo");
+        //pc.setModuleName("test");
+        mpg.setPackageInfo(pc);
+
+        // 4、策略配置
+        StrategyConfig strategy = new StrategyConfig();
+        strategy.setNaming(NamingStrategy.underline_to_camel);
+        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
+        strategy.setSuperMapperClass("com.usky.common.mybatis.core.CrudMapper");
+        strategy.setSuperServiceClass("com.usky.common.mybatis.core.CrudService");
+        strategy.setSuperServiceImplClass("com.usky.common.mybatis.core.AbstractCrudService");
+        // strategy.setTablePrefix("t_"); // 表名前缀
+        strategy.setEntityLombokModel(true); //使用lombok
+        //修改自己想要生成的表
+        strategy.setInclude("sys_dept");  // 逆向工程使用的表   如果要生成多个,这里可以传入String[]
+        mpg.setStrategy(strategy);
+
+        // 关闭默认 xml 生成,调整生成 至 根目录
+        //修改对应的模块名称
+        TemplateConfig tc = new TemplateConfig();
+        // 自定义配置
+        InjectionConfig cfg = new InjectionConfig() {
+            @Override
+            public void initMap() {
+                // to do nothing
+            }
+        };
+        //如果模板引擎是 velocity
+        String templatePath = "/templates/mapper.xml.vm";
+        // 自定义输出配置
+        List<FileOutConfig> focList = new ArrayList<>();
+        // 自定义配置会被优先输出
+        String finalProjectPath = projectPath;
+        focList.add(new FileOutConfig(templatePath) {
+            @Override
+            public String outputFile(TableInfo tableInfo) {
+                // 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
+                return finalProjectPath + "/src/main/resources/mapper/iot" + "/"
+                        + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
+            }
+        });
+        cfg.setFileOutConfigList(focList);
+        mpg.setCfg(cfg);
+        tc.setXml(null);
+        mpg.setTemplate(tc);
+        //5、执行
+        mpg.execute();
+    }
+}

+ 87 - 0
service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/controller/web/ApiController.java

@@ -0,0 +1,87 @@
+package cn.com.v2.controller;
+
+import java.util.HashMap;
+import java.util.Map;
+import javax.servlet.http.HttpServletRequest;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+
+import cn.com.v2.common.base.BaseController;
+import cn.com.v2.common.domain.AjaxResult;
+import cn.com.v2.model.SysUser;
+import cn.com.v2.service.ISysUserService;
+import cn.com.v2.util.SaTokenUtil;
+import cn.dev33.satoken.stp.StpUtil;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.crypto.SecureUtil;
+import io.swagger.annotations.ApiOperation;
+
+@RestController
+@RequestMapping("/api/goview/sys")
+public class ApiController  extends BaseController {
+	@Autowired
+	private ISysUserService iSysUserService;
+
+	@ApiOperation(value = "登陆", notes = "登陆")
+	@PostMapping("/login")
+	@ResponseBody
+	public AjaxResult APIlogin(@RequestBody SysUser user, HttpServletRequest request) {
+
+		// 判断是否登陆
+		if (StpUtil.isLogin()) {
+
+			Map<String, Object> map = new HashMap<String, Object>();
+			map.put("userinfo", SaTokenUtil.getUser());
+			map.put("token", StpUtil.getTokenInfo());
+			return success().put("data", map);
+		} else {
+			if (StrUtil.isNotBlank(user.getUsername()) && StrUtil.isNotBlank(user.getPassword())) {
+				SysUser sysUser = iSysUserService.getOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getUsername, user.getUsername()).eq(SysUser::getPassword, SecureUtil.md5(user.getPassword())).last("LIMIT 1"));
+				if (sysUser != null) {
+					StpUtil.login(sysUser.getId());
+					SaTokenUtil.setUser(sysUser);
+					Map<String, Object> map = new HashMap<String, Object>();
+					map.put("userinfo", sysUser);
+					map.put("token", StpUtil.getTokenInfo());
+
+					return success().put("data", map);
+				} else {
+					return error(500, "账户或者密码错误");
+				}
+			} else {
+				return error(500, "账户密码不能为空");
+			}
+		}
+
+	}
+	
+	
+	@ApiOperation(value = "登陆", notes = "登陆")
+	@GetMapping("/logout")
+	@ResponseBody
+	public AjaxResult logout() {
+
+		// 判断是否登陆
+		StpUtil.logout();
+
+		return success();
+
+	}
+	
+	
+	@ApiOperation(value = "获取oss地址", notes = "获取oss地址")
+	@GetMapping("/getOssInfo")
+	@ResponseBody
+	public AjaxResult getOssInfo() {
+
+		return success();
+
+	}
+
+}

+ 376 - 0
service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/controller/web/FileController.java

@@ -0,0 +1,376 @@
+package cn.com.v2.controller;
+
+import java.io.File;
+import java.io.IOException;
+import java.math.BigInteger;
+import java.security.MessageDigest;
+import java.time.LocalDateTime;
+import java.util.Date;
+import java.util.Map;
+import java.util.Map.Entry;
+import javax.servlet.http.HttpServletResponse;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import cn.com.v2.common.base.BaseController;
+import cn.com.v2.common.config.V2Config;
+import cn.com.v2.common.domain.AjaxResult;
+import cn.com.v2.model.SysFile;
+import cn.com.v2.model.vo.SysFileVo;
+import cn.com.v2.service.ISysFileService;
+import cn.com.v2.util.SnowflakeIdWorker;
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.codec.Base64;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.io.IORuntimeException;
+import cn.hutool.core.util.StrUtil;
+
+/**
+ * 文件上传controller
+ * @author fuce 
+ * @date: 2018年9月16日 下午4:23:50
+ */
+@Api(value = "文件上传")
+@RestController
+@RequestMapping("/api/file")
+@Slf4j
+public class FileController extends BaseController{
+
+
+	@Autowired
+	private V2Config v2Config;
+	@Autowired
+	private ISysFileService iSysFileService;
+
+	/**
+	 * 删除文件
+	 * @param ids
+	 * @return
+	 */
+	@ApiOperation(value = "删除", notes = "删除")
+	@DeleteMapping("/remove")
+	public AjaxResult remove(String ids){
+		Boolean b=iSysFileService.removeByIds(StrUtil.split(ids, ',',-1));
+		if(b){
+			return success();
+		}else{
+			return error();
+		}
+	}
+	
+	
+	@ApiOperation(value = "修改", notes = "修改")
+	@PutMapping("/update")
+	public AjaxResult update(String id,@RequestBody MultipartFile object) throws IllegalStateException, IOException{
+		SysFile sysFile=iSysFileService.getById(id);
+		if(sysFile!=null){
+			String fileurl=sysFile.getAbsolutePath()+sysFile.getRelativePath()+File.separator+sysFile.getFileName();
+			object.transferTo(new File(fileurl));
+			return success("修改成功");
+		}else{
+			return error();
+		}
+	}
+
+	/**
+	 * 上传文件
+	 * @param object 文件流对象
+	 * @param bucketName 桶名
+	 * @return
+	 * @throws Exception
+	 */
+	@PostMapping("/upload")
+	public AjaxResult upload(@RequestBody MultipartFile object) throws IOException{
+		String fileName = object.getOriginalFilename();
+		//默认文件格式
+		String suffixName=v2Config.getDefaultFormat();
+		String mediaKey="";
+		Long filesize= object.getSize();
+		//文件名字
+		String fileSuffixName="";
+		if(fileName.lastIndexOf(".")!=-1) {//有后缀
+			 suffixName = fileName.substring(fileName.lastIndexOf(".")).toLowerCase();
+			 //mediaKey=MD5.create().digestHex(fileName);
+			 mediaKey=SnowflakeIdWorker.getUUID();
+			 fileSuffixName=mediaKey+suffixName;
+		}else {//无后缀
+			//取得唯一id
+			 //mediaKey = MD5.create().digestHex(fileName+suffixName);
+			mediaKey=SnowflakeIdWorker.getUUID();
+			//fileSuffixName=mediaKey+suffixName;
+		}
+		String virtualKey=getFirstNotNull(v2Config.getXnljmap());
+		String absolutePath=v2Config.getXnljmap().get(getFirstNotNull(v2Config.getXnljmap()));
+		SysFile sysFile=new SysFile();
+		sysFile.setId(SnowflakeIdWorker.getUUID());
+		sysFile.setFileName(fileSuffixName);
+		sysFile.setFileSize(Integer.parseInt(filesize+""));
+		sysFile.setFileSuffix(suffixName);
+		sysFile.setCreateTime(DateUtil.formatLocalDateTime(LocalDateTime.now()));
+		String filepath=DateUtil.formatDate(new Date());
+		sysFile.setRelativePath(filepath);
+		sysFile.setVirtualKey(virtualKey);
+		sysFile.setAbsolutePath(absolutePath.replace("file:",""));
+		iSysFileService.saveOrUpdate(sysFile);
+		File desc = getAbsoluteFile(v2Config.getFileurl()+File.separator+filepath,fileSuffixName);
+		object.transferTo(desc);
+		SysFileVo sysFileVo=BeanUtil.copyProperties(sysFile, SysFileVo.class);
+		sysFileVo.setFileurl(v2Config.getHttpurl()+sysFile.getVirtualKey()+"/"+sysFile.getRelativePath()+"/"+sysFile.getFileName());
+		return AjaxResult.successData(200, sysFileVo);
+	}
+	
+	
+	/**
+	 * Base64字符串转成图片
+	 * @param str
+	 * @throws IOException 
+	 */
+	@PostMapping("/uploadbase64")
+	public synchronized AjaxResult uploadbase64(String base64str) throws IOException{
+		if(StrUtil.isNotBlank(base64str)){
+			String suffixName=v2Config.getDefaultFormat();
+			String mediaKey=SnowflakeIdWorker.getUUID();
+			String fileSuffixName=mediaKey+suffixName;
+			String virtualKey=getFirstNotNull(v2Config.getXnljmap());
+			String absolutePath=v2Config.getXnljmap().get(getFirstNotNull(v2Config.getXnljmap()));
+			SysFile sysFile=new SysFile();
+			sysFile.setId(SnowflakeIdWorker.getUUID());
+			sysFile.setFileName(fileSuffixName);
+			sysFile.setFileSuffix(suffixName);
+			sysFile.setCreateTime(DateUtil.formatLocalDateTime(LocalDateTime.now()));
+			String filepath=DateUtil.formatDate(new Date());
+			sysFile.setRelativePath(filepath);
+			sysFile.setVirtualKey(virtualKey);
+			sysFile.setAbsolutePath(absolutePath.replace("file:",""));
+			File desc = getAbsoluteFile(v2Config.getFileurl()+File.separator+filepath,fileSuffixName);
+			File file=null;
+			try {
+				 file=Base64.decodeToFile(base64str, desc);
+			} catch (Exception e) {
+				System.out.println("错误base64:"+base64str);
+				e.printStackTrace();
+			}
+			sysFile.setFileSize(Integer.parseInt(file.length()+""));
+			iSysFileService.saveOrUpdate(sysFile);
+			SysFileVo sysFileVo=BeanUtil.copyProperties(sysFile, SysFileVo.class);
+			sysFileVo.setFileurl(v2Config.getHttpurl()+sysFile.getVirtualKey()+"/"+sysFile.getRelativePath()+"/"+sysFile.getFileName());
+			return AjaxResult.successData(200, sysFileVo);
+		}
+		return AjaxResult.error();
+		
+	}
+	
+	
+	/**
+	 * 定制方法
+	 * 根据关键字与相对路径获取文件内容 
+	 * @param key 访问关键字
+	 * @param rpf 相对路径+文件名字
+	 * @return
+	 */
+	@PostMapping("/getFileText")
+	public AjaxResult getFileText(String key,String relativePath){
+		String absolutePath= v2Config.getXnljmap().get(key).replace("file:", "");
+		String fileurl=absolutePath+relativePath;
+		try {
+			String text=FileUtil.readUtf8String(fileurl);
+			return AjaxResult.successData(200, text);
+		}catch (IORuntimeException e) {
+			return AjaxResult.error("没有该文件");
+		}
+		catch (Exception e) {
+			return AjaxResult.error("报错:"+e.getMessage());
+		}
+	}
+	
+	
+	/**
+	 * 定制方法
+	 * 根据关键字与相对路径获取文件内容 
+	 * @param key 访问关键字
+	 * @param rpf 相对路径+文件名字
+	 * @return
+	 * @throws IOException 
+	 */
+	@PostMapping("/getFileText302")
+	public void getFileText302(String key,String relativePath,HttpServletResponse response) throws IOException{
+		String str=v2Config.getHttpurl()+key+"/"+relativePath;
+		response.sendRedirect(str);
+		
+	}
+	
+	
+	
+	
+	/**
+	 * 覆盖上传文件 key与指定路径
+	 * @param object 文件流对象
+	 * @param bucketName 桶名
+	 * @return
+	 * @throws Exception
+	 */
+	@PostMapping("/coverupload")
+	public AjaxResult coverupload(@RequestBody MultipartFile object,String key,String relativePath) throws IOException{
+		
+		String fileName = object.getOriginalFilename();
+		String suffixName=v2Config.getDefaultFormat();
+		Long filesize= object.getSize();
+		//文件名字
+		String fileSuffixName="";
+		if(fileName.lastIndexOf(".")!=-1) {//有后缀
+			 suffixName = fileName.substring(fileName.lastIndexOf(".")).toLowerCase();
+			 //mediaKey=MD5.create().digestHex(fileName);
+			 //mediaKey=SnowflakeIdWorker.getUUID();
+			 fileSuffixName=relativePath.substring(relativePath.lastIndexOf("/")+1,relativePath.length());
+		}else {//无后缀
+			//取得唯一id
+			 //mediaKey = MD5.create().digestHex(fileName+suffixName);
+			//mediaKey=SnowflakeIdWorker.getUUID();
+			//fileSuffixName=mediaKey+suffixName;
+		}
+		String virtualKey=key;
+		String absolutePath=v2Config.getXnljmap().get(key).replace("file:", "");
+		SysFile sysFile=new SysFile();
+		sysFile.setId(SnowflakeIdWorker.getUUID());
+		sysFile.setFileName(fileSuffixName);
+		sysFile.setFileSize(Integer.parseInt(filesize+""));
+		sysFile.setFileSuffix(suffixName);
+		sysFile.setCreateTime(DateUtil.formatLocalDateTime(LocalDateTime.now()));
+		String filepath=relativePath.substring(0,relativePath.lastIndexOf("/"));
+		sysFile.setRelativePath(filepath);
+		sysFile.setVirtualKey(virtualKey);
+		sysFile.setAbsolutePath(absolutePath);
+		iSysFileService.saveOrUpdate(sysFile);
+		File desc = getAbsoluteFile(absolutePath+filepath,fileSuffixName);
+		object.transferTo(desc);
+		SysFileVo sysFileVo=BeanUtil.copyProperties(sysFile, SysFileVo.class);
+		sysFileVo.setFileurl(v2Config.getHttpurl()+sysFile.getVirtualKey()+"/"+sysFile.getRelativePath()+"/"+sysFile.getFileName());
+		return AjaxResult.successData(200, sysFileVo);
+	}
+	
+	
+	
+
+	
+	/**
+	 * 根据文件id查询文件信息json
+	 * @param id
+	 * @return
+	 */
+	@GetMapping("/getFileid/{id}")
+	public AjaxResult getFileid(@PathVariable("id") String id){
+		SysFile sysFile=iSysFileService.getById(id);
+		if(sysFile!=null){
+			SysFileVo sysFileVo=BeanUtil.copyProperties(sysFile, SysFileVo.class);
+			sysFileVo.setFileurl(v2Config.getHttpurl()+sysFile.getVirtualKey()+"/"+sysFile.getRelativePath()+"/"+sysFile.getFileName());
+			return AjaxResult.successData(200, sysFileVo);
+		}
+		return AjaxResult.error("没有该文件");
+		
+	}
+	
+	/**
+	 * 根据文件id 302跳转到绝对地址
+	 * @param id
+	 * @param response
+	 * @throws IOException
+	 */
+	@GetMapping("/getFileid/302/{id}")
+	public void getFileid302(@PathVariable("id") String id,HttpServletResponse response) throws IOException{
+		SysFile sysFile=iSysFileService.getById(id);
+		if(sysFile!=null){
+			String str=v2Config.getHttpurl()+sysFile.getVirtualKey()+"/"+sysFile.getRelativePath()+"/"+sysFile.getFileName();
+			response.sendRedirect(str);
+		}
+	}
+	
+	
+	
+	
+	
+	
+	/**
+	 * 分页查询
+	 * @param current
+	 * @param size
+	 * @return
+	 */
+	@GetMapping("/list")
+	public Object list(long current, long size){
+		Page<SysFile> page= new Page<SysFile>(current, size);
+		IPage<SysFile> sysFile=iSysFileService.page(page, new LambdaQueryWrapper<SysFile>());
+		return sysFile;
+	}
+	
+	
+	
+	
+
+    /**
+     * 获取map中第一个非空数据key
+     *
+     * @param <K> Key的类型
+     * @param <V> Value的类型
+     * @param map 数据源
+     * @return 返回的值
+     */
+    public static <K, V> K getFirstNotNull(Map<K, V> map) {
+        K obj = null;
+        for (Entry<K, V> entry : map.entrySet()) {
+            obj =  entry.getKey();
+            if (obj != null) {
+                break;
+            }
+        }
+        return obj;
+    }
+	
+	
+    public  final static File getAbsoluteFile(String uploadDir, String filename) throws IOException
+    {
+        File desc = new File(uploadDir+File.separator + filename);
+
+        if (!desc.getParentFile().exists())
+        {
+            desc.getParentFile().mkdirs();
+        }
+        if (!desc.exists())
+        {
+            desc.createNewFile();
+        }
+        return desc;
+    }
+	
+	
+	/**
+	 * 获取上传文件的md5
+	 * @param file
+	 * @return
+	 * @throws IOException
+	 */
+	public String getMd5(MultipartFile file) {
+	    try {
+	        //获取文件的byte信息
+	        byte[] uploadBytes = file.getBytes();
+	        // 拿到一个MD5转换器
+	        MessageDigest md5 = MessageDigest.getInstance("MD5");
+	        byte[] digest = md5.digest(uploadBytes);
+	        //转换为16进制
+	        return new BigInteger(1, digest).toString(16);
+	    } catch (Exception e) {
+	        log.error(e.getMessage());
+	    }
+	    return null;
+	}
+
+
+    
+    
+}

+ 257 - 0
service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/controller/web/GoviewProjectController.java

@@ -0,0 +1,257 @@
+package cn.com.v2.controller;
+
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+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.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import cn.com.v2.common.base.BaseController;
+import cn.com.v2.common.config.V2Config;
+import cn.com.v2.common.domain.AjaxResult;
+import cn.com.v2.common.domain.ResultTable;
+import cn.com.v2.common.domain.Tablepar;
+import cn.com.v2.model.GoviewProject;
+import cn.com.v2.model.GoviewProjectData;
+import cn.com.v2.model.SysFile;
+import cn.com.v2.model.vo.GoviewProjectVo;
+import cn.com.v2.model.vo.SysFileVo;
+import cn.com.v2.service.IGoviewProjectDataService;
+import cn.com.v2.service.IGoviewProjectService;
+import cn.com.v2.service.ISysFileService;
+import cn.com.v2.util.ConvertUtil;
+import cn.com.v2.util.SnowflakeIdWorker;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.date.DateUtil;
+import io.swagger.annotations.ApiOperation;
+import java.io.File;
+import java.io.IOException;
+import java.time.LocalDateTime;
+import java.util.Date;
+import java.util.List;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.ui.ModelMap;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author fc
+ * @since 2023-04-30
+ */
+@RestController
+@RequestMapping("/api/goview/project")
+public class GoviewProjectController  extends BaseController{
+	@Autowired
+	private ISysFileService iSysFileService;
+	@Autowired
+	private V2Config v2Config;
+	@Autowired
+	private IGoviewProjectService iGoviewProjectService;
+	@Autowired
+	private IGoviewProjectDataService iGoviewProjectDataService;
+	
+	
+	@ApiOperation(value = "分页跳转", notes = "分页跳转")
+	@GetMapping("/list")
+	@ResponseBody
+	public ResultTable list(Tablepar tablepar){
+		Page<GoviewProject> page= new Page<GoviewProject>(tablepar.getPage(), tablepar.getLimit());
+		IPage<GoviewProject> iPages=iGoviewProjectService.page(page, new LambdaQueryWrapper<GoviewProject>());
+		ResultTable resultTable=new ResultTable();
+		resultTable.setData(iPages.getRecords());
+		resultTable.setCode(200);
+		resultTable.setCount(iPages.getTotal());
+		resultTable.setMsg("获取成功");
+		return resultTable;
+	}
+	
+	
+	/**
+     * 新增保存
+     * @param 
+     * @return
+     */
+	//@Log(title = "项目表新增", action = "111")
+	@ApiOperation(value = "新增", notes = "新增")
+	@PostMapping("/create")
+	@ResponseBody
+	public AjaxResult add(@RequestBody GoviewProject goviewProject){
+		goviewProject.setCreateTime(DateUtil.now());
+		goviewProject.setState(-1);
+		boolean b=iGoviewProjectService.save(goviewProject);
+		if(b){
+			return successData(200, goviewProject).put("msg", "创建成功");
+		}else{
+			return error();
+		}
+	}
+	
+	
+	/**
+	 * 项目表删除
+	 * @param ids
+	 * @return
+	 */
+	//@Log(title = "项目表删除", action = "111")
+	@ApiOperation(value = "删除", notes = "删除")
+	@DeleteMapping("/delete")
+	@ResponseBody
+	public AjaxResult remove(String ids){
+		List<String> lista=ConvertUtil.toListStrArray(ids);
+		Boolean b=iGoviewProjectService.removeByIds(lista);
+		if(b){
+			return success();
+		}else{
+			return error();
+		}
+	}
+	
+	@ApiOperation(value = "修改保存", notes = "修改保存")
+    @PostMapping("/edit")
+    @ResponseBody
+    public AjaxResult editSave(@RequestBody GoviewProject goviewProject)
+    {
+		Boolean b= iGoviewProjectService.updateById(goviewProject);
+        if(b){
+        	return success();
+        }
+        return error();
+    }
+	
+	
+	@ApiOperation(value = "项目重命名", notes = "项目重命名")
+    @PostMapping("/rename")
+    @ResponseBody
+    public AjaxResult rename(@RequestBody GoviewProject goviewProject)
+    {
+		
+		LambdaUpdateWrapper<GoviewProject> updateWrapper=new LambdaUpdateWrapper<GoviewProject>();
+		updateWrapper.eq(GoviewProject::getId, goviewProject.getId());
+		updateWrapper.set(GoviewProject::getProjectName, goviewProject.getProjectName());
+		Boolean b=iGoviewProjectService.update(updateWrapper);
+		if(b){
+        	return success();
+        }
+		return error();
+    }
+	
+	
+	//发布/取消项目状态
+    @PutMapping("/publish")
+	@ResponseBody
+    public AjaxResult updateVisible(@RequestBody GoviewProject goviewProject){
+    	if(goviewProject.getState()==-1||goviewProject.getState()==1) {
+    	
+    		LambdaUpdateWrapper<GoviewProject> updateWrapper=new LambdaUpdateWrapper<GoviewProject>();
+    		updateWrapper.eq(GoviewProject::getId, goviewProject.getId());
+    		updateWrapper.set(GoviewProject::getState, goviewProject.getState());
+    		Boolean b=iGoviewProjectService.update(updateWrapper);
+    		if(b){
+            	return success();
+            }
+    		return error();
+    	}
+    	return error("警告非法字段");
+	}
+	
+    
+    @ApiOperation(value = "获取项目存储数据", notes = "获取项目存储数据")
+	@GetMapping("/getData")
+	@ResponseBody
+    public AjaxResult getData(String projectId, ModelMap map)
+    {
+		GoviewProject goviewProject= iGoviewProjectService.getById(projectId);
+		
+		GoviewProjectData blogText=iGoviewProjectDataService.getProjectid(projectId);
+		if(blogText!=null) {
+			GoviewProjectVo goviewProjectVo=new GoviewProjectVo();
+			BeanUtils.copyProperties(goviewProject,goviewProjectVo);
+			goviewProjectVo.setContent(blogText.getContent());
+			return AjaxResult.successData(200,goviewProjectVo).put("msg","获取成功");
+		}
+		return AjaxResult.successData(200, null).put("msg","无数据");
+        
+    }
+	
+	
+	
+	@ApiOperation(value = "保存项目数据", notes = "保存项目数据")
+	@PostMapping("/save/data")
+	@ResponseBody
+	public AjaxResult saveData(GoviewProjectData data) {
+		
+		GoviewProject goviewProject= iGoviewProjectService.getById(data.getProjectId());
+		if(goviewProject==null) {
+			return error("没有该项目ID");
+		}
+		GoviewProjectData goviewProjectData= iGoviewProjectDataService.getOne(new LambdaQueryWrapper<GoviewProjectData>().eq(GoviewProjectData::getProjectId, goviewProject.getId()));
+		if(goviewProjectData!=null) {
+			 data.setId(goviewProjectData.getId());
+			 iGoviewProjectDataService.updateById(data);
+			 return success("数据保存成功");
+		}else {
+			iGoviewProjectDataService.save(data);
+			return success("数据保存成功");
+		}
+	}
+	
+	/**
+	 * 上传文件
+	 * @param object 文件流对象
+	 * @param bucketName 桶名
+	 * @return
+	 * @throws Exception
+	 */
+	@PostMapping("/upload")
+	public AjaxResult upload(@RequestBody MultipartFile object) throws IOException{
+		String fileName = object.getOriginalFilename();
+		//默认文件格式
+		String suffixName=v2Config.getDefaultFormat();
+		String mediaKey="";
+		Long filesize= object.getSize();
+		//文件名字
+		String fileSuffixName="";
+		if(fileName.lastIndexOf(".")!=-1) {//有后缀
+			 suffixName = fileName.substring(fileName.lastIndexOf(".")).toLowerCase();
+			 //mediaKey=MD5.create().digestHex(fileName);
+			 mediaKey=SnowflakeIdWorker.getUUID();
+			 fileSuffixName=mediaKey+suffixName;
+		}else {//无后缀
+			//取得唯一id
+			 //mediaKey = MD5.create().digestHex(fileName+suffixName);
+			mediaKey=SnowflakeIdWorker.getUUID();
+			//fileSuffixName=mediaKey+suffixName;
+		}
+		String virtualKey=FileController.getFirstNotNull(v2Config.getXnljmap());
+		String absolutePath=v2Config.getXnljmap().get(FileController.getFirstNotNull(v2Config.getXnljmap()));
+		SysFile sysFile=new SysFile();
+		sysFile.setId(SnowflakeIdWorker.getUUID());
+		sysFile.setFileName(fileSuffixName);
+		sysFile.setFileSize(Integer.parseInt(filesize+""));
+		sysFile.setFileSuffix(suffixName);
+		sysFile.setCreateTime(DateUtil.formatLocalDateTime(LocalDateTime.now()));
+		String filepath=DateUtil.formatDate(new Date());
+		sysFile.setRelativePath(filepath);
+		sysFile.setVirtualKey(virtualKey);
+		sysFile.setAbsolutePath(absolutePath.replace("file:",""));
+		iSysFileService.saveOrUpdate(sysFile);
+		File desc = FileController.getAbsoluteFile(v2Config.getFileurl()+File.separator+filepath,fileSuffixName);
+		object.transferTo(desc);
+		SysFileVo sysFileVo=BeanUtil.copyProperties(sysFile, SysFileVo.class);
+		sysFileVo.setFileurl(v2Config.getHttpurl()+sysFile.getVirtualKey()+"/"+sysFile.getRelativePath()+"/"+sysFile.getFileName());
+		return successData(200, sysFileVo);
+	}
+	
+
+}

+ 21 - 0
service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/controller/web/Indexcontroller.java

@@ -0,0 +1,21 @@
+package cn.com.v2.controller;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import javax.servlet.http.HttpServletResponse;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class Indexcontroller {
+
+	@GetMapping("/")
+	public void index(HttpServletResponse response) throws IOException {
+		response.setContentType("text/html; charset=utf-8");
+		PrintWriter out = response.getWriter();
+		out.println("<p style='color:orange'>goview后台首页</p>");
+		out.flush();
+		out.close();
+
+	}
+}

+ 20 - 0
service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/controller/web/SysUserController.java

@@ -0,0 +1,20 @@
+package cn.com.v2.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.stereotype.Controller;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author fc
+ * @since 2023-04-30
+ */
+@RestController
+@RequestMapping("/v2/sys-user")
+public class SysUserController {
+
+}

+ 16 - 0
service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/mapper/GoviewProjectDataMapper.java

@@ -0,0 +1,16 @@
+package cn.com.v2.mapper;
+
+import cn.com.v2.model.GoviewProjectData;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author fc
+ * @since 2023-04-30
+ */
+public interface GoviewProjectDataMapper extends BaseMapper<GoviewProjectData> {
+
+}

+ 16 - 0
service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/mapper/GoviewProjectMapper.java

@@ -0,0 +1,16 @@
+package cn.com.v2.mapper;
+
+import cn.com.v2.model.GoviewProject;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author fc
+ * @since 2023-04-30
+ */
+public interface GoviewProjectMapper extends BaseMapper<GoviewProject> {
+
+}

+ 17 - 0
service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/mapper/SysFileMapper.java

@@ -0,0 +1,17 @@
+package cn.com.v2.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+import cn.com.v2.model.SysFile;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author fc
+ * @since 2022-12-22
+ */
+public interface SysFileMapper extends BaseMapper<SysFile> {
+
+}

+ 16 - 0
service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/mapper/SysUserMapper.java

@@ -0,0 +1,16 @@
+package cn.com.v2.mapper;
+
+import cn.com.v2.model.SysUser;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author fc
+ * @since 2023-04-30
+ */
+public interface SysUserMapper extends BaseMapper<SysUser> {
+
+}

+ 48 - 0
service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/model/GoviewProject.java

@@ -0,0 +1,48 @@
+package cn.com.v2.model;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author fc
+ * @since 2023-04-30
+ */
+@TableName("t_goview_project")
+@Data
+public class GoviewProject implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+    
+    @TableId(type = IdType.ASSIGN_ID)
+    private String id;
+
+    private String projectName;
+
+    private Integer state;
+
+    @TableField(fill = FieldFill.INSERT)
+    private String createTime;
+
+    private String createUserId;
+
+    private Integer isDelete;
+
+    private String indexImage;
+
+    private String remarks;
+
+}
+
+
+

+ 39 - 0
service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/model/GoviewProjectData.java

@@ -0,0 +1,39 @@
+package cn.com.v2.model;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import java.io.Serializable;
+import java.sql.Blob;
+import java.sql.SQLException;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author fc
+ * @since 2023-04-30
+ */
+@TableName("t_goview_project_data")
+@Data
+public class GoviewProjectData implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+    @TableId(type = IdType.ASSIGN_ID)
+    private String id;
+
+    private String projectId;
+
+    @TableField(fill = FieldFill.INSERT)
+    private String createTime;
+
+    private String createUserId;
+
+    private String content;
+
+   
+}

+ 119 - 0
service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/model/SysFile.java

@@ -0,0 +1,119 @@
+package cn.com.v2.model;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author fc
+ * @since 2022-12-22
+ */
+@TableName("t_sys_file")
+public class SysFile implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.INPUT)
+    private String id;
+
+    private String fileName;
+
+    private Integer fileSize;
+
+    private String fileSuffix;
+    
+    /**
+     * 虚拟路径
+     */
+    private String virtualKey;
+    
+    /**
+     * 相对路径
+     */
+    private String relativePath;
+    
+    /**
+     * 绝对路径
+     */
+    private String absolutePath;
+    
+    
+    
+    
+    @TableField(fill = FieldFill.INSERT)
+    private String createTime;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+    public String getFileName() {
+        return fileName;
+    }
+
+    public void setFileName(String fileName) {
+        this.fileName = fileName;
+    }
+   
+    public Integer getFileSize() {
+        return fileSize;
+    }
+
+    public void setFileSize(Integer fileSize) {
+        this.fileSize = fileSize;
+    }
+    public String getFileSuffix() {
+        return fileSuffix;
+    }
+
+    public void setFileSuffix(String fileSuffix) {
+        this.fileSuffix = fileSuffix;
+    }
+    public String getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(String createTime) {
+        this.createTime = createTime;
+    }
+    
+
+	public String getVirtualKey() {
+		return virtualKey;
+	}
+
+	public void setVirtualKey(String virtualKey) {
+		this.virtualKey = virtualKey;
+	}
+
+	public String getAbsolutePath() {
+		return absolutePath;
+	}
+
+	public void setAbsolutePath(String absolutePath) {
+		this.absolutePath = absolutePath;
+	}
+
+	public String getRelativePath() {
+		return relativePath;
+	}
+
+	public void setRelativePath(String relativePath) {
+		this.relativePath = relativePath;
+	}
+
+
+
+	
+	
+}

+ 39 - 0
service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/model/SysUser.java

@@ -0,0 +1,39 @@
+package cn.com.v2.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author fc
+ * @since 2023-04-30
+ */
+@TableName("t_sys_user")
+@Data
+public class SysUser implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(type = IdType.ASSIGN_ID)
+    private String id;
+
+    private String username;
+
+    private String password;
+
+    private String nickname;
+
+    private Integer depId;
+
+    private String posId;
+
+ 
+}

+ 119 - 0
service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/model/vo/GoviewProjectVo.java

@@ -0,0 +1,119 @@
+package cn.com.v2.model.vo;
+
+import java.io.Serializable;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import cn.hutool.core.date.DateUtil;
+import io.swagger.annotations.ApiModelProperty;
+
+public class GoviewProjectVo implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+	
+	@ApiModelProperty(value = "主键")
+	private String id;
+	
+	@ApiModelProperty(value = "项目名称")
+	private String projectName;
+	
+	@ApiModelProperty(value = "项目状态[-1未发布,1发布]")
+	private Integer state;
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone="GMT+8")
+	@ApiModelProperty(value = "创建时间")
+	private Date createTime;
+	
+	@ApiModelProperty(value = "创建人id")
+	private String createUserId;
+	
+	@ApiModelProperty(value = "删除状态[1删除,-1未删除]")
+	private Integer isDelete;
+	
+	@ApiModelProperty(value = "首页图片")
+	private String indexImage;
+	
+	@ApiModelProperty(value = "项目介绍")
+	private String remarks;
+	
+	private String content;
+	
+	
+	@JsonProperty("id")
+	public String getId() {
+		return id;
+	}
+
+	public void setId(String id) {
+		this.id =  id;
+	}
+	@JsonProperty("projectName")
+	public String getProjectName() {
+		return projectName;
+	}
+
+	public void setProjectName(String projectName) {
+		this.projectName =  projectName;
+	}
+	@JsonProperty("state")
+	public Integer getState() {
+		return state;
+	}
+
+	public void setState(Integer state) {
+		this.state =  state;
+	}
+	@JsonProperty("createTime")
+	public Date getCreateTime() {
+		return createTime;
+	}
+
+	public void setCreateTime(Date createTime) {
+		this.createTime =  createTime;
+	}
+	@JsonProperty("createUserId")
+	public String getCreateUserId() {
+		return createUserId;
+	}
+
+	public void setCreateUserId(String createUserId) {
+		this.createUserId =  createUserId;
+	}
+	@JsonProperty("isDelete")
+	public Integer getIsDelete() {
+		return isDelete;
+	}
+
+	public void setIsDelete(Integer isDelete) {
+		this.isDelete =  isDelete;
+	}
+	@JsonProperty("indexImage")
+	public String getIndexImage() {
+		return indexImage;
+	}
+
+	public void setIndexImage(String indexImage) {
+		this.indexImage =  indexImage;
+	}
+	@JsonProperty("remarks")
+	public String getRemarks() {
+		return remarks;
+	}
+
+	public void setRemarks(String remarks) {
+		this.remarks =  remarks;
+	}
+	public String getContent() {
+		return content;
+	}
+
+	public void setContent(String content) {
+		this.content = content;
+	}
+
+	public String dateToStringConvert(Date date) {
+		if(date!=null) {
+			return DateUtil.format(date, "yyyy-MM-dd HH:mm:ss");
+		}
+		return "";
+	}
+}

+ 70 - 0
service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/model/vo/SysFileVo.java

@@ -0,0 +1,70 @@
+package cn.com.v2.model.vo;
+
+
+public class SysFileVo {
+	
+    private String id;
+    private String fileName;
+    private Integer fileSize;
+    private String createTime;
+    
+    /**
+     * 相对路径
+     */
+    private String relativePath;
+    
+    /**
+     * 虚拟路径key
+     */
+    private String virtualKey;
+    
+    /**
+     * 请求url
+     */
+    private String fileurl;
+    
+    
+	public String getId() {
+		return id;
+	}
+	public void setId(String id) {
+		this.id = id;
+	}
+	public String getFileName() {
+		return fileName;
+	}
+	public void setFileName(String fileName) {
+		this.fileName = fileName;
+	}
+	public Integer getFileSize() {
+		return fileSize;
+	}
+	public void setFileSize(Integer fileSize) {
+		this.fileSize = fileSize;
+	}
+	public String getCreateTime() {
+		return createTime;
+	}
+	public void setCreateTime(String createTime) {
+		this.createTime = createTime;
+	}
+	public String getRelativePath() {
+		return relativePath;
+	}
+	public void setRelativePath(String relativePath) {
+		this.relativePath = relativePath;
+	}
+	public String getVirtualKey() {
+		return virtualKey;
+	}
+	public void setVirtualKey(String virtualKey) {
+		this.virtualKey = virtualKey;
+	}
+	public String getFileurl() {
+		return fileurl;
+	}
+	public void setFileurl(String fileurl) {
+		this.fileurl = fileurl;
+	}
+	
+}

+ 18 - 0
service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/service/IGoviewProjectDataService.java

@@ -0,0 +1,18 @@
+package cn.com.v2.service;
+
+import cn.com.v2.model.GoviewProjectData;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author fc
+ * @since 2023-04-30
+ */
+public interface IGoviewProjectDataService extends IService<GoviewProjectData> {
+	
+	public GoviewProjectData getProjectid(String projectId);
+
+}

+ 16 - 0
service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/service/IGoviewProjectService.java

@@ -0,0 +1,16 @@
+package cn.com.v2.service;
+
+import cn.com.v2.model.GoviewProject;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author fc
+ * @since 2023-04-30
+ */
+public interface IGoviewProjectService extends IService<GoviewProject> {
+
+}

+ 18 - 0
service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/service/ISysFileService.java

@@ -0,0 +1,18 @@
+package cn.com.v2.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import cn.com.v2.model.SysFile;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author fc
+ * @since 2022-12-22
+ */
+public interface ISysFileService extends IService<SysFile> {
+
+	
+	public SysFile selectByExamplefileName(String filename);
+}

+ 16 - 0
service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/service/ISysUserService.java

@@ -0,0 +1,16 @@
+package cn.com.v2.service;
+
+import cn.com.v2.model.SysUser;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author fc
+ * @since 2023-04-30
+ */
+public interface ISysUserService extends IService<SysUser> {
+
+}

+ 33 - 0
service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/service/impl/GoviewProjectDataServiceImpl.java

@@ -0,0 +1,33 @@
+package cn.com.v2.service.impl;
+
+import cn.com.v2.model.GoviewProjectData;
+import cn.com.v2.mapper.GoviewProjectDataMapper;
+import cn.com.v2.service.IGoviewProjectDataService;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author fc
+ * @since 2023-04-30
+ */
+@Service
+public class GoviewProjectDataServiceImpl extends ServiceImpl<GoviewProjectDataMapper, GoviewProjectData> implements IGoviewProjectDataService {
+	@Autowired
+	GoviewProjectDataMapper dataMapper;
+	@Override
+	public GoviewProjectData getProjectid(String projectId) {
+		LambdaQueryWrapper<GoviewProjectData> lambdaQueryWrapper=new LambdaQueryWrapper<GoviewProjectData>();
+		lambdaQueryWrapper.eq(GoviewProjectData::getProjectId, projectId);
+		return dataMapper.selectOne(lambdaQueryWrapper);
+		
+	}
+
+}

+ 20 - 0
service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/service/impl/GoviewProjectServiceImpl.java

@@ -0,0 +1,20 @@
+package cn.com.v2.service.impl;
+
+import cn.com.v2.model.GoviewProject;
+import cn.com.v2.mapper.GoviewProjectMapper;
+import cn.com.v2.service.IGoviewProjectService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author fc
+ * @since 2023-04-30
+ */
+@Service
+public class GoviewProjectServiceImpl extends ServiceImpl<GoviewProjectMapper, GoviewProject> implements IGoviewProjectService {
+
+}

+ 30 - 0
service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/service/impl/SysFileServiceImpl.java

@@ -0,0 +1,30 @@
+package cn.com.v2.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import cn.com.v2.mapper.SysFileMapper;
+import cn.com.v2.model.SysFile;
+import cn.com.v2.service.ISysFileService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author fc
+ * @since 2022-12-22
+ */
+@Service
+public class SysFileServiceImpl extends ServiceImpl<SysFileMapper, SysFile> implements ISysFileService {
+	@Autowired
+	private SysFileMapper sysFileMapper;
+	
+	@Override
+	public SysFile selectByExamplefileName(String filename) {
+		SysFile sysFile=sysFileMapper.selectOne(new LambdaQueryWrapper<SysFile>().eq(SysFile::getFileName, filename));
+        return sysFile;
+	}
+
+}

+ 20 - 0
service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/service/impl/SysUserServiceImpl.java

@@ -0,0 +1,20 @@
+package cn.com.v2.service.impl;
+
+import cn.com.v2.model.SysUser;
+import cn.com.v2.mapper.SysUserMapper;
+import cn.com.v2.service.ISysUserService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author fc
+ * @since 2023-04-30
+ */
+@Service
+public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> implements ISysUserService {
+
+}

+ 252 - 0
service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/util/ConvertUtil.java

@@ -0,0 +1,252 @@
+package cn.com.v2.util;
+
+import cn.hutool.core.util.StrUtil;
+import java.math.BigDecimal;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 类型转换器
+ * 
+ * @author fc
+ * 
+ */
+public class ConvertUtil {
+
+	/**
+	 * 转换为字符串<br>
+	 * 如果给定的值为null,或者转换失败,返回默认值<br>
+	 * 转换失败不会报错
+	 * 
+	 * @param value 被转换的值
+	 * @param defaultValue 转换错误时的默认值
+	 * @return 结果
+	 */
+	public static String toStr(Object value, String defaultValue) {
+		if (null == value) {
+			return defaultValue;
+		}
+		if (value instanceof String) {
+			return (String) value;
+		}
+		return value.toString();
+	}
+
+	/**
+	 * 转换为Integer数组<br>
+	 * @param split 被转换的值
+	 * @return 结果
+	 */
+	public static Integer[] toIntArray(String str) {
+		return toIntArray(",", str);
+	}
+
+	/**
+	 * 转换为Integer数组<br>
+	 * @param split 分隔符
+	 * @param split 被转换的值
+	 * @return 结果
+	 */
+	public static Integer[] toIntArray(String split, String str) {
+		if (StrUtil.isEmpty(str)) {
+			return new Integer[] {};
+		}
+		String[] strings = str.split(split);
+		final Integer[] ints = new Integer[strings.length];
+		for (int i = 0; i < strings.length; i++) {
+			final Integer v = toInt(strings[i], 0);
+			ints[i] = v;
+		}
+		return ints;
+	}
+
+	/**
+	 * 转换为int<br>
+	 * 如果给定的值为空,或者转换失败,返回默认值<br>
+	 * 转换失败不会报错
+	 * @param value 被转换的值
+	 * @param defaultValue 转换错误时的默认值
+	 * @return 结果
+	 */
+	public static Integer toInt(Object value, Integer defaultValue) {
+		if (value == null) {
+			return defaultValue;
+		}
+		if (value instanceof Integer) {
+			return (Integer) value;
+		}
+		if (value instanceof Number) {
+			return ((Number) value).intValue();
+		}
+		final String valueStr = toStr(value, null);
+		if (StrUtil.isEmpty(valueStr)) {
+			return defaultValue;
+		}
+		try {
+			return Integer.parseInt(valueStr.trim());
+		} catch (Exception e) {
+			return defaultValue;
+		}
+	}
+
+	/**
+	 * 转换为List<String>数组<br>
+	 * @param split 被转换的值
+	 * @return 结果
+	 */
+	public static List<String> toListStrArray(String str) {
+		String[] stringArray = toStrArray(str);
+		List<String> stringB = Arrays.asList(stringArray);
+		return stringB;
+	}
+
+
+
+	/**
+	 * 转换为List<Long>数组<br>
+	 * @param split 被转换的值
+	 * @return 结果
+	 */
+	public static List<Long> toListLongArray(String str) {
+		Long[] stringArray = toLongArray(str);
+		List<Long> stringB = Arrays.asList(stringArray);
+		return stringB;
+	}
+
+
+	/**
+	 * 转换为String数组<br> 
+	 * @param split 被转换的值
+	 * @return 结果
+	 */
+	public static String[] toStrArray(String str) {
+		return toStrArray(",", str);
+	}
+
+	/**
+	 * 转换为String数组<br>
+	 * 
+	 * @param split 分隔符
+	 * @param split 被转换的值
+	 * @return 结果
+	 */
+	public static String[] toStrArray(String split, String str) {
+		return str.split(split);
+	}
+	/**
+     * 转换为Long数组<br>
+     * 
+     * @param split 被转换的值
+     * @return 结果
+     */
+    public static Long[] toLongArray(String str)
+    {
+        return toLongArray(",", str);
+    }
+    /**
+     * 转换为Long数组<br>
+     * 
+     * @param isIgnoreConvertError 是否忽略转换错误,忽略则给值null
+     * @param values 被转换的值
+     * @return 结果
+     */
+    public static Long[] toLongArray(String split, String str)
+    {
+        if (StrUtil.isEmpty(str))
+        {
+            return new Long[] {};
+        }
+        String[] arr = str.split(split);
+        final Long[] longs = new Long[arr.length];
+        for (int i = 0; i < arr.length; i++)
+        {
+            final Long v = toLong(arr[i], null);
+            longs[i] = v;
+        }
+        return longs;
+    }
+    /**
+     * 转换为long<br>
+     * 如果给定的值为空,或者转换失败,返回默认值<br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @param defaultValue 转换错误时的默认值
+     * @return 结果
+     */
+    public static Long toLong(Object value, Long defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (value instanceof Long)
+        {
+            return (Long) value;
+        }
+        if (value instanceof Number)
+        {
+            return ((Number) value).longValue();
+        }
+        final String valueStr = toStr(value, null);
+        if (StrUtil.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        try
+        {
+            // 支持科学计数法
+            return new BigDecimal(valueStr.trim()).longValue();
+        }
+        catch (Exception e)
+        {
+            return defaultValue;
+        }
+    }
+    
+    /**
+     * 转换为BigDecimal<br>
+     * 如果给定的值为空,或者转换失败,返回默认值<br>
+     * 转换失败不会报错
+     * 
+     * @param value 被转换的值
+     * @param defaultValue 转换错误时的默认值
+     * @return 结果
+     */
+    public static BigDecimal toBigDecimal(Object value, BigDecimal defaultValue)
+    {
+        if (value == null)
+        {
+            return defaultValue;
+        }
+        if (value instanceof BigDecimal)
+        {
+            return (BigDecimal) value;
+        }
+        if (value instanceof Long)
+        {
+            return new BigDecimal((Long) value);
+        }
+        if (value instanceof Double)
+        {
+            return new BigDecimal((Double) value);
+        }
+        if (value instanceof Integer)
+        {
+            return new BigDecimal((Integer) value);
+        }
+        final String valueStr = toStr(value, null);
+        if (StrUtil.isEmpty(valueStr))
+        {
+            return defaultValue;
+        }
+        try
+        {
+            return new BigDecimal(valueStr);
+        }
+        catch (Exception e)
+        {
+            return defaultValue;
+        }
+    }
+}

+ 39 - 0
service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/util/MybatisPlusGenerator.java

@@ -0,0 +1,39 @@
+package cn.com.v2.util;
+
+import java.util.Collections;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.generator.FastAutoGenerator;
+import com.baomidou.mybatisplus.generator.config.*;
+import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
+import com.baomidou.mybatisplus.generator.fill.Column;
+
+
+public class MybatisPlusGenerator {
+	public static void main(String[] args) {
+		FastAutoGenerator.create(
+				"jdbc:sqlite:D:\\eclipse-workspace\\v2-goview-bate\\sqllite\\goview.db",
+				"", "").globalConfig(builder -> {
+					builder.author("fc") // 设置作者
+							// .enableSwagger() // 开启 swagger 模式
+							.fileOverride() // 覆盖已生成文件
+							.disableOpenDir() //禁止打开输出目录
+							.outputDir(System.getProperty("user.dir") + "/src/main/java"); // 指定输出目录
+				}).packageConfig(builder -> {
+					builder.parent("cn.com") // 设置父包名
+							.moduleName("v2") // 设置父包模块名
+							.entity("model")
+							// .service() // 设置自定义service路径,不设置就是默认路径
+							.pathInfo(Collections.singletonMap(OutputFile.mapperXml,
+							System.getProperty("user.dir") + "/src/main/resources/mapper/")); // 设置mapperXml生成路径
+				}).strategyConfig(builder -> {
+					builder.addInclude("t_goview_project_data") // 设置需要生成的表名
+							.addTablePrefix("t_", "c_")
+							// 设置自动填充的时间字段
+							.entityBuilder().addTableFills(new Column("create_time", FieldFill.INSERT),
+							new Column("update_time", FieldFill.INSERT_UPDATE)); // 设置过滤表前缀
+
+				}).templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
+				.execute();
+	}
+}

+ 74 - 0
service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/util/SaTokenUtil.java

@@ -0,0 +1,74 @@
+package cn.com.v2.util;
+
+
+import org.springframework.beans.BeanUtils;
+
+import cn.com.v2.model.SysUser;
+import cn.dev33.satoken.stp.StpUtil;
+
+/**
+ * 封装 Sa-Token 常用操作 
+ * @author kong
+ *
+ */
+public class SaTokenUtil {
+
+	/**
+     * 获取登录用户model
+     */
+    public static SysUser getUser() {
+    	Object object=StpUtil.getSession().get("user");
+    	if(object!=null){
+    		SysUser tsysUser=new SysUser();
+    		BeanUtils.copyProperties(tsysUser, object);
+    		return tsysUser;
+    	}
+    	return null;
+    }
+    
+    /**
+     * set用户
+     */
+    public static void setUser(SysUser user) {
+    	StpUtil.getSession().set("user", user);
+    }
+
+  /**
+   * 获取登录用户id
+   */
+	public static String getUserId() {
+		return StpUtil.getLoginIdAsString();
+	}
+    
+    /**
+     * 获取登录用户name
+     */
+    public static String getLoginName() {
+    	SysUser tsysUser = getUser();
+        if (tsysUser == null){
+            throw new RuntimeException("用户不存在!");
+        }
+        return tsysUser.getUsername();
+    }
+
+    /**
+     * 获取登录用户ip
+     * @return
+     * @author fuce
+     * @Date 2019年11月21日 上午9:58:26
+     */
+    public static String getIp() {
+    	
+        return StpUtil.getTokenSession().getString("login_ip");
+    }
+    /**
+     * 判断是否登录
+     * @return
+     * @author fuce
+     * @Date 2019年11月21日 上午9:58:26
+     */
+    public static boolean isLogin() {
+        return StpUtil.isLogin();
+    }
+    
+}

+ 155 - 0
service-cockpit/service-cockpit-biz/src/main/java/com/usky/cockpit/util/SnowflakeIdWorker.java

@@ -0,0 +1,155 @@
+package cn.com.v2.util;
+
+/**
+ * Twitter_Snowflake<br>
+ * SnowFlake的结构如下(每部分用-分开):<br>
+ * 0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 000000000000 <br>
+ * 1位标识,由于long基本类型在Java中是带符号的,最高位是符号位,正数是0,负数是1,所以id一般是正数,最高位是0<br>
+ * 41位时间截(毫秒级),注意,41位时间截不是存储当前时间的时间截,而是存储时间截的差值(当前时间截 - 开始时间截)
+ * 得到的值),这里的的开始时间截,一般是我们的id生成器开始使用的时间,由我们程序来指定的(如下下面程序IdWorker类的startTime属性)。41位的时间截,可以使用69年,年T = (1L << 41) / (1000L * 60 * 60 * 24 * 365) = 69<br>
+ * 10位的数据机器位,可以部署在1024个节点,包括5位datacenterId和5位workerId<br>
+ * 12位序列,毫秒内的计数,12位的计数顺序号支持每个节点每毫秒(同一机器,同一时间截)产生4096个ID序号<br>
+ * 加起来刚好64位,为一个Long型。<br>
+ * SnowFlake的优点是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由数据中心ID和机器ID作区分),并且效率较高,经测试,SnowFlake每秒能够产生26万ID左右。
+ */
+public class SnowflakeIdWorker {
+ 
+    // ==============================Fields===========================================
+    /** 开始时间截 (2015-01-01) */
+    private final long twepoch = 1489111610226L;
+ 
+    /** 机器id所占的位数 */
+    private final long workerIdBits = 5L;
+ 
+    /** 数据标识id所占的位数 */
+    private final long dataCenterIdBits = 5L;
+ 
+    /** 支持的最大机器id,结果是31 (这个移位算法可以很快的计算出几位二进制数所能表示的最大十进制数) */
+    private final long maxWorkerId = -1L ^ (-1L << workerIdBits);
+ 
+    /** 支持的最大数据标识id,结果是31 */
+    private final long maxDataCenterId = -1L ^ (-1L << dataCenterIdBits);
+ 
+    /** 序列在id中占的位数 */
+    private final long sequenceBits = 12L;
+ 
+    /** 机器ID向左移12位 */
+    private final long workerIdShift = sequenceBits;
+ 
+    /** 数据标识id向左移17位(12+5) */
+    private final long dataCenterIdShift = sequenceBits + workerIdBits;
+ 
+    /** 时间截向左移22位(5+5+12) */
+    private final long timestampLeftShift = sequenceBits + workerIdBits + dataCenterIdBits;
+ 
+    /** 生成序列的掩码,这里为4095 (0b111111111111=0xfff=4095) */
+    private final long sequenceMask = -1L ^ (-1L << sequenceBits);
+ 
+    /** 工作机器ID(0~31) */
+    private long workerId;
+ 
+    /** 数据中心ID(0~31) */
+    private long dataCenterId;
+ 
+    /** 毫秒内序列(0~4095) */
+    private long sequence = 0L;
+ 
+    /** 上次生成ID的时间截 */
+    private long lastTimestamp = -1L;
+ 
+    
+    static SnowflakeIdWorker idWorker = new SnowflakeIdWorker(1, 1);
+    //==============================Constructors=====================================
+    /**
+     * 构造函数
+     * @param workerId 工作ID (0~31)
+     * @param dataCenterId 数据中心ID (0~31)
+     */
+    public SnowflakeIdWorker(long workerId, long dataCenterId) {
+        if (workerId > maxWorkerId || workerId < 0) {
+            throw new IllegalArgumentException(String.format("workerId can't be greater than %d or less than 0", maxWorkerId));
+        }
+        if (dataCenterId > maxDataCenterId || dataCenterId < 0) {
+            throw new IllegalArgumentException(String.format("dataCenterId can't be greater than %d or less than 0", maxDataCenterId));
+        }
+        this.workerId = workerId;
+        this.dataCenterId = dataCenterId;
+    }
+ 
+    // ==============================Methods==========================================
+    /**
+     * 获得下一个ID (该方法是线程安全的)
+     * @return SnowflakeId
+     */
+    public synchronized long nextId() {
+        long timestamp = timeGen();
+ 
+        //如果当前时间小于上一次ID生成的时间戳,说明系统时钟回退过这个时候应当抛出异常
+        if (timestamp < lastTimestamp) {
+            throw new RuntimeException(
+                    String.format("Clock moved backwards.  Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));
+        }
+ 
+        //如果是同一时间生成的,则进行毫秒内序列
+        if (lastTimestamp == timestamp) {
+            sequence = (sequence + 1) & sequenceMask;
+            //毫秒内序列溢出
+            if (sequence == 0) {
+                //阻塞到下一个毫秒,获得新的时间戳
+                timestamp = tilNextMillis(lastTimestamp);
+            }
+        }
+        //时间戳改变,毫秒内序列重置
+        else {
+            sequence = 0L;
+        }
+ 
+        //上次生成ID的时间截
+        lastTimestamp = timestamp;
+ 
+        //移位并通过或运算拼到一起组成64位的ID
+        return ((timestamp - twepoch) << timestampLeftShift) //
+                | (dataCenterId << dataCenterIdShift) //
+                | (workerId << workerIdShift) //
+                | sequence;
+    }
+ 
+    /**
+     * 阻塞到下一个毫秒,直到获得新的时间戳
+     * @param lastTimestamp 上次生成ID的时间截
+     * @return 当前时间戳
+     */
+    protected long tilNextMillis(long lastTimestamp) {
+        long timestamp = timeGen();
+        while (timestamp <= lastTimestamp) {
+            timestamp = timeGen();
+        }
+        return timestamp;
+    }
+ 
+    /**
+     * 返回以毫秒为单位的当前时间
+     * @return 当前时间(毫秒)
+     */
+    protected long timeGen() {
+        return System.currentTimeMillis();
+    }
+ 
+    //==============================Test=============================================
+    /** 测试 */
+    public static void main(String[] args) {
+        System.out.println(System.currentTimeMillis());
+        SnowflakeIdWorker idWorker = new SnowflakeIdWorker(1, 1);
+        long startTime = System.nanoTime();
+        for (int i = 0; i < 500; i++) {
+            long id = idWorker.nextId();
+            System.out.println(id);
+        }
+        System.out.println((System.nanoTime()-startTime)/1000000+"ms");
+    }
+    
+    public static String getUUID() {
+    	long id = idWorker.nextId();
+    	return String.valueOf(id);
+    }
+}

+ 16 - 0
service-cockpit/service-cockpit-biz/src/main/resources/application-dev.yml

@@ -0,0 +1,16 @@
+#dev环境  mysql7.0
+spring:
+  datasource:
+    driver-class-name: org.sqlite.JDBC
+    url: jdbc:sqlite:D:\文档和图片\工作文档\git\go-view-serve-master\go-view-serve-master\sqllite\goview.db
+    #linux服务器
+    #url: jdbc:sqlite://home/cqfy/project/OSSDATABASE/oss.db
+    username: 
+    password: 
+    ### 连接池配置
+    druid:
+      initial-size: 10
+      max-active: 100
+      min-idle: 30
+      max-wait: 40
+      validation-query: SELECT 1

+ 110 - 0
service-cockpit/service-cockpit-biz/src/main/resources/application.yml

@@ -0,0 +1,110 @@
+v2:
+  #虚拟路径映射路径 2个文件路径一一对应 第一个为主存储,其他为配置相关
+  xnljmap:
+   #win服务器  本地 注意!! 记住这个结尾有一个/
+   oss: file:D:/upload/
+   #linux服务器
+   #oss: file:/home/webapps/oss/
+  #虚拟路径映射路径 end
+  #本地存放地址 注意!! 记住这个结尾没有/
+  fileurl: D:/upload
+  #http://127.0.0.1:8080/oss/{yy}/2022-12-22/c83a77ae134a540c30daa6a0666fa945.md
+  httpurl: http://127.0.0.1:8083/
+  defaultFormat: .png
+#tomcat config
+server :
+  port : 8083
+  ##项目名字配置
+  servlet :
+    context-path : /
+    #session过期
+    session:
+      timeout: PT4H
+      #cookie:
+      #  name: jxfgzs
+  tomcat :
+    uri-encoding : UTF-8
+    #xx 报错修改的地方
+    max-connections: 200000
+    max-http-form-post-size: 9000000
+    threads:
+      max: 128
+      min-spare: 5
+spring :
+  # 环境 dev|test|prod
+  profiles :
+    active : dev
+  servlet:
+    multipart:
+      #设置总上传的数据大小
+      max-request-size: 100MB
+      #单个文件大小
+      maxFileSize : 30MB
+        #xx 报错修改的地方
+    max-connections: 200000
+    max-http-post-size: 9000000
+  #热部署模块
+  devtools:
+    restart:
+      #热部署开关
+      enabled: true
+      #指定热部署的目录
+      additional-paths: src/main/java
+      #指定目录不更新
+      exclude: test/**
+  mvc:   #静态文件
+    static-path-pattern : /static/**
+    pathmatch:
+      matching-strategy: ant_path_matcher
+  #模板引擎
+  thymeleaf:
+    model: HTML5
+    prefix: classpath:/templates/
+    suffix: .html
+    #指定编码
+    encoding: utf-8
+    #禁用缓存 默认false
+    cache: false
+#mybatis
+mybatis-plus:
+  mapper-locations: classpath:/mapper/*Mapper.xml
+  #实体扫描,多个package用逗号或者分号分隔
+  typeAliasesPackage: cn.com.v2.model
+  global-config:
+    # 数据库相关配置
+    db-config:
+      #主键类型  AUTO:"数据库ID自增", INPUT:"用户输入ID",ID_WORKER:"全局唯一ID (数字类型唯一ID)", UUID:"全局唯一ID UUID";
+      id-type: INPUT
+      #字段策略 IGNORED:"忽略判断",NOT_NULL:"非 NULL 判断"),NOT_EMPTY:"非空判断"
+      field-strategy: not_empty
+      #驼峰下划线转换
+      column-underline: true
+      #数据库大写下划线转换
+      #capital-mode: true
+      #逻辑删除配置
+      logic-delete-value: 0
+      logic-not-delete-value: 1
+      db-type: sqlite
+    #刷新mapper 调试神器
+    refresh: true
+  # 原生配置
+  configuration:
+    map-underscore-to-camel-case: true
+    cache-enabled: false
+    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+############## Sa-Token 配置 (文档: https://sa-token.cc) ##############
+sa-token: 
+    # token名称 (同时也是cookie名称)
+    token-name: satoken
+    # token有效期,单位s 默认30天, -1代表永不过期 
+    timeout: 2592000
+    # token临时有效期 (指定时间内无操作就视为token过期) 单位: 秒
+    activity-timeout: -1
+    # 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录) 
+    is-concurrent: true
+    # 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token) 
+    is-share: true
+    # token风格
+    token-style: uuid
+    # 是否输出操作日志 
+    is-log: false

+ 25 - 0
service-cockpit/service-cockpit-biz/src/main/resources/bootstrap.yml

@@ -0,0 +1,25 @@
+# Tomcat
+server:
+  port: 8083
+
+# Spring
+spring:
+  application:
+    # 应用名称
+    name: service-cockpit
+  profiles:
+    # 环境配置
+    active: dev
+  cloud:
+    nacos:
+      discovery:
+        # 服务注册地址
+        server-addr: usky-cloud-nacos:8848
+      config:
+        # 配置中心地址
+        server-addr: usky-cloud-nacos:8848
+        # 配置文件格式
+        file-extension: yml
+        # 共享配置
+        shared-configs:
+          - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}

+ 5 - 0
service-cockpit/service-cockpit-biz/src/main/resources/mapper/GoviewProjectDataMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.com.v2.mapper.GoviewProjectDataMapper">
+
+</mapper>

+ 5 - 0
service-cockpit/service-cockpit-biz/src/main/resources/mapper/GoviewProjectMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.com.v2.mapper.GoviewProjectMapper">
+
+</mapper>

+ 5 - 0
service-cockpit/service-cockpit-biz/src/main/resources/mapper/SysFileMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.com.v2oss.mapper.SysFileMapper">
+
+</mapper>

+ 5 - 0
service-cockpit/service-cockpit-biz/src/main/resources/mapper/SysUserMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="cn.com.v2.mapper.SysUserMapper">
+
+</mapper>

+ 17 - 0
service-eg/pom.xml

@@ -0,0 +1,17 @@
+<?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-eg</artifactId>
+    <packaging>pom</packaging>
+    <modules>
+        <module>service-eg-biz</module>
+        <module>service-eg-api</module>
+  </modules>
+
+</project>

+ 29 - 0
service-eg/service-eg-api/pom.xml

@@ -0,0 +1,29 @@
+<?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-eg</artifactId>
+        <groupId>com.usky</groupId>
+        <version>0.0.1</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>service-eg-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>

+ 16 - 0
service-eg/service-eg-api/src/main/java/com/usky/eg/RemoteEgService.java

@@ -0,0 +1,16 @@
+package com.usky.eg;
+
+
+import com.usky.common.core.bean.ApiResult;
+import com.usky.eg.domain.*;
+import com.usky.eg.factory.RemoteEgFallbackFactory;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.Map;
+
+@FeignClient(contextId = "remoteEgService", value = "service-eg", fallbackFactory = RemoteEgFallbackFactory.class)
+public interface RemoteEgService {
+
+}

+ 43 - 0
service-eg/service-eg-api/src/main/java/com/usky/eg/domain/DeviceDataWriteVO.java

@@ -0,0 +1,43 @@
+package com.usky.eg.domain;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Map;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class DeviceDataWriteVO implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 产品编码
+     */
+    private String productCode;
+
+    /**
+     * 设备UUId
+     */
+    private String deviceUUId;
+
+    /**
+     * 数据上报时间
+     */
+    private long timestamp;
+
+    /**
+     * 标签集合
+     */
+    private Map<String,String> tags;
+
+    /**
+     * 属性值集合
+     */
+    private Map<String,Object> metrics;
+
+}
+

+ 29 - 0
service-eg/service-eg-api/src/main/java/com/usky/eg/factory/RemoteEgFallbackFactory.java

@@ -0,0 +1,29 @@
+package com.usky.eg.factory;
+
+import com.usky.eg.RemoteEgService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.springframework.cloud.openfeign.FallbackFactory;
+import org.springframework.stereotype.Component;
+
+
+/**
+ * 用户服务降级处理
+ *
+ * @author ruoyi
+ */
+@Component
+public class RemoteEgFallbackFactory implements FallbackFactory<RemoteEgService>
+{
+    private static final Logger log = LoggerFactory.getLogger(RemoteEgFallbackFactory.class);
+
+    @Override
+    public RemoteEgService create(Throwable throwable)
+    {
+        log.error("用户服务调用失败:{}", throwable.getMessage());
+        return new RemoteEgService() {
+
+        };
+    }
+}

+ 96 - 0
service-eg/service-eg-biz/pom.xml

@@ -0,0 +1,96 @@
+<?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-eg</artifactId>
+        <groupId>com.usky</groupId>
+        <version>0.0.1</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>service-eg-biz</artifactId>
+    <dependencies>
+        <dependency>
+            <groupId>com.usky</groupId>
+            <artifactId>common-cloud-starter</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-configuration-processor</artifactId>
+            <optional>true</optional>
+        </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-swagger</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.28</version>
+        </dependency>
+        <dependency>
+            <groupId>com.usky</groupId>
+            <artifactId>service-eg-api</artifactId>
+            <version>0.0.1</version>
+        </dependency>
+        <dependency>
+            <groupId>com.usky</groupId>
+            <artifactId>data-transfer-api</artifactId>
+            <version>0.0.1</version>
+        </dependency>
+        <dependency>
+            <groupId>com.usky</groupId>
+            <artifactId>service-iot-api</artifactId>
+            <version>0.0.1</version>
+        </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>test</projectName>
+                    <!--                    <excludes>-->
+                    <!--                        <exclude>com.bizmatics:product-service-provider</exclude>-->
+                    <!--                        <exclude>cn.afterturn:easypoi-web</exclude>-->
+                    <!--                    </excludes>-->
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 50 - 0
service-eg/service-eg-biz/src/main/java/com/usky/eg/ApplicationRun.java

@@ -0,0 +1,50 @@
+package com.usky.eg;
+
+
+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.cache.annotation.EnableCaching;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.context.ConfigurableApplicationContext;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.core.env.Environment;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+
+/**
+ * 应用启动模块
+ * 
+ */
+
+
+@EnableCustomSwagger2
+//@EnableSwagger2
+@EnableFeignClients(basePackages = "com.usky")
+@MapperScan(value = "com.usky.eg.mapper")
+@ComponentScan("com.usky")
+@SpringBootApplication
+public class ApplicationRun
+{
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(ApplicationRun.class);
+
+    public static void main(String[] args) throws UnknownHostException {
+        ConfigurableApplicationContext application = SpringApplication.run(ApplicationRun.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" +
+                "----------------------------------------------------------");
+    }
+}

+ 105 - 0
service-eg/service-eg-biz/src/main/java/com/usky/eg/MybatisGenerator.java

@@ -0,0 +1,105 @@
+package com.usky.eg;
+
+
+
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import com.baomidou.mybatisplus.generator.AutoGenerator;
+import com.baomidou.mybatisplus.generator.InjectionConfig;
+import com.baomidou.mybatisplus.generator.config.*;
+import com.baomidou.mybatisplus.generator.config.po.TableInfo;
+import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ */
+public class MybatisGenerator {
+    public static void main(String[] args) {
+
+            shell("service-eg","service-eg-biz");
+    }
+
+    private static void shell(String parentName,String model) {
+
+        AutoGenerator mpg = new AutoGenerator();
+        //1、全局配置
+        GlobalConfig gc = new GlobalConfig();
+//        File file = new File(model);
+//        String path = file.getAbsolutePath();
+        String projectPath = System.getProperty("user.dir");
+        projectPath+="/"+parentName;
+        projectPath+="/"+model;
+        gc.setOutputDir(projectPath+ "/src/main/java");  //生成路径(一般都是生成在此项目的src/main/java下面)
+        //修改为自己的名字
+        gc.setAuthor("zyj"); //设置作者
+        gc.setOpen(false);
+        gc.setFileOverride(true); //第二次生成会把第一次生成的覆盖掉
+        gc.setServiceName("%sService"); //生成的service接口名字首字母是否为I,这样设置就没有
+        gc.setBaseResultMap(true); //生成resultMap
+        mpg.setGlobalConfig(gc);
+
+        //2、数据源配置
+        //修改数据源
+        DataSourceConfig dsc = new DataSourceConfig();
+        dsc.setUrl("jdbc:mysql://192.168.10.165:3306/usky-cloud?useUnicode=true&serverTimezone=GMT&useSSL=false&characterEncoding=utf8");
+        dsc.setDriverName("com.mysql.jdbc.Driver");
+        dsc.setUsername("root");
+        dsc.setPassword("yt123456");
+        mpg.setDataSource(dsc);
+
+        // 3、包配置
+        PackageConfig pc = new PackageConfig();
+        pc.setParent("com.usky.eg");
+        pc.setController("controller.web");
+        pc.setEntity("domain");
+        pc.setMapper("mapper");
+        pc.setService("service");
+        pc.setServiceImpl("service.impl");
+        mpg.setPackageInfo(pc);
+
+        // 4、策略配置
+        StrategyConfig strategy = new StrategyConfig();
+        strategy.setNaming(NamingStrategy.underline_to_camel);
+        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
+        strategy.setSuperMapperClass("com.usky.common.mybatis.core.CrudMapper");
+        strategy.setSuperServiceClass("com.usky.common.mybatis.core.CrudService");
+        strategy.setSuperServiceImplClass("com.usky.common.mybatis.core.AbstractCrudService");
+        // strategy.setTablePrefix("t_"); // 表名前缀
+        strategy.setEntityLombokModel(true); //使用lombok
+        //修改自己想要生成的表
+        strategy.setInclude("meeting_face");  // 逆向工程使用的表   如果要生成多个,这里可以传入String[]
+        mpg.setStrategy(strategy);
+
+        // 关闭默认 xml 生成,调整生成 至 根目录
+        //修改对应的模块名称
+        TemplateConfig tc = new TemplateConfig();
+        // 自定义配置
+        InjectionConfig cfg = new InjectionConfig() {
+            @Override
+            public void initMap() {
+                // to do nothing
+            }
+        };
+        //如果模板引擎是 velocity
+        String templatePath = "/templates/mapper.xml.vm";
+        // 自定义输出配置
+        List<FileOutConfig> focList = new ArrayList<>();
+        // 自定义配置会被优先输出
+        String finalProjectPath = projectPath;
+        focList.add(new FileOutConfig(templatePath) {
+            @Override
+            public String outputFile(TableInfo tableInfo) {
+                // 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
+                return finalProjectPath + "/src/main/resources/mapper/eg" + "/"
+                        + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
+            }
+        });
+        cfg.setFileOutConfigList(focList);
+        mpg.setCfg(cfg);
+        tc.setXml(null);
+        mpg.setTemplate(tc);
+        //5、执行
+        mpg.execute();
+    }
+}

+ 81 - 0
service-eg/service-eg-biz/src/main/java/com/usky/eg/controller/web/EgDeviceController.java

@@ -0,0 +1,81 @@
+package com.usky.eg.controller.web;
+
+
+import com.usky.common.core.bean.ApiResult;
+import com.usky.common.core.bean.CommonPage;
+import com.usky.eg.domain.EgDevice;
+import com.usky.eg.service.EgDeviceService;
+import com.usky.eg.service.vo.EgDeviceRequestVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Map;
+
+/**
+ * <p>
+ * 门禁_设备信息表 前端控制器
+ * </p>
+ *
+ * @author zyj
+ * @since 2024-11-27
+ */
+@RestController
+@RequestMapping("/egDevice")
+public class EgDeviceController {
+    @Autowired
+    private EgDeviceService egDeviceService;
+
+    @PostMapping("page")
+    public ApiResult<CommonPage<EgDevice>> page(@RequestBody EgDeviceRequestVO requestVO){
+        return ApiResult.success(egDeviceService.page(requestVO));
+    }
+
+    /**
+     * 新增
+     * @param egDevice
+     * @return
+     */
+    @PostMapping
+    public ApiResult<Void> add(@RequestBody EgDevice egDevice){
+        egDeviceService.add(egDevice);
+        return ApiResult.success();
+    }
+
+    /**
+     * 修改
+     * @param egDevice
+     * @return
+     */
+    @PutMapping
+    public ApiResult<Void> update(@RequestBody EgDevice egDevice){
+        egDeviceService.update(egDevice);
+        return ApiResult.success();
+    }
+
+    /**
+     * 删除
+     * @param id
+     * @return
+     */
+    @DeleteMapping("/{id}")
+    public ApiResult<Void> remove(@PathVariable("id") Integer id){
+        egDeviceService.remove(id);
+        return ApiResult.success();
+    }
+
+    /**
+     * 下发设备控制命令
+     */
+    @GetMapping("/control")
+    public ApiResult<Map<String,Object>> control(@RequestParam("productCode") String productCode,
+                                                 @RequestParam("deviceUuid") String deviceUuid,
+                                                 @RequestParam("commandCode") String commandCode,
+                                                 @RequestParam("commandValue") String commandValue,
+                                                 @RequestParam(value = "domain",required = false) String domain,
+                                                 @RequestParam(value = "userId",required = false) Long userId,
+                                                 @RequestParam(value = "userName",required = false) String userName){
+        return ApiResult.success(egDeviceService.control(productCode,deviceUuid,commandCode,commandValue,domain,userId,userName));
+    }
+
+}
+

+ 41 - 0
service-eg/service-eg-biz/src/main/java/com/usky/eg/controller/web/EgRecordController.java

@@ -0,0 +1,41 @@
+package com.usky.eg.controller.web;
+
+
+import com.usky.common.core.bean.ApiResult;
+import com.usky.common.core.bean.CommonPage;
+import com.usky.eg.domain.EgRecord;
+import com.usky.eg.service.EgRecordService;
+import com.usky.eg.service.vo.EgRecordRequestVO;
+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;
+
+/**
+ * <p>
+ * 门禁_通行记录表 前端控制器
+ * </p>
+ *
+ * @author zyj
+ * @since 2024-11-27
+ */
+@RestController
+@RequestMapping("/egRecord")
+public class EgRecordController {
+    @Autowired
+    private EgRecordService egRecordService;
+
+    @PostMapping
+    public ApiResult<Void> add(@RequestBody EgRecord egRecord){
+        egRecordService.add(egRecord);
+        return ApiResult.success();
+    }
+
+    @PostMapping("page")
+    public ApiResult<CommonPage<EgRecord>> page(@RequestBody EgRecordRequestVO requestVO){
+        return ApiResult.success(egRecordService.page(requestVO));
+    }
+}
+

+ 116 - 0
service-eg/service-eg-biz/src/main/java/com/usky/eg/domain/EgDevice.java

@@ -0,0 +1,116 @@
+package com.usky.eg.domain;
+
+import com.baomidou.mybatisplus.annotation.FieldStrategy;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import java.util.List;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import rx.BackpressureOverflow;
+
+/**
+ * <p>
+ * 门禁_设备信息表
+ * </p>
+ *
+ * @author zyj
+ * @since 2024-11-27
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class EgDevice implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 设备uuid
+     */
+    private String deviceUuid;
+
+    /**
+     * 设备ID
+     */
+    private String deviceId;
+
+    /**
+     * 设备名称
+     */
+    private String deviceName;
+
+    /**
+     * 安装位置
+     */
+    private String installAddress;
+
+    /**
+     * 业务状态;1:未激活,2:已激活,3:禁用
+     */
+    private Integer serviceStatus;
+
+    /**
+     * IP
+     */
+    private String deviceIp;
+
+    /**
+     * 端口
+     */
+    private Integer devicePort;
+
+    /**
+     * 门禁号
+     */
+    private String egNumber;
+
+    /**
+     * 绑定人脸信息
+     */
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private String bindFace;
+
+    /**
+     * 创建者
+     */
+    private String createBy;
+
+    /**
+     * 更新者
+     */
+    private String updateBy;
+
+    /**
+     * 创建日期
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updateTime;
+
+    /**
+     * 组织机构ID
+     */
+    private Integer deptId;
+
+    /**
+     * 租户ID
+     */
+    private Integer tenantId;
+
+    /**
+     * 用户人脸信息记录
+     */
+    @TableField(exist = false)
+    private List<MeetingFace> meetingFaceList;
+}

+ 115 - 0
service-eg/service-eg-biz/src/main/java/com/usky/eg/domain/EgRecord.java

@@ -0,0 +1,115 @@
+package com.usky.eg.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import java.util.List;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 门禁_通行记录表
+ * </p>
+ *
+ * @author zyj
+ * @since 2024-11-27
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class EgRecord implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 用户姓名
+     */
+    private String userName;
+
+    /**
+     * 通行时间
+     */
+    private LocalDateTime passTime;
+
+    /**
+     * 门禁设备主键id
+     */
+    private Integer egDeviceId;
+
+    /**
+     * 通行方式(1、人脸 2、刷卡 3、手机)
+     */
+    private Integer passType;
+
+    /**
+     * 人脸图片数据 base_64编码
+     */
+    private String faceBase;
+
+    /**
+     * 卡号
+     */
+    private String cardNum;
+
+    /**
+     * 通行结果
+     */
+    private String passResult;
+
+    /**
+     * 创建者
+     */
+    private String createBy;
+
+    /**
+     * 更新者
+     */
+    private String updateBy;
+
+    /**
+     * 创建日期
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updateTime;
+
+    /**
+     * 组织机构ID
+     */
+    private Integer deptId;
+
+    /**
+     * 租户ID
+     */
+    private Integer tenantId;
+
+    /**
+     * 设备Uuid
+     */
+    @TableField(exist = false)
+    private String deviceUuid;
+
+    /**
+     * 域名
+     */
+    @TableField(exist = false)
+    private String domain;
+
+    /**
+     * 门禁设备信息集合
+     */
+    @TableField(exist = false)
+    private EgDevice egDevice;
+}

+ 86 - 0
service-eg/service-eg-biz/src/main/java/com/usky/eg/domain/MeetingFace.java

@@ -0,0 +1,86 @@
+package com.usky.eg.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author zyj
+ * @since 2024-11-27
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class MeetingFace implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "fid", type = IdType.AUTO)
+    private Integer fid;
+
+    /**
+     * 图片数据 base_64编码
+     */
+    private String faceBase;
+
+    /**
+     * 插入时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 验证次数
+     */
+    private Integer vefNum;
+
+    /**
+     * 人脸名称
+     */
+    private String faceName;
+
+    /**
+     * 人脸备注
+     */
+    private String remark;
+
+    /**
+     * 人脸是否可用,(0==可用,1,不可用)
+     */
+    private Integer faceStatus;
+
+    /**
+     * 卡号
+     */
+    private String cardNum;
+
+    /**
+     * 绑定设备
+     */
+    private String bindDevice;
+
+    /**
+     * 组织机构ID
+     */
+    private Integer deptId;
+
+    /**
+     * 租户ID
+     */
+    private Integer tenantId;
+
+    /**
+     * 用户ID
+     */
+    private Long userId;
+
+
+}

+ 32 - 0
service-eg/service-eg-biz/src/main/java/com/usky/eg/domain/MeetingFaceDevice.java

@@ -0,0 +1,32 @@
+package com.usky.eg.domain;
+
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 人脸设备关联表
+ * </p>
+ *
+ * @author zyj
+ * @since 2024-11-27
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class MeetingFaceDevice implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 人脸主键ID
+     */
+    private Integer faceId;
+
+    /**
+     * 设备主键ID
+     */
+    private Integer deviceId;
+
+
+}

+ 27 - 0
service-eg/service-eg-biz/src/main/java/com/usky/eg/mapper/EgDeviceMapper.java

@@ -0,0 +1,27 @@
+package com.usky.eg.mapper;
+
+import com.usky.eg.domain.EgDevice;
+import com.usky.common.mybatis.core.CrudMapper;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+/**
+ * <p>
+ * 门禁_设备信息表 Mapper 接口
+ * </p>
+ *
+ * @author zyj
+ * @since 2024-11-27
+ */
+@Repository
+public interface EgDeviceMapper extends CrudMapper<EgDevice> {
+    void insertMeetingFaceDevice(@Param("fid") Integer fid, @Param("egDeviceId") Integer egDeviceId);
+
+    void deleteMeetingFaceDevice(@Param("egDeviceId") Integer egDeviceId);
+
+    Integer sysTenantId(@Param("domain") String domain);
+
+    Integer getMeetingFaceData(@Param("userId") Long userId);
+
+    Integer[] getMeetingFaceDeviceList(@Param("fid") Integer fid);
+}

+ 16 - 0
service-eg/service-eg-biz/src/main/java/com/usky/eg/mapper/EgRecordMapper.java

@@ -0,0 +1,16 @@
+package com.usky.eg.mapper;
+
+import com.usky.eg.domain.EgRecord;
+import com.usky.common.mybatis.core.CrudMapper;
+
+/**
+ * <p>
+ * 门禁_通行记录表 Mapper 接口
+ * </p>
+ *
+ * @author zyj
+ * @since 2024-11-27
+ */
+public interface EgRecordMapper extends CrudMapper<EgRecord> {
+
+}

+ 18 - 0
service-eg/service-eg-biz/src/main/java/com/usky/eg/mapper/MeetingFaceDeviceMapper.java

@@ -0,0 +1,18 @@
+package com.usky.eg.mapper;
+
+import com.usky.eg.domain.MeetingFaceDevice;
+import com.usky.common.mybatis.core.CrudMapper;
+import org.springframework.stereotype.Repository;
+
+/**
+ * <p>
+ * 人脸设备关联表 Mapper 接口
+ * </p>
+ *
+ * @author zyj
+ * @since 2024-11-27
+ */
+@Repository
+public interface MeetingFaceDeviceMapper extends CrudMapper<MeetingFaceDevice> {
+
+}

+ 18 - 0
service-eg/service-eg-biz/src/main/java/com/usky/eg/mapper/MeetingFaceMapper.java

@@ -0,0 +1,18 @@
+package com.usky.eg.mapper;
+
+import com.usky.eg.domain.MeetingFace;
+import com.usky.common.mybatis.core.CrudMapper;
+import org.springframework.stereotype.Repository;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author zyj
+ * @since 2024-11-27
+ */
+@Repository
+public interface MeetingFaceMapper extends CrudMapper<MeetingFace> {
+
+}

+ 31 - 0
service-eg/service-eg-biz/src/main/java/com/usky/eg/service/EgDeviceService.java

@@ -0,0 +1,31 @@
+package com.usky.eg.service;
+
+import com.usky.common.core.bean.CommonPage;
+import com.usky.eg.domain.EgDevice;
+import com.usky.common.mybatis.core.CrudService;
+import com.usky.eg.service.vo.EgDeviceRequestVO;
+import org.springframework.web.bind.annotation.RequestBody;
+
+import java.util.Map;
+
+/**
+ * <p>
+ * 门禁_设备信息表 服务类
+ * </p>
+ *
+ * @author zyj
+ * @since 2024-11-27
+ */
+public interface EgDeviceService extends CrudService<EgDevice> {
+    CommonPage<EgDevice> page(EgDeviceRequestVO requestVO);
+
+    void add(EgDevice egDevice);
+
+    void update(EgDevice egDevice);
+
+    void remove(Integer id);
+
+    boolean checkNameUnique(EgDevice egDevice);
+
+    Map<String,Object> control(String productCode, String deviceUuid, String commandCode, String commandValue, String domain, Long userId, String userName);
+}

+ 22 - 0
service-eg/service-eg-biz/src/main/java/com/usky/eg/service/EgRecordService.java

@@ -0,0 +1,22 @@
+package com.usky.eg.service;
+
+import com.usky.common.core.bean.CommonPage;
+import com.usky.eg.domain.EgRecord;
+import com.usky.common.mybatis.core.CrudService;
+import com.usky.eg.service.vo.EgRecordRequestVO;
+import org.springframework.web.bind.annotation.RequestBody;
+
+/**
+ * <p>
+ * 门禁_通行记录表 服务类
+ * </p>
+ *
+ * @author zyj
+ * @since 2024-11-27
+ */
+public interface EgRecordService extends CrudService<EgRecord> {
+
+    void add(EgRecord egRecord);
+
+    CommonPage<EgRecord> page(EgRecordRequestVO requestVO);
+}

+ 218 - 0
service-eg/service-eg-biz/src/main/java/com/usky/eg/service/impl/EgDeviceServiceImpl.java

@@ -0,0 +1,218 @@
+package com.usky.eg.service.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.usky.common.core.bean.CommonPage;
+import com.usky.common.core.exception.BusinessException;
+import com.usky.common.core.util.UUIDUtils;
+import com.usky.common.security.utils.SecurityUtils;
+import com.usky.eg.domain.EgDevice;
+import com.usky.eg.domain.MeetingFace;
+import com.usky.eg.domain.MeetingFaceDevice;
+import com.usky.eg.mapper.EgDeviceMapper;
+import com.usky.eg.mapper.MeetingFaceDeviceMapper;
+import com.usky.eg.mapper.MeetingFaceMapper;
+import com.usky.eg.service.EgDeviceService;
+import com.usky.common.mybatis.core.AbstractCrudService;
+import com.usky.eg.service.vo.EgDeviceRequestVO;
+import com.usky.iot.RemoteIotTaskService;
+import com.usky.transfer.RemoteTransferService;
+import io.swagger.models.auth.In;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.util.*;
+
+/**
+ * <p>
+ * 门禁_设备信息表 服务实现类
+ * </p>
+ *
+ * @author zyj
+ * @since 2024-11-27
+ */
+@Service
+public class EgDeviceServiceImpl extends AbstractCrudService<EgDeviceMapper, EgDevice> implements EgDeviceService {
+    @Autowired
+    private MeetingFaceDeviceMapper meetingFaceDeviceMapper;
+    @Autowired
+    private MeetingFaceMapper meetingFaceMapper;
+    @Autowired
+    private EgDeviceMapper egDeviceMapper;
+    @Autowired
+    private RemoteIotTaskService remoteIotTaskService;
+
+    @Autowired
+    private RemoteTransferService remoteTransferService;
+
+    @Override
+    public CommonPage<EgDevice> page(EgDeviceRequestVO requestVO){
+        IPage<EgDevice> page = new Page<>(requestVO.getCurrent(),requestVO.getSize());
+        Integer tenantId ;
+
+        if(StringUtils.isNotBlank(requestVO.getDomain())){
+            tenantId = egDeviceMapper.sysTenantId(requestVO.getDomain());
+        }else{
+            tenantId = SecurityUtils.getTenantId();
+        }
+
+        LambdaQueryWrapper<EgDevice> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.like(StringUtils.isNotBlank(requestVO.getDeviceName()),EgDevice::getDeviceName,requestVO.getDeviceName())
+                .like(StringUtils.isNotBlank(requestVO.getInstallAddress()),EgDevice::getInstallAddress,requestVO.getInstallAddress())
+                .eq(null != requestVO.getServiceStatus(),EgDevice::getServiceStatus,requestVO.getServiceStatus())
+                .eq(null != requestVO.getId(),EgDevice::getId,requestVO.getId())
+                .eq(EgDevice::getTenantId,tenantId)
+                .orderByDesc(EgDevice::getId);
+        page = this.page(page,queryWrapper);
+        if(page.getRecords().size() > 0){
+            for (int i = 0; i < page.getRecords().size(); i++) {
+                if(Objects.nonNull(page.getRecords().get(i).getBindFace()) ||StringUtils.isNotBlank(page.getRecords().get(i).getBindFace())){
+                    String[] fidListStr = page.getRecords().get(i).getBindFace().split(",");
+                    Integer[] fidList = Arrays.stream(fidListStr).map(Integer::parseInt).toArray(Integer[]::new);
+
+                    LambdaQueryWrapper<MeetingFace> meetingFaceQuery = Wrappers.lambdaQuery();
+                    meetingFaceQuery.in(MeetingFace::getFid,Arrays.asList(fidList));
+                    List<MeetingFace> meetingFaceList = meetingFaceMapper.selectList(meetingFaceQuery);
+
+                    page.getRecords().get(i).setMeetingFaceList(meetingFaceList);
+                }
+
+            }
+        }
+
+        return new CommonPage<>(page.getRecords(),page.getTotal(),requestVO.getSize(),requestVO.getCurrent());
+    }
+
+    @Override
+    public void add(EgDevice egDevice){
+        if(checkNameUnique(egDevice)){
+            throw new BusinessException("新增门禁门号设备'"+egDevice.getDeviceId()+","+egDevice.getEgNumber()+"'失败,设备已存在");
+        }
+
+        egDevice.setDeviceUuid(UUIDUtils.uuid());
+        egDevice.setCreateBy(SecurityUtils.getUsername());
+        egDevice.setCreateTime(LocalDateTime.now());
+        egDevice.setTenantId(SecurityUtils.getTenantId());
+
+        this.save(egDevice);
+
+        String[] fids = new String[0];
+        if(Objects.nonNull(egDevice.getBindFace()) || StringUtils.isNotBlank(egDevice.getBindFace())){
+            fids = egDevice.getBindFace().split(",");
+        }
+        if(fids.length > 0){
+            for (int i = 0; i < fids.length; i++) {
+                egDeviceMapper.insertMeetingFaceDevice(Integer.parseInt(fids[i]),egDevice.getId());
+            }
+        }
+
+        remoteIotTaskService.addDeviceInfo("502_USKY", egDevice.getDeviceUuid(),egDevice.getDeviceId()+egDevice.getEgNumber(),egDevice.getDeviceName(),egDevice.getInstallAddress(),egDevice.getServiceStatus());
+    }
+
+    @Override
+    public void update(EgDevice egDevice){
+        if(checkNameUnique(egDevice)){
+            throw new BusinessException("修改门禁门号设备'"+egDevice.getDeviceId()+","+egDevice.getEgNumber()+"'失败,设备已存在");
+        }
+
+        egDevice.setUpdateBy(SecurityUtils.getUsername());
+        egDevice.setUpdateTime(LocalDateTime.now());
+
+        this.updateById(egDevice);
+
+        String[] fids = new String[0];
+        egDeviceMapper.deleteMeetingFaceDevice(egDevice.getId());
+        if(Objects.nonNull(egDevice.getBindFace()) || StringUtils.isNotBlank(egDevice.getBindFace())){
+            fids = egDevice.getBindFace().split(",");
+        }
+        if(fids.length > 0){
+            for (int i = 0; i < fids.length; i++) {
+                egDeviceMapper.insertMeetingFaceDevice(Integer.parseInt(fids[i]),egDevice.getId());
+            }
+        }
+    }
+
+    @Override
+    public void remove(Integer id){
+        EgDevice egDevice = this.getById(id);
+        Optional.ofNullable(egDevice).orElseThrow(() -> new BusinessException("门禁设备信息不存在"));
+
+        LambdaQueryWrapper<MeetingFaceDevice> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.eq(MeetingFaceDevice::getDeviceId,id);
+        Integer count = meetingFaceDeviceMapper.selectCount(queryWrapper);
+        if(count > 0){
+            throw new BusinessException("已绑定人员不能删除");
+        }
+
+        this.removeById(id);
+
+        remoteIotTaskService.deleteDeviceInfo(egDevice.getDeviceUuid());
+    }
+
+    @Override
+    public boolean checkNameUnique(EgDevice egDevice){
+        Integer id = null == egDevice.getId() ? -1 : egDevice.getId();
+        LambdaQueryWrapper<EgDevice> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.eq(EgDevice::getDeviceId,egDevice.getDeviceId())
+                .eq(EgDevice::getEgNumber,egDevice.getEgNumber())
+                .eq(EgDevice::getTenantId, SecurityUtils.getTenantId());
+        EgDevice one = this.getOne(queryWrapper);
+        return null != one && !Objects.equals(one.getId(),id);
+    }
+
+    @Override
+    public Map<String,Object> control(String productCode, String deviceUuid, String commandCode, String commandValue, String domain, Long userId, String userName){
+        Integer tenantId;
+        long commandUserId;
+        String commandUserName;
+        if(StringUtils.isNotBlank(domain)){
+            tenantId = baseMapper.sysTenantId(domain);
+            commandUserId = userId;
+            commandUserName = userName;
+        }else{
+            tenantId = SecurityUtils.getTenantId();
+            commandUserId = SecurityUtils.getUserId();
+            commandUserName = SecurityUtils.getUsername();
+        }
+
+        //人员设备权限校验,校验通过,可以下发命令控制设备
+        Integer fid = baseMapper.getMeetingFaceData(commandUserId);
+        if(fid == null){
+            throw new BusinessException("人脸卡号信息未注册");
+        }
+        Integer[] deviceFid = baseMapper.getMeetingFaceDeviceList(fid);
+        if(deviceFid.length == 0){
+            throw new BusinessException("人员未绑定设备,请检查");
+        }
+
+        LambdaQueryWrapper<EgDevice> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.select(EgDevice::getId)
+                .eq(EgDevice::getDeviceUuid,deviceUuid);
+        EgDevice one = this.getOne(queryWrapper);
+        if(one != null){
+            boolean exist = Arrays.asList(deviceFid).contains(one.getId());
+            if(!exist){
+                throw new BusinessException("暂无权限");
+            }
+        }else{
+            throw new BusinessException("设备未注册,请先注册");
+        }
+
+
+        Map<String,Object> map = new HashMap<>();
+        map.put("method","control");
+        Map<String,Object> map1 = new HashMap<>();
+        map1.put("commandCode",commandCode);
+        map1.put("commandValue",commandValue);
+        map.put("params",map1);
+
+        return remoteTransferService.deviceControl(productCode,deviceUuid, JSON.toJSONString(map),tenantId,commandUserId,commandUserName);
+    }
+}

+ 113 - 0
service-eg/service-eg-biz/src/main/java/com/usky/eg/service/impl/EgRecordServiceImpl.java

@@ -0,0 +1,113 @@
+package com.usky.eg.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.usky.common.core.bean.CommonPage;
+import com.usky.common.core.exception.BusinessException;
+import com.usky.common.security.utils.SecurityUtils;
+import com.usky.eg.domain.EgDevice;
+import com.usky.eg.domain.EgRecord;
+import com.usky.eg.mapper.EgDeviceMapper;
+import com.usky.eg.mapper.EgRecordMapper;
+import com.usky.eg.service.EgDeviceService;
+import com.usky.eg.service.EgRecordService;
+import com.usky.common.mybatis.core.AbstractCrudService;
+import com.usky.eg.service.vo.EgRecordRequestVO;
+import net.bytebuddy.dynamic.scaffold.MethodRegistry;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.time.temporal.Temporal;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * <p>
+ * 门禁_通行记录表 服务实现类
+ * </p>
+ *
+ * @author zyj
+ * @since 2024-11-27
+ */
+@Service
+public class EgRecordServiceImpl extends AbstractCrudService<EgRecordMapper, EgRecord> implements EgRecordService {
+    @Autowired
+    private EgDeviceService egDeviceService;
+    @Autowired
+    private EgDeviceMapper egDeviceMapper;
+
+    @Override
+    public void add(EgRecord egRecord){
+        Integer tenantId;
+        if(StringUtils.isNotBlank(egRecord.getDomain())){
+            tenantId = egDeviceMapper.sysTenantId(egRecord.getDomain());
+        }else{
+            tenantId = SecurityUtils.getTenantId();
+        }
+
+        LambdaQueryWrapper<EgDevice> queryWrapper = Wrappers.lambdaQuery();
+        if(StringUtils.isBlank(egRecord.getDeviceUuid())){
+            throw new BusinessException("设备Uuid不能为空");
+        }
+        queryWrapper.eq(EgDevice::getDeviceUuid,egRecord.getDeviceUuid());
+        EgDevice one = egDeviceService.getOne(queryWrapper);
+        egRecord.setEgDeviceId(one.getId());
+
+        egRecord.setCreateTime(LocalDateTime.now());
+        egRecord.setTenantId(tenantId);
+
+        this.save(egRecord);
+    }
+
+    @Override
+    public CommonPage<EgRecord> page(EgRecordRequestVO requestVO){
+        IPage<EgRecord> page = new Page<>(requestVO.getCurrent(),requestVO.getSize());
+        String deviceName = requestVO.getDeviceName();
+
+        List<Integer> egDeviceIdList = new ArrayList<>();
+        List<EgDevice> egDeviceList ;
+        LambdaQueryWrapper<EgDevice> egDeviceQuery = Wrappers.lambdaQuery();
+        if(StringUtils.isNotBlank(deviceName)){
+            egDeviceQuery.like(EgDevice::getDeviceName,deviceName).eq(EgDevice::getTenantId, SecurityUtils.getTenantId());
+            egDeviceList = egDeviceMapper.selectList(egDeviceQuery);
+            if(egDeviceList.size() > 0){
+                for (int i = 0; i < egDeviceList.size(); i++) {
+                    egDeviceIdList.add(egDeviceList.get(i).getId());
+                }
+            }
+        }else{
+            egDeviceQuery.eq(EgDevice::getTenantId, SecurityUtils.getTenantId());
+            egDeviceList = egDeviceMapper.selectList(egDeviceQuery);
+        }
+
+        LambdaQueryWrapper<EgRecord> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.like(StringUtils.isNotBlank(requestVO.getUserName()),EgRecord::getUserName,requestVO.getUserName())
+                .eq(null != requestVO.getPassType(),EgRecord::getPassType,requestVO.getPassType())
+                .in(CollectionUtils.isNotEmpty(egDeviceIdList),EgRecord::getEgDeviceId,egDeviceIdList)
+                .between(StringUtils.isNotBlank(requestVO.getStartTime())&&StringUtils.isNotBlank(requestVO.getEndTime()),EgRecord::getPassTime,requestVO.getStartTime(),requestVO.getEndTime())
+                .orderByDesc(EgRecord::getId);
+        page = this.page(page,queryWrapper);
+        if((page.getRecords().size() > 0) && (egDeviceList.size() > 0)){
+            for (int i = 0; i < page.getRecords().size(); i++) {
+                if(Objects.nonNull(page.getRecords().get(i).getEgDeviceId())){
+                    Integer egDeviceId = page.getRecords().get(i).getEgDeviceId();
+                    for (int j = 0; j < egDeviceList.size(); j++) {
+                        if(egDeviceId.equals(egDeviceList.get(j).getId())){
+                            page.getRecords().get(i).setEgDevice(egDeviceList.get(j));
+                            break;
+                        }
+                    }
+                }
+            }
+        }
+
+
+        return new CommonPage<>(page.getRecords(),page.getTotal(),requestVO.getSize(),requestVO.getCurrent());
+    }
+}

+ 43 - 0
service-eg/service-eg-biz/src/main/java/com/usky/eg/service/vo/EgDeviceRequestVO.java

@@ -0,0 +1,43 @@
+package com.usky.eg.service.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class EgDeviceRequestVO implements Serializable {
+
+    /**
+     * 页数
+     */
+    private Integer current;
+    /**
+     * 条数
+     */
+    private Integer size;
+
+    /**
+     * 设备名称
+     */
+    private String deviceName;
+
+    /**
+     * 安装位置
+     */
+    private String installAddress;
+
+    /**
+     * 业务状态;1:未激活,2:已激活,3:禁用
+     */
+    private Integer serviceStatus;
+
+    /**
+     * 表主键Id
+     */
+    private Integer id;
+
+    /**
+     * 域名
+     */
+    private String domain;
+}

+ 42 - 0
service-eg/service-eg-biz/src/main/java/com/usky/eg/service/vo/EgRecordRequestVO.java

@@ -0,0 +1,42 @@
+package com.usky.eg.service.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class EgRecordRequestVO implements Serializable {
+    /**
+     * 页数
+     */
+    private Integer current;
+    /**
+     * 条数
+     */
+    private Integer size;
+
+    /**
+     * 用户姓名
+     */
+    private String userName;
+
+    /**
+     * 通行方式(1、人脸 2、刷卡)
+     */
+    private Integer passType;
+
+    /**
+     * 设备名称
+     */
+    private String deviceName;
+
+    /**
+     * 开始时间
+     */
+    private String startTime;
+
+    /**
+     * 结束时间
+     */
+    private String endTime;
+}

+ 25 - 0
service-eg/service-eg-biz/src/main/resources/bootstrap.yml

@@ -0,0 +1,25 @@
+# Tomcat
+server:
+  port: 9898
+
+# Spring
+spring: 
+  application:
+    # 应用名称
+    name: service-eg
+  profiles:
+    # 环境配置
+    active: dev
+  cloud:
+    nacos:
+      discovery:
+        # 服务注册地址
+        server-addr: usky-cloud-nacos:8848
+      config:
+        # 配置中心地址
+        server-addr: usky-cloud-nacos:8848
+        # 配置文件格式
+        file-extension: yml
+        # 共享配置
+        shared-configs:
+          - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}

+ 108 - 0
service-eg/service-eg-biz/src/main/resources/doc/index.adoc

@@ -0,0 +1,108 @@
+= 安防项目
+
+[width="100%",options="header"]
+[stripes=even]
+|====================
+|Version |  Update Time  | Status | Author |  Description
+|v2022-04-21 16:57:08|2022-04-21 16:57:08|auto|@yq|Created by smart-doc
+|====================
+
+
+== &lt;p&gt;参数配置表 前端控制器&lt;/p&gt;
+== &lt;p&gt;部门信息&lt;/p&gt;
+=== 查看部门信息
+*URL:* http:10.23.39.1:8082/sysDept/list
+
+*Type:* POST
+
+*Author:* ya
+
+*Content-Type:* application/json; charset=utf-8
+
+
+
+
+*Body-parameters:*
+
+[width="100%",options="header"]
+[stripes=even]
+|====================
+|Parameter | Type|Description|Required|Since
+|deptId|int64|部门id|false|-
+|parentId|int64|父部门id|false|-
+|ancestors|string|祖级列表|false|-
+|deptName|string|部门名称|false|-
+|orderNum|int32|显示顺序|false|-
+|leader|string|负责人|false|-
+|phone|string|联系电话|false|-
+|email|string|邮箱|false|-
+|status|string|部门状态(0正常 1停用)|false|-
+|delFlag|string|删除标志(0代表存在 2代表删除)|false|-
+|createBy|string|创建者|false|-
+|createTime|string|创建时间|false|-
+|updateBy|string|更新者|false|-
+|updateTime|string|更新时间|false|-
+|bId|int64|建筑id|false|-
+|====================
+
+*Response-fields:*
+
+[width="100%",options="header"]
+[stripes=even]
+|====================
+|Field | Type|Description|Since
+|status|object|No comments found.|-
+|code|string|No comments found.|-
+|msg|string|No comments found.|-
+|data|object|No comments found.|-
+|└─deptId|int64|部门id|-
+|└─parentId|int64|父部门id|-
+|└─ancestors|string|祖级列表|-
+|└─deptName|string|部门名称|-
+|└─orderNum|int32|显示顺序|-
+|└─leader|string|负责人|-
+|└─phone|string|联系电话|-
+|└─email|string|邮箱|-
+|└─status|string|部门状态(0正常 1停用)|-
+|└─delFlag|string|删除标志(0代表存在 2代表删除)|-
+|└─createBy|string|创建者|-
+|└─createTime|string|创建时间|-
+|└─updateBy|string|更新者|-
+|└─updateTime|string|更新时间|-
+|└─bId|int64|建筑id|-
+|exception|string|No comments found.|-
+|====================
+
+*Response-example:*
+----
+{
+	"status": {
+		
+	},
+	"code": "97564",
+	"msg": "wnr5qt",
+	"data": [
+		{
+			"deptId": 540,
+			"parentId": 858,
+			"ancestors": "o5lg60",
+			"deptName": "文.沈",
+			"orderNum": 260,
+			"leader": "ufz93p",
+			"phone": "17852835049",
+			"email": "智渊.徐@yahoo.com",
+			"status": "nu6cnp",
+			"delFlag": "72oiji",
+			"createBy": "5fxr6j",
+			"createTime": "2022-04-21 16:57:10",
+			"updateBy": "4kcs4e",
+			"updateTime": "2022-04-21 16:57:10",
+			"bId": 977
+		}
+	],
+	"exception": "53u6bg"
+}
+----
+
+== &lt;p&gt;用户信息表 前端控制器&lt;/p&gt;
+

+ 74 - 0
service-eg/service-eg-biz/src/main/resources/logback.xml

@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration scan="true" scanPeriod="60 seconds" debug="false">
+    <!-- 日志存放路径 -->
+	<property name="log.path" value="/var/log/uskycloud/data-transfer" />
+   <!-- 日志输出格式 -->
+	<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
+
+    <!-- 控制台输出 -->
+	<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+		<encoder>
+			<pattern>${log.pattern}</pattern>
+		</encoder>
+	</appender>
+
+    <!-- 系统日志输出 -->
+	<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
+	    <file>${log.path}/info.log</file>
+        <!-- 循环政策:基于时间创建日志文件 -->
+		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 日志文件名格式 -->
+			<fileNamePattern>${log.path}/info.%d{yyyy-MM-dd}.log</fileNamePattern>
+			<!-- 日志最大的历史 60天 -->
+			<maxHistory>60</maxHistory>
+		</rollingPolicy>
+		<encoder>
+			<pattern>${log.pattern}</pattern>
+		</encoder>
+		<filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <!-- 过滤的级别 -->
+            <level>INFO</level>
+            <!-- 匹配时的操作:接收(记录) -->
+            <onMatch>ACCEPT</onMatch>
+            <!-- 不匹配时的操作:拒绝(不记录) -->
+            <onMismatch>DENY</onMismatch>
+        </filter>
+	</appender>
+
+    <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
+	    <file>${log.path}/error.log</file>
+        <!-- 循环政策:基于时间创建日志文件 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 日志文件名格式 -->
+            <fileNamePattern>${log.path}/error.%d{yyyy-MM-dd}.log</fileNamePattern>
+			<!-- 日志最大的历史 60天 -->
+			<maxHistory>60</maxHistory>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${log.pattern}</pattern>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <!-- 过滤的级别 -->
+            <level>ERROR</level>
+			<!-- 匹配时的操作:接收(记录) -->
+            <onMatch>ACCEPT</onMatch>
+			<!-- 不匹配时的操作:拒绝(不记录) -->
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <!-- 系统模块日志级别控制  -->
+	<logger name="com.usky" level="info" />
+	<!-- Spring日志级别控制  -->
+	<logger name="org.springframework" level="warn" />
+
+	<root level="info">
+		<appender-ref ref="console" />
+	</root>
+	
+	<!--系统操作日志-->
+    <root level="info">
+        <appender-ref ref="file_info" />
+        <appender-ref ref="file_error" />
+    </root>
+</configuration>

+ 58 - 0
service-eg/service-eg-biz/src/main/resources/mapper/eg/EgDeviceMapper.xml

@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.usky.eg.mapper.EgDeviceMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.usky.eg.domain.EgDevice">
+        <id column="id" property="id" />
+        <result column="device_uuid" property="deviceUuid" />
+        <result column="device_id" property="deviceId" />
+        <result column="device_name" property="deviceName" />
+        <result column="install_address" property="installAddress" />
+        <result column="service_status" property="serviceStatus" />
+        <result column="device_ip" property="deviceIp" />
+        <result column="device_port" property="devicePort" />
+        <result column="eg_number" property="egNumber" />
+        <result column="bind_face" property="bindFace" />
+        <result column="create_by" property="createBy" />
+        <result column="update_by" property="updateBy" />
+        <result column="create_time" property="createTime" />
+        <result column="update_time" property="updateTime" />
+        <result column="dept_id" property="deptId" />
+        <result column="tenant_id" property="tenantId" />
+    </resultMap>
+    <insert id="insertMeetingFaceDevice" parameterType="integer">
+        insert into meeting_face_device (face_id,device_id) value (#{fid}, #{egDeviceId});
+    </insert>
+    <delete id="deleteMeetingFaceDevice" parameterType="integer">
+        delete from meeting_face_device where device_id = #{egDeviceId};
+    </delete>
+    <select id="sysTenantId" resultType="integer">
+        select id
+        from sys_tenant
+        <where>
+            <if test="1 == 1">
+                and domain = #{domain}
+            </if>
+        </where>
+    </select>
+    <select id="getMeetingFaceData" resultType="integer">
+        select mf.fid as fid
+        from meeting_face mf
+        <where>
+            <if test="userId != null">
+                and mf.user_id = #{userId}
+            </if>
+        </where>
+    </select>
+    <select id="getMeetingFaceDeviceList" resultType="integer">
+        select mfd.device_id as deviceFid
+        from meeting_face_device mfd
+        <where>
+            <if test="fid != null">
+                and mfd.face_id = #{fid}
+            </if>
+        </where>
+    </select>
+
+</mapper>

+ 23 - 0
service-eg/service-eg-biz/src/main/resources/mapper/eg/EgRecordMapper.xml

@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.usky.eg.mapper.EgRecordMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.usky.eg.domain.EgRecord">
+        <id column="id" property="id" />
+        <result column="user_name" property="userName" />
+        <result column="pass_time" property="passTime" />
+        <result column="eg_device_id" property="egDeviceId" />
+        <result column="pass_type" property="passType" />
+        <result column="face_base" property="faceBase" />
+        <result column="card_num" property="cardNum" />
+        <result column="pass_result" property="passResult" />
+        <result column="create_by" property="createBy" />
+        <result column="update_by" property="updateBy" />
+        <result column="create_time" property="createTime" />
+        <result column="update_time" property="updateTime" />
+        <result column="dept_id" property="deptId" />
+        <result column="tenant_id" property="tenantId" />
+    </resultMap>
+
+</mapper>

+ 11 - 0
service-eg/service-eg-biz/src/main/resources/mapper/eg/MeetingFaceDeviceMapper.xml

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.usky.eg.mapper.MeetingFaceDeviceMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.usky.eg.domain.MeetingFaceDevice">
+        <id column="face_id" property="faceId" />
+        <result column="device_id" property="deviceId" />
+    </resultMap>
+
+</mapper>

+ 21 - 0
service-eg/service-eg-biz/src/main/resources/mapper/eg/MeetingFaceMapper.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.usky.eg.mapper.MeetingFaceMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.usky.eg.domain.MeetingFace">
+        <id column="fid" property="fid" />
+        <result column="face_base" property="faceBase" />
+        <result column="create_time" property="createTime" />
+        <result column="vef_num" property="vefNum" />
+        <result column="face_name" property="faceName" />
+        <result column="remark" property="remark" />
+        <result column="face_status" property="faceStatus" />
+        <result column="card_num" property="cardNum" />
+        <result column="bind_device" property="bindDevice" />
+        <result column="dept_id" property="deptId" />
+        <result column="tenant_id" property="tenantId" />
+        <result column="user_id" property="userId" />
+    </resultMap>
+
+</mapper>

+ 15 - 0
service-eg/service-eg-biz/src/main/resources/smart-doc.json

@@ -0,0 +1,15 @@
+{
+  "outPath":"./src/main/resources/doc",
+  "serverUrl": "http:10.23.39.1:8082/",
+  "isStrict": false,
+  "coverOld": true,
+  "allInOne": true,
+  "packageFilters": "com.usky.demo.controller.web",
+  "requestExample":"false",
+  "responseExample":"true",
+  "projectName": "安防项目",
+  "appKey": "20211216921084883495813120",
+  "appToken":"36bde2426ad546a5a50311bb747e7e61",
+  "secret": "N@Pd,KXAHki*BW3=zK.XPNykf!=CM79J",
+  "openUrl": "http://101.133.214.75:7700/api"
+}

+ 3 - 3
service-fire/service-fire-biz/src/main/java/com/usky/fire/controller/web/PatrolInspectionPlanController.java

@@ -34,7 +34,7 @@ public class PatrolInspectionPlanController {
      * @param patrolInspectionPlanVo
      * @return
      */
-    @Log(title = "巡检计划", businessType = BusinessType.INSERT)
+    @Log(title = "新增巡检计划", businessType = BusinessType.INSERT)
     @PostMapping("addPatrolInspectionPlan")
     public ApiResult<Void> addPatrolInspectionPlan(@RequestBody PatrolInspectionPlanVo patrolInspectionPlanVo) {
         patrolInspectionPlanService.addPatrolInspectionPlan(patrolInspectionPlanVo);
@@ -47,7 +47,7 @@ public class PatrolInspectionPlanController {
      * @param patrolInspectionPlanVo
      * @return
      */
-    @Log(title = "巡检计划", businessType = BusinessType.UPDATE)
+    @Log(title = "修改巡检计划", businessType = BusinessType.UPDATE)
     @PostMapping("updatePatrolInspectionPlan")
     public ApiResult<Void> updatePatrolInspectionPlan(@RequestBody PatrolInspectionPlanVo patrolInspectionPlanVo) {
         patrolInspectionPlanService.updatePatrolInspectionPlan(patrolInspectionPlanVo);
@@ -60,7 +60,7 @@ public class PatrolInspectionPlanController {
      * @param id 计划ID
      * @return
      */
-    @Log(title = "巡检计划", businessType = BusinessType.DELETE)
+    @Log(title = "删除巡检计划", businessType = BusinessType.DELETE)
     @GetMapping("delPatrolInspectionPlan")
     public ApiResult<Void> delPatrolInspectionPlan(@RequestParam(value = "id") Integer id) {
         patrolInspectionPlanService.delPatrolInspectionPlan(id);

+ 1 - 0
service-fire/service-fire-biz/src/main/java/com/usky/fire/service/impl/PatrolInspectionEventServiceImpl.java

@@ -134,6 +134,7 @@ public class PatrolInspectionEventServiceImpl extends AbstractCrudService<Patrol
         jsonObject.addProperty("infoTitle", patrolInspectionEvent.getEventName());
         jsonObject.addProperty("infoContent",eventTypeName);
         jsonObject.addProperty("infoType",2);
+        jsonObject.addProperty("userName",SecurityUtils.getUsername());
         jsonObject.addProperty("id",patrolInspectionEvent.getId());
         remoteMceService.addMce(jsonObject.toString());
 

+ 28 - 0
service-iot/service-iot-api/src/main/java/com/usky/iot/RemoteIotTaskService.java

@@ -0,0 +1,28 @@
+package com.usky.iot;
+
+
+import com.usky.iot.factory.RemoteIotTaskFactory;
+import com.usky.iot.factory.RemotePmFactory;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+@FeignClient(contextId = "RemoteIotTaskService", value = "service-iot" , fallbackFactory = RemoteIotTaskFactory.class)
+public interface RemoteIotTaskService {
+
+    @GetMapping("/dataOverviewJobData")
+    void dataOverviewJobData();
+
+    @GetMapping("/baseAlarmStatus")
+    void baseAlarmStatus();
+
+    @GetMapping("/customInfoStatus")
+    void customInfoStatus();
+
+    @GetMapping("/addDeviceInfo")
+    void addDeviceInfo(@RequestParam("productCode") String productCode, @RequestParam(value = "deviceUuid") String deviceUuid, @RequestParam(value = "deviceId") String deviceId, @RequestParam(value = "deviceName") String deviceName, @RequestParam(value = "installAddress") String installAddress, @RequestParam(value = "serviceStatus") Integer serviceStatus);
+
+    @GetMapping("/deleteDeviceInfo")
+    void deleteDeviceInfo(@RequestParam(value = "deviceUuid") String deviceUuid);
+}

+ 56 - 0
service-iot/service-iot-api/src/main/java/com/usky/iot/factory/RemoteIotTaskFactory.java

@@ -0,0 +1,56 @@
+package com.usky.iot.factory;
+
+import com.usky.common.core.exception.FeignBadRequestException;
+import com.usky.iot.RemoteIotTaskService;
+import com.usky.iot.RemotePmService;
+import org.apache.ibatis.annotations.Param;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.cloud.openfeign.FallbackFactory;
+import org.springframework.stereotype.Component;
+
+
+/**
+ * 用户服务降级处理
+ *
+ * @author ruoyi
+ */
+@Component
+public class RemoteIotTaskFactory implements FallbackFactory<RemoteIotTaskService>
+{
+    private static final Logger log = LoggerFactory.getLogger(RemoteIotTaskFactory.class);
+
+    @Override
+    public RemoteIotTaskService create(Throwable throwable)
+    {
+        log.error("用户服务调用失败:{}", throwable.getMessage());
+        return new RemoteIotTaskService()
+        {
+            @Override
+            public void dataOverviewJobData() {
+                throw new FeignBadRequestException(500,"数据概览数据定时生成异常"+throwable.getMessage());
+            }
+
+            @Override
+            public void baseAlarmStatus() {
+                throw new FeignBadRequestException(500,"定时同步设备状态和设备告警数据异常"+throwable.getMessage());
+            }
+
+            @Override
+            public void customInfoStatus() {
+                throw new FeignBadRequestException(500,"定时同步客户信息状态异常"+throwable.getMessage());
+            }
+
+            @Override
+            public void addDeviceInfo(String productCode, String deviceUuid, String deviceId, String deviceName, String installAddress, Integer serviceStatus) {
+                throw new FeignBadRequestException(500,"新增设备信息异常"+throwable.getMessage());
+            }
+
+            @Override
+            public void deleteDeviceInfo(String deviceUuid) {
+                throw new FeignBadRequestException(500,"删除设备信息异常"+throwable.getMessage());
+            }
+
+        };
+    }
+}

+ 5 - 0
service-iot/service-iot-biz/pom.xml

@@ -19,6 +19,11 @@
             <artifactId>service-backend-api</artifactId>
             <version>0.0.1</version>
         </dependency>
+        <dependency>
+            <groupId>com.usky</groupId>
+            <artifactId>data-transfer-api</artifactId>
+            <version>0.0.1</version>
+        </dependency>
 
         <dependency>
             <groupId>com.usky</groupId>

+ 4 - 4
service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/MybatisGeneratorUtils.java

@@ -43,10 +43,10 @@ public class MybatisGeneratorUtils {
         //2、数据源配置
         //修改数据源
         DataSourceConfig dsc = new DataSourceConfig();
-        dsc.setUrl("jdbc:mysql://172.16.120.165:3306/usky-cloud?useUnicode=true&serverTimezone=GMT&useSSL=false&characterEncoding=utf8");
+        dsc.setUrl("jdbc:mysql://192.168.123.165:3306/usky-cloud?useUnicode=true&serverTimezone=GMT&useSSL=false&characterEncoding=utf8");
         dsc.setDriverName("com.mysql.jdbc.Driver");
-        dsc.setUsername("usky");
-        dsc.setPassword("Yt#75Usky");
+        dsc.setUsername("root");
+        dsc.setPassword("yt123456");
         mpg.setDataSource(dsc);
 
         // 3、包配置
@@ -71,7 +71,7 @@ public class MybatisGeneratorUtils {
         // strategy.setTablePrefix("t_"); // 表名前缀
         strategy.setEntityLombokModel(true); //使用lombok
         //修改自己想要生成的表
-        strategy.setInclude("sys_dept");  // 逆向工程使用的表   如果要生成多个,这里可以传入String[]
+        strategy.setInclude("vc_stream");  // 逆向工程使用的表   如果要生成多个,这里可以传入String[]
         mpg.setStrategy(strategy);
 
         // 关闭默认 xml 生成,调整生成 至 根目录

+ 67 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/api/ServiceIotTaskApi.java

@@ -0,0 +1,67 @@
+package com.usky.iot.controller.api;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.usky.iot.RemoteIotTaskService;
+import com.usky.iot.domain.DmpDeviceInfo;
+import com.usky.iot.service.BaseAlarmService;
+import com.usky.iot.service.CrmCustomInfoService;
+import com.usky.iot.service.DmpDeviceInfoService;
+import com.usky.iot.service.job.DmpDataOverviewJob;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+public class ServiceIotTaskApi implements RemoteIotTaskService {
+
+    @Autowired
+    private DmpDataOverviewJob dmpDataOverviewJob;
+
+    @Autowired
+    private BaseAlarmService baseAlarmService;
+
+    @Autowired
+    private CrmCustomInfoService crmCustomInfoService;
+
+    @Autowired
+    private DmpDeviceInfoService dmpDeviceInfoService;
+
+    @Override
+    public void dataOverviewJobData () {
+        dmpDataOverviewJob.execute();
+    }
+
+    @Override
+    public void baseAlarmStatus() {
+        baseAlarmService.status();
+    }
+
+    @Override
+    public void customInfoStatus() {
+        crmCustomInfoService.updateStatus();
+    }
+
+    @Override
+    public void addDeviceInfo(String productCode, String deviceUuid, String deviceId, String deviceName, String installAddress, Integer serviceStatus){
+        DmpDeviceInfo dmpDeviceInfo = new DmpDeviceInfo();
+        dmpDeviceInfo.setProductCode(productCode);
+        dmpDeviceInfo.setDeviceUuid(deviceUuid);
+        dmpDeviceInfo.setDeviceId(deviceId);
+        dmpDeviceInfo.setDeviceName(deviceName);
+        dmpDeviceInfo.setInstallAddress(installAddress);
+        dmpDeviceInfo.setServiceStatus(serviceStatus);
+
+        dmpDeviceInfoService.add(dmpDeviceInfo);
+    }
+
+    @Override
+    public void deleteDeviceInfo(String deviceUuid){
+        LambdaQueryWrapper<DmpDeviceInfo> deviceQueryWrapper = Wrappers.lambdaQuery();
+        deviceQueryWrapper.eq(DmpDeviceInfo::getDeviceUuid,deviceUuid);
+        DmpDeviceInfo dmpDeviceInfo = dmpDeviceInfoService.getOne(deviceQueryWrapper);
+
+        dmpDeviceInfoService.remove(dmpDeviceInfo.getId());
+    }
+}

+ 118 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/DeviceHttpController.java

@@ -1,13 +1,25 @@
 package com.usky.iot.controller.web;
 
+import com.alibaba.fastjson.JSON;
 import com.usky.common.core.bean.ApiResult;
+import com.usky.common.core.exception.BusinessException;
+import com.usky.common.core.util.HttpUtils;
+import com.usky.common.core.util.StringUtils;
+import com.usky.common.security.utils.SecurityUtils;
 import com.usky.iot.service.BaseAlarmService;
 import com.usky.iot.service.DmpDataInfoService;
+import com.usky.iot.service.DmpDeviceInfoService;
 import com.usky.iot.service.DmpDeviceStatusService;
 import com.usky.backend.domain.request.DmpDeviceDataRequestVO;
+import com.usky.transfer.RemoteTransferService;
+import org.apache.catalina.security.SecurityUtil;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
 /**
  * @author zyj
  * @date 2023/6/8 13:52:05
@@ -22,6 +34,12 @@ public class DeviceHttpController {
     @Autowired
     private DmpDataInfoService dmpDataInfoService;
 
+    @Autowired
+    private RemoteTransferService remoteTransferService;
+
+    @Autowired
+    private DmpDeviceInfoService dmpDeviceInfoService;
+
     @GetMapping(value = "/status")
     public ApiResult<Void> status(){
         baseAlarmService.status();
@@ -39,5 +57,105 @@ public class DeviceHttpController {
         return ApiResult.success();
     }
 
+    /**
+     * 下发设备控制命令
+     */
+    @GetMapping("/control")
+    public ApiResult<Map<String,Object>> control(@RequestParam("productCode") String productCode,
+                                                 @RequestParam("deviceUuid") String deviceUuid,
+                                                 @RequestParam("commandCode") String commandCode,
+                                                 @RequestParam("commandValue") String commandValue,
+                                                 @RequestParam(value = "domain",required = false) String domain,
+                                                 @RequestParam(value = "userId",required = false) Long userId,
+                                                 @RequestParam(value = "userName",required = false) String userName){
+        return ApiResult.success(dmpDeviceInfoService.control(productCode,deviceUuid,commandCode,commandValue,domain,userId,userName));
+    }
+
+
+    /**
+     * 设备管理-海康监控系统实时视频预览取流
+     *
+     * @param productCode 产品编码
+     * @param deviceId  设备Id
+     * @param streamType  码流类型,0:主码流 1:子码流 2:第三码流 参数不填,默认为主码流
+     * @param protocol  取流协议(应用层协议),“rtsp”:RTSP协议,“rtmp”:RTMP协议,“hls”:HLS协议(HLS协议只支持海康SDK协议、EHOME协议、GB28181协议、ONVIF协议接入的设备;只支持H264视频编码和AAC音频编码),参数不填,默认为RTSP协议
+     * @param transmode  传输协议(传输层协议),0:UDP 1:TCP 默认是TCP 注: GB28181 2011及以前版本只支持UDP传输
+     * @return
+     */
+    @GetMapping("/hikVideoStream")
+    public ApiResult<Map<String, Object>> hikVideoStream(@RequestParam("productCode") String productCode,
+                                                         @RequestParam("deviceId") String deviceId,
+                                                         @RequestParam("streamType") Integer streamType,
+                                                         @RequestParam("protocol") String protocol,
+                                                         @RequestParam("transmode") Integer transmode){
+        Integer tenantId = SecurityUtils.getTenantId();
+        Long userId = SecurityUtils.getUserId();
+        String userName = SecurityUtils.getUsername();
+
+        Map<String,Object> map = new HashMap<>();
+        map.put("method","streamControl");
+        Map<String,Object> map1 = new HashMap<>();
+        map1.put("device_id",deviceId);
+        map1.put("streamType",streamType);
+        map1.put("protocol",protocol);
+        map1.put("transmode",transmode);
+        map.put("params",map1);
+
+        return ApiResult.success(remoteTransferService.deviceControl(productCode,deviceId, JSON.toJSONString(map),tenantId,userId,userName));
+    }
+
+    /**
+     * 获取海康系统行车记录数据
+     * @param startTime
+     * @param endTime
+     * @param pageNo
+     * @param pageSize
+     * @return
+     */
+    @GetMapping("driverRecordList")
+    public ApiResult<Map<String,Object>> driverRecordList(@RequestParam(value = "startTime",required = false) String startTime,
+                                                          @RequestParam(value = "endTime",required = false) String endTime,
+                                                          @RequestParam(value = "pageNo") Integer pageNo,
+                                                          @RequestParam(value = "pageSize") Integer pageSize){
+        Integer tenantId = SecurityUtils.getTenantId();
+        Long userId = SecurityUtils.getUserId();
+        String userName = SecurityUtils.getUsername();
+
+        Map<String,Object> map = new HashMap<>();
+        map.put("method","driverRecordControl");
+        Map<String,Object> map1 = new HashMap<>();
+        if(StringUtils.isNotBlank(startTime)){
+            map1.put("startTime",startTime);
+        }
+        if(StringUtils.isNotBlank(endTime)){
+            map1.put("endTime",endTime);
+        }
+        map1.put("pageNo",pageNo);
+        map1.put("pageSize",pageSize);
+        map.put("params",map1);
+
+        return ApiResult.success(remoteTransferService.deviceControl("501_HGHK","0001",JSON.toJSONString(map),tenantId,userId,userName));
+    }
+
+    /**
+     * 查询停车库剩余车位数
+     * @param parkSyscode
+     * @return
+     */
+    @GetMapping("parkRemainSpaceList")
+    public ApiResult<Map<String,Object>> parkRemainSpaceList(@RequestParam(value = "parkSyscode") String parkSyscode){
+        Integer tenantId = SecurityUtils.getTenantId();
+        Long userId = SecurityUtils.getUserId();
+        String userName = SecurityUtils.getUsername();
+
+        Map<String,Object> map = new HashMap<>();
+        map.put("method","parkRemainSpaceControl");
+        Map<String,Object> map1 = new HashMap<>();
+        map1.put("parkSyscode",parkSyscode);
+        map.put("params",map1);
+
+        return ApiResult.success(remoteTransferService.deviceControl("501_HGHK","0002",JSON.toJSONString(map),tenantId,userId,userName));
+    }
+
 
 }

+ 12 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/DmpDeviceInfoController.java

@@ -72,6 +72,18 @@ public class DmpDeviceInfoController {
         return ApiResult.success(dmpDeviceInfoService.page(dmpDeviceInfoRequest));
     }
 
+
+    /**
+     * 分页-白名单
+     * @param dmpDeviceInfoRequest
+     * @return
+     */
+    @PostMapping("/pageWhite")
+    public ApiResult<CommonPage<DmpDeviceInfo>> pageWhite(@RequestBody DmpDeviceInfoRequest dmpDeviceInfoRequest)
+    {
+        return ApiResult.success(dmpDeviceInfoService.pageWhite(dmpDeviceInfoRequest));
+    }
+
     /**
      * 删除记录
      */

+ 74 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/DmpProductCommandController.java

@@ -0,0 +1,74 @@
+package com.usky.iot.controller.web;
+
+
+import com.usky.common.core.bean.ApiResult;
+import com.usky.common.core.bean.CommonPage;
+import com.usky.iot.domain.DmpProductCommand;
+import com.usky.iot.service.DmpProductCommandService;
+import com.usky.iot.service.vo.DmpProductCommandRequestVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * <p>
+ * 产品命令表 前端控制器
+ * </p>
+ *
+ * @author han
+ * @since 2024-10-30
+ */
+@RestController
+@RequestMapping("/dmpProductCommand")
+public class DmpProductCommandController {
+
+    @Autowired
+    private DmpProductCommandService dmpProductCommandService;
+
+    /**
+     * 新增
+     * @param dmpProductCommand
+     * @return
+     */
+    @PostMapping
+    public ApiResult<Void> add(@RequestBody DmpProductCommand dmpProductCommand){
+        dmpProductCommandService.add(dmpProductCommand);
+        return ApiResult.success();
+    }
+
+    /**
+     * 修改
+     * @param dmpProductCommand
+     * @return
+     */
+    @PutMapping
+    public ApiResult<Void> edit(@RequestBody DmpProductCommand dmpProductCommand){
+        dmpProductCommandService.edit(dmpProductCommand);
+        return ApiResult.success();
+    }
+
+
+    /**
+     * 分页
+     * @param requestVO
+     * @return
+     */
+    @PostMapping("/page")
+    public ApiResult<CommonPage<DmpProductCommand>> page(@RequestBody DmpProductCommandRequestVO requestVO)
+    {
+        return ApiResult.success(dmpProductCommandService.page(requestVO));
+    }
+
+
+
+    /**
+     * 删除记录
+     */
+    @DeleteMapping("/{id}")
+    public ApiResult<Void> remove(@PathVariable("id") Integer id)
+    {
+        dmpProductCommandService.remove(id);
+        return ApiResult.success();
+    }
+
+}
+

+ 16 - 16
service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/TaskController.java

@@ -37,21 +37,21 @@ public class TaskController implements ApplicationContextAware {
         context = applicationContext;
     }
 
-    @Scheduled(cron = "0 30 23 * * ? ") //每天23点30分执行
-    public void task() {
-        System.out.println(Thread.currentThread().getName() + "定时任务执行中");
-        dmpDataOverviewJob.execute();
-    }
-    @Scheduled(cron = "0 0 23 * * ? ") //每天23点执行
-    public void task1() {
-        System.out.println(Thread.currentThread().getName() + "定时任务执行中");
-        baseAlarmService.status();
-    }
-
-    @Scheduled(cron = "0 30 * * * ? ") //每天凌晨0点30分执行
-    public void task2() {
-        System.out.println(Thread.currentThread().getName() + "定时任务执行中");
-        crmCustomInfoService.updateStatus();
-    }
+//    @Scheduled(cron = "0 30 23 * * ? ") //每天23点30分执行
+//    public void task() {
+//        System.out.println(Thread.currentThread().getName() + "定时任务执行中");
+//        dmpDataOverviewJob.execute();
+//    }
+//    @Scheduled(cron = "0 0 23 * * ? ") //每天23点执行
+//    public void task1() {
+//        System.out.println(Thread.currentThread().getName() + "定时任务执行中");
+//        baseAlarmService.status();
+//    }
+//
+//    @Scheduled(cron = "0 30 * * * ? ") //每天凌晨0点30分执行
+//    public void task2() {
+//        System.out.println(Thread.currentThread().getName() + "定时任务执行中");
+//        crmCustomInfoService.updateStatus();
+//    }
 
 }

+ 91 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/VcDeviceController.java

@@ -0,0 +1,91 @@
+package com.usky.iot.controller.web;
+
+
+import com.usky.common.core.bean.ApiResult;
+import com.usky.common.core.bean.CommonPage;
+import com.usky.iot.domain.BaseGgpFacility;
+import com.usky.iot.domain.VcDevice;
+import com.usky.iot.service.VcDeviceService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 视频配置信息表 前端控制器
+ * </p>
+ *
+ * @author han
+ * @since 2024-10-22
+ */
+@RestController
+@RequestMapping("/vcDevice")
+public class VcDeviceController {
+
+    @Autowired
+    private VcDeviceService vcDeviceService;
+
+    /**
+     * 视频设备信息查询
+     * @param groupId
+     * @return
+     */
+    @GetMapping("/VcDeviceList")
+    public ApiResult<List<VcDevice>> VcDeviceList(@RequestParam(value = "groupId",required = false) Integer groupId)
+    {
+        return ApiResult.success(vcDeviceService.VcDeviceList(groupId));
+    }
+
+    /**
+     * 视频设备信息分页查询
+     *
+     * @param videoNumber
+     * @param videoName
+     * @param groupId
+     * @param pageNum
+     * @param pageSize
+     * @return
+     */
+    @GetMapping("/page")
+    public ApiResult<CommonPage<VcDevice>> pageList(@RequestParam(value = "videoNumber", required = false, defaultValue = "") String videoNumber,
+                                                     @RequestParam(value = "videoName", required = false, defaultValue = "") String videoName,
+                                                     @RequestParam(value = "groupId", required = false, defaultValue = "") Integer groupId,
+                                                     @RequestParam(value = "pageNum", required = false, defaultValue = "1") Integer pageNum,
+                                                     @RequestParam(value = "pageSize", required = false, defaultValue = "10") Integer pageSize) {
+        return ApiResult.success(vcDeviceService.pageList(videoNumber, videoName, groupId, pageNum, pageSize));
+    }
+
+    /**
+     * 新增
+     * @param vcDevice
+     * @return
+     */
+    @PostMapping("/add")
+    public ApiResult<Void> add(@RequestBody VcDevice vcDevice){
+        vcDeviceService.add(vcDevice);
+        return ApiResult.success();
+    }
+
+    /**
+     * 修改
+     * @param vcDevice
+     * @return
+     */
+    @PutMapping("/edit")
+    public ApiResult<Void> edit(@RequestBody VcDevice vcDevice){
+        vcDeviceService.update(vcDevice);
+        return ApiResult.success();
+    }
+
+    /**
+     * 删除记录
+     */
+    @DeleteMapping("/{id}")
+    public ApiResult<Void> remove(@PathVariable("id") Integer id)
+    {
+        vcDeviceService.remove(id);
+        return ApiResult.success();
+    }
+}
+

+ 74 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/VcDeviceGroupController.java

@@ -0,0 +1,74 @@
+package com.usky.iot.controller.web;
+
+
+import com.usky.common.core.bean.ApiResult;
+import com.usky.iot.domain.VcDeviceGroup;
+import com.usky.iot.service.VcDeviceGroupService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import org.springframework.stereotype.Controller;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author han
+ * @since 2024-10-23
+ */
+@RestController
+@RequestMapping("/vcDeviceGroup")
+public class VcDeviceGroupController {
+    @Autowired
+    private VcDeviceGroupService vcDeviceGroupService;
+
+    /**
+     * 站点分组-新增
+     *
+     * @param groupName 站点分组名称
+     * @return
+     */
+    @GetMapping("vcDeviceGroupAdd")
+    public ApiResult<Void> vcDeviceGroupAdd(@RequestParam String groupName) {
+        vcDeviceGroupService.vcDeviceGroupAdd(groupName);
+        return ApiResult.success();
+    }
+
+    /**
+     * 站点分组-修改
+     *
+     * @param groupName 站点分组名称
+     * @param id           站点分组ID
+     * @return
+     */
+    @GetMapping("vcDeviceGroupUpdate")
+    public ApiResult<Void> vcDeviceGroupUpdate(@RequestParam String groupName, @RequestParam Integer id) {
+        vcDeviceGroupService.vcDeviceGroupUpdate(groupName, id);
+        return ApiResult.success();
+    }
+
+    /**
+     * 站点分组-删除
+     */
+    @DeleteMapping("/{id}")
+    public ApiResult<Void> remove(@PathVariable("id") Integer id)
+    {
+        vcDeviceGroupService.removeById(id);
+        return ApiResult.success();
+    }
+
+    /**
+     * 站点分组-列表
+     *
+     * @param groupName 站点分组名称
+     * @return
+     */
+    @GetMapping("vcDeviceGroupList")
+    public ApiResult<List<VcDeviceGroup>> vcDeviceGroupList(@RequestParam(value = "groupName", required = false, defaultValue = "") String groupName) {
+        return ApiResult.success(vcDeviceGroupService.vcDeviceGroupList(groupName));
+    }
+}
+

+ 80 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/VcStreamController.java

@@ -0,0 +1,80 @@
+package com.usky.iot.controller.web;
+
+
+import com.usky.common.core.bean.ApiResult;
+import com.usky.common.core.bean.CommonPage;
+import com.usky.iot.domain.VcDevice;
+import com.usky.iot.domain.VcStream;
+import com.usky.iot.service.VcStreamService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import org.springframework.stereotype.Controller;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author han
+ * @since 2024-10-23
+ */
+@RestController
+@RequestMapping("/vcStream")
+public class VcStreamController {
+
+    @Autowired
+    private VcStreamService vcStreamService;
+
+    /**
+     * 流媒体信息分页查询
+     *
+     * @param platformAddress
+     * @param platformType
+     * @param pageNum
+     * @param pageSize
+     * @return
+     */
+    @GetMapping("/page")
+    public ApiResult<CommonPage<VcStream>> pageList(@RequestParam(value = "platformAddress", required = false, defaultValue = "") String platformAddress,
+                                                    @RequestParam(value = "platformType", required = false, defaultValue = "") Integer platformType,
+                                                    @RequestParam(value = "pageNum", required = false, defaultValue = "1") Integer pageNum,
+                                                    @RequestParam(value = "pageSize", required = false, defaultValue = "10") Integer pageSize) {
+        return ApiResult.success(vcStreamService.pageList(platformAddress, platformType, pageNum, pageSize));
+    }
+
+    /**
+     * 新增
+     * @param vcStream
+     * @return
+     */
+    @PostMapping("/add")
+    public ApiResult<Void> add(@RequestBody VcStream vcStream){
+        vcStreamService.add(vcStream);
+        return ApiResult.success();
+    }
+
+    /**
+     * 修改
+     * @param vcStream
+     * @return
+     */
+    @PutMapping("/edit")
+    public ApiResult<Void> edit(@RequestBody VcStream vcStream){
+        vcStreamService.update(vcStream);
+        return ApiResult.success();
+    }
+
+    /**
+     * 删除记录
+     */
+    @DeleteMapping("/{id}")
+    public ApiResult<Void> remove(@PathVariable("id") Integer id)
+    {
+        vcStreamService.remove(id);
+        return ApiResult.success();
+    }
+}
+

+ 8 - 2
service-iot/service-iot-biz/src/main/java/com/usky/iot/controller/web/WeChatController.java

@@ -130,8 +130,14 @@ public class WeChatController {
                 queryWrapper.eq(MceMbuser::getOpenid,openId).last("LIMIT 1");
                 MceMbuser one = mceMbuserService.getOne(queryWrapper);
                 if(one != null){
-                    String accessToken = redisHelper.get("login_openid:"+openId).toString();
-                    one.setAccessToken(accessToken);
+                    String access_key = "login_openid:"+openId;
+                    if(redisHelper.hasKey(access_key)){
+                        String accessToken = redisHelper.get(access_key).toString();
+                        one.setAccessToken(accessToken);
+                    }else{
+                        one.setAccessToken("");
+                    }
+
                 }
 
                 return ApiResult.success(one);

+ 10 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/domain/DmpDeviceInfo.java

@@ -132,6 +132,16 @@ public class DmpDeviceInfo implements Serializable {
      */
     private String deviceUuid;
 
+    /**
+     * 经度
+     */
+    private String longitude;
+
+    /**
+     * 纬度
+     */
+    private String latitude;
+
     /**
      * 设备状态;1:在线,2:离线
      */

+ 112 - 0
service-iot/service-iot-biz/src/main/java/com/usky/iot/domain/DmpProductCommand.java

@@ -0,0 +1,112 @@
+package com.usky.iot.domain;
+
+import java.math.BigDecimal;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 产品命令表
+ * </p>
+ *
+ * @author han
+ * @since 2024-10-30
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class DmpProductCommand implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键id
+     */
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 产品编码
+     */
+    private String productCode;
+
+    /**
+     * 命令编码
+     */
+    private String commandCode;
+
+    /**
+     * 命令名称
+     */
+    private String commandName;
+
+    /**
+     * 数据类型(1、状态量 2、模拟量)
+     */
+    private Integer dataType;
+
+    /**
+     * 单位
+     */
+    private String commandUnit;
+
+    /**
+     * 最大值
+     */
+    private BigDecimal maximum;
+
+    /**
+     * 最小值
+     */
+    private BigDecimal minimum;
+
+    /**
+     * 命令字典
+     */
+    private String commandDict;
+
+    /**
+     * 命令描述
+     */
+    private String commandDescribe;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+    /**
+     * 删除标识;0:未删除,1:已删除
+     */
+    private Integer deleteFlag;
+
+    /**
+     * 创建人
+     */
+    private String createdBy;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createdTime;
+
+    /**
+     * 更新人
+     */
+    private String updatedBy;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updatedTime;
+
+    /**
+     * 租户号
+     */
+    private Integer tenantId;
+
+
+}

Some files were not shown because too many files changed in this diff