MainService.cs 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612
  1. using Panuon.UI.Silver;
  2. using SHJX.Service.Control.Extends;
  3. using SHJX.Service.Control.Repository;
  4. using SHJX.Service.Control.Common.Assets;
  5. using SHJX.Service.Control.Utils;
  6. using shjxCamera;
  7. namespace SHJX.Service.Control.Service
  8. {
  9. public class MainService : IMainService
  10. {
  11. private static readonly ILogger logger = LogFactory.BuildLogger(typeof(MainService));
  12. private readonly IEventAggregator _ea;
  13. private readonly IDataManager _dataManager;
  14. private readonly PortConnect _portConnect;
  15. private readonly Repositorys _repositorys;
  16. private readonly ReadConfigUtil _readConfig;
  17. private static bool TemperatureSettingResult;
  18. private readonly ExportFile _export;
  19. private static bool CameraState ;
  20. public MainService(IEventAggregator ea,
  21. IDataManager dataManager,
  22. PortConnect portConnect,
  23. ReadConfigUtil readConfig,
  24. Repositorys repositorys,
  25. ExportFile export)
  26. {
  27. _ea = ea;
  28. _export = export;
  29. _dataManager = dataManager;
  30. _readConfig = readConfig;
  31. _portConnect = portConnect;
  32. _repositorys = repositorys;
  33. }
  34. public IMainService InitRepositorys()
  35. {
  36. _repositorys.RegisterContainer();
  37. _repositorys.InitializationBean();
  38. return this;
  39. }
  40. public IMainService InitService()
  41. {
  42. CreateTask.Init(_dataManager);
  43. RegisterMessager();
  44. ClientPort();
  45. CameraState =GetCameraState();
  46. CameraState = CameraState && GetCameraState2();
  47. if (CameraState)
  48. {
  49. #region 下发任务前要配置相机参数
  50. ColorDataGraber _graber = Globals.Graber;
  51. CameraValue explosion = _dataManager.Query<CameraValue>().First();
  52. _graber.PresetLightParammanual(explosion, explosion.Explosion);
  53. _graber.PresetLightParammanual(explosion, explosion.Explosion);
  54. ColorData2Graber _graber2 = Globals.Graber2;
  55. Camera2Value explosion2 = _dataManager.Query<Camera2Value>().First();
  56. _graber2.PresetLightParammanual(explosion2, explosion2.Explosion);
  57. _graber2.PresetLightParammanual(explosion2, explosion2.Explosion);
  58. #endregion
  59. }
  60. GetPortClientState();
  61. InitializationTemperatureValue();
  62. AutoSettingSpeed();
  63. SettingSampleDetails();
  64. GetSettingTemperature();
  65. //ReadHumiture();
  66. return this;
  67. }
  68. /// <summary>
  69. /// 检查剩余任务
  70. /// </summary>
  71. public async void CheckExistResidueTask()
  72. {
  73. List<EquipmentTask> residueTask = _dataManager.Query<EquipmentTask>().Where(it => it.Status.In
  74. (
  75. TaskState.New, TaskState.Waiting, TaskState.Doing, TaskState.Hit,
  76. TaskState.AddLiquid, TaskState.Dissolve, TaskState.Titration, TaskState.Titration2, TaskState.Execute
  77. )).ToList();
  78. if (!residueTask.Any())
  79. {
  80. /* Mark:
  81. * 这里暂时设置状态为TaskState.Cancel,若后续有其他不可抗拒原因,则调整回TaskState.Finish
  82. * 使用TaskState.Cancel是因为后续计算结果时,若本次实验未进行标定、空白类型下发
  83. * 计算时需向上检索最近的一次,TaskState.Finish为条件之一
  84. */
  85. _dataManager.Update<EquipmentTask>().Invoke(it => it.Status.Set(TaskState.Cancel))(it => it.Status.In(TaskState.New, TaskState.Waiting, TaskState.Doing, TaskState.Hit, TaskState.AddLiquid, TaskState.Dissolve, TaskState.Titration, TaskState.Execute));
  86. _dataManager.Update<DissolveDate>().SetValues(it => it.SampleSource.Set(string.Empty) && it.Start.Set(false)).Execute();
  87. _dataManager.Update<EquipmentArea>().SetValues(it => it.Enable.Set(true)).Execute();
  88. _dataManager.Update<SampleDetail>().SetValues(it => it.TaskStatus.Set(DetailState.Init)).Execute();
  89. _dataManager.Update<PositionHotlist>().SetValues(it => it.CurrentOccupy.Set(string.Empty) && it.Enable.Set(true)).Execute();
  90. //_dataManager.Update<StateMachine>().SetValues(it => it.Status.Set(0)).Execute(); 此处代码移到上面了第67行
  91. _dataManager.Update<LiquidReserve>().SetValues(it => it.Value.Set(0)).Execute();
  92. _dataManager.Delete<RouteCache>().Execute();
  93. }
  94. if (residueTask.Any() && UMessageBox.Info("检测到剩余任务,请问是否继续执行").Equals(MessageBoxResult.No))
  95. {
  96. /* Mark:
  97. * 这里暂时设置状态为TaskState.Cancel,若后续有其他不可抗拒原因,则调整回TaskState.Finish
  98. * 使用TaskState.Cancel是因为后续计算结果时,若本次实验未进行标定、空白类型下发
  99. * 计算时需向上检索最近的一次,TaskState.Finish为条件之一
  100. */
  101. _dataManager.Update<EquipmentTask>().Invoke(it => it.Status.Set(TaskState.Cancel))(it => it.Status.In(TaskState.New, TaskState.Waiting, TaskState.Doing, TaskState.Hit, TaskState.AddLiquid, TaskState.Dissolve, TaskState.Titration, TaskState.Titration2, TaskState.Execute));
  102. _dataManager.Update<DissolveDate>().SetValues(it => it.SampleSource.Set(string.Empty) && it.Start.Set(false)).Execute();
  103. _dataManager.Update<EquipmentArea>().SetValues(it => it.Enable.Set(true)).Execute();
  104. _dataManager.Update<SampleDetail>().SetValues(it => it.TaskStatus.Set(DetailState.Init)).Execute();
  105. _dataManager.Update<PositionHotlist>().SetValues(it => it.CurrentOccupy.Set(string.Empty) && it.Enable.Set(true)).Execute();
  106. _dataManager.Update<StateMachine>().SetValues(it => it.Status.Set(0)).Execute();
  107. _dataManager.Update<LiquidReserve>().SetValues(it => it.Value.Set(0)).Execute();
  108. _dataManager.Delete<RouteCache>().Execute();
  109. _dataManager.Delete<LiquidRecord>().Execute();
  110. }
  111. else
  112. {
  113. _ea.GetEvent<CalExecuteTaskNeedTimeEvent>().Publish(residueTask.Count()); //继续任务的话,做待执行时间的显示
  114. await Task.Factory.StartNew(() =>
  115. {
  116. List<EquipmentTask> executeTasks = _dataManager.Query<EquipmentTask>().Where(it => it.Status.Equals(TaskState.Execute)).ToList();
  117. foreach (EquipmentTask item in executeTasks)
  118. {
  119. string type = string.Empty;
  120. if (item.RouteStep.Equals(PipeName.ADD_LIQUID))
  121. {
  122. type = item.AcidBaseProp switch
  123. {
  124. AcidBase.Acid => PipeName.ACID_ADD_LIQUID,
  125. AcidBase.Alkali => PipeName.ALKALI_ADD_LIQUID,
  126. _ => throw new ArgumentNullException(nameof(item.AcidBaseProp)),
  127. };
  128. }
  129. if (item.RouteStep.Equals(PipeName.TITRATION))
  130. {
  131. type = item.AcidBaseProp switch
  132. {
  133. AcidBase.Acid => PipeName.ACID_TITRATION,
  134. AcidBase.Alkali => PipeName.ALKALI_TITRATION,
  135. _ => throw new ArgumentNullException(nameof(item.AcidBaseProp)),
  136. };
  137. }
  138. _repositorys.ExecuteTaskByVirtualPipe(type, item);
  139. List<object> names = new List<object>();
  140. names.Add(item.Source);
  141. _ea.GetEvent<UpdateSampleDetailEvent>().Publish(names);
  142. }
  143. EquipmentTask task = _dataManager.Query<EquipmentTask>().Where(it => it.Status.In(TaskState.Hit)).First();
  144. if (task is not null)
  145. {
  146. _repositorys.ExecuteTaskByVirtualPipe(task);
  147. }
  148. });
  149. }
  150. if (UMessageBox.Info("设备是否需要返回原点?").Equals(MessageBoxResult.Yes))
  151. {
  152. bool res = await MotorGoBack();
  153. _dataManager.Update<StateMachine>().SetValues(it => it.Status.Set(0)).Execute();
  154. string showStr = $"设备返回原点{(res ? "成功" : "失败")}!";
  155. Notice.Show(showStr, "Info", 3, MessageBoxIcon.Info);
  156. logger.LogInformation(showStr);
  157. }
  158. _repositorys.StartTaskProcesser();
  159. }
  160. public void RegisterMessager()
  161. {
  162. Messager<string>.Register("TaskFinish", ExecuteTaskFinish);
  163. Messager<TaskResultArgs>.Register("TaskResult", ExecuteTaskRegister);
  164. Messager<string>.Register("AllTaskFinish", ExecuteAllTaskFinish);
  165. }
  166. public void ExecuteAllTaskFinish(string arg)
  167. {
  168. _ea.GetEvent<CalExecuteTaskNeedTimeEvent>().Publish(0);
  169. }
  170. public void ExecuteTaskFinish(string arg)
  171. {
  172. _ea.GetEvent<TaskFinishNoticeEvent>().Publish(arg);
  173. }
  174. public void ExecuteTaskRegister(TaskResultArgs arg)
  175. {
  176. _ea.GetEvent<TaskResultNoticeEvent>().Publish(arg);
  177. }
  178. public IEnumerable<T> GetData<T>() where T : class
  179. {
  180. return _dataManager.Query<T>().ToList();
  181. }
  182. /// <summary>
  183. /// 设置样品详细
  184. /// </summary>
  185. private void SettingSampleDetails()
  186. {
  187. List<SampleDetail> sampleDetails = _dataManager.Query<SampleDetail>().Where(it => it.TaskStatus.Unequal(DetailState.Init)).ToList();
  188. List<SampleDetail> newSampleDetails = sampleDetails.Where(item => item.TaskStatus.Equals(DetailState.New)).ToList();
  189. if (newSampleDetails.Any())
  190. {
  191. _dataManager.Update<SampleDetail>().Invoke(it => it.TaskStatus.Set(DetailState.Init))(it => it.TaskStatus.Equals(DetailState.New));
  192. }
  193. if (!sampleDetails.Where(detail => detail.TaskStatus.Equals(DetailState.Doing)).Any())
  194. {
  195. _dataManager.Update<SampleDetail>().SetValues(it => it.TaskStatus.Set(DetailState.Init)).Execute();
  196. }
  197. }
  198. /// <summary>
  199. /// 启动后自动设置速度
  200. /// </summary>
  201. private void AutoSettingSpeed()
  202. {
  203. List<MotorSpeed> settingSpeedInfos = _dataManager.Query<MotorSpeed>().Where(it => it.ConnectAutoUpdate.Equals(true)).ToList();
  204. StringBuilder successfulSb = new();
  205. foreach (MotorSpeed speed in settingSpeedInfos)
  206. {
  207. bool res = speed.SystemName.WriteSpeed(speed.Speed);
  208. res = res && speed.SystemName.WriteAcSpeed(speed.AcSpeed);
  209. res = res && speed.SystemName.WriteDeSpeed(speed.DeSpeed);
  210. if (res)
  211. {
  212. successfulSb.Append($"{speed.DetailName}、");
  213. }
  214. }
  215. if (successfulSb is null or { Length: 0 })
  216. {
  217. Notice.Show("自动设置速度失败,请在手动模式下设置!", "Error", 3, MessageBoxIcon.Error);
  218. return;
  219. }
  220. Notice.Show($"点位:{successfulSb}自动设置速度成功!", "Info", 3, MessageBoxIcon.Info);
  221. }
  222. public void TaskSend()
  223. {
  224. try
  225. {
  226. if (!CameraState)
  227. {
  228. UMessageBox.Error("滴定相机未检出,请联系统售后处理后,再开始实验!");
  229. return;
  230. }
  231. Dictionary<string, double> temperatureRes = EquipmentNames.DissolveHeating.HeatRead();
  232. Globals.FirstDissolve = true;
  233. InitializationTemperatureValue();
  234. List<SampleDetail> samples = _dataManager.Query<SampleDetail>().Where(it => it.TaskStatus.Equals(DetailState.New)).ToList();
  235. if (!samples.Any())
  236. {
  237. UMessageBox.Error("未选择样品,无法进行任务下发!");
  238. return;
  239. }
  240. List<EquipmentTask> residueTask = _dataManager.Query<EquipmentTask>().Where(it => it.Status.In
  241. (
  242. TaskState.New, TaskState.Waiting, TaskState.Doing, TaskState.Hit,
  243. TaskState.AddLiquid, TaskState.Dissolve, TaskState.Titration, TaskState.Titration2, TaskState.Execute
  244. )).ToList();
  245. var reserveLiquids = _dataManager.Query<LiquidReserve>().ToList();
  246. var totalLiquids = _dataManager.Query<LiquidTotal>().ToList();
  247. double sodiumOxalate = samples.Count * 10;//草酸钠
  248. double SodiumHydroxide = samples.Where(it => it.AcidBaseProp.Equals(AcidBase.Alkali)).ToList().Count * 0.5;//氢氧化钠
  249. double Vitriol = samples.Count * 5;//硫酸
  250. double PotassiumPermanganate = samples.Count * 25;//高锰酸钾
  251. string[] liquidNames = new string[] { "SodiumOxalate", "SodiumHydroxide", "PotassiumPermanganate", "Vitriol" };
  252. bool measure = true;
  253. foreach (var name in liquidNames)
  254. {
  255. double needValue = reserveLiquids.FirstOrDefault(it => it.LiquidName.Equals(name)).Value;
  256. needValue += name switch
  257. {
  258. "SodiumOxalate" => sodiumOxalate,
  259. "SodiumHydroxide" => SodiumHydroxide,
  260. "PotassiumPermanganate" => PotassiumPermanganate,
  261. "Vitriol" => Vitriol,
  262. _ => 0,
  263. };
  264. double total = totalLiquids.FirstOrDefault(it => it.LiquidName.Equals(name)).Total;
  265. measure = measure && (needValue <= total);
  266. }
  267. if (!measure)
  268. {
  269. MessageBox.Show("警告: 剩余试剂量 不足 ,请确保试剂 充足 后重试~");
  270. return;
  271. }
  272. int acidCount = 0;
  273. int calibrationCount = 0;
  274. int blankCount = 0;
  275. foreach (var item in samples)
  276. {
  277. if (item.AcidBaseProp == AcidBase.Acid)
  278. acidCount++;
  279. if (item.IsCalibration ==true)
  280. calibrationCount++;
  281. if (item.SampleType == "空白")
  282. blankCount++;
  283. }
  284. var sb = new StringBuilder();
  285. sb.Append($"当前下发任务数量共计:{samples.Count}条\n\n");
  286. sb.Append($"共需试剂数量如下:\n");
  287. sb.Append($"草酸钠:{(samples.Count+ calibrationCount) * 10 }ml\n");
  288. sb.Append($"高锰酸钾:{(samples.Count - blankCount) * 17 + (calibrationCount + blankCount) * 12}ml\n");
  289. sb.Append($"硫酸:{(samples.Count - acidCount) * 10 + acidCount * 5}ml\n");
  290. sb.Append($"氢氧化钠:{(samples.Count - acidCount) * 0.5}ml\n");
  291. sb.Append("请确定任务是否下发?");
  292. var result = UMessageBox.Info(sb.ToString());
  293. if (result.Equals(MessageBoxResult.No))
  294. return;
  295. foreach (var name in liquidNames)
  296. {
  297. double needValue = reserveLiquids.FirstOrDefault(it => it.LiquidName.Equals(name)).Value;
  298. needValue += name switch
  299. {
  300. "SodiumOxalate" => sodiumOxalate,
  301. "SodiumHydroxide" => SodiumHydroxide,
  302. "PotassiumPermanganate" => PotassiumPermanganate,
  303. "Vitriol" => Vitriol,
  304. _ => 0,
  305. };
  306. _dataManager.Update<LiquidReserve>().Invoke(it => it.Value.Set(needValue))(it => it.LiquidName.Equals(name));
  307. }
  308. IEnumerable<ResponseData> resInfo = SendSampleToControl(samples);
  309. _ea.GetEvent<CalExecuteTaskNeedTimeEvent>().Publish(residueTask.Count() + samples.Count()); //继续任务的话,做待执行时间的显示
  310. foreach (ResponseData item in resInfo)
  311. {
  312. switch (item.Code)
  313. {
  314. case 200:
  315. Notice.Show(item.Message, "Success", 5, MessageBoxIcon.Success);
  316. List<SampleDetail> sendSeccessfulSampleTask = samples.Where(sample => item.Data.Contains(sample.NodeName)).ToList();
  317. foreach (SampleDetail sampleTask in sendSeccessfulSampleTask)
  318. {
  319. sampleTask.TaskStatus = DetailState.Doing;
  320. _dataManager.Update(sampleTask);
  321. }
  322. _ea.GetEvent<UpdateSampleDetailEvent>().Publish(item.Data);
  323. break;
  324. case 404:
  325. Notice.Show(item.Message, "Error", 3, MessageBoxIcon.Error);
  326. break;
  327. }
  328. }
  329. }
  330. catch (Exception ex)
  331. {
  332. logger.LogError(ex.ToString());
  333. }
  334. }
  335. /// <summary>
  336. /// 下发样品任务
  337. /// </summary>
  338. /// <param name="args"></param>
  339. /// <param name="uuid"></param>
  340. /// <returns></returns>
  341. public IEnumerable<ResponseData> SendSampleToControl(List<SampleDetail> args)
  342. {
  343. List<EquipmentTask> tasks = new();
  344. List<ResponseData> resList = new();
  345. ResponseData successData = new();
  346. ResponseData errorData = new();
  347. StringBuilder successSend = new();
  348. StringBuilder repetitionSend = new();
  349. string waveKey = CreateTask.GetWavekey();
  350. foreach (SampleDetail item in args)
  351. {
  352. if (_dataManager.Query<EquipmentTask>().Where(it => it.Source.Equals(item.NodeName) && it.Status.In(TaskState.New, TaskState.Doing)).Any())
  353. {
  354. repetitionSend.AppendFormat("{0} ", item.NodeName);
  355. continue;
  356. }
  357. successSend.AppendFormat("{0} ", item.NodeName);
  358. EquipmentTask task = item.CreateSampleTask(waveKey);
  359. tasks.Add(task);
  360. successData.Data.Add(item.NodeName);
  361. }
  362. int rows = _dataManager.Add(tasks);
  363. if (successSend.Length > 0 && rows > 0)
  364. {
  365. successData.Code = 200;
  366. successData.Message = string.Concat(successSend.ToString(), "任务下发成功!");
  367. resList.Add(successData);
  368. }
  369. if (repetitionSend.Length <= 0) return resList;
  370. errorData.Code = 404;
  371. errorData.Message = string.Concat(repetitionSend.ToString(), "地址有在执行的任务,请勿重复下发任务!");
  372. resList.Add(errorData);
  373. return resList;
  374. }
  375. public async Task<bool> MotorGoBack()
  376. {
  377. bool respose = await Task.Factory.StartNew(() =>
  378. {
  379. string[] typeNames = { EquipmentNames.AxisZ, EquipmentNames.AxisY, EquipmentNames.AxisX, EquipmentNames.AxisD };
  380. bool res = true;
  381. foreach (string item in typeNames)
  382. {
  383. if(item == EquipmentNames.AxisY)
  384. {
  385. int register = ConfigInstance.GetPortRegister(item);
  386. char[] judgeRes = item.MotorRead();
  387. if (judgeRes is null or { Length: 0 })
  388. {
  389. continue;
  390. }
  391. if( judgeRes[register - 1].Equals('0'))
  392. continue;
  393. }
  394. res = res && ExecuteCommand.MotorGoBackExecute(item);
  395. }
  396. ManualService.DropperPoint("Titration");
  397. //四个泵回原点代码
  398. //string[] typeNames1 = { EquipmentNames.Sodium1Oxalate, EquipmentNames.Sodium2Oxalate };
  399. //bool res1 = true;
  400. //foreach (string item in typeNames1)
  401. //{
  402. // LiquidPipeSwitchOxalate.StartNew.SetLiquidName(item).CheckWhetherArriveEndPointOxalate();
  403. //}
  404. //string[] typeNames2 = { EquipmentNames.TitrationPotassiumPermanganate, EquipmentNames.Titration2PotassiumPermanganate};
  405. //bool res2 = true;
  406. //foreach (string item in typeNames2)
  407. //{
  408. // LiquidPipeSwitch.StartNew.SetLiquidName(item).CheckWhetherArriveEndPoint();
  409. //}
  410. return res;
  411. });
  412. return respose;
  413. }
  414. public bool TaskRunning => _readConfig.TaskRunning;
  415. public void UpdateTaskRunning(bool value) => _readConfig.UpdateTaskRunning(value);
  416. public List<OtherPositionArgs> OtherPositions => _readConfig.OtherPositionArgs;
  417. public void FreshClient() => ClientPort();
  418. public void FreshCamera()
  419. {
  420. GetCameraState();
  421. GetCameraState2();
  422. }
  423. public void CloseCamera()
  424. {
  425. try
  426. {
  427. if (Globals.Camera is not null && Globals.Camera.IsOpened)
  428. {
  429. Globals.Camera?.CloseCamera();
  430. }
  431. if (Globals.Camera2 is not null && Globals.Camera2.IsOpened)
  432. {
  433. Globals.Camera2?.CloseCamera();
  434. }
  435. }
  436. catch (Exception ex)
  437. {
  438. logger.LogError(ex.ToString());
  439. }
  440. }
  441. public void ResettingTemperature()
  442. {
  443. InitializationTemperatureValue();
  444. }
  445. private void ClientPort()
  446. {
  447. _portConnect.Open();
  448. }
  449. public void GetPortClientState()
  450. {
  451. _ = Task.Factory.StartNew(() =>
  452. {
  453. while (true)
  454. {
  455. _ea.GetEvent<ClientResponseEvent>().Publish((_portConnect.PortName, _portConnect.PortState));
  456. Thread.Sleep(5 * 1000);
  457. }
  458. });
  459. }
  460. public bool GetCameraState()
  461. {
  462. _ = Task.Factory.StartNew(() =>
  463. {
  464. while (true)
  465. {
  466. _ea.GetEvent<ClientCameraEvent>().Publish(CreatCamera.HadWebcams);
  467. Thread.Sleep(5 * 1000);
  468. }
  469. });
  470. return CreatCamera.HadWebcams;
  471. }
  472. public bool GetCameraState2()
  473. {
  474. _ = Task.Factory.StartNew(() =>
  475. {
  476. while (true)
  477. {
  478. _ea.GetEvent<ClientCameraEvent2>().Publish(CreatCamera2.HadWebcams);
  479. Thread.Sleep(5 * 1000);
  480. }
  481. });
  482. return CreatCamera2.HadWebcams;
  483. }
  484. public void GetSettingTemperature()
  485. {
  486. _ = Task.Factory.StartNew(() =>
  487. {
  488. while (true)
  489. {
  490. _ea.GetEvent<HeatingStateEvent>().Publish(TemperatureSettingResult);
  491. Thread.Sleep(5 * 1000);
  492. }
  493. });
  494. }
  495. public void ReadHumiture()
  496. {
  497. ushort[] res = PortExecute.HumitureRead();
  498. if (res is null or { Length: 0 })
  499. {
  500. return;
  501. }
  502. double temp = res[0] / 10.0;
  503. double humidi = res[1] / 10.0;
  504. _ea.GetEvent<NoticeHumitureEvent>().Publish((Temperature: temp, Humidity: humidi));
  505. }
  506. public void StopHeating(string name)
  507. {
  508. SettingTemperatureValue(name, -100);
  509. }
  510. /// <summary>
  511. /// 温度设置
  512. /// </summary>
  513. /// <param name="value"></param>
  514. private void SettingTemperatureValue(string name, double value)
  515. {
  516. if (_portConnect.PortState)
  517. {
  518. bool res = name.WritePid();
  519. TemperatureSettingResult = res && name.WriteTemperature(value);
  520. logger.LogDebug($"{name}设定温度{value},温度设置{(TemperatureSettingResult ? "成功" : "失败")}");
  521. }
  522. }
  523. public void ExportResult(string key)
  524. {
  525. try
  526. {
  527. if (string.IsNullOrWhiteSpace(_readConfig.ResultFilePath))
  528. {
  529. UMessageBox.SingleBtnInfo("导出结果地址为空,请设置!");
  530. return;
  531. }
  532. List<EquipmentTask> tasks = _dataManager.Query<EquipmentTask>().Where(it => it.WaveKey.Equals(key) && it.Status.Equals(TaskState.Finished)).ToList();
  533. if (tasks is null or { Count: 0 })
  534. {
  535. UMessageBox.SingleBtnInfo("未找到符合数据,导出结果失败");
  536. }
  537. if (_readConfig.ExportTypeByExcel)
  538. {
  539. _export.ExportExcel(tasks);
  540. }
  541. else if (_readConfig.ExportTypeByWord)
  542. {
  543. _export.ExportWord(tasks);
  544. }
  545. Notice.Show("导出结果成功!", "Info", 3, MessageBoxIcon.Info);
  546. }
  547. catch (Exception ex)
  548. {
  549. logger.LogError(ex.ToString());
  550. }
  551. }
  552. public async Task<bool> CreatWashTask()
  553. {
  554. return await Task.Factory.StartNew(() =>
  555. {
  556. string TaskType = TaskTypeName.WASH_ZH;
  557. EquipmentTask task = TaskType.CreateWashTask();
  558. foreach (PipelineContent item in PipelineConfig.Instance.PipelineContents)
  559. {
  560. if (item.Alias.Equals(task.RouteStep))
  561. {
  562. _repositorys.ExecuteTaskByVirtualPipe(task, item.Nodes);
  563. }
  564. }
  565. return true;
  566. });
  567. }
  568. private void InitializationTemperatureValue()
  569. {
  570. SettingTemperatureValue(EquipmentNames.DissolveHeating, _readConfig.DissolveTemperatureValue);
  571. Thread.Sleep(500);
  572. SettingTemperatureValue(EquipmentNames.TitrationHeating, _readConfig.TitrationTemperatureValue);
  573. }
  574. }
  575. }