From 350b540485669e9f5e5a91c1be8bb4a37ef98841 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期四, 20 八月 2026 15:04:19 +0800
Subject: [PATCH] 天津-阳光彩印 1.员工合同编辑页面自动带出员工关联基础信息 2.合同到期提前45 天系统弹窗提醒,到期预警天数固定 45 天

---
 src/views/personnelManagement/contractManagement/components/formDia.vue |   23 +++
 src/views/personnelManagement/employeeRecord/index.vue                  |   16 +-
 src/views/personnelManagement/contractManagement/index.vue              |   66 ++++++++++
 src/views/personnelManagement/employeeRecord/components/Show.vue        |  213 +++++++++++++++++++++++++++++------
 4 files changed, 268 insertions(+), 50 deletions(-)

diff --git a/src/views/personnelManagement/contractManagement/components/formDia.vue b/src/views/personnelManagement/contractManagement/components/formDia.vue
index 49a680d..24b44ff 100644
--- a/src/views/personnelManagement/contractManagement/components/formDia.vue
+++ b/src/views/personnelManagement/contractManagement/components/formDia.vue
@@ -6,12 +6,24 @@
         width="70%"
         @close="closeDia"
     >
+      <el-descriptions title="鍩烘湰淇℃伅" :column="3" border style="margin-bottom: 16px;">
+        <el-descriptions-item label="濮撳悕">{{ currentRow.staffName }}</el-descriptions-item>
+        <el-descriptions-item label="鍛樺伐缂栧彿">{{ currentRow.staffNo }}</el-descriptions-item>
+        <el-descriptions-item label="鎬у埆">{{ currentRow.sex }}</el-descriptions-item>
+        <el-descriptions-item label="骞撮緞">{{ currentRow.age }}</el-descriptions-item>
+        <el-descriptions-item label="鑱旂郴鐢佃瘽">{{ currentRow.phone }}</el-descriptions-item>
+        <el-descriptions-item label="鐘舵��">{{ formatStaffState(currentRow.staffState) }}</el-descriptions-item>
+        <el-descriptions-item label="鎴风睄浣忓潃" :span="2">{{ currentRow.nativePlace }}</el-descriptions-item>
+        <el-descriptions-item label="绱ф�ヨ仈绯讳汉">{{ currentRow.emergencyContact }}</el-descriptions-item>
+        <el-descriptions-item label="绱ф�ヨ仈绯讳汉鐢佃瘽">{{ currentRow.emergencyContactPhone }}</el-descriptions-item>
+        <el-descriptions-item label="鍚堝悓缁撴潫鏃ユ湡">{{ currentRow.contractExpireTime }}</el-descriptions-item>
+      </el-descriptions>
       <PIMTable
           rowKey="id"
           :column="tableColumn"
           :tableData="tableData"
           :tableLoading="tableLoading"
-          height="600"
+          height="360"
       ></PIMTable>
       <template #footer>
         <div class="dialog-footer">
@@ -32,6 +44,7 @@
 const filesDia = ref()
 const dialogFormVisible = ref(false);
 const operationType = ref('')
+const currentRow = ref({})
 const tableColumn = ref([
   {
     label: "鍚堝悓骞撮檺",
@@ -65,9 +78,17 @@
 const tableData = ref([]);
 const tableLoading = ref(false);
 
+// 鐘舵�佹牸寮忓寲
+const formatStaffState = (state) => {
+  if (state == 0) return "绂昏亴";
+  if (state == 1) return "鍦ㄨ亴";
+  return "-";
+};
+
 // 鎵撳紑寮规
 const openDialog = (type, row) => {
   operationType.value = type;
+  currentRow.value = row || {};
   dialogFormVisible.value = true;
   if (operationType.value === 'edit') {
     findStaffContractListPage({staffOnJobId: row.id}).then(res => {
diff --git a/src/views/personnelManagement/contractManagement/index.vue b/src/views/personnelManagement/contractManagement/index.vue
index d947c5b..2f8fdee 100644
--- a/src/views/personnelManagement/contractManagement/index.vue
+++ b/src/views/personnelManagement/contractManagement/index.vue
@@ -66,6 +66,34 @@
       </template>
     </el-dialog>
     <files-dia ref="filesDia"></files-dia>
+
+    <!-- 鍚堝悓鍒版湡鎻愰啋寮圭獥 -->
+    <el-dialog
+      v-model="expireWarningVisible"
+      title="鍚堝悓鍒版湡鎻愰啋"
+      width="720px"
+      @close="expireWarningVisible = false"
+    >
+      <div style="margin-bottom: 12px; color: #e6a23c; font-size: 14px;">
+        浠ヤ笅鍛樺伐鍚堝悓灏嗗湪 {{ EXPIRE_WARNING_DAYS }} 澶╁唴鍒版湡锛岃鍙婃椂澶勭悊锛�
+      </div>
+      <el-table :data="expireWarningList" border max-height="400">
+        <el-table-column label="濮撳悕" prop="staffName" align="center" />
+        <el-table-column label="鍛樺伐缂栧彿" prop="staffNo" align="center" />
+        <el-table-column label="鑱旂郴鐢佃瘽" prop="phone" align="center" />
+        <el-table-column label="鍚堝悓缁撴潫鏃ユ湡" prop="contractExpireTime" align="center" width="140" />
+        <el-table-column label="鍓╀綑澶╂暟" align="center" width="120">
+          <template #default="scope">
+            <el-tag :type="scope.row.expireDays < 0 ? 'danger' : 'warning'">
+              {{ formatExpireDays(scope.row.expireDays) }}
+            </el-tag>
+          </template>
+        </el-table-column>
+      </el-table>
+      <template #footer>
+        <el-button type="primary" @click="expireWarningVisible = false">鐭ラ亾浜�</el-button>
+      </template>
+    </el-dialog>
   </div>
 </template>
 
@@ -207,6 +235,12 @@
 const formDia = ref()
 const { proxy } = getCurrentInstance()
 
+// 鍚堝悓鍒版湡棰勮澶╂暟锛堝浐瀹� 45 澶╋級
+const EXPIRE_WARNING_DAYS = 45
+// 鍚堝悓鍒版湡鎻愰啋寮圭獥
+const expireWarningVisible = ref(false)
+const expireWarningList = ref([])
+
 const changeDaterange = (value) => {
   searchForm.value.entryDateStart = undefined;
   searchForm.value.entryDateEnd = undefined;
@@ -239,13 +273,41 @@
   const params = { ...searchForm.value, ...page };
   params.entryDate = undefined
   params.staffState = 1
-  staffOnJobListPage(params).then(res => {
+  return staffOnJobListPage(params).then(res => {
     tableLoading.value = false;
     tableData.value = res.data.records
     page.total = res.data.total;
   }).catch(err => {
     tableLoading.value = false;
   })
+};
+
+// 妫�鏌ュ悎鍚屽埌鏈熸彁閱掞紙45 澶╁唴鍒版湡锛�
+const checkContractExpireWarning = () => {
+  const today = dayjs().startOf('day');
+  const list = (tableData.value || [])
+    .filter(item => {
+      if (!item.contractExpireTime) return false;
+      const expireDay = dayjs(item.contractExpireTime);
+      if (!expireDay.isValid()) return false;
+      const diffDays = expireDay.diff(today, 'day');
+      return diffDays <= EXPIRE_WARNING_DAYS;
+    })
+    .map(item => ({
+      ...item,
+      expireDays: dayjs(item.contractExpireTime).diff(today, 'day'),
+    }));
+  if (list.length > 0) {
+    expireWarningList.value = list;
+    expireWarningVisible.value = true;
+  }
+};
+
+// 鍓╀綑澶╂暟鏍煎紡鍖�
+const formatExpireDays = (days) => {
+  if (days < 0) return `宸茶繃鏈� ${Math.abs(days)} 澶ー;
+  if (days === 0) return "浠婂ぉ鍒版湡";
+  return `鍓╀綑 ${days} 澶ー;
 };
 // 琛ㄦ牸閫夋嫨鏁版嵁
 const handleSelectionChange = (selection) => {
@@ -308,7 +370,7 @@
   getList();
 };
 onMounted(() => {
-  getList();
+  getList().then(() => checkContractExpireWarning());
 });
 </script>
 
diff --git a/src/views/personnelManagement/employeeRecord/components/Show.vue b/src/views/personnelManagement/employeeRecord/components/Show.vue
index 9220d45..1f5211b 100644
--- a/src/views/personnelManagement/employeeRecord/components/Show.vue
+++ b/src/views/personnelManagement/employeeRecord/components/Show.vue
@@ -2,20 +2,131 @@
   <div>
     <el-dialog
         v-model="dialogFormVisible"
-        title="璇︽儏"
-        width="70%"
+        title="鍛樺伐璇︽儏"
+        width="80%"
+        top="5vh"
         @close="closeDia"
     >
-      <PIMTable
-          rowKey="id"
-          :column="tableColumn"
-          :tableData="tableData"
-          :tableLoading="tableLoading"
-          height="600"
-      ></PIMTable>
+      <div v-loading="loading" class="detail-body">
+        <!-- 鍩烘湰淇℃伅 -->
+        <el-card shadow="never" class="detail-card">
+          <template #header>
+            <span class="card-title">
+              <span class="card-title-line">|</span>
+              鍩烘湰淇℃伅
+            </span>
+          </template>
+          <el-descriptions :column="4" border>
+            <el-descriptions-item label="鍛樺伐缂栧彿">{{ detail.staffNo || '-' }}</el-descriptions-item>
+            <el-descriptions-item label="濮撳悕">{{ detail.staffName || '-' }}</el-descriptions-item>
+            <el-descriptions-item label="鍒悕">{{ detail.alias || '-' }}</el-descriptions-item>
+            <el-descriptions-item label="鎬у埆">{{ detail.sex || '-' }}</el-descriptions-item>
+            <el-descriptions-item label="鎵嬫満">{{ detail.phone || '-' }}</el-descriptions-item>
+            <el-descriptions-item label="鍑虹敓鏃ユ湡">{{ detail.birthDate || '-' }}</el-descriptions-item>
+            <el-descriptions-item label="骞撮緞">{{ detail.age ?? '-' }}</el-descriptions-item>
+            <el-descriptions-item label="绫嶈疮">{{ detail.nativePlace || '-' }}</el-descriptions-item>
+            <el-descriptions-item label="姘戞棌">{{ detail.nation || '-' }}</el-descriptions-item>
+            <el-descriptions-item label="濠氬Щ鐘跺喌">{{ detail.maritalStatus || '-' }}</el-descriptions-item>
+            <el-descriptions-item label="鏀挎不闈㈣矊">{{ detail.politicalStatus || '-' }}</el-descriptions-item>
+            <el-descriptions-item label="韬唤璇佸彿">{{ detail.idCardNo || '-' }}</el-descriptions-item>
+            <el-descriptions-item label="鎴峰彛绫诲瀷">{{ detail.hukouType || '-' }}</el-descriptions-item>
+            <el-descriptions-item label="閭">{{ detail.email || '-' }}</el-descriptions-item>
+            <el-descriptions-item label="鐜颁綇鍧�" :span="2">{{ detail.currentAddress || '-' }}</el-descriptions-item>
+            <el-descriptions-item label="閫氳鍦板潃" :span="2">{{ detail.contactAddress || '-' }}</el-descriptions-item>
+          </el-descriptions>
+        </el-card>
+
+        <!-- 鍦ㄨ亴淇℃伅 -->
+        <el-card shadow="never" class="detail-card">
+          <template #header>
+            <span class="card-title">
+              <span class="card-title-line">|</span>
+              鍦ㄨ亴淇℃伅
+            </span>
+          </template>
+          <el-descriptions :column="4" border>
+            <el-descriptions-item label="鍏ヨ亴鏃ユ湡">{{ detail.contractStartTime || '-' }}</el-descriptions-item>
+            <el-descriptions-item label="鍚堝悓缁撴潫鏃ユ湡">{{ detail.contractEndTime || '-' }}</el-descriptions-item>
+            <el-descriptions-item label="璇曠敤鏈燂紙鏈堬級">{{ detail.proTerm ?? '-' }}</el-descriptions-item>
+            <el-descriptions-item label="杞鏃ユ湡">{{ detail.positiveDate || '-' }}</el-descriptions-item>
+            <el-descriptions-item label="閮ㄩ棬">{{ detail.deptName || detail.sysDeptId || '-' }}</el-descriptions-item>
+            <el-descriptions-item label="宀椾綅">{{ detail.postName || detail.sysPostId || '-' }}</el-descriptions-item>
+            <el-descriptions-item label="鍩烘湰宸ヨ祫">{{ detail.basicSalary ?? '-' }}</el-descriptions-item>
+            <el-descriptions-item label="鍛樺伐鐘舵��">{{ formatStaffState(detail.staffState) }}</el-descriptions-item>
+          </el-descriptions>
+        </el-card>
+
+        <!-- 閾惰鍗′俊鎭� -->
+        <el-card shadow="never" class="detail-card">
+          <template #header>
+            <span class="card-title">
+              <span class="card-title-line">|</span>
+              閾惰鍗′俊鎭�
+            </span>
+          </template>
+          <el-descriptions :column="2" border>
+            <el-descriptions-item label="寮�鎴疯">{{ detail.bankName || '-' }}</el-descriptions-item>
+            <el-descriptions-item label="閾惰鍗″彿">{{ detail.bankCardNo || '-' }}</el-descriptions-item>
+          </el-descriptions>
+        </el-card>
+
+        <!-- 鏁欒偛缁忓巻 -->
+        <el-card shadow="never" class="detail-card">
+          <template #header>
+            <span class="card-title">
+              <span class="card-title-line">|</span>
+              鏁欒偛缁忓巻
+            </span>
+          </template>
+          <el-table :data="detail.staffEducationList || []" border>
+            <el-table-column label="瀛﹀巻" align="center">
+              <template #default="{ row }">{{ formatEducation(row.education) }}</template>
+            </el-table-column>
+            <el-table-column label="姣曚笟闄㈡牎" prop="schoolName" align="center" />
+            <el-table-column label="鍏ュ鏃堕棿" prop="enrollTime" align="center" />
+            <el-table-column label="姣曚笟鏃堕棿" prop="graduateTime" align="center" />
+            <el-table-column label="涓撲笟" prop="major" align="center" />
+            <el-table-column label="瀛︿綅" prop="degree" align="center" />
+          </el-table>
+        </el-card>
+
+        <!-- 宸ヤ綔缁忓巻 -->
+        <el-card shadow="never" class="detail-card">
+          <template #header>
+            <span class="card-title">
+              <span class="card-title-line">|</span>
+              宸ヤ綔缁忓巻
+            </span>
+          </template>
+          <el-table :data="detail.staffWorkExperienceList || []" border>
+            <el-table-column label="鍓嶅叕鍙�" prop="formerCompany" align="center" />
+            <el-table-column label="鍓嶅叕鍙搁儴闂�" prop="formerDept" align="center" />
+            <el-table-column label="鍓嶅叕鍙歌亴浣�" prop="formerPosition" align="center" />
+            <el-table-column label="寮�濮嬫棩鏈�" prop="startDate" align="center" />
+            <el-table-column label="缁撴潫鏃ユ湡" prop="endDate" align="center" />
+            <el-table-column label="宸ヤ綔鎻忚堪" prop="workDesc" align="center" />
+          </el-table>
+        </el-card>
+
+        <!-- 绱ф�ヨ仈绯讳汉 -->
+        <el-card shadow="never" class="detail-card">
+          <template #header>
+            <span class="card-title">
+              <span class="card-title-line">|</span>
+              绱ф�ヨ仈绯讳汉
+            </span>
+          </template>
+          <el-table :data="detail.staffEmergencyContactList || []" border>
+            <el-table-column label="濮撳悕" prop="contactName" align="center" />
+            <el-table-column label="鍏崇郴" prop="contactRelation" align="center" />
+            <el-table-column label="鎵嬫満" prop="contactPhone" align="center" />
+            <el-table-column label="浣忓潃" prop="contactAddress" align="center" />
+          </el-table>
+        </el-card>
+      </div>
       <template #footer>
         <div class="dialog-footer">
-          <el-button @click="closeDia">鍙栨秷</el-button>
+          <el-button @click="closeDia">鍏抽棴</el-button>
         </div>
       </template>
     </el-dialog>
@@ -23,51 +134,75 @@
 </template>
 
 <script setup>
-import {ref} from "vue";
-import {staffOnJobInfo} from "@/api/personnelManagement/staffOnJob.js";
-const { proxy } = getCurrentInstance()
-const emit = defineEmits(['close'])
+import { ref } from "vue";
+import { staffOnJobInfo } from "@/api/personnelManagement/staffOnJob.js";
+
+const emit = defineEmits(["close"]);
 
 const dialogFormVisible = ref(false);
-const operationType = ref('')
-const tableColumn = ref([
-  // {
-  //   label: "鍚堝悓骞撮檺",
-  //   prop: "contractTerm",
-  // },
-  {
-    label: "鍚堝悓寮�濮嬫棩鏈�",
-    prop: "contractStartTime",
-  },
-  {
-    label: "鍚堝悓缁撴潫鏃ユ湡",
-    prop: "contractEndTime",
-  },
-]);
-const tableData = ref([]);
-const tableLoading = ref(false);
+const loading = ref(false);
+const detail = ref({});
+
+const educationMap = {
+  secondary: "涓笓鍙婁互涓�",
+  junior_college: "澶т笓",
+  bachelor: "鏈",
+  master: "纭曞+",
+  doctor: "鍗氬+鍙婁互涓�",
+};
+
+const formatEducation = (v) => educationMap[v] || v || "-";
+
+const formatStaffState = (v) => {
+  if (v == 0) return "绂昏亴";
+  if (v == 1) return "鍦ㄨ亴";
+  return "-";
+};
 
 // 鎵撳紑寮规
 const openDialog = (type, row) => {
-  operationType.value = type;
+  detail.value = {};
   dialogFormVisible.value = true;
-  if (operationType.value === 'edit') {
-    staffOnJobInfo({staffNo: row.staffNo}).then(res => {
-      tableData.value = res.data
-    })
+  if (row?.id) {
+    loading.value = true;
+    staffOnJobInfo(row.id, {})
+      .then((res) => {
+        detail.value = res.data || {};
+      })
+      .finally(() => {
+        loading.value = false;
+      });
   }
-}
+};
 
 // 鍏抽棴寮规
 const closeDia = () => {
   dialogFormVisible.value = false;
-  emit('close')
+  emit("close");
 };
+
 defineExpose({
   openDialog,
 });
 </script>
 
 <style scoped>
+.detail-body {
+  max-height: 70vh;
+  overflow-y: auto;
+  padding: 4px;
+}
 
-</style>
\ No newline at end of file
+.detail-card {
+  margin-bottom: 16px;
+}
+
+.card-title {
+  font-weight: 600;
+}
+
+.card-title-line {
+  color: #f56c6c;
+  margin-right: 4px;
+}
+</style>
diff --git a/src/views/personnelManagement/employeeRecord/index.vue b/src/views/personnelManagement/employeeRecord/index.vue
index c88336a..0285f4d 100644
--- a/src/views/personnelManagement/employeeRecord/index.vue
+++ b/src/views/personnelManagement/employeeRecord/index.vue
@@ -153,8 +153,15 @@
     label: "鎿嶄綔",
     align: "center",
     fixed: 'right',
-    width: 180,
+    width: 200,
     operation: [
+      {
+        name: "璇︽儏",
+        type: "text",
+        clickFun: (row) => {
+          openForm("edit", row);
+        },
+      },
       {
         name: "缂栬緫",
         type: "text",
@@ -171,13 +178,6 @@
           id.value = row.id;
         },
       },
-      // {
-      //   name: "璇︽儏",
-      //   type: "text",
-      //   clickFun: (row) => {
-      //     openForm("edit", row);
-      //   },
-      // },
     ],
   },
 ]);

--
Gitblit v1.9.3