WaferInfo.cs 16 KB

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