<template>
|
<GlobalWindow
|
:title="title"
|
:visible.sync="visible"
|
@confirm="confirm"
|
@close="reject"
|
>
|
<div class="modal_wrap">
|
<div class="modal_content">
|
<div class="header">
|
<div class="left">
|
<div class="h1">隐患提报</div>
|
<div class="time">提报时间:{{model.createDate}}</div>
|
</div>
|
<div class="right" v-if="model.status==0">待处理</div>
|
<div class="right" style="background:#53b76f " v-if="model.status==1">已处理</div>
|
<div class="right" style="background:#dc362e " v-if="model.status==2">已退回</div>
|
</div>
|
<div class="info">
|
<div class="title">隐患提报详情</div>
|
<div class="list">
|
<div class="item">
|
<div class="label">提报人</div>
|
<div class="value">{{model.memberName || ''}} {{model.memberPhone || ''}}</div>
|
</div>
|
<div class="item">
|
<div class="label">隐患区域</div>
|
<div class="value">{{model.areaName || ''}}</div>
|
</div>
|
<div class="item">
|
<div class="label">隐患类型</div>
|
<div class="value">{{model.categoryName || ''}}</div>
|
</div>
|
<div class="item">
|
<div class="label">隐患描述</div>
|
<div class="value">{{model.content || ''}}</div>
|
</div>
|
<div class="item" style="width: 100%">
|
<div class="label">现场情况</div>
|
<div class="value" v-if="model.submitFileList ==null || !model.submitFileList.length">无</div>
|
<div class="value" v-if="model.submitFileList !=null && model.submitFileList.length">
|
<div v-for="item in model.submitFileList" :key="item.id" style="display: inline;margin-right: 20px">
|
<video
|
v-if="item.fileurlFull && item.fileurlFull.endsWith('.mp4')"
|
ref="videoRef"
|
autoplay
|
controls
|
preload="auto"
|
style="width: 80px;height: 80px;object-fit: contain;"
|
:src="item.fileurlFull"
|
/>
|
<el-image
|
v-else-if="item.fileurlFull"
|
style="width:80px; height: 80px"
|
:src="item.fileurlFull"
|
:preview-src-list="[item.fileurlFull]">
|
</el-image>
|
</div>
|
</div>
|
</div>
|
<div class="item" v-if="model.status==1||model.status==2" style="width: 100%">
|
<div class="label">处理前</div>
|
<div class="value" v-if="model.dealBeforeFileList !=null && model.dealBeforeFileList.length">
|
<div v-for="item in model.dealBeforeFileList" :key="item.id" style="display: inline;margin-right: 20px">
|
<video
|
v-if="item.fileurlFull && item.fileurlFull.endsWith('.mp4')"
|
ref="videoRef"
|
autoplay
|
controls
|
preload="auto"
|
style="width: 80px;height: 80px;object-fit: contain;"
|
:src="item.fileurlFull"
|
/>
|
<el-image
|
v-else-if="item.fileurlFull"
|
style="width:80px; height: 80px"
|
:src="item.fileurlFull"
|
:preview-src-list="[item.fileurlFull]">
|
</el-image>
|
</div>
|
</div>
|
</div>
|
<div class="item" v-if="model.status==1" style="width: 100%">
|
<div class="label">处理后</div>
|
<div class="value" v-if="model.dealAfterFileList !=null && model.dealAfterFileList.length">
|
<div v-for="item in model.dealAfterFileList" :key="item.id" style="display: inline;margin-right: 20px">
|
<video
|
v-if="item.fileurlFull && item.fileurlFull.endsWith('.mp4')"
|
ref="videoRef"
|
autoplay
|
controls
|
preload="auto"
|
style="width: 80px;height: 80px;object-fit: contain;"
|
:src="item.fileurlFull"
|
/>
|
<el-image
|
v-else-if="item.fileurlFull"
|
style="width:80px; height: 80px"
|
:src="item.fileurlFull"
|
:preview-src-list="[item.fileurlFull]">
|
</el-image>
|
</div>
|
</div>
|
</div>
|
<div class="item" v-if="model.status==1 || model.status==2">
|
<div class="label" v-if="model.status==1">处理说明</div>
|
<div class="label" v-if="model.status==2">退回说明</div>
|
<div class="value">{{model.checkInfo}}</div>
|
</div>
|
</div>
|
</div>
|
</div>
|
<div class="side">
|
<div class="side_title">审批流程</div>
|
<div class="list">
|
<div class="item" v-for="(item,index) in logList" :key="item.id">
|
<div class="separate" v-if="index < logList.length-1"></div>
|
<div class="info">
|
<img src="@/assets/icons/ic_tongguo.png" class="iconnew" v-if="(model.status ==1) || index < logList.length-1"/>
|
<img src="@/assets/icons/ic_dangqian.png" class="iconnew" v-if="(model.status==0) && index == logList.length-1"/>
|
<img src="@/assets/icons/ic_jujue.png" class="iconnew" v-if="(model.status==2) && index == logList.length-1"/>
|
<img v-if="item.avatar!=null && item.avatar !=''" :src="item.avatar" class="avatar" alt="" />
|
<img v-if="item.avatar ==null ||item.avatar ==''" src="@/assets/avatar/man.png" class="avatar" alt="" />
|
<div class="content">
|
<div class="line">
|
<div class="name">{{ item.title}}</div>
|
<div class="time">{{ item.createDate }}</div>
|
</div>
|
<div class="line">
|
<div class="company">
|
{{ item.createUserName }} {{ item.companyName }}
|
<div style="display: inline" v-if="index == logList.length-1">
|
(<span class="status-green" v-if="model.status==1">已处理</span>
|
<span class="status-blue" v-if="model.status==0">待处理</span>
|
<span class="status-red" v-if="model.status==2">已退回</span>)
|
</div>
|
</div>
|
</div>
|
</div>
|
</div>
|
</div>
|
</div>
|
</div>
|
</div>
|
<!-- -->
|
<template v-slot:footer>
|
<el-button @click="isShowProblem = true" type="primary" v-if="model.status==0&& model.checkUserId == userInfo.memberId" class="status-red">处理</el-button>
|
<el-button type="primary" plain v-if="model.status==0 && model.checkUserId == userInfo.memberId" @click="handleTransfer">转交</el-button>
|
<el-button @click="isBackProblem=true" v-if="model.status==0&& model.checkUserId == userInfo.memberId" type="danger" >退回</el-button>
|
<el-button @click="visible=false">返回</el-button>
|
</template>
|
|
<el-dialog
|
append-to-body
|
title="转交"
|
class="dialogCl"
|
:visible.sync="isShowTransfer"
|
width="480px"
|
>
|
<el-form :model="transForm" ref="transForm" :rules="rulesTrans">
|
<el-form-item label="隐患转交人" prop="memberId">
|
<el-select v-model="transForm.memberId" style="width: 300px" filterable clearable placeholder="请选择转交安全员">
|
<el-option
|
v-for="item in memberList"
|
:key="item.id"
|
:label="item.name"
|
:value="item.id">
|
</el-option>
|
</el-select>
|
</el-form-item>
|
</el-form>
|
<span slot="footer" class="dialog-footer">
|
<el-button @click="isShowTransfer = false">取消</el-button>
|
<el-button type="primary" :loading="transfering" @click="transferSubmit">确定</el-button>
|
</span>
|
</el-dialog>
|
<!-- 隐患 -->
|
<el-dialog
|
append-to-body
|
title="隐患处理"
|
class="dialogCl"
|
:visible.sync="isShowProblem"
|
width="600px"
|
>
|
<el-form :model="dealForm" :rules="rulesDeal" ref="dealForm" label-width="100px">
|
<el-form-item label="整改时间" prop="checkDate">
|
<el-date-picker
|
class="w300"
|
type="datetime"
|
value-format="yyyy-MM-dd HH:mm:ss"
|
placeholder="选择整改时间"
|
v-model="dealForm.checkDate"
|
/>
|
</el-form-item>
|
<el-form-item label="整改前" prop="dealBeforeFileList">
|
<div class="df_ac">
|
<upload width="80px" height="80px" :list="dealForm.dealBeforeFileList" :tips="'图片/视频'" accept=".png,.jpg,.jpeg,.mp4" folder="hiddendanger" @loading="uploading = true" @dele="dele($event,0)" @success="uploadFileList($event, 0)" />
|
</div>
|
</el-form-item>
|
<el-form-item label="整改后" prop="dealAfterFileList">
|
<div class="df_ac">
|
<upload width="80px" height="80px" :list="dealForm.dealAfterFileList" :tips="'图片/视频'" accept=".png,.jpg,.jpeg,.mp4" folder="hiddendanger" @loading="uploading = true" @dele="dele($event,1)" @success="uploadFileList($event, 1)" />
|
</div>
|
</el-form-item>
|
<el-form-item label="处理说明">
|
<el-input
|
type="textarea"
|
placeholder="请填写说明"
|
:rows="4"
|
v-model="dealForm.checkInfo"
|
/>
|
</el-form-item>
|
</el-form>
|
<span slot="footer" class="dialog-footer">
|
<el-button @click="isShowProblem = false">取消</el-button>
|
<el-button type="primary" :loading="dealing" @click="dealDo"
|
>确定</el-button
|
>
|
</span>
|
</el-dialog>
|
<el-dialog
|
append-to-body
|
title="隐患退回"
|
|
class="dialogCl"
|
:visible.sync="isBackProblem"
|
width="600px"
|
>
|
<el-form :model="backForm" :rules="rulesBack" ref="backForm" label-width="100px">
|
<el-form-item label="退回时间" prop="checkDate">
|
<el-date-picker
|
class="w300"
|
value-format="yyyy-MM-dd HH:mm:ss"
|
type="datetime"
|
placeholder="选择退回时间"
|
v-model="backForm.checkDate"
|
/>
|
</el-form-item>
|
<el-form-item label="整改前" prop="dealBeforeFileList">
|
<div class="df_ac">
|
<upload width="80px" height="80px" :list="backForm.dealBeforeFileList" :tips="'图片/视频'" accept=".png,.jpg,.jpeg,.mp4" folder="hiddendanger" @loading="uploading = true" @dele="dele($event,2)" @success="uploadFileList($event, 2)" />
|
</div>
|
</el-form-item>
|
<el-form-item label="退回说明">
|
<el-input
|
type="textarea"
|
placeholder="请填写说明"
|
:rows="4"
|
v-model="backForm.checkInfo"
|
/>
|
</el-form-item>
|
</el-form>
|
<span slot="footer" class="dialog-footer">
|
<el-button @click="isBackProblem= false">取消</el-button>
|
<el-button type="primary" :loading="transfering" @click="backDo"
|
>确定</el-button
|
>
|
</span>
|
</el-dialog>
|
</GlobalWindow>
|
</template>
|
|
<script>
|
import BaseOpera from '@/components/base/BaseOpera'
|
import GlobalWindow from '@/components/common/GlobalWindow'
|
import upload from '@/components/common/upload'
|
import { memberList } from '@/api/business/hiddenDangerParam'
|
import { mapState } from 'vuex'
|
export default {
|
components: { GlobalWindow, upload },
|
extends: BaseOpera,
|
data () {
|
return {
|
title: '访客预约详情',
|
visible: false,
|
transfering: false,
|
dataId: null,
|
model: { },
|
logList: [],
|
isShowAppr: false,
|
apprTitle: '同意',
|
param: {},
|
uploading: false,
|
dealing: false,
|
isShowProblem: false,
|
isBackProblem: false,
|
isShowTransfer: false,
|
rules: {},
|
rulesTrans: {
|
memberId: [
|
{ required: true, message: '请选择' }
|
]
|
},
|
rulesDeal: {
|
checkDate: [
|
{ required: true, message: '请选择整改时间' }
|
],
|
dealBeforeFileList: [
|
{ required: true, message: '请上传整改前情况' }
|
],
|
dealAfterFileList: [
|
{ required: true, message: '请上传整改后情况' }
|
]
|
},
|
rulesBack: {
|
checkDate: [
|
{ required: true, message: '请选择退回时间' }
|
]
|
/*,
|
dealBeforeFileList: [
|
{ required: true, message: '请上传整改前情况' }
|
]*/
|
},
|
memberList: [],
|
transForm: {
|
memberId: null
|
},
|
dealForm: {
|
checkDate: null,
|
checkInfo: null,
|
dealBeforeFileList: [],
|
dealAfterFileList: []
|
},
|
backForm: {
|
checkDate: null,
|
checkInfo: null,
|
dealBeforeFileList: []
|
}
|
}
|
},
|
computed: {
|
...mapState(['userInfo'])
|
},
|
created () {
|
this.config({
|
api: '/business/hiddenDanger',
|
'field.id': 'id'
|
})
|
},
|
methods: {
|
dele (index, type) {
|
if (type == 0) {
|
if (this.dealForm.dealBeforeFileList != null && this.dealForm.dealBeforeFileList.length > index) {
|
this.dealForm.dealBeforeFileList.splice(index, 1)
|
}
|
} else if (type == 1) {
|
if (this.dealForm.dealAfterFileList != null && this.dealForm.dealAfterFileList.length > index) {
|
this.dealForm.dealAfterFileList.splice(index, 1)
|
}
|
} else if (type == 2) {
|
if (this.backForm.dealBeforeFileList != null && this.backForm.dealBeforeFileList.length > index) {
|
this.backForm.dealBeforeFileList.splice(index, 1)
|
}
|
}
|
},
|
uploadFileList (e, objType) {
|
if (objType === 0) {
|
if (this.dealForm.dealBeforeFileList == null) {
|
this.dealForm.dealBeforeFileList = []
|
}
|
this.dealForm.dealBeforeFileList.push({
|
fileurl: e.imgaddr,
|
url: e.url,
|
name: e.originname,
|
fileType: e.type
|
})
|
} else if (objType === 1) {
|
if (this.dealForm.dealAfterFileList == null) {
|
this.dealForm.dealAfterFileList = []
|
}
|
this.dealForm.dealAfterFileList.push({
|
fileurl: e.imgaddr,
|
url: e.url,
|
name: e.originname,
|
fileType: e.type
|
})
|
} else if (objType === 2) {
|
if (this.backForm.dealBeforeFileList == null) {
|
this.backForm.dealBeforeFileList = []
|
}
|
this.backForm.dealBeforeFileList.push({
|
fileurl: e.imgaddr,
|
url: e.url,
|
name: e.originname,
|
fileType: e.type
|
})
|
}
|
},
|
dealDo () {
|
this.$refs.dealForm.validate((valid) => {
|
// debugger
|
if (!valid) {
|
return
|
}
|
this.$dialog.actionConfirm('操作确认', '您确认提交该隐患处理情况吗?')
|
.then(() => {
|
this.dealing = true
|
this.api.dealHiddenDanger({
|
id: this.dataId,
|
status: 1,
|
dealTime: this.dealForm.checkDate,
|
checkInfo: this.dealForm.checkInfo,
|
dealBeforeFileList: this.dealForm.dealBeforeFileList,
|
dealAfterFileList: this.dealForm.dealAfterFileList
|
})
|
.then(res => {
|
this.$tip.apiSuccess('处理成功')
|
this.getDetail()
|
this.getLogList()
|
this.$emit('success')
|
this.isShowProblem = false
|
})
|
.catch(e => {
|
})
|
.finally(() => {
|
this.dealing = false
|
})
|
})
|
})
|
},
|
backDo () {
|
this.$refs.backForm.validate((valid) => {
|
if (!valid) {
|
return
|
}
|
this.$dialog.actionConfirm('操作确认', '您确认退回该隐患处理情况吗?')
|
.then(() => {
|
this.dealing = true
|
this.api.dealHiddenDanger({
|
id: this.dataId,
|
status: 2,
|
dealTime: this.backForm.checkDate,
|
checkInfo: this.backForm.checkInfo,
|
dealBeforeFileList: this.backForm.dealBeforeFileList
|
})
|
.then(res => {
|
this.$tip.apiSuccess('退回成功')
|
this.getDetail()
|
this.getLogList()
|
this.$emit('success')
|
this.isBackProblem = false
|
})
|
.catch(e => {
|
})
|
.finally(() => {
|
this.dealing = false
|
})
|
})
|
})
|
},
|
open (title, target) {
|
this.title = title
|
this.visible = true
|
this.model = {}
|
this.dataId = target.id
|
this.$nextTick(() => {
|
this.memberList = []
|
this.transForm = {
|
memberId: null
|
}
|
this.dealForm = {
|
checkDate: null,
|
checkInfo: null,
|
dealBeforeFileList: [],
|
dealAfterFileList: []
|
}
|
this.backForm = {
|
checkDate: null,
|
checkInfo: null,
|
dealBeforeFileList: []
|
}
|
this.getDetail()
|
this.getLogList()
|
})
|
},
|
transferSubmit () {
|
this.$refs.transForm.validate((valid) => {
|
// debugger
|
if (!valid) {
|
return
|
}
|
this.$dialog.actionConfirm('操作确认', '您确认转交该隐患提报吗?')
|
.then(() => {
|
this.transfering = true
|
this.api.transferHiddenDanger({
|
id: this.dataId,
|
checkUserId: this.transForm.memberId
|
})
|
.then(res => {
|
this.$tip.apiSuccess('转交成功')
|
this.getDetail()
|
this.getLogList()
|
this.$emit('success')
|
this.isShowTransfer = false
|
})
|
.catch(e => {
|
})
|
.finally(() => {
|
this.transfering = false
|
})
|
})
|
})
|
},
|
getLogList () {
|
this.api.findLogList({ hiddenDangerId: this.dataId })
|
.then(res => {
|
this.logList = res
|
})
|
},
|
getDetail () {
|
this.api.detail(this.dataId)
|
.then(res => {
|
this.model = res
|
})
|
},
|
confirm () {
|
console.log('--')
|
},
|
handleTransfer () {
|
this.isShowTransfer = true
|
this.loadMemberList()
|
},
|
loadMemberList () {
|
memberList({}).then(res => {
|
this.memberList = res
|
})
|
},
|
reject () { },
|
handleAvatarSuccess () { },
|
beforeAvatarUpload () { }
|
}
|
}
|
</script>
|
|
<style lang="scss" scoped>
|
.side_title{
|
font-weight: 600;
|
font-size: 18px;
|
color: #111111;
|
margin-bottom: 20px;
|
margin-left: 20px;
|
margin-top: 20px;
|
}
|
.upload_box {
|
width: 84px;
|
height: 84px;
|
border-radius: 4px;
|
background-color: #f7f7f7;
|
display: flex;
|
flex-direction: column;
|
justify-content: center;
|
align-items: center;
|
color: #999999;
|
border: 1px solid #e4e4e4;
|
.icon {
|
font-size: 24px;
|
}
|
.text {
|
font-size: 12px;
|
}
|
}
|
|
.modal_wrap {
|
display: flex;
|
height: 100%;
|
.modal_content {
|
flex: 1;
|
padding: 0px 30px;
|
border-radius: 8px;
|
overflow: hidden;
|
height: 100%;
|
|
.title {
|
font-weight: 600;
|
font-size: 18px;
|
color: #333333;
|
margin-bottom: 20px;
|
margin-top: 30px;
|
}
|
.info {
|
.list {
|
display: flex;
|
flex-wrap: wrap;
|
|
.item {
|
display: flex;
|
width: 40%;
|
margin-bottom: 20px;
|
&:nth-of-type(2n) {
|
width: 60%;
|
}
|
|
.label {
|
color: #888888;
|
width: 68px;
|
}
|
|
.value {
|
color: #111111;
|
}
|
}
|
}
|
}
|
|
.header {
|
display: flex;
|
justify-content: space-between;
|
align-items: center;
|
padding: 20px 30px;
|
margin: 0 -30px;
|
border-radius: 8px 8px 0 0;
|
background: linear-gradient(to right, #f2f6fe, #cadffa);
|
|
.h1 {
|
font-weight: 600;
|
font-size: 22px;
|
color: #111111;
|
margin-bottom: 8px;
|
}
|
|
.time {
|
font-size: 14px;
|
color: #999999;
|
}
|
|
.right {
|
height: 40px;
|
font-size: 16px;
|
color: #ffffff;
|
line-height: 40px;
|
padding: 0 20px;
|
background: #207ff7;
|
box-shadow: 4px 4px 0px 0px rgba(32, 127, 247, 0.16);
|
border-radius: 16px 0px 16px 0px;
|
}
|
}
|
.table_info {
|
.name_wrap {
|
display: flex;
|
align-items: center;
|
.avatar {
|
width: 40px;
|
height: 40px;
|
border-radius: 50%;
|
margin-right: 12px;
|
}
|
.content {
|
.line {
|
display: flex;
|
}
|
.tag {
|
color: #b2cbf9;
|
border: 1px solid #b2cbf9;
|
padding: 0px 4px;
|
border-radius: 4px;
|
margin-left: 6px;
|
}
|
}
|
}
|
}
|
}
|
|
.side {
|
height: 100%;
|
width: 420px;
|
background: #ffffff;
|
border-left: 20px solid #f7f7f7;
|
.list {
|
.item {
|
padding: 8px 0;
|
position: relative;
|
.separate {
|
position: absolute;
|
border-left: 2px dashed #cccccc;
|
left: 31px;
|
height: calc(100% - 24px);
|
top: 46px;
|
}
|
.info {
|
display: flex;
|
align-items: center;
|
margin-left: 20px;
|
.icon {
|
position: relative;
|
z-index: 11;
|
color: #53b76f;
|
font-size: 24px;
|
}
|
|
.iconnew{
|
width: 24px;
|
height: 24px;
|
}
|
.icon1 {
|
position: relative;
|
z-index: 11;
|
color: deepskyblue;
|
font-size: 24px;
|
}
|
.icon2 {
|
position: relative;
|
z-index: 11;
|
color: #dc362e;
|
font-size: 24px;
|
}
|
.avatar {
|
width: 40px;
|
height: 40px;
|
border-radius: 50%;
|
margin: 0 12px 0 16px;
|
//border: 1px solid;
|
}
|
.content {
|
flex: 1;
|
.line {
|
display: flex;
|
justify-content: space-between;
|
align-content: center;
|
margin-bottom: 6px;
|
.name {
|
font-weight: 600;
|
font-size: 16px;
|
color: #111111;
|
}
|
.time {
|
color: #888888;
|
}
|
.company {
|
font-size: 13px;
|
color: #888888;
|
.status {
|
color: #00ba67;
|
}
|
}
|
}
|
}
|
}
|
.remark {
|
background: #f7f7f7;
|
border-radius: 4px;
|
padding: 13px 15px;
|
color: #666666;
|
margin-left: 120px;
|
}
|
}
|
}
|
}
|
}
|
</style>
|