浏览代码

ScheduleMaintenance代码整理

git-svn-id: http://10.4.3.168:50001/svn/Furnace@120 dbcde07d-dcf5-c148-8a84-ac3097b7778e
Jiangjinyuan 1 月之前
父节点
当前提交
ceda155ea8

+ 5 - 250
FrameworkLocal/Common/DataCenter/ScheduleMaintenanceDataManager.cs

@@ -23,8 +23,11 @@ namespace MECF.Framework.Common.DataCenter
     {
         public ScheduleMaintenanceDataItem DataItem { get; private set; }
 
-        public ScheduleMaintenanceData(string item, string display, string unit, float startValue, float limitValue, string maintenanceProcessing, string path, string additionInformationName = "", string additionInformationDisplay = "", string associationProcessRecipeName = "", string additionInformationDisplaySupplement = "")
+        public ScheduleMaintenanceData(string item, string unit, string path, string additionInformationName = "", string additionInformationDisplay = "", float startValue = 0, float limitValue = 0, string display = "", string maintenanceProcessing = "None",  string associationProcessRecipeName = "", string additionInformationDisplaySupplement = "")
         {
+            if (string.IsNullOrEmpty(display))
+                display = item;
+
             ScheduleMaintenanceDataManager.Instance.Subscribe(item, display, unit, startValue, limitValue, maintenanceProcessing, path, additionInformationName, additionInformationDisplay, associationProcessRecipeName, additionInformationDisplaySupplement);
 
             DataItem = ScheduleMaintenanceDataManager.Instance.GetItem(item);
@@ -159,8 +162,6 @@ namespace MECF.Framework.Common.DataCenter
                     _items[item.Item] = item;
                 }
 
-                InitScheduleMaintenance();
-                InitAllData();
             }
             catch (Exception ex)
             {
@@ -416,264 +417,18 @@ namespace MECF.Framework.Common.DataCenter
 
         #region 
 
-        private Dictionary<string, string> _stepThickness;
-
-        private Dictionary<MaintenanceItemEnum, ScheduleMaintenanceData> _scheduleMaintenanceDataDictionary;
-
-        private void InitScheduleMaintenance()
-        {
-
-            _scheduleMaintenanceDataDictionary = new Dictionary<MaintenanceItemEnum, ScheduleMaintenanceData>
-                  {
-                  { MaintenanceItemEnum.SDCarrierUseFreq, new ScheduleMaintenanceData(MaintenanceItemEnum.SDCarrierUseFreq.ToString(),"SDCarrierUseFreq", "Times", 0, 0, "None", "CarrierWafer.SieDummy", "Carrier Kind", "Side Dummy") },
-                  { MaintenanceItemEnum.SDWaferThickness, new ScheduleMaintenanceData(MaintenanceItemEnum.SDWaferThickness.ToString(), "SDWaferThickness", "Å", 0, 0, "None", "CarrierWafer.SieDummy", "Carrier Kind", "Side Dummy") },
-                  { MaintenanceItemEnum.SDUsableDummyWafer, new ScheduleMaintenanceData(MaintenanceItemEnum.SDUsableDummyWafer.ToString(), "SDWaferRemain", "Sheets", 0, 0, "None", "CarrierWafer.SieDummy", "Carrier Kind", "Side Dummy") },
-                  { MaintenanceItemEnum.SDBufferRackStayTime, new ScheduleMaintenanceData(MaintenanceItemEnum.SDBufferRackStayTime.ToString(), "SDCarrierStay", "h:m", 0, 0, "None", "CarrierWafer.SieDummy", "Carrier Kind", "Side Dummy") },
-                  { MaintenanceItemEnum.SDWaferUserTime, new ScheduleMaintenanceData(MaintenanceItemEnum.SDWaferUserTime.ToString(),  "SDWaferUserTime", "h:m", 0, 0, "None", "CarrierWafer.SieDummy", "Carrier Kind", "Side Dummy") },
-
-
-                  { MaintenanceItemEnum.FDCarrierUseFreq, new ScheduleMaintenanceData(MaintenanceItemEnum.FDCarrierUseFreq.ToString(),"FDCarrierUseFreq", "Times", 0, 0, "None", "CarrierWafer.FillDummy", "Carrier Kind", "Fill Dummy") },
-                  { MaintenanceItemEnum.FDWaferThickness, new ScheduleMaintenanceData(MaintenanceItemEnum.FDWaferThickness.ToString(),"FDWaferThickness", "Å", 0, 0, "None", "CarrierWafer.FillDummy", "Carrier Kind", "Fill Dummy") },
-                  { MaintenanceItemEnum.FDUsableDummyWafer, new ScheduleMaintenanceData(MaintenanceItemEnum.FDUsableDummyWafer.ToString(),"FDWaferRemain", "Sheets", 0, 0, "None", "CarrierWafer.FillDummy", "Carrier Kind", "Fill Dummy") },
-                  { MaintenanceItemEnum.FDBufferRackStayTime, new ScheduleMaintenanceData(MaintenanceItemEnum.FDBufferRackStayTime.ToString(), "FDCarrierStay", "h:m", 0, 0, "None", "CarrierWafer.FillDummy", "Carrier Kind", "Fill Dummy") },
-                  { MaintenanceItemEnum.FDWaferUserTime, new ScheduleMaintenanceData(MaintenanceItemEnum.FDWaferUserTime.ToString(), "FDWaferUserTime", "h:m", 0, 0, "None", "CarrierWafer.FillDummy", "Carrier Kind", "Fill Dummy") },
-
-
-                  { MaintenanceItemEnum.BoatRecipeThickness1, new ScheduleMaintenanceData(MaintenanceItemEnum.BoatRecipeThickness1.ToString(),  "BoatRecipeThickness1", "Å", 0, 0, "None", "Boat", "", "") },
-                  { MaintenanceItemEnum.BoatTCUseTime, new ScheduleMaintenanceData(MaintenanceItemEnum.BoatTCUseTime.ToString(), "BoatTCUseTime", "h:m", 0, 0, "None", "Boat", "", "") },
-                  { MaintenanceItemEnum.BoatCKDUseTime, new ScheduleMaintenanceData(MaintenanceItemEnum.BoatCKDUseTime.ToString(), "BoatCKDUseTime", "h:m", 0, 0, "None", "Boat", "", "") },
-                  { MaintenanceItemEnum.BoatPUMPUseTime, new ScheduleMaintenanceData(MaintenanceItemEnum.BoatPUMPUseTime.ToString(), "BoatPUMPUseTime", "h:m", 0, 0, "None", "Boat", "", "") },
-
-
 
-                  { MaintenanceItemEnum.NonOperationTime1, new ScheduleMaintenanceData(MaintenanceItemEnum.NonOperationTime1.ToString(), "NonOperationTime1", "h:m", 0, 0, "None", "Conditioning", "", "") },
-                  { MaintenanceItemEnum.NonOperationTime2, new ScheduleMaintenanceData(MaintenanceItemEnum.NonOperationTime2.ToString(), "NonOperationTime2", "h:m", 0, 0, "None", "Conditioning", "", "") },
 
-                  { MaintenanceItemEnum.RecipeExecuteFreq, new ScheduleMaintenanceData(MaintenanceItemEnum.RecipeExecuteFreq.ToString(), "Recipe Run Freq", "Times", 0, 0, "None", "Reactor.Recipe", "Select Recipe", "") },
-                  { MaintenanceItemEnum.RecipeThickness, new ScheduleMaintenanceData(MaintenanceItemEnum.RecipeThickness.ToString(), "Recipe Thickness", "Å", 0, 0, "None", "Reactor.Recipe", "Select Recipe", "") },
 
 
-                  { MaintenanceItemEnum.RecipeStepExecuteFreq1, new ScheduleMaintenanceData(MaintenanceItemEnum.RecipeStepExecuteFreq1.ToString(), "Recipe StepRunTime1", "Times", 0, 0, "None", "Reactor.StepRunFreq", "Step ID", "") },
-                  { MaintenanceItemEnum.RecipeStepExecuteFreq2, new ScheduleMaintenanceData(MaintenanceItemEnum.RecipeStepExecuteFreq2.ToString(), "Recipe StepRunTime2", "Times", 0, 0, "None", "Reactor.StepRunFreq", "Step ID", "") },
-                  { MaintenanceItemEnum.RecipeStepExecuteFreq3, new ScheduleMaintenanceData(MaintenanceItemEnum.RecipeStepExecuteFreq3.ToString(), "Recipe StepRunTime3", "Times", 0, 0, "None", "Reactor.StepRunFreq", "Step ID", "") },
 
 
-                  { MaintenanceItemEnum.RecipeStepExecuteTime1, new ScheduleMaintenanceData(MaintenanceItemEnum.RecipeStepExecuteTime1.ToString(), "Recipe StepRunTime1", "h:m", 0, 0, "None", "Reactor.StepRunTime", "Step ID", "") },
-                  { MaintenanceItemEnum.RecipeStepExecuteTime2, new ScheduleMaintenanceData(MaintenanceItemEnum.RecipeStepExecuteTime2.ToString(), "Recipe StepRunTime2", "h:m", 0, 0, "None", "Reactor.StepRunTime", "Step ID", "") },
-                  { MaintenanceItemEnum.RecipeStepExecuteTime3, new ScheduleMaintenanceData(MaintenanceItemEnum.RecipeStepExecuteTime3.ToString(), "Recipe StepRunTime3", "h:m", 0, 0, "None", "Reactor.StepRunTime", "Step ID", "") },
-                  { MaintenanceItemEnum.RecipeStepExecuteTime4, new ScheduleMaintenanceData(MaintenanceItemEnum.RecipeStepExecuteTime4.ToString(), "Recipe StepRunTime4", "h:m", 0, 0, "None", "Reactor.StepRunTime", "Step ID", "") },
-                  { MaintenanceItemEnum.RecipeStepExecuteTime5, new ScheduleMaintenanceData(MaintenanceItemEnum.RecipeStepExecuteTime5.ToString(), "Recipe StepRunTime5", "h:m", 0, 0, "None", "Reactor.StepRunTime", "Step ID", "") },
-                  { MaintenanceItemEnum.RecipeStepExecuteTime6, new ScheduleMaintenanceData(MaintenanceItemEnum.RecipeStepExecuteTime6.ToString(), "Recipe StepRunTime6", "h:m", 0, 0, "None", "Reactor.StepRunTime", "Step ID", "") },
-                  { MaintenanceItemEnum.RecipeStepExecuteTime7, new ScheduleMaintenanceData(MaintenanceItemEnum.RecipeStepExecuteTime7.ToString(), "Recipe StepRunTime7", "h:m", 0, 0, "None", "Reactor.StepRunTime", "Step ID", "") },
-                  { MaintenanceItemEnum.RecipeStepExecuteTime8, new ScheduleMaintenanceData(MaintenanceItemEnum.RecipeStepExecuteTime8.ToString(), "Recipe StepRunTime8", "h:m", 0, 0, "None", "Reactor.StepRunTime", "Step ID", "") },
 
 
 
-                  { MaintenanceItemEnum.RecipeThickness1_Step, new ScheduleMaintenanceData(MaintenanceItemEnum.RecipeThickness1_Step.ToString(), "Recipe StepThickness1", "Å", 0, 0, "None", "Reactor.StepThickness", "Step Group", "") },
-                  { MaintenanceItemEnum.RecipeThickness2_Step, new ScheduleMaintenanceData(MaintenanceItemEnum.RecipeThickness2_Step.ToString(), "Recipe StepThickness2", "Å", 0, 0, "None", "Reactor.StepThickness", "Step Group", "") },
-                  { MaintenanceItemEnum.RecipeThickness3_Step, new ScheduleMaintenanceData(MaintenanceItemEnum.RecipeThickness3_Step.ToString(), "Recipe StepThickness3", "Å", 0, 0, "None", "Reactor.StepThickness", "Step Group", "") },
-                  { MaintenanceItemEnum.RecipeThickness4_Step, new ScheduleMaintenanceData(MaintenanceItemEnum.RecipeThickness4_Step.ToString(), "Recipe StepThickness4", "Å", 0, 0, "None", "Reactor.StepThickness", "Step Group", "") },
-                  { MaintenanceItemEnum.RecipeThickness5_Step, new ScheduleMaintenanceData(MaintenanceItemEnum.RecipeThickness5_Step.ToString(), "Recipe StepThickness5", "Å", 0, 0, "None", "Reactor.StepThickness", "Step Group", "") },
-                  { MaintenanceItemEnum.RecipeThickness6_Step, new ScheduleMaintenanceData(MaintenanceItemEnum.RecipeThickness6_Step.ToString(), "Recipe StepThickness6", "Å", 0, 0, "None", "Reactor.StepThickness", "Step Group", "") },
-                  { MaintenanceItemEnum.RecipeThickness7_Step, new ScheduleMaintenanceData(MaintenanceItemEnum.RecipeThickness7_Step.ToString(), "Recipe StepThickness7", "Å", 0, 0, "None", "Reactor.StepThickness", "Step Group", "") },
-                  { MaintenanceItemEnum.RecipeThickness8_Step, new ScheduleMaintenanceData(MaintenanceItemEnum.RecipeThickness8_Step.ToString(), "Recipe StepThickness8", "Å", 0, 0, "None", "Reactor.StepThickness", "Step Group", "") }
-              };
-            _stepThickness = new Dictionary<string, string>()
-            {
-                {"1","WAIT"},
-                {"2","Name"},
-            };
-        }
-        #region DataItemEnum.Reactor 模块
-
-        /// <summary>
-        /// 根据RecipeStep +StepGroup统计  累计膜厚
-        /// </summary>
-        /// <param name="recipeName"></param>
-        public void UpdateRecipeStepGroupThickness(string stepName, float thickness)
-        {
-            if (string.IsNullOrEmpty(stepName) || thickness <= 0)
-                return;
-            var stepNo = stepName.Split(':').FirstOrDefault();
-            var list = Item.Values
-                .Where(a => !string.IsNullOrEmpty(a.AdditionInformationDisplaySupplement))
-                .Where(a => a.Path == $"{DataItemEnum.Reactor}.{ReactorsEnum.StepThickness}")
-                .Where(a => a.AdditionInformationDisplaySupplement.Split(',').Contains(stepNo))
-                .ToList();
-            if (list != null && list.Count > 0)
-            {
-                foreach (var item in list)
-                {
-                    Increase(item.Item, thickness);
-                }
-            }
-        }
-        /// <summary>
-        /// 根据RecipeStep统计 Step执行Time 累计时间
-        /// </summary>
-        /// <param name="recipeName"></param>
-        public void UpdateRecipeStepRunTime(string stepName, double stepTime)
-        {
-            if (string.IsNullOrEmpty(stepName) || stepTime <= 0)
-                return;
-            var stepNo = stepName.Split(':').FirstOrDefault();
-            var list = Item.Values.Where(a => a.Path == $"{DataItemEnum.Reactor}.{ReactorsEnum.StepRunTime}" && a.AdditionInformationDisplay == stepNo).ToList();
-            if (list != null && list.Count > 0)
-            {
-                foreach (var item in list)
-                {
-                    Increase(item.Item, (float)stepTime);
-                }
-            }
-        }
-        /// <summary>
-        /// 根据RecipeStep统计 Step执行 累计次数
-        /// </summary>
-        /// <param name="recipeName"></param>
-        public void UpdateRecipeStepFre(string stepName)
-        {
-            if (string.IsNullOrEmpty(stepName))
-                return;
-            var stepNo = stepName.Split(':').FirstOrDefault();
-            var list = Item.Values.Where(a => a.Path == $"{DataItemEnum.Reactor}.{ReactorsEnum.StepRunFreq}" && a.AdditionInformationDisplay == stepNo).ToList();
-            if (list != null && list.Count > 0)
-            {
-                foreach (var item in list)
-                {
-                    Increase(item.Item);
-                }
-            }
-        }
-        /// <summary>
-        /// 根据RecipeName统计 Recipe执行 累计次数
-        /// </summary>
-        /// <param name="processRecipeName"></param>
-        public void UpdateRecipeFre(string recipeName)
-        {
-            if (string.IsNullOrEmpty(recipeName))
-                return;
-            var item = Item.Values.Where(a => a.Item == MaintenanceItemEnum.RecipeExecuteFreq.ToString() && a.Path == $"{DataItemEnum.Reactor}.{ReactorsEnum.Recipe}" && a.AdditionInformationDisplay == recipeName).FirstOrDefault();
-            if (item != null && item.Item == MaintenanceItemEnum.RecipeExecuteFreq.ToString())
-            {
-                Increase(item.Item);
-            }
-        }
-        /// <summary>
-        /// 根据RecipeName统计累计膜厚
-        /// </summary>
-        /// <param name="recipeName"></param>
-        /// <param name="thickness"></param>
-        public void UpdateRecipeTotalThickness(string recipeName, float thickness)
-        {
-            if (string.IsNullOrEmpty(recipeName) || thickness <= 0)
-                return;
-            var item = Item.Values.Where(a => a.Item == MaintenanceItemEnum.RecipeThickness.ToString() && a.Path == $"{DataItemEnum.Reactor}.{ReactorsEnum.Recipe}" && a.AdditionInformationDisplay == recipeName).FirstOrDefault();
-
-            if (item != null && item.Item == MaintenanceItemEnum.RecipeThickness.ToString())
-            {
-                Increase(item.Item, thickness);
-            }
-
-            #endregion
-        }
-        public void UpdateRecipeStepThicknessAndTime(string stepName, float thickness, float timeS)
-        {
-            if (string.IsNullOrEmpty(stepName))
-                return;
-            var checkName = stepName;
-            var nameParas = stepName.Split(':');
-            if (nameParas != null && nameParas.Length > 1)
-                checkName = nameParas[1];
-        }
-        public bool CheckScheduleMaintenanceBeforeJobStart(out string reason)
-        {
-            reason = "";
-            return true;
-        }
-
-   
-        public void MaintenanceProcessingCommandExec(string maintenanceProcessing, Action<string> alarmReportExec, string warningMessage)
-        {
-            if (Enum.TryParse<MaintenanceProcessingCommandEnum>(maintenanceProcessing, out var command))
-            {
-                switch (command)
-                {
-                    case MaintenanceProcessingCommandEnum.None:
-                        break;
-                    case MaintenanceProcessingCommandEnum.AlarmReport:
-                        alarmReportExec(warningMessage);
-                        break;
-                    case MaintenanceProcessingCommandEnum.JobProhibition:
-                        break;
-                    case MaintenanceProcessingCommandEnum.JobManualStart:
-                        break;
-                    case MaintenanceProcessingCommandEnum.JobAutoStart:
-                        break;
-                }
-            }
-        }
-
-
-        public void InitAllData()
-        {
-            InitScheduleMaintenance();
-         
-        }
-
-        public void UpdateSEDWafer()
-        {
-            if (_scheduleMaintenanceDataDictionary == null)
-            {
-                return;
-            }
-            var ccc = BinarySerializer<Dictionary<ModuleName, Dictionary<int, WaferInfo>>>.FromStream("WaferManager");
-            List<WaferInfo> waferInfos = new List<WaferInfo>();
-            if (ccc != null)
-            {
-                foreach (var moduleWafers in ccc)
-                {
-                    waferInfos.AddRange(moduleWafers.Value.Select(a => a.Value));
-                }
-                if (waferInfos.Any(a => a.WaferType == WaferType.ED))
-                {
-
-                    var maxEDUseCount = waferInfos.Where(a => a.WaferType == WaferType.ED).Max(a => a.UseCount);
-                    var maxEDUseThick = waferInfos.Where(a => a.WaferType == WaferType.ED).Max(a => a.UseThick);
-                    var maxEDUseTime = waferInfos.Where(a => a.WaferType == WaferType.ED).Max(a => a.UseTime);
-
-                    if (_scheduleMaintenanceDataDictionary.TryGetValue(MaintenanceItemEnum.FDCarrierUseFreq, out var FDCarrierUseFreq))
-                        FDCarrierUseFreq.SetValue(maxEDUseCount);
-
-                    if (_scheduleMaintenanceDataDictionary.TryGetValue(MaintenanceItemEnum.FDWaferThickness, out var FDWaferThickness))
-                        FDWaferThickness.SetValue(maxEDUseThick);
-
-                    if (_scheduleMaintenanceDataDictionary.TryGetValue(MaintenanceItemEnum.FDWaferUserTime, out var FDWaferUserTime))
-                        FDWaferUserTime.SetValue(maxEDUseTime);
-                }
-                if (waferInfos.Any(a => a.WaferType == WaferType.SD))
-                {
-
-                    var maxSDUseCount = waferInfos.Where(a => a.WaferType == WaferType.SD).Max(a => a.UseCount);
-                    var maxSDUseThick = waferInfos.Where(a => a.WaferType == WaferType.SD).Max(a => a.UseThick);
-                    var maxSDUseTime = waferInfos.Where(a => a.WaferType == WaferType.SD).Max(a => a.UseTime);
-                    if (_scheduleMaintenanceDataDictionary.TryGetValue(MaintenanceItemEnum.SDCarrierUseFreq, out var SDCarrierUseFreq))
-                        SDCarrierUseFreq.SetValue(maxSDUseCount);
-
-                    if (_scheduleMaintenanceDataDictionary.TryGetValue(MaintenanceItemEnum.SDWaferThickness, out var SDWaferThickness))
-                        SDWaferThickness.SetValue(maxSDUseThick);
-
-                    if (_scheduleMaintenanceDataDictionary.TryGetValue(MaintenanceItemEnum.SDWaferUserTime, out var SDWaferUserTime))
-                        SDWaferUserTime.SetValue(maxSDUseTime);
-                }
-
-            }
-        }
-    
-
-
         #endregion
 
-      
+
 
 
     }

+ 4 - 0
Furnace/FurnaceRT/Config/System.sccfg

@@ -414,6 +414,10 @@
 			<config default="30" name="TP6" description="TP6 time out" max="999" min="0" paramter="" tag="" unit="s" type="Integer" />
 		</configs>
 	</configs>
+	
+	
+	<configs name="ScheduleMaintenance"  visible="false">
+	</configs>
 	<configs name="Minics">
 
 		<config default="127.0.0.1" name="ip" description="ip" max="" min="" paramter="" tag="" unit=""  type="String"   />

+ 12 - 11
Furnace/FurnaceRT/Equipments/Jobs/AutoTransfer.cs

@@ -5945,36 +5945,37 @@ namespace FurnaceRT.Equipments.Jobs
                         bool IsEnableSDWaferUseTimeWarning = SDTimeWarning > 0;
                         if (wafer.WaferType == WaferType.SD && IsEnableSDWaferUseCountWarning && wafer.UseCount > SDCountWarning && wafer.UseCount < SDCountAlarm)
                         {
-                            Singleton<ScheduleMaintenanceDataManager>.Instance.MaintenanceProcessingCommandExec(maintenanceItemSDCarrierUseFreq.MaintenanceProcessing, Singleton<EquipmentManager>.Instance.SDWaferTypeUseCountWarning.Set, $"more than {SDCountWarning} 次");
+                            (Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule).MaintenanceProcessingCommandExec(maintenanceItemSDCarrierUseFreq.MaintenanceProcessing, Singleton<EquipmentManager>.Instance.SDWaferTypeUseCountWarning.Set, $"more than {SDCountWarning} 次");
                         }
 
                         if (wafer.WaferType == WaferType.SD && IsEnableSDWaferUseTimeWarning && wafer.UseTime > SDTimeWarning && wafer.UseTime < SDTimeAlarm)
                         {
                             DateTimeUtil.ConvertSecondsToHoursAndMinutes(SDTimeWarning, out var hours, out var minutes);
-                            Singleton<ScheduleMaintenanceDataManager>.Instance.MaintenanceProcessingCommandExec(maintenanceItemSDWaferUserTime.MaintenanceProcessing, Singleton<EquipmentManager>.Instance.SDWaferTypeUseTimeWarning.Set, $"more than {hours} hour {minutes} min");
+                            (Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule).MaintenanceProcessingCommandExec(maintenanceItemSDWaferUserTime.MaintenanceProcessing, Singleton<EquipmentManager>.Instance.SDWaferTypeUseTimeWarning.Set, $"more than {hours} hour {minutes} min");
                         }
 
                         if (wafer.WaferType == WaferType.SD && IsEnableSDWaferThicknessWarning && wafer.UseThick > SDThicknessWarning && wafer.UseThick < SDThicknessAlarm)
                         {
-                            Singleton<ScheduleMaintenanceDataManager>.Instance.MaintenanceProcessingCommandExec(maintenanceItemSDWaferThickness.MaintenanceProcessing, Singleton<EquipmentManager>.Instance.SDWaferTypeThicknessWarning.Set, $"more than {SDThicknessWarning} nm");
+                            (Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule).MaintenanceProcessingCommandExec(maintenanceItemSDWaferThickness.MaintenanceProcessing, Singleton<EquipmentManager>.Instance.SDWaferTypeThicknessWarning.Set, $"more than {SDThicknessWarning} nm");
                         }
 
                         if (wafer.WaferType == WaferType.SD && IsEnableSDWaferUseCountWarning && wafer.UseCount >= SDCountAlarm)
                         {
-                            Singleton<ScheduleMaintenanceDataManager>.Instance.MaintenanceProcessingCommandExec(maintenanceItemSDCarrierUseFreq.MaintenanceProcessing, Singleton<EquipmentManager>.Instance.SDWaferTypeUseCountAlarm.Set, $"more than {SDCountAlarm} 次");
+                            (Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule).MaintenanceProcessingCommandExec(maintenanceItemSDCarrierUseFreq.MaintenanceProcessing, Singleton<EquipmentManager>.Instance.SDWaferTypeUseCountAlarm.Set, $"more than {SDCountAlarm} 次");
                             return false;
                         }
 
                         if (wafer.WaferType == WaferType.SD && IsEnableSDWaferUseTimeWarning && wafer.UseTime >= SDTimeAlarm)
                         {
+
                             DateTimeUtil.ConvertSecondsToHoursAndMinutes(SDTimeAlarm, out var hours, out var minutes);
-                            Singleton<ScheduleMaintenanceDataManager>.Instance.MaintenanceProcessingCommandExec(maintenanceItemSDWaferUserTime.MaintenanceProcessing, Singleton<EquipmentManager>.Instance.SDWaferTypeUseTimeAlarm.Set, $"more than {hours} hour {minutes}");
+                            (Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule).MaintenanceProcessingCommandExec(maintenanceItemSDWaferUserTime.MaintenanceProcessing, Singleton<EquipmentManager>.Instance.SDWaferTypeUseTimeAlarm.Set, $"more than {hours} hour {minutes}");
                             return false;
                         }
 
                         if (wafer.WaferType == WaferType.SD && IsEnableSDWaferThicknessWarning && wafer.UseThick >= SDThicknessAlarm)
                         {
-                            Singleton<ScheduleMaintenanceDataManager>.Instance.MaintenanceProcessingCommandExec(maintenanceItemSDWaferThickness.MaintenanceProcessing, Singleton<EquipmentManager>.Instance.SDWaferTypeThicknessAlarm.Set, $"more than {SDThicknessAlarm} nm");
+                            (Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule).MaintenanceProcessingCommandExec(maintenanceItemSDWaferThickness.MaintenanceProcessing, Singleton<EquipmentManager>.Instance.SDWaferTypeThicknessAlarm.Set, $"more than {SDThicknessAlarm} nm");
                             return false;
                         }
                         #endregion
@@ -6030,30 +6031,30 @@ namespace FurnaceRT.Equipments.Jobs
                         if (wafer.WaferType == WaferType.ED && IsEnableEDWaferUseTimeWarning && wafer.UseTime > EDTimeWarning && wafer.UseTime < EDTimeAlarm)
                         {
                             DateTimeUtil.ConvertSecondsToHoursAndMinutes(EDTimeWarning, out var hours, out var minutes);
-                            Singleton<ScheduleMaintenanceDataManager>.Instance.MaintenanceProcessingCommandExec(maintenanceItemEDWaferUserTime.MaintenanceProcessing, Singleton<EquipmentManager>.Instance.EDWaferTypeUseTimeWarning.Set, $"more than {hours} hour {minutes} min");
+                            (Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule).MaintenanceProcessingCommandExec(maintenanceItemEDWaferUserTime.MaintenanceProcessing, Singleton<EquipmentManager>.Instance.EDWaferTypeUseTimeWarning.Set, $"more than {hours} hour {minutes} min");
                         }
 
                         if (wafer.WaferType == WaferType.ED && IsEnableEDWaferThicknessWarning && wafer.UseThick > EDThicknessWarning && wafer.UseThick < EDThicknessAlarm)
                         {
-                            Singleton<ScheduleMaintenanceDataManager>.Instance.MaintenanceProcessingCommandExec(maintenanceItemEDWaferThickness.MaintenanceProcessing, Singleton<EquipmentManager>.Instance.EDWaferTypeThicknessWarning.Set, $"more than {EDThicknessWarning} nm");
+                            (Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule).MaintenanceProcessingCommandExec(maintenanceItemEDWaferThickness.MaintenanceProcessing, Singleton<EquipmentManager>.Instance.EDWaferTypeThicknessWarning.Set, $"more than {EDThicknessWarning} nm");
                         }
 
                         if (wafer.WaferType == WaferType.ED && IsEnableEDWaferUseCountWarning && wafer.UseCount >= EDCountAlarm)
                         {
-                            Singleton<ScheduleMaintenanceDataManager>.Instance.MaintenanceProcessingCommandExec(maintenanceItemEDCarrierUseFreq.MaintenanceProcessing, Singleton<EquipmentManager>.Instance.EDWaferTypeUseCountAlarm.Set, $"more than {EDCountAlarm} 次");
+                            (Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule).MaintenanceProcessingCommandExec(maintenanceItemEDCarrierUseFreq.MaintenanceProcessing, Singleton<EquipmentManager>.Instance.EDWaferTypeUseCountAlarm.Set, $"more than {EDCountAlarm} 次");
                             return false;
                         }
 
                         if (wafer.WaferType == WaferType.ED && IsEnableEDWaferUseTimeWarning && wafer.UseTime >= EDTimeAlarm)
                         {
                             DateTimeUtil.ConvertSecondsToHoursAndMinutes(EDTimeAlarm, out var hours, out var minutes);
-                            Singleton<ScheduleMaintenanceDataManager>.Instance.MaintenanceProcessingCommandExec(maintenanceItemEDWaferUserTime.MaintenanceProcessing, Singleton<EquipmentManager>.Instance.EDWaferTypeUseTimeAlarm.Set, $"more than {hours} hour {minutes}");
+                            (Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule).MaintenanceProcessingCommandExec(maintenanceItemEDWaferUserTime.MaintenanceProcessing, Singleton<EquipmentManager>.Instance.EDWaferTypeUseTimeAlarm.Set, $"more than {hours} hour {minutes}");
                             return false;
                         }
 
                         if (wafer.WaferType == WaferType.ED && IsEnableEDWaferThicknessWarning && wafer.UseThick >= EDThicknessAlarm)
                         {
-                            Singleton<ScheduleMaintenanceDataManager>.Instance.MaintenanceProcessingCommandExec(maintenanceItemEDWaferThickness.MaintenanceProcessing, Singleton<EquipmentManager>.Instance.EDWaferTypeThicknessAlarm.Set, $"more than {EDThicknessAlarm} nm");
+                            (Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule).MaintenanceProcessingCommandExec(maintenanceItemEDWaferThickness.MaintenanceProcessing, Singleton<EquipmentManager>.Instance.EDWaferTypeThicknessAlarm.Set, $"more than {EDThicknessAlarm} nm");
                             return false;
                         }
                         #endregion

+ 2 - 2
Furnace/FurnaceRT/Equipments/PMs/PMModule.cs

@@ -252,7 +252,7 @@ namespace FurnaceRT.Equipments.PMs
             InitStats();
 
             InitAlarmEvent();
-
+            InitScheduleMaintenance();
             InitAlarmConditionChecker();
 
             Singleton<EventManager>.Instance.OnAlarmEvent += Instance_OnAlarmEvent;
@@ -960,7 +960,7 @@ namespace FurnaceRT.Equipments.PMs
             if (ret == Result.FAIL || ret == Result.DONE)
                 return false;
 
-            Singleton<ScheduleMaintenanceDataManager>.Instance.UpdateRecipeFre(_recipeRunningInfo.RecipeName);
+            UpdateRecipeFre(_recipeRunningInfo.RecipeName);
 
             if (!IsJobProcess)
                 SensorPROCManualOK.Value = true;

+ 234 - 2
Furnace/FurnaceRT/Equipments/PMs/PMScheduleMaintenance.cs

@@ -1,4 +1,5 @@
-using Aitex.Core.Common.DeviceData;
+using Aitex.Core.Common;
+using Aitex.Core.Common.DeviceData;
 using Aitex.Core.RT.DataCenter;
 using Aitex.Core.RT.Event;
 using Aitex.Core.RT.IOCore;
@@ -6,10 +7,13 @@ using Aitex.Core.RT.Log;
 using Aitex.Core.RT.OperationCenter;
 using Aitex.Core.RT.SCCore;
 using Aitex.Core.Util;
+using DocumentFormat.OpenXml.VariantTypes;
 using MECF.Framework.Common.CommonData.EnumData;
 using MECF.Framework.Common.DataCenter;
+using MECF.Framework.Common.Equipment;
 using MECF.Framework.Common.Event;
 using MECF.Framework.Common.OperationCenter;
+using MECF.Framework.Common.Utilities;
 using System;
 using System.Collections;
 using System.Collections.Generic;
@@ -20,6 +24,234 @@ namespace FurnaceRT.Equipments.PMs
 {
     public partial class PMModule
     {
-       
+
+        private void InitScheduleMaintenance()
+        {
+
+            new ScheduleMaintenanceData(MaintenanceItemEnum.SDCarrierUseFreq.ToString(), "Times", "CarrierWafer.SieDummy", "Carrier Kind", "Side Dummy");
+            new ScheduleMaintenanceData(MaintenanceItemEnum.SDWaferThickness.ToString(), "Å", "CarrierWafer.SieDummy", "Carrier Kind", "Side Dummy");
+            new ScheduleMaintenanceData(MaintenanceItemEnum.SDUsableDummyWafer.ToString(), "Sheets", "CarrierWafer.SieDummy", "Carrier Kind", "Side Dummy");
+            new ScheduleMaintenanceData(MaintenanceItemEnum.SDBufferRackStayTime.ToString(), "h:m", "CarrierWafer.SieDummy", "Carrier Kind", "Side Dummy");
+            new ScheduleMaintenanceData(MaintenanceItemEnum.SDWaferUserTime.ToString(), "h:m", "CarrierWafer.SieDummy", "Carrier Kind", "Side Dummy");
+
+
+            new ScheduleMaintenanceData(MaintenanceItemEnum.FDCarrierUseFreq.ToString(), "Times", "CarrierWafer.FillDummy", "Carrier Kind", "Fill Dummy");
+            new ScheduleMaintenanceData(MaintenanceItemEnum.FDWaferThickness.ToString(), "Å", "CarrierWafer.FillDummy", "Carrier Kind", "Fill Dummy");
+            new ScheduleMaintenanceData(MaintenanceItemEnum.FDUsableDummyWafer.ToString(), "Sheets", "CarrierWafer.FillDummy", "Carrier Kind", "Fill Dummy");
+            new ScheduleMaintenanceData(MaintenanceItemEnum.FDBufferRackStayTime.ToString(), "h:m", "CarrierWafer.FillDummy", "Carrier Kind", "Fill Dummy");
+            new ScheduleMaintenanceData(MaintenanceItemEnum.FDWaferUserTime.ToString(), "h:m", "CarrierWafer.FillDummy", "Carrier Kind", "Fill Dummy");
+
+
+            new ScheduleMaintenanceData(MaintenanceItemEnum.BoatRecipeThickness1.ToString(), "Å", "Boat");
+            new ScheduleMaintenanceData(MaintenanceItemEnum.BoatTCUseTime.ToString(), "h:m", "Boat");
+            new ScheduleMaintenanceData(MaintenanceItemEnum.BoatCKDUseTime.ToString(), "h:m", "Boat");
+            new ScheduleMaintenanceData(MaintenanceItemEnum.BoatPUMPUseTime.ToString(), "h:m", "Boat");
+
+
+
+            new ScheduleMaintenanceData(MaintenanceItemEnum.NonOperationTime1.ToString(), "h:m", "Conditioning");
+            new ScheduleMaintenanceData(MaintenanceItemEnum.NonOperationTime2.ToString(), "h:m", "Conditioning");
+
+            new ScheduleMaintenanceData(MaintenanceItemEnum.RecipeExecuteFreq.ToString(), "Times", "Reactor.Recipe", "Select Recipe");
+            new ScheduleMaintenanceData(MaintenanceItemEnum.RecipeThickness.ToString(), "Å", "Reactor.Recipe", "Select Recipe");
+
+
+            new ScheduleMaintenanceData(MaintenanceItemEnum.RecipeStepExecuteFreq1.ToString(), "Times", "Reactor.StepRunFreq", "Step ID");
+            new ScheduleMaintenanceData(MaintenanceItemEnum.RecipeStepExecuteFreq2.ToString(), "Times", "Reactor.StepRunFreq", "Step ID");
+            new ScheduleMaintenanceData(MaintenanceItemEnum.RecipeStepExecuteFreq3.ToString(), "Times", "Reactor.StepRunFreq", "Step ID");
+
+
+            new ScheduleMaintenanceData(MaintenanceItemEnum.RecipeStepExecuteTime1.ToString(), "h:m", "Reactor.StepRunTime", "Step ID");
+            new ScheduleMaintenanceData(MaintenanceItemEnum.RecipeStepExecuteTime2.ToString(), "h:m", "Reactor.StepRunTime", "Step ID");
+            new ScheduleMaintenanceData(MaintenanceItemEnum.RecipeStepExecuteTime3.ToString(), "h:m", "Reactor.StepRunTime", "Step ID");
+            new ScheduleMaintenanceData(MaintenanceItemEnum.RecipeStepExecuteTime4.ToString(), "h:m", "Reactor.StepRunTime", "Step ID");
+            new ScheduleMaintenanceData(MaintenanceItemEnum.RecipeStepExecuteTime5.ToString(), "h:m", "Reactor.StepRunTime", "Step ID");
+            new ScheduleMaintenanceData(MaintenanceItemEnum.RecipeStepExecuteTime6.ToString(), "h:m", "Reactor.StepRunTime", "Step ID");
+            new ScheduleMaintenanceData(MaintenanceItemEnum.RecipeStepExecuteTime7.ToString(), "h:m", "Reactor.StepRunTime", "Step ID");
+            new ScheduleMaintenanceData(MaintenanceItemEnum.RecipeStepExecuteTime8.ToString(), "h:m", "Reactor.StepRunTime", "Step ID");
+
+
+
+            new ScheduleMaintenanceData(MaintenanceItemEnum.RecipeThickness1_Step.ToString(), "Å", "Reactor.StepThickness", "Step Group");
+            new ScheduleMaintenanceData(MaintenanceItemEnum.RecipeThickness2_Step.ToString(), "Å", "Reactor.StepThickness", "Step Group");
+            new ScheduleMaintenanceData(MaintenanceItemEnum.RecipeThickness3_Step.ToString(), "Å", "Reactor.StepThickness", "Step Group");
+            new ScheduleMaintenanceData(MaintenanceItemEnum.RecipeThickness4_Step.ToString(), "Å", "Reactor.StepThickness", "Step Group");
+            new ScheduleMaintenanceData(MaintenanceItemEnum.RecipeThickness5_Step.ToString(), "Å", "Reactor.StepThickness", "Step Group");
+            new ScheduleMaintenanceData(MaintenanceItemEnum.RecipeThickness6_Step.ToString(), "Å", "Reactor.StepThickness", "Step Group");
+            new ScheduleMaintenanceData(MaintenanceItemEnum.RecipeThickness7_Step.ToString(), "Å", "Reactor.StepThickness", "Step Group");
+            new ScheduleMaintenanceData(MaintenanceItemEnum.RecipeThickness8_Step.ToString(), "Å", "Reactor.StepThickness", "Step Group");
+
+
+        }
+
+        public void MaintenanceProcessingCommandExec(string maintenanceProcessing, Action<string> alarmReportExec, string warningMessage)
+        {
+            if (Enum.TryParse<MaintenanceProcessingCommandEnum>(maintenanceProcessing, out var command))
+            {
+                switch (command)
+                {
+                    case MaintenanceProcessingCommandEnum.None:
+                        break;
+                    case MaintenanceProcessingCommandEnum.AlarmReport:
+                        alarmReportExec(warningMessage);
+                        break;
+                    case MaintenanceProcessingCommandEnum.JobProhibition:
+                        break;
+                    case MaintenanceProcessingCommandEnum.JobManualStart:
+                        break;
+                    case MaintenanceProcessingCommandEnum.JobAutoStart:
+                        break;
+                }
+            }
+        }
+
+        #region Carrier/Wafer
+
+        public void UpdateSEDWafer()
+        {
+            var ccc = BinarySerializer<Dictionary<ModuleName, Dictionary<int, WaferInfo>>>.FromStream("WaferManager");
+            if (ccc == null)
+                return;
+
+
+            List<WaferInfo> waferInfos = new List<WaferInfo>();
+
+
+            foreach (var moduleWafers in ccc)
+            {
+                waferInfos.AddRange(moduleWafers.Value.Select(a => a.Value));
+            }
+            if (waferInfos.Any(a => a.WaferType == WaferType.ED))
+            {
+
+                var maxEDUseCount = waferInfos.Where(a => a.WaferType == WaferType.ED).Max(a => a.UseCount);
+                var maxEDUseThick = waferInfos.Where(a => a.WaferType == WaferType.ED).Max(a => a.UseThick);
+                var maxEDUseTime = waferInfos.Where(a => a.WaferType == WaferType.ED).Max(a => a.UseTime);
+
+
+                if (Singleton<ScheduleMaintenanceDataManager>.Instance.Item.TryGetValue(MaintenanceItemEnum.FDCarrierUseFreq.ToString(), out var FDCarrierUseFreq))
+                    Singleton<ScheduleMaintenanceDataManager>.Instance.SetValue(FDCarrierUseFreq.Item, maxEDUseCount);
+
+                if (Singleton<ScheduleMaintenanceDataManager>.Instance.Item.TryGetValue(MaintenanceItemEnum.FDWaferThickness.ToString(), out var FDWaferThickness))
+                    Singleton<ScheduleMaintenanceDataManager>.Instance.SetValue(FDWaferThickness.Item, maxEDUseThick);
+
+                if (Singleton<ScheduleMaintenanceDataManager>.Instance.Item.TryGetValue(MaintenanceItemEnum.FDWaferUserTime.ToString(), out var FDWaferUserTime))
+                    Singleton<ScheduleMaintenanceDataManager>.Instance.SetValue(FDWaferUserTime.Item, maxEDUseTime);
+            }
+            if (waferInfos.Any(a => a.WaferType == WaferType.SD))
+            {
+
+                var maxSDUseCount = waferInfos.Where(a => a.WaferType == WaferType.SD).Max(a => a.UseCount);
+                var maxSDUseThick = waferInfos.Where(a => a.WaferType == WaferType.SD).Max(a => a.UseThick);
+                var maxSDUseTime = waferInfos.Where(a => a.WaferType == WaferType.SD).Max(a => a.UseTime);
+                if (Singleton<ScheduleMaintenanceDataManager>.Instance.Item.TryGetValue(MaintenanceItemEnum.SDCarrierUseFreq.ToString(), out var SDCarrierUseFreq))
+                    Singleton<ScheduleMaintenanceDataManager>.Instance.SetValue(SDCarrierUseFreq.Item, maxSDUseCount);
+
+                if (Singleton<ScheduleMaintenanceDataManager>.Instance.Item.TryGetValue(MaintenanceItemEnum.SDWaferThickness.ToString(), out var SDWaferThickness))
+                    Singleton<ScheduleMaintenanceDataManager>.Instance.SetValue(SDWaferThickness.Item, maxSDUseThick);
+
+                if (Singleton<ScheduleMaintenanceDataManager>.Instance.Item.TryGetValue(MaintenanceItemEnum.SDWaferUserTime.ToString(), out var SDWaferUserTime))
+                    Singleton<ScheduleMaintenanceDataManager>.Instance.SetValue(SDWaferUserTime.Item, maxSDUseTime);
+            }
+
+        }
+        #endregion
+
+
+        #region DataItemEnum.Reactor 模块
+
+        /// <summary>
+        /// 根据RecipeStep +StepGroup统计  累计膜厚
+        /// </summary>
+        /// <param name="recipeName"></param>
+        public void UpdateRecipeStepGroupThickness(string stepName, float thickness)
+        {
+            if (string.IsNullOrEmpty(stepName) || thickness <= 0)
+                return;
+            var stepNo = stepName.Split(':').FirstOrDefault();
+            var list = Singleton<ScheduleMaintenanceDataManager>.Instance.Item.Values
+                .Where(a => !string.IsNullOrEmpty(a.AdditionInformationDisplaySupplement))
+                .Where(a => a.Path == $"{DataItemEnum.Reactor}.{ReactorsEnum.StepThickness}")
+                .Where(a => a.AdditionInformationDisplaySupplement.Split(',').Contains(stepNo))
+                .ToList();
+            if (list != null && list.Count > 0)
+            {
+                foreach (var item in list)
+                {
+                    Singleton<ScheduleMaintenanceDataManager>.Instance.Increase(item.Item, thickness);
+                }
+            }
+        }
+        /// <summary>
+        /// 根据RecipeStep统计 Step执行Time 累计时间
+        /// </summary>
+        /// <param name="recipeName"></param>
+        public void UpdateRecipeStepRunTime(string stepName, double stepTime)
+        {
+            if (string.IsNullOrEmpty(stepName) || stepTime <= 0)
+                return;
+            var stepNo = stepName.Split(':').FirstOrDefault();
+            var list = Singleton<ScheduleMaintenanceDataManager>.Instance.Item.Values.Where(a => a.Path == $"{DataItemEnum.Reactor}.{ReactorsEnum.StepRunTime}" && a.AdditionInformationDisplay == stepNo).ToList();
+            if (list != null && list.Count > 0)
+            {
+                foreach (var item in list)
+                {
+                    Singleton<ScheduleMaintenanceDataManager>.Instance.Increase(item.Item, (float)stepTime);
+                }
+            }
+        }
+        /// <summary>
+        /// 根据RecipeStep统计 Step执行 累计次数
+        /// </summary>
+        /// <param name="recipeName"></param>
+        public void UpdateRecipeStepFre(string stepName)
+        {
+            if (string.IsNullOrEmpty(stepName))
+                return;
+            var stepNo = stepName.Split(':').FirstOrDefault();
+            var list = Singleton<ScheduleMaintenanceDataManager>.Instance.Item.Values.Where(a => a.Path == $"{DataItemEnum.Reactor}.{ReactorsEnum.StepRunFreq}" && a.AdditionInformationDisplay == stepNo).ToList();
+            if (list != null && list.Count > 0)
+            {
+                foreach (var item in list)
+                {
+                    Singleton<ScheduleMaintenanceDataManager>.Instance.Increase(item.Item);
+                }
+            }
+        }
+        /// <summary>
+        /// 根据RecipeName统计 Recipe执行 累计次数
+        /// </summary>
+        /// <param name="processRecipeName"></param>
+        public void UpdateRecipeFre(string recipeName)
+        {
+            if (string.IsNullOrEmpty(recipeName))
+                return;
+            var item = Singleton<ScheduleMaintenanceDataManager>.Instance.Item.Values.Where(a => a.Item == MaintenanceItemEnum.RecipeExecuteFreq.ToString() && a.Path == $"{DataItemEnum.Reactor}.{ReactorsEnum.Recipe}" && a.AdditionInformationDisplay == recipeName).FirstOrDefault();
+            if (item != null && item.Item == MaintenanceItemEnum.RecipeExecuteFreq.ToString())
+            {
+                Singleton<ScheduleMaintenanceDataManager>.Instance.Increase(item.Item);
+            }
+        }
+        /// <summary>
+        /// 根据RecipeName统计累计膜厚
+        /// </summary>
+        /// <param name="recipeName"></param>
+        /// <param name="thickness"></param>
+        public void UpdateRecipeTotalThickness(string recipeName, float thickness)
+        {
+            if (string.IsNullOrEmpty(recipeName) || thickness <= 0)
+                return;
+            var item = Singleton<ScheduleMaintenanceDataManager>.Instance.Item.Values.Where(a => a.Item == MaintenanceItemEnum.RecipeThickness.ToString() && a.Path == $"{DataItemEnum.Reactor}.{ReactorsEnum.Recipe}" && a.AdditionInformationDisplay == recipeName).FirstOrDefault();
+
+            if (item != null && item.Item == MaintenanceItemEnum.RecipeThickness.ToString())
+            {
+                Singleton<ScheduleMaintenanceDataManager>.Instance.Increase(item.Item, thickness);
+            }
+
+        }
+
+        #endregion
+
+
     }
 }

+ 5 - 6
Furnace/FurnaceRT/Equipments/PMs/RecipeExecutions/Process.cs

@@ -744,7 +744,6 @@ namespace FurnaceRT.Equipments.PMs.RecipeExecutions
 
                                 if (!_isJumpStep)
                                 {
-                                    Singleton<ScheduleMaintenanceDataManager>.Instance.UpdateRecipeStepThicknessAndTime(stepName, thickness, stepTime);
                                     var wafers = WaferManager.Instance.GetWafers(ModuleHelper.Converter(Module));
                                     for (int i = 0; i < wafers.Length; i++)
                                     {
@@ -756,10 +755,10 @@ namespace FurnaceRT.Equipments.PMs.RecipeExecutions
 
                                         WaferManager.Instance.UpdateWaferStatistics(ModuleHelper.Converter(Module), i, useCount, useTime, useThick);
                                     }
-                                    Singleton<ScheduleMaintenanceDataManager>.Instance.UpdateRecipeTotalThickness(PMModule.RecipeRunningInfo.RecipeName, thickness);
-                                    Singleton<ScheduleMaintenanceDataManager>.Instance.UpdateRecipeStepFre(stepName);
-                                    Singleton<ScheduleMaintenanceDataManager>.Instance.UpdateRecipeStepRunTime(stepName, stepTime);
-                                    Singleton<ScheduleMaintenanceDataManager>.Instance.UpdateRecipeStepGroupThickness(stepName, thickness);
+                                    PMModule.UpdateRecipeTotalThickness(PMModule.RecipeRunningInfo.RecipeName, thickness);
+                                    PMModule.UpdateRecipeStepFre(stepName);
+                                    PMModule.UpdateRecipeStepRunTime(stepName, stepTime);
+                                    PMModule.UpdateRecipeStepGroupThickness(stepName, thickness);
 
                                 }
                             }
@@ -788,7 +787,7 @@ namespace FurnaceRT.Equipments.PMs.RecipeExecutions
                                     WaferManager.Instance.UpdateWaferStatistics(ModuleHelper.Converter(Module), i, useCount, useTime, useThick);
 
                                 }
-                                Singleton<ScheduleMaintenanceDataManager>.Instance.UpdateSEDWafer();
+                                PMModule.UpdateSEDWafer();
 
                                 if (PMModule.IsHeaterProfile && !PMModule.IsHeaterProfileSuccess)
                                     EV.PostWarningLog(PMModule.Module, "Auto profile failed");