1327 lines
33 KiB
Vue
1327 lines
33 KiB
Vue
<template>
|
||
<view>
|
||
<uni-nav-bar class="nvbar" leftIcon="left" @clickLeft="navigatorBack">
|
||
<view slot="left">
|
||
<uni-icons type="back" size="23" color="#FFFFFF"></uni-icons>
|
||
</view>
|
||
<view slot="default" class="center uninavebartext">
|
||
{{ Status.navbar.title }}
|
||
</view>
|
||
</uni-nav-bar>
|
||
<view class="contentBg">
|
||
<view class="row">
|
||
<view class="typeItem fleft" :class="{'active':Status.tabType=='link'}" @click.stop="tabChange('link')">
|
||
连接记录</view>
|
||
<view class="typeItem fleft" :class="{'active':Status.tabType=='warn'}" @click.stop="tabChange('warn')">
|
||
报警记录</view>
|
||
<view class="filterIco fright" @click.stop="showFilter()">
|
||
<image class="img" src="/static/images/common/filter.png" mode="aspectFit"></image>
|
||
</view>
|
||
<view class="clear"></view>
|
||
</view>
|
||
<view class="row" v-show="Status.tabType=='warn'">
|
||
<view class="typeItem fleft" :class="{'active':filter.warnType=='all'}" @click.stop="warnChange('all')">
|
||
全部报警</view>
|
||
<view class="typeItem fleft" :class="{'active':filter.warnType=='join'}"
|
||
@click.stop="warnChange('join')">
|
||
闯入报警</view>
|
||
<view class="typeItem fleft" :class="{'active':filter.warnType=='force'}"
|
||
@click.stop="warnChange('force')">
|
||
强制报警</view>
|
||
<view class="clear"></view>
|
||
</view>
|
||
|
||
|
||
<mescroll-uni class="device-list" @init="mescrollInit" @down="downCallback" @up="upCallback"
|
||
:up="Status.upOption" :down="Status.downOption" :fixed="false"
|
||
:style="{ height: Status.mescrollHeight + 'px' }">
|
||
|
||
|
||
<view v-show="Status.tabType=='link'" class="linkLi" v-for="item,index in linkList">
|
||
<view class="header" :class="{expand:item.expand}" @click.stop="ExpandToggle(item,index,'link')">
|
||
<text>{{DateFormat(item.linkEqs[0].linkTime,'yyyy-MM-dd HH:mm:ss')}}</text>
|
||
<uni-icons type="right" v-show="!item.expand" color="#FFFFFF" size="16"></uni-icons>
|
||
<uni-icons type="down" v-if="item.expand" color="#aed600" size="17"></uni-icons>
|
||
</view>
|
||
<view v-if="item.expand" class="body">
|
||
<view class="listItem">
|
||
<view>设备数量</view>
|
||
<view>{{item.linkEqs.length}}</view>
|
||
</view>
|
||
<view class="line"></view>
|
||
<view class="listItem" v-for="dev,i in item.linkEqs">
|
||
<view>设备名称</view>
|
||
<view>{{dev.linkName?dev.linkName:dev.linkMac}}</view>
|
||
</view>
|
||
</view>
|
||
</view>
|
||
|
||
<view v-show="Status.tabType=='warn'" class="warnPanel">
|
||
|
||
<view class="warnCardHeader" v-show="warnList.length>0">
|
||
<view class="column">报警类型</view>
|
||
<view class="column">设备名称</view>
|
||
<view class="column">报警时间</view>
|
||
</view>
|
||
<view class="warnLi" :class="{'first':index==0,'last':index==warnList.length-1}"
|
||
v-for="item,index in warnList">
|
||
<view class="column red">{{item.warnType}}</view>
|
||
<view class="column">{{item.warnName?item.warnName:item.warnMac}}</view>
|
||
<view class="column">
|
||
<view>{{DateFormat(item.warnTime,'yyyy/MM/dd')}}</view>
|
||
<view>{{DateFormat(item.warnTime,'HH:mm:ss')}}</view>
|
||
</view>
|
||
</view>
|
||
|
||
</view>
|
||
</mescroll-uni>
|
||
|
||
<view v-if="Status.BottomMenuShow" class="prevContent" @click.stop="showFilter()">
|
||
<view class="p100" @click.stop="">
|
||
<view class="filterMode">
|
||
<view class="fleft modeItem" @click.stop="filterModeChange()"
|
||
:class="{ active: !Status.filterMode }">月份选择</view>
|
||
<view class="fleft modeItem" @click.stop="filterModeChange()"
|
||
:class="{ active: Status.filterMode }">自定义时间</view>
|
||
<view class="clear"></view>
|
||
</view>
|
||
<view v-show="Status.filterMode">
|
||
<view class="mothPanel">
|
||
<view class="mothItem center" :class="{active:Status.filterDayType=='monthThree'}"
|
||
@click.stop="mothItemChange('monthThree')">近三个月</view>
|
||
<view class="mothItem center" :class="{active:Status.filterDayType=='monthOne'}"
|
||
@click.stop="mothItemChange('monthOne')" }>近一个月</view>
|
||
<view class="mothItem center" :class="{active:Status.filterDayType=='customer'}"
|
||
@click.stop="mothItemChange('customer')">自定义</view>
|
||
|
||
</view>
|
||
<view class="mothPanel">
|
||
<view class="mask" v-show="Status.filterMode && Status.filterDayType!='customer'"></view>
|
||
<view class="mtxt center" :class="{active:Status.filterDayMode=='start'}"
|
||
@click.stop="Status.filterDayMode='start'">
|
||
{{filter.start}}
|
||
</view>
|
||
<view class="mspl center">
|
||
一
|
||
</view>
|
||
<view class="mtxt center" :class="{active:Status.filterDayMode=='end'}"
|
||
@click.stop="Status.filterDayMode='end'">
|
||
{{filter.end}}
|
||
</view>
|
||
</view>
|
||
|
||
</view>
|
||
<view class="previewPannel">
|
||
<view class="mask" v-show="Status.filterMode && Status.filterDayType!='customer'"></view>
|
||
|
||
<picker-view indicator-class="myIndicator" :value="Status.datePickValue" @change="bindChange"
|
||
class="picker-view">
|
||
<picker-view-column>
|
||
<view class="item center" :class="{
|
||
active: Status.datePickValue[0] == index,
|
||
borderLeft: Status.datePickValue[0] === index,
|
||
preOne:
|
||
Status.datePickValue[0] === index - 1 ||
|
||
Status.datePickValue[0] === index + 1,
|
||
preTwo:
|
||
Status.datePickValue[0] === index - 2 ||
|
||
Status.datePickValue[0] === index + 2,
|
||
}" v-for="(item, index) in dic.years" :key="index">{{ item }}年</view>
|
||
</picker-view-column>
|
||
<picker-view-column>
|
||
<view class="item center" :class="{
|
||
active: Status.datePickValue[1] === index,
|
||
preOne:
|
||
Status.datePickValue[1] === index - 1 ||
|
||
Status.datePickValue[1] === index + 1,
|
||
preTwo:
|
||
Status.datePickValue[1] === index - 2 ||
|
||
Status.datePickValue[1] === index + 2,
|
||
}" v-for="(item, index) in dic.months" :key="index">{{ item }}月</view>
|
||
</picker-view-column>
|
||
<picker-view-column v-if="Status.filterMode">
|
||
<view class="item center" :class="{
|
||
active: Status.datePickValue[2] == index,
|
||
borderRight: Status.datePickValue[2] == index,
|
||
preOne:
|
||
Status.datePickValue[2] === index - 1 ||
|
||
Status.datePickValue[2] === index + 1,
|
||
preTwo:
|
||
Status.datePickValue[2] === index - 2 ||
|
||
Status.datePickValue[2] === index + 2,
|
||
}" v-for="(item, index) in dic.days" :key="index">{{ item }}日</view>
|
||
</picker-view-column>
|
||
</picker-view>
|
||
</view>
|
||
<view class="footerBtn">
|
||
<view class="btn btnReset" @click.stop="checkDateReset();">重置</view>
|
||
<view class="btn btnOK" @click.stop="checkDateOK()">确定</view>
|
||
</view>
|
||
</view>
|
||
</view>
|
||
</view>
|
||
|
||
<global-loading ref="loading" />
|
||
</view>
|
||
</template>
|
||
|
||
|
||
<script>
|
||
import {
|
||
showLoading,
|
||
hideLoading,
|
||
updateLoading
|
||
} from "@/utils/loading.js";
|
||
import Common from "@/utils/Common.js";
|
||
|
||
var these = null;
|
||
var time = null;
|
||
export default {
|
||
data() {
|
||
return {
|
||
mescroll: null,
|
||
Status: {
|
||
navbar: {
|
||
title: "历史记录",
|
||
},
|
||
mescrollHeight: 100,
|
||
upOption: {
|
||
auto: false,
|
||
noMoreSize: 0,
|
||
offset: 50,
|
||
isLock: false,
|
||
empty: {
|
||
tip: "暂无数据",
|
||
hideScroll: false,
|
||
},
|
||
textNoMore: "没有更多数据了",
|
||
},
|
||
downOption: {
|
||
auto: true,
|
||
autoShowLoading: false,
|
||
},
|
||
BottomMenuShow: false, //是否显示底部筛选层
|
||
filterMode: true, //是否筛选日期
|
||
filterDayMode: 'end', //当前筛选的是开始还是结束
|
||
filterDayType: 'customer', //当前筛选的日期是哪种类型
|
||
tabType: 'link',
|
||
|
||
datePickValue: [999, 999, 999] //日期选择控件绑定的值
|
||
|
||
},
|
||
filter: {
|
||
MM: '',
|
||
start: '',
|
||
end: '',
|
||
warnType: 'all',
|
||
},
|
||
linkList: [], //连接记录
|
||
warnList: [], //报警记录
|
||
dic: {
|
||
years: [],
|
||
months: [],
|
||
days: [],
|
||
},
|
||
device: {
|
||
id: "",
|
||
deviceName: "",
|
||
deviceImei: "",
|
||
deviceMac: "",
|
||
communicationMode: 0,
|
||
devicePic: "",
|
||
typeName: "",
|
||
bluetoothName: null,
|
||
deviceStatus: null,
|
||
bindingTime: "",
|
||
onlineStatus: 0,
|
||
battery: "0",
|
||
latitude: null,
|
||
longitude: null,
|
||
alarmStatus: null,
|
||
detailPageUrl: "/pages/650/HBY650",
|
||
showConfirm: false
|
||
},
|
||
};
|
||
},
|
||
onLoad() {
|
||
these = this;
|
||
this.getSystemInfoSyncH();
|
||
this.checkDateReset();
|
||
this.mothItemChange('customer');
|
||
|
||
let eventChannel = this.getOpenerEventChannel();
|
||
|
||
eventChannel.on('detailData', function(data) {
|
||
var device = data.data;
|
||
these.device = device;
|
||
these.tabChange('link');
|
||
});
|
||
|
||
|
||
},
|
||
computed: {},
|
||
methods: {
|
||
DateFormat: function(date, format) {
|
||
return Common.DateFormat(date, format);
|
||
},
|
||
ExpandToggle(item, index, type) {
|
||
|
||
let expand = item.expand;
|
||
if (expand === undefined) {
|
||
expand = false;
|
||
}
|
||
if (type == 'link') {
|
||
|
||
this.$set(this.linkList[index], 'expand', !expand)
|
||
} else {
|
||
this.$set(this.warnList[index], 'expand', !expand)
|
||
}
|
||
},
|
||
tabChange(key) {
|
||
this.Status.tabType = key;
|
||
|
||
this.downCallback();
|
||
},
|
||
warnChange(key) {
|
||
this.filter.warnType = key;
|
||
this.downCallback();
|
||
},
|
||
mothItemChange(key) {
|
||
|
||
this.Status.filterDayType = key;
|
||
let diff = 0;
|
||
switch (key) {
|
||
case "monthThree":
|
||
diff = -2;
|
||
break;
|
||
case "monthOne":
|
||
diff = -1;
|
||
break;
|
||
case "customer":
|
||
diff = 0;
|
||
break;
|
||
}
|
||
let today = new Date();
|
||
let end = Common.DateFormat(today, 'yyyy-MM-dd');
|
||
|
||
let start = Common.DateFormat(today.setMonth(diff), 'yyyy-MM-dd');
|
||
this.filter.start = start;
|
||
this.filter.end = end;
|
||
|
||
this.Status.filterDayMode = 'end';
|
||
},
|
||
checkDateReset() {
|
||
if (this.Status.filterMode && this.Status.filterDayType != 'customer') {
|
||
return;
|
||
}
|
||
this.Inityears();
|
||
this.initMonths();
|
||
|
||
this.dic.days = [];
|
||
|
||
if (this.Status.filterMode) {
|
||
this.initDays();
|
||
let day = new Date().getDate();
|
||
this.dic.days.find((item, idx) => {
|
||
if (item == day) {
|
||
this.Status.datePickValue[2] = idx;
|
||
return true;
|
||
}
|
||
});
|
||
|
||
|
||
}
|
||
//在浏览器上修改了datePickValue值,控件不刷新,直接修改dom的样式,App无此问题
|
||
//为了方便在浏览器中查看效果,添加以下代码
|
||
let systemInfo = uni.getSystemInfoSync();
|
||
if (systemInfo.uniPlatform == 'web') {
|
||
setTimeout(() => {
|
||
if (!document) {
|
||
console.error("document不可用");
|
||
|
||
return;
|
||
}
|
||
|
||
|
||
let eles = document.querySelectorAll('.uni-picker-view-content');
|
||
if (eles && eles.length && eles.length > 0) {
|
||
let top0 = this.Status.datePickValue[0] * 34;
|
||
top0 = 'translateY(-' + top0 + 'px) translateZ(0px)';
|
||
eles[0].style.transform = top0;
|
||
|
||
top0 = this.Status.datePickValue[1] * 34;
|
||
top0 = 'translateY(-' + top0 + 'px) translateZ(0px)';
|
||
eles[1].style.transform = top0;
|
||
if (eles.length === 3 && this.Status.filterMode) {
|
||
top0 = this.Status.datePickValue[2] * 34;
|
||
top0 = 'translateY(-' + top0 + 'px) translateZ(0px)';
|
||
eles[2].style.transform = top0;
|
||
}
|
||
}
|
||
}, 50);
|
||
}
|
||
|
||
|
||
},
|
||
checkDateOK() {
|
||
let yyyy = this.dic.years[this.Status.datePickValue[0]];
|
||
let MM = this.dic.months[this.Status.datePickValue[1]];
|
||
MM = MM < 10 ? '0' + MM : MM;
|
||
if (this.Status.filterMode) { //选择了时间段
|
||
this.filter.MM = "";
|
||
} else {
|
||
this.filter.start = "";
|
||
this.filter.end = "";
|
||
this.filter.MM = yyyy + '-' + MM;
|
||
}
|
||
this.Status.BottomMenuShow = false;
|
||
this.downCallback();
|
||
|
||
},
|
||
showFilter() {
|
||
this.Status.BottomMenuShow = !this.Status.BottomMenuShow;
|
||
},
|
||
filterModeChange() {
|
||
this.Status.filterMode = !this.Status.filterMode;
|
||
if (this.Status.filterMode) {
|
||
this.filter.MM = '';
|
||
this.initDays();
|
||
} else {
|
||
this.filter.start = '';
|
||
this.filter.end = '';
|
||
this.Status.filterDayType = '';
|
||
}
|
||
},
|
||
Inityears: function() {
|
||
let start = 2025;
|
||
let end = new Date().getFullYear();
|
||
let yyyy = [];
|
||
|
||
for (var i = start; i <= end; i++) {
|
||
yyyy.push(i);
|
||
|
||
}
|
||
if (yyyy.length < 5) {
|
||
for (var j = start; j >= 1970; j--) {
|
||
yyyy.unshift(j);
|
||
if (yyyy.length == 5) {
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
this.Status.datePickValue[0] = yyyy.length - 1;
|
||
this.dic.years = yyyy;
|
||
},
|
||
initMonths: function() {
|
||
let mms = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12];
|
||
let month = new Date().getMonth() + 1;
|
||
mms.find((i, index) => {
|
||
if (i === month) {
|
||
this.Status.datePickValue[1] = index;
|
||
|
||
return true;
|
||
}
|
||
});
|
||
|
||
this.dic.months = mms;
|
||
},
|
||
initDays() {
|
||
if (!this.Status.filterMode) {
|
||
return;
|
||
}
|
||
|
||
let yyyy = this.dic.years[this.Status.datePickValue[0]];
|
||
let mm = this.dic.months[this.Status.datePickValue[1]];
|
||
let days = 30;
|
||
switch (mm) {
|
||
case 1:
|
||
case 3:
|
||
case 5:
|
||
case 7:
|
||
case 8:
|
||
case 10:
|
||
case 12: {
|
||
days = 31;
|
||
break;
|
||
}
|
||
case 2: {
|
||
if (yyyy && mm) {
|
||
days =
|
||
(yyyy % 4 === 0 && yyyy % 100 !== 0) || yyyy % 400 === 0 ?
|
||
29 :
|
||
28;
|
||
} else {
|
||
days = 28;
|
||
}
|
||
break;
|
||
}
|
||
default:
|
||
days = 30;
|
||
break;
|
||
}
|
||
|
||
let arr = [];
|
||
for (let i = 1; i <= days; i++) {
|
||
arr.push(i);
|
||
}
|
||
this.dic.days = arr;
|
||
},
|
||
bindChange(e) {
|
||
|
||
let val = e.detail.value;
|
||
this.Status.datePickValue = val;
|
||
if (this.Status.filterMode) {
|
||
setTimeout(() => {
|
||
this.initDays();
|
||
let yyyy = this.dic.years[this.Status.datePickValue[0]];
|
||
let MM = this.dic.months[this.Status.datePickValue[1]];
|
||
MM = MM < 10 ? '0' + MM : MM
|
||
let dd = this.dic.days[this.Status.datePickValue[2]];
|
||
dd = dd < 10 ? '0' + dd : dd;
|
||
let date = yyyy + '-' + MM + '-' + dd;
|
||
if (this.Status.filterDayMode == 'start') {
|
||
this.filter.start = date;
|
||
} else {
|
||
this.filter.end = date;
|
||
}
|
||
}, 50);
|
||
}
|
||
|
||
|
||
},
|
||
navigatorBack() {
|
||
uni.navigateBack();
|
||
},
|
||
getSystemInfoSyncH() {
|
||
|
||
let sysInfo = uni.getSystemInfoSync();
|
||
this.Status.mescrollHeight = sysInfo.screenHeight - 140;
|
||
console.log("mescrollHeight=", this.Status.mescrollHeight);
|
||
},
|
||
mescrollInit(mescroll) {
|
||
this.mescroll = mescroll;
|
||
},
|
||
// 下拉刷新
|
||
downCallback() {
|
||
console.log("下拉加载");
|
||
if (this.mescroll) {
|
||
this.mescroll.resetUpScroll(false);
|
||
this.mescroll.scrollTo(0, 0);
|
||
}
|
||
this.getData();
|
||
},
|
||
// 上拉加载
|
||
upCallback() {
|
||
console.log("上拉加载");
|
||
|
||
this.getData();
|
||
},
|
||
getData() {
|
||
clearTimeout(time);
|
||
time = setTimeout(() => {
|
||
console.error("正在加载第" + these.mescroll.num + "页数据");
|
||
|
||
let hasNext = true;
|
||
const systemInfo = uni.getSystemInfoSync();
|
||
if (!these.device.id && systemInfo.uniPlatform != 'web') {
|
||
|
||
these.mescroll.endSuccess(0, hasNext);
|
||
return;
|
||
}
|
||
|
||
let linkKey = "102_" + these.device.id + "_linked";
|
||
let warnKey = "102_" + these.device.id + "_warning";
|
||
|
||
let getLinkData = () => {
|
||
console.log("11111111111111111");
|
||
let arr = [];
|
||
let total = 0;
|
||
if (systemInfo.uniPlatform == 'web') {
|
||
total = 100;
|
||
for (let i = 0; i < 20; i++) {
|
||
const timestamp = 1710072900000 + (i * 3600000); // 每小时递增
|
||
const numItems = Math.floor(Math.random() * 5) + 1; // 1-5条
|
||
|
||
const item = {
|
||
"linkId": timestamp.toString(),
|
||
"linkEqs": []
|
||
};
|
||
|
||
for (let j = 0; j < numItems; j++) {
|
||
// 生成随机的linkTime和linkMac
|
||
const hours = Math.floor(Math.random() * 24);
|
||
const minutes = Math.floor(Math.random() * 60);
|
||
const macPart = () => Math.floor(Math.random() * 256).toString(16)
|
||
.padStart(2, '0')
|
||
.toUpperCase();
|
||
const mac =
|
||
`${macPart()}:${macPart()}:${macPart()}:${macPart()}:${macPart()}:${macPart()}`;
|
||
|
||
let date =
|
||
`2026-01-${11 + Math.floor(i/24)}T${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:00Z`;
|
||
date = Common.DateFormat(new Date(date), 'yyyy-MM-dd HH:mm:ss');
|
||
item.linkEqs.push({
|
||
"linkTime": date,
|
||
"linkMac": mac
|
||
});
|
||
}
|
||
|
||
arr.push(item);
|
||
}
|
||
} else {
|
||
debugger;
|
||
let array = uni.getStorageSync(linkKey);
|
||
console.log("arrary=", array);
|
||
let data = [];
|
||
if (array) {
|
||
data = data.concat(array);
|
||
} else {
|
||
data = [{
|
||
"linkId": 1769582277562,
|
||
"read": false,
|
||
"linkEqs": [{
|
||
"linkTime": "2026-01-28T06:38:26.487Z",
|
||
"linkMac": "9A:ED:F1:72:AB:3C"
|
||
},
|
||
{
|
||
"linkTime": "2026-01-28T06:38:26.487Z",
|
||
"linkMac": "EE:97:ED:F1:72:AB:3C"
|
||
}
|
||
]
|
||
}];
|
||
}
|
||
let start=null;
|
||
let end=null;
|
||
if (!these.Status.filterMode) {
|
||
if (these.filter.MM) {
|
||
start = new Date(these.filter.MM + '-01');
|
||
end = start.setMonth(1);
|
||
data = data.filter(v => {
|
||
|
||
let t = v.linkEqs[0].linkTime
|
||
if (!t instanceof Date) {
|
||
t = new Date(v.linkEqs[0].linkTime);
|
||
}
|
||
|
||
return t >= start && t <= end;
|
||
});
|
||
}
|
||
|
||
} else {
|
||
if (these.filter.start && these.filter.end) {
|
||
console.log("these.filter.start=",these.filter.start);
|
||
console.log("these.filter.end=",these.filter.end);
|
||
start = new Date(these.filter.start);
|
||
end = new Date(these.filter.end);
|
||
end.setMonth(1);
|
||
console.log("start=",start);
|
||
console.log("end=",end);
|
||
if(start && end){
|
||
data = data.filter(v => {
|
||
debugger;
|
||
let t = v.linkEqs[0].linkTime
|
||
if (!(t instanceof Date)) {
|
||
t = new Date(v.linkEqs[0].linkTime);
|
||
}
|
||
|
||
if(t >= start && t <= end){
|
||
return true;
|
||
}
|
||
return false;
|
||
});
|
||
}
|
||
|
||
} else if (these.filter.start) {
|
||
start = new Date(these.filter.start);
|
||
|
||
data = data.filter(v => {
|
||
let t = v.linkEqs[0].linkTime
|
||
if (!(t instanceof Date)) {
|
||
t = new Date(v.linkEqs[0].linkTime);
|
||
}
|
||
|
||
return t >= start;
|
||
});
|
||
} else if (these.filter.end) {
|
||
end = new Date(these.filter.end).setMonth(1);
|
||
|
||
data = data.filter(v => {
|
||
|
||
let t = v.linkEqs[0].linkTime
|
||
if (!(t instanceof Date)) {
|
||
t = new Date(v.linkEqs[0].linkTime);
|
||
}
|
||
|
||
return t < end;
|
||
});
|
||
}
|
||
|
||
}
|
||
|
||
total = data.length;
|
||
let bgIdx = (these.mescroll.num - 1) * 20;
|
||
let endIdx = these.mescroll.num * 20;
|
||
|
||
arr = data.slice(bgIdx, endIdx);
|
||
|
||
|
||
}
|
||
|
||
return {
|
||
rows: arr,
|
||
total: total
|
||
};
|
||
}
|
||
|
||
let getWarnData = () => {
|
||
|
||
let arr = [];
|
||
let total = 0;
|
||
if (systemInfo.uniPlatform == 'web') {
|
||
|
||
for (let i = 0; i < 20; i++) {
|
||
const timestamp = 1710072900000 + (i * 3600000); // 每小时递增
|
||
const numItems = Math.floor(Math.random() * 5) + 1; // 1-5条
|
||
|
||
const item = {
|
||
"linkId": timestamp.toString(),
|
||
"linkEqs": []
|
||
};
|
||
|
||
|
||
// 生成随机的linkTime和linkMac
|
||
const hours = Math.floor(Math.random() * 24);
|
||
const minutes = Math.floor(Math.random() * 60);
|
||
const macPart = () => Math.floor(Math.random() * 256).toString(16).padStart(2,
|
||
'0')
|
||
.toUpperCase();
|
||
const mac =
|
||
`${macPart()}:${macPart()}:${macPart()}:${macPart()}:${macPart()}:${macPart()}`;
|
||
|
||
let date =
|
||
`2026-01-${11 + Math.floor(i/24)}T${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}:00Z`;
|
||
date = Common.DateFormat(new Date(date), 'yyyy-MM-dd HH:mm:ss');
|
||
let warnType = ""; //
|
||
if (these.filter.warnType == 'all') {
|
||
warnType = Math.floor(Math.random() * 100) % 2 == 1 ? '闯入报警' : '强制报警'
|
||
total = 100;
|
||
} else if (these.filter.warnType == 'join') {
|
||
warnType = '闯入报警';
|
||
total = 50;
|
||
} else {
|
||
warnType = '强制报警';
|
||
total = 50;
|
||
}
|
||
|
||
arr.push({
|
||
linkId: timestamp.toString(),
|
||
warnType: warnType,
|
||
warnMac: mac,
|
||
warnTime: date,
|
||
warnName: ""
|
||
});
|
||
}
|
||
} else {
|
||
let array = uni.getStorageSync(warnKey);
|
||
let data = [];
|
||
if (array) {
|
||
data = data.concat(array);
|
||
}
|
||
if (these.filter.warnType != 'all') {
|
||
let type = these.filter.warnType == 'join' ? '闯入报警' : '强制报警';
|
||
data = data.filter(v => {
|
||
return v.warnType == type;
|
||
});
|
||
}
|
||
if (these.Status.filterMode) {
|
||
if (these.filter.start && these.filter.end) {
|
||
|
||
console.log("these.filter.start=" + these.filter.start);
|
||
console.log("hese.filter.end=" + these.filter.end);
|
||
let start = new Date(these.filter.start);
|
||
let end = new Date(these.filter.end);
|
||
end.setMonth(1);
|
||
data = data.filter(v => {
|
||
|
||
let t = v.warnTime
|
||
if (!(t instanceof Date)) {
|
||
t = new Date(v.warnTime);
|
||
}
|
||
|
||
return t >= start && t <= end;
|
||
});
|
||
} else if (these.filter.start) {
|
||
let start = new Date(these.filter.start);
|
||
data = data.filter(v => {
|
||
|
||
let t = v.warnTime
|
||
if (!(t instanceof Date)) {
|
||
t = new Date(v.warnTime);
|
||
}
|
||
|
||
return t >= start;
|
||
});
|
||
} else if (these.filter.end) {
|
||
let end = new Date(these.filter.end).setMonth(1);
|
||
data = data.filter(v => {
|
||
let t = v.warnTime
|
||
if (!(t instanceof Date)) {
|
||
t = new Date(v.warnTime);
|
||
}
|
||
return t < end;
|
||
});
|
||
}
|
||
} else {
|
||
if (these.filter.MM) {
|
||
let start = new Date(these.filter.MM + '-01');
|
||
let end = start.setMonth(1);
|
||
data = data.filter((v) => {
|
||
let t = v.warnTime
|
||
if (!(t instanceof Date)){
|
||
t = new Date(v.warnTime);
|
||
}
|
||
return t >= start && t < end;
|
||
});
|
||
}
|
||
|
||
}
|
||
|
||
console.error("data=", data);
|
||
total = data.length;
|
||
let bgIdx = (these.mescroll.num - 1) * 20;
|
||
let endIdx = these.mescroll.num * 20;
|
||
|
||
arr = data.slice(bgIdx, endIdx);
|
||
|
||
|
||
|
||
}
|
||
|
||
return {
|
||
rows: arr,
|
||
total: total
|
||
};
|
||
}
|
||
|
||
let readMsg = (arr) => {
|
||
let keys = [linkKey, warnKey];
|
||
for (let index = 0; index < keys.length; index++) {
|
||
let key = keys[index];
|
||
|
||
let array = uni.getStorageSync(key)
|
||
let flag = false;
|
||
for (let i = 0; i < array.length; i++) {
|
||
let msg = arr.find(v => {
|
||
return v.key == array[i].key
|
||
});
|
||
if (msg && !msg.read) {
|
||
flag = true;
|
||
array[i].read = true;
|
||
}
|
||
|
||
}
|
||
if (flag) {
|
||
uni.setStorage({
|
||
key: key,
|
||
data: array
|
||
});
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
let data = null;
|
||
if (these.Status.tabType == 'link') {
|
||
data = getLinkData();
|
||
|
||
if (these.mescroll.num == 1) {
|
||
these.linkList = data.rows;
|
||
} else {
|
||
these.linkList = these.linkList.concat(data.rows);
|
||
}
|
||
|
||
if (data.length < 20 || these.linkList.length >= data.total) {
|
||
hasNext = false;
|
||
} else {
|
||
hasNext = true;
|
||
}
|
||
|
||
} else {
|
||
data = getWarnData();
|
||
if (these.mescroll.num == 1) {
|
||
these.warnList = data.rows;
|
||
} else {
|
||
these.warnList = these.warnList.concat(data.rows);
|
||
}
|
||
|
||
if (data.length < 20 || these.warnList.length >= data.total) {
|
||
hasNext = false;
|
||
} else {
|
||
hasNext = true;
|
||
}
|
||
}
|
||
|
||
|
||
readMsg(data.rows);
|
||
these.mescroll.endSuccess(data.rows.length, hasNext);
|
||
|
||
|
||
},
|
||
500);
|
||
|
||
|
||
|
||
}
|
||
},
|
||
};
|
||
</script>
|
||
|
||
<style scoped>
|
||
.uninavebartext {
|
||
width: 100%;
|
||
font-size: 32rpx;
|
||
}
|
||
|
||
.contentBg {
|
||
height: calc(100vh - 44px) !important;
|
||
width: 100%;
|
||
|
||
height: auto;
|
||
padding: 30rpx;
|
||
box-sizing: border-box;
|
||
}
|
||
|
||
.row {
|
||
width: 100%;
|
||
height: 60rpx;
|
||
}
|
||
|
||
.row .typeItem {
|
||
width: 160rpx;
|
||
text-align: center;
|
||
position: relative;
|
||
}
|
||
|
||
.row .typeItem.active {
|
||
color: #AED600;
|
||
}
|
||
|
||
.row .typeItem.active::after {
|
||
content: "";
|
||
z-index: 1;
|
||
position: absolute;
|
||
width: 16px;
|
||
height: 4px;
|
||
border-radius: 30px;
|
||
background: #AED600;
|
||
transform: translateX(-50%);
|
||
top: 45rpx;
|
||
left: 50%;
|
||
}
|
||
|
||
.row .filterIco {
|
||
width: 40rpx;
|
||
height: 40rpx;
|
||
margin-top: 8rpx;
|
||
}
|
||
|
||
.row .filterIco .img {
|
||
width: 34rpx;
|
||
height: 34rpx;
|
||
}
|
||
|
||
.p100 {
|
||
width: 100%;
|
||
height: auto;
|
||
border-radius: 20px 20px 0px 0px;
|
||
background-color: rgba(42, 42, 42, 1);
|
||
box-sizing: border-box;
|
||
padding: 20rpx;
|
||
}
|
||
|
||
.prevContent {
|
||
width: 100%;
|
||
height: 100%;
|
||
|
||
position: fixed;
|
||
top: 0px;
|
||
left: 0px;
|
||
|
||
z-index: 999;
|
||
display: flex;
|
||
flex-direction: row;
|
||
flex-wrap: nowrap;
|
||
align-content: flex-end;
|
||
align-items: flex-end;
|
||
justify-content: center;
|
||
/* background-color: #00000000; */
|
||
}
|
||
|
||
.prevContent .previewPannel {
|
||
width: 100%;
|
||
height: 170px;
|
||
box-sizing: border-box;
|
||
background-color: #00000000;
|
||
position: relative;
|
||
z-index: 2;
|
||
margin: 30rpx 0rpx;
|
||
}
|
||
|
||
.prevContent .previewPannel .mask,
|
||
.mothPanel .mask {
|
||
width: 100%;
|
||
height: 100%;
|
||
position: absolute;
|
||
z-index: 3;
|
||
background-color: #00000000;
|
||
|
||
}
|
||
|
||
.prevContent .filterMode {
|
||
height: 80rpx;
|
||
display: flex;
|
||
flex-direction: row;
|
||
flex-wrap: nowrap;
|
||
align-content: center;
|
||
align-items: center;
|
||
justify-content: flex-start;
|
||
}
|
||
|
||
.filterMode .modeItem {
|
||
width: 30%;
|
||
text-align: center;
|
||
height: 60rpx;
|
||
line-height: 40rpx;
|
||
color: #ffffff66;
|
||
font-family: "PingFang SC";
|
||
font-style: Regular;
|
||
font-size: 32rpx;
|
||
font-weight: 400;
|
||
position: relative;
|
||
}
|
||
|
||
.filterMode .modeItem.active {
|
||
color: rgba(174, 214, 0, 1);
|
||
}
|
||
|
||
.filterMode .modeItem.active::after {
|
||
content: "";
|
||
position: absolute;
|
||
border-radius: 5px;
|
||
background-color: rgba(174, 214, 0, 1) !important;
|
||
|
||
width: 30rpx;
|
||
height: 10rpx;
|
||
bottom: 0px;
|
||
left: 50%;
|
||
z-index: 1;
|
||
-webkit-transform: translateX(-50%);
|
||
transform: translateX(-50%);
|
||
}
|
||
|
||
.prevContent .footerBtn {
|
||
display: flex;
|
||
flex-direction: row;
|
||
flex-wrap: nowrap;
|
||
align-content: center;
|
||
align-items: center;
|
||
justify-content: space-around;
|
||
width: 100%;
|
||
height: 100rpx;
|
||
}
|
||
|
||
.prevContent .footerBtn .btn {
|
||
width: 240rpx;
|
||
height: 74rpx;
|
||
line-height: 74rpx;
|
||
text-align: center;
|
||
box-sizing: border-box;
|
||
font-family: 'PingFang SC';
|
||
font-style: Medium;
|
||
font-size: 24rpx;
|
||
font-weight: 400;
|
||
letter-spacing: 12rpx;
|
||
text-align: center;
|
||
border: 1px solid #00000000;
|
||
border-radius: 130rpx;
|
||
}
|
||
|
||
.prevContent .footerBtn .btn.btnReset {
|
||
|
||
border: 1px solid #ffffff !important;
|
||
|
||
color: #FFFFFF;
|
||
|
||
}
|
||
|
||
.prevContent .footerBtn .btn.btnOK {
|
||
background-color: #AED600;
|
||
color: #232323;
|
||
border-color: #AED600 !important;
|
||
}
|
||
|
||
.picker-view {
|
||
width: 100%;
|
||
height: 100%;
|
||
|
||
background-color: #00000000;
|
||
}
|
||
|
||
/deep/ .myIndicator {
|
||
/* display: none !important; */
|
||
|
||
background: rgba(58, 58, 58, 1);
|
||
z-index: 0 !important;
|
||
}
|
||
|
||
/deep/.picker-view .myIndicator::before {
|
||
display: none !important;
|
||
}
|
||
|
||
/deep/.picker-view .myIndicator::after {
|
||
display: none !important;
|
||
}
|
||
|
||
/deep/.picker-view uni-picker-view-column:first-child .uni-picker-view-group .myIndicator {
|
||
border-top-left-radius: 34rpx !important;
|
||
border-bottom-left-radius: 34rpx !important;
|
||
}
|
||
|
||
/deep/.picker-view uni-picker-view-column:last-child .uni-picker-view-group .myIndicator {
|
||
border-top-right-radius: 34rpx !important;
|
||
border-bottom-right-radius: 34rpx !important;
|
||
}
|
||
|
||
.item {
|
||
text-align: center;
|
||
height: 34px;
|
||
font-family: "PingFang SC";
|
||
}
|
||
|
||
.item.active {
|
||
color: #bbe600;
|
||
font-size: 36rpx;
|
||
}
|
||
|
||
.item.preOne {
|
||
font-size: 32rpx;
|
||
}
|
||
|
||
.item.preTwo {
|
||
background: linear-gradient(180deg,
|
||
rgba(255, 255, 255, 0) 0%,
|
||
rgba(255, 255, 255, 0.5) 117.5%);
|
||
|
||
-webkit-background-clip: text;
|
||
background-clip: text;
|
||
-webkit-text-fill-color: transparent;
|
||
font-family: "PingFang SC";
|
||
font-style: Regular;
|
||
font-size: 30rpx;
|
||
}
|
||
|
||
.picker-view .item.borderLeft {}
|
||
|
||
.picker-view .item.borderRight {}
|
||
|
||
.nvbar {
|
||
top: 0px;
|
||
}
|
||
|
||
.mothPanel {
|
||
width: 100%;
|
||
height: 80rpx;
|
||
display: flex;
|
||
flex-wrap: nowrap;
|
||
align-items: center;
|
||
justify-content: space-between;
|
||
box-sizing: border-box;
|
||
padding: 0px 30rpx;
|
||
position: relative;
|
||
}
|
||
|
||
.mothPanel .mothItem {
|
||
width: 22%;
|
||
height: 55rpx;
|
||
border-radius: 16rpx;
|
||
background-color: #3A3A3A;
|
||
color: #FFFFFF57;
|
||
box-sizing: border-box;
|
||
border: 1px solid #00000000;
|
||
font-family: 'PingFang SC';
|
||
font-style: Regular;
|
||
font-size: 26rpx;
|
||
font-weight: 400;
|
||
text-align: center;
|
||
}
|
||
|
||
.mothPanel .mothItem.active,
|
||
.mothPanel .mtxt.active {
|
||
|
||
border: 1px solid #aed600 !important;
|
||
color: #aed600 !important;
|
||
}
|
||
|
||
|
||
.mothPanel .mtxt {
|
||
height: 80%;
|
||
width: 43%;
|
||
border-radius: 32rpx;
|
||
background: #3a3a3a;
|
||
color: rgba(255, 255, 255, 0.87);
|
||
font-family: 'PingFang SC';
|
||
font-style: Regular;
|
||
font-size: 26rpx;
|
||
font-weight: 400;
|
||
text-align: center;
|
||
}
|
||
|
||
.mothPanel .mspl {
|
||
height: 100%;
|
||
width: 10%;
|
||
}
|
||
|
||
.linkLi {
|
||
height: auto;
|
||
width: 100%;
|
||
box-sizing: border-box;
|
||
padding: 15rpx 0rpx;
|
||
|
||
color: rgba(255, 255, 255, 0.87);
|
||
|
||
font-family: 'PingFang SC';
|
||
font-style: Regular;
|
||
font-size: 28rpx;
|
||
font-weight: 400;
|
||
|
||
letter-spacing: 0px;
|
||
text-align: left;
|
||
}
|
||
|
||
.linkLi .header {
|
||
display: flex;
|
||
flex-direction: row;
|
||
flex-wrap: nowrap;
|
||
align-content: center;
|
||
justify-content: space-between;
|
||
align-items: center;
|
||
}
|
||
|
||
.linkLi .header.expand {
|
||
color: #aed600;
|
||
}
|
||
|
||
.linkLi .body {
|
||
border-radius: 16rpx;
|
||
background: rgba(26, 26, 26, 1);
|
||
width: 100%;
|
||
height: auto;
|
||
box-sizing: border-box;
|
||
padding: 20rpx;
|
||
margin: 10rpx 0rpx;
|
||
}
|
||
|
||
.linkLi .body .listHeader {}
|
||
|
||
.linkLi .body .line {
|
||
width: 100%;
|
||
height: 0rpx;
|
||
border-bottom: 1rpx solid #ffffff0f;
|
||
margin: 15rpx 0rpx;
|
||
}
|
||
|
||
.linkLi .body .listItem {
|
||
height: 50rpx;
|
||
width: 100%;
|
||
display: flex;
|
||
flex-direction: row;
|
||
flex-wrap: nowrap;
|
||
align-content: center;
|
||
align-items: center;
|
||
justify-content: space-between;
|
||
font-family: 'PingFang SC';
|
||
font-style: Regular;
|
||
font-size: 28rpx;
|
||
font-weight: 300;
|
||
}
|
||
|
||
.warnCardHeader {
|
||
display: flex;
|
||
flex-direction: row;
|
||
flex-wrap: nowrap;
|
||
align-content: center;
|
||
justify-content: center;
|
||
align-items: center;
|
||
width: 100%;
|
||
height: 45px;
|
||
border-top-right-radius: 20rpx;
|
||
border-top-left-radius: 20rpx;
|
||
position: sticky;
|
||
z-index: 3;
|
||
top: 0rpx;
|
||
background: rgba(26, 26, 26, 1);
|
||
}
|
||
|
||
.warnCardHeader .column {
|
||
width: calc(100% / 3);
|
||
text-align: center;
|
||
}
|
||
|
||
.warnPanel {
|
||
width: 100%;
|
||
height: 100%;
|
||
|
||
|
||
|
||
|
||
|
||
}
|
||
|
||
.warnLi {
|
||
display: flex;
|
||
flex-direction: row;
|
||
flex-wrap: nowrap;
|
||
align-content: center;
|
||
justify-content: center;
|
||
align-items: center;
|
||
width: 100%;
|
||
height: 85rpx;
|
||
position: relative;
|
||
background: rgba(26, 26, 26, 1);
|
||
}
|
||
|
||
.warnLi.last {
|
||
border-bottom-left-radius: 20rpx;
|
||
border-bottom-right-radius: 20rpx;
|
||
}
|
||
|
||
.warnLi.first::before {
|
||
position: absolute;
|
||
content: "";
|
||
z-index: 2;
|
||
width: calc(100% - 60rpx);
|
||
|
||
border-top: 1px solid rgba(255, 255, 255, 0.06);
|
||
top: 0px;
|
||
}
|
||
|
||
.warnLi::after {
|
||
position: absolute;
|
||
content: "";
|
||
z-index: 1;
|
||
width: calc(100% - 60rpx);
|
||
|
||
border-top: 1px solid rgba(255, 255, 255, 0.06);
|
||
top: 100%;
|
||
|
||
}
|
||
|
||
.warnLi .column {
|
||
width: calc(100% / 3);
|
||
text-align: center;
|
||
}
|
||
|
||
.warnLi .column.red {
|
||
color: #e03434;
|
||
}
|
||
</style> |