入职任务预览,入职任务cope,验证填入的信息

This commit is contained in:
fuenmao
2026-08-29 17:26:38 +08:00
parent e2697b4bdb
commit 058727982b
6 changed files with 1498 additions and 162 deletions
+81 -1
View File
@@ -3,6 +3,7 @@ import type { ReqId, ResPage } from "@/api/interface";
const taskHttp = moduleRequest("/biz/onboarding/task/");
const auditHttp = moduleRequest("/biz/onboarding/audit/");
const contractDocumentHttp = moduleRequest("/biz/onboarding/contract-document/");
const fileHttp = moduleRequest("/sys/dev/file/");
export interface OnboardingTask {
@@ -21,6 +22,33 @@ export interface OnboardingTask {
linkExpireAt?: string;
submitCount: number;
createTime: string;
remark?: string;
}
/** 当前查询条件下、不受状态筛选影响的任务统计。 */
export interface OnboardingTaskStatistics {
pendingFill: number;
reviewing: number;
rejected: number;
approved: number;
}
/** 带状态统计的入职任务分页结果。 */
export interface OnboardingTaskPage extends ResPage<OnboardingTask> {
statistics: OnboardingTaskStatistics;
}
/** 批量复制任务返回的单条新任务链接。 */
export interface OnboardingTaskCreatedResult {
taskId: number;
taskNo: string;
linkToken: string;
expiresAt: string;
}
/** 批量复制任务结果。 */
export interface OnboardingTaskCopyResult {
tasks: OnboardingTaskCreatedResult[];
}
/** 员工端完成合同准备后返回的当前文件版本。 */
@@ -218,7 +246,7 @@ export interface OnboardingTemplate {
}
export const onboardingTaskApi = {
page(params: Record<string, unknown>) {
return taskHttp.get<ResPage<OnboardingTask>>("page", params);
return taskHttp.get<OnboardingTaskPage>("page", params);
},
detail(params: ReqId) {
@@ -254,10 +282,62 @@ export const onboardingTaskApi = {
return response;
},
/** 创建任务前生成并下载单份临时 DOCX 合同预览。 */
async previewContractBeforeCreate(params: Record<string, unknown>) {
let response: any;
try {
response = await contractDocumentHttp.post<any>(
"preview-before-create",
params,
{ responseType: "blob", loading: false, cancel: false }
);
} catch (error: any) {
const errorBlob = error?.response?.data;
if (errorBlob instanceof Blob) {
try {
const result = JSON.parse(await errorBlob.text());
throw new Error(result?.msg || "合同预览生成失败");
} catch (parseError) {
if (!(parseError instanceof SyntaxError)) throw parseError;
}
}
throw error;
}
const blob = response?.data;
const contentType = String(
response?.headers?.["content-type"] || blob?.type || ""
);
if (
blob instanceof Blob &&
contentType.toLowerCase().includes("application/json")
) {
try {
const result = JSON.parse(await blob.text());
throw new Error(result?.msg || "合同预览生成失败");
} catch (error) {
if (error instanceof SyntaxError) {
throw new Error("合同预览生成失败");
}
throw error;
}
}
return response;
},
create(params: Record<string, unknown>) {
return taskHttp.post("create", params);
},
copy(params: {
sourceTaskId: number;
count: number;
items: Array<{ remark: string }>;
}) {
return taskHttp.post<OnboardingTaskCopyResult>("copy", params);
},
approve(params: {
taskId: number;
auditOpinion?: string;