ModuleDataMonitor.cs 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections.ObjectModel;
  4. using System.Linq;
  5. using System.Threading;
  6. using System.Windows;
  7. using System.Windows.Threading;
  8. using Aitex.Core.RT.Log;
  9. using Aitex.Core.Util;
  10. using Aitex.Core.WCF;
  11. using DocumentFormat.OpenXml.Drawing.Charts;
  12. using MECF.Framework.Common.DataCenter;
  13. using MECF.Framework.Common.OperationCenter;
  14. using RTDefine = Aitex.Core.Common;
  15. namespace MECF.Framework.UI.Client.ClientBase
  16. {
  17. public class ModuleDataMonitor
  18. {
  19. public Dictionary<string, ModuleInfo> _mapWaferDataModule = new Dictionary<string, ModuleInfo>();
  20. public List<string> _lstWaferDataName = new List<string>();
  21. private PeriodicJob _monitorThread;
  22. public ModuleDataMonitor()
  23. {
  24. foreach (var moduleInfo in ModuleManager.ModuleInfos)
  25. {
  26. if (!string.IsNullOrEmpty(moduleInfo.Value.WaferDataName))
  27. {
  28. _lstWaferDataName.Add(moduleInfo.Key);
  29. _mapWaferDataModule[moduleInfo.Value.WaferDataName] = moduleInfo.Value;
  30. }
  31. }
  32. EventClient.Instance.OnUpdateWaferEvent += OnTimer;
  33. OnTimer(_lstWaferDataName);//刚开始全部获取一遍
  34. //_monitorThread = new PeriodicJob(500, OnTimer, "Monitor Module Data Thread", true);
  35. }
  36. private bool? OnTimer(IEnumerable<string> modules)
  37. {
  38. try
  39. {
  40. //Dictionary<string, object> data = new Dictionary<string, object>();
  41. //var enableUpdateWafersNotify = (bool)QueryDataClient.Instance.Service.GetConfig("System.EnableUpdateWafersNotify");
  42. //if (enableUpdateWafersNotify)
  43. //{
  44. // var changeModule = QueryDataClient.Instance.Service.GetData("System.ChangeWafers");
  45. // if (changeModule is Dictionary<string, bool> module && module?.Count > 0)
  46. // {
  47. // var changedModule = module.Where(r => r.Value);
  48. // if (!changedModule.Any()) return true;
  49. // InvokeClient.Instance.Service.DoOperation("System.UpdateWafersNotify", changeModule);
  50. // data = QueryDataClient.Instance.Service.PollData(changedModule.Select(r => $"{r.Key}.ModuleWaferList"));
  51. // }
  52. //}
  53. //else
  54. //{
  55. // data = QueryDataClient.Instance.Service.PollData(_lstWaferDataName);
  56. //}
  57. if (modules?.Any() == true)
  58. {
  59. var changedModule = modules.Where(r => _mapWaferDataModule.ContainsKey(r + ".ModuleWaferList"));
  60. if (!changedModule.Any()) return null;
  61. Dictionary<string, object> data = QueryDataClient.Instance.Service.PollData(changedModule.Select(r => $"{r}.ModuleWaferList"));
  62. if (data != null && Application.Current != null)
  63. {
  64. Application.Current.Dispatcher.Invoke(new Action(() =>
  65. {
  66. foreach (var waferData in data)
  67. {
  68. if (!_mapWaferDataModule.ContainsKey(waferData.Key))
  69. continue;
  70. RTDefine.WaferInfo[] wafers = waferData.Value as RTDefine.WaferInfo[];
  71. if (wafers == null)
  72. continue;
  73. ModuleInfo info = _mapWaferDataModule[waferData.Key];
  74. if (info.WaferManager.Wafers.Count == 0)
  75. {
  76. for (int i = 0; i < wafers.Length; i++)
  77. {
  78. info.WaferManager.Wafers.Add(WaferInfoConverter(wafers[i], info.WaferModuleID, i));
  79. }
  80. if (info.IsWaferReverseDisplay)
  81. {
  82. info.WaferManager.Wafers = new ObservableCollection<WaferInfo>(info.WaferManager.Wafers.Reverse());
  83. }
  84. continue;
  85. }
  86. if (wafers.Length == info.WaferManager.Wafers.Count)
  87. {
  88. int index;
  89. for (int i = 0; i < wafers.Length; i++)
  90. {
  91. if (info.IsWaferReverseDisplay)
  92. index = wafers.Length - i - 1;
  93. else
  94. index = i;
  95. var convertedWafer = WaferInfoConverter(wafers[index], info.WaferModuleID, index);
  96. info.WaferManager.Wafers[i].WaferStatus = convertedWafer.WaferStatus;
  97. info.WaferManager.Wafers[i].WaferID = convertedWafer.WaferID;
  98. info.WaferManager.Wafers[i].SourceName = convertedWafer.SourceName;
  99. info.WaferManager.Wafers[i].WaferType = convertedWafer.WaferType;
  100. info.WaferManager.Wafers[i].UseCount = convertedWafer.UseCount;
  101. info.WaferManager.Wafers[i].UseTime = convertedWafer.UseTime;
  102. info.WaferManager.Wafers[i].UseThick = convertedWafer.UseThick;
  103. info.WaferManager.Wafers[i].Thick = convertedWafer.Thick;
  104. info.WaferManager.Wafers[i].LotId = convertedWafer.LotId;
  105. info.WaferManager.Wafers[i].ProcessJobID = convertedWafer.ProcessJobID;
  106. }
  107. }
  108. }
  109. }));
  110. }
  111. return true;
  112. }
  113. return null;
  114. }
  115. catch (Exception ex)
  116. {
  117. LOG.Error(ex.Message);
  118. return false;
  119. }
  120. }
  121. private WaferInfo WaferInfoConverter(RTDefine.WaferInfo awafer, string modid, int slotid)
  122. {
  123. WaferInfo wafer = new WaferInfo();
  124. wafer.ModuleID = modid;
  125. wafer.SlotID = slotid;
  126. wafer.SlotIndex = slotid + 1;
  127. wafer.WaferID = awafer.WaferID;
  128. wafer.SourceName = awafer.WaferOrigin;
  129. wafer.WaferStatus = WaferStatusConverter(awafer);
  130. wafer.WaferType = awafer.WaferType;
  131. wafer.UseCount = awafer.UseCount;
  132. wafer.UseThick = awafer.UseThick;
  133. wafer.Thick = awafer.Thick;
  134. wafer.UseTime = awafer.UseTime;
  135. wafer.LotId = awafer.LotId;
  136. wafer.ProcessJobID = awafer.ProcessJobID;
  137. return wafer;
  138. }
  139. //0: no wafer
  140. //1:light blue == idle no pj
  141. //2:blue = idle with pj
  142. //3:cyan = in process
  143. //4:green = complete
  144. //5:error = error
  145. //6:dummy
  146. //7:warning = has error
  147. //8:partial processed
  148. //9:abort
  149. private int WaferStatusConverter(RTDefine.WaferInfo awafer)
  150. {
  151. if (awafer.Status == RTDefine.WaferStatus.Empty)
  152. return 0;
  153. if (awafer.Status == RTDefine.WaferStatus.Normal)
  154. {
  155. switch (awafer.ProcessState)
  156. {
  157. case RTDefine.EnumWaferProcessStatus.InProcess: return 3;
  158. case RTDefine.EnumWaferProcessStatus.Completed: return awafer.HasError ? 5 : (awafer.HasWarning ? 7 : 4);
  159. case RTDefine.EnumWaferProcessStatus.Failed: return 5;
  160. case RTDefine.EnumWaferProcessStatus.Wait: return 3;
  161. case RTDefine.EnumWaferProcessStatus.Idle: return awafer.ProcessJob == null ? 1 : 2;
  162. case RTDefine.EnumWaferProcessStatus.Abort: return 9;
  163. }
  164. }
  165. if (awafer.Status == RTDefine.WaferStatus.Dummy)
  166. {
  167. return 6;
  168. }
  169. return 5;
  170. }
  171. }
  172. }