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