You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

432 lines
12 KiB

<template>
<view class="index-container">
<view class="ic-header">
<view class="ih-bar" :style="'padding-top:'+headerInfo.statusBarHeight+'px'">
<view class="ib-title-bar" :style="titleStyle">
<image class="itb-back-icon" @click="goBack()" src="../../static/images/arrow_back.png"></image>
<text>欧轩智能商家助手</text>
</view>
</view>
<store-name :theme="'light'"></store-name>
<view class="ih-container">
<view class="ic-title">欧轩智能中控</view>
<view class="ic-info">
<view class="ii-veiw">
<view class="iv-view">
<veiw class="iv-txt">设备id{{ curStoreInfo.device_name || "-" }}</veiw>
<view class="iv-btn" @click="copyDeviceID">复制</view>
</view>
<view class="iv-view">
<veiw class="iv-txt">状态{{ deviceInfo.Online == 1 ? '在线' : '离线' }}</veiw>
</view>
</view>
<view class="ii-veiw">
<view class="iv-view">
<veiw class="iv-txt">最后上线时间{{ deviceInfo.LastOfflineTimeStr || "-" }}</veiw>
</view>
<view class="iv-view" @click="goTimingList">
<image class="iv-img" src="../../static/images/icon_clock.png" mode="aspectFit"></image>
<veiw class="iv-txt" >定时列表</veiw>
</view>
</view>
</view>
<view
v-if="oxAcInfo.extension&&oxAcInfo.extension.switch_device_name"
class="ic-btn"
hover-class="hover-active"
@click="restartBtn"
>重启</view>
</view>
</view>
<view class="ic-section">
<view class="is-list">
<block v-for="(e,i) in tabArr" :key="i">
<view class="il-item" @click="routeTo(e)" v-if="isShowHardwareTab(e)">
<view><image mode="aspectFit" :src="getImgPath(e.id) || ''"></image></view>
<view>{{e.name || ''}}</view>
</view>
</block>
</view>
</view>
</view>
</template>
<script>
import util from '../../../../utils/util';
import store_name from '../../components/store_name/store_name';
import deviceServer from '../../js/device_server';
import deviceApi from '../../js/device_api';
const rootPage = '/subpackage/device'
const tabArr = [
{id: 1, name: '照明', path: `/pages/switch_manage/switch_manage`},
{id: 2, name: '空调', path: `/pages/switch_manage/switch_manage`},
{id: 3, name: '风扇', path: `/pages/switch_manage/switch_manage`},
{id: 4, name: '门禁', path: `/pages/switch_manage/switch_manage`},
{id: 5, name: '门闸', path: `/pages/switch_manage/switch_manage`},
// {id: 6, name: '平板', path: `/pages/switch_manage/switch_manage`},
{id: 7, name: '售货柜', path: `/pages/device_manage/device_manage`},
{id: 8, name: '租售柜', path: `/pages/device_manage/device_manage`},
{id: 9, name: '储物柜', path: `/pages/device_manage/device_manage`},
{id: 10, name: '咖啡机', path: `/pages/device_manage/device_manage`},
{id: 11, name: '水阀', path: `/pages/switch_manage/switch_manage`},
// {id: 12, name: '互动设备', path: `/pages/switch_manage/switch_manage`},
// {id: 13, name: '监控', path: `/pages/switch_manage/switch_manage`},
{id: 14, name: '音响', path: `/pages/audio_manage/audio_manage`}, //audio_manage
// {id: 15, name: '机器人', path: ``},
// {id: 16, name: '租球机', path: ``},
// {id: 17, name: '窗帘', path: `/pages/switch_manage/switch_manage`},
{id: 18, name: '路由器', path: `/pages/switch_manage/switch_manage`},
{id: 19, name: '物联卡', path: `/pages/switch_manage/switch_manage`},
];
import { mapState } from 'vuex'
export default {
components: {
'store-name': store_name
},
computed: {
...mapState({
storeList: state => state.device.storeList,
curStoreInfo: state => state.device.curStoreInfo,
}),
//
showHardwareIdLs(){
let { hardwareTypeList } = this;
let _ls = hardwareTypeList || [];
let _fls = _ls.filter(ele => ele.stadium_has);
let _idLs = _fls.map(el => el.mini_local_menu_id);
return _idLs || [];
},
titleStyle(){
let { statusBarHeight, titleBarHeight } = this.headerInfo;
let _styleStr = `
line-height:${titleBarHeight}px;
`
return _styleStr
},
},
watch: {
curStoreInfo(nw, od){
this.getOuxuanacInfo(nw.device_name);
this.getHardwareTypeList();
}
},
data(){
return {
tabArr: [],
deviceInfo:"",
hardwareTypeList: [],
headerInfo: {
statusBarHeight: 0,
titleBarHeight: 0
},
oxAcInfo: {},
}
},
async onLoad(options){
try{
util.showLoad();
let _brandInfo = await this.$store.dispatch('getBrandInfo');
await this.$store.dispatch('getStoreList', { stadium_id: +options.stadium_id || '' });
let { curStoreInfo } = this;
this.updateAC();
await this.getHardwareTypeList();
await this.getOuxuanacInfo(curStoreInfo.device_name);
util.hideLoad();
}catch(err){
console.warn('onLoad err--->', err)
util.hideLoad();
}
},
onShow() {
this.updateAC() // 更新中控信息
},
onReady() {
this.initSysBarInfo();
},
methods: {
initSysBarInfo(){
let wxBtn = uni.getMenuButtonBoundingClientRect();
let sysInfo = uni.getSystemInfoSync();
let statusBarHeight = sysInfo.statusBarHeight || 0;
let titleBarHeight = (wxBtn?.height || 0) + (((wxBtn?.top || 0) - statusBarHeight) *2);
this.headerInfo = {
statusBarHeight,
titleBarHeight,
}
},
isShowHardwareTab(e){
let { showHardwareIdLs } = this;
return showHardwareIdLs.includes(e.id);
},
getHardwareTypeList(){
let { curStoreInfo } = this;
this.tabArr = [];
return deviceServer.get({
url: deviceApi.hardwareTypeList,
data: { stadium_id: curStoreInfo.id },
failMsg: '加载设备类型列表失败!'
})
.then(res=>{
let _ls = res || [];
if(_ls&&_ls.length)this.tabArr = tabArr;
return this.hardwareTypeList = _ls || [];
})
},
copyDeviceID(){
let that = this
uni.setClipboardData({
data: that.curStoreInfo.device_name,
success: function () {
util.showNone(`复制成功!`);
console.log('复制成功',that.curStoreInfo.device_name);
}
});
},
updateAC(){
if(!this.curStoreInfo.device_name)return
util.showLoad();
// id:"00-de-47-e9-3a-fc"
deviceServer.get({
url: deviceApi.acUpdate,
data: {id:this.curStoreInfo.device_name},
failMsg: '加载失败!'
})
.then(res=>{
util.hideLoad()
this.deviceInfo = res
uni.setStorageSync("deviceInfo",res)
})
.catch(util.hideLoad)
},
goBack(){
uni.navigateBack({
delta:1
})
},
goTimingList(){
let timing_list = "/subpackage/device/pages/timing/timing_list"
util.routeTo(`${timing_list}`, 'nT');
},
getImgPath(id){
if(!id)return '';
return `/subpackage/device/static/images/devices/${id || 14}.png`
},
routeTo(e){
let { curStoreInfo } = this;
if(e.path == '')return util.showNone('开发中!');
util.routeTo(`${rootPage}${e.path}?sid=${e?.id || ''}&stadium_id=${curStoreInfo?.id || ''}`, 'nT');
},
// 获取中控重启参数
getOuxuanacInfo(id_ouxuanac){
if(!id_ouxuanac){
console.log('中控id不存在 id_ouxuanac ->', id_ouxuanac);
return Promise.resolve([]);
}
return deviceServer.get({
url: deviceApi.ouxuanacList,
data: { id_ouxuanac },
failMsg: '加载中控信息失败!'
})
.then(res=>{
console.log('id_ouxuanac', res);
this.initOuxuancInfo({ oxacLs: res?.list || [], id_ouxuanac });
return res
})
},
// 初始化中控信息
initOuxuancInfo({ oxacLs, id_ouxuanac }){
this.oxAcInfo = oxacLs.find(e=>e.id_ouxuanac == id_ouxuanac) || {};
},
restartBtn(){
let { curStoreInfo, oxAcInfo } = this;
let _dvName = oxAcInfo?.extension?.switch_device_name;
this.operateReq({ deviceName: _dvName, op: 'off', })
.then(code=>{
if(code === 0){
setTimeout(_=>{ this.operateReq({ deviceName: _dvName, op: 'on', }) }, 1000)
}
})
// util.showNone('调试开发中!');
},
// 操作接口请求
operateReq({deviceName, op, isTip=true}){
// let _query = {
// is_delay: true,
// name: "gate-switch",
// queue_group: "gate",
// value: { tcp: "", cid: "", op},
// device: deviceName,
// hardware_id: "",
// }
let _query = {
"data": {
"name": "gate-switch",
"value":{
"op": op
},
"is_async":true
},
"device": deviceName
}
util.showLoad();
return deviceServer.post({
url: deviceApi.ouxuanac,
data: _query,
isDefaultGet: false,
})
.then(res=>{
util.hideLoad();
if(res.data.code == 0){
if(isTip)util.showNone(res.data.message || '操作成功!');
return 0
}else{
util.showModal({
title: '提示',
content: res.data.message || '操作失败!',
showCancel: false,
})
return 1
}
})
.catch(err=>{
util.hideLoad();
return Promise.reject(err);
})
},
}
}
</script>
<style lang="scss">
@import '~style/public.scss';
.ic-header{
width: 100%;
height: 620upx;
background-image: linear-gradient(160deg, #89D499 0%, #33CCA9 81%);
.ih-bar{
.ib-title-bar{
position: relative;
padding: 0 12px;
text-align: center;
font-size: 19px;
font-weight: 500;
color: #fff;
.itb-back-icon{
position: absolute;
left: 12px;
top: 50%;
margin-top: -10px;
width: 20px;
height: 20px;
}
}
}
.ih-container{
padding: 4upx 50upx 38upx;
.ic-title{
text-align: center;
line-height: 56upx;
font-size: 40upx;
font-weight: 500;
color: #1A1A1A;
}
.ic-info{
margin-top: 42upx;
.ii-veiw{
@include centerFlex(space-between);
&:not(:first-child){
margin-top: 14upx;
}
.iv-view{
min-width: 30%;
@include centerFlex(flex-start);
.iv-img{
flex-shrink: 0;
flex-grow: 0;
margin-right: 8upx;
height: 24upx;
width: 24upx;
}
.iv-txt{
font-size: 24upx;
line-height: 34upx;
color: #1A1A1A;
@include textHide(1);
}
.iv-btn{
flex-shrink: 0;
margin-left: 14upx;
line-height: 28upx;
font-size: 20upx;
padding: 2upx 6upx;
border-radius: 4upx;
background-color: rgba($color: #ADFF2C, $alpha: .5);
color: $themeColor;
}
&+.iv-view{
@include centerFlex(flex-end);
}
}
}
}
.ic-btn{
margin: 44upx auto 0;
width: 200upx;
height: 68upx;
line-height: 68upx;
text-align: center;
border: .5px solid #fff;
background-image: linear-gradient(180deg, #ffffff6b 0%, #ffffffc9 100%);
box-shadow: 0 6upx 16upx 0 #18b48fb0, inset 0 2upx 12upx 0 #ffffff80;
border-radius: 6upx;
font-size: 28upx;
font-weight: 500;
color: $themeColor;
text-shadow: 0 0.3upx 1upx rgba($color: #005F49, $alpha: .5);
}
}
}
.ic-section{
padding: 54upx 30upx 0;
.is-list{
display: flex;
flex-wrap: wrap;
.il-item{
margin-bottom: 60upx;
flex-shrink: 0;
flex-grow: 0;
width: 25%;
>view{
&:first-child{
margin: 0 auto 18upx;
width: 108upx;
height: 108upx;
border-radius: 30upx;
background-color: #fff;
@include centerFlex(center);
>image{
width: 80upx;
height: 80upx;
}
}
&:nth-child(2){
padding: 0 10upx;
line-height: 40upx;
text-align: center;
font-size: 28upx;
color: #1A1A1A;
@include textHide(1);
}
}
}
}
}
</style>