ImageCategories.razor.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411
  1. using aipadmin;
  2. using AIPlatform.Protocol.Entities;
  3. using AIPlatform.Protocol.Utilities;
  4. using aipmgr.Models;
  5. using aipmgr.Shared;
  6. using aipmgr.Utilities;
  7. using BootstrapBlazor.Components;
  8. using System.Diagnostics.CodeAnalysis;
  9. using System.Text.RegularExpressions;
  10. namespace aipmgr.Pages
  11. {
  12. public sealed partial class ImageCategories
  13. {
  14. [NotNull]
  15. private Table<ImageCategoryModel>? ImageCategoryTable { get; set; }
  16. private List<int> _pageItemsSource => new() { 20 };
  17. [NotNull]
  18. private List<SelectedItem>? users = new List<SelectedItem>();
  19. [NotNull]
  20. private List<SelectedItem>? _users
  21. {
  22. get => users; set
  23. {
  24. users = value;
  25. StateHasChanged();
  26. }
  27. }
  28. [NotNull]
  29. private List<Account>? _accounts { get; set; }
  30. [NotNull]
  31. private List<string>? _selectedUserValues { get; set; }
  32. [NotNull]
  33. private ImageCategoryModel? _currChild { get; set; } = new ImageCategoryModel();
  34. [NotNull]
  35. private Modal? _assignUserModal { get; set; }
  36. [NotNull]
  37. private Modal? _setGoldStandardModal { get; set; }
  38. [NotNull]
  39. private MessageBase? _messageBaseRef { get; set; }
  40. private AccountType _assignUserType { get; set; }
  41. private string? _assignUserModalTitle { get; set; }
  42. [NotNull]
  43. private List<SelectedItem>? _frameModeItems { get; set; }
  44. private async Task<ImageCategoryModel> OnAddAsync()
  45. {
  46. try
  47. {
  48. return new ImageCategoryModel();
  49. }
  50. catch (Exception ex)
  51. {
  52. await _messageBaseRef.ShowMessageBaseAsync($"新建图像分类失败,错误:{ex.Translate()}");
  53. return new ImageCategoryModel();
  54. }
  55. }
  56. private async Task<bool> OnDeleteAsync(IEnumerable<ImageCategoryModel> items)
  57. {
  58. try
  59. {
  60. var result = false;
  61. foreach (var item in items)
  62. {
  63. if (item.Level == CategoryLevel.Organization)
  64. {
  65. await _messageBaseRef.ShowMessageBaseAsync($"{item.Name} 是组织,不可删除", Color.Warning);
  66. continue;
  67. }
  68. if (item.HasChildren)
  69. {
  70. await _messageBaseRef.ShowMessageBaseAsync($"{item.Name} 包含子级,不可删除", Color.Warning);
  71. continue;
  72. }
  73. await AdminManager.Shared.DeleteImageCategoryAsync(item.Id);
  74. result = true;
  75. //await _messageBaseRef.ShowMessageBaseAsync($"{item.Name} 删除成功", Color.Success);
  76. }
  77. return await Task.FromResult(result);
  78. }
  79. catch (Exception ex)
  80. {
  81. await _messageBaseRef.ShowMessageBaseAsync($"删除图像分类失败,错误:{ex.Translate()}");
  82. return await Task.FromResult(false);
  83. }
  84. }
  85. #region 搜索,树型默认展开第一级
  86. private async Task<QueryData<ImageCategoryModel>> OnQueryAsync(QueryPageOptions options)
  87. {
  88. try
  89. {
  90. _accounts = await AdminManager.Shared.GetAccountsAsync();
  91. var items = new List<ImageCategoryModel>();
  92. var totalCount = 0;
  93. var keyword = options.SearchText;
  94. var pageIndex = options.PageIndex - 1;
  95. var pageSize = options.PageItems;
  96. if (string.IsNullOrEmpty(keyword))
  97. {
  98. var organizations = await AdminManager.Shared.GetOrganizationsAsync(pageIndex, pageSize, keyword);
  99. foreach (var item in organizations)
  100. {
  101. var vo = MapHelper.Map<ImageCategoryModel, Organization>(item);
  102. vo.CreateTime = vo.CreateTime.ToLocalTime();
  103. vo.UpdateTime = vo.UpdateTime.ToLocalTime();
  104. vo.Level = CategoryLevel.Organization;
  105. vo.HasChildren = await AdminManager.Shared.ExistOrganizationChildrenAsync(item.Id);
  106. items.Add(vo);
  107. }
  108. totalCount = await AdminManager.Shared.GetOrganizationCountAsync(keyword);
  109. }
  110. else
  111. {
  112. var categories = await AdminManager.Shared.GetImageCategoriesAsync(pageIndex, pageSize, keyword);
  113. foreach (var item in categories)
  114. {
  115. var vo = MapHelper.Map<ImageCategoryModel, ImageCategory>(item);
  116. if (vo.VideoItem.IntervalFrame <= 0)
  117. {
  118. vo.VideoItem.IntervalFrame = 1;
  119. }
  120. vo.CreateTime = vo.CreateTime.ToLocalTime();
  121. vo.UpdateTime = vo.UpdateTime.ToLocalTime();
  122. vo.HasChildren = false;
  123. items.Add(vo);
  124. }
  125. totalCount = await AdminManager.Shared.GetImageCategoriesCountAsync(keyword);
  126. }
  127. return await Task.FromResult(new QueryData<ImageCategoryModel>()
  128. {
  129. Items = items,
  130. TotalCount = totalCount,
  131. });
  132. }
  133. catch (Exception ex)
  134. {
  135. await _messageBaseRef.ShowMessageBaseAsync($"查询图像分类失败,错误:{ex.Translate()}");
  136. return new QueryData<ImageCategoryModel>();
  137. }
  138. }
  139. private async Task<IEnumerable<TableTreeNode<ImageCategoryModel>>> TreeNodeConverter(IEnumerable<ImageCategoryModel> items)
  140. {
  141. // 构造树状数据结构
  142. var ret = await BuildTreeNodesAsync(items);
  143. return await Task.FromResult(ret);
  144. }
  145. private async Task<IEnumerable<TableTreeNode<ImageCategoryModel>>> BuildTreeNodesAsync(IEnumerable<ImageCategoryModel> items)
  146. {
  147. try
  148. {
  149. var ret = new List<TableTreeNode<ImageCategoryModel>>();
  150. foreach (var item in items)
  151. {
  152. var children = await OnTreeExpand(item);
  153. ret.Add(new TableTreeNode<ImageCategoryModel>(item)
  154. {
  155. // 是否含子数据
  156. HasChildren = item.HasChildren,
  157. // 如果子项集合有值 则默认展开此节点
  158. IsExpand = item.HasChildren,
  159. // 获得子项集合
  160. Items = children,
  161. });
  162. }
  163. return ret;
  164. }
  165. catch (Exception ex)
  166. {
  167. await _messageBaseRef.ShowMessageBaseAsync($"获取图像分类失败,错误:{ex.Translate()}");
  168. return new List<TableTreeNode<ImageCategoryModel>>();
  169. }
  170. }
  171. private async Task<IEnumerable<TableTreeNode<ImageCategoryModel>>> OnTreeExpand(ImageCategoryModel tree)
  172. {
  173. try
  174. {
  175. var imageCategories = await AdminManager.Shared.GetImageCategoriesByParentIdAsync(tree.Id);
  176. var children = new List<TableTreeNode<ImageCategoryModel>>();
  177. foreach (var item in imageCategories)
  178. {
  179. var vo = MapHelper.Map<ImageCategoryModel, ImageCategory>(item);
  180. if (vo.VideoItem.IntervalFrame <= 0)
  181. {
  182. vo.VideoItem.IntervalFrame = 1;
  183. }
  184. vo.CreateTime = vo.CreateTime.ToLocalTime();
  185. vo.UpdateTime = vo.UpdateTime.ToLocalTime();
  186. vo.GoldStandardQuantityItem ??= new GoldStandardQuantityItem();
  187. vo.SelfCheckQuantityItem ??= new SelfCheckQuantityItem();
  188. children.Add(new TableTreeNode<ImageCategoryModel>(vo) { HasChildren = vo.HasChildren });
  189. }
  190. return children;
  191. }
  192. catch (Exception ex)
  193. {
  194. await _messageBaseRef.ShowMessageBaseAsync($"获取图像分类失败,错误:{ex.Translate()}");
  195. return new List<TableTreeNode<ImageCategoryModel>>();
  196. }
  197. }
  198. #endregion 搜索,树型默认展开第一级
  199. #region 分配标注/开发/共享人员/采集人员
  200. private async Task OnAssignUserAsync(ImageCategoryModel item, AccountType accountType)
  201. {
  202. try
  203. {
  204. await LoadingManager.OpenAsync();
  205. _assignUserType = accountType;
  206. _currChild = item;
  207. _users.Clear();
  208. switch (_assignUserType)
  209. {
  210. case AccountType.Labeler:
  211. _assignUserModalTitle = "分配标注人员";
  212. foreach (var labeler in _accounts)
  213. {
  214. if (labeler.Organizations.Any(x => x.Id == item.OrganizationId && labeler.Roles.Contains(Role.Labeler)))
  215. {
  216. _users.Add(new SelectedItem
  217. {
  218. Value = labeler.Id.ToString(),
  219. Text = labeler.Name
  220. });
  221. }
  222. }
  223. _selectedUserValues = item.Labelers.Select(x => x.Id.ToString()).ToList();
  224. break;
  225. case AccountType.Developer:
  226. _assignUserModalTitle = "分配开发人员";
  227. foreach (var developer in _accounts)
  228. {
  229. if (developer.Organizations.Any(x => x.Id == item.OrganizationId && developer.Roles.Contains(Role.Developer)))
  230. {
  231. _users.Add(new SelectedItem
  232. {
  233. Value = developer.Id.ToString(),
  234. Text = developer.Name
  235. });
  236. }
  237. }
  238. _selectedUserValues = item.Developers.Select(x => x.Id.ToString()).ToList();
  239. break;
  240. case AccountType.Sharer:
  241. _assignUserModalTitle = "分配共享开发人员";
  242. foreach (var developer in _accounts)
  243. {
  244. if (developer.Organizations.Any(x => x.Id == item.OrganizationId && developer.Roles.Contains(Role.Developer)))
  245. {
  246. _users.Add(new SelectedItem
  247. {
  248. Value = developer.Id.ToString(),
  249. Text = developer.Name
  250. });
  251. }
  252. }
  253. _selectedUserValues = item.Sharers.Select(x => x.Id.ToString()).ToList();
  254. break;
  255. case AccountType.Gatherer:
  256. _assignUserModalTitle = "分配采集人员";
  257. foreach (var gatherer in _accounts)
  258. {
  259. if (gatherer.Organizations.Any(x => x.Id == item.OrganizationId && gatherer.Roles.Contains(Role.Gatherer)))
  260. {
  261. _users.Add(new SelectedItem
  262. {
  263. Value = gatherer.Id.ToString(),
  264. Text = gatherer.Name
  265. });
  266. }
  267. }
  268. _selectedUserValues = item.Gatherers.Select(x => x.Id.ToString()).ToList();
  269. break;
  270. default:
  271. _assignUserModalTitle = "分配人员";
  272. break;
  273. }
  274. StateHasChanged();
  275. await _assignUserModal.Show();
  276. }
  277. catch (Exception ex)
  278. {
  279. await _messageBaseRef.ShowMessageBaseAsync($"{_assignUserModalTitle}失败,错误:{ex.Translate()}");
  280. }
  281. finally
  282. {
  283. await LoadingManager.CloseAsync();
  284. }
  285. }
  286. private async void OnConfirmUserAsync()
  287. {
  288. try
  289. {
  290. await LoadingManager.OpenAsync();
  291. var users = new List<EntityBase>();
  292. foreach (var user in _users)
  293. {
  294. if (_selectedUserValues.Contains(user.Value))
  295. {
  296. users.Add(new EntityBase { Id = long.Parse(user.Value), Name = user.Text });
  297. }
  298. }
  299. await AdminManager.Shared.UpdateImageCategoryUsersAsync(_currChild.Id, _assignUserType, users);
  300. switch (_assignUserType)
  301. {
  302. case AccountType.Labeler:
  303. _currChild.Labelers = users;
  304. break;
  305. case AccountType.Developer:
  306. _currChild.Developers = users;
  307. break;
  308. case AccountType.Sharer:
  309. _currChild.Sharers = users;
  310. break;
  311. case AccountType.Gatherer:
  312. _currChild.Gatherers = users;
  313. break;
  314. default:
  315. break;
  316. }
  317. await _assignUserModal.Close();
  318. //await ImageCategoryTable.QueryAsync();
  319. await InvokeAsync(StateHasChanged);
  320. }
  321. catch (Exception ex)
  322. {
  323. await _messageBaseRef.ShowMessageBaseAsync($"{_assignUserModalTitle}失败,错误:{ex.Translate()}");
  324. }
  325. finally
  326. {
  327. await LoadingManager.CloseAsync();
  328. }
  329. }
  330. private Task OnCloseUserAsync()
  331. {
  332. _assignUserModalTitle = "";
  333. _currChild = new ImageCategoryModel();
  334. _selectedUserValues.Clear();
  335. return Task.CompletedTask;
  336. }
  337. #endregion 分配标注/开发/共享人员/采集人员
  338. #region 设置金标准/自校验/视频标注帧
  339. private async Task OnSetGoldStandardAsync(ImageCategoryModel item)
  340. {
  341. try
  342. {
  343. await LoadingManager.OpenAsync();
  344. _currChild = item;
  345. StateHasChanged();
  346. await _setGoldStandardModal.Show();
  347. }
  348. catch (Exception ex)
  349. {
  350. await _messageBaseRef.ShowMessageBaseAsync($"获取金标准设置失败,错误:{ex.Translate()}");
  351. }
  352. finally
  353. {
  354. await LoadingManager.CloseAsync();
  355. }
  356. }
  357. private async void OnConfirmGoldStandardAsync()
  358. {
  359. try
  360. {
  361. var similarityThreshold = _currChild.VideoItem.SimilarityThreshold;
  362. if (similarityThreshold != 0 && similarityThreshold != 1 && !Regex.IsMatch(similarityThreshold.ToString(), @"^\d+(\.\d{1,2})?$"))
  363. {
  364. await _messageBaseRef.ShowMessageBaseAsync($"提交金标准设置失败,相似度阈值取值范围为(0~1),最多可保留2位小数。");
  365. return;
  366. }
  367. await LoadingManager.OpenAsync();
  368. await AdminManager.Shared.UpdateImageCategoryGoldStandardAndSelfCheckQuantityItemAsync(_currChild.Id, _currChild.GoldStandardQuantityItem.Proportion, _currChild.GoldStandardQuantityItem.QualifiedPeople, _currChild.SelfCheckQuantityItem.Proportion, _currChild.IsSupportedSkipFrame, _currChild.VideoItem, _currChild.DifficultyLevel);
  369. await _setGoldStandardModal.Close();
  370. //await ImageCategoryTable.QueryAsync();
  371. await InvokeAsync(StateHasChanged);
  372. }
  373. catch (Exception ex)
  374. {
  375. await _messageBaseRef.ShowMessageBaseAsync($"提交金标准设置失败,错误:{ex.Translate()}");
  376. }
  377. finally
  378. {
  379. await LoadingManager.CloseAsync();
  380. }
  381. }
  382. private Task OnCloseGoldStandardAsync()
  383. {
  384. _currChild = new ImageCategoryModel();
  385. return Task.CompletedTask;
  386. }
  387. #endregion 设置金标准/自校验/视频标注帧
  388. }
  389. }