Files
admin-govern/src/components/cockpit/indicatorDetails/index.vue
2026-06-09 19:51:31 +08:00

225 lines
6.6 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div>
<!--指标越限明细 -->
<TableHeader
:showReset="false"
ref="TableHeaderRef"
@selectChange="selectChange"
datePicker
v-if="fullscreen"
:timeKeyList="prop.timeKey"
></TableHeader>
<el-calendar
v-model="value"
:style="{
height: `calc(${prop.height} - ${headerHeight}px + ${fullscreen ? 0 : 56}px )`,
overflow: 'auto'
}"
v-loading="tableStore.table.loading"
>
<template #date-cell="{ data }">
<div
style="padding: 8px"
:style="{
background: setBackground(data.day),
height: `calc((${prop.height} - 100px - ${headerHeight}px + ${fullscreen ? 0 : 56}px) / 5 )`
}"
>
<p :class="data.isSelected ? 'is-selected' : ''">
{{ data.day.split('-').slice(2).join('-') }}
</p>
<el-tooltip effect="dark" placement="top" :hide-after="0" v-if="getTextForDate(data.day)">
<template #content>
<span v-html="getTextForDate(data.day)"></span>
</template>
<div class="details" v-html="fullscreen ? getTextForDate(data.day) : '有越限'"></div>
</el-tooltip>
</div>
</template>
</el-calendar>
</div>
</template>
<script setup lang="ts">
import { ref, onMounted, provide, reactive, watch, h } from 'vue'
import TableStore from '@/utils/tableStore'
import TableHeader from '@/components/table/header/index.vue'
import { dayjs } from 'element-plus'
import { getTime } from '@/utils/formatTime'
const prop = defineProps({
w: { type: [String, Number] },
h: { type: [String, Number] },
width: { type: [String, Number] },
height: { type: [String, Number] },
timeKey: { type: Array as () => string[] },
timeValue: { type: Object },
interval: { type: Number }
})
const headerHeight = ref(57)
const list = ref()
const TableHeaderRef = ref()
dayjs.en.weekStart = 1 //设置日历的周起始日为星期一
const value = ref(new Date())
const selectChange = (showSelect: any, height: any, datePickerValue?: any) => {
headerHeight.value = height
if (datePickerValue && datePickerValue.timeValue) {
// 更新时间参数
tableStore.table.params.searchBeginTime = datePickerValue.timeValue[0]
tableStore.table.params.searchEndTime = datePickerValue.timeValue[1]
}
}
// 计算是否全屏展示
const fullscreen = computed(() => {
const w = Number(prop.w)
const h = Number(prop.h)
if (!isNaN(w) && !isNaN(h) && w === 12 && h === 6) {
// 执行相应逻辑
return true
} else {
return false
}
})
const getTextForDate = (date: string) => {
const item = list.value?.find((item: any) => item.time === date)
return item ? item.text : ''
}
const tableStore: any = new TableStore({
url: '/cs-harmonic-boot/limitRateDetailD/limitCalendarData',
method: 'POST',
showPage: false,
column: [],
beforeSearchFun: () => {
setTime()
},
loadCallback: () => {
value.value = dayjs(tableStore.table.params.searchBeginTime).toDate()
if (tableStore.table.data && tableStore.table.data.length > 0) {
list.value = tableStore.table.data.map((item: any) => {
// 将 items 数组转换为带换行的文本
const text = item.items && item.items.length > 0 ? item.items.join('<br/>') : ''
return {
time: item.time,
key: item.status || 0,
text: text
}
})
} else {
list.value = []
}
}
})
const setBackground = (value: string) => {
const data = list.value?.find((item: any) => item.time === value)
if (data) {
// 根据 status 值返回对应的颜色
switch (data.key) {
case 0: // 无越限
return '#33996690'
case 1: // 一般越限
return '#FFCC3390'
case 2: // 严重越限
return '#Ff660090'
default:
return '#fff' // 默认白色背景
}
}
return '#fff' // 默认白色背景
}
provide('tableStore', tableStore)
onMounted(() => {
nextTick(() => {
tableStore.index()
})
})
const setTime = () => {
const time = getTime(
(TableHeaderRef.value?.datePickerRef.interval || prop.interval) ?? 0,
prop.timeKey,
fullscreen.value
? [tableStore.table.params.searchBeginTime, tableStore.table.params.searchEndTime]
: prop.timeValue
)
if (Array.isArray(time)) {
tableStore.table.params.searchBeginTime = time[0]
tableStore.table.params.searchEndTime = time[1]
TableHeaderRef.value?.setInterval(time[2] - 0)
TableHeaderRef.value?.setTimeInterval([time[0], time[1]])
} else {
console.warn('获取时间失败time 不是一个有效数组')
}
}
watch(
() => prop.timeValue,
(newVal, oldVal) => {
tableStore.index()
},
{
deep: true
}
)
</script>
<style lang="scss" scoped>
:deep(.el-calendar) {
.el-calendar__button-group {
display: none;
}
.el-calendar__body {
padding: 0px !important;
height: calc(100% - 46px);
.el-calendar-table {
height: 100%;
}
}
.el-calendar-day {
// height: calc(912px / 5 );
height: 100%;
padding: 0px;
overflow: hidden;
.details {
height: calc(100% - 20px);
overflow-y: auto;
}
}
.el-calendar-table__row {
.next {
pointer-events: none;
}
.prev {
pointer-events: none;
}
}
.el-calendar-table .el-calendar-day:hover {
background-color: #ffffff00;
}
.el-calendar-table td.is-selected {
background-color: #ffffff00;
}
}
// /*calendar_class 是el-calendar所在父标签的css*/
// .calendar_class >>> .el-calendar-table:not(.is-range) td.next {
// pointer-events: none;
// }
// .calendar_class >>> .el-calendar-table:not(.is-range) td.prev {
// pointer-events: none;
// }
</style>