|
|
|
@ -27,7 +27,11 @@
|
|
|
|
|
|
|
|
|
|
|
|
<OverviewMetricCards :metrics="overviewData.metrics" />
|
|
|
|
<OverviewMetricCards :metrics="overviewData.metrics" />
|
|
|
|
|
|
|
|
|
|
|
|
<StatusDistributionChart :hourly-status="overviewData.hourlyStatus" :summary="overviewData.summary" />
|
|
|
|
<StatusDistributionChart
|
|
|
|
|
|
|
|
:hourly-status="overviewData.hourlyStatus"
|
|
|
|
|
|
|
|
:summary="overviewData.summary"
|
|
|
|
|
|
|
|
:summary-total-hours="overviewData.summaryTotalHours"
|
|
|
|
|
|
|
|
/>
|
|
|
|
|
|
|
|
|
|
|
|
<OperationTimelineChart
|
|
|
|
<OperationTimelineChart
|
|
|
|
:rows="overviewData.timelineRows"
|
|
|
|
:rows="overviewData.timelineRows"
|
|
|
|
@ -45,13 +49,14 @@
|
|
|
|
<script setup lang="ts">
|
|
|
|
<script setup lang="ts">
|
|
|
|
import dayjs from 'dayjs'
|
|
|
|
import dayjs from 'dayjs'
|
|
|
|
import { useFullscreen } from '@vueuse/core'
|
|
|
|
import { useFullscreen } from '@vueuse/core'
|
|
|
|
|
|
|
|
import { DeviceOperationOverviewApi } from '@/api/iot/deviceOperationOverview'
|
|
|
|
import { OrganizationApi } from '@/api/mes/organization'
|
|
|
|
import { OrganizationApi } from '@/api/mes/organization'
|
|
|
|
import { handleTree } from '@/utils/tree'
|
|
|
|
import { handleTree } from '@/utils/tree'
|
|
|
|
import OverviewFilterBar from './components/OverviewFilterBar.vue'
|
|
|
|
import OverviewFilterBar from './components/OverviewFilterBar.vue'
|
|
|
|
import OverviewMetricCards from './components/OverviewMetricCards.vue'
|
|
|
|
import OverviewMetricCards from './components/OverviewMetricCards.vue'
|
|
|
|
import OperationTimelineChart from './components/OperationTimelineChart.vue'
|
|
|
|
import OperationTimelineChart from './components/OperationTimelineChart.vue'
|
|
|
|
import StatusDistributionChart from './components/StatusDistributionChart.vue'
|
|
|
|
import StatusDistributionChart from './components/StatusDistributionChart.vue'
|
|
|
|
import { buildDefaultQueryParams, buildRunOverviewData } from './mock'
|
|
|
|
import { buildDefaultQueryParams, buildRunOverviewTimelineData } from './mock'
|
|
|
|
import type {
|
|
|
|
import type {
|
|
|
|
OrganizationFilterItem,
|
|
|
|
OrganizationFilterItem,
|
|
|
|
OrganizationTreeOption,
|
|
|
|
OrganizationTreeOption,
|
|
|
|
@ -144,10 +149,36 @@ const collectDeviceOptionsByGroup = (groupId?: string) => {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const deviceOptions = computed(() => collectDeviceOptionsByGroup(queryParams.value.groupId))
|
|
|
|
const deviceOptions = computed(() => collectDeviceOptionsByGroup(queryParams.value.groupId))
|
|
|
|
const overviewData = ref<RunOverviewData>(buildRunOverviewData(queryParams.value, deviceOptions.value))
|
|
|
|
const overviewData = ref<RunOverviewData>({
|
|
|
|
|
|
|
|
metrics: [],
|
|
|
|
|
|
|
|
hourlyStatus: [],
|
|
|
|
|
|
|
|
summary: [],
|
|
|
|
|
|
|
|
summaryTotalHours: 0,
|
|
|
|
|
|
|
|
timelineRows: [],
|
|
|
|
|
|
|
|
totalDevices: 0
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const currentDeviceIds = computed(() =>
|
|
|
|
|
|
|
|
queryParams.value.deviceId.length > 0 ? queryParams.value.deviceId : deviceOptions.value.map((item) => item.value)
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
const refreshData = () => {
|
|
|
|
const buildOverviewRequestParams = () => ({
|
|
|
|
overviewData.value = buildRunOverviewData(queryParams.value, deviceOptions.value)
|
|
|
|
ids: currentDeviceIds.value.join(','),
|
|
|
|
|
|
|
|
startTime: queryParams.value.timeRange[0],
|
|
|
|
|
|
|
|
endTime: queryParams.value.timeRange[1]
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const refreshData = async () => {
|
|
|
|
|
|
|
|
const response = await DeviceOperationOverviewApi.getRunOverview(buildOverviewRequestParams())
|
|
|
|
|
|
|
|
const timelineData = buildRunOverviewTimelineData(queryParams.value, deviceOptions.value)
|
|
|
|
|
|
|
|
overviewData.value = {
|
|
|
|
|
|
|
|
metrics: response?.metrics || [],
|
|
|
|
|
|
|
|
hourlyStatus: response?.hourlyStatus || [],
|
|
|
|
|
|
|
|
summary: response?.summary || [],
|
|
|
|
|
|
|
|
summaryTotalHours: response?.summaryTotalHours || 0,
|
|
|
|
|
|
|
|
timelineRows: timelineData.timelineRows,
|
|
|
|
|
|
|
|
totalDevices: timelineData.totalDevices
|
|
|
|
|
|
|
|
}
|
|
|
|
const maxPage = Math.max(1, Math.ceil(overviewData.value.totalDevices / pageSize.value))
|
|
|
|
const maxPage = Math.max(1, Math.ceil(overviewData.value.totalDevices / pageSize.value))
|
|
|
|
if (pageNo.value > maxPage) pageNo.value = maxPage
|
|
|
|
if (pageNo.value > maxPage) pageNo.value = maxPage
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@ -156,22 +187,22 @@ const handleQuickRangeChange = (key: QuickRangeKey) => {
|
|
|
|
queryParams.value = {
|
|
|
|
queryParams.value = {
|
|
|
|
...queryParams.value,
|
|
|
|
...queryParams.value,
|
|
|
|
quickRange: key,
|
|
|
|
quickRange: key,
|
|
|
|
timeRange: key === 'custom' ? queryParams.value.timeRange : createDateRangeByQuickKey(key)
|
|
|
|
timeRange: createDateRangeByQuickKey(key)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
pageNo.value = 1
|
|
|
|
pageNo.value = 1
|
|
|
|
refreshData()
|
|
|
|
void refreshData()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const handleQuery = () => {
|
|
|
|
const handleQuery = () => {
|
|
|
|
pageNo.value = 1
|
|
|
|
pageNo.value = 1
|
|
|
|
refreshData()
|
|
|
|
void refreshData()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const resetQuery = () => {
|
|
|
|
const resetQuery = () => {
|
|
|
|
queryParams.value = buildDefaultQueryParams()
|
|
|
|
queryParams.value = buildDefaultQueryParams()
|
|
|
|
pageNo.value = 1
|
|
|
|
pageNo.value = 1
|
|
|
|
pageSize.value = 10
|
|
|
|
pageSize.value = 10
|
|
|
|
refreshData()
|
|
|
|
void refreshData()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
const handleExport = () => {
|
|
|
|
const handleExport = () => {
|
|
|
|
@ -220,7 +251,7 @@ watch(
|
|
|
|
|
|
|
|
|
|
|
|
onMounted(async () => {
|
|
|
|
onMounted(async () => {
|
|
|
|
await getOrganizationOptions()
|
|
|
|
await getOrganizationOptions()
|
|
|
|
refreshData()
|
|
|
|
await refreshData()
|
|
|
|
})
|
|
|
|
})
|
|
|
|
</script>
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
|
|
|