<template>
|
<view class="main_app">
|
<view class="list">
|
<view class="item">
|
<view class="la"><text class="red">*</text>选择设备</view>
|
<view class="line">
|
<view class="sel_wrap" @click="showModal = true">
|
<view class="left" :class="(param.deviceName || param.deviceCode) ? '' : 'placeholder9'">
|
{{ (param.deviceName || param.deviceCode) ? param.deviceName ? `[${param.deviceCode}] ` + param.deviceName : `[${param.deviceCode}]` : '请选择设备' }}
|
</view>
|
<u-icon name="arrow-right" color="#999999" size="17"></u-icon>
|
</view>
|
<image @click="openQrcode" class="icon" src="@/static/side/scan.png" mode=""></image>
|
</view>
|
</view>
|
<view class="item">
|
<view class="la">设备状态</view>
|
<view class="line">
|
<view class="radio_wrap">
|
<view class="ite" :class="{active: param.status == 0}" @click="statusChange(0)">正常</view>
|
<view class="ite" :class="{active: param.status == 1}" @click="statusChange(1)">损坏</view>
|
<view class="ite" :class="{active: param.status == 2}" @click="statusChange(2)">报废</view>
|
</view>
|
</view>
|
</view>
|
<view class="item">
|
<view class="la">上传视频/图片</view>
|
<view class="upload_wrap">
|
<view class="upload_file" @click="showUpload = true">
|
<u-icon name="plus" color="rgb(153, 153, 153)" size="28"></u-icon>
|
<view class="mt6">图片/视频</view>
|
</view>
|
<view class="upload_file" v-for="(item, i) in fileList" :key="i">
|
<u-icon class="close" size="20" name="close-circle-fill" color="red"
|
@click="fileDel('fileList', i)"></u-icon>
|
<image v-if="item.type == 0" :src="item.fileurlFull" mode="widthFix"></image>
|
<video v-if="item.type == 1" :src="item.fileurlFull" :controls="false"></video>
|
</view>
|
</view>
|
</view>
|
<view class="item">
|
<view class="la">运维备注</view>
|
<view class="line">
|
<textarea v-model="param.content" placeholder="请输入" placeholder-class="placeholder9" />
|
</view>
|
</view>
|
</view>
|
<view class="sub_btn" @click="onSubmit">提交</view>
|
<!-- -->
|
<u-popup :show="showUpload" @close="showUpload = false" closeOnClickOverlay>
|
<view class="sel_upload_wrap">
|
<view class="btn" @click="uploadImage">选择图片</view>
|
<view class="btn" @click="uploadVideo">选择视频</view>
|
</view>
|
</u-popup>
|
<!-- -->
|
<u-popup :show="showModal" @close="showModal = false" :safeAreaInsetBottom="true" :round="10" closeable
|
closeOnClickOverlay>
|
<view class="appr_modal">
|
<view class="title">请选择设备</view>
|
<view class="search_wrap">
|
<image class="mr12 search" src="@/static/home/ic_search@2x.png" mode="widthFix"></image>
|
<input v-model="searchValue" @confirm="getDevice()" type="text" placeholder="搜索设备名称/编号"
|
placeholder-class="placeholder9" />
|
</view>
|
<view class="modal_list">
|
<view class="item" v-for="item,i in deviceList" @click="deviceClick(item)">
|
<view class="name">[{{item.code}}] {{ item.name }}</view>
|
<image v-if="activeDevice.id == item.id" src="@/static/radioed.png" mode=""></image>
|
</view>
|
</view>
|
<view class="sub_btn" @click="handleDevice">确定选择</view>
|
</view>
|
</u-popup>
|
<!-- -->
|
<view class="reader-box" @click="stopScan" v-if="isScaning">
|
<view class="reader" id="reader"></view>
|
</view>
|
</view>
|
</template>
|
|
<script>
|
import {
|
uploadUrl,
|
ywDevicePost,
|
ywDeviceCreate,
|
getPointRecordByCode
|
} from '@/api'
|
import dayjs from 'dayjs';
|
import {
|
Html5Qrcode
|
} from 'html5-qrcode';
|
export default {
|
data() {
|
return {
|
param: {
|
status: 0
|
},
|
showUpload: false,
|
showModal: false,
|
fileList: [],
|
|
searchValue: '',
|
deviceList: [],
|
activeDevice: {},
|
|
html5Qrcode: null,
|
isScaning: false,
|
};
|
},
|
onLoad() {
|
this.getDevice()
|
},
|
methods: {
|
onSubmit() {
|
const {
|
param,
|
fileList
|
} = this
|
|
if (!param.deviceId) return this.showToast('请先选择要维护的设备')
|
this.handleP()
|
},
|
handleP() {
|
const {
|
param,
|
fileList
|
} = this
|
ywDeviceCreate({
|
...param,
|
userId: uni.getStorageSync('userInfo').id,
|
dealDate: dayjs().format('YYYY-MM-DD HH:mm:ss'),
|
multifileList: fileList
|
}).then(res => {
|
if (param.status != 0) {
|
uni.showModal({
|
title: '温馨提示',
|
content: '设备运维结果异常,是否前往提交工单?',
|
success: function(res) {
|
if (res.confirm) {
|
uni.redirectTo({
|
url: '/pages/workOrder/edit'
|
})
|
} else if (res.cancel) {
|
uni.navigateBack()
|
}
|
}
|
});
|
}else{
|
this.showToast('提交成功')
|
uni.navigateBack()
|
}
|
})
|
},
|
getDevice() {
|
ywDevicePost({
|
capacity: 9999,
|
page: 1,
|
model: {
|
name: this.searchValue
|
}
|
}).then(res => {
|
this.deviceList = res.data.records || []
|
})
|
},
|
handleDevice() {
|
const {
|
activeDevice
|
} = this
|
if (!activeDevice.id) return this.showToast('请先选择设备')
|
this.$set(this.param, 'deviceId', activeDevice.id)
|
this.$set(this.param, 'deviceCode', activeDevice.code)
|
this.$set(this.param, 'deviceName', activeDevice.name)
|
this.showModal = false
|
},
|
deviceClick(item) {
|
this.activeDevice = item
|
this.$forceUpdate()
|
},
|
statusChange(val) {
|
this.param.status = val
|
},
|
fileDel(str, i) {
|
this[str].splice(i, 1);
|
},
|
uploadImage() {
|
this.showUpload = false;
|
let token = uni.getStorageSync('token') || '';
|
uni.chooseImage({
|
count: 4,
|
success: chooseImageRes => {
|
uni.showLoading({
|
title: '上传中',
|
mask: true
|
});
|
const tempFilePaths = chooseImageRes.tempFilePaths;
|
let imgs = tempFilePaths.map((value, index) => {
|
return {
|
name: 'file',
|
uri: value
|
};
|
});
|
uni.uploadFile({
|
url: `${uploadUrl}`,
|
files: imgs,
|
name: 'file',
|
formData: {
|
folder: 'YW_DEVICE'
|
},
|
header: {
|
Dm_user_token: token
|
},
|
success: uploadFileRes => {
|
let res = JSON.parse(uploadFileRes.data);
|
if (res.data && res.data.length > 0) {
|
res.data.forEach(i => {
|
i.type = 0;
|
i.fileurl = i.imgaddr;
|
i.fileurlFull = i.url;
|
this.fileList.push(i);
|
});
|
}
|
},
|
fail(err) {
|
console.log('err', err);
|
},
|
complete() {
|
uni.hideLoading();
|
// if (i === chooseImageRes.tempFilePaths.length - 1) {
|
// uni.hideLoading()
|
// }
|
}
|
});
|
}
|
});
|
},
|
uploadVideo() {
|
this.showUpload = false;
|
let token = uni.getStorageSync('token') || '';
|
uni.chooseVideo({
|
success: chooseImageRes => {
|
uni.showLoading({
|
title: '上传中',
|
mask: true
|
});
|
uni.uploadFile({
|
url: `${uploadUrl}`,
|
filePath: chooseImageRes.tempFilePath,
|
header: {
|
Dm_user_token: token
|
},
|
name: 'file',
|
formData: {
|
folder: 'YW_DEVICE'
|
},
|
success: uploadFileRes => {
|
let res = JSON.parse(uploadFileRes.data);
|
if (res.data && res.data.length > 0) {
|
res.data.forEach(i => {
|
i.type = 1;
|
i.fileurl = i.imgaddr;
|
i.fileurlFull = i.url;
|
this.fileList.push(i);
|
});
|
}
|
},
|
complete() {
|
uni.hideLoading();
|
}
|
});
|
}
|
});
|
},
|
|
openQrcode() {
|
this.isScaning = true;
|
Html5Qrcode.getCameras().then((devices) => {
|
if (devices && devices.length) {
|
this.html5Qrcode = new Html5Qrcode('reader');
|
this.html5Qrcode.start({
|
facingMode: 'environment'
|
}, {
|
focusMode: 'continuous', //设置连续聚焦模式
|
fps: 5, //设置扫码识别速度
|
qrbox: 280 //设置二维码扫描框大小
|
},
|
(decodeText, decodeResult) => {
|
if (decodeText) { //这里decodeText就是通过扫描二维码得到的内容
|
this.$set(this.param, 'deviceCode', decodeText)
|
this.stopScan(); //关闭扫码功能
|
getPointRecordByCode({
|
// taskId: this.id,
|
pointCode: decodeText
|
}).then(ress => {
|
if (ress.data) {
|
console.log('ress', ress.data);
|
} else {
|
this.showToast('未匹配到巡检点,请重新扫描')
|
}
|
})
|
|
}
|
},
|
(err) => {
|
// console.log(err); //错误信息
|
}
|
);
|
}
|
});
|
},
|
|
stopScan() {
|
console.log('停止扫码')
|
this.isScaning = false;
|
if (this.html5Qrcode) {
|
this.html5Qrcode.stop();
|
}
|
}
|
}
|
}
|
</script>
|
|
<style lang="scss">
|
.list {
|
|
.item {
|
.la {
|
margin-top: 30rpx;
|
}
|
|
.line {
|
display: flex;
|
align-items: center;
|
|
.icon {
|
width: 52rpx;
|
height: 52rpx;
|
margin-left: 40rpx;
|
}
|
|
textarea {
|
box-sizing: border-box;
|
width: 690rpx;
|
min-height: 160rpx;
|
background-color: #f7f7f7;
|
font-size: 28rpx;
|
color: #333333;
|
padding: 24rpx;
|
border-radius: 8rpx;
|
margin-bottom: 30rpx;
|
margin-top: 20rpx;
|
}
|
}
|
|
.sel_wrap {
|
flex: 1;
|
height: 90rpx;
|
display: flex;
|
justify-content: space-between;
|
align-items: center;
|
border-bottom: 1rpx solid #E5E5E5;
|
}
|
|
.radio_wrap {
|
margin-top: 20rpx;
|
width: 100%;
|
display: flex;
|
justify-content: space-between;
|
|
.ite {
|
width: 216rpx;
|
height: 68rpx;
|
background: #F7F7F7;
|
border-radius: 36rpx;
|
font-size: 30rpx;
|
display: flex;
|
align-items: center;
|
justify-content: center;
|
}
|
|
.active {
|
color: $primaryColor;
|
border-color: $primaryColor;
|
background: rgba(0, 104, 255, 0.1);
|
}
|
}
|
|
.upload_wrap {
|
display: flex;
|
flex-wrap: wrap;
|
margin-bottom: 30rpx;
|
}
|
|
.upload_file {
|
margin-top: 24rpx;
|
width: 156rpx;
|
height: 156rpx;
|
margin-right: 20rpx;
|
border: 2rpx solid #e5e5e5;
|
background: #f7f7f7;
|
color: #666666;
|
font-size: 22rpx;
|
display: flex;
|
flex-direction: column;
|
align-items: center;
|
justify-content: center;
|
position: relative;
|
|
&:nth-of-type(4n) {
|
margin-right: 0;
|
}
|
|
.close {
|
position: absolute;
|
right: -20rpx;
|
top: -20rpx;
|
z-index: 9999;
|
}
|
|
image {
|
width: 100%;
|
height: 100%;
|
}
|
|
video {
|
width: 100%;
|
height: 100%;
|
}
|
}
|
|
}
|
}
|
|
.sel_upload_wrap {
|
width: 100%;
|
border-top: 1px solid #333333;
|
box-shadow: 0 1 1 #333333;
|
|
.btn {
|
height: 90rpx;
|
line-height: 90rpx;
|
text-align: center;
|
}
|
}
|
|
.sub_btn {
|
// position: fixed;
|
// bottom: 68rpx;
|
// left: 40rpx;
|
width: 670rpx;
|
height: 88rpx;
|
margin-top: 80rpx;
|
background: $primaryColor;
|
box-shadow: 0rpx 8rpx 20rpx 0rpx rgba(0, 104, 255, 0.3);
|
border-radius: 44rpx;
|
display: flex;
|
align-items: center;
|
justify-content: center;
|
font-weight: 500;
|
font-size: 32rpx;
|
color: #FFFFFF;
|
}
|
|
.appr_modal {
|
padding: 36rpx 30rpx 0;
|
height: calc(100vh - 120rpx);
|
|
.title {
|
font-weight: 600;
|
font-size: 32rpx;
|
color: #222222;
|
margin-bottom: 40rpx;
|
text-align: center;
|
}
|
|
.search_wrap {
|
display: flex;
|
align-items: center;
|
width: 100%;
|
height: 76rpx;
|
background: #f2f2f2;
|
border-radius: 38rpx;
|
padding-left: 30rpx;
|
|
input {
|
flex: 1;
|
}
|
|
.search {
|
width: 28rpx;
|
height: 28rpx;
|
}
|
}
|
|
.modal_list {
|
height: calc(100% - 360rpx);
|
margin-bottom: -20rpx;
|
|
.item {
|
display: flex;
|
align-items: center;
|
justify-content: space-between;
|
height: 100rpx;
|
font-size: 30rpx;
|
border-bottom: 1px solid #E5E5E5;
|
|
image {
|
width: 40rpx;
|
height: 40rpx;
|
}
|
}
|
|
.active {
|
color: $primaryColor;
|
}
|
}
|
|
}
|
|
.reader-box {
|
position: fixed;
|
top: 0;
|
bottom: 0;
|
left: 0;
|
right: 0;
|
background-color: rgba(0, 0, 0, 0.5);
|
}
|
|
.reader {
|
width: 100%;
|
// width: 540rpx;
|
// height: 540rpx;
|
position: absolute;
|
top: 50%;
|
left: 50%;
|
transform: translate(-50%, -50%);
|
}
|
</style>
|