data vo filed changed

hhsung_work
hhsung 10 months ago
parent fbcf495dce
commit a94808b9ca

@ -1,4 +1,5 @@
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using SmartAquaViewer.DataAnalysis;
using System.Collections.Generic; using System.Collections.Generic;
using static Microsoft.EntityFrameworkCore.DbLoggerCategory; using static Microsoft.EntityFrameworkCore.DbLoggerCategory;

@ -1,4 +1,5 @@
using System; using SmartAquaViewer.DataAnalysis;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
@ -64,7 +65,7 @@ namespace SmartAquaViewer.DataAnalisys
// TODO: 라인 파싱 로직 // TODO: 라인 파싱 로직
WaterQualityVO vo = new(); WaterQualityVO vo = new();
//vo.PH = 10.5; //vo.PH = 10.5;
vo.Timestamp = DateTime.Now; vo.RecordedTime = DateTime.Now;
iwaterQuality.OnParsed(vo); iwaterQuality.OnParsed(vo);
db.Add(vo); db.Add(vo);

@ -1,4 +1,5 @@
using System; using SmartAquaViewer.DataAnalysis;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;

@ -1,88 +1,35 @@
using System; using System.ComponentModel.DataAnnotations;
using System.Collections.Generic; using System.ComponentModel.DataAnnotations.Schema;
using System.Linq; using Microsoft.EntityFrameworkCore;
using System.Text;
using System.Threading.Tasks;
namespace SmartAquaViewer.DataAnalisys namespace SmartAquaViewer.DataAnalysis
{ {
[Table("water_quality")]
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using System.Security.Policy;
[Table("WaterQuality")]
public class WaterQualityVO public class WaterQualityVO
{ {
[Key] [Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)] // 자동 증가 [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; } // PK, Auto Increment public int Id { get; set; }
/// <summary> [Column("recorded_time")]
/// 저수조 public DateTime RecordedTime { get; set; }
/// </summary>
public WaterTank WaterTank { get; set; }
/// <summary> public WaterTank Tank { get; set; } = new();
/// 여과 시스템 public FilteringSystem Filtering { get; set; } = new();
/// </summary> public SterilizingSystem Sterilizing { get; set; } = new();
public FilteringSystem FilteringSystem { get; set; }
/// <summary>
/// 살균 시스템
/// </summary>
public SterilizingSystem SterilizingSystem { get; set; }
/// <summary>
/// 측정 시각
/// </summary>
public DateTime Timestamp { get; set; }
public WaterQualityVO() { } public WaterQualityVO() { }
public WaterQualityVO( public WaterQualityVO(DateTime RecordedTime, WaterTank tank, FilteringSystem filtering, SterilizingSystem sterilizing)
int waterTankNum, double waterTankDOValue, double waterTankPh, double waterTankORP, double waterTankTemperature, double waterTankFlowRate,
bool sandFilterPower,
double sumpPH, double sumpORP, double sumpWaterLevel, double sumpFlowRate, double sumpTemperature,
bool circulationPumpPower, string? inverterControllerStatus, double flowRate,
bool heatPumpPower, double heatPumpTemperature, bool airBlowerPower,
bool ozoneGeneratorPower,
string uvSterilizerId, bool uvSterilizerPower,
bool ozoneDissolverPower, double ozoneDissolverPressure,
bool excessOzoneDestroyerPower,
DateTime timestamp)
{ {
WaterTank = new WaterTank(waterTankNum, waterTankDOValue, waterTankPh, waterTankORP, waterTankTemperature, waterTankFlowRate); this.RecordedTime = RecordedTime;
FilteringSystem = new FilteringSystem(sandFilterPower, sumpPH, sumpORP, sumpWaterLevel, sumpFlowRate, sumpTemperature, Tank = tank;
circulationPumpPower, inverterControllerStatus, flowRate, Filtering = filtering;
heatPumpPower, heatPumpTemperature, airBlowerPower); Sterilizing = sterilizing;
SterilizingSystem = new SterilizingSystem(ozoneGeneratorPower, uvSterilizerId, uvSterilizerPower,
ozoneDissolverPower, ozoneDissolverPressure, excessOzoneDestroyerPower);
}
public override string ToString()
{
//return $"Tank#{WaterTankNum} [{Timestamp}] DO: {DO} mg/L, pH: {PH}, Temp: {Temperature}°C, " +
// $"Level: {WaterLevel} m, Flow: {FlowRate} m³/s, EC: {ElectricalConductivity} µS/cm, " +
// $"Turbidity: {Turbidity} NTU, Salinity: {Salinity} ppt, ORP: {ORP} mV, " +
// $"TSS: {TSS} mg/L, TN: {TotalNitrogen} mg/L, TP: {TotalPhosphorus} mg/L";
return $"[{Timestamp}] " +
$"[Tank#{WaterTank.WaterTankNum}, DO: {WaterTank.DO} mg/L, pH: {WaterTank.PH}, ORP: {WaterTank.ORP} mV, Temp: {WaterTank.Temperature}°C, FlowRate: {WaterTank.FlowRate} m³/s]" +
$"[SandFilter: {(FilteringSystem.SandFilterPower ? "ON" : "OFF")}, " +
$"(SumpTank) pH: {FilteringSystem.SumpPH}, ORP: {FilteringSystem.SumpORP} mV, WaterLevel: {FilteringSystem.SumpWaterLevel} m, FlowRate: {FilteringSystem.SumpFlowRate} m³/s, Temperature: {FilteringSystem.SumpTemperature}°C," +
$"HeatPump: {(FilteringSystem.HeatPumpPower ? "ON" : "OFF")}, HeatPumpTemperature: {FilteringSystem.HeatPumpTemperature}°C, AirBlower: {(FilteringSystem.AirBlowerPower ? "ON" : "OFF")}]" +
$"[OzoneGenerator: {(SterilizingSystem.OzoneGeneratorPower ? "ON" : "OFF")}," +
$"UVSterilizerId: {SterilizingSystem.UVSterilizerId}, UVSterilizer: {(SterilizingSystem.UVSterilizerPower ? "ON" : "OFF")}," +
$"OzoneDissolver: {SterilizingSystem.OzoneDissolverPower}, OzoneDissolverPressure: {SterilizingSystem.OzoneDissolverPressure} kPa," +
$"ExcessOzoneDestroyer: {(SterilizingSystem.ExcessOzoneDestroyerPower ? "ON" : "OFF")}]";
} }
/// <summary> /// <summary>
/// 지정 기간 동안 임의의 수질 데이터를 생성합니다. /// 샘플 데이터 리스트 생성
/// </summary> /// </summary>
public static List<WaterQualityVO> GetSampleData(DateTime start, DateTime end, int totalRowsCount) public static List<WaterQualityVO> GetSampleData(DateTime start, DateTime end, int totalRowsCount)
{ {
@ -95,8 +42,7 @@ namespace SmartAquaViewer.DataAnalisys
if (start == end) if (start == end)
{ {
// 같은 날짜면 하루(24시간) 기준으로 균등 분할 totalSeconds = 24 * 60 * 60;
totalSeconds = 24 * 60 * 60; // 86,400초
} }
else else
{ {
@ -110,101 +56,75 @@ namespace SmartAquaViewer.DataAnalisys
{ {
DateTime ts = start.AddSeconds(stepSeconds * i); DateTime ts = start.AddSeconds(stepSeconds * i);
//var vo = new WaterQualityVO
//{
// WaterTankNum = rand.Next(1, 6), // 1~5번 탱크
// DO = Math.Round(rand.NextDouble() * 5 + 5, 2), // 5~10 mg/L
// PH = Math.Round(rand.NextDouble() * 2 + 6, 2), // 6~8
// Temperature = Math.Round(rand.NextDouble() * 10 + 15, 2), // 15~25°C
// WaterLevel = Math.Round(rand.NextDouble() * 2 + 1, 2), // 1~3 m
// FlowRate = Math.Round(rand.NextDouble() * 5 + 1, 2), // 1~6 m³/s
// ElectricalConductivity = Math.Round(rand.NextDouble() * 500 + 200, 2), // 200~700 µS/cm
// Turbidity = Math.Round(rand.NextDouble() * 5 + 1, 2), // 1~6 NTU
// Salinity = Math.Round(rand.NextDouble() * 5, 2), // 0~5 ppt
// ORP = Math.Round(rand.NextDouble() * 200 + 100, 2), // 100~300 mV
// TSS = Math.Round(rand.NextDouble() * 20 + 5, 2), // 5~25 mg/L
// TotalNitrogen = Math.Round(rand.NextDouble() * 2 + 0.5, 2), // 0.5~2.5 mg/L
// TotalPhosphorus = Math.Round(rand.NextDouble() * 0.5 + 0.05, 3), // 0.05~0.55 mg/L
// Timestamp = ts
//};
var vo = new WaterQualityVO var vo = new WaterQualityVO
{ {
WaterTank = new WaterTank( RecordedTime = ts,
waterTankNum: rand.Next(1, 6), // 1~5번 탱크 Tank = new WaterTank(
doValue: Math.Round(rand.NextDouble() * 5 + 5, 2), // 5~10 mg/L number: rand.Next(1, 6),
ph: Math.Round(rand.NextDouble() * 2 + 6, 2), // 6~8 doValue: Math.Round(rand.NextDouble() * 5 + 5, 2),
orp: Math.Round(rand.NextDouble() * 200 + 100, 2), // 100~300 mV ph: Math.Round(rand.NextDouble() * 2 + 6, 2),
temperature: Math.Round(rand.NextDouble() * 10 + 15, 2), // 15~25°C orp: Math.Round(rand.NextDouble() * 200 + 100, 2),
flowRate: Math.Round(rand.NextDouble() * 5 + 1, 2) // 1~6 m³/s temperature: Math.Round(rand.NextDouble() * 10 + 15, 2),
flowRate: Math.Round(rand.NextDouble() * 5 + 1, 2)
), ),
FilteringSystem = new FilteringSystem( Filtering = new FilteringSystem(
sandFilterPower: rand.Next(0, 2) == 1, // true or false sandFilterPower: rand.Next(0, 2) == 1,
sumpPH: Math.Round(rand.NextDouble() * 2 + 6, 2), // 6~8 sumpPH: Math.Round(rand.NextDouble() * 2 + 6, 2),
sumpORP: Math.Round(rand.NextDouble() * 200 + 100, 2), // 100~300 mV sumpORP: Math.Round(rand.NextDouble() * 200 + 100, 2),
sumpWaterLevel: Math.Round(rand.NextDouble() * 2 + 1, 2), // 1~3 m sumpWaterLevel: Math.Round(rand.NextDouble() * 2 + 1, 2),
sumpFlowRate: Math.Round(rand.NextDouble() * 5 + 1, 2), // 1~6 m³/s sumpFlowRate: Math.Round(rand.NextDouble() * 5 + 1, 2),
sumpTemperature: Math.Round(rand.NextDouble() * 10 + 15, 2), // 15~25°C sumpTemperature: Math.Round(rand.NextDouble() * 10 + 15, 2),
circulationPumpPower: rand.Next(0, 2) == 1, // true or false circulationPumpPower: rand.Next(0, 2) == 1,
inverterControllerStatus: rand.Next(0, 2) == 1 ? "Normal" : "Error", // "Normal" or "Error" inverterControllerStatus: rand.Next(0, 2) == 1 ? "Normal" : "Error",
flowRate: Math.Round(rand.NextDouble() * 5 + 1, 2), // 1~6 m³/s flowRate: Math.Round(rand.NextDouble() * 5 + 1, 2),
heatPumpPower: rand.Next(0, 2) == 1, // true or false heatPumpPower: rand.Next(0, 2) == 1,
heatPumpTemperature: Math.Round(rand.NextDouble() * 10 + 15, 2), // 15~25°C heatPumpTemperature: Math.Round(rand.NextDouble() * 10 + 15, 2),
airBlowerPower: rand.Next(0, 2) == 1 // true or false airBlowerPower: rand.Next(0, 2) == 1
), ),
SterilizingSystem = new SterilizingSystem( Sterilizing = new SterilizingSystem(
ozoneGeneratorPower: rand.Next(0, 2) == 1, // true or false ozoneGeneratorPower: rand.Next(0, 2) == 1,
uvSterilizerId: "UV" + rand.Next(1, 100), // UV1, UV2, ... uvSterilizerId: "UV" + rand.Next(1, 100),
uvSterilizerPower: rand.Next(0, 2) == 1, // true or false uvSterilizerPower: rand.Next(0, 2) == 1,
ozoneDissolverPower: rand.Next(0, 2) == 1, // true or false ozoneDissolverPower: rand.Next(0, 2) == 1,
ozoneDissolverPressure: Math.Round(rand.NextDouble() * 100 + 50, 2), // 50~150 kPa ozoneDissolverPressure: Math.Round(rand.NextDouble() * 100 + 50, 2),
excessOzoneDestroyerPower: rand.Next(0, 2) == 1 // true or false excessOzoneDestroyerPower: rand.Next(0, 2) == 1
) )
}; };
list.Add(vo); list.Add(vo);
} }
return list; return list;
} }
} }
[Owned]
public class WaterTank public class WaterTank
{ {
/// <summary> [Column("tank_number")]
/// 저수조 번호 public int Number { get; set; }
/// </summary>
public int WaterTankNum { get; set; }
/// <summary> [Column("tank_do_value")]
/// Dissolved Oxygen (mg/L) public double DOValue { get; set; }
/// </summary>
public double DO { get; set; }
/// <summary> [Column("tank_ph")]
/// pH (산도)
/// </summary>
public double PH { get; set; } public double PH { get; set; }
/// <summary> [Column("tank_orp")]
/// 산화환원전위 (mV)
/// </summary>
public double ORP { get; set; } public double ORP { get; set; }
/// <summary> [Column("tank_temperature")]
/// 수온 (°C)
/// </summary>
public double Temperature { get; set; } public double Temperature { get; set; }
/// <summary> [Column("tank_flow_rate")]
/// 유량 (m³/s)
/// </summary>
public double FlowRate { get; set; } public double FlowRate { get; set; }
public WaterTank(int waterTankNum, double doValue, double ph, double orp, double temperature, double flowRate) public WaterTank() { }
public WaterTank(int number, double doValue, double ph, double orp, double temperature, double flowRate)
{ {
WaterTankNum = waterTankNum; Number = number;
DO = doValue; DOValue = doValue;
PH = ph; PH = ph;
ORP = orp; ORP = orp;
Temperature = temperature; Temperature = temperature;
@ -212,72 +132,50 @@ namespace SmartAquaViewer.DataAnalisys
} }
} }
[Owned]
public class FilteringSystem public class FilteringSystem
{ {
/// <summary> [Column("filter_sand_filter_power")]
/// 모래여과기 전원 (true: ON, false: OFF)
/// </summary>
public bool SandFilterPower { get; set; } public bool SandFilterPower { get; set; }
[Column("filter_sump_ph")]
/// <summary>
/// 섬프탱크 pH (산도)
/// </summary>
public double SumpPH { get; set; } public double SumpPH { get; set; }
/// <summary> [Column("filter_sump_orp")]
/// 섬프탱크 산화환원전위 (mV)
/// </summary>
public double SumpORP { get; set; } public double SumpORP { get; set; }
/// <summary> [Column("filter_sump_water_level")]
/// 섬프탱크 수위 (m)
/// </summary>
public double SumpWaterLevel { get; set; } public double SumpWaterLevel { get; set; }
/// <summary> [Column("filter_sump_flow_rate")]
/// 섬프탱크 유량 (m³/s)
/// </summary>
public double SumpFlowRate { get; set; } public double SumpFlowRate { get; set; }
/// <summary> [Column("filter_sump_temperature")]
/// 섬프탱크 수온 (°C)
/// </summary>
public double SumpTemperature { get; set; } public double SumpTemperature { get; set; }
/// <summary> [Column("filter_circulation_pump_power")]
/// 순환펌프 전원 (true: ON, false: OFF)
/// </summary>
public bool CirculationPumpPower { get; set; } public bool CirculationPumpPower { get; set; }
/// <summary> [Column("filter_inverter_status")]
/// 인버터 제어기 상태
/// </summary>
public string? InverterControllerStatus { get; set; } public string? InverterControllerStatus { get; set; }
/// <summary> [Column("filter_flow_rate")]
/// 순환펌프 유량 (m³/s)
/// </summary>
public double FlowRate { get; set; } public double FlowRate { get; set; }
/// <summary> [Column("filter_heat_pump_power")]
/// 히트펌프 전원 (true: ON, false: OFF)
/// </summary>
public bool HeatPumpPower { get; set; } public bool HeatPumpPower { get; set; }
/// <summary> [Column("filter_heat_pump_temperature")]
/// 히트펌프 온도 (°C)
/// </summary>
public double HeatPumpTemperature { get; set; } public double HeatPumpTemperature { get; set; }
/// <summary> [Column("filter_air_blower_power")]
/// 에어브로와 전원 (true: ON, false: OFF)
/// </summary>
public bool AirBlowerPower { get; set; } public bool AirBlowerPower { get; set; }
public FilteringSystem(bool sandFilterPower, public FilteringSystem() { }
double sumpPH, double sumpORP, double sumpWaterLevel, double sumpFlowRate, double sumpTemperature,
bool circulationPumpPower, string? inverterControllerStatus, double flowRate, public FilteringSystem(
bool sandFilterPower, double sumpPH, double sumpORP, double sumpWaterLevel, double sumpFlowRate, double sumpTemperature,
bool circulationPumpPower, string? inverterControllerStatus, double flowRate,
bool heatPumpPower, double heatPumpTemperature, bool airBlowerPower) bool heatPumpPower, double heatPumpTemperature, bool airBlowerPower)
{ {
SandFilterPower = sandFilterPower; SandFilterPower = sandFilterPower;
@ -295,42 +193,32 @@ namespace SmartAquaViewer.DataAnalisys
} }
} }
[Owned]
public class SterilizingSystem public class SterilizingSystem
{ {
/// <summary> [Column("ster_ozone_generator_power")]
/// 오존 발생기 전원 (true: ON, false: OFF)
/// </summary>
public bool OzoneGeneratorPower { get; set; } public bool OzoneGeneratorPower { get; set; }
/// <summary> [Column("ster_uv_sterilizer_id")]
/// 자외선 살균기 ID public string UVSterilizerId { get; set; } = string.Empty;
/// </summary>
public string UVSterilizerId { get; set; }
/// <summary> [Column("ster_uv_sterilizer_power")]
/// 자외선 살균기 전원 (true: ON, false: OFF)
/// </summary>
public bool UVSterilizerPower { get; set; } public bool UVSterilizerPower { get; set; }
/// <summary> [Column("ster_ozone_dissolver_power")]
/// 오존용해장치 전원 (true: ON, false: OFF)
/// </summary>
public bool OzoneDissolverPower { get; set; } public bool OzoneDissolverPower { get; set; }
/// <summary> [Column("ster_ozone_dissolver_pressure")]
/// 오존용해장치 압력 (kPa)
/// </summary>
public double OzoneDissolverPressure { get; set; } public double OzoneDissolverPressure { get; set; }
/// <summary> [Column("ster_excess_ozone_destroyer_power")]
/// 배오존장치 전원 (true: ON, false: OFF)
/// </summary>
public bool ExcessOzoneDestroyerPower { get; set; } public bool ExcessOzoneDestroyerPower { get; set; }
public SterilizingSystem(bool ozoneGeneratorPower, public SterilizingSystem() { }
string uvSterilizerId, bool uvSterilizerPower,
bool ozoneDissolverPower, double ozoneDissolverPressure, public SterilizingSystem(
bool excessOzoneDestroyerPower) bool ozoneGeneratorPower, string uvSterilizerId, bool uvSterilizerPower,
bool ozoneDissolverPower, double ozoneDissolverPressure, bool excessOzoneDestroyerPower)
{ {
OzoneGeneratorPower = ozoneGeneratorPower; OzoneGeneratorPower = ozoneGeneratorPower;
UVSterilizerId = uvSterilizerId; UVSterilizerId = uvSterilizerId;

@ -8,7 +8,7 @@ using System.Windows.Media;
using System.Windows.Media.Imaging; using System.Windows.Media.Imaging;
using System.Windows.Navigation; using System.Windows.Navigation;
using System.Windows.Shapes; using System.Windows.Shapes;
using SmartAquaViewer.DataAnalisys; using SmartAquaViewer.DataAnalysis;
namespace SmartAquaViewer namespace SmartAquaViewer
{ {

@ -0,0 +1,190 @@
// <auto-generated />
using System;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using SmartAquaViewer.DataAnalisys;
#nullable disable
namespace SmartAquaViewer.Migrations
{
[DbContext(typeof(AppDbContext))]
[Migration("20250812043735_AddWaterQualityTable")]
partial class AddWaterQualityTable
{
/// <inheritdoc />
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("ProductVersion", "8.0.1")
.HasAnnotation("Relational:MaxIdentifierLength", 64);
modelBuilder.Entity("SmartAquaViewer.DataAnalysis.WaterQualityVO", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("int");
b.Property<DateTime>("RecordedTime")
.HasColumnType("datetime(6)")
.HasColumnName("recorded_time");
b.HasKey("Id");
b.ToTable("water_quality");
});
modelBuilder.Entity("SmartAquaViewer.DataAnalysis.WaterQualityVO", b =>
{
b.OwnsOne("SmartAquaViewer.DataAnalysis.FilteringSystem", "Filtering", b1 =>
{
b1.Property<int>("WaterQualityVOId")
.HasColumnType("int");
b1.Property<bool>("AirBlowerPower")
.HasColumnType("tinyint(1)")
.HasColumnName("filter_air_blower_power");
b1.Property<bool>("CirculationPumpPower")
.HasColumnType("tinyint(1)")
.HasColumnName("filter_circulation_pump_power");
b1.Property<double>("FlowRate")
.HasColumnType("double")
.HasColumnName("filter_flow_rate");
b1.Property<bool>("HeatPumpPower")
.HasColumnType("tinyint(1)")
.HasColumnName("filter_heat_pump_power");
b1.Property<double>("HeatPumpTemperature")
.HasColumnType("double")
.HasColumnName("filter_heat_pump_temperature");
b1.Property<string>("InverterControllerStatus")
.HasColumnType("longtext")
.HasColumnName("filter_inverter_status");
b1.Property<bool>("SandFilterPower")
.HasColumnType("tinyint(1)")
.HasColumnName("filter_sand_filter_power");
b1.Property<double>("SumpFlowRate")
.HasColumnType("double")
.HasColumnName("filter_sump_flow_rate");
b1.Property<double>("SumpORP")
.HasColumnType("double")
.HasColumnName("filter_sump_orp");
b1.Property<double>("SumpPH")
.HasColumnType("double")
.HasColumnName("filter_sump_ph");
b1.Property<double>("SumpTemperature")
.HasColumnType("double")
.HasColumnName("filter_sump_temperature");
b1.Property<double>("SumpWaterLevel")
.HasColumnType("double")
.HasColumnName("filter_sump_water_level");
b1.HasKey("WaterQualityVOId");
b1.ToTable("water_quality");
b1.WithOwner()
.HasForeignKey("WaterQualityVOId");
});
b.OwnsOne("SmartAquaViewer.DataAnalysis.SterilizingSystem", "Sterilizing", b1 =>
{
b1.Property<int>("WaterQualityVOId")
.HasColumnType("int");
b1.Property<bool>("ExcessOzoneDestroyerPower")
.HasColumnType("tinyint(1)")
.HasColumnName("ster_excess_ozone_destroyer_power");
b1.Property<bool>("OzoneDissolverPower")
.HasColumnType("tinyint(1)")
.HasColumnName("ster_ozone_dissolver_power");
b1.Property<double>("OzoneDissolverPressure")
.HasColumnType("double")
.HasColumnName("ster_ozone_dissolver_pressure");
b1.Property<bool>("OzoneGeneratorPower")
.HasColumnType("tinyint(1)")
.HasColumnName("ster_ozone_generator_power");
b1.Property<string>("UVSterilizerId")
.IsRequired()
.HasColumnType("longtext")
.HasColumnName("ster_uv_sterilizer_id");
b1.Property<bool>("UVSterilizerPower")
.HasColumnType("tinyint(1)")
.HasColumnName("ster_uv_sterilizer_power");
b1.HasKey("WaterQualityVOId");
b1.ToTable("water_quality");
b1.WithOwner()
.HasForeignKey("WaterQualityVOId");
});
b.OwnsOne("SmartAquaViewer.DataAnalysis.WaterTank", "Tank", b1 =>
{
b1.Property<int>("WaterQualityVOId")
.HasColumnType("int");
b1.Property<double>("DOValue")
.HasColumnType("double")
.HasColumnName("tank_do_value");
b1.Property<double>("FlowRate")
.HasColumnType("double")
.HasColumnName("tank_flow_rate");
b1.Property<int>("Number")
.HasColumnType("int")
.HasColumnName("tank_number");
b1.Property<double>("ORP")
.HasColumnType("double")
.HasColumnName("tank_orp");
b1.Property<double>("PH")
.HasColumnType("double")
.HasColumnName("tank_ph");
b1.Property<double>("Temperature")
.HasColumnType("double")
.HasColumnName("tank_temperature");
b1.HasKey("WaterQualityVOId");
b1.ToTable("water_quality");
b1.WithOwner()
.HasForeignKey("WaterQualityVOId");
});
b.Navigation("Filtering")
.IsRequired();
b.Navigation("Sterilizing")
.IsRequired();
b.Navigation("Tank")
.IsRequired();
});
#pragma warning restore 612, 618
}
}
}

@ -0,0 +1,93 @@
using System;
using Microsoft.EntityFrameworkCore.Metadata;
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace SmartAquaViewer.Migrations
{
/// <inheritdoc />
public partial class AddWaterQualityTable : Migration
{
/// <inheritdoc />
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "WaterQuality");
migrationBuilder.CreateTable(
name: "water_quality",
columns: table => new
{
Id = table.Column<int>(type: "int", nullable: false)
.Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn),
recorded_time = table.Column<DateTime>(type: "datetime(6)", nullable: false),
tank_number = table.Column<int>(type: "int", nullable: false),
tank_do_value = table.Column<double>(type: "double", nullable: false),
tank_ph = table.Column<double>(type: "double", nullable: false),
tank_orp = table.Column<double>(type: "double", nullable: false),
tank_temperature = table.Column<double>(type: "double", nullable: false),
tank_flow_rate = table.Column<double>(type: "double", nullable: false),
filter_sand_filter_power = table.Column<bool>(type: "tinyint(1)", nullable: false),
filter_sump_ph = table.Column<double>(type: "double", nullable: false),
filter_sump_orp = table.Column<double>(type: "double", nullable: false),
filter_sump_water_level = table.Column<double>(type: "double", nullable: false),
filter_sump_flow_rate = table.Column<double>(type: "double", nullable: false),
filter_sump_temperature = table.Column<double>(type: "double", nullable: false),
filter_circulation_pump_power = table.Column<bool>(type: "tinyint(1)", nullable: false),
filter_inverter_status = table.Column<string>(type: "longtext", nullable: true)
.Annotation("MySql:CharSet", "utf8mb4"),
filter_flow_rate = table.Column<double>(type: "double", nullable: false),
filter_heat_pump_power = table.Column<bool>(type: "tinyint(1)", nullable: false),
filter_heat_pump_temperature = table.Column<double>(type: "double", nullable: false),
filter_air_blower_power = table.Column<bool>(type: "tinyint(1)", nullable: false),
ster_ozone_generator_power = table.Column<bool>(type: "tinyint(1)", nullable: false),
ster_uv_sterilizer_id = table.Column<string>(type: "longtext", nullable: false)
.Annotation("MySql:CharSet", "utf8mb4"),
ster_uv_sterilizer_power = table.Column<bool>(type: "tinyint(1)", nullable: false),
ster_ozone_dissolver_power = table.Column<bool>(type: "tinyint(1)", nullable: false),
ster_ozone_dissolver_pressure = table.Column<double>(type: "double", nullable: false),
ster_excess_ozone_destroyer_power = table.Column<bool>(type: "tinyint(1)", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_water_quality", x => x.Id);
})
.Annotation("MySql:CharSet", "utf8mb4");
}
/// <inheritdoc />
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "water_quality");
migrationBuilder.CreateTable(
name: "WaterQuality",
columns: table => new
{
Id = table.Column<int>(type: "int", nullable: false)
.Annotation("MySql:ValueGenerationStrategy", MySqlValueGenerationStrategy.IdentityColumn),
DO = table.Column<double>(type: "double", nullable: false),
ElectricalConductivity = table.Column<double>(type: "double", nullable: false),
FlowRate = table.Column<double>(type: "double", nullable: false),
ORP = table.Column<double>(type: "double", nullable: false),
PH = table.Column<double>(type: "double", nullable: false),
Salinity = table.Column<double>(type: "double", nullable: false),
TSS = table.Column<double>(type: "double", nullable: false),
Temperature = table.Column<double>(type: "double", nullable: false),
Timestamp = table.Column<DateTime>(type: "datetime(6)", nullable: false),
TotalNitrogen = table.Column<double>(type: "double", nullable: false),
TotalPhosphorus = table.Column<double>(type: "double", nullable: false),
Turbidity = table.Column<double>(type: "double", nullable: false),
WaterLevel = table.Column<double>(type: "double", nullable: false),
WaterTankNum = table.Column<int>(type: "int", nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_WaterQuality", x => x.Id);
})
.Annotation("MySql:CharSet", "utf8mb4");
}
}
}

@ -19,57 +19,167 @@ namespace SmartAquaViewer.Migrations
.HasAnnotation("ProductVersion", "8.0.1") .HasAnnotation("ProductVersion", "8.0.1")
.HasAnnotation("Relational:MaxIdentifierLength", 64); .HasAnnotation("Relational:MaxIdentifierLength", 64);
modelBuilder.Entity("SmartAquaViewer.DataAnalisys.WaterQualityVO", b => modelBuilder.Entity("SmartAquaViewer.DataAnalysis.WaterQualityVO", b =>
{ {
b.Property<int>("Id") b.Property<int>("Id")
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
.HasColumnType("int"); .HasColumnType("int");
b.Property<double>("DO") b.Property<DateTime>("RecordedTime")
.HasColumnType("double"); .HasColumnType("datetime(6)")
.HasColumnName("recorded_time");
b.Property<double>("ElectricalConductivity") b.HasKey("Id");
.HasColumnType("double");
b.Property<double>("FlowRate") b.ToTable("water_quality");
.HasColumnType("double"); });
b.Property<double>("ORP") modelBuilder.Entity("SmartAquaViewer.DataAnalysis.WaterQualityVO", b =>
.HasColumnType("double"); {
b.OwnsOne("SmartAquaViewer.DataAnalysis.FilteringSystem", "Filtering", b1 =>
{
b1.Property<int>("WaterQualityVOId")
.HasColumnType("int");
b.Property<double>("PH") b1.Property<bool>("AirBlowerPower")
.HasColumnType("double"); .HasColumnType("tinyint(1)")
.HasColumnName("filter_air_blower_power");
b.Property<double>("Salinity") b1.Property<bool>("CirculationPumpPower")
.HasColumnType("double"); .HasColumnType("tinyint(1)")
.HasColumnName("filter_circulation_pump_power");
b.Property<double>("TSS") b1.Property<double>("FlowRate")
.HasColumnType("double"); .HasColumnType("double")
.HasColumnName("filter_flow_rate");
b.Property<double>("Temperature") b1.Property<bool>("HeatPumpPower")
.HasColumnType("double"); .HasColumnType("tinyint(1)")
.HasColumnName("filter_heat_pump_power");
b.Property<DateTime>("Timestamp") b1.Property<double>("HeatPumpTemperature")
.HasColumnType("datetime(6)"); .HasColumnType("double")
.HasColumnName("filter_heat_pump_temperature");
b.Property<double>("TotalNitrogen") b1.Property<string>("InverterControllerStatus")
.HasColumnType("double"); .HasColumnType("longtext")
.HasColumnName("filter_inverter_status");
b.Property<double>("TotalPhosphorus") b1.Property<bool>("SandFilterPower")
.HasColumnType("double"); .HasColumnType("tinyint(1)")
.HasColumnName("filter_sand_filter_power");
b.Property<double>("Turbidity") b1.Property<double>("SumpFlowRate")
.HasColumnType("double"); .HasColumnType("double")
.HasColumnName("filter_sump_flow_rate");
b.Property<double>("WaterLevel") b1.Property<double>("SumpORP")
.HasColumnType("double"); .HasColumnType("double")
.HasColumnName("filter_sump_orp");
b.Property<int>("WaterTankNum") b1.Property<double>("SumpPH")
.HasColumnType("int"); .HasColumnType("double")
.HasColumnName("filter_sump_ph");
b.HasKey("Id"); b1.Property<double>("SumpTemperature")
.HasColumnType("double")
.HasColumnName("filter_sump_temperature");
b1.Property<double>("SumpWaterLevel")
.HasColumnType("double")
.HasColumnName("filter_sump_water_level");
b1.HasKey("WaterQualityVOId");
b1.ToTable("water_quality");
b1.WithOwner()
.HasForeignKey("WaterQualityVOId");
});
b.OwnsOne("SmartAquaViewer.DataAnalysis.SterilizingSystem", "Sterilizing", b1 =>
{
b1.Property<int>("WaterQualityVOId")
.HasColumnType("int");
b1.Property<bool>("ExcessOzoneDestroyerPower")
.HasColumnType("tinyint(1)")
.HasColumnName("ster_excess_ozone_destroyer_power");
b1.Property<bool>("OzoneDissolverPower")
.HasColumnType("tinyint(1)")
.HasColumnName("ster_ozone_dissolver_power");
b1.Property<double>("OzoneDissolverPressure")
.HasColumnType("double")
.HasColumnName("ster_ozone_dissolver_pressure");
b1.Property<bool>("OzoneGeneratorPower")
.HasColumnType("tinyint(1)")
.HasColumnName("ster_ozone_generator_power");
b1.Property<string>("UVSterilizerId")
.IsRequired()
.HasColumnType("longtext")
.HasColumnName("ster_uv_sterilizer_id");
b1.Property<bool>("UVSterilizerPower")
.HasColumnType("tinyint(1)")
.HasColumnName("ster_uv_sterilizer_power");
b1.HasKey("WaterQualityVOId");
b1.ToTable("water_quality");
b1.WithOwner()
.HasForeignKey("WaterQualityVOId");
});
b.OwnsOne("SmartAquaViewer.DataAnalysis.WaterTank", "Tank", b1 =>
{
b1.Property<int>("WaterQualityVOId")
.HasColumnType("int");
b1.Property<double>("DOValue")
.HasColumnType("double")
.HasColumnName("tank_do_value");
b1.Property<double>("FlowRate")
.HasColumnType("double")
.HasColumnName("tank_flow_rate");
b1.Property<int>("Number")
.HasColumnType("int")
.HasColumnName("tank_number");
b1.Property<double>("ORP")
.HasColumnType("double")
.HasColumnName("tank_orp");
b1.Property<double>("PH")
.HasColumnType("double")
.HasColumnName("tank_ph");
b1.Property<double>("Temperature")
.HasColumnType("double")
.HasColumnName("tank_temperature");
b1.HasKey("WaterQualityVOId");
b1.ToTable("water_quality");
b1.WithOwner()
.HasForeignKey("WaterQualityVOId");
});
b.Navigation("Filtering")
.IsRequired();
b.Navigation("Sterilizing")
.IsRequired();
b.ToTable("WaterQuality"); b.Navigation("Tank")
.IsRequired();
}); });
#pragma warning restore 612, 618 #pragma warning restore 612, 618
} }

Loading…
Cancel
Save