From 7fc325910b74e0426ffa2bad7f2daddf5eea114b Mon Sep 17 00:00:00 2001
From: luoyb <412940104@qq.com>
Date: 星期二, 23 九月 2025 10:57:00 +0800
Subject: [PATCH] 合同到期提醒模块

---
 src/views/remind/contract.vue |  553 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 553 insertions(+), 0 deletions(-)

diff --git a/src/views/remind/contract.vue b/src/views/remind/contract.vue
new file mode 100644
index 0000000..c05541b
--- /dev/null
+++ b/src/views/remind/contract.vue
@@ -0,0 +1,553 @@
+<template>
+  <div style="background-color: #fff;height: 100%;">
+    <el-container>
+      <el-header :height="headerHeight">
+        <el-row style="margin-bottom: 10px;">
+          <el-col :span="15">
+            <h3 class="bu-tian-jia-title">合同到期提醒</h3>
+          </el-col>
+        </el-row>
+      </el-header>
+      <el-main style="height: 85%;">
+        <el-row style="margin: 10px 0 10px 0;">
+          <el-col :span="24">
+            <el-button type="primary" class="hr-but-all" @click="showDcyg(0)">导出EXCEL</el-button>
+          </el-col>
+        </el-row>
+        <el-table
+          ref="multipleTable"
+          :data="contractList"
+          :cell-style="{padding:'7px 0','text-align':'center'}"
+          :header-cell-style="{'height':'5.3vh','background-color':'#e6e6e6','text-align':'center'}"
+          stripe
+          border
+          style="width: 100%;color: #000;"
+          @sort-change="changeSort"
+        >
+          <el-table-column show-overflow-tooltip fixed="left" label="操作" width="120">
+            <template v-slot="scope">
+              <span
+                style="color: #a00515;display: inline-block;width: 40%;cursor: pointer"
+                @click="goOn(scope.row)"
+              >续签</span>
+              <span
+                style="color: #a00515;display: inline-block;width: 40%;cursor: pointer"
+                @click="discontinue(scope.row)"
+              >不续签</span>
+            </template>
+          </el-table-column>
+          <el-table-column show-overflow-tooltip prop="empNumb" label="员工编号" />
+          <el-table-column show-overflow-tooltip prop="allDeptName" label="部门(护卫点)" width="300" />
+          <el-table-column show-overflow-tooltip prop="jobName" label="岗位" width="80" />
+          <el-table-column show-overflow-tooltip prop="empName" label="姓名" width="100" />
+          <el-table-column show-overflow-tooltip prop="certificateNumb" label="身份证号码" width="160" />
+          <el-table-column show-overflow-tooltip prop="signingDate" label="合同签订日期" width="110" />
+          <el-table-column show-overflow-tooltip prop="endDate" label="合同结束日期" width="110" />
+          <el-table-column show-overflow-tooltip prop="contractPeriod" label="合同期限(年)" width="110" />
+          <el-table-column show-overflow-tooltip prop="diffDay" label="到期提醒" width="120">
+            <template v-slot="scope">
+              <span v-if="scope.row.diffDay===0">到期</span>
+              <span v-else>{{ scope.row.diffDay }}天后到期</span>
+            </template>
+          </el-table-column>
+          <el-table-column show-overflow-tooltip prop="transactor" label="合同办理人" width="100" />
+          <el-table-column show-overflow-tooltip prop="remark" label="备注" width="160" />
+        </el-table>
+        <pagination
+          v-show="total>0"
+          style="text-align: right;width: 98%;"
+          :total="total"
+          :page.sync="pagination.num"
+          :limit.sync="pagination.size"
+          @pagination="search"
+        />
+      </el-main>
+    </el-container>
+    <el-dialog title="合同信息" :visible.sync="dialogShowContract" width="50%">
+      <el-form
+        ref="contractForm"
+        :model="contractForm"
+        :rules="contractRules"
+        label-position="right"
+        label-width="120px"
+      >
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="姓名" prop="empName">
+              <el-input v-model="contractForm.empName" />
+            </el-form-item>
+            <el-form-item label="身份证号码" prop="certificateNumb">
+              <el-input
+                v-model="contractForm.certificateNumb"
+              />
+            </el-form-item>
+            <el-form-item label="性别" this-emp-base-info-form="sex">
+              <el-select v-model="contractForm.sex" placeholder="请选择性别">
+                <el-option
+                  v-for="dict in sexOptions"
+                  :key="dict.dicItemCode"
+                  :label="dict.dicItemName"
+                  :value="dict.dicItemCode"
+                />
+              </el-select>
+            </el-form-item>
+            <el-form-item label="合同签订日期" prop="signingDate">
+              <el-date-picker
+                v-model="contractForm.signingDate"
+                value-format="yyyy-MM-dd"
+                type="date"
+                placeholder="选择日期"
+              />
+            </el-form-item>
+            <el-form-item label="合同状态" prop="contractStatus">
+              <el-select
+                v-model="contractForm.contractStatus"
+                placeholder="请选择合同状态"
+              >
+                <el-option
+                  v-for="dict in contractStatusOptions"
+                  :key="dict.dicItemCode"
+                  :label="dict.dicItemName"
+                  :value="dict.dicItemCode"
+                />
+              </el-select>
+            </el-form-item>
+            <el-form-item label="合同办理人" prop="transactor">
+              <el-input v-model="contractForm.transactor" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="员工编号" prop="empNumb">
+              <el-input v-model="contractForm.empNumb" />
+            </el-form-item>
+            <el-form-item label="部门(护卫点)" prop="allDeptName">
+              <el-input v-model="contractForm.allDeptName" />
+            </el-form-item>
+            <el-form-item label="岗位" prop="jobName">
+              <el-input v-model="contractForm.jobName" />
+            </el-form-item>
+            <el-form-item label="合同结束日期" prop="endDate">
+              <el-date-picker
+                v-model="contractForm.endDate"
+                value-format="yyyy-MM-dd"
+                type="date"
+                placeholder="选择日期"
+              />
+            </el-form-item>
+            <el-form-item label="合同期限(年)" prop="contractPeriod">
+              <el-input v-model="contractForm.contractPeriod" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="24">
+            <el-form-item label="备注" prop="remark">
+              <el-input v-model="contractForm.remark" type="textarea" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="putContractInfo('contractForm')">保 存</el-button>
+        <el-button @click="dialogIsShow()">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+<script>
+import Pagination from '@/components/Pagination'
+import '@riophae/vue-treeselect/dist/vue-treeselect.css'
+import { dateDifference } from '@/utils/myUtil'
+
+export default {
+  components: {
+    Pagination
+  },
+  data() {
+    return {
+      dialog: {
+        isVisible: false,
+        title: '',
+        type: ''
+      },
+      sort: {},
+      // 总数量
+      total: 0,
+      // 查询参数
+      queryParams: {
+        baseKey: ''
+      },
+      // 分页参数
+      pagination: {
+        size: 15,
+        num: 1
+      },
+      headerHeight: '30px',
+      // 合同列表
+      contractList: [],
+      // 合同信息
+      contractForm: {
+        contractId: '',
+        empId: '',
+        empNumb: '',
+        empName: '',
+        certificateNumb: '',
+        sex: '',
+        sexName: '',
+        deptId: '',
+        deptName: '',
+        allDeptName: '',
+        JobId: '',
+        jobName: '',
+        beginDate: '',
+        endDate: '',
+        contractStatus: '',
+        contractPeriod: '',
+        transactor: '',
+        signingDate: '',
+        remark: '',
+        createTime: '',
+        creator: '',
+        modifyTime: '',
+        modifier: '',
+        delFlag: '',
+        empStatus: 0,
+        version: '',
+        diffDay: 0
+      },
+      sexOptions: [],
+      contractStatusOptions: [],
+      dialogShowContract: false,
+      contractRules: {
+        empName: [{ required: true, message: '请选择员工', trigger: 'change' }],
+        signingDate: [{ required: true, validator: this.startDate }],
+        contractStatus: [{ required: true, message: '请选择合同状态', trigger: 'change' }],
+        transactor: [{ max: 40, message: '长度不超过40个字符', trigger: 'blur' }],
+        beginDate: [{ required: true, message: '请选择合同开始日期', trigger: 'change' }],
+        endDate: [{ required: true, validator: this.endDate }],
+        remark: [{ max: 512, message: '长度不超过512个字符', trigger: 'blur' }]
+      }
+    }
+  },
+  mounted() {
+    this.fetch()
+    this.getDicts('sex').then(response => {
+      this.sexOptions = response.data
+    })
+    this.getDicts('CONTRACTSTATUS').then(response => {
+      this.contractStatusOptions = response.data
+    })
+  },
+  methods: {
+    search() {
+      this.queryParams.baseKey = ''
+      this.fetch({
+        ...this.queryParams,
+        ...this.sort
+      })
+    },
+    fetch(params = {}) {
+      const that = this
+      params.pageSize = this.pagination.size
+      params.pageNum = this.pagination.num
+      params.delFlag = 0
+      params.empStatus = 0
+
+      this.$get('hr/empContractInfo/remind/list', {
+        ...params
+      }).then((r) => {
+        const data = r.data.data
+        that.total = data.total
+        that.contractList = data.rows
+      })
+    },
+    changeSort(val) {
+      this.sort.field = val.prop
+      this.sort.order = val.order
+      this.fetch()
+    },
+    // 续签合同
+    goOn(row) {
+      this.initContractData(row)
+      this.dialogShowContract = true
+    },
+    dialogIsShow() {
+      this.dialogShowContract = false
+    },
+    // 不续签合同
+    discontinue(val) {
+      this.initContractData(val)
+      this.$post('hr/empContractInfo/remind/not', { ...this.contractForm }).then(() => {
+        this.buttonLoading = false
+        this.$message({
+          message: this.$t('tips.updateSuccess'),
+          type: 'success'
+        })
+        this.cleanContractData()
+        this.fetch()
+      })
+    },
+    // 初始化续签合同信息
+    initContractData(val) {
+      this.cleanContractData()
+      this.contractForm.contractId = val.contractId
+      this.contractForm.empId = val.empId
+      this.contractForm.empNumb = val.empNumb
+      this.contractForm.empName = val.empName
+      this.contractForm.certificateNumb = val.certificateNumb
+      this.contractForm.sex = val.sex
+      this.contractForm.deptId = val.deptId
+      this.contractForm.deptName = val.deptName
+      this.contractForm.allDeptName = val.allDeptName
+      this.contractForm.JobId = val.JobId
+      this.contractForm.jobName = val.jobName
+      this.contractForm.contractStatus = '2'
+    },
+    // 清除续签合同信息
+    cleanContractData() {
+      this.contractForm.contractId = ''
+      this.contractForm.empId = ''
+      this.contractForm.empNumb = ''
+      this.contractForm.empName = ''
+      this.contractForm.certificateNumb = ''
+      this.contractForm.sex = ''
+      this.contractForm.deptId = ''
+      this.contractForm.deptName = ''
+      this.contractForm.allDeptName = ''
+      this.contractForm.JobId = ''
+      this.contractForm.jobName = ''
+      this.contractForm.contractStatus = ''
+      this.contractForm.beginDate = ''
+      this.contractForm.endDate = ''
+      this.contractForm.contractPeriod = 0
+      this.contractForm.remark = ''
+      this.contractForm.transactor = ''
+    },
+    // 验证合同签订日期
+    startDate(rule, value, callback) {
+      // 如果结束日期没选,cb
+      if (!this.contractForm.endDate) {
+        callback()
+      } else {
+        // 结束日期有,进行判断
+        if (this.compareDate(value, this.contractForm.endDate)) {
+          // 如果起始在结束之前
+          callback()
+        } else {
+          callback(new Error('开始日期不能在结束日期之后,请重新选择'))
+        }
+      }
+    },
+    // 验证合同结束日期
+    endDate(rule, value, callback) {
+      // 如果起始日期没选,cb
+      if (!this.contractForm.signingDate) {
+        callback()
+      } else {
+        // 起始日期有,进行判断
+        if (this.compareDate(this.contractForm.signingDate, value)) {
+          // 如果起始在结束之前
+          this.contractForm.contractPeriod = dateDifference(this.contractForm.signingDate, this.contractForm.endDate, 'o')
+          callback()
+        } else {
+          callback(new Error('结束日期不能在开始始日期之前,请重新选择'))
+        }
+      }
+    },
+    compareDate(start, end) {
+      return new Date(end).getTime() > new Date(start).getTime()
+    },
+    // 续签合同提交
+    putContractInfo(formName) {
+      this.$refs[formName].validate((valid) => {
+        if (valid) {
+          this.$post('hr/empContractInfo/remind/continue', { ...this.contractForm }).then(() => {
+            this.buttonLoading = false
+            this.$message({
+              message: this.$t('tips.createSuccess'),
+              type: 'success'
+            })
+
+            this.cleanContractData()
+            this.fetch()
+            this.dialogIsShow()
+          })
+        }
+      })
+    }
+  }
+}
+
+</script>
+<style lang="scss">
+.zzyg-table {
+  .el-table th, .el-table td {
+    padding: 7px 0;
+  }
+}
+
+.fj-checkbox {
+  .el-checkbox__input.is-checked .el-checkbox__inner {
+    border-color: #a32c30;;
+    background: #a32c30;;
+  }
+
+  .el-checkbox__label {
+    color: #000 !important;
+  }
+}
+</style>
+<style lang="scss" scoped>
+.baseinfo .el-container {
+  .el-aside {
+    background-color: #fff;
+  }
+
+  .el-main {
+    background-color: #fff;
+  }
+
+}
+
+.el-main {
+  height: 600px;
+}
+
+.el-autocomplete {
+  width: 100%;
+}
+
+.el-select {
+  width: 100%;
+}
+
+.el-aside {
+  padding: 20px;
+  background: #f3f5f8;
+  height: 600px;
+
+  .el-tree {
+    height: 100%;
+  }
+}
+
+.searchTable {
+  margin-top: 10px;
+  border-collapse: collapse;
+  width: 100%;
+
+  tr {
+    border-bottom: 1px dashed #d9dadb;
+  }
+
+  .td {
+    width: 90px;
+    text-align: right;
+  }
+
+  .td-group {
+    padding-left: 20px;
+  }
+}
+
+.searchTable td,
+.searchTable th {
+  color: #000;
+  height: 50px;
+  background-color: #fff;
+}
+
+#ygxq table {
+  border-collapse: collapse;
+  margin: 0 auto;
+  text-align: center;
+  width: 100%;
+  margin-top: 20px;
+}
+
+#ygxq table td,
+#ygxq table th {
+  border: 1px solid #DDDCDC;
+  color: #666;
+  height: 30px;
+}
+
+#ygxq table thead th {
+  background-color: #CCE8EB;
+  width: 100px;
+}
+
+#ygxq table tr:nth-child(odd) {
+  background: #fff;
+}
+
+#ygxq table tr:nth-child(even) {
+  background: #F5FAFA;
+}
+
+.tdTitle {
+  font-size: 14px;
+  font-weight: 700;
+  text-align: left;
+}
+
+.link_button {
+  color: #169BD5;
+}
+
+.del_button {
+  color: #D9001B;
+}
+
+#dcygTable {
+  border-collapse: collapse;
+
+  tr {
+    width: 100%;
+    border-bottom: 1px dashed #ccc;
+
+    > td:nth-child(even) {
+      width: 100px;
+      text-align: left;
+    }
+  }
+
+}
+
+#dcygTable td {
+  width: 160px;
+  text-align: center;
+  height: 35px;
+  line-height: 35px;
+  font-size: 15px;
+  font-weight: 400;
+}
+
+.search-btn {
+  display: inline-block;
+  width: 3.64vw;
+  height: 3.2vh;
+  line-height: 3.2vh;
+  text-align: center;
+  background-color: #a00515;
+  color: #fff;
+  margin-left: 1vw;
+  box-sizing: border-box;
+  cursor: pointer;
+  vertical-align: middle;
+}
+
+.sup-search-btn {
+  display: inline-block;
+  width: 5.2vw;
+  height: 3.2vh;
+  line-height: 3.2vh;
+  text-align: center;
+  margin-left: 1vw;
+  color: #a00515;
+  border: 1px solid #a00515;
+  box-sizing: border-box;
+  cursor: pointer;
+  vertical-align: middle;
+}
+</style>

--
Gitblit v1.8.0