CreateJobViewModel.cs 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438
  1. using Aitex.Core.RT.Log;
  2. using Aitex.Core.Util;
  3. using Caliburn.Micro;
  4. using Caliburn.Micro.Core;
  5. using FurnaceUI.Common;
  6. using FurnaceUI.Models;
  7. using MECF.Framework.Common.DataCenter;
  8. using MECF.Framework.Common.OperationCenter;
  9. using MECF.Framework.Common.SubstrateTrackings;
  10. using MECF.Framework.UI.Client.CenterViews.Editors.Recipe;
  11. using MECF.Framework.UI.Client.CenterViews.Editors.Sequence;
  12. using OpenSEMI.ClientBase;
  13. using System;
  14. using System.Collections.Generic;
  15. using System.Collections.ObjectModel;
  16. using System.Linq;
  17. using System.Text;
  18. using System.Threading.Tasks;
  19. using System.Windows;
  20. using System.Xml;
  21. namespace FurnaceUI.Views.Jobs
  22. {
  23. public class CreateJobViewModel : FurnaceModuleUIViewModelBase
  24. {
  25. public string JobType { get; set; }
  26. public string JobText => JobType == "PJ" ? "PJ ID" : "CJ ID";
  27. public string PCarrierPara { get; set; }
  28. public string M1CarrierPara { get; set; }
  29. public string M2CarrierPara { get; set; }
  30. public bool IsOnlyCharge { get; set; }
  31. public ObservableCollection<CarrierInformation> SelectCarrierList { get; set; } = new ObservableCollection<CarrierInformation>();
  32. private string _jobID;
  33. public string JobID
  34. {
  35. get
  36. {
  37. return _jobID;
  38. }
  39. set
  40. {
  41. _jobID = value;
  42. NotifyOfPropertyChange("JobID");
  43. }
  44. }
  45. private string _cjID;
  46. public string CJID
  47. {
  48. get
  49. {
  50. return _cjID;
  51. }
  52. set
  53. {
  54. _cjID = value;
  55. NotifyOfPropertyChange("CJID");
  56. }
  57. }
  58. private string _pjID;
  59. public string PJID
  60. {
  61. get
  62. {
  63. return _pjID;
  64. }
  65. set
  66. {
  67. _pjID = value;
  68. NotifyOfPropertyChange("PJID");
  69. }
  70. }
  71. public CreateJobViewModel()
  72. {
  73. }
  74. private readonly RecipeProvider _recipeProvider = new RecipeProvider();
  75. public RecipeDataJob CurrentRecipe { get; set; } = new RecipeDataJob();
  76. public string ExecCommand { get; set; }
  77. #region Stocker Carrier Info
  78. [Subscription("Stocker1.Carrier")]
  79. public CarrierInfo Stocker1CarrierData { get; set; }
  80. [Subscription("Stocker2.Carrier")]
  81. public CarrierInfo Stocker2CarrierData { get; set; }
  82. [Subscription("Stocker3.Carrier")]
  83. public CarrierInfo Stocker3CarrierData { get; set; }
  84. [Subscription("Stocker4.Carrier")]
  85. public CarrierInfo Stocker4CarrierData { get; set; }
  86. [Subscription("Stocker5.Carrier")]
  87. public CarrierInfo Stocker5CarrierData { get; set; }
  88. [Subscription("Stocker6.Carrier")]
  89. public CarrierInfo Stocker6CarrierData { get; set; }
  90. [Subscription("Stocker7.Carrier")]
  91. public CarrierInfo Stocker7CarrierData { get; set; }
  92. [Subscription("Stocker8.Carrier")]
  93. public CarrierInfo Stocker8CarrierData { get; set; }
  94. [Subscription("Stocker9.Carrier")]
  95. public CarrierInfo Stocker9CarrierData { get; set; }
  96. [Subscription("Stocker10.Carrier")]
  97. public CarrierInfo Stocker10CarrierData { get; set; }
  98. [Subscription("Stocker11.Carrier")]
  99. public CarrierInfo Stocker11CarrierData { get; set; }
  100. [Subscription("Stocker12.Carrier")]
  101. public CarrierInfo Stocker12CarrierData { get; set; }
  102. [Subscription("Stocker13.Carrier")]
  103. public CarrierInfo Stocker13CarrierData { get; set; }
  104. [Subscription("Stocker14.Carrier")]
  105. public CarrierInfo Stocker14CarrierData { get; set; }
  106. [Subscription("Stocker15.Carrier")]
  107. public CarrierInfo Stocker15CarrierData { get; set; }
  108. [Subscription("Stocker16.Carrier")]
  109. public CarrierInfo Stocker16CarrierData { get; set; }
  110. [Subscription("Stocker17.Carrier")]
  111. public CarrierInfo Stocker17CarrierData { get; set; }
  112. [Subscription("Stocker18.Carrier")]
  113. public CarrierInfo Stocker18CarrierData { get; set; }
  114. #endregion
  115. List<CarrierInfo> _carrierlist = new List<CarrierInfo>();
  116. ObservableCollection<CarrierInfo> _stockerList = new ObservableCollection<CarrierInfo>();
  117. protected override void OnInitialize()
  118. {
  119. base.OnInitialize();
  120. }
  121. protected override void InvokeAfterUpdateProperty(Dictionary<string, object> data)
  122. {
  123. base.InvokeAfterUpdateProperty(data);
  124. _stockerList.Clear();
  125. if (Stocker1CarrierData != null) { Stocker1CarrierData.StockerIndex = 1; _stockerList.Add(Stocker1CarrierData); }
  126. if (Stocker2CarrierData != null) { Stocker2CarrierData.StockerIndex = 2; _stockerList.Add(Stocker2CarrierData); }
  127. if (Stocker3CarrierData != null) { Stocker3CarrierData.StockerIndex = 3; _stockerList.Add(Stocker3CarrierData); }
  128. if (Stocker4CarrierData != null) { Stocker4CarrierData.StockerIndex = 4; _stockerList.Add(Stocker4CarrierData); }
  129. if (Stocker5CarrierData != null) { Stocker5CarrierData.StockerIndex = 5; _stockerList.Add(Stocker5CarrierData); }
  130. if (Stocker6CarrierData != null) { Stocker6CarrierData.StockerIndex = 6; _stockerList.Add(Stocker6CarrierData); }
  131. if (Stocker7CarrierData != null) { Stocker7CarrierData.StockerIndex = 7; _stockerList.Add(Stocker7CarrierData); }
  132. if (Stocker8CarrierData != null) { Stocker8CarrierData.StockerIndex = 8; _stockerList.Add(Stocker8CarrierData); }
  133. if (Stocker9CarrierData != null) { Stocker9CarrierData.StockerIndex = 9; _stockerList.Add(Stocker9CarrierData); }
  134. if (Stocker10CarrierData != null) { Stocker10CarrierData.StockerIndex = 10; _stockerList.Add(Stocker10CarrierData); }
  135. if (Stocker11CarrierData != null) { Stocker11CarrierData.StockerIndex = 11; _stockerList.Add(Stocker11CarrierData); }
  136. if (Stocker12CarrierData != null) { Stocker12CarrierData.StockerIndex = 12; _stockerList.Add(Stocker12CarrierData); }
  137. if (Stocker13CarrierData != null) { Stocker13CarrierData.StockerIndex = 13; _stockerList.Add(Stocker13CarrierData); }
  138. if (Stocker14CarrierData != null) { Stocker14CarrierData.StockerIndex = 14; _stockerList.Add(Stocker14CarrierData); }
  139. if (Stocker15CarrierData != null) { Stocker15CarrierData.StockerIndex = 15; _stockerList.Add(Stocker15CarrierData); }
  140. if (Stocker16CarrierData != null) { Stocker16CarrierData.StockerIndex = 16; _stockerList.Add(Stocker16CarrierData); }
  141. if (Stocker17CarrierData != null) { Stocker17CarrierData.StockerIndex = 17; _stockerList.Add(Stocker17CarrierData); }
  142. if (Stocker18CarrierData != null) { Stocker18CarrierData.StockerIndex = 18; _stockerList.Add(Stocker18CarrierData); }
  143. }
  144. public void SwitchPage(string operation)
  145. {
  146. var windowManager = IoC.Get<IWindowManager>();
  147. switch (operation)
  148. {
  149. case "MaterialSelect":
  150. {
  151. _carrierlist.Clear();
  152. foreach (var item in _stockerList)
  153. {
  154. string StockerType = (string)QueryDataClient.Instance.Service.GetConfig($"System.Stocker.Stocker{item.StockerIndex}WaferType");
  155. var boolP = StockerType.StartsWith(CarrierType.P.ToString()) && !item.IsEmpty;
  156. var boolNone = StockerType.StartsWith(CarrierType.None.ToString()) && !item.IsEmpty&&item.CarrierType.ToString().StartsWith(CarrierType.P.ToString());
  157. if (boolNone || boolP)
  158. {
  159. _carrierlist.Add(item);
  160. }
  161. }
  162. SelectMaterialViewModel selectmaterialViewModel = new SelectMaterialViewModel();
  163. selectmaterialViewModel.carrierlist = _carrierlist;
  164. selectmaterialViewModel.CarrierType = "P";
  165. selectmaterialViewModel.SelectCarrierItemList.Clear();
  166. foreach (var item in SelectCarrierList)
  167. {
  168. selectmaterialViewModel.SelectCarrierItemList.Add(new CarrierMaterialInformation()
  169. {
  170. ModuleName = item.ModuleName,
  171. No = item.No,
  172. CarrierType = item.Type,
  173. StrSlot = item.StrSlot,
  174. CarrierId = item.CarrierID,
  175. });
  176. };
  177. if ((bool)(windowManager as WindowManager)?.ShowDialogWithTitle(selectmaterialViewModel, null, "Select P"))
  178. {
  179. for (int j = 0; j < SelectCarrierList.Count; j++)
  180. {
  181. if (SelectCarrierList[j].Type.StartsWith(CarrierType.P.ToString())|| SelectCarrierList[j].Type.StartsWith(CarrierType.None.ToString()))
  182. {
  183. SelectCarrierList.RemoveAt(j);
  184. j--;
  185. }
  186. }
  187. PCarrierPara = "";
  188. foreach (CarrierMaterialInformation item in selectmaterialViewModel.SelectCarrierItemList)
  189. {
  190. CarrierInformation carrierInfo = new CarrierInformation();
  191. carrierInfo.No = item.No;
  192. carrierInfo.ModuleName = item.ModuleName;
  193. carrierInfo.Type = item.CarrierType;
  194. carrierInfo.CarrierID = item.CarrierId;
  195. carrierInfo.StrSlot = item.StrSlot;
  196. carrierInfo.LoadPortName = "";
  197. PCarrierPara += item.ModuleName + "," + (item.CarrierId == null ? "" : item.CarrierId) + "," + item.StrSlot + ";";
  198. SelectCarrierList.Add(carrierInfo);
  199. }
  200. }
  201. }
  202. break;
  203. case "SelectM":
  204. {
  205. _carrierlist.Clear();
  206. foreach (var item in _stockerList)
  207. {
  208. string StockerType = (string)QueryDataClient.Instance.Service.GetConfig($"System.Stocker.Stocker{item.StockerIndex}WaferType");
  209. var boolM = StockerType.StartsWith(CarrierType.M.ToString()) && !item.IsEmpty;
  210. var boolNone = StockerType.StartsWith(CarrierType.None.ToString()) && !item.IsEmpty&& item.CarrierType.ToString().Contains(CarrierType.M.ToString());
  211. if (boolNone || boolM)
  212. {
  213. _carrierlist.Add(item);
  214. }
  215. }
  216. SelectMaterialViewModel selectmaterialViewModel = new SelectMaterialViewModel();
  217. selectmaterialViewModel.carrierlist = _carrierlist;
  218. selectmaterialViewModel.CarrierType = "M";
  219. selectmaterialViewModel.SelectCarrierItemList.Clear();
  220. foreach (var item in SelectCarrierList)
  221. {
  222. selectmaterialViewModel.SelectCarrierItemList.Add(new CarrierMaterialInformation()
  223. {
  224. ModuleName = item.ModuleName,
  225. No = item.No,
  226. CarrierType = item.Type,
  227. CarrierId = item.CarrierID,
  228. StrSlot = item.StrSlot
  229. });
  230. };
  231. if ((bool)(windowManager as WindowManager)?.ShowDialogWithTitle(selectmaterialViewModel, null, "Select M"))
  232. {
  233. int i = 0;
  234. for (int j = 0; j < SelectCarrierList.Count; j++)
  235. {
  236. if (SelectCarrierList[j].Type.Contains(ConstantsCommon.M))
  237. {
  238. SelectCarrierList.RemoveAt(j);
  239. j--;
  240. }
  241. }
  242. M1CarrierPara = "";
  243. M2CarrierPara = "";
  244. foreach (CarrierMaterialInformation item in selectmaterialViewModel.SelectCarrierItemList)
  245. {
  246. CarrierInformation carrierInfo = new CarrierInformation();
  247. carrierInfo.No = item.No;
  248. carrierInfo.ModuleName = item.ModuleName;
  249. carrierInfo.Type = item.CarrierType;
  250. carrierInfo.CarrierID = item.CarrierId;
  251. carrierInfo.StrSlot = item.StrSlot;
  252. carrierInfo.LoadPortName = "";
  253. if(item.CarrierType == "M1")
  254. M1CarrierPara += item.ModuleName + "," + (item.CarrierId == null ? "" : item.CarrierId) + "," + item.StrSlot + ";";
  255. else if(item.CarrierType == "M2")
  256. M2CarrierPara += item.ModuleName + "," + (item.CarrierId == null ? "" : item.CarrierId) + "," + item.StrSlot + ";";
  257. SelectCarrierList.Add(carrierInfo);
  258. }
  259. }
  260. }
  261. break;
  262. }
  263. }
  264. public void SelectJobRecipe()
  265. {
  266. RecipeSelectDialogViewModel dialog = new RecipeSelectDialogViewModel();
  267. dialog.DisplayName = "Select Job Recipe";
  268. var recipeProvider = new RecipeProvider();
  269. var processType = QueryDataClient.Instance.Service.GetConfig("System.Recipe.SupportedJobType");
  270. if (processType == null)
  271. {
  272. processType = "Job Recipe";
  273. }
  274. var ProcessTypeFileList = new ObservableCollection<ProcessTypeFileItem>();
  275. string[] recipeProcessType = ((string)processType).Split(',');
  276. for (int i = 0; i < recipeProcessType.Length; i++)
  277. {
  278. var type = new ProcessTypeFileItem();
  279. type.ProcessType = recipeProcessType[i];
  280. var prefix = $"Furnace\\{recipeProcessType[i]}";
  281. var recipes = recipeProvider.GetXmlRecipeList(prefix);
  282. type.FileListByProcessType = RecipeSequenceTreeBuilder.BuildFileNode(prefix, "", false, recipes)[0].Files;
  283. ProcessTypeFileList.Add(type);
  284. }
  285. dialog.ProcessTypeFileList = ProcessTypeFileList;
  286. WindowManager wm = new WindowManager();
  287. bool? bret = wm.ShowDialog(dialog);
  288. if ((bool)bret)
  289. {
  290. CurrentRecipe.Clear();
  291. CurrentRecipe.PrefixPath = $"Furnace\\{processType}";
  292. CurrentRecipe.Name = dialog.DialogResult;
  293. var recipeContent = _recipeProvider.LoadRecipe(CurrentRecipe.PrefixPath, CurrentRecipe.Name);
  294. if (string.IsNullOrEmpty(recipeContent))
  295. {
  296. System.Windows.MessageBox.Show($"{CurrentRecipe.PrefixPath}\\{CurrentRecipe.Name} is empty, please confirm the file is valid.");
  297. return;
  298. }
  299. CurrentRecipe.RecipeChamberType = "OriginChamber";
  300. CurrentRecipe.InitData(CurrentRecipe.PrefixPath, CurrentRecipe.Name, recipeContent, "PM1");
  301. CheckIsExistRecipe(CurrentRecipe.ProcessRecipe, CurrentRecipe.LayoutRecipe);
  302. }
  303. }
  304. private void CheckIsExistRecipe(string processName, string layoutName)
  305. {
  306. var processPrefixPath = $"Furnace\\Process";
  307. var layoutPrefixPath = $"Furnace\\Layout";
  308. var processContent = _recipeProvider.LoadRecipe(processPrefixPath, processName);
  309. var layoutContent = _recipeProvider.LoadRecipe(layoutPrefixPath, layoutName);
  310. if (string.IsNullOrEmpty(processContent))
  311. {
  312. DialogBox.ShowWarning($"Process Recipe:{processName} is empty, please confirm the file is valid.");
  313. }
  314. if (string.IsNullOrEmpty(layoutContent))
  315. {
  316. DialogBox.ShowWarning($"Layout Recipe:{layoutName} is empty, please confirm the file is valid.");
  317. }
  318. }
  319. public void EXECCmd(string cmdPar)
  320. {
  321. if (string.IsNullOrEmpty(CurrentRecipe.Name))
  322. {
  323. DialogBox.ShowWarning("Process recipe is empty");
  324. return;
  325. }
  326. if (!DialogBox.Confirm("Are you sure to execute?"))
  327. return;
  328. if (string.IsNullOrEmpty(CurrentRecipe.ProcessRecipe))
  329. {
  330. DialogBox.ShowWarning("Process recipe is empty");
  331. return;
  332. }
  333. if (string.IsNullOrEmpty(CurrentRecipe.LayoutRecipe))
  334. {
  335. DialogBox.ShowWarning("Layout recipe is empty");
  336. return;
  337. }
  338. if (string.IsNullOrEmpty(CurrentRecipe.CoolTime))
  339. {
  340. DialogBox.ShowWarning("Cool time is empty");
  341. return;
  342. }
  343. if (string.IsNullOrEmpty(PJID))
  344. {
  345. DialogBox.ShowWarning("PJ ID is empty");
  346. return;
  347. }
  348. if (string.IsNullOrEmpty(CJID))
  349. {
  350. DialogBox.ShowWarning("CJ ID is empty");
  351. return;
  352. }
  353. string cjID = CJID;//根据输入
  354. string pjID = PJID;//根据输入
  355. string pjVariable = "";//后续完善
  356. string pCarrierPara = string.IsNullOrEmpty(PCarrierPara) ? "" : PCarrierPara.Trim(';');
  357. string m1CarrierPara = string.IsNullOrEmpty(M1CarrierPara) ? "" : M1CarrierPara.TrimEnd(';');
  358. string m2CarrierPara = string.IsNullOrEmpty(M2CarrierPara) ? "" : M2CarrierPara.TrimEnd(';');
  359. Dictionary<string, object> param = new Dictionary<string, object>()
  360. {
  361. {"PJID",pjID },
  362. {"CJID",cjID },
  363. {"JobRecipe", CurrentRecipe.Name},
  364. {"CarrierPara", pCarrierPara},
  365. {"m1CarrierPara", m1CarrierPara},
  366. {"m2CarrierPara", m2CarrierPara},
  367. {"PJVariable", pjVariable},
  368. {"Charge", IsOnlyCharge },
  369. };
  370. SetValueToSC(param);
  371. InvokeClient.Instance.Service.DoOperation($"System.{ExecCommand}", param);
  372. ((Window)GetView()).DialogResult = true;
  373. }
  374. private void SetValueToSC(Dictionary<string, object> param)
  375. {
  376. //foreach (var item in param.Keys)
  377. //{
  378. // InvokeClient.Instance.Service.DoOperation($"System.SetConfig", $"System.Job.CreateJob.{item}", param[item]);
  379. //}
  380. }
  381. public void Check()
  382. {
  383. }
  384. public void ClosedCmd(string cmdPar)
  385. {
  386. (GetView() as Window).Close();
  387. }
  388. }
  389. }