WaferHolderViewModel.cs 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923
  1. using Aitex.Core.Common;
  2. using Aitex.Core.RT.DataCenter;
  3. using Aitex.Core.RT.Routine;
  4. using Aitex.Core.UI.MVVM;
  5. using Aitex.Core.Utilities;
  6. using MECF.Framework.Common.CommonData;
  7. using MECF.Framework.Common.DataCenter;
  8. using MECF.Framework.Common.DBCore;
  9. using MECF.Framework.Common.Equipment;
  10. using MECF.Framework.Common.OperationCenter;
  11. using MECF.Framework.Common.SubstrateTrackings;
  12. using MECF.Framework.Common.WaferHolder;
  13. using OpenSEMI.ClientBase;
  14. using CyberX8_MainPages.Model;
  15. using Prism.Common;
  16. using Prism.Mvvm;
  17. using System;
  18. using System.Collections.Generic;
  19. using System.Collections.ObjectModel;
  20. using System.Linq;
  21. using System.Text;
  22. using System.Threading.Tasks;
  23. using System.Windows;
  24. using System.Windows.Input;
  25. using Unity;
  26. using WPF.Themes.UserControls;
  27. using MECF.Framework.Common.Layout;
  28. using MECF.Framework.Common.Utilities;
  29. using Aitex.Core.UI.ControlDataContext;
  30. using System.Reflection;
  31. using System.Windows.Threading;
  32. using Aitex.Core.Util;
  33. using Aitex.Core.RT.Log;
  34. namespace CyberX8_MainPages.ViewModels
  35. {
  36. public class WaferHolderViewModel : BindableBase
  37. {
  38. #region 局部变量
  39. /// <summary>
  40. /// buffer数据
  41. /// </summary>
  42. private ObservableCollection<WaferHolderBufferData> _bufferDatas = null;
  43. /// <summary>
  44. /// 未使用的载具
  45. /// </summary>
  46. private ObservableCollection<WaferHolderInfo> _unusedWaferHoders = null;
  47. /// <summary>
  48. /// 选择数据
  49. /// </summary>
  50. private WaferHolderBufferData _selectedBufferData = null;
  51. /// <summary>
  52. /// 选择未使用数据
  53. /// </summary>
  54. private WaferHolderInfo _selectedUnusedWaferHolderInfo = null;
  55. /// <summary>
  56. /// csr 类型集合
  57. /// </summary>
  58. private List<string> _crsTypeLst = null;
  59. /// <summary>
  60. /// Wafer尺寸集合
  61. /// </summary>
  62. private List<string> _waferSizeLst = null;
  63. /// <summary>
  64. /// 临时数据
  65. /// </summary>
  66. private WaferHolderBufferData _tmpWaferHolderBufferData = null;
  67. /// <summary>
  68. /// 化学液集合
  69. /// </summary>
  70. private List<string> _chemistryLst = null;
  71. /// <summary>
  72. /// Location位置集合
  73. /// </summary>
  74. private List<string> _locationLst = new List<string>();
  75. /// <summary>
  76. /// Reservoir集合
  77. /// </summary>
  78. private List<string> _reservoirLst = new List<string>();
  79. /// <summary>
  80. /// 是否编辑
  81. /// </summary>
  82. private bool _isEdit = false;
  83. /// <summary>
  84. /// 是否编辑Current Location
  85. /// </summary>
  86. private bool _isLocationEdit = false;
  87. /// <summary>
  88. /// 是否启用SaveandCancel按钮
  89. /// </summary>
  90. private bool _isSaveandCancelEdit = false;
  91. /// <summary>
  92. /// 操作
  93. /// </summary>
  94. /// <summary>
  95. /// 操作
  96. /// </summary>
  97. private string operation = "";
  98. /// <summary>
  99. /// 是否编辑载具Id
  100. /// </summary>
  101. private bool _isEditWaferHolderId = false;
  102. /// <summary>
  103. /// 定时器
  104. /// </summary>
  105. DispatcherTimer _timer;
  106. /// <summary>
  107. /// 查询后台数据集合
  108. /// </summary>
  109. private List<string> _rtDataKeys = new List<string>();
  110. /// <summary>
  111. /// rt查询key数值字典
  112. /// </summary>
  113. private Dictionary<string, object> _rtDataValueDic = new Dictionary<string, object>();
  114. /// <summary>
  115. /// ProcessTransporter是否Busy
  116. /// </summary>
  117. private bool _isProcessTransBusy;
  118. /// <summary>
  119. /// LoaderTransporter是否Busy
  120. /// </summary>
  121. private bool _isLoaderTransBusy;
  122. /// <summary>
  123. /// 是否在Auto模式下
  124. /// </summary>
  125. private bool _isAutoMode;
  126. #endregion
  127. #region 属性
  128. public List<string> CrsTypeLst
  129. {
  130. get { return _crsTypeLst; }
  131. set { SetProperty(ref _crsTypeLst, value); }
  132. }
  133. public List<string> WaferSizeLst
  134. {
  135. get { return _waferSizeLst; }
  136. set { SetProperty(ref _waferSizeLst, value); }
  137. }
  138. public List<string> ChemistryLst
  139. {
  140. get { return _chemistryLst; }
  141. set { SetProperty(ref _chemistryLst, value); }
  142. }
  143. /// <summary>
  144. /// Location位置集合
  145. /// </summary>
  146. public List<string> LocationLst
  147. {
  148. get { return _locationLst; }
  149. set { SetProperty(ref _locationLst, value); }
  150. }
  151. public ObservableCollection<WaferHolderBufferData> BufferDatas
  152. {
  153. get { return _bufferDatas; }
  154. set
  155. {
  156. SetProperty(ref _bufferDatas, value);
  157. }
  158. }
  159. /// <summary>
  160. /// 未使用载具
  161. /// </summary>
  162. public ObservableCollection<WaferHolderInfo> UnusedWaferHolders
  163. {
  164. get { return _unusedWaferHoders; }
  165. set
  166. {
  167. SetProperty(ref _unusedWaferHoders, value);
  168. }
  169. }
  170. /// <summary数据>
  171. /// 选择
  172. /// </summary>
  173. public WaferHolderBufferData SelectedBufferData
  174. {
  175. get { return _selectedBufferData; }
  176. set
  177. {
  178. if(_selectedBufferData==null||(value!=null&&value.Id!=_selectedBufferData.Id))
  179. {
  180. BufferDataSelectedChanged(value);
  181. }
  182. SetProperty(ref _selectedBufferData, value);
  183. }
  184. }
  185. /// <summary数据>
  186. /// 选择未使用的载具
  187. /// </summary>
  188. public WaferHolderInfo SelectedUnusedWaferHolderInfo
  189. {
  190. get { return _selectedUnusedWaferHolderInfo; }
  191. set
  192. {
  193. SetProperty(ref _selectedUnusedWaferHolderInfo, value);
  194. }
  195. }
  196. /// <summary>
  197. /// 临时数据
  198. /// </summary>
  199. public WaferHolderBufferData TmpBufferData
  200. {
  201. get { return _tmpWaferHolderBufferData; }
  202. set { SetProperty(ref _tmpWaferHolderBufferData, value); }
  203. }
  204. /// <summary>
  205. /// 是否编辑
  206. /// </summary>
  207. public bool IsEdit
  208. {
  209. get { return _isEdit; }
  210. set
  211. {
  212. if(!value)
  213. {
  214. IsEditWaferHolderId = false;
  215. }
  216. SetProperty(ref _isEdit, value);
  217. }
  218. }
  219. /// <summary>
  220. /// 是否编辑Current Location
  221. /// </summary>
  222. public bool IsLocationEdit
  223. {
  224. get { return _isLocationEdit; }
  225. set
  226. {
  227. SetProperty(ref _isLocationEdit, value);
  228. }
  229. }
  230. /// <summary>
  231. /// 是否启用Save和Cancel
  232. /// </summary>
  233. public bool IsSaveandCancelEdit
  234. {
  235. get { return _isSaveandCancelEdit; }
  236. set
  237. {
  238. SetProperty(ref _isSaveandCancelEdit, value);
  239. }
  240. }
  241. /// <summary>
  242. /// 是否编辑载具Id
  243. /// </summary>
  244. public bool IsEditWaferHolderId
  245. {
  246. get { return _isEditWaferHolderId; }
  247. set { SetProperty(ref _isEditWaferHolderId, value); }
  248. }
  249. #endregion
  250. #region 按钮事件
  251. [IgnorePropertyChange]
  252. public ICommand EnableCommand
  253. {
  254. get;
  255. private set;
  256. }
  257. [IgnorePropertyChange]
  258. public ICommand DisableCommand
  259. {
  260. get;
  261. private set;
  262. }
  263. /// <summary>
  264. /// 增加
  265. /// </summary>
  266. public ICommand AddCommand
  267. { get; private set; }
  268. /// <summary>
  269. /// 编辑
  270. /// </summary>
  271. public ICommand EditCommand
  272. { get; private set; }
  273. /// <summary>
  274. /// 保存
  275. /// </summary>
  276. public ICommand SaveCommand { get; private set; }
  277. /// <summary>
  278. /// 取消
  279. /// </summary>
  280. public ICommand CancelCommand { get; private set; }
  281. /// <summary>
  282. /// 移至Loader
  283. /// </summary>
  284. public ICommand MoveToLoaderCommand { get; private set; }
  285. /// <summary>
  286. /// 移出Loader
  287. /// </summary>
  288. public ICommand MoveFromLoaderCommand { get; private set; }
  289. /// <summary>
  290. /// 移除
  291. /// </summary>
  292. public ICommand RemoveCommand { get; private set; }
  293. /// <summary>
  294. /// MoveLocation
  295. /// </summary>
  296. public ICommand MoveLocationCommand { get; private set; }
  297. #endregion
  298. /// <summary>
  299. /// 构造函数
  300. /// </summary>
  301. public WaferHolderViewModel()
  302. {
  303. EnableCommand = new DelegateCommand<object>(EnableAction);
  304. DisableCommand=new DelegateCommand<object>(DisableAction);
  305. AddCommand=new DelegateCommand<object>(AddAction);
  306. EditCommand = new DelegateCommand<object>(EditAction);
  307. SaveCommand=new DelegateCommand<object>(SaveAction);
  308. CancelCommand=new DelegateCommand<object>(CancelAction);
  309. MoveToLoaderCommand = new DelegateCommand<object>(MoveToLoaderAction);
  310. MoveFromLoaderCommand = new DelegateCommand<object>(MoveFromLoaderAction);
  311. RemoveCommand = new DelegateCommand<object>(RemoveAction);
  312. MoveLocationCommand = new DelegateCommand<object>(MoveLocationAction);
  313. //Wafer尺寸集合
  314. WaferSizeLst = new List<string>();
  315. WaferSizeLst.Add("200");
  316. WaferSizeLst.Add("300");
  317. //化学液集合
  318. string chemistryContent = QueryDataClient.Instance.Service.GetConfig($"System.ChemistryList").ToString();
  319. if (!string.IsNullOrEmpty(chemistryContent))
  320. {
  321. ChemistryLst = chemistryContent.Split(',').ToList();
  322. }
  323. //CrsType集合
  324. string crstypeContent = QueryDataClient.Instance.Service.GetConfig($"System.LSType").ToString();
  325. if(!string.IsNullOrEmpty(crstypeContent))
  326. {
  327. _crsTypeLst = crstypeContent.Split(',').ToList();
  328. }
  329. //Location集合
  330. List<string> _rtDataKeys = new List<string>();
  331. _rtDataKeys.Add("System.LayoutCellItems");
  332. var _rtDataValueDic = QueryDataClient.Instance.Service.PollData(_rtDataKeys);
  333. if (_rtDataValueDic != null)
  334. {
  335. //获取ProcessCell列表
  336. LocationLst= CommonFunction.GetValue<List<string>>(_rtDataValueDic, "System.LayoutCellItems");
  337. }
  338. }
  339. /// <summary>
  340. /// 加载数据
  341. /// </summary>
  342. public void LoadData(string systemName)
  343. {
  344. if (_timer == null)
  345. {
  346. _timer = new DispatcherTimer();
  347. _timer.Interval = TimeSpan.FromMilliseconds(200);
  348. _timer.Tick += Timer_Tick;
  349. }
  350. _timer.Start();
  351. _rtDataKeys.Clear();
  352. _rtDataKeys.Add($"Transporter1.IsBusy");
  353. _rtDataKeys.Add($"Transporter2.IsBusy");
  354. _rtDataKeys.Add("System.IsAutoMode");
  355. }
  356. /// <summary>
  357. /// 定时器执行
  358. /// </summary>
  359. /// <param name="sender"></param>
  360. /// <param name="e"></param>
  361. private void Timer_Tick(object sender, EventArgs e)
  362. {
  363. if (_rtDataKeys.Count != 0)
  364. {
  365. _rtDataValueDic = QueryDataClient.Instance.Service.PollData(_rtDataKeys);
  366. if (_rtDataValueDic != null)
  367. {
  368. _isProcessTransBusy = CommonFunction.GetValue<bool>(_rtDataValueDic, $"Transporter1.IsBusy");
  369. _isLoaderTransBusy = CommonFunction.GetValue<bool>(_rtDataValueDic, $"Transporter2.IsBusy");
  370. _isAutoMode = CommonFunction.GetValue<bool>(_rtDataValueDic, $"System.IsAutoMode");
  371. }
  372. }
  373. }
  374. /// <summary>
  375. /// 加载载具数据
  376. /// </summary>
  377. public void LoadWaferHolderDatas()
  378. {
  379. BufferDatas = new ObservableCollection<WaferHolderBufferData>();
  380. for (int i = 1; i <= 16; i++)
  381. {
  382. BufferDatas.Add(new WaferHolderBufferData() { Id = i });
  383. }
  384. List<WaferHolderInfo> waferHolderInfos = WaferHolderDataClient.Instance.Service.GetAllWaferHolderDatas();
  385. UpdateWaferHolderBufferDatas(waferHolderInfos);
  386. GetUnusedWaferHolderData(waferHolderInfos);
  387. IsEdit = false;
  388. IsSaveandCancelEdit = false;
  389. IsLocationEdit = false;
  390. }
  391. /// <summary>
  392. /// 更新buffer数据
  393. /// </summary>
  394. /// <param name="waferHolderInfos"></param>
  395. private void UpdateWaferHolderBufferDatas(List<WaferHolderInfo> waferHolderInfos)
  396. {
  397. for (int i=0;i< BufferDatas.Count;i++)
  398. {
  399. WaferHolderInfo holderInfo= waferHolderInfos.Find(O => O.BufferId == BufferDatas[i].Id && !string.IsNullOrEmpty(O.CurrentLocation));
  400. if(holderInfo != null)
  401. {
  402. SwitchWaferInfoToWaferHolderBufferData(holderInfo, BufferDatas[i]);
  403. }
  404. }
  405. }
  406. /// <summary>
  407. /// 获取未使用载具数据
  408. /// </summary>
  409. /// <param name="waferHolderInfos"></param>
  410. private void GetUnusedWaferHolderData(List<WaferHolderInfo> waferHolderInfos)
  411. {
  412. UnusedWaferHolders = new ObservableCollection<WaferHolderInfo>();
  413. UnusedWaferHolders.AddRange(waferHolderInfos.FindAll(O => string.IsNullOrEmpty(O.CurrentLocation)));
  414. }
  415. /// <summary>
  416. /// 检验选择
  417. /// </summary>
  418. /// <returns></returns>
  419. private bool CheckSelection()
  420. {
  421. if (_selectedBufferData == null)
  422. {
  423. MessageBox.Show("please select one data", "Check", MessageBoxButton.OK, MessageBoxImage.Error);
  424. return false;
  425. }
  426. if (string.IsNullOrEmpty(SelectedBufferData.WaferHolderId))
  427. {
  428. MessageBox.Show("empty data", "Check", MessageBoxButton.OK, MessageBoxImage.Error);
  429. return false;
  430. }
  431. return true;
  432. }
  433. /// <summary>
  434. /// 启用事件
  435. /// </summary>
  436. /// <param name="param"></param>
  437. private void EnableAction(object param)
  438. {
  439. if(!CheckSelection())
  440. {
  441. return;
  442. }
  443. int result= WaferHolderDataClient.Instance.Service.UpdateWaferHolderEnable(SelectedBufferData.WaferHolderId, true);
  444. if(result!=0)
  445. {
  446. SelectedBufferData.Enabled = "True";
  447. }
  448. }
  449. /// <summary>
  450. /// 启用事件
  451. /// </summary>
  452. /// <param name="param"></param>
  453. private void DisableAction(object param)
  454. {
  455. if (!CheckSelection())
  456. {
  457. return;
  458. }
  459. int result= WaferHolderDataClient.Instance.Service.UpdateWaferHolderEnable(SelectedBufferData.WaferHolderId, false);
  460. if(result!=0)
  461. {
  462. SelectedBufferData.Enabled = "False";
  463. }
  464. }
  465. /// <summary>
  466. /// 新增
  467. /// </summary>
  468. /// <param name="param"></param>
  469. private void AddAction(object param)
  470. {
  471. if (_selectedBufferData == null)
  472. {
  473. MessageBox.Show("please select one data", "Add", MessageBoxButton.OK, MessageBoxImage.Error);
  474. return;
  475. }
  476. if (!string.IsNullOrEmpty(SelectedBufferData.WaferHolderId))
  477. {
  478. MessageBox.Show("data exist,can not add operation", "Add", MessageBoxButton.OK, MessageBoxImage.Error);
  479. return;
  480. }
  481. IsEditWaferHolderId = true;
  482. operation = "Add";
  483. InitialWaferHolderBuffer();
  484. IsEdit = true;
  485. IsSaveandCancelEdit = true;
  486. }
  487. /// <summary>
  488. /// 初始数据
  489. /// </summary>
  490. private void InitialWaferHolderBuffer()
  491. {
  492. if(SelectedBufferData==null)
  493. {
  494. return;
  495. }
  496. TmpBufferData = new WaferHolderBufferData();
  497. TmpBufferData.Enabled = "True";
  498. TmpBufferData.Id = SelectedBufferData.Id;
  499. TmpBufferData.CrsATotalUses = "0";
  500. TmpBufferData.CrsAUsesSincePadClean = "0";
  501. TmpBufferData.CrsAUsesSinceSealClean = "0";
  502. TmpBufferData.CrsBTotalUses = "0";
  503. TmpBufferData.CrsBUsesSincePadClean = "0";
  504. TmpBufferData.CrsBUsesSinceSealClean = "0";
  505. TmpBufferData.TotalDummyWafers = "0";
  506. TmpBufferData.TotalProductWafers = "0";
  507. TmpBufferData.TotalUses = "0";
  508. }
  509. /// <summary>
  510. /// 编辑
  511. /// </summary>
  512. /// <param name="param"></param>
  513. private void EditAction(object param)
  514. {
  515. if (!CheckSelection())
  516. {
  517. return;
  518. }
  519. if(string.IsNullOrEmpty(SelectedBufferData.WaferHolderId))
  520. {
  521. MessageBox.Show("empty data","Edit",MessageBoxButton.OK,MessageBoxImage.Error);
  522. return;
  523. }
  524. operation= "edit";
  525. IsEdit = true;
  526. IsSaveandCancelEdit = true;
  527. }
  528. /// <summary>
  529. /// 检验
  530. /// </summary>
  531. /// <returns></returns>
  532. private bool Validation(out string reason)
  533. {
  534. reason = "";
  535. if (string.IsNullOrEmpty(TmpBufferData.WaferHolderId))
  536. {
  537. reason = "WS Id is Empty";
  538. return false;
  539. }
  540. if(string.IsNullOrEmpty(TmpBufferData.CrsType))
  541. {
  542. reason = "LS Type is Empty";
  543. return false;
  544. }
  545. if (string.IsNullOrEmpty(TmpBufferData.WaferSize))
  546. {
  547. reason = "Wafer Size is empty";
  548. return false;
  549. }
  550. if (string.IsNullOrEmpty(TmpBufferData.CrsAId))
  551. {
  552. reason = "LS-A Id is empty";
  553. return false;
  554. }
  555. if (string.IsNullOrEmpty(TmpBufferData.CrsBId))
  556. {
  557. reason = "LS-B Id is empty";
  558. return false;
  559. }
  560. if (TmpBufferData.CrsAId == TmpBufferData.CrsBId)
  561. {
  562. reason = "The LS Id of A and B can not be the same";
  563. return false;
  564. }
  565. if (string.IsNullOrEmpty(TmpBufferData.Chemistry))
  566. {
  567. reason = "Chemistry is empty";
  568. return false;
  569. }
  570. for (int i = 0; i < BufferDatas.Count; i++)
  571. {
  572. if ( BufferDatas[i].Id != TmpBufferData.Id && (TmpBufferData.CrsAId == BufferDatas[i].CrsAId || TmpBufferData.CrsAId == BufferDatas[i].CrsBId))
  573. {
  574. reason = "LS-A Id is already exist";
  575. return false;
  576. }
  577. if ( BufferDatas[i].Id != TmpBufferData.Id && (TmpBufferData.CrsBId == BufferDatas[i].CrsBId || TmpBufferData.CrsBId == BufferDatas[i].CrsAId) )
  578. {
  579. reason = "LS-B Id is already exist";
  580. return false;
  581. }
  582. }
  583. TmpBufferData.TotalDummyWafers = string.IsNullOrEmpty(TmpBufferData.TotalDummyWafers) ? "0" : TmpBufferData.TotalDummyWafers;
  584. TmpBufferData.TotalUses = string.IsNullOrEmpty(TmpBufferData.TotalUses) ? "0" : TmpBufferData.TotalUses;
  585. TmpBufferData.TotalProductWafers = string.IsNullOrEmpty(TmpBufferData.TotalProductWafers) ? "0" : TmpBufferData.TotalProductWafers;
  586. TmpBufferData.CrsATotalUses = string.IsNullOrEmpty(TmpBufferData.CrsATotalUses) ? "0" : TmpBufferData.CrsATotalUses;
  587. TmpBufferData.CrsAUsesSincePadClean = string.IsNullOrEmpty(TmpBufferData.CrsAUsesSincePadClean) ? "0" : TmpBufferData.CrsAUsesSincePadClean;
  588. TmpBufferData.CrsAUsesSinceSealClean = string.IsNullOrEmpty(TmpBufferData.CrsAUsesSinceSealClean) ? "0" : TmpBufferData.CrsAUsesSinceSealClean;
  589. TmpBufferData.CrsBTotalUses = string.IsNullOrEmpty(TmpBufferData.CrsBTotalUses) ? "0" : TmpBufferData.CrsBTotalUses;
  590. TmpBufferData.CrsBUsesSincePadClean = string.IsNullOrEmpty(TmpBufferData.CrsBUsesSincePadClean) ? "0" : TmpBufferData.CrsBUsesSincePadClean;
  591. TmpBufferData.CrsBUsesSinceSealClean = string.IsNullOrEmpty(TmpBufferData.CrsBUsesSinceSealClean) ? "0" : TmpBufferData.CrsBUsesSinceSealClean;
  592. if(!CheckWaferHolderId())
  593. {
  594. reason = "WS Id exist";
  595. return false;
  596. }
  597. return true;
  598. }
  599. /// <summary>
  600. /// 检验载具唯 一性
  601. /// </summary>
  602. /// <returns></returns>
  603. private bool CheckWaferHolderId()
  604. {
  605. string waferHolderId = TmpBufferData.WaferHolderId;
  606. for(int i=0;i<BufferDatas.Count;i++)
  607. {
  608. if (waferHolderId == BufferDatas[i].WaferHolderId)
  609. {
  610. if (BufferDatas[i].Id != TmpBufferData.Id)
  611. {
  612. return false;
  613. }
  614. }
  615. }
  616. for(int i=0;i<UnusedWaferHolders.Count;i++)
  617. {
  618. if (waferHolderId == UnusedWaferHolders[i].Id)
  619. {
  620. return false;
  621. }
  622. }
  623. return true;
  624. }
  625. /// <summary>
  626. /// 保存
  627. /// </summary>
  628. /// <param name="param"></param>
  629. public void SaveAction(object param)
  630. {
  631. bool validation = Validation(out var reason);
  632. if(!validation)
  633. {
  634. WPFMessageBox.ShowError(reason);
  635. return;
  636. }
  637. WaferHolderInfo info = WaferHolderBuferDataConvertToWaferHolderInfo();
  638. int result = 0;
  639. if(operation=="Add")
  640. {
  641. info.BufferId = SelectedBufferData.Id;
  642. if(info.CurrentLocation == null)
  643. {
  644. info.CurrentLocation = $"Buffer{info.BufferId}";
  645. }
  646. info.WaferAId = $"{info.Id}.01";
  647. info.WaferBId = $"{info.Id}.02";
  648. info.WaferAType = (int)WaferType.Assit;
  649. info.WaferBType = (int)WaferType.Assit;
  650. TmpBufferData.CurrentLocation = info.CurrentLocation;
  651. result= WaferHolderDataClient.Instance.Service.AddWaferHolderData(SelectedBufferData.Id, info);
  652. }else if(operation == "MoveLocation")
  653. {
  654. //判断能否更新位置
  655. if (!string.IsNullOrEmpty(SelectedBufferData.CurrentLocation) && !string.IsNullOrEmpty(info.CurrentLocation))
  656. {
  657. if (!_isLoaderTransBusy && !_isProcessTransBusy && !_isAutoMode)
  658. {
  659. info.WaferAId = $"{info.Id}.01";
  660. info.WaferBId = $"{info.Id}.02";
  661. info.WaferAType = (int)WaferType.Assit;
  662. info.WaferBType = (int)WaferType.Assit;
  663. result = WaferHolderDataClient.Instance.Service.UpdateWaferHolderData(SelectedBufferData.WaferHolderId, info,true);
  664. InvokeClient.Instance.Service.DoOperation($"WaferHolder.TransferWaferHolder", $"{SelectedBufferData.CurrentLocation}", $"{info.CurrentLocation}");
  665. }
  666. else if (_isAutoMode)
  667. {
  668. SelectedBufferData.SwitchData(TmpBufferData);
  669. MessageBox.Show("Auto mode can't do this operation", "Save", MessageBoxButton.OK, MessageBoxImage.Error);
  670. }
  671. else
  672. {
  673. SelectedBufferData.SwitchData(TmpBufferData);
  674. MessageBox.Show("Loader or Process Transporter is in Busy state", "Save", MessageBoxButton.OK, MessageBoxImage.Error);
  675. }
  676. }
  677. }
  678. else
  679. {
  680. //todo edit
  681. info.BufferId = SelectedBufferData.Id;
  682. info.WaferAId = $"{info.Id}.01";
  683. info.WaferBId = $"{info.Id}.02";
  684. info.WaferAType = (int)WaferType.Assit;
  685. info.WaferBType = (int)WaferType.Assit;
  686. result = WaferHolderDataClient.Instance.Service.UpdateWaferHolderData(SelectedBufferData.WaferHolderId, info, true);
  687. }
  688. if (result > 0)
  689. {
  690. SetSelectedWaferHolderData();
  691. }
  692. IsEdit = false;
  693. IsLocationEdit = false;
  694. IsSaveandCancelEdit = false;
  695. operation = "";
  696. }
  697. /// <summary>
  698. /// 取消
  699. /// </summary>
  700. /// <param name="param"></param>
  701. public void CancelAction(object param)
  702. {
  703. if(operation=="Add")
  704. {
  705. TmpBufferData = new WaferHolderBufferData();
  706. }
  707. else
  708. {
  709. TmpBufferData = SelectedBufferData.Clone();
  710. }
  711. IsEdit = false;
  712. IsSaveandCancelEdit = false;
  713. IsLocationEdit= false;
  714. }
  715. /// <summary>
  716. /// 移入
  717. /// </summary>
  718. /// <param name="param"></param>
  719. public void MoveToLoaderAction(object param)
  720. {
  721. if(SelectedUnusedWaferHolderInfo==null)
  722. {
  723. MessageBox.Show("please select one unused data", "Move To Buffer", MessageBoxButton.OK, MessageBoxImage.Error);
  724. return;
  725. }
  726. if(SelectedBufferData==null)
  727. {
  728. MessageBox.Show("please select one data", "Edit", MessageBoxButton.OK, MessageBoxImage.Error);
  729. return;
  730. }
  731. if (!string.IsNullOrEmpty(SelectedBufferData.WaferHolderId))
  732. {
  733. MessageBox.Show("data exist,can not move operation", "Edit", MessageBoxButton.OK, MessageBoxImage.Error);
  734. return;
  735. }
  736. if (MessageBox.Show("do you want to move selected wafer shuttle to buffer", "Move To Buffer", MessageBoxButton.YesNoCancel, MessageBoxImage.Question) == MessageBoxResult.Yes)
  737. {
  738. SelectedUnusedWaferHolderInfo.CurrentLocation = $"Buffer{SelectedBufferData.Id}";
  739. SelectedUnusedWaferHolderInfo.BufferId = SelectedBufferData.Id;
  740. int result = WaferHolderDataClient.Instance.Service.UpdateWaferHolderData(SelectedUnusedWaferHolderInfo.Id, SelectedUnusedWaferHolderInfo,true);
  741. if (result != 0)
  742. {
  743. SwitchWaferInfoToWaferHolderBufferData(SelectedUnusedWaferHolderInfo, SelectedBufferData);
  744. BufferDataSelectedChanged(SelectedBufferData);
  745. UnusedWaferHolders.Remove(SelectedUnusedWaferHolderInfo);
  746. SelectedUnusedWaferHolderInfo = null;
  747. }
  748. }
  749. }
  750. /// <summary>
  751. /// 移出
  752. /// </summary>
  753. /// <param name="param"></param>
  754. public void MoveFromLoaderAction(object param)
  755. {
  756. if(!CheckSelection())
  757. {
  758. return;
  759. }
  760. if (MessageBox.Show("do you want to move out selected wafer shuttle from buffer", "Move From Buffer", MessageBoxButton.YesNoCancel, MessageBoxImage.Question) == MessageBoxResult.Yes)
  761. {
  762. WaferHolderInfo info = WaferHolderBuferDataConvertToWaferHolderInfo();
  763. string preLocation = info.CurrentLocation;
  764. info.CurrentLocation = "";
  765. int result = WaferHolderDataClient.Instance.Service.UpdateWaferHolderData(SelectedBufferData.WaferHolderId, info, true);
  766. if (result != 0)
  767. {
  768. TmpBufferData = new WaferHolderBufferData();
  769. TmpBufferData.Id = SelectedBufferData.Id;
  770. TmpBufferData.SwitchData(SelectedBufferData);
  771. UnusedWaferHolders.Add(info);
  772. }
  773. }
  774. }
  775. /// <summary>
  776. /// 移除
  777. /// </summary>
  778. /// <param name="param"></param>
  779. public void RemoveAction(object param)
  780. {
  781. if (SelectedUnusedWaferHolderInfo == null)
  782. {
  783. MessageBox.Show("please select one unused data", "Edit", MessageBoxButton.OK, MessageBoxImage.Error);
  784. return;
  785. }
  786. if (MessageBox.Show("do you want to remove selected unused wafer shuttle","remove",MessageBoxButton.YesNoCancel,MessageBoxImage.Question)==MessageBoxResult.Yes)
  787. {
  788. int result = WaferHolderDataClient.Instance.Service.DeleteWaferHolderData(SelectedUnusedWaferHolderInfo.Id);
  789. if (result != 0)
  790. {
  791. UnusedWaferHolders.Remove(SelectedUnusedWaferHolderInfo);
  792. SelectedUnusedWaferHolderInfo = null;
  793. }
  794. }
  795. }
  796. /// <summary>
  797. /// 编辑CurrentLocation
  798. /// </summary>
  799. /// <param name="param"></param>
  800. private void MoveLocationAction(object param)
  801. {
  802. if (!CheckSelection())
  803. {
  804. return;
  805. }
  806. if (string.IsNullOrEmpty(SelectedBufferData.WaferHolderId))
  807. {
  808. MessageBox.Show("empty data", "Move Location", MessageBoxButton.OK, MessageBoxImage.Error);
  809. return;
  810. }
  811. operation = "MoveLocation";
  812. IsLocationEdit = true;
  813. IsSaveandCancelEdit = true;
  814. }
  815. /// <summary>
  816. /// 数据切换
  817. /// </summary>
  818. /// <param name="waferHolderBufferData"></param>
  819. public void BufferDataSelectedChanged(WaferHolderBufferData waferHolderBufferData)
  820. {
  821. TmpBufferData=waferHolderBufferData.Clone();
  822. IsEdit = false;
  823. IsLocationEdit = false;
  824. IsSaveandCancelEdit = false;
  825. }
  826. /// <summary>
  827. /// 数据转换
  828. /// </summary>
  829. /// <returns></returns>
  830. private WaferHolderInfo WaferHolderBuferDataConvertToWaferHolderInfo()
  831. {
  832. WaferHolderInfo info = new WaferHolderInfo();
  833. info.Id = TmpBufferData.WaferHolderId;
  834. info.CrsType = TmpBufferData.CrsType;
  835. info.WaferSize = int.Parse(TmpBufferData.WaferSize);
  836. info.Chemistry = TmpBufferData.Chemistry;
  837. info.TotalUses = int.Parse(TmpBufferData.TotalUses);
  838. info.TotalDummyWafers = int.Parse(TmpBufferData.TotalDummyWafers);
  839. info.TotalProductWafers = int.Parse(TmpBufferData.TotalProductWafers);
  840. info.CrsAId = TmpBufferData.CrsAId;
  841. info.CrsATotalUses =int.Parse(TmpBufferData.CrsATotalUses);
  842. info.CrsAUsesSincePadClean = int.Parse(TmpBufferData.CrsAUsesSincePadClean);
  843. info.CrsAUsesSinceSealClean = int.Parse(TmpBufferData.CrsAUsesSinceSealClean);
  844. info.CrsBId = TmpBufferData.CrsBId;
  845. info.CrsBTotalUses = int.Parse(TmpBufferData.CrsBTotalUses);
  846. info.CrsBUsesSincePadClean = int.Parse(TmpBufferData.CrsBUsesSincePadClean);
  847. info.CrsBUsesSinceSealClean = int.Parse(TmpBufferData.CrsBUsesSinceSealClean);
  848. info.Enabled =bool.Parse(TmpBufferData.Enabled);
  849. info.CurrentLocation = TmpBufferData.CurrentLocation;
  850. info.Status = info.Enabled ? WaferHolderStatus.Normal : WaferHolderStatus.Disabled;
  851. return info;
  852. }
  853. /// <summary>
  854. /// 交换载具数据至载具Buffer数据
  855. /// </summary>
  856. /// <param name="info"></param>
  857. /// <param name="data"></param>
  858. private void SwitchWaferInfoToWaferHolderBufferData(WaferHolderInfo info,WaferHolderBufferData data)
  859. {
  860. data.CrsType = info.CrsType;
  861. data.WaferHolderId = info.Id;
  862. data.CrsType = info.CrsType;
  863. data.Chemistry = info.Chemistry;
  864. data.WaferSize = info.WaferSize.ToString();
  865. data.Enabled = info.Enabled.ToString();
  866. data.TotalUses = info.TotalUses.ToString();
  867. data.CrsAId = info.CrsAId;
  868. data.CrsATotalUses = info.CrsATotalUses.ToString();
  869. data.CrsAUsesSincePadClean = info.CrsAUsesSincePadClean.ToString();
  870. data.CrsAUsesSinceSealClean = info.CrsAUsesSinceSealClean.ToString();
  871. data.CrsBId = info.CrsBId;
  872. data.CrsBTotalUses = info.CrsBTotalUses.ToString();
  873. data.CrsBUsesSincePadClean = info.CrsBUsesSincePadClean.ToString();
  874. data.CrsBUsesSinceSealClean = info.CrsBUsesSinceSealClean.ToString();
  875. data.TotalDummyWafers = info.TotalDummyWafers.ToString();
  876. data.TotalProductWafers = info.TotalProductWafers.ToString();
  877. data.CurrentLocation = info.CurrentLocation;
  878. }
  879. /// <summary>
  880. /// 将临时变量赋值
  881. /// </summary>
  882. private void SetSelectedWaferHolderData()
  883. {
  884. SelectedBufferData.Id = TmpBufferData.Id;
  885. SelectedBufferData.WaferHolderId = TmpBufferData.WaferHolderId;
  886. SelectedBufferData.Chemistry = TmpBufferData.Chemistry;
  887. SelectedBufferData.CrsType = TmpBufferData.CrsType;
  888. SelectedBufferData.WaferSize = TmpBufferData.WaferSize;
  889. SelectedBufferData.TotalUses = TmpBufferData.TotalUses;
  890. SelectedBufferData.TotalProductWafers = TmpBufferData.TotalProductWafers;
  891. SelectedBufferData.TotalDummyWafers = TmpBufferData.TotalDummyWafers;
  892. SelectedBufferData.CrsAId = TmpBufferData.CrsAId;
  893. SelectedBufferData.CrsATotalUses = TmpBufferData.CrsATotalUses;
  894. SelectedBufferData.CrsAUsesSincePadClean = TmpBufferData.CrsBUsesSincePadClean;
  895. SelectedBufferData.CrsAUsesSinceSealClean = TmpBufferData.CrsAUsesSinceSealClean;
  896. SelectedBufferData.CrsBId = TmpBufferData.CrsBId;
  897. SelectedBufferData.CrsBTotalUses = TmpBufferData.CrsBTotalUses;
  898. SelectedBufferData.CrsBUsesSincePadClean = TmpBufferData.CrsBUsesSincePadClean;
  899. SelectedBufferData.CrsBUsesSinceSealClean = TmpBufferData.CrsBUsesSinceSealClean;
  900. SelectedBufferData.Enabled = TmpBufferData.Enabled;
  901. SelectedBufferData.CurrentLocation = TmpBufferData.CurrentLocation;
  902. }
  903. }
  904. }