iot-ui-app/pages/iots/device/device-data.vue

503 lines
11 KiB
Vue

<template>
<view id="data-list-box">
<view class="header">
<view class="header-item">
<text>设备名称</text>
<text>{{deviceName}}</text>
</view>
<view class="header-item">
<text>运行状态</text>
<text>{{deviceStateName}}</text>
</view>
</view>
<u-tabs :list="tabList" :is-scroll="false" :current="tabCurrent" :bar-width="138" :bold="false" :duration="0.1"
@change="tabChange"></u-tabs>
<!-- 自定义时间 -->
<view class="time-selcet-box" v-if="tabCurrent==3">
<view class="time-selcet">
<text @click="selectTime(0,startTime)">{{startTime?startTime:'开始时间'}}</text>
<view class="iconfont icon-shijian"></view>
<text @click="selectTime(1,endTime)">{{endTime?endTime:'结束时间'}}</text>
</view>
</view>
<view class="menu-list">
<view class="menu-left">
<view class="menu-btn" :class="btnActive==0?'active':''" @click="changeBtn(0)">列表模式</view>
<view class="menu-btn" :class="btnActive==1?'active':''" @click="changeBtn(1)">图表模式</view>
</view>
<view class="iconfont icon-reload" @click="getDataList"></view>
</view>
<!-- 列表 -->
<view class="data-list" v-if="btnActive==0">
<view class="data-list-header">
<text>时间</text>
<text>值</text>
</view>
<view class="data-item" v-for="(item,index) in dataList" :key="index">
<text>{{$u.timeFormat(item.fg_device_ts, 'yyyy-mm-dd hh:MM:ss')}}</text>
<text>{{item[fields]}}</text>
</view>
<u-empty :show="emptyShow" text="没有找到数据" :font-size="40" :icon-size="300" :margin-top="20" mode="list"
style="background: #fff;"></u-empty>
</view>
<!-- 图表 -->
<view class="data-chart" v-else>
<qiun-data-charts
type="line"
:opts="opts"
:chartData="chartData"
:canvas2d="true"
:canvasId="canvasId"
:enableScroll="true"
:ontouch="true"
/>
</view>
<!-- 分页 -->
<view class="list-pagination">
<uni-pagination :current="pageNum" :pageSize="pageSize" :total="total"
@change="changePagination"></uni-pagination>
</view>
<!-- 时间选择器 -->
<u-picker mode="time" v-model="timeShow" :default-time="defaultTime" :params="timeParams"
@confirm="confirmTime"></u-picker>
</view>
</template>
<script>
export default {
data() {
return {
btnActive:0,
tabList: [{
name: '近一天'
}, {
name: '近一周'
}, {
name: '近一月'
}, {
name: '自定义'
}],
tabCurrent: 0,
emptyShow: false, //是否显示数据为空
dataList: [],
// 时间选择是否显示
timeShow: false,
// 时间参数
timeParams: {
year: true,
month: true,
day: true,
hour: true,
minute: true,
second: true
},
defaultTime: '',
startTime: '',
endTime: '',
selectIndex: 0,
pageNum: 1,
pageSize: 10,
total: 10,
devId:null,
fields:null,
cmdId: null,
deviceKey: null,
field: null,
prodId: null,
deviceStateName: null,
// 时间范围
listWhere: [{ // 大于xx时间
field: "time",
operator: "gt",
val: 0,
valType: "time",
},
{ // 小于xx时间
field: "time",
operator: "lt",
val: 0,
valType: "time",
},
],
deviceName: null,
chartData: {},
selectValue:this.value,
charShow: true,
canvasId:this.$u.guid(32),
opts: {
color: ["#1890FF","#91CB74","#FAC858","#EE6666","#73C0DE","#3CA272","#FC8452","#9A60B4","#ea7ccc"],
enableScroll: true,
legend: {
show:false,
},
xAxis: {
disableGrid: true,
scrollShow: true,
itemCount: 6,
fontSize:10,
rotateAngle:60,
rotateLabel:true,
// boundaryGap:"justify",
},
yAxis: {
gridType: "dash",
dashLength: 1,
type:'value',
splitNumber:3,
data:[{tofix:2,min:0}]
},
extra: {
area: {
type: "straight",
width: 2,
activeType: "hollow"
}
}
},
}
},
components: {
},
onLoad(option) {
this.defaultTime = this.$u.date(new Date(), 'yyyy-mm-dd hh:MM:ss')
if (option) {
console.log("获取到的参数", option)
this.devId = option.devId;
this.fields = option.fields;
this.deviceName = option.devName;
this.deviceStateName = option.devState;
this.getDataList();
}
// this.getChartData();
},
onShow() {
},
methods: {
changeBtn(index){
this.btnActive = index;
this.getDataList();
},
// 获取数据列表
getDataList() {
this.timeFormat();
let params = {
page: this.pageNum,
pageSize: this.pageSize,
devId: this.devId,
startTs: this.listWhere[0].val,
endTs: this.listWhere[1].val,
fields: this.fields + ',fg_device_ts'
}
console.log("params", params)
this.dataList = [];
this.$api.iotsApi.getDeviceDataList(params).then(res => {
console.log("getDataList", res);
if (res.code == 0) {
if (res.data) {
this.dataList = res.data.list?res.data.list:[];
this.pageNum = res.data.page;
this.total = res.data.totalCount;
// 判断当前是否显示空
if (!this.dataList.length) {
this.emptyShow = true;
} else {
this.emptyShow = false;
}
if(this.btnActive==1){
this.getChartData(res.data.list?res.data.list:[]);
}
console.log('this.emptyShow', this.emptyShow)
} else {}
} else {
this.$u.toast(res.msg);
if (this.pageNum > 1) {
this.pageNum = 1
}
}
}, error => {
this.$u.toast('服务器开小差了呢,请您稍后再试')
if (this.pageNum > 1) {
this.pageNum = 1
}
})
},
getChartData(data) {
let resData = {
categories: [],
series: [{
name: "值",
data: []
}]
};
data.map((item,index)=>{
resData.categories.push(this.$u.timeFormat(item.fg_device_ts, 'yyyy-mm-dd hh:MM:ss'));
resData.series[0].data.push(item[this.fields]);
})
console.log("resData",resData)
this.chartData = JSON.parse(JSON.stringify(resData));
},
// 时间格式化
timeFormat() {
// 开始和结束时间
let date = new Date();
switch (this.tabCurrent) {
case 0:
this.listWhere[0].val = date.getTime() - 24 * 60 * 60 * 1000;
this.listWhere[1].val = date.getTime();
break;
case 1:
this.listWhere[0].val = date.getTime() - 24 * 7 * 60 * 60 * 1000;
this.listWhere[1].val = date.getTime();
break;
case 2:
this.listWhere[0].val = date.getTime() - 24 * 30 * 60 * 60 * 1000;
this.listWhere[1].val = date.getTime();
break;
default:
this.listWhere[0].val = 0
this.listWhere[1].val = 0
if (this.startTime) {
console.log("this.startTime", this.startTime)
let time1 = new Date(this.startTime);
this.listWhere[0].val = time1.getTime();
if (this.endTime) {
let time2 = new Date(this.endTime);
console.log("this.endTime", this.endTime)
this.listWhere[1].val = time2.getTime();
}
}
}
},
tabChange(index) {
this.tabCurrent = index;
this.pageNum = 1;
this.total = 10;
this.dataList = [];
this.getDataList();
},
// 点击页面
changePagination(e) {
console.log("点击页面", e);
this.pageNum = e.current;
this.getDataList()
},
// 点击选择时间
selectTime(index, defaultTime) {
this.selectIndex = index;
this.timeShow = true;
if (defaultTime) {
this.defaultTime = defaultTime;
}
},
// 点击确认选择时间
confirmTime(obj) {
console.log(obj)
let time = obj.year + '-' + obj.month + '-' + obj.day + ' ' + obj.hour + ':' + obj.minute + ':' + obj
.second;
if (this.selectIndex == 0) {
this.startTime = time;
} else {
this.endTime = time;
}
if (this.startTime && this.endTime) {
this.getDataList();
}
}
}
}
</script>
<style>
page,.data-list-box{
background-color: #e9ecf3;
}
</style>
<style scoped lang="scss">
.header {
padding: 10rpx 24rpx 0;
background: #fff;
margin-bottom: 20rpx;
.header-item {
height: 98rpx;
display: flex;
justify-content: space-between;
align-items: center;
padding: 0 23rpx 0 17rpx;
font-size: 28rpx;
color: #444444;
line-height: 55px;
&:first-of-type {
border-bottom: 1px solid #E8EBF2;
}
text {
&:first-of-type {
color: #666;
}
}
}
}
// 时间选择器
.time-selcet-box {
padding: 18rpx 24rpx 0;
.time-selcet {
width: 702rpx;
height: 84rpx;
background: #FFFFFF;
// box-shadow: 0px 6rpx 29rpx 0px rgba(174, 185, 190, 0.7);
border-radius: 10rpx;
display: flex;
justify-content: space-around;
align-items: center;
text {
font-size: 26rpx;
color: #B4B4B4;
flex: 1;
display: flex;
align-items: center;
justify-content: center;
}
.iconfont {
font-size: 34rpx;
color: #444;
}
}
}
.menu-list{
display: flex;
justify-content: space-between;
align-items: center;
padding: 20rpx;
padding-bottom: 0;
.menu-left{
display: flex;
align-items: center;
.menu-btn{
border: 1px solid #009CFF;
color: #009CFF;
border-radius: 10rpx;
background-color: #fff;
// height: 100rpx;
padding: 10rpx 20rpx;
display: flex;
justify-content: center;
align-items: center;
&.active{
color: #fff;
background: #009CFF;
}
&:first-child{
margin-right: 10rpx;
}
}
}
.iconfont{
font-size: 40rpx;
color: #009CFF;
font-weight: bold;
padding: 10rpx;
}
}
.data-list {
padding: 20rpx 20rpx 0;
.data-list-header {
height: 80rpx;
background: #FFFFFF;
// box-shadow: 0px 6rpx 18rpx 0px rgba(174, 185, 190, 0.7);
border-bottom: 1px solid #f5f5f5;
border-radius: 10rpx 10rpx 0 0;
z-index: 10;
position: relative;
display: flex;
text {
display: flex;
align-items: center;
justify-content: center;
flex: 1;
font-size: 26rpx;
font-weight: bold;
color: #444444;
}
}
.data-item {
background: #FFFFFF;
height: 80rpx;
border-bottom: 1px solid #f5f5f5;
display: flex;
&:last-of-type {
border: none;
}
text {
display: flex;
align-items: center;
justify-content: center;
flex: 1;
font-size: 24rpx;
color: #444444;
}
}
}
.data-chart{
margin: 20rpx 20rpx 0;
padding-bottom: 5rpx;
height: 800rpx;
background: #fff;
}
.list-pagination {
// width: 100%;
margin: 0 20rpx;
background: #FFFFFF;
border-top: 1px solid #f5f5f5;
border-radius: 0 0 10rpx 10rpx;
padding: 20rpx 40rpx;
/deep/ .uni-pagination__btn.uni-pagination__btn {
width: 140rpx;
height: 60rpx;
background: #FFFFFF;
border: 1px solid #DCDCDC;
border-radius: 5rpx;
font-size: 24rpx;
line-height: 60rpx;
text {
color: #727272;
}
}
/deep/ .uni-pagination--enabled.uni-pagination--enabled {
border: 1px solid #009CFF;
text {
color: #009CFF;
}
}
}
</style>