From 680dcd3efb79f439a1e4bf95240a0c2b8d975837 Mon Sep 17 00:00:00 2001
From: guoshilong <123456>
Date: Mon, 26 Sep 2022 11:46:13 +0800
Subject: [PATCH] 事件管理、维修管理添加图片视频上传;维修管理添加地图详情页面、详情数据显示上传的图片和视频
---
src/const/eventgm/eventgm.js | 15 +
src/views/repairsorder/repairsorderDetail.vue | 264 +++++++++++++++++++++++++++++++++
src/views/eventgm/eventgmDetail.vue | 101 ++++++++++++
src/views/repairsorder/repairsorder.vue | 32 +++
src/util/determiningFileFormat.js | 4
src/const/repairsorder/repairsorder.js | 14 +
src/views/taskinfo/taskinfoDetail.vue | 12
src/views/eventgm/eventgm.vue | 13 +
8 files changed, 443 insertions(+), 12 deletions(-)
diff --git a/src/const/eventgm/eventgm.js b/src/const/eventgm/eventgm.js
index bfe4e5c..2d6f648 100644
--- a/src/const/eventgm/eventgm.js
+++ b/src/const/eventgm/eventgm.js
@@ -157,6 +157,21 @@
},
},
{
+ label: '图片上传',
+ prop: 'picUrls',
+ type: 'upload',
+ span: 24,
+ listType: 'picture-card',
+ limit:5,
+ hide:true,
+ props:"value",
+ propsHttp: {
+ url:'link',
+ res: 'data'
+ },
+ action: '/api/blade-resource/oss/endpoint/put-file-attach'
+ },
+ {
label: "修改人",
prop: "updateUser",
type: "input",
diff --git a/src/const/repairsorder/repairsorder.js b/src/const/repairsorder/repairsorder.js
index c387ec9..d21c78a 100644
--- a/src/const/repairsorder/repairsorder.js
+++ b/src/const/repairsorder/repairsorder.js
@@ -89,6 +89,20 @@
}],
},
{
+ label: '图片上传',
+ prop: 'picUrls',
+ type: 'upload',
+ span: 24,
+ listType: 'picture-card',
+ limit:5,
+ hide:true,
+ propsHttp: {
+ url:'link',
+ res: 'data'
+ },
+ action: '/api/blade-resource/oss/endpoint/put-file-attach'
+ },
+ {
label: "内容",
prop: "content",
type: "textarea",
diff --git a/src/util/determiningFileFormat.js b/src/util/determiningFileFormat.js
new file mode 100644
index 0000000..be72c3c
--- /dev/null
+++ b/src/util/determiningFileFormat.js
@@ -0,0 +1,4 @@
+export const isImage = (str) =>{
+ var reg = /.(png|jpg|gif|jpeg|webp)$/;
+ return reg.test(str);
+}
diff --git a/src/views/eventgm/eventgm.vue b/src/views/eventgm/eventgm.vue
index b90d0c7..2257b2c 100644
--- a/src/views/eventgm/eventgm.vue
+++ b/src/views/eventgm/eventgm.vue
@@ -8,6 +8,7 @@
:before-open="beforeOpen"
v-model="form"
ref="crud"
+ :upload-before="uploadBefore"
@row-update="rowUpdate"
@row-save="rowSave"
@row-del="rowDel"
@@ -117,6 +118,9 @@
},
methods: {
rowSave(row, done, loading) {
+ if (!row.picUrls){
+ row.picUrls = null
+ }
add(row).then(() => {
this.onLoad(this.page);
this.$message({
@@ -184,7 +188,6 @@
beforeOpen(done, type) {
if (["edit", "view"].includes(type)) {
getDetail(this.form.id).then(res => {
- console.log(res);
this.form = res.data.data;
this.form.avueMapAddress = {
"formattedAddress": this.form.address,
@@ -239,6 +242,14 @@
this.selectionClear();
});
},
+ uploadBefore(file, done, loading,column) {
+ if (["image","video"].includes(file.type.split("/")[0])){
+ done()
+ }else {
+ this.$message.warning('请上传图片或视频')
+ loading()
+ }
+ },
handleDisposal(row) {
this.disposalVisible = true
this.$nextTick(() => {
diff --git a/src/views/eventgm/eventgmDetail.vue b/src/views/eventgm/eventgmDetail.vue
index 19215e2..e2ac4c0 100644
--- a/src/views/eventgm/eventgmDetail.vue
+++ b/src/views/eventgm/eventgmDetail.vue
@@ -89,6 +89,63 @@
</el-form>
</el-card>
+ <!--事件图片或视频-->
+ <div
+ style=""
+ role="tab"
+ aria-expanded="true"
+ aria-controls="el-collapse-content-823"
+ aria-describedby="el-collapse-content-823"
+ >
+ <div
+ role="button"
+ tabindex="0"
+ class="el-collapse-item__header focusing is-active"
+ >
+ <div class="avue-group__header avue-group">
+ <i class="el-icon-s-order avue-group__icon"></i>
+ <h1 class="avue-group__title">事件图片</h1>
+ </div>
+ </div>
+ </div>
+ <el-card class="scene-image-box">
+ <el-image
+ v-for="(item, index) in picUrls"
+ :key="index"
+ :src="item"
+ :preview-src-list="picUrls"
+ v-show="picUrls.length > 0"
+ ></el-image>
+ <span v-show="picUrls.length == 0">暂无图片</span>
+ </el-card>
+
+ <div
+ style=""
+ role="tab"
+ aria-expanded="true"
+ aria-controls="el-collapse-content-823"
+ aria-describedby="el-collapse-content-823"
+ >
+ <div
+ role="button"
+ tabindex="0"
+ class="el-collapse-item__header focusing is-active"
+ >
+ <div class="avue-group__header avue-group">
+ <i class="el-icon-s-order avue-group__icon"></i>
+ <h1 class="avue-group__title">事件视频</h1>
+ </div>
+ </div>
+ </div>
+ <el-card>
+ <video
+ :src="videoUrls"
+ style="width: 200px; height: 200px; object-fit: fill"
+ controls
+ v-show="videoUrls != ''"
+ ></video>
+ <span v-show="videoUrls.length == 0">暂无视频</span>
+ </el-card>
<!--事件流程信息-->
<div
style=""
@@ -120,6 +177,7 @@
<el-table-column prop="remark" label="说明" align="center"></el-table-column>
</el-table>
</el-card>
+
<div v-if="this.form.no">
<!--维修人员信息-->
<div v-if="repairsDetail.toUserId != -1">
@@ -190,7 +248,6 @@
</el-card>
</div>
</el-col>
-
<el-col :span="12">
<open-layers-map ref="OpenLayersMap" @toData="toData" :isDetail="true" :pointLonLat="pointLonLat" :routeRange="form.routeRange"></open-layers-map>
</el-col>
@@ -204,10 +261,12 @@
import {getList as getRepairsorderRecordList} from "@/api/repairsorder/repairsorderRecord";
import {getDetail} from "@/api/repairsorder/repairsorder";
import {getUser} from "@/api/system/user"
+import EleGallery from 'vue-ele-gallery'
+import {isImage} from "@/util/determiningFileFormat";
export default {
name: "eventgmDetail",
- components: {OpenLayersMap},
+ components: {OpenLayersMap,EleGallery},
props:["detailInfo"],
data(){
return{
@@ -218,10 +277,21 @@
repairsRecord:[],
repairsDetail:{},
repairsPersonInfo:[],
+ picUrls:[],
+ videoUrls:[],
}
},
created() {
this.form = this.detailInfo;
+ if (this.form.picUrls){
+ this.form.picUrls.forEach(e=>{
+ if (isImage(e.value)){
+ this.picUrls.push(e.value)
+ }else {
+ this.videoUrls.push(e.value)
+ }
+ })
+ }
this.pointLonLat = {
lon:this.form.longitude,
lat:this.form.latitude
@@ -275,7 +345,7 @@
},
handleBack(){
this.$emit('isDetail');
- }
+ },
},
}
</script>
@@ -316,4 +386,29 @@
right: 3%;
z-index: 99999;
}
+
+.scene-image-box {
+ line-height: 32px !important;
+ height: auto;
+ max-height: 200px;
+ overflow-y: auto;
+
+ .el-card__body {
+ display: flex;
+ padding: 0 10px !important;
+ flex-wrap: wrap;
+ justify-content: center;
+ align-items: center;
+
+ .x-audio-wrap.inline {
+ margin: 10px;
+ }
+
+ .el-image {
+ margin: 10px;
+ width: 160px;
+ height: 80px;
+ }
+ }
+}
</style>
diff --git a/src/views/repairsorder/repairsorder.vue b/src/views/repairsorder/repairsorder.vue
index 96c3163..d1e2ab0 100644
--- a/src/views/repairsorder/repairsorder.vue
+++ b/src/views/repairsorder/repairsorder.vue
@@ -1,6 +1,6 @@
<template>
<basic-container>
- <avue-crud :option="option"
+ <avue-crud v-show="!detailVisible" :option="option"
:table-loading="loading"
:data="data"
:page.sync="page"
@@ -8,9 +8,11 @@
:before-open="beforeOpen"
v-model="form"
ref="crud"
+ :upload-before="uploadBefore"
@row-update="rowUpdate"
@row-save="rowSave"
@row-del="rowDel"
+ @row-dblclick="rowClick"
@search-change="searchChange"
@search-reset="searchReset"
@selection-change="selectionChange"
@@ -28,7 +30,7 @@
</el-button>
</template>
<template slot-scope="{type,size,row,index}" slot="menu">
- <el-button icon="el-icon-view" :size="size" :type="type" @click="$refs.crud.rowView(row,index)">查 看</el-button>
+ <el-button icon="el-icon-view" :size="size" :type="type" @click="rowClick(row)">查 看</el-button>
<el-button icon="el-icon-check" :size="size" :type="type" :disabled="row.state == 1" @click="handleSendorder(row)">派 单</el-button>
<el-button icon="el-icon-edit" :size="size" :type="type" :disabled="row.state >= 1" @click="$refs.crud.rowEdit(row,index)">编 辑</el-button>
<el-button icon="el-icon-delete" :size="size" :type="type" :disabled="row.state >= 1" @click="$refs.crud.rowDel(row,index)">删 除</el-button>
@@ -37,6 +39,7 @@
<!-- 弹窗, 派单 -->
<sendorder v-if="sendorderVisible" ref="sendorder" @refreshOnLoad="refreshChange"></sendorder>
+ <repairsorder-detail v-if="detailVisible" ref="detailVisible" :detailInfo="detailInfo" @isDetail="isDetail"></repairsorder-detail>
</basic-container>
</template>
@@ -45,9 +48,11 @@
import option from "@/const/repairsorder/repairsorder";
import {mapGetters} from "vuex";
import sendorder from "./sendorder.vue"
+ import RepairsorderDetail from "@/views/repairsorder/repairsorderDetail";
export default {
components: {
+ RepairsorderDetail,
sendorder
},
data() {
@@ -63,7 +68,9 @@
selectionList: [],
option: option,
data: [],
- sendorderVisible: false
+ sendorderVisible: false,
+ detailVisible:false,
+ detailInfo:{},
};
},
watch: {
@@ -98,6 +105,9 @@
},
methods: {
rowSave(row, done, loading) {
+ if (!picUrls){
+ row.picUrls = null
+ }
add(row).then(() => {
this.onLoad(this.page);
this.$message({
@@ -213,11 +223,27 @@
this.selectionClear();
});
},
+ uploadBefore(file, done, loading,column) {
+ if (["image","video"].includes(file.type.split("/")[0])){
+ done()
+ }else {
+ this.$message.warning('请上传图片或视频')
+ loading()
+ }
+ },
handleSendorder(row) {
this.sendorderVisible = true
this.$nextTick(() => {
this.$refs.sendorder.init(row)
})
+ },
+ //点击当前行事件
+ rowClick(val){
+ this.detailInfo = val
+ this.isDetail();
+ },
+ isDetail(){
+ this.detailVisible = !this.detailVisible
}
}
};
diff --git a/src/views/repairsorder/repairsorderDetail.vue b/src/views/repairsorder/repairsorderDetail.vue
new file mode 100644
index 0000000..96cf186
--- /dev/null
+++ b/src/views/repairsorder/repairsorderDetail.vue
@@ -0,0 +1,264 @@
+<template>
+ <div>
+ <el-button class="backBtn" size="small" type="success" icon="el-icon-back" plain @click="handleBack">返 回
+ </el-button>
+ <el-row>
+ <el-col :span="12">
+ <div>
+ <el-card class="trackClass" style="overflow-y: auto">
+ <!--维修信息-->
+ <div
+ style="margin-top: -10px"
+ role="tab"
+ aria-expanded="true"
+ aria-controls="el-collapse-content-823"
+ aria-describedby="el-collapse-content-823"
+ >
+ <div
+ role="button"
+ tabindex="0"
+ class="el-collapse-item__header focusing is-active"
+ >
+ <div class="avue-group__header avue-group">
+ <i class="el-icon-message-solid avue-group__icon"></i>
+ <h1 class="avue-group__title">维修信息</h1>
+ </div>
+ </div>
+ </div>
+ <el-card>
+ <el-form
+ :model="form"
+ label-position="right"
+ size="mini"
+ class="taskinfoForm"
+ label-width="100px"
+ style="
+ margin-top: 20px;
+ margin-left: 10px;
+ margin-right: 10px;
+ height: calc(100% - 40px);
+ width: calc(100% - 20px);
+ "
+ >
+ <el-row>
+ <el-col span="12">
+ <el-form-item label="工单编号">
+ <el-input disabled="true" v-model="form.no" autocomplete="off"></el-input>
+ </el-form-item>
+ </el-col>
+ <el-col span="12">
+ <el-form-item label="任务状态">
+ <el-input disabled="true" v-model="form.$state" autocomplete="off"></el-input>
+ </el-form-item>
+ </el-col>
+ </el-row>
+
+ <el-row>
+ <el-col span="24">
+ <el-form-item label="地址">
+ <el-input disabled="true" v-model="form.location" autocomplete="off"></el-input>
+ </el-form-item>
+ </el-col>
+ </el-row>
+
+ <el-row>
+ <el-col span="24">
+ <el-form-item label="任务内容">
+ <el-input disabled="true" v-model="form.content" autocomplete="off"></el-input>
+ </el-form-item>
+ </el-col>
+ </el-row>
+
+ </el-form>
+ </el-card>
+
+ <!--维修图片或视频-->
+ <div
+ style=""
+ role="tab"
+ aria-expanded="true"
+ aria-controls="el-collapse-content-823"
+ aria-describedby="el-collapse-content-823"
+ >
+ <div
+ role="button"
+ tabindex="0"
+ class="el-collapse-item__header focusing is-active"
+ >
+ <div class="avue-group__header avue-group">
+ <i class="el-icon-s-order avue-group__icon"></i>
+ <h1 class="avue-group__title">维修图片</h1>
+ </div>
+ </div>
+ </div>
+ <el-card class="scene-image-box">
+ <el-image
+ v-for="(item, index) in picUrls"
+ :key="index"
+ :src="item"
+ :preview-src-list="picUrls"
+ v-show="picUrls.length > 0"
+ ></el-image>
+ <span v-show="picUrls.length == 0">暂无图片</span>
+ </el-card>
+
+ <div
+ style=""
+ role="tab"
+ aria-expanded="true"
+ aria-controls="el-collapse-content-823"
+ aria-describedby="el-collapse-content-823"
+ >
+ <div
+ role="button"
+ tabindex="0"
+ class="el-collapse-item__header focusing is-active"
+ >
+ <div class="avue-group__header avue-group">
+ <i class="el-icon-s-order avue-group__icon"></i>
+ <h1 class="avue-group__title">维修视频</h1>
+ </div>
+ </div>
+ </div>
+ <el-card>
+ <video
+ :src="videoUrls"
+ style="width: 200px; height: 200px; object-fit: fill"
+ controls
+ v-show="videoUrls != ''"
+ ></video>
+ <span v-show="videoUrls.length == 0">暂无视频</span>
+ </el-card>
+
+ <!--维修人员信息-->
+ <div
+ style="margin-top: 15px"
+ role="tab"
+ aria-expanded="true"
+ aria-controls="el-collapse-content-823"
+ aria-describedby="el-collapse-content-823"
+ >
+ <div
+ role="button"
+ tabindex="0"
+ class="el-collapse-item__header focusing is-active"
+ >
+ <div class="avue-group__header avue-group">
+ <i class="el-icon-s-custom avue-group__icon"></i>
+ <h1 class="avue-group__title">维修人员信息</h1>
+ </div>
+ </div>
+ </div>
+ <el-card>
+ <el-table
+ ref="multipleTable"
+ :data="repairPersonInfo"
+ tooltip-effect="dark"
+ style="width: 100%"
+ max-height="240"
+ >
+ <el-table-column prop="name" label="姓名" width="150" align="center"></el-table-column>
+ <el-table-column prop="realName" label="真名" width="150" align="center"></el-table-column>
+ <el-table-column prop="phone" label="联系电话" width="170" align="center"></el-table-column>
+ </el-table>
+ </el-card>
+ </el-card>
+ </div>
+ </el-col>
+
+ <el-col :span="12">
+ <open-layers-map ref="OpenLayersMap" @toData="toData" :isDetail="true" :pointLonLat="pointLonLat" :routeRange="form.routeRange"></open-layers-map>
+ </el-col>
+ </el-row>
+ </div>
+</template>
+
+<script>
+import OpenLayersMap from "@/components/OpenLayersMap/index";
+import {getUser} from "@/api/system/user"
+import {isImage} from "@/util/determiningFileFormat";
+export default {
+ name: "repairsorderDetail",
+ components: {OpenLayersMap},
+ props:["detailInfo"],
+ data(){
+ return{
+ form:{},
+ pointLonLat: {},
+ repairPersonInfo:[],
+ picUrls:[],
+ videoUrls:[],
+ }
+ },
+ created() {
+ this.form = this.detailInfo;
+ if (this.form.picUrls){
+ this.form.picUrls.forEach(e=>{
+ if (isImage(e.value)){
+ this.picUrls.push(e.value)
+ }else {
+ this.videoUrls.push(e.value)
+ }
+ })
+ }
+ this.pointLonLat = {
+ lon:this.form.longitude,
+ lat:this.form.latitude
+ }
+ this.getUser()
+ },
+ methods:{
+ // 获取巡检人员信息
+ getUser(){
+ if (this.form.toUserId != -1){
+ getUser(this.form.toUserId).then(res=>{
+ if (res.data.code == 200){
+ this.repairPersonInfo.push(res.data.data)
+ }
+ })
+ }
+ },
+ handleBack(){
+ this.$emit('isDetail');
+ }
+ },
+}
+</script>
+
+<style scoped lang="scss">
+
+/deep/ .el-table tbody tr:hover > td {
+ background-color: #f3ec94 !important
+}
+
+.el-col {
+ height: calc(100% - 5px);
+}
+
+.trackClass {
+ height: 85vh;
+ overflow: auto;
+ overflow-x: hidden;
+}
+
+.receiving-alarm-box {
+ line-height: 32px !important;
+ height: 200px;
+ overflow-y: auto;
+
+ .el-card__body {
+ padding: 0 10px !important;
+ }
+}
+
+#old_video::-webkit-media-controls-timeline {
+ display: block;
+}
+
+.backBtn{
+ position: fixed;
+ top: 20%;
+ right: 3%;
+ z-index: 99999;
+}
+</style>
diff --git a/src/views/taskinfo/taskinfoDetail.vue b/src/views/taskinfo/taskinfoDetail.vue
index b6bf0a0..61120b1 100644
--- a/src/views/taskinfo/taskinfoDetail.vue
+++ b/src/views/taskinfo/taskinfoDetail.vue
@@ -149,11 +149,13 @@
methods:{
//获取巡检人员信息
getUser(){
- getUser(this.form.toUserId).then(res=>{
- if (res.data.code == 200){
- this.accepterInfo.push(res.data.data)
- }
- })
+ if (this.form.toUserId != -1) {
+ getUser(this.form.toUserId).then(res => {
+ if (res.data.code == 200) {
+ this.accepterInfo.push(res.data.data)
+ }
+ })
+ }
},
handleBack(){
this.$emit('isDetail');
--
Gitblit v1.9.3