@using AI.Platform.Page.Pages.Media.Model @using System.Threading.Tasks @using System.Text.Json @using System.Net.Http.Headers @if (IsVisible && Model != null) { } @code { /// /// 信息回调 /// [Parameter] public EventCallback ModelChanged { get; set; } /// /// 打开/关闭窗口回调 /// [Parameter] public EventCallback IsVisibleChanged { get; set; } /// /// 信息回调 /// [Parameter] public EventCallback onCallback { get; set; } /// /// 打开/关闭窗口回调 /// [Parameter] public EventCallback onVisibleCallback { get; set; } /// /// 数据 /// [Parameter] public MediaDialogModel Model { get; set; } /// /// 配置是否弹窗 /// [Parameter] public bool IsVisible { get; set; } /// /// 上传文件 /// private List fileList = new List(); /// /// 用于显示当前有效时间范围 /// private DateTime?[] EffecitiveTime = new DateTime?[2]; /// /// 用于显示当前播放时段 /// private DateTime?[] playRange = new DateTime?[2]; private Dictionary uploadFileHeader = new Dictionary(); [Inject] public HttpClient Http { get; set; } = default!; [Inject] public MessageService Message { get; set; } = default!; private ElementReference inputFileRef; private IBrowserFile? selectedFile; private bool isUploading = false; protected override void OnParametersSet() { fileList.Clear(); selectedFile = null; uploadFileHeader["Authorization"] = Global.GetToken(); EffecitiveTime = new DateTime?[] { Model?.EffecitiveTime, Model?.FailureTime }; int startTimeInt = Math.Max(0, Math.Min(23, Model?.StartTime ?? 0)); int endTimeInt = Math.Max(0, Math.Min(23, Model?.EndTime ?? 0)); DateTime startTime = DateTime.Today.AddHours(startTimeInt); DateTime endTime = DateTime.Today.AddHours(endTimeInt); playRange = new DateTime?[] { startTime,endTime }; } /// /// 关闭弹窗 /// public async Task Close() { await OnlyClose(); if(Model.SavePath.IsNotNullOrEmpty()) File.Delete(Model.SavePath); } /// /// 仅关闭弹窗 /// /// private async Task OnlyClose() { if (IsVisibleChanged.HasDelegate) { await IsVisibleChanged.InvokeAsync(false); } if (onVisibleCallback.HasDelegate) { await onVisibleCallback.InvokeAsync(false); } } private void OnFileSelected(InputFileChangeEventArgs e) { // if (e.Value is not IBrowserFile file) return; var siteinfo = Model.siteInfos.Find(it => it.Id == Model.BusinessUnitID); if (siteinfo != null && e.File.Size > siteinfo.MaxSize) { Message.Error("上传文件超过限制大小"); return; } selectedFile = e.File; Model.FileName = e.File.Name; } private async Task UploadFile() { if (isUploading || selectedFile == null) return; isUploading = true; StateHasChanged(); try { const long maxFileSize = 300 * 1024 * 1024; // 300 MB using var stream = selectedFile.OpenReadStream(maxFileSize); using var content = new MultipartFormDataContent(); content.Add(new StreamContent(stream), "file", selectedFile.Name); content.Add(new StringContent(Model.BusinessUnitID.ToString()), "siteId"); var request = new HttpRequestMessage(HttpMethod.Post, "http://localhost:5076/api/File/UploadMedia") { Content = content }; request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", Global.Token); // 发送请求 var httpResponse = await Http.SendAsync(request); httpResponse.EnsureSuccessStatusCode(); var responseJson = await httpResponse.Content.ReadAsStringAsync(); var response = JsonSerializer.Deserialize>(responseJson); Model.FileName = response?.data.fileName ?? ""; Model.SavePath = response?.data.savePath ?? ""; Model.GuidFileName = response?.data.guidName ?? ""; Model.FileExtension = response?.data.extension ?? ""; // Message.Success("上传成功!"); // selectedFile = null; // 清空 } catch (Exception ex) { Message.Error( $"上传失败: {ex.Message}"); Model.FileName = ""; } finally { isUploading = false; StateHasChanged(); } } /// /// 上传文件完毕 /// /// private void OnUploadCompleted(UploadInfo info) { // _upload.StartUpload() string responseJson = info.File.Response; var response = JsonSerializer.Deserialize>(responseJson); Model.FileName = response?.data.fileName ?? ""; Model.SavePath = response?.data.savePath ?? ""; Model.GuidFileName = response?.data.guidName ?? ""; Model.FileExtension = response?.data.extension ?? ""; } /// /// 文件上传组件——删除事件 /// /// /// private async Task OnRemove(UploadFileItem fileItem) { Console.WriteLine(fileItem); if (Model.SavePath.IsNotNullOrEmpty()) File.Delete(Model.SavePath); return true; } /// /// 单选选择器选择事件 /// /// 1:油机状态;2:站点 /// 选择的值 private void OnSelectItemChange(int type, string value, EditContext editContext) { Console.WriteLine(value); switch (type) { case 1: int state = -1; int.TryParse(value, out state); Model.MediaState = state; editContext.NotifyFieldChanged(FieldIdentifier.Create(() => Model.MediaState)); break; case 2: var siteinfo = Model.siteInfos.Find(it => it.Id.ToString().Equals(value)); if (siteinfo != null) { if(selectedFile != null && selectedFile.Size > siteinfo.MaxSize) { Message.Error("上传文件超过限制大小"); selectedFile = null; Model.FileName = ""; } Model.GroupID = siteinfo.ParentId; Model.BusinessUnitID = siteinfo.Id; editContext.NotifyFieldChanged(FieldIdentifier.Create(() => Model.BusinessUnitID)); } break; } } /// /// 多选选择器选择事件 /// /// 选择的值 private void OnSelectItemsChange(IEnumerable values ,EditContext editContext) { Console.WriteLine(values); if (values.Count() <= 0) { Model.MachineStateList = Model.getAllMachineStateList(); } else { Model.MachineStateList = values.ToList(); } editContext.NotifyFieldChanged(FieldIdentifier.Create(() => Model.MachineStateList)); } /// /// 日期选择器选择回调 /// /// 选择的日期 /// 1:有效时间段;2:播放时段 private void onDateChage(DateRangeChangedEventArgs value, int type) { switch (type) { case 1: Model.EffecitiveTime = value.Dates[0]; Model.FailureTime = value.Dates[1]; EffecitiveTime = new DateTime?[] { value.Dates[0],value.Dates[1] }; break; case 2: DateTime? startTime = value.Dates[0]; DateTime? endTime = value.Dates[1]; Model.StartTime = startTime?.Hour; Model.EndTime = endTime?.Hour; playRange = new DateTime?[] { value.Dates[0], value.Dates[1] }; break; } } private async Task HandleSubmit(EditContext editContext) { if(editContext.Validate()) { if(Model.BusinessUnitID <= 0) { Message.Error("请绑定油站"); return; } await UploadFile(); await onSure(); } } /// /// 确定按钮事件 /// /// private async Task onSure() { if (ModelChanged.HasDelegate) { await ModelChanged.InvokeAsync(Model); } if (onCallback.HasDelegate) { await onCallback.InvokeAsync(Model); } await OnlyClose(); } }