feat: 수조 DataGrid 표시

hhsung_work
HyungJune Kim 10 months ago
parent b61a0024fc
commit 92800c3171

@ -72,7 +72,7 @@ namespace SmartAquaViewer.DataAnalysis
{ {
RecordedTime = ts, RecordedTime = ts,
Tank = new WaterTank( Tank = new WaterTank(
number: rand.Next(1, 6), number: rand.Next(1, 4),
doValue: Math.Round(rand.NextDouble() * 5 + 5, 2), doValue: Math.Round(rand.NextDouble() * 5 + 5, 2),
ph: Math.Round(rand.NextDouble() * 2 + 6, 2), ph: Math.Round(rand.NextDouble() * 2 + 6, 2),
orp: Math.Round(rand.NextDouble() * 200 + 100, 2), orp: Math.Round(rand.NextDouble() * 200 + 100, 2),

@ -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;
using SmartAquaViewer.Model; using SmartAquaViewer.Model;
namespace SmartAquaViewer namespace SmartAquaViewer
@ -27,8 +27,7 @@ namespace SmartAquaViewer
private void MainWindow_Loaded(object sender, RoutedEventArgs e) private void MainWindow_Loaded(object sender, RoutedEventArgs e)
{ {
var sampleData = WaterQualityVO.GetSampleData(new DateTime(2025, 8, 1), new DateTime(2025, 8, 5), 10);
Datas.SetWaterQualityVO(sampleData);
} }
} }
} }

@ -3,7 +3,7 @@ using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using SmartAquaViewer.DataAnalisys; using SmartAquaViewer.DataAnalysis;
namespace SmartAquaViewer.Model namespace SmartAquaViewer.Model
{ {

@ -49,7 +49,7 @@
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference> </PackageReference>
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" /> <PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="8.0.3" /> <PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="9.0.0-rc.1.efcore.9.0.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

@ -24,9 +24,52 @@
SelectedValue="{Binding CurrentSystem, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> SelectedValue="{Binding CurrentSystem, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
</Grid> </Grid>
<StackPanel Grid.Row="1" Orientation="Horizontal" Margin="20 20 20 40"> <ScrollViewer Grid.Row="1" Margin="20 20 20 40"
HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"
HorizontalAlignment="Center">
<ItemsControl ItemsSource="{Binding TankGroups}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</StackPanel> <ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Margin="25 0" HorizontalAlignment="Center" >
<!-- 그룹 헤더: 수조 번호 -->
<TextBlock Text="{Binding Key, StringFormat=수조 {0}}"
FontSize="20" FontWeight="Bold" Foreground="White"
Margin="0 0 0 10"/>
<!-- Value(= ObservableCollection<WaterQualityVO>)로 DataGrid -->
<DataGrid ItemsSource="{Binding Value}"
AutoGenerateColumns="False"
CanUserAddRows="False"
IsReadOnly="True"
HeadersVisibility="Column"
IsHitTestVisible="True">
<DataGrid.Columns>
<!-- 측정 시각 -->
<DataGridTextColumn
Header="시간"
Binding="{Binding RecordedTime, StringFormat=\{0:yyyy-MM-dd HH:mm:ss\}}"/>
<!-- Tank 값들 -->
<DataGridTextColumn Header="수조" Binding="{Binding Tank.Number}"/>
<DataGridTextColumn Header="DO" Binding="{Binding Tank.DO, StringFormat=\{0:F2\}}"/>
<DataGridTextColumn Header="pH" Binding="{Binding Tank.PH, StringFormat=\{0:F2\}}"/>
<DataGridTextColumn Header="ORP" Binding="{Binding Tank.ORP, StringFormat=\{0:F0\}}"/>
<DataGridTextColumn Header="온도(℃)" Binding="{Binding Tank.Temperature, StringFormat=\{0:F1\}}"/>
<DataGridTextColumn Header="유량(m³/s)" Binding="{Binding Tank.FlowRate, StringFormat=\{0:F2\}}"/>
</DataGrid.Columns>
</DataGrid>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</ScrollViewer>
<Grid Grid.Row="1" VerticalAlignment="Bottom"> <Grid Grid.Row="1" VerticalAlignment="Bottom">
<Button Name="btnVisibilityDown" Tag="down" <Button Name="btnVisibilityDown" Tag="down"

@ -12,7 +12,9 @@ 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 Newtonsoft.Json.Linq;
using SmartAquaViewer.Classes; using SmartAquaViewer.Classes;
using SmartAquaViewer.DataAnalysis;
using SmartAquaViewer.Model; using SmartAquaViewer.Model;
using SmartAquaViewer.ViewModel; using SmartAquaViewer.ViewModel;
using static SmartAquaViewer.Model.Enums; using static SmartAquaViewer.Model.Enums;
@ -29,6 +31,12 @@ namespace SmartAquaViewer.View
public MonitoringView() public MonitoringView()
{ {
InitializeComponent(); InitializeComponent();
Loaded += MonitoringView_Loaded;
}
private void MonitoringView_Loaded(object sender, RoutedEventArgs e)
{
monitoringViewModel = this.DataContext as MonitoringViewModel; monitoringViewModel = this.DataContext as MonitoringViewModel;
monitoringViewModel.OnSystemChanged += MonitoringViewModel_OnSystemChanged; monitoringViewModel.OnSystemChanged += MonitoringViewModel_OnSystemChanged;
} }
@ -38,7 +46,7 @@ namespace SmartAquaViewer.View
switch (systemName) switch (systemName)
{ {
case "Tank": case "Tank":
//SetTankData();
break; break;
case "Filter": case "Filter":
@ -52,28 +60,28 @@ namespace SmartAquaViewer.View
} }
} }
private void GetTankData() private void SetTankData()
{ {
//var waterTanksGroup = Datas.GetWaterQualityVO().GroupBy(w => w.WaterTank.WaterTankNum); var waterTanksGroup = Datas.GetWaterQualityVO().GroupBy(w => w.Tank.Number);
//foreach (var group in waterTanksGroup) foreach (var group in waterTanksGroup)
//{ {
// DataGrid dataGrid = new DataGrid(); DataGrid dataGrid = new DataGrid();
// group.ToList() var waterQualityList = group.ToList();
// DataGridAutoBuilder.BuildColumnsFromType(dataGrid, group, new Dictionary<string, string> DataGridAutoBuilder.BuildColumnsFromType(dataGrid, waterQualityList, new Dictionary<string, string>
// { {
// { nameof(DataAnalisys.WaterQualityVO.Timestamp), "시간" }, { nameof(WaterQualityVO.RecordedTime), "시간" },
// { nameof(DataAnalisys.WaterTank.DO), "DO센서 (mg/L)" }, { nameof(WaterQualityVO.Tank.DOValue), "DO센서 (mg/L)" },
// { nameof(DataAnalisys.WaterTank.PH), "pH센서" }, { nameof(WaterQualityVO.Tank.PH), "pH센서" },
// { nameof(DataAnalisys.WaterTank.ORP), "ORP센서 (mV)" }, { nameof(WaterQualityVO.Tank.ORP), "ORP센서 (mV)" },
// { nameof(DataAnalisys.WaterTank.Temperature), "수온 (°C)" }, { nameof(WaterQualityVO.Tank.Temperature), "수온 (°C)" },
// { nameof(DataAnalisys.WaterTank.FlowRate), "유량 (m³/s)"} { nameof(WaterQualityVO.Tank.FlowRate), "유량 (m³/s)"}
// }); }, "HH:mm:ss");
//}
//spDataGrid.Children.Add(dataGrid);
}
} }
} }
} }

@ -7,6 +7,8 @@ using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using System.Windows.Input; using System.Windows.Input;
using SmartAquaViewer.Controls; using SmartAquaViewer.Controls;
using SmartAquaViewer.DataAnalysis;
using SmartAquaViewer.Model;
namespace SmartAquaViewer.ViewModel namespace SmartAquaViewer.ViewModel
{ {

@ -10,6 +10,8 @@ using System.Threading.Tasks;
using System.Windows; using System.Windows;
using System.Windows.Input; using System.Windows.Input;
using SmartAquaViewer.Controls; using SmartAquaViewer.Controls;
using SmartAquaViewer.DataAnalysis;
using SmartAquaViewer.Model;
namespace SmartAquaViewer.ViewModel namespace SmartAquaViewer.ViewModel
{ {
@ -20,6 +22,10 @@ namespace SmartAquaViewer.ViewModel
public ObservableCollection<string> GraphTypes { get; } public ObservableCollection<string> GraphTypes { get; }
public List<WaterQualityVO> WaterQualityList { get; }
public Dictionary<int, ObservableCollection<WaterQualityVO>> TankGroups { get; }
private string _selectedGraphType; private string _selectedGraphType;
public string SelectedGraphType public string SelectedGraphType
{ {
@ -105,6 +111,17 @@ namespace SmartAquaViewer.ViewModel
IsOpenMode = true; IsOpenMode = true;
BtnVisibilityUp = Visibility.Collapsed; BtnVisibilityUp = Visibility.Collapsed;
WaterQualityList = WaterQualityVO.GetSampleData(new DateTime(2025, 8, 1), new DateTime(2025, 8, 1), 10);
Datas.SetWaterQualityVO(WaterQualityList);
TankGroups = WaterQualityList
.GroupBy(x => x.Tank.Number) // 또는 x.Tank.Num
.OrderBy(g => g.Key)
.ToDictionary(
g => g.Key,
g => new ObservableCollection<WaterQualityVO>(
g.OrderBy(r => r.RecordedTime))
);
GraphTypes = new ObservableCollection<string>(); GraphTypes = new ObservableCollection<string>();
CurrentSystem = "Tank"; // Default system CurrentSystem = "Tank"; // Default system
SetGraphType(); SetGraphType();

Loading…
Cancel
Save