594 lines
14 KiB
Vue
594 lines
14 KiB
Vue
|
<template>
|
|||
|
<page-meta><navigation-bar :title="$tt('deviceAdd.addDevice')" title-align="center"
|
|||
|
background-color="#007AFF" /></page-meta>
|
|||
|
<view class="container">
|
|||
|
<view class="card">
|
|||
|
<u--form labelPosition="left" :model="form" ref="form" labelWidth="80" labelAlign="center">
|
|||
|
<view style="padding:10px 0;;border-bottom:1px solid #EFEFEF;display:flex;">
|
|||
|
<u--text prefixIcon="grid-fill" iconStyle="font-size: 16px;color:#606266"
|
|||
|
:text="$tt('deviceAdd.fillcontent')" bold color="#606266"></u--text>
|
|||
|
<u-button type="success" :text="$tt('linkDevice.scan')" icon="scan" size="small"
|
|||
|
customStyle="margin-left:20px;width:90px;" @click="openScan(form.serialNumber)"></u-button>
|
|||
|
</view>
|
|||
|
<u-form-item :label="$tt('deviceAdd.productname')" prop="SSID">
|
|||
|
<u-input v-model="form.deviceName" :placeholder="$tt('deviceAdd.inputdevicename')">
|
|||
|
</u-input>
|
|||
|
</u-form-item>
|
|||
|
|
|||
|
<u-form-item :label="$tt('deviceAdd.Product')" prop="productId">
|
|||
|
<uni-data-select v-model="form.productId" :localdata="list"
|
|||
|
:placeholder="$tt('deviceAdd.inputproduct')" @change="handleProductChange" />
|
|||
|
</u-form-item>
|
|||
|
|
|||
|
|
|||
|
|
|||
|
<u-form-item :label="$tt('deviceAdd.equipment')" prop="imei">
|
|||
|
<u-input v-model="form.serialNumber" :placeholder="$tt('deviceAdd.inputequipment')"
|
|||
|
:type="passwordShow ? 'text' : 'password'">
|
|||
|
|
|||
|
</u-input>
|
|||
|
</u-form-item>
|
|||
|
|
|||
|
<u-form-item :label="$tt('deviceAdd.longitude')" prop="longitude">
|
|||
|
<u-input v-model="form.longitude" :placeholder="$tt('deviceAdd.inputlongitude')"
|
|||
|
:type="passwordShow ? 'text' : 'password'">
|
|||
|
|
|||
|
</u-input>
|
|||
|
</u-form-item>
|
|||
|
|
|||
|
|
|||
|
|
|||
|
<u-form-item :label="$tt('deviceAdd.latitude')" prop="latitude">
|
|||
|
<u-input v-model="form.latitude" :placeholder="$tt('deviceAdd.inputlatitude')"
|
|||
|
:type="passwordShow ? 'text' : 'password'">
|
|||
|
|
|||
|
</u-input>
|
|||
|
</u-form-item>
|
|||
|
|
|||
|
<!-- 修改分组选择/输入组件 -->
|
|||
|
<u-form-item label="设备分组" prop="groupId">
|
|||
|
<uni-data-select v-model="form.groupId" :localdata="groupListWithOther" :placeholder="'请选择分组'"
|
|||
|
@change="handleGroupChange" />
|
|||
|
</u-form-item>
|
|||
|
|
|||
|
<!-- 新增一个独立的表单项用于其他分组名称输入 -->
|
|||
|
<u-form-item v-if="showCustomGroupInput" label="分组名称" prop="groupName">
|
|||
|
<u-input v-model="form.groupName" placeholder="请输入新分组名称" />
|
|||
|
</u-form-item>
|
|||
|
|
|||
|
<u-form-item>
|
|||
|
<u-button type="primary" @click="getCurrentLocation">获取当前位置</u-button>
|
|||
|
</u-form-item>
|
|||
|
|
|||
|
|
|||
|
<u-form-item>
|
|||
|
<u-button type="primary" @click="phoneadddevice">添加</u-button>
|
|||
|
</u-form-item>
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
</u--form>
|
|||
|
</view>
|
|||
|
</view>
|
|||
|
</template>
|
|||
|
|
|||
|
<script>
|
|||
|
import {
|
|||
|
getProfile
|
|||
|
} from '@/apis/modules/common';
|
|||
|
import {
|
|||
|
getProductList
|
|||
|
} from '@/apis/modules/product';
|
|||
|
|
|||
|
import {
|
|||
|
addDevice
|
|||
|
} from '@/apis/modules/device.js';
|
|||
|
import {
|
|||
|
getGroupList,
|
|||
|
updateDeviceGroups,
|
|||
|
addGroup
|
|||
|
} from '@/apis/modules/group';
|
|||
|
export default {
|
|||
|
data() {
|
|||
|
return {
|
|||
|
// 是否为微信小程序
|
|||
|
isWeChat: false,
|
|||
|
// 复选框配置remeber、advance
|
|||
|
checkboxConfigs: ['remeber'],
|
|||
|
// 配网模式选项卡索引
|
|||
|
tabIndex: 0,
|
|||
|
// wifi密码可见性
|
|||
|
passwordShow: true,
|
|||
|
// 用户编号是否可编辑
|
|||
|
userIdDisabled: true,
|
|||
|
|
|||
|
// form: {
|
|||
|
// productId: 0,
|
|||
|
// status: 1,
|
|||
|
// locationWay: 3,
|
|||
|
// firmwareVersion: 1.0,
|
|||
|
// serialNumber: '',
|
|||
|
// deviceType: 1,
|
|||
|
// isSimulate: 0,
|
|||
|
// productName: '',
|
|||
|
// deviceId: "0",
|
|||
|
// },
|
|||
|
|
|||
|
form: {
|
|||
|
productId: 0,
|
|||
|
status: 1,
|
|||
|
locationWay: 3,
|
|||
|
firmwareVersion: 1,
|
|||
|
serialNumber: "",
|
|||
|
deviceType: 2,
|
|||
|
isSimulate: 0,
|
|||
|
deviceId: "0",
|
|||
|
deviceName: "",
|
|||
|
productName: "",
|
|||
|
tenantId: 0,
|
|||
|
tenantName: "",
|
|||
|
longitude: "",
|
|||
|
latitude: "",
|
|||
|
groupId: '', // 添加分组ID字段
|
|||
|
groupName: '', // 添加分组名称字段
|
|||
|
},
|
|||
|
queryParams: {
|
|||
|
pageNum: 1,
|
|||
|
pageSize: 12,
|
|||
|
productName: null,
|
|||
|
categoryId: null,
|
|||
|
categoryName: null,
|
|||
|
tenantId: null,
|
|||
|
tenantName: null,
|
|||
|
isSys: null,
|
|||
|
status: 2, //已发布
|
|||
|
// deviceType: 3, // 监控设备
|
|||
|
networkMethod: null,
|
|||
|
},
|
|||
|
|
|||
|
list: [], // 产品列表
|
|||
|
|
|||
|
// 计数
|
|||
|
count: {
|
|||
|
// 进度定时器
|
|||
|
timer: {},
|
|||
|
// 显示文本
|
|||
|
text: this.$tt('deviceAdd.noDevice'),
|
|||
|
// 文字类型
|
|||
|
type: 'warning'
|
|||
|
},
|
|||
|
// 发现设备计时器
|
|||
|
discoverTimer: {},
|
|||
|
// 单设备配网进度
|
|||
|
progress: 0,
|
|||
|
// 单设备配网步骤
|
|||
|
step: 1,
|
|||
|
|
|||
|
// wifi列表加载
|
|||
|
loading: false,
|
|||
|
// wifi列表
|
|||
|
|
|||
|
|
|||
|
mstep: 0,
|
|||
|
// 更新WIFI按钮
|
|||
|
updateDisable: false,
|
|||
|
groupList: [], // 分组列表
|
|||
|
isNewGroup: false, // 是否新建分组
|
|||
|
showCustomGroupInput: false, // 控制自定义分组输入框显示
|
|||
|
};
|
|||
|
},
|
|||
|
computed: {
|
|||
|
// 添加"其他"选项到分组列表
|
|||
|
groupListWithOther() {
|
|||
|
return [
|
|||
|
...this.groupList,
|
|||
|
{
|
|||
|
value: 'other',
|
|||
|
text: '其他分组'
|
|||
|
}
|
|||
|
]
|
|||
|
}
|
|||
|
},
|
|||
|
created() {
|
|||
|
// #ifdef MP-WEIXIN
|
|||
|
// this.initInWeChat();
|
|||
|
this.tabIndex = 1;
|
|||
|
this.isWeChat = true;
|
|||
|
// #endif
|
|||
|
|
|||
|
// #ifndef MP-WEIXIN
|
|||
|
this.tabIndex = 0;
|
|||
|
// #endif
|
|||
|
|
|||
|
//获取登录用户信息
|
|||
|
// 获取登录用户信息
|
|||
|
if (this.profile == null) {
|
|||
|
this.getProfile();
|
|||
|
} else {
|
|||
|
this.form.tenantId = this.profile.userId;
|
|||
|
this.form.tenantName = this.profile.userName;
|
|||
|
console.log("profile:", JSON.stringify(this.profile)); // 打印出用户ID
|
|||
|
}
|
|||
|
this.getList();
|
|||
|
|
|||
|
// 断开Mqtt连接
|
|||
|
this.endMqtt();
|
|||
|
// 获取WIFI信息
|
|||
|
// this.getWifi();
|
|||
|
// if (this.tabIndex == 0) {
|
|||
|
// // 发现设备
|
|||
|
// this.discoverDevice();
|
|||
|
// }
|
|||
|
this.getGroupList(); // 获取分组列表
|
|||
|
},
|
|||
|
onUnload() {
|
|||
|
clearInterval(this.discoverTimer);
|
|||
|
// 页面卸载时连接mqtt
|
|||
|
this.connectMqtt();
|
|||
|
},
|
|||
|
methods: {
|
|||
|
/* 断开Mqtt消息服务器 */
|
|||
|
async endMqtt() {
|
|||
|
await this.$mqttTool.end();
|
|||
|
},
|
|||
|
/* 连接Mqtt消息服务器 */
|
|||
|
async connectMqtt() {
|
|||
|
if (this.$mqttTool.client == null) {
|
|||
|
console.log('连接mqtt...');
|
|||
|
await this.$mqttTool.connect(this.vuex_token);
|
|||
|
}
|
|||
|
},
|
|||
|
|
|||
|
getCurrentLocation() {
|
|||
|
console.log('获取位置函数开始执行');
|
|||
|
uni.getLocation({
|
|||
|
type: 'gcj02', // 尝试使用 gcj02 类型
|
|||
|
success: (res) => {
|
|||
|
console.log('获取位置成功', res);
|
|||
|
this.$set(this.form, 'longitude', String(res.longitude));
|
|||
|
this.$set(this.form, 'latitude', String(res.latitude));
|
|||
|
uni.showToast({
|
|||
|
title: '定位成功',
|
|||
|
icon: 'success'
|
|||
|
});
|
|||
|
},
|
|||
|
fail: (err) => {
|
|||
|
console.error('获取定位失败:', err);
|
|||
|
uni.showToast({
|
|||
|
title: '定位失败',
|
|||
|
icon: 'none'
|
|||
|
});
|
|||
|
}
|
|||
|
});
|
|||
|
|
|||
|
},
|
|||
|
|
|||
|
phoneadddevice() {
|
|||
|
// 验证分组信息
|
|||
|
if (this.form.groupId === 'other' && !this.form.groupName) {
|
|||
|
uni.showToast({
|
|||
|
icon: 'none',
|
|||
|
title: '请输入新分组名称'
|
|||
|
});
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
if (!this.form.groupId && !this.form.groupName) {
|
|||
|
uni.showToast({
|
|||
|
icon: 'none',
|
|||
|
title: '请选择或输入分组'
|
|||
|
});
|
|||
|
return;
|
|||
|
}
|
|||
|
|
|||
|
// 如果选择了"其他分组",先创建新分组
|
|||
|
if (this.form.groupId === 'other') {
|
|||
|
this.createNewGroup().then(newGroupId => {
|
|||
|
if (newGroupId) {
|
|||
|
this.form.groupId = newGroupId; // 使用新分组的ID
|
|||
|
this.addDeviceToGroup(); // 添加设备并分组
|
|||
|
} else {
|
|||
|
uni.showToast({
|
|||
|
icon: 'none',
|
|||
|
title: '创建分组失败'
|
|||
|
});
|
|||
|
}
|
|||
|
});
|
|||
|
} else {
|
|||
|
this.addDeviceToGroup(); // 直接添加设备并分组
|
|||
|
}
|
|||
|
},
|
|||
|
|
|||
|
// 创建新分组
|
|||
|
async createNewGroup() {
|
|||
|
try {
|
|||
|
const newGroup = {
|
|||
|
groupName: this.form.groupName
|
|||
|
};
|
|||
|
const res = await addGroup(newGroup); // 调用 addGroup API
|
|||
|
if (res.code === 200) {
|
|||
|
// 重新获取分组列表
|
|||
|
await this.getGroupList();
|
|||
|
|
|||
|
// 从分组列表中查找新创建的分组
|
|||
|
const newGroupItem = this.groupList.find(item => item.text === this.form.groupName);
|
|||
|
if (newGroupItem) {
|
|||
|
return newGroupItem.value; // 返回新分组的 ID
|
|||
|
} else {
|
|||
|
console.error('新分组未在分组列表中找到:', this.form.groupName);
|
|||
|
return null;
|
|||
|
}
|
|||
|
} else {
|
|||
|
console.error('API 返回错误:', res);
|
|||
|
return null;
|
|||
|
}
|
|||
|
} catch (error) {
|
|||
|
console.error('创建分组错误:', error);
|
|||
|
return null;
|
|||
|
}
|
|||
|
},
|
|||
|
|
|||
|
// 添加设备并分组
|
|||
|
addDeviceToGroup() {
|
|||
|
addDevice(this.form).then(res => {
|
|||
|
if (res.code === 200) {
|
|||
|
const newDeviceId = parseInt(res.data.deviceId || res.data);
|
|||
|
|
|||
|
if (this.form.groupId && this.form.groupId !== 'other') {
|
|||
|
const deviceGroup = {
|
|||
|
groupId: this.form.groupId,
|
|||
|
deviceIds: [newDeviceId]
|
|||
|
};
|
|||
|
|
|||
|
updateDeviceGroups(deviceGroup).then(response => {
|
|||
|
if (response.code === 200) {
|
|||
|
uni.showToast({
|
|||
|
icon: 'none',
|
|||
|
title: '设备添加并分组成功'
|
|||
|
});
|
|||
|
} else {
|
|||
|
uni.showToast({
|
|||
|
icon: 'none',
|
|||
|
title: '设备分组失败'
|
|||
|
});
|
|||
|
}
|
|||
|
}).catch(error => {
|
|||
|
console.error('分组更新错误:', error);
|
|||
|
uni.showToast({
|
|||
|
icon: 'none',
|
|||
|
title: '设备分组失败'
|
|||
|
});
|
|||
|
});
|
|||
|
} else {
|
|||
|
uni.showToast({
|
|||
|
icon: 'none',
|
|||
|
title: '添加成功'
|
|||
|
});
|
|||
|
}
|
|||
|
|
|||
|
uni.reLaunch({
|
|||
|
url: '/'
|
|||
|
});
|
|||
|
} else {
|
|||
|
uni.showToast({
|
|||
|
icon: 'none',
|
|||
|
title: '添加失败,请重试'
|
|||
|
});
|
|||
|
}
|
|||
|
}).catch(error => {
|
|||
|
console.error(error);
|
|||
|
uni.showToast({
|
|||
|
icon: 'none',
|
|||
|
title: '网络错误,请稍后再试'
|
|||
|
});
|
|||
|
});
|
|||
|
},
|
|||
|
|
|||
|
getList() {
|
|||
|
getProductList(this.queryParams)
|
|||
|
.then(res => {
|
|||
|
const {
|
|||
|
rows,
|
|||
|
total
|
|||
|
} = res;
|
|||
|
console.log(JSON.stringify(res))
|
|||
|
// 将 productId 作为 value,productName 作为 text
|
|||
|
const productList = rows.map(item => ({
|
|||
|
value: item.productId,
|
|||
|
text: item.productName
|
|||
|
}));
|
|||
|
|
|||
|
this.list = this.list.concat(productList); // 将新数据拼接到 list 中
|
|||
|
this.total = total; // 更新总数
|
|||
|
console.log(JSON.stringify(this.list)); // 打印 list 数据
|
|||
|
})
|
|||
|
.catch(err => {
|
|||
|
console.log(err);
|
|||
|
});
|
|||
|
},
|
|||
|
|
|||
|
|
|||
|
|
|||
|
handleProductChange(selected) {
|
|||
|
console.log('Selected Value:', selected)
|
|||
|
const selectedItem = this.list.find(item => item.value === selected);
|
|||
|
if (selectedItem) {
|
|||
|
this.form.productName = selectedItem.text;
|
|||
|
console.log('Product Name:', selectedItem.text);
|
|||
|
} else {
|
|||
|
console.log('Selected item not found in list.');
|
|||
|
}
|
|||
|
},
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
// 获取登录用户信息
|
|||
|
getProfile() {
|
|||
|
// 调用用户信息接口
|
|||
|
getProfile().then(res => {
|
|||
|
// 打印回复信息
|
|||
|
console.log("Response:", JSON.stringify(res));
|
|||
|
|
|||
|
// 存储用户信息,TODO 需要调用一次,不然其他页面调用返回空
|
|||
|
console.log("Profile Data:", JSON.stringify(res.data));
|
|||
|
|
|||
|
uni.$u.vuex('profile', res.data);
|
|||
|
|
|||
|
// 更新 this.profile
|
|||
|
this.profile = res.data;
|
|||
|
|
|||
|
// 设置用户ID
|
|||
|
this.form.userId = this.profile.userId;
|
|||
|
console.log("User ID:", this.profile.userId); // 打印出用户ID
|
|||
|
}).catch(err => {
|
|||
|
this.$u.toast(err.msg);
|
|||
|
});
|
|||
|
},
|
|||
|
|
|||
|
// 单击选显卡
|
|||
|
tabClick(item) {
|
|||
|
this.tabIndex = item.index;
|
|||
|
if (this.tabIndex == 0) {
|
|||
|
// 发现设备
|
|||
|
this.discoverDevice();
|
|||
|
} else {
|
|||
|
// 清除发现设备定时器
|
|||
|
clearInterval(this.discoverTimer);
|
|||
|
}
|
|||
|
},
|
|||
|
// 返回
|
|||
|
goBack() {
|
|||
|
getApp().globalData.operate = 'operate';
|
|||
|
uni.navigateBack({
|
|||
|
delta: 1
|
|||
|
});
|
|||
|
},
|
|||
|
// 扫码
|
|||
|
// 扫码
|
|||
|
openScan(item) {
|
|||
|
// #ifndef MP-WEIXIN || APP-PLUS
|
|||
|
uni.showToast({
|
|||
|
icon: 'none',
|
|||
|
title: this.$tt('user.scanning')
|
|||
|
});
|
|||
|
return;
|
|||
|
// #endif
|
|||
|
|
|||
|
// 允许从相机和相册扫码
|
|||
|
uni.scanCode({
|
|||
|
success: res => {
|
|||
|
console.log(JSON.stringify(regosu));
|
|||
|
console.log('条码类型:' + res.scanType);
|
|||
|
console.log('条码内容:' + res.result);
|
|||
|
// if (res.result.substr(0, 1) != '{') {
|
|||
|
// console.log('坑点:解析二维码后第一个位置包含一个特殊字符,大部分编译器和调试工具识别不了这个特殊字符');
|
|||
|
// res.result = res.result.substring(1);
|
|||
|
// }
|
|||
|
// 解析JSON
|
|||
|
try {
|
|||
|
// 使用分号分割字符串并获取第一项
|
|||
|
let resultArray = res.result.split(';');
|
|||
|
this.form.serialNumber = resultArray[0]; // 取第一项赋值给serialNumber
|
|||
|
|
|||
|
// 显示成功提示
|
|||
|
uni.showToast({
|
|||
|
icon: 'none',
|
|||
|
title: '扫码成功'
|
|||
|
});
|
|||
|
} catch (error) {
|
|||
|
uni.showToast({
|
|||
|
icon: 'none',
|
|||
|
title: '解析二维码失败'
|
|||
|
});
|
|||
|
}
|
|||
|
}
|
|||
|
});
|
|||
|
},
|
|||
|
|
|||
|
// 获取分组列表
|
|||
|
async getGroupList() {
|
|||
|
try {
|
|||
|
// 创建查询参数
|
|||
|
const query = {
|
|||
|
pageNum: 1,
|
|||
|
pageSize: 100 // 设置一个较大的数值以获取所有分组
|
|||
|
};
|
|||
|
|
|||
|
const res = await getGroupList(query);
|
|||
|
if (res.code === 200) {
|
|||
|
// 转换数据格式为 uni-data-select 所需的格式
|
|||
|
this.groupList = res.rows.map(item => ({
|
|||
|
value: item.groupId,
|
|||
|
text: item.groupName
|
|||
|
}));
|
|||
|
|
|||
|
console.log('分组列表:', this.groupList); // 调试用
|
|||
|
} else {
|
|||
|
uni.showToast({
|
|||
|
icon: 'none',
|
|||
|
title: '获取分组列表失败'
|
|||
|
});
|
|||
|
}
|
|||
|
} catch (error) {
|
|||
|
console.error('获取分组列表错误:', error);
|
|||
|
uni.showToast({
|
|||
|
icon: 'none',
|
|||
|
title: '获取分组列表失败'
|
|||
|
});
|
|||
|
}
|
|||
|
},
|
|||
|
|
|||
|
// 处理分组选择变化
|
|||
|
handleGroupChange(value) {
|
|||
|
console.log('选择的值:', value); // 调试用
|
|||
|
if (value === 'other') {
|
|||
|
this.showCustomGroupInput = true;
|
|||
|
this.form.groupId = '';
|
|||
|
this.form.groupName = '';
|
|||
|
} else {
|
|||
|
this.showCustomGroupInput = false;
|
|||
|
this.form.groupId = value;
|
|||
|
const selectedGroup = this.groupList.find(item => item.value === value);
|
|||
|
if (selectedGroup) {
|
|||
|
this.form.groupName = selectedGroup.text;
|
|||
|
}
|
|||
|
}
|
|||
|
},
|
|||
|
|
|||
|
// 处理分组名称输入
|
|||
|
handleGroupNameInput(value) {
|
|||
|
if (value) {
|
|||
|
this.form.groupId = ''; // 清空选择的分组ID
|
|||
|
}
|
|||
|
},
|
|||
|
|
|||
|
},
|
|||
|
|
|||
|
};
|
|||
|
</script>
|
|||
|
|
|||
|
<style lang="scss">
|
|||
|
page {
|
|||
|
// background: #eef3f7;
|
|||
|
background: linear-gradient(30deg, #46e9a9 30%, #007aff 70%);
|
|||
|
background-size: 100% 100%;
|
|||
|
background-attachment: fixed;
|
|||
|
}
|
|||
|
|
|||
|
.container {
|
|||
|
padding-bottom: 50px;
|
|||
|
}
|
|||
|
|
|||
|
.card {
|
|||
|
box-shadow: 0 1px 0px 0 rgba(0, 0, 0, 0.1);
|
|||
|
border-radius: 6px;
|
|||
|
background-color: #fff;
|
|||
|
margin: 10px;
|
|||
|
margin-bottom: 15px;
|
|||
|
padding: 15px 10px;
|
|||
|
}
|
|||
|
</style>
|