代码优化

This commit is contained in:
fuenmao
2026-08-27 11:09:33 +08:00
parent c091fc92b6
commit 6d4ad7236f
7 changed files with 629 additions and 87 deletions
@@ -20,6 +20,7 @@
<el-table-column prop="templateCode" label="模板编码" min-width="150" />
<el-table-column prop="templateName" label="模板名称" min-width="180" />
<el-table-column prop="companyName" label="所属公司" min-width="160" />
<el-table-column prop="departmentName" label="所属部门" min-width="150" />
<el-table-column label="适用岗位" min-width="220">
<template #default="scope">
<el-space wrap>
@@ -86,7 +87,7 @@
</el-form-item>
</el-col>
<el-col :xs="24" :sm="10">
<el-col :xs="24" :sm="8">
<el-form-item label="所属公司" required>
<el-select v-model="form.companyId" filterable class="full-width" placeholder="请选择公司"
@change="onCompanyChange">
@@ -94,10 +95,20 @@
</el-select>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="14">
<el-col :xs="24" :sm="8">
<el-form-item label="所属部门" required>
<el-select v-model="form.departmentId" filterable class="full-width" placeholder="请先选择公司"
:disabled="!form.companyId" @change="onDepartmentChange">
<el-option v-for="item in departments" :key="item.id" :label="item.departmentName"
:value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="8">
<el-form-item label="适用岗位" required>
<el-select v-model="form.positionIds" multiple filterable collapse-tags collapse-tags-tooltip
class="full-width" :disabled="!form.companyId" placeholder="请选择适用的岗位(可多选)">
class="full-width" :disabled="!form.departmentId" placeholder="请选择适用的岗位(可多选)"
@change="onPositionSelectionChange">
<el-option v-for="item in positions" :key="item.id" :label="item.positionName" :value="item.id" />
</el-select>
</el-form-item>
@@ -118,7 +129,8 @@
<span class="block-title">关联合同文件</span>
<span class="block-subtitle">选择该岗位入职时需要员工确认与签署的合同模板及版本</span>
</div>
<el-button type="primary" plain icon="Plus" size="small" @click="addContract">
<el-button type="primary" plain icon="Plus" size="small" :disabled="!form.positionIds.length"
@click="addContract">
添加合同文件
</el-button>
</div>
@@ -220,6 +232,7 @@ import {
OnboardingCompany,
OnboardingContractTemplate,
OnboardingContractVersion,
OnboardingDepartmentOption,
OnboardingMaterialType,
OnboardingPosition,
OnboardingTemplate,
@@ -233,6 +246,7 @@ const rows = ref<OnboardingTemplate[]>([]);
const total = ref(0);
const companies = ref<OnboardingCompany[]>([]);
const departments = ref<OnboardingDepartmentOption[]>([]);
const positions = ref<OnboardingPosition[]>([]);
const contractTemplates = ref<OnboardingContractTemplate[]>([]);
const materialTypes = ref<OnboardingMaterialType[]>([]);
@@ -250,6 +264,7 @@ const form = reactive<OnboardingTemplate>({
templateCode: "",
templateName: "",
companyId: 0,
departmentId: 0,
description: "",
status: "enable",
positionIds: [],
@@ -259,13 +274,11 @@ const form = reactive<OnboardingTemplate>({
});
async function loadBaseData() {
const [companyRes, templateRes, materialRes] = await Promise.all([
const [companyRes, materialRes] = await Promise.all([
onboardingTaskApi.companyPage({ pageNum: 1, pageSize: 100, status: "enable" }).catch(() => ({ data: { list: [] } })),
onboardingTaskApi.templatePage({ pageNum: 1, pageSize: 100, status: "enable" }).catch(() => ({ data: { list: [] } })),
onboardingTaskApi.listMaterialTypes().catch(() => ({ data: [] }))
]);
companies.value = companyRes.data?.list || [];
contractTemplates.value = templateRes.data?.list || [];
materialTypes.value = materialRes.data || [];
}
@@ -288,13 +301,49 @@ function resetQuery() {
}
async function onCompanyChange(companyId: number) {
form.departmentId = undefined as any;
form.positionIds = [];
form.contracts = [];
departments.value = [];
contractTemplates.value = [];
positions.value = [];
if (!companyId) {
positions.value = [];
return;
}
const res = await onboardingTaskApi.positionPage({ companyId, pageNum: 1, pageSize: 100, status: "enable" });
positions.value = res.data?.list || [];
const res = await onboardingTaskApi.listDepartments(companyId);
departments.value = res.data || [];
}
async function onDepartmentChange(departmentId: number) {
form.positionIds = [];
form.contracts = [];
positions.value = [];
contractTemplates.value = [];
if (!departmentId) return;
const res = await onboardingTaskApi.listPositionsByDepartment(departmentId);
positions.value = res.data || [];
}
async function onPositionSelectionChange() {
await loadAvailableContractTemplates();
}
async function loadAvailableContractTemplates() {
if (!form.companyId || !form.departmentId || !form.positionIds.length) {
contractTemplates.value = [];
form.contracts = [];
return;
}
const res = await onboardingTaskApi.listAvailableContractTemplates({
companyId: form.companyId,
departmentId: form.departmentId,
positionIds: form.positionIds
});
contractTemplates.value = res.data || [];
const availableIds = new Set(contractTemplates.value.map(item => item.id));
form.contracts = form.contracts.filter(item => availableIds.has(item.contractTemplateId));
}
async function onContractTemplateChange(row: any) {
@@ -310,6 +359,15 @@ async function loadContractVersions(templateId: number) {
}
function addContract() {
if (!form.positionIds.length) {
ElMessage.warning("请先选择适用岗位");
return;
}
if (!contractTemplates.value.length) {
ElMessage.warning("当前公司、部门和岗位没有可用的合同模板");
return;
}
form.contracts.push({
contractTemplateId: undefined as any,
contractTemplateVersionId: undefined as any,
@@ -344,6 +402,7 @@ async function openCreate() {
templateCode: "",
templateName: "",
companyId: undefined as any,
departmentId: undefined as any,
description: "",
status: "enable",
positionIds: [],
@@ -351,7 +410,9 @@ async function openCreate() {
formFields: [],
materials: []
});
departments.value = [];
positions.value = [];
contractTemplates.value = [];
visible.value = true;
}
@@ -364,6 +425,7 @@ async function openEdit(row: OnboardingTemplate) {
templateCode: detail.templateCode,
templateName: detail.templateName,
companyId: detail.companyId,
departmentId: detail.departmentId,
description: detail.description,
status: detail.status,
positionIds: detail.positionIds || [],
@@ -383,9 +445,14 @@ async function openEdit(row: OnboardingTemplate) {
});
if (form.companyId) {
const posRes = await onboardingTaskApi.positionPage({ companyId: form.companyId, pageNum: 1, pageSize: 100, status: "enable" });
positions.value = posRes.data?.list || [];
const departmentRes = await onboardingTaskApi.listDepartments(form.companyId);
departments.value = departmentRes.data || [];
}
if (form.departmentId) {
const positionRes = await onboardingTaskApi.listPositionsByDepartment(form.departmentId);
positions.value = positionRes.data || [];
}
await loadAvailableContractTemplates();
for (const contract of form.contracts) {
if (contract.contractTemplateId) {
await loadContractVersions(contract.contractTemplateId);
@@ -395,8 +462,14 @@ async function openEdit(row: OnboardingTemplate) {
}
async function save() {
if (!form.templateCode || !form.templateName || !form.companyId || !form.positionIds.length) {
return ElMessage.warning("请完整填写模板编码、名称、公司及适用岗位");
if (
!form.templateCode
|| !form.templateName
|| !form.companyId
|| !form.departmentId
|| !form.positionIds.length
) {
return ElMessage.warning("请完整填写模板编码、名称、公司、部门及适用岗位");
}
if (!form.contracts.length || form.contracts.some(item => !item.contractTemplateId || !item.contractTemplateVersionId)) {
return ElMessage.warning("请完整选择至少一份合同模板及版本");