From 17d6a920c0f0b3a14db536fd1f7f5d3431cc048a Mon Sep 17 00:00:00 2001
From: zhouwx <1175765986@qq.com>
Date: 星期三, 15 五月 2024 09:03:37 +0800
Subject: [PATCH] 新增风险评估记录
---
src/api/analyse/record/index.ts | 51 ++
src/views/analyse/record/components/recordDialog.vue | 279 +++++++++++++++
src/views/analyse/record/index.vue | 457 +++++++++++++++++++++++++
package.json | 173 ++++----
src/views/analyse/record/index.ts | 64 +++
public/static/example.xls | 0
src/main.ts | 3
7 files changed, 940 insertions(+), 87 deletions(-)
diff --git a/package.json b/package.json
index 8b2ab23..3bf8fef 100644
--- a/package.json
+++ b/package.json
@@ -1,88 +1,89 @@
{
- "name": "vue-next-admin",
- "version": "2.1.1",
- "description": "vue3 vite next admin template",
- "author": "lyt_20201208",
- "license": "MIT",
- "scripts": {
- "dev": "vite --force",
- "build": "vite build",
- "lint-fix": "eslint --fix --ext .js --ext .jsx --ext .vue src/"
- },
- "dependencies": {
- "@element-plus/icons-vue": "^2.0.6",
- "@kjgl77/datav-vue3": "^1.2.1",
- "@wangeditor/editor": "^5.1.14",
- "axios": "^0.27.2",
- "countup.js": "^2.2.0",
- "cropperjs": "^1.5.12",
- "echarts": "^5.3.3",
- "echarts-gl": "^2.0.9",
- "echarts-wordcloud": "^2.0.0",
- "element-plus": "^2.2.9",
- "js-base64": "^3.7.2",
- "js-cookie": "^3.0.1",
- "json-bigint": "^1.0.0",
- "jsplumb": "^2.15.6",
- "mitt": "^3.0.0",
- "nprogress": "^0.2.0",
- "pinia": "^2.0.14",
- "pinia-plugin-persistedstate": "^2.1.1",
- "print-js": "^1.6.0",
- "qrcodejs2-fixes": "^0.0.2",
- "screenfull": "^6.0.1",
- "sortablejs": "^1.15.0",
- "splitpanes": "^3.1.1",
- "vue": "^3.2.36",
- "vue-clipboard3": "^2.0.0",
- "vue-grid-layout": "^3.0.0-beta1",
- "vue-i18n": "^9.1.10",
- "vue-router": "^4.0.15",
- "wangeditor": "^4.7.15",
- "xlsx": "^0.18.5"
- },
- "devDependencies": {
- "@types/json-bigint": "^1.0.1",
- "@types/node": "^17.0.39",
- "@types/nprogress": "^0.2.0",
- "@types/sortablejs": "^1.13.0",
- "@typescript-eslint/eslint-plugin": "^5.27.0",
- "@typescript-eslint/parser": "^5.27.0",
- "@vitejs/plugin-vue": "^2.3.3",
- "@vue/compiler-sfc": "^3.2.36",
- "dotenv": "^16.0.1",
- "eslint": "^8.17.0",
- "eslint-plugin-vue": "^9.1.0",
- "prettier": "^2.6.2",
- "sass": "^1.52.2",
- "sass-loader": "^13.0.0",
- "typescript": "^4.7.3",
- "vite": "^2.9.9",
- "vue-eslint-parser": "^9.0.2"
- },
- "browserslist": [
- "> 1%",
- "last 2 versions",
- "not dead"
- ],
- "bugs": {
- "url": "https://gitee.com/lyt-top/vue-next-admin/issues"
- },
- "engines": {
- "node": ">=12.0.0",
- "npm": ">= 6.0.0"
- },
- "keywords": [
- "vue",
- "vue3",
- "vuejs/vue-next",
- "element-ui",
- "element-plus",
- "vue-next-admin",
- "next-admin"
- ],
- "repository": {
- "type": "git",
- "url": "https://gitee.com/lyt-top/vue-next-admin.git"
- }
+ "name": "vue-next-admin",
+ "version": "2.1.1",
+ "description": "vue3 vite next admin template",
+ "author": "lyt_20201208",
+ "license": "MIT",
+ "scripts": {
+ "dev": "vite --force",
+ "build": "vite build",
+ "lint-fix": "eslint --fix --ext .js --ext .jsx --ext .vue src/"
+ },
+ "dependencies": {
+ "@element-plus/icons-vue": "^2.0.6",
+ "@kjgl77/datav-vue3": "^1.2.1",
+ "@wangeditor/editor": "^5.1.14",
+ "axios": "^0.27.2",
+ "countup.js": "^2.2.0",
+ "cropperjs": "^1.5.12",
+ "echarts": "^5.3.3",
+ "echarts-gl": "^2.0.9",
+ "echarts-wordcloud": "^2.0.0",
+ "element-plus": "^2.2.9",
+ "js-base64": "^3.7.2",
+ "js-cookie": "^3.0.1",
+ "json-bigint": "^1.0.0",
+ "jsplumb": "^2.15.6",
+ "mitt": "^3.0.0",
+ "nprogress": "^0.2.0",
+ "pinia": "^2.0.14",
+ "pinia-plugin-persistedstate": "^2.1.1",
+ "print-js": "^1.6.0",
+ "qrcodejs2-fixes": "^0.0.2",
+ "screenfull": "^6.0.1",
+ "sortablejs": "^1.15.0",
+ "splitpanes": "^3.1.1",
+ "vue": "^3.2.36",
+ "vue-clipboard3": "^2.0.0",
+ "vue-grid-layout": "^3.0.0-beta1",
+ "vue-i18n": "^9.1.10",
+ "vue-router": "^4.0.15",
+ "vue3-json-excel": "^1.0.10-alpha",
+ "wangeditor": "^4.7.15",
+ "xlsx": "^0.18.5"
+ },
+ "devDependencies": {
+ "@types/json-bigint": "^1.0.1",
+ "@types/node": "^17.0.39",
+ "@types/nprogress": "^0.2.0",
+ "@types/sortablejs": "^1.13.0",
+ "@typescript-eslint/eslint-plugin": "^5.27.0",
+ "@typescript-eslint/parser": "^5.27.0",
+ "@vitejs/plugin-vue": "^2.3.3",
+ "@vue/compiler-sfc": "^3.2.36",
+ "dotenv": "^16.0.1",
+ "eslint": "^8.17.0",
+ "eslint-plugin-vue": "^9.1.0",
+ "prettier": "^2.6.2",
+ "sass": "^1.52.2",
+ "sass-loader": "^13.0.0",
+ "typescript": "^4.7.3",
+ "vite": "^2.9.9",
+ "vue-eslint-parser": "^9.0.2"
+ },
+ "browserslist": [
+ "> 1%",
+ "last 2 versions",
+ "not dead"
+ ],
+ "bugs": {
+ "url": "https://gitee.com/lyt-top/vue-next-admin/issues"
+ },
+ "engines": {
+ "node": ">=12.0.0",
+ "npm": ">= 6.0.0"
+ },
+ "keywords": [
+ "vue",
+ "vue3",
+ "vuejs/vue-next",
+ "element-ui",
+ "element-plus",
+ "vue-next-admin",
+ "next-admin"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "https://gitee.com/lyt-top/vue-next-admin.git"
+ }
}
diff --git a/public/static/example.xls b/public/static/example.xls
new file mode 100644
index 0000000..4bbf94b
--- /dev/null
+++ b/public/static/example.xls
Binary files differ
diff --git a/src/api/analyse/record/index.ts b/src/api/analyse/record/index.ts
new file mode 100644
index 0000000..1c9e7ed
--- /dev/null
+++ b/src/api/analyse/record/index.ts
@@ -0,0 +1,51 @@
+import request from '/@/utils/request';
+
+export function recordApi() {
+ return {
+ getRecordList: (params: object) => {
+ return request({
+ url: import.meta.env.VITE_API_URL + '/basic/select/getOldRiskAssessPage',
+ method: 'post',
+ data: params
+ });
+ },
+ modRecord: (params: object) => {
+ return request({
+ url: import.meta.env.VITE_API_URL + '/basic/update/updateOldRiskAssess',
+ method: 'post',
+ data: params
+ });
+ },
+ addRecord: (params: object) => {
+ return request({
+ url: import.meta.env.VITE_API_URL + '/basic/insert/insertOldRiskAssess',
+ method: 'post',
+ data: params
+ });
+ },
+ deleteRecordById: (params: object) => {
+ return request({
+ url: import.meta.env.VITE_API_URL + '/basic/delete/deleteOldRiskAssess',
+ method: 'post',
+ data: params
+ });
+ },
+ addFile: (params: object) => {
+ return request({
+ headers: {
+ 'Content-Type': 'multipart/form-data'
+ },
+ url: import.meta.env.VITE_API_URL + '/basic/insert/importOldRiskAssess',
+ method: 'post',
+ data: params
+ });
+ },
+ exportFile: (params: object) => {
+ return request({
+ url: import.meta.env.VITE_API_URL + '/basic/select/exportOldRiskAssess',
+ method: 'post',
+ data: params
+ });
+ },
+ };
+}
diff --git a/src/main.ts b/src/main.ts
index 7cfa70a..a3c5f47 100644
--- a/src/main.ts
+++ b/src/main.ts
@@ -14,6 +14,7 @@
import VueGridLayout from 'vue-grid-layout';
import zhCn from 'element-plus/lib/locale/lang/zh-cn';
import DataVVue3 from '@kjgl77/datav-vue3'
+import vue3JsonExcel from 'vue3-json-excel'
// import 'lib-flexible/flexible'
const app = createApp(App);
for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
@@ -22,6 +23,6 @@
directive(app);
other.elSvg(app);
-app.use(pinia).use(router).use(ElementPlus, { i18n: i18n.global.t, locale: zhCn }).use(i18n).use(DataVVue3).use(VueGridLayout).mount('#app');
+app.use(pinia).use(router).use(ElementPlus, { i18n: i18n.global.t, locale: zhCn }).use(i18n).use(DataVVue3).use(VueGridLayout).use(vue3JsonExcel).mount('#app');
app.config.globalProperties.mittBus = mitt();
diff --git a/src/views/analyse/record/components/recordDialog.vue b/src/views/analyse/record/components/recordDialog.vue
new file mode 100644
index 0000000..f452dac
--- /dev/null
+++ b/src/views/analyse/record/components/recordDialog.vue
@@ -0,0 +1,279 @@
+<template>
+ <div class="system-menu-dialog-container">
+ <el-dialog :title="recordDialogState.title" v-model="recordDialogState.recordDialogVisible" width="600px">
+ <el-form ref="recordFormRef" :rules="recordDialogState.recordFormRules" :model="recordDialogState.recordForm" size="default" label-width="135px">
+ <el-row :gutter="35">
+ <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
+ <el-form-item label="区域" prop="region">
+ <el-input v-model="recordDialogState.recordForm.region" :disabled="recordDialogState.disabled" ></el-input>
+ </el-form-item>
+ </el-col>
+ <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
+ <el-form-item label="潜在事故" prop="potentialAccident">
+ <el-input type="textarea" v-model="recordDialogState.recordForm.potentialAccident" :disabled="recordDialogState.disabled" ></el-input>
+ </el-form-item>
+ </el-col>
+ <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
+ <el-form-item label="危险、有害因素" prop="dangerReason">
+ <el-input v-model="recordDialogState.recordForm.dangerReason" :disabled="recordDialogState.disabled" ></el-input>
+ </el-form-item>
+ </el-col>
+ <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
+ <el-form-item label="触发条件" prop="triggerFactor">
+ <el-input type="textarea" v-model="recordDialogState.recordForm.triggerFactor" :disabled="recordDialogState.disabled"></el-input>
+ </el-form-item>
+ </el-col>
+ <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20 valueSelect">
+ <el-form-item label="事故后果" prop="accidentResult">
+ <el-input v-model="recordDialogState.recordForm.accidentResult" :disabled="recordDialogState.disabled" ></el-input>
+ </el-form-item>
+ </el-col>
+ <el-row :gutter="22">
+ <el-col :span="11" class="mb20 ml18 ">
+ <el-form-item label="L" prop="l">
+ <el-input v-model="recordDialogState.recordForm.l" :disabled="recordDialogState.disabled"></el-input>
+ </el-form-item>
+ </el-col>
+ <el-col :span="11" class="mb20 ">
+ <el-form-item label="E" prop="e">
+ <el-input v-model="recordDialogState.recordForm.e" :disabled="recordDialogState.disabled"></el-input>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-row :gutter="22">
+ <el-col :span="11" class="mb20 ml18 ">
+ <el-form-item label="C" prop="c">
+ <el-input v-model="recordDialogState.recordForm.c" :disabled="recordDialogState.disabled"></el-input>
+ </el-form-item>
+ </el-col>
+ <el-col :span="11" class="mb20 ">
+ <el-form-item label="D" prop="d">
+ <el-input v-model="recordDialogState.recordForm.d" :disabled="recordDialogState.disabled" ></el-input>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20 ">
+ <el-form-item label="危险等级" prop="dangerLevel">
+ <el-select style="width: 100%" :disabled="recordDialogState.disabled" v-model="recordDialogState.recordForm.dangerLevel" clearable>
+ <el-option v-for="item in recordDialogState.dangerTypeList" :key="item.id" :label="item.name" :value="item.name"></el-option>
+ </el-select>
+ </el-form-item>
+ </el-col>
+ <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20 ">
+ <el-form-item label="现有安全控制措施" prop="controlMeasure">
+ <el-input type="textarea" v-model="recordDialogState.recordForm.controlMeasure" :disabled="recordDialogState.disabled" placeholder="现有安全控制措施(工程技术、管理、培训教育、个体防护、应急处置)"></el-input>
+ </el-form-item>
+ </el-col>
+ <el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20 valueSelect" >
+ <el-form-item label="管控层级" prop="controlLevel">
+ <el-select style="width: 100%" multiple :disabled="recordDialogState.disabled" v-model="recordDialogState.recordForm.controlLevel" clearable>
+ <el-option v-for="item in recordDialogState.manageLevelList" :key="item.id" :label="item.name" :value="item.name"></el-option>
+ </el-select>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ </el-form>
+ <template #footer>
+ <span class="dialog-footer">
+ <el-button @click="recordDialogState.recordDialogVisible = !recordDialogState.recordDialogVisible" size="default">取 消</el-button>
+ <el-button v-if="!recordDialogState.disabled" type="primary" @click="onSubmitPlan" size="default">确定</el-button>
+ </span>
+ </template>
+ </el-dialog>
+ </div>
+</template>
+
+<script setup lang="ts">
+import { reactive, ref, getCurrentInstance } from "vue";
+import {ElMessage} from "element-plus";
+import {planApi} from "/@/api/analyse/plan";
+import {isValidKey} from "/@/utils/methods";
+import {recordApi} from "/@/api/analyse/record";
+
+const recordFormRef = ref()
+
+const recordDialogState = reactive<RecordDialogType>({
+ title: '',
+ disabled: false,
+ recordDialogVisible: false,
+ recordForm: {
+ id:null,
+ region:'',
+ potentialAccident: '',
+ dangerReason: '',
+ triggerFactor: '',
+ accidentResult: '',
+ l: null,
+ e: null,
+ c: null,
+ d: null,
+ dangerLevel: null,
+ controlMeasure: '',
+ controlLevel: [],
+ },
+ recordFormRules: {
+ region: [{ required: true, message: '请输入区域', trigger: 'change' }],
+ potentialAccident: [{ required: true, message: '请输入潜在事故', trigger: 'blur' }],
+ dangerReason: [{ required: true, message: '请输入危险、有害因素', trigger: 'blur' }],
+ triggerFactor: [{ required: true, message: '请输入触发条件', trigger: 'change' }],
+ accidentResult: [{ required: true, message: '请输入事故后果', trigger: 'change' }],
+ l: [{ required: true, message: '请输入L', trigger: 'change' }],
+ e: [{ required: true, message: '请输入E', trigger: 'change' }],
+ c: [{ required: true, message: '请输入C', trigger: 'change' }],
+ d: [{ required: true, message: '请输入D', trigger: 'change' }],
+ dangerLevel: [{ required: true, message: '请选择评危险等级', trigger: 'change' }],
+ controlMeasure: [{ required: true, message: '请输入现有安全控制措施', trigger: 'change' }],
+ controlLevel: [{ required: true, message: '请选择管理层级', trigger: 'change' }],
+
+ },
+ dangerTypeList: [
+ {id: 1, name: '低风险'},
+ {id: 2, name: '一般风险'},
+ {id: 3, name: '较大风险'},
+ ],
+ manageLevelList: [
+ {id: 1, name: '公司级'},
+ {id: 2, name: '部门级'},
+ {id: 3, name: '岗位级'},
+ ]
+})
+
+const showRecordDialog = (title: string, value: any) => {
+ recordDialogState.recordDialogVisible = true;
+
+ recordDialogState.disabled = false
+ setTimeout(() => {
+ recordFormRef.value.clearValidate();
+ });
+ if(title === '新增'){
+ recordDialogState.title = '新增';
+ recordDialogState.recordForm = {
+ region:'',
+ potentialAccident: '',
+ dangerReason: '',
+ triggerFactor: '',
+ accidentResult: '',
+ l: null,
+ e: null,
+ c: null,
+ d: null,
+ dangerLevel: null,
+ controlMeasure: '',
+ controlLevel: [],
+ };
+ }else if(title === '查看' || title === '编辑') {
+ for (let i in recordDialogState.recordForm) {
+ if (isValidKey(i, recordDialogState.recordForm)) {
+ if (i === 'controlLevel') {
+ let arr = []
+ arr = value[i].split('\n')
+ recordDialogState.recordForm[i] = arr
+ } else {
+ recordDialogState.recordForm[i] = value[i]
+ }
+ }
+ }
+ if (title === '查看') {
+ recordDialogState.title = '查看';
+ recordDialogState.disabled = true
+ } else {
+ recordDialogState.title = '编辑';
+ recordDialogState.recordForm.id = value.id
+ }
+ }
+
+};
+
+const onSubmitPlan = () => {
+ recordFormRef.value.validate(async(valid: boolean) => {
+ if(valid){
+ recordDialogState.recordForm.controlLevel = recordDialogState.recordForm.controlLevel.join('\n')
+ if(recordDialogState.title === '新增'){
+ let res = await recordApi().addRecord(recordDialogState.recordForm);
+ if(res.data.code === 100){
+ emit('getList')
+ recordDialogState.recordDialogVisible = false;
+ ElMessage({
+ type: 'success',
+ message: '新增成功'
+ })
+ }else{
+ ElMessage({
+ type: 'warning',
+ message: res.data.msg,
+ });
+ }
+ }else{
+
+ let res = await recordApi().modRecord(recordDialogState.recordForm)
+ if(res.data.code === 100){
+ emit('getList')
+ recordDialogState.recordDialogVisible = false;
+ ElMessage({
+ type: 'success',
+ message: '编辑成功'
+ })
+ }else{
+ ElMessage({
+ type: 'warning',
+ message: res.data.msg,
+ });
+ }
+ }
+ }else{
+ ElMessage({
+ type: 'warning',
+ message: '请完善基本信息',
+ });
+ }
+ })
+}
+
+const emit = defineEmits(['getList'])
+
+defineExpose({
+ showRecordDialog
+})
+</script>
+
+<style lang="scss" scoped>
+ ::v-deep(.pickTime){
+ position: absolute !important;
+ top: 0 !important;
+ }
+ .valueSelect{
+ ::v-deep(.el-popper){
+ .el-select-dropdown__item{
+ width: 100%;
+ height: auto;
+ white-space: normal;
+ word-break: break-all;
+ word-wrap: break-word;
+ overflow: auto;
+ padding: 10px 25px;
+ border-bottom: 1px solid #ccc;
+
+ .valueTable{
+ &>div{
+ line-height: 1.5;
+ margin-bottom: 6px;
+ display: flex;
+ align-items: center;
+
+ div{
+ color: #999;
+ }
+
+ span{
+ font-weight: bolder;
+ }
+
+ &:last-of-type{
+ margin-bottom: 0;
+ }
+ }
+ }
+ }
+ }
+ }
+</style>
diff --git a/src/views/analyse/record/index.ts b/src/views/analyse/record/index.ts
new file mode 100644
index 0000000..74ed97a
--- /dev/null
+++ b/src/views/analyse/record/index.ts
@@ -0,0 +1,64 @@
+declare interface RecordStateType {
+ recordData: Array<RecordType>
+ searchQuery: {
+ pageIndex: number,
+ pageSize: number,
+ region: string,
+ dangerLevel: string,
+ controlLevel: string
+ }
+ dangerTypeList: Type []
+ manageLevelList: Type []
+ total: number
+ tagBg: Array<string>
+ fileList: Array<object>
+ uploadUrl: string
+ header: object
+ visible: boolean
+ expertData: Array<object>
+}
+
+declare interface RecordType {
+ id: number | null,
+ area: string | null,
+ accident: string | null,
+ danger: string | null,
+ condition: string | null,
+ result: string | null,
+ l: number | null,
+ e: number | null,
+ c: number | null,
+ d: number | null,
+ dangerType: number | null,
+ safetyMeasures: string | null,
+ manageLevel: Array<string>,
+}
+
+declare interface Type {
+ id: number,
+ name: string,
+}
+declare interface RecordDialogType {
+ title: string,
+ disabled: boolean,
+ recordDialogVisible: boolean,
+ recordForm: {
+ id?: number | null,
+ region: string | null,
+ potentialAccident: string | null,
+ dangerReason: string | null,
+ triggerFactor: string | null,
+ accidentResult: string | null,
+ l: number | null,
+ e: number | null,
+ c: number | null,
+ d: number | null,
+ dangerLevel: null,
+ controlMeasure: string,
+ controlLevel: string,
+ },
+ recordFormRules: {},
+ dangerTypeList: Type [],
+ manageLevelList: Type []
+}
+
diff --git a/src/views/analyse/record/index.vue b/src/views/analyse/record/index.vue
new file mode 100644
index 0000000..b76728c
--- /dev/null
+++ b/src/views/analyse/record/index.vue
@@ -0,0 +1,457 @@
+<template>
+ <div class="home-container">
+ <div style="height: 100%">
+ <el-row class="homeCard">
+ <div class="basic-line">
+ <span>区域:</span>
+ <el-input v-model="recordState.searchQuery.region" clearable filterable class="input-box" placeholder="区域">
+ </el-input>
+ </div>
+ <div class="basic-line">
+ <span>危险等级:</span>
+ <el-select v-model="recordState.searchQuery.dangerLevel" clearable filterable class="input-box" placeholder="危险等级">
+ <el-option v-for="item in recordState.dangerTypeList" :key="item.id" :label="item.name" :value="item.name"></el-option>
+ </el-select>
+ </div>
+ <div class="basic-line">
+ <span>管理层级:</span>
+ <el-select v-model="recordState.searchQuery.controlLevel" filterable class="input-box" placeholder="管理层级">
+ <el-option v-for="item in recordState.manageLevelList" :key="item.id" :label="item.name" :value="item.name"></el-option>
+ </el-select>
+ </div>
+ <div style="padding-bottom: 10px">
+ <el-button type="primary" @click="getAssessData">查询</el-button>
+ <el-button plain @click="reset">重置</el-button>
+ </div>
+ </el-row>
+ <div class="homeCard">
+ <div class="main-card">
+ <div class="cardTop">
+ <el-button type="primary" :icon="Plus" size="default" @click="openRecordDialog('新增', {})">新增</el-button>
+ <div style="display: flex">
+ <el-button type="primary" :icon="Upload" size="default" @click="recordState.visible = true" style="margin-right: 10px">导入</el-button>
+ <vue3-json-excel
+ :json-data="recordState.expertData"
+ :fields="fields"
+ name="风险评价记录.xls"
+ >
+ <el-button type="primary" :icon="Download" size="default">导出</el-button>
+ </vue3-json-excel>
+ </div>
+ </div>
+ <el-table ref="multipleTableRef" :border="true" :data="recordState.recordData" style="width: 100%" height="calc(100% - 100px)" :header-cell-style="{ background: '#fafafa' }">
+ <el-table-column type="index" label="序号" align="center" width="60" />
+ <el-table-column prop="region" label="区域" align="center"/>
+ <el-table-column prop="potentialAccident" label="潜在事故" align="center" width="180"/>
+ <el-table-column prop="dangerReason" label="危险、有害因素" align="center"/>
+ <el-table-column prop="triggerFactor" label="触发条件" align="center" width="180"/>
+ <el-table-column prop="accidentResult" label="事故后果" align="center"/>
+ <el-table-column prop="l" label="L" width="60" align="center"/>
+ <el-table-column prop="e" label="E" width="60" align="center"/>
+ <el-table-column prop="c" label="C" width="60" align="center"/>
+ <el-table-column prop="d" label="D" width="60" align="center"/>
+ <el-table-column label="危险等级" align="center">
+ <template #default="scope">
+ <el-tag :class="recordState.tagBg[scope.row.dangerType - 1]" style="color:#383838;">
+ {{scope.row.dangerLevel}}
+ </el-tag>
+
+ </template>
+ </el-table-column>
+ <el-table-column prop="controlMeasure" label="现有安全控制措施(工程技术、管理、培训教育、个体防护、应急处置)" width="220" align="center"/>
+ <el-table-column prop="controlLevel" label="管控层级(公司级、部门级、岗位即)" width="160" align="center"/>
+ <el-table-column label="操作" width="150" fixed="right">
+ <template #default="scope">
+ <el-button size="small" text type="primary" @click="openRecordDialog('编辑', scope.row)">编辑</el-button>
+ <el-button size="small" text type="primary" @click="openRecordDialog('查看',scope.row)">查看</el-button>
+ <el-button size="small" text type="primary" style="color: red" @click="del(scope.row)">删除</el-button>
+ </template>
+ </el-table-column>
+ </el-table>
+ <div class="pageBtn">
+ <el-pagination @size-change="onHandleSizeChange" @current-change="onHandleCurrentChange" :pager-count="5" :page-sizes="[10, 20, 30]" v-model:current-page="recordState.searchQuery.pageIndex" background v-model:page-size="recordState.searchQuery.pageSize" layout="total, sizes, prev, pager, next, jumper" :total="recordState.total" class="page-position"> </el-pagination>
+ </div>
+ </div>
+ </div>
+ </div>
+ <record-dialog ref="recordDialogRef" @getList="getAssessData"></record-dialog>
+ <el-dialog v-model="recordState.visible" title="导入风险评估记录" @close="close" width="450px">
+ <el-form label-width="135px">
+ <el-form-item label="评估记录表格模板" >
+ <el-button @click="downloadFile" size="default" :icon="Download" type="primary">下载模板</el-button>
+ </el-form-item>
+ <el-form-item label="评估记录表格文件">
+ <el-upload
+ accept=".xlsx,.xls"
+ :before-upload="beforeUpload"
+ v-model:file-list="recordState.fileList"
+ action="#"
+ :auto-upload="false"
+ :on-change="handleChange"
+ >
+ <el-button :icon="Upload" size="default" type="primary">点击上传</el-button>
+ </el-upload>
+ </el-form-item>
+ </el-form>
+ <template #footer>
+ <span class="dialog-footer">
+ <el-button @click="close" size="default">取 消</el-button>
+ <el-button type="primary" @click="onUpload" size="default">确定</el-button>
+ </span>
+ </template>
+ </el-dialog>
+
+ </div>
+</template>
+
+<script setup lang="ts">
+import {onMounted, reactive, ref} from "vue";
+import {ElMessage, ElMessageBox} from "element-plus";
+import { Plus, Upload, Download} from '@element-plus/icons-vue';
+import recordDialog from './components/recordDialog.vue'
+import Cookies from "js-cookie";
+import {recordApi} from "/@/api/analyse/record";
+
+
+const recordDialogRef = ref();
+const recordState = reactive<RecordStateType>({
+ recordData: [],
+ searchQuery: {
+ pageIndex: 1,
+ pageSize: 10,
+ region: '',
+ dangerLevel: '',
+ controlLevel: ''
+
+ },
+ total: 0,
+ dangerTypeList: [
+ {id: 1, name: '低风险'},
+ {id: 2, name: '一般风险'},
+ {id: 3, name: '较大风险'},
+ ],
+ manageLevelList: [
+ {id: 1, name: '公司级'},
+ {id: 2, name: '部门级'},
+ {id: 3, name: '岗位级'},
+ ],
+ tagBg: ['blue', 'yellow', 'orange', ],
+ fileList: [],
+ uploadUrl: import.meta.env.VITE_API_URL + '/manage/accessory-file/uploadFile',
+ header: {
+ Authorization: Cookies.get('token')
+ },
+ visible: false,
+ expertData: []
+})
+
+const fields = ref({
+ '序号':'id',
+ '区域':'region',
+ '潜在事故':'potentialAccident',
+ '危险、有害因素':'dangerReason',
+ '触发条件':'triggerFactor',
+ '事故后果':'accidentResult',
+ 'L':'l',
+ 'E':'e',
+ 'C':'c',
+ 'D':'d',
+ '危险等级':'dangerLevel',
+ '现有安全控制措施(工程技术、管理、培训教育、个体防护、应急处置)':'controlMeasure',
+ '管控层级(公司级、部门级、岗位级)':'controlLevel',
+});
+
+
+
+const getAssessData = async () => {
+ let res = await recordApi().getRecordList(recordState.searchQuery);
+ if(res.data.code === 100){
+ recordState.recordData = res.data.data.map(item => {
+ return {
+ ...item,
+ dangerType: item.dangerLevel === '低风险' ? 1: item.dangerLevel === '一般风险'? 2: item.dangerLevel === '较大风险' ? 3:""
+ }
+ });
+ recordState.total = res.data.total;
+ }else{
+ ElMessage({
+ type: 'warning',
+ message: res.data.msg
+ });
+ }
+ await getAllData()
+};
+
+const getAllData = async () => {
+ let res = await recordApi().exportFile(recordState.searchQuery);
+ if(res.data.code === 100){
+ recordState.expertData = res.data.data
+ }else{
+ ElMessage({
+ type: 'warning',
+ message: res.data.msg
+ });
+ }
+};
+
+const openRecordDialog = (title: string,value: any) =>{
+ recordDialogRef.value.showRecordDialog(title, value);
+}
+
+
+const onHandleSizeChange = (val: number) => {
+ recordState.searchQuery.pageSize = val;
+ getAssessData();
+};
+
+const onHandleCurrentChange = (val: number) => {
+ recordState.searchQuery.pageIndex = val;
+ getAssessData();
+};
+
+const reset = () => {
+ recordState.searchQuery = {
+ pageIndex: 1,
+ pageSize: 10,
+ region: '',
+ dangerLevel: '',
+ controlLevel: ''
+ }
+ getAssessData();
+};
+const fileBinaryList = ref([])
+
+const handleChange = (file, files) => {
+ // file是当前上传的文件,files是当前所有的文件,
+ fileBinaryList.value = files;
+};
+const onUpload = async () => {
+ if(recordState.fileList.length == 0){
+ ElMessage({
+ type: 'warning',
+ message: '请先上传表格'
+ });
+ return
+ }else{
+ const formData = new FormData();
+ fileBinaryList.value.forEach((file) => {
+ formData.append('file', file.raw)
+ })
+ console.log('form',formData)
+ const res = await recordApi().addFile(formData)
+ if(res.data.code == 100){
+ recordState.fileList = []
+ recordState.visible = false
+ await getAssessData()
+ }else{
+ ElMessage({
+ type: 'error',
+ message: res.data.msg
+ });
+ }
+ }
+}
+const beforeUpload = (file) => {
+ recordState.fileList = [...recordState.fileList, file]
+ recordState.fileList = recordState.fileList.slice(-1)
+ return false;
+}
+const close = () => {
+ recordState.fileList = []
+ recordState.visible = false
+}
+const downloadFile = () => {
+ const filePath = '/static/example.xls';
+ const link = document.createElement('a');
+ link.href = filePath;
+ link.download = filePath.substr(filePath.lastIndexOf('/') + 1);
+ link.click();
+}
+const del = (val) => {
+ ElMessageBox.confirm(`此操作将删除该记录,是否继续?`, '提示', {
+ confirmButtonText: '确认',
+ cancelButtonText: '取消',
+ type: 'warning'
+ })
+ .then(async () => {
+ let res = await recordApi().deleteRecordById({ id: val.id });
+ if (res.data.code === 100) {
+ ElMessage({
+ type: 'success',
+ duration: 2000,
+ message: '删除成功'
+ });
+ await getAssessData();
+ } else {
+ ElMessage({
+ type: 'warning',
+ message: res.data.msg
+ });
+ }
+ })
+ .catch((error) => {
+ });
+}
+onMounted(() => {
+ getAssessData()
+})
+
+</script>
+
+<style scoped lang="scss">
+$homeNavLengh: 8;
+.home-container {
+ height: calc(100vh - 144px);
+ box-sizing: border-box;
+ overflow: hidden;
+ .homeCard {
+ width: 100%;
+ padding: 20px;
+ box-sizing: border-box;
+ background: #fff;
+ border-radius: 4px;
+
+ .main-card {
+ width: 100%;
+ height: 100%;
+ .cardTop {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ margin-bottom: 20px;
+ .mainCardBtn {
+ margin: 0;
+ }
+ }
+ .pageBtn {
+ height: 60px;
+ display: flex;
+ align-items: center;
+ justify-content: right;
+
+ .demo-pagination-block + .demo-pagination-block {
+ margin-top: 10px;
+ }
+ .demo-pagination-block .demonstration {
+ margin-bottom: 16px;
+ }
+ }
+ }
+ &:last-of-type {
+ height: calc(100% - 100px);
+ }
+ }
+ .el-row {
+ display: flex;
+ align-items: center;
+ margin-bottom: 20px;
+ &:last-child {
+ margin-bottom: 0;
+ }
+ .grid-content {
+ align-items: center;
+ min-height: 36px;
+ }
+
+ .topInfo {
+ display: flex;
+ align-items: center;
+ font-size: 16px;
+ font-weight: bold;
+
+ & > div {
+ white-space: nowrap;
+ margin-right: 20px;
+ }
+ }
+ }
+}
+.stepItem {
+ width: 100%;
+ display: flex;
+ align-items: flex-start;
+ margin-bottom: 30px;
+ margin-left: 30px;
+ padding-bottom: 30px;
+ border-left: 2px solid #ccc;
+ &:first-of-type {
+ margin-top: 30px;
+ }
+ &:last-of-type {
+ margin-bottom: 0;
+ border-left: none;
+ }
+ .stepNum {
+ width: 30px;
+ height: 30px;
+ border-radius: 15px;
+ box-sizing: border-box;
+ color: #333;
+ border: 1px solid #999;
+ line-height: 28px;
+ text-align: center;
+ margin-right: 10px;
+ margin-left: -16px;
+ margin-top: -30px;
+ }
+ .stepCard {
+ width: 100%;
+ margin-top: -30px;
+
+ .box-card {
+ width: 100%;
+ &:deep(.el-card__header) {
+ padding: 10px 15px;
+ }
+ .card-header {
+ width: 100%;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ & > div:first-of-type {
+ margin-right: 80px;
+ font-size: 18px;
+ font-weight: bold;
+ }
+ }
+ }
+ }
+ &:hover .card-header {
+ color: #0098f5;
+ }
+ &:hover .stepNum {
+ border: 2px solid #0098f5;
+ color: #0098f5;
+ }
+}
+
+:deep(.el-date-editor) {
+ width: 100%;
+}
+.el-select {
+ width: 100%;
+}
+:deep(.el-textarea.is-disabled .el-textarea__inner) {
+ background-color: var(--el-card-bg-color);
+ color: var(--el-input-text-color, var(--el-text-color-regular));
+}
+:deep(.el-input.is-disabled .el-input__inner) {
+ color: var(--el-input-text-color, var(--el-text-color-regular));
+}
+//:deep(.el-input.is-disabled .el-input__wrapper) {
+// background-color: var(--el-card-bg-color);
+// box-shadow: none;
+//}
+.red {
+ background: rgba(255,0,0,0.6);
+}
+.orange {
+ background: rgba(248,82,8,0.6);
+}
+.yellow {
+ background: rgba(247,255,0,0.6);
+}
+.blue {
+ background: rgba(0,112,192,0.6);
+}
+</style>
--
Gitblit v1.9.2