工程安全分析模块初步完善

This commit is contained in:
BianLzhaoMin 2026-01-21 11:05:40 +08:00
parent 971a7b9050
commit cd86cdae33
6 changed files with 712 additions and 1045 deletions

View File

@ -1,7 +1,8 @@
import request from '@/utils/request'
import requestFormData from '@/utils/request_formdata'
// 获取工程安全分析一本账列表
// 获取工程安全分析列表
export function getProjectSafetyAnalysisListAPI(data) {
return request({
url: '/background/sj/safety/list',
@ -10,7 +11,7 @@ export function getProjectSafetyAnalysisListAPI(data) {
})
}
// 新增工程安全分析一本账列表
// 新增工程安全分析
export function addProjectSafetyAnalysisAPI(data) {
return request({
url: '/background/sj/safety/addData',
@ -19,74 +20,46 @@ export function addProjectSafetyAnalysisAPI(data) {
})
}
// 编辑工程安全分析一本账列表
// 编辑工程安全分析
export function editProjectSafetyAnalysisAPI(data) {
return request({
url: '/background/sj/safety/updateData',
url: '/background/sj/safety/editData',
method: 'post',
data,
})
}
// 删除工程安全分析一本账列表
// 删除工程安全分析
export function deleteProjectSafetyAnalysisAPI(data) {
return request({
url: '/background/sj/safety/delete',
url: '/background/sj/safety/deleteData',
method: 'post',
data,
})
}
// 获取视频风险分析列表
export function getVideoSafetyAnalysisListAPI(data) {
// 获取工程安全分析阈值列表
export function getProjectSafetyThresholdListAPI(data) {
return request({
url: '/background/sj/safety/getVideoList',
url: '/background/sj/safety/threshold/list',
method: 'get',
params: data,
})
}
// 新增视频风险分析列表
export function addVideoSafetyAnalysisAPI(data) {
return requestFormData({
url: '/background/sj/safety/addVideoFile',
method: 'post',
data,
})
}
// 编辑工视频风险分析列表
export function editVideoSafetyAnalysisAPI(data) {
return requestFormData({
url: '/background/sj/safety/updateVideoFile',
method: 'post',
data,
})
}
// 删除工视频风险分析列表
export function deleteVideoSafetyAnalysisAPI(data) {
// 新增工程安全分析阈值
export function addProjectSafetyThresholdAPI(data) {
return request({
url: '/background/sj/safety/deleteVideo',
url: '/background/sj/safety/threshold/add',
method: 'post',
data,
})
}
// 下载模板
export function downloadProjectTemplateAPI(data = {}) {
// 编辑工程安全分析阈值
export function editProjectSafetyThresholdAPI(data) {
return request({
url: '/background/sj/safety/downloadFile',
method: 'get',
responseType: 'blob',
params: data,
})
}
// 导入工程安全分析一本账列表
export function importProjectSafetyAnalysisAPI(data) {
return requestFormData({
url: '/background/sj/safety/importFileData',
url: '/background/sj/safety/threshold/edit',
method: 'post',
data,
})

View File

@ -1,31 +1,42 @@
<template>
<!-- 数据分析 项目质量 -->
<!-- 数据管理 项目质量 -->
<div class="app-container">
<el-form label-width="auto" inline :model="queryParams">
<el-form-item >
<el-form-item>
<el-input
clearable
v-model="queryParams.keyWord"
placeholder="请输入关键字"
/>
</el-form-item>
<el-form-item >
<el-date-picker
v-model="queryParams.dateTime"
value-format="yyyy-MM-dd"
clearable
type="daterange"
range-separator=" - "
start-placeholder="开始日期"
end-placeholder="结束日期"
style="width: 240px"
/>
<el-form-item>
<el-date-picker
v-model="queryParams.dateTime"
value-format="yyyy-MM-dd"
clearable
type="daterange"
range-separator=" - "
start-placeholder="开始日期"
end-placeholder="结束日期"
style="width: 240px"
/>
</el-form-item>
<el-form-item>
<el-button size="mini" icon="el-icon-search" type="primary" @click="onHandleQuery">
<el-button
size="mini"
icon="el-icon-search"
type="primary"
@click="onHandleQuery"
>
查询
</el-button>
<el-button size="mini" icon="el-icon-refresh" type="warning" plain @click="onHandleReset">
<el-button
size="mini"
icon="el-icon-refresh"
type="warning"
plain
@click="onHandleReset"
>
重置
</el-button>
<el-button
@ -144,7 +155,6 @@ export default {
label: '质量检测报告',
prop: 'acceptTable',
},
],
queryParams: {
pageNum: 1,

View File

@ -0,0 +1,305 @@
<template>
<div>
<el-form
:model="addAndEditForm"
label-width="auto"
ref="addAndEditFormRef"
:rules="addAndEditFormRules"
>
<el-row>
<el-col :span="12">
<el-form-item label="工程名称" prop="projectName">
<el-input
clearable
maxlength="100"
show-word-limit
placeholder="请输入工程名称"
v-model.trim="addAndEditForm.projectName"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="作业计划编号" prop="jobPlanCode">
<el-input
clearable
maxlength="100"
show-word-limit
placeholder="请输入作业计划编号"
v-model.trim="addAndEditForm.jobPlanCode"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="作业地点" prop="jobSite">
<el-input
clearable
maxlength="100"
show-word-limit
placeholder="请输入作业地点"
v-model.trim="addAndEditForm.jobSite"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="监测点编号" prop="monitorPointCode">
<el-input
clearable
maxlength="100"
show-word-limit
placeholder="请输入监测点编号"
v-model.trim="addAndEditForm.monitorPointCode"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="监测点名称" prop="monitorPointName">
<el-input
clearable
maxlength="100"
show-word-limit
placeholder="请输入监测点名称"
v-model.trim="addAndEditForm.monitorPointName"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="温度" prop="temperature">
<el-input
clearable
maxlength="20"
placeholder="请输入温度"
v-model.trim="addAndEditForm.temperature"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="湿度" prop="humidity">
<el-input
clearable
maxlength="20"
placeholder="请输入湿度"
v-model.trim="addAndEditForm.humidity"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="风速" prop="windSpeed">
<el-input
clearable
maxlength="20"
placeholder="请输入风速"
v-model.trim="addAndEditForm.windSpeed"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="空气质量" prop="airQuality">
<el-input
clearable
maxlength="20"
placeholder="请输入空气质量"
v-model.trim="addAndEditForm.airQuality"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="是否存在隐患" prop="hiddenDanger">
<el-input
clearable
maxlength="100"
placeholder="请输入是否存在隐患"
v-model.trim="addAndEditForm.hiddenDanger"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="分析与改进" prop="analyzeImprove">
<el-input
clearable
type="textarea"
:rows="3"
maxlength="200"
show-word-limit
placeholder="请输入分析与改进"
v-model.trim="addAndEditForm.analyzeImprove"
/>
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
</template>
<script>
import {
addProjectSafetyAnalysisAPI,
editProjectSafetyAnalysisAPI,
} from '@/api/dataManage/projectSafety'
export default {
name: 'AddAndEditForm',
props: {
detailsId: {
type: [Number, String],
default: '',
},
editRow: {
type: Object,
default: () => {},
},
},
data() {
return {
addAndEditForm: {
projectName: '',
jobPlanCode: '',
jobSite: '',
monitorPointCode: '',
monitorPointName: '',
temperature: '',
humidity: '',
windSpeed: '',
airQuality: '',
hiddenDanger: '',
analyzeImprove: '',
},
addAndEditFormRules: {
projectName: [
{
required: true,
message: '请输入工程名称',
trigger: 'blur',
},
],
jobPlanCode: [
{
required: true,
message: '请输入作业计划编号',
trigger: 'blur',
},
],
jobSite: [
{
required: true,
message: '请输入作业地点',
trigger: 'blur',
},
],
monitorPointCode: [
{
required: true,
message: '请输入监测点编号',
trigger: 'blur',
},
],
monitorPointName: [
{
required: true,
message: '请输入监测点名称',
trigger: 'blur',
},
],
temperature: [
{
required: true,
message: '请输入温度',
trigger: 'blur',
},
],
humidity: [
{
required: true,
message: '请输入湿度',
trigger: 'blur',
},
],
windSpeed: [
{
required: true,
message: '请输入风速',
trigger: 'blur',
},
],
airQuality: [
{
required: true,
message: '请输入空气质量',
trigger: 'blur',
},
],
},
}
},
methods: {
submitForm() {
return new Promise((resolve, reject) => {
this.$refs.addAndEditFormRef.validate(async (valid) => {
if (valid) {
const params = this.addAndEditForm
if (this.detailsId) {
params.id = this.detailsId
}
const API = this.detailsId
? editProjectSafetyAnalysisAPI
: addProjectSafetyAnalysisAPI
const res = await API(params)
if (res.code === 200) {
resolve(true)
} else {
reject(false)
}
} else {
reject(false)
}
})
})
},
},
watch: {
editRow: {
handler(newVal) {
if (Object.keys(newVal).length > 0) {
const {
projectName,
jobPlanCode,
jobSite,
monitorPointCode,
monitorPointName,
temperature,
humidity,
windSpeed,
airQuality,
hiddenDanger,
analyzeImprove,
} = newVal
this.addAndEditForm.projectName = projectName
this.addAndEditForm.jobPlanCode = jobPlanCode
this.addAndEditForm.jobSite = jobSite
this.addAndEditForm.monitorPointCode = monitorPointCode
this.addAndEditForm.monitorPointName = monitorPointName
this.addAndEditForm.temperature = temperature
this.addAndEditForm.humidity = humidity
this.addAndEditForm.windSpeed = windSpeed
this.addAndEditForm.airQuality = airQuality
this.addAndEditForm.hiddenDanger = hiddenDanger
this.addAndEditForm.analyzeImprove = analyzeImprove
}
},
immediate: true,
},
},
}
</script>
<style></style>

View File

@ -1,249 +0,0 @@
<template>
<div>
<el-form
:model="addAndEditForm"
label-width="auto"
ref="addAndEditFormRef"
:rules="addAndEditFormRules"
>
<el-row>
<el-col :span="12">
<el-form-item label="风险编号" prop="riskCode">
<el-input
clearable
maxlength="50"
show-word-limit
placeholder="请输入风险编号"
v-model.trim="addAndEditForm.riskCode"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="作业部位" prop="riskSite">
<el-input
clearable
maxlength="50"
show-word-limit
placeholder="请输入作业部位"
v-model.trim="addAndEditForm.riskSite"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="风险等级" prop="riskLevel">
<!-- <el-input
clearable
maxlength="50"
show-word-limit
placeholder="请输入风险等级"
v-model.trim="addAndEditForm.riskLevel"
/> -->
<el-select
v-model="addAndEditForm.riskLevel"
placeholder="请选择风险等级"
clearable
style="width: 100%"
filterable
>
<el-option label="一级风险" value="1" />
<el-option label="二级风险" value="2" />
<el-option label="三级风险" value="3" />
<el-option label="四级风险" value="4" />
<el-option label="五级风险" value="5" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="预控措施" prop="controller">
<el-input
clearable
maxlength="50"
show-word-limit
placeholder="请输入预控措施"
v-model.trim="addAndEditForm.controller"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item
label="风险控制关键因素"
prop="riskController"
>
<el-input
clearable
maxlength="50"
show-word-limit
placeholder="请输入风险控制关键因素"
v-model.trim="addAndEditForm.riskController"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="开始日期" prop="startTime">
<el-date-picker
type="date"
style="width: 100%"
value-format="yyyy-MM-dd"
placeholder="请选择开始日期"
v-model="addAndEditForm.startTime"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="是否销号" prop="isXh">
<el-radio-group v-model="addAndEditForm.isXh">
<el-radio label="1"></el-radio>
<el-radio label="0"></el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12"> </el-col>
</el-row>
</el-form>
</div>
</template>
<script>
import {
addProjectSafetyAnalysisAPI,
editProjectSafetyAnalysisAPI,
} from '@/api/dataAnalysis/projectSafety'
export default {
name: 'AddAndEditFormOne',
props: {
detailsId: {
type: [Number, String],
default: '',
},
editRow: {
type: Object,
default: () => {},
},
},
data() {
return {
addAndEditForm: {
riskCode: '',
riskSite: '',
riskLevel: '',
controller: '',
riskController: '',
startTime: '',
isXh: '',
},
addAndEditFormRules: {
riskCode: [
{
required: true,
message: '请输入风险编号',
trigger: 'blur',
},
],
riskSite: [
{
required: true,
message: '请输入作业部位',
trigger: 'blur',
},
],
riskLevel: [
{
required: true,
message: '请输入风险等级',
trigger: 'blur',
},
],
controller: [
{
required: true,
message: '请输入预控措施',
trigger: 'blur',
},
],
riskController: [
{
required: true,
message: '请输入风险控制关键因素',
trigger: 'blur',
},
],
startTime: [
{
required: true,
message: '请选择开始日期',
trigger: 'blur',
},
],
isXh: [
{
required: true,
message: '请选择是否销号',
trigger: 'blur',
},
],
},
}
},
methods: {
submitForm() {
return new Promise((resolve, reject) => {
this.$refs.addAndEditFormRef.validate(async (valid) => {
if (valid) {
const params = this.addAndEditForm
if (this.detailsId) {
params.id = this.detailsId
}
const API = this.detailsId
? editProjectSafetyAnalysisAPI
: addProjectSafetyAnalysisAPI
const res = await API(params)
if (res.code === 200) {
resolve(true)
} else {
reject(false)
}
} else {
reject(false)
}
})
})
},
},
watch: {
editRow: {
handler(newVal) {
if (Object.keys(newVal).length > 0) {
const {
riskCode,
riskSite,
riskLevel,
controller,
riskController,
startTime,
isXh,
} = newVal
this.addAndEditForm.riskCode = riskCode
this.addAndEditForm.riskSite = riskSite
this.addAndEditForm.riskLevel = riskLevel
this.addAndEditForm.controller = controller
this.addAndEditForm.riskController = riskController
this.addAndEditForm.startTime = startTime
this.addAndEditForm.isXh = isXh
}
},
immediate: true,
},
},
}
</script>
<style></style>

View File

@ -1,239 +0,0 @@
<template>
<div>
<el-form
:model="addAndEditForm"
label-width="120px"
ref="addAndEditFormRef"
:rules="addAndEditFormRules"
>
<el-row>
<el-col :span="12">
<el-form-item label="球机名称" prop="ballName">
<el-input
clearable
maxlength="50"
show-word-limit
placeholder="请输入球机名称"
v-model.trim="addAndEditForm.ballName"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="创建时间" prop="createTime">
<el-date-picker
type="date"
style="width: 100%"
value-format="yyyy-MM-dd"
placeholder="请选择创建时间"
v-model="addAndEditForm.createTime"
/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="名称" prop="name">
<el-input
clearable
maxlength="50"
show-word-limit
placeholder="请输入名称"
v-model.trim="addAndEditForm.name"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="图片" prop="fileList">
<UploadImgFormData
:limit="1"
:file-size="10"
:multiple="true"
ref="faceImgRef"
v-if="!Base64PhotoUrl"
:file-type="['jpg', 'png', 'jpeg']"
:file-list.sync="addAndEditForm.fileList"
:is-uploaded="addAndEditForm.fileList.length >= 1"
/>
<div class="id-card-face-img" v-else>
<img
:src="
'data:image/jpeg;base64,' + Base64PhotoUrl
"
/>
<i
class="el-icon-delete"
@click="onDeleteFaceImg"
/>
</div>
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
</template>
<script>
import UploadImgFormData from '@/components/UploadImgFormData/index.vue'
import {
addVideoSafetyAnalysisAPI,
editVideoSafetyAnalysisAPI,
} from '@/api/dataAnalysis/projectSafety'
export default {
name: 'AddAndEditFormOne',
components: {
UploadImgFormData,
},
props: {
detailsId: {
type: [Number, String],
default: '',
},
editRow: {
type: Object,
default: () => {},
},
},
data() {
return {
Base64PhotoUrl: null,
addAndEditForm: {
ballName: '',
createTime: '',
name: '',
fileList: [],
},
addAndEditFormRules: {
ballName: [
{
required: true,
message: '请输入球机名称',
trigger: 'blur',
},
],
createTime: [
{
required: true,
message: '请选择创建时间',
trigger: 'blur',
},
],
name: [
{
required: true,
message: '请输入名称',
trigger: 'blur',
},
],
fileList: [
{
required: true,
message: '请上传图片',
trigger: 'blur',
},
],
},
}
},
methods: {
submitForm() {
return new Promise((resolve, reject) => {
this.$refs.addAndEditFormRef.validate(async (valid) => {
if (valid) {
const { ballName, createTime, name, fileList } =
this.addAndEditForm
const params = {
ballName,
createTime,
name,
}
if (this.detailsId) {
params.id = this.detailsId
}
const formData = new FormData()
if (fileList.length > 0) {
fileList.forEach((item) => {
if (!item.id) {
formData.append('file', item.raw)
}
})
}
for (const key in params) {
formData.append(key, params[key])
}
const API = this.detailsId
? editVideoSafetyAnalysisAPI
: addVideoSafetyAnalysisAPI
const res = await API(formData)
if (res.code === 200) {
resolve(true)
} else {
reject(false)
}
} else {
reject(false)
}
})
})
},
//
onDeleteFaceImg() {
this.Base64PhotoUrl = null
this.addAndEditForm.fileList = []
},
},
watch: {
editRow: {
handler(newVal) {
if (Object.keys(newVal).length > 0) {
const { ballName, createTime, name, bast64 } = newVal
this.addAndEditForm.ballName = ballName
this.addAndEditForm.createTime = createTime
this.addAndEditForm.name = name
this.addAndEditForm.fileList = [
{
raw: bast64,
name: '图片',
url: bast64,
id: newVal.id,
},
]
this.Base64PhotoUrl = bast64
}
},
immediate: true,
},
},
}
</script>
<style lang="scss" scoped>
.id-card-face-img {
width: 148px;
height: 148px;
border: 1px dashed #dcdfe6;
border-radius: 4px;
position: relative;
& img {
width: 100%;
height: 100%;
}
.el-icon-delete {
position: absolute;
top: 4px;
right: 4px;
cursor: pointer;
color: #ff4949;
font-size: 20px;
}
}
</style>

View File

@ -1,259 +1,115 @@
<template>
<!-- 数据分析 项目质量 -->
<!-- 数据管理 工程安全分析 -->
<div class="app-container">
<el-radio-group v-model="safetyType" style="margin-bottom: 20px">
<el-radio-button label="风险一本账"></el-radio-button>
<el-radio-button label="视频风险分析"></el-radio-button>
</el-radio-group>
<el-form label-width="auto" inline :model="queryParams">
<el-form-item label="作业地点">
<el-input
v-model="queryParams.jobSite"
clearable
placeholder="请输入作业地点"
/>
</el-form-item>
<el-form-item label="监测点编号">
<el-input
v-model="queryParams.monitorPointCode"
clearable
placeholder="请输入监测点编号"
/>
</el-form-item>
<template v-if="safetyType === '风险一本账'">
<el-form label-width="auto" inline :model="queryParams_1">
<el-form-item label="风险编号">
<el-input
v-model="queryParams_1.riskCode"
clearable
placeholder="请输入风险编号"
/>
</el-form-item>
<el-form-item label="作业部位">
<el-input
v-model="queryParams_1.riskSite"
clearable
placeholder="请输入作业部位"
/>
</el-form-item>
<el-form-item label="风险等级">
<!-- <el-input
v-model="queryParams_1.riskLevel"
clearable
placeholder="请输入风险等级"
/> -->
<el-select
v-model="queryParams_1.riskLevel"
placeholder="请选择风险等级"
clearable
style="width: 100%"
filterable
>
<el-option label="一级风险" value="1" />
<el-option label="二级风险" value="2" />
<el-option label="三级风险" value="3" />
<el-option label="四级风险" value="4" />
<el-option label="五级风险" value="5" />
</el-select>
</el-form-item>
<el-form-item>
<el-button
size="mini"
type="primary"
@click="onHandleQuery"
>
查询
</el-button>
<el-button
size="mini"
type="primary"
@click="onHandleReset"
>
重置
</el-button>
<el-button
size="mini"
type="primary"
@click="onHandleAddProject"
>
新增
</el-button>
<el-button
size="mini"
type="primary"
@click="onHandleImport"
>
导入
</el-button>
<el-button
size="mini"
type="primary"
@click="onHandleDownloadTemplate"
>
下载模板
</el-button>
</el-form-item>
</el-form>
<el-table border :data="projectList">
<el-table-column
align="center"
:key="column.prop"
:prop="column.prop"
:label="column.label"
show-overflow-tooltip
v-for="column in tableColumns"
<el-form-item>
<el-button
size="mini"
type="primary"
icon="el-icon-search"
@click="onHandleQuery"
>
<template slot-scope="scope">
<template v-if="column.prop === 'isXh'">
<el-tag
v-if="scope.row.isXh === '1'"
type="warning"
size="mini"
>
</el-tag>
<el-tag v-else type="primary" size="mini">
</el-tag>
</template>
查询
</el-button>
<template v-else-if="column.prop === 'riskLevel'">
{{ indexToRiskLevel(scope.row.riskLevel) }}
</template>
<template v-else>
{{ scope.row[column.prop] }}
</template>
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="140">
<template slot-scope="scope">
<el-button
type="primary"
size="mini"
style="padding: 6px 6px"
@click="onHandleEditProject_1(scope.row)"
>
编辑
</el-button>
<el-button
type="danger"
size="mini"
style="padding: 6px 6px"
@click="onHandleDeleteProject_1(scope.row)"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<pagination
:total="total_1"
@pagination="getProjectSafetyAnalysisList"
:page.sync="queryParams_1.pageNum"
:limit.sync="queryParams_1.pageSize"
/>
</template>
<template v-if="safetyType === '视频风险分析'">
<el-form label-width="auto" inline :model="queryParams_2">
<el-form-item label="球机名称">
<el-input
v-model="queryParams_2.ballName"
placeholder="请输入球机名称"
clearable
/>
</el-form-item>
<el-form-item label="名称">
<el-input
v-model="queryParams_2.name"
placeholder="请输入名称"
clearable
/>
</el-form-item>
<el-form-item>
<el-button
size="mini"
type="primary"
@click="onHandleQuery_2"
>
查询
</el-button>
<el-button
size="mini"
type="primary"
@click="onHandleReset_2"
>
重置
</el-button>
<el-button
size="mini"
type="primary"
@click="onHandleAddProject"
>
新增
</el-button>
</el-form-item>
</el-form>
<el-table border :data="projectList_1">
<el-table-column
align="center"
:key="column.prop"
:prop="column.prop"
:label="column.label"
show-overflow-tooltip
v-for="column in tableColumns_1"
<el-button
size="mini"
type="warning"
icon="el-icon-refresh"
plain
@click="onHandleReset"
>
<template slot-scope="scope">
<!-- <img :src="scope.row.bast64" alt="" style="width: 100px; height: 100px;"> -->
重置
</el-button>
<el-button
size="mini"
type="primary"
icon="el-icon-plus"
@click="onHandleAddProjectSafety"
>
新增
</el-button>
<template v-if="column.prop === 'bast64'">
<img
alt=""
style="width: 48px; height: 48px"
:src="`data:image/jpeg;base64,${scope.row.bast64}`"
/>
</template>
<template v-else>
{{ scope.row[column.prop] }}
</template>
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="140">
<template slot-scope="scope">
<el-button
type="primary"
size="mini"
style="padding: 6px 6px"
@click="onHandleEditProject(scope.row)"
>
编辑
</el-button>
<el-button
type="danger"
size="mini"
style="padding: 6px 6px"
@click="onHandleDeleteProject(scope.row)"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
</template>
<el-button
size="mini"
type="warning"
icon="el-icon-setting"
@click="onHandleThresholdConfig"
>
阈值配置
</el-button>
</el-form-item>
</el-form>
<el-table border :data="projectList">
<el-table-column
align="center"
:key="column.prop"
:prop="column.prop"
:label="column.label"
show-overflow-tooltip
v-for="column in tableColumns"
>
<template slot-scope="scope">
{{ scope.row[column.prop] }}
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="160">
<template slot-scope="scope">
<el-button
type="primary"
size="mini"
style="padding: 6px 6px"
@click="onHandleEditProject_1(scope.row)"
>
编辑
</el-button>
<el-button
type="danger"
size="mini"
style="padding: 6px 6px"
@click="onHandleDeleteProject_1(scope.row)"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<pagination
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="onHandleQuery"
/>
<el-dialog
append-to-body
width="80%"
v-if="addAndEditDialogVisible"
:visible.sync="addAndEditDialogVisible"
:title="`${addAndEditDialogTitle}${safetyType}`"
:title="addAndEditDialogTitle"
>
<AddAndEditFormOne
v-if="safetyType === '风险一本账'"
ref="addAndEditFormOneRef"
:detailsId="detailsOneId"
:editRow="editRow_1"
/>
<AddAndEditFormTwo
v-if="safetyType === '视频风险分析'"
ref="addAndEditFormTwoRef"
:detailsId="detailsTwoId"
:editRow="editRow_2"
<AddAndEditForm
ref="AddAndEditFormRef"
:details-id="detailsOneId"
:edit-row="editRow_1"
/>
<div slot="footer" class="dialog-footer">
<el-button @click="addAndEditDialogVisible = false">
关闭
@ -266,33 +122,99 @@
<el-dialog
append-to-body
width="40%"
v-if="importDialogVisible"
:visible.sync="importDialogVisible"
title="数据导入"
width="420px"
v-if="thresholdDialogVisible"
:visible.sync="thresholdDialogVisible"
title="阈值配置"
>
<UploadFileFormData
:limit="1"
:file-size="50"
:multiple="false"
:file-type="['xls', 'xlsx']"
uploadTip="请导入xls、xlsx格式文件"
:file-list.sync="importFileList"
/>
<el-form
:model="thresholdForm"
:rules="thresholdRules"
ref="thresholdFormRef"
label-width="110px"
>
<el-form-item label="温度阈值" prop="temperatureRange">
<div class="range-box">
<el-input
v-model="thresholdForm.temperatureMin"
clearable
placeholder="最低值"
type="number"
/>
<span class="range-split">-</span>
<el-input
v-model="thresholdForm.temperatureMax"
clearable
placeholder="最高值"
type="number"
/>
</div>
</el-form-item>
<el-form-item label="湿度阈值" prop="humidityRange">
<div class="range-box">
<el-input
v-model="thresholdForm.humidityMin"
clearable
placeholder="最低值"
type="number"
/>
<span class="range-split">-</span>
<el-input
v-model="thresholdForm.humidityMax"
clearable
placeholder="最高值"
type="number"
/>
</div>
</el-form-item>
<el-form-item label="风速阈值" prop="windSpeedRange">
<div class="range-box">
<el-input
v-model="thresholdForm.windSpeedMin"
clearable
placeholder="最低值"
type="number"
/>
<span class="range-split">-</span>
<el-input
v-model="thresholdForm.windSpeedMax"
clearable
placeholder="最高值"
type="number"
/>
</div>
</el-form-item>
<el-form-item label="空气质量阈值" prop="airQualityRange">
<div class="range-box">
<el-input
v-model="thresholdForm.airQualityMin"
clearable
placeholder="最低值"
type="number"
/>
<span class="range-split">-</span>
<el-input
v-model="thresholdForm.airQualityMax"
clearable
placeholder="最高值"
type="number"
/>
</div>
</el-form-item>
</el-form>
<el-row class="dialog-footer-btn">
<el-button size="mini" @click="onHandleCancelImport">
<div slot="footer" class="dialog-footer">
<el-button @click="thresholdDialogVisible = false">
取消
</el-button>
<el-button
size="mini"
type="primary"
v-loading.fullscreen.lock="loading"
@click="onHandleConfirmImport"
:loading="thresholdSubmitLoading"
@click="onHandleThresholdSubmit"
>
确定
</el-button>
</el-row>
</div>
</el-dialog>
</div>
</template>
@ -301,186 +223,163 @@
import {
getProjectSafetyAnalysisListAPI,
deleteProjectSafetyAnalysisAPI,
getVideoSafetyAnalysisListAPI,
deleteVideoSafetyAnalysisAPI,
downloadProjectTemplateAPI,
importProjectSafetyAnalysisAPI,
} from '@/api/dataAnalysis/projectSafety'
getProjectSafetyThresholdListAPI,
addProjectSafetyThresholdAPI,
editProjectSafetyThresholdAPI,
} from '@/api/dataManage/projectSafety'
import { downloadFile } from '@/utils/download'
import AddAndEditFormOne from './components/addAndEditFormOne.vue'
import AddAndEditFormTwo from './components/addAndEditFormTwo.vue'
import UploadFileFormData from '@/components/UploadFileFormData'
import AddAndEditForm from './components/addAndEditForm.vue'
export default {
name: 'ProjectQuality',
components: {
AddAndEditFormOne,
AddAndEditFormTwo,
UploadFileFormData,
AddAndEditForm,
},
data() {
return {
total_1: 0,
total_2: 0,
total: 0,
detailsOneId: '',
detailsTwoId: '',
editRow_1: {}, //
editRow_2: {}, //
safetyType: '风险一本账',
projectList: [], //
projectList_1: [], //
importFileList: [], //
addAndEditDialogVisible: false,
importDialogVisible: false,
loading: false,
addAndEditDialogTitle: '',
tableColumns: [
{
label: '风险编号',
prop: 'riskCode',
},
{
label: '作业部位',
prop: 'riskSite',
},
{
label: '风险等级',
prop: 'riskLevel',
},
{
label: '预控措施',
prop: 'controller',
},
{
label: '风险控制关键因素',
prop: 'riskController',
},
{
label: '开始日期',
prop: 'startTime',
},
{
label: '是否销号',
prop: 'isXh',
},
{ label: '工程名称', prop: 'projectName' },
{ label: '作业计划编号', prop: 'jobPlanCode' },
{ label: '作业地点', prop: 'jobSite' },
{ label: '监测点编号', prop: 'monitorPointCode' },
{ label: '监测点名称', prop: 'monitorPointName' },
{ label: '温度', prop: 'temperature' },
{ label: '湿度', prop: 'humidity' },
{ label: '风速', prop: 'windSpeed' },
{ label: '空气质量', prop: 'airQuality' },
{ label: '是否存在隐患', prop: 'hiddenDanger' },
{ label: '分析与改进', prop: 'analyzeImprove' },
],
tableColumns_1: [
{
label: '球机名称',
prop: 'ballName',
},
{
label: '创建时间',
prop: 'createTime',
},
{
label: '图片',
prop: 'bast64',
},
{
label: '名称',
prop: 'name',
},
],
queryParams_1: {
queryParams: {
pageNum: 1,
pageSize: 10,
riskCode: '',
riskSite: '',
riskLevel: '',
jobSite: '',
monitorPointCode: '',
},
queryParams_2: {
pageNum: 1,
pageSize: 10,
ballName: '',
name: '',
//
thresholdDialogVisible: false,
thresholdSubmitLoading: false,
thresholdId: '',
thresholdForm: {
temperatureMin: '',
temperatureMax: '',
humidityMin: '',
humidityMax: '',
windSpeedMin: '',
windSpeedMax: '',
airQualityMin: '',
airQualityMax: '',
},
thresholdRules: {
temperatureRange: [
{
validator: this.validateRange(
'temperatureMin',
'temperatureMax',
'温度阈值',
),
trigger: 'blur',
},
],
humidityRange: [
{
validator: this.validateRange(
'humidityMin',
'humidityMax',
'湿度阈值',
),
trigger: 'blur',
},
],
windSpeedRange: [
{
validator: this.validateRange(
'windSpeedMin',
'windSpeedMax',
'风速阈值',
),
trigger: 'blur',
},
],
airQualityRange: [
{
validator: this.validateRange(
'airQualityMin',
'airQualityMax',
'空气质量阈值',
),
trigger: 'blur',
},
],
},
}
},
created() {
this.getProjectSafetyAnalysisList()
this.getVideoSafetyAnalysisList()
},
methods: {
validateRange(minKey, maxKey, label) {
return (rule, value, callback) => {
const min = this.thresholdForm[minKey]
const max = this.thresholdForm[maxKey]
if (min === '' || max === '') {
callback(new Error(`${label}的最小值和最大值不能为空`))
return
}
const minNum = Number(min)
const maxNum = Number(max)
if (Number.isNaN(minNum) || Number.isNaN(maxNum)) {
callback(new Error(`${label}仅支持数字`))
return
}
if (minNum > maxNum) {
callback(new Error(`${label}的最小值不能大于最大值`))
return
}
callback()
}
},
onHandleQuery() {
this.getProjectSafetyAnalysisList()
},
onHandleQuery_2() {
this.getVideoSafetyAnalysisList()
},
onHandleReset_2() {
this.queryParams_2 = {
pageNum: 1,
pageSize: 10,
ballName: '',
name: '',
}
this.getVideoSafetyAnalysisList()
},
onHandleAddProject() {
onHandleAddProjectSafety() {
this.addAndEditDialogVisible = true
this.addAndEditDialogTitle = '新增'
this.detailsOneId = ''
this.editRow_1 = {}
},
onHandleReset() {
this.queryParams_1 = {
this.queryParams = {
pageNum: 1,
pageSize: 10,
riskCode: '',
riskSite: '',
riskLevel: '',
jobSite: '',
monitorPointCode: '',
}
this.getProjectSafetyAnalysisList()
// this.getProjectSafetyAnalysisList()
},
//
async getProjectSafetyAnalysisList() {
const res = await getProjectSafetyAnalysisListAPI(
this.queryParams_1,
)
const res = await getProjectSafetyAnalysisListAPI(this.queryParams)
this.projectList = res.rows
this.total_1 = res.total
this.total = res.total
},
//
async getVideoSafetyAnalysisList() {
const res = await getVideoSafetyAnalysisListAPI(this.queryParams_2)
this.projectList_1 = res.rows
this.total_2 = res.total
},
//
addProjectQuality() {},
//
onHandleEditProject(row) {
this.editRow_2 = row
this.detailsTwoId = row.id
this.addAndEditDialogVisible = true
this.addAndEditDialogTitle = '编辑'
},
//
onHandleDeleteProject(row) {
this.$confirm('确定删除该视频风险分析行吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
}).then(async () => {
const res = await deleteVideoSafetyAnalysisAPI({ id: row.id })
if (res.code === 200) {
this.$message.success('删除成功')
this.getVideoSafetyAnalysisList()
} else {
this.$message.error('删除失败')
}
})
},
//
//
onHandleEditProject_1(row) {
this.editRow_1 = row
this.detailsOneId = row.id
@ -488,9 +387,9 @@ export default {
this.addAndEditDialogTitle = '编辑'
},
//
//
onHandleDeleteProject_1(row) {
this.$confirm('确定删除该风险一本账行吗?', '提示', {
this.$confirm('确定删除该项目安全吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
}).then(async () => {
@ -504,115 +403,71 @@ export default {
})
},
indexToRiskLevel(index) {
switch (index) {
case '1':
return '一级风险'
case '2':
return '二级风险'
case '3':
return '三级风险'
case '4':
return '四级风险'
case '5':
return '五级风险'
default:
return ''
}
},
//
async onHandleSubmit() {
if (this.safetyType === '风险一本账') {
const res = await this.$refs.addAndEditFormOneRef.submitForm()
if (res) {
this.$message.success(
this.addAndEditDialogTitle === '新增'
? '新增成功'
: '编辑成功',
)
this.getProjectSafetyAnalysisList()
this.addAndEditDialogVisible = false
} else {
this.$message.error('提交失败')
}
} else {
const res = await this.$refs.addAndEditFormTwoRef.submitForm()
if (res) {
this.$message.success(
this.addAndEditDialogTitle === '新增'
? '新增成功'
: '编辑成功',
)
this.getVideoSafetyAnalysisList()
this.addAndEditDialogVisible = false
} else {
this.$message.error('提交失败')
}
}
},
//
onHandleImport() {
this.importDialogVisible = true
this.importFileList = []
},
//
onHandleDownloadTemplate() {
downloadProjectTemplateAPI().then((res) => {
downloadFile({
fileName: '模板.xlsx',
fileData: res,
fileType: 'application/vnd.ms-excel;charset=utf-8',
})
})
},
//
onHandleCancelImport() {
this.importFileList = []
this.dialogConfig.outerVisible = false
},
//
async onHandleConfirmImport() {
if (this.importFileList.length > 0) {
const formData = new FormData()
// loading
this.loading = true
formData.append('file', this.importFileList[0].raw)
const res = await importProjectSafetyAnalysisAPI(formData)
this.loading = false
if (res.code === 200) {
this.$message.success('导入成功')
this.importFileList = []
this.importDialogVisible = false
this.getProjectSafetyAnalysisList()
} else {
this.$message.error(res.msg)
}
} else {
this.$confirm(
'当前未选择文件,确定后将关闭上传页面?',
'温馨提示',
{
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
},
const res = await this.$refs.AddAndEditFormRef.submitForm()
if (res) {
this.$message.success(
this.addAndEditDialogTitle === '新增'
? '新增成功'
: '编辑成功',
)
.then(async () => {
this.importFileList = []
this.importDialogVisible = false
})
.catch(() => {
// console.log('')
})
this.getProjectSafetyAnalysisList()
this.addAndEditDialogVisible = false
} else {
this.$message.error('提交失败')
}
},
//
async onHandleThresholdConfig() {
this.thresholdDialogVisible = true
await this.loadThreshold()
},
async loadThreshold() {
const res = await getProjectSafetyThresholdListAPI({
pageNum: 1,
pageSize: 1,
})
const record =
res?.data?.[0] ||
res?.rows?.[0] ||
(Array.isArray(res) ? res[0] : null)
if (record) {
this.thresholdId = record.id || ''
this.thresholdForm.temperatureMin = record.temperatureMin || ''
this.thresholdForm.temperatureMax = record.temperatureMax || ''
this.thresholdForm.humidityMin = record.humidityMin || ''
this.thresholdForm.humidityMax = record.humidityMax || ''
this.thresholdForm.windSpeedMin = record.windSpeedMin || ''
this.thresholdForm.windSpeedMax = record.windSpeedMax || ''
this.thresholdForm.airQualityMin = record.airQualityMin || ''
this.thresholdForm.airQualityMax = record.airQualityMax || ''
}
},
async onHandleThresholdSubmit() {
this.$refs.thresholdFormRef.validate(async (valid) => {
if (!valid) return
this.thresholdSubmitLoading = true
const payload = { ...this.thresholdForm }
if (this.thresholdId) {
payload.id = this.thresholdId
}
const API = this.thresholdId
? editProjectSafetyThresholdAPI
: addProjectSafetyThresholdAPI
const res = await API(payload)
this.thresholdSubmitLoading = false
if (res.code === 200) {
this.$message.success('阈值配置保存成功')
this.thresholdDialogVisible = false
} else {
this.$message.error(res.msg || '保存失败')
}
})
},
},
}
</script>
@ -641,4 +496,16 @@ export default {
text-align: right;
margin-top: 20px;
}
.range-box {
display: flex;
align-items: center;
gap: 8px;
}
.range-split {
width: 12px;
text-align: center;
color: #666;
}
</style>