From 14d29f928b24d203e76f1dcefc1a51182657cd45 Mon Sep 17 00:00:00 2001
From: spring <2396852758@qq.com>
Date: 星期一, 10 三月 2025 16:29:09 +0800
Subject: [PATCH] Merge branch 'dev' of http://114.132.189.42:9002/r/center-lims-before-ruoyi into dev

---
 src/views/CNAS/personnel/personnelInfo/Department/components/rewardPunishmentRecord/index.vue |  316 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 316 insertions(+), 0 deletions(-)

diff --git a/src/views/CNAS/personnel/personnelInfo/Department/components/rewardPunishmentRecord/index.vue b/src/views/CNAS/personnel/personnelInfo/Department/components/rewardPunishmentRecord/index.vue
new file mode 100644
index 0000000..a9e1122
--- /dev/null
+++ b/src/views/CNAS/personnel/personnelInfo/Department/components/rewardPunishmentRecord/index.vue
@@ -0,0 +1,316 @@
+<!-- 濂栨儵璁板綍 -->
+<template>
+  <div>
+    <div style="text-align: left; margin-bottom: 15px;">
+      <label>濮撳悕</label>
+      <el-input v-model="search.userName" clearable placeholder="璇疯緭鍏ュ叧閿瓧" size="small" style="width: 20vh;"></el-input>
+      <label style="margin-left: 1em">濂栨儵鏃ユ湡</label>
+      <el-date-picker v-model="search.searchTimeList" :picker-options="pickerOptions" align="right" clearable
+        end-placeholder="缁撴潫鏃ユ湡" format="yyyy-MM-dd" range-separator="鑷�" size="small" start-placeholder="寮�濮嬫棩鏈�"
+        style="width: 20%" type="daterange" unlink-panels value-format="yyyy-MM-dd 00:00:00">
+      </el-date-picker>
+      <el-button size="small" type="primary" @click="getPersonnelTraining(departId)">鏌ヨ</el-button>
+      <div style="float: right;">
+        <el-button :loading="outLoading" size="small" type="primary" @click="handleDown">瀵煎嚭</el-button>
+        <el-button size="small" type="primary" @click="dialogVisible = true">鏂板</el-button>
+      </div>
+    </div>
+    <div class="table">
+      <el-table :data="tableData" height="70vh" style="width: 100%">
+        <el-table-column label="搴忓彿" type="index" width="120">
+          <template v-slot="scope">
+            <span>{{ (search.current - 1) * search.size + scope.$index + 1 }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="鍛樺伐缂栧彿" min-width="180" prop="account">
+        </el-table-column>
+        <el-table-column label="濮撳悕" min-width="180" prop="userName">
+        </el-table-column>
+        <el-table-column label="濂栨儵绾у埆" min-width="180" prop="rewardPunishLevel">
+        </el-table-column>
+        <el-table-column label="濂栨儵鏃堕棿" min-width="180" prop="rewardPunishTime">
+        </el-table-column>
+        <el-table-column label="濂栨儵鍚嶇О" min-width="180" prop="rewardPunishName">
+        </el-table-column>
+        <el-table-column label="濂栨儵鍏蜂綋鍐呭" min-width="120" prop="rewardPunishContent">
+        </el-table-column>
+        <el-table-column label="濂栨儵鍗曚綅" min-width="180" prop="rewardPunishWorkUnit">
+        </el-table-column>
+        <el-table-column label="鍒涘缓浜�" min-width="180" prop="createUserName">
+        </el-table-column>
+        <el-table-column fixed="right" label="鎿嶄綔" width="100">
+          <template v-slot="scope">
+            <el-button size="small" type="text" @click="editForm(scope.row)">缂栬緫</el-button>
+            <el-button size="small" type="text" @click="deleteRow(scope.row)">鍒犻櫎</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <el-pagination :current-page="1" :page-size="search.size" :page-sizes="[10, 20, 30, 50, 100]"
+        :total="search.total" layout="->,total, sizes, prev, pager, next, jumper" @size-change="handleSizeChange"
+        @current-change="handleCurrentChange">
+      </el-pagination>
+    </div>
+    <el-dialog :visible.sync="dialogVisible" title="鎻愮ず" width="50%" @open="getUserList">
+      <div style="height: 40vh">
+        <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+          <el-col :span="12">
+            <el-form-item label="鍛樺伐缂栧彿">
+              <el-input v-model="form.account" disabled size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="鍛樺伐濮撳悕" prop="userName">
+              <el-select v-model="form.userName" placeholder="璇烽�夋嫨" size="small" style="width: 100%" value-key="id"
+                @change="selectUserChange">
+                <el-option v-for="item in responsibleOptions" :key="item.id" :label="item.name" :value="item">
+                </el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="濂栨儵绾у埆" prop="rewardPunishLevel">
+              <el-input v-model="form.rewardPunishLevel" size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="濂栨儵鍚嶇О" prop="rewardPunishName">
+              <el-input v-model="form.rewardPunishName" size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="濂栨儵鏃堕棿" prop="rewardPunishTime">
+              <el-date-picker v-model="form.rewardPunishTime" format="yyyy-MM-dd HH:mm:ss" placeholder="閫夋嫨鏃ユ湡"
+                size="small" style="width: 100%" type="datetime" value-format="yyyy-MM-dd HH:mm:ss">
+              </el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="濂栨儵鍗曚綅" prop="rewardPunishWorkUnit">
+              <el-input v-model="form.rewardPunishWorkUnit" size="small"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="濂栨儵鍐呭">
+              <el-input v-model="form.rewardPunishContent" :rows="2" size="small" type="textarea"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-form>
+      </div>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="dialogVisible = false">鍙� 娑�</el-button>
+        <el-button type="primary" @click="saveOrUpdate">纭� 瀹�</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  deleteRewardPunishment,
+  addOrUpdateRewardPunishment,
+  rewardPunishmentPage
+} from '@/api/cnas/personnel/personnelInfo.js'
+export default {
+  props: {
+    departId: {
+      type: Number,
+      default: () => {
+        return null;
+      }
+    },
+    isDepartment: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data() {
+    return {
+      tableData: [],
+      search: {
+        size: 20,
+        current: 1,
+        total: 0,
+        userName: '',
+        searchTimeList: []
+      },
+      form: {},
+      dialogVisible: false,
+      outLoading: false,
+      pickerOptions: {
+        shortcuts: [{
+          text: '鏈�杩戜竴鍛�',
+          onClick(picker) {
+            const end = new Date();
+            const start = new Date();
+            start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
+            picker.$emit('pick', [start, end]);
+          }
+        }, {
+          text: '鏈�杩戜竴涓湀',
+          onClick(picker) {
+            const end = new Date();
+            const start = new Date();
+            start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
+            picker.$emit('pick', [start, end]);
+          }
+        }, {
+          text: '鏈�杩戜笁涓湀',
+          onClick(picker) {
+            const end = new Date();
+            const start = new Date();
+            start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
+            picker.$emit('pick', [start, end]);
+          }
+        }]
+      },
+      rules: {
+        userName: [{
+          required: true, message: '璇烽�夋嫨鍛樺伐濮撳悕', trigger: 'change'
+        }],
+        rewardPunishLevel: [{
+          required: true, message: '璇疯緭鍏ュ鎯╃骇鍒�', trigger: 'blur'
+        }],
+        rewardPunishName: [{
+          required: true, message: '璇疯緭鍏ュ鎯╁悕绉�', trigger: 'blur'
+        }],
+        rewardPunishTime: [{
+          required: true, message: '璇疯緭鍏ュ鎯╂椂闂�', trigger: 'blur'
+        }],
+        rewardPunishWorkUnit: [{
+          required: true, message: '璇疯緭鍏ュ鎯╁崟浣�', trigger: 'blur'
+        }]
+      },
+      responsibleOptions: []
+    };
+  },
+  mounted() {
+    this.getPersonnelTraining(this.departId);
+  },
+  methods: {
+    handleSizeChange(val) {
+      this.search.size = val
+      this.getPersonnelTraining(this.departId);
+    },
+    handleCurrentChange(val) {
+      this.search.current = val
+      this.getPersonnelTraining(this.departId);
+    },
+    async getPersonnelTraining() {
+      const { code, data } = await rewardPunishmentPage({
+        userId: this.isDepartment ? '' : this.departId,
+        departmentId: this.isDepartment ? this.departId : '',
+        current: this.search.curent,
+        size: this.search.size,
+        userName: this.search.userName,
+        startTime: this.search.searchTimeList && this.search.searchTimeList[0],
+        endTime: this.search.searchTimeList && this.search.searchTimeList[1],
+      })
+      if (code == 200) {
+        this.tableData = data.records
+        this.search.total = data.total
+      }
+    },
+    handleDown() {
+      this.outLoading = true
+      this.$axios.post(this.$api.deviceCheck.rewardPunishmentExport, {
+        userId: this.isDepartment ? '' : this.departId,
+        departmentId: this.isDepartment ? this.departId : '',
+        userName: this.search.userName,
+        startTime: this.search.searchTimeList && this.search.searchTimeList[0],
+        endTime: this.search.searchTimeList && this.search.searchTimeList[1]
+      }, { responseType: 'blob' }).then(res => {
+        this.outLoading = false
+        const blob = new Blob([res], {
+          type: 'application/force-download'
+        })
+        //灏咮lob 瀵硅薄杞崲鎴愬瓧绗︿覆
+        let reader = new FileReader();
+        reader.readAsText(blob, 'utf-8');
+        reader.onload = () => {
+          try {
+            let result = JSON.parse(reader.result);
+            if (result.message) {
+              this.$message.error(result.message);
+            } else {
+              // 鍒涘缓涓�涓秴閾炬帴锛屽皢鏂囦欢娴佽祴杩涘幓锛岀劧鍚庡疄鐜拌繖涓秴閾炬帴鐨勫崟鍑讳簨浠�
+              const elink = document.createElement('a')
+              elink.download = decodeURI('濂栨儵璁板綍' + '.xlsx')
+              elink.style.display = 'none'
+              elink.href = URL.createObjectURL(blob)
+              document.body.appendChild(elink)
+              elink.click();
+              URL.revokeObjectURL(elink.href) // 閲婃斁URL 瀵硅薄
+              document.body.removeChild(elink)
+              this.$message.success('瀵煎嚭鎴愬姛')
+            }
+          } catch (err) {
+            console.log(err);
+            // 鍒涘缓涓�涓秴閾炬帴锛屽皢鏂囦欢娴佽祴杩涘幓锛岀劧鍚庡疄鐜拌繖涓秴閾炬帴鐨勫崟鍑讳簨浠�
+            const elink = document.createElement('a')
+            elink.download = decodeURI('濂栨儵璁板綍' + '.xlsx')
+            elink.style.display = 'none'
+            elink.href = URL.createObjectURL(blob)
+            document.body.appendChild(elink)
+            elink.click();
+            URL.revokeObjectURL(elink.href) // 閲婃斁URL 瀵硅薄
+            document.body.removeChild(elink)
+            this.$message.success('瀵煎嚭鎴愬姛')
+          }
+        }
+      })
+    },
+    // 鑾峰彇璐熻矗浜轰俊鎭帴鍙�
+    getUserList() {
+      this.$axios.get(this.$api.deviceScope.selectUserList).then(res => {
+        if (res.code == 200) {
+          this.responsibleOptions = res.data
+        }
+      })
+    },
+    selectUserChange(val) {
+      this.form.userName = val.name
+      this.form.account = val.account
+      this.form.userId = val.id
+    },
+    editForm(row) {
+      this.dialogVisible = true
+      this.form = { ...row };
+    },
+    saveOrUpdate() {
+      this.$refs.form.validate(async (valid) => {
+        if (valid) {
+          this.dialogVisible = false
+          const { code, data } = await addOrUpdateRewardPunishment(this.form)
+          if (code == 200) {
+            this.$message.success("鎿嶄綔鎴愬姛锛�")
+            this.getPersonnelTraining(this.departId);
+          }
+        }
+      })
+    },
+    async deleteRow(row) {
+      const { code, data } = await deleteRewardPunishment({
+        id: row.id
+      })
+      if (code == 200) {
+        this.$message.success("鎿嶄綔鎴愬姛锛�")
+        this.getPersonnelTraining(this.departId);
+      }
+    }
+  },
+  watch: {
+    // 鐩戝惉鐐瑰嚮el-tree鐨勬暟鎹紝杩涜鏁版嵁鍒锋柊
+    departId: {
+      handler(newId, oldId) {
+        this.getPersonnelTraining(newId);
+      }
+    },
+    dialogVisible(newVal) {
+      if (newVal === false) {
+        this.form = {}
+        this.$refs['form'].clearValidate()
+      }
+    }
+  }
+};
+</script>

--
Gitblit v1.9.3