using Cowain.Bake.BLL; using Cowain.Bake.Common; using Cowain.Bake.Common.Core; using Cowain.Bake.UI.CommonView.Views; using LiveCharts; using LiveCharts.Wpf; using Prism.Commands; using Prism.Regions; using System; using System.Collections.ObjectModel; using System.Data; using System.Linq; using System.Threading.Tasks; using System.Windows.Media; using Unity; namespace Cowain.Bake.UI.DataQuery.ViewModels { public enum EChartType { Temp = 1, Vacuum = 2, PID = 3 } public class DemoDataModel { public int Index { get; set; } public string Name { get; set; } = string.Empty; public bool IsSelected { get; set; } } public class CurveViewModel : ViewModelBase { //private DataTable _dtChartTemp; private DataTable _dtTemp; private ObservableCollection _dataList; public ObservableCollection DataList { get => _dataList; set => SetProperty(ref _dataList, value); } public DataTable DtTemp { get => _dtTemp; set => SetProperty(ref _dtTemp, value); } private DataTable _dtPID; public DataTable DtPID { get => _dtPID; set => SetProperty(ref _dtPID, value); } public ChartValues TimeLine { get; set; } public string XName { get; set; } public string YName { get; set; } public SeriesCollection SeriesCollection { get; set; } private int _stepId = 1; public int StepId { get => _stepId; set => SetProperty(ref _stepId, value); } private string _selectOneItem; public string SelectOneItem { get => _selectOneItem; set => SetProperty(ref _selectOneItem, value); } private DateTime _curveStartDateTime = DateTime.Now.AddHours(-23); public DateTime CurveStartDateTime { get { return _curveStartDateTime; } set { SetProperty(ref _curveStartDateTime, DateTime.Parse(value.ToString("yyyy-MM-dd HH:mm:ss"))); } } private DateTime _curveEndDateTime = DateTime.Now; public DateTime CurveEndDateTime { get { return _curveEndDateTime; } set { SetProperty(ref _curveEndDateTime, DateTime.Parse(value.ToString("yyyy-MM-dd HH:mm:ss"))); } } public CurveViewModel(IUnityContainer unityContainer, IRegionManager regionManager) : base(unityContainer, regionManager) { DtTemp = null; DtPID = null;; DataList = new ObservableCollection(); SetCheckCombox(); TimeLine = new ChartValues(); SeriesCollection = new SeriesCollection(); this.PageTitle = "曲线图表"; } private void SetCheckCombox() { for (int i = 1; i <= 8; i++) { DataList.Add(new DemoDataModel() { Index = i, Name = "温度" + i.ToString(), IsSelected = true, }); } } void GetTempChartData(DataTable table) { for (int i = 2; i < table.Columns.Count; i++) { var columnName = table.Columns[i].ColumnName; var model = DataList.Where(x => x.IsSelected && x.Name == columnName).FirstOrDefault(); if (null == model) { continue; } ChartValues chartValues = new ChartValues(); table.AsEnumerable().Select(item => item.Field(columnName)).ToList().ForEach(item => chartValues.Add(item)); var lineSeries = new LineSeries { Title = columnName, Values = chartValues, StrokeThickness = 1, LineSmoothness = 0, Fill = Brushes.Transparent, PointGeometry = null // 不画圆点 }; SeriesCollection.Add(lineSeries); } } void GetVacuumChartData(DataTable table) { var columnName = table.Columns[2].ColumnName; ChartValues chartValues = new ChartValues(); table.AsEnumerable().Select(item => item.Field(columnName)).ToList().ForEach(item => chartValues.Add(Math.Round(item,2))); var lineSeries = new LineSeries { Title = columnName, Values = chartValues, StrokeThickness = 1, LineSmoothness = 0, Fill = Brushes.Transparent, PointGeometry = null // 不画圆点 }; SeriesCollection.Add(lineSeries); } void GetPIDChartData(DataTable table) { for (int i = 2; i < table.Columns.Count; i++) { var columnName = table.Columns[i].ColumnName; ChartValues chartValues = new ChartValues(); table.AsEnumerable().Select(item => item.Field(columnName)).ToList().ForEach(item => chartValues.Add(item)); var lineSeries = new LineSeries { Title = columnName, Values = chartValues, StrokeThickness = 1, LineSmoothness = 0, Fill = Brushes.Transparent, PointGeometry = null // 不画圆点 }; SeriesCollection.Add(lineSeries); } } private void UpdateSeries(DataTable table, EChartType chartType) { if (null == table || 0 == table.Rows.Count) { HandyControl.Controls.Growl.Warning("请点【查询】数据,或查询数据为空!"); return; } StepId = table.Rows.Count / 10; System.Threading.SynchronizationContext.SetSynchronizationContext(new System.Windows.Threading.DispatcherSynchronizationContext(System.Windows.Application.Current.Dispatcher)); System.Threading.SynchronizationContext.Current.Post(p1 => { TimeLine.Clear(); SeriesCollection.Clear(); if (chartType == EChartType.Vacuum) { GetVacuumChartData(table); } else if (chartType == EChartType.Temp) { GetTempChartData(table); } else { GetPIDChartData(table); } SetXAxis(table); }, null); } private void SetXAxis(DataTable table) { XName = table.Columns[0].ColumnName; table.AsEnumerable().Select(item => item.Field(XName)).ToList().ForEach(item => TimeLine.Add(item)); } public DelegateCommand QueryTempCommand { get => new DelegateCommand(async () => await QueryTemp()); } public async Task QueryTemp() { DtTemp = null; if (!IsAccord("温度曲线(℃)")) { return; } ProgressBarView dlg = new ProgressBarView(); dlg.Show(); string sql = $@"CALL ProcGetTemperatureAndPressureData('{CurveStartDateTime.ToString("yyyy-MM-dd HH:mm:ss")}' ,'{CurveEndDateTime.ToString("yyyy-MM-dd HH:mm:ss")}','{Code}')"; await Task.Run(new Action(() => { DtTemp = _unityContainer.Resolve().GetDataTable(sql); })); dlg.Close(); Tip(DtTemp); } void Tip(DataTable dt) { if (0 == dt.Rows.Count) { HandyControl.Controls.Growl.Warning("查询数据为空!"); } else { HandyControl.Controls.Growl.Success("查询数据成功!"); } } public DelegateCommand ChartTempCommand => new DelegateCommand(async() => { await WaitChartTemp(DtTemp, EChartType.Temp); }); public async Task AsyncChart(DataTable table, EChartType chartType) { Task queryTask = Task.Run(() => UpdateSeries(table, chartType)); var timeouttask = Task.Delay(30 * 1000); var completedTask = await Task.WhenAny(queryTask, timeouttask); if (completedTask == timeouttask) { HandyControl.Controls.MessageBox.Warning("查询超时!"); } } public DelegateCommand ChartVacuumCommand => new DelegateCommand(async() => { if (!IsAccord("真空压力")) { return; } await WaitChartTemp(DtTemp, EChartType.Vacuum); }); //public DelegateCommand QueryPIDCommand { get => new DelegateCommand(QueryPID); } public DelegateCommand QueryPIDCommand { get => new DelegateCommand(async() => await QueryPID()); } public async Task QueryPID() { if (!IsAccord("PID")) { return; } ProgressBarView dlg = new ProgressBarView(); dlg.Show(); string sql = $@"CALL ProcGetPidData ('{CurveStartDateTime.ToString("yyyy-MM-dd HH:mm:ss")}' ,'{CurveEndDateTime.ToString("yyyy-MM-dd HH:mm:ss")}','{Code}')"; await Task.Run(new Action(() => { DtPID = _unityContainer.Resolve().GetDataTable(sql); })); dlg.Close(); Tip(DtPID); } public DelegateCommand ChartPIDCommand => new DelegateCommand(async() => { await WaitChartTemp(DtPID, EChartType.PID); }); public async Task WaitChartTemp(DataTable table, EChartType eChart) { ProgressBarView dlg = new ProgressBarView(); dlg.Show(); await AsyncChart(table, eChart); dlg.Close(); } public DelegateCommand ExportTempCommand => new DelegateCommand((x) => { if (null == DtTemp) { HandyControl.Controls.MessageBox.Error("温度数据为空!", "操作提示"); return; } CSVHelper.WriteDataTableToCsv(DtTemp); }); public DelegateCommand ExportPIDCommand => new DelegateCommand((x) => { if (null == DtPID) { HandyControl.Controls.MessageBox.Error("温度数据为空!", "操作提示"); return; } CSVHelper.WriteDataTableToCsv(DtPID); }); bool IsAccord(string headName) { YName = headName; if (string.IsNullOrWhiteSpace(Code)) { HandyControl.Controls.MessageBox.Error("请输入条码", "操作提示"); return false; } var p = _unityContainer.Resolve().GetPalletInfo(Code); if (p == null) { HandyControl.Controls.MessageBox.Error("没有该托盘码", "操作提示"); return false; } TimeSpan timeSpan = CurveEndDateTime - CurveStartDateTime; if (timeSpan.TotalHours > 24) { HandyControl.Controls.MessageBox.Error("请选择时间区间小于24小时的数据", "操作提示"); return false; } return true; } } }