Commit 6924fd95f8816be48382b61259a8f57c29b1a6d0
Merge branch 'main_dev' into 'main'
Main dev See merge request yunteng/thingskit-app!153
Showing
15 changed files
with
507 additions
and
442 deletions
| 1 | //获取首页统计数据API | 1 | //获取首页统计数据API |
| 2 | const getHomeStatisticsApi = () => { | 2 | const getHomeStatisticsApi = () => { |
| 3 | - return uni.$u.http.get("/yt/homepage/app?login=false") | ||
| 4 | -}; | 3 | + return uni.$u.http.get('/yt/homepage/app?login=false') |
| 4 | +} | ||
| 5 | 5 | ||
| 6 | //获取视频分页API | 6 | //获取视频分页API |
| 7 | const getCameraApi = (params = {}) => { | 7 | const getCameraApi = (params = {}) => { |
| 8 | - return uni.$u.http | ||
| 9 | - .get('/yt/video', params) | ||
| 10 | -}; | 8 | + return uni.$u.http.get('/yt/video', params) |
| 9 | +} | ||
| 11 | 10 | ||
| 12 | //获取视频详情API | 11 | //获取视频详情API |
| 13 | const byCameraIdGetDetailApi = (id) => { | 12 | const byCameraIdGetDetailApi = (id) => { |
| 14 | - return uni.$u.http.get(`/yt/video/url/${id}`) | ||
| 15 | -}; | 13 | + return uni.$u.http.get(`/yt/video/url/${id}`) |
| 14 | +} | ||
| 15 | + | ||
| 16 | +const getCameraGBTUrl = (deviceId, channelId) => { | ||
| 17 | + return uni.$u.http.get(`/yt/video/control/start/${deviceId}/${channelId}`) | ||
| 18 | +} | ||
| 16 | 19 | ||
| 17 | //获取组态分页API | 20 | //获取组态分页API |
| 18 | const getConfigurationApi = (params = {}) => { | 21 | const getConfigurationApi = (params = {}) => { |
| 19 | - return uni.$u.http | ||
| 20 | - .get('/yt/configuration/center', params) | 22 | + return uni.$u.http.get('/yt/configuration/center', params) |
| 21 | } | 23 | } |
| 22 | 24 | ||
| 23 | // 获取看板分页API | 25 | // 获取看板分页API |
| 24 | const getVisualBoardApi = (params) => { | 26 | const getVisualBoardApi = (params) => { |
| 25 | - return uni.$u.http.get('yt/data_board',params) | 27 | + return uni.$u.http.get('yt/data_board', params) |
| 26 | } | 28 | } |
| 27 | 29 | ||
| 28 | //获取组织列表 | 30 | //获取组织列表 |
| 29 | const getMeOrgListApi = () => { | 31 | const getMeOrgListApi = () => { |
| 30 | - return uni.$u.http | ||
| 31 | - .get('/yt/organization/me/list') | 32 | + return uni.$u.http.get('/yt/organization/me/list') |
| 32 | } | 33 | } |
| 33 | 34 | ||
| 34 | export default { | 35 | export default { |
| 35 | - getHomeStatisticsApi, | ||
| 36 | - getCameraApi, | ||
| 37 | - byCameraIdGetDetailApi, | ||
| 38 | - getConfigurationApi, | ||
| 39 | - getMeOrgListApi, | ||
| 40 | - getVisualBoardApi | 36 | + getHomeStatisticsApi, |
| 37 | + getCameraApi, | ||
| 38 | + byCameraIdGetDetailApi, | ||
| 39 | + getConfigurationApi, | ||
| 40 | + getMeOrgListApi, | ||
| 41 | + getVisualBoardApi, | ||
| 42 | + getCameraGBTUrl, | ||
| 41 | } | 43 | } |
| @@ -17,7 +17,7 @@ | @@ -17,7 +17,7 @@ | ||
| 17 | </view> | 17 | </view> |
| 18 | </view> | 18 | </view> |
| 19 | <!-- 命令下发 设备在线并且不是网关子设备 --> | 19 | <!-- 命令下发 设备在线并且不是网关子设备 --> |
| 20 | - <view class="mr-2" v-if="deviceDetail.deviceState === 'ONLINE' && deviceDetail.deviceType !== 'SENSOR'"> | 20 | + <view class="mr-2" v-if="deviceDetail.deviceState === 'ONLINE' && deviceDetail.transportType!==deviceTypeNum.GBT"> |
| 21 | <!-- #ifdef MP --> | 21 | <!-- #ifdef MP --> |
| 22 | <u-button type="primary" shape="circle" size="mini" text="下发命令" @click="handleMpShowModal" /> | 22 | <u-button type="primary" shape="circle" size="mini" text="下发命令" @click="handleMpShowModal" /> |
| 23 | <!-- #endif --> | 23 | <!-- #endif --> |
| @@ -112,11 +112,11 @@ | @@ -112,11 +112,11 @@ | ||
| 112 | 112 | ||
| 113 | <script> | 113 | <script> |
| 114 | import {formatToDate} from '@/plugins/utils.js'; | 114 | import {formatToDate} from '@/plugins/utils.js'; |
| 115 | - import {issueCommand} from '../api/index.js'; | ||
| 116 | import api from '@/api/index.js'; | 115 | import api from '@/api/index.js'; |
| 117 | import mpCommandIssuance from './mp-command-issuance.vue'; | 116 | import mpCommandIssuance from './mp-command-issuance.vue'; |
| 118 | import {commandTypeList} from '../config/data.js' | 117 | import {commandTypeList} from '../config/data.js' |
| 119 | import {useShowModal} from '@/plugins/utils.js' | 118 | import {useShowModal} from '@/plugins/utils.js' |
| 119 | + import {deviceTypeNum} from '../config/data' | ||
| 120 | 120 | ||
| 121 | export default { | 121 | export default { |
| 122 | components: { | 122 | components: { |
| @@ -133,6 +133,7 @@ | @@ -133,6 +133,7 @@ | ||
| 133 | showNativeModal: false, | 133 | showNativeModal: false, |
| 134 | current: 0, | 134 | current: 0, |
| 135 | commandTypeList, | 135 | commandTypeList, |
| 136 | + deviceTypeNum:deviceTypeNum, | ||
| 136 | commandTypeStr: 'OneWay', | 137 | commandTypeStr: 'OneWay', |
| 137 | inputCommandContent: '', | 138 | inputCommandContent: '', |
| 138 | mpShowModal: false, | 139 | mpShowModal: false, |
| @@ -414,4 +415,4 @@ | @@ -414,4 +415,4 @@ | ||
| 414 | /deep/ .u-modal__content { | 415 | /deep/ .u-modal__content { |
| 415 | padding: 30rpx 0 !important; | 416 | padding: 30rpx 0 !important; |
| 416 | } | 417 | } |
| 417 | -</style> | ||
| 418 | +</style> |
| @@ -62,7 +62,7 @@ | @@ -62,7 +62,7 @@ | ||
| 62 | @close="calendarClose"></u-calendar> | 62 | @close="calendarClose"></u-calendar> |
| 63 | <u-picker :show="showTimeGap" :columns="columns" keyName="label" closeOnClickOverlay @confirm="confirmTimeGap" | 63 | <u-picker :show="showTimeGap" :columns="columns" keyName="label" closeOnClickOverlay @confirm="confirmTimeGap" |
| 64 | @cancel="cancelTimeGap" @close="cancelTimeGap" :defaultIndex="[3]"></u-picker> | 64 | @cancel="cancelTimeGap" @close="cancelTimeGap" :defaultIndex="[3]"></u-picker> |
| 65 | - <u-picker :show="showSelectType" :columns="keys" closeOnClickOverlay @confirm="confirmTypeGap" | 65 | + <u-picker :show="showSelectType" :columns="[keys.map(item=>({label:item.name,value:item.identifier}))]" keyName="label" closeOnClickOverlay @confirm="confirmTypeGap" |
| 66 | @cancel="cancelTypeGap" @close="cancelTypeGap"></u-picker> | 66 | @cancel="cancelTypeGap" @close="cancelTypeGap"></u-picker> |
| 67 | <u-picker :show="showSelectAvg" :columns="avgColumns" keyName="label" closeOnClickOverlay | 67 | <u-picker :show="showSelectAvg" :columns="avgColumns" keyName="label" closeOnClickOverlay |
| 68 | @confirm="confirmAvgGap" @cancel="showSelectAvg=false" @close="showSelectAvg=false"></u-picker> | 68 | @confirm="confirmAvgGap" @cancel="showSelectAvg=false" @close="showSelectAvg=false"></u-picker> |
| @@ -163,7 +163,7 @@ | @@ -163,7 +163,7 @@ | ||
| 163 | chartData: { | 163 | chartData: { |
| 164 | categories: this.historyData.length && this.historyData.map(item => item.ts), | 164 | categories: this.historyData.length && this.historyData.map(item => item.ts), |
| 165 | series: [{ | 165 | series: [{ |
| 166 | - name: this.keys[0][0], | 166 | + name: this.keys[0].identifier, |
| 167 | data: this.historyData.length && this.historyData.map(item => Number(item.value)) | 167 | data: this.historyData.length && this.historyData.map(item => Number(item.value)) |
| 168 | }] | 168 | }] |
| 169 | }, | 169 | }, |
| @@ -199,7 +199,7 @@ | @@ -199,7 +199,7 @@ | ||
| 199 | timeData: { | 199 | timeData: { |
| 200 | selectTime: this.yesterday + ' 至 ' + this.today, | 200 | selectTime: this.yesterday + ' 至 ' + this.today, |
| 201 | getTimeGap: this.timeDiff, | 201 | getTimeGap: this.timeDiff, |
| 202 | - getType: this.keys[0][0], | 202 | + getType: this.keys[0].name, |
| 203 | limit: 7, | 203 | limit: 7, |
| 204 | agg: 'NONE' | 204 | agg: 'NONE' |
| 205 | }, | 205 | }, |
| @@ -214,7 +214,7 @@ | @@ -214,7 +214,7 @@ | ||
| 214 | } else { | 214 | } else { |
| 215 | this.chartData.categories = newValue.map(item => item.ts); | 215 | this.chartData.categories = newValue.map(item => item.ts); |
| 216 | this.chartData.series = [{ | 216 | this.chartData.series = [{ |
| 217 | - name: this.keys[0][0], | 217 | + name: this.keys[0].name, |
| 218 | data: newValue.map(item => Number(item.value)) | 218 | data: newValue.map(item => Number(item.value)) |
| 219 | }]; | 219 | }]; |
| 220 | } | 220 | } |
| @@ -363,18 +363,18 @@ | @@ -363,18 +363,18 @@ | ||
| 363 | }, | 363 | }, |
| 364 | async confirmTypeGap(time) { | 364 | async confirmTypeGap(time) { |
| 365 | this.showSelectType = false; | 365 | this.showSelectType = false; |
| 366 | - this.timeData.getType = time.value[0]; | 366 | + this.timeData.getType = time.value[0].label; |
| 367 | const interval = this.columns[0].find(item => item.label === this.timeData.getTimeGap); | 367 | const interval = this.columns[0].find(item => item.label === this.timeData.getTimeGap); |
| 368 | const data = await getHistoryData({ | 368 | const data = await getHistoryData({ |
| 369 | startTs: this.startTs, | 369 | startTs: this.startTs, |
| 370 | endTs: this.endTs, | 370 | endTs: this.endTs, |
| 371 | - keys: this.timeData.getType, | 371 | + keys:time.value[0].value, |
| 372 | interval: this.limitFlag ? null : interval.value, | 372 | interval: this.limitFlag ? null : interval.value, |
| 373 | entityId: this.entityId, | 373 | entityId: this.entityId, |
| 374 | limit: this.timeData.limit, | 374 | limit: this.timeData.limit, |
| 375 | agg: this.timeData.agg | 375 | agg: this.timeData.agg |
| 376 | }); | 376 | }); |
| 377 | - this.$emit('update', data[this.timeData.getType]); | 377 | + this.$emit('update', data[time.value[0].value]); |
| 378 | }, | 378 | }, |
| 379 | cancelTypeGap() { | 379 | cancelTypeGap() { |
| 380 | this.showSelectType = false; | 380 | this.showSelectType = false; |
| @@ -2,8 +2,8 @@ | @@ -2,8 +2,8 @@ | ||
| 2 | <view class="realtime-page"> | 2 | <view class="realtime-page"> |
| 3 | <view class="item" v-for="(item, index) in recordList" :key="index"> | 3 | <view class="item" v-for="(item, index) in recordList" :key="index"> |
| 4 | <view class="item-top"> | 4 | <view class="item-top"> |
| 5 | - <view>{{ item.key }}</view> | ||
| 6 | - <view class="item-value">{{ item.value }}</view> | 5 | + <view>{{ item.name }}</view> |
| 6 | + <view class="item-value">{{ item.value || '' }}</view> | ||
| 7 | </view> | 7 | </view> |
| 8 | <view class="item-time">{{ item.time }}</view> | 8 | <view class="item-time">{{ item.time }}</view> |
| 9 | </view> | 9 | </view> |
| @@ -18,10 +18,10 @@ | @@ -18,10 +18,10 @@ | ||
| 18 | type: Array, | 18 | type: Array, |
| 19 | default: () => [] | 19 | default: () => [] |
| 20 | } | 20 | } |
| 21 | - } | 21 | + }, |
| 22 | }; | 22 | }; |
| 23 | </script> | 23 | </script> |
| 24 | 24 | ||
| 25 | <style lang="scss" scoped> | 25 | <style lang="scss" scoped> |
| 26 | @import "../static/realtime-data.scss"; | 26 | @import "../static/realtime-data.scss"; |
| 27 | -</style> | ||
| 27 | +</style> |
| 1 | -const list = [{ | ||
| 2 | - name: "基础信息", | ||
| 3 | - }, | ||
| 4 | - { | ||
| 5 | - name: "实时数据", | ||
| 6 | - }, | ||
| 7 | - { | ||
| 8 | - name: "历史数据", | ||
| 9 | - }, | ||
| 10 | - { | ||
| 11 | - name: "告警记录", | ||
| 12 | - }, | 1 | +const list = [ |
| 2 | + { | ||
| 3 | + name: '基础信息', | ||
| 4 | + }, | ||
| 5 | + { | ||
| 6 | + name: '实时数据', | ||
| 7 | + }, | ||
| 8 | + { | ||
| 9 | + name: '历史数据', | ||
| 10 | + }, | ||
| 11 | + { | ||
| 12 | + name: '告警记录', | ||
| 13 | + }, | ||
| 13 | ] | 14 | ] |
| 14 | 15 | ||
| 15 | -const issueStatus = [{ | ||
| 16 | - checked: true, | ||
| 17 | - name: '全部', | ||
| 18 | - type: '' | ||
| 19 | - }, | ||
| 20 | - { | ||
| 21 | - checked: false, | ||
| 22 | - name: '队列中', | ||
| 23 | - type: 'QUEUED' | ||
| 24 | - }, | ||
| 25 | - { | ||
| 26 | - checked: false, | ||
| 27 | - name: '已发送', | ||
| 28 | - type: 'SENT' | ||
| 29 | - }, | ||
| 30 | - { | ||
| 31 | - checked: false, | ||
| 32 | - name: '发送成功', | ||
| 33 | - type: 'DELIVERED' | ||
| 34 | - }, | ||
| 35 | - { | ||
| 36 | - checked: false, | ||
| 37 | - name: '响应成功', | ||
| 38 | - type: 'SUCCESSFUL' | ||
| 39 | - }, | ||
| 40 | - { | ||
| 41 | - checked: false, | ||
| 42 | - name: '超时', | ||
| 43 | - type: 'TIMEOUT' | ||
| 44 | - }, | ||
| 45 | - { | ||
| 46 | - checked: false, | ||
| 47 | - name: '已过期', | ||
| 48 | - type: 'EXPIRED' | ||
| 49 | - }, | ||
| 50 | - { | ||
| 51 | - checked: false, | ||
| 52 | - name: '响应失败', | ||
| 53 | - type: 'FAILED' | ||
| 54 | - }, | ||
| 55 | - { | ||
| 56 | - checked: false, | ||
| 57 | - name: '已删除', | ||
| 58 | - type: 'DELETED' | ||
| 59 | - } | 16 | +const issueStatus = [ |
| 17 | + { | ||
| 18 | + checked: true, | ||
| 19 | + name: '全部', | ||
| 20 | + type: '', | ||
| 21 | + }, | ||
| 22 | + { | ||
| 23 | + checked: false, | ||
| 24 | + name: '队列中', | ||
| 25 | + type: 'QUEUED', | ||
| 26 | + }, | ||
| 27 | + { | ||
| 28 | + checked: false, | ||
| 29 | + name: '已发送', | ||
| 30 | + type: 'SENT', | ||
| 31 | + }, | ||
| 32 | + { | ||
| 33 | + checked: false, | ||
| 34 | + name: '发送成功', | ||
| 35 | + type: 'DELIVERED', | ||
| 36 | + }, | ||
| 37 | + { | ||
| 38 | + checked: false, | ||
| 39 | + name: '响应成功', | ||
| 40 | + type: 'SUCCESSFUL', | ||
| 41 | + }, | ||
| 42 | + { | ||
| 43 | + checked: false, | ||
| 44 | + name: '超时', | ||
| 45 | + type: 'TIMEOUT', | ||
| 46 | + }, | ||
| 47 | + { | ||
| 48 | + checked: false, | ||
| 49 | + name: '已过期', | ||
| 50 | + type: 'EXPIRED', | ||
| 51 | + }, | ||
| 52 | + { | ||
| 53 | + checked: false, | ||
| 54 | + name: '响应失败', | ||
| 55 | + type: 'FAILED', | ||
| 56 | + }, | ||
| 57 | + { | ||
| 58 | + checked: false, | ||
| 59 | + name: '已删除', | ||
| 60 | + type: 'DELETED', | ||
| 61 | + }, | ||
| 60 | ] | 62 | ] |
| 61 | 63 | ||
| 62 | -const commandTypeList = [{ | ||
| 63 | - value: 'OneWay', | ||
| 64 | - name: '单向', | ||
| 65 | - }, | ||
| 66 | - { | ||
| 67 | - value: 'TwoWay', | ||
| 68 | - name: '双向' | ||
| 69 | - }, | 64 | +const commandTypeList = [ |
| 65 | + { | ||
| 66 | + value: 'OneWay', | ||
| 67 | + name: '单向', | ||
| 68 | + }, | ||
| 69 | + { | ||
| 70 | + value: 'TwoWay', | ||
| 71 | + name: '双向', | ||
| 72 | + }, | ||
| 70 | ] | 73 | ] |
| 71 | 74 | ||
| 75 | +const deviceTypeNum = { | ||
| 76 | + GBT: 'GBT28181', | ||
| 77 | +} | ||
| 72 | 78 | ||
| 73 | -export { | ||
| 74 | - list, | ||
| 75 | - issueStatus, | ||
| 76 | - commandTypeList | ||
| 77 | -} | ||
| 79 | +export { list, issueStatus, commandTypeList, deviceTypeNum } |
| @@ -3,220 +3,236 @@ | @@ -3,220 +3,236 @@ | ||
| 3 | <!-- 公共组件-每个页面必须引入 --> | 3 | <!-- 公共组件-每个页面必须引入 --> |
| 4 | <public-module></public-module> | 4 | <public-module></public-module> |
| 5 | <u-sticky :bgColor="bgColor"> | 5 | <u-sticky :bgColor="bgColor"> |
| 6 | - <u-tabs :list="list" :current="currentTab" @click="handleTabClick" :activeStyle="activeColor" | ||
| 7 | - :inactiveStyle="inActiveColor" :scrollable="isScrollable" /> | 6 | + <u-tabs :list="list" :current="currentTab" :lineWidth="transportType == deviceTypeNum.GBT?0:30" @click=" handleTabClick " :activeStyle="{activeColor}" |
| 7 | + :inactiveStyle="inActiveColor" :scrollable="isScrollable" itemStyle="padding: 0 11px;display:flex;flex-direction:row;align-items:center;justify-content:start;height:44px" /> | ||
| 8 | </u-sticky> | 8 | </u-sticky> |
| 9 | <view class="mt-3"> | 9 | <view class="mt-3"> |
| 10 | - <basic-info v-show="currentTab == 0" :deviceDetail="deviceDetail" /> | ||
| 11 | - <realtime-data v-show="currentTab === 1" :recordList="recordList" /> | ||
| 12 | - <history-data v-if="currentTab === 2" :keys="keys" :yesterday="yesterday" :today="today" | ||
| 13 | - :timeDiff="timeDiff" :historyData="historyData" :entityId="entityId" :start="startTs" :end="endTs" | ||
| 14 | - @update="handleUpdate" /> | ||
| 15 | - <alarm-history v-show="currentTab === 3" :deviceId="deviceId" /> | ||
| 16 | - <commond-record v-if="currentTab === 4" :tbDeviceId="entityId" /> | 10 | + <basic-info v-show=" currentTab == 0 " :deviceDetail=" deviceDetail " /> |
| 11 | + <realtime-data v-show=" currentTab === 1 " :recordList=" recordList " /> | ||
| 12 | + <history-data v-if=" currentTab === 2 " :keys=" keys " :yesterday=" yesterday " :today=" today " :timeDiff=" timeDiff " | ||
| 13 | + :historyData=" historyData " :entityId=" entityId " :start=" startTs " :end=" endTs " @update=" handleUpdate " /> | ||
| 14 | + <alarm-history v-show=" currentTab === 3 " :deviceId=" deviceId " /> | ||
| 15 | + <commond-record v-if=" currentTab === 4 " :tbDeviceId=" entityId " /> | ||
| 17 | </view> | 16 | </view> |
| 18 | </view> | 17 | </view> |
| 19 | </template> | 18 | </template> |
| 20 | 19 | ||
| 21 | <script> | 20 | <script> |
| 22 | - import fTabbar from "@/components/module/f-tabbar/f-tabbar"; | ||
| 23 | - import basicInfo from "./components/basic-info.vue"; | ||
| 24 | - import realtimeData from "./components/realtime-data.vue"; | ||
| 25 | - import alarmHistory from "./components/alarm-history.vue"; | ||
| 26 | - import historyData from "./components/history-data.vue"; | ||
| 27 | - import commondRecord from "./components/command-record.vue"; | ||
| 28 | - import { getDeviceKeys,getHistoryData } from "./api/index.js"; | ||
| 29 | - import {formatToDate} from "@/plugins/utils.js"; | ||
| 30 | - import MescrollCompMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mixins/mescroll-comp.js"; | ||
| 31 | - import moment from "moment"; | ||
| 32 | - import base from "@/config/baseUrl.js"; | ||
| 33 | - import { list } from './config/data.js' | ||
| 34 | - import api from '@/api' | 21 | +import fTabbar from "@/components/module/f-tabbar/f-tabbar"; |
| 22 | +import basicInfo from "./components/basic-info.vue"; | ||
| 23 | +import realtimeData from "./components/realtime-data.vue"; | ||
| 24 | +import alarmHistory from "./components/alarm-history.vue"; | ||
| 25 | +import historyData from "./components/history-data.vue"; | ||
| 26 | +import commondRecord from "./components/command-record.vue"; | ||
| 27 | +import { getDeviceKeys, getHistoryData } from "./api/index.js"; | ||
| 28 | +import { formatToDate } from "@/plugins/utils.js"; | ||
| 29 | +import MescrollCompMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mixins/mescroll-comp.js"; | ||
| 30 | +import moment from "moment"; | ||
| 31 | +import base from "@/config/baseUrl.js"; | ||
| 32 | +import { list } from './config/data.js' | ||
| 33 | +import api from '@/api' | ||
| 34 | +import { deviceTypeNum } from './config/data' | ||
| 35 | 35 | ||
| 36 | - export default { | ||
| 37 | - mixins: [MescrollCompMixin], | ||
| 38 | - components: { | ||
| 39 | - fTabbar, | ||
| 40 | - basicInfo, | ||
| 41 | - realtimeData, | ||
| 42 | - alarmHistory, | ||
| 43 | - historyData, | ||
| 44 | - commondRecord, | ||
| 45 | - }, | ||
| 46 | - data() { | ||
| 47 | - return { | ||
| 48 | - bgColor: '#fff', | ||
| 49 | - activeColor: { | ||
| 50 | - fontWeight: 'bold', | ||
| 51 | - color: '#333', | ||
| 52 | - }, | ||
| 53 | - inActiveColor: { | ||
| 54 | - color: '#999', | ||
| 55 | - }, | ||
| 56 | - list, | ||
| 57 | - currentTab: 0, | ||
| 58 | - deviceId: "", | ||
| 59 | - deviceDetail: {}, | ||
| 60 | - keys: [], | ||
| 61 | - yesterday: "", | ||
| 62 | - today: "", | ||
| 63 | - timeDiff: "", | ||
| 64 | - historyData: [], | ||
| 65 | - entityId: "", | ||
| 66 | - startTs: "", | ||
| 67 | - endTs: "", | ||
| 68 | - recordList: [], //实时数据 | ||
| 69 | - isScrollable: false, | ||
| 70 | - attrList: [], | ||
| 71 | - getAttrList:[] | ||
| 72 | - }; | ||
| 73 | - }, | ||
| 74 | - onUnload() { | ||
| 75 | - // 页面关闭时,销毁webSocket连接,否则第二次会存在连接不到的情况 | ||
| 76 | - uni.closeSocket(); | ||
| 77 | - }, | ||
| 78 | - async onLoad(options) { | ||
| 79 | - const {id,alarmStatus,lastOnlineTime,tbDeviceId,deviceProfileId} = options; | ||
| 80 | - this.deviceId = id; | ||
| 81 | - const res = await api.deviceApi.getDeviceDetail(this.deviceId) | ||
| 82 | - if(!res) return | ||
| 83 | - this.deviceDetail = { | ||
| 84 | - ...res, | ||
| 85 | - alarmStatus, | ||
| 86 | - lastOnlineTime, | ||
| 87 | - }; | ||
| 88 | - // 设备类型不是网关子设备的添加一个命令记录的选项卡 | ||
| 89 | - if (this.deviceDetail.deviceType !== "SENSOR") { | ||
| 90 | - this.list.push({ | ||
| 91 | - name: "命令记录", | ||
| 92 | - }); | ||
| 93 | - const res = new Map() | ||
| 94 | - this.list = this.list.filter((item) => !res.has(item.name) && res.set(item.name, 1)) | ||
| 95 | - } else { | ||
| 96 | - this.list = this.list.filter(item => item.name !=='命令记录') | ||
| 97 | - } | ||
| 98 | - this.isScrollable = this.list.length > 4; | ||
| 99 | - if (res.deviceProfileId) { | ||
| 100 | - this.getAttrList = await api.deviceApi.getAttribute(res.deviceProfileId) | ||
| 101 | - if (Array.isArray(this.getAttrList)) { | ||
| 102 | - this.attrList = this.getAttrList.map(m => { | ||
| 103 | - return m.identifier | ||
| 104 | - }) | ||
| 105 | - } | ||
| 106 | - } | ||
| 107 | - // 连接webSockte | ||
| 108 | - const socketTask = uni.connectSocket({ | ||
| 109 | - url: `${base.socketPrefix}://${base.baseWebSocketUrl}/api/ws/plugins/telemetry?token=` + uni.getStorageSync("userInfo").isToken, //仅为示例,并非真实接口地址。 | ||
| 110 | - complete: () => {}, | 36 | +export default { |
| 37 | + mixins: [MescrollCompMixin], | ||
| 38 | + components: { | ||
| 39 | + fTabbar, | ||
| 40 | + basicInfo, | ||
| 41 | + realtimeData, | ||
| 42 | + alarmHistory, | ||
| 43 | + historyData, | ||
| 44 | + commondRecord, | ||
| 45 | + }, | ||
| 46 | + data() { | ||
| 47 | + return { | ||
| 48 | + bgColor: '#fff', | ||
| 49 | + activeColor: { | ||
| 50 | + fontWeight: 'bold', | ||
| 51 | + color: '#333', | ||
| 52 | + }, | ||
| 53 | + inActiveColor: { | ||
| 54 | + color: '#999', | ||
| 55 | + }, | ||
| 56 | + list, | ||
| 57 | + currentTab: 0, | ||
| 58 | + deviceId: "", | ||
| 59 | + deviceDetail: {}, | ||
| 60 | + keys: [], | ||
| 61 | + yesterday: "", | ||
| 62 | + today: "", | ||
| 63 | + timeDiff: "", | ||
| 64 | + historyData: [], | ||
| 65 | + entityId: "", | ||
| 66 | + startTs: "", | ||
| 67 | + endTs: "", | ||
| 68 | + recordList: [], //实时数据 | ||
| 69 | + isScrollable: false, | ||
| 70 | + attrList: [], | ||
| 71 | + getAttrList: [], | ||
| 72 | + transportType:"", | ||
| 73 | + deviceTypeNum, | ||
| 74 | + }; | ||
| 75 | + }, | ||
| 76 | + onUnload() { | ||
| 77 | + // 页面关闭时,销毁webSocket连接,否则第二次会存在连接不到的情况 | ||
| 78 | + uni.closeSocket(); | ||
| 79 | + }, | ||
| 80 | + async onLoad(options) { | ||
| 81 | + const { id, alarmStatus, lastOnlineTime, tbDeviceId, deviceProfileId, transportType } = options; | ||
| 82 | + this.deviceId = id; | ||
| 83 | + this.transportType = transportType | ||
| 84 | + const res = await api.deviceApi.getDeviceDetail(this.deviceId) | ||
| 85 | + if (!res) return | ||
| 86 | + this.deviceDetail = { | ||
| 87 | + ...res, | ||
| 88 | + alarmStatus, | ||
| 89 | + lastOnlineTime, | ||
| 90 | + transportType | ||
| 91 | + }; | ||
| 92 | + // 设备类型不是网关子设备的添加一个命令记录的选项卡 | ||
| 93 | + if (this.deviceDetail.deviceType !== "SENSOR") { | ||
| 94 | + this.list.push({ | ||
| 95 | + name: "命令记录", | ||
| 111 | }); | 96 | }); |
| 112 | - uni.onSocketOpen((header) => { | ||
| 113 | - socketTask.send({ | ||
| 114 | - data: JSON.stringify({ | ||
| 115 | - attrSubCmds: [], | ||
| 116 | - tsSubCmds: [{ | ||
| 117 | - entityType: "DEVICE", | ||
| 118 | - entityId: tbDeviceId, | ||
| 119 | - scope: "LATEST_TELEMETRY", | ||
| 120 | - cmdId: 1, | ||
| 121 | - keys: this.attrList.join(','), | ||
| 122 | - }, ], | ||
| 123 | - historyCmds: [], | ||
| 124 | - entityDataCmds: [], | ||
| 125 | - entityDataUnsubscribeCmds: [], | ||
| 126 | - alarmDataCmds: [], | ||
| 127 | - alarmDataUnsubscribeCmds: [], | ||
| 128 | - entityCountCmds: [], | ||
| 129 | - entityCountUnsubscribeCmds: [], | ||
| 130 | - }), | ||
| 131 | - success() {}, | ||
| 132 | - }); | 97 | + const res = new Map() |
| 98 | + this.list = this.list.filter((item) => !res.has(item.name) && res.set(item.name, 1)) | ||
| 99 | + } else { | ||
| 100 | + this.list = this.list.filter(item => item.name !== '命令记录') | ||
| 101 | + } | ||
| 102 | + if (transportType === deviceTypeNum.GBT) { | ||
| 103 | + this.list = this.list.filter(item => item.name == '基础信息') | ||
| 104 | + } | ||
| 105 | + this.isScrollable = this.list.length > 4; | ||
| 106 | + if (res.deviceProfileId) { | ||
| 107 | + this.getAttrList = await api.deviceApi.getAttribute(res.deviceProfileId) | ||
| 108 | + if (Array.isArray(this.getAttrList)) { | ||
| 109 | + this.attrList = this.getAttrList?.map(m => { | ||
| 110 | + return m.identifier | ||
| 111 | + }) | ||
| 112 | + } | ||
| 113 | + } | ||
| 114 | + // 连接webSockte | ||
| 115 | + const socketTask = uni.connectSocket({ | ||
| 116 | + url: `${base.socketPrefix}://${base.baseWebSocketUrl}/api/ws/plugins/telemetry?token=` + uni.getStorageSync("userInfo").isToken, //仅为示例,并非真实接口地址。 | ||
| 117 | + complete: () => { }, | ||
| 118 | + }); | ||
| 119 | + uni.onSocketOpen((header) => { | ||
| 120 | + socketTask.send({ | ||
| 121 | + data: JSON.stringify({ | ||
| 122 | + attrSubCmds: [], | ||
| 123 | + tsSubCmds: [{ | ||
| 124 | + entityType: "DEVICE", | ||
| 125 | + entityId: tbDeviceId, | ||
| 126 | + scope: "LATEST_TELEMETRY", | ||
| 127 | + cmdId: 1, | ||
| 128 | + keys: this.attrList.join(','), | ||
| 129 | + },], | ||
| 130 | + historyCmds: [], | ||
| 131 | + entityDataCmds: [], | ||
| 132 | + entityDataUnsubscribeCmds: [], | ||
| 133 | + alarmDataCmds: [], | ||
| 134 | + alarmDataUnsubscribeCmds: [], | ||
| 135 | + entityCountCmds: [], | ||
| 136 | + entityCountUnsubscribeCmds: [], | ||
| 137 | + }), | ||
| 138 | + success() { }, | ||
| 133 | }); | 139 | }); |
| 134 | - socketTask.onMessage((msg) => { | ||
| 135 | - const { data } = JSON.parse(msg.data); | ||
| 136 | - const newArray = []; | ||
| 137 | - for (const key in data) { | ||
| 138 | - const [time, value] = data[key].flat(1); | ||
| 139 | - let obj = { key,time,value, }; | ||
| 140 | - if (this.recordList.length === 0) { | ||
| 141 | - this.recordList.unshift(obj); | ||
| 142 | - } else { | ||
| 143 | - newArray.push(obj); | ||
| 144 | - } | 140 | + }); |
| 141 | + socketTask.onMessage((msg) => { | ||
| 142 | + const { data } = JSON.parse(msg.data); | ||
| 143 | + const newArray = []; | ||
| 144 | + for (const key in data) { | ||
| 145 | + const [time, value] = data[key].flat(1); | ||
| 146 | + let obj = { key, time, value, }; | ||
| 147 | + if (this.recordList.length === 0) { | ||
| 148 | + this.recordList.unshift(obj); | ||
| 149 | + } else { | ||
| 150 | + newArray.push(obj); | ||
| 145 | } | 151 | } |
| 146 | - newArray.forEach((item) => { | ||
| 147 | - let flag = false; | ||
| 148 | - this.recordList.forEach((item1) => { | ||
| 149 | - if (item1.key === item.key) { | ||
| 150 | - item1.value = item.value; | ||
| 151 | - item1.time = item.time; | ||
| 152 | - flag = true; | ||
| 153 | - } | ||
| 154 | - }); | ||
| 155 | - if (!flag) { | ||
| 156 | - this.recordList.unshift(item); | 152 | + } |
| 153 | + newArray.forEach((item) => { | ||
| 154 | + let flag = false; | ||
| 155 | + this.recordList.forEach((item1) => { | ||
| 156 | + if (item1.key === item.key) { | ||
| 157 | + item1.value = item.value; | ||
| 158 | + item1.time = item.time; | ||
| 159 | + flag = true; | ||
| 157 | } | 160 | } |
| 158 | }); | 161 | }); |
| 159 | - this.recordList = this.recordList.map((item) => { | ||
| 160 | - return { | ||
| 161 | - ...item, | ||
| 162 | - time: formatToDate(item.time, "YYYY-MM-DD HH:mm:ss"), | ||
| 163 | - }; | ||
| 164 | - }); | 162 | + if (!flag) { |
| 163 | + this.recordList.unshift(item); | ||
| 164 | + } | ||
| 165 | }); | 165 | }); |
| 166 | - const keys = await getDeviceKeys(tbDeviceId); | ||
| 167 | - this.keys = [this.getAttrList.map(item=>item.identifier)]; | ||
| 168 | - // 昨天 | ||
| 169 | - this.yesterday = moment().subtract(1, "days").format("YYYY-MM-DD"); | ||
| 170 | - // 今天 | ||
| 171 | - this.today = moment().format("YYYY-MM-DD"); | ||
| 172 | - // 开始时间 | ||
| 173 | - this.startTs = moment().subtract(1, "days").format("x"); | ||
| 174 | - // 结束时间 | ||
| 175 | - this.endTs = moment().format("x"); | ||
| 176 | - this.entityId = tbDeviceId; | ||
| 177 | - const data = await getHistoryData({ | ||
| 178 | - entityId: tbDeviceId, | ||
| 179 | - startTs: this.startTs, | ||
| 180 | - endTs: this.endTs, | ||
| 181 | - keys: keys[0], | ||
| 182 | - // interval: 1800000, | ||
| 183 | - limit: 7, | ||
| 184 | - agg: 'NONE' | 166 | + this.recordList = this.recordList?.map((item) => { |
| 167 | + return { | ||
| 168 | + ...item, | ||
| 169 | + time: formatToDate(item.time, "YYYY-MM-DD HH:mm:ss"), | ||
| 170 | + }; | ||
| 185 | }); | 171 | }); |
| 186 | - this.timeDiff = "30分钟"; | ||
| 187 | - if (!Object.keys(data).length) return; | ||
| 188 | - this.historyData = data[keys[0]].map((item) => { | 172 | + if (this.getAttrList) { |
| 173 | + this.getAttrList.forEach(item => { | ||
| 174 | + this.recordList?.forEach(item1 => { | ||
| 175 | + if (item.identifier === item1.key) { | ||
| 176 | + item1.name = item.name | ||
| 177 | + } | ||
| 178 | + }) | ||
| 179 | + }) | ||
| 180 | + } | ||
| 181 | + }); | ||
| 182 | + const keys = await getDeviceKeys(tbDeviceId); | ||
| 183 | + this.keys = this.getAttrList || [] | ||
| 184 | + // 昨天 | ||
| 185 | + this.yesterday = moment().subtract(1, "days").format("YYYY-MM-DD"); | ||
| 186 | + // 今天 | ||
| 187 | + this.today = moment().format("YYYY-MM-DD"); | ||
| 188 | + // 开始时间 | ||
| 189 | + this.startTs = moment().subtract(1, "days").format("x"); | ||
| 190 | + // 结束时间 | ||
| 191 | + this.endTs = moment().format("x"); | ||
| 192 | + this.entityId = tbDeviceId; | ||
| 193 | + const data = await getHistoryData({ | ||
| 194 | + entityId: tbDeviceId, | ||
| 195 | + startTs: this.startTs, | ||
| 196 | + endTs: this.endTs, | ||
| 197 | + keys: keys[0], | ||
| 198 | + // interval: 1800000, | ||
| 199 | + limit: 7, | ||
| 200 | + agg: 'NONE' | ||
| 201 | + }); | ||
| 202 | + this.timeDiff = "30分钟"; | ||
| 203 | + if (!Object.keys(data).length) return; | ||
| 204 | + this.historyData = data[keys[0]].map((item) => { | ||
| 205 | + return { | ||
| 206 | + value: item.value, | ||
| 207 | + ts: formatToDate(item.ts, "YYYY-MM-DD HH:mm:ss"), | ||
| 208 | + }; | ||
| 209 | + }); | ||
| 210 | + }, | ||
| 211 | + methods: { | ||
| 212 | + handleTabClick({ | ||
| 213 | + index | ||
| 214 | + }) { | ||
| 215 | + this.currentTab = index; | ||
| 216 | + }, | ||
| 217 | + handleUpdate(data, e) { | ||
| 218 | + if (!Array.isArray(data)) { | ||
| 219 | + this.historyData = []; | ||
| 220 | + return; | ||
| 221 | + } | ||
| 222 | + this.historyData = data.map((item) => { | ||
| 189 | return { | 223 | return { |
| 190 | value: item.value, | 224 | value: item.value, |
| 191 | ts: formatToDate(item.ts, "YYYY-MM-DD HH:mm:ss"), | 225 | ts: formatToDate(item.ts, "YYYY-MM-DD HH:mm:ss"), |
| 192 | }; | 226 | }; |
| 193 | }); | 227 | }); |
| 194 | }, | 228 | }, |
| 195 | - methods: { | ||
| 196 | - handleTabClick({ | ||
| 197 | - index | ||
| 198 | - }) { | ||
| 199 | - this.currentTab = index; | ||
| 200 | - }, | ||
| 201 | - handleUpdate(data, e) { | ||
| 202 | - if (!Array.isArray(data)) { | ||
| 203 | - this.historyData = []; | ||
| 204 | - return; | ||
| 205 | - } | ||
| 206 | - this.historyData = data.map((item) => { | ||
| 207 | - return { | ||
| 208 | - value: item.value, | ||
| 209 | - ts: formatToDate(item.ts, "YYYY-MM-DD HH:mm:ss"), | ||
| 210 | - }; | ||
| 211 | - }); | ||
| 212 | - }, | ||
| 213 | - }, | ||
| 214 | - }; | 229 | + }, |
| 230 | +}; | ||
| 215 | </script> | 231 | </script> |
| 216 | 232 | ||
| 217 | <style lang="scss" scoped> | 233 | <style lang="scss" scoped> |
| 218 | - .device-detail-page { | ||
| 219 | - height: 100vh; | ||
| 220 | - background-color: #f8f9fa; | ||
| 221 | - } | 234 | +.device-detail-page { |
| 235 | + height: 100vh; | ||
| 236 | + background-color: #f8f9fa; | ||
| 237 | +} | ||
| 222 | </style> | 238 | </style> |
| @@ -15,6 +15,11 @@ | @@ -15,6 +15,11 @@ | ||
| 15 | font-weight: bold; | 15 | font-weight: bold; |
| 16 | .item-value { | 16 | .item-value { |
| 17 | font-weight: bold; | 17 | font-weight: bold; |
| 18 | + width:200rpx; | ||
| 19 | + text-align: right; | ||
| 20 | + overflow: hidden; | ||
| 21 | + text-overflow: ellipsis; | ||
| 22 | + white-space: nowrap; | ||
| 18 | } | 23 | } |
| 19 | } | 24 | } |
| 20 | .item-time { | 25 | .item-time { |
| @@ -23,4 +28,4 @@ | @@ -23,4 +28,4 @@ | ||
| 23 | color: #999; | 28 | color: #999; |
| 24 | } | 29 | } |
| 25 | } | 30 | } |
| 26 | -} | ||
| 31 | +} |
| @@ -67,7 +67,8 @@ | @@ -67,7 +67,8 @@ | ||
| 67 | async getVerifyCode() { | 67 | async getVerifyCode() { |
| 68 | const phoneRegular = /^1\d{10}$/; | 68 | const phoneRegular = /^1\d{10}$/; |
| 69 | if (this.readonly) { | 69 | if (this.readonly) { |
| 70 | - useShowToast('验证码已发送~') | 70 | + // useShowToast('验证码已发送~') |
| 71 | + return | ||
| 71 | } | 72 | } |
| 72 | if (!this.loginForm.phoneNumber) { | 73 | if (!this.loginForm.phoneNumber) { |
| 73 | return useShowToast('请输入手机号~') | 74 | return useShowToast('请输入手机号~') |
| @@ -130,4 +131,4 @@ | @@ -130,4 +131,4 @@ | ||
| 130 | 131 | ||
| 131 | <style lang="scss" scoped> | 132 | <style lang="scss" scoped> |
| 132 | @import './static/code.scss'; | 133 | @import './static/code.scss'; |
| 133 | -</style> | ||
| 134 | +</style> |
| @@ -122,16 +122,16 @@ | @@ -122,16 +122,16 @@ | ||
| 122 | message: '请输入正确的手机号码' | 122 | message: '请输入正确的手机号码' |
| 123 | } | 123 | } |
| 124 | ], | 124 | ], |
| 125 | - email: [{ | ||
| 126 | - required: true, | ||
| 127 | - message: '请输入正确的邮箱号', | ||
| 128 | - trigger: 'change' | ||
| 129 | - }, | ||
| 130 | - { | ||
| 131 | - pattern: /^[0-9a-zA-Z]+@(([0-9a-zA-Z]+)[.])+[a-z]{3}$/, | ||
| 132 | - message: '请输入正确的邮箱号' | ||
| 133 | - } | ||
| 134 | - ] | 125 | + // email: [{ |
| 126 | + // required: true, | ||
| 127 | + // message: '请输入正确的邮箱号', | ||
| 128 | + // trigger: 'change' | ||
| 129 | + // }, | ||
| 130 | + // { | ||
| 131 | + // pattern: /^[0-9a-zA-Z]+@(([0-9a-zA-Z]+)[.])+[a-z]{3}$/, | ||
| 132 | + // message: '请输入正确的邮箱号' | ||
| 133 | + // } | ||
| 134 | + // ] | ||
| 135 | }, | 135 | }, |
| 136 | showDate: false, | 136 | showDate: false, |
| 137 | dateTime: Number(new Date()), | 137 | dateTime: Number(new Date()), |
| @@ -85,6 +85,7 @@ import {mapActions } from 'vuex' | @@ -85,6 +85,7 @@ import {mapActions } from 'vuex' | ||
| 85 | }, | 85 | }, |
| 86 | onHide() { | 86 | onHide() { |
| 87 | this.ordId = '' | 87 | this.ordId = '' |
| 88 | + this.paramsStaus = '' | ||
| 88 | }, | 89 | }, |
| 89 | onLoad(e) { | 90 | onLoad(e) { |
| 90 | if (getApp().getBindNot()) { | 91 | if (getApp().getBindNot()) { |
| @@ -107,9 +108,6 @@ import {mapActions } from 'vuex' | @@ -107,9 +108,6 @@ import {mapActions } from 'vuex' | ||
| 107 | } | 108 | } |
| 108 | // 隐藏原生的tabbar | 109 | // 隐藏原生的tabbar |
| 109 | uni.hideTabBar(); | 110 | uni.hideTabBar(); |
| 110 | - if (getApp().getBindNot()) { | ||
| 111 | - return | ||
| 112 | - } | ||
| 113 | }, | 111 | }, |
| 114 | computed: { | 112 | computed: { |
| 115 | pageDisableScroll() { | 113 | pageDisableScroll() { |
| 1 | <template> | 1 | <template> |
| 2 | <view class="device-list"> | 2 | <view class="device-list"> |
| 3 | - <view @click="$emit('openDeviceDetail',item.id, item.alarmStatus, item.lastOnlineTime, item.tbDeviceId)" | 3 | + <view @click="$emit('openDeviceDetail',item)" |
| 4 | class="list-item" v-for="item in list" :key="item.id"> | 4 | class="list-item" v-for="item in list" :key="item.id"> |
| 5 | <view class="u-flex item"> | 5 | <view class="u-flex item"> |
| 6 | <view class="item-text text-clip"> | 6 | <view class="item-text text-clip"> |
| @@ -122,4 +122,4 @@ | @@ -122,4 +122,4 @@ | ||
| 122 | } | 122 | } |
| 123 | } | 123 | } |
| 124 | } | 124 | } |
| 125 | -</style> | ||
| 125 | +</style> |
| @@ -58,8 +58,8 @@ | @@ -58,8 +58,8 @@ | ||
| 58 | }); | 58 | }); |
| 59 | }, | 59 | }, |
| 60 | resetFilter() { | 60 | resetFilter() { |
| 61 | - const {deviceStatus,alarmStatus,typeStatus} = this; | ||
| 62 | - [deviceStatus, alarmStatus, typeStatus].forEach(item => item.map((item, index) => (item.checked = index ===0))); | 61 | + const {deviceStatus,alarmStatus,typeStatus,collectStatus} = this; |
| 62 | + [deviceStatus, alarmStatus, typeStatus,collectStatus].forEach(item => item.map((item, index) => (item.checked = index ===0))); | ||
| 63 | }, | 63 | }, |
| 64 | confirmFilter() { | 64 | confirmFilter() { |
| 65 | const deviceState = this.deviceStatus.find(item => item.checked); | 65 | const deviceState = this.deviceStatus.find(item => item.checked); |
| @@ -64,9 +64,7 @@ | @@ -64,9 +64,7 @@ | ||
| 64 | if (getApp().getBindNot()) { | 64 | if (getApp().getBindNot()) { |
| 65 | return | 65 | return |
| 66 | } | 66 | } |
| 67 | - if (!e.deviceState) { | ||
| 68 | - this.loadData(1); | ||
| 69 | - } else { | 67 | + if (e.deviceState) { |
| 70 | let params = JSON.parse(e.deviceState); | 68 | let params = JSON.parse(e.deviceState); |
| 71 | this.conditions = { | 69 | this.conditions = { |
| 72 | deviceState: params | 70 | deviceState: params |
| @@ -87,7 +85,9 @@ | @@ -87,7 +85,9 @@ | ||
| 87 | this.conditions = { | 85 | this.conditions = { |
| 88 | organizationId: this.ordId | 86 | organizationId: this.ordId |
| 89 | } | 87 | } |
| 88 | + return | ||
| 90 | } | 89 | } |
| 90 | + this.loadData(1); | ||
| 91 | }, | 91 | }, |
| 92 | methods: { | 92 | methods: { |
| 93 | inputChanged(e) { | 93 | inputChanged(e) { |
| @@ -197,9 +197,10 @@ | @@ -197,9 +197,10 @@ | ||
| 197 | this.resetQuery(); | 197 | this.resetQuery(); |
| 198 | }) | 198 | }) |
| 199 | }, | 199 | }, |
| 200 | - openDeviceDetail(id, alarmStatus, lastOnlineTime, tbDeviceId) { | 200 | + openDeviceDetail(values) { |
| 201 | + const {id, alarmStatus, lastOnlineTime, tbDeviceId,transportType} = values || {} | ||
| 201 | uni.navigateTo({ | 202 | uni.navigateTo({ |
| 202 | - url: `/device-subpackage/device-detail/device-detail?id=${id}&alarmStatus=${alarmStatus}&lastOnlineTime=${lastOnlineTime}&tbDeviceId=${tbDeviceId}` | 203 | + url: `/device-subpackage/device-detail/device-detail?id=${id}&alarmStatus=${alarmStatus}&lastOnlineTime=${lastOnlineTime}&tbDeviceId=${tbDeviceId}&transportType=${transportType}` |
| 203 | }); | 204 | }); |
| 204 | }, | 205 | }, |
| 205 | } | 206 | } |
| @@ -3,30 +3,30 @@ | @@ -3,30 +3,30 @@ | ||
| 3 | <!-- 公共组件-每个页面必须引入 --> | 3 | <!-- 公共组件-每个页面必须引入 --> |
| 4 | <public-module></public-module> | 4 | <public-module></public-module> |
| 5 | <header-org @openOrg="openOrg" :total="cameraTotal" title="摄像头数:" :imageSrc="imageSrc"></header-org> | 5 | <header-org @openOrg="openOrg" :total="cameraTotal" title="摄像头数:" :imageSrc="imageSrc"></header-org> |
| 6 | - <view style="height: 150rpx;"></view> | 6 | + <view style="height: 150rpx"></view> |
| 7 | <!-- 自带分页组件 --> | 7 | <!-- 自带分页组件 --> |
| 8 | - <mescroll-body height="80%" ref="mescrollRef" :up="upOption" @init="mescrollInit" :down="downOption" @down="downCallback" | ||
| 9 | - @up="upCallback"> | 8 | + <mescroll-body height="80%" ref="mescrollRef" :up="upOption" @init="mescrollInit" :down="downOption" |
| 9 | + @down="downCallback" @up="upCallback"> | ||
| 10 | <view class="camera-container"> | 10 | <view class="camera-container"> |
| 11 | <view class="container-item"> | 11 | <view class="container-item"> |
| 12 | <!-- #ifdef MP-WEIXIN --> | 12 | <!-- #ifdef MP-WEIXIN --> |
| 13 | - <view v-for="(item, index) in list" :key="item.id" class="item" > | 13 | + <view v-for="(item, index) in list" :key="item.id" class="item"> |
| 14 | <video :data-id="item.id" :data-accessMode="item.accessMode" :key="item.id" preload="none" | 14 | <video :data-id="item.id" :data-accessMode="item.accessMode" :key="item.id" preload="none" |
| 15 | :id="'video' + item.id" class="video" :src="item.videoUrl" controls :title="item.name" | 15 | :id="'video' + item.id" class="video" :src="item.videoUrl" controls :title="item.name" |
| 16 | - x5-video-player-type="h5" x5-video-orientation="portraint" show-mute-btn | ||
| 17 | - :poster="item.avatar" @play="playVideo"></video> | ||
| 18 | - <view class="bottom-text text-clip w-300"> | 16 | + x5-video-player-type="h5" x5-video-orientation="portraint" show-mute-btn :poster="item.avatar" |
| 17 | + @play="playVideo"></video> | ||
| 18 | + <view class="bottom-text text-clip w-300"> | ||
| 19 | <text class="text">{{ item.name }}</text> | 19 | <text class="text">{{ item.name }}</text> |
| 20 | </view> | 20 | </view> |
| 21 | </view> | 21 | </view> |
| 22 | <!-- #endif --> | 22 | <!-- #endif --> |
| 23 | <!-- #ifdef APP-PLUS --> | 23 | <!-- #ifdef APP-PLUS --> |
| 24 | - <cover-view v-for="(item, index) in list" :key="item.id" class="item" style="overflow: hidden;"> | 24 | + <cover-view v-for="(item, index) in list" :key="item.id" class="item" style="overflow: hidden"> |
| 25 | <video :data-id="item.id" :data-accessMode="item.accessMode" :key="item.id" preload="none" | 25 | <video :data-id="item.id" :data-accessMode="item.accessMode" :key="item.id" preload="none" |
| 26 | :id="'video' + item.id" class="video" :src="item.videoUrl" controls :title="item.name" | 26 | :id="'video' + item.id" class="video" :src="item.videoUrl" controls :title="item.name" |
| 27 | - x5-video-player-type="h5" x5-video-orientation="portraint" show-mute-btn | ||
| 28 | - :poster="item.avatar" @play="playVideo"></video> | ||
| 29 | - <cover-view class="bottom-text text-clip w-300"> | 27 | + x5-video-player-type="h5" x5-video-orientation="portraint" show-mute-btn :poster="item.avatar" |
| 28 | + @play="playVideo"></video> | ||
| 29 | + <cover-view class="bottom-text text-clip w-300"> | ||
| 30 | <cover-view class="text">{{ item.name }}</cover-view> | 30 | <cover-view class="text">{{ item.name }}</cover-view> |
| 31 | </cover-view> | 31 | </cover-view> |
| 32 | </cover-view> | 32 | </cover-view> |
| @@ -36,133 +36,170 @@ | @@ -36,133 +36,170 @@ | ||
| 36 | <!-- <mescroll-empty v-if="!list.length" /> --> | 36 | <!-- <mescroll-empty v-if="!list.length" /> --> |
| 37 | </mescroll-body> | 37 | </mescroll-body> |
| 38 | <!-- 自带分页组件 --> | 38 | <!-- 自带分页组件 --> |
| 39 | - <view style="height: 60rpx;"></view> | 39 | + <view style="height: 60rpx"></view> |
| 40 | </view> | 40 | </view> |
| 41 | </template> | 41 | </template> |
| 42 | 42 | ||
| 43 | <script> | 43 | <script> |
| 44 | - import MescrollMixin from '@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js'; | ||
| 45 | - import api from '@/api/index.js' | ||
| 46 | - import { | ||
| 47 | - useNavigateTo | ||
| 48 | - } from '@/plugins/utils.js' | ||
| 49 | - import headerOrg from '@/components/common/header-org.vue' | 44 | +import MescrollMixin from '@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js' |
| 45 | +import api from '@/api/index.js' | ||
| 46 | +import { useNavigateTo } from '@/plugins/utils.js' | ||
| 47 | +import headerOrg from '@/components/common/header-org.vue' | ||
| 48 | +import store from '@/store' | ||
| 50 | 49 | ||
| 51 | - export default { | ||
| 52 | - mixins: [MescrollMixin], // 使用mixin (在main.js注册全局组件) | ||
| 53 | - components:{ | ||
| 54 | - headerOrg | 50 | +export default { |
| 51 | + mixins: [MescrollMixin], // 使用mixin (在main.js注册全局组件) | ||
| 52 | + components: { | ||
| 53 | + headerOrg, | ||
| 54 | + }, | ||
| 55 | + data() { | ||
| 56 | + return { | ||
| 57 | + imageSrc: '/static/camer.png', | ||
| 58 | + page: { | ||
| 59 | + num: 0, | ||
| 60 | + size: 10, | ||
| 61 | + }, | ||
| 62 | + downOption: { | ||
| 63 | + auto: true, //是否在初始化后,自动执行downCallback; 默认true | ||
| 64 | + }, | ||
| 65 | + upOption: { | ||
| 66 | + auto: false, // 不自动加载 | ||
| 67 | + }, | ||
| 68 | + current: 0, | ||
| 69 | + cameraTotal: 0, | ||
| 70 | + list: [], | ||
| 71 | + ordId: '', | ||
| 72 | + } | ||
| 73 | + }, | ||
| 74 | + onShow() { | ||
| 75 | + if (this.ordId) { | ||
| 76 | + this.loadData(1, this.ordId) | ||
| 77 | + } | ||
| 78 | + }, | ||
| 79 | + onHide() { | ||
| 80 | + this.ordId = '' | ||
| 81 | + }, | ||
| 82 | + onUnload(){ | ||
| 83 | + store.commit('setLoadingShow', false) | ||
| 84 | + }, | ||
| 85 | + onLoad() { | ||
| 86 | + // 隐藏原生的tabbar | ||
| 87 | + uni.hideTabBar() | ||
| 88 | + }, | ||
| 89 | + methods: { | ||
| 90 | + /*下拉刷新的回调 */ | ||
| 91 | + downCallback() { | ||
| 92 | + //联网加载数据 | ||
| 93 | + this.page.num = 1 | ||
| 94 | + this.loadData(1) | ||
| 55 | }, | 95 | }, |
| 56 | - data() { | ||
| 57 | - return { | ||
| 58 | - imageSrc:'/static/camer.png', | ||
| 59 | - page: { | ||
| 60 | - num: 0, | ||
| 61 | - size: 10 | ||
| 62 | - }, | ||
| 63 | - downOption: { | ||
| 64 | - auto: true //是否在初始化后,自动执行downCallback; 默认true | ||
| 65 | - }, | ||
| 66 | - upOption: { | ||
| 67 | - auto: false // 不自动加载 | ||
| 68 | - }, | ||
| 69 | - current: 0, | ||
| 70 | - cameraTotal: 0, | ||
| 71 | - list: [], | ||
| 72 | - ordId: '', | ||
| 73 | - }; | 96 | + /*上拉加载的回调: 其中page.num:当前页 从1开始, page.size:每页数据条数,默认10 */ |
| 97 | + upCallback() { | ||
| 98 | + //联网加载数据 | ||
| 99 | + this.page.num += 1 | ||
| 100 | + this.loadData(this.page.num) | ||
| 74 | }, | 101 | }, |
| 75 | - onShow() { | ||
| 76 | - if (this.ordId) { | ||
| 77 | - this.loadData(1, this.ordId); | 102 | + async loadData(pageNo, organizationId) { |
| 103 | + let httpData = { | ||
| 104 | + page: pageNo, | ||
| 105 | + pageSize: 10, | ||
| 106 | + organizationId, | ||
| 107 | + } | ||
| 108 | + const res = await api.homeApi.getCameraApi({ | ||
| 109 | + params: httpData, | ||
| 110 | + custom: { | ||
| 111 | + load: false, | ||
| 112 | + }, | ||
| 113 | + }) | ||
| 114 | + if (res) { | ||
| 115 | + uni.stopPullDownRefresh() | ||
| 116 | + this.mescroll.endBySize(res.items.length, res.total) | ||
| 117 | + this.cameraTotal = res.total | ||
| 118 | + if (!res.items.length && res.total == 0) { | ||
| 119 | + this.mescroll.showEmpty() | ||
| 120 | + } else { | ||
| 121 | + this.mescroll.removeEmpty() | ||
| 122 | + } | ||
| 123 | + // this.list = res.items | ||
| 124 | + this.getPlaySource(res.items) | ||
| 125 | + // this.$nextTick(()=>{ | ||
| 126 | + // for(let item of res.items){ | ||
| 127 | + // if(item.accessMode===1){ | ||
| 128 | + // item.videoUrl = ( api.homeApi.byCameraIdGetDetailApi(item.id)).data.url | ||
| 129 | + // } | ||
| 130 | + // if(item.accessMode === 2){ | ||
| 131 | + // const {deviceId,channelNo} = item.params || {} | ||
| 132 | + // try{ | ||
| 133 | + // const result = api.homeApi.getCameraGBTUrl(deviceId,channelNo) | ||
| 134 | + // const {data:{flv}} = result || {} | ||
| 135 | + // item.videoUrl = flv | ||
| 136 | + // }catch(err){ | ||
| 137 | + // console.log(err,'error') | ||
| 138 | + // } | ||
| 139 | + // } | ||
| 140 | + // } | ||
| 141 | + // }) | ||
| 142 | + | ||
| 143 | + if (pageNo == 1) { | ||
| 144 | + this.list = res.items | ||
| 145 | + } else { | ||
| 146 | + this.list = this.list.concat(res.items) | ||
| 147 | + } | ||
| 78 | } | 148 | } |
| 79 | }, | 149 | }, |
| 80 | - onHide() { | ||
| 81 | - this.ordId = ''; | ||
| 82 | - }, | ||
| 83 | - onLoad() { | ||
| 84 | - // 隐藏原生的tabbar | ||
| 85 | - uni.hideTabBar(); | ||
| 86 | - }, | ||
| 87 | - methods: { | ||
| 88 | - /*下拉刷新的回调 */ | ||
| 89 | - downCallback() { | ||
| 90 | - //联网加载数据 | ||
| 91 | - this.page.num = 1; | ||
| 92 | - this.loadData(1); | ||
| 93 | - }, | ||
| 94 | - /*上拉加载的回调: 其中page.num:当前页 从1开始, page.size:每页数据条数,默认10 */ | ||
| 95 | - upCallback() { | ||
| 96 | - //联网加载数据 | ||
| 97 | - this.page.num += 1; | ||
| 98 | - this.loadData(this.page.num); | ||
| 99 | - }, | ||
| 100 | - async loadData(pageNo, organizationId) { | ||
| 101 | - let httpData = { | ||
| 102 | - page: pageNo, | ||
| 103 | - pageSize: 10, | ||
| 104 | - organizationId | ||
| 105 | - }; | ||
| 106 | - const res = await api.homeApi.getCameraApi({ | ||
| 107 | - params: httpData, | ||
| 108 | - custom: { | ||
| 109 | - load: false | ||
| 110 | - } | ||
| 111 | - }) | ||
| 112 | - if (res) { | ||
| 113 | - uni.stopPullDownRefresh(); | ||
| 114 | - this.mescroll.endBySize(res.items.length, res.total); | ||
| 115 | - this.cameraTotal = res.total; | ||
| 116 | - if(!res.items.length && res.total==0){ | ||
| 117 | - this.mescroll.showEmpty() | ||
| 118 | - }else{ | ||
| 119 | - this.mescroll.removeEmpty() | ||
| 120 | - } | 150 | + getPlaySource(items) { |
| 151 | + for (let item of items) { | ||
| 152 | + if (item.accessMode === 1) { | ||
| 153 | + api.homeApi.byCameraIdGetDetailApi(item.id).then(res => { | ||
| 154 | + item.videoUrl = res.data.url | ||
| 155 | + }) | ||
| 156 | + } | ||
| 157 | + if (item.accessMode === 2) { | ||
| 158 | + const { deviceId, channelNo } = item.params || {} | ||
| 159 | + try { | ||
| 160 | + api.homeApi.getCameraGBTUrl(deviceId, channelNo).then(res => { | ||
| 161 | + const { data: { flv,fmp4,hls } } = res || {} | ||
| 162 | + item.videoUrl = hls | ||
| 163 | + }) | ||
| 121 | 164 | ||
| 122 | - for(let item of res.items){ | ||
| 123 | - if(item.accessMode===1){ | ||
| 124 | - item.videoUrl = (await api.homeApi.byCameraIdGetDetailApi(item.id)).data.url | ||
| 125 | - } | ||
| 126 | - } | ||
| 127 | 165 | ||
| 128 | - if (pageNo == 1) { | ||
| 129 | - this.list = res.items; | ||
| 130 | - } else { | ||
| 131 | - this.list = this.list.concat(res.items); | 166 | + } catch (err) { |
| 167 | + console.log(err, 'error') | ||
| 132 | } | 168 | } |
| 133 | } | 169 | } |
| 134 | - }, | ||
| 135 | - //播放视频 | ||
| 136 | - async playVideo(e) { | ||
| 137 | - const {currentTarget: {dataset: {accessmode,id}} = {}} = e | ||
| 138 | - // let currentId = 'video' + id; | ||
| 139 | - // const videoContext = uni.createVideoContext(currentId, this); | ||
| 140 | - // videoContext.play() | ||
| 141 | - /** | ||
| 142 | - * 点击全屏播放当前视频,暂停其余视频 | ||
| 143 | - * 兼容APP和MP端 | ||
| 144 | - */ | ||
| 145 | - this.videoContent = uni.createVideoContext(currentId, this); | ||
| 146 | - this.videoContent.requestFullScreen(); | ||
| 147 | - // 获取视频列表 | ||
| 148 | - let trailer = this.list; | ||
| 149 | - trailer.forEach((item, index) => { | ||
| 150 | - if (item.videoUrl != null && item.videoUrl != '') { | ||
| 151 | - let temp = 'video' + item.id; | ||
| 152 | - if (temp != currentId) { | ||
| 153 | - //暂停不是当前的视频 | ||
| 154 | - uni.createVideoContext(temp, this).pause(); | ||
| 155 | - } | ||
| 156 | - } | ||
| 157 | - }); | ||
| 158 | - }, | ||
| 159 | - openOrg() { | ||
| 160 | - useNavigateTo('/pages/organization/organization') | ||
| 161 | } | 170 | } |
| 162 | - } | ||
| 163 | - }; | 171 | + }, |
| 172 | + //播放视频 | ||
| 173 | + async playVideo(e) { | ||
| 174 | + const { currentTarget: { dataset: { accessmode, id } } = {} } = e | ||
| 175 | + let currentId = 'video' + id; | ||
| 176 | + // const videoContext = uni.createVideoContext(currentId, this); | ||
| 177 | + // videoContext.play() | ||
| 178 | + /** | ||
| 179 | + * 点击全屏播放当前视频,暂停其余视频 | ||
| 180 | + * 兼容APP和MP端 | ||
| 181 | + */ | ||
| 182 | + // this.videoContent = uni.createVideoContext(currentId, this) | ||
| 183 | + // this.videoContent.requestFullScreen() | ||
| 184 | + // 获取视频列表 | ||
| 185 | + let trailer = this.list | ||
| 186 | + trailer.forEach((item, index) => { | ||
| 187 | + if (item.videoUrl != null && item.videoUrl != '') { | ||
| 188 | + let temp = 'video' + item.id | ||
| 189 | + if (temp != currentId) { | ||
| 190 | + //暂停不是当前的视频 | ||
| 191 | + uni.createVideoContext(temp, this).pause() | ||
| 192 | + } | ||
| 193 | + } | ||
| 194 | + }) | ||
| 195 | + }, | ||
| 196 | + openOrg() { | ||
| 197 | + useNavigateTo('/pages/organization/organization') | ||
| 198 | + }, | ||
| 199 | + }, | ||
| 200 | +} | ||
| 164 | </script> | 201 | </script> |
| 165 | 202 | ||
| 166 | <style lang="scss" scoped> | 203 | <style lang="scss" scoped> |
| 167 | - @import '../../static/camera.scss'; | 204 | +@import '../../static/camera.scss'; |
| 168 | </style> | 205 | </style> |
| @@ -82,6 +82,8 @@ | @@ -82,6 +82,8 @@ | ||
| 82 | onLoad() { | 82 | onLoad() { |
| 83 | // 隐藏原生的tabbar | 83 | // 隐藏原生的tabbar |
| 84 | uni.hideTabBar(); | 84 | uni.hideTabBar(); |
| 85 | + }, | ||
| 86 | + onShow(){ | ||
| 85 | if (getApp().getBindNot()) { | 87 | if (getApp().getBindNot()) { |
| 86 | this.basicStatistics.map(item=>{ | 88 | this.basicStatistics.map(item=>{ |
| 87 | const { key, value } = item | 89 | const { key, value } = item |