using OxyPlot; using OxyPlot.Axes; using OxyPlot.Legends; using OxyPlot.Series; using Prism.Commands; using Prism.Ioc; using Prism.Mvvm; using System; using System.Collections.Generic; using System.Linq; using System.Windows.Documents; using TeamAAS_VP.Core; using TeamAAS_VP.Data; using TeamAAS_VP.Models; using TeamAAS_VP.Resources.Languages; using static MaterialDesignThemes.Wpf.Theme.ToolBar; namespace TeamAAS_VP.ViewModels.Statistics { public class ProductionStatementViewModel : BindableBase { IContainerProvider _container; Management management; #region 属性 private Int64 _TotalCount; /// /// 总产能 /// public Int64 TotalCount { get { return _TotalCount; } set { SetProperty(ref _TotalCount,value); } } private Int64 _MonthCount; /// /// 月产能 /// public Int64 MonthCount { get { return _MonthCount; } set { SetProperty(ref _MonthCount, value); } } private Int64 _WeekCount; /// /// 周产能 /// public Int64 WeekCount { get { return _WeekCount; } set { SetProperty(ref _WeekCount, value); } } private Int64 _DayCount; /// /// 日产能 /// public Int64 DayCount { get { return _DayCount; } set { SetProperty(ref _DayCount, value); } } private PlotModel _YieldChartModel; /// /// 良率图表Model的mvvm属性,可通知UI更新 /// public PlotModel YieldChartModel { get { return _YieldChartModel; } set { SetProperty(ref _YieldChartModel, value); } } private PlotModel _MonthChartModel; /// /// 月产能 /// public PlotModel MonthChartModel { get { return _MonthChartModel; } set { SetProperty(ref _MonthChartModel, value); } } private PlotModel _WeekChartModel; /// /// 周产能 /// public PlotModel WeekChartModel { get { return _WeekChartModel; } set { SetProperty(ref _WeekChartModel, value); } } private PlotModel _DayChartModel; /// /// 日产能 /// public PlotModel DayChartModel { get { return _DayChartModel; } set { SetProperty(ref _DayChartModel, value); } } #endregion #region 命令 private DelegateCommand _LoadedCommand; public DelegateCommand LoadedCommand => _LoadedCommand ?? (_LoadedCommand = new DelegateCommand(ExecuteLoadedCommand)); #endregion #region 事件 #endregion public ProductionStatementViewModel(IContainerProvider container) { _container= container; } #region 方法 async void ExecuteLoadedCommand() { if (management == null) management = _container.Resolve(); if (management.CurrentProduct == null) return; await App.Current.Dispatcher.InvokeAsync(new Action(() => { YieldChartModel = CreateYieldChartModel(DatabaseHelper.GetTotalProductStatistical(management.CurrentProduct.Name)); TotalCount = DatabaseHelper.GetTotalQuantity(management.CurrentProduct.Name); MonthCount = DatabaseHelper.GetTotalQuantityMonth(management.CurrentProduct.Name); WeekCount = DatabaseHelper.GetTotalQuantityWeek(management.CurrentProduct.Name); DayCount = DatabaseHelper.GetTotalQuantityToday(management.CurrentProduct.Name); MonthChartModel = CreateMonth(DatabaseHelper.GetProductStatisticalMonth(management.CurrentProduct.Name)); WeekChartModel = CreateWeek(DatabaseHelper.GetProductStatisticalWeek(management.CurrentProduct.Name)); DayChartModel = CreateDay(DatabaseHelper.GetProductStatisticalDay(management.CurrentProduct.Name)); })); } /// /// 创建产量图表模型 /// /// private PlotModel CreateYieldChartModel(Dictionary Items) { List PieSlices = new List(); PieSlices = new List(); foreach (var item in Items) { PieSlices.Add(new PieSlice(item.Key, (double)item.Value)); } var model = new PlotModel { Title = "产能统计" }; var series = new PieSeries { StrokeThickness = 1.0, InsideLabelPosition = 0.5, AngleSpan = 360, StartAngle = 0 }; foreach (var slice in PieSlices) { series.Slices.Add(slice); } model.Series.Add(series); return model; } /// /// 创建月统计模型 /// /// /// private PlotModel CreateMonth(Dictionary> Items) { var model = new PlotModel { Title = Lang.当前月产能统计 }; // 添加图例说明 model.Legends.Add(new Legend { LegendPlacement = LegendPlacement.Outside, LegendPosition = LegendPosition.RightMiddle, LegendOrientation = LegendOrientation.Vertical, LegendBorderThickness = 0, LegendTextColor = OxyColors.LightGray }); ; // 定义第一个Y轴y1,显示数量 var ay1 = new LinearAxis() { Key = "y1", Title= Lang.数量, TitlePosition=1, Minimum = 0, Position = AxisPosition.Left, IsZoomEnabled = false, IsPanEnabled = false, TickStyle = TickStyle.None, MinorTickSize = 0, MajorGridlineStyle = LineStyle.Solid, MajorGridlineColor = OxyColor.Parse("#F3F3F3"), }; // 定义X轴为日期轴 var minValue = DateTimeAxis.ToDouble(Items.Keys.ElementAt(0)); var maxValue = DateTimeAxis.ToDouble(Items.Keys.ElementAt(Items.Keys.Count-1)); var ax = new DateTimeAxis() { Minimum = minValue, Maximum = maxValue, StringFormat = $"dd{Lang.日}", MajorStep = 1, Position = AxisPosition.Bottom, Angle = 45, IsZoomEnabled = false, IsPanEnabled = false, TickStyle = TickStyle.None, MinorTickSize = 0, MajorGridlineStyle = LineStyle.Solid, MajorGridlineColor = OxyColor.Parse("#F3F3F3"), }; model.Axes.Add(ay1); model.Axes.Add(ax); foreach (var category in Items.First().Value.Keys) { var barSeries = new LinearBarSeries { Title = category }; barSeries.YAxisKey = "y1"; barSeries.BarWidth = 10; // 点击时弹出的label内容 barSeries.TrackerFormatString = $"{0}\r\n{2:dd}{Lang.日}: {4:0}"; foreach (var item in Items) { barSeries.Points.Add(new DataPoint(DateTimeAxis.ToDouble(item.Key), (double)(item.Value[category]))); } model.Series.Add(barSeries); } var Series = new LineSeries { Title = Lang.总产量 }; Series.YAxisKey = "y1"; Series.TrackerFormatString = $"{0}\r\n{2:dd}{Lang.日}: {4:0}"; foreach (var item in Items) { Int64 count = 0; foreach (var item1 in item.Value) { count += item1.Value; } Series.Points.Add(new DataPoint(DateTimeAxis.ToDouble(item.Key), (double)count)); } model.Series.Add(Series); return model; } /// /// 创建周统计模型 /// /// /// private PlotModel CreateWeek(Dictionary> Items) { var model = new PlotModel { Title = Lang.当前周产能统计 }; // 添加图例说明 model.Legends.Add(new Legend { LegendPlacement = LegendPlacement.Outside, LegendPosition = LegendPosition.RightMiddle, LegendOrientation = LegendOrientation.Vertical, LegendBorderThickness = 0, LegendTextColor = OxyColors.LightGray }); // 定义第一个Y轴y1,显示数量 var ay1 = new LinearAxis() { Key = "y1", Title = Lang.数量, Minimum = 0, Position = AxisPosition.Left, IsZoomEnabled = false, IsPanEnabled = false, TickStyle = TickStyle.None, MinorTickSize = 0, MajorGridlineStyle = LineStyle.Solid, MajorGridlineColor = OxyColor.Parse("#F3F3F3"), }; // 定义X轴为日期轴 var ax = new LinearAxis() { Minimum = 0, Maximum = 7.5, MajorStep = 1, Position = AxisPosition.Bottom, StringFormat= $"{Lang.周} 0", Angle = 0, IsZoomEnabled = false, IsPanEnabled = false, TickStyle = TickStyle.None, MinorTickSize = 0, MajorGridlineStyle = LineStyle.Solid, MajorGridlineColor = OxyColor.Parse("#F3F3F3"), }; model.Axes.Add(ay1); model.Axes.Add(ax); foreach (var category in Items.First().Value.Keys) { var barSeries = new LinearBarSeries { Title = category }; barSeries.YAxisKey = "y1"; barSeries.BarWidth = 10; // 点击时弹出的label内容 barSeries.TrackerFormatString = $"{0}\r\n{Lang.周}{2:0}: {4:0}"; foreach (var item in Items) { barSeries.Points.Add(new DataPoint(LinearAxis.ToDouble(item.Key), (double)(item.Value[category]))); } model.Series.Add(barSeries); } var Series = new LineSeries { Title = Lang.当前周产能统计 }; Series.YAxisKey = "y1"; Series.TrackerFormatString = $"{0}\r\n{2:dd}{Lang.日}: {4:0}"; foreach (var item in Items) { Int64 count = 0; foreach (var item1 in item.Value) { count += item1.Value; } Series.Points.Add(new DataPoint(DateTimeAxis.ToDouble(item.Key), (double)count)); } model.Series.Add(Series); return model; } /// /// 创建日统计模型 /// /// /// private PlotModel CreateDay(Dictionary> Items) { var model = new PlotModel { Title = Lang.当前日产能统计 }; // 添加图例说明 model.Legends.Add(new Legend { LegendPlacement = LegendPlacement.Outside, LegendPosition = LegendPosition.RightMiddle, LegendOrientation = LegendOrientation.Vertical, LegendBorderThickness = 0, LegendTextColor = OxyColors.LightGray }); // 定义第一个Y轴y1,显示数量 var ay1 = new LinearAxis() { Key = "y1", Title = $"{Lang.数量}", Minimum = 0, Position = AxisPosition.Left, IsZoomEnabled = false, IsPanEnabled = false, TickStyle = TickStyle.None, MinorTickSize = 0, MajorGridlineStyle = LineStyle.Solid, MajorGridlineColor = OxyColor.Parse("#F3F3F3"), }; // 定义X轴为小时 var ax = new LinearAxis() { Minimum = 0, Maximum = 24.5, MajorStep = 1, StringFormat = "0 H", Position = AxisPosition.Bottom, Angle = 0, IsZoomEnabled = false, IsPanEnabled = false, TickStyle = TickStyle.None, MinorTickSize = 0, MajorGridlineStyle = LineStyle.Solid, MajorGridlineColor = OxyColor.Parse("#F3F3F3"), }; model.Axes.Add(ay1); model.Axes.Add(ax); foreach (var category in Items.First().Value.Keys) { var barSeries = new LinearBarSeries { Title = category }; barSeries.YAxisKey = "y1"; barSeries.BarWidth = 10; // 点击时弹出的label内容 barSeries.TrackerFormatString = "{0}\r\n{2:0}Hours: {4:0}"; foreach (var item in Items) { barSeries.Points.Add(new DataPoint(LinearAxis.ToDouble(item.Key), (double)(item.Value[category]))); } model.Series.Add(barSeries); } var Series = new LineSeries { Title = Lang.总产量 }; Series.YAxisKey = "y1"; Series.TrackerFormatString = $"{0}\r\n{2:dd}{Lang.小时}: {4:0}"; foreach (var item in Items) { Int64 count = 0; foreach (var item1 in item.Value) { count += item1.Value; } Series.Points.Add(new DataPoint(DateTimeAxis.ToDouble(item.Key), (double)count)); } model.Series.Add(Series); return model; } #endregion } }