xiaoguohua 3 месяцев назад
Родитель
Сommit
c6b6ea3c24

BIN
doc/数据库备份/electricity20260520.sql


+ 127 - 0
gateway/README.md

@@ -0,0 +1,127 @@
+-- 通信模块表
+DROP TABLE IF EXISTS dev_transmit;
+
+CREATE TABLE dev_transmit (
+  id bigserial NOT NULL,
+  name varchar(50) NOT NULL,
+  transmit_class varchar(100) NOT NULL DEFAULT '',
+  config_example varchar(500) NOT NULL DEFAULT '',
+  PRIMARY KEY (id),
+  CONSTRAINT uq_dev_transmit_1 UNIQUE (name)
+);
+
+COMMENT ON TABLE dev_transmit IS '通信模块';
+COMMENT ON COLUMN dev_transmit.id IS '主键';
+COMMENT ON COLUMN dev_transmit.name IS '名称';
+COMMENT ON COLUMN dev_transmit.transmit_class IS '类全名';
+COMMENT ON COLUMN dev_transmit.config_example IS '配置示例';
+
+-- 协议模块表
+DROP TABLE IF EXISTS dev_protocol;
+
+CREATE TABLE dev_protocol (
+  id bigserial NOT NULL,
+  name varchar(50) NOT NULL,
+  protocol_class varchar(100) NOT NULL,
+  config_example varchar(500) NOT NULL DEFAULT '',
+  PRIMARY KEY (id),
+  CONSTRAINT uq_dev_protocol_1 UNIQUE (name)
+);
+
+COMMENT ON TABLE dev_protocol IS '协议模块';
+COMMENT ON COLUMN dev_protocol.id IS '主键';
+COMMENT ON COLUMN dev_protocol.name IS '名称';
+COMMENT ON COLUMN dev_protocol.protocol_class IS '全类名';
+COMMENT ON COLUMN dev_protocol.config_example IS '配置示例';
+
+-- 设备通道表
+DROP TABLE IF EXISTS dev_channel;
+
+CREATE TABLE dev_channel (
+  id bigserial NOT NULL,
+  code varchar(15) NOT NULL DEFAULT '',
+  name varchar(50) NOT NULL,
+  disabled char(1) NOT NULL DEFAULT '0',
+  dev_transmit_id bigint NOT NULL,
+  transmit_config varchar(500) NOT NULL DEFAULT '',
+  dev_protocol_id bigint NOT NULL,
+  protocol_config varchar(500) NOT NULL DEFAULT '',
+  remark varchar(200) NOT NULL DEFAULT '',
+  create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+  update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
+  create_by varchar(25) NOT NULL DEFAULT '',
+  update_by varchar(25) NOT NULL DEFAULT '',
+  PRIMARY KEY (id)
+);
+
+COMMENT ON TABLE dev_channel IS '设备通道表';
+COMMENT ON COLUMN dev_channel.id IS '主键';
+COMMENT ON COLUMN dev_channel.code IS '编号';
+COMMENT ON COLUMN dev_channel.name IS '名称';
+COMMENT ON COLUMN dev_channel.disabled IS '停用状态';
+COMMENT ON COLUMN dev_channel.dev_transmit_id IS '通信模块';
+COMMENT ON COLUMN dev_channel.transmit_config IS '通信配置';
+COMMENT ON COLUMN dev_channel.dev_protocol_id IS '协议模块';
+COMMENT ON COLUMN dev_channel.protocol_config IS '协议配置';
+COMMENT ON COLUMN dev_channel.remark IS '备注';
+COMMENT ON COLUMN dev_channel.create_time IS '创建时间';
+COMMENT ON COLUMN dev_channel.update_time IS '修改时间';
+COMMENT ON COLUMN dev_channel.create_by IS '创建者';
+COMMENT ON COLUMN dev_channel.update_by IS '更新者';
+
+-- 本地气象数据
+drop table  if exists data_weather_local;
+CREATE TABLE data_weather_local (
+tm          TIMESTAMPTZ NOT NULL,
+device_id           bigint        NOT NULL,
+horizontal_irradiance  DOUBLE PRECISION,
+inclined_irradiance    DOUBLE PRECISION,
+temperature         DOUBLE PRECISION,
+pressure            DOUBLE PRECISION,
+humidity            DOUBLE PRECISION,
+wind_speed          DOUBLE PRECISION,
+wind_direction      DOUBLE PRECISION
+)WITH (
+tsdb.hypertable,
+tsdb.partition_column='tm',
+tsdb.segmentby = 'device_id',
+tsdb.chunk_interval='1 month',
+tsdb.orderby = 'tm DESC'
+);
+
+COMMENT ON COLUMN data_weather_local.tm          IS '时间戳(带时区)';
+COMMENT ON COLUMN data_weather_local.device_id           IS '设备ID';
+COMMENT ON COLUMN data_weather_local.horizontal_irradiance  IS '水平面总辐照度,单位 W/m²';
+COMMENT ON COLUMN data_weather_local.inclined_irradiance    IS '斜面辐照度,单位 W/m²';
+COMMENT ON COLUMN data_weather_local.temperature         IS '温度,单位 ℃';
+COMMENT ON COLUMN data_weather_local.pressure            IS '气压,单位 hPa';
+COMMENT ON COLUMN data_weather_local.humidity            IS '湿度,单位 %';
+COMMENT ON COLUMN data_weather_local.wind_speed          IS '风速,单位 m/s';
+COMMENT ON COLUMN data_weather_local.wind_direction      IS '风向,北向为0,顺时针,单位 °(0~360)';
+
+-- 场站电气采样数据
+DROP TABLE IF EXISTS data_station;
+CREATE TABLE data_station (
+station_id bigint NOT NULL,
+tm TIMESTAMPTZ NOT NULL,
+actual_power DOUBLE PRECISION,
+theoretical_power DOUBLE PRECISION,
+curtailment_power DOUBLE PRECISION,
+availability DOUBLE PRECISION,
+device_status SMALLINT,
+grid_status SMALLINT
+) with (
+tsdb.hypertable,
+tsdb.partition_column='tm',
+tsdb.chunk_interval=''1 month'',
+tsdb.orderby = 'tm DESC'
+);
+COMMENT ON COLUMN data_station.station_id IS '光伏场站ID';
+COMMENT ON COLUMN data_station.tm IS '时间戳(带时区)';
+COMMENT ON COLUMN data_station.actual_power IS '实际发电功率(kW)';
+COMMENT ON COLUMN data_station.theoretical_power IS '理论发电功率(kW)';
+COMMENT ON COLUMN data_station.curtailment_power IS '限电功率(kW)';
+COMMENT ON COLUMN data_station.device_status IS '设备状态(0=正常,1=停机,2=限电,3=检修,4=故障,只要一个处于异常就设为某个异常)';
+COMMENT ON COLUMN data_station.grid_status IS '并网状态(1=并网,0=离网)';
+COMMENT ON COLUMN data_station.availability IS '可用率(%)';
+

+ 63 - 0
gateway/forecast-device-gateway/pom.xml

@@ -0,0 +1,63 @@
+<?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">
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>forecast-device-gateway</artifactId>
+    <description>设备网关模块</description>
+
+    <parent>
+        <artifactId>forecast-gateway</artifactId>
+        <groupId>cn.oleauto</groupId>
+        <version>${revision}</version>
+    </parent>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-devtools</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <!-- SpringBoot 拦截器 -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-aop</artifactId>
+        </dependency>
+        <!-- 阿里数据库连接池 -->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid-spring-boot-starter</artifactId>
+        </dependency>
+        <!-- PostgreSQL 驱动包(compile 域:JsonbTypeHandler 直接依赖 PGobject) -->
+        <dependency>
+            <groupId>org.postgresql</groupId>
+            <artifactId>postgresql</artifactId>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>${spring-boot.version}</version>
+                <configuration>
+                    <!-- 如果没有该配置,devtools不会生效 -->
+                    <addResources>true</addResources>
+                </configuration>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+</project>

+ 14 - 0
gateway/forecast-device-gateway/src/main/java/cn/oleauto/ForecastDeviceGateway.java

@@ -0,0 +1,14 @@
+package cn.oleauto;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;
+
+@SpringBootApplication()
+public class ForecastDeviceGateway {
+    public static void main(String[] args)
+    {
+        SpringApplication.run(ForecastDeviceGateway.class, args);
+    }
+}

+ 2 - 0
gateway/forecast-device-gateway/src/main/resources/application.properties

@@ -0,0 +1,2 @@
+spring.application.name=demo
+server.port=8081

+ 93 - 0
gateway/forecast-device-gateway/src/main/resources/logback.xml

@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration>
+    <!-- 日志存放路径 -->
+	<property name="log.path" value="logs/" />
+    <!-- 日志输出格式 -->
+	<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}/sys-info.log</file>
+        <!-- 循环政策:基于时间创建日志文件 -->
+		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 日志文件名格式 -->
+			<fileNamePattern>${log.path}/sys-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}/sys-error.log</file>
+        <!-- 循环政策:基于时间创建日志文件 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 日志文件名格式 -->
+            <fileNamePattern>${log.path}/sys-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>
+	
+	<!-- 用户访问日志输出  -->
+    <appender name="sys-user" class="ch.qos.logback.core.rolling.RollingFileAppender">
+		<file>${log.path}/sys-user.log</file>
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 按天回滚 daily -->
+            <fileNamePattern>${log.path}/sys-user.%d{yyyy-MM-dd}.log</fileNamePattern>
+            <!-- 日志最大的历史 60天 -->
+            <maxHistory>60</maxHistory>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${log.pattern}</pattern>
+        </encoder>
+    </appender>
+	
+	<!-- 系统模块日志级别控制  -->
+	<logger name="cn.oleauto" 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>
+	
+	<!--系统用户操作日志-->
+    <logger name="sys-user" level="info">
+        <appender-ref ref="sys-user"/>
+    </logger>
+</configuration> 

+ 21 - 0
gateway/forecast-modbus-tcp/pom.xml

@@ -0,0 +1,21 @@
+<?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">
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>forecast-modbus-tcp</artifactId>
+    <description>modbus tcp模块</description>
+
+    <parent>
+        <artifactId>agvc</artifactId>
+        <groupId>cn.oleauto</groupId>
+        <version>${revision}</version>
+    </parent>
+
+    <dependencies>
+        <dependency>
+        </dependency>
+    </dependencies>
+
+</project>

+ 2 - 0
gateway/pom.xml

@@ -15,5 +15,7 @@
     </parent>
 
     <modules>
+        <module>forecast-iec60870</module>
+		<module>forecast-device-gateway</module>
     </modules>
 </project>