MainPageViewModel.cs 44 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023
  1. using CommunityToolkit.Mvvm.ComponentModel;
  2. using ivf_tl_Entity;
  3. using ivf_tl_Entity.DebugEntitys;
  4. using ivf_tl_Entity.DTO;
  5. using ivf_tl_Entity.GlobalEntitys;
  6. using ivf_tl_Entity.GlobalEnums;
  7. using ivf_tl_Operate.Converts;
  8. using ivf_tl_Services;
  9. using Newtonsoft.Json;
  10. using System;
  11. using System.Collections.Generic;
  12. using System.Diagnostics;
  13. using System.Globalization;
  14. using System.IO;
  15. using System.Linq;
  16. using System.Runtime.Intrinsics.X86;
  17. using System.Security.Claims;
  18. using System.Security.RightsManagement;
  19. using System.Speech.AudioFormat;
  20. using System.Speech.Synthesis;
  21. using System.Text;
  22. using System.Threading;
  23. using System.Threading.Tasks;
  24. namespace ivf_tl_Operate.ViewModel
  25. {
  26. public partial class MainPageViewModel : ObservableObject
  27. {
  28. public MainPageViewModel(string tlsn)
  29. {
  30. this.tlsn = tlsn;
  31. InitExHouse();
  32. Init();
  33. StartMqtt();
  34. StartThread();
  35. StartSpeaker();
  36. }
  37. [ObservableProperty]
  38. private int alarmCount = 0;
  39. [ObservableProperty]
  40. private ExDish exDish1 = new ExDish();
  41. [ObservableProperty]
  42. private ExDish exDish2 = new ExDish();
  43. [ObservableProperty]
  44. private ExDish exDish3 = new ExDish();
  45. [ObservableProperty]
  46. private ExDish exDish4 = new ExDish();
  47. [ObservableProperty]
  48. private ExDish exDish5 = new ExDish();
  49. [ObservableProperty]
  50. private ExDish exDish6 = new ExDish();
  51. [ObservableProperty]
  52. private ExDish exDish7 = new ExDish();
  53. [ObservableProperty]
  54. private ExDish exDish8 = new ExDish();
  55. [ObservableProperty]
  56. private ExDish exDish9 = new ExDish();
  57. [ObservableProperty]
  58. private ExDish exDish10 = new ExDish();
  59. [ObservableProperty]
  60. private ExHouse exHouse1 = null;
  61. [ObservableProperty]
  62. private ExHouse exHouse2 = null;
  63. [ObservableProperty]
  64. private ExHouse exHouse3 = null;
  65. [ObservableProperty]
  66. private ExHouse exHouse4 = null;
  67. [ObservableProperty]
  68. private ExHouse exHouse5 = null;
  69. [ObservableProperty]
  70. private ExHouse exHouse6 = null;
  71. [ObservableProperty]
  72. private ExHouse exHouse7 = null;
  73. [ObservableProperty]
  74. private ExHouse exHouse8 = null;
  75. [ObservableProperty]
  76. private ExHouse exHouse9 = null;
  77. [ObservableProperty]
  78. private ExHouse exHouse10 = null;
  79. [ObservableProperty]
  80. private ExHouse exHouse11 = null;
  81. public ExBalance ExBalance1 { get; set; } = null;
  82. public ExBalance ExBalance2 { get; set; } = null;
  83. public ExBalance ExBalance3 { get; set; } = null;
  84. public ExBalance ExBalance4 { get; set; } = null;
  85. public ExBalance ExBalance5 { get; set; } = null;
  86. public ExBalance ExBalance6 { get; set; } = null;
  87. public ExBalance ExBalance7 { get; set; } = null;
  88. public ExBalance ExBalance8 { get; set; } = null;
  89. public ExBalance ExBalance9 { get; set; } = null;
  90. public ExBalance ExBalance10 { get; set; } = null;
  91. [ObservableProperty]
  92. private string hepaTimeString = null;
  93. [ObservableProperty]
  94. private string maintenanceTimeString = null;
  95. [ObservableProperty]
  96. private string runTimeString = null;
  97. public string tlsn { get; set; }
  98. private void InitExHouse()
  99. {
  100. ExHouse1 = new ExHouse() { tlSn = tlsn, houseSn = 1 };
  101. ExHouse2 = new ExHouse() { tlSn = tlsn, houseSn = 2 };
  102. ExHouse3 = new ExHouse() { tlSn = tlsn, houseSn = 3 };
  103. ExHouse4 = new ExHouse() { tlSn = tlsn, houseSn = 4 };
  104. ExHouse5 = new ExHouse() { tlSn = tlsn, houseSn = 5 };
  105. ExHouse6 = new ExHouse() { tlSn = tlsn, houseSn = 6 };
  106. ExHouse7 = new ExHouse() { tlSn = tlsn, houseSn = 7 };
  107. ExHouse8 = new ExHouse() { tlSn = tlsn, houseSn = 8 };
  108. ExHouse9 = new ExHouse() { tlSn = tlsn, houseSn = 9 };
  109. ExHouse10 = new ExHouse() { tlSn = tlsn, houseSn = 10 };
  110. ExHouse11 = new ExHouse() { tlSn = tlsn, houseSn = 11 };
  111. }
  112. public void Init()
  113. {
  114. GetHouseStateData getHouseStateData = AppData.Instance.HttpHelper.GetHouseCultureListApi(tlsn);
  115. InitDish(getHouseStateData.embryoCultureRecords);
  116. InitBalance(getHouseStateData.balances);
  117. InitHouse();
  118. }
  119. private void InitHouse()
  120. {
  121. ExHouse currentHouse = null;
  122. ExDish currentDish = null;
  123. ExBalance currentBalance = null;
  124. for (int i = 1; i < 11; i++)
  125. {
  126. currentHouse = HouseSnToExHouse(i);
  127. if (currentHouse == null) continue;
  128. currentDish = HouseSnToDish(i);
  129. currentBalance = HouseSnToExBalance(i);
  130. if (currentBalance == null && currentDish == null)
  131. {
  132. currentHouse.FaYuTime = "";
  133. currentHouse.StartTime = "";
  134. continue;
  135. }
  136. if (currentDish != null)
  137. {
  138. if (DateTime.TryParse(currentDish.startTime, out DateTime sou))
  139. {
  140. currentDish.SouJingTime = sou;
  141. var span = DateTime.Now.Subtract(sou);
  142. var allHour = (span.Days * 24) + span.Hours;
  143. if (allHour >= 168) currentHouse.FaYuTime = $"168h+";
  144. else currentHouse.FaYuTime = $"{allHour}h:{span.Minutes}m";
  145. currentHouse.StartTime = sou.ToString("MM-dd HH:mm");
  146. }
  147. else
  148. {
  149. currentHouse.FaYuTime = "";
  150. currentHouse.StartTime = "";
  151. }
  152. continue;
  153. }
  154. if (currentBalance != null)
  155. {
  156. if (DateTime.TryParse(currentBalance.startTime, out DateTime sou))
  157. {
  158. currentBalance.StartDateTime = sou;
  159. var span = DateTime.Now.Subtract(sou);
  160. var allHour = (span.Days * 24) + span.Hours;
  161. if (allHour >= 168) currentHouse.FaYuTime = $"168h+";
  162. else currentHouse.FaYuTime = $"{allHour}h:{span.Minutes}m";
  163. currentHouse.StartTime = sou.ToString("MM-dd HH:mm");
  164. }
  165. continue;
  166. }
  167. currentHouse.FaYuTime = "";
  168. currentHouse.StartTime = "";
  169. }
  170. }
  171. private void InitDish(List<ExDish> dishList)
  172. {
  173. //ExDish currentDish = null;
  174. //ExDish newDish = null;
  175. //for (int i = 1; i < 11; i++)
  176. //{
  177. // newDish = dishList.FirstOrDefault(x => x.houseSn == i);
  178. // currentDish = HouseSnToDish(i);
  179. // if (currentDish == null) continue;
  180. // if (newDish == null)
  181. // {
  182. // if (currentDish.id > 0) EndDish(i);
  183. // continue;
  184. // }
  185. // currentDish.id = newDish.id;
  186. // currentDish.state = newDish.state;
  187. // currentDish.houseSn = newDish.houseSn;
  188. // currentDish.caseId=newDish.caseId;
  189. // currentDish.wife = newDish.wife;
  190. // currentDish.husband = newDish.husband;
  191. // currentDish.wifeBirth=newDish.wifeBirth;
  192. // currentDish.husbandBirth = newDish.husbandBirth;
  193. // currentDish.vip = newDish.vip;
  194. // currentDish.state = newDish.state;
  195. // currentDish.startTime = newDish.startTime;
  196. // currentDish.fertilizationType = newDish.fertilizationType;
  197. // currentDish.fertilizationTypeId = newDish.fertilizationTypeId;
  198. // currentDish.embryoList = newDish.embryoList;
  199. // currentDish.embryoCount = newDish.embryoCount;
  200. //}
  201. ExDish1 = dishList.FirstOrDefault(x => x.houseSn == 1);
  202. ExDish2 = dishList.FirstOrDefault(x => x.houseSn == 2);
  203. ExDish3 = dishList.FirstOrDefault(x => x.houseSn == 3);
  204. ExDish4 = dishList.FirstOrDefault(x => x.houseSn == 4);
  205. ExDish5 = dishList.FirstOrDefault(x => x.houseSn == 5);
  206. ExDish6 = dishList.FirstOrDefault(x => x.houseSn == 6);
  207. ExDish7 = dishList.FirstOrDefault(x => x.houseSn == 7);
  208. ExDish8 = dishList.FirstOrDefault(x => x.houseSn == 8);
  209. ExDish9 = dishList.FirstOrDefault(x => x.houseSn == 9);
  210. ExDish10 = dishList.FirstOrDefault(x => x.houseSn == 10);
  211. //SetSouJingTime(ExDish1);
  212. //SetSouJingTime(ExDish2);
  213. //SetSouJingTime(ExDish3);
  214. //SetSouJingTime(ExDish4);
  215. //SetSouJingTime(ExDish5);
  216. //SetSouJingTime(ExDish6);
  217. //SetSouJingTime(ExDish7);
  218. //SetSouJingTime(ExDish8);
  219. //SetSouJingTime(ExDish9);
  220. //SetSouJingTime(ExDish10);
  221. }
  222. private void InitBalance(List<ExBalance> balanceList)
  223. {
  224. ExBalance1 = balanceList.FirstOrDefault(x => x.houseSn == 1);
  225. ExBalance2 = balanceList.FirstOrDefault(x => x.houseSn == 2);
  226. ExBalance3 = balanceList.FirstOrDefault(x => x.houseSn == 3);
  227. ExBalance4 = balanceList.FirstOrDefault(x => x.houseSn == 4);
  228. ExBalance5 = balanceList.FirstOrDefault(x => x.houseSn == 5);
  229. ExBalance6 = balanceList.FirstOrDefault(x => x.houseSn == 6);
  230. ExBalance7 = balanceList.FirstOrDefault(x => x.houseSn == 7);
  231. ExBalance8 = balanceList.FirstOrDefault(x => x.houseSn == 8);
  232. ExBalance9 = balanceList.FirstOrDefault(x => x.houseSn == 9);
  233. ExBalance10 = balanceList.FirstOrDefault(x => x.houseSn == 10);
  234. //SetSouJingTime(ExBalance1);
  235. //SetSouJingTime(ExBalance2);
  236. //SetSouJingTime(ExBalance3);
  237. //SetSouJingTime(ExBalance4);
  238. //SetSouJingTime(ExBalance5);
  239. //SetSouJingTime(ExBalance6);
  240. //SetSouJingTime(ExBalance7);
  241. //SetSouJingTime(ExBalance8);
  242. //SetSouJingTime(ExBalance9);
  243. //SetSouJingTime(ExBalance10);
  244. }
  245. /// <summary>
  246. /// 设置培养记录受精时间
  247. /// </summary>
  248. /// <param name="exDish"></param>
  249. private void SetSouJingTime(ExDish exDish)
  250. {
  251. if (exDish == null) return;
  252. if (DateTime.TryParse(exDish.startTime, out DateTime sou))
  253. {
  254. exDish.SouJingTime = sou;
  255. }
  256. var exhoue = HouseSnToExHouse(exDish.houseSn);
  257. if (exhoue == null)
  258. {
  259. return;
  260. }
  261. if (exDish.SouJingTime.HasValue)
  262. {
  263. var endTime = DateTime.Now;
  264. if (!string.IsNullOrEmpty(exDish.endTime))
  265. {
  266. DateTime.TryParse(exDish.endTime, out endTime);
  267. }
  268. var span = endTime.Subtract(exDish.SouJingTime.Value);
  269. exhoue.FaYuTime = $"{(span.Days * 24) + span.Hours}H:{span.Minutes}M";
  270. exhoue.StartTime = exDish.SouJingTime.Value.ToString("MM-dd HH:mm");
  271. }
  272. }
  273. /// <summary>
  274. /// 设置平衡记录开始时间
  275. /// </summary>
  276. /// <param name="exBalance"></param>
  277. private void SetSouJingTime(ExBalance exBalance)
  278. {
  279. if (exBalance == null) return;
  280. if (DateTime.TryParse(exBalance.startTime, out DateTime sou))
  281. {
  282. exBalance.StartDateTime = sou;
  283. }
  284. var exhoue = HouseSnToExHouse(exBalance.houseSn);
  285. if (exhoue == null)
  286. {
  287. return;
  288. }
  289. if (exBalance.StartDateTime.HasValue)
  290. {
  291. var endTime = DateTime.Now;
  292. if (!string.IsNullOrEmpty(exBalance.endTime))
  293. {
  294. DateTime.TryParse(exBalance.endTime, out endTime);
  295. }
  296. var span = endTime.Subtract(exBalance.StartDateTime.Value);
  297. exhoue.FaYuTime = $"{(span.Days * 24) + span.Hours}H:{span.Minutes}M";
  298. exhoue.StartTime = exBalance.StartDateTime.Value.ToString("MM-dd HH:mm");
  299. }
  300. }
  301. /// <summary>
  302. /// 结束培养
  303. /// </summary>
  304. /// <param name="houseSn"></param>
  305. public void EndDish(int houseSn)
  306. {
  307. // M8-G3-1:结束培养——本地清空该舱培养记录与发育/开始时间,属有业务含义的本地操作,埋点(自动计时+异常→失败)。
  308. Aivfo.OperationLog.OperationLogger.Run("舱室操作", "结束培养", () =>
  309. {
  310. switch (houseSn)
  311. {
  312. case 1:
  313. ExDish1 = new ExDish();
  314. break;
  315. case 2:
  316. ExDish2 = new ExDish();
  317. break;
  318. case 3:
  319. ExDish3 = new ExDish();
  320. break;
  321. case 4:
  322. ExDish4 = new ExDish();
  323. break;
  324. case 5:
  325. ExDish5 = new ExDish();
  326. break;
  327. case 6:
  328. ExDish6 = new ExDish();
  329. break;
  330. case 7:
  331. ExDish7 = new ExDish();
  332. break;
  333. case 8:
  334. ExDish8 = new ExDish();
  335. break;
  336. case 9:
  337. ExDish9 = new ExDish();
  338. break;
  339. case 10:
  340. ExDish10 = new ExDish();
  341. break;
  342. }
  343. var exhoue = HouseSnToExHouse(houseSn);
  344. if (exhoue == null) return;
  345. exhoue.FaYuTime = "";
  346. exhoue.StartTime = "";
  347. }, input: new { houseSn });
  348. }
  349. public ExDish HouseSnToDish(int houseSn)
  350. {
  351. ExDish exDish = null;
  352. switch (houseSn)
  353. {
  354. case 1:
  355. exDish = ExDish1;
  356. break;
  357. case 2:
  358. exDish = ExDish2;
  359. break;
  360. case 3:
  361. exDish = ExDish3;
  362. break;
  363. case 4:
  364. exDish = ExDish4;
  365. break;
  366. case 5:
  367. exDish = ExDish5;
  368. break;
  369. case 6:
  370. exDish = ExDish6;
  371. break;
  372. case 7:
  373. exDish = ExDish7;
  374. break;
  375. case 8:
  376. exDish = ExDish8;
  377. break;
  378. case 9:
  379. exDish = ExDish9;
  380. break;
  381. case 10:
  382. exDish = ExDish10;
  383. break;
  384. }
  385. return exDish;
  386. }
  387. public ExHouse HouseSnToExHouse(int houseSn)
  388. {
  389. ExHouse ExHouse = null;
  390. switch (houseSn)
  391. {
  392. case 1:
  393. ExHouse = ExHouse1;
  394. break;
  395. case 2:
  396. ExHouse = ExHouse2;
  397. break;
  398. case 3:
  399. ExHouse = ExHouse3;
  400. break;
  401. case 4:
  402. ExHouse = ExHouse4;
  403. break;
  404. case 5:
  405. ExHouse = ExHouse5;
  406. break;
  407. case 6:
  408. ExHouse = ExHouse6;
  409. break;
  410. case 7:
  411. ExHouse = ExHouse7;
  412. break;
  413. case 8:
  414. ExHouse = ExHouse8;
  415. break;
  416. case 9:
  417. ExHouse = ExHouse9;
  418. break;
  419. case 10:
  420. ExHouse = ExHouse10;
  421. break;
  422. case 11:
  423. ExHouse = ExHouse11;
  424. break;
  425. }
  426. return ExHouse;
  427. }
  428. public ExBalance HouseSnToExBalance(int houseSn)
  429. {
  430. ExBalance exBalance = null;
  431. switch (houseSn)
  432. {
  433. case 1:
  434. exBalance = ExBalance1;
  435. break;
  436. case 2:
  437. exBalance = ExBalance2;
  438. break;
  439. case 3:
  440. exBalance = ExBalance3;
  441. break;
  442. case 4:
  443. exBalance = ExBalance4;
  444. break;
  445. case 5:
  446. exBalance = ExBalance5;
  447. break;
  448. case 6:
  449. exBalance = ExBalance6;
  450. break;
  451. case 7:
  452. exBalance = ExBalance7;
  453. break;
  454. case 8:
  455. exBalance = ExBalance8;
  456. break;
  457. case 9:
  458. exBalance = ExBalance9;
  459. break;
  460. case 10:
  461. exBalance = ExBalance10;
  462. break;
  463. }
  464. return exBalance;
  465. }
  466. /// <summary>
  467. /// 接受mqtt消息
  468. /// </summary>
  469. public void RecMqttMessage(string message)
  470. {
  471. try
  472. {
  473. List<ExHouse> exHouses = JsonConvert.DeserializeObject<List<ExHouse>>(message);
  474. //List<ExHouse> exHouses = new List<ExHouse>();
  475. for (int i = 1; i <= 11; i++)
  476. {
  477. ExHouse currentHouse = HouseSnToExHouse(i);
  478. if (currentHouse == null) continue;
  479. if (i == 11)
  480. {
  481. var exHouse11 = exHouses.FirstOrDefault(x => x.houseSn == i);
  482. if (exHouse11 == null) continue;
  483. currentHouse.pressure = exHouse11.pressure;
  484. //currentHouse.pressureDesc = exHouse11.pressureDesc;
  485. //currentHouse.houseDesc = exHouse11.houseDesc;
  486. currentHouse.PressureString = $"{currentHouse.pressure.ToString("f0")}mbar";
  487. switch (exHouse11.pressureDesc)
  488. {
  489. case "未知":
  490. currentHouse.pressureDesc = KeyToStringConvert.GetLanguageStringByKey("C0281");
  491. break;
  492. case "待补气":
  493. currentHouse.pressureDesc = KeyToStringConvert.GetLanguageStringByKey("C0007");
  494. break;
  495. case "补气":
  496. currentHouse.pressureDesc = KeyToStringConvert.GetLanguageStringByKey("C0006");
  497. break;
  498. case "正常":
  499. currentHouse.pressureDesc = KeyToStringConvert.GetLanguageStringByKey("C0005");
  500. break;
  501. case "冲刷":
  502. currentHouse.pressureDesc = KeyToStringConvert.GetLanguageStringByKey("C0301");
  503. break;
  504. case "排气":
  505. currentHouse.pressureDesc = KeyToStringConvert.GetLanguageStringByKey("C0299");
  506. break;
  507. case "排队":
  508. currentHouse.pressureDesc = KeyToStringConvert.GetLanguageStringByKey("C0300");
  509. break;
  510. default:
  511. currentHouse.pressureDesc=exHouse11.pressureDesc;
  512. break;
  513. }
  514. switch (exHouse11.houseDesc)
  515. {
  516. case "未知":
  517. currentHouse.houseDesc = KeyToStringConvert.GetLanguageStringByKey("C0281");
  518. break;
  519. case "舱室换气":
  520. currentHouse.houseDesc = KeyToStringConvert.GetLanguageStringByKey("C0302");
  521. break;
  522. case "气压监测":
  523. currentHouse.houseDesc = KeyToStringConvert.GetLanguageStringByKey("C0282");
  524. break;
  525. case "缓冲瓶补气":
  526. currentHouse.houseDesc = KeyToStringConvert.GetLanguageStringByKey("C0283");
  527. break;
  528. case "握手准备":
  529. currentHouse.houseDesc = KeyToStringConvert.GetLanguageStringByKey("C0009");
  530. break;
  531. case "水平电机自检":
  532. currentHouse.houseDesc = KeyToStringConvert.GetLanguageStringByKey("C0010");
  533. break;
  534. case "垂直电机自检":
  535. currentHouse.houseDesc = KeyToStringConvert.GetLanguageStringByKey("C0012");
  536. break;
  537. case "调试状态":
  538. currentHouse.houseDesc = KeyToStringConvert.GetLanguageStringByKey("C0013");
  539. break;
  540. case "空闲监测":
  541. currentHouse.houseDesc = KeyToStringConvert.GetLanguageStringByKey("C0014");
  542. break;
  543. case "温压监测平衡":
  544. currentHouse.houseDesc = KeyToStringConvert.GetLanguageStringByKey("C0008");
  545. break;
  546. case "温压监测":
  547. currentHouse.houseDesc = KeyToStringConvert.GetLanguageStringByKey("C0015");
  548. break;
  549. case "气体交换":
  550. currentHouse.houseDesc = KeyToStringConvert.GetLanguageStringByKey("C0016");
  551. break;
  552. case "气体交换平衡":
  553. currentHouse.houseDesc = KeyToStringConvert.GetLanguageStringByKey("C0280");
  554. break;
  555. default:
  556. if (exHouse11.houseDesc.Contains("自动对焦"))
  557. {
  558. currentHouse.houseDesc = exHouse11.houseDesc.Replace("自动对焦", KeyToStringConvert.GetLanguageStringByKey("C0017"));
  559. }else if (exHouse11.houseDesc.Contains("胚胎拍照"))
  560. {
  561. currentHouse.houseDesc = exHouse11.houseDesc.Replace("胚胎拍照", KeyToStringConvert.GetLanguageStringByKey("C0018"));
  562. }
  563. else
  564. {
  565. currentHouse.houseDesc = exHouse11.houseDesc;
  566. }
  567. break;
  568. }
  569. continue;
  570. }
  571. var exHouse = exHouses.FirstOrDefault(x => x.houseSn == i);
  572. if (exHouse != null)
  573. {
  574. currentHouse.pressureAlarm = exHouse.pressureAlarm;
  575. currentHouse.temperatureAlarm = exHouse.temperatureAlarm;
  576. currentHouse.pressure = exHouse.pressure;
  577. currentHouse.temperature = exHouse.temperature;
  578. currentHouse.houseDoorState = exHouse.houseDoorState;
  579. //currentHouse.pressureDesc = exHouse.pressureDesc;
  580. //currentHouse.houseDesc = exHouse.houseDesc;
  581. currentHouse.PressureString = $"{currentHouse.pressure.ToString("f0")}mbar";
  582. currentHouse.TemperatureSring = $"{currentHouse.temperature.ToString("f2")}℃";
  583. switch (exHouse.pressureDesc)
  584. {
  585. case "未知":
  586. currentHouse.pressureDesc = KeyToStringConvert.GetLanguageStringByKey("C0281");
  587. break;
  588. case "待补气":
  589. currentHouse.pressureDesc = KeyToStringConvert.GetLanguageStringByKey("C0007");
  590. break;
  591. case "补气":
  592. currentHouse.pressureDesc = KeyToStringConvert.GetLanguageStringByKey("C0006");
  593. break;
  594. case "正常":
  595. currentHouse.pressureDesc = KeyToStringConvert.GetLanguageStringByKey("C0005");
  596. break;
  597. case "冲刷":
  598. currentHouse.pressureDesc = KeyToStringConvert.GetLanguageStringByKey("C0301");
  599. break;
  600. case "排气":
  601. currentHouse.pressureDesc = KeyToStringConvert.GetLanguageStringByKey("C0299");
  602. break;
  603. case "排队":
  604. currentHouse.pressureDesc = KeyToStringConvert.GetLanguageStringByKey("C0300");
  605. break;
  606. default:
  607. currentHouse.pressureDesc = exHouse.pressureDesc;
  608. break;
  609. }
  610. switch (exHouse.houseDesc)
  611. {
  612. case "未知":
  613. currentHouse.houseDesc = KeyToStringConvert.GetLanguageStringByKey("C0281");
  614. break;
  615. case "握手准备":
  616. currentHouse.houseDesc = KeyToStringConvert.GetLanguageStringByKey("C0009");
  617. break;
  618. case "水平电机自检":
  619. currentHouse.houseDesc = KeyToStringConvert.GetLanguageStringByKey("C0010");
  620. break;
  621. case "垂直电机自检":
  622. currentHouse.houseDesc = KeyToStringConvert.GetLanguageStringByKey("C0012");
  623. break;
  624. case "调试状态":
  625. currentHouse.houseDesc = KeyToStringConvert.GetLanguageStringByKey("C0013");
  626. break;
  627. case "空闲监测":
  628. currentHouse.houseDesc = KeyToStringConvert.GetLanguageStringByKey("C0014");
  629. break;
  630. case "温压监测平衡":
  631. currentHouse.houseDesc = KeyToStringConvert.GetLanguageStringByKey("C0008");
  632. break;
  633. case "温压监测":
  634. currentHouse.houseDesc = KeyToStringConvert.GetLanguageStringByKey("C0015");
  635. break;
  636. case "气体交换":
  637. currentHouse.houseDesc = KeyToStringConvert.GetLanguageStringByKey("C0016");
  638. break;
  639. case "气体交换平衡":
  640. currentHouse.houseDesc = KeyToStringConvert.GetLanguageStringByKey("C0280");
  641. break;
  642. default:
  643. if (exHouse.houseDesc.Contains("自动对焦"))
  644. {
  645. currentHouse.houseDesc = exHouse.houseDesc.Replace("自动对焦", KeyToStringConvert.GetLanguageStringByKey("C0017"));
  646. }
  647. else if (exHouse.houseDesc.Contains("胚胎拍照"))
  648. {
  649. currentHouse.houseDesc = exHouse.houseDesc.Replace("胚胎拍照", KeyToStringConvert.GetLanguageStringByKey("C0018"));
  650. }
  651. else
  652. {
  653. currentHouse.houseDesc = exHouse.houseDesc;
  654. }
  655. break;
  656. }
  657. }
  658. continue;
  659. var currentBalance = HouseSnToExBalance(i);
  660. if (currentBalance != null && currentBalance.StartDateTime.HasValue)
  661. {
  662. var endTime = DateTime.Now;
  663. if (!string.IsNullOrEmpty(currentBalance.endTime))
  664. {
  665. DateTime.TryParse(currentBalance.endTime, out endTime);
  666. }
  667. var span = endTime.Subtract(currentBalance.StartDateTime.Value);
  668. currentHouse.FaYuTime = $"{(span.Days * 24) + span.Hours}H:{span.Minutes}M";
  669. currentHouse.StartTime = currentBalance.StartDateTime.Value.ToString("MM-dd HH:mm");
  670. }
  671. var currentDish = HouseSnToDish(i);
  672. if (currentDish != null && currentDish.SouJingTime.HasValue)
  673. {
  674. var endTime = DateTime.Now;
  675. if (!string.IsNullOrEmpty(currentDish.endTime))
  676. {
  677. DateTime.TryParse(currentDish.endTime, out endTime);
  678. }
  679. var span = endTime.Subtract(currentDish.SouJingTime.Value);
  680. currentHouse.FaYuTime = $"{(span.Days * 24) + span.Hours}H:{span.Minutes}M";
  681. currentHouse.StartTime = currentDish.SouJingTime.Value.ToString("MM-dd HH:mm");
  682. }
  683. }
  684. }
  685. catch (Exception ex)
  686. {
  687. AppData.Instance.LogHelper.ExceptionLog(ex, "解析mqtt消息", LogEnum.RunException);
  688. }
  689. }
  690. public void StartThread()
  691. {
  692. Task.Factory.StartNew(async () =>
  693. {
  694. string yunxing = KeyToStringConvert.GetLanguageStringByKey("C0001");
  695. string genghuang = KeyToStringConvert.GetLanguageStringByKey("C0002");
  696. string baoyang = KeyToStringConvert.GetLanguageStringByKey("C0003");
  697. string tian = KeyToStringConvert.GetLanguageStringByKey("C0004");
  698. while (true)
  699. {
  700. try
  701. {
  702. AlarmCount = AppData.Instance.HttpHelper.SearchAlarmHistoryNumApi(new SearchAlarmResponse { current = 1, selectType = 2, size = 5, tlSn = AppData.Instance.TlSn }).current;
  703. var a = AppData.Instance.HttpHelper.TlInfoTimeApi(tlsn);
  704. if (a == null) continue;
  705. if (a.runTime > 9999) RunTimeString = $"{yunxing}:9999+{tian}";/*RunTimeString = $"运行时间:9999+天";*/
  706. else RunTimeString = $"{yunxing}:{a.runTime}{tian}";/*RunTimeString = $"运行时间:{a.runTime}天";*/
  707. if (a.maintenanceTime > 9999) MaintenanceTimeString = $"{baoyang}:9999+{tian}";/*MaintenanceTimeString = $"保养倒计时:9999+天";*/
  708. else MaintenanceTimeString = $"{baoyang}:{a.maintenanceTime}{tian}";/*MaintenanceTimeString = $"保养倒计时:{a.maintenanceTime}天";*/
  709. if (a.hepatime > 9999) HepaTimeString = $"{genghuang}:9999+{tian}";/*HepaTimeString = $"更换HEPA时间:9999+天";*/
  710. else HepaTimeString = $"{genghuang}:{a.hepatime}{tian}";/* HepaTimeString = $"更换HEPA时间:{a.hepatime}天";*/
  711. // M5-04-4:HTTP 轮询本轮成功,写「最后成功通讯时间」供 control GetMonitorSnapshot 透出、服务监控页上色。
  712. // a==null 已在上面 continue(失联不更新),故走到这里即视为 HTTP 链路通。try 兜底,绝不因监控埋点影响主轮询。
  713. try { ivf_tl_Control.AppData.Instance.LastHttpOkAt = DateTime.Now; } catch { }
  714. Init();
  715. }
  716. catch (Exception ex)
  717. {
  718. AppData.Instance.LogHelper.ExceptionLog(ex, "定时刷新", LogEnum.RunException);
  719. }
  720. finally
  721. {
  722. await Task.Delay(1000 * 5);
  723. }
  724. }
  725. }, TaskCreationOptions.LongRunning);
  726. Task.Factory.StartNew(async () =>
  727. {
  728. string newPath = "";
  729. while (true)
  730. {
  731. try
  732. {
  733. if(AppData.Instance.TLSettingCommon.cleanSurfaceData != 0)
  734. {
  735. newPath = $"{AppData.Instance.DefeatPan}:\\TLData\\ivf_tl_Operate_logs";
  736. DeleteLogDir(newPath, AppData.Instance.TLSettingCommon.cleanSurfaceData);
  737. newPath = $"{AppData.Instance.DefeatPan}:\\TLData\\ivf_tl_Operate_logs\\Log";
  738. DeleteLogFile(newPath, AppData.Instance.TLSettingCommon.cleanSurfaceData);
  739. newPath = $"{AppData.Instance.DefeatPan}:\\TLData\\ivf_tl_Operate_logs\\LogError";
  740. DeleteLogFile(newPath, AppData.Instance.TLSettingCommon.cleanSurfaceData);
  741. }
  742. }
  743. catch (Exception ex)
  744. {
  745. AppData.Instance.LogHelper.ExceptionLog(ex, "DeleteLog", LogEnum.RunException);
  746. }
  747. finally
  748. {
  749. await Task.Delay(1000 * 60 * 60 * 12);
  750. }
  751. }
  752. }, TaskCreationOptions.LongRunning);
  753. }
  754. private void DeleteLogDir(string newPath,int day)
  755. {
  756. var newDir = Directory.GetDirectories(newPath, "*", SearchOption.TopDirectoryOnly);
  757. string dirName = "";
  758. DateTime dirTime = DateTime.Now;
  759. DateTime nowTime = dirTime;
  760. foreach (var item in newDir)
  761. {
  762. dirName = System.IO.Path.GetFileName(item);
  763. if (DateTime.TryParse(dirName, out dirTime))
  764. {
  765. if (nowTime.Subtract(dirTime).Days >= day)
  766. {
  767. try
  768. {
  769. Directory.Delete(item, true);
  770. }
  771. catch (Exception)
  772. {
  773. continue;
  774. }
  775. }
  776. }
  777. }
  778. }
  779. private void DeleteLogFile(string newPath,int day)
  780. {
  781. var newDir = Directory.GetFiles(newPath, "*.htm", SearchOption.TopDirectoryOnly);
  782. string fileName = "";
  783. DateTime fileTime = DateTime.Now;
  784. DateTime nowTime = fileTime;
  785. foreach (var item in newDir)
  786. {
  787. fileName = System.IO.Path.GetFileNameWithoutExtension(item);
  788. if (fileName.Length == 8)
  789. {
  790. fileName = fileName.Insert(6, "-");
  791. fileName = fileName.Insert(4, "-");
  792. if (DateTime.TryParse(fileName, out fileTime))
  793. {
  794. if (nowTime.Subtract(fileTime).Days >= day)
  795. {
  796. try
  797. {
  798. File.Delete(item);
  799. }
  800. catch (Exception)
  801. {
  802. continue;
  803. }
  804. }
  805. }
  806. }
  807. }
  808. }
  809. public void StartMqtt()
  810. {
  811. AppData.Instance.MqttHelper.MessEvent -= RecMqttMessage;
  812. AppData.Instance.MqttHelper.MessEvent += RecMqttMessage;
  813. AppData.Instance.MqttHelper.StartMqtt();
  814. }
  815. List<long> ReadAlarmId = new List<long>();
  816. Queue<AlarmHistoryEntity> AlarmQueue = new Queue<AlarmHistoryEntity>();
  817. private object AlarmQueueLock = new object();
  818. public void StartSpeaker()
  819. {
  820. Task.Factory.StartNew(async () =>
  821. {
  822. SpeechSynthesizer speech = new SpeechSynthesizer();
  823. speech.Volume = 100;
  824. var currentVoiceInfo = speech.GetInstalledVoices(CultureInfo.CurrentCulture).FirstOrDefault();
  825. if (currentVoiceInfo != null) speech.SelectVoice(currentVoiceInfo.VoiceInfo.Name);
  826. AlarmHistoryResult alarmHistoryResult = null;
  827. AlarmHistoryEntity currentAlarm = null;
  828. string yiqi = KeyToStringConvert.GetLanguageStringByKey("C0230");
  829. string huanchongp = KeyToStringConvert.GetLanguageStringByKey("C0231");
  830. string hcs = KeyToStringConvert.GetLanguageStringByKey("C0056");
  831. int dataCount = 0;
  832. string houseSnString = null;
  833. string speakText = "";
  834. while (true)
  835. {
  836. try
  837. {
  838. currentAlarm = AlarmDequeue();
  839. if (currentAlarm != null && currentAlarm.mute == 0)
  840. {
  841. if (currentAlarm.houseSn == 0)
  842. {
  843. //houseSnString = "时差仪器";
  844. houseSnString = yiqi;
  845. }
  846. else if (currentAlarm.houseSn == 11)
  847. {
  848. //houseSnString = "缓冲瓶";
  849. houseSnString = huanchongp;
  850. }
  851. else
  852. {
  853. //houseSnString = $"{currentAlarm.houseSn}号舱室";
  854. houseSnString = $"{currentAlarm.houseSn}{hcs}";
  855. }
  856. speakText = $"{houseSnString}{currentAlarm.title}";
  857. speech.Speak(speakText);
  858. }
  859. currentAlarm = null;
  860. if (!AlarmQueueAny())
  861. {
  862. //ReadAlarmId.Clear();
  863. alarmHistoryResult = AppData.Instance.HttpHelper.SearchAlarmHistoryApi(new SearchAlarmResponse { current = 1, selectType = 2, size = 999, tlSn = AppData.Instance.TlSn });
  864. if (alarmHistoryResult.IsSuccess)
  865. {
  866. dataCount = 0;
  867. foreach (var item in alarmHistoryResult.records)
  868. {
  869. //if (ReadAlarmId.Contains(item.id)) continue;
  870. //ReadAlarmId.Add(item.id);
  871. if (item.mute == 0)
  872. {
  873. AlarmEnqueue(item);
  874. dataCount++;
  875. }
  876. }
  877. if (dataCount == 0) await Task.Delay(5000);
  878. }
  879. else
  880. {
  881. await Task.Delay(5000);
  882. }
  883. await Task.Delay(1000);
  884. }
  885. }
  886. catch (Exception ex)
  887. {
  888. AppData.Instance.LogHelper.ExceptionLog(ex, $"语音报警:{speakText}", LogEnum.RunException);
  889. }
  890. finally
  891. {
  892. await Task.Delay(100);
  893. }
  894. }
  895. }, TaskCreationOptions.LongRunning);
  896. }
  897. public void SetAlarmMute(long id, int mute)
  898. {
  899. try
  900. {
  901. lock (AlarmQueueLock)
  902. {
  903. var aa = AlarmQueue.FirstOrDefault(x => x.id == id);
  904. if (aa != null) aa.mute = mute;
  905. }
  906. // M8-G3-1:报警静音/取消静音——本地修改报警队列状态,属有业务含义的本地操作。原方法吞异常,故用兜底 Log 直记成功(不改控制流)。
  907. Aivfo.OperationLog.OperationLogger.Log("报警操作", "设置报警静音", input: new { id, mute }, result: "成功");
  908. }
  909. catch (Exception ex)
  910. {
  911. // M8-G3-1:失败兜底直记(沿用原异常吞处理,不重抛)。
  912. Aivfo.OperationLog.OperationLogger.Log("报警操作", "设置报警静音", input: new { id, mute }, result: "失败", error: ex.GetType().Name + ": " + ex.Message);
  913. AppData.Instance.LogHelper.ExceptionLog(ex, "SetAlarmMute", LogEnum.RunException);
  914. }
  915. }
  916. private void AlarmEnqueue(AlarmHistoryEntity alarmHistoryEntity)
  917. {
  918. try
  919. {
  920. lock (AlarmQueueLock)
  921. {
  922. AlarmQueue.Enqueue(alarmHistoryEntity);
  923. }
  924. }
  925. catch (Exception ex)
  926. {
  927. AppData.Instance.LogHelper.ExceptionLog(ex, "AlarmEnqueue", LogEnum.RunException);
  928. }
  929. }
  930. private AlarmHistoryEntity AlarmDequeue()
  931. {
  932. try
  933. {
  934. lock (AlarmQueueLock)
  935. {
  936. if (AlarmQueue.Any()) return AlarmQueue.Dequeue();
  937. }
  938. return null;
  939. }
  940. catch (Exception ex)
  941. {
  942. AppData.Instance.LogHelper.ExceptionLog(ex, "AlarmDequeue", LogEnum.RunException);
  943. return null;
  944. }
  945. }
  946. private bool AlarmQueueAny()
  947. {
  948. try
  949. {
  950. lock (AlarmQueueLock) return AlarmQueue.Any();
  951. }
  952. catch (Exception ex)
  953. {
  954. AppData.Instance.LogHelper.ExceptionLog(ex, "AlarmQueueAny", LogEnum.RunException);
  955. lock (AlarmQueueLock) AlarmQueue.Clear();
  956. return false;
  957. }
  958. }
  959. }
  960. }