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