From f9a9009a9ead99c731eccfbf66ca943fb601b9e2 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期四, 26 二月 2026 11:08:25 +0800
Subject: [PATCH] 湟水峡 1.人员模块代码迁移

---
 src/views/personnelManagement/employeeRecord/components/NewOrEditFormDia.vue |  373 +++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 373 insertions(+), 0 deletions(-)

diff --git a/src/views/personnelManagement/employeeRecord/components/NewOrEditFormDia.vue b/src/views/personnelManagement/employeeRecord/components/NewOrEditFormDia.vue
new file mode 100644
index 0000000..1c06a98
--- /dev/null
+++ b/src/views/personnelManagement/employeeRecord/components/NewOrEditFormDia.vue
@@ -0,0 +1,373 @@
+<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-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>
+          </el-col>
+          <el-col :span="12">
+            <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-select v-model="form.sex">
+                <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>
+          </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-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>
+          </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>
+          </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>
+          </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>
+          </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>
+          </el-col>
+          <el-col :span="12">
+            <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>
+          </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>
+          </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>
+          </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>
+          </el-col>
+        </el-row>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary"
+                     @click="submitForm">纭</el-button>
+          <el-button @click="closeDia">鍙栨秷</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</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"]);
+
+  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: "change" }],
+    },
+    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;
+      }
+      if (dept.children && dept.children.length) {
+        dept.children = filterDisabledDept(dept.children);
+      }
+      return true;
+    });
+  }
+
+  // 鎻愪氦浜у搧琛ㄥ崟
+  const submitForm = () => {
+    if (!form.value.sysPostId) {
+      form.value.sysPostId = undefined;
+    }
+    if (!form.value.sysDeptId) {
+      form.value.sysDeptId = undefined;
+    }
+    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;
+    }
+  };
+
+  // 鍏抽棴寮规
+  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