UpdateMediaDialog.razor 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440
  1. @using AI.Platform.Page.Pages.Media.Model
  2. @using System.Threading.Tasks
  3. @using System.Text.Json
  4. @if (IsVisible && Model != null)
  5. {
  6. <div class="modal-overlay">
  7. <div class="modal-content filter_box">
  8. @if (Model?.Type == 1 || Model?.Type == 2)
  9. {
  10. <EditForm Model="@Model" style="width:100%" Context="editContext" @key="Model">
  11. <DataAnnotationsValidator />
  12. <div class="filter_row">
  13. <div class="filter_colume">
  14. <div class="filter_row_around">
  15. <span>文件名</span><Input Placeholder="文件名" @bind-Value="Model.FileName" Style="width:80%" Disabled />
  16. </div>
  17. <ValidationMessage For="@(() => Model.FileName)" style="color:red"/>
  18. </div>
  19. <div class="filter_colume">
  20. <div class="filter_row_around">
  21. <span>上传人</span><Input Placeholder="上传人" @bind-Value="Model.MediaUploader" Style="width:80%" Disabled />
  22. </div>
  23. <ValidationMessage For="@(() => Model.MediaUploader)" style="color:red" />
  24. </div>
  25. </div>
  26. <div class="filter_row">
  27. <div class="filter_colume">
  28. <div class="filter_row_around">
  29. <span>广告状态</span>
  30. <SimpleSelect DefaultValue="@Model.MediaState.ToString()" OnSelectedItemChanged="@(data => OnSelectItemChange(1, data, editContext))" Style="width:80%">
  31. <SelectOptions>
  32. <SimpleSelectOption Value="0" Label="禁用" style="width:80%" />
  33. <SimpleSelectOption Value="1" Label="可用" style="width:80%" />
  34. </SelectOptions>
  35. </SimpleSelect>
  36. </div>
  37. <ValidationMessage For="@(() => Model.MediaState)" style="color:red" />
  38. </div>
  39. <div class="filter_colume">
  40. <div class="filter_row_around">
  41. <span>油机状态</span>
  42. <SimpleSelect DefaultValues="@Model.getMachineStateList()" OnSelectedItemsChanged="@(data => OnSelectItemsChange(data, editContext))" Mode="SelectMode.Multiple" style="width:80%">
  43. <SelectOptions>
  44. <SimpleSelectOption Value="idle" Label="空闲" />
  45. <SimpleSelectOption Value="lock" Label="锁枪" />
  46. <SimpleSelectOption Value="offline" Label="脱机" />
  47. <SimpleSelectOption Value="lift" Label="提枪" />
  48. <SimpleSelectOption Value="authorised" Label="授权" />
  49. <SimpleSelectOption Value="start" Label="开始" />
  50. <SimpleSelectOption Value="fueling" Label="加油中" />
  51. </SelectOptions>
  52. </SimpleSelect>
  53. </div>
  54. <ValidationMessage For="@(() => Model.MachineStateList)" style="color:red" />
  55. </div>
  56. </div>
  57. <div class="filter_row">
  58. <div class="filter_colume">
  59. <div class="filter_row_around">
  60. <span>有效时间段</span><RangePicker TValue="DateTime?[]" Value="EffecitiveTime" OnChange="@(date => onDateChage(date, 1))" />
  61. </div>
  62. <ValidationMessage For="@(() => Model.EffecitiveTime)" style="color:red" />
  63. </div>
  64. <div class="filter_colume">
  65. <div class="filter_row_around">
  66. <span style="margin-right:5%">播放时段</span><RangePicker TValue="DateTime?[]" Value="playRange" Picker="DatePickerType.Time" Format="@("HH")" OnChange="@(date => onDateChage(date, 2))" />
  67. </div>
  68. <ValidationMessage For="@(() => Model.StartTime)" style="color:red" />
  69. </div>
  70. </div>
  71. <div class="filter_row">
  72. <div class="filter_colume">
  73. <div class="filter_row_around">
  74. <span>下发油站</span>
  75. <SimpleSelect DefaultValue="@Model.BusinessUnitID.ToString()" OnSelectedItemChanged="@(data => OnSelectItemChange(2, data, editContext))" style="width:80%">
  76. <SelectOptions>
  77. @foreach (var department in Model.siteInfos)
  78. {
  79. <SimpleSelectOption Value="@department.Id.ToString()" Label="@department.Name" style="width:80%" />
  80. }
  81. </SelectOptions>
  82. </SimpleSelect>
  83. </div>
  84. <ValidationMessage For="@(() => Model.BusinessUnitID)" style="color:red" />
  85. </div>
  86. <div class="filter_colume">
  87. <div class="filter_row_around">
  88. <span>备注</span><Input Placeholder="备注" @bind-Value="Model.Remark" style="width:80%" />
  89. </div>
  90. <ValidationMessage For="@(() => Model.Remark)" style="color:red" />
  91. </div>
  92. </div>
  93. @if (Model?.Type == 1)
  94. {
  95. <Upload class="filter_row" Name="file" style="justify-content:center" Action="@Global.MediaUploadUrl"
  96. Headers="uploadFileHeader"
  97. @bind-FileList="fileList" ListType="UploadListType.PictureCard"
  98. ShowUploadList="true" ShowDownloadIcon="true" ShowPreviewIcon="true" ShowRemoveIcon="true" ShowButton="fileList.Count < 1"
  99. OnCompleted="OnUploadCompleted" OnRemove="OnRemove">
  100. <div>
  101. <Icon Type="plus" />
  102. <div className="ant-upload-text">上传文件</div>
  103. </div>
  104. </Upload>
  105. }
  106. <div class="filter_row" style="justify-content:end;margin-top:5%;">
  107. <button Icon="plus" type="button" @onclick="() => HandleSubmit(editContext)" style="margin-right:2%">确定</button>
  108. <button Icon="reload" @onclick="Close" style="margin-right:2%">取消</button>
  109. </div>
  110. </EditForm>
  111. }
  112. @if(Model?.Type == 3)
  113. {
  114. <h3>是否删除广告?@(Model.FileName)</h3>
  115. <div class="filter_row" style="justify-content:end;margin-top:5%;">
  116. <Button Icon="plus" OnClick="onSure" Style="margin-right:2%">确定</Button>
  117. <Button Icon="reload" OnClick="Close" Style="margin-right:2%">取消</Button>
  118. </div>
  119. }
  120. </div>
  121. </div>
  122. }
  123. @code {
  124. /// <summary>
  125. /// 信息回调
  126. /// </summary>
  127. [Parameter] public EventCallback<MediaDialogModel> ModelChanged { get; set; }
  128. /// <summary>
  129. /// 打开/关闭窗口回调
  130. /// </summary>
  131. [Parameter] public EventCallback<bool> IsVisibleChanged { get; set; }
  132. /// <summary>
  133. /// 信息回调
  134. /// </summary>
  135. [Parameter] public EventCallback<MediaDialogModel> onCallback { get; set; }
  136. /// <summary>
  137. /// 打开/关闭窗口回调
  138. /// </summary>
  139. [Parameter] public EventCallback<bool> onVisibleCallback { get; set; }
  140. /// <summary>
  141. /// 数据
  142. /// </summary>
  143. [Parameter] public MediaDialogModel Model { get; set; }
  144. /// <summary>
  145. /// 配置是否弹窗
  146. /// </summary>
  147. [Parameter] public bool IsVisible { get; set; }
  148. /// <summary>
  149. /// 上传文件
  150. /// </summary>
  151. private List<UploadFileItem> fileList = new List<UploadFileItem>();
  152. /// <summary>
  153. /// 用于显示当前有效时间范围
  154. /// </summary>
  155. private DateTime?[] EffecitiveTime = new DateTime?[2];
  156. /// <summary>
  157. /// 用于显示当前播放时段
  158. /// </summary>
  159. private DateTime?[] playRange = new DateTime?[2];
  160. private Dictionary<string, string> uploadFileHeader = new Dictionary<string, string>();
  161. protected override void OnParametersSet()
  162. {
  163. fileList.Clear();
  164. uploadFileHeader["Authorization"] = Global.GetToken();
  165. EffecitiveTime = new DateTime?[]
  166. {
  167. Model?.EffecitiveTime,
  168. Model?.FailureTime
  169. };
  170. int startTimeInt = Math.Max(0, Math.Min(23, Model?.StartTime ?? 0));
  171. int endTimeInt = Math.Max(0, Math.Min(23, Model?.EndTime ?? 0));
  172. DateTime startTime = DateTime.Today.AddHours(startTimeInt);
  173. DateTime endTime = DateTime.Today.AddHours(endTimeInt);
  174. playRange = new DateTime?[]
  175. {
  176. startTime,endTime
  177. };
  178. }
  179. /// <summary>
  180. /// 关闭弹窗
  181. /// </summary>
  182. public async Task Close()
  183. {
  184. await OnlyClose();
  185. if(Model.SavePath.IsNotNullOrEmpty()) File.Delete(Model.SavePath);
  186. }
  187. /// <summary>
  188. /// 仅关闭弹窗
  189. /// </summary>
  190. /// <returns></returns>
  191. private async Task OnlyClose()
  192. {
  193. if (IsVisibleChanged.HasDelegate)
  194. {
  195. await IsVisibleChanged.InvokeAsync(false);
  196. }
  197. if (onVisibleCallback.HasDelegate)
  198. {
  199. await onVisibleCallback.InvokeAsync(false);
  200. }
  201. }
  202. /// <summary>
  203. /// 上传文件完毕
  204. /// </summary>
  205. /// <param name="info"></param>
  206. private void OnUploadCompleted(UploadInfo info)
  207. {
  208. string responseJson = info.File.Response;
  209. var response = JsonSerializer.Deserialize<Service.Output.Response<Service.Output.MediaFileUploadOutput>>(responseJson);
  210. Model.FileName = response?.data.fileName ?? "";
  211. Model.SavePath = response?.data.savePath ?? "";
  212. Model.GuidFileName = response?.data.guidName ?? "";
  213. Model.FileExtension = response?.data.extension ?? "";
  214. }
  215. private async Task<bool> OnRemove(UploadFileItem fileItem)
  216. {
  217. Console.WriteLine(fileItem);
  218. if (Model.SavePath.IsNotNullOrEmpty()) File.Delete(Model.SavePath);
  219. return true;
  220. }
  221. /// <summary>
  222. /// 单选选择器选择事件
  223. /// </summary>
  224. /// <param name="type">1:油机状态;2:站点</param>
  225. /// <param name="value">选择的值</param>
  226. private void OnSelectItemChange(int type, string value, EditContext editContext)
  227. {
  228. Console.WriteLine(value);
  229. switch (type)
  230. {
  231. case 1:
  232. int state = -1;
  233. int.TryParse(value, out state);
  234. Model.MediaState = state;
  235. editContext.NotifyFieldChanged(FieldIdentifier.Create(() => Model.MediaState));
  236. break;
  237. case 2:
  238. var siteinfo = Model.siteInfos.Find(it => it.Id.ToString().Equals(value));
  239. if (siteinfo != null)
  240. {
  241. Model.GroupID = siteinfo.ParentId;
  242. Model.BusinessUnitID = siteinfo.Id;
  243. editContext.NotifyFieldChanged(FieldIdentifier.Create(() => Model.BusinessUnitID));
  244. }
  245. break;
  246. }
  247. }
  248. /// <summary>
  249. /// 多选选择器选择事件
  250. /// </summary>
  251. /// <param name="values">选择的值</param>
  252. private void OnSelectItemsChange(IEnumerable<string> values ,EditContext editContext)
  253. {
  254. Console.WriteLine(values);
  255. if (values.Count() <= 0)
  256. {
  257. Model.MachineStateList = Model.getAllMachineStateList();
  258. } else
  259. {
  260. Model.MachineStateList = values.ToList();
  261. }
  262. editContext.NotifyFieldChanged(FieldIdentifier.Create(() => Model.MachineStateList));
  263. }
  264. /// <summary>
  265. /// 日期选择器选择回调
  266. /// </summary>
  267. /// <param name="value">选择的日期</param>
  268. /// <param name="type">1:有效时间段;2:播放时段</param>
  269. private void onDateChage(DateRangeChangedEventArgs<DateTime?[]> value, int type)
  270. {
  271. switch (type)
  272. {
  273. case 1:
  274. Model.EffecitiveTime = value.Dates[0];
  275. Model.FailureTime = value.Dates[1];
  276. EffecitiveTime = new DateTime?[]
  277. {
  278. value.Dates[0],value.Dates[1]
  279. };
  280. break;
  281. case 2:
  282. DateTime? startTime = value.Dates[0];
  283. DateTime? endTime = value.Dates[1];
  284. Model.StartTime = startTime?.Hour;
  285. Model.EndTime = endTime?.Hour;
  286. playRange = new DateTime?[]
  287. {
  288. value.Dates[0], value.Dates[1]
  289. };
  290. break;
  291. }
  292. }
  293. private async Task HandleSubmit(EditContext editContext)
  294. {
  295. if(editContext.Validate())
  296. {
  297. await onSure();
  298. }
  299. }
  300. /// <summary>
  301. /// 确定按钮事件
  302. /// </summary>
  303. /// <returns></returns>
  304. private async Task onSure()
  305. {
  306. if (ModelChanged.HasDelegate)
  307. {
  308. await ModelChanged.InvokeAsync(Model);
  309. }
  310. if (onCallback.HasDelegate)
  311. {
  312. await onCallback.InvokeAsync(Model);
  313. }
  314. await OnlyClose();
  315. }
  316. }
  317. <style>
  318. /* 遮罩层:全屏、半透明 */
  319. .modal-overlay {
  320. position: fixed;
  321. top: 0;
  322. left: 0;
  323. width: 100vw;
  324. height: 100vh;
  325. background-color: rgba(0, 0, 0, 0.5); /* 半透明黑色遮罩 */
  326. display: flex;
  327. justify-content: center;
  328. align-items: center;
  329. z-index: 1000;
  330. }
  331. /* 弹窗内容:白色卡片,居中由父容器控制 */
  332. .modal-content {
  333. background: white;
  334. border-radius: 8px;
  335. width: 80%;
  336. box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
  337. /* 注意:不要设 height: 100vh,否则会拉满全屏 */
  338. }
  339. .filter_box {
  340. display: flex;
  341. flex-direction: column;
  342. align-items: center;
  343. background: #ffffff;
  344. padding: 2%;
  345. }
  346. .filter_row {
  347. display: flex;
  348. flex-direction: row;
  349. justify-content: space-between;
  350. align-items: center;
  351. width: 100%;
  352. margin-top: 2%;
  353. }
  354. .filter_row_around {
  355. display: flex;
  356. flex-direction: row;
  357. justify-content: space-around;
  358. align-items: center;
  359. width: 100%;
  360. margin-top: 2%;
  361. }
  362. .filter_colume {
  363. display: flex;
  364. flex-direction: column;
  365. justify-content: center;
  366. align-items: end;
  367. width: 100%;
  368. margin-top: 2%;
  369. }
  370. </style>