From 49a1a3ee6a8c385de29f6ca6ea8947127e8721a3 Mon Sep 17 00:00:00 2001 From: fuenmao <980740792@qq.com> Date: Tue, 25 Aug 2026 10:20:59 +0800 Subject: [PATCH] =?UTF-8?q?=E9=80=BB=E8=BE=91=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/modules/biz/onboarding.ts | 159 +++--- src/views/biz/onboarding/contract/index.vue | 334 ++----------- .../components/OnboardingTemplatePanel.vue | 451 ++++++++++++++++++ .../biz/onboarding/entry-config/index.vue | 350 +------------- src/views/biz/onboarding/task/index.vue | 135 +++++- 5 files changed, 700 insertions(+), 729 deletions(-) create mode 100644 src/views/biz/onboarding/entry-config/components/OnboardingTemplatePanel.vue diff --git a/src/api/modules/biz/onboarding.ts b/src/api/modules/biz/onboarding.ts index 41a0257..ab4c00b 100644 --- a/src/api/modules/biz/onboarding.ts +++ b/src/api/modules/biz/onboarding.ts @@ -80,16 +80,6 @@ export interface OnboardingTemplateVariable { remark?: string; } -export interface OnboardingContractScope { - id: number; - companyId: number; - positionId?: number; - templateId: number; - templateVersionId: number; - required: boolean; - sortCode?: number; -} - export interface OnboardingTaskContractVariableItem { id: number; variableCode: string; @@ -142,24 +132,43 @@ export interface OnboardingMaterialType { status: string; } -export interface OnboardingFormRequirement { - id: number; - companyId: number; - positionId?: number; +export interface OnboardingTemplateContractConfig { + contractTemplateId: number; + contractTemplateVersionId: number; + required: boolean; + printCopies: number; + sortCode?: number; +} + +export interface OnboardingTemplateFieldConfig { fieldId: number; required: boolean; sortCode?: number; } -export interface OnboardingMaterialRequirement { - id: number; - companyId: number; - positionId?: number; +export interface OnboardingTemplateMaterialConfig { materialTypeId: number; required: boolean; sortCode?: number; } +export interface OnboardingTemplate { + id: number; + templateCode: string; + templateName: string; + companyId: number; + companyName?: string; + positionIds: number[]; + positionNames?: string[]; + contracts: OnboardingTemplateContractConfig[]; + formFields: OnboardingTemplateFieldConfig[]; + materials: OnboardingTemplateMaterialConfig[]; + contractCount?: number; + formFieldCount?: number; + materialCount?: number; + status: string; + description?: string; +} export const onboardingTaskApi = { page(params: Record) { return taskHttp.get>("page", params); @@ -291,6 +300,40 @@ export const onboardingTaskApi = { ); }, + onboardingTemplatePage(params: Record) { + return moduleRequest("/biz/onboarding/template/").get< + ResPage + >("page", params); + }, + + onboardingTemplateDetail(params: ReqId) { + return moduleRequest("/biz/onboarding/template/").get( + "detail", + params + ); + }, + + saveOnboardingTemplate(params: Partial) { + return moduleRequest("/biz/onboarding/template/").post( + "save", + params + ); + }, + + deleteOnboardingTemplate(ids: number[]) { + return moduleRequest("/biz/onboarding/template/").post( + "delete", + { ids } + ); + }, + + listEnabledOnboardingTemplates(companyId: number, positionId: number) { + return moduleRequest("/biz/onboarding/template/").get( + "list-enabled", + { companyId, positionId } + ); + }, + templatePage(params: Record) { return moduleRequest("/biz/onboarding/contract-template/").get< ResPage @@ -357,47 +400,13 @@ export const onboardingTaskApi = { >("variable/page", params); }, - saveVariable( - params: Partial, - edit = false - ) { + editVariable(params: Partial) { return moduleRequest("/biz/onboarding/contract-template/").post( - edit ? "variable/edit" : "variable/add", + "variable/edit", params ); }, - deleteVariable(ids: number[]) { - return moduleRequest("/biz/onboarding/contract-template/").post( - "variable/delete", - { ids } - ); - }, - - scopePage(params: { - templateId: number; - pageNum: number; - pageSize: number; - }) { - return moduleRequest("/biz/onboarding/contract-template/").get< - ResPage - >("scope/page", params); - }, - - addScope(params: Partial) { - return moduleRequest("/biz/onboarding/contract-template/").post( - "scope/add", - params - ); - }, - - deleteScope(ids: number[]) { - return moduleRequest("/biz/onboarding/contract-template/").post( - "scope/delete", - { ids } - ); - }, - uploadDocx(params: FormData) { return moduleRequest("/biz/onboarding/contract-template/").post( "file/upload-docx", @@ -475,47 +484,5 @@ export const onboardingTaskApi = { "material-type/delete", { ids } ); - }, - - listFormRequirements(companyId: number) { - return moduleRequest("/biz/onboarding/entry-config/").get< - OnboardingFormRequirement[] - >("form-requirement/list", { companyId }); - }, - - saveFormRequirement(params: Partial) { - return moduleRequest("/biz/onboarding/entry-config/").post( - "form-requirement/save", - params - ); - }, - - deleteFormRequirements(ids: number[]) { - return moduleRequest("/biz/onboarding/entry-config/").post( - "form-requirement/delete", - { ids } - ); - }, - - listMaterialRequirements(companyId: number) { - return moduleRequest("/biz/onboarding/entry-config/").get< - OnboardingMaterialRequirement[] - >("material-requirement/list", { companyId }); - }, - - saveMaterialRequirement( - params: Partial - ) { - return moduleRequest("/biz/onboarding/entry-config/").post( - "material-requirement/save", - params - ); - }, - - deleteMaterialRequirements(ids: number[]) { - return moduleRequest("/biz/onboarding/entry-config/").post( - "material-requirement/delete", - { ids } - ); } }; \ No newline at end of file diff --git a/src/views/biz/onboarding/contract/index.vue b/src/views/biz/onboarding/contract/index.vue index 95610ba..1a2e097 100644 --- a/src/views/biz/onboarding/contract/index.vue +++ b/src/views/biz/onboarding/contract/index.vue @@ -179,104 +179,6 @@ - - - -
- - - - - - - - - - - - - - - - - - - - - - - - 添加适用范围 - - - - - - - - - - - - - - - - - - - - - - -
-
@@ -294,7 +196,7 @@ append-to-body > -
- - 新增变量定义 - - -
+ @@ -410,11 +306,7 @@ @@ -424,14 +316,14 @@ - + @@ -456,7 +348,7 @@ - + @@ -490,44 +382,30 @@ \ No newline at end of file diff --git a/src/views/biz/onboarding/entry-config/index.vue b/src/views/biz/onboarding/entry-config/index.vue index 90c23e5..1a64136 100644 --- a/src/views/biz/onboarding/entry-config/index.vue +++ b/src/views/biz/onboarding/entry-config/index.vue @@ -82,103 +82,9 @@ - +
- - - - - - - +
@@ -275,133 +181,32 @@
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/views/biz/onboarding/task/index.vue b/src/views/biz/onboarding/task/index.vue index fa0e0c3..4d64808 100644 --- a/src/views/biz/onboarding/task/index.vue +++ b/src/views/biz/onboarding/task/index.vue @@ -111,7 +111,7 @@ - + + + + + + + + + @@ -548,6 +592,8 @@ import { onboardingTaskApi, type OnboardingCompanyOption, type OnboardingPositionOption, + type OnboardingTemplate, + type OnboardingContractTemplate, type OnboardingTask, type OnboardingTaskContractVariableGroup } from "@/api/modules/biz/onboarding"; @@ -557,6 +603,8 @@ const proTable = ref(); const companies = ref([]); const positions = ref([]); +const onboardingTemplates = ref([]); +const contractTemplates = ref([]); const createVisible = ref(false); const creating = ref(false); @@ -582,6 +630,16 @@ const statusCounts = reactive({ const form = reactive({ companyId: undefined as number | undefined, positionId: undefined as number | undefined, + onboardingTemplateId: undefined as number | undefined, + contractVariables: [] as Array<{ + contractTemplateVersionId: number; + variableCode: string; + variableName: string; + variableValue?: string; + dataType: string; + required: boolean; + contractName: string; + }>, remark: "" }); @@ -724,25 +782,88 @@ async function getTableData(params: any) { } async function loadCompanies() { - const { data } = await onboardingTaskApi.listCompanies(); - companies.value = data; + try { + const [companyResult, contractResult] = await Promise.all([ + onboardingTaskApi.listCompanies().catch(() => ({ data: [] })), + onboardingTaskApi.templatePage({ pageNum: 1, pageSize: 100, status: "enable" }).catch(() => ({ data: { list: [] } })) + ]); + companies.value = companyResult.data || []; + contractTemplates.value = contractResult.data?.list || []; + } catch (e) { + console.error("加载公司与合同数据失败", e); + } } async function onCompanyChange(companyId: number) { form.positionId = undefined; + form.onboardingTemplateId = undefined; + form.contractVariables = []; + onboardingTemplates.value = []; const { data } = await onboardingTaskApi.listPositions(companyId); - positions.value = data; + positions.value = data || []; +} + +async function onPositionChange(positionId: number) { + form.onboardingTemplateId = undefined; + form.contractVariables = []; + onboardingTemplates.value = []; + if (!form.companyId || !positionId) return; + const { data } = await onboardingTaskApi.listEnabledOnboardingTemplates(form.companyId, positionId); + onboardingTemplates.value = data || []; + if (onboardingTemplates.value.length === 1) { + form.onboardingTemplateId = onboardingTemplates.value[0].id; + await onOnboardingTemplateChange(form.onboardingTemplateId!); + } +} + +async function onOnboardingTemplateChange(templateId: number) { + form.contractVariables = []; + if (!templateId) return; + const { data: template } = await onboardingTaskApi.onboardingTemplateDetail({ id: templateId }); + const variableResults = await Promise.all( + template.contracts.map(contract => onboardingTaskApi.variablePage({ + templateVersionId: contract.contractTemplateVersionId, + pageNum: 1, + pageSize: 100 + })) + ); + + form.contractVariables = template.contracts.flatMap((contract, index) => { + const contractName = contractTemplates.value.find(item => item.id === contract.contractTemplateId)?.templateName || "合同"; + return (variableResults[index].data?.list || []) + .filter(variable => variable.hrEditable && ["contract", "company"].includes(variable.variableType)) + .map(variable => ({ + contractTemplateVersionId: contract.contractTemplateVersionId, + variableCode: variable.variableCode, + variableName: variable.variableName, + variableValue: variable.defaultValue, + dataType: variable.dataType, + required: variable.required, + contractName + })); + }); } function openCreate() { - Object.assign(form, { companyId: undefined, positionId: undefined, remark: "" }); + Object.assign(form, { + companyId: undefined, + positionId: undefined, + onboardingTemplateId: undefined, + contractVariables: [], + remark: "" + }); positions.value = []; + onboardingTemplates.value = []; createVisible.value = true; } async function createTask() { - if (!form.companyId || !form.positionId) { - return ElMessage.warning("请选择所属公司和入职岗位"); + if (!form.companyId || !form.positionId || !form.onboardingTemplateId) { + return ElMessage.warning("请选择所属公司、入职岗位和入职模板"); + } + const missingVariable = form.contractVariables.find(item => item.required && !String(item.variableValue || "").trim()); + if (missingVariable) { + return ElMessage.warning(`请填写合同人事参数“${missingVariable.variableName}”`); } creating.value = true;