diff --git a/src/main/java/cn/lihongjie/coal/annotation/HyperTable.java b/src/main/java/cn/lihongjie/coal/annotation/HyperTable.java new file mode 100644 index 00000000..d79fa3c4 --- /dev/null +++ b/src/main/java/cn/lihongjie/coal/annotation/HyperTable.java @@ -0,0 +1,17 @@ +package cn.lihongjie.coal.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import java.util.*; + +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.TYPE, ElementType.METHOD}) +public @interface HyperTable { + + String column() default "'time'"; + + String by() default "by_range"; + +} diff --git a/src/main/java/cn/lihongjie/coal/meter/dto/CreateMeterDto.java b/src/main/java/cn/lihongjie/coal/meter/dto/CreateMeterDto.java index a9c47840..2aa9cd6a 100644 --- a/src/main/java/cn/lihongjie/coal/meter/dto/CreateMeterDto.java +++ b/src/main/java/cn/lihongjie/coal/meter/dto/CreateMeterDto.java @@ -11,6 +11,10 @@ public class CreateMeterDto extends OrgCommonDto { @Comment("类型") private String type; + + @Comment("初始值") + private Double initValue; + @Comment("安装位置") private String location; } diff --git a/src/main/java/cn/lihongjie/coal/meter/dto/MeterDto.java b/src/main/java/cn/lihongjie/coal/meter/dto/MeterDto.java index 3b54bc2d..047ffa03 100644 --- a/src/main/java/cn/lihongjie/coal/meter/dto/MeterDto.java +++ b/src/main/java/cn/lihongjie/coal/meter/dto/MeterDto.java @@ -10,7 +10,8 @@ import org.hibernate.annotations.Comment; public class MeterDto extends OrgCommonDto { @Comment("类型") private String type; - + @Comment("初始值") + private Double initValue; private String typeName; @Comment("安装位置") diff --git a/src/main/java/cn/lihongjie/coal/meter/dto/UpdateMeterDto.java b/src/main/java/cn/lihongjie/coal/meter/dto/UpdateMeterDto.java index e77f035b..26a51c42 100644 --- a/src/main/java/cn/lihongjie/coal/meter/dto/UpdateMeterDto.java +++ b/src/main/java/cn/lihongjie/coal/meter/dto/UpdateMeterDto.java @@ -10,7 +10,8 @@ import org.hibernate.annotations.Comment; public class UpdateMeterDto extends OrgCommonDto { @Comment("类型") private String type; - + @Comment("初始值") + private Double initValue; @Comment("安装位置") private String location; } diff --git a/src/main/java/cn/lihongjie/coal/meter/entity/MeterEntity.java b/src/main/java/cn/lihongjie/coal/meter/entity/MeterEntity.java index a854d5a2..04553ef1 100644 --- a/src/main/java/cn/lihongjie/coal/meter/entity/MeterEntity.java +++ b/src/main/java/cn/lihongjie/coal/meter/entity/MeterEntity.java @@ -15,6 +15,10 @@ public class MeterEntity extends OrgCommonEntity { @Comment("类型") private String type; + + @Comment("初始值") + private Double initValue; + @Formula( "(select i.name\n" + "from t_dictionary d,\n" diff --git a/src/main/java/cn/lihongjie/coal/meterLog/entity/MeterLogEntity.java b/src/main/java/cn/lihongjie/coal/meterLog/entity/MeterLogEntity.java index 7f2d2792..114dccf9 100644 --- a/src/main/java/cn/lihongjie/coal/meterLog/entity/MeterLogEntity.java +++ b/src/main/java/cn/lihongjie/coal/meterLog/entity/MeterLogEntity.java @@ -1,16 +1,23 @@ package cn.lihongjie.coal.meterLog.entity; +import cn.lihongjie.coal.annotation.HyperTable; import cn.lihongjie.coal.base.entity.OrgCommonEntity; import jakarta.persistence.Entity; +import jakarta.persistence.Index; import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; import lombok.Data; import org.hibernate.annotations.Comment; +import org.hibernate.annotations.Formula; @Data @Entity +@HyperTable +@Table(indexes = {@Index(columnList = "id")}) + public class MeterLogEntity extends OrgCommonEntity { @ManyToOne private cn.lihongjie.coal.meter.entity.MeterEntity meter; @@ -21,9 +28,8 @@ public class MeterLogEntity extends OrgCommonEntity { @Comment("抄表值") private java.lang.Double value; - @Comment("上次抄表值") + @Formula("( lag(value, 1, (select tm.init_value from t_meter tm where tm.id = meter_id)) over (partition by meter_id order by time asc ) )") private java.lang.Double previousValue; - - @Comment("使用量") + @Formula(" ( value - ( lag(value, 1, (select tm.init_value from t_meter tm where tm.id = meter_id)) over (partition by meter_id order by time asc ) ) )") private java.lang.Double usage; } diff --git a/src/main/java/cn/lihongjie/coal/spring/config/MyPostgreSQLDialect.java b/src/main/java/cn/lihongjie/coal/spring/config/MyPostgreSQLDialect.java index c704b836..4160c81a 100644 --- a/src/main/java/cn/lihongjie/coal/spring/config/MyPostgreSQLDialect.java +++ b/src/main/java/cn/lihongjie/coal/spring/config/MyPostgreSQLDialect.java @@ -1,8 +1,18 @@ package cn.lihongjie.coal.spring.config; +import cn.lihongjie.coal.annotation.HyperTable; + +import org.hibernate.boot.Metadata; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.dialect.PostgreSQLDialect; +import org.hibernate.mapping.PersistentClass; +import org.hibernate.mapping.Table; +import org.hibernate.tool.schema.spi.Exporter; import org.hibernate.type.SqlTypes; +import java.util.Arrays; +import java.util.stream.Collectors; + public class MyPostgreSQLDialect extends PostgreSQLDialect { @Override @@ -23,6 +33,67 @@ public class MyPostgreSQLDialect extends PostgreSQLDialect { return " DROP CONSTRAINT IF EXISTS notexist "; } + @Override + public String getAddPrimaryKeyConstraintString(String constraintName) { + return super.getAddPrimaryKeyConstraintString(constraintName); + } + + @Override + public Exporter