| | |
| | | <template> |
| | | <div> |
| | | <el-dialog |
| | | v-model="dialogFormVisible" |
| | | :title="operationType === 'add' ? '新增入职' : '编辑人员'" |
| | | width="70%" |
| | | @close="closeDia" |
| | | > |
| | | <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef"> |
| | | <el-dialog v-model="dialogFormVisible" |
| | | :title="operationType === 'add' ? '新增入职' : '编辑人员'" |
| | | width="70%" |
| | | @close="closeDia"> |
| | | <el-form :model="form" |
| | | label-width="140px" |
| | | label-position="top" |
| | | :rules="rules" |
| | | ref="formRef"> |
| | | <el-row :gutter="30"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="员工编号:" prop="staffNo"> |
| | | <el-input v-model="form.staffNo" placeholder="请输入" clearable :disabled="operationType !== 'add'"/> |
| | | <el-form-item label="员工编号:" |
| | | prop="staffNo"> |
| | | <el-input v-model="form.staffNo" |
| | | placeholder="请输入" |
| | | clearable |
| | | :disabled="operationType !== 'add'" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="姓名:" prop="staffName"> |
| | | <el-input v-model="form.staffName" placeholder="请输入" clearable/> |
| | | <el-form-item label="姓名:" |
| | | prop="staffName"> |
| | | <el-input v-model="form.staffName" |
| | | placeholder="请输入" |
| | | clearable /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="30"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="性别:" prop="sex"> |
| | | <el-form-item label="性别:" |
| | | prop="sex"> |
| | | <el-select v-model="form.sex"> |
| | | <el-option label="男" value="男" /> |
| | | <el-option label="女" value="女" /> |
| | | <el-option label="男" |
| | | value="男" /> |
| | | <el-option label="女" |
| | | value="女" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="户籍住址:" prop="nativePlace"> |
| | | <el-input v-model="form.nativePlace" placeholder="请输入" clearable/> |
| | | <el-form-item label="户籍住址:" |
| | | prop="nativePlace"> |
| | | <el-input v-model="form.nativePlace" |
| | | placeholder="请输入" |
| | | clearable /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="30"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="岗位:" prop="sysPostId"> |
| | | <el-select v-model="form.sysPostId" placeholder="请选择岗位" clearable> |
| | | <el-option |
| | | v-for="item in postOptions" |
| | | :key="item.postId" |
| | | :label="item.postName" |
| | | :value="item.postId" |
| | | :disabled="item.status === '1'" |
| | | /> |
| | | <el-form-item label="岗位:" |
| | | prop="sysPostId"> |
| | | <el-select v-model="form.sysPostId" |
| | | placeholder="请选择岗位" |
| | | clearable> |
| | | <el-option v-for="item in postOptions" |
| | | :key="item.postId" |
| | | :label="item.postName" |
| | | :value="item.postId" |
| | | :disabled="item.status === '1'" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="现住址:" prop="adress"> |
| | | <el-input v-model="form.adress" placeholder="请输入" clearable/> |
| | | <el-form-item label="现住址:" |
| | | prop="adress"> |
| | | <el-input v-model="form.adress" |
| | | placeholder="请输入" |
| | | clearable /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="30"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="第一学历:" prop="firstStudy"> |
| | | <el-input v-model="form.firstStudy" placeholder="请输入" clearable/> |
| | | <el-form-item label="部门:" |
| | | prop="sysDeptId"> |
| | | <el-tree-select v-model="form.sysDeptId" |
| | | :data="deptOptions" |
| | | :props="{ value: 'id', label: 'label', children: 'children' }" |
| | | value-key="id" |
| | | placeholder="请选择部门" |
| | | check-strictly /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="专业:" prop="profession"> |
| | | <el-input v-model="form.profession" placeholder="请输入" clearable/> |
| | | <el-form-item label="年龄:" |
| | | prop="age"> |
| | | <el-input-number v-model="form.age" |
| | | :precision="0" |
| | | :step="1" |
| | | style="width: 100%" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="30"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="年龄:" prop="age"> |
| | | <el-input-number v-model="form.age" :precision="0" :step="1" style="width: 100%"/> |
| | | <el-form-item label="第一学历:" |
| | | prop="firstStudy"> |
| | | <el-input v-model="form.firstStudy" |
| | | placeholder="请输入" |
| | | clearable /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="专业:" |
| | | prop="profession"> |
| | | <el-input v-model="form.profession" |
| | | placeholder="请输入" |
| | | clearable /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="30"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="联系电话:" prop="phone"> |
| | | <el-input v-model="form.phone" placeholder="请输入" clearable/> |
| | | <el-form-item label="联系电话:" |
| | | prop="phone"> |
| | | <el-input v-model="form.phone" |
| | | placeholder="请输入" |
| | | clearable /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="紧急联系人:" prop="emergencyContact"> |
| | | <el-input v-model="form.emergencyContact" placeholder="请输入" clearable/> |
| | | <el-form-item label="紧急联系人:" |
| | | prop="emergencyContact"> |
| | | <el-input v-model="form.emergencyContact" |
| | | placeholder="请输入" |
| | | clearable /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="30"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="紧急联系人联系电话:" prop="emergencyContactPhone"> |
| | | <el-input v-model="form.emergencyContactPhone" placeholder="请输入" clearable/> |
| | | <el-form-item label="紧急联系人联系电话:" |
| | | prop="emergencyContactPhone"> |
| | | <el-input v-model="form.emergencyContactPhone" |
| | | placeholder="请输入" |
| | | clearable /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="合同年限:" prop="contractTerm"> |
| | | <el-input-number v-model="form.contractTerm" :precision="0" :step="1" style="width: 100%" :disabled="true"/> |
| | | <el-form-item label="合同年限:" |
| | | prop="contractTerm"> |
| | | <el-input-number v-model="form.contractTerm" |
| | | :precision="0" |
| | | :step="1" |
| | | style="width: 100%" |
| | | :disabled="true" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="30"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="合同开始日期:" prop="contractStartTime"> |
| | | <el-date-picker |
| | | v-model="form.contractStartTime" |
| | | type="date" |
| | | placeholder="请选择日期" |
| | | value-format="YYYY-MM-DD" |
| | | format="YYYY-MM-DD" |
| | | clearable |
| | | style="width: 100%" |
| | | @change="calculateContractTerm" |
| | | /> |
| | | <el-form-item label="合同开始日期:" |
| | | prop="contractStartTime"> |
| | | <el-date-picker v-model="form.contractStartTime" |
| | | type="date" |
| | | placeholder="请选择日期" |
| | | value-format="YYYY-MM-DD" |
| | | format="YYYY-MM-DD" |
| | | clearable |
| | | style="width: 100%" |
| | | @change="calculateContractTerm" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="合同结束日期:" prop="contractEndTime"> |
| | | <el-date-picker |
| | | v-model="form.contractEndTime" |
| | | type="date" |
| | | placeholder="请选择日期" |
| | | value-format="YYYY-MM-DD" |
| | | format="YYYY-MM-DD" |
| | | clearable |
| | | style="width: 100%" |
| | | @change="calculateContractTerm" |
| | | /> |
| | | <el-form-item label="合同结束日期:" |
| | | prop="contractEndTime"> |
| | | <el-date-picker v-model="form.contractEndTime" |
| | | type="date" |
| | | placeholder="请选择日期" |
| | | value-format="YYYY-MM-DD" |
| | | format="YYYY-MM-DD" |
| | | clearable |
| | | style="width: 100%" |
| | | @change="calculateContractTerm" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | </el-form> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button type="primary" @click="submitForm">确认</el-button> |
| | | <el-button type="primary" |
| | | @click="submitForm">确认</el-button> |
| | | <el-button @click="closeDia">取消</el-button> |
| | | </div> |
| | | </template> |
| | |
| | | </template> |
| | | |
| | | <script setup> |
| | | import {ref, onMounted} from "vue"; |
| | | import {getStaffJoinInfo, staffJoinAdd, staffJoinUpdate} from "@/api/personnelManagement/onboarding.js"; |
| | | import {findPostOptions} from "@/api/system/post.js"; |
| | | import {staffOnJobInfo, createStaffOnJob, updateStaffOnJob} from "@/api/personnelManagement/staffOnJob.js"; |
| | | const { proxy } = getCurrentInstance() |
| | | const emit = defineEmits(['close']) |
| | | import { ref, onMounted } from "vue"; |
| | | import { findPostOptions } from "@/api/system/post.js"; |
| | | import { listDept } from "@/api/system/dept.js"; |
| | | import { |
| | | staffOnJobInfo, |
| | | createStaffOnJob, |
| | | updateStaffOnJob, |
| | | } from "@/api/personnelManagement/staffOnJob.js"; |
| | | import { deptTreeSelect } from "@/api/system/user.js"; |
| | | const { proxy } = getCurrentInstance(); |
| | | const emit = defineEmits(["close"]); |
| | | |
| | | const dialogFormVisible = ref(false); |
| | | const operationType = ref('') |
| | | const id = ref(0) |
| | | const data = reactive({ |
| | | form: { |
| | | staffNo: "", |
| | | staffName: "", |
| | | sex: "", |
| | | nativePlace: "", |
| | | postJob: "", |
| | | adress: "", |
| | | firstStudy: "", |
| | | profession: "", |
| | | age: 0, |
| | | phone: "", |
| | | emergencyContact: "", |
| | | emergencyContactPhone: "", |
| | | contractTerm: 0, |
| | | contractStartTime: "", |
| | | contractEndTime: "", |
| | | staffState: "", |
| | | sysPostId: undefined, |
| | | }, |
| | | rules: { |
| | | staffNo: [{ required: true, message: "请输入", trigger: "blur" },], |
| | | staffName: [{ required: true, message: "请输入", trigger: "blur" }], |
| | | sex: [{ required: true, message: "请输入", trigger: "blur" }], |
| | | nativePlace: [{ required: true, message: "请输入", trigger: "blur" }], |
| | | postJob: [{ required: true, message: "请输入", trigger: "blur" }], |
| | | adress: [{ required: true, message: "请输入", trigger: "blur" }], |
| | | firstStudy: [{ required: true, message: "请输入", trigger: "blur" }], |
| | | profession: [{ required: true, message: "请输入", trigger: "blur" }], |
| | | age: [{ required: true, message: "请输入", trigger: "blur" }], |
| | | phone: [{ required: true, message: "请输入", trigger: "blur" }], |
| | | emergencyContact: [{ required: true, message: "请输入", trigger: "blur" }], |
| | | emergencyContactPhone: [{ required: true, message: "请输入", trigger: "blur" }], |
| | | contractTerm: [{ required: true, message: "请输入", trigger: "blur" }], |
| | | contractStartTime: [{ required: true, message: "请输入", trigger: "blur" }], |
| | | contractEndTime: [{ required: true, message: "请输入", trigger: "blur" }], |
| | | }, |
| | | postOptions: [], // 岗位选项 |
| | | }); |
| | | const { form, rules, postOptions } = toRefs(data); |
| | | const dialogFormVisible = ref(false); |
| | | const operationType = ref(""); |
| | | const id = ref(0); |
| | | const data = reactive({ |
| | | form: { |
| | | staffNo: "", |
| | | staffName: "", |
| | | sex: "", |
| | | nativePlace: "", |
| | | postJob: "", |
| | | adress: "", |
| | | firstStudy: "", |
| | | profession: "", |
| | | age: 0, |
| | | phone: "", |
| | | emergencyContact: "", |
| | | emergencyContactPhone: "", |
| | | contractTerm: 0, |
| | | contractStartTime: "", |
| | | contractEndTime: "", |
| | | sysPostId: undefined, |
| | | sysDeptId: undefined, |
| | | }, |
| | | rules: { |
| | | staffNo: [{ required: true, message: "请输入", trigger: "blur" }], |
| | | staffName: [{ required: true, message: "请输入", trigger: "blur" }], |
| | | sex: [{ required: true, message: "请输入", trigger: "blur" }], |
| | | nativePlace: [{ required: true, message: "请输入", trigger: "blur" }], |
| | | postJob: [{ required: true, message: "请输入", trigger: "blur" }], |
| | | adress: [{ required: true, message: "请输入", trigger: "blur" }], |
| | | firstStudy: [{ required: true, message: "请输入", trigger: "blur" }], |
| | | profession: [{ required: true, message: "请输入", trigger: "blur" }], |
| | | age: [{ required: true, message: "请输入", trigger: "blur" }], |
| | | phone: [{ required: true, message: "请输入", trigger: "blur" }], |
| | | emergencyContact: [{ required: true, message: "请输入", trigger: "blur" }], |
| | | emergencyContactPhone: [ |
| | | { required: true, message: "请输入", trigger: "blur" }, |
| | | ], |
| | | contractTerm: [{ required: true, message: "请输入", trigger: "blur" }], |
| | | contractStartTime: [{ required: true, message: "请输入", trigger: "blur" }], |
| | | contractEndTime: [{ required: true, message: "请输入", trigger: "blur" }], |
| | | sysDeptId: [{ required: true, message: "请输入", trigger: "blur" }], |
| | | }, |
| | | postOptions: [], // 岗位选项 |
| | | deptOptions: [], // 部门选项 |
| | | }); |
| | | const { form, rules, postOptions, deptOptions } = toRefs(data); |
| | | |
| | | // 打开弹框 |
| | | const openDialog = (type, row) => { |
| | | operationType.value = type; |
| | | dialogFormVisible.value = true; |
| | | if (operationType.value === 'edit') { |
| | | id.value = row.id |
| | | staffOnJobInfo(id.value, {}).then(res => { |
| | | form.value = {...res.data} |
| | | if (form.value.sysPostId === 0) { |
| | | form.value.sysPostId = undefined |
| | | } |
| | | // 编辑时也计算一次合同年限 |
| | | calculateContractTerm(); |
| | | }) |
| | | } else { |
| | | form.value.id = '' |
| | | } |
| | | |
| | | } |
| | | onMounted(() => { |
| | | fetchPostOptions() |
| | | }) |
| | | |
| | | const fetchPostOptions = () => { |
| | | findPostOptions().then(res => { |
| | | postOptions.value = res.data |
| | | }) |
| | | } |
| | | // 提交产品表单 |
| | | const submitForm = () => { |
| | | if (!form.value.sysPostId) { |
| | | form.value.sysPostId = 0; |
| | | } |
| | | proxy.$refs.formRef.validate(valid => { |
| | | if (valid) { |
| | | form.value.staffState = 1 |
| | | if (operationType.value === "add") { |
| | | createStaffOnJob(form.value).then(res => { |
| | | proxy.$modal.msgSuccess("提交成功"); |
| | | closeDia(); |
| | | }) |
| | | } else { |
| | | updateStaffOnJob(id.value, form.value).then(res => { |
| | | proxy.$modal.msgSuccess("提交成功"); |
| | | closeDia(); |
| | | }) |
| | | } |
| | | // 打开弹框 |
| | | const openDialog = (type, row) => { |
| | | operationType.value = type; |
| | | dialogFormVisible.value = true; |
| | | if (operationType.value === "edit") { |
| | | id.value = row.id; |
| | | staffOnJobInfo(id.value, {}).then(res => { |
| | | form.value = { ...res.data }; |
| | | if (form.value.sysPostId === 0) { |
| | | form.value.sysPostId = undefined; |
| | | } |
| | | if (form.value.sysDeptId === 0) { |
| | | form.value.sysDeptId = undefined; |
| | | } |
| | | // 编辑时也计算一次合同年限 |
| | | calculateContractTerm(); |
| | | }); |
| | | } else { |
| | | form.value.id = ""; |
| | | } |
| | | }) |
| | | } |
| | | // 计算合同年限 |
| | | const calculateContractTerm = () => { |
| | | if (form.value.contractStartTime && form.value.contractEndTime) { |
| | | const startDate = new Date(form.value.contractStartTime); |
| | | const endDate = new Date(form.value.contractEndTime); |
| | | |
| | | if (endDate > startDate) { |
| | | // 计算年份差 |
| | | const yearDiff = endDate.getFullYear() - startDate.getFullYear(); |
| | | const monthDiff = endDate.getMonth() - startDate.getMonth(); |
| | | const dayDiff = endDate.getDate() - startDate.getDate(); |
| | | |
| | | let years = yearDiff; |
| | | |
| | | // 如果结束日期的月日小于开始日期的月日,则减去1年 |
| | | if (monthDiff < 0 || (monthDiff === 0 && dayDiff < 0)) { |
| | | years = yearDiff - 1; |
| | | }; |
| | | onMounted(() => { |
| | | fetchPostOptions(); |
| | | fetchDeptOptions(); |
| | | }); |
| | | |
| | | const fetchPostOptions = () => { |
| | | findPostOptions().then(res => { |
| | | postOptions.value = res.data; |
| | | }); |
| | | }; |
| | | |
| | | // 查询部门列表 |
| | | const fetchDeptOptions = () => { |
| | | deptTreeSelect().then(response => { |
| | | deptOptions.value = filterDisabledDept( |
| | | JSON.parse(JSON.stringify(response.data)) |
| | | ); |
| | | }); |
| | | }; |
| | | |
| | | /** 过滤禁用的部门 */ |
| | | function filterDisabledDept(deptList) { |
| | | return deptList.filter(dept => { |
| | | if (dept.disabled) { |
| | | return false; |
| | | } |
| | | |
| | | form.value.contractTerm = Math.max(0, years); |
| | | if (dept.children && dept.children.length) { |
| | | dept.children = filterDisabledDept(dept.children); |
| | | } |
| | | return true; |
| | | }); |
| | | } |
| | | |
| | | // 提交产品表单 |
| | | const submitForm = () => { |
| | | if (!form.value.sysDeptId) { |
| | | proxy.$modal.msgWarning("请选择部门"); |
| | | return; |
| | | } |
| | | if (!form.value.sysPostId) { |
| | | form.value.sysPostId = 0; |
| | | } |
| | | if (!form.value.sysDeptId) { |
| | | form.value.sysDeptId = 0; |
| | | } |
| | | proxy.$refs.formRef.validate(valid => { |
| | | if (valid) { |
| | | if (operationType.value === "add") { |
| | | createStaffOnJob(form.value).then(res => { |
| | | proxy.$modal.msgSuccess("提交成功"); |
| | | closeDia(); |
| | | }); |
| | | } else { |
| | | updateStaffOnJob(id.value, form.value).then(res => { |
| | | proxy.$modal.msgSuccess("提交成功"); |
| | | closeDia(); |
| | | }); |
| | | } |
| | | } |
| | | }); |
| | | }; |
| | | // 计算合同年限 |
| | | const calculateContractTerm = () => { |
| | | if (form.value.contractStartTime && form.value.contractEndTime) { |
| | | const startDate = new Date(form.value.contractStartTime); |
| | | const endDate = new Date(form.value.contractEndTime); |
| | | |
| | | if (endDate > startDate) { |
| | | // 计算年份差 |
| | | const yearDiff = endDate.getFullYear() - startDate.getFullYear(); |
| | | const monthDiff = endDate.getMonth() - startDate.getMonth(); |
| | | const dayDiff = endDate.getDate() - startDate.getDate(); |
| | | |
| | | let years = yearDiff; |
| | | |
| | | // 如果结束日期的月日小于开始日期的月日,则减去1年 |
| | | if (monthDiff < 0 || (monthDiff === 0 && dayDiff < 0)) { |
| | | years = yearDiff - 1; |
| | | } |
| | | |
| | | form.value.contractTerm = Math.max(0, years); |
| | | } else { |
| | | form.value.contractTerm = 0; |
| | | } |
| | | } else { |
| | | form.value.contractTerm = 0; |
| | | } |
| | | } else { |
| | | form.value.contractTerm = 0; |
| | | } |
| | | }; |
| | | }; |
| | | |
| | | // 关闭弹框 |
| | | const closeDia = () => { |
| | | proxy.resetForm("formRef"); |
| | | dialogFormVisible.value = false; |
| | | emit('close') |
| | | }; |
| | | defineExpose({ |
| | | openDialog, |
| | | }); |
| | | // 关闭弹框 |
| | | const closeDia = () => { |
| | | proxy.resetForm("formRef"); |
| | | dialogFormVisible.value = false; |
| | | emit("close"); |
| | | }; |
| | | defineExpose({ |
| | | openDialog, |
| | | }); |
| | | </script> |
| | | |
| | | <style scoped> |
| | | |
| | | </style> |