ModuleDataMonitor.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  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. var enableUpdateWafersNotify = (bool)QueryDataClient.Instance.Service.GetConfig("System.EnableUpdateWafersNotify");
  33. if (enableUpdateWafersNotify)
  34. {
  35. EventClient.Instance.OnUpdateWaferEvent += OnTimer;
  36. OnTimer(_lstWaferDataName);//刚开始全部获取一遍
  37. }
  38. else
  39. {
  40. _monitorThread = new PeriodicJob(500, OnTimer, "Monitor Module Data Thread", true);
  41. }
  42. }
  43. private bool OnTimer()
  44. {
  45. try
  46. {
  47. Dictionary<string, object> data = new Dictionary<string, object>();
  48. data = QueryDataClient.Instance.Service.PollData(_mapWaferDataModule.Keys);
  49. if (data != null && Application.Current != null)
  50. {
  51. Application.Current.Dispatcher.Invoke(new Action(() =>
  52. {
  53. foreach (var waferData in data)
  54. {
  55. if (!_mapWaferDataModule.ContainsKey(waferData.Key))
  56. continue;
  57. RTDefine.WaferInfo[] wafers = waferData.Value as RTDefine.WaferInfo[];
  58. if (wafers == null)
  59. continue;
  60. ModuleInfo info = _mapWaferDataModule[waferData.Key];
  61. if (info.WaferManager.Wafers.Count == 0)
  62. {
  63. for (int i = 0; i < wafers.Length; i++)
  64. {
  65. info.WaferManager.Wafers.Add(WaferInfoConverter(wafers[i], info.WaferModuleID, i));
  66. }
  67. if (info.IsWaferReverseDisplay)
  68. {
  69. info.WaferManager.Wafers = new ObservableCollection<WaferInfo>(info.WaferManager.Wafers.Reverse());
  70. }
  71. continue;
  72. }
  73. if (wafers.Length == info.WaferManager.Wafers.Count)
  74. {
  75. int index;
  76. for (int i = 0; i < wafers.Length; i++)
  77. {
  78. if (info.IsWaferReverseDisplay)
  79. index = wafers.Length - i - 1;
  80. else
  81. index = i;
  82. var convertedWafer = WaferInfoConverter(wafers[index], info.WaferModuleID, index);
  83. info.WaferManager.Wafers[i].WaferStatus = convertedWafer.WaferStatus;
  84. info.WaferManager.Wafers[i].WaferID = convertedWafer.WaferID;
  85. info.WaferManager.Wafers[i].SourceName = convertedWafer.SourceName;
  86. info.WaferManager.Wafers[i].WaferType = convertedWafer.WaferType;
  87. info.WaferManager.Wafers[i].UseCount = convertedWafer.UseCount;
  88. info.WaferManager.Wafers[i].UseTime = convertedWafer.UseTime;
  89. info.WaferManager.Wafers[i].UseThick = convertedWafer.UseThick;
  90. info.WaferManager.Wafers[i].Thick = convertedWafer.Thick;
  91. info.WaferManager.Wafers[i].LotId = convertedWafer.LotId;
  92. info.WaferManager.Wafers[i].ProcessJobID = convertedWafer.ProcessJobID;
  93. }
  94. }
  95. }
  96. }));
  97. }
  98. }
  99. catch (Exception ex)
  100. {
  101. LOG.Error("ModuleDataMonitor.OnTimer():"+ex.Message);
  102. }
  103. return true;
  104. }
  105. private void OnTimer(IEnumerable<string> modules)
  106. {
  107. try
  108. {
  109. if (modules?.Any() == true)
  110. {
  111. var changedModule = modules.Where(r => _mapWaferDataModule.ContainsKey(r + ".ModuleWaferList"));
  112. if (!changedModule.Any()) return ;
  113. Dictionary<string, object> data = QueryDataClient.Instance.Service.PollData(changedModule.Select(r => $"{r}.ModuleWaferList"));
  114. if (data != null && Application.Current != null)
  115. {
  116. Application.Current.Dispatcher.Invoke(new Action(() =>
  117. {
  118. foreach (var waferData in data)
  119. {
  120. if (!_mapWaferDataModule.ContainsKey(waferData.Key))
  121. continue;
  122. RTDefine.WaferInfo[] wafers = waferData.Value as RTDefine.WaferInfo[];
  123. if (wafers == null)
  124. continue;
  125. ModuleInfo info = _mapWaferDataModule[waferData.Key];
  126. if (info.WaferManager.Wafers.Count == 0)
  127. {
  128. for (int i = 0; i < wafers.Length; i++)
  129. {
  130. info.WaferManager.Wafers.Add(WaferInfoConverter(wafers[i], info.WaferModuleID, i));
  131. }
  132. if (info.IsWaferReverseDisplay)
  133. {
  134. info.WaferManager.Wafers = new ObservableCollection<WaferInfo>(info.WaferManager.Wafers.Reverse());
  135. }
  136. continue;
  137. }
  138. if (wafers.Length == info.WaferManager.Wafers.Count)
  139. {
  140. int index;
  141. for (int i = 0; i < wafers.Length; i++)
  142. {
  143. if (info.IsWaferReverseDisplay)
  144. index = wafers.Length - i - 1;
  145. else
  146. index = i;
  147. var convertedWafer = WaferInfoConverter(wafers[index], info.WaferModuleID, index);
  148. info.WaferManager.Wafers[i].WaferStatus = convertedWafer.WaferStatus;
  149. info.WaferManager.Wafers[i].WaferID = convertedWafer.WaferID;
  150. info.WaferManager.Wafers[i].SourceName = convertedWafer.SourceName;
  151. info.WaferManager.Wafers[i].WaferType = convertedWafer.WaferType;
  152. info.WaferManager.Wafers[i].UseCount = convertedWafer.UseCount;
  153. info.WaferManager.Wafers[i].UseTime = convertedWafer.UseTime;
  154. info.WaferManager.Wafers[i].UseThick = convertedWafer.UseThick;
  155. info.WaferManager.Wafers[i].Thick = convertedWafer.Thick;
  156. info.WaferManager.Wafers[i].LotId = convertedWafer.LotId;
  157. info.WaferManager.Wafers[i].ProcessJobID = convertedWafer.ProcessJobID;
  158. }
  159. }
  160. }
  161. }));
  162. }
  163. }
  164. }
  165. catch (Exception ex)
  166. {
  167. LOG.Error("ModuleDataMonitor.OnTimer(modules):" + ex.Message);
  168. }
  169. }
  170. private WaferInfo WaferInfoConverter(RTDefine.WaferInfo awafer, string modid, int slotid)
  171. {
  172. WaferInfo wafer = new WaferInfo();
  173. wafer.ModuleID = modid;
  174. wafer.SlotID = slotid;
  175. wafer.SlotIndex = slotid + 1;
  176. wafer.WaferID = awafer.WaferID;
  177. wafer.SourceName = awafer.WaferOrigin;
  178. wafer.WaferStatus = WaferStatusConverter(awafer);
  179. wafer.WaferType = awafer.WaferType;
  180. wafer.UseCount = awafer.UseCount;
  181. wafer.UseThick = awafer.UseThick;
  182. wafer.Thick = awafer.Thick;
  183. wafer.UseTime = awafer.UseTime;
  184. wafer.LotId = awafer.LotId;
  185. wafer.ProcessJobID = awafer.ProcessJobID;
  186. return wafer;
  187. }
  188. //0: no wafer
  189. //1:light blue == idle no pj
  190. //2:blue = idle with pj
  191. //3:cyan = in process
  192. //4:green = complete
  193. //5:error = error
  194. //6:dummy
  195. //7:warning = has error
  196. //8:partial processed
  197. //9:abort
  198. private int WaferStatusConverter(RTDefine.WaferInfo awafer)
  199. {
  200. if (awafer.Status == RTDefine.WaferStatus.Empty)
  201. return 0;
  202. if (awafer.Status == RTDefine.WaferStatus.Normal)
  203. {
  204. switch (awafer.ProcessState)
  205. {
  206. case RTDefine.EnumWaferProcessStatus.InProcess: return 3;
  207. case RTDefine.EnumWaferProcessStatus.Completed: return awafer.HasError ? 5 : (awafer.HasWarning ? 7 : 4);
  208. case RTDefine.EnumWaferProcessStatus.Failed: return 5;
  209. case RTDefine.EnumWaferProcessStatus.Wait: return 3;
  210. case RTDefine.EnumWaferProcessStatus.Idle: return awafer.ProcessJob == null ? 1 : 2;
  211. case RTDefine.EnumWaferProcessStatus.Abort: return 9;
  212. }
  213. }
  214. if (awafer.Status == RTDefine.WaferStatus.Dummy)
  215. {
  216. return 6;
  217. }
  218. return 5;
  219. }
  220. }
  221. }