Forráskód Böngészése

update Recipe StepId/StepGroup统计完成

git-svn-id: http://10.4.3.168:50001/svn/Furnace@118 dbcde07d-dcf5-c148-8a84-ac3097b7778e
Jiangjinyuan 1 hónapja%!(EXTRA string=óta)
szülő
commit
f03daf25c7

+ 23 - 1
FrameworkLocal/Common/CommonData/EnumData/MaintenanceProcessingCommandEnum.cs

@@ -19,9 +19,31 @@ namespace MECF.Framework.Common.CommonData.EnumData
 
         JobManualStart = 15,
 
-
         JobAutoStart = 20,
     }
+    public enum DummyEnum : byte
+    {
+        None = 0,
+        SideDummy = 1,
+        FillDummy = 2
+    }
+
+    public enum ReactorsEnum : byte
+    {
+        None = 0,
+        Recipe = 1,
+        StepRunFreq = 2,
+        StepRunTime = 3,
+        StepThickness = 4
+    }
+
+    public enum DataItemEnum
+    {
+        CarrierWafer,
+        Boat,
+        Conditioning,
+        Reactor
+    }
     public enum MaintenanceItemEnum
     {
         SDCarrierUseFreq,

+ 94 - 42
FrameworkLocal/Common/DataCenter/ScheduleMaintenanceDataManager.cs

@@ -2,6 +2,7 @@
 using System.Collections.Generic;
 using System.Data;
 using System.Linq;
+using System.Runtime.Remoting.Metadata.W3cXsd2001;
 using Aitex.Core.Common;
 using Aitex.Core.RT.DBCore;
 using Aitex.Core.RT.Event;
@@ -483,9 +484,97 @@ namespace MECF.Framework.Common.DataCenter
                 {"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)
         {
@@ -502,11 +591,7 @@ namespace MECF.Framework.Common.DataCenter
             return true;
         }
 
-        public ScheduleMaintenanceData GetScheduleMaintenanceData(MaintenanceItemEnum MaintenanceItemEnum)
-        {
-            _scheduleMaintenanceDataDictionary.TryGetValue(MaintenanceItemEnum, out var data);
-            return data;
-        }
+   
         public void MaintenanceProcessingCommandExec(string maintenanceProcessing, Action<string> alarmReportExec, string warningMessage)
         {
             if (Enum.TryParse<MaintenanceProcessingCommandEnum>(maintenanceProcessing, out var command))
@@ -532,11 +617,10 @@ namespace MECF.Framework.Common.DataCenter
         public void InitAllData()
         {
             InitScheduleMaintenance();
-            //InitReatorRecipeTotal();
-           // InitSEDWafer();
+         
         }
 
-        private void InitSEDWafer()
+        public void UpdateSEDWafer()
         {
             if (_scheduleMaintenanceDataDictionary == null)
             {
@@ -584,45 +668,13 @@ namespace MECF.Framework.Common.DataCenter
 
             }
         }
-        public void UpdateSEDWafer()
-        {
-            InitSEDWafer();
-        }
+    
 
 
         #endregion
 
-        #region ReatorRecipe
-        private void InitReatorRecipeTotal()
-        {
-            var dbItem = GetScheduleMaintenanceData(MaintenanceItemEnum.RecipeExecuteFreq);
-            if (dbItem == null)
-                return;
-
-
-            float total = 0;
+      
 
-            string sql = $"SELECT guid FROM pj_data WHERE pj_data.recipe_name= (SELECT schedule_maintenance.addition_information_display FROM schedule_maintenance WHERE maintenance_item='{MaintenanceItemEnum.RecipeExecuteFreq}')";
-
-            var ds = DB.ExecuteDataset(sql);
-            if (ds != null && ds.Tables != null && ds.Tables.Count > 0 && ds.Tables[0].Rows != null)
-            {
-                total= ds.Tables[0].Rows.Count;
-            }
-
-            dbItem.SetValue(total);
-        }
-        public void ReatorRecipeTotalByRecipeName(string processRecipeName)
-        {
-            if (string.IsNullOrEmpty(processRecipeName))
-                return;
-            var dbItem = GetScheduleMaintenanceData(MaintenanceItemEnum.RecipeExecuteFreq);
-            if (dbItem.DataItem.AdditionInformationDisplay == processRecipeName)
-            {
-                dbItem.Increase();
-            }
-        }
-        #endregion
 
     }
 }

+ 0 - 1
FrameworkLocal/Common/SubstrateTrackings/WaferManager.cs

@@ -1051,7 +1051,6 @@ namespace MECF.Framework.Common.SubstrateTrackings
                 _locationWafers[module][slot].UseThick = useThick;
                 WaferDataRecorder.SetStatistics(_locationWafers[module][slot].InnerId.ToString(), useCount, useTime, useThick);
 
-                Singleton<ScheduleMaintenanceDataManager>.Instance.UpdateSEDWafer();
 
             }
             _needSerialize = true;

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

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

+ 36 - 27
Furnace/FurnaceRT/Equipments/PMs/RecipeExecutions/Process.cs

@@ -15,6 +15,7 @@ using System.Collections.Generic;
 using FurnaceRT.Equipments.PMs.Routines;
 using System.Diagnostics;
 using MECF.Framework.Common.DataCenter;
+using System.Runtime.Remoting.Metadata.W3cXsd2001;
 
 namespace FurnaceRT.Equipments.PMs.RecipeExecutions
 {
@@ -195,7 +196,7 @@ namespace FurnaceRT.Equipments.PMs.RecipeExecutions
         private string _infoAUXWaitCondition = "";
         private string _infoHeaterWaitCondition = "";
         private string _infoMFCWaitCondition = "";
-        private Dictionary<int, Tuple<bool,int>> _callSubSteps = new Dictionary<int, Tuple<bool, int>>();
+        private Dictionary<int, Tuple<bool, int>> _callSubSteps = new Dictionary<int, Tuple<bool, int>>();
         private bool _isJumpStep = false;
 
         public Process(ModuleName module, PMModule pm) : base(module, pm)
@@ -330,7 +331,7 @@ namespace FurnaceRT.Equipments.PMs.RecipeExecutions
                 curSteps = PMModule.RecipeRunningInfo.RecipeStepList[_currentStepNumber].SubRecipeSteps;
 
                 if (!_callSubSteps.ContainsKey(_currentStepNumber))
-                    _callSubSteps.Add(_currentStepNumber, Tuple.Create(false,0));
+                    _callSubSteps.Add(_currentStepNumber, Tuple.Create(false, 0));
                 if (PMModule.RecipeRunningInfo.RecipeStepList[_currentStepNumber].IsCallSubStep)
                     _callSubSteps[_currentStepNumber] = Tuple.Create(true, PMModule.RecipeRunningInfo.RecipeStepList[_currentStepNumber].SubRecipeLoopCount);
 
@@ -384,7 +385,7 @@ namespace FurnaceRT.Equipments.PMs.RecipeExecutions
                                         _currentSubRecipeStepNumber = curSteps[_currentSubRecipeStepNumber].JumpStepNo;
                                     }
 
-                                    RecipeExec("Sub recipe", curSteps, _currentSubRecipeStepNumber, _curStepElpasedTimeBeforePaused, _currentSubRecipeStepNumber+1);
+                                    RecipeExec("Sub recipe", curSteps, _currentSubRecipeStepNumber, _curStepElpasedTimeBeforePaused, _currentSubRecipeStepNumber + 1);
                                 }
                                 else
                                 {
@@ -539,10 +540,10 @@ namespace FurnaceRT.Equipments.PMs.RecipeExecutions
                                 if (_stepTimer.IsTimeout())
                                 {
 
-                                    if(PMModule.IsBoatMoveToLoadPosition)
+                                    if (PMModule.IsBoatMoveToLoadPosition)
                                     {
                                         _trigBoatMoveToLoadPositionTimeout.CLK = !boatWaitCondition;
-                                        if(_trigBoatMoveToLoadPositionTimeout.Q)
+                                        if (_trigBoatMoveToLoadPositionTimeout.Q)
                                             PMModule.BoatMoveToLoadPositionTimeoutWarning.Set();
                                     }
                                     //_trigInputSignalTimeOutAlarm.CLK = !PMModule.CheckExternalSensorCondition();
@@ -619,14 +620,14 @@ namespace FurnaceRT.Equipments.PMs.RecipeExecutions
                                 {
                                     stepName = PMModule.RecipeRunningInfo.RecipeStepList[_currentStepNumber].SubRecipeSteps[_currentSubRecipeStepNumber].StepName;
                                     float.TryParse(PMModule.RecipeRunningInfo.RecipeStepList[_currentStepNumber].SubRecipeSteps[_currentSubRecipeStepNumber].FilmThickFormula, out thickness);
-                                   
+
                                     //放在前面,stepnumber后面会被更新
                                     if (!_isJumpStep)
                                     {
                                         _faCallback.RecipeStepEnd(PMModule.Module, PMModule.RecipeRunningInfo.RecipeName, _currentSubRecipeStepNumber + 1);
                                         _dbCallback.RecipeStepEnd(PMModule.RecipeRunningInfo.InnerId.ToString(), _currentSubRecipeStepNumber + 1, _fdc.DataList, SC.GetStringValue("PM1.TempCorrection"), SC.GetStringValue("PM1.Heater.PID"));
                                     }
-                                        
+
                                     _fdc.Stop();
 
                                     _totalElpasedTime += curSteps[_currentSubRecipeStepNumber].StepTime;
@@ -685,7 +686,7 @@ namespace FurnaceRT.Equipments.PMs.RecipeExecutions
                                         _faCallback.RecipeStepEnd(PMModule.Module, PMModule.RecipeRunningInfo.RecipeName, _currentStepNumber);
                                         _dbCallback.RecipeStepEnd(PMModule.RecipeRunningInfo.InnerId.ToString(), _currentStepNumber, _fdc.DataList, SC.GetStringValue("PM1.TempCorrection"), SC.GetStringValue("PM1.Heater.PID"));
                                     }
-                                        
+
                                     _fdc.Stop();
 
                                     if (_currentStepNumber >= 0 && !IsSubReciep)
@@ -712,7 +713,7 @@ namespace FurnaceRT.Equipments.PMs.RecipeExecutions
                                         RecipeLoopEndCheck(PMModule.RecipeRunningInfo.RecipeStepList);
                                     }
 
-                                    if(_currentStepNumber >= PMModule.RecipeRunningInfo.RecipeStepList.Count - 1)
+                                    if (_currentStepNumber >= PMModule.RecipeRunningInfo.RecipeStepList.Count - 1)
                                     {
                                         for (int i = 0; i < SC.GetValue<int>($"Boat.SlotCount"); i++)
                                         {
@@ -741,7 +742,7 @@ namespace FurnaceRT.Equipments.PMs.RecipeExecutions
                                     }
                                 }
 
-                                if(!_isJumpStep)
+                                if (!_isJumpStep)
                                 {
                                     Singleton<ScheduleMaintenanceDataManager>.Instance.UpdateRecipeStepThicknessAndTime(stepName, thickness, stepTime);
                                     var wafers = WaferManager.Instance.GetWafers(ModuleHelper.Converter(Module));
@@ -755,6 +756,11 @@ 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);
+
                                 }
                             }
 
@@ -780,7 +786,9 @@ namespace FurnaceRT.Equipments.PMs.RecipeExecutions
                                     var useThick = wafers[i].UseThick;
 
                                     WaferManager.Instance.UpdateWaferStatistics(ModuleHelper.Converter(Module), i, useCount, useTime, useThick);
+
                                 }
+                                Singleton<ScheduleMaintenanceDataManager>.Instance.UpdateSEDWafer();
 
                                 if (PMModule.IsHeaterProfile && !PMModule.IsHeaterProfileSuccess)
                                     EV.PostWarningLog(PMModule.Module, "Auto profile failed");
@@ -819,7 +827,7 @@ namespace FurnaceRT.Equipments.PMs.RecipeExecutions
 
             if (IsSubReciep)
             {
-                if(PMModule.RecipeRunningInfo.RecipeStepList[_currentStepNumber].SubRecipeSteps != null)
+                if (PMModule.RecipeRunningInfo.RecipeStepList[_currentStepNumber].SubRecipeSteps != null)
                 {
                     if (_stepTimer.IsIdle())
                     {
@@ -868,13 +876,13 @@ namespace FurnaceRT.Equipments.PMs.RecipeExecutions
                             PMModule.RecipeRunningInfo.RecipeStepList[_currentStepNumber].SubRecipeSteps[PMModule.RecipeRunningInfo.RecipeStepList[_currentStepNumber].SubRecipeSteps[step].LoopStartStep].StepName : "";
                     else
                     {
-                        if(PMModule.RecipeRunningInfo.RecipeStepList[_currentStepNumber].SubRecipeSteps.Count > step + 1)
+                        if (PMModule.RecipeRunningInfo.RecipeStepList[_currentStepNumber].SubRecipeSteps.Count > step + 1)
                         {
                             PMModule.RecipeRunningInfo.NextStepName = PMModule.RecipeRunningInfo.RecipeStepList[_currentStepNumber].SubRecipeSteps[step + 1].StepName;
                         }
                         else
                         {
-                            if(PMModule.RecipeRunningInfo.SubRecipeCurrentLoopCount < PMModule.RecipeRunningInfo.SubRecipeLoopCount)
+                            if (PMModule.RecipeRunningInfo.SubRecipeCurrentLoopCount < PMModule.RecipeRunningInfo.SubRecipeLoopCount)
                             {
                                 //sub 下一个循环
                                 PMModule.RecipeRunningInfo.NextStepName = PMModule.RecipeRunningInfo.RecipeStepList[_currentStepNumber].SubRecipeSteps[0].StepName;
@@ -899,7 +907,7 @@ namespace FurnaceRT.Equipments.PMs.RecipeExecutions
                         PMModule.StringProcessFlowState = PMModule.ProcessFlowState.Run.ToString();
                     }
                 }
-                
+
                 return;
             }
 
@@ -932,7 +940,8 @@ namespace FurnaceRT.Equipments.PMs.RecipeExecutions
             PMModule.RecipeRunningInfo.StepTime = PMModule.RecipeRunningInfo.RecipeStepList[_currentStepNumber].StepTime;
             PMModule.RecipeRunningInfo.RecipeName = PMModule.RecipeRunningInfo.MainRecipeName;
             PMModule.RecipeRunningInfo.ExecRecipeType = PMModule.RecipeRunningInfo.RecipeStepList[_currentStepNumber].RecipeType;
-            if (_state == RecipeRunningState.RecipeCompleted) { 
+            if (_state == RecipeRunningState.RecipeCompleted)
+            {
                 PMModule.RecipeRunningInfo.HoldTime = 0;
             }
 
@@ -954,7 +963,7 @@ namespace FurnaceRT.Equipments.PMs.RecipeExecutions
                 PMModule.RecipeRunningInfo.StepNumber = step + 1; //CurStepNum start from 0
             }
             PMModule.RecipeRunningInfo.StepName = PMModule.RecipeRunningInfo.RecipeStepList[_showStepNo].StepName;
-            if(PMModule.RecipeRunningInfo.RecipeStepList[step].IsLoopEndStep)
+            if (PMModule.RecipeRunningInfo.RecipeStepList[step].IsLoopEndStep)
                 PMModule.RecipeRunningInfo.NextStepName = PMModule.RecipeRunningInfo.RecipeStepList.Count > PMModule.RecipeRunningInfo.RecipeStepList[step].LoopStartStep ? PMModule.RecipeRunningInfo.RecipeStepList[PMModule.RecipeRunningInfo.RecipeStepList[_currentStepNumber].LoopStartStep].StepName : "";
             else
                 PMModule.RecipeRunningInfo.NextStepName = PMModule.RecipeRunningInfo.RecipeStepList.Count > step + 1 ? PMModule.RecipeRunningInfo.RecipeStepList[step + 1].StepName : "";
@@ -981,8 +990,8 @@ namespace FurnaceRT.Equipments.PMs.RecipeExecutions
             if (_alarmNames.Count == 0)
                 return;
 
-            int group = -1,temp = 0;
-            string iAlarmConditionTable="1:";
+            int group = -1, temp = 0;
+            string iAlarmConditionTable = "1:";
             if (IsSubReciep)
             {
                 for (int i = 0; i < _alarmNames.Count; i++)
@@ -1099,7 +1108,7 @@ namespace FurnaceRT.Equipments.PMs.RecipeExecutions
                 _holdTimeElpasedTime += _holdTimer.GetElapseTime();
                 _holdTimer.Stop();
             }
-            
+
             CurrentLoopCount = 0;
             CurrentAbortRecipeLoopCount = 0;
             CurrentSubRecipeLoopCount = 0;
@@ -1184,7 +1193,7 @@ namespace FurnaceRT.Equipments.PMs.RecipeExecutions
                     _holdTimer.Stop();
                 }
             }
-            if(IsSubReciep)
+            if (IsSubReciep)
             {
                 ResetLoop(PMModule.RecipeRunningInfo.RecipeStepList[_currentStepNumber].SubRecipeSteps, _currentSubRecipeStepNumber);
             }
@@ -1238,7 +1247,7 @@ namespace FurnaceRT.Equipments.PMs.RecipeExecutions
         {
             PMModule.AbortLeakCheck();
             LOG.Write($"Jump to step stepNumber={stepNumber} stepName={stepName}, currentStepNumber={_currentStepNumber}");
-            if (_state == RecipeRunningState.ConditionWait || _state == RecipeRunningState.TimeWait || 
+            if (_state == RecipeRunningState.ConditionWait || _state == RecipeRunningState.TimeWait ||
                 _state == RecipeRunningState.Paused || _state == RecipeRunningState.ExecStep)
             {
                 _loopEnd = true;
@@ -1263,11 +1272,11 @@ namespace FurnaceRT.Equipments.PMs.RecipeExecutions
                     ResetLoop(PMModule.RecipeRunningInfo.RecipeStepList, _currentStepNumber);
                 }
 
-                if(_callSubSteps != null)
+                if (_callSubSteps != null)
                 {
-                    foreach(var key in _callSubSteps.Keys)
+                    foreach (var key in _callSubSteps.Keys)
                     {
-                        if(PMModule.RecipeRunningInfo.RecipeStepList.Count > key)
+                        if (PMModule.RecipeRunningInfo.RecipeStepList.Count > key)
                         {
                             PMModule.RecipeRunningInfo.RecipeStepList[key].IsCallSubStep = _callSubSteps[key].Item1;
                             PMModule.RecipeRunningInfo.RecipeStepList[key].SubRecipeLoopCount = _callSubSteps[key].Item2;
@@ -1281,7 +1290,7 @@ namespace FurnaceRT.Equipments.PMs.RecipeExecutions
                 _currentStepNumber = stepNumber - 1;
                 if (_currentStepNumber < 0)
                     _currentStepNumber = 0;
-                    
+
                 _totalElpasedTime = RefreshElpasedTime();
                 _state = RecipeRunningState.StepCompleted;
                 PMModule.IsPaused = false;
@@ -1321,7 +1330,7 @@ namespace FurnaceRT.Equipments.PMs.RecipeExecutions
                         }
                         else
                         {
-                            if (PMModule.RecipeRunningInfo.RecipeStepList[i].SubRecipeSteps != null && 
+                            if (PMModule.RecipeRunningInfo.RecipeStepList[i].SubRecipeSteps != null &&
                                 PMModule.RecipeRunningInfo.RecipeStepList[i].SubRecipeSteps.Count > _currentSubRecipeStepNumber)
                             {
                                 total += SubRecipeCalTotalTime(i) * PMModule.RecipeRunningInfo.RecipeStepList[i].SubRecipeLoopCount;
@@ -1704,7 +1713,7 @@ namespace FurnaceRT.Equipments.PMs.RecipeExecutions
             _infoMFCWaitCondition = "";
         }
 
-        private void RecipeExec(string type, List<RecipeStep> curSteps, int currentStepNumber, double curStepElpasedTimeBeforePaused, int otherRecipeStartStepNumber=0)
+        private void RecipeExec(string type, List<RecipeStep> curSteps, int currentStepNumber, double curStepElpasedTimeBeforePaused, int otherRecipeStartStepNumber = 0)
         {
             var reason = "";
             _stepTimer.Start(curSteps[currentStepNumber].StepTime * 1000 - curStepElpasedTimeBeforePaused);

+ 27 - 26
Furnace/FurnaceUI/Views/Scheduled/ScheduledMaintenanceMonitorView.xaml

@@ -7,6 +7,7 @@
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
     xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
     xmlns:local="clr-namespace:FurnaceUI.Views.Editors"
+           xmlns:enumData="clr-namespace:MECF.Framework.Common.CommonData.EnumData;assembly=MECF.Framework.Common"
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
     Width="1000"
     Height="780"
@@ -138,7 +139,7 @@
                                             </i:Interaction.Triggers>
                                         </Button>
                                     </StackPanel>
-                                </DataTemplate> 
+                                </DataTemplate>
                                 <DataTemplate x:Key="ReactorStepRunDataTemplate">
                                     <StackPanel Height="40" Orientation="Horizontal">
                                         <TextBlock  MinWidth="110"  Margin="5,0" HorizontalAlignment="Right" VerticalAlignment="Center" >
@@ -179,14 +180,14 @@
                             <ContentControl.Style>
                                 <Style TargetType="ContentControl">
                                     <Style.Triggers>
-                                        <DataTrigger Binding="{Binding EditModel.DataItemType}" Value="{x:Static local:DataItemEnum.CarrierWafer}">
+                                        <DataTrigger Binding="{Binding EditModel.DataItemType}" Value="{x:Static enumData:DataItemEnum.CarrierWafer}">
                                             <Setter Property="ContentTemplate" Value="{StaticResource CommonDataTemplate}" />
                                         </DataTrigger>
 
                                         <MultiDataTrigger>
                                             <MultiDataTrigger.Conditions>
-                                                <Condition Binding="{Binding EditModel.DataItemType}" Value="{x:Static local:DataItemEnum.Reactor}" />
-                                                <Condition Binding="{Binding EditModel.ReactorsType}" Value="{x:Static local:ReactorsEnum.Recipe}" />
+                                                <Condition Binding="{Binding EditModel.DataItemType}" Value="{x:Static enumData:DataItemEnum.Reactor}" />
+                                                <Condition Binding="{Binding EditModel.ReactorsType}" Value="{x:Static enumData:ReactorsEnum.Recipe}" />
                                             </MultiDataTrigger.Conditions>
                                             <MultiDataTrigger.Setters>
                                                 <Setter Property="ContentTemplate" Value="{StaticResource ReactorRecipeDataTemplate}" />
@@ -194,8 +195,8 @@
                                         </MultiDataTrigger>
                                         <MultiDataTrigger>
                                             <MultiDataTrigger.Conditions>
-                                                <Condition Binding="{Binding EditModel.DataItemType}" Value="{x:Static local:DataItemEnum.Reactor}" />
-                                                <Condition Binding="{Binding EditModel.ReactorsType}" Value="{x:Static local:ReactorsEnum.StepRunTime}" />
+                                                <Condition Binding="{Binding EditModel.DataItemType}" Value="{x:Static enumData:DataItemEnum.Reactor}" />
+                                                <Condition Binding="{Binding EditModel.ReactorsType}" Value="{x:Static enumData:ReactorsEnum.StepRunTime}" />
                                             </MultiDataTrigger.Conditions>
                                             <MultiDataTrigger.Setters>
                                                 <Setter Property="ContentTemplate" Value="{StaticResource ReactorStepRunDataTemplate}" />
@@ -203,8 +204,8 @@
                                         </MultiDataTrigger>
                                         <MultiDataTrigger>
                                             <MultiDataTrigger.Conditions>
-                                                <Condition Binding="{Binding EditModel.DataItemType}" Value="{x:Static local:DataItemEnum.Reactor}" />
-                                                <Condition Binding="{Binding EditModel.ReactorsType}" Value="{x:Static local:ReactorsEnum.StepRunFreq}" />
+                                                <Condition Binding="{Binding EditModel.DataItemType}" Value="{x:Static enumData:DataItemEnum.Reactor}" />
+                                                <Condition Binding="{Binding EditModel.ReactorsType}" Value="{x:Static enumData:ReactorsEnum.StepRunFreq}" />
                                             </MultiDataTrigger.Conditions>
                                             <MultiDataTrigger.Setters>
                                                 <Setter Property="ContentTemplate" Value="{StaticResource ReactorStepRunDataTemplate}" />
@@ -212,8 +213,8 @@
                                         </MultiDataTrigger>
                                         <MultiDataTrigger>
                                             <MultiDataTrigger.Conditions>
-                                                <Condition Binding="{Binding EditModel.DataItemType}" Value="{x:Static local:DataItemEnum.Reactor}" />
-                                                <Condition Binding="{Binding EditModel.ReactorsType}" Value="{x:Static local:ReactorsEnum.StepThickness}" />
+                                                <Condition Binding="{Binding EditModel.DataItemType}" Value="{x:Static enumData:DataItemEnum.Reactor}" />
+                                                <Condition Binding="{Binding EditModel.ReactorsType}" Value="{x:Static enumData:ReactorsEnum.StepThickness}" />
                                             </MultiDataTrigger.Conditions>
                                             <MultiDataTrigger.Setters>
                                                 <Setter Property="ContentTemplate" Value="{StaticResource ReactorStepThicknessDataTemplate}" />
@@ -277,16 +278,16 @@
                         <!--<Button.Style>
                             <Style BasedOn="{StaticResource ResourceKey={x:Type Button}}" TargetType="Button">
                                 <Style.Triggers>
-                                    <DataTrigger Binding="{Binding EditModel.DataItemType}" Value="{x:Static local:DataItemEnum.CarrierWafer}">
+                                    <DataTrigger Binding="{Binding EditModel.DataItemType}" Value="{x:Static enumData:DataItemEnum.CarrierWafer}">
                                         <Setter Property="Visibility" Value="Collapsed" />
                                     </DataTrigger>
-                                    <DataTrigger Binding="{Binding EditModel.DataItemType}" Value="{x:Static local:DataItemEnum.Boat}">
+                                    <DataTrigger Binding="{Binding EditModel.DataItemType}" Value="{x:Static enumData:DataItemEnum.Boat}">
                                         <Setter Property="Visibility" Value="Visible" />
                                     </DataTrigger>
-                                    <DataTrigger Binding="{Binding EditModel.DataItemType}" Value="{x:Static local:DataItemEnum.Conditioning}">
+                                    <DataTrigger Binding="{Binding EditModel.DataItemType}" Value="{x:Static enumData:DataItemEnum.Conditioning}">
                                         <Setter Property="Visibility" Value="Visible" />
                                     </DataTrigger>
-                                    <DataTrigger Binding="{Binding EditModel.DataItemType}" Value="{x:Static local:DataItemEnum.Reactor}">
+                                    <DataTrigger Binding="{Binding EditModel.DataItemType}" Value="{x:Static enumData:DataItemEnum.Reactor}">
                                         <Setter Property="Visibility" Value="Visible" />
                                     </DataTrigger>
                                 </Style.Triggers>
@@ -306,16 +307,16 @@
                         <!--<Button.Style>
                             <Style BasedOn="{StaticResource ResourceKey={x:Type Button}}" TargetType="Button">
                                 <Style.Triggers>
-                                    <DataTrigger Binding="{Binding EditModel.DataItemType}" Value="{x:Static local:DataItemEnum.CarrierWafer}">
+                                    <DataTrigger Binding="{Binding EditModel.DataItemType}" Value="{x:Static enumData:DataItemEnum.CarrierWafer}">
                                         <Setter Property="Visibility" Value="Collapsed" />
                                     </DataTrigger>
-                                    <DataTrigger Binding="{Binding EditModel.DataItemType}" Value="{x:Static local:DataItemEnum.Boat}">
+                                    <DataTrigger Binding="{Binding EditModel.DataItemType}" Value="{x:Static enumData:DataItemEnum.Boat}">
                                         <Setter Property="Visibility" Value="Visible" />
                                     </DataTrigger>
-                                    <DataTrigger Binding="{Binding EditModel.DataItemType}" Value="{x:Static local:DataItemEnum.Conditioning}">
+                                    <DataTrigger Binding="{Binding EditModel.DataItemType}" Value="{x:Static enumData:DataItemEnum.Conditioning}">
                                         <Setter Property="Visibility" Value="Visible" />
                                     </DataTrigger>
-                                    <DataTrigger Binding="{Binding EditModel.DataItemType}" Value="{x:Static local:DataItemEnum.Reactor}">
+                                    <DataTrigger Binding="{Binding EditModel.DataItemType}" Value="{x:Static enumData:DataItemEnum.Reactor}">
                                         <Setter Property="Visibility" Value="Visible" />
                                     </DataTrigger>
                                 </Style.Triggers>
@@ -332,16 +333,16 @@
                     <TextBlock.Style>
                         <Style TargetType="TextBlock">
                             <Style.Triggers>
-                                <DataTrigger Binding="{Binding EditModel.DataItemType}" Value="{x:Static local:DataItemEnum.CarrierWafer}">
+                                <DataTrigger Binding="{Binding EditModel.DataItemType}" Value="{x:Static enumData:DataItemEnum.CarrierWafer}">
                                     <Setter Property="Text" Value="" />
                                 </DataTrigger>
-                                <DataTrigger Binding="{Binding EditModel.DataItemType}" Value="{x:Static local:DataItemEnum.Boat}">
+                                <DataTrigger Binding="{Binding EditModel.DataItemType}" Value="{x:Static enumData:DataItemEnum.Boat}">
                                     <Setter Property="Text" Value="As for the value diplay araa,the current value is displayed when the current value change button isPressed,but the monitor value is displayed when the value change button is not pressed." />
                                 </DataTrigger>
-                                <DataTrigger Binding="{Binding EditModel.DataItemType}" Value="{x:Static local:DataItemEnum.Conditioning}">
+                                <DataTrigger Binding="{Binding EditModel.DataItemType}" Value="{x:Static enumData:DataItemEnum.Conditioning}">
                                     <Setter Property="Text" Value="As for the value diplay araa,the current value is displayed when the current value change button isPressed,but the monitor value is displayed when the value change button is not pressed." />
                                 </DataTrigger>
-                                <DataTrigger Binding="{Binding EditModel.DataItemType}" Value="{x:Static local:DataItemEnum.Reactor}">
+                                <DataTrigger Binding="{Binding EditModel.DataItemType}" Value="{x:Static enumData:DataItemEnum.Reactor}">
                                     <Setter Property="Text" Value="As for the value diplay araa,the current value is displayed when the current value change button isPressed,but the monitor value is displayed when the value change button is not pressed." />
                                 </DataTrigger>
                             </Style.Triggers>
@@ -469,7 +470,7 @@ FontSize="20" ItemsSource="{Binding MaintenanceProcessingList}"  SelectedItem="{
                             <Style.Triggers>
                                 <MultiDataTrigger>
                                     <MultiDataTrigger.Conditions>
-                                        <Condition Binding="{Binding EditModel.DataItemType}" Value="{x:Static local:DataItemEnum.CarrierWafer}" />
+                                        <Condition Binding="{Binding EditModel.DataItemType}" Value="{x:Static enumData:DataItemEnum.CarrierWafer}" />
                                     </MultiDataTrigger.Conditions>
                                     <MultiDataTrigger.Setters>
                                         <Setter Property="Text" Value="The processing of wafer is completed by this limit value arrival." />
@@ -477,7 +478,7 @@ FontSize="20" ItemsSource="{Binding MaintenanceProcessingList}"  SelectedItem="{
                                 </MultiDataTrigger>
                                 <MultiDataTrigger>
                                     <MultiDataTrigger.Conditions>
-                                        <Condition Binding="{Binding EditModel.DataItemType}" Value="{x:Static local:DataItemEnum.Boat}" />
+                                        <Condition Binding="{Binding EditModel.DataItemType}" Value="{x:Static enumData:DataItemEnum.Boat}" />
                                     </MultiDataTrigger.Conditions>
                                     <MultiDataTrigger.Setters>
                                         <Setter Property="Text" Value="Dummy Wafer on the boat is collected to the source carrier when current value reaches the limit value." />
@@ -485,7 +486,7 @@ FontSize="20" ItemsSource="{Binding MaintenanceProcessingList}"  SelectedItem="{
                                 </MultiDataTrigger>
                                 <MultiDataTrigger>
                                     <MultiDataTrigger.Conditions>
-                                        <Condition Binding="{Binding EditModel.DataItemType}" Value="{x:Static local:DataItemEnum.Conditioning}" />
+                                        <Condition Binding="{Binding EditModel.DataItemType}" Value="{x:Static enumData:DataItemEnum.Conditioning}" />
                                     </MultiDataTrigger.Conditions>
                                     <MultiDataTrigger.Setters>
                                         <Setter Property="Text" Value="Alarm is reported by this limit value arrival." />
@@ -493,7 +494,7 @@ FontSize="20" ItemsSource="{Binding MaintenanceProcessingList}"  SelectedItem="{
                                 </MultiDataTrigger>
                                 <MultiDataTrigger>
                                     <MultiDataTrigger.Conditions>
-                                        <Condition Binding="{Binding EditModel.DataItemType}" Value="{x:Static local:DataItemEnum.Reactor}" />
+                                        <Condition Binding="{Binding EditModel.DataItemType}" Value="{x:Static enumData:DataItemEnum.Reactor}" />
                                     </MultiDataTrigger.Conditions>
                                     <MultiDataTrigger.Setters>
                                         <Setter Property="Text" Value="A new job started by this limit value arrival." />

+ 11 - 10
Furnace/FurnaceUI/Views/Scheduled/ScheduledMaitView.xaml

@@ -9,6 +9,7 @@
     xmlns:local="clr-namespace:FurnaceUI.Views.Editors"
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
     Background="White"
+           xmlns:enumData="clr-namespace:MECF.Framework.Common.CommonData.EnumData;assembly=MECF.Framework.Common"
     FontFamily="Segoe"
     mc:Ignorable="d">
     <UserControl.Resources>
@@ -35,21 +36,21 @@
                     Margin="5,0"
                     Content="Carrier/Wafer"
                     FontSize="18"
-                    IsChecked="{Binding DataItemType, Converter={StaticResource EnumToBoolConverter}, ConverterParameter={x:Static local:DataItemEnum.CarrierWafer}}" />
+                    IsChecked="{Binding DataItemType, Converter={StaticResource EnumToBoolConverter}, ConverterParameter={x:Static enumData:DataItemEnum.CarrierWafer}}" />
                 <RadioButton
                     Width="150"
                     Height="45"
                     Margin="5,0"
                     Content="Boat"
                     FontSize="18"
-                    IsChecked="{Binding DataItemType, Converter={StaticResource EnumToBoolConverter}, ConverterParameter={x:Static local:DataItemEnum.Boat}}" />
+                    IsChecked="{Binding DataItemType, Converter={StaticResource EnumToBoolConverter}, ConverterParameter={x:Static enumData:DataItemEnum.Boat}}" />
                 <RadioButton
                     Width="150"
                     Height="45"
                     Margin="5,0"
                     Content="Conditioning"
                     FontSize="18"
-                    IsChecked="{Binding DataItemType, Converter={StaticResource EnumToBoolConverter}, ConverterParameter={x:Static local:DataItemEnum.Conditioning}}" />
+                    IsChecked="{Binding DataItemType, Converter={StaticResource EnumToBoolConverter}, ConverterParameter={x:Static enumData:DataItemEnum.Conditioning}}" />
                 <RadioButton
                     x:Name="Reactor"
                     Width="150"
@@ -57,7 +58,7 @@
                     Margin="5,0"
                     Content="Reactor"
                     FontSize="18"
-                    IsChecked="{Binding DataItemType, Converter={StaticResource EnumToBoolConverter}, ConverterParameter={x:Static local:DataItemEnum.Reactor}}" />
+                    IsChecked="{Binding DataItemType, Converter={StaticResource EnumToBoolConverter}, ConverterParameter={x:Static enumData:DataItemEnum.Reactor}}" />
             </StackPanel>
             <StackPanel Grid.Row="1" Orientation="Horizontal">
                 <StackPanel Orientation="Horizontal" Visibility="{Binding ElementName=Carrier, Path=IsChecked, Converter={StaticResource bool2VisibilityConverter}}">
@@ -67,14 +68,14 @@
                         Margin="5,0"
                         Content="Side Dummy"
                         FontSize="18"
-                        IsChecked="{Binding DummyType, Converter={StaticResource EnumToBoolConverter}, ConverterParameter={x:Static local:DummyEnum.SideDummy}}" />
+                        IsChecked="{Binding DummyType, Converter={StaticResource EnumToBoolConverter}, ConverterParameter={x:Static enumData:DummyEnum.SideDummy}}" />
                     <RadioButton
                         Width="150"
                         Height="45"
                         Margin="5,0"
                         Content="Fill Dummy"
                         FontSize="18"
-                        IsChecked="{Binding DummyType, Converter={StaticResource EnumToBoolConverter}, ConverterParameter={x:Static local:DummyEnum.FillDummy}}" />
+                        IsChecked="{Binding DummyType, Converter={StaticResource EnumToBoolConverter}, ConverterParameter={x:Static enumData:DummyEnum.FillDummy}}" />
                 </StackPanel>
                 <StackPanel Orientation="Horizontal" Visibility="{Binding ElementName=Reactor, Path=IsChecked, Converter={StaticResource bool2VisibilityConverter}}">
                     <RadioButton
@@ -83,28 +84,28 @@
                         Margin="5,0"
                         Content="Recipe"
                         FontSize="18"
-                        IsChecked="{Binding ReactorsType, Converter={StaticResource EnumToBoolConverter}, ConverterParameter={x:Static local:ReactorsEnum.Recipe}}" />
+                        IsChecked="{Binding ReactorsType, Converter={StaticResource EnumToBoolConverter}, ConverterParameter={x:Static enumData:ReactorsEnum.Recipe}}" />
                     <RadioButton
                         Width="150"
                         Height="45"
                         Margin="5,0"
                         Content="StepRunFreq"
                         FontSize="18"
-                        IsChecked="{Binding ReactorsType, Converter={StaticResource EnumToBoolConverter}, ConverterParameter={x:Static local:ReactorsEnum.StepRunFreq}}" />
+                        IsChecked="{Binding ReactorsType, Converter={StaticResource EnumToBoolConverter}, ConverterParameter={x:Static enumData:ReactorsEnum.StepRunFreq}}" />
                     <RadioButton
                         Width="150"
                         Height="45"
                         Margin="5,0"
                         Content="StepRunTime"
                         FontSize="18"
-                        IsChecked="{Binding ReactorsType, Converter={StaticResource EnumToBoolConverter}, ConverterParameter={x:Static local:ReactorsEnum.StepRunTime}}" />
+                        IsChecked="{Binding ReactorsType, Converter={StaticResource EnumToBoolConverter}, ConverterParameter={x:Static enumData:ReactorsEnum.StepRunTime}}" />
                     <RadioButton
                         Width="150"
                         Height="45"
                         Margin="5,0"
                         Content="StepThickness"
                         FontSize="18"
-                        IsChecked="{Binding ReactorsType, Converter={StaticResource EnumToBoolConverter}, ConverterParameter={x:Static local:ReactorsEnum.StepThickness}}" />
+                        IsChecked="{Binding ReactorsType, Converter={StaticResource EnumToBoolConverter}, ConverterParameter={x:Static enumData:ReactorsEnum.StepThickness}}" />
                 </StackPanel>
             </StackPanel>
         </Grid>

+ 1 - 21
Furnace/FurnaceUI/Views/Scheduled/ScheduledMaitViewModel.cs

@@ -3,6 +3,7 @@ using Caliburn.Micro.Core;
 using FurnaceUI.Models;
 using FurnaceUI.Views.Scheduled;
 using MECF.Framework.Common.CommonData;
+using MECF.Framework.Common.CommonData.EnumData;
 using MECF.Framework.Common.DataCenter;
 using MECF.Framework.Common.OperationCenter;
 using System;
@@ -397,29 +398,8 @@ namespace FurnaceUI.Views.Editors
     }
 
 
-    public enum DummyEnum : byte
-    {
-        None = 0,
-        SideDummy = 1,
-        FillDummy = 2
-    }
 
-    public enum ReactorsEnum : byte
-    {
-        None = 0,
-        Recipe = 1,
-        StepRunFreq = 2,
-        StepRunTime = 3,
-        StepThickness = 4
-    }
 
-    public enum DataItemEnum
-    {
-        CarrierWafer,
-        Boat,
-        Conditioning,
-        Reactor
-    }
 
     public class ScheduleMaintenanceDataItem : NotifiableItem
     {