FeederClearViewModel.cs 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598
  1. using Prism.Commands;
  2. using Prism.Ioc;
  3. using Prism.Mvvm;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using Team.FFFeederService.Interfaces;
  8. using Team.FFFeederService;
  9. using TeamAAS_VP.Core;
  10. using System.Web.Hosting;
  11. using TeamAAS_VP.Views.Product;
  12. using TeamAAS_VP.Models;
  13. using Prism.Events;
  14. using TeamAAS_VP.Events;
  15. using System.Collections.ObjectModel;
  16. using static Org.BouncyCastle.Math.Primes;
  17. using TeamAAS_VP.Enums;
  18. using MaterialDesignThemes.Wpf;
  19. using TeamAAS_VP.Controls;
  20. using TeamAAS_VP;
  21. using System.Windows;
  22. using System.Net.Sockets;
  23. using System.Threading.Tasks;
  24. using System.Threading;
  25. using TeamAAS_VP.Resources.Languages;
  26. namespace TeamAAS_VP.ViewModels.DebugMod
  27. {
  28. public class FeederClearViewModel : BindableBase
  29. {
  30. IContainerProvider _container;
  31. IEventAggregator _eventAggregator;
  32. CancellationTokenSource TokenSource;
  33. #region 属性
  34. public Management management { get; set; }
  35. public FeederService feederService { get; set; }
  36. private IVoiceCoilMotorFeeder _Feeder;
  37. public IVoiceCoilMotorFeeder Feeder
  38. {
  39. get { return _Feeder; }
  40. set
  41. {
  42. SetProperty(ref _Feeder, value);
  43. FeederChangedEvent?.Invoke(value);
  44. }
  45. }
  46. private ObservableCollection<FeederInfo> _Feeders = new ObservableCollection<FeederInfo>();
  47. /// <summary>
  48. /// Feeder参数
  49. /// </summary>
  50. public ObservableCollection<FeederInfo> Feeders
  51. {
  52. get { return _Feeders; }
  53. set { SetProperty(ref _Feeders, value); }
  54. }
  55. private FeederInfo _SelectFeeder;
  56. public FeederInfo SelectFeeder
  57. {
  58. get { return _SelectFeeder; }
  59. set
  60. {
  61. SetProperty(ref _SelectFeeder, value);
  62. if (value != null)
  63. {
  64. if (FeedersClearWork == null)
  65. {
  66. FeedersClearWork = new Dictionary<Guid, ObservableCollection<FeederClearWork>>();
  67. }
  68. if (FeedersClearWork.ContainsKey(value.Id))
  69. {
  70. FeederClearWorks = FeedersClearWork[value.Id];
  71. if (FeederClearWorks == null)
  72. {
  73. FeederClearWorks = new ObservableCollection<FeederClearWork>();
  74. }
  75. }
  76. else
  77. {
  78. FeederClearWorks = new ObservableCollection<FeederClearWork>();
  79. FeedersClearWork.Add(value.Id, FeederClearWorks);
  80. }
  81. SelelctFeederClearWork = null;
  82. }
  83. }
  84. }
  85. private ObservableCollection<FeederClearWork> _FeederClearWorks;
  86. /// <summary>
  87. /// Feeder清料任务集合
  88. /// </summary>
  89. public ObservableCollection<FeederClearWork> FeederClearWorks
  90. {
  91. get { return _FeederClearWorks; }
  92. set { SetProperty(ref _FeederClearWorks, value); }
  93. }
  94. private int _SelectFeederFunctionIndex;
  95. public int SelectFeederFunctionIndex
  96. {
  97. get { return _SelectFeederFunctionIndex; }
  98. set
  99. {
  100. SetProperty(ref _SelectFeederFunctionIndex, value);
  101. if (value >= 0 && value <= 25)
  102. {
  103. SelectFeederFunction = (VibrationFunction)value;
  104. }
  105. else
  106. {
  107. SelectFeederFunction = VibrationFunction.Delay;
  108. }
  109. }
  110. }
  111. private VibrationFunction _SelectFeederFunction;
  112. /// <summary>
  113. /// 选中的feeder振动功能码
  114. /// </summary>
  115. public VibrationFunction SelectFeederFunction
  116. {
  117. get { return _SelectFeederFunction; }
  118. set { SetProperty(ref _SelectFeederFunction, value); }
  119. }
  120. private FeederClearWork _SelelctFeederClearWork;
  121. public FeederClearWork SelelctFeederClearWork
  122. {
  123. get { return _SelelctFeederClearWork; }
  124. set
  125. {
  126. SetProperty(ref _SelelctFeederClearWork, value);
  127. if (value != null)
  128. {
  129. IsCanExecute = true;
  130. }
  131. else
  132. {
  133. IsCanExecute = false;
  134. if (SelectFeeder != null)
  135. {
  136. IsCanSelect = true;
  137. }
  138. else
  139. {
  140. IsCanSelect = false;
  141. }
  142. }
  143. }
  144. }
  145. public Dictionary<Guid, ObservableCollection<FeederClearWork>> FeedersClearWork;
  146. private bool _IsCanExecute = false;
  147. public bool IsCanExecute
  148. {
  149. get { return _IsCanExecute; }
  150. set
  151. {
  152. SetProperty(ref _IsCanExecute, value);
  153. if (value)
  154. {
  155. IsCanEdit = true;
  156. IsCanSelect = true;
  157. }
  158. else
  159. {
  160. IsCanEdit = false;
  161. IsCanSelect = false;
  162. }
  163. }
  164. }
  165. private bool CanCreate
  166. {
  167. get
  168. {
  169. if (SelectFeeder != null && IsCanCreate)
  170. {
  171. return true;
  172. }
  173. else
  174. {
  175. return false;
  176. }
  177. }
  178. }
  179. private bool CanSave
  180. {
  181. get
  182. {
  183. if (SelectFeeder != null && SelelctFeederClearWork != null && IsCanExecute)
  184. {
  185. IsCanEdit = true;
  186. return true;
  187. }
  188. else
  189. {
  190. IsCanEdit = false;
  191. return false;
  192. }
  193. }
  194. }
  195. private bool _IsCanEdit = false;
  196. public bool IsCanEdit
  197. {
  198. get { return _IsCanEdit; }
  199. set { SetProperty(ref _IsCanEdit, value); }
  200. }
  201. private bool _IsCanSelect = true;
  202. public bool IsCanSelect
  203. {
  204. get { return _IsCanSelect; }
  205. set { SetProperty(ref _IsCanSelect, value); }
  206. }
  207. private bool _IsCanCreate = true;
  208. public bool IsCanCreate
  209. {
  210. get { return _IsCanCreate; }
  211. set { SetProperty(ref _IsCanCreate, value); }
  212. }
  213. #endregion
  214. #region 命令
  215. private DelegateCommand _LoadedCommand;
  216. public DelegateCommand LoadedCommand =>
  217. _LoadedCommand ?? (_LoadedCommand = new DelegateCommand(ExecuteLoadedCommand));
  218. private DelegateCommand<object> _StartClearFeederCommand;
  219. public DelegateCommand<object> StartClearFeederCommand =>
  220. _StartClearFeederCommand ?? (_StartClearFeederCommand = new DelegateCommand<object>(ExecuteStartClearFeederCommand).ObservesCanExecute(() => IsCanExecute));
  221. private DelegateCommand<object> _SaveClearTaskCommand;
  222. public DelegateCommand<object> SaveClearTaskCommand =>
  223. _SaveClearTaskCommand ?? (_SaveClearTaskCommand = new DelegateCommand<object>(ExecuteSaveClearTaskCommandName).ObservesCanExecute(() => CanSave).ObservesProperty(() => SelectFeeder).ObservesProperty(() => SelelctFeederClearWork).ObservesProperty(() => IsCanExecute));
  224. private DelegateCommand _AddFunctionCommand;
  225. public DelegateCommand AddFunctionCommand =>
  226. _AddFunctionCommand ?? (_AddFunctionCommand = new DelegateCommand(ExecuteAddFunctionCommand));
  227. private DelegateCommand<object> _RemoveFunctionCommand;
  228. public DelegateCommand<object> RemoveFunctionCommand =>
  229. _RemoveFunctionCommand ?? (_RemoveFunctionCommand = new DelegateCommand<object>(ExecuteRemoveFunctionCommand));
  230. private DelegateCommand<object> _AddClearTaskCommand;
  231. public DelegateCommand<object> AddClearTaskCommand =>
  232. _AddClearTaskCommand ?? (_AddClearTaskCommand = new DelegateCommand<object>(ExecuteAddClearTaskCommand).ObservesCanExecute(() => CanCreate).ObservesProperty(() => SelectFeeder).ObservesProperty(() => IsCanCreate));
  233. private DelegateCommand<object> _RemoveClearTaskCommand;
  234. public DelegateCommand<object> RemoveClearTaskCommand =>
  235. _RemoveClearTaskCommand ?? (_RemoveClearTaskCommand = new DelegateCommand<object>(ExecuteRemoveClearTaskCommand).ObservesCanExecute(() => CanSave).ObservesProperty(() => SelectFeeder).ObservesProperty(() => SelelctFeederClearWork).ObservesProperty(() => IsCanExecute));
  236. #endregion
  237. #region 事件
  238. public event Action<IVoiceCoilMotorFeeder> FeederChangedEvent;
  239. #endregion
  240. public FeederClearViewModel(IContainerProvider container, IEventAggregator ea)
  241. {
  242. _container = container;
  243. _eventAggregator = ea;
  244. //订阅权限登录事件
  245. _eventAggregator.GetEvent<UserLoginNotification>().Subscribe(LoginChange);
  246. }
  247. #region 方法
  248. void ExecuteLoadedCommand()
  249. {
  250. try
  251. {
  252. management = _container.Resolve<Management>();
  253. feederService = management.FeederService;
  254. if (management.CurrentUser.userPart == Enums.UserPart.Operator)
  255. {
  256. IsAllowEdit = false;
  257. }
  258. else
  259. {
  260. IsAllowEdit = true;
  261. }
  262. if (FeedersClearWork == null)
  263. {
  264. FeedersClearWork = management.LoadFeedersClearTask();
  265. }
  266. Feeders = management.DeviceConfig.Feeders;
  267. }
  268. catch (Exception)
  269. {
  270. }
  271. }
  272. /// <summary>
  273. /// 保存清料任务
  274. /// </summary>
  275. /// <param name="feeder"></param>
  276. async void ExecuteSaveClearTaskCommandName(object feeder)
  277. {
  278. try
  279. {
  280. if (SelectFeeder == null)
  281. {
  282. return;
  283. }
  284. if (SelelctFeederClearWork == null)
  285. {
  286. return;
  287. }
  288. if (Feeder == null)
  289. {
  290. Feeder = management.FeederService.GetFeeder(SelectFeeder.Id);
  291. }
  292. //获取并绑定当前Feeder的运行参数
  293. if (Feeder != null && Feeder.IsConnected)
  294. {
  295. foreach (var item in SelelctFeederClearWork.FeederWorks.FeederWorkList)
  296. {
  297. if (item.Function == VibrationFunction.Delay) continue;
  298. var paramCollection = await Feeder.GetShakeGroupValueAsync((int)item.Function);
  299. item.SingleAction = paramCollection;
  300. }
  301. }
  302. management.SaveFeedersClearTask(FeedersClearWork);
  303. MessageBox.Show(Lang.完成);
  304. }
  305. catch (Exception ex)
  306. {
  307. LogHelper.WriteLogError("Feeder清料界面保存振动任务时出错!", ex);
  308. MessageBox.Show(ex.Message);
  309. }
  310. }
  311. /// <summary>
  312. /// 开始清料
  313. /// </summary>
  314. /// <param name="feeder"></param>
  315. async void ExecuteStartClearFeederCommand(object feeder)
  316. {
  317. try
  318. {
  319. if (MessageBox.Show(Lang.是否清料, Lang.Feeder清料, MessageBoxButton.OKCancel, MessageBoxImage.Question) != MessageBoxResult.OK)
  320. {
  321. return;
  322. }
  323. IsCanExecute = false;
  324. IsCanCreate = false;
  325. TokenSource = new CancellationTokenSource();
  326. var view = new WaitingPage();
  327. //show the dialog
  328. DialogHost.Show(view, "RootDialog", null, ExtendedClosingEventHandler, ExtendedClosedEventHandler);
  329. await management.ExecuteFeederClear(SelectFeeder.Id, SelelctFeederClearWork, TokenSource.Token);
  330. if (DialogHost.IsDialogOpen("RootDialog"))
  331. {
  332. TokenSource = null;
  333. DialogHost.Close("RootDialog");
  334. MessageBox.Show(Lang.完成);
  335. }
  336. else
  337. {
  338. TokenSource = null;
  339. }
  340. }
  341. catch (Exception ex)
  342. {
  343. MessageBox.Show(ex.Message);
  344. }
  345. finally
  346. {
  347. IsCanExecute = true;
  348. IsCanCreate = true;
  349. }
  350. }
  351. /// <summary>
  352. /// 增加振动盘振动任务
  353. /// </summary>
  354. async void ExecuteAddFunctionCommand()
  355. {
  356. try
  357. {
  358. if (SelectFeeder == null)
  359. {
  360. return;
  361. }
  362. if (SelelctFeederClearWork == null)
  363. {
  364. return;
  365. }
  366. if (SelectFeederFunction == VibrationFunction.Delay)
  367. {
  368. var view = new AddProduct() { Title = $"{Lang.添加动作}:", Item = $"{Lang.持续时长}(ms)" };
  369. //show the dialog
  370. var result = await DialogHost.Show(view, "RootDialog", null, null, null);
  371. if (result != null && !string.IsNullOrEmpty(result.ToString()) && int.TryParse(result.ToString(), out int time))
  372. {
  373. SelelctFeederClearWork.FeederWorks.Add(new FeederWork() { Step = SelelctFeederClearWork.FeederWorks.Count, Function = SelectFeederFunction, Duration = time });
  374. }
  375. }
  376. else
  377. {
  378. var view = new AddProduct() { Title = $"{Lang.添加动作}:", Item = $"{Lang.持续时长}(ms)" };
  379. //show the dialog
  380. var result = await DialogHost.Show(view, "RootDialog", null, null, null);
  381. if (result != null && !string.IsNullOrEmpty(result.ToString()) && int.TryParse(result.ToString(), out int time))
  382. {
  383. if (Feeder != null && Feeder.IsConnected)
  384. {
  385. var paramCollection = await Feeder.GetShakeGroupValueAsync((int)SelectFeederFunction);
  386. SelelctFeederClearWork.FeederWorks.Add(new FeederWork() { Step = SelelctFeederClearWork.FeederWorks.Count, Function = SelectFeederFunction, Duration = time, SingleAction = paramCollection });
  387. }
  388. else
  389. {
  390. SelelctFeederClearWork.FeederWorks.Add(new FeederWork() { Step = SelelctFeederClearWork.FeederWorks.Count, Function = SelectFeederFunction, Duration = time });
  391. }
  392. }
  393. }
  394. }
  395. catch (Exception ex)
  396. {
  397. LogHelper.WriteLogError("Feeder清料界面增加振动盘任务时出错!", ex);
  398. MessageBox.Show(ex.Message);
  399. }
  400. }
  401. /// <summary>
  402. /// 移除振动盘振动任务
  403. /// </summary>
  404. /// <param name="index"></param>
  405. void ExecuteRemoveFunctionCommand(object index)
  406. {
  407. try
  408. {
  409. if (SelectFeeder == null)
  410. {
  411. return;
  412. }
  413. if (SelelctFeederClearWork == null)
  414. {
  415. return;
  416. }
  417. if (SelelctFeederClearWork.FeederWorks == null || SelelctFeederClearWork.FeederWorks.FeederWorkList == null)
  418. {
  419. return;
  420. }
  421. if ((int)index < 0) return;
  422. SelelctFeederClearWork.FeederWorks.FeederWorkList.RemoveAt((int)index);
  423. }
  424. catch (Exception ex)
  425. {
  426. LogHelper.WriteLogError("Feeder清料界面移除振动盘任务时出错!", ex);
  427. MessageBox.Show(ex.Message);
  428. }
  429. }
  430. /// <summary>
  431. /// 增加清料任务
  432. /// </summary>
  433. /// <param name="feeder"></param>
  434. async void ExecuteAddClearTaskCommand(object feeder)
  435. {
  436. try
  437. {
  438. var view = new AddProduct() { Title = $"{Lang.创建清料任务}:", Item = "Name" };
  439. //show the dialog
  440. var result = await DialogHost.Show(view, "RootDialog", null, null, null);
  441. if (result != null && !string.IsNullOrEmpty(result.ToString()))
  442. {
  443. if (!FileHelper.CheckFileName(result.ToString()))
  444. {
  445. _eventAggregator.GetEvent<SnackbarMessageNotification>().Publish(new MessageParameter() { Msg = Lang.输入的名称不符合文件名命名规则, Duration = 1 });
  446. return;
  447. }
  448. var tk = FeederClearWorks.FirstOrDefault(b => b.Name == result.ToString());
  449. if (tk != null)
  450. {
  451. _eventAggregator.GetEvent<SnackbarMessageNotification>().Publish(new MessageParameter() { Msg = $"{Lang.已存在同名任务}", Duration = 1 });
  452. return;
  453. }
  454. FeederClearWorks.Add(new FeederClearWork()
  455. {
  456. Name = result.ToString(),
  457. CreateTime = DateTime.Now,
  458. BackOutput = VibrationFunction.A,
  459. BeforeScript = false,
  460. BeforeOutput = VibrationFunction.A,
  461. BackScript = false,
  462. ClearCount = 1,
  463. FeederWorks = new FeederWorks(),
  464. VibrationCount = 1
  465. });
  466. FeederClearWorks[FeederClearWorks.Count - 1].FeederWorks.FeederWorkList = new ObservableCollection<FeederWork>();
  467. SelelctFeederClearWork = FeederClearWorks[FeederClearWorks.Count - 1];
  468. management.SaveFeedersClearTask(FeedersClearWork);
  469. }
  470. }
  471. catch (Exception ex)
  472. {
  473. LogHelper.WriteLogError("Feeder清料-新建任务时出错", ex);
  474. MessageBox.Show(ex.Message);
  475. }
  476. }
  477. /// <summary>
  478. /// 移除清料任务
  479. /// </summary>
  480. /// <param name="feeder"></param>
  481. void ExecuteRemoveClearTaskCommand(object feeder)
  482. {
  483. try
  484. {
  485. if (feeder == null)
  486. return;
  487. if (MessageBox.Show(Lang.是否移除清料任务, Lang.移除清料任务, MessageBoxButton.OKCancel, MessageBoxImage.Question) != MessageBoxResult.OK)
  488. {
  489. return;
  490. }
  491. FeederClearWorks.Remove(SelelctFeederClearWork);
  492. SelelctFeederClearWork = null;
  493. management.SaveFeedersClearTask(FeedersClearWork);
  494. _eventAggregator.GetEvent<SnackbarMessageNotification>().Publish(new MessageParameter() { Msg = Lang.完成, Duration = 1 });
  495. }
  496. catch (Exception ex)
  497. {
  498. LogHelper.WriteLogError("Feeder清料-移除任务时出错", ex);
  499. MessageBox.Show(ex.Message);
  500. }
  501. }
  502. private void ExtendedClosingEventHandler(object sender, DialogClosingEventArgs eventArgs)
  503. {
  504. if (TokenSource!=null)
  505. {
  506. TokenSource.Cancel();
  507. }
  508. }
  509. private void ExtendedClosedEventHandler(object sender, DialogClosedEventArgs eventArgs)
  510. {
  511. }
  512. #endregion
  513. private bool _IsAllowEdit = false;
  514. public bool IsAllowEdit
  515. {
  516. get { return _IsAllowEdit; }
  517. set { SetProperty(ref _IsAllowEdit, value); }
  518. }
  519. private void LoginChange(Models.User user)
  520. {
  521. if (user.userPart == Enums.UserPart.Operator)
  522. {
  523. IsAllowEdit = false;
  524. }
  525. else
  526. {
  527. IsAllowEdit = true;
  528. }
  529. }
  530. }
  531. }