change
This commit is contained in:
@@ -1,172 +1,528 @@
|
||||
using Blazored.TextEditor;
|
||||
using Entities.Contracts;
|
||||
using Entities.DTO;
|
||||
using Microsoft.AspNetCore.Components;
|
||||
using Microsoft.JSInterop;
|
||||
using MudBlazor;
|
||||
using System.Text.RegularExpressions;
|
||||
using TechHelper.Client.AI;
|
||||
using TechHelper.Client.Exam;
|
||||
using TechHelper.Services;
|
||||
using static Org.BouncyCastle.Crypto.Engines.SM2Engine;
|
||||
|
||||
namespace TechHelper.Client.Pages.Editor
|
||||
{
|
||||
public enum ProgEnum
|
||||
public enum ProcessingStage
|
||||
{
|
||||
AIPrase,
|
||||
AIRectify
|
||||
Idle, // <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
|
||||
FetchingContent, // <20><><EFBFBD>ڻ<EFBFBD>ȡ<EFBFBD>༭<EFBFBD><E0BCAD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
DividingExam, // <20><><EFBFBD>ڷָ<DAB7><D6B8><EFBFBD><EFBFBD><EFBFBD> (AI<41><49><EFBFBD><EFBFBD>ԭʼXML)
|
||||
ConvertingDividedXml, // <20><><EFBFBD>ڽ<EFBFBD><DABD>ָ<EFBFBD>XMLת<4C><D7AA>ΪStringsList
|
||||
ParsingGroups, // <20><><EFBFBD>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (AI<41><49><EFBFBD><EFBFBD>ԭʼXML)
|
||||
ConvertingParsedXmls, // <20><><EFBFBD>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>XMLת<4C><D7AA>ΪQuestionGroup<75><70><EFBFBD><EFBFBD>
|
||||
Completed, // <20><><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
ErrorOccurred, // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
Saving
|
||||
}
|
||||
|
||||
public partial class EditorMain
|
||||
{
|
||||
private List<QuestionGroup> QuestionS = new List<QuestionGroup>();
|
||||
|
||||
private bool lode = false;
|
||||
BlazoredTextEditor QuillHtml;
|
||||
string QuillHTMLContent;
|
||||
string AIParseResult;
|
||||
string Error;
|
||||
string ProgStatues = string.Empty;
|
||||
List<string> ParseResult = new List<string>();
|
||||
|
||||
public async Task GetHTML()
|
||||
{
|
||||
QuillHTMLContent = await this.QuillHtml.GetHTML();
|
||||
}
|
||||
|
||||
public async Task GetText()
|
||||
{
|
||||
QuillHTMLContent = await this.QuillHtml.GetText();
|
||||
}
|
||||
|
||||
private string EditorHtmlContent { get; set; } = string.Empty;
|
||||
private List<ParsedQuestion>? ParsedQuestions { get; set; }
|
||||
private bool _parseAttempted = false;
|
||||
|
||||
public class ParsedQuestion
|
||||
{
|
||||
public int Id { get; set; } // <20><>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
public string? Content { get; set; } // <20><>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD> HTML <20><><EFBFBD><EFBFBD>
|
||||
public string? Title { get; set; } // <20><>Ŀ<EFBFBD>ı<EFBFBD><C4B1>ⲿ<EFBFBD>֣<EFBFBD><D6A3><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD><EFBFBD>Դ<EFBFBD> Content <20><><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>
|
||||
}
|
||||
|
||||
[Inject]
|
||||
public IAIService aIService { get; set; }
|
||||
public IExamService ExamService { get; set; } = default!;
|
||||
[Inject]
|
||||
public ISnackbar Snackbar { get; set; }
|
||||
private async void ParseWithAI()
|
||||
public ISnackbar Snackbar { get; set; } = default!;
|
||||
|
||||
// --- UI <20><EFBFBD>״̬<D7B4><CCAC><EFBFBD><EFBFBD> ---
|
||||
private BlazoredTextEditor? _quillHtmlEditor; // <20><><EFBFBD>ı<EFBFBD><C4B1>༭<EFBFBD><E0BCAD>ʵ<EFBFBD><CAB5>
|
||||
private string _editorHtmlContent = string.Empty; // <20>洢<EFBFBD>༭<EFBFBD><E0BCAD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD> HTML/<2F>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD>
|
||||
private bool _isProcessing = false; // <20><><EFBFBD>Ƽ<EFBFBD><C6BC><EFBFBD>״̬<D7B4>ı<EFBFBD>־
|
||||
private string _processingStatusMessage = "<22>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD>..."; // <20><>ʾ<EFBFBD><CABE><EFBFBD>û<EFBFBD><C3BB>ĵ<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD>״̬<D7B4><CCAC>Ϣ
|
||||
|
||||
// --- <20>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD>ݽṹ (<28>洢ÿһ<C3BF><D2BB><EFBFBD>Ľ<EFBFBD><C4BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭʼ<D4AD>ı<EFBFBD>) ---
|
||||
// 1. AI <20>ָ<EFBFBD>ԭʼ<D4AD><CABC>Ӧ (XML <20>ı<EFBFBD>)
|
||||
private string? _rawDividedExamXmlContent;
|
||||
// 2. <20><> _rawDividedExamXmlContent ת<><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD> StringsList
|
||||
private StringsList? _dividedQuestionGroupList;
|
||||
|
||||
// 3. AI <20><><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭʼ<D4AD><CABC>Ӧ (XML <20>ı<EFBFBD><C4B1>б<EFBFBD>)
|
||||
private List<string> _rawParsedQuestionXmls = new();
|
||||
// 4. <20><> _rawParsedQuestionXmls ת<><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD> QuestionGroup <20><><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>
|
||||
private List<QuestionGroup> _finalQuestionGroups = new();
|
||||
|
||||
|
||||
// --- Blazor <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڷ<EFBFBD><DAB7><EFBFBD> ---
|
||||
protected override void OnInitialized()
|
||||
{
|
||||
QuestionS.Clear();
|
||||
ParseResult.Clear();
|
||||
_processingStatusMessage = ProcessingStage.Idle.ToString();
|
||||
}
|
||||
|
||||
await GetText();
|
||||
lode = true;
|
||||
// --- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ---
|
||||
|
||||
// ͳһ<CDB3><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><F3B2A2B8><EFBFBD> UI
|
||||
private void HandleProcessError(string errorMessage, Exception? ex = null)
|
||||
{
|
||||
_processingStatusMessage = $"{ProcessingStage.ErrorOccurred}: {errorMessage}";
|
||||
Snackbar.Add(errorMessage, Severity.Error);
|
||||
_isProcessing = false;
|
||||
StateHasChanged();
|
||||
|
||||
ProgStatues = ProgEnum.AIPrase.ToString();
|
||||
ProgStatues = $"<22><><EFBFBD>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD>ȴ<EFBFBD>";
|
||||
Snackbar.Add("<22><><EFBFBD>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD>ȴ<EFBFBD>", Severity.Info);
|
||||
StateHasChanged();
|
||||
string respon = await aIService.CallGLM(QuillHTMLContent, AIConfiguration.BreakQuestions);
|
||||
if (respon == null)
|
||||
if (ex != null)
|
||||
{
|
||||
lode = false;
|
||||
Snackbar.Add("<22><><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>°<EFBFBD>");
|
||||
return;
|
||||
// <20><>¼<EFBFBD><C2BC><EFBFBD><EFBFBD>ϸ<EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̨<EFBFBD><CCA8><EFBFBD><EFBFBD>־ϵͳ
|
||||
Console.Error.WriteLine($"<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: {ex.Message}\n{ex.StackTrace}\n<>ڲ<EFBFBD><DAB2>쳣: {ex.InnerException?.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
var ParRespon = ExamParser.ParseExamXml<StringsList>(respon);
|
||||
|
||||
|
||||
if (ParRespon != null)
|
||||
{
|
||||
int i = 1;
|
||||
foreach (var item in ParRespon.Items)
|
||||
{
|
||||
ProgStatues = $"<22><><EFBFBD>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD><EFBFBD>{i}<7D><>, <20><><EFBFBD>ȴ<EFBFBD>";
|
||||
Snackbar.Add($"<22><><EFBFBD>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD><EFBFBD>{i}<7D><>, <20><><EFBFBD>ȴ<EFBFBD>", Severity.Info);
|
||||
StateHasChanged();
|
||||
i++;
|
||||
try
|
||||
{
|
||||
var parResult = await aIService.CallGLM(item, AIConfiguration.ParseSignelQuestion2);
|
||||
ParseResult.Add(parResult);
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Snackbar.Add($"<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>{i}<7D><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD>Ժ<EFBFBD><D4BA><EFBFBD><EFBFBD><EFBFBD>. <20><><EFBFBD><EFBFBD>Ϊ:{ex.Message}", Severity.Error);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
AIParseResult = respon;
|
||||
|
||||
ProgStatues = ProgEnum.AIRectify.ToString();
|
||||
Snackbar.Add($"<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>", Severity.Info);
|
||||
//await ReCorrectXMLAsync();
|
||||
|
||||
|
||||
ProgStatues = string.Empty;
|
||||
lode = false;
|
||||
// <20><><EFBFBD>´<EFBFBD><C2B4><EFBFBD>״̬<D7B4><CCAC> UI
|
||||
private void UpdateProcessingStatus(ProcessingStage stage, string message)
|
||||
{
|
||||
_processingStatusMessage = $"{stage}: {message}";
|
||||
Snackbar.Add(message, Severity.Info);
|
||||
StateHasChanged();
|
||||
}
|
||||
|
||||
// --- <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߷<EFBFBD><DFB7><EFBFBD> (<28><><EFBFBD>ֶ<EFBFBD><D6B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڻ<EFBFBD>ȡ<EFBFBD>༭<EFBFBD><E0BCAD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>) ---
|
||||
|
||||
private async Task ReCorrectXMLAsync()
|
||||
// <20><>ȡ<EFBFBD>༭<EFBFBD><E0BCAD> HTML <20><><EFBFBD><EFBFBD>
|
||||
public async Task GetEditorHtmlContentAsync()
|
||||
{
|
||||
string respon = string.Empty;
|
||||
if (_isProcessing) return;
|
||||
_isProcessing = true;
|
||||
UpdateProcessingStatus(ProcessingStage.FetchingContent, "<22><><EFBFBD>ڻ<EFBFBD>ȡ<EFBFBD>༭<EFBFBD><E0BCAD>HTML<4D><4C><EFBFBD><EFBFBD>...");
|
||||
|
||||
try
|
||||
{
|
||||
foreach (var item in ParseResult)
|
||||
if (_quillHtmlEditor != null)
|
||||
{
|
||||
//respon = await aIService.CallGLM(AIParseResult, AIConfiguration.ParseSignelQuestion);
|
||||
var xmlResult = ExamParser.ParseExamXml<QuestionGroup>(item);
|
||||
QuestionS.Add(xmlResult);
|
||||
_editorHtmlContent = await _quillHtmlEditor.GetHTML();
|
||||
UpdateProcessingStatus(ProcessingStage.FetchingContent, "<22>༭<EFBFBD><E0BCAD>HTML<4D><4C><EFBFBD><EFBFBD><EFBFBD>ѳɹ<D1B3><C9B9><EFBFBD>ȡ<EFBFBD><C8A1>");
|
||||
}
|
||||
else
|
||||
{
|
||||
HandleProcessError("<22>༭<EFBFBD><E0BCAD>ʵ<EFBFBD><CAB5>δ<CEB4><D7BC><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><DEB7><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>ݡ<EFBFBD>");
|
||||
}
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Snackbar.Add("<22><><EFBFBD>˵<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>°<EFBFBD>" + ex.Message, Severity.Error);
|
||||
HandleProcessError($"<22><>ȡ<EFBFBD>༭<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: {ex.Message}", ex);
|
||||
}
|
||||
if (string.IsNullOrEmpty(respon))
|
||||
finally
|
||||
{
|
||||
lode = false;
|
||||
Snackbar.Add("<22><><EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>°<EFBFBD>", Severity.Error);
|
||||
|
||||
}
|
||||
|
||||
AIParseResult = respon;
|
||||
}
|
||||
|
||||
private void ParseXML()
|
||||
{
|
||||
try
|
||||
{
|
||||
var paper = ExamParser.ParseExamXml<QuestionGroup>(AIParseResult);
|
||||
//QuestionS = paper.QuestionGroups;
|
||||
Error = string.Empty;
|
||||
}
|
||||
catch (InvalidOperationException ex)
|
||||
{
|
||||
Snackbar.Add("<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" + ex.Message, Severity.Error);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Snackbar.Add("<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>" + ex.Message, Severity.Error);
|
||||
Error = ex.Message;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private void DeleteFromParse(int index)
|
||||
{
|
||||
if (index >= 0 && index < ParseResult.Count)
|
||||
{
|
||||
ParseResult.RemoveAt(index);
|
||||
_isProcessing = false;
|
||||
StateHasChanged();
|
||||
}
|
||||
}
|
||||
|
||||
// <20><>ȡ<EFBFBD>༭<EFBFBD><E0BCAD><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>)
|
||||
public async Task GetEditorTextContentAsync()
|
||||
{
|
||||
if (_isProcessing) return;
|
||||
_isProcessing = true;
|
||||
UpdateProcessingStatus(ProcessingStage.FetchingContent, "<22><><EFBFBD>ڻ<EFBFBD>ȡ<EFBFBD>༭<EFBFBD><E0BCAD><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD>...");
|
||||
|
||||
try
|
||||
{
|
||||
if (_quillHtmlEditor != null)
|
||||
{
|
||||
_editorHtmlContent = await _quillHtmlEditor.GetText();
|
||||
UpdateProcessingStatus(ProcessingStage.FetchingContent, "<22>༭<EFBFBD><E0BCAD><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѳɹ<D1B3><C9B9><EFBFBD>ȡ<EFBFBD><C8A1>");
|
||||
}
|
||||
else
|
||||
{
|
||||
HandleProcessError("<22>༭<EFBFBD><E0BCAD>ʵ<EFBFBD><CAB5>δ<CEB4><D7BC><EFBFBD>ã<EFBFBD><C3A3><EFBFBD><DEB7><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>ݡ<EFBFBD>");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
HandleProcessError($"<22><>ȡ<EFBFBD>༭<EFBFBD><E0BCAD><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: {ex.Message}", ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
_isProcessing = false;
|
||||
StateHasChanged();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// --- <20><><EFBFBD><EFBFBD>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><DFBC><EFBFBD><EFBFBD><EFBFBD> (ÿ<><C3BF><EFBFBD><EFBFBD><EFBFBD>趼<EFBFBD><E8B6BC><EFBFBD>ֶ<EFBFBD><D6B6><EFBFBD><EFBFBD><EFBFBD>) ---
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> 1: <20><><EFBFBD><EFBFBD> AI <20><><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD> (ֻ<><D6BB>ȡԭʼ XML <20>ı<EFBFBD>)
|
||||
public async Task DivideExamContentByAIAsync()
|
||||
{
|
||||
if (_isProcessing) return;
|
||||
_isProcessing = true;
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ˲<DAB4><CBB2><EFBFBD><EFBFBD>Ľ<EFBFBD><C4BD><EFBFBD>
|
||||
_rawDividedExamXmlContent = null;
|
||||
_dividedQuestionGroupList = null;
|
||||
_rawParsedQuestionXmls.Clear();
|
||||
_finalQuestionGroups.Clear();
|
||||
|
||||
UpdateProcessingStatus(ProcessingStage.DividingExam, "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> AI <20>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>飬<EFBFBD><E9A3AC><EFBFBD>ȴ<EFBFBD>...");
|
||||
|
||||
if (string.IsNullOrWhiteSpace(_editorHtmlContent))
|
||||
{
|
||||
HandleProcessError("<22>༭<EFBFBD><E0BCAD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>գ<EFBFBD><D5A3><EFBFBD><EFBFBD>Ȼ<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>ݡ<EFBFBD>");
|
||||
return;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
var response = await ExamService.DividExam(_editorHtmlContent);
|
||||
if (!response.Status)
|
||||
{
|
||||
HandleProcessError(response.Message ?? "AI<41><49><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD>ʧ<EFBFBD>ܡ<EFBFBD>", response.Result as Exception);
|
||||
return;
|
||||
}
|
||||
|
||||
// **<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭʼ<D4AD><CABC> XML <20>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ˲<DAB4><CBB2><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>**
|
||||
_rawDividedExamXmlContent = response.Result as string;
|
||||
|
||||
if (string.IsNullOrWhiteSpace(_rawDividedExamXmlContent))
|
||||
{
|
||||
HandleProcessError("AI <20><><EFBFBD>صķָ<C4B7><D6B8><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD>ա<EFBFBD>");
|
||||
return;
|
||||
}
|
||||
UpdateProcessingStatus(ProcessingStage.DividingExam, response.Message ?? "AI<41><49><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ɹ<EFBFBD><C9B9><EFBFBD>ԭʼXML<4D>ѱ<EFBFBD><D1B1>档");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
HandleProcessError($"<22>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: {ex.Message}", ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
_isProcessing = false;
|
||||
StateHasChanged();
|
||||
}
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> 2: <20><>ԭʼ<D4AD>ָ<EFBFBD> XML <20>ı<EFBFBD>ת<EFBFBD><D7AA>Ϊ StringsList
|
||||
public void ConvertDividedXmlToQuestionList()
|
||||
{
|
||||
if (_isProcessing) return; // <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>UI<55><49><EFBFBD>ð<EFBFBD>ť<EFBFBD><C5A5><EFBFBD>Լ<EFBFBD><D4BC><EFBFBD>
|
||||
_isProcessing = true;
|
||||
_dividedQuestionGroupList = null; // <20><><EFBFBD><EFBFBD><EFBFBD>ϴν<CFB4><CEBD><EFBFBD>
|
||||
_rawParsedQuestionXmls.Clear();
|
||||
_finalQuestionGroups.Clear();
|
||||
|
||||
UpdateProcessingStatus(ProcessingStage.ConvertingDividedXml, "<22><><EFBFBD>ڽ<EFBFBD><DABD>ָ<EFBFBD>XMLת<4C><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>...");
|
||||
|
||||
if (string.IsNullOrWhiteSpace(_rawDividedExamXmlContent))
|
||||
{
|
||||
HandleProcessError("û<><C3BB>ԭʼ<D4AD>ָ<EFBFBD>XML<4D>ı<EFBFBD><C4B1>ɹ<EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4> '<27>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD> (AI)' <20><><EFBFBD>衣");
|
||||
return;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> ExamService <20><>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>
|
||||
var xmlConversionResponse = ExamService.ConvertToXML<StringsList>(_rawDividedExamXmlContent);
|
||||
|
||||
if (!xmlConversionResponse.Status)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭʼXMLת<4C><D7AA>ΪStringsListʧ<74>ܣ<EFBFBD><DCA3><EFBFBD>ԭʼXML<4D><4C>Ȼ<EFBFBD><C8BB><EFBFBD><EFBFBD>
|
||||
HandleProcessError(xmlConversionResponse.Message ?? "AI<41><49><EFBFBD>ص<EFBFBD>XML<4D><EFBFBD>ת<EFBFBD><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD>", xmlConversionResponse.Result as Exception);
|
||||
return;
|
||||
}
|
||||
|
||||
_dividedQuestionGroupList = xmlConversionResponse.Result as StringsList;
|
||||
if (_dividedQuestionGroupList == null || !_dividedQuestionGroupList.Items.Any())
|
||||
{
|
||||
HandleProcessError("AI <20><><EFBFBD>ص<F1B7B5BB>XML<4D><4C>ת<EFBFBD><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>Ϊ<EFBFBD>ա<EFBFBD>");
|
||||
return;
|
||||
}
|
||||
UpdateProcessingStatus(ProcessingStage.ConvertingDividedXml, "<22>ָ<EFBFBD>XML<4D>ѳɹ<D1B3>ת<EFBFBD><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD>");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
HandleProcessError($"ת<><D7AA><EFBFBD>ָ<EFBFBD>XML<4D><4C><EFBFBD>б<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: {ex.Message}", ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
_isProcessing = false;
|
||||
StateHasChanged();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> 3: ѭ<><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> AI <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (ֻ<><D6BB>ȡԭʼ XML <20>ı<EFBFBD>)
|
||||
public async Task ParseEachQuestionGroupAsync()
|
||||
{
|
||||
if (_isProcessing) return;
|
||||
_isProcessing = true;
|
||||
_rawParsedQuestionXmls.Clear(); // <20><><EFBFBD><EFBFBD><EFBFBD>ϴν<CFB4><CEBD><EFBFBD>
|
||||
_finalQuestionGroups.Clear();
|
||||
|
||||
UpdateProcessingStatus(ProcessingStage.ParsingGroups, "<22><><EFBFBD>ڽ<EFBFBD><DABD><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD>飬<EFBFBD><E9A3AC><EFBFBD>ȴ<EFBFBD>...");
|
||||
|
||||
if (_dividedQuestionGroupList == null || !_dividedQuestionGroupList.Items.Any())
|
||||
{
|
||||
HandleProcessError("û<>пɽ<D0BF><C9BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4> 'ת<><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>' <20><><EFBFBD>衣");
|
||||
return;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
int currentGroupIndex = 1;
|
||||
foreach (var itemXml in _dividedQuestionGroupList.Items)
|
||||
{
|
||||
UpdateProcessingStatus(ProcessingStage.ParsingGroups, $"<22><><EFBFBD>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD><EFBFBD> {currentGroupIndex} <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...");
|
||||
|
||||
var parseResponse = await ExamService.ParseSingleQuestionGroup(itemXml);
|
||||
if (!parseResponse.Status)
|
||||
{
|
||||
// <20><>ʹ<EFBFBD><CAB9><EFBFBD><EFBFBD>ʧ<EFBFBD>ܣ<EFBFBD>ԭʼ<D4AD><CABC> _dividedQuestionGroupList <20><>Ȼ<EFBFBD><C8BB><EFBFBD><EFBFBD>
|
||||
HandleProcessError($"<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> {currentGroupIndex} <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>: {parseResponse.Message}", parseResponse.Result as Exception);
|
||||
// <20><><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰʧ<C7B0>ܵ<EFBFBD><DCB5><EFBFBD><EEB2A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1>ֹͣ
|
||||
return;
|
||||
}
|
||||
// **<2A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭʼ<D4AD><CABC> XML <20>ı<EFBFBD><C4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڴ˲<DAB4><CBB2><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>**
|
||||
_rawParsedQuestionXmls.Add(parseResponse.Result as string ?? string.Empty);
|
||||
UpdateProcessingStatus(ProcessingStage.ParsingGroups, $"<22><> {currentGroupIndex} <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD>");
|
||||
currentGroupIndex++;
|
||||
}
|
||||
UpdateProcessingStatus(ProcessingStage.ParsingGroups, "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѳɹ<D1B3><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ԭʼXML<4D>ѱ<EFBFBD><D1B1>档");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
HandleProcessError($"<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: {ex.Message}", ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
_isProcessing = false;
|
||||
StateHasChanged();
|
||||
}
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> 4: <20><>ԭʼ<D4AD><CABC><EFBFBD><EFBFBD> XML <20>ı<EFBFBD>ת<EFBFBD><D7AA>Ϊ QuestionGroup <20><><EFBFBD><EFBFBD>
|
||||
public void ConvertParsedXmlsToQuestionGroups()
|
||||
{
|
||||
if (_isProcessing) return; // <20><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
_isProcessing = true;
|
||||
_finalQuestionGroups.Clear(); // <20><><EFBFBD><EFBFBD><EFBFBD>ϴν<CFB4><CEBD><EFBFBD>
|
||||
|
||||
UpdateProcessingStatus(ProcessingStage.ConvertingParsedXmls, "<22><><EFBFBD>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>XMLת<4C><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>...");
|
||||
|
||||
if (!_rawParsedQuestionXmls.Any())
|
||||
{
|
||||
HandleProcessError("û<>п<EFBFBD>ת<EFBFBD><D7AA><EFBFBD><EFBFBD>ԭʼ<D4AD><CABC><EFBFBD><EFBFBD>XML<4D><4C><EFBFBD>ݡ<EFBFBD><DDA1><EFBFBD><EFBFBD><EFBFBD>ִ<EFBFBD><D6B4> '<27><><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (AI)' <20><><EFBFBD>衣");
|
||||
return;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
foreach (var xmlString in _rawParsedQuestionXmls)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD> ExamService <20><>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>
|
||||
ApiResponse xmlConversionResponse = ExamService.ConvertToXML<QuestionGroup>(xmlString);
|
||||
|
||||
if (!xmlConversionResponse.Status)
|
||||
{
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>ʧ<EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD>ԭʼXML<4D><4C>Ȼ<EFBFBD><C8BB><EFBFBD><EFBFBD>
|
||||
HandleProcessError($"XML ת<><D7AA>Ϊ QuestionGroup ʧ<><CAA7>: {xmlConversionResponse.Message}", xmlConversionResponse.Result as Exception);
|
||||
// <20><><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰʧ<C7B0>ܵ<EFBFBD><DCB5><EFBFBD><EEB2A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѡ<EFBFBD><D1A1>ֹͣ
|
||||
return;
|
||||
}
|
||||
|
||||
QuestionGroup? questionGroup = xmlConversionResponse.Result as QuestionGroup;
|
||||
if (questionGroup != null)
|
||||
{
|
||||
_finalQuestionGroups.Add(questionGroup);
|
||||
}
|
||||
else
|
||||
{
|
||||
// <20><>ʹ Status Ϊ true<75><65>Result Ҳ<><D2B2><EFBFBD>ܲ<EFBFBD><DCB2><EFBFBD>Ԥ<EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>
|
||||
HandleProcessError("XML ת<><D7AA><EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ؽ<EFBFBD><D8BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͳ<EFBFBD>ƥ<EFBFBD><C6A5> QuestionGroup<75><70>");
|
||||
return;
|
||||
}
|
||||
}
|
||||
UpdateProcessingStatus(ProcessingStage.ConvertingParsedXmls, "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>XML<4D>ѳɹ<D1B3>ת<EFBFBD><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
HandleProcessError($"ת<><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>XML<4D><4C><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: {ex.Message}", ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (_finalQuestionGroups.Count > 0)
|
||||
OrderQuestionGroup(_finalQuestionGroups);
|
||||
_isProcessing = false;
|
||||
StateHasChanged();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
private void OrderQuestionGroup(List<QuestionGroup> QG)
|
||||
{
|
||||
int index = 1;
|
||||
QG.ForEach(qg =>
|
||||
{
|
||||
qg.Id = (byte)index++;
|
||||
int sqIndex = 1;
|
||||
qg.SubQuestions.ForEach(sq => sq.SubId = (byte)sqIndex++);
|
||||
|
||||
});
|
||||
|
||||
QG.ForEach(qg => OrderQuestionGroup(qg.SubQuestionGroups));
|
||||
}
|
||||
|
||||
private ExamDto MapToCreateExamDto(List<QuestionGroup> questionGroups)
|
||||
{
|
||||
var createDto = new ExamDto();
|
||||
createDto.QuestionGroups = MapQuestionGroupsToDto(questionGroups);
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҪΪ<D2AA><CEAA><EFBFBD>α<EFBFBD><CEB1><EFBFBD>ָ<EFBFBD><D6B8>һ<EFBFBD><D2BB>AssignmentId<49><64><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
// createDto.AssignmentId = YourCurrentAssignmentId;
|
||||
return createDto;
|
||||
}
|
||||
|
||||
private List<QuestionGroupDto> MapQuestionGroupsToDto(List<QuestionGroup> qgs)
|
||||
{
|
||||
var dtos = new List<QuestionGroupDto>();
|
||||
foreach (var qg in qgs)
|
||||
{
|
||||
var qgDto = new QuestionGroupDto
|
||||
{
|
||||
Title = qg.Title,
|
||||
Score = qg.Score,
|
||||
QuestionReference = qg.QuestionReference,
|
||||
SubQuestions = MapSubQuestionsToDto(qg.SubQuestions),
|
||||
SubQuestionGroups = MapQuestionGroupsToDto(qg.SubQuestionGroups)
|
||||
};
|
||||
dtos.Add(qgDto);
|
||||
}
|
||||
return dtos;
|
||||
}
|
||||
|
||||
private List<SubQuestionDto> MapSubQuestionsToDto(List<SubQuestion> sqs)
|
||||
{
|
||||
var dtos = new List<SubQuestionDto>();
|
||||
foreach (var sq in sqs)
|
||||
{
|
||||
var sqDto = new SubQuestionDto
|
||||
{
|
||||
Index = sq.SubId,
|
||||
Stem = sq.Stem,
|
||||
Score = sq.Score,
|
||||
SampleAnswer = sq.SampleAnswer,
|
||||
Options = sq.Options.Select(o => new OptionDto { Value = o.Value }).ToList(),
|
||||
// TODO: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Щֵ<D0A9>ܴ<EFBFBD>AI<41><49><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD><C4B3>Ĭ<EFBFBD><C4AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>л<EFBFBD>ȡ
|
||||
// <20><><EFBFBD>磺QuestionType = "SingleChoice",
|
||||
// DifficultyLevel = "Medium",
|
||||
// SubjectArea = "Math"
|
||||
};
|
||||
dtos.Add(sqDto);
|
||||
}
|
||||
return dtos;
|
||||
}
|
||||
|
||||
public async Task Save()
|
||||
{
|
||||
if (_isProcessing) return;
|
||||
_isProcessing = true;
|
||||
UpdateProcessingStatus(ProcessingStage.Saving, "<22><><EFBFBD><EFBFBD><EFBFBD><D7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...");
|
||||
|
||||
if (!_finalQuestionGroups.Any())
|
||||
{
|
||||
HandleProcessError("û<>пɱ<D0BF><C9B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݡ<EFBFBD><DDA1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>н<EFBFBD><D0BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>衣");
|
||||
return;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
// ȷ<><C8B7> _finalQuestionGroups <20>Ѿ<EFBFBD><D1BE><EFBFBD><EFBFBD><EFBFBD> Index <20><><EFBFBD><EFBFBD> (<28><><EFBFBD><EFBFBD>֮ǰ<D6AE><C7B0> ConvertParsedXmlsToQuestionGroups ֮<><D6AE><EFBFBD><EFBFBD> Save <20><>ʼʱ<CABC><CAB1><EFBFBD><EFBFBD>)
|
||||
_finalQuestionGroups = _finalQuestionGroups.OrderBy(qg => qg.Id).ToList();
|
||||
|
||||
// ӳ<>䵽 DTO
|
||||
var createExamDto = MapToCreateExamDto(_finalQuestionGroups);
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> ExamService <20><><EFBFBD><EFBFBD> DTO
|
||||
// <20><><EFBFBD><EFBFBD> ExamService <20><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> DTO
|
||||
var response = await ExamService.SaveParsedExam(createExamDto);
|
||||
|
||||
if (!response.Status)
|
||||
{
|
||||
HandleProcessError(response.Message ?? "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E2B5BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD>ܡ<EFBFBD>", response.Result as Exception);
|
||||
return;
|
||||
}
|
||||
|
||||
UpdateProcessingStatus(ProcessingStage.Saving, response.Message ?? "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѳɹ<D1B3><C9B9><EFBFBD><EFBFBD>浽<EFBFBD><E6B5BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>");
|
||||
Snackbar.Add("<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѳɹ<D1B3><C9B9><EFBFBD><EFBFBD>档", Severity.Success);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
HandleProcessError($"<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: {ex.Message}", ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
_isProcessing = false;
|
||||
StateHasChanged();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
// --- ȫ<>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD> ---
|
||||
|
||||
// <20><><EFBFBD><EFBFBD> AI <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (ȫ<>Զ<EFBFBD>)
|
||||
public async Task TriggerFullAIParsingProcessAsync()
|
||||
{
|
||||
if (_isProcessing) return;
|
||||
_isProcessing = true; // <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>״̬
|
||||
// ȫ<><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>н<EFBFBD><D0BD><EFBFBD>
|
||||
_rawDividedExamXmlContent = null;
|
||||
_dividedQuestionGroupList = null;
|
||||
_rawParsedQuestionXmls.Clear();
|
||||
_finalQuestionGroups.Clear();
|
||||
|
||||
UpdateProcessingStatus(ProcessingStage.Idle, "<22><>ʼȫ<CABC>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...");
|
||||
|
||||
try
|
||||
{
|
||||
// 1. <20><>ȡ<EFBFBD>༭<EFBFBD><E0BCAD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
await GetEditorTextContentAsync();
|
||||
if (_processingStatusMessage.Contains(ProcessingStage.ErrorOccurred.ToString())) return;
|
||||
|
||||
// 2. <20><><EFBFBD><EFBFBD> AI <20>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD> (<28><>ȡԭʼ XML)
|
||||
await DivideExamContentByAIAsync();
|
||||
if (_processingStatusMessage.Contains(ProcessingStage.ErrorOccurred.ToString())) return;
|
||||
|
||||
// 3. ת<><D7AA><EFBFBD>ָ<EFBFBD> XML Ϊ StringsList
|
||||
ConvertDividedXmlToQuestionList(); // ע<><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
if (_processingStatusMessage.Contains(ProcessingStage.ErrorOccurred.ToString())) return;
|
||||
|
||||
// 4. ѭ<><D1AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (<28><>ȡԭʼ XML)
|
||||
await ParseEachQuestionGroupAsync();
|
||||
if (_processingStatusMessage.Contains(ProcessingStage.ErrorOccurred.ToString())) return;
|
||||
|
||||
// 5. ת<><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD> XML Ϊ QuestionGroup <20><><EFBFBD><EFBFBD>
|
||||
ConvertParsedXmlsToQuestionGroups(); // ע<><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
if (_processingStatusMessage.Contains(ProcessingStage.ErrorOccurred.ToString())) return;
|
||||
|
||||
UpdateProcessingStatus(ProcessingStage.Completed, "ȫ<>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD>ɣ<EFBFBD>");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
HandleProcessError($"ȫ<>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>з<EFBFBD><D0B7><EFBFBD>δԤ<CEB4>ڴ<EFBFBD><DAB4><EFBFBD>: {ex.Message}", ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
_isProcessing = false; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>״̬
|
||||
StateHasChanged();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
private void DeleteFromParse(int index)
|
||||
{
|
||||
if (index >= 0 && index < _finalQuestionGroups.Count)
|
||||
{
|
||||
_finalQuestionGroups.RemoveAt(index);
|
||||
StateHasChanged();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#region JS
|
||||
[Inject]
|
||||
public IJSRuntime JSRuntime { get; set; }
|
||||
|
||||
@@ -199,60 +555,7 @@ namespace TechHelper.Client.Pages.Editor
|
||||
Console.WriteLine($"<22><><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
private void ParseQuestions()
|
||||
{
|
||||
ParsedQuestions = new List<ParsedQuestion>();
|
||||
_parseAttempted = true;
|
||||
|
||||
if (string.IsNullOrWhiteSpace(QuillHTMLContent))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF>ʼ<EFBFBD>ͽ<EFBFBD><CDBD><EFBFBD><EFBFBD>ı<EFBFBD><C4B1><EFBFBD>
|
||||
string startTag = "[<5B><>Ŀ<EFBFBD><C4BF>ʼ]";
|
||||
string endTag = "[<5B><>Ŀ<EFBFBD><C4BF><EFBFBD><EFBFBD>]";
|
||||
|
||||
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD><CABD>ƥ<EFBFBD><C6A5><EFBFBD>ӿ<EFBFBD>ʼ<EFBFBD><CABC><EFBFBD>ǵ<EFBFBD><C7B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><D6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݣ<EFBFBD><DDA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>У<EFBFBD>
|
||||
// (?s) <20><><EFBFBD>õ<EFBFBD><C3B5><EFBFBD>ģʽ<C4A3><CABD><EFBFBD><EFBFBD> . ƥ<>任<EFBFBD>з<EFBFBD>
|
||||
string pattern = Regex.Escape(startTag) + "(.*?)" + Regex.Escape(endTag);
|
||||
var matches = Regex.Matches(QuillHTMLContent, pattern, RegexOptions.Singleline);
|
||||
|
||||
int questionId = 1;
|
||||
foreach (Match match in matches)
|
||||
{
|
||||
// <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><D6AE><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD><EFBFBD>
|
||||
string rawQuestionHtml = match.Groups[1].Value;
|
||||
|
||||
// <20>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD>ܲ<EFBFBD><DCB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>еı<D0B5><C4B1>ǣ<EFBFBD><C7A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʽ<EFBFBD>Ѿ<EFBFBD><D1BE>ų<EFBFBD><C5B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ǣ<EFBFBD><C7A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||
string cleanedQuestionContent = rawQuestionHtml
|
||||
.Replace(startTag, "")
|
||||
.Replace(endTag, "")
|
||||
.Trim();
|
||||
|
||||
// <20><><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>⣨<EFBFBD><E2A3A8><EFBFBD>磬ƥ<E7A3AC>䡰һ<E4A1B0><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD>У<EFBFBD>
|
||||
string? questionTitle = null;
|
||||
try
|
||||
{
|
||||
|
||||
var firstLineMatch = Regex.Match(cleanedQuestionContent, @"^(<p>)?\s*([һ<><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߰˾<DFB0>ʮ]+\s*[<5B><><EFBFBD><EFBFBD>]|\d+\s*[<5B><>\.]).*?</p>", RegexOptions.IgnoreCase | RegexOptions.Singleline);
|
||||
if (firstLineMatch.Success)
|
||||
{
|
||||
// <20><> HTML <20><><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD>ı<EFBFBD><C4B1><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
|
||||
questionTitle = Regex.Replace(firstLineMatch.Value, "<[^>]*>", "").Trim();
|
||||
}
|
||||
}
|
||||
catch (Exception ex) { }
|
||||
|
||||
ParsedQuestions.Add(new ParsedQuestion
|
||||
{
|
||||
Id = questionId++,
|
||||
Content = cleanedQuestionContent,
|
||||
Title = questionTitle
|
||||
});
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user