UCPatchMain.xaml.cs 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931
  1. using MeterVision.Config;
  2. using MeterVision.db;
  3. using MeterVision.Dlg;
  4. using MeterVision.Helper;
  5. using MeterVision.model;
  6. using MeterVision.Util;
  7. using Ookii.Dialogs.Wpf;
  8. using System;
  9. using System.Collections.Generic;
  10. using System.Collections.ObjectModel;
  11. using System.ComponentModel;
  12. using System.IO;
  13. using System.Linq;
  14. using System.Text;
  15. using System.Text.RegularExpressions;
  16. using System.Threading;
  17. using System.Threading.Tasks;
  18. using System.Windows;
  19. using System.Windows.Controls;
  20. using System.Windows.Data;
  21. using System.Windows.Documents;
  22. using System.Windows.Input;
  23. using System.Windows.Media;
  24. using System.Windows.Media.Imaging;
  25. using System.Windows.Navigation;
  26. //using System.Windows.Shapes;
  27. namespace MeterVision.Patch
  28. {
  29. /// <summary>
  30. /// UCPatchMain.xaml 的交互逻辑
  31. /// </summary>
  32. public partial class UCPatchMain : UserControl, INotifyPropertyChanged
  33. {
  34. private const int COLUMN_LEFT_WIDTH = 220;
  35. private const int COLUMN_RIGHT_WIDTH = 400;
  36. private bool LeftVisiable = true; //表示左侧的显示状态
  37. private bool RightVisiable = true; //表示右侧的显示状态
  38. public event PropertyChangedEventHandler PropertyChanged;
  39. private string FindStationId = "";
  40. protected void OnPropertyChanged(string propertyName)
  41. {
  42. PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
  43. }
  44. private SemaphoreSlim _semaphore = new SemaphoreSlim(1, 1);
  45. public ObservableCollection<KeyValuePair<PatchFindType, string>> PatchFindTypeKVs { get; set; }
  46. private PatchFindType _selectedPatchFindType;
  47. public PatchFindType SelectedPatchFindType
  48. {
  49. get => _selectedPatchFindType;
  50. set
  51. {
  52. if(_selectedPatchFindType != value)
  53. {
  54. _selectedPatchFindType = value;
  55. OnPropertyChanged(nameof(SelectedPatchFindType));
  56. ucPatchGird.ChangePatchItemOrFinType(SelectedPatchItem,SelectedStationItem ,SelectedPatchFindType);
  57. }
  58. }
  59. }
  60. public PageModel PatchPage { get; set; }
  61. //定义识别任务数据源
  62. //public ObservableCollection<PatchItem> PatchItemList { get; set; }
  63. public BulkObservableCollection<PatchItem> PatchItemList { get; set; }
  64. public CfginiItem mConfigItem { get; set; }
  65. private PatchItem _selectedPatchItem;
  66. public PatchItem SelectedPatchItem
  67. {
  68. get => _selectedPatchItem;
  69. set
  70. {
  71. _selectedPatchItem = value;
  72. OnPropertyChanged(nameof(SelectedPatchItem));
  73. //ucPatchGird.ChangePatchItemOrFinType(SelectedPatchItem, SelectedPatchFindType);
  74. if(_selectedPatchItem != null)
  75. {
  76. ucStationGrid.ChangeFind(FindStationId, _selectedPatchItem.PatchId);
  77. }
  78. else
  79. {
  80. ucStationGrid.ChangeFind(FindStationId, "");
  81. }
  82. Apply_UCPatchDetail_Title(value);
  83. }
  84. }
  85. private VPatchStation _selectedStationItem;
  86. public VPatchStation SelectedStationItem
  87. {
  88. get => _selectedStationItem;
  89. set
  90. {
  91. _selectedStationItem = value;
  92. OnPropertyChanged(nameof(SelectedStationItem));
  93. //ucPatchGird.CurStationItem = SelectedStationItem;
  94. ucPatchGird.ChangePatchItemOrFinType(SelectedPatchItem, SelectedStationItem,SelectedPatchFindType);
  95. //Apply_UCPatchDetail_Title(value);
  96. Apply_Station_Title(value);
  97. }
  98. }
  99. //总共的Patch数量
  100. private int _totalPatchRecords;
  101. public int TotalPatchRecords
  102. {
  103. get => _totalPatchRecords;
  104. set
  105. {
  106. if(_totalPatchRecords != value)
  107. {
  108. _totalPatchRecords = value;
  109. OnPropertyChanged(nameof(TotalPatchRecords));
  110. }
  111. }
  112. }
  113. //private void Apply_UCPatchDetail_Title(PatchItem patchItem)
  114. private void Apply_UCPatchDetail_Title(PatchItem patchItem)
  115. {
  116. txtPatchName.Text = patchItem == null ? "" : $"{patchItem.Index}.";
  117. }
  118. private void Apply_Station_Title(VPatchStation stationItem)
  119. {
  120. pnlDetailFunc.Visibility = stationItem == null ? Visibility.Hidden : Visibility.Visible;
  121. txtStationName.Text = stationItem == null ? "请选择站点" : $"站点: {stationItem.StationIdName}";
  122. }
  123. private void InitRightControls(PatchDetailItem PatchDetailItem)
  124. {
  125. pnlImage.Visibility = txtRightItemIndex.Visibility = pnlLog.Visibility =
  126. PatchDetailItem == null ? Visibility.Collapsed : Visibility.Visible;
  127. }
  128. private void InitPatchFindTypeKVs()
  129. {
  130. PatchFindTypeKVs = new ObservableCollection<KeyValuePair<PatchFindType, string>>()
  131. {
  132. new KeyValuePair<PatchFindType, string>(PatchFindType.ALL,
  133. "所有"),
  134. new KeyValuePair<PatchFindType, string>(PatchFindType.RUN_YES,
  135. "已识别"),
  136. new KeyValuePair<PatchFindType, string>(PatchFindType.RUN_NO,
  137. "未识别"),
  138. new KeyValuePair<PatchFindType, string>(PatchFindType.RESULT_OK,
  139. "识别正确"),
  140. new KeyValuePair<PatchFindType, string>(PatchFindType.RESULT_ERROR,
  141. "识别错误"),
  142. new KeyValuePair<PatchFindType, string>(PatchFindType.RESULT_INVLIAD,
  143. "识别无效"),
  144. new KeyValuePair<PatchFindType, string>(PatchFindType.ALL_NO_STAND_VALUE,
  145. "无标准值"),
  146. new KeyValuePair<PatchFindType, string>(PatchFindType.RUN_YES_NO_STAND_VALUE,
  147. "已识别+无标准值"),
  148. new KeyValuePair<PatchFindType, string>(PatchFindType.RUN_NO_NO_STAND_VALUE,
  149. "未识别+无标准值"),
  150. new KeyValuePair<PatchFindType, string>(PatchFindType.HAVE_MEMO,
  151. "有备注"),
  152. };
  153. // ALL_NO_STAND_VALUE = 6, //所有无标准值项
  154. //RUN_YES_NO_STAND_VALUE = 7, //已运行的无标准值的项
  155. //RUN_NO_NO_STAND_VALUE = 8 //未运行的无标准值的项
  156. }
  157. public UCPatchMain()
  158. {
  159. InitializeComponent();
  160. //PatchItemList = new ObservableCollection<PatchItem>();
  161. PatchItemList = new BulkObservableCollection<PatchItem>();
  162. dgPatch.ItemsSource = PatchItemList;
  163. Apply_UCPatchDetail_Title(null);
  164. Apply_Station_Title(null);
  165. InitRightControls(null);
  166. //订阅UCPatchGrid的选中项变化事件
  167. ucPatchGird.OnSelectedPatchDetailItemChanged += UcPatchGird_OnSelectedPatchDetailItemChanged;
  168. ucPatchGird.OnRefreshPatchItem += UcPatchGird_OnRefreshPatchItem;
  169. mConfigItem = CfginiItem.GetConfigItem();
  170. PatchPage = new PageModel
  171. {
  172. //PageSize = mConfigItem.CatalogPageSize,
  173. PageSize = mConfigItem.PageSize1, //mConfigItem.PatchCatalogPageSize,
  174. PageNumber = 1
  175. };
  176. //mConfigItem.OnPatchCatalogPageSizeChnaged += MConfigItem_OnPatchCatalogPageSizeChnaged;
  177. mConfigItem.OnPageSize1Changed += MConfigItem_OnPageSize1Changed;
  178. this.DataContext = this;
  179. LoadPatchItemListAsync();
  180. InitPatchFindTypeKVs();
  181. SelectedPatchFindType = PatchFindType.ALL;
  182. //控制左右2侧栏目的显示
  183. LeftVisiable = true;
  184. ChangeLeftVisiable(LeftVisiable);
  185. RightVisiable = true;
  186. ChangeRightVisiable(RightVisiable);
  187. txtFindStationId.Text = string.Empty;
  188. ucStationGrid.OnItemChanged += UcStationGrid_OnItemChanged;
  189. }
  190. private async void MConfigItem_OnPageSize1Changed(int pageSize1)
  191. {
  192. if (!_semaphore.Wait(0)) return; // 如果信号量已被占用,直接返回
  193. //throw new NotImplementedException();
  194. try
  195. {
  196. PatchPage.InitDefaulValue(pageSize1);
  197. bool blLoad = await LoadPatchItemList();
  198. if (blLoad)
  199. {
  200. SelectedPatchItem = null;
  201. }
  202. }
  203. catch { }
  204. finally
  205. {
  206. _semaphore.Release();
  207. }
  208. }
  209. //private async void MConfigItem_OnPatchCatalogPageSizeChnaged(int pageSize)
  210. //{
  211. // PatchPage.InitDefaulValue(pageSize);
  212. // bool blLoad = await LoadPatchItemList();
  213. // if (blLoad)
  214. // {
  215. // SelectedPatchItem = null;
  216. // }
  217. //}
  218. private void UcStationGrid_OnItemChanged(VPatchStation item)
  219. {
  220. SelectedStationItem = item;
  221. }
  222. private async void LoadPatchItemListAsync()
  223. {
  224. if (!_semaphore.Wait(0)) return; // 如果信号量已被占用,直接返回
  225. try
  226. {
  227. await LoadPatchItemList();
  228. }
  229. catch { }
  230. finally
  231. {
  232. _semaphore.Release();
  233. }
  234. }
  235. private void UcPatchGird_OnRefreshPatchItem(string patchId)
  236. {
  237. if ( string.IsNullOrEmpty(patchId) ) return;
  238. //VPatch vPatch = null;
  239. //await Task.Run(() =>
  240. //{
  241. // vPatch = DBPatch.GetVPatchById(patchId);
  242. //});
  243. //if(vPatch != null)
  244. //{
  245. // //var NewPatchItem = new PatchItem(vPatch);
  246. // foreach(var patchItem in PatchItemList)
  247. // {
  248. // if(patchItem.PatchId == vPatch.PatchId)
  249. // {
  250. // ObjectHelper.CopyMatchingFields(vPatch, patchItem);
  251. // break;
  252. // }
  253. // }//foreach
  254. //}//if vpatch!=null
  255. RefresUIPatchItem(patchId);
  256. }
  257. //处理UCPatchGrid的选中项变化事件
  258. private void UcPatchGird_OnSelectedPatchDetailItemChanged(object sender, PatchDetailItemChangedEventArgs e)
  259. {
  260. InitRightControls(e.SelectedPatchDetailItem);
  261. txtRightItemIndex.Text = string.Empty;
  262. // 如果有选中的数据项,则将图片路径传递给 UCImage
  263. if (e.SelectedPatchDetailItem != null)
  264. {
  265. ucImagerSource.ImageSource = e.SelectedPatchDetailItem.SrcImage;
  266. ucImageResult.ImageSource = e.SelectedPatchDetailItem.DstImage;
  267. ucImagerSource.ImageName = "原始图片";
  268. ucImageResult.ImageName = "结果图片";
  269. //设置log显示
  270. SetLogContent(e.SelectedPatchDetailItem);
  271. if (SelectedPatchItem != null)
  272. {
  273. txtRightItemIndex.Text = $"{SelectedPatchItem.Index}. - {e.SelectedPatchDetailItem.Index}.";
  274. }
  275. }
  276. }
  277. private async void SetLogContent(PatchDetailItem detailItem)
  278. {
  279. if(detailItem != null && File.Exists(detailItem.LogPath))
  280. {
  281. LogRichTextBox.Document.Blocks.Clear();
  282. await Task.Run(() =>
  283. {
  284. //Task.Delay(2000);
  285. //Thread.Sleep(4000);
  286. string content = File.ReadAllText(detailItem.LogPath);
  287. content = $"{detailItem.Index}. {detailItem.LogPath}\n\n{content}";
  288. Dispatcher.BeginInvoke(new Action(() =>
  289. {
  290. LogRichTextBox.ScrollToHome();
  291. Paragraph logParagraph = new Paragraph(new Run(content));
  292. LogRichTextBox.Document.Blocks.Add(logParagraph);
  293. }));
  294. });
  295. }
  296. }
  297. private async Task<bool> LoadPatchItemList()
  298. {
  299. PatchItemList.Clear();
  300. try
  301. {
  302. var result = await Task.Run(() =>
  303. {
  304. return DBPatch.GetPagedVPatchs(PatchPage.PageNumber, PatchPage.PageSize);
  305. });
  306. //var result = await DBPatch.GetPagedVPatchs(PatchPage.PageNumber, PatchPage.PageSize); // 直接 await
  307. TotalPatchRecords = result.Item1;
  308. PatchPage.PageCount = result.Item2;
  309. List<VPatch> patchs = result.Item3;
  310. //int index = 0;
  311. //foreach (VPatch vPatch in patchs)
  312. //{
  313. // index++;
  314. // PatchItem patchItem = new PatchItem(vPatch);
  315. // patchItem.Index = index + (PatchPage.PageNumber - 1) * PatchPage.PageSize;
  316. // PatchItemList.Add(patchItem);
  317. //}
  318. var patchItems = patchs.Select((vPatch, i) => new PatchItem(vPatch)
  319. {
  320. Index = (PatchPage.PageNumber - 1) * PatchPage.PageSize + i + 1
  321. }).ToList();
  322. PatchItemList.AddRange(patchItems);
  323. //var patchItems = new List<PatchItem>();
  324. //int baseIndex = (PatchPage.PageNumber - 1) * PatchPage.PageSize;
  325. //for (int i = 0; i < patchs.Count; i++)
  326. //{
  327. // var patchItem = new PatchItem(patchs[i])
  328. // {
  329. // Index = baseIndex + i + 1
  330. // };
  331. // patchItems.Add(patchItem);
  332. //}
  333. //PatchItemList.AddRange(patchItems); // 批量添加
  334. return true;
  335. }
  336. catch(Exception ex)
  337. {
  338. MessageBox.Show(Application.Current.MainWindow,
  339. $"c加载数据时发生错误:{ex.Message}", "错误", MessageBoxButton.OK, MessageBoxImage.Error);
  340. return false;
  341. }
  342. }
  343. private void TextBox_PreviewTextInput(object sender, TextCompositionEventArgs e)
  344. {
  345. // 只允许数字输入
  346. e.Handled = !Regex.IsMatch(e.Text, @"^\d$");
  347. }
  348. private async void BtnPatchPrePage_Click(object sender, RoutedEventArgs e)
  349. {
  350. if (!_semaphore.Wait(0)) return; // 如果信号量已被占用,直接返回
  351. try
  352. {
  353. if (PatchPage.PageNumber > 1)
  354. {
  355. PatchPage.PageNumber -= 1;
  356. bool blLoad = await LoadPatchItemList();
  357. if (blLoad && PatchItemList.Count > 0)
  358. {
  359. var scrollViewer = GetDgPatchScrollViewer(dgPatch);
  360. scrollViewer?.ScrollToTop();
  361. //dgPatch.ScrollIntoView(PatchItemList[0]);
  362. }
  363. }
  364. }
  365. catch { }
  366. finally
  367. {
  368. _semaphore.Release();
  369. }
  370. }
  371. private async void BtnPatchNextPage_Click(object sender, RoutedEventArgs e)
  372. {
  373. if (!_semaphore.Wait(0)) return; // 如果信号量已被占用,直接返回
  374. try
  375. {
  376. if (PatchPage.PageNumber < PatchPage.PageCount)
  377. {
  378. PatchPage.PageNumber += 1;
  379. bool blLoad = await LoadPatchItemList();
  380. if (blLoad && PatchItemList.Count > 0)
  381. {
  382. var scrollViewer = GetDgPatchScrollViewer(dgPatch);
  383. scrollViewer?.ScrollToTop();
  384. //dgPatch.ScrollIntoView(PatchItemList[0]);
  385. }
  386. }
  387. }
  388. catch { }
  389. finally
  390. {
  391. _semaphore.Release();
  392. }
  393. }
  394. private void BtnPatchDetailFirstPage_Click(object sender, RoutedEventArgs e)
  395. {
  396. ucPatchGird.FirstPage();
  397. }
  398. private void BtnPatchDetailPrePage_Click(object sender, RoutedEventArgs e)
  399. {
  400. ucPatchGird.PrePage();
  401. }
  402. private void BtnPatchDetailNextPage_Click(object sender, RoutedEventArgs e)
  403. {
  404. ucPatchGird.NextPage();
  405. }
  406. private void BtnPatchDetailLastPage_Click(object sender, RoutedEventArgs e)
  407. {
  408. ucPatchGird.LastPage();
  409. }
  410. private void BtnPatchDetailSpeciPage_Click(object sender, RoutedEventArgs e)
  411. {
  412. try
  413. {
  414. int pageNumber = int.Parse(txtPatchDetailPageNumber.Text.ToString());
  415. ucPatchGird.SpeciPage(pageNumber);
  416. }
  417. catch
  418. {
  419. }
  420. }
  421. private async void BtnAddPatch_Click(object sender, RoutedEventArgs e)
  422. {
  423. if (!_semaphore.Wait(0)) return; // 如果信号量已被占用,直接返回
  424. try
  425. {
  426. AddPatchDlg dialog = new AddPatchDlg()
  427. {
  428. Owner = Application.Current.MainWindow,
  429. WindowStartupLocation = WindowStartupLocation.CenterOwner
  430. };
  431. if (dialog.ShowDialog() == true)
  432. {
  433. TPatch patch = dialog.NewPatch;
  434. //获取VPatch
  435. PatchPage.InitDefaulValue(mConfigItem.PatchPageSize);
  436. bool blLoad = await LoadPatchItemList();
  437. if (blLoad && PatchItemList.Count > 0)
  438. {
  439. SelectedPatchItem = PatchItemList[0];
  440. dgPatch.ScrollIntoView(SelectedPatchItem);
  441. }
  442. }
  443. }
  444. catch { }
  445. finally
  446. {
  447. _semaphore.Release();
  448. }
  449. }
  450. private void BtnDelPatch_Click(object sender, RoutedEventArgs e)
  451. {
  452. DeletePatchItem();
  453. }
  454. private async void DeletePatchItem()
  455. {
  456. //bool blDelete = false;
  457. if (SelectedPatchItem == null) return; // blDelete;
  458. // 弹出确认对话框
  459. MessageBoxResult result = MessageBox.Show(
  460. $"您确定要删除[{SelectedPatchItem.PatchName}]任务吗?\n此操作无法撤销。",
  461. "确认删除",
  462. MessageBoxButton.YesNo, // 提供“是”和“否”按钮
  463. MessageBoxImage.Warning // 使用警告图标
  464. );
  465. if (result != MessageBoxResult.Yes)
  466. {
  467. //return blDelete;
  468. return;
  469. }
  470. //开始删除操作
  471. string titleInfo = "正在删除,请稍候...";
  472. WaitWindow waitWindow = new WaitWindow(titleInfo)
  473. {
  474. Owner = Application.Current.MainWindow,
  475. WindowStartupLocation = WindowStartupLocation.CenterOwner
  476. };
  477. waitWindow.Show();
  478. try
  479. {
  480. //执行异步删除逻辑
  481. //bool deleteSuccess = false;
  482. bool deleteSuccess = await Task.Run(() =>
  483. {
  484. return DBPatch.DeletePatchAndDetails(SelectedPatchItem.PatchId);
  485. //Task.Delay(200).Wait(); // 模拟延迟
  486. });
  487. if (deleteSuccess)
  488. {
  489. PatchItemList.Remove(SelectedPatchItem);
  490. SelectedPatchItem = null;
  491. TotalPatchRecords -= 1;
  492. }
  493. }
  494. catch (Exception ex)
  495. {
  496. MessageBox.Show(Application.Current.MainWindow, $"删除失败:{ex.Message}", "错误",
  497. MessageBoxButton.OK, MessageBoxImage.Error);
  498. }
  499. finally
  500. {
  501. //关闭等待窗口
  502. waitWindow.Close();
  503. }
  504. //return blDelete;
  505. }
  506. private async void BtnRefresh_Click(object sender, RoutedEventArgs e)
  507. {
  508. if (!_semaphore.Wait(0)) return; // 防止重复点击
  509. try
  510. {
  511. PatchPage.InitDefaulValue();
  512. bool blLoad = await LoadPatchItemList();
  513. if (blLoad && PatchItemList.Count > 0)
  514. {
  515. //dgPatch.ScrollIntoView(PatchItemList[0]);
  516. var scrollViewer = GetDgPatchScrollViewer(dgPatch);
  517. scrollViewer?.ScrollToTop();
  518. }
  519. }
  520. catch { }
  521. finally
  522. {
  523. _semaphore.Release();
  524. }
  525. }
  526. //批量识别
  527. private async void BtnStartTask_Click(object sender, RoutedEventArgs e)
  528. {
  529. if (!_semaphore.Wait(0)) return; // 防止重复点击
  530. try
  531. {
  532. bool blTask = await ucPatchGird.StartPatchTask();
  533. //更新目录内容
  534. if (blTask && SelectedPatchItem != null)
  535. {
  536. VPatch vPatch = null;
  537. await Task.Run(() =>
  538. {
  539. vPatch = DBPatch.GetVPatchById(SelectedPatchItem.PatchId);
  540. });
  541. if (vPatch != null)
  542. {
  543. //var NewPatchItem = new PatchItem(vPatch);
  544. foreach (var patchItem in PatchItemList)
  545. {
  546. if (patchItem.PatchId == vPatch.PatchId)
  547. {
  548. ObjectHelper.CopyMatchingFields(vPatch, patchItem);
  549. break;
  550. }
  551. }//foreach
  552. }//if vpatch!=null
  553. RefresUIPatchItem(SelectedPatchItem.PatchId);
  554. //刷新站点的统计信息
  555. ucStationGrid.RefreshItems();
  556. }//blTask
  557. }
  558. catch { }
  559. finally
  560. {
  561. _semaphore.Release();
  562. }
  563. }
  564. public async void RefresUIPatchItem(string patchId)
  565. {
  566. VPatch vPatch = null;
  567. await Task.Run(() =>
  568. {
  569. vPatch = DBPatch.GetVPatchById(patchId);
  570. });
  571. if (vPatch != null)
  572. {
  573. foreach (var patchItem in PatchItemList)
  574. {
  575. if (patchItem.PatchId == vPatch.PatchId)
  576. {
  577. ObjectHelper.CopyMatchingFields(vPatch, patchItem);
  578. break;
  579. }
  580. }//foreach
  581. }//if vpatch!=null
  582. }
  583. //清空已识别任务的各种数据及状态
  584. private async void BtnResetTask_Click(object sender, RoutedEventArgs e)
  585. {
  586. MessageBoxResult result = MessageBox.Show("确定要恢复这些项为原始状态吗?", "数据复原",
  587. MessageBoxButton.YesNo, MessageBoxImage.Warning);
  588. // 判断用户的选择
  589. if (result != MessageBoxResult.Yes)
  590. {
  591. return;
  592. }
  593. bool blTask = await ucPatchGird.ResetPatchTask();
  594. //更新目录内容
  595. if (blTask && SelectedPatchItem != null)
  596. {
  597. VPatch vPatch = null;
  598. await Task.Run(() =>
  599. {
  600. vPatch = DBPatch.GetVPatchById(SelectedPatchItem.PatchId);
  601. });
  602. if (vPatch != null)
  603. {
  604. //var NewPatchItem = new PatchItem(vPatch);
  605. foreach (var patchItem in PatchItemList)
  606. {
  607. if (patchItem.PatchId == vPatch.PatchId)
  608. {
  609. ObjectHelper.CopyMatchingFields(vPatch, patchItem);
  610. break;
  611. }
  612. }//foreach
  613. }//if vpatch!=null
  614. RefresUIPatchItem(SelectedPatchItem.PatchId);
  615. //刷新站点的统计信息
  616. ucStationGrid.RefreshItems();
  617. }//blTask
  618. }
  619. private void LogScrollTop_Click(object sender, RoutedEventArgs e)
  620. {
  621. LogRichTextBox.ScrollToHome();
  622. }
  623. private void LogScrollMiddle_Click(object sender, RoutedEventArgs e)
  624. {
  625. // 获取 LogRichTextBox 文档的总高度
  626. //double documentHeight = LogRichTextBox.Document.ContentEnd.GetPositionAtOffset(0).GetValue("VerticalOffset");
  627. //// 获取当前可视区域的高度
  628. //double viewportHeight = LogRichTextBox.ViewportHeight;
  629. //// 计算中间位置
  630. //double middleOffset = (documentHeight - viewportHeight) / 2;
  631. //// 滚动到中间位置
  632. //LogRichTextBox.ScrollToVerticalOffset(middleOffset);
  633. }
  634. private void LogScrollBottom_Click(object sender, RoutedEventArgs e)
  635. {
  636. LogRichTextBox.ScrollToEnd();
  637. }
  638. private void MiUpdatePatchname_Click(object sender, RoutedEventArgs e)
  639. {
  640. if (SelectedPatchItem == null) return;
  641. EditNameDlg editNameDlg = new EditNameDlg("任务", SelectedPatchItem.StandName)
  642. {
  643. Owner = Application.Current.MainWindow,
  644. WindowStartupLocation = WindowStartupLocation.CenterOwner
  645. };
  646. if (editNameDlg.ShowDialog() == true)
  647. {
  648. UpdateStandName(SelectedPatchItem, editNameDlg.EditName);
  649. }
  650. }
  651. private async void UpdateStandName(PatchItem patchItem, string newPatchName)
  652. {
  653. try
  654. {
  655. bool blUpdate = false;
  656. await Task.Run(() =>
  657. {
  658. blUpdate = DBPatch.UpdatePatchName(patchItem.PatchId, newPatchName);
  659. });
  660. if (blUpdate)
  661. {
  662. patchItem.StandName = newPatchName;
  663. }
  664. else
  665. {
  666. MessageBox.Show(Application.Current.MainWindow, $"修改任务名称失败。", "警告",
  667. MessageBoxButton.OK, MessageBoxImage.Warning);
  668. }
  669. }
  670. catch (Exception ex)
  671. {
  672. MessageBox.Show(Application.Current.MainWindow, $"修改模板名称:{ex.Message}错误", "错误",
  673. MessageBoxButton.OK, MessageBoxImage.Error);
  674. }
  675. }
  676. private void MiDeletePatch_Click(object sender, RoutedEventArgs e)
  677. {
  678. DeletePatchItem();
  679. }
  680. private void BtnRefreshDetail_Click(object sender, RoutedEventArgs e)
  681. {
  682. //ucPatchGird.CurPatchItem = null;
  683. //ucPatchGird.CurPatchItem = SelectedPatchItem;
  684. ucPatchGird.ChangePatchItemOrFinType(null,null ,SelectedPatchFindType);
  685. ucPatchGird.ChangePatchItemOrFinType(SelectedPatchItem, SelectedStationItem,SelectedPatchFindType);
  686. }
  687. private void AiLogSave_Click(object sender, RoutedEventArgs e)
  688. {
  689. ////ucPatchGird.SelectedPatchDetailItem;
  690. //TextRange textRange = new TextRange(LogRichTextBox.Document.ContentStart, LogRichTextBox.Document.ContentEnd);
  691. ////return textRange.Text; // 提取纯文本
  692. //string aiLog = textRange.Text;
  693. if (ucPatchGird.SelectedPatchDetailItem == null) return;
  694. PatchDetailItem patchDetailItem = ucPatchGird.SelectedPatchDetailItem;
  695. string logPath = patchDetailItem.LogPath;
  696. ThisApp.ExportAiLog(logPath);
  697. }
  698. //控制左侧的显示和折叠
  699. private void BtnLeftCtl_Click(object sender, RoutedEventArgs e)
  700. {
  701. bool visiable = !LeftVisiable;
  702. ChangeLeftVisiable(visiable);
  703. }
  704. private void BtnRightCtl_Click(object sender, RoutedEventArgs e)
  705. {
  706. bool visiable = !RightVisiable;
  707. ChangeRightVisiable(visiable);
  708. }
  709. private void ChangeLeftVisiable(bool visiable)
  710. {
  711. LeftVisiable = visiable;
  712. colLeft.Width = new GridLength(visiable ? COLUMN_LEFT_WIDTH : 0);
  713. btnLeftCtl.Content = visiable ? "◀️" : "▶️";
  714. btnLeftCtl.ToolTip = visiable ? "点击隐藏左侧栏" : "点击显示左侧栏";
  715. }
  716. private void ChangeRightVisiable(bool visiable)
  717. {
  718. RightVisiable = visiable;
  719. colRight.Width = new GridLength(visiable ? COLUMN_RIGHT_WIDTH : 0);
  720. btnRightCtl.Content = visiable ? "▶️" : "◀️" ;
  721. btnRightCtl.ToolTip = visiable ? "点击隐藏右侧栏" : "点击显示右侧栏";
  722. }
  723. private void BtnStationFirstPage_Click(object sender, RoutedEventArgs e)
  724. {
  725. ucStationGrid.FirstPage();
  726. }
  727. private void BtnStationPrePage_Click(object sender, RoutedEventArgs e)
  728. {
  729. ucStationGrid.PrePage();
  730. }
  731. private void BtnStationNextPage_Click(object sender, RoutedEventArgs e)
  732. {
  733. ucStationGrid.NextPage();
  734. }
  735. private void BtnStationLastPage_Click(object sender, RoutedEventArgs e)
  736. {
  737. ucStationGrid.LastPage();
  738. }
  739. private void BtnStationSpeciPage_Click(object sender, RoutedEventArgs e)
  740. {
  741. try
  742. {
  743. int pageNumber = int.Parse(txtStationPageNumber.Text.ToString());
  744. ucStationGrid.SpeciPage(pageNumber);
  745. }
  746. catch
  747. {
  748. }
  749. }
  750. private void BtnQuery_Click(object sender, RoutedEventArgs e)
  751. {
  752. FindStationId = txtFindStationId.Text.Trim();
  753. ucStationGrid.ChangeFind(FindStationId,SelectedPatchItem.PatchId);
  754. Apply_Station_Title(SelectedStationItem);
  755. }
  756. private void BtnRefreshStation_Click(object sender, RoutedEventArgs e)
  757. {
  758. FindStationId = txtFindStationId.Text.Trim();
  759. ucStationGrid.ChangeFind(FindStationId, SelectedPatchItem.PatchId);
  760. //Apply_UCPatchDetail_Title(SelectedPatchItem);
  761. Apply_Station_Title(SelectedStationItem);
  762. }
  763. private ScrollViewer _dgPatchScrollViewer;
  764. private ScrollViewer GetDgPatchScrollViewer(DependencyObject obj)
  765. {
  766. if (_dgPatchScrollViewer != null)
  767. {
  768. return _dgPatchScrollViewer;
  769. }
  770. if (obj is ScrollViewer)
  771. {
  772. _dgPatchScrollViewer = (ScrollViewer)obj;
  773. return obj as ScrollViewer;
  774. }
  775. for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
  776. {
  777. var child = VisualTreeHelper.GetChild(obj, i);
  778. var scrollViewer = GetDgPatchScrollViewer(child);
  779. if (scrollViewer != null)
  780. {
  781. _dgPatchScrollViewer = scrollViewer;
  782. return scrollViewer;
  783. }
  784. }
  785. return null;
  786. }
  787. //----------------------------------------------------------------
  788. }
  789. public enum PatchFindType
  790. {
  791. ALL = 1, //所有数据
  792. RUN_YES = 2, //已运行识别的
  793. RUN_NO = 3, //未运行的
  794. RESULT_OK = 4, //结果正确的
  795. RESULT_ERROR = 5, //结果错误的
  796. RESULT_INVLIAD = 6, //结果无效
  797. ALL_NO_STAND_VALUE =7, //所有无标准值项
  798. RUN_YES_NO_STAND_VALUE = 8, //已运行的无标准值的项
  799. RUN_NO_NO_STAND_VALUE = 9, //未运行的无标准值的项
  800. HAVE_MEMO = 8 //有备注
  801. }
  802. //----------------------------------------------------------------------
  803. }