@@ -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 IAI Service aI Service { get ; set ; }
public IExam Service Exam Service { 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 ParseRes ult )
if ( _quillHtmlEditor ! = n ull )
{
//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
}
}