MainViewModel.cs 67 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643
  1. using System;
  2. using Prism.Mvvm;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Windows;
  6. using Prism.Commands;
  7. using System.Diagnostics;
  8. using System.Globalization;
  9. using System.Windows.Media;
  10. using SHJX.Service.Control;
  11. using SHJX.Service.Model.Dao;
  12. using System.Threading.Tasks;
  13. using System.Collections.Generic;
  14. using SHJX.Service.Model.Control;
  15. using SHJX.Service.Common.ReadXML;
  16. using SHJX.Service.Common.Extend;
  17. using SHJX.Service.Common.UserColor;
  18. using System.Collections.ObjectModel;
  19. using SHJX.Service.Model.DiaplayModel;
  20. using SHJX.Service.Common.ExtendElement;
  21. using SHJX.Service.Common.UserDelegate;
  22. using SHJX.Service.Control.ServiceController;
  23. using SHJX.Service.Common.Logging;
  24. using Microsoft.Extensions.Logging;
  25. namespace SHJX.Service.ModelView
  26. {
  27. public class MainViewModel : BindableBase
  28. {
  29. private static readonly ILogger logger = LogFactory.BuildLogger(typeof(MainViewModel));
  30. #region Field
  31. private const string ResourcePath = "/SHJX.Service.Resource;component/Resources/";
  32. private static ReadConfigUtil _config;
  33. private readonly MainController _controller;
  34. public readonly MainController Maincontroller;
  35. private static List<SampleDetail> _detailArgs;
  36. #endregion
  37. #region Property
  38. public ObservableCollection<DissolveElementArg> DissolvePositions { get; set; }
  39. public ObservableCollection<SampleDetailElementArg> LeftSampleAreas { get; set; }
  40. public ObservableCollection<SampleDetailElementArg> RightSampleAreas { get; set; }
  41. public ObservableCollection<CenterControlElementArg> CenterControls { get; set; }
  42. /// <summary>
  43. /// 遮蔽层
  44. /// </summary>
  45. private Visibility _hiddenValue;
  46. public Visibility MainHiddenValue
  47. {
  48. get => _hiddenValue;
  49. set => SetProperty(ref _hiddenValue, value);
  50. }
  51. /// <summary>
  52. /// 是否锁定
  53. /// </summary>
  54. private bool? _mainLock;
  55. public bool? WhetherLockMain
  56. {
  57. get => _mainLock;
  58. set => SetProperty(ref _mainLock, value);
  59. }
  60. /// <summary>
  61. /// 是否开启相机检测
  62. /// </summary>
  63. private bool _waterMachine;
  64. public bool WaterMachineOpen
  65. {
  66. get => _waterMachine;
  67. set => SetProperty(ref _waterMachine, value);
  68. }
  69. /// <summary>
  70. /// 是否润洗
  71. /// </summary>
  72. private bool? _wash;
  73. public bool? WhetherWash
  74. {
  75. get => _wash;
  76. set => SetProperty(ref _wash, value);
  77. }
  78. /// <summary>
  79. /// 润洗图标
  80. /// </summary>
  81. private string _washIcon;
  82. public string WashIcon
  83. {
  84. get => _washIcon;
  85. set => SetProperty(ref _washIcon, value);
  86. }
  87. /// <summary>
  88. /// 暂停按钮
  89. /// </summary>
  90. private string _pauseIcon;
  91. public string PauseIcon
  92. {
  93. get => _pauseIcon;
  94. set => SetProperty(ref _pauseIcon, value);
  95. }
  96. /// <summary>
  97. /// 暂停||继续
  98. /// </summary>
  99. private string _pauseText;
  100. public string PauseText
  101. {
  102. get => _pauseText;
  103. set => SetProperty(ref _pauseText, value);
  104. }
  105. /// <summary>
  106. /// 连接名
  107. /// </summary>
  108. private string _clientName;
  109. public string ClientName
  110. {
  111. get => _clientName;
  112. set => SetProperty(ref _clientName, value);
  113. }
  114. /// <summary>
  115. /// 连接状态
  116. /// </summary>
  117. private SolidColorBrush _portClientColor;
  118. public SolidColorBrush PortClientColor
  119. {
  120. get => _portClientColor;
  121. set
  122. {
  123. _portClientColor = value;
  124. _portClientColor.Freeze();
  125. RaisePropertyChanged(nameof(PortClientColor));
  126. }
  127. }
  128. private bool _portClientState;
  129. public bool PortClientState
  130. {
  131. get => _portClientState;
  132. set => SetProperty(ref _portClientState, value);
  133. }
  134. /// <summary>
  135. /// 导出Word图片
  136. /// </summary>
  137. private string _exportWordIcon;
  138. public string ExportWordIcon
  139. {
  140. get => _exportWordIcon;
  141. set => SetProperty(ref _exportWordIcon, value);
  142. }
  143. #endregion
  144. public MainViewModel(ReadConfigUtil config, out int camera)
  145. {
  146. _config = config;
  147. _controller = new MainController(config);
  148. Maincontroller = _controller;
  149. _detailArgs = new List<SampleDetail>();
  150. DissolvePositions = new ObservableCollection<DissolveElementArg>();
  151. LeftSampleAreas = new ObservableCollection<SampleDetailElementArg>();
  152. RightSampleAreas = new ObservableCollection<SampleDetailElementArg>();
  153. CenterControls = new ObservableCollection<CenterControlElementArg>();
  154. BuilderElement();
  155. DataCentre.InitBaseData(_config, out int cameraNum);
  156. camera = cameraNum;
  157. InitData();
  158. RegisterMessager();
  159. PortClient();
  160. StartPreheat();
  161. }
  162. #region InitElement
  163. private void BuilderElement()
  164. {
  165. var areas = _controller.QueryArea();
  166. var tasks = _controller.GetResidueTask();
  167. for (int i = 0; i < 24; i++)
  168. {
  169. DissolveElementArg dissolve = new()
  170. {
  171. Index = i,
  172. UIName = $"R{i + 1}",
  173. };
  174. (from area in areas.Where(item => item.PointName.Equals(dissolve.UIName)).ToList()
  175. select area.Status).ToList().ForEach(item =>
  176. {
  177. if(item==false)
  178. {
  179. dissolve.DisplayText = "N";
  180. }
  181. });
  182. (from task in tasks.Where(item => item.From.Equals(dissolve.UIName)&& item.To.Equals(dissolve.UIName)).ToList()
  183. select task.OriginLocalName).ToList().ForEach(item =>
  184. {
  185. dissolve.DisplayText = item.Replace("A","");
  186. });
  187. DissolvePositions.Add(dissolve);
  188. }
  189. for (int i = 0; i < 24; i++)
  190. {
  191. SampleDetailElementArg detail = new()
  192. {
  193. Index = i,
  194. UIName = $"A{i + 1}",
  195. TagNo = $"{i + 1}",
  196. TagColor = "#99CCCC",
  197. };
  198. LeftSampleAreas.Add(detail);
  199. }
  200. for (int i = 0; i < 24; i++)
  201. {
  202. SampleDetailElementArg detail = new()
  203. {
  204. Index = i,
  205. UIName = $"A{i + 25}",
  206. TagNo = $"{i + 25}",
  207. TagColor = "#99CCCC",
  208. };
  209. RightSampleAreas.Add(detail);
  210. }
  211. (string No, string Name)[] centerValues = new (string No, string Name)[]
  212. {
  213. ("D1", "滴定1"),
  214. ("D2", "滴定2"),
  215. ("J1", "搅拌"),
  216. ("F1", "废液")
  217. };
  218. for (int i = 0; i < 5; i++)
  219. {
  220. CenterControlElementArg detail = new()
  221. {
  222. Index = i,
  223. CenterText = string.Empty,
  224. BackColor = "#99CCCC"
  225. };
  226. if (i + 1 <= centerValues.Length)
  227. {
  228. detail.UIName = centerValues[i].No;
  229. detail.TagText = centerValues[i].Name;
  230. }
  231. else
  232. {
  233. detail.TagText = string.Empty;
  234. detail.UIName = string.Empty;
  235. }
  236. CenterControls.Add(detail);
  237. }
  238. }
  239. #endregion
  240. private int DigestionPositionNumFlag=24;
  241. private void InitData()
  242. {
  243. ChangePauseIcon();
  244. ExportWordIcon = $"{ResourcePath}导出Word.png";
  245. WhetherWash = false;
  246. WhetherLockMain = false;
  247. WaterMachineOpen = false;
  248. MainHiddenValue = Visibility.Hidden;
  249. WashIcon = "/SHJX.Service.Resource;component/Resources/clear_unselected.png";
  250. }
  251. /// <summary>
  252. /// 注册消息
  253. /// </summary>
  254. private void RegisterMessager()
  255. {
  256. try
  257. {
  258. Messager.Register("sample", SetSample);
  259. Messager.Register("TaskOver", TaskOver);
  260. Messager.Register("BD", AddCupBiaoDingBubei);
  261. Messager.Register("ringRadius", SetRingRadius);
  262. Messager.Register("SampleResult", SetSampleResult);
  263. Messager.Register("changeElement", SetElementValue);
  264. Messager.Register("getCupError", getCupErrorMessageBox);
  265. Messager.Register("ExportResultWord", ExportResultWord);
  266. Messager.Register("UpdateElementStatus", UpdateElementStatus);
  267. Messager.Register("UpdateResultValue", ManualUpdateResultValue);
  268. Messager.Register("ReceiveTemplateData", ExecuteReceiveTemplateData);
  269. Messager.Register("ReceiveTemplateDataFromMain", ExecuteReceiveTemplateDataFromMain);
  270. Messager.Register("modifyDataByManual", modifyDataByManual);
  271. }
  272. catch (Exception ex)
  273. {
  274. logger.LogError(ex.Message);
  275. }
  276. }
  277. #region MessagerMethod
  278. /// <summary>
  279. /// 手动设置结果参数
  280. /// </summary>
  281. /// <param name="obj"></param>
  282. private void modifyDataByManual(object obj)
  283. {
  284. try
  285. {
  286. string[] param = (string[])obj;
  287. if (Convert.ToInt32(param[0]) > 48)
  288. return;
  289. if (Convert.ToInt32(param[0]) < 0)
  290. return;
  291. if (Convert.ToInt32(param[0]) > 24)
  292. {
  293. RightSampleAreas[Convert.ToInt32(param[0])-25].Volume = param[1];
  294. RightSampleAreas[Convert.ToInt32(param[0])-25].Result = param[2];
  295. }
  296. else
  297. {
  298. LeftSampleAreas[Convert.ToInt32(param[0])-1].Volume = param[1];
  299. LeftSampleAreas[Convert.ToInt32(param[0])-1].Result = param[2];
  300. }
  301. EquipmentTask task = new EquipmentTask();
  302. task.OriginLocalName = "A" + param[0];
  303. task.Amount = Convert.ToDouble(param[1]);
  304. task.Result = Convert.ToDouble(param[2]);
  305. _controller.UpdateTaskState(task); ;
  306. //var res = obj as Dictionary<string, string>;
  307. //var leftSample = LeftSampleAreas.FirstOrDefault(item => item.UIName.Equals(res?["LocalName"]));
  308. //if (leftSample is not null)
  309. //{
  310. // LeftSampleAreas[leftSample.Index].Volume = res?["Volume"];
  311. // LeftSampleAreas[leftSample.Index].Result = res?["Result"];
  312. //}
  313. //var rightSample = RightSampleAreas.FirstOrDefault(item => item.UIName.Equals(res?["LocalName"]));
  314. //if (rightSample is not null)
  315. //{
  316. // RightSampleAreas[rightSample.Index].Volume = res?["Volume"];
  317. // RightSampleAreas[rightSample.Index].Result = res?["Result"];
  318. //}
  319. }
  320. catch
  321. { }
  322. }
  323. public void ExecuteReceiveTemplateData(object obj)
  324. {
  325. if (obj is List<SampleDetail> list)
  326. {
  327. _detailArgs = list;
  328. }
  329. foreach (var sampleDetail in _detailArgs)
  330. {
  331. var leftSample = LeftSampleAreas.FirstOrDefault(item => item.UIName.Equals(sampleDetail.NodeName));
  332. if (leftSample is not null)
  333. {
  334. LeftSampleAreas[leftSample.Index].DetailInfo = sampleDetail.Detail;
  335. LeftSampleAreas[leftSample.Index].TagColor = sampleDetail.Concentration.Equals("高") ? "#6699CC" : "#99CCFF";
  336. }
  337. var rightSample = RightSampleAreas.FirstOrDefault(item => item.UIName.Equals(sampleDetail.NodeName));
  338. if (rightSample is not null)
  339. {
  340. RightSampleAreas[rightSample.Index].DetailInfo = sampleDetail.Detail;
  341. RightSampleAreas[rightSample.Index].TagColor = sampleDetail.Concentration.Equals("高") ? "#6699CC" : "#99CCFF";
  342. }
  343. }
  344. }
  345. public void ExecuteReceiveTemplateDataFromMain(object obj)
  346. {
  347. var samples = obj as Action<List<SampleDetail>>;
  348. samples?.Invoke(_detailArgs);
  349. }
  350. /// <summary>
  351. /// 设置样品值
  352. /// </summary>
  353. /// <param name="obj"></param>
  354. private void SetSample(object obj)
  355. {
  356. try
  357. {
  358. if (obj is not SampleDetail arg) return;
  359. var detail = _detailArgs.FirstOrDefault(item => item.NodeName.Equals(arg.NodeName));
  360. if (detail is not null) _detailArgs.Remove(detail);
  361. if (arg.WhetherSend!)
  362. {
  363. _detailArgs.Add(arg);
  364. }
  365. var leftSample = LeftSampleAreas.FirstOrDefault(item => item.UIName.Equals(arg.NodeName));
  366. if (leftSample is not null)
  367. {
  368. LeftSampleAreas[leftSample.Index].DetailInfo = arg.WhetherSend ? arg.Detail : string.Empty;
  369. LeftSampleAreas[leftSample.Index].TagColor = arg.WhetherSend ? detail?.TaskSendOk ?? false ? "#ff99cc" :
  370. arg.Concentration.Equals("高") ? "#6699CC" : "#99CCFF"
  371. : "#99CCCC";
  372. }
  373. var rightSample = RightSampleAreas.FirstOrDefault(item => item.UIName.Equals(arg.NodeName));
  374. if (rightSample is not null)
  375. {
  376. RightSampleAreas[rightSample.Index].DetailInfo = arg.WhetherSend ? arg.Detail : string.Empty;
  377. RightSampleAreas[rightSample.Index].TagColor = arg.WhetherSend ? detail?.TaskSendOk ?? false ? "#ff99cc" :
  378. arg.Concentration.Equals("高") ? "#6699CC" : "#99CCFF"
  379. : "#99CCCC";
  380. }
  381. }
  382. catch (Exception ex)
  383. {
  384. logger.LogError(ex.ToString());
  385. }
  386. }
  387. /// <summary>
  388. /// 任务结束
  389. /// </summary>
  390. /// <param name="obj"></param>
  391. private void TaskOver(object obj)
  392. {
  393. try
  394. {
  395. _config.UpdateIsAddCupBiaoDingBubei("False");
  396. Action action = () => UMessageBox.Info("任务已结束");
  397. List<string> names = new() { "MotorX", "MotorY" };
  398. names.ForEach(async item =>
  399. {
  400. var res = await _controller.StartEquipmentGoBackAsync();
  401. if (res)
  402. {
  403. action = () => UMessageBox.InfoTip($"{item}返回原地成功");
  404. }
  405. });
  406. }
  407. catch (Exception ex)
  408. {
  409. logger.LogError(ex.ToString());
  410. }
  411. }
  412. private void AddCupBiaoDingBubei(object obj)
  413. {
  414. try
  415. {
  416. if (_config.IsAddCupBiaoDingBubei)
  417. {
  418. List<EquipmentTask> samplesBD = _controller.CheckExistTaskBD((string)obj);
  419. List<SampleDetail> samples = new List<SampleDetail>();
  420. foreach (var sample in samplesBD)
  421. {
  422. SampleDetail detailArgs = new SampleDetail()
  423. {
  424. NodeName = sample.OriginLocalName,
  425. Detail = "补杯",
  426. HgSO4 = 0,
  427. SampleType = "补杯",
  428. Concentration = "低",
  429. WhetherSend = true,
  430. };
  431. samples.Add(detailArgs);
  432. _detailArgs.Remove(_detailArgs.FirstOrDefault(item => item.NodeName.Equals(sample.OriginLocalName)));
  433. _detailArgs.Add(detailArgs);
  434. }
  435. var resInfo = _controller.SendSampleToControl(samples, (string)obj);
  436. //标定当补杯显示上的处理
  437. //for (int i = 0; i < 24; i++)
  438. //{
  439. // var leftSample = (from SampleDetail items in samples where items.NodeName == LeftSampleAreas[i].UIName select items).FirstOrDefault();
  440. // if (leftSample is not null)
  441. // {
  442. // LeftSampleAreas[i].DetailInfo = leftSample.Detail + "(补)";
  443. // LeftSampleAreas[i].TagColor = "#ffcccc";
  444. // }
  445. // var rightSample = (from SampleDetail items in samples where items.NodeName == RightSampleAreas[i].UIName select items).FirstOrDefault();
  446. // if (rightSample is not null)
  447. // {
  448. // RightSampleAreas[i].DetailInfo = rightSample.Detail + "(补)";
  449. // RightSampleAreas[i].TagColor = "#ffcccc";
  450. // }
  451. //}
  452. }
  453. }
  454. catch (Exception ex)
  455. {
  456. logger.LogError(ex.ToString());
  457. }
  458. }
  459. /// <summary>
  460. /// 更新进度条
  461. /// </summary>
  462. /// <param name="obj"></param>
  463. private void SetRingRadius(object obj)
  464. {
  465. try
  466. {
  467. var data = obj as Dictionary<string, object>;
  468. (data?["value2"] as List<string>)?.ForEach(item =>
  469. {
  470. var dissolve = DissolvePositions.FirstOrDefault(arg => arg.UIName.Equals(item));
  471. if (dissolve is not null)
  472. {
  473. DissolvePositions[dissolve.Index].DisplayValue = Convert.ToDouble(data["value1"]) * 100;
  474. }
  475. });
  476. }
  477. catch (Exception ex)
  478. {
  479. logger.LogError(ex.Message);
  480. }
  481. }
  482. private void getCupErrorMessageBox(object obj)
  483. {
  484. try
  485. {
  486. _controller.zBackToPoint();
  487. EquipmentTask task = (EquipmentTask)obj;
  488. var strValue = "没有检测到杯子,任务已暂停!\n请点“继续任务”进行下一步骤!";
  489. _controller.StopHeatingTemperature();
  490. _config.UpdateTaskRunning(false);
  491. ChangePauseIcon();
  492. logger.LogInformation(strValue);
  493. MessageBox.Show(strValue);
  494. var centerArea = CenterControls.FirstOrDefault(item => item.UIName.Equals(task.From));
  495. if (centerArea is not null)
  496. {
  497. centerArea.BackColor = "#FFCCCC";
  498. centerArea.CenterText = task.OriginLocalName.Replace("A", string.Empty);
  499. }
  500. var dissoArea = DissolvePositions.FirstOrDefault(item => item.UIName.Equals(task.From));
  501. if (dissoArea is not null)
  502. {
  503. dissoArea.DisplayText = "N";
  504. }
  505. //dissoArea. = "#99CCCC";
  506. task.To.UpdateAreaPointState();
  507. var leftSample = LeftSampleAreas.FirstOrDefault(item => item.UIName.Equals(task.OriginLocalName));
  508. if (leftSample is not null)
  509. {
  510. LeftSampleAreas[leftSample.Index].TagColor = "#99CCCC";
  511. }
  512. var rightSample = RightSampleAreas.FirstOrDefault(item => item.UIName.Equals(task.OriginLocalName));
  513. if (rightSample is not null)
  514. {
  515. RightSampleAreas[rightSample.Index].TagColor = "#99CCCC";
  516. }
  517. _detailArgs.Remove(_detailArgs.FirstOrDefault(item => item.NodeName.Equals(task.OriginLocalName)));
  518. CancelCache.Set(task.OriginLocalName, "Cancel");
  519. _controller.QuerydeledeEmptyCupTask(task.OriginLocalName);
  520. }
  521. catch (Exception ex)
  522. {
  523. logger.LogError(ex.Message);
  524. }
  525. }
  526. /// <summary>
  527. /// 样品结果
  528. /// </summary>
  529. /// <param name="obj"></param>
  530. private void SetSampleResult(object obj)
  531. {
  532. try
  533. {
  534. var res = obj as Dictionary<string, string>;
  535. var leftSample = LeftSampleAreas.FirstOrDefault(item => item.UIName.Equals(res?["LocalName"]));
  536. if (leftSample is not null)
  537. {
  538. LeftSampleAreas[leftSample.Index].Volume = res?["Volume"];
  539. LeftSampleAreas[leftSample.Index].Result = res?["Result"] == "0" ? "NULL" : res?["Result"];
  540. }
  541. var rightSample = RightSampleAreas.FirstOrDefault(item => item.UIName.Equals(res?["LocalName"]));
  542. if (rightSample is not null)
  543. {
  544. RightSampleAreas[rightSample.Index].Volume = res?["Volume"];
  545. RightSampleAreas[rightSample.Index].Result = res?["Result"] == "0" ? "NULL" : res?["Result"];
  546. }
  547. }
  548. catch (Exception ex)
  549. {
  550. logger.LogError(ex.Message);
  551. }
  552. }
  553. /// <summary>
  554. /// 设置界面元素的值
  555. /// </summary>
  556. /// <param name="obj"></param>
  557. private void SetElementValue(object obj)
  558. {
  559. try
  560. {
  561. var data = (Dictionary<string, string>)obj;
  562. switch (data["type"])
  563. {
  564. case "IC":
  565. SetInClearPosition(data);
  566. break;
  567. case "OC":
  568. SetOutCleatPosition(data);
  569. break;
  570. case "IS":
  571. SetInStirPosition(data);
  572. break;
  573. case "OS":
  574. SetOutStirPosition(data);
  575. break;
  576. case "IT":
  577. SetInTitrationPosition(data);
  578. break;
  579. case "OT":
  580. SetOutTitrationPosition(data);
  581. break;
  582. case "TtS":
  583. SetTitrationToSample(data);
  584. break;
  585. }
  586. }
  587. catch (Exception ex)
  588. {
  589. logger.LogError(ex.Message);
  590. }
  591. }
  592. /// <summary>
  593. /// 导出结果
  594. /// </summary>
  595. /// <param name="obj"></param>
  596. private void ExportResultWord(object obj)
  597. {
  598. //导出结果
  599. ExportResultToWord(obj.ToString());
  600. }
  601. /// <summary>
  602. /// 更新结果值
  603. /// </summary>
  604. /// <param name="obj"></param>
  605. private void ManualUpdateResultValue(object obj)
  606. {
  607. try
  608. {
  609. if (obj is not Dictionary<string, object> value) return;
  610. var waveKey = value["waveKey"].ToString(); //_controller.GetWavekey();
  611. var tasks = _controller.GetUpdateValue(waveKey, value["valuetype"].ToString());
  612. if (!tasks.Any())
  613. {
  614. UMessageBox.SingleBtnInfo("未找到对应任务,无法修改!");
  615. return;
  616. }
  617. var bdValue = value["valuetype"].ToString() switch
  618. {
  619. "Low" => 0.125 / Convert.ToDouble(value["bd"]),
  620. "High" => 1.25 / Convert.ToDouble(value["bd"]),
  621. _ => throw new ArgumentNullException(value["valuetype"].ToString())
  622. };
  623. bdValue = Math.Round(bdValue, 5);
  624. (from kbTaskName in tasks.Where(item => item.TaskType.Equals("水样")).ToList()
  625. select kbTaskName.OriginLocalName).ToList().ForEach(nodeName =>
  626. {
  627. var task = tasks.FirstOrDefault(equipmentTask => equipmentTask.OriginLocalName.Trim().Equals(nodeName));
  628. //计算参数 C:硫酸亚铁铵浓度
  629. Debug.Assert(task != null, nameof(task) + " != null");
  630. var avgValue = ((bdValue * (Convert.ToDouble(value["kb"]) - task.Amount) * 8000) / 10) * task.GetSampleMultiple;
  631. avgValue = Convert.ToDouble(Math.Round(avgValue, 2));
  632. var leftSample = LeftSampleAreas.FirstOrDefault(item => item.UIName.Equals(nodeName));
  633. if (leftSample is not null)
  634. {
  635. LeftSampleAreas[leftSample.Index].Volume = Math.Round(task.Amount,2).ToString();
  636. LeftSampleAreas[leftSample.Index].Result = avgValue > 0 ? avgValue.ToString() : "NULL";
  637. }
  638. var rightSample = RightSampleAreas.FirstOrDefault(item => item.UIName.Equals(nodeName));
  639. if (rightSample is not null)
  640. {
  641. RightSampleAreas[rightSample.Index].Volume = Math.Round(task.Amount, 2).ToString();
  642. RightSampleAreas[rightSample.Index].Result = avgValue > 0 ? avgValue.ToString() : "NULL";
  643. }
  644. //EquipmentTask et = new EquipmentTask();
  645. //et = task;
  646. task.Result = avgValue > 0 ? avgValue : 0;
  647. DataCentre._dataManager.Update<EquipmentTask>(task);
  648. });
  649. }
  650. catch (Exception ex)
  651. {
  652. logger.LogError(ex.ToString());
  653. }
  654. }
  655. /// <summary>
  656. /// 更新元素状态
  657. /// </summary>
  658. /// <param name="obj"></param>
  659. private void UpdateElementStatus(object obj)
  660. {
  661. try
  662. {
  663. var area = obj as EquipmentArea;
  664. Debug.Assert(area != null, nameof(area) + " != null");
  665. var color = area.Status ? area.PointName.In("Z1", "D1", "D2", "J1", "F1", "H1") ? UColor.DeepSkyBlue : UColor.SteelBlue : UColor.DarkOrange;
  666. var areas = new List<EquipmentArea>() { area };
  667. SetDisableElement(areas, color);
  668. }
  669. catch (Exception ex)
  670. {
  671. logger.LogError(ex.ToString());
  672. }
  673. }
  674. #endregion
  675. #region Set ElementValue
  676. /// <summary>
  677. /// 进入消解位
  678. /// </summary>
  679. /// <param name="data"></param>
  680. private void SetInClearPosition(Dictionary<string, string> data)
  681. {
  682. try
  683. {
  684. var dissolve = DissolvePositions.FirstOrDefault(item => item.UIName.Equals(data["to"]));
  685. if (dissolve is not null)
  686. {
  687. DissolvePositions[dissolve.Index].DisplayText = data["localName"];
  688. //if (data["localName"] == "补杯")
  689. //{
  690. // DissolveElement.txt_dissolve_show = 11;
  691. // //DissolvePositions[dissolve.Index] = "#FFCCCC";
  692. //}
  693. }
  694. }
  695. catch (Exception ex)
  696. {
  697. logger.LogError(ex.ToString());
  698. }
  699. }
  700. /// <summary>
  701. /// 离开消解位
  702. /// </summary>
  703. /// <param name="data"></param>
  704. private void SetOutCleatPosition(Dictionary<string, string> data)
  705. {
  706. try
  707. {
  708. var dissolve = DissolvePositions.FirstOrDefault(item => item.UIName.Equals(data["from"]));
  709. if (dissolve is not null)
  710. {
  711. DissolvePositions[dissolve.Index].DisplayValue = 0;
  712. DissolvePositions[dissolve.Index].DisplayText = string.Empty;
  713. }
  714. }
  715. catch (Exception ex)
  716. {
  717. logger.LogError(ex.ToString());
  718. }
  719. }
  720. /// <summary>
  721. /// 进入搅拌位
  722. /// </summary>
  723. /// <param name="data"></param>
  724. private void SetInStirPosition(Dictionary<string, string> data)
  725. {
  726. try
  727. {
  728. if (data == null) throw new ArgumentNullException(nameof(data));
  729. var center = CenterControls.FirstOrDefault(item => item.UIName.Equals(data["to"]));
  730. if (center is not null)
  731. {
  732. CenterControls[center.Index].BackColor = "#FFCCCC";
  733. CenterControls[center.Index].CenterText = data["localName"];
  734. }
  735. }
  736. catch (Exception ex)
  737. {
  738. logger.LogError(ex.ToString());
  739. }
  740. }
  741. /// <summary>
  742. /// 离开搅拌位
  743. /// </summary>
  744. /// <param name="data"></param>
  745. private void SetOutStirPosition(Dictionary<string, string> data)
  746. {
  747. try
  748. {
  749. if (data == null) throw new ArgumentNullException(nameof(data));
  750. var center = CenterControls.FirstOrDefault(item => item.UIName.Equals(data["from"]));
  751. if (center is not null)
  752. {
  753. CenterControls[center.Index].BackColor = "#99CCCC";
  754. CenterControls[center.Index].CenterText = string.Empty;
  755. }
  756. }
  757. catch (Exception ex)
  758. {
  759. logger.LogError(ex.ToString());
  760. }
  761. }
  762. /// <summary>
  763. /// 进入滴定位
  764. /// </summary>
  765. /// <param name="data"></param>
  766. private void SetInTitrationPosition(Dictionary<string, string> data)
  767. {
  768. try
  769. {
  770. if (data == null) throw new ArgumentNullException(nameof(data));
  771. var center = CenterControls.FirstOrDefault(item => item.UIName.Equals(data["to"]));
  772. if (center is not null)
  773. {
  774. CenterControls[center.Index].BackColor = "#FFCCCC";
  775. CenterControls[center.Index].CenterText = data["localName"];
  776. }
  777. }
  778. catch (Exception ex)
  779. {
  780. logger.LogError(ex.ToString());
  781. }
  782. }
  783. /// <summary>
  784. /// 离开滴定位
  785. /// </summary>
  786. /// <param name="data"></param>
  787. private void SetOutTitrationPosition(Dictionary<string, string> data)
  788. {
  789. try
  790. {
  791. if (data == null) throw new ArgumentNullException(nameof(data));
  792. var center = CenterControls.FirstOrDefault(item => item.UIName.Equals(data["from"]));
  793. if (center is not null)
  794. {
  795. CenterControls[center.Index].BackColor = "#99CCCC";
  796. CenterControls[center.Index].CenterText = string.Empty;
  797. }
  798. }
  799. catch (Exception ex)
  800. {
  801. logger.LogError(ex.ToString());
  802. }
  803. }
  804. /// <summary>
  805. /// 滴定位回样品位
  806. /// </summary>
  807. /// <param name="data"></param>
  808. private void SetTitrationToSample(Dictionary<string, string> data)
  809. {
  810. try
  811. {
  812. if (data == null) throw new ArgumentNullException(nameof(data));
  813. var leftSample = LeftSampleAreas.FirstOrDefault(item => item.UIName.Equals(data["to"]));
  814. if (leftSample is not null)
  815. {
  816. if (data["level"] == "Low")
  817. LeftSampleAreas[leftSample.Index].TagColor = "#99CCCC";
  818. else
  819. LeftSampleAreas[leftSample.Index].TagColor = "#6699CC";
  820. if (LeftSampleAreas[leftSample.Index].DetailInfo == "补杯")
  821. {
  822. LeftSampleAreas[leftSample.Index].DetailInfo = "";
  823. }
  824. }
  825. var rightSample = RightSampleAreas.FirstOrDefault(item => item.UIName.Equals(data["to"]));
  826. if (rightSample is not null)
  827. {
  828. if (data["level"] == "Low")
  829. RightSampleAreas[rightSample.Index].TagColor = "#99CCCC";
  830. else
  831. RightSampleAreas[rightSample.Index].TagColor = "#6699CC";
  832. if (RightSampleAreas[rightSample.Index].DetailInfo == "补杯")
  833. {
  834. RightSampleAreas[rightSample.Index].DetailInfo = "";
  835. }
  836. }
  837. _detailArgs.Remove(_detailArgs.FirstOrDefault(item => item.NodeName.Equals(data["to"])));
  838. }
  839. catch (Exception ex)
  840. {
  841. logger.LogError(ex.ToString());
  842. }
  843. }
  844. #endregion
  845. #region Extend Method
  846. /// <summary>
  847. /// 页面加载
  848. /// </summary>
  849. /// <param name="sender"></param>
  850. /// <param name="e"></param>
  851. public async void MainLoaded(object sender, EventArgs e)
  852. {
  853. try
  854. {
  855. //询问是否需要返回原点
  856. if (UMessageBox.Info("设备是否需要返回原点?").Equals(MessageBoxResult.Yes))
  857. {
  858. var gobackResult = await _controller.StartEquipmentGoBackAsync();
  859. UMessageBox.SingleBtnInfo($"返回原点{(gobackResult ? "成功" : "失败")}");
  860. }
  861. var washTasks = _controller.GetResidueWashTasks();
  862. if (washTasks.Any())
  863. {
  864. if (UMessageBox.Info("当前还有剩余润洗任务未执行完成,请问是否需要继续执行?").Equals(MessageBoxResult.No))
  865. {
  866. _controller.DeleteResidueTask(washTasks);
  867. }
  868. }
  869. //加载的时候需要去检索是否还有正在执行的相应任务
  870. var tasks = _controller.GetResidueTask();
  871. foreach (var task in tasks)
  872. {
  873. SampleDetail detailArgs = new SampleDetail()
  874. {
  875. NodeName = task.OriginLocalName,
  876. Detail = task.TaskDetailName,
  877. HgSO4 = task.HgSO4Volume,
  878. SampleType = task.TaskType,
  879. Concentration = task.SampleConcentration,
  880. WhetherSend = true,
  881. };
  882. _detailArgs.Add(detailArgs);
  883. }
  884. if (tasks.Any())
  885. {
  886. if (UMessageBox.Info("当前还有剩余任务未执行完成,请问是否需要继续执行?").Equals(MessageBoxResult.Yes))
  887. {
  888. tasks.Where(item => item.Status.Equals(TaskState.New) || item.Status.Equals(TaskState.Doing)).ToList().ForEach(task =>
  889. {
  890. var leftSample = LeftSampleAreas.FirstOrDefault(item => item.UIName.Equals(task.OriginLocalName));
  891. if (leftSample is not null)
  892. {
  893. LeftSampleAreas[leftSample.Index].TagColor = "#ff99cc";
  894. LeftSampleAreas[leftSample.Index].DetailInfo = task.TaskDetailName;
  895. if (task.TaskDetailName == "补杯")
  896. {
  897. LeftSampleAreas[leftSample.Index].TagColor = "#ffcccc";
  898. }
  899. }
  900. var rightSample = RightSampleAreas.FirstOrDefault(item => item.UIName.Equals(task.OriginLocalName));
  901. if (rightSample is not null)
  902. {
  903. RightSampleAreas[rightSample.Index].TagColor = "#ff99cc";
  904. RightSampleAreas[rightSample.Index].DetailInfo = task.TaskDetailName;
  905. if (task.TaskDetailName == "补杯")
  906. {
  907. RightSampleAreas[rightSample.Index].TagColor = "#ffcccc";
  908. }
  909. }
  910. });
  911. tasks.Where(item => item.Status.Equals(TaskState.Finished)).ToList().ForEach(task =>
  912. {
  913. var leftSample = LeftSampleAreas.FirstOrDefault(item => item.UIName.Equals(task.OriginLocalName));
  914. if (leftSample is not null)
  915. {
  916. LeftSampleAreas[leftSample.Index].TagColor = "#99CCCC";
  917. LeftSampleAreas[leftSample.Index].DetailInfo = task.TaskDetailName;
  918. LeftSampleAreas[leftSample.Index].Volume = task.Amount.ToString(CultureInfo.InvariantCulture);
  919. LeftSampleAreas[leftSample.Index].Result = task.Udf1 ?? string.Empty;
  920. }
  921. var rightSample = RightSampleAreas.FirstOrDefault(item => item.UIName.Equals(task.OriginLocalName));
  922. if (rightSample is not null)
  923. {
  924. RightSampleAreas[rightSample.Index].TagColor = "#99CCCC";
  925. RightSampleAreas[rightSample.Index].DetailInfo = task.TaskDetailName;
  926. RightSampleAreas[rightSample.Index].Volume = task.Amount.ToString(CultureInfo.InvariantCulture);
  927. RightSampleAreas[rightSample.Index].Result = task.Udf1 ?? string.Empty;
  928. }
  929. });
  930. }
  931. else
  932. {
  933. _detailArgs.Clear();
  934. _controller.DeleteResidueTask(tasks);
  935. //询问加热棒状态是否更改
  936. if (_controller.CheckHeatingIsRunning())
  937. {
  938. if (UMessageBox.Info("当前加热状态正在执行,请问是否取消?").Equals(MessageBoxResult.Yes))
  939. {
  940. var res = _controller.UpdateHeatingIsRunning();
  941. UMessageBox.InfoTip($"取消{(res ? "成功" : "失败")}");
  942. }
  943. }
  944. }
  945. }
  946. var areas = _controller.QueryArea();
  947. SetDisableElement(areas, UColor.DarkOrange);
  948. SetRingBarVisiable();
  949. DataCentre.GetTimer.Start();
  950. }
  951. catch (Exception ex)
  952. {
  953. logger.LogError(ex.Message);
  954. }
  955. }
  956. private void SetRingBarVisiable()
  957. {
  958. try
  959. {
  960. var heatTasks = _controller.GetHeatAtPresent();
  961. heatTasks?.ForEach(task =>
  962. {
  963. var dissolve = DissolvePositions.FirstOrDefault(item => item.UIName.Equals(task.Item1));
  964. if (dissolve is not null)
  965. {
  966. DissolvePositions[dissolve.Index].DisplayText = task.Item2;
  967. }
  968. });
  969. }
  970. catch (Exception ex)
  971. {
  972. logger.LogError(ex.Message);
  973. }
  974. }
  975. /// <summary>
  976. /// 启动预热
  977. /// </summary>
  978. private async void StartPreheat()
  979. {
  980. if (!_config.OpenAppStartHeat) return;
  981. await Task.Factory.StartNew(() =>
  982. {
  983. _controller.WritePreheatTemperature();
  984. });
  985. }
  986. /// <summary>
  987. /// 导出结果
  988. /// </summary>
  989. /// <returns></returns>
  990. ///
  991. private async void ExportResultToWord(string waveKey, Action action = null)
  992. {
  993. try
  994. {
  995. ExportWordIcon = string.Concat(ResourcePath, "等待.gif");
  996. if (await _controller.ConvertWordAsync(waveKey))
  997. {
  998. action?.Invoke();
  999. }
  1000. ExportWordIcon = string.Concat(ResourcePath, "导出Word.png");
  1001. }
  1002. catch (Exception ex)
  1003. {
  1004. //UMessageBox.ErrorTip($"导出Word失败,失败原因:{ex.Message}");
  1005. logger.LogError($"导出Word失败,失败原因:{ex}");
  1006. }
  1007. }
  1008. /// <summary>
  1009. /// 不可用控件
  1010. /// </summary>
  1011. private void SetDisableElement(List<EquipmentArea> areas, SolidColorBrush solidColor)
  1012. {
  1013. try
  1014. {
  1015. (from area in areas.Where(item => item.AreaName.Equals("DigestionPosition")).ToList()
  1016. select area.PointName).ToList().ForEach(item =>
  1017. {
  1018. //if (_ringBars.TryGetValue(item, out var ringBar))
  1019. //{
  1020. // ringBar.CenterColor = solidColor;
  1021. //};
  1022. });
  1023. (from area in areas.Where(item => item.AreaName.Equals("DigestionPosition")).ToList()
  1024. select area.PointName).ToList().ForEach(item =>
  1025. {
  1026. var dissolve = DissolvePositions.FirstOrDefault(it => it.UIName.Equals(item));
  1027. if (dissolve is not null && areas[0].Status)
  1028. {
  1029. DissolvePositions[dissolve.Index].DisplayText = "";
  1030. }
  1031. if (dissolve is not null && !areas[0].Status)
  1032. {
  1033. DissolvePositions[dissolve.Index].DisplayText = "N";
  1034. }
  1035. });
  1036. (from area in areas.Where(item => item.AreaName.Equals("TitrationPosition")).ToList()
  1037. select area.PointName).ToList().ForEach(item =>
  1038. {
  1039. if (item.Equals("D1"))
  1040. {
  1041. var Titration = CenterControls.FirstOrDefault(item => item.UIName.Equals("D1"));
  1042. if (Titration is not null && areas.FirstOrDefault(item => item.PointName.Equals("D1")).Status)
  1043. {
  1044. Titration.BackColor = "#99CCCC";
  1045. }
  1046. if (Titration is not null && !areas[0].Status)
  1047. {
  1048. Titration.BackColor = "#FFCCCC";
  1049. }
  1050. }
  1051. if (item.Equals("D2"))
  1052. {
  1053. var Titration = CenterControls.FirstOrDefault(item => item.UIName.Equals("D2"));
  1054. if (Titration is not null && areas.FirstOrDefault(item => item.PointName.Equals("D2")).Status)
  1055. {
  1056. Titration.BackColor = "#99CCCC";
  1057. }
  1058. if (Titration is not null && !areas[0].Status)
  1059. {
  1060. Titration.BackColor = "#FFCCCC";
  1061. }
  1062. }
  1063. });
  1064. (from area in areas.Where(item => item.AreaName.Equals("StirPosition")).ToList()
  1065. select area.PointName).ToList().ForEach(item =>
  1066. {
  1067. var StirData = CenterControls.FirstOrDefault(item => item.UIName.In("J1"));
  1068. if (StirData is not null && areas[0].Status)
  1069. {
  1070. StirData.BackColor = "#99CCCC";
  1071. }
  1072. if (StirData is not null && !areas[0].Status)
  1073. {
  1074. StirData.BackColor = "#FFCCCC";
  1075. }
  1076. });
  1077. (from pos in (from area in areas where area.AreaName.Equals("LiquidWastePosition") select area).ToList()
  1078. select pos.PointName).ToList().ForEach(item =>
  1079. {
  1080. var EffluentData = CenterControls.FirstOrDefault(item => item.UIName.In("F1"));
  1081. if (EffluentData is not null && areas[0].Status)
  1082. {
  1083. EffluentData.BackColor = "#99CCCC";
  1084. }
  1085. if (EffluentData is not null && !areas[0].Status)
  1086. {
  1087. EffluentData.BackColor = "#FFCCCC";
  1088. }
  1089. });
  1090. }
  1091. catch (Exception ex)
  1092. {
  1093. logger.LogError(ex.ToString());
  1094. }
  1095. }
  1096. /// <summary>
  1097. /// 按钮样式改变
  1098. /// </summary>
  1099. private void ChangePauseIcon()
  1100. {
  1101. try
  1102. {
  1103. (PauseIcon, PauseText) = _config.TaskRunning ?
  1104. ($"{ResourcePath}暂停.png", "任务暂停") :
  1105. ($"{ResourcePath}继续.png", "任务继续");
  1106. }
  1107. catch (Exception ex)
  1108. {
  1109. logger.LogError(ex.Message);
  1110. }
  1111. }
  1112. /// <summary>
  1113. /// 端口连接
  1114. /// </summary>
  1115. private async void PortClient()
  1116. {
  1117. try
  1118. {
  1119. (string portName, bool clientState) = await _controller.ClientOpen();
  1120. ClientName = portName;
  1121. PortClientState = !clientState;
  1122. PortClientColor = clientState ? Brushes.LightGreen : "#FF6666".ConvertToBrush();
  1123. #region 设置电机速度
  1124. if (_config.SpeedWrite && clientState)
  1125. {
  1126. _config.GetSpeed.ForEach(item =>
  1127. {
  1128. var res = _controller.SetSpeed(item);
  1129. var logStr = $"{item.Description}速度设置{(res ? "成功" : "失败")}";
  1130. logger.LogInformation(logStr);
  1131. UMessageBox.InfoTip(logStr);
  1132. });
  1133. }
  1134. #endregion
  1135. }
  1136. catch (Exception ex)
  1137. {
  1138. logger.LogError(ex.ToString());
  1139. }
  1140. }
  1141. #endregion
  1142. #region Command
  1143. private DelegateCommand _mainCloseCommand;
  1144. public DelegateCommand MainCloseCommand => _mainCloseCommand ??= new DelegateCommand(ExecuteMainCloseCommand);
  1145. public DelegateCommand _lockDestCommand;
  1146. public DelegateCommand LockDestCommand => _lockDestCommand ?? new DelegateCommand(ExecuteLockDestCommand);
  1147. public DelegateCommand _taskStartCommand;
  1148. public DelegateCommand TaskStartCommand => _taskStartCommand ?? new DelegateCommand(ExecuteTaskStartCommand);
  1149. public DelegateCommand _taskPauseCommand;
  1150. public DelegateCommand TaskPauseCommand => _taskPauseCommand ?? new DelegateCommand(ExecuteTaskPauseCommand);
  1151. public DelegateCommand _exportWordCommand;
  1152. public DelegateCommand ExportWordCommand => _exportWordCommand ?? new DelegateCommand(ExecuteExportWordCommand);
  1153. public DelegateCommand _frushClientCommand;
  1154. public DelegateCommand FrushClientCommand => _frushClientCommand ?? new DelegateCommand(ExecuteFrushClientCommand);
  1155. public DelegateCommand _clearPipeCommand;
  1156. public DelegateCommand ClearPipeCommand => _clearPipeCommand ?? new DelegateCommand(ExecuteClearPipeCommand);
  1157. private DelegateCommand _washChooseCommand;
  1158. public DelegateCommand WashChooseCommand => _washChooseCommand ?? new DelegateCommand(() =>
  1159. {
  1160. string pathFile = "/SHJX.Service.Resource;component/Resources/";
  1161. WashIcon = $"{pathFile}{((bool)WhetherWash ? "clear_selected.png" : "clear_unselected.png")}";
  1162. });
  1163. public DelegateCommand _manualControlCommand;
  1164. public DelegateCommand ManualControlCommand => _manualControlCommand ?? new DelegateCommand(() =>
  1165. {
  1166. Messager.Send("ShowWindow", "manual");
  1167. });
  1168. public DelegateCommand _settingCommand;
  1169. public DelegateCommand SettingCommand => _settingCommand ?? new DelegateCommand(() =>
  1170. {
  1171. Messager.Send("ShowWindow", "setting");
  1172. });
  1173. public DelegateCommand _aboutSystemCommand;
  1174. public DelegateCommand AboutSystemCommand => _aboutSystemCommand ?? new DelegateCommand(() =>
  1175. {
  1176. Messager.Send("ShowWindow", "about");
  1177. });
  1178. private DelegateCommand _screenCaptureCommand;
  1179. public DelegateCommand ScreenCaptureCommand => _screenCaptureCommand ?? new DelegateCommand(() =>
  1180. {
  1181. Messager.Send("ScreenShot");
  1182. });
  1183. private DelegateCommand _minSizeCommand;
  1184. public DelegateCommand MinSizeCommand => _minSizeCommand ?? new DelegateCommand(() =>
  1185. {
  1186. Messager.Send("SystemMinSize");
  1187. });
  1188. public DelegateCommand _templateCommand;
  1189. public DelegateCommand TemplateCommand => _templateCommand ?? new DelegateCommand(() =>
  1190. {
  1191. Messager.Send("ShowWindow", "template");
  1192. });
  1193. #endregion
  1194. #region Execute Command
  1195. private void ExecuteMainCloseCommand()
  1196. {
  1197. Application.Current.Shutdown();
  1198. }
  1199. private void ExecuteLockDestCommand()
  1200. {
  1201. try
  1202. {
  1203. MainHiddenValue = (bool)WhetherLockMain! ? Visibility.Visible : Visibility.Hidden;
  1204. }
  1205. catch (Exception ex)
  1206. {
  1207. logger.LogError(ex.Message);
  1208. }
  1209. }
  1210. private void ADDcup(int kbypCount, int bbCount, int totalCount,int bdCount,int DigestionPositionNumFlag)
  1211. {
  1212. if (kbypCount == 0|| DigestionPositionNumFlag ==0)//如果没有水样和空白不需要补杯
  1213. return;
  1214. int addCupNum = 0;
  1215. if (kbypCount > DigestionPositionNumFlag)
  1216. {
  1217. addCupNum= 2*DigestionPositionNumFlag - kbypCount - bbCount- bdCount;
  1218. }
  1219. else
  1220. addCupNum = DigestionPositionNumFlag - kbypCount - bbCount;//补杯数量是总的位置减去水样和空白的个数
  1221. if (addCupNum < 0)
  1222. {
  1223. if (-addCupNum <= bbCount)//需要减杯
  1224. {
  1225. for (int j = 0; j < -addCupNum; j++)
  1226. {
  1227. _controller.deleteTask(_detailArgs.LastOrDefault(item => item.SampleType == "补杯").NodeName);
  1228. _detailArgs.Remove(_detailArgs.LastOrDefault(item => item.SampleType == "补杯"));
  1229. }
  1230. }
  1231. else//第二锅需要加杯
  1232. {
  1233. addCupNum = Math.Abs(DigestionPositionNumFlag + addCupNum - bdCount- 2*bbCount);
  1234. }
  1235. }
  1236. if (addCupNum + bbCount + kbypCount < 2 * DigestionPositionNumFlag && addCupNum + bbCount + kbypCount > DigestionPositionNumFlag)
  1237. {
  1238. _config.UpdateIsAddCupBiaoDingBubei("True");
  1239. }
  1240. else
  1241. _config.UpdateIsAddCupBiaoDingBubei("False");
  1242. if (addCupNum > 0)
  1243. {
  1244. bool left = true;
  1245. for (var i = 0; i < addCupNum; i++)
  1246. {
  1247. string nodeName = null;
  1248. List<string> parm = new List<string>(from SampleDetail item in _detailArgs where item.TaskSendOk is not true select item.NodeName);
  1249. for (int j = 0; j < LeftSampleAreas.Count && left; j++)
  1250. {
  1251. if (parm.Contains(LeftSampleAreas[j].UIName) || LeftSampleAreas[j].DetailInfo != "")
  1252. {
  1253. if (j == LeftSampleAreas.Count - 1)
  1254. {
  1255. left = false;
  1256. }
  1257. continue;
  1258. }
  1259. else
  1260. {
  1261. nodeName = LeftSampleAreas[j].UIName;
  1262. break;
  1263. }
  1264. }
  1265. for (int j = 0; j < RightSampleAreas.Count && !left; j++)
  1266. {
  1267. if (parm.Contains(RightSampleAreas[j].UIName) || RightSampleAreas[j].DetailInfo != "")
  1268. continue;
  1269. else
  1270. {
  1271. nodeName = RightSampleAreas[j].UIName;
  1272. break;
  1273. }
  1274. }
  1275. SampleDetail detailArgs = new SampleDetail()
  1276. {
  1277. NodeName = nodeName,
  1278. Detail = "补杯",
  1279. HgSO4 = 0,
  1280. SampleType = "补杯",
  1281. Concentration = "低",
  1282. WhetherSend = true,
  1283. };
  1284. _detailArgs.Add(detailArgs);
  1285. }
  1286. }
  1287. }
  1288. private void ExecuteTaskStartCommand()
  1289. {
  1290. try
  1291. {
  1292. int kbypCount = 0;
  1293. int bbCount = 0;
  1294. int totalCount = 0;
  1295. int bdCount = 0;
  1296. string[] template = new string[2] { "水样", "空白" };
  1297. foreach (var sample in _detailArgs)
  1298. {
  1299. totalCount++;
  1300. if (template.Contains(sample.SampleType))
  1301. {
  1302. kbypCount++;
  1303. }
  1304. if (sample.SampleType.Equals("补杯"))
  1305. {
  1306. bbCount++;
  1307. }
  1308. if (sample.SampleType.Equals("标定"))
  1309. {
  1310. bdCount++;
  1311. }
  1312. }
  1313. if (totalCount - bdCount > 2 * DigestionPositionNumFlag)
  1314. {
  1315. UMessageBox.Error("数量超过,无法下发!");
  1316. return;
  1317. }
  1318. DigestionPositionNumFlag = DataCentre.getDigestionPositionCount();
  1319. if (_config.IsAddCupFeedBack) //是否补杯
  1320. {
  1321. ADDcup( kbypCount, bbCount, totalCount, bdCount, DigestionPositionNumFlag);
  1322. }
  1323. List<SampleDetail> samplesBB = new List<SampleDetail>();
  1324. var samples = (from SampleDetail item in _detailArgs where item.TaskSendOk is not true select item).ToList();
  1325. samplesBB = (from SampleDetail item in _detailArgs where item.TaskSendOk is not true && item.SampleType == "补杯" select item).ToList();
  1326. if (!samples.Any())
  1327. {
  1328. UMessageBox.Error("未选择样品,无法进行任务下发!");
  1329. return;
  1330. }
  1331. int lowSample = 0;
  1332. int highSample = 0;
  1333. int totalSample = 0;
  1334. foreach (var item in samples)
  1335. {
  1336. totalSample++;
  1337. if (item.Concentration == "低")
  1338. {
  1339. lowSample++;
  1340. }
  1341. else
  1342. highSample++;
  1343. }
  1344. string[] types = new string[] {"Water", "Indicator", "Mercury", "SilverSulfate", "PotassiumDichromate_Low", "PotassiumDichromate_High", "FAS", "FAS2"};
  1345. double[] typeVolumn = new double[] { totalSample * 45, totalSample * 0.2, totalSample * 2, totalSample * 15 , lowSample *5 , highSample * 5 , lowSample * 25 , highSample * 25 };
  1346. for(int i=0; i<8; i++)
  1347. {
  1348. LiquidTotal liquid = DataCentre._dataManager.Query<LiquidTotal>().Where(it => it.LiquidName.Equals(types[i])).First();
  1349. if (liquid.Total < typeVolumn[i])
  1350. {
  1351. UMessageBox.Info("“" + liquid.Description + "”- 试剂不足,请检查");
  1352. return;
  1353. }
  1354. }
  1355. var sb = new StringBuilder();
  1356. sb.Append($"请检查废液位是否放有空杯!\n\n");
  1357. sb.Append($"当前下发任务数量共计:{samples.Count- samplesBB.Count }条\n\n");
  1358. sb.Append($"共需试剂数量如下:\n");
  1359. sb.Append($"H2SO4/Ag2SO4:{samples.Count * 15}ml\n");
  1360. sb.Append($"HgSO4:{samples.Count * 2}ml\n");
  1361. sb.Append($"K2Cr2O7:{samples.Count * 5}ml\n");
  1362. sb.Append($"(NH4)2FeSO4:{samples.Count * 25}ml\n");
  1363. sb.Append($"H2O:{samples.Count * 45}ml\n\n");
  1364. sb.Append("请确定任务是否下发?");
  1365. var result = UMessageBox.Info(sb.ToString());
  1366. if (result.Equals(MessageBoxResult.No))
  1367. return;
  1368. string waveKey = _controller.GetWavekey();
  1369. if ((bool)WhetherWash! && !_controller.CheckExistTask())
  1370. {
  1371. _controller.SendWashTask("润洗", "");
  1372. }
  1373. var resInfo = _controller.SendSampleToControl(samples, waveKey);
  1374. foreach (var item in resInfo)
  1375. {
  1376. switch (item.Code)
  1377. {
  1378. case 200:
  1379. UMessageBox.SuccessTip(item.Message);
  1380. for (int i = 0; i < 24; i++)
  1381. {
  1382. var leftSample = (from SampleDetail items in _detailArgs where items.NodeName == LeftSampleAreas[i].UIName select items).FirstOrDefault();
  1383. if (leftSample is not null)
  1384. {
  1385. LeftSampleAreas[i].TagColor = "#ff99cc";
  1386. LeftSampleAreas[i].DetailInfo = leftSample.Detail;
  1387. if (leftSample.SampleType == "补杯")
  1388. {
  1389. LeftSampleAreas[i].TagColor = "#ffcccc";
  1390. }
  1391. }
  1392. else
  1393. {
  1394. LeftSampleAreas[i].DetailInfo = "";
  1395. LeftSampleAreas[i].TagColor = "#99CCCC";
  1396. }
  1397. var rightSample = (from SampleDetail items in _detailArgs where items.NodeName == RightSampleAreas[i].UIName select items).FirstOrDefault();
  1398. if (rightSample is not null)
  1399. {
  1400. RightSampleAreas[i].TagColor = "#ff99cc";
  1401. RightSampleAreas[i].DetailInfo = rightSample.Detail;
  1402. if (rightSample.SampleType == "补杯")
  1403. {
  1404. RightSampleAreas[i].TagColor = "#ffcccc";
  1405. }
  1406. }
  1407. else
  1408. {
  1409. RightSampleAreas[i].DetailInfo = "";
  1410. RightSampleAreas[i].TagColor = "#99CCCC";
  1411. }
  1412. //var first = _detailArgs.FirstOrDefault(it => it.NodeName.Equals(task.NodeName));
  1413. //if (first != null) first.TaskSendOk = true;
  1414. }
  1415. break;
  1416. case 404:
  1417. var tasks = _controller.GetResidueTask();
  1418. tasks.Where(item => item.Status.Equals(TaskState.New) || item.Status.Equals(TaskState.Doing)).ToList().ForEach(task =>
  1419. {
  1420. var leftSample = LeftSampleAreas.FirstOrDefault(item => item.UIName.Equals(task.OriginLocalName));
  1421. if (leftSample is not null)
  1422. {
  1423. LeftSampleAreas[leftSample.Index].TagColor = "#ff99cc";
  1424. LeftSampleAreas[leftSample.Index].DetailInfo = task.TaskDetailName;
  1425. if (task.TaskDetailName == "补杯")
  1426. {
  1427. LeftSampleAreas[leftSample.Index].TagColor = "#ffcccc";
  1428. }
  1429. }
  1430. var rightSample = RightSampleAreas.FirstOrDefault(item => item.UIName.Equals(task.OriginLocalName));
  1431. if (rightSample is not null)
  1432. {
  1433. RightSampleAreas[rightSample.Index].TagColor = "#ff99cc";
  1434. RightSampleAreas[rightSample.Index].DetailInfo = task.TaskDetailName;
  1435. if (task.TaskDetailName == "补杯")
  1436. {
  1437. RightSampleAreas[rightSample.Index].TagColor = "#ffcccc";
  1438. }
  1439. }
  1440. });
  1441. UMessageBox.ErrorTip(item.Message);
  1442. break;
  1443. }
  1444. }
  1445. }
  1446. catch (Exception ex)
  1447. {
  1448. logger.LogError(ex.Message);
  1449. }
  1450. }
  1451. private void ExecuteTaskPauseCommand()
  1452. {
  1453. (var value, var strValue) = _config.TaskRunning ?
  1454. (false, "任务暂停成功!\n如有后续人为操作,请等到机器停止后,再进行相关操作!") :
  1455. (true, "任务继续!\n请确保无人员继续操作机器!");
  1456. _config.UpdateTaskRunning(value);
  1457. ChangePauseIcon();
  1458. logger.LogInformation(strValue);
  1459. UMessageBox.SingleBtnInfo(strValue);
  1460. }
  1461. #if false
  1462. private void ExecuteExportTemplateCommand()
  1463. {
  1464. try
  1465. {
  1466. if (UMessageBox.Info("是否确定导出模板?").Equals(MessageBoxResult.No)) return;
  1467. if (string.IsNullOrWhiteSpace(_config.TemplateFilePath))
  1468. {
  1469. UMessageBox.ErrorTip($"导出模板失败,地址为空!");
  1470. return;
  1471. }
  1472. var dt = new DataTable("Template");
  1473. dt.Columns.Add("节点名称", Type.GetType("System.String")!);
  1474. dt.Columns.Add("详细描述", Type.GetType("System.String")!);
  1475. dt.Columns.Add("样品体积", Type.GetType("System.Double")!);
  1476. dt.Columns.Add("样品倍数", Type.GetType("System.Double")!);
  1477. dt.Columns.Add("硫酸汞", Type.GetType("System.Double")!);
  1478. dt.Columns.Add("样品类型", Type.GetType("System.String")!);
  1479. dt.Columns.Add("样品浓度", Type.GetType("System.String")!);
  1480. dt.Columns.Add("是否下发", Type.GetType("System.Boolean")!);
  1481. _detailArgs.ForEach(item =>
  1482. {
  1483. dt.Rows.Add(item.NodeName, item.Detail, item.SampleVolume, item.Multiple, item.HgSO4, item.SampleType, item.Concentration, item.WhetherSend);
  1484. });
  1485. dt.ConvertToExcel(_config.TemplateFilePath);
  1486. UMessageBox.SuccessTip("模板导出成功!");
  1487. }
  1488. catch (Exception ex)
  1489. {
  1490. UMessageBox.ErrorTip($"导出模板失败,失败原因:{ex.Message}");
  1491. logger.LogError($"导出模板失败,失败原因:{ex.Message}");
  1492. }
  1493. }
  1494. private void ExecuteImportTemplateCommand()
  1495. {
  1496. try
  1497. {
  1498. if (UMessageBox.Info("是否确定导入模板?").Equals(MessageBoxResult.No)) return;
  1499. if (string.IsNullOrWhiteSpace(_config.TemplateFilePath))
  1500. {
  1501. UMessageBox.ErrorTip($"导入模板失败,地址为空!");
  1502. return;
  1503. }
  1504. if (!File.Exists(_config.TemplateFilePath))
  1505. {
  1506. UMessageBox.ErrorTip($"导入模板失败,文件不存在,请检查地址是否有误!");
  1507. return;
  1508. }
  1509. DataTable dt = _config.TemplateFilePath.ReadExcel();
  1510. var args = dt.ConvertToList<SampleDetail>();
  1511. args.ForEach(item => { SetSample(item); });
  1512. UMessageBox.SuccessTip("模板导入成功!");
  1513. }
  1514. catch (Exception ex)
  1515. {
  1516. UMessageBox.ErrorTip($"导入模板失败,失败原因:{ex.Message}");
  1517. logger.LogError($"导入模板失败,失败原因:{ex.Message}");
  1518. }
  1519. }
  1520. #endif
  1521. private void ExecuteExportWordCommand()
  1522. {
  1523. try
  1524. {
  1525. string wavekey = _controller.GetWavekeyValue();
  1526. if (string.IsNullOrWhiteSpace(wavekey)) return;
  1527. //if (UMessageBox.Info("是否确定导出结果?").Equals(MessageBoxResult.No)) return;
  1528. //if (_config.ExportTypeByExcel)
  1529. //{
  1530. // //ExportResultToExcel(wavekey, () => UMessageBox.SuccessTip("导出成功"));
  1531. //}
  1532. //else if (_config.ExportTypeByWord)
  1533. //{
  1534. ExportResultToWord(wavekey, () => UMessageBox.SuccessTip("导出成功"));
  1535. //}
  1536. }
  1537. catch (Exception ex)
  1538. {
  1539. UMessageBox.ErrorTip($"导出Word失败,失败原因:{ex.Message}");
  1540. logger.LogError($"导出Word失败,失败原因:{ex}");
  1541. }
  1542. }
  1543. private void ExecuteFrushClientCommand()
  1544. {
  1545. PortClient();
  1546. }
  1547. private void ExecuteClearPipeCommand()
  1548. {
  1549. if (UMessageBox.Info("是否下发清洗任务?").Equals(MessageBoxResult.No)) return;
  1550. var res = _controller.SendWashTask("清洗","");
  1551. UMessageBox.InfoTip($"清洗任务下发{(res ? "成功" : "失败")}");
  1552. }
  1553. #endregion
  1554. }
  1555. }