MainWindowViewModel.cs 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421
  1. using Basler.Pylon;
  2. using NPOI.SS.Formula.Functions;
  3. using NPOI.XSSF.Streaming.Values;
  4. using Prism.Commands;
  5. using Prism.Events;
  6. using Prism.Ioc;
  7. using Prism.Mvvm;
  8. using Prism.Regions;
  9. using Prism.Services.Dialogs;
  10. using System;
  11. using System.Collections.Generic;
  12. using System.Collections.ObjectModel;
  13. using System.Globalization;
  14. using System.Linq;
  15. using System.Text;
  16. using System.Text.RegularExpressions;
  17. using System.Threading;
  18. using System.Threading.Tasks;
  19. using System.Windows;
  20. using System.Windows.Controls;
  21. using System.Windows.Controls.Primitives;
  22. using System.Windows.Media;
  23. using TeamAAS_VP.Controls;
  24. using TeamAAS_VP.Core;
  25. using TeamAAS_VP.Data;
  26. using TeamAAS_VP.Enums;
  27. using TeamAAS_VP.Events;
  28. using TeamAAS_VP.Models;
  29. using TeamAAS_VP.Resources.Languages;
  30. using TeamAAS_VP.Views;
  31. using TeamAAS_VP;
  32. using WPFLocalizeExtension.Engine;
  33. using static MaterialDesignThemes.Wpf.Theme.ToolBar;
  34. namespace TeamAAS_VP.ViewModels
  35. {
  36. public class MainWindowViewModel : BindableBase
  37. {
  38. IRegionManager _regionManager;
  39. IRegionNavigationService _regionNavigationService;
  40. IContainerProvider _container;
  41. IDialogService _dialogService;
  42. IEventAggregator _eventAggregator;
  43. private Management management;
  44. private Guid CurrentTime;
  45. private Guid RunTime;
  46. private DateTime StartTime;
  47. private Guid currentUser;
  48. Timer timer;
  49. #region 属性
  50. private string _CompanyTitle;
  51. public string CompanyTitle
  52. {
  53. get { return _CompanyTitle; }
  54. set { SetProperty(ref _CompanyTitle, value); }
  55. }
  56. private string _AppVersion;
  57. public string AppVersion
  58. {
  59. get { return _AppVersion; }
  60. set { SetProperty(ref _AppVersion, value); }
  61. }
  62. private int _NavigationIndex = 0;
  63. public int NavigationIndex
  64. {
  65. get { return _NavigationIndex; }
  66. set { SetProperty(ref _NavigationIndex, value); }
  67. }
  68. private ObservableCollection<StatusInfo> _Status;
  69. public ObservableCollection<StatusInfo> Status
  70. {
  71. get { return _Status; }
  72. set { SetProperty(ref _Status, value); }
  73. }
  74. private string _MyTitle;
  75. public string MyTitle
  76. {
  77. get { return _MyTitle; }
  78. set { SetProperty(ref _MyTitle, value); }
  79. }
  80. #endregion
  81. #region 命令
  82. private DelegateCommand<string> _NavigationCommand;
  83. public DelegateCommand<string> NavigationCommand
  84. {
  85. get { return _NavigationCommand; }
  86. set { _NavigationCommand = value; }
  87. }
  88. public DelegateCommand LoadedCommand { get; set; }
  89. public DelegateCommand ClosedCommand { get; set; }
  90. #endregion
  91. #region 事件
  92. #endregion
  93. public MainWindowViewModel(IRegionManager regionManager, IEventAggregator ea, IRegionNavigationService regionNavigationService, IContainerProvider container, IDialogService dialogService)
  94. {
  95. _regionManager = regionManager;
  96. _regionNavigationService = regionNavigationService;
  97. _container = container;
  98. _dialogService = dialogService;
  99. _eventAggregator= ea;
  100. //订阅权限登录事件
  101. _eventAggregator.GetEvent<UserLoginNotification>().Subscribe(LoginChange);
  102. management = _container.Resolve<Management>();
  103. NavigationCommand = new DelegateCommand<string>(NavigationVoid);
  104. LoadedCommand = new DelegateCommand(OnLoad);
  105. ClosedCommand = new DelegateCommand(OnClose);
  106. Status = management.Status;
  107. }
  108. #region 方法
  109. private void NavigationVoid(string obj)
  110. {
  111. switch (obj)
  112. {
  113. case "Home":
  114. _regionManager.RequestNavigate("MainRegionContext", "HomeView");
  115. NavigationIndex = 0;
  116. break;
  117. case "Products":
  118. _regionManager.RequestNavigate("MainRegionContext", "ProductsView");
  119. NavigationIndex = 1;
  120. break;
  121. case "Debug":
  122. _regionManager.RequestNavigate("MainRegionContext", "DebugView");
  123. NavigationIndex = 2;
  124. break;
  125. case "Setting":
  126. _regionManager.RequestNavigate("MainRegionContext", "SettingView");
  127. NavigationIndex = 3;
  128. break;
  129. case "Calib":
  130. _regionManager.RequestNavigate("MainRegionContext", "CalibrationView");
  131. NavigationIndex = 5;
  132. break;
  133. case "Statistics":
  134. _regionManager.RequestNavigate("MainRegionContext", "StatisticsView");
  135. NavigationIndex = 6;
  136. break;
  137. case "User":
  138. _regionManager.RequestNavigate("MainRegionContext", "UserView");
  139. NavigationIndex = 7;
  140. break;
  141. default:
  142. break;
  143. }
  144. }
  145. private async void OnLoad()
  146. {
  147. var appconfig = FileHelper.ReadApplicationConfiguration();
  148. MyTitle = appconfig.Title;
  149. CompanyTitle = appconfig.CompanyTitle;
  150. AppVersion = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString();
  151. //读取语言
  152. management.ReadLanguageDeviceConfig();
  153. if (management.CurrentLanguage == Enums.Language.ChineseSimplified)
  154. {
  155. var culture = new CultureInfo("zh-CN");
  156. App.Current.Dispatcher.Thread.CurrentCulture = culture;
  157. App.Current.Dispatcher.Thread.CurrentUICulture = culture;
  158. LocalizeDictionary.Instance.Culture = culture;
  159. Lang.Culture = culture;
  160. Application.Current.Resources["DefaultFont"] = new System.Windows.Media.FontFamily("Microsoft YaHei");
  161. }
  162. else if (management.CurrentLanguage == Enums.Language.ChineseTraditional)
  163. {
  164. var culture = new CultureInfo("zh-TW");
  165. App.Current.Dispatcher.Thread.CurrentCulture = culture;
  166. App.Current.Dispatcher.Thread.CurrentUICulture = culture;
  167. LocalizeDictionary.Instance.Culture = culture;
  168. Lang.Culture = culture;
  169. Application.Current.Resources["DefaultFont"] = new System.Windows.Media.FontFamily("Microsoft YaHei");
  170. }
  171. else if (management.CurrentLanguage == Enums.Language.English)
  172. {
  173. var culture = new CultureInfo("en");
  174. App.Current.Dispatcher.Thread.CurrentCulture = culture;
  175. App.Current.Dispatcher.Thread.CurrentUICulture = culture;
  176. LocalizeDictionary.Instance.Culture = culture;
  177. Lang.Culture = culture;
  178. Application.Current.Resources["DefaultFont"] = new System.Windows.Media.FontFamily("Segoe UI");
  179. }
  180. else if (management.CurrentLanguage == Enums.Language.Japanese)
  181. {
  182. var culture = new CultureInfo("ja-JP");
  183. App.Current.Dispatcher.Thread.CurrentCulture = culture;
  184. App.Current.Dispatcher.Thread.CurrentUICulture = culture;
  185. LocalizeDictionary.Instance.Culture = culture;
  186. Lang.Culture = culture;
  187. Application.Current.Resources["DefaultFont"] = new System.Windows.Media.FontFamily("Segoe UI");
  188. }
  189. SendTaskMessage(Lang.软件启动, MessageLevel.Info);
  190. StartTime = DateTime.Now;
  191. _regionManager.RequestNavigate("MainRegionContext", "HomeView");
  192. double max = 14;
  193. double curvalue = 0;
  194. currentUser = Guid.NewGuid();
  195. Status.Add(new StatusInfo(currentUser, $"{Lang.当前用户}:{management.CurrentUser.UserName}[{management.CurrentUser.userPart.ToString()}]", new SolidColorBrush(Colors.White)));
  196. Application.Current.Dispatcher.BeginInvoke(new Action(() => { _dialogService.ShowDialog("UProgressBar", rst => { }); }));
  197. App.Current.Dispatcher.BeginInvoke(new Action(() =>
  198. {
  199. _eventAggregator.GetEvent<ProgressNotification>().Publish(new UProgressBar.ProgressParameter { Maximum = max, Minimum = 0, SubTitle = $"{Lang.初始化中}...", Message = $"{Lang.初始化数据库}...", Value = curvalue });
  200. }));
  201. //-------------------SETP 1: 初始化数据库-----------------------------------------------------------------------
  202. await Task.Delay(200);
  203. //初始化数据库
  204. DatabaseHelper.InitDatabase();
  205. SendTaskMessage($"{Lang.数据库读取完成}!", MessageLevel.Info);
  206. curvalue += 1;
  207. //-------------------SETP 2: 读取配置参数-----------------------------------------------------------------------
  208. App.Current.Dispatcher.BeginInvoke(new Action(() =>
  209. {
  210. _eventAggregator.GetEvent<ProgressNotification>().Publish(new UProgressBar.ProgressParameter { Maximum = max, Minimum = 0, SubTitle = $"{Lang.初始化中}...", Message = $"{Lang.读取配置参数}...", Value = curvalue });
  211. }));
  212. //读取配置参数
  213. management.ReadConfig();
  214. SendTaskMessage($"{Lang.配置参数读取完成}!", MessageLevel.Info);
  215. //-------------------SETP 3: 加载视觉方案-----------------------------------------------------------------------
  216. curvalue += 1;
  217. App.Current.Dispatcher.BeginInvoke(new Action(() =>
  218. {
  219. _eventAggregator.GetEvent<ProgressNotification>().Publish(new UProgressBar.ProgressParameter { Maximum = max, Minimum = 0, SubTitle = $"{Lang.初始化中}...", Message = $"{Lang.加载视觉方案}...", Value = curvalue });
  220. }));
  221. await Application.Current.Dispatcher.BeginInvoke(new Action(() => management.InitVision()));
  222. SendTaskMessage($"{Lang.视觉方案加载完成}!", MessageLevel.Info);
  223. //-------------------SETP 4: 初始化Feeder-----------------------------------------------------------------------
  224. curvalue += 1;
  225. App.Current.Dispatcher.BeginInvoke(new Action(() =>
  226. {
  227. _eventAggregator.GetEvent<ProgressNotification>().Publish(new UProgressBar.ProgressParameter { Maximum = max, Minimum = 0, SubTitle = $"{Lang.初始化中}...", Message = $"{Lang.正在初始化Feeder}...", Value = curvalue });
  228. }));
  229. await management.InitFeeders();
  230. //-------------------SETP 5: 初始化PLC-----------------------------------------------------------------------
  231. curvalue += 1;
  232. App.Current.Dispatcher.BeginInvoke(new Action(() =>
  233. {
  234. _eventAggregator.GetEvent<ProgressNotification>().Publish(new UProgressBar.ProgressParameter { Maximum = max, Minimum = 0, SubTitle = $"{Lang.初始化中}...", Message = $"{Lang.正在初始化PLC}...", Value = curvalue });
  235. }));
  236. await management.InitPlc();
  237. //-------------------SETP 6: 初始化Robot-----------------------------------------------------------------------
  238. curvalue += 1;
  239. App.Current.Dispatcher.BeginInvoke(new Action(() =>
  240. {
  241. _eventAggregator.GetEvent<ProgressNotification>().Publish(new UProgressBar.ProgressParameter { Maximum = max, Minimum = 0, SubTitle = $"{Lang.初始化中}...", Message = $"{Lang.正在初始化机器人}...", Value = curvalue });
  242. }));
  243. await management.InitRobots();
  244. //-------------------SETP 7: 初始化Camera-----------------------------------------------------------------------
  245. curvalue += 1;
  246. App.Current.Dispatcher.BeginInvoke(new Action(() =>
  247. {
  248. _eventAggregator.GetEvent<ProgressNotification>().Publish(new UProgressBar.ProgressParameter { Maximum = max, Minimum = 0, SubTitle = $"{Lang.初始化中}...", Message = $"{Lang.正在初始化相机}...", Value = curvalue });
  249. }));
  250. await management.InitCameras();
  251. //-------------------SETP 8: 加载所有产品-----------------------------------------------------------------------
  252. curvalue += 1;
  253. App.Current.Dispatcher.BeginInvoke(new Action(() =>
  254. {
  255. _eventAggregator.GetEvent<ProgressNotification>().Publish(new UProgressBar.ProgressParameter { Maximum = max, Minimum = 0, SubTitle = $"{Lang.初始化中}...", Message = $"{Lang.加载所有产品}...", Value = curvalue });
  256. }));
  257. management.LoadAllProducts();
  258. //-------------------SETP 9: 加载所有校准-----------------------------------------------------------------------
  259. curvalue += 1;
  260. App.Current.Dispatcher.BeginInvoke(new Action(() =>
  261. {
  262. _eventAggregator.GetEvent<ProgressNotification>().Publish(new UProgressBar.ProgressParameter { Maximum = max, Minimum = 0, SubTitle = $"{Lang.初始化中}...", Message = $"{Lang.加载所有校准}...", Value = curvalue });
  263. }));
  264. management.LoadAllCalibration();
  265. //-------------------SETP 10: 开启服务器监听-----------------------------------------------------------------------
  266. curvalue += 1;
  267. App.Current.Dispatcher.BeginInvoke(new Action(() =>
  268. {
  269. _eventAggregator.GetEvent<ProgressNotification>().Publish(new UProgressBar.ProgressParameter { Maximum = max, Minimum = 0, SubTitle = $"{Lang.初始化中}...", Message = $"{Lang.开启服务器监听}...", Value = curvalue });
  270. }));
  271. management.InitBgTcp();
  272. //-------------------SETP 11: 开启Modbus Tcp-----------------------------------------------------------------------
  273. curvalue += 1;
  274. App.Current.Dispatcher.BeginInvoke(new Action(() =>
  275. {
  276. _eventAggregator.GetEvent<ProgressNotification>().Publish(new UProgressBar.ProgressParameter { Maximum = max, Minimum = 0, SubTitle = $"{Lang.初始化中}...", Message = $"{Lang.正在开启}Modbus TCP Slave...", Value = curvalue });
  277. }));
  278. management.InitModbusTcp();
  279. //-------------------SETP 11b: 开启 Modbus Tcp Master-----------------------------------------------------------------------
  280. curvalue += 1;
  281. App.Current.Dispatcher.BeginInvoke(new Action(() =>
  282. {
  283. _eventAggregator.GetEvent<ProgressNotification>().Publish(new UProgressBar.ProgressParameter { Maximum = max, Minimum = 0, SubTitle = $"{Lang.初始化中}...", Message = $"{Lang.正在开启}Modbus TCP Master...", Value = curvalue });
  284. }));
  285. management.InitModbusTcpMaster();
  286. //-------------------SETP 11b: 开启 Modbus Tcp Master-----------------------------------------------------------------------
  287. curvalue += 1;
  288. App.Current.Dispatcher.BeginInvoke(new Action(() =>
  289. {
  290. _eventAggregator.GetEvent<ProgressNotification>().Publish(new UProgressBar.ProgressParameter { Maximum = max, Minimum = 0, SubTitle = $"{Lang.初始化中}...", Message = $"{Lang.正在开启}Modbus TCP Master...", Value = curvalue });
  291. }));
  292. management.InitEthernetIP();
  293. curvalue += 1;
  294. App.Current.Dispatcher.BeginInvoke(new Action(() =>
  295. {
  296. _eventAggregator.GetEvent<ProgressNotification>().Publish(new UProgressBar.ProgressParameter { Maximum = max, Minimum = 0, SubTitle = $"{Lang.初始化中}...", Message = "正在连接三菱 MC PLC...", Value = curvalue });
  297. }));
  298. management.InitMcCommunicate();
  299. //-------------------SETP 12: 开启后台脚本-----------------------------------------------------------------------
  300. curvalue += 1;
  301. App.Current.Dispatcher.BeginInvoke(new Action(() =>
  302. {
  303. _eventAggregator.GetEvent<ProgressNotification>().Publish(new UProgressBar.ProgressParameter { Maximum = max, Minimum = 0, SubTitle = $"{Lang.初始化中}...", Message = $"{Lang.正在开启后台脚本}...", Value = curvalue });
  304. }));
  305. management.InitBackgroundcript();
  306. //当前日期
  307. CurrentTime = Guid.NewGuid();
  308. Status.Add(new StatusInfo(CurrentTime, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), new SolidColorBrush(Colors.White)));
  309. //当前运行时长
  310. RunTime = Guid.NewGuid();
  311. var run = (DateTime.Now - StartTime);
  312. string formattedTime = string.Format(Lang.已运行时长, (int)run.TotalDays, run.Hours, run.Minutes, run.Seconds);
  313. Status.Add(new StatusInfo(RunTime, formattedTime, new SolidColorBrush(Colors.White)));
  314. timer = new Timer(DoTime, null, 1000, 1000);
  315. curvalue += 1;
  316. App.Current.Dispatcher.BeginInvoke(new Action(() =>
  317. {
  318. _eventAggregator.GetEvent<ProgressNotification>().Publish(new UProgressBar.ProgressParameter { Maximum = max, Minimum = 0, SubTitle = $"{Lang.初始化中}...", Message = $"{Lang.正在加载产品}...", Value = curvalue });
  319. }));
  320. Guid productid= DatabaseHelper.GetLastLoadProduct();
  321. if (productid!=Guid.Empty)
  322. {
  323. var product= management.Products.FirstOrDefault(p=>p.ID== productid);
  324. if (product!=null)
  325. {
  326. management.LoadProducts(product);
  327. DatabaseHelper.AddLoadProductRecord(product.ID, product.Name, true);
  328. }
  329. }
  330. App.Current.Dispatcher.BeginInvoke(new Action(() =>
  331. {
  332. _eventAggregator.GetEvent<ProgressNotification>().Publish(new UProgressBar.ProgressParameter { Maximum = max, Minimum = 0, SubTitle = $"{Lang.初始化中}...", Message = $"{Lang.完成}", Value = -1 });
  333. }));
  334. }
  335. private void OnClose()
  336. {
  337. }
  338. private void SendTaskMessage(string msg,MessageLevel level)
  339. {
  340. _eventAggregator.GetEvent<TaskMessageNotification>().Publish(new Models.MessageStruct() { Message=msg,level= level });
  341. }
  342. private void DoTime(object state)
  343. {
  344. //当前日期
  345. var c = Status.FirstOrDefault(b=>b.ID== CurrentTime);
  346. c.Message = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
  347. //当前运行时长
  348. var d = Status.FirstOrDefault(b => b.ID == RunTime);
  349. var run = (DateTime.Now - StartTime);
  350. d.Message = string.Format(Lang.已运行时长, (int)run.TotalDays, run.Hours, run.Minutes, run.Seconds);
  351. }
  352. private void LoginChange(Models.User user)
  353. {
  354. var us = Status.FirstOrDefault(u => u.ID == currentUser);
  355. if (us != null)
  356. {
  357. us.Message = $"{Lang.当前用户}:{management.CurrentUser.UserName}[{management.CurrentUser.userPart.ToString()}]";
  358. }
  359. }
  360. #endregion
  361. }
  362. }