MarkUseViewModel.cs 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550
  1. using CommunityToolkit.Mvvm.ComponentModel;
  2. using ivf_tl_Entity.Entity;
  3. using ivf_tl_Entity.Entity.balance;
  4. using ivf_tl_Entity.Entity.Mark;
  5. using ivf_tl_Entity.Entity.Result;
  6. using ivf_tl_Entity.Enums;
  7. using ivf_tl_Entity.Response;
  8. using ivf_tl_Manage.Converts;
  9. using ivf_tl_Manage.Win;
  10. using ivf_tl_Service.HttpProvider;
  11. using log4net.Layout;
  12. using Newtonsoft.Json.Linq;
  13. using System;
  14. using System.Collections.Generic;
  15. using System.Linq;
  16. using System.Text;
  17. using System.Threading.Tasks;
  18. using System.Windows;
  19. namespace ivf_tl_Manage.ViewModels
  20. {
  21. public partial class MarkUseViewModel : BaseViewModel
  22. {
  23. //public List<GetPicturesByRecordIdData> AllEmbryoPicAndVideo { get; set; } = new List<GetPicturesByRecordIdData>();
  24. //public PictureEntity CurrentPicZhen { get; set; }
  25. //public GetPicturesByRecordIdData CurrentVideoData { get; set; } = null;
  26. public event Action<int, int, string> DingWeiEvent;
  27. [ObservableProperty]
  28. private Dish currentDish;
  29. [ObservableProperty]
  30. private Embryo currentEmbryo = null;
  31. [ObservableProperty]
  32. private double videoAllTime = 1;
  33. [ObservableProperty]
  34. private double videoCurrentTime = 0;
  35. [ObservableProperty]
  36. private int currentFocal = 0;
  37. [ObservableProperty]
  38. private Dictionary<double, string> fpsItemList = new Dictionary<double, string>();
  39. [ObservableProperty]
  40. private KeyValuePair<double, string> selectedFps = new KeyValuePair<double, string>(1, "1.0x");
  41. [ObservableProperty]
  42. private List<MarkEntity> markList = new List<MarkEntity>();
  43. [ObservableProperty]
  44. private MarkEntity currentMarkEntity = null;
  45. [ObservableProperty]
  46. private List<MarkModelTypeEntity> markModelTypeList = new List<MarkModelTypeEntity>();
  47. [ObservableProperty]
  48. private MarkModelTypeEntity currentMarkModelType = null;
  49. [ObservableProperty]
  50. private bool isDishRecord = false;
  51. [ObservableProperty]
  52. private bool isUpdata = false;
  53. [ObservableProperty]
  54. private bool isCurrentDish = true;
  55. [ObservableProperty]
  56. private int currentVideoFps = 1;
  57. public DetailProvider detailProvider = null;
  58. public List<DishPicAndVideo> DishPicAndVideoList { get; set; } = new List<DishPicAndVideo>();
  59. public DishPicAndVideo CurrentWellDishPicAndVideo { get; set; } = null;
  60. public LayerPicAndVideo CurrentWellLayerPicAndVideo { get; set; } = null;
  61. public DetailPic CurrentPic { get; set; } = null;
  62. public List<ButtonEntity> QuickButtons { get; set; } = new List<ButtonEntity>();
  63. public DetailViewModel DetailViewModel = null;
  64. public BaseViewModel RecordViewModel = null;
  65. public bool isPdf = false;
  66. public PdfViewModel PdfParentViewModel = null;
  67. public MarkUseViewModel(DetailViewModel detailViewModel, bool IsDishRecord, bool b)
  68. {
  69. //base.ViewModelName = nameof(MarkUseViewModel);
  70. //DetailViewModel = detailViewModel;
  71. //tLInfo = detailViewModel.tLInfo;
  72. //Title = titi;
  73. //CurrentDish = detailViewModel.CurrentDish;
  74. //DishPicAndVideoList = detailViewModel.DishPicAndVideoList;
  75. //QuickButtons = detailViewModel.QuickButtons;
  76. //FpsItemList.Add(2, "2.0x");
  77. //FpsItemList.Add(1.5, "1.5x");
  78. //FpsItemList.Add(1.25, "1.25x");
  79. //FpsItemList.Add(1, "1.0x");
  80. //FpsItemList.Add(0.5, "0.5x");
  81. //FpsItemList.Add(0.25, "0.25x");
  82. //if (detailProvider == null) detailProvider = AppData.Instance.GetDetailProvider();
  83. //IsUpdata = true;
  84. base.NavName = KeyToStringConvert.GetLanguageStringByKey("0159");
  85. base.ViewModelName = nameof(MarkUseViewModel);
  86. base.NavList.Clear();
  87. foreach (var item in detailViewModel.NavList)
  88. {
  89. base.NavList.Add(item);
  90. }
  91. base.NavList.Add(this);
  92. DetailViewModel = detailViewModel;
  93. CurrentDish = detailViewModel.CurrentDish;
  94. DishPicAndVideoList = detailViewModel.DishPicAndVideoList;
  95. QuickButtons = detailViewModel.QuickButtons;
  96. FpsItemList.Add(2, "2.0x");
  97. FpsItemList.Add(1.5, "1.5x");
  98. FpsItemList.Add(1.25, "1.25x");
  99. FpsItemList.Add(1, "1.0x");
  100. FpsItemList.Add(0.5, "0.5x");
  101. FpsItemList.Add(0.25, "0.25x");
  102. if (detailProvider == null) detailProvider = AppData.Instance.GetDetailProvider();
  103. this.IsDishRecord = IsDishRecord;
  104. IsUpdata = true;
  105. IsCurrentDish = b;
  106. }
  107. public MarkUseViewModel(PdfViewModel pdfViewModel, bool b)
  108. {
  109. isPdf = true;
  110. PdfParentViewModel = pdfViewModel;
  111. base.NavName = KeyToStringConvert.GetLanguageStringByKey("0159");
  112. base.ViewModelName = nameof(MarkUseViewModel);
  113. base.NavList.Clear();
  114. foreach (var item in pdfViewModel.NavList)
  115. {
  116. base.NavList.Add(item);
  117. }
  118. base.NavList.Add(this);
  119. CurrentDish = pdfViewModel.Dish;
  120. if (detailProvider == null) detailProvider = AppData.Instance.GetDetailProvider();
  121. FpsItemList.Add(2, "2.0x");
  122. FpsItemList.Add(1.5, "1.5x");
  123. FpsItemList.Add(1.25, "1.25x");
  124. FpsItemList.Add(1, "1.0x");
  125. FpsItemList.Add(0.5, "0.5x");
  126. FpsItemList.Add(0.25, "0.25x");
  127. this.IsDishRecord = IsDishRecord;
  128. IsUpdata = true;
  129. IsCurrentDish = b;
  130. if (PdfParentViewModel != null && PdfParentViewModel.DishPicAndVideoList.Any() && PdfParentViewModel.QuickButtons.Any())
  131. {
  132. DishPicAndVideoList = PdfParentViewModel.DishPicAndVideoList;
  133. QuickButtons = PdfParentViewModel.QuickButtons;
  134. Init();
  135. isPdf = false;
  136. }
  137. }
  138. public void Initnew()
  139. {
  140. SelectedFps = new KeyValuePair<double, string>(1, "1.0x");
  141. CurrentEmbryo = null;
  142. DishPicAndVideoList.Clear();
  143. CurrentWellDishPicAndVideo = null;
  144. CurrentWellLayerPicAndVideo = null;
  145. CurrentPic = null;
  146. QuickButtons.Clear();
  147. if (CurrentDish.embryoList != null && CurrentDish.embryoList.Any())
  148. DishPicAndVideoList = detailProvider.GetRecordDetailApi(CurrentDish.tlSn, CurrentDish.houseSn, CurrentDish.id, CurrentDish.embryoList.Select(x => x.wellSn).ToList());
  149. QuickButtons = detailProvider.GetQuickButtonsApi();
  150. PdfParentViewModel.QuickButtons = QuickButtons;
  151. PdfParentViewModel.DishPicAndVideoList = DishPicAndVideoList;
  152. Init();
  153. }
  154. public void Init()
  155. {
  156. MarkModelTypeList = detailProvider.GetEnableMarkModelTypeApi();
  157. //if (MarkModelTypeList.Any()) CurrentMarkModelType = MarkModelTypeList.First();
  158. }
  159. partial void OnCurrentEmbryoChanged(Embryo value)
  160. {
  161. if (value == null)
  162. {
  163. foreach (var item in MarkList)
  164. {
  165. item.minTimeString = "0h";
  166. item.maxTime = 0;
  167. }
  168. var a1 = CurrentMarkEntity;
  169. CurrentMarkEntity = null;
  170. CurrentMarkEntity = a1;
  171. return;
  172. }
  173. value.embryoMark = detailProvider.GetEmbryoMarkApi(value.id);
  174. var a = CurrentMarkEntity;
  175. CurrentMarkEntity = null;
  176. CurrentMarkEntity = a;
  177. EmbryoMark embryoMark = null;
  178. foreach (var item in MarkList)
  179. {
  180. embryoMark = value.embryoMark.FirstOrDefault(x => x.markId == item.id);
  181. if (embryoMark == null)
  182. {
  183. item.minTimeString = "0h";
  184. item.maxTime = 0;
  185. continue;
  186. }
  187. item.pictureLayer = embryoMark.pictureLayer;
  188. item.maxTime = embryoMark.developTime;
  189. item.minTimeString = $"{(embryoMark.developTime / 60).ToString("D2")}h:{(embryoMark.developTime % 60).ToString("D2")}m";
  190. }
  191. }
  192. partial void OnCurrentMarkModelTypeChanged(MarkModelTypeEntity value)
  193. {
  194. if (value == null)
  195. {
  196. MarkList.Clear();
  197. CurrentMarkEntity = null;
  198. return;
  199. }
  200. MarkList = detailProvider.GetEmbryoMarkEntityAPi(value.id);
  201. if (MarkList.Any())
  202. {
  203. CurrentMarkEntity = MarkList.First();
  204. if (CurrentEmbryo == null)
  205. {
  206. foreach (var item in MarkList)
  207. {
  208. item.minTimeString = "0h";
  209. item.maxTime = 0;
  210. }
  211. return;
  212. }
  213. EmbryoMark embryoMark = null;
  214. foreach (var item in MarkList)
  215. {
  216. embryoMark = CurrentEmbryo.embryoMark.FirstOrDefault(x => x.markId == item.id);
  217. if (embryoMark == null)
  218. {
  219. item.minTimeString = "0h";
  220. item.maxTime = 0;
  221. continue;
  222. }
  223. item.pictureLayer = embryoMark.pictureLayer;
  224. item.maxTime = embryoMark.developTime;
  225. item.minTimeString = $"{(embryoMark.developTime / 60).ToString("D2")}h:{(embryoMark.developTime % 60).ToString("D2")}m";
  226. //item.minTime = (int)Math.Round((embryoMark.developTime / 60d), 0, MidpointRounding.AwayFromZero);
  227. }
  228. }
  229. else CurrentMarkEntity = null;
  230. }
  231. partial void OnCurrentMarkEntityChanged(MarkEntity value)
  232. {
  233. try
  234. {
  235. if (value == null) return;
  236. List<MarkEntity> markNews = new List<MarkEntity>();//模板中倒数第二级别
  237. GetLeafParentNodeList(value, markNews);
  238. if (CurrentEmbryo == null)
  239. {
  240. foreach (var item in markNews) item.CurrentValue = null;
  241. return;
  242. }
  243. if (CurrentEmbryo.embryoMark == null)
  244. {
  245. foreach (var item in markNews) item.CurrentValue = null;
  246. }
  247. else
  248. {
  249. var currentMarkDetil = CurrentEmbryo.embryoMark.FirstOrDefault(x => x.markId == value.id);
  250. if (currentMarkDetil == null)
  251. {
  252. foreach (var item in markNews) item.CurrentValue = null;
  253. }
  254. else
  255. {
  256. List<EmbryoMark> lastMarkList = new List<EmbryoMark>();
  257. GetLeafParentNodeList(currentMarkDetil, lastMarkList);
  258. foreach (var item in markNews)
  259. {
  260. var oldValue = lastMarkList.FirstOrDefault(x => x.markId == item.id);
  261. if (oldValue == null)
  262. {
  263. item.CurrentValue = null;
  264. }
  265. else
  266. {
  267. if (oldValue.children != null && oldValue.children.Any() && item.children != null && item.children.Any())
  268. {
  269. var defaultDeail = item.children.FirstOrDefault(x => x.id == oldValue.children.First().markId);
  270. if (defaultDeail != null)
  271. {
  272. item.CurrentValue = defaultDeail;
  273. continue;
  274. }
  275. }
  276. item.CurrentValue = null;
  277. }
  278. }
  279. //if (value.maxTime != 0) DingWeiEvent?.Invoke(value.maxTime, value.maxTime, value.name);
  280. }
  281. }
  282. return;
  283. if (CurrentEmbryo == null)
  284. {
  285. foreach (var item in markNews)
  286. {
  287. if (item.children != null && item.children.Any())
  288. {
  289. var defaultDeail = item.children.FirstOrDefault(x => x.defaultValue == 1);
  290. if (defaultDeail != null)
  291. {
  292. item.CurrentValue = defaultDeail;
  293. continue;
  294. }
  295. }
  296. item.CurrentValue = null;
  297. }
  298. return;
  299. }
  300. if (CurrentEmbryo.embryoMark == null)
  301. {
  302. foreach (var item in markNews)
  303. {
  304. if (item.children != null && item.children.Any())
  305. {
  306. var defaultDeail = item.children.FirstOrDefault(x => x.defaultValue == 1);
  307. if (defaultDeail != null)
  308. {
  309. item.CurrentValue = defaultDeail;
  310. continue;
  311. }
  312. }
  313. item.CurrentValue = null;
  314. }
  315. }
  316. else
  317. {
  318. var currentMarkDetil = CurrentEmbryo.embryoMark.FirstOrDefault(x => x.markId == value.id);
  319. if (currentMarkDetil == null)
  320. {
  321. foreach (var item in markNews)
  322. {
  323. if (item.children != null && item.children.Any())
  324. {
  325. var defaultDeail = item.children.FirstOrDefault(x => x.defaultValue == 1);
  326. if (defaultDeail != null)
  327. {
  328. item.CurrentValue = defaultDeail;
  329. continue;
  330. }
  331. }
  332. item.CurrentValue = null;
  333. }
  334. }
  335. else
  336. {
  337. List<EmbryoMark> lastMarkList = new List<EmbryoMark>();
  338. GetLeafParentNodeList(currentMarkDetil, lastMarkList);
  339. foreach (var item in markNews)
  340. {
  341. var oldValue = lastMarkList.FirstOrDefault(x => x.markId == item.id);
  342. if (oldValue == null)
  343. {
  344. if (item.children != null && item.children.Any())
  345. {
  346. var defaultDeail = item.children.FirstOrDefault(x => x.defaultValue == 1);
  347. if (defaultDeail != null)
  348. {
  349. item.CurrentValue = defaultDeail;
  350. continue;
  351. }
  352. }
  353. item.CurrentValue = null;
  354. }
  355. else
  356. {
  357. if (oldValue.children != null && oldValue.children.Any() && item.children != null && item.children.Any())
  358. {
  359. var defaultDeail = item.children.FirstOrDefault(x => x.id == oldValue.children.First().markId);
  360. if (defaultDeail != null)
  361. {
  362. item.CurrentValue = defaultDeail;
  363. continue;
  364. }
  365. }
  366. if (item.children != null && item.children.Any())
  367. {
  368. var defaultDeail = item.children.FirstOrDefault(x => x.defaultValue == 1);
  369. if (defaultDeail != null)
  370. {
  371. item.CurrentValue = defaultDeail;
  372. continue;
  373. }
  374. }
  375. item.CurrentValue = null;
  376. }
  377. }
  378. }
  379. }
  380. }
  381. catch (Exception ex)
  382. {
  383. ExLog(ex, "OnCurrentMarkEntityChanged");
  384. }
  385. }
  386. private void GetLeafParentNodeList(MarkEntity markEntity, List<MarkEntity> list)
  387. {
  388. if (markEntity.child != 1) return;
  389. if (markEntity.children != null && markEntity.children.Any())
  390. {
  391. var a = markEntity.children.FirstOrDefault(x => x.child == 1);
  392. if (a == null)
  393. {
  394. list.Add(markEntity);
  395. return;
  396. }
  397. foreach (var item in markEntity.children)
  398. {
  399. GetLeafParentNodeList(item, list);
  400. }
  401. return;
  402. }
  403. list.Add(markEntity);
  404. }
  405. private void GetLeafParentNodeList(EmbryoMark markEntity, List<EmbryoMark> list)
  406. {
  407. if (markEntity.child != 1) return;
  408. if (markEntity.children != null && markEntity.children.Any())
  409. {
  410. var a = markEntity.children.FirstOrDefault(x => x.child == 1);
  411. if (a == null)
  412. {
  413. list.Add(markEntity);
  414. return;
  415. }
  416. foreach (var item in markEntity.children)
  417. {
  418. GetLeafParentNodeList(item, list);
  419. }
  420. return;
  421. }
  422. list.Add(markEntity);
  423. }
  424. public void SaveMark(MarkEntity MarkSource)
  425. {
  426. try
  427. {
  428. if (CurrentEmbryo == null)
  429. {
  430. new ToastMessageWindow(AppData.Instance.MainWindow, 1920, 65, KeyToStringConvert.GetLanguageStringByKey("0303")).Show();
  431. return;
  432. }
  433. if (CurrentPic == null)
  434. {
  435. //new ToastMessageWindow(AppData.Instance.MainWindow, 1920, 65, $"当前没有图片,无法标记").Show();
  436. new ToastMessageWindow(AppData.Instance.MainWindow, 1920, 65,KeyToStringConvert.GetLanguageStringByKey("0543")).Show();
  437. return;
  438. }
  439. List<MarkEntity> markNews = new List<MarkEntity>();
  440. GetLeafParentNodeList(MarkSource, markNews);
  441. var a = markNews.FirstOrDefault(x => x.CurrentValue == null);
  442. if (a != null)
  443. {
  444. var b = markNews.FirstOrDefault(x => x.markKey == "2PN/PN-NUM");
  445. if (b == null || b.CurrentValue == null || b.CurrentValue.markKey == "2PN/2")
  446. {
  447. new ToastMessageWindow(AppData.Instance.MainWindow, 1920, 65, $"{a.name} {KeyToStringConvert.GetLanguageStringByKey("0336")}").Show();
  448. return;
  449. }
  450. //if (b != null && (b.CurrentValue.markKey == "2PN/0" || b.CurrentValue.markKey == "2PN/3"))
  451. //{
  452. //}
  453. //else
  454. //{
  455. // //new ToastMessageWindow(AppData.Instance.MainWindow, 1920, 65, $"{a.name}的下级为空").Show();
  456. // new ToastMessageWindow(AppData.Instance.MainWindow, 1920, 65, $"{a.name} {KeyToStringConvert.GetLanguageStringByKey("0336")}").Show();
  457. // return;
  458. //}
  459. }
  460. EmbryoMarkResponse embryoMarkResponse = new EmbryoMarkResponse();
  461. embryoMarkResponse.tlSn = AppData.Instance.CurrentTlInfo.tlSn;
  462. embryoMarkResponse.embryoCultureRecordId = CurrentDish.id;
  463. embryoMarkResponse.embryoId = CurrentEmbryo.id;
  464. embryoMarkResponse.houseSn = CurrentDish.houseSn;
  465. embryoMarkResponse.markKey = MarkSource.markKey;
  466. embryoMarkResponse.model = MarkSource.model;
  467. embryoMarkResponse.developTime = CurrentPic.developTime;
  468. embryoMarkResponse.layer = CurrentFocal;
  469. //embryoMarkResponse.pictureUuid = CurrentPicZhen.id;
  470. embryoMarkResponse.rootId = MarkSource.id;
  471. foreach (var item in markNews)
  472. {
  473. if (item.CurrentValue == null) continue;
  474. embryoMarkResponse.leafNode.Add(new LeafNode()
  475. {
  476. child = item.CurrentValue.child,
  477. id = item.CurrentValue.id,
  478. markKey = item.CurrentValue.markKey,
  479. markName = item.CurrentValue.name,
  480. parentId = item.id,
  481. });
  482. }
  483. if (detailProvider.SaveMarkApi(embryoMarkResponse))
  484. {
  485. CurrentEmbryo.embryoMark = detailProvider.GetEmbryoMarkApi(CurrentEmbryo.id);
  486. var current = CurrentEmbryo.embryoMark.FirstOrDefault(x => x.markId == MarkSource.id);
  487. if (current == null)
  488. {
  489. MarkSource.minTimeString = "0h";
  490. MarkSource.maxTime = 0;
  491. MarkSource.pictureLayer = 0;
  492. }
  493. else
  494. {
  495. //MarkSource.minTime = $"{(current.developTime / 60d)}h:{current.developTime % 60d}m";
  496. MarkSource.maxTime = current.developTime;
  497. MarkSource.minTimeString = $"{(current.developTime / 60).ToString("D2")}h:{(current.developTime % 60).ToString("D2")}m";
  498. MarkSource.pictureLayer = CurrentFocal;
  499. //(int)Math.Round((current.developTime / 60d), 0, MidpointRounding.AwayFromZero);
  500. }
  501. new ToastWindow(AppData.Instance.MainWindow, 1920, 65, true).Show();
  502. if (PdfParentViewModel != null) PdfParentViewModel.IsUpdateAi = true;
  503. }
  504. else
  505. {
  506. new ToastWindow(AppData.Instance.MainWindow, 1920, 65, false).Show();
  507. }
  508. }
  509. catch (Exception ex)
  510. {
  511. new ToastWindow(AppData.Instance.MainWindow, 1920, 65, false).Show();
  512. ExLog(ex, "SaveMark");
  513. }
  514. }
  515. internal bool MarkEmbryo(int embryoState)
  516. {
  517. return detailProvider.MarkEmbryoDestinationApi(CurrentEmbryo.id, embryoState);
  518. }
  519. }
  520. }