MaterialMovementViewModel.cs 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746
  1. using Aitex.Core.Common;
  2. using Aitex.Core.UI.MVVM;
  3. using MECF.Framework.Common.DataCenter;
  4. using MECF.Framework.Common.Equipment;
  5. using MECF.Framework.Common.OperationCenter;
  6. using MECF.Framework.Common.SubstrateTrackings;
  7. using MECF.Framework.Common.Utilities;
  8. using MECF.Framework.Common.WaferHolder;
  9. using Prism.Mvvm;
  10. using System;
  11. using System.Collections.Generic;
  12. using System.Collections.ObjectModel;
  13. using System.Linq;
  14. using System.Net.NetworkInformation;
  15. using System.Windows;
  16. using System.Windows.Input;
  17. using System.Windows.Threading;
  18. namespace CyberX8_MainPages.ViewModels
  19. {
  20. public class MaterialMovementViewModel : BindableBase
  21. {
  22. #region 常量
  23. private const int DATAGRIP_ROW_NUM = 24;
  24. #endregion
  25. #region 内部变量
  26. #region system
  27. /// <summary>
  28. /// rt查询key
  29. /// </summary>
  30. private List<string> _rtDataKeys = new List<string>();
  31. /// <summary>
  32. /// 时钟
  33. /// </summary>
  34. DispatcherTimer _timer;
  35. /// <summary>
  36. /// rt查询数据
  37. /// </summary>
  38. private Dictionary<string, object> _rtDataValueDic = new Dictionary<string, object>();
  39. /// <summary>
  40. /// LayoutCell列表
  41. /// </summary>
  42. private ObservableCollection<string> _locationLst;
  43. #endregion
  44. #region Common
  45. /// <summary>
  46. /// Module
  47. /// </summary>
  48. private string _module;
  49. /// <summary>
  50. /// MaterialData Collection
  51. /// </summary>
  52. private List<ModuleMaterial> _materialDatas;
  53. /// <summary>
  54. /// MaterialData Sub Collection1
  55. /// </summary>
  56. private ObservableCollection<ModuleMaterial> _materialSubdatas1;
  57. /// <summary>
  58. /// MaterialData Sub Collection2
  59. /// </summary>
  60. private ObservableCollection<ModuleMaterial> _materialSubdatas2;
  61. /// <summary>
  62. /// MaterialData Sub Collection Buffer1
  63. /// </summary>
  64. private List<ModuleMaterial> _materialSubdatasBuffer1;
  65. /// <summary>
  66. /// MaterialData Sub Collection Buffer2
  67. /// </summary>
  68. private List<ModuleMaterial> _materialSubdatasBuffer2;
  69. /// <summary>
  70. /// Pre MaterialDatas1
  71. /// </summary>
  72. private List<ModuleMaterial> _preMaterialDatas1 = new List<ModuleMaterial>();
  73. /// <summary>
  74. /// Pre MaterialDatas2
  75. /// </summary>
  76. private List<ModuleMaterial> _preMaterialDatas2 = new List<ModuleMaterial>();
  77. /// <summary>;
  78. /// <summary>
  79. /// From Loaction选择
  80. /// </summary>
  81. private string _fromLocation;
  82. /// <summary>
  83. /// To Location选择
  84. /// </summary>
  85. private string _toLocation;
  86. /// <summary>
  87. /// ProcessTransporter是否Busy
  88. /// </summary>
  89. private bool _isProcessTransBusy;
  90. /// <summary>
  91. /// LoaderTransporter是否Busy
  92. /// </summary>
  93. private bool _isLoaderTransBusy;
  94. /// <summary>
  95. /// 是否在Auto模式下
  96. /// </summary>
  97. private bool _isAutoMode;
  98. /// <summary>
  99. /// UpdateLocation按钮是否启用
  100. /// </summary>
  101. private bool _isMoveEnable;
  102. /// <summary>
  103. /// Remove按钮是否启用
  104. /// </summary>
  105. private bool _isRemoveEnable;
  106. /// <summary>
  107. /// Selected MaterialData
  108. /// </summary>
  109. private ModuleMaterial _selectedMaterialData;
  110. /// <summary>
  111. /// Pre Selected MaterialData
  112. /// </summary>
  113. private ModuleMaterial _preSelectedMaterialData;
  114. /// <summary>
  115. /// Selected MaterialData1
  116. /// </summary>
  117. private ModuleMaterial _selectedMaterialData1;
  118. /// <summary>
  119. /// Selected MaterialData2
  120. /// </summary>
  121. private ModuleMaterial _selectedMaterialData2;
  122. /// <summary>
  123. /// Selected ModuleName
  124. /// </summary>
  125. private string _selectedModuleName;
  126. /// <summary>
  127. /// WaferMove FromSlot列表
  128. /// </summary>
  129. private ObservableCollection<int> _fromSlotLst = new ObservableCollection<int>();
  130. /// <summary>
  131. /// WaferMove ToSlot列表
  132. /// </summary>
  133. private ObservableCollection<int> _toSlotLst = new ObservableCollection<int>();
  134. /// <summary>
  135. /// WaferMove Modules列表
  136. /// </summary>
  137. private ObservableCollection<ModuleName> _moduleLst = new ObservableCollection<ModuleName>();
  138. /// <summary>
  139. /// WaferMove From Module
  140. /// </summary>
  141. private ModuleName _fromModule;
  142. /// <summary>
  143. /// WaferMove To Module
  144. /// </summary>
  145. private ModuleName _toModule;
  146. /// <summary>
  147. /// WaferMove To Slot
  148. /// </summary>
  149. private int _toSlot;
  150. /// <summary>
  151. /// WaferMove From Slot
  152. /// </summary>
  153. private int _fromSlot;
  154. /// <summary>
  155. /// WaferMove Update按钮是否启用
  156. /// </summary>
  157. private bool _isWaferMoveEnable;
  158. /// <summary>
  159. /// MaterialDataBuffer
  160. /// </summary>
  161. private ModuleMaterial _materialDataBuffer;
  162. /// <summary>
  163. /// Grid Selection
  164. /// </summary>
  165. private bool _gridSelection;
  166. #endregion
  167. #endregion
  168. #region 属性
  169. #region Common
  170. /// <summary>
  171. /// MaterialData Collection
  172. /// </summary>
  173. public List<ModuleMaterial> MaterialDatas
  174. {
  175. get { return _materialDatas; }
  176. set
  177. {
  178. SetProperty(ref _materialDatas, value);
  179. }
  180. }
  181. /// <summary>
  182. /// MaterialData Sub Collection1
  183. /// </summary>
  184. public ObservableCollection<ModuleMaterial> MaterialSubdatas1
  185. {
  186. get { return _materialSubdatas1; }
  187. set
  188. {
  189. SetProperty(ref _materialSubdatas1, value);
  190. }
  191. }
  192. /// <summary>
  193. /// MaterialData Sub Collection2
  194. /// </summary>
  195. public ObservableCollection<ModuleMaterial> MaterialSubdatas2
  196. {
  197. get { return _materialSubdatas2; }
  198. set
  199. {
  200. SetProperty(ref _materialSubdatas2, value);
  201. }
  202. }
  203. /// <summary>
  204. /// Selected MaterialData
  205. /// </summary>
  206. public ModuleMaterial SelectedMaterialData
  207. {
  208. get { return _selectedMaterialData; }
  209. set
  210. {
  211. SetProperty(ref _selectedMaterialData, value);
  212. }
  213. }
  214. /// <summary>
  215. /// Selected MaterialData1
  216. /// </summary>
  217. public ModuleMaterial SelectedMaterialData1
  218. {
  219. get { return _selectedMaterialData1; }
  220. set
  221. {
  222. SetProperty(ref _selectedMaterialData1, value);
  223. }
  224. }
  225. /// <summary>
  226. /// Selected MaterialData2
  227. /// </summary>
  228. public ModuleMaterial SelectedMaterialData2
  229. {
  230. get { return _selectedMaterialData2; }
  231. set
  232. {
  233. SetProperty(ref _selectedMaterialData2, value);
  234. }
  235. }
  236. /// <summary>
  237. /// Selected ModuleName
  238. /// </summary>
  239. public string SelectedModuleName
  240. {
  241. get { return _selectedModuleName; ; }
  242. set
  243. {
  244. SetProperty(ref _selectedModuleName, value);
  245. }
  246. }
  247. /// <summary>
  248. /// LayoutCell列表
  249. /// </summary>
  250. public ObservableCollection<string> LocationLst
  251. {
  252. get { return _locationLst; }
  253. set { SetProperty(ref _locationLst, value); }
  254. }
  255. /// <summary>
  256. /// From Location
  257. /// </summary>
  258. public string FromLocation
  259. {
  260. get { return _fromLocation; }
  261. set { SetProperty(ref _fromLocation, value); }
  262. }
  263. /// <summary>
  264. /// To Location
  265. /// </summary>
  266. public string ToLocation
  267. {
  268. get { return _toLocation; }
  269. set { SetProperty(ref _toLocation, value); }
  270. }
  271. /// <summary>
  272. /// UpdateLocation按钮是否启用
  273. /// </summary>
  274. public bool IsMoveEnable
  275. {
  276. get { return _isMoveEnable; }
  277. set { SetProperty(ref _isMoveEnable, value); }
  278. }
  279. /// <summary>
  280. /// Remove按钮是否启用
  281. /// </summary>
  282. public bool IsRemoveEnable
  283. {
  284. get { return _isRemoveEnable; }
  285. set { SetProperty(ref _isRemoveEnable, value); }
  286. }
  287. /// <summary>
  288. /// WaferMove FromSlot列表
  289. /// </summary>
  290. public ObservableCollection<int> FromSlotLst
  291. {
  292. get { return _fromSlotLst; }
  293. set { SetProperty(ref _fromSlotLst, value); }
  294. }
  295. /// <summary>
  296. /// WaferMove ToSlot列表
  297. /// </summary>
  298. public ObservableCollection<int> ToSlotLst
  299. {
  300. get { return _toSlotLst; }
  301. set { SetProperty(ref _toSlotLst, value); }
  302. }
  303. /// <summary>
  304. /// WaferMove Modules列表
  305. /// </summary>
  306. public ObservableCollection<ModuleName> ModuleLst
  307. {
  308. get { return _moduleLst; }
  309. set { SetProperty(ref _moduleLst, value); }
  310. }
  311. /// <summary>
  312. /// WaferMove From Module
  313. /// </summary>
  314. public ModuleName FromModule
  315. {
  316. get { return _fromModule; }
  317. set { SetProperty(ref _fromModule, value); }
  318. }
  319. /// <summary>
  320. /// WaferMove To Module
  321. /// </summary>
  322. public ModuleName ToModule
  323. {
  324. get { return _toModule; }
  325. set { SetProperty(ref _toModule, value); }
  326. }
  327. /// <summary>
  328. /// WaferMove To Slot
  329. /// </summary>
  330. public int ToSlot
  331. {
  332. get { return _toSlot; }
  333. set { SetProperty(ref _toSlot, value); }
  334. }
  335. /// <summary>
  336. /// WaferMove To Slot
  337. /// </summary>
  338. public int FromSlot
  339. {
  340. get { return _fromSlot; }
  341. set { SetProperty(ref _fromSlot, value); }
  342. }
  343. /// <summary>
  344. /// WaferMove按钮是否启用
  345. /// </summary>
  346. public bool IsWaferMoveEnable
  347. {
  348. get { return _isWaferMoveEnable; }
  349. set { SetProperty(ref _isWaferMoveEnable, value); }
  350. }
  351. #endregion
  352. #endregion
  353. #region 命令
  354. public ICommand UpdateLocationCommand { get; private set; }
  355. public ICommand UpdateWaferCommand { get; private set; }
  356. public ICommand RemoveCommand { get; private set; }
  357. public ICommand ModuleChangeCommand { get; private set; }
  358. public ICommand SelectionChangeCommand { get; private set; }
  359. public ICommand ResetWafersCommand { get; private set; }
  360. #endregion
  361. /// <summary>
  362. /// 构造函数
  363. /// </summary>
  364. public MaterialMovementViewModel()
  365. {
  366. _materialDatas = new List<ModuleMaterial>();
  367. _materialSubdatas1 = new ObservableCollection<ModuleMaterial>();
  368. _materialSubdatas2 = new ObservableCollection<ModuleMaterial>();
  369. _materialSubdatasBuffer1 = new List<ModuleMaterial>();
  370. _materialSubdatasBuffer2 = new List<ModuleMaterial>();
  371. UpdateLocationCommand = new DelegateCommand<object>(UpdateLocationAction);
  372. UpdateWaferCommand = new DelegateCommand<object>(UpdateWaferAction);
  373. RemoveCommand = new DelegateCommand<object>(RemoveAction);
  374. ModuleChangeCommand = new DelegateCommand<object>(ModuleChangeAction);
  375. SelectionChangeCommand = new DelegateCommand<object>(SelectionChangeAction);
  376. ResetWafersCommand = new DelegateCommand<object>(ResetWafersAction);
  377. ModuleLst.Clear();
  378. ModuleLst.Add(ModuleName.EfemRobot);
  379. ModuleLst.Add(ModuleName.LP1);
  380. ModuleLst.Add(ModuleName.LP2);
  381. ModuleLst.Add(ModuleName.LP3);
  382. ModuleLst.Add(ModuleName.Aligner1);
  383. ModuleLst.Add(ModuleName.PUF1);
  384. ModuleLst.Add(ModuleName.PUF2);
  385. ModuleLst.Add(ModuleName.Dummy1);
  386. ModuleLst.Add(ModuleName.Dummy2);
  387. ModuleLst.Add(ModuleName.Loader1);
  388. ModuleChangeAction("From");
  389. ModuleChangeAction("To");
  390. IsMoveEnable = false;
  391. IsRemoveEnable = false;
  392. IsWaferMoveEnable = false;
  393. }
  394. /// <summary>
  395. /// 加载数据
  396. /// </summary>
  397. /// <param name="systemName"></param>
  398. public void LoadData(string systemName)
  399. {
  400. _module = systemName;
  401. _rtDataKeys.Clear();
  402. _rtDataKeys.Add("System.LayoutCellItems");
  403. _rtDataKeys.Add("System.ModuleMaterials");
  404. _rtDataKeys.Add($"Transporter1.IsBusy");
  405. _rtDataKeys.Add($"Transporter2.IsBusy");
  406. _rtDataKeys.Add("System.IsAutoMode");
  407. if (_rtDataKeys.Count != 0)
  408. {
  409. _rtDataValueDic = QueryDataClient.Instance.Service.PollData(_rtDataKeys);
  410. if (_rtDataValueDic != null)
  411. {
  412. LocationLst = new ObservableCollection<string>(CommonFunction.GetValue<List<string>>(_rtDataValueDic, "System.LayoutCellItems"));
  413. LocationLst.Add("Loader");
  414. LocationLst.Add(ModuleName.Transporter1.ToString());
  415. LocationLst.Add(ModuleName.Transporter2.ToString());
  416. }
  417. }
  418. if (_timer == null)
  419. {
  420. _timer = new DispatcherTimer();
  421. _timer.Interval = TimeSpan.FromMilliseconds(200);
  422. _timer.Tick += Timer_Tick;
  423. }
  424. _timer.Start();
  425. }
  426. /// <summary>
  427. /// 时钟
  428. /// </summary>
  429. /// <param name="sender"></param>
  430. /// <param name="e"></param>
  431. private void Timer_Tick(object sender, EventArgs e)
  432. {
  433. IsMoveEnable = (FromLocation != null && ToLocation != null) ? true : false;
  434. IsRemoveEnable = string.IsNullOrEmpty(SelectedModuleName) ? false : true;
  435. IsWaferMoveEnable = (FromModule != ModuleName.System && ToModule != ModuleName.System && FromSlot != 0 && ToSlot != 0) ? true : false;
  436. if (_rtDataKeys.Count != 0)
  437. {
  438. _rtDataValueDic = QueryDataClient.Instance.Service.PollData(_rtDataKeys);
  439. if (_rtDataValueDic != null)
  440. {
  441. _isProcessTransBusy = CommonFunction.GetValue<bool>(_rtDataValueDic, $"Transporter1.IsBusy");
  442. _isLoaderTransBusy = CommonFunction.GetValue<bool>(_rtDataValueDic, $"Transporter2.IsBusy");
  443. _isAutoMode = CommonFunction.GetValue<bool>(_rtDataValueDic, $"System.IsAutoMode");
  444. MaterialDatas = CommonFunction.GetValue<List<ModuleMaterial>>(_rtDataValueDic, "System.ModuleMaterials");
  445. int i = 0;
  446. _materialSubdatasBuffer1.Clear();
  447. _materialSubdatasBuffer2.Clear();
  448. for (i = 0; i < DATAGRIP_ROW_NUM; i++)
  449. {
  450. _materialSubdatasBuffer1.Add(MaterialDatas[i]);
  451. }
  452. for (; i < MaterialDatas.Count(); i++)
  453. {
  454. _materialSubdatasBuffer2.Add(MaterialDatas[i]);
  455. }
  456. //若数据变化则刷新数据
  457. if ((_preMaterialDatas1.Count == 0) || (_preMaterialDatas1.Count != 0 && !CompareList(_preMaterialDatas1, _materialSubdatasBuffer1)))
  458. {
  459. MaterialSubdatas1 = new ObservableCollection<ModuleMaterial>(_materialSubdatasBuffer1);
  460. _preMaterialDatas1 = new List<ModuleMaterial>(_materialSubdatasBuffer1);
  461. }
  462. if ((_preMaterialDatas2.Count == 0) || (_preMaterialDatas2.Count != 0 && !CompareList(_preMaterialDatas2, _materialSubdatasBuffer2)))
  463. {
  464. MaterialSubdatas2 = new ObservableCollection<ModuleMaterial>(_materialSubdatasBuffer2);
  465. _preMaterialDatas2 = new List<ModuleMaterial>(_materialSubdatasBuffer2);
  466. }
  467. //记忆SelectedItem
  468. if (SelectedMaterialData != null)
  469. {
  470. if (_gridSelection)
  471. {
  472. SelectedMaterialData1 = MaterialSubdatas1.ToList().Find(t => t.ModuleName == SelectedMaterialData.ModuleName);
  473. SelectedMaterialData2 = null;
  474. }
  475. else
  476. {
  477. SelectedMaterialData2 = MaterialSubdatas2.ToList().Find(t => t.ModuleName == SelectedMaterialData.ModuleName);
  478. SelectedMaterialData1 = null;
  479. }
  480. }
  481. }
  482. }
  483. }
  484. /// <summary>
  485. /// 隐藏
  486. /// </summary>
  487. public void Hide()
  488. {
  489. if (_timer != null)
  490. {
  491. _timer.Stop();
  492. }
  493. }
  494. #region 命令方法
  495. private void UpdateLocationAction(object param)
  496. {
  497. WaferHolderInfo waferHolderInfo = WaferHolderDataClient.Instance.Service.GetWaferHolderDataByLocation(FromLocation);
  498. if (waferHolderInfo == null) return;
  499. if (!string.IsNullOrEmpty(FromLocation) && !string.IsNullOrEmpty(ToLocation))
  500. {
  501. if (!_isLoaderTransBusy && !_isProcessTransBusy && !_isAutoMode)
  502. {
  503. InvokeClient.Instance.Service.DoOperation($"WaferHolder.TransferWaferHolder", $"{FromLocation}", $"{ToLocation}");
  504. }
  505. else if (_isAutoMode)
  506. {
  507. MessageBox.Show("Auto mode can't do this operation", "Update", MessageBoxButton.OK, MessageBoxImage.Error);
  508. }
  509. else
  510. {
  511. MessageBox.Show("Loader or Process Transporter is in Busy state", "Update", MessageBoxButton.OK, MessageBoxImage.Error);
  512. }
  513. }
  514. }
  515. /// <summary>
  516. /// 删除信息
  517. /// </summary>
  518. /// <param name="param"></param>
  519. private void RemoveAction(object param)
  520. {
  521. if (SelectedMaterialData == null)
  522. {
  523. MessageBox.Show("please select one data", "Delete", MessageBoxButton.OK, MessageBoxImage.Error);
  524. return;
  525. }
  526. if (string.IsNullOrEmpty(SelectedMaterialData.WaferHolderId) && SelectedMaterialData.SideAWaferStatus == 0 && SelectedMaterialData.SideBWaferStatus == 0)
  527. {
  528. MessageBox.Show("The data is Empt", "Delete", MessageBoxButton.OK, MessageBoxImage.Error);
  529. return;
  530. }
  531. if (MessageBox.Show("do you want to delete selected data", "Delete", MessageBoxButton.YesNo, MessageBoxImage.Question) == MessageBoxResult.Yes)
  532. {
  533. if ((LocationLst.Contains(SelectedMaterialData.ModuleName) || SelectedMaterialData.ModuleName.Contains("Transporter")
  534. || SelectedMaterialData.ModuleName.Contains("Loader")) && SelectedMaterialData.WaferHolderId != "")
  535. {
  536. WaferHolderDataClient.Instance.Service.DeleteWaferHolderData(SelectedMaterialData.WaferHolderId);
  537. }
  538. else if (ModuleHelper.IsSRD(ModuleHelper.Converter(SelectedMaterialData.ModuleName)) || ModuleHelper.IsPUF(ModuleHelper.Converter(SelectedMaterialData.ModuleName)))
  539. {
  540. if (SelectedMaterialData.SideAWaferId != "")
  541. InvokeClient.Instance.Service.DoOperation("WaferManager.DeleteWafer", SelectedMaterialData.SideAWaferId);
  542. if (SelectedMaterialData.SideBWaferId != "")
  543. InvokeClient.Instance.Service.DoOperation("WaferManager.DeleteWafer", SelectedMaterialData.SideBWaferId);
  544. }
  545. else
  546. {
  547. return;
  548. }
  549. }
  550. }
  551. /// <summary>
  552. /// WaferMove 更新Slot列表
  553. /// </summary>
  554. /// <param name="obj"></param>
  555. private void ModuleChangeAction(object obj)
  556. {
  557. var value = obj.ToString();
  558. switch (value)
  559. {
  560. case "From":
  561. FromSlotLst.Clear();
  562. switch (FromModule)
  563. {
  564. case ModuleName.EfemRobot:
  565. FromSlotLst.Add(1);
  566. break;
  567. case ModuleName.LP1:
  568. case ModuleName.LP2:
  569. case ModuleName.LP3:
  570. for (int i = 1; i < 26; i++)
  571. {
  572. FromSlotLst.Add(i);
  573. }
  574. break;
  575. case ModuleName.Aligner1:
  576. FromSlotLst.Add(1);
  577. break;
  578. case ModuleName.PUF1:
  579. case ModuleName.PUF2:
  580. FromSlotLst.Add(1);
  581. FromSlotLst.Add(2);
  582. break;
  583. case ModuleName.Dummy1:
  584. case ModuleName.Dummy2:
  585. for (int i = 1; i < 17; i++)
  586. {
  587. FromSlotLst.Add(i);
  588. }
  589. break;
  590. case ModuleName.Loader1:
  591. FromSlotLst.Add(1);
  592. FromSlotLst.Add(2);
  593. break;
  594. default:
  595. break;
  596. }
  597. break;
  598. case "To":
  599. ToSlotLst.Clear();
  600. switch (ToModule)
  601. {
  602. case ModuleName.EfemRobot:
  603. ToSlotLst.Add(1);
  604. break;
  605. case ModuleName.LP1:
  606. case ModuleName.LP2:
  607. case ModuleName.LP3:
  608. for (int i = 1; i < 26; i++)
  609. {
  610. ToSlotLst.Add(i);
  611. }
  612. break;
  613. case ModuleName.Aligner1:
  614. ToSlotLst.Add(1);
  615. break;
  616. case ModuleName.PUF1:
  617. case ModuleName.PUF2:
  618. ToSlotLst.Add(1);
  619. ToSlotLst.Add(2);
  620. break;
  621. case ModuleName.Dummy1:
  622. case ModuleName.Dummy2:
  623. for (int i = 1; i < 17; i++)
  624. {
  625. ToSlotLst.Add(i);
  626. }
  627. break;
  628. case ModuleName.Loader1:
  629. ToSlotLst.Add(1);
  630. ToSlotLst.Add(2);
  631. break;
  632. default:
  633. break;
  634. }
  635. break;
  636. default:
  637. break;
  638. }
  639. }
  640. /// <summary>
  641. /// 更新Wafer位置
  642. /// </summary>
  643. /// <param name="param"></param>
  644. private void UpdateWaferAction(object param)
  645. {
  646. if(ToModule == ModuleName.Loader1)
  647. {
  648. WaferHolderInfo waferHolderInfo = WaferHolderDataClient.Instance.Service.GetWaferHolderDataByLocation("Loader");
  649. if(waferHolderInfo == null)
  650. {
  651. MessageBox.Show("Loader don't have wafer shuttle, can't move wafer!", "Delete", MessageBoxButton.OK, MessageBoxImage.Error);
  652. return;
  653. }
  654. InvokeClient.Instance.Service.DoOperation($"WaferManager.MoveWafer", FromModule, FromSlot - 1, ToModule, ToSlot - 1, waferHolderInfo.Id);
  655. }
  656. else if (FromModule == ModuleName.Loader1)
  657. {
  658. WaferHolderInfo waferHolderInfo = WaferHolderDataClient.Instance.Service.GetWaferHolderDataByLocation("Loader");
  659. if (waferHolderInfo == null)
  660. {
  661. MessageBox.Show("Loader don't have wafer shuttle, can't move wafer!", "Delete", MessageBoxButton.OK, MessageBoxImage.Error);
  662. return;
  663. }
  664. InvokeClient.Instance.Service.DoOperation($"WaferManager.MoveWafer", FromModule, FromSlot - 1, ToModule, ToSlot - 1, waferHolderInfo.Id);
  665. }
  666. else
  667. {
  668. InvokeClient.Instance.Service.DoOperation($"WaferManager.MoveWafer", FromModule, FromSlot - 1, ToModule, ToSlot - 1);
  669. }
  670. }
  671. /// <summary>
  672. /// Selection Change
  673. /// </summary>
  674. /// <param name="param"></param>
  675. private void SelectionChangeAction(object param)
  676. {
  677. string dg = param.ToString();
  678. if(dg == "DataGrid1")
  679. {
  680. if (SelectedMaterialData1 != null)
  681. {
  682. _gridSelection = true;
  683. SelectedModuleName = SelectedMaterialData1.ModuleName;
  684. SelectedMaterialData = SelectedMaterialData1;
  685. }
  686. }
  687. else
  688. {
  689. if (SelectedMaterialData2 != null)
  690. {
  691. _gridSelection = false;
  692. SelectedModuleName = SelectedMaterialData2.ModuleName;
  693. SelectedMaterialData = SelectedMaterialData2;
  694. }
  695. }
  696. }
  697. /// <summary>
  698. /// 重置Wafers
  699. /// </summary>
  700. /// <param name="param"></param>
  701. private void ResetWafersAction(object param)
  702. {
  703. InvokeClient.Instance.Service.DoOperation("WaferHolder.ResetLayoutWafers");
  704. }
  705. private bool CompareList(List<ModuleMaterial> list1, List<ModuleMaterial> list2)
  706. {
  707. for(int i = 0; i < list1.Count; i++)
  708. {
  709. if (list1[i].WaferHolderId != list2[i].WaferHolderId || list1[i].SideAWaferId != list2[i].SideAWaferId || list1[i].SideAWaferType != list2[i].SideAWaferType || list1[i].SideAWaferStatus != list2[i].SideAWaferStatus
  710. || list1[i].SideBWaferId != list2[i].SideBWaferId || list1[i].SideBWaferType != list2[i].SideBWaferType || list1[i].SideBWaferStatus != list2[i].SideBWaferStatus || list1[i].ModuleName != list2[i].ModuleName)
  711. {
  712. return false;
  713. }
  714. }
  715. return true;
  716. }
  717. #endregion
  718. }
  719. }