WaferInfo.cs 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Linq;
  5. using System.Runtime.Serialization;
  6. using System.Text;
  7. using DocumentFormat.OpenXml.Drawing;
  8. using MECF.Framework.Common.CommonData;
  9. using MECF.Framework.Common.Jobs;
  10. namespace Aitex.Core.Common
  11. {
  12. public enum WaferSize
  13. {
  14. WS0, //undefine, initialize status
  15. WS3,
  16. WS4,
  17. WS6,
  18. WS8,
  19. WS12,
  20. WS2,
  21. WS5,
  22. }
  23. public enum WaferStatus
  24. {
  25. Empty = 0,
  26. Normal = 1,
  27. Crossed = 2,
  28. Double = 3,
  29. Unknown = 4,
  30. Dummy = 5
  31. }
  32. public enum EnumE90Status
  33. {
  34. None = -1,
  35. NeedProcessing = 0,
  36. InProcess,
  37. Processed,
  38. Aborted,
  39. Stopped,
  40. Rejected,
  41. Lost,
  42. Skipped,
  43. }
  44. //public enum EnumWaferProcessStatus
  45. //{
  46. // NeedProcessing=0,
  47. // Processed,
  48. // Aborted,
  49. // Stopped,
  50. // Rejected,
  51. // Lost,
  52. // Skipped,
  53. //}
  54. public enum SubstrateTransportStatus
  55. {
  56. AtSource = 0,
  57. AtWork,
  58. AtDestination,
  59. None,
  60. }
  61. public enum EnumWaferProcessStatus
  62. {
  63. Idle = 0,
  64. InProcess,
  65. Completed,
  66. Failed,
  67. Warnning,
  68. Wait,
  69. Abort,
  70. }
  71. public enum ProcessStatus
  72. {
  73. Idle = 0,
  74. Wait = 1,
  75. Busy = 2,
  76. Completed = 3,
  77. Failed = 4,
  78. Abort = 5,
  79. }
  80. public enum SubstAccessType
  81. {
  82. Create = 0,
  83. UpdateWaferID,
  84. Arrive,
  85. Left,
  86. UpdateLM1,
  87. UpdateLM2,
  88. Delete,
  89. Alignment,
  90. }
  91. public enum ScanResult
  92. {
  93. Init,//初始状态
  94. Fit,//一致
  95. TypeClash,//冲突
  96. ActualExist,//软件无检测结果有
  97. ActualNotExist,//软件有检测结果无
  98. }
  99. public enum WaferType
  100. {
  101. None,
  102. [Description("pd")]
  103. P,//Production wafer Processed so that a thin film forms on the surface, and becomes product.
  104. M,//Monitor wafer Used for film thickness and particle inspection
  105. M1,//Monitor wafer Used for film thickness and particle inspection
  106. M2,//Monitor wafer Used for film thickness and particle inspection
  107. SD,//Side dummy wafer Used to rectify process gases for more uniform wafer processing production.
  108. [Description("fd")]
  109. ED,//Extra dummy wafer Used as a supplement when there is a shortage of production wafers.
  110. XD,//Expert dummy wafer Dummy wafer used in expert mode to fill empty slots during test wafer processing.
  111. T,//Test wafer Used in expert mode for process verification, performance verification, and pilot processes
  112. }
  113. [Serializable]
  114. [DataContract]
  115. public class SubstHistory
  116. {
  117. [DataMember]
  118. public string locationID { get; set; }
  119. [DataMember]
  120. public int SlotNO { get; set; }
  121. [DataMember]
  122. public DateTime AccessTime { get; set; }
  123. [DataMember]
  124. public SubstAccessType AccessType { get; set; }
  125. [DataMember]
  126. public DateTime AccessTimeIn { get; set; }
  127. [DataMember]
  128. public DateTime AccessTimeOut { get; set; }
  129. public SubstHistory(string loc, int slot, DateTime dt, SubstAccessType type)
  130. {
  131. locationID = loc;
  132. SlotNO = slot;
  133. AccessTime = dt;
  134. AccessTimeIn = dt;
  135. AccessTime = dt;
  136. AccessType = type;
  137. }
  138. }
  139. [Serializable]
  140. [DataContract]
  141. public class WaferInfo : NotifiableItem
  142. {
  143. private string procesjobid;
  144. [DataMember]
  145. public string ProcessJobID
  146. {
  147. get
  148. {
  149. return procesjobid;
  150. }
  151. set
  152. {
  153. procesjobid = value;
  154. InvokePropertyChanged("ProcessJobID");
  155. }
  156. }
  157. private string controljobid;
  158. [DataMember]
  159. public string ControlJobID
  160. {
  161. get
  162. {
  163. return controljobid;
  164. }
  165. set
  166. {
  167. controljobid = value;
  168. InvokePropertyChanged("ControlJobID");
  169. }
  170. }
  171. private SubstrateTransportStatus substtransstatus;
  172. [DataMember]
  173. public SubstrateTransportStatus SubstTransStatus
  174. {
  175. get
  176. {
  177. return substtransstatus;
  178. }
  179. set
  180. {
  181. substtransstatus = value;
  182. InvokePropertyChanged("SubstTransStatus");
  183. }
  184. }
  185. private EnumE90Status Subste90status;
  186. [DataMember]
  187. public EnumE90Status SubstE90Status
  188. {
  189. get
  190. {
  191. return Subste90status;
  192. }
  193. set
  194. {
  195. Subste90status = value;
  196. InvokePropertyChanged("SubstE90Status");
  197. }
  198. }
  199. private SubstHistory[] substhists;
  200. [DataMember]
  201. public SubstHistory[] SubstHists
  202. {
  203. get
  204. {
  205. return substhists;
  206. }
  207. set
  208. {
  209. substhists = value;
  210. InvokePropertyChanged("SubstHists");
  211. }
  212. }
  213. public bool IsEmpty
  214. {
  215. get { return Status == WaferStatus.Empty; }
  216. }
  217. private string waferID;
  218. [DataMember]
  219. public string WaferID
  220. {
  221. get
  222. {
  223. return waferID;
  224. }
  225. set
  226. {
  227. waferID = value;
  228. InvokePropertyChanged("WaferID");
  229. }
  230. }
  231. private string _waferOrigin;
  232. [DataMember]
  233. public string WaferOrigin
  234. {
  235. get
  236. {
  237. return _waferOrigin;
  238. }
  239. set
  240. {
  241. _waferOrigin = value;
  242. InvokePropertyChanged("WaferOrigin");
  243. }
  244. }
  245. private string hostlaserMark1;
  246. [DataMember]
  247. public string HostLaserMark1
  248. {
  249. get
  250. {
  251. return hostlaserMark1;
  252. }
  253. set
  254. {
  255. hostlaserMark1 = value;
  256. InvokePropertyChanged("HostLaserMark1");
  257. }
  258. }
  259. private string hostlaserMark2;
  260. [DataMember]
  261. public string HostLaserMark2
  262. {
  263. get
  264. {
  265. return hostlaserMark2;
  266. }
  267. set
  268. {
  269. hostlaserMark2 = value;
  270. InvokePropertyChanged("HostLaserMark2");
  271. }
  272. }
  273. private string laserMarker;
  274. [DataMember]
  275. public string LaserMarker
  276. {
  277. get
  278. {
  279. return laserMarker;
  280. }
  281. set
  282. {
  283. laserMarker = value;
  284. InvokePropertyChanged("LaserMarker");
  285. }
  286. }
  287. private string t7Code;
  288. [DataMember]
  289. public string T7Code
  290. {
  291. get
  292. {
  293. return t7Code;
  294. }
  295. set
  296. {
  297. t7Code = value;
  298. InvokePropertyChanged("T7Code");
  299. }
  300. }
  301. private string _laserMarkerScore;
  302. [DataMember]
  303. public string LaserMarkerScore
  304. {
  305. get
  306. {
  307. return _laserMarkerScore;
  308. }
  309. set
  310. {
  311. _laserMarkerScore = value;
  312. InvokePropertyChanged("LaserMarker1Score");
  313. }
  314. }
  315. private string _t7CodeScore;
  316. [DataMember]
  317. public string T7CodeScore
  318. {
  319. get
  320. {
  321. return _t7CodeScore;
  322. }
  323. set
  324. {
  325. _t7CodeScore = value;
  326. InvokePropertyChanged("T7CodeScore");
  327. }
  328. }
  329. private string _imageFileName;
  330. [DataMember]
  331. public string ImageFileName
  332. {
  333. get
  334. {
  335. return _imageFileName;
  336. }
  337. set
  338. {
  339. _imageFileName = value;
  340. InvokePropertyChanged("ImageFileName");
  341. }
  342. }
  343. private string _imageFilePath;
  344. [DataMember]
  345. public string ImageFilePath
  346. {
  347. get
  348. {
  349. return _imageFilePath;
  350. }
  351. set
  352. {
  353. _imageFilePath = value;
  354. InvokePropertyChanged("ImageFilePath");
  355. }
  356. }
  357. [DataMember]
  358. public string LotId { get; set; }
  359. [DataMember]
  360. public string TransFlag { get; set; }
  361. private WaferStatus status;
  362. [DataMember]
  363. public WaferStatus Status
  364. {
  365. get
  366. {
  367. return status;
  368. }
  369. set
  370. {
  371. status = value;
  372. InvokePropertyChanged("Status");
  373. }
  374. }
  375. [DataMember]
  376. public string CurrentCarrierID
  377. {
  378. get;
  379. set;
  380. }
  381. [DataMember]
  382. public int Station
  383. {
  384. get;
  385. set;
  386. }
  387. [DataMember]
  388. public int Slot
  389. {
  390. get;
  391. set;
  392. }
  393. [DataMember]
  394. public int OriginStation
  395. {
  396. get;
  397. set;
  398. }
  399. [DataMember]
  400. public int OriginSlot
  401. {
  402. get;
  403. set;
  404. }
  405. [DataMember]
  406. public string OriginCarrierID
  407. {
  408. get;
  409. set;
  410. }
  411. [DataMember]
  412. public int DestinationStation
  413. {
  414. get;
  415. set;
  416. }
  417. [DataMember]
  418. public string DestinationCarrierID
  419. {
  420. get;
  421. set;
  422. }
  423. [DataMember]
  424. public int DestinationSlot
  425. {
  426. get;
  427. set;
  428. }
  429. [DataMember]
  430. public int NextStation
  431. {
  432. get;
  433. set;
  434. }
  435. [DataMember]
  436. public int NextStationSlot
  437. {
  438. get;
  439. set;
  440. }
  441. [DataMember]
  442. public int Notch
  443. {
  444. get;
  445. set;
  446. }
  447. [DataMember]
  448. public float UseCount
  449. {
  450. get;
  451. set;
  452. }
  453. [DataMember]
  454. public float UseTime
  455. {
  456. get;
  457. set;
  458. }
  459. [DataMember]
  460. public float UseThick
  461. {
  462. get;
  463. set;
  464. }
  465. [DataMember]
  466. public float Thick
  467. {
  468. get;
  469. set;
  470. }
  471. [DataMember]
  472. public WaferSize Size
  473. {
  474. get;
  475. set;
  476. }
  477. private bool isChecked;
  478. public bool IsChecked
  479. {
  480. get
  481. { return isChecked; }
  482. set
  483. {
  484. isChecked = value;
  485. InvokePropertyChanged("IsChecked");
  486. }
  487. }
  488. [DataMember]
  489. public string PPID //Recipe or Sequence
  490. {
  491. get;
  492. set;
  493. }
  494. private EnumWaferProcessStatus processState;
  495. [DataMember]
  496. public EnumWaferProcessStatus ProcessState
  497. {
  498. get
  499. {
  500. return processState;
  501. }
  502. set
  503. {
  504. processState = value;
  505. InvokePropertyChanged("ProcessStatus");
  506. }
  507. }
  508. private bool isSource;
  509. [DataMember]
  510. public bool IsSource
  511. {
  512. get
  513. {
  514. return isSource;
  515. }
  516. set
  517. {
  518. isSource = value;
  519. InvokePropertyChanged("IsSource");
  520. }
  521. }
  522. private bool isDestination;
  523. [DataMember]
  524. public bool IsDestination
  525. {
  526. get
  527. {
  528. return isDestination;
  529. }
  530. set
  531. {
  532. isDestination = value;
  533. InvokePropertyChanged("IsDestination");
  534. }
  535. }
  536. [DataMember]
  537. public Guid InnerId { get; set; }
  538. [DataMember]
  539. public ProcessJobInfo ProcessJob { get; set; }
  540. [DataMember]
  541. public int NextSequenceStep { get; set; }
  542. [DataMember]
  543. public bool HasWarning { get; set; }
  544. [DataMember]
  545. public bool HasError { get; set; }
  546. [DataMember]
  547. public WaferType WaferType { get; set; }
  548. public WaferInfo()
  549. {
  550. InnerId = Guid.Empty;
  551. }
  552. public WaferInfo(string waferID, WaferStatus status = WaferStatus.Empty) : this()
  553. {
  554. this.WaferID = waferID;
  555. this.Status = status;
  556. }
  557. public void Update(WaferInfo source)
  558. {
  559. InnerId = source.InnerId;
  560. WaferID = source.waferID;
  561. WaferOrigin = source.WaferOrigin;
  562. LaserMarker = source.LaserMarker;
  563. LaserMarkerScore = source.LaserMarkerScore;
  564. T7Code = source.T7Code;
  565. T7CodeScore = source.T7CodeScore;
  566. Status = source.Status;
  567. ProcessState = source.ProcessState;
  568. IsSource = source.IsSource;
  569. IsDestination = source.IsDestination;
  570. Station = source.Station;
  571. Slot = source.Slot;
  572. OriginStation = source.OriginStation;
  573. OriginSlot = source.OriginSlot;
  574. if (source.OriginCarrierID != null) OriginCarrierID = source.OriginCarrierID;
  575. if (source.DestinationCarrierID != null) DestinationCarrierID = source.DestinationCarrierID;
  576. DestinationStation = source.DestinationStation;
  577. DestinationSlot = source.DestinationSlot;
  578. NextStation = source.NextStation;
  579. NextStationSlot = source.NextStationSlot;
  580. Notch = source.Notch;
  581. Size = source.Size;
  582. TransFlag = source.TransFlag;
  583. LotId = source.LotId;
  584. ProcessJob = source.ProcessJob;
  585. NextSequenceStep = source.NextSequenceStep;
  586. SubstHists = source.SubstHists;
  587. HasWarning = source.HasWarning;
  588. HasError = source.HasError;
  589. SubstE90Status = source.SubstE90Status;
  590. PPID = source.PPID;
  591. HostLaserMark1 = source.HostLaserMark1;
  592. HostLaserMark2 = source.HostLaserMark2;
  593. WaferType = source.WaferType;
  594. UseCount = source.UseCount;
  595. UseTime = source.UseTime;
  596. UseThick = source.UseThick;
  597. }
  598. public WaferInfo Clone()
  599. {
  600. WaferInfo source = this;
  601. return new WaferInfo()
  602. {
  603. InnerId = source.InnerId,
  604. WaferID = source.waferID,
  605. WaferOrigin = source.WaferOrigin,
  606. LaserMarker = source.LaserMarker,
  607. LaserMarkerScore = source.LaserMarkerScore,
  608. T7Code = source.T7Code,
  609. T7CodeScore = source.T7CodeScore,
  610. Status = source.Status,
  611. ProcessState = source.ProcessState,
  612. IsSource = source.IsSource,
  613. IsDestination = source.IsDestination,
  614. Station = source.Station,
  615. Slot = source.Slot,
  616. OriginStation = source.OriginStation,
  617. OriginSlot = source.OriginSlot,
  618. OriginCarrierID = source.OriginCarrierID,
  619. DestinationCarrierID = source.DestinationCarrierID,
  620. DestinationStation = source.DestinationStation,
  621. DestinationSlot = source.DestinationSlot,
  622. NextStation = source.NextStation,
  623. NextStationSlot = source.NextStationSlot,
  624. Notch = source.Notch,
  625. Size = source.Size,
  626. TransFlag = source.TransFlag,
  627. LotId = source.LotId,
  628. ProcessJob = source.ProcessJob,
  629. NextSequenceStep = source.NextSequenceStep,
  630. SubstHists = source.SubstHists,
  631. HasWarning = source.HasWarning,
  632. HasError = source.HasError,
  633. SubstE90Status = source.SubstE90Status,
  634. PPID = source.PPID,
  635. UseCount = source.UseCount,
  636. UseTime = source.UseTime,
  637. UseThick = source.UseThick,
  638. };
  639. }
  640. public void SetEmpty()
  641. {
  642. this.InnerId = Guid.Empty;
  643. this.WaferID = string.Empty;
  644. this.WaferOrigin = string.Empty;
  645. this.LaserMarker = string.Empty;
  646. this.LaserMarkerScore = string.Empty;
  647. this.T7Code = string.Empty;
  648. this.T7CodeScore = string.Empty;
  649. this.Status = (int)WaferStatus.Empty;
  650. this.ProcessState = EnumWaferProcessStatus.Idle;
  651. this.IsSource = false;
  652. this.IsDestination = false;
  653. this.Station = 0;
  654. this.Slot = 0;
  655. this.OriginStation = 0;
  656. this.OriginSlot = 0;
  657. //this.SourceStation = 0;
  658. //this.SourceSlot = 0;
  659. this.DestinationStation = 0;
  660. this.DestinationSlot = 0;
  661. this.Notch = 0;
  662. //保留最后一次的Wafer Size信息,便于后续判断和优化
  663. //this.Size = WaferSize.WS0;
  664. this.TransFlag = string.Empty;
  665. this.LotId = string.Empty;
  666. this.ProcessJob = null;
  667. this.NextSequenceStep = 0;
  668. this.HasWarning = false;
  669. this.HasError = false;
  670. this.PPID = "";
  671. this.UseCount = 0;
  672. this.UseTime = 0;
  673. this.UseThick = 0;
  674. }
  675. }
  676. public class WaferTypeInfo
  677. {
  678. /// <summary>
  679. /// WaferType名称
  680. /// </summary>
  681. public string Name { get; set; }
  682. public string FullName { get; set; }
  683. /// <summary>
  684. /// 是否进行膜厚
  685. /// </summary>
  686. public bool AccFilmThick { get; set; }
  687. /// <summary>
  688. /// 备用waferType
  689. /// 在Auto流程中配置了此项的waferType可以缺少,如果缺少使用此项配置的类型填充
  690. /// </summary>
  691. public string AlternativeWaferType { get; set; }
  692. /// <summary>
  693. /// 是否是ReturnWafer类型
  694. /// </summary>
  695. public bool IsReturnWafer { get; set; }
  696. /// <summary>
  697. /// ReturnWafer类型
  698. /// IsReturnWafer=true,ReturnWaferType不能是可用waferType
  699. /// 即此Type作为ReturnWafer,不允许有其他ReturnWafer
  700. /// IsReturnWafer=false,可以不设定此参数,如果设定就必须是IsReturnWafer=true的waferType
  701. /// </summary>
  702. public string ReturnWaferType { get; set; }
  703. /// <summary>
  704. /// 主要用在UI界面上,不同的type显示的颜色
  705. /// </summary>
  706. public string ShowColor { get; set; }
  707. /// <summary>
  708. /// 是否可多次使用
  709. /// </summary>
  710. public bool CanProcessContinuously { get; set; }
  711. /// <summary>
  712. /// 是否是Dummy类型
  713. /// </summary>
  714. public bool IsDummy { get; set; }
  715. }
  716. }