逻辑调整

This commit is contained in:
fuenmao
2026-08-25 10:20:59 +08:00
parent 542cc635e3
commit 49a1a3ee6a
5 changed files with 700 additions and 729 deletions
+128 -7
View File
@@ -111,7 +111,7 @@
</div>
<!-- 发起任务弹窗 -->
<el-dialog v-model="createVisible" title="发起入职任务" width="520px" destroy-on-close>
<el-dialog v-model="createVisible" title="发起入职任务" width="760px" destroy-on-close>
<el-form :model="form" label-width="90px">
<el-form-item label="所属公司" required>
<el-select
@@ -132,11 +132,55 @@
placeholder="请选择岗位"
class="full-width"
:disabled="!form.companyId"
@change="onPositionChange"
>
<el-option v-for="item in positions" :key="item.id" :label="item.positionName" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="入职模板" required>
<el-select
v-model="form.onboardingTemplateId"
filterable
placeholder="请选择入职模板"
class="full-width"
:disabled="!form.positionId"
@change="onOnboardingTemplateChange"
>
<el-option v-for="item in onboardingTemplates" :key="item.id" :label="item.templateName" :value="item.id" />
</el-select>
</el-form-item>
<template v-if="form.contractVariables.length">
<el-divider content-position="left">合同人事参数</el-divider>
<el-alert
title="以下内容会在候选人查看合同时自动替换到 DOCX 中,请在发送链接前确认。"
type="warning"
:closable="false"
class="contract-variable-tip"
/>
<el-form-item
v-for="item in form.contractVariables"
:key="`${item.contractTemplateVersionId}-${item.variableCode}`"
:label="item.variableName"
:required="item.required"
>
<el-date-picker
v-if="item.dataType === 'date'"
v-model="item.variableValue"
type="date"
value-format="YYYY-MM-DD"
placeholder="请选择日期"
class="full-width"
/>
<el-input
v-else
v-model="item.variableValue"
:placeholder="`${item.contractName} · ${item.variableCode}`"
/>
</el-form-item>
</template>
<el-form-item label="人事备注">
<el-input v-model="form.remark" type="textarea" :rows="3" placeholder="填写该候选人入职的相关备注(选填)" />
</el-form-item>
@@ -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<ProTableInstance>();
const companies = ref<OnboardingCompanyOption[]>([]);
const positions = ref<OnboardingPositionOption[]>([]);
const onboardingTemplates = ref<OnboardingTemplate[]>([]);
const contractTemplates = ref<OnboardingContractTemplate[]>([]);
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;