feat(aihr): close functional checklist gaps

This commit is contained in:
key
2026-08-02 12:15:45 +08:00
parent 699cc08050
commit 6ad8a017a4
80 changed files with 4930 additions and 430 deletions
+112 -1
View File
@@ -152,9 +152,32 @@ export type PracticeQuestion = {
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 = Omit<PracticeQuestion, 'scenarioName' | 'contentVersion' | 'contentHash'>;
export type PracticeQuestionSaveRequest = Pick<
PracticeQuestion,
| 'code'
| 'scenarioCode'
| 'positionCode'
| 'type'
| 'question'
| 'referenceAnswer'
| 'enabled'
| 'sortOrder'
| 'examFormat'
| 'examOptions'
| 'examAnswers'
| 'examExplanation'
| 'examEnabled'
>;
export type ManagedPracticeAssignment = {
id: number;
@@ -190,6 +213,70 @@ export type ManagedPracticeAssignmentBatchResponse = {
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[];
@@ -328,6 +415,30 @@ export function updatePracticeQuestionEnabled(code: string, enabled: boolean): P
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`,