using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Collections.ObjectModel; using System.Windows.Input; using Aitex.UI.Charting.Command; using System.Windows; using Aitex.UI.Charting.View; using Aitex.UI.Charting.Model; using System.Text.RegularExpressions; using DataAnalysisControl.Core; namespace Aitex.UI.Charting.ViewModel { public class DataSourceSelectionViewModel : ChartingBaseViewModel { public DataSourceSelectionViewModel(DataSourceSelection view) { CommonViewModel = CommonViewModel.Instance; _view = view; //初始化各个对象 RecipeSearch_ChamberList = new ObservableCollection(); RecipeSearch_ChamberList.Add("不限"); foreach (var item in CONTEXT.GetRecipeChamberList()) RecipeSearch_ChamberList.Add(item.Value); RecipeSearch_SelectedChamber = "不限"; TimeSearch_ChamberList = new ObservableCollection(); foreach (var item in CONTEXT.GetChamberList()) TimeSearch_ChamberList.Add(item.Value); TimeSearch_SelectedChamber = TimeSearch_ChamberList.First(); RecipeSearch_UserDefinedIdList = new ObservableCollection(); RecipeSearch_RecipeNameList = new ObservableCollection(); RecipeSearch_SusceptorDescList = new ObservableCollection(); RecipeSearch_SusceptorData = new ObservableCollection(); RecipeSearch_BeginDate = RecipeSearch_BeginTime = DateTime.Now.Date - new TimeSpan(7, 0, 0, 0); TimeSearch_BeginDate = TimeSearch_BeginTime = DateTime.Now.Date; TimeSearch_EndDate = TimeSearch_EndTime = RecipeSearch_EndDate = RecipeSearch_EndTime = DateTime.Now.Date + new TimeSpan(23, 59, 59); SearchRecipeHistoryCommand = new ChartingCommand((o) => true, (o) => SearchRecipeHistory(o)); AddDataSourceByRecipeCommand = new ChartingCommand((o) => true, (o) => AddDataSource_ByRecipe(o)); AddDataSourceByTimeCommand = new ChartingCommand((o) => true, (o) => AddDataSource_ByTime(o)); //预先加载查询数据 Preload_Information(); } public DataSourceSelection _view; public CommonViewModel CommonViewModel { get; private set; } public ICommand SearchRecipeHistoryCommand { get; set; } public ICommand AddDataSourceByRecipeCommand { get; set; } public ICommand AddDataSourceByTimeCommand { get; set; } //select by recipe history public DateTime RecipeSearch_BeginDate { get; set; } public DateTime RecipeSearch_EndDate { get; set; } public DateTime RecipeSearch_BeginTime { get; set; } public DateTime RecipeSearch_EndTime { get; set; } public ObservableCollection RecipeSearch_UserDefinedIdList { get; set; } public string RecipeSearch_SelectedUserDefinedId { get; set; } public ObservableCollection RecipeSearch_SusceptorDescList { get; set; } public string RecipeSearch_SelectedSusceptorDesc { get; set; } public ObservableCollection RecipeSearch_RecipeNameList { get; set; } public string RecipeSearch_SelectedRecipeName { get; set; } public ObservableCollection RecipeSearch_ChamberList { get; set; } public string RecipeSearch_SelectedChamber { get; set; } public ObservableCollection RecipeSearch_SusceptorData { get; set; } //select by customized time public DateTime TimeSearch_BeginDate { get; set; } public DateTime TimeSearch_EndDate { get; set; } public DateTime TimeSearch_BeginTime { get; set; } public DateTime TimeSearch_EndTime { get; set; } public ObservableCollection TimeSearch_ChamberList { get; set; } public string TimeSearch_SelectedChamber { get; set; } long btBak; long etBak; /// /// 预设置数据,方便用户查询 /// void Preload_Information() { //预加载数据功能如果放置于GUI线程执行,一旦数据查询缓慢,会影响到界面正常操作, //因此此处放置于单独线程中执行,在执行完毕后通知GUI更新数据 Action act = new Action(() => { string c1 = ""; foreach (var item in CONTEXT.GetChamberList()) { if (item.Value == RecipeSearch_SelectedChamber) { c1 = item.Key; break; } } var bt = new DateTime(RecipeSearch_BeginDate.Year, RecipeSearch_BeginDate.Month, RecipeSearch_BeginDate.Day, RecipeSearch_BeginTime.Hour, RecipeSearch_BeginTime.Minute, 0); var et = new DateTime(RecipeSearch_EndDate.Year, RecipeSearch_EndDate.Month, RecipeSearch_EndDate.Day, RecipeSearch_EndTime.Hour, RecipeSearch_EndTime.Minute, 0); if (btBak != bt.Ticks || etBak != et.Ticks) { RecipeSearch_SelectedRecipeName = ""; RecipeSearch_SelectedSusceptorDesc = ""; RecipeSearch_SelectedUserDefinedId = ""; } var recipeName = RecipeSearch_SelectedRecipeName; var desc = RecipeSearch_SelectedSusceptorDesc; var userDefinedId = RecipeSearch_SelectedUserDefinedId; var data = GetSusceptorList(bt, et, c1, recipeName, desc, userDefinedId); //ObservableCollection must be modified by GUI thread _view.Dispatcher.Invoke(new Action>((o) => { if (btBak != bt.Ticks || etBak != et.Ticks) { RecipeSearch_UserDefinedIdList.Clear(); RecipeSearch_SusceptorDescList.Clear(); RecipeSearch_RecipeNameList.Clear(); btBak = bt.Ticks ; etBak = et.Ticks; } RecipeSearch_SusceptorData.Clear(); foreach (var item in o) { if (!RecipeSearch_UserDefinedIdList.Contains(item.UserDefinedId)) RecipeSearch_UserDefinedIdList.Add(item.UserDefinedId); if (!RecipeSearch_SusceptorDescList.Contains(item.Description)) RecipeSearch_SusceptorDescList.Add(item.Description); if (!RecipeSearch_RecipeNameList.Contains(item.RecipeName)) RecipeSearch_RecipeNameList.Add(item.RecipeName); RecipeSearch_SusceptorData.Add(item); } InvokePropertyChanged(); }), data); }); act.BeginInvoke(null, null); } /// /// 按照查询条件搜索菜单历史 /// /// void SearchRecipeHistory(object obj) { Preload_Information(); } /// /// 搜索数据源 /// /// void AddDataSource_ByRecipe(object obj) { //speical code to get view's control information, for 'SelectedItems' in DataGrid cannot be binded with view model foreach (ChartingBaseViewModel.SusceptorDataModel item in _view.dataGrid_SusceptorList.SelectedItems) { var susceptorId = item.SusceptorId; var recipeRunGuid = item.RecipeRunGuid; var chamString = item.ProcessIn; //var chamString = "System"; var beginTimeString = item.ProcessBeginTime.Replace("星期一","").Replace("星期二","").Replace("星期三","").Replace("星期四","").Replace("星期五","").Replace("星期六","").Replace("星期日",""); var endTimeString = item.ProcessEndTime; DateTime beginTime, endTime; if (!DateTime.TryParse(beginTimeString, out beginTime)) continue; //if current recipe has no end time (maybe on running state), default set end time 12 hours later than begin time if (!DateTime.TryParse(endTimeString, out endTime)) endTime = beginTime + new TimeSpan(12, 0, 0); if (string.IsNullOrEmpty(chamString)) { continue; } string reason; List dataList; Dictionary>> virtualDevices; ReadDbDataNameList(beginTime, chamString, out reason, out dataList, out virtualDevices); if (dataList == null || dataList.Count == 0) { MessageBox.Show(string.Format("{0}在{1}没有数据记录,请重新选择数据源!", chamString, beginTime.ToString("yyyy/MM/dd")), "数据源选择警告", MessageBoxButton.OK, MessageBoxImage.Warning); continue; } var singleDataSource = new PostgreSqlDataSource(); singleDataSource.RecipeSteps = GetRecipeStepInfo(recipeRunGuid); singleDataSource.BeginTime = beginTime; singleDataSource.ChamberName = chamString; singleDataSource.Datas = new Dictionary(); foreach (string dataName in dataList) { if (!singleDataSource.Datas.ContainsKey(dataName)) singleDataSource.Datas.Add(dataName, new DataItem() { DataName = dataName, RawData = new List(), TimeStamp = new List() }); } //singleDataSource.AliasList = dataList; singleDataSource.VirtualDeviceTable = virtualDevices; singleDataSource.Description = item.Description; //_selectedDescription;//string.Format("{0}数据库文件,开始时间:{1},结束时间:{2}", selectedCham, BeginTime, EndTime); singleDataSource.EndTime = endTime; var chamName = CONTEXT.GetChamberList()[chamString]; string recipeName = item.RecipeName; //如果RecipeName以201XXXXXXXXXX_YYYY方式命名,此处自动缩减为*_YYYY方式显示,减少显示长度 if (Regex.Match(recipeName, @"^\d\d\d\d\d\d\d\d\d\d\d\d\d\d_*").Success && recipeName.Length > 15) recipeName = recipeName.Substring(15); singleDataSource.Title = string.Format("{0} {1}", chamName, recipeName); singleDataSource.TimeMove = new TimeSpan(0); singleDataSource.SyncPoint = singleDataSource.RecipeSteps.First(); //SelectedDataSources.Add(singleDataSource); CommonViewModel.AddDataSource(singleDataSource); } _view.Close(); } /// /// 搜索数据源 /// /// void AddDataSource_ByTime(object obj) { var beginTime = new DateTime(TimeSearch_BeginDate.Year, TimeSearch_BeginDate.Month, TimeSearch_BeginDate.Day, TimeSearch_BeginTime.Hour, TimeSearch_BeginTime.Minute, TimeSearch_BeginTime.Second); var endTime = new DateTime(TimeSearch_EndDate.Year, TimeSearch_EndDate.Month, TimeSearch_EndDate.Day, TimeSearch_EndTime.Hour, TimeSearch_EndTime.Minute, TimeSearch_EndTime.Second); var selectedCham = ""; foreach (var item in CONTEXT.GetChamberList()) { if (item.Value == TimeSearch_SelectedChamber) { selectedCham = item.Key; break; } } if (string.IsNullOrEmpty(selectedCham)) return; string reason; List dataList; Dictionary>> virtualDevices; ReadDbDataNameList(beginTime, selectedCham, out reason, out dataList, out virtualDevices); if (dataList == null || dataList.Count == 0) { MessageBox.Show(string.Format("{0}在{1}没有数据记录,请重新选择数据源!", selectedCham, beginTime.ToString("yyyy/MM/dd")), "数据源选择警告", MessageBoxButton.OK, MessageBoxImage.Warning); return; } var singleDataSource = new PostgreSqlDataSource(); singleDataSource.RecipeSteps = GetRecipeStepInfo(null); singleDataSource.BeginTime = beginTime; singleDataSource.ChamberName = selectedCham; singleDataSource.Datas = new Dictionary(); foreach (string dataName in dataList) singleDataSource.Datas.Add(dataName, new DataItem() { DataName = dataName, RawData = new List(), TimeStamp = new List() }); //singleDataSource.AliasList = dataList; singleDataSource.VirtualDeviceTable = virtualDevices; singleDataSource.Description = "";//string.Format("{0}数据库文件,开始时间:{1},结束时间:{2}", selectedCham, BeginTime, EndTime); singleDataSource.EndTime = endTime; var chamName = CONTEXT.GetChamberList()[selectedCham];// Aitex.DataAnalysisControl.Core.Converter.ToCstring((ChamberSet)Enum.Parse(typeof(ChamberSet), selectedCham)); singleDataSource.Title = string.Format("{0} {1}", chamName, beginTime.ToString("MM-dd HH:mm")); singleDataSource.TimeMove = new TimeSpan(0); singleDataSource.SyncPoint = singleDataSource.RecipeSteps.First(); //SelectedDataSources = new List(); //SelectedDataSources.Add(singleDataSource); CommonViewModel.AddDataSource(singleDataSource); _view.Close(); } } }