SystemConfigViewModel.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.Windows;
  7. using System.Windows.Controls;
  8. using System.Windows.Input;
  9. using Aitex.Core.RT.SCCore;
  10. using ControlzEx.Standard;
  11. using MECF.Framework.Common.DataCenter;
  12. using MECF.Framework.Common.Equipment;
  13. using MECF.Framework.Common.OperationCenter;
  14. using MECF.Framework.Common.Schedulers;
  15. using Prism.Commands;
  16. using Prism.Mvvm;
  17. using Venus_MainPages.Unity;
  18. using Venus_MainPages.Views;
  19. //using Venus_MainPages.Unity.SystemConfig;
  20. namespace Venus_MainPages.ViewModels
  21. {
  22. public class SystemConfigViewModel : BindableBase
  23. {
  24. #region 私有字段
  25. private List<ConfigNode> _ConfigNodes = new List<ConfigNode>();
  26. private List<ConfigItem> _configItems = null;
  27. private List<String> _SearchResultCollection = null;
  28. string _CurrentNodeName = string.Empty;
  29. private Visibility _Visibility = new Visibility();
  30. private string[] _InstalledModules = null;
  31. private string _SearchText;
  32. List<string> searchResultListHistory = new List<string>();
  33. public string SearchText
  34. {
  35. get { return _SearchText; }
  36. set { _SearchText = value; RaisePropertyChanged("SearchText"); }
  37. }
  38. #endregion
  39. #region 属性
  40. public List<ConfigNode> ConfigNodes
  41. {
  42. get { return _ConfigNodes; }
  43. set { _ConfigNodes = value; RaisePropertyChanged("ConfigNodes"); }
  44. }
  45. public List<String> SearchResultCollection
  46. {
  47. get { return _SearchResultCollection; }
  48. set { _SearchResultCollection = value; RaisePropertyChanged("SearchResultCollection"); }
  49. }
  50. public List<ConfigItem> ConfigItems
  51. {
  52. get { return _configItems; }
  53. set { _configItems = value; RaisePropertyChanged("ConfigItems"); }
  54. }
  55. public Visibility SearchListBoxShow
  56. {
  57. get { return _Visibility; }
  58. set { _Visibility = value; RaisePropertyChanged("SearchListBoxShow"); }
  59. }
  60. #region 命令
  61. private DelegateCommand<object> _TreeViewSelectedItemChangedCmd;
  62. public DelegateCommand<object> TreeViewSelectedItemChangedCmd =>
  63. _TreeViewSelectedItemChangedCmd ?? (_TreeViewSelectedItemChangedCmd = new DelegateCommand<object>(TreeViewSelectedItemChanged));
  64. #endregion
  65. #endregion
  66. #region 命令
  67. private DelegateCommand<object> _SetValueCommand;
  68. public DelegateCommand<object> SetValueCommand =>
  69. _SetValueCommand ?? (_SetValueCommand = new DelegateCommand<object>(SetValue));
  70. private DelegateCommand<object> _SearchTextChangedCommand;
  71. public DelegateCommand<object> SearchTextChangedCommand =>
  72. _SearchTextChangedCommand ?? (_SearchTextChangedCommand = new DelegateCommand<object>(SearchTextChanged));
  73. private DelegateCommand<object> _ListBoxSelectSearchResultCommand;
  74. public DelegateCommand<object> ListBoxSelectSearchResultCommand =>
  75. _ListBoxSelectSearchResultCommand ?? (_ListBoxSelectSearchResultCommand = new DelegateCommand<object>(SelectSearchResult));
  76. #endregion
  77. public SystemConfigViewModel()
  78. {
  79. SearchListBoxShow = Visibility.Hidden;
  80. ConfigNodes = SystemConfigProvider.Instance.GetConfigTree().SubNodes;
  81. }
  82. //protected override void OnInitialize()
  83. //{
  84. // base.OnInitialize();
  85. // ConfigNodes = SystemConfigProvider.Instance.GetConfigTree().SubNodes;
  86. //}
  87. //输入关键字
  88. private void SearchTextChanged(object searchConfigItem)
  89. {
  90. List<string> searchResultList = new List<string>();
  91. //如果输入框为空,不显示提示词,并展开左侧栏
  92. if (string.IsNullOrEmpty((string)searchConfigItem) || searchConfigItem.ToString().Length<3)
  93. {
  94. ConfigNodes = SystemConfigProvider.Instance.GetConfigTree().SubNodes;
  95. SearchListBoxShow = Visibility.Hidden;
  96. }
  97. else
  98. {
  99. ConfigNodes = SystemConfigProvider.Instance.GetConfigTree().SubNodes;
  100. var itemslist = ConfigNodes.SelectMany(m => m.Items).ToList();
  101. if (SearchText != null)
  102. {
  103. SearchListBoxShow = Visibility.Visible;
  104. //根节点
  105. string searchResult = null;
  106. _InstalledModules = QueryDataClient.Instance.Service.GetConfig($"System.InstalledModules").ToString().Split(',');
  107. foreach (var ConfigNodesItems in ConfigNodes)
  108. {
  109. if (!_InstalledModules.Contains(ConfigNodesItems.Name) && ConfigNodesItems.Name != "System" && ConfigNodesItems.Name != "Recipe" && ConfigNodesItems.Name != "Scheduler")
  110. {
  111. ConfigNodesItems.IsShow = false;
  112. continue;
  113. }
  114. //根节点搜索
  115. if (ConfigNodesItems.Name.Contains(SearchText))
  116. {
  117. ConfigNodesItems.IsShow = true;//展开根节点
  118. _CurrentNodeName = SearchText;//TreeView节点
  119. searchResult = _CurrentNodeName;
  120. GetDataOfConfigItems();
  121. }
  122. else
  123. {
  124. ConfigNodesItems.IsShow = false;
  125. //二级节点搜索
  126. foreach (var SubNodesItems in ConfigNodesItems.SubNodes)
  127. {
  128. if (SubNodesItems.Name.ToLower().Contains(SearchText.ToLower()))
  129. {
  130. ConfigNodesItems.IsShow = true;
  131. SubNodesItems.IsShow = true;
  132. _CurrentNodeName = String.Format("{0}{1}{2}", ConfigNodesItems.Name, ".", SubNodesItems.Name);
  133. searchResult = _CurrentNodeName;
  134. GetDataOfConfigItems();
  135. }
  136. else
  137. {
  138. SubNodesItems.IsShow = false;
  139. //叶子节点搜索
  140. foreach (var Items in SubNodesItems.Items)
  141. {
  142. var searchResult1 = SubNodesItems.Items.FindAll(e => e.Name.ToLower().Contains(SearchText.ToLower()));
  143. if (Items.Name.ToLower().Contains(SearchText.ToLower()))
  144. {
  145. ConfigNodesItems.IsShow = true;
  146. SubNodesItems.IsShow = true;
  147. _CurrentNodeName = String.Format("{0}{1}{2}{3}{4}", ConfigNodesItems.Name, ".", SubNodesItems.Name, ".", Items.Name);
  148. searchResult = _CurrentNodeName;
  149. GetDataOfConfigItems();
  150. searchResultList.Add(_CurrentNodeName);
  151. }
  152. }
  153. }
  154. }
  155. }
  156. var searchResult2 = ConfigNodesItems.Items.FindAll(e => e.Name.ToLower().Contains(SearchText.ToLower()));
  157. if (searchResult2.Count != 0)
  158. {
  159. ConfigNodesItems.IsShow = true;
  160. _CurrentNodeName = SearchText;//TreeView节点
  161. searchResultList.Add(ConfigNodesItems.Name + "." + searchResult2[0].Name);
  162. searchResult = _CurrentNodeName;
  163. GetDataOfConfigItems();
  164. }
  165. //查询为空
  166. if (searchResult == null)
  167. {
  168. ConfigItems = null;
  169. }
  170. }
  171. }
  172. SearchResultCollection = searchResultList;
  173. if (searchResultList.Count > 0)
  174. {
  175. searchResultListHistory = searchResultList;
  176. }
  177. }
  178. }
  179. //选择选中项
  180. private void SelectSearchResult(object slectItem)
  181. {
  182. SearchResultCollection = searchResultListHistory;
  183. ConfigNodes = SystemConfigProvider.Instance.GetConfigTree().SubNodes;
  184. if (slectItem != null)
  185. {
  186. SearchText = slectItem.ToString();
  187. string[] searchResult = SearchText.Split('.');
  188. List<ConfigItem> ConfigItem = new List<ConfigItem>();
  189. //根节点下ConfigItems
  190. if (searchResult.Length == 2)
  191. {
  192. ConfigNodes.ForEach(e => e.IsShow = false);
  193. ConfigNode targetmodule = ConfigNodes.Find(e => e.Name.ToLower() == searchResult[0].ToLower());
  194. targetmodule.IsShow = true;
  195. targetmodule.SubNodes.ForEach(e => e.IsShow = false);
  196. _CurrentNodeName = string.IsNullOrEmpty(targetmodule.Path) ? targetmodule.Name : $"{targetmodule.Path}.{targetmodule.Name}";
  197. ConfigItems = targetmodule.Items.FindAll(e => e.Name.ToLower() == searchResult[1].ToLower());
  198. GetDataOfConfigItems();
  199. }
  200. //二级节点下ConfigItems
  201. if (searchResult.Length == 3)
  202. {
  203. ConfigNodes.ForEach(e => e.IsShow = false);
  204. ConfigNode targetmodule = ConfigNodes.Find(e => e.Name.ToLower() == searchResult[0].ToLower());
  205. targetmodule.IsShow = true;
  206. targetmodule.SubNodes.ForEach(e => e.IsShow = false);
  207. ConfigNode submodule = targetmodule.SubNodes.Find(e => e.Name.ToLower() == searchResult[1].ToLower());
  208. submodule.IsShow = true;
  209. _CurrentNodeName = string.IsNullOrEmpty(submodule.Path) ? submodule.Name : $"{submodule.Path}.{submodule.Name}";
  210. ConfigItems = submodule.Items.FindAll(e => e.Name.ToLower() == searchResult[2].ToLower());
  211. submodule.Items.FindAll(e => e.Name.ToLower() != searchResult[2].ToLower()).ForEach(e => e.Visible = false);
  212. GetDataOfConfigItems();
  213. }
  214. }
  215. }
  216. private void TreeViewSelectedItemChanged(object node)
  217. {
  218. var node2 = (ConfigNode)node;
  219. _CurrentNodeName = string.IsNullOrEmpty(node2.Path) ? node2.Name : $"{node2.Path}.{node2.Name}";
  220. string[] searchResult = null;
  221. if (SearchText == "" || SearchText == null)
  222. {
  223. ConfigItems = node2.Items;
  224. }
  225. else
  226. {
  227. searchResult = SearchText.Split('.');
  228. if (searchResult.Length == 2)
  229. {
  230. ConfigItems = node2.Items.FindAll(e => e.Name.ToLower() == searchResult[1].ToLower());
  231. }
  232. if (searchResult.Length == 3)
  233. {
  234. ConfigItems = node2.Items.FindAll(e => e.Name.ToLower() == searchResult[2].ToLower());
  235. }
  236. }
  237. GetDataOfConfigItems();
  238. }
  239. private void GetDataOfConfigItems()
  240. {
  241. if (ConfigItems == null)
  242. return;
  243. for (int i = 0; i < ConfigItems.Count; i++)
  244. {
  245. string key = String.Format("{0}{1}{2}", _CurrentNodeName, ".", ConfigItems[i].Name);
  246. ConfigItems[i].CurrentValue = SystemConfigProvider.Instance.GetValueByName(key);
  247. if (ConfigItems[i].Type == DataType.Bool)
  248. {
  249. bool value;
  250. if (bool.TryParse(ConfigItems[i].CurrentValue, out value))
  251. ConfigItems[i].BoolValue = value;
  252. }
  253. else
  254. ConfigItems[i].StringValue = ConfigItems[i].CurrentValue;
  255. }
  256. }
  257. private void SetValue(Object myitem)
  258. {
  259. //key :System.IsSimulatorMode
  260. //value: true or false 都是字符串
  261. //input check
  262. var item = (ConfigItem)myitem;
  263. string value;
  264. if (item.Type == DataType.Bool)
  265. {
  266. value = item.BoolValue.ToString().ToLower();
  267. }
  268. else
  269. {
  270. if (item.TextSaved)
  271. return;
  272. if (item.Type == DataType.Int)
  273. {
  274. int iValue;
  275. if (int.TryParse(item.StringValue, out iValue))
  276. {
  277. if (!double.IsNaN(item.Max) && !double.IsNaN(item.Min))
  278. {
  279. if (iValue > item.Max || iValue < item.Min)
  280. {
  281. //DialogBox.ShowWarning(string.Format("The value should be between {0} and {1}.", ((int)item.Min).ToString(), ((int)item.Max).ToString()));
  282. return;
  283. }
  284. }
  285. }
  286. else
  287. {
  288. //DialogBox.ShowWarning("Please input valid data.");
  289. return;
  290. }
  291. value = item.StringValue;
  292. }
  293. else if (item.Type == DataType.Double)
  294. {
  295. double fValue;
  296. if (double.TryParse(item.StringValue, out fValue))
  297. {
  298. if (!double.IsNaN(item.Max) && !double.IsNaN(item.Min))
  299. {
  300. if (fValue > item.Max || fValue < item.Min)
  301. {
  302. //DialogBox.ShowWarning(string.Format("The value should be between {0} and {1}.", item.Min.ToString(), item.Max.ToString()));
  303. return;
  304. }
  305. }
  306. }
  307. else
  308. {
  309. //DialogBox.ShowWarning("Please input valid data.");
  310. return;
  311. }
  312. value = item.StringValue;
  313. }
  314. else
  315. value = item.StringValue;
  316. }
  317. string key = String.Format("{0}{1}{2}", _CurrentNodeName, ".", item.Name);
  318. InvokeClient.Instance.Service.DoOperation("System.SetConfig", key, value);
  319. item.TextSaved = true;
  320. Reload();
  321. }
  322. public void Reload()
  323. {
  324. GetDataOfConfigItems();
  325. }
  326. public void SaveAll()
  327. {
  328. if (ConfigItems == null)
  329. return;
  330. ConfigItems.ForEach(item => SetValue(item));
  331. }
  332. }
  333. }