DataSourceSelectionViewModel.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Collections.ObjectModel;
  6. using System.Windows.Input;
  7. using Aitex.UI.Charting.Command;
  8. using System.Windows;
  9. using Aitex.UI.Charting.View;
  10. using Aitex.UI.Charting.Model;
  11. using System.Text.RegularExpressions;
  12. using DataAnalysisControl.Core;
  13. namespace Aitex.UI.Charting.ViewModel
  14. {
  15. public class DataSourceSelectionViewModel : ChartingBaseViewModel
  16. {
  17. public DataSourceSelectionViewModel(DataSourceSelection view)
  18. {
  19. CommonViewModel = CommonViewModel.Instance;
  20. _view = view;
  21. //初始化各个对象
  22. RecipeSearch_ChamberList = new ObservableCollection<string>();
  23. RecipeSearch_ChamberList.Add("不限");
  24. foreach (var item in CONTEXT.GetRecipeChamberList())
  25. RecipeSearch_ChamberList.Add(item.Value);
  26. RecipeSearch_SelectedChamber = "不限";
  27. TimeSearch_ChamberList = new ObservableCollection<string>();
  28. foreach (var item in CONTEXT.GetChamberList())
  29. TimeSearch_ChamberList.Add(item.Value);
  30. TimeSearch_SelectedChamber = TimeSearch_ChamberList.First();
  31. RecipeSearch_UserDefinedIdList = new ObservableCollection<string>();
  32. RecipeSearch_RecipeNameList = new ObservableCollection<string>();
  33. RecipeSearch_SusceptorDescList = new ObservableCollection<string>();
  34. RecipeSearch_SusceptorData = new ObservableCollection<SusceptorDataModel>();
  35. RecipeSearch_BeginDate = RecipeSearch_BeginTime = DateTime.Now.Date - new TimeSpan(7, 0, 0, 0);
  36. TimeSearch_BeginDate = TimeSearch_BeginTime = DateTime.Now.Date;
  37. TimeSearch_EndDate = TimeSearch_EndTime = RecipeSearch_EndDate = RecipeSearch_EndTime = DateTime.Now.Date + new TimeSpan(23, 59, 59);
  38. SearchRecipeHistoryCommand = new ChartingCommand((o) => true, (o) => SearchRecipeHistory(o));
  39. AddDataSourceByRecipeCommand = new ChartingCommand((o) => true, (o) => AddDataSource_ByRecipe(o));
  40. AddDataSourceByTimeCommand = new ChartingCommand((o) => true, (o) => AddDataSource_ByTime(o));
  41. //预先加载查询数据
  42. Preload_Information();
  43. }
  44. public DataSourceSelection _view;
  45. public CommonViewModel CommonViewModel { get; private set; }
  46. public ICommand SearchRecipeHistoryCommand { get; set; }
  47. public ICommand AddDataSourceByRecipeCommand { get; set; }
  48. public ICommand AddDataSourceByTimeCommand { get; set; }
  49. //select by recipe history
  50. public DateTime RecipeSearch_BeginDate { get; set; }
  51. public DateTime RecipeSearch_EndDate { get; set; }
  52. public DateTime RecipeSearch_BeginTime { get; set; }
  53. public DateTime RecipeSearch_EndTime { get; set; }
  54. public ObservableCollection<string> RecipeSearch_UserDefinedIdList { get; set; }
  55. public string RecipeSearch_SelectedUserDefinedId { get; set; }
  56. public ObservableCollection<string> RecipeSearch_SusceptorDescList { get; set; }
  57. public string RecipeSearch_SelectedSusceptorDesc { get; set; }
  58. public ObservableCollection<string> RecipeSearch_RecipeNameList { get; set; }
  59. public string RecipeSearch_SelectedRecipeName { get; set; }
  60. public ObservableCollection<string> RecipeSearch_ChamberList { get; set; }
  61. public string RecipeSearch_SelectedChamber { get; set; }
  62. public ObservableCollection<SusceptorDataModel> RecipeSearch_SusceptorData { get; set; }
  63. //select by customized time
  64. public DateTime TimeSearch_BeginDate { get; set; }
  65. public DateTime TimeSearch_EndDate { get; set; }
  66. public DateTime TimeSearch_BeginTime { get; set; }
  67. public DateTime TimeSearch_EndTime { get; set; }
  68. public ObservableCollection<string> TimeSearch_ChamberList { get; set; }
  69. public string TimeSearch_SelectedChamber { get; set; }
  70. long btBak;
  71. long etBak;
  72. /// <summary>
  73. /// 预设置数据,方便用户查询
  74. /// </summary>
  75. void Preload_Information()
  76. {
  77. //预加载数据功能如果放置于GUI线程执行,一旦数据查询缓慢,会影响到界面正常操作,
  78. //因此此处放置于单独线程中执行,在执行完毕后通知GUI更新数据
  79. Action act = new Action(() =>
  80. {
  81. string c1 = "";
  82. foreach (var item in CONTEXT.GetChamberList())
  83. {
  84. if (item.Value == RecipeSearch_SelectedChamber)
  85. {
  86. c1 = item.Key;
  87. break;
  88. }
  89. }
  90. var bt = new DateTime(RecipeSearch_BeginDate.Year, RecipeSearch_BeginDate.Month, RecipeSearch_BeginDate.Day,
  91. RecipeSearch_BeginTime.Hour, RecipeSearch_BeginTime.Minute, 0);
  92. var et = new DateTime(RecipeSearch_EndDate.Year, RecipeSearch_EndDate.Month, RecipeSearch_EndDate.Day,
  93. RecipeSearch_EndTime.Hour, RecipeSearch_EndTime.Minute, 0);
  94. if (btBak != bt.Ticks || etBak != et.Ticks)
  95. {
  96. RecipeSearch_SelectedRecipeName = "";
  97. RecipeSearch_SelectedSusceptorDesc = "";
  98. RecipeSearch_SelectedUserDefinedId = "";
  99. }
  100. var recipeName = RecipeSearch_SelectedRecipeName;
  101. var desc = RecipeSearch_SelectedSusceptorDesc;
  102. var userDefinedId = RecipeSearch_SelectedUserDefinedId;
  103. var data = GetSusceptorList(bt, et, c1, recipeName, desc, userDefinedId);
  104. //ObservableCollection must be modified by GUI thread
  105. _view.Dispatcher.Invoke(new Action<List<SusceptorDataModel>>((o) =>
  106. {
  107. if (btBak != bt.Ticks || etBak != et.Ticks)
  108. {
  109. RecipeSearch_UserDefinedIdList.Clear();
  110. RecipeSearch_SusceptorDescList.Clear();
  111. RecipeSearch_RecipeNameList.Clear();
  112. btBak = bt.Ticks ;
  113. etBak = et.Ticks;
  114. }
  115. RecipeSearch_SusceptorData.Clear();
  116. foreach (var item in o)
  117. {
  118. if (!RecipeSearch_UserDefinedIdList.Contains(item.UserDefinedId)) RecipeSearch_UserDefinedIdList.Add(item.UserDefinedId);
  119. if (!RecipeSearch_SusceptorDescList.Contains(item.Description)) RecipeSearch_SusceptorDescList.Add(item.Description);
  120. if (!RecipeSearch_RecipeNameList.Contains(item.RecipeName)) RecipeSearch_RecipeNameList.Add(item.RecipeName);
  121. RecipeSearch_SusceptorData.Add(item);
  122. }
  123. InvokePropertyChanged();
  124. }), data);
  125. });
  126. act.BeginInvoke(null, null);
  127. }
  128. /// <summary>
  129. /// 按照查询条件搜索菜单历史
  130. /// </summary>
  131. /// <param name="obj"></param>
  132. void SearchRecipeHistory(object obj)
  133. {
  134. Preload_Information();
  135. }
  136. /// <summary>
  137. /// 搜索数据源
  138. /// </summary>
  139. /// <param name="obj"></param>
  140. void AddDataSource_ByRecipe(object obj)
  141. {
  142. //speical code to get view's control information, for 'SelectedItems' in DataGrid cannot be binded with view model
  143. foreach (ChartingBaseViewModel.SusceptorDataModel item in _view.dataGrid_SusceptorList.SelectedItems)
  144. {
  145. var susceptorId = item.SusceptorId;
  146. var recipeRunGuid = item.RecipeRunGuid;
  147. var chamString = item.ProcessIn;
  148. //var chamString = "System";
  149. var beginTimeString = item.ProcessBeginTime.Replace("星期一","").Replace("星期二","").Replace("星期三","").Replace("星期四","").Replace("星期五","").Replace("星期六","").Replace("星期日","");
  150. var endTimeString = item.ProcessEndTime;
  151. DateTime beginTime, endTime;
  152. if (!DateTime.TryParse(beginTimeString, out beginTime)) continue;
  153. //if current recipe has no end time (maybe on running state), default set end time 12 hours later than begin time
  154. if (!DateTime.TryParse(endTimeString, out endTime)) endTime = beginTime + new TimeSpan(12, 0, 0);
  155. if (string.IsNullOrEmpty(chamString))
  156. {
  157. continue;
  158. }
  159. string reason;
  160. List<string> dataList;
  161. Dictionary<string, Tuple<string, List<string>>> virtualDevices;
  162. ReadDbDataNameList(beginTime, chamString, out reason, out dataList, out virtualDevices);
  163. if (dataList == null || dataList.Count == 0)
  164. {
  165. MessageBox.Show(string.Format("{0}在{1}没有数据记录,请重新选择数据源!", chamString, beginTime.ToString("yyyy/MM/dd")), "数据源选择警告", MessageBoxButton.OK, MessageBoxImage.Warning);
  166. continue;
  167. }
  168. var singleDataSource = new PostgreSqlDataSource();
  169. singleDataSource.RecipeSteps = GetRecipeStepInfo(recipeRunGuid);
  170. singleDataSource.BeginTime = beginTime;
  171. singleDataSource.ChamberName = chamString;
  172. singleDataSource.Datas = new Dictionary<string, DataItem>();
  173. foreach (string dataName in dataList)
  174. {
  175. if (!singleDataSource.Datas.ContainsKey(dataName))
  176. singleDataSource.Datas.Add(dataName, new DataItem() { DataName = dataName, RawData = new List<float>(), TimeStamp = new List<DateTime>() });
  177. }
  178. //singleDataSource.AliasList = dataList;
  179. singleDataSource.VirtualDeviceTable = virtualDevices;
  180. singleDataSource.Description = item.Description; //_selectedDescription;//string.Format("{0}数据库文件,开始时间:{1},结束时间:{2}", selectedCham, BeginTime, EndTime);
  181. singleDataSource.EndTime = endTime;
  182. var chamName = CONTEXT.GetChamberList()[chamString];
  183. string recipeName = item.RecipeName;
  184. //如果RecipeName以201XXXXXXXXXX_YYYY方式命名,此处自动缩减为*_YYYY方式显示,减少显示长度
  185. if (Regex.Match(recipeName, @"^\d\d\d\d\d\d\d\d\d\d\d\d\d\d_*").Success && recipeName.Length > 15)
  186. recipeName = recipeName.Substring(15);
  187. singleDataSource.Title = string.Format("{0} {1}", chamName, recipeName);
  188. singleDataSource.TimeMove = new TimeSpan(0);
  189. singleDataSource.SyncPoint = singleDataSource.RecipeSteps.First();
  190. //SelectedDataSources.Add(singleDataSource);
  191. CommonViewModel.AddDataSource(singleDataSource);
  192. }
  193. _view.Close();
  194. }
  195. /// <summary>
  196. /// 搜索数据源
  197. /// </summary>
  198. /// <param name="obj"></param>
  199. void AddDataSource_ByTime(object obj)
  200. {
  201. var beginTime = new DateTime(TimeSearch_BeginDate.Year, TimeSearch_BeginDate.Month, TimeSearch_BeginDate.Day,
  202. TimeSearch_BeginTime.Hour, TimeSearch_BeginTime.Minute, TimeSearch_BeginTime.Second);
  203. var endTime = new DateTime(TimeSearch_EndDate.Year, TimeSearch_EndDate.Month, TimeSearch_EndDate.Day,
  204. TimeSearch_EndTime.Hour, TimeSearch_EndTime.Minute, TimeSearch_EndTime.Second);
  205. var selectedCham = "";
  206. foreach (var item in CONTEXT.GetChamberList())
  207. {
  208. if (item.Value == TimeSearch_SelectedChamber)
  209. {
  210. selectedCham = item.Key;
  211. break;
  212. }
  213. }
  214. if (string.IsNullOrEmpty(selectedCham)) return;
  215. string reason;
  216. List<string> dataList;
  217. Dictionary<string, Tuple<string, List<string>>> virtualDevices;
  218. ReadDbDataNameList(beginTime, selectedCham, out reason, out dataList, out virtualDevices);
  219. if (dataList == null || dataList.Count == 0)
  220. {
  221. MessageBox.Show(string.Format("{0}在{1}没有数据记录,请重新选择数据源!", selectedCham, beginTime.ToString("yyyy/MM/dd")), "数据源选择警告", MessageBoxButton.OK, MessageBoxImage.Warning);
  222. return;
  223. }
  224. var singleDataSource = new PostgreSqlDataSource();
  225. singleDataSource.RecipeSteps = GetRecipeStepInfo(null);
  226. singleDataSource.BeginTime = beginTime;
  227. singleDataSource.ChamberName = selectedCham;
  228. singleDataSource.Datas = new Dictionary<string, DataItem>();
  229. foreach (string dataName in dataList)
  230. singleDataSource.Datas.Add(dataName, new DataItem() { DataName = dataName, RawData = new List<float>(), TimeStamp = new List<DateTime>() });
  231. //singleDataSource.AliasList = dataList;
  232. singleDataSource.VirtualDeviceTable = virtualDevices;
  233. singleDataSource.Description = "";//string.Format("{0}数据库文件,开始时间:{1},结束时间:{2}", selectedCham, BeginTime, EndTime);
  234. singleDataSource.EndTime = endTime;
  235. var chamName = CONTEXT.GetChamberList()[selectedCham];// Aitex.DataAnalysisControl.Core.Converter.ToCstring((ChamberSet)Enum.Parse(typeof(ChamberSet), selectedCham));
  236. singleDataSource.Title = string.Format("{0} {1}", chamName, beginTime.ToString("MM-dd HH:mm"));
  237. singleDataSource.TimeMove = new TimeSpan(0);
  238. singleDataSource.SyncPoint = singleDataSource.RecipeSteps.First();
  239. //SelectedDataSources = new List<IDataSource>();
  240. //SelectedDataSources.Add(singleDataSource);
  241. CommonViewModel.AddDataSource(singleDataSource);
  242. _view.Close();
  243. }
  244. }
  245. }