142 lines
3.8 KiB
JavaScript
142 lines
3.8 KiB
JavaScript
/**
|
||
* 设备设置页:房间展示、拉取房间列表、弹窗选择后 PUT /bst/device 更新 roomId
|
||
* 依赖页面存在:id、xqobj、this.$http
|
||
*/
|
||
import { patchDeviceRoomInStorage } from '@/common/utils/deviceRoomOverlay.js'
|
||
|
||
export default {
|
||
data() {
|
||
return {
|
||
deviceRoomPickerVisible: false,
|
||
deviceRoomPickerList: [],
|
||
deviceRoomPickerLoading: false,
|
||
deviceRoomSaving: false,
|
||
/** 当前页是否已因详情拉取过房间列表(含空列表),用于点击时不再重复请求 */
|
||
deviceRoomListReady: false
|
||
}
|
||
},
|
||
computed: {
|
||
deviceRoomDisplayName() {
|
||
const o = this.xqobj || {}
|
||
if (o.roomName) return o.roomName
|
||
const rid = o.roomId
|
||
if (rid === undefined || rid === null || rid === '') return '—'
|
||
const hit = (this.deviceRoomPickerList || []).find(r => String(r.id) === String(rid))
|
||
return hit ? hit.name : '—'
|
||
}
|
||
},
|
||
methods: {
|
||
deviceRoomSpaceId() {
|
||
const o = this.xqobj || {}
|
||
return o.spaceId || uni.getStorageSync('kjid') || ''
|
||
},
|
||
/** 在 getxq 成功赋值 xqobj 后调用,用于展示当前房间名称 */
|
||
afterDeviceDetailLoaded() {
|
||
const spaceId = this.deviceRoomSpaceId()
|
||
if (!spaceId) {
|
||
this.deviceRoomListReady = true
|
||
return
|
||
}
|
||
this.$http
|
||
.get(`/bst/room/list?spaceId=${spaceId}&pageNum=1&pageSize=999`)
|
||
.then(res => {
|
||
this.deviceRoomListReady = true
|
||
if (res.code == 200) {
|
||
this.deviceRoomPickerList = res.rows || []
|
||
this.$forceUpdate()
|
||
}
|
||
})
|
||
.catch(() => {
|
||
this.deviceRoomListReady = true
|
||
})
|
||
},
|
||
onDeviceRoomRowTap() {
|
||
if (this.deviceRoomSaving) return
|
||
const spaceId = this.deviceRoomSpaceId()
|
||
if (!spaceId) {
|
||
uni.showToast({
|
||
title: this.$i18n.t('selectSpaceFirst'),
|
||
icon: 'none'
|
||
})
|
||
return
|
||
}
|
||
this.deviceRoomPickerVisible = true
|
||
// 进入详情时 afterDeviceDetailLoaded 已拉过房间列表,则直接展示(含 0 条),不再点一次请求一次
|
||
if (this.deviceRoomListReady) {
|
||
this.deviceRoomPickerLoading = false
|
||
return
|
||
}
|
||
// 详情回调尚未跑完时用户就点了,再拉一次,并标记就绪
|
||
this.deviceRoomPickerLoading = true
|
||
this.$http
|
||
.get(`/bst/room/list?spaceId=${spaceId}&pageNum=1&pageSize=999`)
|
||
.then(res => {
|
||
this.deviceRoomListReady = true
|
||
this.deviceRoomPickerLoading = false
|
||
if (res.code == 200) {
|
||
this.deviceRoomPickerList = res.rows || []
|
||
} else {
|
||
uni.showToast({
|
||
title: res.msg || this.$i18n.t('noData'),
|
||
icon: 'none'
|
||
})
|
||
this.deviceRoomPickerVisible = false
|
||
}
|
||
})
|
||
.catch(() => {
|
||
this.deviceRoomPickerLoading = false
|
||
this.deviceRoomPickerVisible = false
|
||
})
|
||
},
|
||
closeDeviceRoomPicker() {
|
||
this.deviceRoomPickerVisible = false
|
||
},
|
||
confirmDeviceRoomChange(room) {
|
||
if (!room || this.deviceRoomSaving) return
|
||
const spaceId = this.deviceRoomSpaceId()
|
||
const o = this.xqobj || {}
|
||
if (String(o.roomId) === String(room.id)) {
|
||
this.closeDeviceRoomPicker()
|
||
return
|
||
}
|
||
const data = {
|
||
id: this.id,
|
||
sn: o.sn,
|
||
spaceId,
|
||
roomId: room.id,
|
||
name: o.name
|
||
}
|
||
this.deviceRoomSaving = true
|
||
this.$http
|
||
.put('/bst/device', data)
|
||
.then(res => {
|
||
this.deviceRoomSaving = false
|
||
if (res.code == 200) {
|
||
this.xqobj.roomId = room.id
|
||
this.xqobj.roomName = room.name
|
||
patchDeviceRoomInStorage(this.id, room.id, room.name)
|
||
uni.showToast({
|
||
title: res.msg || this.$i18n.t('operationSuccess'),
|
||
icon: 'success'
|
||
})
|
||
uni.$emit('deviceListNeedRefresh', {
|
||
deviceId: this.id,
|
||
roomId: room.id,
|
||
roomName: room.name
|
||
})
|
||
this.closeDeviceRoomPicker()
|
||
this.$forceUpdate()
|
||
} else {
|
||
uni.showToast({
|
||
title: res.msg || this.$i18n.t('noData'),
|
||
icon: 'none'
|
||
})
|
||
}
|
||
})
|
||
.catch(() => {
|
||
this.deviceRoomSaving = false
|
||
})
|
||
}
|
||
}
|
||
}
|