|
|
@@ -0,0 +1,800 @@
|
|
|
+<template>
|
|
|
+ <view class="device-detail">
|
|
|
+ <view class="device-detail__header">
|
|
|
+ <u-icon
|
|
|
+ size="36"
|
|
|
+ class="arrow-left"
|
|
|
+ name="arrow-left"
|
|
|
+ @click="handleBack"
|
|
|
+ ></u-icon>
|
|
|
+ {{ title }}
|
|
|
+ </view>
|
|
|
+ <view class="device-detail__body">
|
|
|
+ <view class="tabs">
|
|
|
+ <view class="tab-container">
|
|
|
+ <view class="tab-item" v-if="myuser_type" :class="activeTab === 'pestAnalysis'?'active':''" @click="handleTabClick('pestAnalysis')">
|
|
|
+ 管理员
|
|
|
+ </view>
|
|
|
+ <view class="tab-item" :class="activeTab === 'viewImage'?'active':''" @click="handleTabClick('viewImage')">
|
|
|
+ 设置
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+ <view class="device-detail-content" v-if="activeTab === 'pestAnalysis'">
|
|
|
+ <view class="device-detail-item">
|
|
|
+ <text class="device-detail-label">联网模块</text>
|
|
|
+ <view class="device-detail-btn-container">
|
|
|
+ <view class="device-detail-btn" @click="setDeviceContorl('dtu_update')">升级</view>
|
|
|
+ <view class="device-detail-btn" @click="setDeviceContorl('dtu_reboot')">重启</view>
|
|
|
+ <!-- <view class="device-detail-btn" @click="showMqttConfig">MQTT配置</view> -->
|
|
|
+ <view class="device-detail-btn" @click="setDeviceContorl('yfwlw')">平台切换</view>
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+ <view class="device-detail-item">
|
|
|
+ <text class="device-detail-label">板子设置</text>
|
|
|
+ <view class="device-detail-btn-container">
|
|
|
+ <!-- <view class="device-detail-btn">查看原始IMEI</view> -->
|
|
|
+ <view class="device-detail-btn" @click="showMqttConfig('imei')">更改IMEI</view>
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+ <view class="device-detail-item">
|
|
|
+ <text class="device-detail-label">强制操作</text>
|
|
|
+ <view class="device-detail-btn-container">
|
|
|
+ <view class="device-detail-btn force-btn" @click="setDeviceContorl('update')">升级</view>
|
|
|
+ <view class="device-detail-btn force-btn" @click="setDeviceContorl('reboot')">重启</view>
|
|
|
+ <view class="device-detail-btn force-btn" @click="setDeviceContorl('takephoto')">立即拍照</view>
|
|
|
+ <view class="device-detail-btn force-btn" @click="setDeviceContorl('autotakephoto')">对焦拍照</view>
|
|
|
+ <view class="device-detail-btn force-btn" @click="setDeviceContorl('turn')">转仓</view>
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+ <view class="device-detail-content" style="padding-bottom: 50rpx" v-if="activeTab === 'viewImage'">
|
|
|
+ <view class="device-detail-viewImage">
|
|
|
+ <u-icon name="clock" color="#0bbc58" size="46"></u-icon>
|
|
|
+ <text class="device-detail-label" style="margin-left: 10rpx">
|
|
|
+ 采集开始和关闭时间
|
|
|
+ </text>
|
|
|
+ <view class="clear-btn" @click="clearTime">清空</view>
|
|
|
+ </view>
|
|
|
+ <view class="time-container" v-for="(item,index) in coll_time" :key="index">
|
|
|
+ <view class="start-time" @click="showPickerHandler(index,'start_time')">{{item.start_time_label || '开始时间'}}</view>-
|
|
|
+ <view class="end-time" @click="showPickerHandler(index,'end_time')">{{item.end_time_label || '结束时间'}}
|
|
|
+ </view><u-icon name="clock" color="#4E5969" size="26" style="padding-right: 20rpx"></u-icon>
|
|
|
+ </view>
|
|
|
+ <view class="device-detail-viewImage" v-if="device_model == 51">
|
|
|
+ <text class="device-detail-label">高温保护阀值(℃) {{ sliderField === 'tph' && sliderDragValue !== null ? sliderDragValue : equipContrlForm.tph }}</text>
|
|
|
+ </view>
|
|
|
+ <view class="slider-container" v-if="device_model == 51">
|
|
|
+ <view class="slider-min-value">50</view>
|
|
|
+ <view
|
|
|
+ class="custom-progress"
|
|
|
+ @touchstart.stop="onSliderTouchStart($event, 'tph', 50, 70, 1)"
|
|
|
+ @touchmove.stop.prevent="onSliderTouchMove($event, 50, 70, 1)"
|
|
|
+ @touchend.stop="onSliderTouchEnd"
|
|
|
+ @tap.stop="onSliderTap($event, 'tph', 50, 70, 1)"
|
|
|
+ >
|
|
|
+ <view class="progress-track">
|
|
|
+ <view class="progress-fill" :style="{ width: getProgressWidth(sliderField === 'tph' && sliderDragValue !== null ? sliderDragValue : equipContrlForm.tph, 50, 70) + '%' }"></view>
|
|
|
+ <view class="progress-thumb" :style="{ left: getProgressWidth(sliderField === 'tph' && sliderDragValue !== null ? sliderDragValue : equipContrlForm.tph, 50, 70) + '%' }"></view>
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+ <view class="slider-max-value">70</view>
|
|
|
+ </view>
|
|
|
+ <view class="device-detail-viewImage" v-if="device_model == 0">
|
|
|
+ <text class="device-detail-label">载玻片滴液时间(h) {{ sliderField === 'drop_time' && sliderDragValue !== null ? sliderDragValue : equipContrlForm.drop_time }}</text>
|
|
|
+ </view>
|
|
|
+ <view class="slider-container" v-if="device_model == 0">
|
|
|
+ <view class="slider-min-value">1</view>
|
|
|
+ <view
|
|
|
+ class="custom-progress"
|
|
|
+ @touchstart.stop="onSliderTouchStart($event, 'drop_time', 1, 30, 1)"
|
|
|
+ @touchmove.stop.prevent="onSliderTouchMove($event, 1, 30, 1)"
|
|
|
+ @touchend.stop="onSliderTouchEnd"
|
|
|
+ @tap.stop="onSliderTap($event, 'drop_time', 1, 30, 1)"
|
|
|
+ >
|
|
|
+ <view class="progress-track">
|
|
|
+ <view class="progress-fill" :style="{ width: getProgressWidth(sliderField === 'drop_time' && sliderDragValue !== null ? sliderDragValue : equipContrlForm.drop_time, 1, 30) + '%' }"></view>
|
|
|
+ <view class="progress-thumb" :style="{ left: getProgressWidth(sliderField === 'drop_time' && sliderDragValue !== null ? sliderDragValue : equipContrlForm.drop_time, 1, 30) + '%' }"></view>
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+ <view class="slider-max-value">30</view>
|
|
|
+ </view>
|
|
|
+ <view class="device-detail-viewImage" v-if="device_model == 0">
|
|
|
+ <text class="device-detail-label">孢子培养时间(h) {{ sliderField === 'cul_time' && sliderDragValue !== null ? sliderDragValue : equipContrlForm.cul_time }}</text>
|
|
|
+ </view>
|
|
|
+ <view class="slider-container" v-if="device_model == 0">
|
|
|
+ <view class="slider-min-value">1</view>
|
|
|
+ <view
|
|
|
+ class="custom-progress"
|
|
|
+ @touchstart.stop="onSliderTouchStart($event, 'cul_time', 1, 24, 1)"
|
|
|
+ @touchmove.stop.prevent="onSliderTouchMove($event, 1, 24, 1)"
|
|
|
+ @touchend.stop="onSliderTouchEnd"
|
|
|
+ @tap.stop="onSliderTap($event, 'cul_time', 1, 24, 1)"
|
|
|
+ >
|
|
|
+ <view class="progress-track">
|
|
|
+ <view class="progress-fill" :style="{ width: getProgressWidth(sliderField === 'cul_time' && sliderDragValue !== null ? sliderDragValue : equipContrlForm.cul_time, 1, 24) + '%' }"></view>
|
|
|
+ <view class="progress-thumb" :style="{ left: getProgressWidth(sliderField === 'cul_time' && sliderDragValue !== null ? sliderDragValue : equipContrlForm.cul_time, 1, 24) + '%' }"></view>
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+ <view class="slider-max-value">24</view>
|
|
|
+ </view>
|
|
|
+ <view class="device-detail-viewImage" v-if="device_model == 0">
|
|
|
+ <text class="device-detail-label">保温仓设定温度(℃) {{ sliderField === 'set_temp' && sliderDragValue !== null ? sliderDragValue : equipContrlForm.set_temp }}</text>
|
|
|
+ </view>
|
|
|
+ <view class="slider-container" v-if="device_model == 0">
|
|
|
+ <view class="slider-min-value">10</view>
|
|
|
+ <view
|
|
|
+ class="custom-progress"
|
|
|
+ @touchstart.stop="onSliderTouchStart($event, 'set_temp', 10, 40, 1)"
|
|
|
+ @touchmove.stop.prevent="onSliderTouchMove($event, 10, 40, 1)"
|
|
|
+ @touchend.stop="onSliderTouchEnd"
|
|
|
+ @tap.stop="onSliderTap($event, 'set_temp', 10, 40, 1)"
|
|
|
+ >
|
|
|
+ <view class="progress-track">
|
|
|
+ <view class="progress-fill" :style="{ width: getProgressWidth(sliderField === 'set_temp' && sliderDragValue !== null ? sliderDragValue : equipContrlForm.set_temp, 10, 40) + '%' }"></view>
|
|
|
+ <view class="progress-thumb" :style="{ left: getProgressWidth(sliderField === 'set_temp' && sliderDragValue !== null ? sliderDragValue : equipContrlForm.set_temp, 10, 40) + '%' }"></view>
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+ <view class="slider-max-value">40</view>
|
|
|
+ </view>
|
|
|
+ <view class="device-detail-viewImage" v-if="device_model == 51">
|
|
|
+ <text class="device-detail-label">低温保护阀值(℃) {{ sliderField === 'tpl' && sliderDragValue !== null ? sliderDragValue : equipContrlForm.tpl }}</text>
|
|
|
+ </view>
|
|
|
+ <view class="slider-container" v-if="device_model == 51">
|
|
|
+ <view class="slider-min-value">-30</view>
|
|
|
+ <view
|
|
|
+ class="custom-progress"
|
|
|
+ @touchstart.stop="onSliderTouchStart($event, 'tpl', -30, 20, 1)"
|
|
|
+ @touchmove.stop.prevent="onSliderTouchMove($event, -30, 20, 1)"
|
|
|
+ @touchend.stop="onSliderTouchEnd"
|
|
|
+ @tap.stop="onSliderTap($event, 'tpl', -30, 20, 1)"
|
|
|
+ >
|
|
|
+ <view class="progress-track">
|
|
|
+ <view class="progress-fill" :style="{ width: getProgressWidth(sliderField === 'tpl' && sliderDragValue !== null ? sliderDragValue : equipContrlForm.tpl, -30, 20) + '%' }"></view>
|
|
|
+ <view class="progress-thumb" :style="{ left: getProgressWidth(sliderField === 'tpl' && sliderDragValue !== null ? sliderDragValue : equipContrlForm.tpl, -30, 20) + '%' }"></view>
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+ <view class="slider-max-value">20</view>
|
|
|
+ </view>
|
|
|
+ <view class="device-detail-viewImage">
|
|
|
+ <text class="device-detail-label">数据上传间隔(min) {{ sliderField === 'datt' && sliderDragValue !== null ? sliderDragValue : equipContrlForm.datt }}</text>
|
|
|
+ </view>
|
|
|
+ <view class="slider-container">
|
|
|
+ <view class="slider-min-value">10</view>
|
|
|
+ <view
|
|
|
+ class="custom-progress"
|
|
|
+ @touchstart.stop="onSliderTouchStart($event, 'datt', 10, 60, 10)"
|
|
|
+ @touchmove.stop.prevent="onSliderTouchMove($event, 10, 60, 10)"
|
|
|
+ @touchend.stop="onSliderTouchEnd"
|
|
|
+ @tap.stop="onSliderTap($event, 'datt', 10, 60, 10)"
|
|
|
+ >
|
|
|
+ <view class="progress-track">
|
|
|
+ <view class="progress-fill" :style="{ width: getProgressWidth(sliderField === 'datt' && sliderDragValue !== null ? sliderDragValue : equipContrlForm.datt, 10, 60) + '%' }"></view>
|
|
|
+ <view class="progress-thumb" :style="{ left: getProgressWidth(sliderField === 'datt' && sliderDragValue !== null ? sliderDragValue : equipContrlForm.datt, 10, 60) + '%' }"></view>
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+ <view class="slider-max-value">60</view>
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+ <view class="device-detail-btn-footer" v-if="activeTab === 'viewImage'">
|
|
|
+ <view class="device-detail-btn" @click="saveSettings">保存</view>
|
|
|
+ </view>
|
|
|
+ <u-popup v-model="show" mode="bottom">
|
|
|
+ <view class="device-detail-content" style="height: 50vh">
|
|
|
+ <view class="device-detail-item">
|
|
|
+ <text class="device-detail-label">请输入imei</text>
|
|
|
+ <u-input v-model="equipContrlForm.imei" placeholder="请输入imei"></u-input>
|
|
|
+ </view>
|
|
|
+ </view>
|
|
|
+ <view class="device-detail-btn-footer">
|
|
|
+ <view class="device-detail-btn" @click="setDeviceContorl('imei')">保存</view>
|
|
|
+ </view>
|
|
|
+ </u-popup>
|
|
|
+ <u-select v-model="showPicker" :list="timeList" @confirm="confirmPicker"></u-select>
|
|
|
+ </view>
|
|
|
+</template>
|
|
|
+<script>
|
|
|
+
|
|
|
+export default {
|
|
|
+ data(){
|
|
|
+ return {
|
|
|
+ showPicker: false,
|
|
|
+ value: 10,
|
|
|
+ timeList: [],
|
|
|
+ imageList: [],
|
|
|
+ coll_time:[{
|
|
|
+ start_time: '',
|
|
|
+ start_time_label: '',
|
|
|
+ end_time: '',
|
|
|
+ end_time_label: '',
|
|
|
+ },{
|
|
|
+ start_time: '',
|
|
|
+ start_time_label: '',
|
|
|
+ end_time: '',
|
|
|
+ end_time_label: '',
|
|
|
+ },{
|
|
|
+ start_time: '',
|
|
|
+ start_time_label: '',
|
|
|
+ end_time: '',
|
|
|
+ end_time_label: '',
|
|
|
+ }],
|
|
|
+ equipContrlForm: {},
|
|
|
+ time: '',
|
|
|
+ activeTab: 'pestAnalysis',
|
|
|
+ myuser_type: false,
|
|
|
+ title: '设置控制',
|
|
|
+ deviceType: '',
|
|
|
+ location: '',
|
|
|
+ d_id: '',
|
|
|
+ show: false,
|
|
|
+ checked: false,
|
|
|
+ currentIndex: -1,
|
|
|
+ currentType: '',
|
|
|
+ sliderDragValue: null,
|
|
|
+ sliderRect: null,
|
|
|
+ sliderField: '',
|
|
|
+ sliderMin: 0,
|
|
|
+ sliderMax: 100,
|
|
|
+ device_model: '',
|
|
|
+ sliderStep: 1
|
|
|
+ }
|
|
|
+ },
|
|
|
+ onLoad(options){
|
|
|
+ this.d_id = options.d_id;
|
|
|
+ this.device_model = options.device_model;
|
|
|
+ this.getControlDeviceConfigInfo();
|
|
|
+ this.timeList = [];
|
|
|
+ for(let i = 0;i<24;i++){
|
|
|
+ this.timeList.push({
|
|
|
+ value:i,
|
|
|
+ label:i < 10 ? '0' + i + ':00' : i + ':00'
|
|
|
+ })
|
|
|
+ }
|
|
|
+ uni.getStorage({
|
|
|
+ key:"myuser_type",
|
|
|
+ success:(res)=>{
|
|
|
+ if(Number(res.data) == 1){
|
|
|
+ this.myuser_type = true
|
|
|
+ this.activeTab = 'pestAnalysis'
|
|
|
+ }else{
|
|
|
+ this.activeTab = 'viewImage'
|
|
|
+ this.$nextTick(() => {
|
|
|
+ this.cacheSliderRect()
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }
|
|
|
+ })
|
|
|
+ },
|
|
|
+ methods: {
|
|
|
+ getProgressWidth(value, min, max) {
|
|
|
+ if (max === min) return 0
|
|
|
+ return ((value - min) / (max - min)) * 100
|
|
|
+ },
|
|
|
+ cacheSliderRect() {
|
|
|
+ const query = uni.createSelectorQuery().in(this)
|
|
|
+ query.select('.custom-progress').boundingClientRect(rect => {
|
|
|
+ if (rect) {
|
|
|
+ this.sliderRect = rect
|
|
|
+ }
|
|
|
+ }).exec()
|
|
|
+ },
|
|
|
+ onSliderTouchStart(e, field, min, max, step) {
|
|
|
+ this.sliderField = field
|
|
|
+ this.sliderMin = min
|
|
|
+ this.sliderMax = max
|
|
|
+ this.sliderStep = step || 1
|
|
|
+ this._lastUpdateTime = 0
|
|
|
+ this._touchX = e.touches[0].clientX
|
|
|
+ if (!this.sliderRect) {
|
|
|
+ const query = uni.createSelectorQuery().in(this)
|
|
|
+ query.select('.custom-progress').boundingClientRect(rect => {
|
|
|
+ this.sliderRect = rect
|
|
|
+ this._applyDragValue(e.touches[0].clientX)
|
|
|
+ }).exec()
|
|
|
+ } else {
|
|
|
+ this._applyDragValue(e.touches[0].clientX)
|
|
|
+ }
|
|
|
+ },
|
|
|
+ onSliderTouchMove(e, min, max, step) {
|
|
|
+ if (!this.sliderField || !this.sliderRect) return
|
|
|
+ this._touchX = e.touches[0].clientX
|
|
|
+ const now = Date.now()
|
|
|
+ if (now - this._lastUpdateTime < 33) return
|
|
|
+ this._lastUpdateTime = now
|
|
|
+ this._applyDragValue(e.touches[0].clientX)
|
|
|
+ },
|
|
|
+ onSliderTouchEnd(e) {
|
|
|
+ const clientX = (e.changedTouches && e.changedTouches[0])
|
|
|
+ ? e.changedTouches[0].clientX
|
|
|
+ : this._touchX
|
|
|
+ if (this.sliderField && this.sliderRect && clientX != null) {
|
|
|
+ const ratio = Math.max(0, Math.min(1,
|
|
|
+ (clientX - this.sliderRect.left) / this.sliderRect.width))
|
|
|
+ const value = this._snapToStep(Math.round(this.sliderMin + ratio * (this.sliderMax - this.sliderMin)))
|
|
|
+ this.$set(this.equipContrlForm, this.sliderField, value)
|
|
|
+ }
|
|
|
+ this.sliderField = ''
|
|
|
+ this.sliderDragValue = null
|
|
|
+ this._lastUpdateTime = 0
|
|
|
+ this._touchX = 0
|
|
|
+ },
|
|
|
+ onSliderTap(e, field, min, max, step) {
|
|
|
+ const snap = step || 1
|
|
|
+ const apply = (rect) => {
|
|
|
+ const ratio = Math.max(0, Math.min(1, e.detail.x / rect.width))
|
|
|
+ const raw = Math.round(min + ratio * (max - min))
|
|
|
+ const snapped = Math.round((raw - min) / snap) * snap + min
|
|
|
+ this.$set(this.equipContrlForm, field, Math.max(min, Math.min(max, snapped)))
|
|
|
+ }
|
|
|
+ if (!this.sliderRect) {
|
|
|
+ const query = uni.createSelectorQuery().in(this)
|
|
|
+ query.select('.custom-progress').boundingClientRect(rect => {
|
|
|
+ this.sliderRect = rect
|
|
|
+ apply(rect)
|
|
|
+ }).exec()
|
|
|
+ } else {
|
|
|
+ apply(this.sliderRect)
|
|
|
+ }
|
|
|
+ },
|
|
|
+ _applyDragValue(clientX) {
|
|
|
+ const ratio = Math.max(0, Math.min(1,
|
|
|
+ (clientX - this.sliderRect.left) / this.sliderRect.width))
|
|
|
+ const raw = Math.round(this.sliderMin + ratio * (this.sliderMax - this.sliderMin))
|
|
|
+ this.sliderDragValue = this._snapToStep(raw)
|
|
|
+ },
|
|
|
+ _snapToStep(value) {
|
|
|
+ const step = this.sliderStep || 1
|
|
|
+ const snapped = Math.round((value - this.sliderMin) / step) * step + this.sliderMin
|
|
|
+ return Math.max(this.sliderMin, Math.min(this.sliderMax, snapped))
|
|
|
+ },
|
|
|
+ clearTime(){
|
|
|
+ this.coll_time.forEach(item => {
|
|
|
+ item.start_time = '';
|
|
|
+ item.start_time_label = '';
|
|
|
+ item.end_time = '';
|
|
|
+ item.end_time_label = '';
|
|
|
+ })
|
|
|
+ },
|
|
|
+ confirmPicker(e){
|
|
|
+ const value = e[0].value;
|
|
|
+ const label = e[0].label;
|
|
|
+ if(this.currentType == 'end_time'){
|
|
|
+ if(this.coll_time[this.currentIndex]['start_time'] > value){
|
|
|
+ uni.showToast({
|
|
|
+ title: '结束时间不能早于开始时间',
|
|
|
+ icon: 'none',
|
|
|
+ })
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(this.currentType == 'start_time' && this.currentIndex > 0){
|
|
|
+ if(this.coll_time[this.currentIndex-1]['end_time'] > value){
|
|
|
+ uni.showToast({
|
|
|
+ title: '开始时间不能早于前面采集时间的结束时间',
|
|
|
+ icon: 'none',
|
|
|
+ })
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(this.currentType == 'start_time' && this.coll_time[this.currentIndex]['end_time'] !== ''){
|
|
|
+ if(value > this.coll_time[this.currentIndex]['end_time']){
|
|
|
+ uni.showToast({
|
|
|
+ title: '开始时间不能晚于结束时间',
|
|
|
+ icon: 'none',
|
|
|
+ })
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ this.coll_time[this.currentIndex][this.currentType] = value;
|
|
|
+ this.coll_time[this.currentIndex][this.currentType + '_label'] = label;
|
|
|
+ },
|
|
|
+ showPickerHandler(index,type){
|
|
|
+ if(type == 'end_time'){
|
|
|
+ if(this.coll_time[index]['start_time'] === ''){
|
|
|
+ uni.showToast({
|
|
|
+ title: '请先选择开始时间',
|
|
|
+ icon: 'none',
|
|
|
+ })
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(index != 0){
|
|
|
+ if(this.coll_time[index-1]['start_time_label'] === '' || this.coll_time[index-1]['end_time_label'] === ''){
|
|
|
+ uni.showToast({
|
|
|
+ title: '请先选择前面采集时间的开始和结束时间',
|
|
|
+ icon: 'none',
|
|
|
+ })
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ this.showPicker = true;
|
|
|
+ this.currentIndex = index
|
|
|
+ this.currentType = type
|
|
|
+ },
|
|
|
+ closePicker(){
|
|
|
+ this.showPicker = false;
|
|
|
+ this.currentType = ''
|
|
|
+ this.currentIndex = -1
|
|
|
+ },
|
|
|
+ handleBack() {
|
|
|
+ uni.navigateBack({
|
|
|
+ delta: 1
|
|
|
+ });
|
|
|
+ },
|
|
|
+ handleTabClick(tab) {
|
|
|
+ this.activeTab = tab;
|
|
|
+ if (tab === 'viewImage') {
|
|
|
+ this.$nextTick(() => {
|
|
|
+ this.cacheSliderRect()
|
|
|
+ })
|
|
|
+ }
|
|
|
+ },
|
|
|
+ showMqttConfig(){
|
|
|
+ this.show = true;
|
|
|
+ },
|
|
|
+ closeMqttConfig(){
|
|
|
+ this.show = false;
|
|
|
+ },
|
|
|
+ async setDeviceContorl(type){
|
|
|
+ const data = {
|
|
|
+ device_type_id: 7,
|
|
|
+ d_id: this.d_id,
|
|
|
+ cmd: type,
|
|
|
+ }
|
|
|
+ if(type === 'imei'){
|
|
|
+ data.imei = this.equipContrlForm.imei
|
|
|
+ }else{
|
|
|
+ delete data.imei
|
|
|
+ }
|
|
|
+ this.$myRequest({
|
|
|
+ url: '/api/api_gateway?method=forecast.send_control.admin_device_control',
|
|
|
+ method: 'POST',
|
|
|
+ data
|
|
|
+ }).then(res => {
|
|
|
+ this.closeMqttConfig()
|
|
|
+ if (res) {
|
|
|
+ uni.showToast({
|
|
|
+ title: '设备控制修改成功!',
|
|
|
+ icon: 'success',
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ uni.showToast({
|
|
|
+ title: '设备控制修改失败',
|
|
|
+ icon: 'error',
|
|
|
+ });
|
|
|
+ }
|
|
|
+ });
|
|
|
+ },
|
|
|
+ saveSettings(){
|
|
|
+ let newForm = Object.assign({}, this.equipContrlForm) // 深拷贝
|
|
|
+ // newForm.st = newForm.st + ''
|
|
|
+ // newForm.et = newForm.et + ''
|
|
|
+ // newForm.st && newForm.st.slice(0, 2).charAt(0) != '0'
|
|
|
+ // ? newForm.st.slice(0, 2)
|
|
|
+ // : newForm.st.slice(1, 2)
|
|
|
+ // newForm.et =
|
|
|
+ // newForm.et && newForm.et.slice(0, 2).charAt(0) != '0'
|
|
|
+ // ? newForm.et.slice(0, 2)
|
|
|
+ // : newForm.et.slice(1, 2)
|
|
|
+
|
|
|
+ for (let k in newForm) {
|
|
|
+ if (typeof newForm[k] === 'number') {
|
|
|
+ newForm[k] = newForm[k] + ''
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // newForm.st = newForm.st.replace(':00', '')
|
|
|
+ console.log(this.coll_time,'coll_timecoll_timecoll_time')
|
|
|
+ const coll_time = [];
|
|
|
+ for(let i = 0;i< this.coll_time.length;i++){
|
|
|
+ const coll_item = this.coll_time[i];
|
|
|
+ if(String(coll_item.start_time) && String(coll_item.end_time)){
|
|
|
+ coll_time.push(String(coll_item.start_time) + '-' + String(coll_item.end_time))
|
|
|
+ }
|
|
|
+ }
|
|
|
+ newForm.coll_time = coll_time
|
|
|
+ newForm.admin = Number(newForm.admin);
|
|
|
+ newForm.drop_time = Number(newForm.drop_time);
|
|
|
+ newForm.cul_time = Number(newForm.cul_time);
|
|
|
+ newForm.set_temp = Number(newForm.set_temp);
|
|
|
+ newForm.datt = Number(newForm.datt);
|
|
|
+ newForm.cold_sw = Number(newForm.cold_sw);
|
|
|
+ newForm.on_off = Number(newForm.on_off);
|
|
|
+ newForm.tpl = Number(newForm.tpl);
|
|
|
+ newForm.tph = Number(newForm.tph);
|
|
|
+ if(this.device_model == 0){
|
|
|
+ delete newForm.tpl
|
|
|
+ delete newForm.tph
|
|
|
+ }
|
|
|
+ this.$myRequest({
|
|
|
+ url: '/api/api_gateway?method=forecast.send_control.device_control',
|
|
|
+ method: 'POST',
|
|
|
+ data: {
|
|
|
+ device_type_id: 7,
|
|
|
+ d_id: this.d_id,
|
|
|
+ config: JSON.stringify(newForm)
|
|
|
+ }
|
|
|
+ }).then(res => {
|
|
|
+ if (res) {
|
|
|
+ // 设备控制修改成功
|
|
|
+ uni.showToast({
|
|
|
+ title: '设备控制修改成功!',
|
|
|
+ icon: 'success',
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ uni.showToast({
|
|
|
+ title: '设备控制修改失败',
|
|
|
+ icon: 'error',
|
|
|
+ });
|
|
|
+ }
|
|
|
+ })
|
|
|
+ },
|
|
|
+ async getControlDeviceConfigInfo(){
|
|
|
+ const res = await this.$myRequest({
|
|
|
+ url: '/api/api_gateway?method=forecast.send_control.device_control_info',
|
|
|
+ method: 'POST',
|
|
|
+ data: {
|
|
|
+ d_id: this.d_id,
|
|
|
+ cmd:'paramconf'
|
|
|
+ },
|
|
|
+ });
|
|
|
+ this.equipContrlForm = res
|
|
|
+ const coll_time = res?.coll_time || [];
|
|
|
+ for(let i = 0;i< coll_time.length;i++){
|
|
|
+ const coll_item = coll_time[i];
|
|
|
+ const start_time = coll_item.split('-')[0];
|
|
|
+ const end_time = coll_item.split('-')[1];
|
|
|
+ this.coll_time[i]['start_time'] = start_time;
|
|
|
+ this.coll_time[i]['end_time'] = end_time;
|
|
|
+ this.coll_time[i]['start_time_label'] = start_time >= 10 ? start_time + ':00' : '0' + start_time + ':00';
|
|
|
+ this.coll_time[i]['end_time_label'] = end_time >= 10 ? end_time + ':00' : '0' + end_time + ':00';
|
|
|
+ }
|
|
|
+ console.log(this.coll_time,'coll_timecoll_timecoll_time')
|
|
|
+ this.equipContrlForm.tph = Number(this.equipContrlForm.tph || 50)
|
|
|
+ this.equipContrlForm.tpl = Number(this.equipContrlForm.tpl || 0)
|
|
|
+ },
|
|
|
+ }
|
|
|
+}
|
|
|
+</script>
|
|
|
+<style scoped lang="scss">
|
|
|
+.device-detail {
|
|
|
+ display: flex;
|
|
|
+ width: 100%;
|
|
|
+ height: calc(100vh - 112rpx);
|
|
|
+ padding-top: 112rpx;
|
|
|
+ flex-direction: column;
|
|
|
+ align-items: center;
|
|
|
+ background: linear-gradient(180deg, #ffffff00 0%, #F5F6FA 23.64%, #F5F6FA 100%), linear-gradient(102deg, #BFEADD 6.77%, #B8F1E7 40.15%, #B9EEF5 84.02%);
|
|
|
+ .device-detail__header {
|
|
|
+ width: 100%;
|
|
|
+ font-size: 28rpx;
|
|
|
+ color: #999;
|
|
|
+ color: #042118;
|
|
|
+ font-family: 'Source Han Sans CN VF';
|
|
|
+ font-weight: 700;
|
|
|
+ position: relative;
|
|
|
+ text-align: center;
|
|
|
+ .arrow-left {
|
|
|
+ position: absolute;
|
|
|
+ left: 32rpx;
|
|
|
+ margin-right: 12rpx;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .time-container{
|
|
|
+ display: flex;
|
|
|
+ justify-content: center;
|
|
|
+ align-items: center;
|
|
|
+ color: #999999;
|
|
|
+ border-radius: 8rpx;
|
|
|
+ background:#F6F8FC;
|
|
|
+ gap: 12rpx;
|
|
|
+ .start-time{
|
|
|
+ width: 250rpx;
|
|
|
+ height: 50rpx;
|
|
|
+ line-height: 50rpx;
|
|
|
+ text-align: left;
|
|
|
+ font-size: 24rpx;
|
|
|
+ color: #999999;
|
|
|
+ font-family: 'Source Han Sans CN VF';
|
|
|
+ border-radius: 16rpx;
|
|
|
+ padding: 0 24rpx;
|
|
|
+ }
|
|
|
+ .end-time{
|
|
|
+ width: 200rpx;
|
|
|
+ height: 50rpx;
|
|
|
+ line-height: 50rpx;
|
|
|
+ text-align: left;
|
|
|
+ font-size: 24rpx;
|
|
|
+ color: #999999;
|
|
|
+ font-family: 'Source Han Sans CN VF';
|
|
|
+ border-radius: 16rpx;
|
|
|
+ padding: 0 24rpx;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .device-detail__body {
|
|
|
+ width: calc(100% - 64rpx);
|
|
|
+ margin: 0 auto;
|
|
|
+ border-radius: 16rpx;
|
|
|
+ overflow-x: hidden;
|
|
|
+ overflow-y: auto;
|
|
|
+ // 隐藏滚动条
|
|
|
+ -ms-overflow-style: none;
|
|
|
+ scrollbar-width: none;
|
|
|
+ }
|
|
|
+ .tabs {
|
|
|
+ margin: 24rpx 0;
|
|
|
+ border-radius: 16rpx;
|
|
|
+ padding: 16rpx 0;
|
|
|
+ padding-top: 0;
|
|
|
+ .tab-container{
|
|
|
+ display: flex;
|
|
|
+ width: 100%;
|
|
|
+ height: 88rpx;
|
|
|
+ line-height: 88rpx;
|
|
|
+ text-align: center;
|
|
|
+ font-size: 28rpx;
|
|
|
+ color: #042118;
|
|
|
+ font-family: 'Source Han Sans CN VF';
|
|
|
+ }
|
|
|
+ .tab-item {
|
|
|
+ margin-right: 40rpx;
|
|
|
+ color:#999999;
|
|
|
+ }
|
|
|
+ .active{
|
|
|
+ position: relative;
|
|
|
+ color: #0bbc58;
|
|
|
+ text-align: center;
|
|
|
+ font-family: "Source Han Sans CN VF";
|
|
|
+ font-size: 28rpx;
|
|
|
+ font-weight: 700;
|
|
|
+ &::after {
|
|
|
+ content: '';
|
|
|
+ position: absolute;
|
|
|
+ bottom: 10rpx;
|
|
|
+ left: 50%;
|
|
|
+ transform: translateX(-50%);
|
|
|
+ width: 100%;
|
|
|
+ height: 36rpx;
|
|
|
+ border-bottom: 6rpx solid #0bbc58;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .slider-container{
|
|
|
+ position: relative;
|
|
|
+ margin-bottom: 20rpx;
|
|
|
+ .slider-min-value{
|
|
|
+ position: absolute;
|
|
|
+ left: 0;
|
|
|
+ top: -50rpx;
|
|
|
+ }
|
|
|
+ .slider{
|
|
|
+ width: 600rpx;
|
|
|
+ }
|
|
|
+ .slider-max-value{
|
|
|
+ position: absolute;
|
|
|
+ right: 0;
|
|
|
+ top: -50rpx;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .custom-progress{
|
|
|
+ width: 600rpx;
|
|
|
+ padding: 0;
|
|
|
+ .progress-track{
|
|
|
+ position: relative;
|
|
|
+ height: 12rpx;
|
|
|
+ background-color: #ebedf0;
|
|
|
+ border-radius: 6rpx;
|
|
|
+ }
|
|
|
+ .progress-fill{
|
|
|
+ position: absolute;
|
|
|
+ left: 0;
|
|
|
+ top: 0;
|
|
|
+ height: 100%;
|
|
|
+ background-color: #0BBC58;
|
|
|
+ border-radius: 6rpx;
|
|
|
+ }
|
|
|
+ .progress-thumb{
|
|
|
+ position: absolute;
|
|
|
+ top: 50%;
|
|
|
+ width: 28rpx;
|
|
|
+ height: 28rpx;
|
|
|
+ margin-left: -14rpx;
|
|
|
+ margin-top: -14rpx;
|
|
|
+ border-radius: 50%;
|
|
|
+ background-color: #fff;
|
|
|
+ box-shadow: 0 1px 4px rgba(0,0,0,0.3);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .device-detail-content{
|
|
|
+ display: flex;
|
|
|
+ padding: 24rpx 32rpx;
|
|
|
+ flex-direction: column;
|
|
|
+ align-items: flex-start;
|
|
|
+ gap: 20rpx;
|
|
|
+ border-radius: 16rpx;
|
|
|
+ background: #FFF;
|
|
|
+ .device-detail-item{
|
|
|
+ .device-detail-label{
|
|
|
+ color: #303133;
|
|
|
+ font-family: "Source Han Sans CN VF";
|
|
|
+ font-size: 28rpx;
|
|
|
+ font-weight: 400;
|
|
|
+ }
|
|
|
+ .device-detail-btn-container{
|
|
|
+ display: flex;
|
|
|
+ gap: 24rpx;
|
|
|
+ margin-top: 12rpx;
|
|
|
+ }
|
|
|
+ .device-detail-btn{
|
|
|
+ display: flex;
|
|
|
+ padding: 10rpx 16rpx;
|
|
|
+ justify-content: center;
|
|
|
+ align-items: center;
|
|
|
+ gap: 16rpx;
|
|
|
+ border-radius: 16rpx;
|
|
|
+ background: #0bbc58;
|
|
|
+ color: #ffffff;
|
|
|
+ font-family: "Source Han Sans CN VF";
|
|
|
+ font-size: 24rpx;
|
|
|
+ font-weight: 400;
|
|
|
+ }
|
|
|
+ .force-btn{
|
|
|
+ background: #FB4E52;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .device-detail-viewImage{
|
|
|
+ width: 100%;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ padding-bottom: 20rpx;
|
|
|
+ position: relative;
|
|
|
+ .clear-btn{
|
|
|
+ position: absolute;
|
|
|
+ right: 0rpx;
|
|
|
+ border: 1rpx solid #0bbc58;
|
|
|
+ border-radius: 8rpx;
|
|
|
+ padding: 4rpx 12rpx;
|
|
|
+ font-size: 24rpx;
|
|
|
+ color: #0bbc58;
|
|
|
+ font-family: 'Source Han Sans CN VF';
|
|
|
+ font-weight: 400;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .device-detail-btn-footer{
|
|
|
+ position: fixed;
|
|
|
+ bottom: 0;
|
|
|
+ left: 0;
|
|
|
+ width: 100%;
|
|
|
+ height: 112rpx;
|
|
|
+ line-height: 112rpx;
|
|
|
+ text-align: center;
|
|
|
+ font-size: 28rpx;
|
|
|
+ font-weight: 700;
|
|
|
+ color: #042118;
|
|
|
+ font-family: 'Source Han Sans CN VF';
|
|
|
+ background: #ffffff;
|
|
|
+ display: flex;
|
|
|
+ justify-content: center;
|
|
|
+ align-items: center;
|
|
|
+ .device-detail-btn{
|
|
|
+ display: flex;
|
|
|
+ height: 80rpx;
|
|
|
+ width: 90%;
|
|
|
+ margin: 0 auto;
|
|
|
+ padding: 0rpx 20rpx;
|
|
|
+ justify-content: center;
|
|
|
+ align-items: center;
|
|
|
+ gap: 8rpx;
|
|
|
+ border-radius: 16rpx;
|
|
|
+ background:#0bbc58;
|
|
|
+ color: #ffffff;
|
|
|
+ text-align: center;
|
|
|
+ font-family: "Source Han Sans CN VF";
|
|
|
+ font-size: 14px;
|
|
|
+ font-style: normal;
|
|
|
+ font-weight: 500;
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|
|
|
+</style>
|