using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Runtime.Serialization;
using System.Text;
using DocumentFormat.OpenXml.Drawing;
using MECF.Framework.Common.CommonData;
using MECF.Framework.Common.Jobs;
namespace Aitex.Core.Common
{
public enum WaferSize
{
WS0, //undefine, initialize status
WS3,
WS4,
WS6,
WS8,
WS12,
WS2,
WS5,
}
public enum WaferStatus
{
Empty = 0,
Normal = 1,
Crossed = 2,
Double = 3,
Unknown = 4,
Dummy = 5
}
public enum EnumE90Status
{
None = -1,
NeedProcessing = 0,
InProcess,
Processed,
Aborted,
Stopped,
Rejected,
Lost,
Skipped,
}
//public enum EnumWaferProcessStatus
//{
// NeedProcessing=0,
// Processed,
// Aborted,
// Stopped,
// Rejected,
// Lost,
// Skipped,
//}
public enum SubstrateTransportStatus
{
AtSource =0,
AtWork,
AtDestination,
None,
}
public enum EnumWaferProcessStatus
{
Idle = 0,
InProcess,
Completed,
Failed,
Warnning,
Wait,
Abort,
}
public enum ProcessStatus
{
Idle = 0,
Wait = 1,
Busy = 2,
Completed = 3,
Failed = 4,
Abort = 5,
}
public enum SubstAccessType
{
Create=0,
UpdateWaferID,
Arrive,
Left,
UpdateLM1,
UpdateLM2,
Delete,
Alignment,
}
public enum ScanResult
{
Init,//初始状态
Fit,//一致
TypeClash,//冲突
ActualExist,//软件无检测结果有
ActualNotExist,//软件有检测结果无
}
public enum WaferType
{
None,
P,//Production wafer Processed so that a thin film forms on the surface, and becomes product.
M,//Monitor wafer Used for film thickness and particle inspection
M1,//Monitor wafer Used for film thickness and particle inspection
M2,//Monitor wafer Used for film thickness and particle inspection
SD,//Side dummy wafer Used to rectify process gases for more uniform wafer processing production.
ED,//Extra dummy wafer Used as a supplement when there is a shortage of production wafers.
XD,//Expert dummy wafer Dummy wafer used in expert mode to fill empty slots during test wafer processing.
T,//Test wafer Used in expert mode for process verification, performance verification, and pilot processes
}
[Serializable]
[DataContract]
public class SubstHistory
{
[DataMember]
public string locationID { get; set; }
[DataMember]
public int SlotNO { get; set; }
[DataMember]
public DateTime AccessTime { get; set; }
[DataMember]
public SubstAccessType AccessType { get; set; }
[DataMember]
public DateTime AccessTimeIn { get; set; }
[DataMember]
public DateTime AccessTimeOut { get; set; }
public SubstHistory(string loc,int slot,DateTime dt, SubstAccessType type)
{
locationID = loc;
SlotNO = slot;
AccessTime = dt;
AccessTimeIn = dt;
AccessTime = dt;
AccessType = type;
}
}
[Serializable]
[DataContract]
public class WaferInfo : NotifiableItem
{
private string procesjobid;
[DataMember]
public string ProcessJobID
{
get
{
return procesjobid;
}
set
{
procesjobid = value;
InvokePropertyChanged("ProcessJobID");
}
}
private string controljobid;
[DataMember]
public string ControlJobID
{
get
{
return controljobid;
}
set
{
controljobid = value;
InvokePropertyChanged("ControlJobID");
}
}
private SubstrateTransportStatus substtransstatus;
[DataMember]
public SubstrateTransportStatus SubstTransStatus
{
get
{
return substtransstatus;
}
set
{
substtransstatus = value;
InvokePropertyChanged("SubstTransStatus");
}
}
private EnumE90Status Subste90status;
[DataMember]
public EnumE90Status SubstE90Status
{
get
{
return Subste90status;
}
set
{
Subste90status = value;
InvokePropertyChanged("SubstE90Status");
}
}
private SubstHistory[] substhists;
[DataMember]
public SubstHistory[] SubstHists
{
get
{
return substhists;
}
set
{
substhists = value;
InvokePropertyChanged("SubstHists");
}
}
public bool IsEmpty
{
get { return Status == WaferStatus.Empty; }
}
private string waferID;
[DataMember]
public string WaferID
{
get
{
return waferID;
}
set
{
waferID = value;
InvokePropertyChanged("WaferID");
}
}
private string _waferOrigin;
[DataMember]
public string WaferOrigin
{
get
{
return _waferOrigin;
}
set
{
_waferOrigin = value;
InvokePropertyChanged("WaferOrigin");
}
}
private string hostlaserMark1;
[DataMember]
public string HostLaserMark1
{
get
{
return hostlaserMark1;
}
set
{
hostlaserMark1 = value;
InvokePropertyChanged("HostLaserMark1");
}
}
private string hostlaserMark2;
[DataMember]
public string HostLaserMark2
{
get
{
return hostlaserMark2;
}
set
{
hostlaserMark2 = value;
InvokePropertyChanged("HostLaserMark2");
}
}
private string laserMarker;
[DataMember]
public string LaserMarker
{
get
{
return laserMarker;
}
set
{
laserMarker = value;
InvokePropertyChanged("LaserMarker");
}
}
private string t7Code;
[DataMember]
public string T7Code
{
get
{
return t7Code;
}
set
{
t7Code = value;
InvokePropertyChanged("T7Code");
}
}
private string _laserMarkerScore;
[DataMember]
public string LaserMarkerScore
{
get
{
return _laserMarkerScore;
}
set
{
_laserMarkerScore = value;
InvokePropertyChanged("LaserMarker1Score");
}
}
private string _t7CodeScore;
[DataMember]
public string T7CodeScore
{
get
{
return _t7CodeScore;
}
set
{
_t7CodeScore = value;
InvokePropertyChanged("T7CodeScore");
}
}
private string _imageFileName;
[DataMember]
public string ImageFileName
{
get
{
return _imageFileName;
}
set
{
_imageFileName = value;
InvokePropertyChanged("ImageFileName");
}
}
private string _imageFilePath;
[DataMember]
public string ImageFilePath
{
get
{
return _imageFilePath;
}
set
{
_imageFilePath = value;
InvokePropertyChanged("ImageFilePath");
}
}
[DataMember]
public string LotId { get; set; }
[DataMember]
public string TransFlag { get; set; }
private WaferStatus status;
[DataMember]
public WaferStatus Status
{
get
{
return status;
}
set
{
status = value;
InvokePropertyChanged("Status");
}
}
[DataMember]
public string CurrentCarrierID
{
get;
set;
}
[DataMember]
public int Station
{
get;
set;
}
[DataMember]
public int Slot
{
get;
set;
}
[DataMember]
public int OriginStation
{
get;
set;
}
[DataMember]
public int OriginSlot
{
get;
set;
}
[DataMember]
public string OriginCarrierID
{
get;
set;
}
[DataMember]
public int DestinationStation
{
get;
set;
}
[DataMember]
public string DestinationCarrierID
{
get;
set;
}
[DataMember]
public int DestinationSlot
{
get;
set;
}
[DataMember]
public int NextStation
{
get;
set;
}
[DataMember]
public int NextStationSlot
{
get;
set;
}
[DataMember]
public int Notch
{
get;
set;
}
[DataMember]
public float UseCount
{
get;
set;
}
[DataMember]
public float UseTime
{
get;
set;
}
[DataMember]
public float UseThick
{
get;
set;
}
[DataMember]
public float Thick
{
get;
set;
}
[DataMember]
public WaferSize Size
{
get;
set;
}
private bool isChecked;
public bool IsChecked
{
get
{ return isChecked; }
set
{
isChecked = value;
InvokePropertyChanged("IsChecked");
}
}
[DataMember]
public string PPID //Recipe or Sequence
{
get;
set;
}
private EnumWaferProcessStatus processState;
[DataMember]
public EnumWaferProcessStatus ProcessState
{
get
{
return processState;
}
set
{
processState = value;
InvokePropertyChanged("ProcessStatus");
}
}
private bool isSource;
[DataMember]
public bool IsSource
{
get
{
return isSource;
}
set
{
isSource = value;
InvokePropertyChanged("IsSource");
}
}
private bool isDestination;
[DataMember]
public bool IsDestination
{
get
{
return isDestination;
}
set
{
isDestination = value;
InvokePropertyChanged("IsDestination");
}
}
[DataMember]
public Guid InnerId { get; set; }
[DataMember]
public ProcessJobInfo ProcessJob { get; set; }
[DataMember]
public int NextSequenceStep { get; set; }
[DataMember]
public bool HasWarning { get; set; }
[DataMember]
public bool HasError { get; set; }
[DataMember]
public WaferType WaferType { get; set; }
public WaferInfo()
{
InnerId = Guid.Empty;
}
public WaferInfo(string waferID, WaferStatus status = WaferStatus.Empty) : this()
{
this.WaferID = waferID;
this.Status = status;
}
public void Update(WaferInfo source)
{
InnerId = source.InnerId;
WaferID = source.waferID;
WaferOrigin = source.WaferOrigin;
LaserMarker = source.LaserMarker;
LaserMarkerScore = source.LaserMarkerScore;
T7Code = source.T7Code;
T7CodeScore = source.T7CodeScore;
Status = source.Status;
ProcessState = source.ProcessState;
IsSource = source.IsSource;
IsDestination = source.IsDestination;
Station = source.Station;
Slot = source.Slot;
OriginStation = source.OriginStation;
OriginSlot = source.OriginSlot;
if(source.OriginCarrierID!=null) OriginCarrierID = source.OriginCarrierID;
if (source.DestinationCarrierID != null) DestinationCarrierID = source.DestinationCarrierID;
DestinationStation = source.DestinationStation;
DestinationSlot = source.DestinationSlot;
NextStation = source.NextStation;
NextStationSlot = source.NextStationSlot;
Notch = source.Notch;
Size = source.Size;
TransFlag = source.TransFlag;
LotId = source.LotId;
ProcessJob = source.ProcessJob;
NextSequenceStep = source.NextSequenceStep;
SubstHists = source.SubstHists;
HasWarning = source.HasWarning;
HasError = source.HasError;
SubstE90Status = source.SubstE90Status;
PPID = source.PPID;
HostLaserMark1 = source.HostLaserMark1;
HostLaserMark2 = source.HostLaserMark2;
WaferType = source.WaferType;
UseCount = source.UseCount;
UseTime = source.UseTime;
UseThick = source.UseThick;
}
public WaferInfo Clone()
{
WaferInfo source = this;
return new WaferInfo()
{
InnerId = source.InnerId,
WaferID = source.waferID,
WaferOrigin = source.WaferOrigin,
LaserMarker = source.LaserMarker,
LaserMarkerScore = source.LaserMarkerScore,
T7Code = source.T7Code,
T7CodeScore = source.T7CodeScore,
Status = source.Status,
ProcessState = source.ProcessState,
IsSource = source.IsSource,
IsDestination = source.IsDestination,
Station = source.Station,
Slot = source.Slot,
OriginStation = source.OriginStation,
OriginSlot = source.OriginSlot,
OriginCarrierID = source.OriginCarrierID,
DestinationCarrierID = source.DestinationCarrierID,
DestinationStation = source.DestinationStation,
DestinationSlot = source.DestinationSlot,
NextStation = source.NextStation,
NextStationSlot = source.NextStationSlot,
Notch = source.Notch,
Size = source.Size,
TransFlag = source.TransFlag,
LotId = source.LotId,
ProcessJob = source.ProcessJob,
NextSequenceStep = source.NextSequenceStep,
SubstHists = source.SubstHists,
HasWarning = source.HasWarning,
HasError = source.HasError,
SubstE90Status = source.SubstE90Status,
PPID = source.PPID,
UseCount = source.UseCount,
UseTime = source.UseTime,
UseThick = source.UseThick,
};
}
public void SetEmpty()
{
this.InnerId = Guid.Empty;
this.WaferID = string.Empty;
this.WaferOrigin = string.Empty;
this.LaserMarker = string.Empty;
this.LaserMarkerScore = string.Empty;
this.T7Code = string.Empty;
this.T7CodeScore = string.Empty;
this.Status = (int)WaferStatus.Empty;
this.ProcessState = EnumWaferProcessStatus.Idle;
this.IsSource = false;
this.IsDestination = false;
this.Station = 0;
this.Slot = 0;
this.OriginStation = 0;
this.OriginSlot = 0;
//this.SourceStation = 0;
//this.SourceSlot = 0;
this.DestinationStation = 0;
this.DestinationSlot = 0;
this.Notch = 0;
//保留最后一次的Wafer Size信息,便于后续判断和优化
//this.Size = WaferSize.WS0;
this.TransFlag = string.Empty;
this.LotId = string.Empty;
this.ProcessJob = null;
this.NextSequenceStep = 0;
this.HasWarning = false;
this.HasError = false;
this.PPID = "";
this.UseCount = 0;
this.UseTime = 0;
this.UseThick = 0;
}
}
public class WaferTypeInfo
{
///
/// WaferType名称
///
public string Name { get; set; }
public string FullName { get; set; }
///
/// 是否进行膜厚
///
public bool AccFilmThick { get; set; }
///
/// 备用waferType
/// 在Auto流程中配置了此项的waferType可以缺少,如果缺少使用此项配置的类型填充
///
public string AlternativeWaferType { get; set; }
///
/// 是否是ReturnWafer类型
///
public bool IsReturnWafer { get; set; }
///
/// ReturnWafer类型
/// IsReturnWafer=true,ReturnWaferType不能是可用waferType
/// 即此Type作为ReturnWafer,不允许有其他ReturnWafer
/// IsReturnWafer=false,可以不设定此参数,如果设定就必须是IsReturnWafer=true的waferType
///
public string ReturnWaferType { get; set; }
///
/// 主要用在UI界面上,不同的type显示的颜色
///
public string ShowColor { get; set; }
///
/// 是否可多次使用
///
public bool CanProcessContinuously { get; set; }
///
/// 是否是Dummy类型
///
public bool IsDummy { get; set; }
}
}