Media.razor.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427
  1. using AI.Platform.Core;
  2. using AI.Platform.Core.Entity.Media;
  3. using AI.Platform.Core.Entity.Site;
  4. using AI.Platform.Page.Pages.Media.Model;
  5. using AI.Platform.Page.Pages.Site.Model;
  6. using AntDesign;
  7. using AntDesign.TableModels;
  8. using Dm.util;
  9. using Microsoft.AspNetCore.Components;
  10. using Microsoft.AspNetCore.Components.Forms;
  11. using Microsoft.JSInterop;
  12. using SqlSugar;
  13. using System.Data.Common;
  14. using System.Text.Json;
  15. using System.Threading.Tasks;
  16. namespace AI.Platform.Page.Pages.Media;
  17. public partial class Media
  18. {
  19. /// <summary>
  20. ///
  21. /// </summary>
  22. [Inject] NavigationManager NavigationManager { get; set; }
  23. /// <summary>
  24. /// 数据库仓储
  25. /// </summary>
  26. [Inject] SqlSugarRepository<MediaEntity> _Repository { get; set; }
  27. [Inject] SqlSugarRepository<SiteEntity> _SiteRepository { get; set; }
  28. /// <summary>
  29. ///
  30. /// </summary>
  31. [Inject] IJSRuntime IJSRuntime { get; set; }
  32. /// <summary>
  33. ///
  34. /// </summary>
  35. private ITable _Table;
  36. /// <summary>
  37. ///
  38. /// </summary>
  39. private IEnumerable<SystemMenu> _SelectedRows = [];
  40. /// <summary>
  41. /// 广告列表信息
  42. /// </summary>
  43. private List<MediaInfoModel> _DataSource;
  44. /// <summary>
  45. ///
  46. /// </summary>
  47. private int Pi = 1;
  48. /// <summary>
  49. ///
  50. /// </summary>
  51. private int Ps = 20;
  52. /// <summary>
  53. /// 总条数
  54. /// </summary>
  55. private int Total = 0;
  56. /// <summary>
  57. /// 加载
  58. /// </summary>
  59. private bool Loading = false;
  60. /// <summary>
  61. /// 查询过滤条件
  62. /// </summary>
  63. private FilterData filterData { set; get; } = new();
  64. /// <summary>
  65. /// 编辑弹窗
  66. /// </summary>
  67. private UpdateMediaDialog updateMediaDialog { set; get; } = new();
  68. /// <summary>
  69. /// 标识编辑弹窗是否显示
  70. /// </summary>
  71. private bool isOpen { set; get; } = false;
  72. /// <summary>
  73. /// 标识预览弹窗是否显示
  74. /// </summary>
  75. private bool isPreviewOpen { set; get; } = false;
  76. private MediaDialogModel model = new MediaDialogModel();
  77. private PreviewInfo previewModel = new PreviewInfo();
  78. // <summary>
  79. /// 站点
  80. /// </summary>
  81. private List<SiteInfo> Sites;
  82. /// <summary>
  83. /// 打开编辑弹窗
  84. /// </summary>
  85. /// <param name="type">类型:1:新增;2:编辑;3:删除</param>
  86. /// <param name="media">广告信息</param>
  87. /// <returns></returns>
  88. private async Task ShowDialog(int type, MediaInfoModel? media)
  89. {
  90. model = new MediaDialogModel();
  91. model.Type = type;
  92. model.siteInfos = Sites;
  93. var siteinfo = Sites.Find(it => it.Id == Global.CurrentUser.SiteId);
  94. if (type ==1 && siteinfo != null)
  95. {
  96. model.GroupID = siteinfo.ParentId;
  97. model.BusinessUnitID = siteinfo.Id;
  98. }
  99. if (type == 2 || type == 3)
  100. {
  101. model.Id = media?.Id;
  102. model.GroupID = media?.GroupID ?? -1;
  103. model.BusinessUnitID = media?.BusinessUnitID ?? -1;
  104. model.FileName = media?.FileName ?? "";
  105. model.GuidFileName = media?.GuidFileName ?? "";
  106. model.FileExtension = media?.FileExtension ?? "";
  107. model.SavePath = media?.SavePath ?? "";
  108. model.MediaUploader = media?.MediaUploader ?? "";
  109. model.StartTime = media?.StartTime;
  110. model.EndTime = media?.EndTime;
  111. model.EffecitiveTime = media?.EffecitiveTime;
  112. model.FailureTime = media?.FailureTime;
  113. model.MediaState = media?.MediaState ?? 0;
  114. model.MachineStateList = JsonSerializer.Deserialize<List<string>>(media?.MachineStateList ?? "[]");
  115. model.Remark = media?.Remark ?? "";
  116. }
  117. isOpen = true;
  118. }
  119. /// <summary>
  120. /// 编辑弹窗信息回调
  121. /// </summary>
  122. /// <param name="model"></param>
  123. private async Task OnDialogCallback(MediaDialogModel model)
  124. {
  125. Console.WriteLine(model);
  126. switch (model.Type)
  127. {
  128. case 1:
  129. await _Repository.InsertAsync(model.ToCompany());
  130. break;
  131. case 2:
  132. MediaEntity mediaEntity = model.ToCompany();
  133. await _Repository.Context.Updateable(mediaEntity).
  134. UpdateColumns(it => new { it.GroupId,it.BusinessUnitId, it.MediaState,it.MachineState, it.StartTime, it.EndTime ,it.EffectiveTime,it.FailureTime,it.Remark })
  135. .ExecuteCommandAsync();
  136. break;
  137. case 3:
  138. await _Repository.DeleteByIdAsync(model.Id);
  139. if(model.SavePath.IsNotNullOrEmpty())
  140. {
  141. File.Delete(model.SavePath);
  142. }
  143. break;
  144. }
  145. await Query();
  146. }
  147. private async Task ShowPreviewDialog(MediaInfoModel media)
  148. {
  149. previewModel = new()
  150. {
  151. Type = media.getType(),
  152. Path = media.SavePath
  153. };
  154. isPreviewOpen = true;
  155. }
  156. /// <summary>
  157. /// 弹窗是否显示回调
  158. /// </summary>
  159. /// <param name="isOpen"></param>
  160. private void OnDialogVisibleCallback(int type, bool isOpen)
  161. {
  162. switch(type)
  163. {
  164. case 1:
  165. this.isOpen = isOpen;
  166. break;
  167. case 2:
  168. this.isPreviewOpen = isOpen;
  169. break;
  170. }
  171. }
  172. private async Task searchSitesAsync()
  173. {
  174. if (Global.CurrentUser.Account == "admin")
  175. {
  176. Sites = await _SiteRepository.AsQueryable()
  177. .Select<SiteInfo>()
  178. .ToListAsync();
  179. }
  180. else
  181. {
  182. Sites = await _SiteRepository.AsQueryable()
  183. .Where(it => it.Id == Global.CurrentUser.SiteId || it.ParentId == Global.CurrentUser.SiteId)
  184. .Select<SiteInfo>()
  185. .ToListAsync();
  186. }
  187. }
  188. /// <summary>
  189. /// 表格查询
  190. /// </summary>
  191. /// <param name="query"></param>
  192. /// <returns></returns>
  193. private async Task OnChange(QueryModel<MediaInfoModel> query)
  194. => await Query();
  195. /// <summary>
  196. /// 查
  197. /// </summary>
  198. /// <returns></returns>
  199. private async Task Query()
  200. {
  201. Loading = true;
  202. var query = _Repository.AsQueryable()
  203. .LeftJoin<SiteEntity>((media,site) => media.BusinessUnitId == site.Id)
  204. .WhereIF(filterData.searchFileName != null, media => media.FileName.Contains(filterData.searchFileName))
  205. .WhereIF(filterData.searchMediaUploader != null, media => media.Uploader.Contains(filterData.searchMediaUploader))
  206. .WhereIF(filterData.searchMediaState != null && filterData.searchMediaState != -1, media => media.MediaState == filterData.searchMediaState)
  207. .WhereIF(filterData.searchStartTime != null && filterData.searchEndTime != null, media => media.StartTime >= filterData.searchStartTime && media.EndTime <= filterData.searchEndTime)
  208. .WhereIF(filterData.searchEffecitiveTime != null && filterData.searchFailureTime != null, media => media.EffectiveTime >= filterData.searchEffecitiveTime && media.FailureTime <= filterData.searchFailureTime)
  209. .WhereIF(filterData.searchStartEditTime != null && filterData.searchEndEditTime != null, media => media.EditTime >= filterData.searchStartEditTime && media.EditTime <= filterData.searchEndEditTime);
  210. if (filterData.searchMachineStateList.IsNotNullOrEmpty())
  211. {
  212. Expressionable<MediaEntity> expressionable = Expressionable.Create<MediaEntity>();
  213. foreach (var state in filterData.searchMachineStateList)
  214. {
  215. var jsonQuoted = $"\"{state}\"";
  216. expressionable.Or(m => m.MachineState.Contains(jsonQuoted));
  217. }
  218. query = query.Where(expressionable.ToExpression());
  219. }
  220. Total = await query.CountAsync();
  221. _DataSource = await query
  222. .Select((media, site) => new MediaInfoModel()
  223. {
  224. Id = media.Id,
  225. GroupID = media.GroupId,
  226. BusinessUnitID = media.BusinessUnitId,
  227. SavePath = media.LocalPath,
  228. FileName = media.FileName,
  229. GuidFileName = media.GuidFileName,
  230. FileExtension = media.FileExtension,
  231. MediaUploader = media.Uploader,
  232. MachineStateList = media.MachineState,
  233. MediaState = media.MediaState,
  234. SiteName = site.Name,
  235. StartTime = media.StartTime,
  236. EndTime = media.EndTime,
  237. EffecitiveTime = media.EffectiveTime,
  238. FailureTime = media.FailureTime,
  239. EditTime = media.EditTime,
  240. Remark = media.Remark,
  241. })
  242. .OrderByDescending(media => media.EditTime)
  243. .Skip((filterData.currentPage - 1) * filterData.pageSize)
  244. .Take(filterData.pageSize)
  245. .ToListAsync();
  246. Loading = false;
  247. }
  248. Func<PaginationTotalContext, string> showTotal = ctx => $"总数 {ctx.Total} ";
  249. private async Task OnPageChange(PaginationEventArgs args)
  250. {
  251. filterData.pageSize = args.PageSize;
  252. filterData.currentPage = args.Page;
  253. await Query();
  254. }
  255. /// <summary>
  256. /// 清空查询条件
  257. /// </summary>
  258. private void HandleReset()
  259. {
  260. filterData = new();
  261. }
  262. /// <summary>
  263. /// 单选选择器选择事件
  264. /// </summary>
  265. /// <param name="value">选择的值</param>
  266. private void OnSelectItemChange(string value)
  267. {
  268. Console.WriteLine(value);
  269. int state = -1;
  270. int.TryParse(value, out state);
  271. filterData.searchMediaState = state;
  272. }
  273. /// <summary>
  274. /// 多选选择器选择事件
  275. /// </summary>
  276. /// <param name="values">选择的值</param>
  277. private void OnSelectItemsChange(IEnumerable<string> values)
  278. {
  279. Console.WriteLine(values);
  280. filterData.searchMachineStateList = values.ToList();
  281. }
  282. /// <summary>
  283. /// 日期选择器选择回调
  284. /// </summary>
  285. /// <param name="value">选择的日期</param>
  286. /// <param name="type">1:有效时间段;2:更新时间;3:播放时段</param>
  287. private void onDateChage(DateRangeChangedEventArgs<DateTime?[]> value,int type)
  288. {
  289. switch (type)
  290. {
  291. case 1:
  292. filterData.searchEffecitiveTime = value.Dates[0];
  293. filterData.searchFailureTime = value.Dates[1];
  294. break;
  295. case 2:
  296. filterData.searchStartEditTime = value.Dates[0];
  297. filterData.searchEndEditTime = value.Dates[1];
  298. break;
  299. case 3:
  300. DateTime? startTime = value.Dates[0];
  301. DateTime? endTime = value.Dates[1];
  302. filterData.searchStartTime = startTime?.Hour;
  303. filterData.searchEndTime = endTime?.Hour;
  304. break;
  305. }
  306. }
  307. protected override async void OnInitialized()
  308. {
  309. }
  310. protected override async Task OnAfterRenderAsync(bool firstRender)
  311. {
  312. if (firstRender)
  313. {
  314. await NavigationManager.RedirectLogin(IJSRuntime);
  315. await Query();
  316. await searchSitesAsync();
  317. }
  318. }
  319. private async Task OnChange(QueryModel<SystemMenu> query)
  320. => await Query();
  321. /// <summary>
  322. /// 查找条件
  323. /// </summary>
  324. public class FilterData
  325. {
  326. /// <summary>
  327. /// 页码
  328. /// </summary>
  329. public int currentPage { set; get; } = 1;
  330. /// <summary>
  331. /// 页数
  332. /// </summary>
  333. public int pageSize { set; get; } = 10;
  334. /// <summary>
  335. /// 要查找的文件名
  336. /// </summary>
  337. public string? searchFileName { set; get; }
  338. /// <summary>
  339. /// 要查找文件开始播放时间
  340. /// </summary>
  341. public int? searchStartTime { set; get; }
  342. /// <summary>
  343. /// 要查找文件结束播放时间
  344. /// </summary>
  345. public int? searchEndTime { set; get; }
  346. /// <summary>
  347. /// 要查找文件生效时间
  348. /// </summary>
  349. public DateTime? searchEffecitiveTime { set; get; }
  350. /// <summary>
  351. /// 要查找文件失效时间
  352. /// </summary>
  353. public DateTime? searchFailureTime { set; get; }
  354. /// <summary>
  355. /// 要查找文件油机状态
  356. /// </summary>
  357. public List<string>? searchMachineStateList { set; get; }
  358. /// <summary>
  359. /// 要查找文件广告状态 0:禁用;1:可用
  360. /// </summary>
  361. public int? searchMediaState { set; get; }
  362. /// <summary>
  363. /// 要查找文件上传人
  364. /// </summary>
  365. public string? searchMediaUploader { set; get; }
  366. /// <summary>
  367. /// 根据文件修改时间范围查找(开始时间)
  368. /// </summary>
  369. public DateTime? searchStartEditTime { set; get; }
  370. /// <summary>
  371. /// 根据文件修改时间范围查找(结束时间)
  372. /// </summary>
  373. public DateTime? searchEndEditTime { set; get; }
  374. }
  375. }