| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280 | using Aitex.Core.Common;using Aitex.Core.RT.Event;using Aitex.Core.UI.Control;using Aitex.Core.Util;using MECF.Framework.Common.Equipment;using MECF.Framework.Common.Jobs;using MECF.Framework.Common.SubstrateTrackings;using PunkHPX8_RT.Dispatch;using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Controls;namespace PunkHPX8_RT.Modules{    public interface ISchedulerFACallback    {        void JobCreated(ControlJobInfo cj);        void JobCreateFailed(string module, string lotID, string jobID,string reason);        void JobStarted(ControlJobInfo cj);        void JobStopped(ControlJobInfo cj);        void JobPaused(ControlJobInfo cj);        void JobResumed(ControlJobInfo cj);        void JobFinished(ControlJobInfo cj);        void JobWaferStart(ControlJobInfo cj, string sequenceId, int slotID);        void JobWaferEnd(ControlJobInfo cj, string sequenceId,int slotID);        void SrdRecipeStart(ControlJobInfo cj, string sequenceId, string recipeId, string module, int slotID);        void SrdRecipeEnd(ControlJobInfo cj, string sequenceId, string recipeId, string module, int slotID);        void SrdRecipeFailed(ControlJobInfo cj, string sequenceId, string recipeId, string module, int slotID);    }    public class SchedulerFACallback : ISchedulerFACallback    {        private const string EventPortJobStarted = "PortJobStarted";        private const string EventPortJobStopped = "PortJobStopped";        private const string EventPortJobPaused = "PortJobPaused";        private const string EventPortJobResumed = "PortJobResumed";        private const string EventPortJobFinished = "PortJobFinished";        private const string EventPortJobFailed = "PortJobFailed";        private const string EventPortSequenceSelected = "PortPPSelected";        private const string EventPortSequenceSelectFailed = "PortPPSelectFailed";        private const string EventPortJobWaferStart = "PortJobWaferStart";        private const string EventPortJobWaferEnd = "PortJobWaferEnd";        private const string EventWaferShuttleJobStart = "WaferShuttleJobStart";        private const string EventWaferShuttleJobEnd = "WaferShuttleJobEnd";        private const string EventWaferShuttleRecipeStart = "WaferShuttleRecipeStart";        private const string EventWaferShuttleRecipeEnd = "WaferShuttleRecipeEnd";        private const string EventWaferShuttleRecipeFailed = "WaferShuttleRecipeFailed";        private const string EventSRDRecipeStart = "SRDRecipeStart";        private const string EventSRDRecipeEnd = "SRDRecipeEnd";        private const string EventSRDRecipeFailed = "SRDRecipeFailed";        public SchedulerFACallback()        {            EV.Subscribe(new EventItem("Event", EventPortJobStarted, EventPortJobStarted));            EV.Subscribe(new EventItem("Event", EventPortJobStopped, EventPortJobStopped));            EV.Subscribe(new EventItem("Event", EventPortJobPaused, EventPortJobPaused));            EV.Subscribe(new EventItem("Event", EventPortJobResumed, EventPortJobResumed));            EV.Subscribe(new EventItem("Event", EventPortJobFinished, EventPortJobFinished));            EV.Subscribe(new EventItem("Event", EventPortJobFailed, EventPortJobFailed));            EV.Subscribe(new EventItem("Event", EventPortSequenceSelected, EventPortSequenceSelected));            EV.Subscribe(new EventItem("Event", EventPortSequenceSelectFailed, EventPortSequenceSelectFailed));            EV.Subscribe(new EventItem("Event", EventPortJobWaferStart, EventPortJobWaferStart));            EV.Subscribe(new EventItem("Event", EventPortJobWaferEnd, EventPortJobWaferEnd));            EV.Subscribe(new EventItem("Event", EventWaferShuttleJobStart, EventWaferShuttleJobStart));            EV.Subscribe(new EventItem("Event", EventWaferShuttleJobEnd, EventWaferShuttleJobEnd));            EV.Subscribe(new EventItem("Event", EventWaferShuttleRecipeStart, EventWaferShuttleRecipeStart));            EV.Subscribe(new EventItem("Event", EventWaferShuttleRecipeEnd, EventWaferShuttleRecipeEnd));            EV.Subscribe(new EventItem("Event", EventWaferShuttleRecipeFailed, EventWaferShuttleRecipeFailed));            EV.Subscribe(new EventItem("Event", EventSRDRecipeStart, EventSRDRecipeStart));            EV.Subscribe(new EventItem("Event", EventSRDRecipeEnd, EventSRDRecipeEnd));            EV.Subscribe(new EventItem("Event", EventSRDRecipeFailed, EventSRDRecipeFailed));        }        public void JobCreated(ControlJobInfo cj)        {            ModuleName module = ModuleHelper.Converter(cj.Module);            EV.Notify(EventPortSequenceSelected, new SerializableDictionary<string, string>()            {                {DVIDName.LotID,  cj.LotName},                {DVIDName.JobID,  cj.Name},                {DVIDName.PortID, ((int)module-ModuleName.LP1+1).ToString() }            });        }        public void JobCreateFailed(string module, string lotID, string jobID,string reason)        {            ModuleName moduleName = ModuleHelper.Converter(module);            EV.Notify(EventPortSequenceSelectFailed, new SerializableDictionary<string, string>()            {                {DVIDName.LotID,  lotID},                {DVIDName.JobID,  jobID},                {DVIDName.PortID, ((int)moduleName-ModuleName.LP1+1).ToString() },                {DVIDName.Reason,reason}            });        }        public void JobStarted(ControlJobInfo cj)        {            if (FaJobManager.Instance.Contains(cj.Name))            {                ModuleName module = ModuleHelper.Converter(cj.Module);                EV.Notify(EventPortJobStarted, new SerializableDictionary<string, string>()                {                    {DVIDName.LotID,  cj.LotName},                    {DVIDName.JobID,  cj.Name},                    {DVIDName.PortID, ((int)module-ModuleName.LP1+1).ToString() }                });            }        }        public void JobStopped(ControlJobInfo cj)        {            if (FaJobManager.Instance.Contains(cj.Name))            {                ModuleName module = ModuleHelper.Converter(cj.Module);                EV.Notify(EventPortJobStopped, new SerializableDictionary<string, string>()                {                    {DVIDName.LotID,  cj.LotName},                    {DVIDName.JobID,  cj.Name},                    {DVIDName.PortID, ((int)module-ModuleName.LP1+1).ToString() }                });            }        }        public void JobPaused(ControlJobInfo cj)        {            if (FaJobManager.Instance.Contains(cj.Name))            {                ModuleName module = ModuleHelper.Converter(cj.Module);                EV.Notify(EventPortJobPaused, new SerializableDictionary<string, string>()                {                    {DVIDName.LotID,  cj.LotName},                    {DVIDName.JobID,  cj.Name},                    {DVIDName.PortID, ((int)module-ModuleName.LP1+1).ToString() }                });            }        }        public void JobResumed(ControlJobInfo cj)        {            if (FaJobManager.Instance.Contains(cj.Name))            {                ModuleName module = ModuleHelper.Converter(cj.Module);                EV.Notify(EventPortJobResumed, new SerializableDictionary<string, string>()                {                    {DVIDName.LotID,  cj.LotName},                    {DVIDName.JobID,  cj.Name},                    {DVIDName.PortID, ((int)module-ModuleName.LP1+1).ToString() }                });            }        }        public void JobFinished(ControlJobInfo cj)        {            if (FaJobManager.Instance.Contains(cj.Name))            {                ModuleName module = ModuleHelper.Converter(cj.Module);                int count = cj.LotWafers.Count;                EV.Notify(EventPortJobFinished, new SerializableDictionary<string, string>()                {                    {DVIDName.LotID,  cj.LotName},                    {DVIDName.JobID,  cj.Name},                    {DVIDName.PortID, ((int)module-ModuleName.LP1+1).ToString() },                    {DVIDName.ProcessedWaferCount, count.ToString() },                });            }        }        public void JobWaferStart(ControlJobInfo cj,string sequenceId, int slotID)        {            if (FaJobManager.Instance.Contains(cj.Name))            {                ModuleName moduleName = ModuleHelper.Converter(cj.Module);                EV.Notify(EventPortJobWaferStart, new SerializableDictionary<string, string>()                {                    {DVIDName.LotID,  cj.LotName},                    {DVIDName.JobID,  cj.Name},                    {DVIDName.PortID, ((int)moduleName-ModuleName.LP1+1).ToString()  },                    {DVIDName.SlotID, (slotID+1).ToString() },                    {DVIDName.SequenceID, sequenceId},                    {DVIDName.CarrierID, cj.CarrierID?.ToString()}                });            }        }        public void JobWaferEnd(ControlJobInfo cj,string sequenceId, int slotID)        {            if (FaJobManager.Instance.Contains(cj.Name))            {                ModuleName moduleName = ModuleHelper.Converter(cj.Module);                WaferInfo wafer = WaferManager.Instance.GetWafer(moduleName, slotID);                EV.Notify(EventPortJobWaferEnd, new SerializableDictionary<string, string>()                {                    {DVIDName.LotID,  cj.LotName},                    {DVIDName.JobID,  cj.Name},                    {DVIDName.PortID, ((int)moduleName-ModuleName.LP1+1).ToString() },                    {DVIDName.SlotID, (slotID+1).ToString() },                    {DVIDName.CarrierID, cj.CarrierID?.ToString()},                    {DVIDName.SequenceID, sequenceId},                    {DVIDName.WaferProcessResult, (wafer.ProcessState == EnumWaferProcessStatus.Failed ? 0:1).ToString()}                });            }        }        /// <summary>        /// SRD Recipe启动        /// </summary>        /// <param name="cj"></param>        /// <param name="sequenceId"></param>        /// <param name="waferInfo"></param>        /// <param name="recipeId"></param>        public void SrdRecipeStart(ControlJobInfo cj,string sequenceId,string recipeId,string module, int slotID)        {            if (FaJobManager.Instance.Contains(cj.Name))            {                EV.Notify(EventSRDRecipeStart, new SerializableDictionary<string, string>()                {                    {DVIDName.LotID,  cj.LotName},                    {DVIDName.JobID,  cj.Name},                    {DVIDName.StationName,module},                    {DVIDName.SlotID,slotID.ToString()},                    {DVIDName.SequenceID, sequenceId},                    {DVIDName.RecipeID, recipeId},                    {DVIDName.CarrierID, cj.CarrierID?.ToString()}                });            }        }        /// <summary>        /// SRD Recipe结束        /// </summary>        /// <param name="cj"></param>        /// <param name="sequenceId"></param>        /// <param name="waferInfo"></param>        /// <param name="recipeId"></param>        public void SrdRecipeEnd(ControlJobInfo cj, string sequenceId, string recipeId, string module, int slotID)        {            if (FaJobManager.Instance.Contains(cj.Name))            {                EV.Notify(EventSRDRecipeEnd, new SerializableDictionary<string, string>()                {                    {DVIDName.LotID,  cj.LotName},                    {DVIDName.JobID,  cj.Name},                    {DVIDName.StationName,module},                    {DVIDName.SlotID,slotID.ToString()},                    {DVIDName.SequenceID, sequenceId},                    {DVIDName.RecipeID, recipeId},                    {DVIDName.CarrierID, cj.CarrierID?.ToString()}                });            }        }        /// <summary>        /// SRD Recipe启动        /// </summary>        /// <param name="cj"></param>        /// <param name="sequenceId"></param>        /// <param name="waferInfo"></param>        /// <param name="recipeId"></param>        public void SrdRecipeFailed(ControlJobInfo cj, string sequenceId, string recipeId, string module, int slotID)        {            if (FaJobManager.Instance.Contains(cj.Name))            {                EV.Notify(EventSRDRecipeFailed, new SerializableDictionary<string, string>()                {                    {DVIDName.LotID,  cj.LotName},                    {DVIDName.JobID,  cj.Name},                    {DVIDName.StationName,module},                    {DVIDName.SlotID,slotID.ToString()},                    {DVIDName.SequenceID, sequenceId},                    {DVIDName.RecipeID, recipeId},                    {DVIDName.CarrierID, cj.CarrierID?.ToString()}                });            }        }    }}
 |