From 81e1767bfad13450a631d3e7f4f700fbe7cbb03a Mon Sep 17 00:00:00 2001
From: zhangwencui <1064582902@qq.com>
Date: 星期四, 12 二月 2026 11:19:14 +0800
Subject: [PATCH] 部门校验
---
src/views/personnelManagement/employeeRecord/components/NewOrEditFormDia.vue | 512 +++++++++++++++++++++++++++++++-------------------------
1 files changed, 282 insertions(+), 230 deletions(-)
diff --git a/src/views/personnelManagement/employeeRecord/components/NewOrEditFormDia.vue b/src/views/personnelManagement/employeeRecord/components/NewOrEditFormDia.vue
index f65509a..1e1c9fd 100644
--- a/src/views/personnelManagement/employeeRecord/components/NewOrEditFormDia.vue
+++ b/src/views/personnelManagement/employeeRecord/components/NewOrEditFormDia.vue
@@ -1,148 +1,189 @@
<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="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 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="age">
- <el-input-number v-model="form.age" :precision="0" :step="1" style="width: 100%"/>
+ <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="firstStudy">
- <el-input v-model="form.firstStudy" placeholder="璇疯緭鍏�" clearable/>
+ <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 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>
@@ -151,175 +192,186 @@
</template>
<script setup>
-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'])
+ 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: "",
- 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" }],
- },
- postOptions: [], // 宀椾綅閫夐」
- deptOptions: [], // 閮ㄩ棬閫夐」
-});
-const { form, rules, postOptions, deptOptions } = 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
- }
- if (form.value.sysDeptId === 0) {
- form.value.sysDeptId = undefined
- }
- // 缂栬緫鏃朵篃璁$畻涓�娆″悎鍚屽勾闄�
- calculateContractTerm();
- })
- } else {
- form.value.id = ''
- }
-
-}
-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
+ // 鎵撳紑寮规
+ 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 = "";
}
- if (dept.children && dept.children.length) {
- dept.children = filterDisabledDept(dept.children)
- }
- return true
- })
-}
+ };
+ onMounted(() => {
+ fetchPostOptions();
+ fetchDeptOptions();
+ });
-// 鎻愪氦浜у搧琛ㄥ崟
-const submitForm = () => {
- if (!form.value.sysPostId) {
- form.value.sysPostId = 0;
+ 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;
+ }
+ if (dept.children && dept.children.length) {
+ dept.children = filterDisabledDept(dept.children);
+ }
+ return true;
+ });
}
- 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();
- })
+
+ // 鎻愪氦浜у搧琛ㄥ崟
+ 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 {
- updateStaffOnJob(id.value, form.value).then(res => {
- proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
- closeDia();
- })
+ form.value.contractTerm = 0;
}
- }
- })
-}
-// 璁$畻鍚堝悓骞撮檺
-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;
- }
-};
+ };
-// 鍏抽棴寮规
-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>
\ No newline at end of file
--
Gitblit v1.9.3