using CloudBuilder.AI.Data; using CloudBuilder.AI.Entity; using CloudBuilder.AI.Gui.Request; using CloudBuilder.AI.Linkup; using CloudBuilder.AI.Policy; using CloudBuilder.AI.SearchCriteria; using CloudBuilder.Core.Request; using CloudBuilder.Core.Service; using CloudBuilder.Gui; using CloudBuilder.Request.AI; using CloudBuilder.Request.Security; using CloudBuilder.Security.Data; using CloudBuilder.Security.Entity; using CloudBuilder.Security.Linkup; using CloudBuilder.Security.Policy; using DocumentFormat.OpenXml.Wordprocessing; using Krypton.Toolkit; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using NAudio.Wave; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Drawing; using System.Linq; using System.Security.Permissions; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using static System.Windows.Forms.VisualStyles.VisualStyleElement.Window; namespace CloudBuilder.AI.Gui { public partial class AiBookOperationPage : AbstractPage { private SecurityMessagePolicy securityMessagePolicy = null!; private BookStatusPolicy bookStatusPolicy = null!; private AiBookRequest aiBookRequest = null!; private AiSentenceRequest aiSentenceRequest = null!; private AiChapterRequest aiChapterRequest = null!; private AiBookEntity aiBookEntity = null!; private AiBookData data = null!; private DmsFileRequestHelper dmsFileRequestHelper; private DmsFileRequest dmsFileRequest; private AiChapterSearchCriteria searchCriteria; public AiBookOperationPage() { InitializeComponent(); } /// /// 第一次加载时执行,只执行一次 /// public override void FunctionLoaded() { try { base.FunctionLoaded(); //初始化容器------------------------------------- aiBookRequest = ServiceHelper.GetTypeService(); aiChapterRequest = ServiceHelper.GetTypeService(); aiSentenceRequest = ServiceHelper.GetTypeService(); bookStatusPolicy = ServiceHelper.GetTypeService(); securityMessagePolicy = ServiceHelper.GetTypeService(); dmsFileRequest = ServiceHelper.GetTypeService(); dmsFileRequestHelper = new DmsFileRequestHelper(); //界面初始化 InitGui(); } catch (ValidatedException ex) { ShowMessageBox.ShowInfo(ex.Message); } catch (ServiceErrorException ex) { ShowMessageBox.ShowError(ex.Message); } catch (Exception ex) { ShowMessageBox.ShowError(ex.Message); } } private void InitGui() { InitBindingContext(); InitComBox(); InitDisplayMode(); InitGridViewPagination(); this.ParentAbstractForm.AcceptButton = this.searchBut; this.ParentAbstractForm.CancelButton = this.resetBut; } private void InitComBox() { statusCombo.SetDataSource(bookStatusPolicy.GetDataSource(), true); bookPersonGv.SetColumnDataSource(bookActorNameCol, SoVITSTtsVoicePolicy.GetInstance().GetComposeMessages(), true); } /// /// DataGridView分页控件初始化 /// private void InitGridViewPagination() { searchCriteria = new AiChapterSearchCriteria(); gridViewPagination.SetLimit(searchCriteria.limit); gridViewPagination.OnPaginationChanged += SearchChapter; } /// /// 有特殊要求的UI控件初始化设置,Init与Add配对后,使用guiOperateHelper管理 /// private void InitBindingContext() { //需要绑定数据 guiBindingContext = new GuiBindingContext(); InitPermission(); guidTxt.Set(AiBookEntity.BOOK_ID, guidLabel.Text, EnumEditModeColor.ReadOnly); descriptionTxt.Set(AiBookEntity.DESCRIPTION); statusCombo.Set(AiBookEntity.STATUS, EnumEditModeColor.ReadOnly); titleTxt.Set(AiBookEntity.TITLE, titleLabel.Text, EnumEditModeColor.Required); authorTxt.Set(AiBookEntity.AUTHOR); bookTypeTxt.Set(AiBookEntity.BOOK_TYPE); filePathTxt.Set(AiBookData.FILE_NAME, EnumEditModeColor.ReadOnly); bookPersonNameCol.Set(EnumEditModeColor.ReadOnly); dataGv.InitColumn(false, false); sentenceGv.InitColumn(true, false); bookPersonGv.InitColumn(true, false); guiOperateHelper = new GuiOperateHelper(); } private void InitPermission() { createBut.Set(AIPermissionPolicy.AiBook, Operate.Insert); amendBut.Set(AIPermissionPolicy.AiBook, Operate.Update); deleteBut.Set(AIPermissionPolicy.AiBook, Operate.Delete); } /// /// 每次从别的界面进入时执行,发生在FunctionLoaded之后 /// /// public override void FunctionActivated(object param) { try { if (param == null) { guidSearchTxt.Focus(); return; } InitDisplayMode(); AiBookOperationLinkup linkup = null; if (param is AiBookOperationLinkup) { linkup = (AiBookOperationLinkup)param; } this.DisplayMode = (GuiDisplayMode)linkup.DisplayMode; guidSearchTxt.Text = linkup.Guid; if (this.DisplayMode == GuiDisplayMode.View) { Search(); } else if (this.DisplayMode == GuiDisplayMode.Create) { Create(); } else if (this.DisplayMode == GuiDisplayMode.Amend) { Search(); Amend(); } guidSearchTxt.Focus(); } catch (ValidatedException ex) { ShowMessageBox.ShowInfo(ex.Message); } catch (ServiceErrorException ex) { ShowMessageBox.ShowError(ex.Message); } catch (Exception ex) { ShowMessageBox.ShowError(ex.Message); } } public override void FunctionSelected() { this.ParentAbstractForm.AcceptButton = this.searchBut; if (!IsDialog) this.ParentAbstractForm.CancelButton = this.resetBut; else this.ParentAbstractForm.CancelButton = this.cancelBut; guidSearchTxt.Focus(); } public override bool FunctionDeactivating() { if (this.DisplayMode == GuiDisplayMode.View) { return true; } else { return CancelEditing(); } } private bool CancelEditing() { DialogResult result = ShowMessageBox.ShowOption(securityMessagePolicy.ComposeMessage(SecurityMessagePolicy.GUI_CONFIRM_CANCEL), securityMessagePolicy.ComposeMessage(SecurityMessagePolicy.GUI_CONFIRM)); //从外部跳转(非mainKryptonNavigator),result第一次不生效?,所以再执行一次生效 if (result == DialogResult.Cancel) { result = ShowMessageBox.ShowOption(securityMessagePolicy.ComposeMessage(SecurityMessagePolicy.GUI_CONFIRM_CANCEL), securityMessagePolicy.ComposeMessage(SecurityMessagePolicy.GUI_CONFIRM)); } if (result == DialogResult.No) { return false; } Cancel(); return true; } private void InitDisplayMode() { this.DisplayMode = GuiDisplayMode.View; SetDisplayMode(); } private void SetDisplayMode() { if (this.DisplayMode == GuiDisplayMode.View) { savePanel.Visible = false; operationPanel.Visible = true; guiOperateHelper.EnableControls(true, topPanel); guiOperateHelper.EnableControls(false, contentPanel); //查詢有記錄時,修改等控件有效 if (aiBookEntity != null) guiOperateHelper.EnableControls(true, bottomPanel, processPanel, gridViewPagination); else guiOperateHelper.EnableControls(false, bottomPanel, processPanel, gridViewPagination); } else if (this.DisplayMode == GuiDisplayMode.Amend || this.DisplayMode == GuiDisplayMode.Create) { savePanel.Visible = true; operationPanel.Visible = false; guiOperateHelper.EnableControls(true, bottomPanel, contentPanel); guiOperateHelper.EnableControls(false, topPanel, processPanel, gridViewPagination); if (this.DisplayMode == GuiDisplayMode.Amend) guiOperateHelper.EnableControls(false, guidTxt); } } private void PackUIToEntity() { guiBindingContext.DataPack(); data.AiBookPersons = bookPersonGv.GetUpdateRows(); } private bool SaveValidate() { if (!guiOperateHelper.CheckValidate(this.contentPanel)) return false; return true; } private void Search() { try { if (string.IsNullOrEmpty(guidSearchTxt.Text)) return; Reset(); data = aiBookRequest.FindByKey(guidSearchTxt.Text); if (data == null || data.AiBook == null) { ShowMessageBox.ShowInfo(securityMessagePolicy.ComposeMessage(SecurityMessagePolicy.GUI_WS_RECORD_NOT_FOUND)); } else { aiBookEntity = data.AiBook; PackEntityToUI(); SetDisplayMode(); } } catch (ValidatedException ex) { ShowMessageBox.ShowInfo(ex.Message); } catch (ServiceErrorException ex) { ShowMessageBox.ShowError(ex.Message); } catch (Exception ex) { ShowMessageBox.ShowError(ex.Message); } } /// /// 与Web同步写法 /// /// private AiChapterSearchCriteria PackSearchCriteria() { searchCriteria = new AiChapterSearchCriteria(); searchCriteria.limit = gridViewPagination.Limit; searchCriteria.page = gridViewPagination.CurrentPage; searchCriteria.orderby = AiChapterEntity.CHAPTER_ID; List filters = new List(); SearchFilter filter = new SearchFilter(); filter.Column = AiChapterEntity.DB_BOOK_ID; filter.Type = SearchFilterTypePolicy.TEXT; filter.Operator = SearchFilterOperatorPolicy.EQUAL_TO; filter.Value = data.AiBook.BookId; filters.Add(filter); searchCriteria.Filter = filters.ToArray(); return searchCriteria; } private void SearchChapter() { try { var chapterResultData = aiChapterRequest.FindBySearchCriteria(PackSearchCriteria()); gridViewPagination.SetTotal(chapterResultData.Total); dataGv.SetDataSource(chapterResultData.Datas); } catch (ValidatedException ex) { ShowMessageBox.ShowInfo(ex.Message); } catch (ServiceErrorException ex) { ShowMessageBox.ShowError(ex.Message); } catch (Exception ex) { ShowMessageBox.ShowError(ex.Message); } } private void Create() { this.DisplayMode = GuiDisplayMode.Create; guiOperateHelper.ResetControls(this.mainPanel); SetDisplayMode(); data = new AiBookData(); aiBookEntity = new AiBookEntity() { Status = BookStatusPolicy.DRAFT, CreatedBy = string.Empty, UpdatedBy = string.Empty, CreatedDatetime = DateTime.Now, UpdatedDatetime = DateTime.Now, }; data.AiBook = aiBookEntity; PackEntityToUI(); guidTxt.Focus(); } private void Amend() { this.DisplayMode = GuiDisplayMode.Amend; SetDisplayMode(); } private void PackEntityToUI() { guiBindingContext.DataBind(data.AiBook, this); bookPersonGv.SetDataSource(data.AiBookPersons); filePathTxt.Text = data.FileName; SearchChapter(); } private void Reset() { this.DisplayMode = GuiDisplayMode.View; aiBookEntity = null; guiOperateHelper.ResetControls(this.contentPanel); SetDisplayMode(); guidSearchTxt.Focus(); } public void Cancel() { if (!string.IsNullOrEmpty(guidSearchTxt.Text)) Search(); else Reset(); } private void permissionNameSearchBut_Click(object sender, EventArgs e) { //try //{ // AbstractForm dialog = GetAbstractDialog(typeof(AiBookEnquiryPage).Name); // if (DialogResult.OK != dialog.ShowDialog()) return; // permissionNameSearchTxt.Text = ((AiBookEntity[])dialog.OutputData)[0].PermissionName; // Search(); //} //catch (ValidatedException ex) //{ // ShowMessageBox.ShowInfo(ex.Message); //} //catch (ServiceErrorException ex) //{ // ShowMessageBox.ShowError(ex.Message); //} //catch (Exception ex) //{ // ShowMessageBox.ShowError(ex.Message); //} } private void searchBut_Click(object sender, EventArgs e) { try { if (string.IsNullOrEmpty(guidSearchTxt.Text)) { ShowMessageBox.ShowInfo(securityMessagePolicy.ComposeMessage(SecurityMessagePolicy.GUI_VALID_INPUT, GuiOperateHelper.GetLabelText(guidSearchLabel.Text))); this.guidSearchTxt.Focus(); return; } this.DisplayMode = GuiDisplayMode.View; Search(); } catch (ValidatedException ex) { ShowMessageBox.ShowInfo(ex.Message); } catch (ServiceErrorException ex) { ShowMessageBox.ShowError(ex.Message); } catch (Exception ex) { ShowMessageBox.ShowError(ex.Message); } } private void resetBut_Click(object sender, EventArgs e) { try { guiOperateHelper.ResetControls(this.topPanel); Reset(); } catch (ValidatedException ex) { ShowMessageBox.ShowInfo(ex.Message); } catch (ServiceErrorException ex) { ShowMessageBox.ShowError(ex.Message); } catch (Exception ex) { ShowMessageBox.ShowError(ex.Message); } } private void createBut_Click(object sender, EventArgs e) { try { Create(); } catch (ValidatedException ex) { ShowMessageBox.ShowInfo(ex.Message); } catch (ServiceErrorException ex) { ShowMessageBox.ShowError(ex.Message); } catch (Exception ex) { ShowMessageBox.ShowError(ex.Message); } } private void amendBut_Click(object sender, EventArgs e) { try { Amend(); } catch (ValidatedException ex) { ShowMessageBox.ShowInfo(ex.Message); } catch (ServiceErrorException ex) { ShowMessageBox.ShowError(ex.Message); } catch (Exception ex) { ShowMessageBox.ShowError(ex.Message); } } private void deleteBut_Click(object sender, EventArgs e) { try { if (aiBookEntity == null) { ShowMessageBox.ShowInfo(securityMessagePolicy.ComposeMessage(SecurityMessagePolicy.GUI_WS_RECORD_NOT_FOUND)); return; } if (DialogResult.Yes != ShowMessageBox.ShowOption(securityMessagePolicy.ComposeMessage(SecurityMessagePolicy.GUI_CONFIRM_DEL_NULL), securityMessagePolicy.ComposeMessage(SecurityMessagePolicy.GUI_DELETE))) return; aiBookRequest.Delete(aiBookEntity.BookId); ShowMessageBox.ShowInfo(securityMessagePolicy.ComposeMessage(SecurityMessagePolicy.GUI_SUCCEED_DELETED_NULL)); Reset(); } catch (ValidatedException ex) { ShowMessageBox.ShowInfo(ex.Message); } catch (ServiceErrorException ex) { ShowMessageBox.ShowError(ex.Message); } catch (Exception ex) { ShowMessageBox.ShowError(ex.Message); } } private void saveBut_Click(object sender, EventArgs e) { try { if (!SaveValidate()) return; PackUIToEntity(); if (this.DisplayMode == GuiDisplayMode.Create) { data = aiBookRequest.Insert(data); aiBookEntity.BookId = data.AiBook.BookId; } else aiBookRequest.Update(data); ShowMessageBox.ShowInfo((this.DisplayMode == GuiDisplayMode.Create) ? securityMessagePolicy.ComposeMessage(SecurityMessagePolicy.GUI_SUCCEED_CREATED_NULL) : securityMessagePolicy.ComposeMessage(SecurityMessagePolicy.GUI_SUCCEED_UPDATED_NULL)); guidSearchTxt.Text = aiBookEntity.BookId; Search(); } catch (ValidatedException ex) { ShowMessageBox.ShowInfo(ex.Message); } catch (ServiceErrorException ex) { ShowMessageBox.ShowError(ex.Message); } catch (Exception ex) { ShowMessageBox.ShowError(ex.Message); } } private void cancelBut_Click(object sender, EventArgs e) { try { CancelEditing(); } catch (ValidatedException ex) { ShowMessageBox.ShowInfo(ex.Message); } catch (ServiceErrorException ex) { ShowMessageBox.ShowError(ex.Message); } catch (Exception ex) { ShowMessageBox.ShowError(ex.Message); } } private void addBut_Click(object sender, EventArgs e) { //dataGv.AddRow(new AiBookDependentEntity() { CreatedBy = string.Empty, UpdatedBy = string.Empty }); } private void delBut_Click(object sender, EventArgs e) { if (dataGv.RowCount <= 0 || dataGv.SelectedCells.Count <= 0) { ShowMessageBox.ShowInfo(securityMessagePolicy.ComposeMessage(SecurityMessagePolicy.GUI_WS_RECORD_NOT_FOUND)); return; } dataGv.DeleteRows(dataGv.SelectedCells); } private void uploadBut_Click(object sender, EventArgs e) { try { OpenFileDialog openFileDialog = new OpenFileDialog(); openFileDialog.Multiselect = false; if (openFileDialog.ShowDialog() != DialogResult.OK) return; string[] fileNames = openFileDialog.FileNames; string folderName = dmsFileRequest.GetFolderName(typeof(AiBookEntity).Name); BookDmsFileViewEntity dmsFile = dmsFileRequestHelper.UploadFile(fileNames[0], folderName); if (dmsFile == null || dmsFile.FileId == 0) return; data.AiBook.FileId = dmsFile.FileId; aiBookRequest.Update(data); ShowMessageBox.ShowInfo(securityMessagePolicy.ComposeMessage(SecurityMessagePolicy.GUI_SUCCEED_UPDATED_NULL)); guidSearchTxt.Text = aiBookEntity.BookId; Search(); } catch (ValidatedException ex) { ShowMessageBox.ShowInfo(ex.Message); } catch (ServiceErrorException ex) { ShowMessageBox.ShowError(ex.Message); } catch (Exception ex) { ShowMessageBox.ShowError(ex.Message); } } private void processBut_Click(object sender, EventArgs e) { try { AbstractForm dialog; dialog = GetAbstractDialog(typeof(AiBookProcessDialogPage).Name); if (DialogResult.OK != dialog.ShowCreateDialog()) return; AiBookProcessData d = (AiBookProcessData)dialog.OutputData; data = aiBookRequest.ProcessBook(data.AiBook.BookId, d.Encoding, d.Pattern); ShowMessageBox.ShowInfo(securityMessagePolicy.ComposeMessage(SecurityMessagePolicy.GUI_SUCCEED_UPDATED_NULL)); guidSearchTxt.Text = data.AiBook.BookId; Search(); } catch (ValidatedException ex) { ShowMessageBox.ShowInfo(ex.Message); } catch (ServiceErrorException ex) { ShowMessageBox.ShowError(ex.Message); } catch (Exception ex) { ShowMessageBox.ShowError(ex.Message); } } private void dataGv_CellClick(object sender, DataGridViewCellEventArgs e) { try { if (e.RowIndex == -1 || e.ColumnIndex == -1) return; if (dataGv.RowCount <= 0 || dataGv.SelectedCells.Count <= 0) { ShowMessageBox.ShowInfo(securityMessagePolicy.ComposeMessage(SecurityMessagePolicy.GUI_WS_RECORD_NOT_FOUND)); return; } AiChapterEntity chapter = dataGv.GetRowData(dataGv.SelectedCells[0].RowIndex); AiSentenceViewEntity[] aiSentences = aiSentenceRequest.FindByChapterId(chapter.BookId, chapter.ChapterId); sentenceGv.SetDataSource(aiSentences); } catch (ValidatedException ex) { ShowMessageBox.ShowInfo(ex.Message); } catch (ServiceErrorException ex) { ShowMessageBox.ShowError(ex.Message); } catch (Exception ex) { ShowMessageBox.ShowError(ex.Message); } } private void extractNamesBut_Click(object sender, EventArgs e) { try { if (dataGv.RowCount <= 0 || dataGv.SelectedCells.Count <= 0) { ShowMessageBox.ShowInfo(securityMessagePolicy.ComposeMessage(SecurityMessagePolicy.GUI_WS_RECORD_NOT_FOUND)); return; } AiChapterEntity[] chapters = dataGv.GetSelectedRowsData(); if (chapters != null) aiBookRequest.PackPersonName(chapters); else aiBookRequest.PackPersonNameByBookId(data.AiBook.BookId); ShowMessageBox.ShowInfo(securityMessagePolicy.ComposeMessage(SecurityMessagePolicy.GUI_SUCCEED_UPDATED_NULL)); guidSearchTxt.Text = data.AiBook.BookId; Search(); } catch (ValidatedException ex) { ShowMessageBox.ShowInfo(ex.Message); } catch (ServiceErrorException ex) { ShowMessageBox.ShowError(ex.Message); } catch (Exception ex) { ShowMessageBox.ShowError(ex.Message); } } private void sentenceGv_CellDoubleClick(object sender, DataGridViewCellEventArgs e) { try { if (sentenceGv.RowCount <= 0 || sentenceGv.SelectedCells.Count <= 0) { ShowMessageBox.ShowInfo(securityMessagePolicy.ComposeMessage(SecurityMessagePolicy.GUI_WS_RECORD_NOT_FOUND)); return; } AiSentenceViewEntity sentence = sentenceGv.GetRowData(sentenceGv.SelectedCells[0].RowIndex); using (Stream audioStream = ServiceHelper.GetService()!.PostStreamAsync("/AiBook/GetMp3Stream", null, sentence).GetAwaiter().GetResult()) { PlayMp3Stream(audioStream); } } catch (ValidatedException ex) { ShowMessageBox.ShowInfo(ex.Message); } catch (ServiceErrorException ex) { ShowMessageBox.ShowError(ex.Message); } catch (Exception ex) { ShowMessageBox.ShowError(ex.Message); } } public void PlayMp3Stream(Stream audioStream) { string tempFile = Path.Combine(Path.GetTempPath(), "temp_audio.mp3"); // 保存流到临时文件 using (var fs = new FileStream(tempFile, FileMode.Create)) { audioStream.Position = 0; audioStream.CopyTo(fs); } // 直接调用你已经能播放的方法!!! //PlayAudioFile(tempFile); Task.Run(() => { try { PlayAudioFile(tempFile); // 后台播放 } finally { File.Delete(tempFile); // 播完删除 } }); } public static void PlayAudioFile(string filePath) { // 必用这种写法,绝对不会提前释放 var reader = new AudioFileReader(filePath); var waveOut = new WaveOutEvent(); waveOut.Init(reader); waveOut.Play(); // 同步等待播放完成(这是最稳、最不会出错的) while (waveOut.PlaybackState == NAudio.Wave.PlaybackState.Playing) { System.Threading.Thread.Sleep(100); } // 播放完再释放 waveOut.Dispose(); reader.Dispose(); } public void DownloadFile(int fileId, string saveFilePath) { try { ServiceHelper.GetService()!.DownloadFile("/DmsFile/DownloadFile?fileId=" + fileId, saveFilePath, null, OpenFile); } catch (ValidatedException ex) { ShowMessageBox.ShowInfo(ex.Message); } catch (ServiceErrorException ex) { ShowMessageBox.ShowError(ex.Message); } catch (Exception ex) { ShowMessageBox.ShowError(ex.Message); } } private void OpenFile(string fileFullName) { Process.Start(new ProcessStartInfo { FileName = fileFullName, UseShellExecute = true // 使用Windows Shell执行 }); } private void generaterMp3But_Click(object sender, EventArgs e) { try { if (dataGv.RowCount <= 0 || dataGv.SelectedCells.Count <= 0) { ShowMessageBox.ShowInfo(securityMessagePolicy.ComposeMessage(SecurityMessagePolicy.GUI_WS_RECORD_NOT_FOUND)); return; } AiChapterEntity[] chapters = dataGv.GetSelectedRowsData(); if (chapters != null) aiBookRequest.GenerateMp3(chapters); else aiBookRequest.GenerateMp3ByBookId(data.AiBook.BookId); ShowMessageBox.ShowInfo(securityMessagePolicy.ComposeMessage(SecurityMessagePolicy.GUI_SUCCEED_UPDATED_NULL)); guidSearchTxt.Text = data.AiBook.BookId; Search(); } catch (ValidatedException ex) { ShowMessageBox.ShowInfo(ex.Message); } catch (ServiceErrorException ex) { ShowMessageBox.ShowError(ex.Message); } catch (Exception ex) { ShowMessageBox.ShowError(ex.Message); } } } }