RecipeGASSettingViewModel.cs 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627
  1. using Aitex.Core.Common.DeviceData;
  2. using Caliburn.Micro;
  3. using Caliburn.Micro.Core;
  4. using FurnaceUI.Models;
  5. using MECF.Framework.Common.DataCenter;
  6. using MECF.Framework.Common.OperationCenter;
  7. using MECF.Framework.Common.RecipeCenter;
  8. using MECF.Framework.UI.Client.CenterViews.Configs.SystemConfig;
  9. using MECF.Framework.UI.Client.CenterViews.Dialogs;
  10. using MECF.Framework.UI.Client.CenterViews.Editors.Recipe;
  11. using RecipeEditorLib.RecipeModel.Params;
  12. using System;
  13. using System.Collections.Generic;
  14. using System.Collections.ObjectModel;
  15. using System.Linq;
  16. using System.Windows;
  17. using System.Windows.Controls;
  18. namespace FurnaceUI.Views.Editors
  19. {
  20. public class RecipeGASSettingViewModel : FurnaceUIViewModelBase
  21. {
  22. public ObservableCollection<BoolParam> ValveSets { get; set; } = new ObservableCollection<BoolParam>();
  23. public Dictionary<string, bool> ExternalOutSets { get; set; } = new Dictionary<string, bool>();
  24. //public Dictionary<string, MFCData> MFCSets { get; set; } = new Dictionary<string, MFCData>();
  25. public ObservableCollection<MFCData> MFCSets { get; set; } = new ObservableCollection<MFCData>();
  26. public Dictionary<string, MFMValue> MFMSets { get; set; } = new Dictionary<string, MFMValue>();
  27. //public MFMValue MFMSets { get; set; } = new MFMValue();
  28. public bool IsSave { get; set; } = false;
  29. private bool _eXOU1 = false;
  30. public bool EXOU1
  31. {
  32. get => _eXOU1;
  33. set
  34. {
  35. _eXOU1 = value;
  36. NotifyOfPropertyChange("EXOU1");
  37. }
  38. }
  39. private bool _eXOU2 = false;
  40. public bool EXOU2
  41. {
  42. get => _eXOU2;
  43. set
  44. {
  45. _eXOU2 = value;
  46. NotifyOfPropertyChange("EXOU2");
  47. }
  48. }
  49. private bool _eXOU3 = false;
  50. public bool EXOU3
  51. {
  52. get => _eXOU3;
  53. set
  54. {
  55. _eXOU3 = value;
  56. NotifyOfPropertyChange("EXOU3");
  57. }
  58. }
  59. private bool _eXOU4 = false;
  60. public bool EXOU4
  61. {
  62. get => _eXOU4;
  63. set
  64. {
  65. _eXOU4 = value;
  66. NotifyOfPropertyChange("EXOU4");
  67. }
  68. }
  69. private bool _eXOU5 = false;
  70. public bool EXOU5
  71. {
  72. get => _eXOU5;
  73. set
  74. {
  75. _eXOU5 = value;
  76. NotifyOfPropertyChange("EXOU5");
  77. }
  78. }
  79. private bool _eXOU6 = false;
  80. public bool EXOU6
  81. {
  82. get => _eXOU6;
  83. set
  84. {
  85. _eXOU6 = value;
  86. NotifyOfPropertyChange("EXOU6");
  87. }
  88. }
  89. private Visibility _gridMFCVisibility = Visibility.Hidden;
  90. public Visibility GridMFCVisibility
  91. {
  92. get => _gridMFCVisibility;
  93. set
  94. {
  95. _gridMFCVisibility = value;
  96. NotifyOfPropertyChange("GridMFCVisibility");
  97. }
  98. }
  99. private Visibility _gridMFMVisibility = Visibility.Hidden;
  100. public Visibility GridMFMVisibility
  101. {
  102. get => _gridMFMVisibility;
  103. set
  104. {
  105. _gridMFMVisibility = value;
  106. NotifyOfPropertyChange("GridMFMVisibility");
  107. }
  108. }
  109. private Visibility _gridValveVisibility = Visibility.Hidden;
  110. public Visibility GridValveVisibility
  111. {
  112. get => _gridValveVisibility;
  113. set
  114. {
  115. _gridValveVisibility = value;
  116. NotifyOfPropertyChange("GridValveVisibility");
  117. }
  118. }
  119. private string _Value;
  120. public string Value
  121. {
  122. get => _Value;
  123. set
  124. {
  125. _Value = value;
  126. NotifyOfPropertyChange("Value");
  127. }
  128. }
  129. public Dictionary<string, ObservableCollection<RecipeTemplateColumnBase>> _recipeTemplate;
  130. public Dictionary<string, ObservableCollection<RecipeTemplateColumnBase>> RecipeTemplate
  131. {
  132. get => _recipeTemplate;
  133. set
  134. {
  135. _recipeTemplate = value;
  136. ValveTemplateColumn = RecipeTemplate["Valve"];
  137. if (RecipeType != "Sub" && RecipeType != "Abort Sub" && RecipeType != "Abort")
  138. {
  139. foreach (var valve in ValveTemplateColumn)
  140. {
  141. valve.IsEnable = IsEnable;
  142. int iCount = valve.Options.Count;
  143. for (int i = 0; i < iCount; i++)
  144. {
  145. if (valve.Options[i].ControlName.Contains("Continue"))
  146. valve.Options.RemoveAt(i);
  147. }
  148. }
  149. }
  150. MFMTemplateColumn = RecipeTemplate["MFM"];
  151. MFMDataList.Clear();
  152. foreach (var item in MFMTemplateColumn)
  153. {
  154. MFMDataList.Add(new MFMData()
  155. {
  156. ControlName = item.ControlName,
  157. DisplayName = item.DisplayName,
  158. SetValue = new StringParam() { Name = "SetValue", Value = MFMSets[item.ControlName].Value.ToString() },
  159. AlarmValue = MFMSets[item.ControlName].AlarmValue,
  160. Name = SystemConfigProvider.Instance.GetValueByName($"PM1.MFM.{item.ModuleName}.Name"),
  161. Unit = SystemConfigProvider.Instance.GetValueByName($"PM1.MFM.{item.ModuleName}.FlowUnit"),
  162. MaxValue = new DoubleParam() { Name = "MaxValue", Value = SystemConfigProvider.Instance.GetValueByName($"PM1.MFM.{item.ModuleName}.N2Scale")},
  163. IsEnable = IsEnable
  164. });
  165. }
  166. MFCTemplateColumn = RecipeTemplate["MFC"];
  167. foreach (var item in MFCTemplateColumn)
  168. {
  169. var isInstalled = QueryDataClient.Instance.Service.GetConfig($"PM1.MFC.{item.ModuleName}.IsMFCInstalled");
  170. if (!(bool)isInstalled) continue;
  171. var mfc = MFCSets.FirstOrDefault(x => x.ControlName == item.ModuleName);
  172. if (mfc != null)
  173. {
  174. mfc.SetValue.Value = item.Value.ToString();
  175. mfc.DisplayName = SystemConfigProvider.Instance.GetValueByName($"PM1.MFC.{item.ModuleName}.GasName");
  176. mfc.Unit = SystemConfigProvider.Instance.GetValueByName($"PM1.MFC.{item.ModuleName}.FlowUnit");
  177. mfc.MaxValue.Value = SystemConfigProvider.Instance.GetValueByName($"PM1.MFC.{item.ModuleName}.N2Scale");
  178. mfc.IsEnable = IsEnable;
  179. }
  180. }
  181. NotifyOfPropertyChange("RecipeTemplate");
  182. }
  183. }
  184. private ObservableCollection<RecipeTemplateColumnBase> _valveTemplateColumn;
  185. public ObservableCollection<RecipeTemplateColumnBase> ValveTemplateColumn
  186. {
  187. get => _valveTemplateColumn;
  188. set
  189. {
  190. _valveTemplateColumn = value;
  191. CreateDictDefault();
  192. NotifyOfPropertyChange("ValveTemplateColumn");
  193. }
  194. }
  195. private ObservableCollection<RecipeTemplateColumnBase> _mFMTemplateColumn;
  196. public ObservableCollection<RecipeTemplateColumnBase> MFMTemplateColumn
  197. {
  198. get => _mFMTemplateColumn;
  199. set
  200. {
  201. _mFMTemplateColumn = value;
  202. NotifyOfPropertyChange("MFMTemplateColumn");
  203. }
  204. }
  205. private ObservableCollection<RecipeTemplateColumnBase> _mFCTemplateColumn;
  206. public ObservableCollection<RecipeTemplateColumnBase> MFCTemplateColumn
  207. {
  208. get => _mFCTemplateColumn;
  209. set
  210. {
  211. _mFCTemplateColumn = value;
  212. NotifyOfPropertyChange("MFCTemplateColumn");
  213. }
  214. }
  215. private ObservableCollection<MFMData> _mFMDatas = new ObservableCollection<MFMData>();
  216. public ObservableCollection<MFMData> MFMDataList
  217. {
  218. get => _mFMDatas;
  219. set
  220. {
  221. _mFMDatas = value;
  222. NotifyOfPropertyChange("MFMDataList");
  223. }
  224. }
  225. private void CreateDictDefault()
  226. {
  227. foreach (var item in _valveTemplateColumn)
  228. {
  229. var tempVal = ValveSets.FirstOrDefault(x => x.Name == item.ControlName);
  230. if (tempVal==null)
  231. {
  232. ValveSets.Add(new BoolParam() { Name = item.ControlName ,Value=false});
  233. }
  234. }
  235. }
  236. public bool IsEnable => CGlobal.RecipeProcessEditViewEnable;//是否是View模式
  237. public string RecipeType { get; set; }
  238. public RecipeGASSettingViewModel()
  239. {
  240. for (int i = 1; i < 7; i++)
  241. {
  242. ExternalOutSets.Add($"EXOU{i}", false);
  243. }
  244. }
  245. protected override void OnViewLoaded(object view)
  246. {
  247. base.OnViewLoaded(view);
  248. GridMFCVisibility = Visibility.Visible;
  249. RefreshUpdate();
  250. }
  251. private string ShowNumberKeyboard(Control control, string defaultValue)
  252. {
  253. NumberKeyboard numberKeyboard = new NumberKeyboard("", defaultValue);
  254. var point = control.PointFromScreen(new Point(0, 0));
  255. double wx = SystemParameters.WorkArea.Width;
  256. double hy = SystemParameters.WorkArea.Height;
  257. if (-point.Y + control.ActualHeight + 5 + numberKeyboard.Height < hy)
  258. {
  259. numberKeyboard.Top = -point.Y + control.ActualHeight + 5;
  260. }
  261. else
  262. {
  263. numberKeyboard.Top = -point.Y - numberKeyboard.Height - 5;
  264. }
  265. if (-point.X + numberKeyboard.Width < wx)
  266. {
  267. numberKeyboard.Left = -point.X;
  268. }
  269. else
  270. {
  271. numberKeyboard.Left = -point.X - (numberKeyboard.Width - control.ActualWidth);
  272. }
  273. if ((bool)numberKeyboard.ShowDialog())
  274. return numberKeyboard.ValueString;
  275. else
  276. return "Cancel";
  277. }
  278. public void MFCChangedCmd(object senderName, object sender, object typeName)
  279. {
  280. var controlName = (string)senderName;
  281. var tempMFCTemplateColumn = MFCTemplateColumn.Where(x => x.ModuleName == controlName).FirstOrDefault();
  282. if (tempMFCTemplateColumn != null)
  283. {
  284. switch (typeName.ToString())
  285. {
  286. //case "Status":
  287. // SwitchDialog dlg = new SwitchDialog();
  288. // dlg.IsOpen = MFCDataList.Where(x => x.ControlName == controlName).FirstOrDefault().Status == "Open";
  289. // dlg.WindowStartupLocation = WindowStartupLocation.CenterScreen;
  290. // dlg.ShowDialog();
  291. // if (dlg.IsSave)
  292. // {
  293. // MFCDataList.Where(x => x.ControlName == controlName).FirstOrDefault().Status = dlg.IsOpen ? "Open" : "Close";
  294. // }
  295. // break;
  296. case "Value":
  297. string strRetValue = ShowNumberKeyboard(sender as Button, "");
  298. if (strRetValue != "Cancel")
  299. {
  300. //MFCTemplateColumn.Where(x => x.ControlName == controlName).FirstOrDefault().Value = double.Parse(strRetValue);
  301. MFCSets.Where(x => x.ControlName == controlName).FirstOrDefault().SetValue.Value = strRetValue;
  302. }
  303. break;
  304. case "Rampng":
  305. strRetValue = ShowNumberKeyboard(sender as Button, "");
  306. if (strRetValue != "Cancel")
  307. {
  308. MFCSets.Where(x => x.ControlName == controlName).FirstOrDefault().Rampng.Value = strRetValue;
  309. }
  310. break;
  311. case "AlarmValue":
  312. RecipeGASSettingMFCAlarmViewModel view = new RecipeGASSettingMFCAlarmViewModel(MFCSets.Where(x => x.ControlName == controlName).FirstOrDefault().AlarmValue.ToString());
  313. WindowManager wm = IoC.Get<IWindowManager>() as WindowManager;
  314. if (!(bool)wm.ShowDialogWithTitle(view, null, "Select Flow Alarm Table")) break;
  315. MFCSets.Where(x => x.ControlName == controlName).FirstOrDefault().AlarmValue = view.CurrentValue;
  316. break;
  317. default:
  318. break;
  319. }
  320. var mfcData = MFCSets.Where(x => x.ControlName == controlName).FirstOrDefault();
  321. if (mfcData != null)
  322. {
  323. InvokeClient.Instance.Service.DoOperation($"PM1.{controlName}.SetMfcVirtualValue", $"{mfcData.SetValue};{mfcData.Rampng};{mfcData.AlarmValue}");
  324. }
  325. NotifyOfPropertyChange("MFCTemplateColumn");
  326. }
  327. }
  328. public void MFMChangedCmd(object senderName, object sender, object typeName)
  329. {
  330. var controlName = (string)senderName;
  331. var control = (Button)sender;
  332. var tempMFMTemplateColumn = MFMTemplateColumn.Where(x => x.ControlName == controlName).FirstOrDefault();
  333. if (tempMFMTemplateColumn != null)
  334. {
  335. switch (typeName.ToString())
  336. {
  337. case "Value":
  338. string strRetValue = ShowNumberKeyboard(sender as Button, $"{tempMFMTemplateColumn.Value}");
  339. if (strRetValue != "Cancel")
  340. {
  341. MFMTemplateColumn.Where(x => x.ControlName == controlName).FirstOrDefault().Value = double.Parse(strRetValue);
  342. MFMDataList.Where(x => x.ControlName == controlName).FirstOrDefault().SetValue.Value = strRetValue;
  343. NotifyOfPropertyChange("MFMTemplateColumn");
  344. }
  345. break;
  346. case "AlarmValue":
  347. RecipeGASSettingMFCAlarmViewModel view = new RecipeGASSettingMFCAlarmViewModel(MFMDataList.Where(x => x.ControlName == controlName).FirstOrDefault().AlarmValue.ToString());
  348. WindowManager wm = IoC.Get<IWindowManager>() as WindowManager;
  349. if (!(bool)wm.ShowDialogWithTitle(view, null, "Select Flow Alarm Table")) break;
  350. MFMDataList.Where(x => x.ControlName == controlName).FirstOrDefault().AlarmValue = view.CurrentValue;
  351. break;
  352. }
  353. }
  354. }
  355. public void GASValveSelectionChanged(object sender, object e)
  356. {
  357. var obj = (RecipeTemplateColumnBase)((ComboBox)sender).DataContext;
  358. bool isOpen = false;
  359. if (obj.SelectedValueIndex == 0)
  360. {
  361. isOpen = false;
  362. }
  363. else if (obj.SelectedValueIndex == 1)
  364. {
  365. isOpen = true;
  366. }
  367. InvokeClient.Instance.Service.DoOperation($"PM1.{obj.ControlName}.{AITValveOperation.GVVirtualTurnValve}", isOpen);
  368. }
  369. public void MFCShowVauleCmd(object senderName, object sender, object maxValue)
  370. {
  371. var windowManager = IoC.Get<IWindowManager>();
  372. var controlName = (string)senderName;
  373. var control = (Button)sender;
  374. RecipeFlowSettingViewModel recipeFlowSettingViewModel = new RecipeFlowSettingViewModel();
  375. recipeFlowSettingViewModel.RecipeType = RecipeType;
  376. recipeFlowSettingViewModel.SelectMfcFlow = controlName;
  377. recipeFlowSettingViewModel.SelectFlowValue = control.Content.ToString().Contains("Force") ? "0.0" : control.Content.ToString();
  378. recipeFlowSettingViewModel.MaxValue = Convert.ToDouble(maxValue);
  379. if ((bool)(windowManager as WindowManager)?.ShowDialogWithTitle(recipeFlowSettingViewModel, null, "Recipe Flow Setting"))
  380. {
  381. Value = recipeFlowSettingViewModel.SelectFlow;
  382. MFCSets.Where(x => x.ControlName == controlName).FirstOrDefault().SetValue.Value = recipeFlowSettingViewModel.SelectFlow;
  383. var mfcData = MFCSets.Where(x => x.ControlName == controlName).FirstOrDefault();
  384. if (mfcData != null)
  385. {
  386. InvokeClient.Instance.Service.DoOperation($"PM1.{controlName}.SetMfcVirtualValue", $"{mfcData.SetValue};{mfcData.Rampng};{mfcData.AlarmValue}");
  387. }
  388. NotifyOfPropertyChange("MFCTemplateColumn");
  389. }
  390. }
  391. public void GASSettingSave()
  392. {
  393. IsSave = true;
  394. if (_valveTemplateColumn != null)
  395. {
  396. foreach (var item in _valveTemplateColumn)
  397. {
  398. var tempVal = ValveSets?.FirstOrDefault(x => x.Name == item.ControlName);
  399. if (tempVal != null)
  400. {
  401. switch (item.SelectedValueIndex)
  402. {
  403. case 0:
  404. tempVal.Value = false;
  405. break;
  406. case 1:
  407. tempVal.Value = true;
  408. break;
  409. case 2:
  410. tempVal.Value = false;//"Continue"
  411. break;
  412. }
  413. //ValveSets[item.ControlName] = item.SelectedValueIndex == 0 ? "Close" : "Open";
  414. }
  415. else
  416. {
  417. BoolParam valveSet = new BoolParam() { Name = item.ControlName, Value = false };
  418. switch (item.SelectedValueIndex)
  419. {
  420. case 0:
  421. valveSet.Value = false;
  422. break;
  423. case 1:
  424. valveSet.Value = true;
  425. break;
  426. case 2:
  427. valveSet.Value = false;// "Continue";
  428. break;
  429. }
  430. ValveSets.Add(valveSet);
  431. }
  432. }
  433. if (_mFCTemplateColumn != null)
  434. {
  435. }
  436. if (_mFMTemplateColumn != null)
  437. {
  438. foreach (var item in MFMDataList)
  439. {
  440. if (MFMSets != null)
  441. {
  442. //MFMSets.Value = item.Value.ToString();
  443. //MFMSets.AlarmValue = item.AlarmValue.ToString();
  444. if (MFMSets.ContainsKey(item.ControlName))
  445. {
  446. MFMSets[item.ControlName].Value = item.SetValue.ToString();
  447. MFMSets[item.ControlName].AlarmValue = item.AlarmValue.ToString();
  448. }
  449. else
  450. {
  451. MFMSets.Add(item.ControlName, new MFMValue()
  452. {
  453. Value = item.SetValue.Value,
  454. AlarmValue = item.AlarmValue.ToString(),
  455. Name = item.Name,
  456. });
  457. }
  458. }
  459. }
  460. }
  461. ExternalOutSets["EXOU1"] = EXOU1;
  462. ExternalOutSets["EXOU2"] = EXOU2;
  463. ExternalOutSets["EXOU3"] = EXOU3;
  464. ExternalOutSets["EXOU4"] = EXOU4;
  465. ExternalOutSets["EXOU5"] = EXOU5;
  466. ExternalOutSets["EXOU6"] = EXOU6;
  467. ((Window)GetView()).DialogResult = true;
  468. }
  469. }
  470. public void GASSettingCancel()
  471. {
  472. ((Window)GetView()).DialogResult = false;
  473. }
  474. public void GASSettingSelectCmd(string cmd)
  475. {
  476. GridMFCVisibility = Visibility.Hidden;
  477. GridMFMVisibility = Visibility.Hidden;
  478. GridValveVisibility = Visibility.Hidden;
  479. switch (cmd)
  480. {
  481. case "MFC":
  482. GridMFCVisibility = Visibility.Visible;
  483. break;
  484. case "MFM":
  485. GridMFMVisibility = Visibility.Visible;
  486. break;
  487. case "Valve":
  488. GridValveVisibility = Visibility.Visible;
  489. break;
  490. default:
  491. break;
  492. }
  493. }
  494. public void RefreshUpdate()
  495. {
  496. foreach (var item in ValveTemplateColumn)
  497. {
  498. var tempVal = ValveSets.FirstOrDefault(x => x.Name == item.ControlName);
  499. if (ValveSets != null && tempVal != null)
  500. {
  501. if (tempVal.Value)
  502. { item.SelectedValueIndex = 0; }
  503. else
  504. {
  505. item.SelectedValueIndex = 1;
  506. }
  507. //case "Continue":
  508. // item.SelectedValueIndex = 2;
  509. // break;
  510. }
  511. //item.SelectedValueIndex = ValveSets[item.ControlName] == "Close" ? 0 : 1;
  512. }
  513. //if (MFCSets != null)
  514. //{
  515. // foreach (var item in MFCSets)
  516. // {
  517. // string getMFCName = item.Replace(".Flow", "").Trim();
  518. // if (MFCDataList.Where(x => x.ControlName== getMFCName).FirstOrDefault() != null)
  519. // {
  520. // MFCDataList.Where(x => x.ControlName == getMFCName).FirstOrDefault().SetValueParam = MFCSets[item].SetValueParam;
  521. // }
  522. // }
  523. //}
  524. if (ExternalOutSets != null && ExternalOutSets.Count > 0)
  525. {
  526. foreach (var item in ExternalOutSets.Keys)
  527. {
  528. switch (item)
  529. {
  530. case "EXOU1":
  531. EXOU1 = ExternalOutSets[item];
  532. break;
  533. case "EXOU2":
  534. EXOU2 = ExternalOutSets[item];
  535. break;
  536. case "EXOU3":
  537. EXOU3 = ExternalOutSets[item];
  538. break;
  539. case "EXOU4":
  540. EXOU4 = ExternalOutSets[item];
  541. break;
  542. case "EXOU5":
  543. EXOU5 = ExternalOutSets[item];
  544. break;
  545. case "EXOU6":
  546. EXOU6 = ExternalOutSets[item];
  547. break;
  548. default:
  549. break;
  550. }
  551. }
  552. }
  553. }
  554. }
  555. }