|
|
|
|
@ -0,0 +1,172 @@
|
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using System.Text;
|
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
|
|
|
|
|
namespace SmartAquaViewer.DataAnalisys
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
using System;
|
|
|
|
|
|
|
|
|
|
public class WaterQualityVO
|
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 저수조 번호
|
|
|
|
|
/// </summary>
|
|
|
|
|
public int WaterTankNum { get; set; }
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Dissolved Oxygen (mg/L)
|
|
|
|
|
/// </summary>
|
|
|
|
|
public double DO { get; set; }
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// pH (산도)
|
|
|
|
|
/// </summary>
|
|
|
|
|
public double PH { get; set; }
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 수온 (°C)
|
|
|
|
|
/// </summary>
|
|
|
|
|
public double Temperature { get; set; }
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 수위 (m)
|
|
|
|
|
/// </summary>
|
|
|
|
|
public double WaterLevel { get; set; }
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 유량 (m³/s)
|
|
|
|
|
/// </summary>
|
|
|
|
|
public double FlowRate { get; set; }
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 전기전도도 (µS/cm)
|
|
|
|
|
/// </summary>
|
|
|
|
|
public double ElectricalConductivity { get; set; }
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 탁도 (NTU)
|
|
|
|
|
/// </summary>
|
|
|
|
|
public double Turbidity { get; set; }
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 염도 (ppt)
|
|
|
|
|
/// </summary>
|
|
|
|
|
public double Salinity { get; set; }
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 산화환원전위 (mV)
|
|
|
|
|
/// </summary>
|
|
|
|
|
public double ORP { get; set; }
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 총부유물질 (mg/L)
|
|
|
|
|
/// </summary>
|
|
|
|
|
public double TSS { get; set; }
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 총질소 (mg/L)
|
|
|
|
|
/// </summary>
|
|
|
|
|
public double TotalNitrogen { get; set; }
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 총인 (mg/L)
|
|
|
|
|
/// </summary>
|
|
|
|
|
public double TotalPhosphorus { get; set; }
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 측정 시각
|
|
|
|
|
/// </summary>
|
|
|
|
|
public DateTime Timestamp { get; set; }
|
|
|
|
|
|
|
|
|
|
public WaterQualityVO() { }
|
|
|
|
|
|
|
|
|
|
public WaterQualityVO(int waterTankNum, double doValue, double ph, double temperature, double waterLevel, double flowRate,
|
|
|
|
|
double electricalConductivity, double turbidity, double salinity, double orp,
|
|
|
|
|
double tss, double totalNitrogen, double totalPhosphorus, DateTime timestamp)
|
|
|
|
|
{
|
|
|
|
|
WaterTankNum = waterTankNum;
|
|
|
|
|
DO = doValue;
|
|
|
|
|
PH = ph;
|
|
|
|
|
Temperature = temperature;
|
|
|
|
|
WaterLevel = waterLevel;
|
|
|
|
|
FlowRate = flowRate;
|
|
|
|
|
ElectricalConductivity = electricalConductivity;
|
|
|
|
|
Turbidity = turbidity;
|
|
|
|
|
Salinity = salinity;
|
|
|
|
|
ORP = orp;
|
|
|
|
|
TSS = tss;
|
|
|
|
|
TotalNitrogen = totalNitrogen;
|
|
|
|
|
TotalPhosphorus = totalPhosphorus;
|
|
|
|
|
Timestamp = timestamp;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 지정 기간 동안 임의의 수질 데이터를 생성합니다.
|
|
|
|
|
/// </summary>
|
|
|
|
|
public static List<WaterQualityVO> GetSampleData(DateTime start, DateTime end, int totalRowsCount)
|
|
|
|
|
{
|
|
|
|
|
var list = new List<WaterQualityVO>();
|
|
|
|
|
var rand = new Random();
|
|
|
|
|
|
|
|
|
|
if (totalRowsCount <= 0) return list;
|
|
|
|
|
|
|
|
|
|
double totalSeconds;
|
|
|
|
|
|
|
|
|
|
if (start == end)
|
|
|
|
|
{
|
|
|
|
|
// 같은 날짜면 하루(24시간) 기준으로 균등 분할
|
|
|
|
|
totalSeconds = 24 * 60 * 60; // 86,400초
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
totalSeconds = (end - start).TotalSeconds;
|
|
|
|
|
if (totalSeconds < 0) throw new ArgumentException("end 날짜는 start 날짜보다 같거나 커야 합니다.");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
double stepSeconds = totalSeconds / totalRowsCount;
|
|
|
|
|
|
|
|
|
|
for (int i = 0; i < totalRowsCount; 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
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
list.Add(vo);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return list;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|