585 lines
15 KiB
TypeScript
585 lines
15 KiB
TypeScript
import request from '@/utils/request';
|
|
|
|
type ApiResult<T> = {
|
|
code: number;
|
|
msg: string;
|
|
data: T;
|
|
};
|
|
|
|
export type PracticeStartRequest = {
|
|
extPartyId: string;
|
|
scenarioId: string;
|
|
mode: string;
|
|
};
|
|
|
|
export type PracticeScenarioResponse = {
|
|
id: string;
|
|
name: string;
|
|
position: string;
|
|
scenarioType: string;
|
|
projectType: string;
|
|
growthLevel: string;
|
|
competencyCode: string;
|
|
collaborationPositions: string;
|
|
reviewStatus: string;
|
|
riskLevel: '待评估' | '常规' | '高风险';
|
|
requiresDualReview: boolean;
|
|
curriculumVersion: string;
|
|
reviewer?: string;
|
|
reviewedTime?: string;
|
|
secondReviewer?: string;
|
|
secondReviewedTime?: string;
|
|
difficulty: number;
|
|
customerPersona: string;
|
|
openingText: string;
|
|
explicitNeed: string;
|
|
hiddenNeed: string;
|
|
irritants: string;
|
|
delights: string;
|
|
sopRefs: string;
|
|
successCriteria: string;
|
|
strategy: string;
|
|
goal: string;
|
|
enabled: boolean;
|
|
rounds: PracticeScenarioRound[];
|
|
contentVersion: string;
|
|
contentHash: string;
|
|
rubric?: {
|
|
code: string;
|
|
name: string;
|
|
version: string;
|
|
dimensions: Array<{ code: string; name: string; weight: number; description: string }>;
|
|
};
|
|
};
|
|
|
|
export type PracticeScenarioRound = {
|
|
customer: string;
|
|
coachHint: string;
|
|
emotion: number;
|
|
trust: number;
|
|
};
|
|
|
|
export type PracticeScenarioEnabledRequest = {
|
|
enabled: boolean;
|
|
};
|
|
|
|
export type PracticeScenarioSaveRequest = {
|
|
id?: string;
|
|
name: string;
|
|
position: string;
|
|
scenarioType: string;
|
|
projectType: string;
|
|
growthLevel: string;
|
|
competencyCode: string;
|
|
collaborationPositions: string;
|
|
riskLevel: '待评估' | '常规' | '高风险';
|
|
curriculumVersion: string;
|
|
difficulty: number;
|
|
customerPersona: string;
|
|
openingText: string;
|
|
explicitNeed: string;
|
|
hiddenNeed: string;
|
|
irritants: string;
|
|
delights: string;
|
|
sopRefs: string;
|
|
successCriteria: string;
|
|
strategy: string;
|
|
goal: string;
|
|
enabled: boolean;
|
|
rounds: PracticeScenarioRound[];
|
|
expectedContentVersion?: string;
|
|
expectedContentHash?: string;
|
|
};
|
|
|
|
export type PracticeScenarioReviewStatusRequest = {
|
|
reviewStatus: '草稿' | '待业务审核' | '已发布' | '已下线';
|
|
};
|
|
|
|
export type PracticeScenarioReviewStatusResponse = {
|
|
reviewStatus: '草稿' | '待业务审核' | '已发布' | '已下线';
|
|
awaitingSecondReview: boolean;
|
|
message: string;
|
|
};
|
|
|
|
export type PracticeCurriculumCapability = {
|
|
position: string;
|
|
growthLevel: string;
|
|
code: string;
|
|
name: string;
|
|
};
|
|
|
|
export type PracticeCurriculumMatrixRow = {
|
|
position: string;
|
|
growthLevel: string;
|
|
competencyCode: string;
|
|
competencyName: string;
|
|
publishedCount: number;
|
|
pendingReviewCount: number;
|
|
draftCount: number;
|
|
offlineCount: number;
|
|
coverageStatus: string;
|
|
};
|
|
|
|
export type PracticeRubricDimension = {
|
|
code: string;
|
|
name: string;
|
|
weight: number;
|
|
description: string;
|
|
};
|
|
|
|
export type PracticeRubricAdmin = {
|
|
code: string;
|
|
scenarioCode: string;
|
|
scenarioName: string;
|
|
name: string;
|
|
version: string;
|
|
enabled: boolean;
|
|
description: string;
|
|
dimensions: PracticeRubricDimension[];
|
|
};
|
|
|
|
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;
|
|
examFormat?: 'single' | 'multiple' | 'judge' | 'short' | '';
|
|
examOptions?: string[];
|
|
examAnswers?: string[];
|
|
examExplanation?: string;
|
|
examEnabled?: boolean;
|
|
reviewStatus?: 'DRAFT' | 'APPROVED' | 'REJECTED';
|
|
reviewedBy?: string;
|
|
reviewedTime?: string;
|
|
};
|
|
|
|
export type PracticeQuestionSaveRequest = Pick<
|
|
PracticeQuestion,
|
|
| 'code'
|
|
| 'scenarioCode'
|
|
| 'positionCode'
|
|
| 'type'
|
|
| 'question'
|
|
| 'referenceAnswer'
|
|
| 'enabled'
|
|
| 'sortOrder'
|
|
| 'examFormat'
|
|
| 'examOptions'
|
|
| 'examAnswers'
|
|
| 'examExplanation'
|
|
| 'examEnabled'
|
|
>;
|
|
|
|
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 ManagedLearningTask = {
|
|
id: number;
|
|
extPartyId: string;
|
|
traineeName: string;
|
|
projectCode: string;
|
|
positionCode: string;
|
|
taskType: string;
|
|
status: string;
|
|
materialType: 'DOCUMENT' | 'VIDEO' | 'COURSE' | 'SOP';
|
|
materialAttachmentId: number;
|
|
materialTitle: string;
|
|
materialVersion: string;
|
|
progressPercent: number;
|
|
completionRule: 'MANUAL_CONFIRM' | 'EXAM_PASS';
|
|
examId?: number | null;
|
|
examTitle?: string | null;
|
|
recurrenceType: 'ONCE' | 'DAILY' | 'WEEKLY' | 'MONTHLY';
|
|
assignedTime: string;
|
|
dueTime: string;
|
|
completedTime?: string;
|
|
assignBy: string;
|
|
};
|
|
|
|
export type LearningMaterialOption = {
|
|
attachmentId: number;
|
|
title: string;
|
|
fileType: string;
|
|
materialVersion: string;
|
|
updatedTime: string;
|
|
};
|
|
|
|
export type LearningExamOption = {
|
|
examId: number;
|
|
title: string;
|
|
projectCode: string;
|
|
positionCode: string;
|
|
dueDate: string;
|
|
targetCount: number;
|
|
};
|
|
|
|
export type ManagedLearningTaskBatchRequest = {
|
|
requestId: string;
|
|
targets: Array<{ extPartyId: string; traineeName?: string }>;
|
|
projectCode: string;
|
|
positionCode: string;
|
|
taskType: string;
|
|
materialType: ManagedLearningTask['materialType'];
|
|
materialAttachmentId: number;
|
|
completionRule: ManagedLearningTask['completionRule'];
|
|
examId?: number | null;
|
|
recurrenceType: ManagedLearningTask['recurrenceType'];
|
|
startTime: string;
|
|
dueTime: string;
|
|
};
|
|
|
|
export type ManagedLearningTaskBatchResponse = {
|
|
requestId: string;
|
|
total: number;
|
|
created: number;
|
|
duplicate: number;
|
|
failed: number;
|
|
items: Array<{ extPartyId: string; traineeName: string; status: string; message: string }>;
|
|
};
|
|
|
|
export type PracticePrepCardResponse = {
|
|
keyPoints: string[];
|
|
redLines: string[];
|
|
scripts: string[];
|
|
promptVersion: string;
|
|
};
|
|
|
|
export type PracticeStartResponse = {
|
|
sessionId: string;
|
|
scenarioId: string;
|
|
scenarioName: string;
|
|
trainee: string;
|
|
customerText: string;
|
|
emotion: number;
|
|
trust: number;
|
|
customerAudioUrl: string;
|
|
persona: {
|
|
customer: string;
|
|
project: string;
|
|
strategy: string;
|
|
goal: string;
|
|
};
|
|
};
|
|
|
|
export type PracticeTurnRequest = {
|
|
sessionId: string;
|
|
roundIndex: number;
|
|
traineeText: string;
|
|
traineeAudioUrl?: string;
|
|
traineeAudioOssId?: number;
|
|
};
|
|
|
|
export type PracticeTurnResponse = {
|
|
customerText: string;
|
|
customerAudioUrl: string;
|
|
emotion: number;
|
|
trust: number;
|
|
coachHint: string;
|
|
redFlag: boolean;
|
|
roundIndex: number;
|
|
finished: boolean;
|
|
};
|
|
|
|
export type PracticeFinishRequest = {
|
|
sessionId: string;
|
|
};
|
|
|
|
export type PracticeFinishResponse = {
|
|
totalScore: number;
|
|
score: Array<{
|
|
label: string;
|
|
value: number | string;
|
|
note: string;
|
|
}>;
|
|
mentorRewrite: string;
|
|
aiComment: string;
|
|
trustCurve: number[];
|
|
records: Array<{
|
|
time: string;
|
|
trainee: string;
|
|
scene: string;
|
|
score: number;
|
|
status: string;
|
|
summary: string;
|
|
}>;
|
|
};
|
|
|
|
export type PracticeCalibrationRequest = {
|
|
reviewer?: string;
|
|
correctedTotal: number;
|
|
correctedCompliance?: number;
|
|
correctedEmotion?: number;
|
|
correctedCommunication?: number;
|
|
correctedMarketing?: number;
|
|
correctedTaskCompletion?: number;
|
|
correctedResponseTimeliness?: number;
|
|
reason?: string;
|
|
};
|
|
|
|
export type PracticeCalibrationResponse = {
|
|
id: number;
|
|
sessionId: string;
|
|
originalScore: number;
|
|
correctedScore: number;
|
|
reviewer: string;
|
|
reason: string;
|
|
status: string;
|
|
createTime: string;
|
|
};
|
|
|
|
export type PromptTemplateResponse = {
|
|
id: number;
|
|
code: string;
|
|
name: string;
|
|
category: string;
|
|
outputFormat: string;
|
|
systemPrompt: string;
|
|
template: string;
|
|
variables: string;
|
|
version: string;
|
|
enabled: boolean;
|
|
description: string;
|
|
updateTime: string;
|
|
};
|
|
|
|
export type PromptTemplateRequest = {
|
|
code: string;
|
|
name: string;
|
|
category: string;
|
|
outputFormat: string;
|
|
systemPrompt: string;
|
|
template: string;
|
|
variables: string;
|
|
version: string;
|
|
enabled: boolean;
|
|
description: string;
|
|
};
|
|
|
|
export function listPracticeScenarios(params?: { position?: string; scenarioType?: string; includeDisabled?: boolean }): Promise<ApiResult<PracticeScenarioResponse[]>> {
|
|
return request({
|
|
url: '/api/train/practice/scenarios',
|
|
method: 'get',
|
|
params
|
|
});
|
|
}
|
|
|
|
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 reviewPracticeQuestion(code: string, decision: 'APPROVE' | 'REJECT', note = ''): Promise<ApiResult<PracticeQuestion>> {
|
|
return request({
|
|
url: `/api/train/practice/questions/${encodeURIComponent(code)}/review`,
|
|
method: 'patch',
|
|
data: { decision, note }
|
|
});
|
|
}
|
|
|
|
export function listManagedLearningTasks(params?: { status?: string; keyword?: string; limit?: number }): Promise<ApiResult<ManagedLearningTask[]>> {
|
|
return request({ url: '/api/train/practice/onboard-tasks/manage', method: 'get', params });
|
|
}
|
|
|
|
export function listLearningMaterials(): Promise<ApiResult<LearningMaterialOption[]>> {
|
|
return request({ url: '/api/train/practice/onboard-tasks/manage/materials', method: 'get' });
|
|
}
|
|
|
|
export function listLearningExams(): Promise<ApiResult<LearningExamOption[]>> {
|
|
return request({ url: '/api/train/practice/onboard-tasks/manage/exams', method: 'get' });
|
|
}
|
|
|
|
export function createManagedLearningTasks(data: ManagedLearningTaskBatchRequest): Promise<ApiResult<ManagedLearningTaskBatchResponse>> {
|
|
return request({ url: '/api/train/practice/onboard-tasks/manage/batch', method: 'post', data, headers: { repeatSubmit: false } });
|
|
}
|
|
|
|
export function updatePracticeScenarioEnabled(id: string, data: PracticeScenarioEnabledRequest): Promise<ApiResult<null>> {
|
|
return request({
|
|
url: `/api/train/practice/scenarios/${id}/enabled`,
|
|
method: 'patch',
|
|
data
|
|
});
|
|
}
|
|
|
|
export function updatePracticeScenarioReviewStatus(
|
|
id: string,
|
|
data: PracticeScenarioReviewStatusRequest
|
|
): Promise<ApiResult<PracticeScenarioReviewStatusResponse>> {
|
|
return request({
|
|
url: `/api/train/practice/scenarios/${encodeURIComponent(id)}/review-status`,
|
|
method: 'patch',
|
|
data
|
|
});
|
|
}
|
|
|
|
export function listPracticeCurriculumCapabilities(params?: {
|
|
position?: string;
|
|
growthLevel?: string;
|
|
}): Promise<ApiResult<PracticeCurriculumCapability[]>> {
|
|
return request({ url: '/api/train/practice/curriculum/capabilities', method: 'get', params });
|
|
}
|
|
|
|
export function listPracticeCurriculumMatrix(params?: {
|
|
position?: string;
|
|
}): Promise<ApiResult<PracticeCurriculumMatrixRow[]>> {
|
|
return request({ url: '/api/train/practice/curriculum/matrix', method: 'get', params });
|
|
}
|
|
|
|
export function savePracticeScenario(data: PracticeScenarioSaveRequest): Promise<ApiResult<PracticeScenarioResponse>> {
|
|
return request({
|
|
url: '/api/train/practice/scenarios',
|
|
method: 'post',
|
|
data
|
|
});
|
|
}
|
|
|
|
export function listPracticeRubrics(): Promise<ApiResult<PracticeRubricAdmin[]>> {
|
|
return request({ url: '/api/train/practice/rubrics/manage', method: 'get' });
|
|
}
|
|
|
|
export function savePracticeRubric(data: PracticeRubricSaveRequest): Promise<ApiResult<PracticeRubricAdmin>> {
|
|
return request({ url: '/api/train/practice/rubrics/manage', method: 'post', data });
|
|
}
|
|
|
|
export function updatePracticeRubricEnabled(code: string, enabled: boolean): Promise<ApiResult<null>> {
|
|
return request({
|
|
url: `/api/train/practice/rubrics/${encodeURIComponent(code)}/enabled`,
|
|
method: 'patch',
|
|
data: { enabled }
|
|
});
|
|
}
|
|
|
|
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`,
|
|
method: 'get'
|
|
});
|
|
}
|
|
|
|
export function startPracticeSession(data: PracticeStartRequest): Promise<ApiResult<PracticeStartResponse>> {
|
|
return request({
|
|
url: '/api/train/practice/start',
|
|
method: 'post',
|
|
data,
|
|
headers: { repeatSubmit: false }
|
|
});
|
|
}
|
|
|
|
export function submitPracticeTurn(data: PracticeTurnRequest): Promise<ApiResult<PracticeTurnResponse>> {
|
|
return request({
|
|
url: '/api/train/practice/turn',
|
|
method: 'post',
|
|
data,
|
|
headers: { repeatSubmit: false }
|
|
});
|
|
}
|
|
|
|
export function finishPracticeSession(data: PracticeFinishRequest): Promise<ApiResult<PracticeFinishResponse>> {
|
|
return request({
|
|
url: '/api/train/practice/finish',
|
|
method: 'post',
|
|
data,
|
|
headers: { repeatSubmit: false }
|
|
});
|
|
}
|
|
|
|
export function calibratePracticeSession(sessionId: string, data: PracticeCalibrationRequest): Promise<ApiResult<PracticeCalibrationResponse>> {
|
|
return request({
|
|
url: `/api/train/practice/sessions/${sessionId}/calibration`,
|
|
method: 'post',
|
|
data,
|
|
headers: { repeatSubmit: false }
|
|
});
|
|
}
|
|
|
|
export function exportPracticePilotCsv(params: { startDate: string; endDate: string }): Promise<Blob> {
|
|
return request({
|
|
url: '/api/train/practice/export',
|
|
method: 'get',
|
|
params,
|
|
responseType: 'blob'
|
|
}) as unknown as Promise<Blob>;
|
|
}
|
|
|
|
export function listPromptTemplates(params?: { category?: string; code?: string; enabled?: boolean }): Promise<ApiResult<PromptTemplateResponse[]>> {
|
|
return request({
|
|
url: '/api/aihr/prompt-templates',
|
|
method: 'get',
|
|
params
|
|
});
|
|
}
|
|
|
|
export function createPromptTemplate(data: PromptTemplateRequest): Promise<ApiResult<PromptTemplateResponse>> {
|
|
return request({
|
|
url: '/api/aihr/prompt-templates',
|
|
method: 'post',
|
|
data
|
|
});
|
|
}
|
|
|
|
export function updatePromptTemplate(id: number, data: PromptTemplateRequest): Promise<ApiResult<PromptTemplateResponse>> {
|
|
return request({
|
|
url: `/api/aihr/prompt-templates/${id}`,
|
|
method: 'put',
|
|
data
|
|
});
|
|
}
|