smart-power-ui/src/views/power/mywork/details.vue

891 lines
25 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div class="maintennce-details" v-loading="loading">
<el-divider content-position="left">工单信息</el-divider>
<div class="info-wrap">
<el-row :gutter="20">
<el-col :span="12">
<div class="item-block">
<span>工单 I D </span>
<span>{{ workDetails.maintenanceId }}</span>
</div>
</el-col>
<el-col :span="12">
<div class="item-block">
<span>工单状态:</span>
<span>{{ workStateList[workDetails.maintenanceStatus] }}</span>
</div>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<div class="item-block">
<span>设备名称:</span>
<span>{{ workDetails.deviceName }}</span>
</div>
</el-col>
<el-col :span="12">
<div class="item-block">
<span>故障类型:</span>
<span>{{ fanltTypeList[workDetails.faultType] }}</span>
</div>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<div class="item-block">
<span>上报人员:</span>
<span>{{ workDetails.reporterName }}</span>
</div>
</el-col>
<el-col :span="12">
<div class="item-block">
<span>上报时间:</span>
<span>{{ workDetails.createTime }}</span>
</div>
</el-col>
</el-row>
<el-row
:gutter="20"
v-if="
!(
workDetails.reporterId === logUser &&
workDetails.maintenanceStatus === '1'
)
"
>
<el-col :span="24">
<div class="item-block">
<span>工单内容:</span>
<span>{{ workDetails.maintenanceContext }}</span>
</div>
</el-col>
</el-row>
</div>
<el-divider
content-position="left"
v-if="
showForm === '0' &&
((workDetails.handlerId === logUser &&
workDetails.maintenanceStatus === '1') ||
(workDetails.reporterId === logUser &&
workDetails.maintenanceStatus === '1') ||
(workDetails.maintenanceStatus === '3' && showForm === '0') ||
(workDetails.maintenanceStatus === '4' && showForm === '0') ||
(workDetails.maintenanceStatus === '5' && showForm === '0'))
"
>处理反馈信息</el-divider
>
<div
class="info-wrap feedback-wrap"
v-if="
showForm === '0' &&
((workDetails.handlerId === logUser &&
workDetails.maintenanceStatus === '1') ||
(workDetails.reporterId === logUser &&
workDetails.maintenanceStatus === '1') ||
(workDetails.maintenanceStatus === '3' && showForm === '0') ||
(workDetails.maintenanceStatus === '4' && showForm === '0') ||
(workDetails.maintenanceStatus === '5' && showForm === '0'))
"
>
<el-row :gutter="20">
<el-col :span="12">
<div class="item-block">
<span>处理人员:</span>
<span>{{ workDetails.handlerName }}</span>
</div>
</el-col>
<el-col :span="12">
<div class="item-block">
<span>处理时间:</span>
<span>{{ workDetails.handleTime }}</span>
</div>
</el-col>
</el-row>
<el-row
:gutter="20"
v-show="!(workDetails.handlerId === logUser && showForm === '3')"
>
<el-col :span="12">
<div class="item-block">
<span>处理反馈:</span>
<span class="value-span">{{
workDetails.feedbackInformation
}}</span>
</div>
</el-col>
<el-col :span="12">
<div class="item-block">
<span>处理意见:</span>
<span class="value-span">{{ workDetails.advice }}</span>
</div>
</el-col>
</el-row>
<el-row
:gutter="20"
v-show="!(workDetails.handlerId === logUser && showForm === '3')"
>
<el-col :span="24">
<div
class="item-block"
style="width: 100%; display: flex; height: 100px"
>
<span>现场图片:</span>
<div style="width: calc(100% - 85px); display: flex">
<img
style="
width: 100px;
height: 100px;
margin-right: 10px;
border: 1px solid #cfcece;
border-radius: 3px;
"
:src="getIotFileUrl(val)"
v-for="(val, index) in pictures"
:key="val"
/>
</div>
</div>
</el-col>
</el-row>
</div>
<el-divider
content-position="left"
v-if="
workDetails.maintenanceStatus === '1' && workDetails.maintenanceNodeList.length > 0
"
>退回意见</el-divider
>
<div
v-if="
workDetails.maintenanceStatus === '1' && workDetails.maintenanceNodeList.length > 0
"
>
<el-card>
<div class="info-block-sh">
<div class="item-block">
<span>审核人员:</span>
<span>{{ workDetails.maintenanceNodeList[0]["auditorName"] }}</span>
</div>
<div class="item-block">
<span>审核时间:</span>
<span>{{ workDetails.maintenanceNodeList[0]["auditTime"] }}</span>
</div>
<div class="item-block text">
<span>审核结果:</span>
<span>{{ workDetails.maintenanceNodeList[0]["auditResult"] }}</span>
</div>
<div class="item-block text">
<span>审核意见:</span>
<span>{{
workDetails.maintenanceNodeList[0]["auditOpinion"]
}}</span>
</div>
</div>
</el-card>
</div>
<el-divider
content-position="left"
v-if="
workDetails.maintenanceStatus === '4' ||
workDetails.maintenanceStatus === '5'
"
>审核结果</el-divider
>
<div
v-if="
workDetails.maintenanceStatus === '4' ||
workDetails.maintenanceStatus === '5'
"
>
<el-timeline style="margin-top: 20px">
<el-timeline-item
v-for="item in workDetails.maintenanceNodeList"
reverse
:hide-timestamp="true"
:key="item.auditResult"
:icon="item.auditResult === '通过' ? 'el-icon-trophy' : 'el-icon-aim'"
type="large"
:color="item.auditResult === '通过' ? '#52ce90' : '#328ff0'"
:timestamp="item.auditTime"
>
<el-card>
<div class="info-block-sh">
<div class="item-block">
<span>审核人员:</span>
<span>{{ item["auditorName"] }}</span>
</div>
<div class="item-block">
<span>审核时间:</span>
<span>{{ item["auditTime"] }}</span>
</div>
<div class="item-block text">
<span>审核结果:</span>
<span>{{ item["auditResult"] }}</span>
</div>
<div class="item-block text">
<span>审核意见:</span>
<span>{{ item["auditOpinion"] }}</span>
</div>
</div>
</el-card>
</el-timeline-item>
</el-timeline>
</div>
<el-divider
content-position="left"
v-if="
tempType !== 'examine' &&
showForm === '0' &&
((workDetails.handlerId !== logUser &&
(workDetails.maintenanceStatus === '2' ||
workDetails.maintenanceStatus === '0')) ||
(workDetails.reporterId !== logUser &&
workDetails.maintenanceStatus === '1') ||
(workDetails.maintenanceStatus === '3' && showForm === '0') ||
(workDetails.handlerId !== logUser &&
workDetails.maintenanceStatus === '4'))
"
>订单进程</el-divider
>
<div
v-if="
tempType !== 'examine' &&
showForm === '0' &&
((workDetails.handlerId !== logUser &&
(workDetails.maintenanceStatus === '2' ||
workDetails.maintenanceStatus === '0')) ||
(workDetails.reporterId !== logUser &&
workDetails.maintenanceStatus === '1') ||
(workDetails.maintenanceStatus === '3' && showForm === '0') ||
(workDetails.handlerId !== logUser &&
workDetails.maintenanceStatus === '4'))
"
>
<span
style="margin-left: 20px; height: 50px; display: block"
v-show="workDetails.maintenanceStatus === '4' && showForm === '0'"
v-text="'工单审核被退回,正在重新处理中...'"
></span>
<span
style="margin-left: 20px; height: 50px; display: block"
v-show="
workDetails.handlerId !== logUser &&
workDetails.maintenanceStatus === '2'
"
v-text="'工单已经确认,正在处理中...'"
></span>
<span
style="margin-left: 20px; height: 50px; display: block"
v-show="workDetails.maintenanceStatus === '3' && showForm === '0'"
v-text="' 订单已经处理完成,等待审核...'"
></span>
<span
style="margin-left: 20px; height: 50px; display: block"
v-show="
workDetails.handlerId !== logUser &&
workDetails.maintenanceStatus === '0'
"
v-text="'工单正在等待处理人确认...'"
></span>
<span
style="margin-left: 20px; height: 50px; display: block"
v-show="
workDetails.reporterId !== logUser &&
workDetails.maintenanceStatus === '1'
"
v-text="'此工单已经退回,等待处理...'"
></span>
</div>
<el-divider
content-position="left"
v-if="tempType === 'myWork' && expFromShow(workDetails)"
>操作</el-divider
>
<el-form
:model="form"
:rules="rules"
v-if="tempType === 'myWork' && expFromShow(workDetails)"
ref="ruleForm"
label-width="100px"
class="demo-ruleForm"
>
<el-form-item
label="工单内容:"
v-if="
workDetails.reporterId === logUser &&
workDetails.maintenanceStatus === '1'
"
prop="name"
>
<el-input
type="textarea"
:autosize="{ minRows: 2, maxRows: 5 }"
placeholder
v-model="form.maintenanceContext"
></el-input>
</el-form-item>
<span
v-if="
workDetails.handlerId === logUser &&
workDetails.maintenanceStatus === '0'
"
v-text="'您是此工单处理人,您可做如下操作...'"
></span>
<span
v-else-if="workDetails.maintenanceStatus === '2'"
v-text="'订单已经确认,正在处理中...'"
></span>
<span
v-else-if="
workDetails.handlerId === logUser &&
workDetails.maintenanceStatus === '4'
"
v-text="'工单审核被退回,请重新处理...'"
></span>
<el-row
:gutter="20"
v-if="
workDetails.handlerId === logUser &&
(workDetails.maintenanceStatus === '3' ||
workDetails.maintenanceStatus === '1')
"
>
<el-col :span="24">
<el-form-item label="处理反馈:" prop="name">
<el-input
type="textarea"
:autosize="{ minRows: 2, maxRows: 5 }"
placeholder
v-model="form.feedbackInformation"
></el-input>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="处理意见:" prop="name">
<el-input
type="textarea"
:autosize="{ minRows: 2, maxRows: 5 }"
placeholder
v-model="form.advice"
></el-input>
</el-form-item>
</el-col>
</el-row>
<div
v-show="
workDetails.handlerId === logUser &&
(workDetails.maintenanceStatus === '3' ||
workDetails.maintenanceStatus === '1')
"
class="item-block-img"
>
<span class="label-wrap">现场图片:</span>
<div class="img-list-wrap">
<div class="img-show" v-for="(val, index) in pictures" :key="val">
<img
:src="getIotFileUrl(val)"
@mouseout="
() => {
showIndex = null;
}
"
@mouseenter="
() => {
showIndex = index;
}
"
/>
<div
class="img-option-wrap"
@mouseout="
() => {
showIndex = null;
}
"
@mouseover="
() => {
showIndex = index;
}
"
v-show="showIndex === index"
>
<i
class="el-icon-search"
title="查看图片"
@click="handlePictureCardPreview(val)"
></i>
<i
class="el-icon-delete"
title="删除图片"
@click="handelDelFile(val)"
></i>
</div>
</div>
<el-upload
action
class="avatar-uploader"
:show-file-list="false"
:http-request="uploud"
:before-upload="beforeAvatarUpload"
>
<i class="el-icon-plus avatar-uploader-icon"></i>
</el-upload>
</div>
</div>
<div class="form-submit-div">
<el-button
type="primary"
v-show="
workDetails.reporterId === logUser &&
workDetails.maintenanceStatus === '1'
"
size="mini"
@click="repSrouSubmit()"
>确定订单</el-button
>
<el-button
size="mini"
type="primary"
v-if="workDetails.maintenanceStatus === '0' && showForm === '0'"
@click="handelReject()"
>退回</el-button
>
<el-button
size="mini"
type="primary"
v-if="
(workDetails.maintenanceStatus === '0' ||
workDetails.maintenanceStatus === '4') &&
showForm === '0'
"
@click="handelConfirm()"
>确认工单</el-button
>
<el-button
size="mini"
type="primary"
v-if="
workDetails.handlerId === logUser &&
workDetails.maintenanceStatus === '2'
"
@click="handelComplete()"
>处理完成</el-button
>
<el-button
size="mini"
type="primary"
v-if="
showForm === '1' &&
workDetails.maintenanceStatus === '1' &&
workDetails.handlerId === logUser
"
@click="RejectSubmitForm()"
>提交</el-button
>
<el-button
size="mini"
type="primary"
v-if="showForm === '1' && workDetails.maintenanceStatus === '3'"
@click="submitForm('3')"
>提交</el-button
>
</div>
</el-form>
<el-dialog :visible.sync="dialogVisible" append-to-body>
<img width="100%" :src="getIotFileUrl(dialogImageUrl)" alt />
</el-dialog>
</div>
</template>
<script>
import { updateMaintenance, getMaintenance } from "@/api/power/maintenance";
import { uploadFile } from "@/api/file";
import { getIotFileUrl } from "@/utils/hciot";
// 工单状态(0:工单已创建 1:工单执行中 2:工单审核失败 3:工单审核成功)
const workStateList = {
0: "工单已创建",
1: "退回工单",
2: "确认工单",
3: "处理完成",
4: "退回处理",
5: "审核通过",
};
// 故障类型(0:设备离线 1:设备超警)
const fanltTypeList = {
0: "设备离线",
1: "设备超警",
};
export default {
name: "DetailsWrap",
props: ["maintenanceId", "maintenanceInfo", "tempType"],
data() {
return {
workStateList,
fanltTypeList,
loading: false,
logUser: "",
form: {},
showIndex: null,
rules: {},
fileType: ["image/jpeg", "image/png"],
fileSize: 1024 * 1024 * 20,
temp: {
maintenanceId: "",
handelTime: "",
feedbackInformation: "",
maintenanceStatus: "",
pictures: [],
},
showForm: "0",
workDetails: {},
pictures: [],
dialogVisible: false,
dialogImageUrl: "",
};
},
created() {
this.logUser = this.$store.getters.userId;
this.handleDetails();
},
methods: {
getIotFileUrl,
// 限制图片大小和类型
beforeAvatarUpload(file) {
const isJPG = this.fileType.indexOf(file.type) >= 0;
const isLt2M = file.size < this.fileSize;
if (!isJPG) {
this.$message.error("上传头像图片只能是 JPG 格式!");
}
if (!isLt2M) {
this.$message.error("上传头像图片大小不能超过 2MB!");
}
return isJPG && isLt2M;
},
// 图片上传
handlePictureCardPreview(file) {
this.dialogImageUrl = file;
this.dialogVisible = true;
},
handelDelFile(file) {
// console.log(file);
this.pictures.splice(this.pictures.indexOf(file), 1);
},
uploud(file) {
var formData = new FormData();
formData.append("file", file.file);
uploadFile(formData)
.then((response) => {
if (response.code === 200) {
// this.temp.pictures.push(response.data.filePath)
this.pictures.push(response.url);
}
})
.catch((e) => {
console.log(e);
});
},
// 条件查询详情
handleDetails() {
this.loading = true;
// this.workDetails = this.maintenanceInfo;
// 模拟数据开发测试
// 登录用户是 上报人
// this.workDetails.reporterId = this.logUser;
// 登录用户是 处理人
// this.workDetails.handlerId = this.logUser;
// this.workDetails.maintenanceStatus = "5";
// this.workDetails.maintenanceNodeList = [
// {
// auditResult: '通过',
// auditorName: 'admin',
// auditTime: '2021-03-04 10:29:25',
// auditOpinion: '合格通过!'
// },
// {
// auditResult: '不通过',
// auditorName: 'admin',
// auditTime: '2021-03-04 10:10:25',
// auditOpinion: '不合格通过!'
// }
// ]
getMaintenance(this.maintenanceId).then((response) => {
this.workDetails = response.data;
this.newTemp();
this.pictures = this.workDetails.scenePictures
? this.workDetails.scenePictures.split(",")
: [];
this.showForm = "0";
this.loading = false;
});
},
// 处理人提交表单
repSrouSubmit() {
this.showForm = "0";
this.form.maintenanceStatus = "0";
updateMaintenance(this.form).then((res) => {
if (res.code === 200) {
this.workDetails = Object.assign(this.workDetails, this.form);
}
});
},
// 处理人退回操作
handelReject() {
this.newTemp();
this.showForm = "1";
this.workDetails.maintenanceStatus = "1";
},
// 退回提交
RejectSubmitForm() {
this.form.maintenanceStatus = "1";
this.showForm = "0";
// this.form.handleTime = this.parseTime(new Date(), "{y}-{m}-{d}");
if (this.pictures) {
this.form.scenePictures = this.pictures.join(",");
} else {
this.form.scenePictures = "";
}
updateMaintenance(this.form).then((res) => {
if (res.code === 200) {
this.workDetails = Object.assign(this.workDetails, this.form);
}
});
},
// 处理人确认工单
handelConfirm() {
this.newTemp();
this.showForm = "1";
this.form.maintenanceStatus = "2";
updateMaintenance(this.form).then((res) => {
if (res.code === 200) {
this.workDetails = Object.assign(this.workDetails, this.form);
}
});
},
// 处理人完成工单
handelComplete() {
this.newTemp();
this.workDetails.maintenanceStatus = "3";
this.showForm = "1";
},
// 处理人处理完成提价
submitForm() {
this.form.maintenanceStatus = "3";
this.showForm = "0";
// this.form.handleTime = this.parseTime(new Date(), "{y}-{m}-{d}");
if (this.pictures) {
this.form.scenePictures = this.pictures.join(",");
} else {
this.form.scenePictures = "";
}
updateMaintenance(this.form).then((res) => {
if (res.code === 200) {
this.workDetails = Object.assign(this.workDetails, this.form);
}
});
},
expFromShow(row) {
if (row.reporterId === this.logUser && row.maintenanceStatus === "1") {
return true;
} else if (
row.handlerId === this.logUser &&
(row.maintenanceStatus === "2" || row.maintenanceStatus === "0")
) {
return true;
} else if (
row.handlerId === this.logUser &&
row.maintenanceStatus === "1" &&
this.showForm === "1"
) {
return true;
} else if (
row.handlerId === this.logUser &&
row.maintenanceStatus === "3" &&
this.showForm === "1"
) {
return true;
} else if (
row.handlerId === this.logUser &&
row.maintenanceStatus === "4" &&
this.showForm === "0"
) {
return true;
}
return false;
},
newTemp() {
this.form = {
maintenanceId: this.workDetails.maintenanceId,
maintenanceStatus: this.workDetails.maintenanceStatus,
};
},
},
};
</script>
<style lang="scss">
.maintennce-details {
max-height: calc(100vh - 150px);
overflow: auto;
padding: 0 20px;
.el-upload--picture-card {
width: 100px;
height: 100px;
cursor: pointer;
line-height: 106px;
}
.el-upload-list--picture-card .el-upload-list__item {
width: 100px;
height: 100px;
}
.el-timeline-item__wrapper {
width: 90%;
}
.el-divider--horizontal {
margin: 20px 0;
}
.info-wrap {
width: 100%;
padding: 10px 20px;
display: flex;
flex-wrap: wrap;
background: gainsboro;
margin-bottom: 10px;
min-height: 150px;
height: 100%;
.el-row {
width: 100%;
}
}
.feedback-wrap {
min-height: 200px;
height: 100%;
}
.form-submit-div {
width: 100%;
height: 50px;
display: flex;
justify-content: flex-end;
align-items: center;
}
.item-block-img {
width: 100%;
display: flex;
height: 100%;
flex-wrap: wrap;
.label-wrap {
display: block;
height: 50px;
width: 100px;
text-align: right;
padding-right: 12px;
font-size: 14px;
font-weight: 600;
}
.img-list-wrap {
width: calc(100% - 120px);
display: flex;
flex-wrap: wrap;
.img-show {
overflow: hidden;
display: flex;
width: 100px;
margin-right: 10px;
flex-wrap: wrap;
height: 100px;
> img {
width: 100px;
height: 100px;
margin-right: 10px;
border: 1px solid #cfcece;
border-radius: 3px;
margin-bottom: 10px;
}
.img-option-wrap {
width: 99px;
height: 99px;
position: relative;
background: #d4d3d380;
justify-content: center;
align-items: center;
color: #464444;
left: 0px;
display: flex;
top: -110px;
> i {
font-size: 16px;
margin-right: 10px;
}
> i:hover {
color: #409eff;
}
}
}
}
}
.avatar-uploader .el-upload {
border: 1px dashed #d9d9d9;
border-radius: 6px;
cursor: pointer;
position: relative;
overflow: hidden;
}
.avatar-uploader .el-upload:hover {
border-color: #409eff;
}
.avatar-uploader-icon {
font-size: 28px;
color: #8c939d;
width: 100px;
height: 100px;
line-height: 100px;
text-align: center;
}
.avatar {
width: 100px;
height: 100px;
display: block;
}
.item-block {
.value-span {
color: #3f9ab5;
}
}
}
.maintennce-details::-webkit-scrollbar {
/*滚动条整体样式*/
width: 8px; /*高宽分别对应横竖滚动条的尺寸*/
height: 5px;
}
.maintennce-details::-webkit-scrollbar-thumb {
/*滚动条里面小方块*/
border-radius: 10px;
box-shadow: inset 0 0 5px #c4c4c4;
background: #dededea6;
}
.maintennce-details::-webkit-scrollbar-track {
/*滚动条里面轨道*/
box-shadow: inset 0 0 5px #f6f6f6;
border-radius: 10px;
background: #ffffff;
}
</style>