UCPatchGrid.xaml.cs 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954
  1. using MeterVision.Config;
  2. using MeterVision.db;
  3. using MeterVision.Dlg;
  4. using MeterVision.FreeAi;
  5. using MeterVision.model;
  6. using MeterVision.Util;
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Collections.ObjectModel;
  10. using System.ComponentModel;
  11. using System.IO;
  12. using System.Linq;
  13. using System.Text;
  14. using System.Threading;
  15. using System.Threading.Tasks;
  16. using System.Windows;
  17. using System.Windows.Controls;
  18. using System.Windows.Data;
  19. using System.Windows.Documents;
  20. using System.Windows.Input;
  21. using System.Windows.Media;
  22. using System.Windows.Media.Imaging;
  23. using System.Windows.Navigation;
  24. using System.Windows.Shapes;
  25. namespace MeterVision.Patch
  26. {
  27. /// <summary>
  28. /// UCPatchGrid.xaml 的交互逻辑
  29. /// </summary>
  30. public partial class UCPatchGrid : UserControl, INotifyPropertyChanged
  31. {
  32. public event PropertyChangedEventHandler PropertyChanged;
  33. protected void OnPropertyChanged(string propertyName)
  34. {
  35. PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
  36. }
  37. //定义任务详情数据源
  38. public ObservableCollection<PatchDetailItem> PatchDetailItemList { get; set; }
  39. // 定义事件,用于通知外部组件选中项已更改
  40. public event EventHandler<PatchDetailItemChangedEventArgs> OnSelectedPatchDetailItemChanged;
  41. public event Action<string> OnRefreshPatchItem;
  42. //删除标准模板明细事件
  43. public static event Action<string> OnDeleteStandDetail;
  44. //修改标准模板值事件
  45. public static event Action<string,string> OnUpdateStandValue;
  46. private PatchDetailItem _selectedPatchDetailItem;
  47. //定义SelectedDataItem属性,并在值变化时触发事件
  48. public PatchDetailItem SelectedPatchDetailItem
  49. {
  50. get => _selectedPatchDetailItem;
  51. set
  52. {
  53. if (_selectedPatchDetailItem != value)
  54. {
  55. _selectedPatchDetailItem = value;
  56. OnPropertyChanged(nameof(SelectedPatchDetailItem));
  57. OnSelectedPatchDetailItemChanged?.Invoke(this, new PatchDetailItemChangedEventArgs(value));
  58. }
  59. }
  60. }
  61. private PatchItem _curPatchItem;
  62. public PatchItem CurPatchItem
  63. {
  64. get => _curPatchItem;
  65. private set
  66. {
  67. if (_curPatchItem != value)
  68. {
  69. _curPatchItem = value;
  70. //PatchDetailPage.InitDefaulValue(mConfigItem.PatchPageSize);
  71. //PatchDetailPage.InitDefaulValue();
  72. //LoadPatchDetailItemList();
  73. }
  74. }
  75. }
  76. private PatchFindType _selectedPatchFindType;
  77. public PatchFindType SelectedPatchFindType
  78. {
  79. get => _selectedPatchFindType;
  80. private set
  81. {
  82. if (_selectedPatchFindType != value)
  83. {
  84. _selectedPatchFindType = value;
  85. //OnPropertyChanged(nameof(SelectedPatchFindType));
  86. //PatchDetailPage.InitDefaulValue();
  87. }
  88. }
  89. }
  90. //改变PatchItem或PatchFinType
  91. public void ChangePatchItemOrFinType(PatchItem curPatchItem,PatchFindType patchFindType)
  92. {
  93. bool blPatchItemChanged = false;
  94. bool blPatchFindTypeChanged = false;
  95. //判断是否数据发生变化
  96. if(curPatchItem != _curPatchItem)
  97. {
  98. CurPatchItem = curPatchItem;
  99. blPatchItemChanged = true;
  100. }
  101. if(patchFindType != _selectedPatchFindType)
  102. {
  103. SelectedPatchFindType = patchFindType;
  104. blPatchFindTypeChanged = true;
  105. }
  106. if(blPatchItemChanged || blPatchFindTypeChanged)
  107. {
  108. PatchDetailPage.InitDefaulValue();
  109. LoadPatchDetailItemList(true);
  110. }
  111. }
  112. public CfginiItem mConfigItem { get; set; }
  113. public PageModel PatchDetailPage { get; set; }
  114. private int _totalRecord;
  115. public int TotalRecords
  116. {
  117. get => _totalRecord;
  118. set
  119. {
  120. if (_totalRecord != value)
  121. {
  122. _totalRecord = value;
  123. OnPropertyChanged(nameof(TotalRecords));
  124. }
  125. }
  126. }
  127. public UCPatchGrid()
  128. {
  129. InitializeComponent();
  130. PatchDetailItemList = new ObservableCollection<PatchDetailItem>();
  131. dgPatchDetail.ItemsSource = PatchDetailItemList;
  132. mConfigItem = CfginiItem.GetConfigItem();
  133. PatchDetailPage = new PageModel
  134. {
  135. PageSize = mConfigItem.PatchPageSize,
  136. PageNumber = 1
  137. };
  138. //mConfigItem.OnPatchPageSizeChanged += MConfigItem_OnPatchPageSizeChanged;
  139. mConfigItem.OnPatchPageSizeChanged += MConfigItem_OnPatchPageSizeChanged;
  140. this.DataContext = this;
  141. }
  142. private void MConfigItem_OnPatchPageSizeChanged(int pageSize)
  143. {
  144. PatchDetailPage.InitDefaulValue(pageSize);
  145. LoadPatchDetailItemList(true);
  146. }
  147. //private void MConfigItem_OnPatchPageSizeChanged(object sender, PageSizeChangedEventArgs e)
  148. //{
  149. // PatchDetailPage.InitDefaulValue(e.PageSize);
  150. // LoadPatchDetailItemList(true);
  151. //}
  152. //private async void LoadPatchDetailItemList(bool scrollTop)
  153. private void LoadPatchDetailItemList(bool scrollTop)
  154. {
  155. PatchDetailItemList.Clear();
  156. if (CurPatchItem != null )
  157. {
  158. try
  159. {
  160. //var result = await Task.Run(() =>
  161. //{
  162. //数据库查询
  163. //return DBPatch.GetPagedPatchDetails(
  164. // PatchDetailPage.PageNumber, PatchDetailPage.PageSize, CurPatchItem.PatchId);
  165. PatchFindModel findModel = new PatchFindModel(PatchDetailPage.PageNumber, PatchDetailPage.PageSize,
  166. CurPatchItem.PatchId, SelectedPatchFindType);
  167. // return DBPatch.GetPagedPatchDetails(findModel);
  168. //});
  169. var result = DBPatch.GetPagedPatchDetails(findModel);
  170. //更新分页信息
  171. TotalRecords = result.Item1;
  172. PatchDetailPage.PageCount = result.Item2;
  173. List<TPatchDetail> patchDetails = result.Item3;
  174. //更新数据需要在主线中进行
  175. //Application.Current.Dispatcher.Invoke(() =>
  176. //{
  177. int index = 0;
  178. foreach (TPatchDetail patchDetail in patchDetails)
  179. {
  180. index++;
  181. PatchDetailItem item = new PatchDetailItem(patchDetail);
  182. item.Index = index + ((PatchDetailPage.PageNumber - 1) * PatchDetailPage.PageSize);
  183. PatchDetailItemList.Add(item);
  184. }//foreach
  185. SelectedPatchDetailItem = null;
  186. if (PatchDetailItemList.Count > 0 && scrollTop)
  187. {
  188. dgPatchDetail.ScrollIntoView(dgPatchDetail.Items[0]);
  189. }
  190. //});
  191. }
  192. catch (Exception ex)
  193. {
  194. MessageBox.Show(Application.Current.MainWindow,
  195. $"加载数据时发生错误:{ex.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
  196. }
  197. }
  198. SelectedPatchDetailItem = null;
  199. }
  200. private void StandResultTextBlock_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
  201. {
  202. // 检查是否是双击
  203. if (e.ClickCount == 2)
  204. {
  205. // 获取当前行的数据上下文
  206. var textBlock = sender as TextBlock;
  207. if (textBlock == null) return;
  208. var dataContext = textBlock.DataContext as PatchDetailItem; // 替换为你的数据类型
  209. if (dataContext == null) return;
  210. SelectedPatchDetailItem = dataContext;
  211. StandValueModel standValueModel = new StandValueModel(dataContext);
  212. var dialog = new EditStandValueDlg(standValueModel)
  213. {
  214. Owner = Application.Current.MainWindow,
  215. WindowStartupLocation = WindowStartupLocation.CenterOwner
  216. };
  217. //if(dialog.ShowDialog() == true)
  218. //{
  219. // UpdatePatchDetailStandValue(dataContext, standValueModel);
  220. //}//if showDialog
  221. dialog.OnEditStandValue += (value) =>
  222. {
  223. UpdatePatchDetailStandValue(dataContext, standValueModel);
  224. };
  225. dialog.Show();
  226. }//e.clickCount
  227. }
  228. private void UpdateStandvalue(PatchDetailItem detailItem)
  229. {
  230. StandValueModel standValueModel = new StandValueModel(detailItem);
  231. var dialog = new EditStandValueDlg(standValueModel)
  232. {
  233. Owner = Application.Current.MainWindow,
  234. WindowStartupLocation = WindowStartupLocation.CenterOwner
  235. };
  236. //if (dialog.ShowDialog() == true)
  237. //{
  238. // UpdatePatchDetailStandValue(detailItem, standValueModel);
  239. //}//if showDialog
  240. dialog.OnEditStandValue += (value) =>
  241. {
  242. UpdatePatchDetailStandValue(detailItem, standValueModel);
  243. };
  244. dialog.Show();
  245. }
  246. private void UpdatePatchDetailStandValue(PatchDetailItem detailItem, StandValueModel standValueModel)
  247. {
  248. try
  249. {
  250. //修改数据库
  251. //判断detailItem中的FinalValue与标准值是否相等
  252. int equalFlag = 0;
  253. if(int.TryParse(standValueModel.StandValue,out int iStandValue))
  254. {
  255. //equalFlag = detailItem.CheckEquailityWithStandValue(iStandValue, detailItem.FinalValue) ? 1 : 0;
  256. equalFlag = detailItem.GetEqualFlag(iStandValue, detailItem.FinalValue);
  257. }
  258. bool updateStandValue1 = DBPatch.UpdatePatchDetailStandValue(detailItem.PatchDetailId, standValueModel.StandValue,equalFlag);
  259. bool updateStandValue2 = DBStand.UpdateStandDetailStandValue(detailItem.SrcImage, standValueModel.StandValue);
  260. if (updateStandValue1 && updateStandValue2)
  261. {
  262. detailItem.StandValue = standValueModel.StandValue;
  263. detailItem.EqualFlag = equalFlag;
  264. //MessageBox.Show(Application.Current.MainWindow, "修改标准值完成。", "提示", MessageBoxButton.OK,
  265. // MessageBoxImage.Information);
  266. //应该更新目录内容
  267. OnRefreshPatchItem?.Invoke(detailItem.PatchId);
  268. OnUpdateStandValue?.Invoke(detailItem.StandDetailId, detailItem.StandValue);
  269. }
  270. else
  271. {
  272. MessageBox.Show(Application.Current.MainWindow, "修改标准值失败。", "警告", MessageBoxButton.OK,
  273. MessageBoxImage.Warning);
  274. }
  275. }
  276. catch (Exception ex)
  277. {
  278. MessageBox.Show(Application.Current.MainWindow, $"修改标准值错误:{ex.Message}!", "警告", MessageBoxButton.OK,
  279. MessageBoxImage.Warning);
  280. }
  281. }
  282. private void SrcImage_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
  283. {
  284. var image = sender as Image;
  285. if (image == null) return;
  286. var dataContext = image.DataContext as PatchDetailItem;
  287. if (dataContext == null) return;
  288. //var dialog = new ImageViewerWindow(dataContext.SourceImagePath)
  289. if (!File.Exists(dataContext.SrcImage)) return;
  290. var dialog = new imgWindow(dataContext.SrcImage)
  291. {
  292. Owner = Application.Current.MainWindow
  293. };
  294. dialog.Show();
  295. }
  296. private void DstImage_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
  297. {
  298. var image = sender as Image;
  299. if (image == null) return;
  300. var dataContext = image.DataContext as PatchDetailItem;
  301. if (dataContext == null) return;
  302. //var dialog = new ImageViewerWindow(dataContext.SourceImagePath)
  303. if (!File.Exists(dataContext.DstImage)) return;
  304. var dialog = new imgWindow(dataContext.DstImage)
  305. {
  306. Owner = Application.Current.MainWindow
  307. };
  308. dialog.Show();
  309. }
  310. public void NextPage()
  311. {
  312. if (PatchDetailPage.PageNumber < PatchDetailPage.PageCount)
  313. {
  314. PatchDetailPage.PageNumber += 1;
  315. LoadPatchDetailItemList(true);
  316. }
  317. }
  318. public void PrePage()
  319. {
  320. if (PatchDetailPage.PageNumber > 1)
  321. {
  322. PatchDetailPage.PageNumber -= 1;
  323. LoadPatchDetailItemList(true);
  324. }
  325. }
  326. public void FirstPage()
  327. {
  328. if (PatchDetailPage.PageNumber > 1)
  329. {
  330. PatchDetailPage.PageNumber = 1;
  331. LoadPatchDetailItemList(true);
  332. }
  333. }
  334. public void LastPage()
  335. {
  336. if (PatchDetailPage.PageNumber < PatchDetailPage.PageCount)
  337. {
  338. PatchDetailPage.PageNumber = PatchDetailPage.PageCount;
  339. LoadPatchDetailItemList(true);
  340. }
  341. }
  342. public void SpeciPage(int pageNumber)
  343. {
  344. if (pageNumber != PatchDetailPage.PageNumber &&
  345. pageNumber > 0 && pageNumber <= PatchDetailPage.PageCount)
  346. {
  347. PatchDetailPage.PageNumber = pageNumber;
  348. LoadPatchDetailItemList(true);
  349. }
  350. }
  351. private bool IsProcessingTask = false;
  352. public async Task<bool> StartPatchTask()
  353. {
  354. if (CurPatchItem == null) return false;
  355. int taskCount = await GetTaskCount();
  356. if(taskCount == 0)
  357. {
  358. MessageBox.Show(Application.Current.MainWindow, "没有任务可执行。", "提示",
  359. MessageBoxButton.OK, MessageBoxImage.Information);
  360. return false;
  361. }
  362. //先查询是否有需要识别的任务
  363. PatchTaskDlg patchTaskDlg = new PatchTaskDlg()
  364. {
  365. Owner = Application.Current.MainWindow,
  366. WindowStartupLocation = WindowStartupLocation.CenterOwner
  367. };
  368. patchTaskDlg.OnStopTask += PatchTaskDlg_OnStopTask;
  369. patchTaskDlg.Show();
  370. Application.Current.MainWindow.IsEnabled = false;
  371. try
  372. {
  373. IsProcessingTask = true;
  374. int runCount = 0;
  375. await Task.Run(() =>
  376. {
  377. //查询任务
  378. List<TPatchDetail> patchDetails = DBPatch.GetPatchDetailsWithRunFlagZero(CurPatchItem.PatchId);
  379. for(int i = 0; i < patchDetails.Count; i++)
  380. {
  381. if (!IsProcessingTask)
  382. {
  383. return;
  384. }
  385. FaRun faRun = new FaRun();
  386. ResultModel resultModel = null;
  387. try
  388. {
  389. resultModel = faRun.StartRecognition(patchDetails[i]);
  390. }
  391. catch(Exception ex)
  392. {
  393. Console.WriteLine(ex.Message);
  394. }
  395. if (resultModel == null) continue;
  396. patchDetails[i].SetResult(resultModel);
  397. bool blUpdate = DBPatch.UpdatePatchDetailWithResult(patchDetails[i]);
  398. //修改下一条记录的最近一次正确值(判断下一条数据的站点与本站点相同)
  399. if( i + 1 < patchDetails.Count && patchDetails[i + 1].StationId == patchDetails[i].StationId)
  400. {
  401. patchDetails[i + 1].LastCompress = resultModel.CompressIndex;
  402. if (patchDetails[i].IsGoodResult())
  403. {
  404. patchDetails[i+1].LatestValue = (long)resultModel.FinalValue;
  405. patchDetails[i+1].LatestComplete = (long)resultModel.CompleteValue;
  406. patchDetails[i+1].LatestTime = patchDetails[i].SampleTime;
  407. }
  408. else
  409. {
  410. patchDetails[i+1].LatestValue = patchDetails[i].LatestValue;
  411. patchDetails[i+1].LatestComplete = patchDetails[i].LatestComplete;
  412. patchDetails[i + 1].LatestTime = patchDetails[i].LatestTime;
  413. }
  414. //更新改变了Latest的数据
  415. if (DBPatch.UpdatePatchDetails_Latest(patchDetails[i + 1]))
  416. {
  417. foreach (PatchDetailItem detailItem in PatchDetailItemList)
  418. {
  419. if (detailItem.PatchDetailId == patchDetails[i + 1].PatchDetailId)
  420. {
  421. ObjectHelper.CopyMatchingFields(patchDetails[i + 1], detailItem);
  422. break;
  423. }
  424. }//foreach
  425. }
  426. }//i+1
  427. if (blUpdate)
  428. {
  429. runCount++;
  430. }
  431. //根据结果更新表内容,暂且模拟
  432. //Thread.Sleep(300);
  433. Application.Current.Dispatcher.Invoke(() =>
  434. {
  435. patchTaskDlg.UpdateProgress(i + 1, taskCount);
  436. //更新背后的数据
  437. if (blUpdate)
  438. {
  439. //如果界面中存在本条数据,则更新。意义不大
  440. foreach (PatchDetailItem detailItem in PatchDetailItemList)
  441. {
  442. if(detailItem.PatchDetailId == patchDetails[i].PatchDetailId)
  443. {
  444. ObjectHelper.CopyMatchingFields(patchDetails[i], detailItem);
  445. break;
  446. }
  447. }//foreach
  448. }//if
  449. });
  450. //Thread.Sleep(3000);
  451. }//for i
  452. });
  453. return runCount > 0;
  454. }
  455. catch(Exception ex)
  456. {
  457. MessageBox.Show(Application.Current.MainWindow, $"执行批量识别任务:{ex.Message}", "错误",
  458. MessageBoxButton.OK, MessageBoxImage.Error);
  459. return false;
  460. }
  461. finally
  462. {
  463. // 执行完毕后恢复主界面交互
  464. Application.Current.MainWindow.IsEnabled = true;
  465. patchTaskDlg.Close();
  466. }
  467. }
  468. private void PatchTaskDlg_OnStopTask()
  469. {
  470. IsProcessingTask = false;
  471. //throw new NotImplementedException();
  472. }
  473. //获取任务数量
  474. private async Task<int> GetTaskCount()
  475. {
  476. if (CurPatchItem == null) return 0;
  477. string titleInfo = "正在获取任务数量,请稍后...";
  478. WaitWindow waitWindow = new WaitWindow(titleInfo)
  479. {
  480. Owner = Application.Current.MainWindow,
  481. WindowStartupLocation = WindowStartupLocation.CenterOwner
  482. };
  483. waitWindow.Show();
  484. try
  485. {
  486. int taskCount = await Task.Run(() =>
  487. {
  488. return DBPatch.GetPatchDetailsCountWithRunFlagZero(CurPatchItem.PatchId);
  489. });
  490. return taskCount;
  491. }
  492. catch (Exception ex)
  493. {
  494. MessageBox.Show(Application.Current.MainWindow, $"获取任务数量:{ex.Message}", "错误",
  495. MessageBoxButton.OK, MessageBoxImage.Error);
  496. return 0;
  497. }
  498. finally
  499. {
  500. waitWindow.Close();
  501. }
  502. }
  503. private void BtnLogViewer_Click(object sender, RoutedEventArgs e)
  504. {
  505. Button button = sender as Button;
  506. if (button == null) return;
  507. DataGridRow row = FindAncestor<DataGridRow>(button);
  508. if (row == null) return;
  509. //获取当前行绑定的数据项
  510. PatchDetailItem selectedItem = row.Item as PatchDetailItem;
  511. ShowLogViewer(selectedItem);
  512. }
  513. private void ShowLogViewer(PatchDetailItem selectedItem)
  514. {
  515. if (selectedItem.LogPath != null && File.Exists(selectedItem.LogPath))
  516. {
  517. //LogViewerWindow dialog = new LogViewerWindow(selectedItem.DstImage, selectedItem.LogPath)
  518. var dialog = new LogViewerWindow(selectedItem)
  519. {
  520. Owner = Application.Current.MainWindow,
  521. WindowStartupLocation = WindowStartupLocation.CenterOwner
  522. };
  523. //dialog.ShowDialog();
  524. dialog.Show();
  525. }
  526. }
  527. private void BtnDelDetailItem_Click(object sender, RoutedEventArgs e)
  528. {
  529. //删除选中项
  530. Button button = sender as Button;
  531. if (button == null) return;
  532. DataGridRow row = FindAncestor<DataGridRow>(button);
  533. if (row == null) return;
  534. //获取当前行绑定的数据项
  535. PatchDetailItem selectedItem = row.Item as PatchDetailItem;
  536. DeleteSelectedItem(selectedItem);
  537. }
  538. private async void DeleteSelectedItem(PatchDetailItem selectedItem)
  539. {
  540. if (selectedItem == null) return;
  541. MessageBoxResult result = MessageBox.Show("确定要删除此条目吗?", "确认删除", MessageBoxButton.YesNo, MessageBoxImage.Question);
  542. if (result != MessageBoxResult.Yes) return;
  543. string titleInfo = "正在删除,请稍后...";
  544. WaitWindow waitWindow = new WaitWindow(titleInfo)
  545. {
  546. Owner = Application.Current.MainWindow,
  547. WindowStartupLocation = WindowStartupLocation.CenterOwner
  548. };
  549. waitWindow.Show();
  550. try
  551. {
  552. bool deleteSuccess = false;
  553. await Task.Run(() =>
  554. {
  555. deleteSuccess = DBPatch.Delete_TPatchDetail_TStandDetail_ByStand(selectedItem.StandDetailId);
  556. //deleteSuccess = DBPatch.DeleteTPatchDetailById(selectedItem.PatchDetailId);
  557. });
  558. if (deleteSuccess)
  559. {
  560. Application.Current.Dispatcher.Invoke(() =>
  561. {
  562. // 从数据源中移除该条目
  563. int selectedIndex = PatchDetailItemList.IndexOf(selectedItem);
  564. //PatchDetailItemList.Remove(selectedItem); 改为从新加载页面
  565. SelectedPatchDetailItem = null;
  566. OnRefreshPatchItem?.Invoke(selectedItem.PatchId);
  567. OnDeleteStandDetail?.Invoke(selectedItem.StandDetailId);
  568. //重新加载数据
  569. LoadPatchDetailItemList(false);
  570. //if (PatchDetailItemList.Count > selectedIndex)
  571. //{
  572. // dgPatchDetail.ScrollIntoView(dgPatchDetail.Items[selectedIndex]);
  573. //}
  574. });
  575. }
  576. }
  577. catch (Exception ex)
  578. {
  579. MessageBox.Show(Application.Current.MainWindow, $"删除失败:{ex.Message}", "错误",
  580. MessageBoxButton.OK, MessageBoxImage.Error);
  581. }
  582. finally
  583. {
  584. waitWindow.Close();
  585. }
  586. }
  587. public static T FindAncestor<T>(DependencyObject dependencyObject) where T : DependencyObject
  588. {
  589. var parent = VisualTreeHelper.GetParent(dependencyObject);
  590. if (parent == null) return null;
  591. var parentT = parent as T;
  592. return parentT ?? FindAncestor<T>(parent);
  593. }
  594. private void MiViewLog_Click(object sender, RoutedEventArgs e)
  595. {
  596. if(SelectedPatchDetailItem != null)
  597. {
  598. ShowLogViewer(SelectedPatchDetailItem);
  599. }
  600. }
  601. private void MiDelteRow_Click(object sender, RoutedEventArgs e)
  602. {
  603. //获取当前行绑定的数据项
  604. if(SelectedPatchDetailItem != null)
  605. {
  606. DeleteSelectedItem(SelectedPatchDetailItem);
  607. }
  608. }
  609. private void BtnUpdateStandvalue_Click(object sender, RoutedEventArgs e)
  610. {
  611. Button button = sender as Button;
  612. if (button == null) return;
  613. DataGridRow row = FindAncestor<DataGridRow>(button);
  614. if (row == null) return;
  615. //获取当前行绑定的数据项
  616. var selectedItem = row.Item as PatchDetailItem;
  617. UpdateStandvalue(selectedItem);
  618. }
  619. private void MiUpdateStandvalue_Click(object sender, RoutedEventArgs e)
  620. {
  621. if (SelectedPatchDetailItem == null) return;
  622. UpdateStandvalue(SelectedPatchDetailItem);
  623. }
  624. private void MiAddMemo_Click(object sender, RoutedEventArgs e)
  625. {
  626. if (SelectedPatchDetailItem == null) return;
  627. AddMemo(SelectedPatchDetailItem);
  628. }
  629. private void AddMemo(PatchDetailItem detailItem)
  630. {
  631. if (detailItem == null) return;
  632. EditMemo editMemo = new EditMemo(detailItem.Memo)
  633. {
  634. Owner = Application.Current.MainWindow,
  635. WindowStartupLocation = WindowStartupLocation.CenterOwner
  636. };
  637. if (editMemo.ShowDialog() == true)
  638. {
  639. string memo = editMemo.Memo;
  640. if (DBPatch.UpdatePatchDetailMemo(detailItem.PatchDetailId, memo))
  641. {
  642. detailItem.Memo = memo;
  643. }
  644. }
  645. }
  646. private void Memo_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
  647. {
  648. if (e.ClickCount == 2)
  649. {
  650. if (SelectedPatchDetailItem == null) return;
  651. AddMemo(SelectedPatchDetailItem);
  652. }
  653. }
  654. private void FaRun_OnAiRealLogInfo(object sender, AiRealLogEventArgs e)
  655. {
  656. Console.Write(e.mLogInfo);
  657. }
  658. private void MiRecong_Click(object sender, RoutedEventArgs e)
  659. {
  660. if (SelectedPatchDetailItem == null) return;
  661. RecongPatchDetail(SelectedPatchDetailItem);
  662. }
  663. private async void RecongPatchDetail(PatchDetailItem patchDetailItem)
  664. {
  665. string jpgFile = patchDetailItem.SrcImage;
  666. if (!File.Exists(jpgFile))
  667. {
  668. MessageBox.Show(Application.Current.MainWindow, $"文件:{jpgFile}不存在!", "警告", MessageBoxButton.OK, MessageBoxImage.Warning);
  669. return;
  670. }
  671. bool blRun = await RunAI(patchDetailItem);
  672. if (blRun)
  673. {
  674. //MessageBox.Show(Application.Current.MainWindow, "识别成功!", "提示", MessageBoxButton.OK, MessageBoxImage.Information);
  675. }
  676. else
  677. {
  678. MessageBox.Show(Application.Current.MainWindow, "识别失败!", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
  679. }
  680. }
  681. private async Task<bool> RunAI(PatchDetailItem patchDetailItem)
  682. {
  683. FaRun faRun = new FaRun();
  684. faRun.OnAiRealLogInfo += FaRun_OnAiRealLogInfo;
  685. string titleInfo = "正在识别,请稍后...";
  686. WaitWindow waitWindow = new WaitWindow(titleInfo)
  687. {
  688. Owner = Application.Current.MainWindow,
  689. WindowStartupLocation = WindowStartupLocation.CenterOwner
  690. };
  691. waitWindow.Show();
  692. try
  693. {
  694. TPatchDetail newPatchDetail = null;
  695. bool blRun = await Task.Run(() =>
  696. {
  697. try
  698. {
  699. ResultModel resultModel = null;
  700. try
  701. {
  702. resultModel = faRun.StartRecognition(patchDetailItem);
  703. }
  704. catch (Exception ex)
  705. {
  706. Console.WriteLine(ex.Message);
  707. }
  708. if (resultModel == null) return false;
  709. newPatchDetail = new TPatchDetail(patchDetailItem, resultModel);
  710. //更新数据
  711. bool blUpdate = DBPatch.UpdatePatchDetailWithResult(newPatchDetail);
  712. return blUpdate;
  713. }
  714. catch (Exception ex)
  715. {
  716. Application.Current.Dispatcher.Invoke(() =>
  717. {
  718. MessageBox.Show(Application.Current.MainWindow, $"{ex.Message}", "错误",
  719. MessageBoxButton.OK, MessageBoxImage.Error);
  720. });
  721. return false;
  722. }
  723. });
  724. //------
  725. //在主线程中更新DataGrid的Row数据
  726. if (blRun && newPatchDetail != null)
  727. {
  728. ObjectHelper.CopyMatchingFields(newPatchDetail, patchDetailItem);
  729. }
  730. return blRun;
  731. }
  732. catch (Exception ex)
  733. {
  734. MessageBox.Show(Application.Current.MainWindow, $"识别[{patchDetailItem.SrcImage}]时出错:{ex.Message}", "错误",
  735. MessageBoxButton.OK, MessageBoxImage.Error);
  736. return false;
  737. }
  738. finally
  739. {
  740. waitWindow.Close();
  741. }
  742. }
  743. ////-------------以下代码被作废,暂不使用此方法-------------------
  744. //private PatchPrgDialog PatchPrgDialog; // 用于弹出进度对话框
  745. //public event Action<int,int> OnProcessingProgressChanged; // 用于通知进度
  746. //public event Action OnProcessingCompleted; // 用于通知完成
  747. //public event Action OnProcessingStopped; // 用于通知停止
  748. //private BackgroundWorker worker;
  749. ////private bool isProcessing;
  750. //private bool cancelRequested;
  751. //private int TotalImages;
  752. ////开始批量识别任务
  753. //public void StartPatchTask2()
  754. //{
  755. // worker = new BackgroundWorker();
  756. // worker.DoWork += Worker_DoWork;
  757. // worker.RunWorkerCompleted += Worker_RunWorkerCompleted;
  758. // worker.ProgressChanged += Worker_ProgressChanged;
  759. // worker.WorkerReportsProgress = true;
  760. // worker.WorkerSupportsCancellation = true;
  761. // PatchPrgDialog = new PatchPrgDialog(this); // 传递 UserControl 实例给对话框
  762. // PatchPrgDialog.StartProcessing();
  763. //}
  764. //// 启动处理
  765. //public void StartProcessing()
  766. //{
  767. // //isProcessing = true;
  768. // cancelRequested = false;
  769. // worker.RunWorkerAsync();
  770. //}
  771. //// 停止处理
  772. //public void StopProcessing()
  773. //{
  774. // cancelRequested = true;
  775. // worker.CancelAsync();
  776. //}
  777. //// 执行后台处理任务
  778. //private void Worker_DoWork(object sender, DoWorkEventArgs e)
  779. //{
  780. // //int totalImages = 100; // 假设有100张图片要处理
  781. // TotalImages = 100;
  782. // for (int i = 1; i <= TotalImages; i++)
  783. // {
  784. // if (cancelRequested)
  785. // {
  786. // e.Cancel = true;
  787. // break;
  788. // }
  789. // // 模拟处理图片
  790. // Thread.Sleep(1000); // 这里模拟了图片处理的延迟
  791. // // 更新进度
  792. // //worker.ReportProgress((i * 100) / totalImages);
  793. // worker.ReportProgress(i);
  794. // }
  795. //}
  796. //// 更新进度条
  797. //private void Worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
  798. //{
  799. // //progressBar.Value = e.ProgressPercentage;
  800. // OnProcessingProgressChanged?.Invoke(e.ProgressPercentage,TotalImages);
  801. //}
  802. //// 处理完成或被取消
  803. //private void Worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
  804. //{
  805. // if (e.Cancelled)
  806. // {
  807. // OnProcessingStopped?.Invoke();
  808. // }
  809. // else
  810. // {
  811. // OnProcessingCompleted?.Invoke();
  812. // }
  813. //}
  814. //-----------------------------------------------------------------------------------
  815. }
  816. // 自定义事件参数类
  817. public class PatchDetailItemChangedEventArgs : EventArgs
  818. {
  819. public PatchDetailItem SelectedPatchDetailItem { get; }
  820. public PatchDetailItemChangedEventArgs(PatchDetailItem selectedData)
  821. {
  822. SelectedPatchDetailItem = selectedData;
  823. }
  824. }
  825. }