/** * 设备设置页:房间展示、拉取房间列表、弹窗选择后 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 }) } } }