From c97a7463b25c98384ab265f33b0176970d246a86 Mon Sep 17 00:00:00 2001
From: 叶松 <2217086471@qq.com>
Date: 星期四, 16 十一月 2023 10:16:03 +0800
Subject: [PATCH] 安全考核界面迁移

---
 web/src/views/SecureManage/NipCheck/ExamineRecord.vue |  250 +++++++++++++++++++++++++
 web/src/views/SecureManage/NipCheck/SafeExam.vue      |  347 ++++++++++++++++++++++++++++++++++
 2 files changed, 595 insertions(+), 2 deletions(-)

diff --git a/web/src/views/SecureManage/NipCheck/ExamineRecord.vue b/web/src/views/SecureManage/NipCheck/ExamineRecord.vue
new file mode 100644
index 0000000..4068c28
--- /dev/null
+++ b/web/src/views/SecureManage/NipCheck/ExamineRecord.vue
@@ -0,0 +1,250 @@
+<template>
+  <div class="main tabs_main back_main">
+    <div class="back_item">
+      <el-button icon="el-icon-back" @click="$emit('update:recordShow', false)">返回</el-button>
+    </div>
+    <div class="main_info">
+      <div
+        class="main_info_item"
+        v-for="item in recordInfoList"
+        :key="item.id">
+        <span>{{item.materialName}}</span>
+        <span class="main_info_item--value">{{statisticInfo[item.materialValue]}}</span>
+      </div>
+    </div>
+    <div class="main_header" style="margin-top: 0">
+      <div class="header_item">
+        <span class="header_label">考核结果:</span>
+        <el-select v-model="examResult" clearable placeholder="请选择考核结果">
+          <el-option
+            v-for="item in resultData"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value">
+          </el-option>
+        </el-select>
+      </div>
+      <div class="header_item">
+        <span class="header_label">班组:</span>
+        <el-select v-model="groupId" clearable placeholder="请选择班组">
+          <el-option
+            v-for="item in groupData"
+            :key="item.groupId"
+            :label="item.groupName"
+            :value="item.groupId">
+          </el-option>
+        </el-select>
+      </div>
+      <div class="header_item">
+        <span class="header_label">考核时间:</span>
+        <el-date-picker 
+          v-model="timeDate" 
+          type="daterange" 
+          value-format="yyyy-MM-dd"
+          range-separator="至"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期">
+        </el-date-picker>
+      </div>
+      <div class="header_item">
+        <el-button icon="el-icon-search" @click="searchExamineRecordList(true)">查询</el-button>
+      </div>
+    </div>
+    <div class="main_content">
+      <el-table
+        v-loading="loading"
+        :data="examineRecordList"
+        height="100%">
+        <el-table-column label="序号" width="60" align="center">
+          <template #default="scope">
+            <span>{{(pageNum - 1) * pageSize + scope.$index + 1}}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="examName" label="考核名称" width="180" align="center"></el-table-column>
+        <el-table-column prop="realName" label="姓名" align="center"></el-table-column>
+        <el-table-column prop="groupName" label="班组" align="center"></el-table-column>
+        <el-table-column prop="startTime" label="考核时间" align="center"></el-table-column>
+        <el-table-column prop="useTime" label="用时" align="center"></el-table-column>
+        <el-table-column prop="score" label="考核成绩" align="center"></el-table-column>
+        <el-table-column label="考核结果" align="center">
+          <template #default="{ row }">
+            <span>{{row.pass === 1 ? '合格' : row.pass === 0 ? '不合格' : ''}}</span>
+          </template>
+        </el-table-column>
+      </el-table>
+    </div>
+    <div class="main_footer">
+      <el-pagination
+        background
+        @current-change="changePageNum"
+        @size-change="changePageSize"
+        :current-page="pageNum"
+        :page-sizes="[10, 20, 50, 100]"
+        :page-size="pageSize"
+        layout="total, sizes, prev, pager, next, jumper"
+        :total="total">
+      </el-pagination>
+    </div>
+  </div>
+</template>
+
+<script>
+import { buttonPinia } from '../../../pinia';
+  export default {
+    name: 'ExamineRecord',
+    props: {
+      examineId: String,
+      recordShow: Boolean
+    },
+    data() {
+      return {
+        recordInfoList: [{
+          id: 1,
+          materialName: '应考人数',
+          materialValue: 'planExamUser'
+        },{
+          id: 2,
+          materialName: '实考人数',
+          materialValue: 'totalExamUser'
+        },{
+          id: 3,
+          materialName: '缺考人数',
+          materialValue: 'noExamUser'
+        },{
+          id: 4,
+          materialName: '合格人数',
+          materialValue: 'passExamUser'
+        },{
+          id: 5,
+          materialName: '不合格人数',
+          materialValue: 'noPassExanUser'
+        }], // 页头信息
+        statisticInfo: {}, // 统计信息
+        examResult: '',
+        resultData: [{
+          value: 0,
+          label: '不合格'
+        },{
+          value: 1,
+          label: '合格'
+        }], // 考核结果
+        departId: '',
+        groupId: '',
+        groupData: [],
+        timeDate: '',
+        loading: false,
+        pageNum: 1,
+        pageSize: 10,
+        total: 0,
+        examineRecordList: []
+      }
+    },
+    mounted() {
+      this.getExamRecordStatistical();
+      this.getAllDepartmentData();
+      this.searchExamineRecordList(true);
+    },
+    methods: {
+      // 获取部门班组信息
+      async getAllDepartmentData() {
+        const { data } = await this.$api.Personnerl.GETDEPARTMENTDATA();
+        const groupData = data.map(item => item.groups);
+        this.groupData = groupData.flat(Infinity);
+      },
+      // 查询考核记录统计
+      async getExamRecordStatistical() {
+        const { data } = await this.$api.Safety.getExamRecordStatistical({
+          examId: this.examineId
+        })
+        this.statisticInfo = data;
+      },
+      // 查询记录信息
+      searchExamineRecordList(bol) {
+        if(bol) {
+          this.pageNum = 1;
+        }
+        this.loading = true;
+        this.examineRecordList = [];
+        this.$api.Safety.searchSafetyCheckRecord({
+          pageNum: this.pageNum,
+          pageSize: this.pageSize,
+          examId: this.examineId,
+          examResult: this.examResult,
+          departId: this.departId,
+          groupId: this.groupId,
+          startTime: this.timeDate ? this.timeDate[0] + ' 00:00:00' : '',
+          endTime: this.timeDate ? this.timeDate[1] + ' 23:59:59' : ''
+        }).then((res) => {
+          if(res.success) {
+            this.total = res.data.total;
+            this.examineRecordList = res.data.list;
+          }
+          this.loading = false;
+        }).catch(() => {
+          this.loading = false;
+        })
+      },
+      // 切换页码
+      changePageNum(page) {
+        this.pageNum = page;
+        this.searchExamineRecordList();
+      },
+      // 切换每页条数
+      changePageSize(size) {
+        this.pageSize = size;
+        this.searchExamineRecordList();
+      },
+      // 判断按钮权限信息
+      showButton(str) {
+        const pinia = buttonPinia();
+        return pinia.$state.buttonInfo.includes(str);
+      }
+    }
+  }
+</script>
+
+<style lang="scss" scoped>
+@import '@/style/layout-main.scss';
+
+.back_main {
+  background: none !important;
+}
+
+.back_item {
+  display: flex;
+  justify-content: flex-end;
+}
+
+.main_info {
+  display: flex;
+  align-items: center;
+  justify-content: space-around;
+  padding: 20px 10px 10px;
+
+  .main_info_item {
+    display: flex;
+    flex-direction: column;
+    justify-content: center;
+    align-items: center;
+    width: calc(100% / 8);
+    height: 80px;
+    color: #FFFFFF;
+    background: url('../../../assets/stir_img.png')no-repeat;
+    background-size: 100% 100%;
+
+    &:first-child {
+      margin-left: 0 !important;
+    }
+
+    &:nth-child(odd) {
+      margin: 0 20px;
+    }
+
+    .main_info_item--value {
+      padding-top: 2px;
+      color: #18F6F8;
+      font-size: 18px;
+    }
+  }
+}
+</style>
\ No newline at end of file
diff --git a/web/src/views/SecureManage/NipCheck/SafeExam.vue b/web/src/views/SecureManage/NipCheck/SafeExam.vue
index 4c16829..49f2769 100644
--- a/web/src/views/SecureManage/NipCheck/SafeExam.vue
+++ b/web/src/views/SecureManage/NipCheck/SafeExam.vue
@@ -1,3 +1,346 @@
 <template>
-    <div>安全考核</div>
-</template>
\ No newline at end of file
+  <div class="main tabs_main" v-if="!recordShow">
+    <div class="main_header">
+      <div class="header_item">
+        <span class="header_label">考核名称:</span>
+        <el-input v-model="examineName" clearable placeholder="请输入考核名称"></el-input>
+      </div>
+      <div class="header_item">
+        <span class="header_label">时间范围:</span>
+        <el-date-picker 
+          v-model="timeData" 
+          type="daterange"
+          range-separator="至"
+          start-placeholder="开始日期"
+          end-placeholder="结束日期"
+          value-format="yyyy-MM-dd">
+        </el-date-picker>
+      </div>
+      <div class="header_item">
+        <el-button v-if="showButton('search')" icon="el-icon-search" @click="searchSafetyExamineList(true)">查询</el-button>
+        <el-button class="search_btn" v-if="showButton('insert')" icon="el-icon-plus" @click="propInsert()">新增</el-button>
+      </div>
+    </div>
+    <div class="main_content">
+      <el-table
+        v-loading="loading"
+        :data="examineList"
+        height="100%">
+        <el-table-column label="序号" width="60" align="center">
+          <template #default="scope">
+            <span>{{(pageNum - 1) * pageSize + scope.$index + 1}}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="examName" label="考核名称" width="180" align="center"></el-table-column>
+        <el-table-column prop="examDate" label="考核日期" align="center"></el-table-column>
+        <el-table-column prop="userCount" label="人数" align="center"></el-table-column>
+        <el-table-column label="操作" align="center">
+          <template #default="{ row }">
+            <el-button class="table_btn" size="mini" v-if="showButton('update')" @click="propUpdate(row)">修改</el-button>
+            <el-button class="delete_btn" size="mini" v-if="showButton('delete')" @click="deleteInfo(row)">删除</el-button>
+            <el-button class="table_btn" size="mini" v-if="showButton('delete')" @click="propRecord(row)">记录</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+    </div>
+    <div class="main_footer">
+      <el-pagination
+        background
+        @current-change="changePageNum"
+        @size-change="changePageSize"
+        :current-page="pageNum"
+        :page-sizes="[10, 20, 50, 100]"
+        :page-size="pageSize"
+        layout="total, sizes, prev, pager, next, jumper"
+        :total="total">
+      </el-pagination>
+    </div>
+    <!-- 新增考核 修改考核信息 -->
+    <el-dialog
+      class="prop_dialog"
+      :title="asyncTitle ? '新增安全考核' : '修改安全考核信息'"
+      :visible.sync="asyncExamine"
+      width="35%">
+      <el-form ref="form" :model="formExamine" :rules="rulesExamine" label-width="auto" class="rule_form">
+        <el-form-item label="考核名称:" prop="examName">
+          <el-input v-model="formExamine.examName" clearable placeholder="请输入考核名称"></el-input>
+        </el-form-item>
+        <el-form-item label="考题数量:" prop="questionCount">
+          <el-input-number 
+            v-model="formExamine.questionCount"
+            :controls="false"
+            :precision="0"
+            :min="0"
+            placeholder="请输入考题数量">
+          </el-input-number>
+        </el-form-item>
+        <el-form-item label="合格分数:" prop="qualifiedScore">
+          <el-input-number 
+            v-model="formExamine.qualifiedScore" 
+            :controls="false"
+            :min="0"
+            placeholder="请输入合格分数">
+          </el-input-number>
+        </el-form-item>
+        <el-form-item label="考核日期:" prop="examDate">
+          <el-date-picker
+            v-model="formExamine.examDate"
+            type="date"
+            clearable
+            value-format="yyyy-MM-dd"
+            placeholder="选择日期">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="类型:" prop="examType">
+          <el-select v-model="formExamine.examType" clearable placeholder="请选择类型" @change="getSecureTrainPull">
+            <el-option
+              v-for="item in typeData"
+              :key="item.dictId"
+              :label="item.dictName"
+              :value="item.dictId">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="类型名称:" prop="trainId">
+          <el-select v-model="formExamine.trainId" clearable placeholder="请选择类型名称">
+            <el-option
+              v-for="item in typeNameData"
+              :key="item.secureId"
+              :label="item.secureName"
+              :value="item.secureId">
+            </el-option>
+          </el-select>
+        </el-form-item>
+      </el-form>
+      <div slot="footer">
+        <el-button @click="asyncExamine = false">取 消</el-button>
+        <el-button class="submit_btn" @click="asyncTitle ? submitInsertForm() : submitUpdateForm()">提 交</el-button>
+      </div>
+    </el-dialog>
+  </div>
+  <examine-record v-else :examine-id.sync="examineId" :record-show.sync="recordShow"></examine-record>
+</template>
+
+<script>
+import { buttonPinia } from '../../../pinia';
+import { throttle } from '../../../plugins/public';
+import ExamineRecord from './ExamineRecord.vue';
+  export default {
+    components: {
+      ExamineRecord
+    },
+    data() {
+      return {
+        examineName: '',
+        timeData: '',
+        loading: false,
+        pageNum: 1,
+        pageSize: 10,
+        total: 0,
+        examineList: [],
+        asyncTitle: true, // true 新增  false 修改
+        asyncExamine: false, // 弹窗
+        formExamine: {}, // 表单信息
+        rulesExamine: {
+          examName: [{
+            required: true,
+            message: '请输入考核名称',
+            trigger: 'blur'
+          }],
+          questionCount: [{
+            required: true,
+            message: '请输入考题数量',
+            trigger: 'blur'
+          }],
+          qualifiedScore: [{
+            required: true,
+            message: '请输入合格分数',
+            trigger: 'blur'
+          }],
+          examDate: [{
+            required: true,
+            message: '请选择考试日期',
+            trigger: ['blur', 'change']
+          }],
+          examType: [{
+            required: true,
+            message: '请选择类型',
+            trigger: ['blur', 'change']
+          }],
+          trainId: [{
+            required: true,
+            message: '请选择类型名称',
+            trigger: ['blur', 'change']
+          }]
+        }, // 表单验证
+        typeData: [], // 类型信息
+        typeNameData: [], // 类型名称信息
+        recordShow: false, // 记录
+        examineId: '',
+      }
+    },
+    mounted() {
+      this.searchSafetyExamineList(true);
+    }, 
+    methods: {
+      // 获取类型信息
+      async getExamineTypeData() {
+        const { data } = await this.$api.Dictionary.searchDictionary({
+          dictType: 'train_type',
+          pageNum: 1,
+          pageSize: 100000
+        });
+        this.typeData = data.list;
+      },
+      // 查询安全考核信息
+      searchSafetyExamineList(bol) {
+        if(bol) {
+          this.pageNum = 1;
+        }
+        this.loading = true;
+        this.examineList = [];
+        this.$api.Safety.searchSafetyExamineList({
+          pageNum: this.pageNum,
+          pageSize: this.pageSize,
+          examName: this.examineName,
+          startDay: this.timeData ? this.timeData[0] : '',
+          endDay: this.timeData ? this.timeData[1] : ''
+        }).then((res) => {
+          if(res.success) {
+            this.total = res.data.total;
+            this.examineList = res.data.list;
+          }
+          this.loading = false;
+        }).catch(() => {
+          this.loading = false;
+        })
+      },
+      // 打开添加信息
+      propInsert() {
+        this.asyncTitle = true;
+        this.asyncExamine = true;
+      },
+      // 打开修改信息
+      propUpdate(row) {
+        this.$api.Safety.getAllSecureTrainPull({
+          secureType: row.examType
+        }).then((res) => {
+          this.typeNameData = res.data;
+        })
+        this.$set(this.formExamine, 'examId', row.examId);
+        this.$set(this.formExamine, 'examName', row.examName);
+        this.$set(this.formExamine, 'questionCount', row.questionCount);
+        this.$set(this.formExamine, 'qualifiedScore', row.qualifiedScore);
+        this.$set(this.formExamine, 'examDate', row.examDate);
+        this.$set(this.formExamine, 'examType', row.examType);
+        this.$set(this.formExamine, 'trainId', row.trainId);
+        this.asyncTitle = false;
+        this.asyncExamine = true;
+      },
+      // 打开记录信息
+      propRecord(row) {
+        this.examineId = row.examId;
+        this.recordShow = true;
+      },
+      // 删除考核信息
+      deleteInfo(row) {
+        this.$confirm("该操作将删除该考核信息,是否继续删除?", "提示", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+       })
+       .then(() => {
+         this.$api.Safety.deleteSafetyExamineInfo({
+          examId: row.examId
+        }).then(res => {
+          if(res.success) {
+            this.searchSafetyExamineList(true);
+            this.$message.success("删除成功!");
+          } else {
+            this.$message.warning(res.statusMsg);
+          }
+        })
+       })
+       .catch(() => {
+         this.$message.warning("您已取消");
+       })
+      },
+      // 提交添加信息
+      submitInsertForm: throttle(function () {
+        this.$refs.form.validate((valid) => {
+          if(valid) {
+            const params = Object.assign({}, this.formExamine);
+            this.$api.Safety.insertSafetyExamineInfo(params).then((res) => {
+              if(res.success) {
+                this.asyncExamine = false;
+                this.searchSafetyExamineList(true);
+                this.$message.success('添加成功!');
+              } else {
+                this.$message.warning(res.statusMsg);
+              }
+            })
+          }
+        })
+      }, 3000),
+      // 提交修改信息
+      submitUpdateForm: throttle(function() {
+        this.$refs.form.validate((valid) => {
+          if(valid) {
+            const params = Object.assign({}, this.formExamine);
+            this.$api.Safety.insertSafetyExamineInfo(params).then((res) => {
+              if(res.success) {
+                this.asyncExamine = false;
+                this.searchSafetyExamineList(true);
+                this.$message.success('修改成功!');
+              } else {
+                this.$message.warning(res.statusMsg);
+              }
+            })
+          }
+        })
+      }, 3000),
+      // 根据类型获取类型名称信息
+      getSecureTrainPull(data) {
+        this.typeNameData = [];
+        if(data) {
+          this.$api.Safety.getAllSecureTrainPull({
+            secureType: data
+          }).then((res) => {
+            this.typeNameData = res.data;
+          })
+        } else {
+          this.$set(this.formExamine, 'trainId', '');
+        }
+      },
+      // 切换页码
+      changePageNum(page) {
+        this.pageNum = page;
+        this.searchSafetyExamineList();
+      },
+      // 切换每页条数
+      changePageSize(size) {
+        this.pageSize = size;
+        this.searchSafetyExamineList();
+      },
+      // 判断按钮权限信息
+      showButton(str) {
+        const pinia = buttonPinia();
+        return pinia.$state.buttonInfo.includes(str);
+      }
+    },
+    watch: {
+      asyncExamine(bol) {
+        if(bol) {
+          this.getExamineTypeData();
+        } else {
+          this.formExamine = {};
+          this.$refs.form.resetFields();
+        }
+      }
+    }
+  }
+</script>
+
+<style lang="scss" scoped>
+@import '@/style/layout-main.scss';
+</style>
\ No newline at end of file

--
Gitblit v1.9.3