From ff47302010e8a44523e9ff517097f1f619147500 Mon Sep 17 00:00:00 2001 From: MoYue Date: Mon, 22 Apr 2024 18:19:09 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E9=98=BF=E9=87=8C=E5=B7=B4?= =?UTF-8?q?=E5=B7=B4=E7=9F=A2=E9=87=8F=E5=9B=BE=E6=A0=87=E5=BA=93=E5=8F=8A?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E4=B8=AD=E5=BF=83=E5=B8=83=E5=B1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- InSituLaboratory.Assets/Fonts/iconfont1.ttf | Bin 0 -> 13408 bytes .../InSituLaboratory.Assets.csproj | 4 + InSituLaboratory.Base/StateBackConvert.cs | 51 ++++ .../ISysStatusService.cs | 15 ++ InSituLaboratory.Service/SysStatusService.cs | 27 ++ InSituLaboratory/App.xaml | 1 + InSituLaboratory/App.xaml.cs | 1 + InSituLaboratory/InSituLaboratory.csproj | 1 + .../ViewModels/Pages/DashboardViewModel.cs | 66 ++++- .../Views/Pages/DashboardView.xaml | 233 +++++++++++++++--- 10 files changed, 363 insertions(+), 36 deletions(-) create mode 100644 InSituLaboratory.Assets/Fonts/iconfont1.ttf create mode 100644 InSituLaboratory.Base/StateBackConvert.cs create mode 100644 InSituLaboratory.IService/ISysStatusService.cs create mode 100644 InSituLaboratory.Service/SysStatusService.cs diff --git a/InSituLaboratory.Assets/Fonts/iconfont1.ttf b/InSituLaboratory.Assets/Fonts/iconfont1.ttf new file mode 100644 index 0000000000000000000000000000000000000000..e9127bb762176fe9359d2a32f0d6abad81e113b8 GIT binary patch literal 13408 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 literal 0 HcmV?d00001 diff --git a/InSituLaboratory.Assets/InSituLaboratory.Assets.csproj b/InSituLaboratory.Assets/InSituLaboratory.Assets.csproj index f5bde88..3ff2e32 100644 --- a/InSituLaboratory.Assets/InSituLaboratory.Assets.csproj +++ b/InSituLaboratory.Assets/InSituLaboratory.Assets.csproj @@ -9,6 +9,7 @@ + @@ -28,6 +29,9 @@ + + Always + Always diff --git a/InSituLaboratory.Base/StateBackConvert.cs b/InSituLaboratory.Base/StateBackConvert.cs new file mode 100644 index 0000000..573f842 --- /dev/null +++ b/InSituLaboratory.Base/StateBackConvert.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Data; +using System.Windows.Media; + +namespace InSituLaboratory.Base +{ + /// + /// 告警类别转换器 + /// + public class StateBackConvert : IValueConverter + { + public static object ConvertObject; + + object IValueConverter.Convert(object value, Type targetType, object parameter, CultureInfo culture) + { + Brush background = null; + if ((string)value == "正常") + { + //绿色 + background = new SolidColorBrush(Color.FromRgb(0, 255, 0)); + } + else if ((string)value == "一级报警") + { + //黄色 + background = new SolidColorBrush(Color.FromRgb(255, 255, 0)); + } + else if ((string)value == "二级报警") + { + //橙色 + background = new SolidColorBrush(Color.FromRgb(255, 128, 0)); + } + else if ((string)value == "故障") + { + //红色 + background = new SolidColorBrush(Color.FromRgb(255, 0, 0)); + } + + return background; + } + + object IValueConverter.ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) + { + throw new NotImplementedException(); + } + } +} diff --git a/InSituLaboratory.IService/ISysStatusService.cs b/InSituLaboratory.IService/ISysStatusService.cs new file mode 100644 index 0000000..023eeeb --- /dev/null +++ b/InSituLaboratory.IService/ISysStatusService.cs @@ -0,0 +1,15 @@ +using InSituLaboratory.Entities; +using InSituLaboratory.Entities.ExperimentalStationEntities; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace InSituLaboratory.IService +{ + public interface ISysStatusService : IBaseService + { + IEnumerable GetSysStauts(); + } +} diff --git a/InSituLaboratory.Service/SysStatusService.cs b/InSituLaboratory.Service/SysStatusService.cs new file mode 100644 index 0000000..1b1591a --- /dev/null +++ b/InSituLaboratory.Service/SysStatusService.cs @@ -0,0 +1,27 @@ +using InSituLaboratory.Entities; +using InSituLaboratory.Entities.ExperimentalStationEntities; +using InSituLaboratory.IService; +using Microsoft.EntityFrameworkCore; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace InSituLaboratory.Service +{ + public class SysStatusService : BaseService, ISysStatusService + { + public SysStatusService(DbContext context) : base(context) { } + + + + public IEnumerable GetSysStauts() + { + return this.Set().OrderByDescending(n => n.CreateTime); + + } + + + } +} diff --git a/InSituLaboratory/App.xaml b/InSituLaboratory/App.xaml index 5beddc0..48b38f8 100644 --- a/InSituLaboratory/App.xaml +++ b/InSituLaboratory/App.xaml @@ -18,6 +18,7 @@ /InSituLaboratory.Assets;component/Fonts/iconfont.ttf#zx_icons + /InSituLaboratory.Assets;component/Fonts/iconfont1.ttf#iconfont /InSituLaboratory.Assets;component/Fonts/#方正楷体简体 diff --git a/InSituLaboratory/App.xaml.cs b/InSituLaboratory/App.xaml.cs index 0b13a01..dffcf00 100644 --- a/InSituLaboratory/App.xaml.cs +++ b/InSituLaboratory/App.xaml.cs @@ -53,6 +53,7 @@ namespace InSituLaboratory containerRegistry.Register(); containerRegistry.Register(); containerRegistry.Register(); + containerRegistry.Register(); containerRegistry.RegisterForNavigation(); diff --git a/InSituLaboratory/InSituLaboratory.csproj b/InSituLaboratory/InSituLaboratory.csproj index 07cb791..17f7937 100644 --- a/InSituLaboratory/InSituLaboratory.csproj +++ b/InSituLaboratory/InSituLaboratory.csproj @@ -15,6 +15,7 @@ + diff --git a/InSituLaboratory/ViewModels/Pages/DashboardViewModel.cs b/InSituLaboratory/ViewModels/Pages/DashboardViewModel.cs index 517e19e..eeac408 100644 --- a/InSituLaboratory/ViewModels/Pages/DashboardViewModel.cs +++ b/InSituLaboratory/ViewModels/Pages/DashboardViewModel.cs @@ -9,20 +9,80 @@ using System.Text; using System.Threading.Tasks; using InSituLaboratory.Models; using InSituLaboratory.Entities.ExperimentalStationEntities; +using Prism.Regions; +using InSituLaboratory.IService; namespace InSituLaboratory.ViewModels.Pages { public class DashboardViewModel : ViewModelBase { - public ObservableCollection SysStatusList { get; set; } = new ObservableCollection(); + #region 实体类 + /// + /// 组包时间 + /// + private DateTime? _packagingTime; + public DateTime? PackagingTime + { + get { return _packagingTime; } + set { SetProperty(ref _packagingTime, value); } + } - public DashboardViewModel() : base(null) + /// + /// 采样时间 + /// + private DateTime? _samplingTime; + public DateTime? SamplingTime + { + get { return _samplingTime; } + set { SetProperty(ref _samplingTime, value); } + } + + /// + /// 48V 电压 + /// + private float? _voltage48; + public float? Voltage48 + { + get { return _voltage48; } + set { SetProperty(ref _voltage48, value); } + } + + /// + /// 48V 电流 + /// + private float? _current48; + public float? Current48 + { + get { return _current48; } + set { SetProperty(ref _current48, value); } + } + + + + #endregion + + ISysStatusService _sysStatusService; + public DashboardViewModel(IRegionManager regionManager, ISysStatusService isysStatusService) : base(regionManager) { PageTitle = "数据中心"; IsCanClose = false; + _sysStatusService = isysStatusService; - + this.Refresh(); + } + public override void Refresh() + { + var sysStatuslist = _sysStatusService.GetSysStauts().ToList(); + if (sysStatuslist.Count() != 0) + { + var data = _sysStatusService.GetSysStauts().First(); + + PackagingTime = data.PackagingTime; + SamplingTime = data.SamplingTime; + Voltage48 = data.Voltage48; + Current48 = data.Current48; + } } } } diff --git a/InSituLaboratory/Views/Pages/DashboardView.xaml b/InSituLaboratory/Views/Pages/DashboardView.xaml index 8daa235..a4216a9 100644 --- a/InSituLaboratory/Views/Pages/DashboardView.xaml +++ b/InSituLaboratory/Views/Pages/DashboardView.xaml @@ -4,50 +4,217 @@ xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:InSituLaboratory.Views.Pages" + xmlns:converters="clr-namespace:InSituLaboratory.Base;assembly=InSituLaboratory.Base" mc:Ignorable="d" FontFamily="{StaticResource DigitalDisplay}" d:DesignHeight="450" d:DesignWidth="800"> + + + + + - - - - - + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - + - + + + + + + - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +