feat(practice): complete five-position training operations

This commit is contained in:
2026-07-24 00:26:27 +08:00
parent 067cc30d80
commit faa2a77e9a
15 changed files with 1357 additions and 77 deletions
+86 -1
View File
@@ -30,6 +30,9 @@ export type PracticeScenarioResponse = {
strategy: string;
goal: string;
enabled: boolean;
rounds: PracticeScenarioRound[];
contentVersion: string;
contentHash: string;
rubric?: {
code: string;
name: string;
@@ -38,6 +41,13 @@ export type PracticeScenarioResponse = {
};
};
export type PracticeScenarioRound = {
customer: string;
coachHint: string;
emotion: number;
trust: number;
};
export type PracticeScenarioEnabledRequest = {
enabled: boolean;
};
@@ -60,6 +70,7 @@ export type PracticeScenarioSaveRequest = {
strategy: string;
goal: string;
enabled: boolean;
rounds: PracticeScenarioRound[];
};
export type PracticeRubricDimension = {
@@ -82,6 +93,56 @@ export type PracticeRubricAdmin = {
export type PracticeRubricSaveRequest = Omit<PracticeRubricAdmin, 'scenarioName'>;
export type PracticeQuestion = {
code: string;
scenarioCode: string;
scenarioName: string;
positionCode: string;
type: 'daily' | 'special';
question: string;
referenceAnswer: string;
contentVersion: string;
contentHash: string;
enabled: boolean;
sortOrder: number;
};
export type PracticeQuestionSaveRequest = Omit<PracticeQuestion, 'scenarioName' | 'contentVersion' | 'contentHash'>;
export type ManagedPracticeAssignment = {
id: number;
extPartyId: string;
traineeName: string;
scenarioId: string;
scenarioName: string;
source: string;
reason: string;
status: string;
createTime: string;
dueDate?: string;
contentVersion?: string;
contentHash?: string;
question?: string;
referenceAnswer?: string;
};
export type ManagedPracticeAssignmentBatchRequest = {
requestId: string;
targets: Array<{ extPartyId: string; traineeName?: string }>;
scenarioId: string;
reason: string;
dueDate: string;
};
export type ManagedPracticeAssignmentBatchResponse = {
requestId: string;
total: number;
created: number;
duplicate: number;
failed: number;
results: Array<{ extPartyId: string; traineeName: string; status: string; message: string }>;
};
export type PracticePrepCardResponse = {
keyPoints: string[];
redLines: string[];
@@ -200,7 +261,7 @@ export type PromptTemplateRequest = {
description: string;
};
export function listPracticeScenarios(params?: { position?: string; scenarioType?: string }): Promise<ApiResult<PracticeScenarioResponse[]>> {
export function listPracticeScenarios(params?: { position?: string; scenarioType?: string; includeDisabled?: boolean }): Promise<ApiResult<PracticeScenarioResponse[]>> {
return request({
url: '/api/train/practice/scenarios',
method: 'get',
@@ -208,6 +269,18 @@ export function listPracticeScenarios(params?: { position?: string; scenarioType
});
}
export function listPracticeQuestions(params?: { position?: string; type?: 'daily' | 'special'; includeDisabled?: boolean }): Promise<ApiResult<PracticeQuestion[]>> {
return request({ url: '/api/train/practice/questions', method: 'get', params });
}
export function savePracticeQuestion(data: PracticeQuestionSaveRequest): Promise<ApiResult<PracticeQuestion>> {
return request({ url: '/api/train/practice/questions', method: 'post', data });
}
export function updatePracticeQuestionEnabled(code: string, enabled: boolean): Promise<ApiResult<null>> {
return request({ url: `/api/train/practice/questions/${encodeURIComponent(code)}/enabled`, method: 'patch', data: { enabled } });
}
export function updatePracticeScenarioEnabled(id: string, data: PracticeScenarioEnabledRequest): Promise<ApiResult<null>> {
return request({
url: `/api/train/practice/scenarios/${id}/enabled`,
@@ -240,6 +313,18 @@ export function updatePracticeRubricEnabled(code: string, enabled: boolean): Pro
});
}
export function listManagedPracticeAssignments(params?: { position?: string; status?: string; source?: string; keyword?: string; limit?: number }): Promise<ApiResult<ManagedPracticeAssignment[]>> {
return request({ url: '/api/train/practice/assignments/manage', method: 'get', params });
}
export function createManagedPracticeAssignments(data: ManagedPracticeAssignmentBatchRequest): Promise<ApiResult<ManagedPracticeAssignmentBatchResponse>> {
return request({ url: '/api/train/practice/assignments/manage/batch', method: 'post', data, headers: { repeatSubmit: false } });
}
export function cancelManagedPracticeAssignment(id: number, reason?: string): Promise<ApiResult<null>> {
return request({ url: `/api/train/practice/assignments/manage/${id}/cancel`, method: 'patch', data: { reason }, headers: { repeatSubmit: false } });
}
export function getPracticePrepCard(id: string): Promise<ApiResult<PracticePrepCardResponse>> {
return request({
url: `/api/train/practice/scenarios/${id}/prep-card`,