SystemConfigViewModel.cs 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380
  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 CyberX8_MainPages.Unity;
  18. using CyberX8_MainPages.Views;
  19. //using CyberX8_MainPages.Unity.SystemConfig;
  20. namespace CyberX8_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. }
  81. public void LoadData(string systemName)
  82. {
  83. ConfigNodes = SystemConfigProvider.Instance.GetConfigTree().SubNodes;
  84. }
  85. /// <summary>
  86. /// 隐藏
  87. /// </summary>
  88. public void Hide()
  89. {
  90. }
  91. //protected override void OnInitialize()
  92. //{
  93. // base.OnInitialize();
  94. // ConfigNodes = SystemConfigProvider.Instance.GetConfigTree().SubNodes;
  95. //}
  96. //输入关键字
  97. private void SearchTextChanged(object searchConfigItem)
  98. {
  99. List<string> searchResultList = new List<string>();
  100. //如果输入框为空,不显示提示词,并展开左侧栏
  101. if (string.IsNullOrEmpty((string)searchConfigItem) || searchConfigItem.ToString().Length<3)
  102. {
  103. ConfigNodes = SystemConfigProvider.Instance.GetConfigTree().SubNodes;
  104. SearchListBoxShow = Visibility.Hidden;
  105. }
  106. else
  107. {
  108. ConfigNodes = SystemConfigProvider.Instance.GetConfigTree().SubNodes;
  109. var itemslist = ConfigNodes.SelectMany(m => m.Items).ToList();
  110. if (SearchText != null)
  111. {
  112. SearchListBoxShow = Visibility.Visible;
  113. //根节点
  114. string searchResult = null;
  115. _InstalledModules = QueryDataClient.Instance.Service.GetConfig($"System.InstalledModules").ToString().Split(',');
  116. foreach (var ConfigNodesItems in ConfigNodes)
  117. {
  118. if (!_InstalledModules.Contains(ConfigNodesItems.Name) && ConfigNodesItems.Name != "System" && ConfigNodesItems.Name != "Recipe" && ConfigNodesItems.Name != "Scheduler")
  119. {
  120. ConfigNodesItems.IsShow = false;
  121. continue;
  122. }
  123. //根节点搜索
  124. if (ConfigNodesItems.Name.Contains(SearchText))
  125. {
  126. ConfigNodesItems.IsShow = true;//展开根节点
  127. _CurrentNodeName = SearchText;//TreeView节点
  128. searchResult = _CurrentNodeName;
  129. GetDataOfConfigItems();
  130. }
  131. else
  132. {
  133. ConfigNodesItems.IsShow = false;
  134. //二级节点搜索
  135. foreach (var SubNodesItems in ConfigNodesItems.SubNodes)
  136. {
  137. if (SubNodesItems.Name.ToLower().Contains(SearchText.ToLower()))
  138. {
  139. ConfigNodesItems.IsShow = true;
  140. SubNodesItems.IsShow = true;
  141. _CurrentNodeName = String.Format("{0}{1}{2}", ConfigNodesItems.Name, ".", SubNodesItems.Name);
  142. searchResult = _CurrentNodeName;
  143. GetDataOfConfigItems();
  144. }
  145. else
  146. {
  147. SubNodesItems.IsShow = false;
  148. //叶子节点搜索
  149. foreach (var Items in SubNodesItems.Items)
  150. {
  151. var searchResult1 = SubNodesItems.Items.FindAll(e => e.Name.ToLower().Contains(SearchText.ToLower()));
  152. if (Items.Name.ToLower().Contains(SearchText.ToLower()))
  153. {
  154. ConfigNodesItems.IsShow = true;
  155. SubNodesItems.IsShow = true;
  156. _CurrentNodeName = String.Format("{0}{1}{2}{3}{4}", ConfigNodesItems.Name, ".", SubNodesItems.Name, ".", Items.Name);
  157. searchResult = _CurrentNodeName;
  158. GetDataOfConfigItems();
  159. searchResultList.Add(_CurrentNodeName);
  160. }
  161. }
  162. }
  163. }
  164. }
  165. var searchResult2 = ConfigNodesItems.Items.FindAll(e => e.Name.ToLower().Contains(SearchText.ToLower()));
  166. if (searchResult2.Count != 0)
  167. {
  168. ConfigNodesItems.IsShow = true;
  169. _CurrentNodeName = SearchText;//TreeView节点
  170. searchResultList.Add(ConfigNodesItems.Name + "." + searchResult2[0].Name);
  171. searchResult = _CurrentNodeName;
  172. GetDataOfConfigItems();
  173. }
  174. //查询为空
  175. if (searchResult == null)
  176. {
  177. ConfigItems = null;
  178. }
  179. }
  180. }
  181. SearchResultCollection = searchResultList;
  182. if (searchResultList.Count > 0)
  183. {
  184. searchResultListHistory = searchResultList;
  185. }
  186. }
  187. }
  188. //选择选中项
  189. private void SelectSearchResult(object slectItem)
  190. {
  191. SearchResultCollection = searchResultListHistory;
  192. ConfigNodes = SystemConfigProvider.Instance.GetConfigTree().SubNodes;
  193. if (slectItem != null)
  194. {
  195. SearchText = slectItem.ToString();
  196. string[] searchResult = SearchText.Split('.');
  197. List<ConfigItem> ConfigItem = new List<ConfigItem>();
  198. //根节点下ConfigItems
  199. if (searchResult.Length == 2)
  200. {
  201. ConfigNodes.ForEach(e => e.IsShow = false);
  202. ConfigNode targetmodule = ConfigNodes.Find(e => e.Name.ToLower() == searchResult[0].ToLower());
  203. targetmodule.IsShow = true;
  204. targetmodule.SubNodes.ForEach(e => e.IsShow = false);
  205. _CurrentNodeName = string.IsNullOrEmpty(targetmodule.Path) ? targetmodule.Name : $"{targetmodule.Path}.{targetmodule.Name}";
  206. ConfigItems = targetmodule.Items.FindAll(e => e.Name.ToLower() == searchResult[1].ToLower());
  207. GetDataOfConfigItems();
  208. }
  209. //二级节点下ConfigItems
  210. if (searchResult.Length == 3)
  211. {
  212. ConfigNodes.ForEach(e => e.IsShow = false);
  213. ConfigNode targetmodule = ConfigNodes.Find(e => e.Name.ToLower() == searchResult[0].ToLower());
  214. targetmodule.IsShow = true;
  215. targetmodule.SubNodes.ForEach(e => e.IsShow = false);
  216. ConfigNode submodule = targetmodule.SubNodes.Find(e => e.Name.ToLower() == searchResult[1].ToLower());
  217. submodule.IsShow = true;
  218. _CurrentNodeName = string.IsNullOrEmpty(submodule.Path) ? submodule.Name : $"{submodule.Path}.{submodule.Name}";
  219. ConfigItems = submodule.Items.FindAll(e => e.Name.ToLower() == searchResult[2].ToLower());
  220. submodule.Items.FindAll(e => e.Name.ToLower() != searchResult[2].ToLower()).ForEach(e => e.Visible = false);
  221. GetDataOfConfigItems();
  222. }
  223. }
  224. }
  225. private void TreeViewSelectedItemChanged(object node)
  226. {
  227. var node2 = (ConfigNode)node;
  228. _CurrentNodeName = string.IsNullOrEmpty(node2.Path) ? node2.Name : $"{node2.Path}.{node2.Name}";
  229. string[] searchResult = null;
  230. if (SearchText == "" || SearchText == null)
  231. {
  232. ConfigItems = node2.Items;
  233. }
  234. else
  235. {
  236. searchResult = SearchText.Split('.');
  237. if (searchResult.Length == 2)
  238. {
  239. ConfigItems = node2.Items.FindAll(e => e.Name.ToLower() == searchResult[1].ToLower());
  240. }
  241. if (searchResult.Length == 3)
  242. {
  243. ConfigItems = node2.Items.FindAll(e => e.Name.ToLower() == searchResult[2].ToLower());
  244. }
  245. }
  246. GetDataOfConfigItems();
  247. }
  248. private void GetDataOfConfigItems()
  249. {
  250. if (ConfigItems == null)
  251. return;
  252. for (int i = 0; i < ConfigItems.Count; i++)
  253. {
  254. string key = String.Format("{0}{1}{2}", _CurrentNodeName, ".", ConfigItems[i].Name);
  255. ConfigItems[i].CurrentValue = SystemConfigProvider.Instance.GetValueByName(key);
  256. if (ConfigItems[i].Type == DataType.Bool)
  257. {
  258. bool value;
  259. if (bool.TryParse(ConfigItems[i].CurrentValue, out value))
  260. ConfigItems[i].BoolValue = value;
  261. }
  262. else
  263. ConfigItems[i].StringValue = ConfigItems[i].CurrentValue;
  264. }
  265. }
  266. private void SetValue(Object myitem)
  267. {
  268. //key :System.IsSimulatorMode
  269. //value: true or false 都是字符串
  270. //input check
  271. var item = (ConfigItem)myitem;
  272. string value;
  273. if (item.Type == DataType.Bool)
  274. {
  275. value = item.BoolValue.ToString().ToLower();
  276. }
  277. else
  278. {
  279. if (item.TextSaved)
  280. return;
  281. if (item.Type == DataType.Int)
  282. {
  283. int iValue;
  284. if (int.TryParse(item.StringValue, out iValue))
  285. {
  286. if (!double.IsNaN(item.Max) && !double.IsNaN(item.Min))
  287. {
  288. if (iValue > item.Max || iValue < item.Min)
  289. {
  290. //DialogBox.ShowWarning(string.Format("The value should be between {0} and {1}.", ((int)item.Min).ToString(), ((int)item.Max).ToString()));
  291. return;
  292. }
  293. }
  294. }
  295. else
  296. {
  297. //DialogBox.ShowWarning("Please input valid data.");
  298. return;
  299. }
  300. value = item.StringValue;
  301. }
  302. else if (item.Type == DataType.Double)
  303. {
  304. double fValue;
  305. if (double.TryParse(item.StringValue, out fValue))
  306. {
  307. if (!double.IsNaN(item.Max) && !double.IsNaN(item.Min))
  308. {
  309. if (fValue > item.Max || fValue < item.Min)
  310. {
  311. //DialogBox.ShowWarning(string.Format("The value should be between {0} and {1}.", item.Min.ToString(), item.Max.ToString()));
  312. return;
  313. }
  314. }
  315. }
  316. else
  317. {
  318. //DialogBox.ShowWarning("Please input valid data.");
  319. return;
  320. }
  321. value = item.StringValue;
  322. }
  323. else
  324. value = item.StringValue;
  325. }
  326. string key = String.Format("{0}{1}{2}", _CurrentNodeName, ".", item.Name);
  327. InvokeClient.Instance.Service.DoOperation("System.SetConfig", key, value);
  328. item.TextSaved = true;
  329. Reload();
  330. }
  331. public void Reload()
  332. {
  333. GetDataOfConfigItems();
  334. }
  335. public void SaveAll()
  336. {
  337. if (ConfigItems == null)
  338. return;
  339. ConfigItems.ForEach(item => SetValue(item));
  340. }
  341. }
  342. }