fix(温度报表): 优化energy-visual-editor\src\views\ems\report\tempBoard下的温度专属报表:1.默认时间范围是昨天8:30-今天8:30(24小时制)。2.高级分析advanced的测点多维温度画像(平行坐标图)有的线超过了图的上线。

main
zangch@mesnac.com 1 month ago
parent 9f2bf34a5e
commit 050b48847d

@ -4,12 +4,7 @@
- 成员项目: 基于 vben5(ant-design-vue) 的前端项目 [ruoyi-plus-vben5](https://github.com/imdap/ruoyi-plus-vben5)
- 成员项目: 基于soybean 的前端项目 [ruoyi-plus-soybean](https://gitee.com/xlsea/ruoyi-plus-soybean)
## 配套后端代码仓库地址
| 介绍 | 项目名 | 项目地址 |
|------------|:-----------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 🔥 分布式集群框架 | RuoYi-Vue-Plus | - [Gitee](https://gitee.com/dromara/RuoYi-Vue-Plus)<br> - [GitHub](https://github.com/dromara/RuoYi-Vue-Plus)<br> - [GitCode](https://gitcode.com/dromara/RuoYi-Vue-Plus) |
| 🔥 微服务框架 | RuoYi-Cloud-Plus | - [Gitee](https://gitee.com/dromara/RuoYi-Cloud-Plus)<br>- [GitHub](https://github.com/dromara/RuoYi-Cloud-Plus)<br> - [GitCode](https://gitcode.com/dromara/RuoYi-Cloud-Plus) |
## 分支说明
@ -57,27 +52,3 @@ npm run build:prod
| 缓存监控 | 对系统的缓存信息查询,命令统计等。 | 支持 | 支持 |
| 在线构建器 | 拖动表单元素生成相应的HTML代码。 | 支持 | 支持 |
| 使用案例 | 系统的一些功能案例 | 支持 | 不支持 |
## 演示图例
| | |
| ---------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- |
| ![输入图片说明](https://foruda.gitee.com/images/1680077524361362822/270bb429_1766278.png '屏幕截图') | ![输入图片说明](https://foruda.gitee.com/images/1680077619939771291/989bf9b6_1766278.png '屏幕截图') |
| ![输入图片说明](https://foruda.gitee.com/images/1680077681751513929/1c27c5bd_1766278.png '屏幕截图') | ![输入图片说明](https://foruda.gitee.com/images/1680077721559267315/74d63e23_1766278.png '屏幕截图') |
| ![输入图片说明](https://foruda.gitee.com/images/1680077765638904515/1b75d4a6_1766278.png '屏幕截图') | ![输入图片说明](https://foruda.gitee.com/images/1680078026375951297/eded7a4b_1766278.png '屏幕截图') |
| ![输入图片说明](https://foruda.gitee.com/images/1680078237104531207/0eb1b6a7_1766278.png '屏幕截图') | ![输入图片说明](https://foruda.gitee.com/images/1680078254306078709/5931e22f_1766278.png '屏幕截图') |
| ![输入图片说明](https://foruda.gitee.com/images/1680078287971528493/0b9af60a_1766278.png '屏幕截图') | ![输入图片说明](https://foruda.gitee.com/images/1680078308138770249/8d3b6696_1766278.png '屏幕截图') |
| ![输入图片说明](https://foruda.gitee.com/images/1680078352553634393/db5ef880_1766278.png '屏幕截图') | ![输入图片说明](https://foruda.gitee.com/images/1680078378238393374/601e4357_1766278.png '屏幕截图') |
| ![输入图片说明](https://foruda.gitee.com/images/1680078414983206024/2aae27c1_1766278.png '屏幕截图') | ![输入图片说明](https://foruda.gitee.com/images/1680078446738419874/ecce7d59_1766278.png '屏幕截图') |
| ![输入图片说明](https://foruda.gitee.com/images/1680078475971341775/149e8634_1766278.png '屏幕截图') | ![输入图片说明](https://foruda.gitee.com/images/1680078491666717143/3fadece7_1766278.png '屏幕截图') |
| ![输入图片说明](https://foruda.gitee.com/images/1680078558863188826/fb8ced2a_1766278.png '屏幕截图') | ![输入图片说明](https://foruda.gitee.com/images/1680078574561685461/ae68a0b2_1766278.png '屏幕截图') |
| ![输入图片说明](https://foruda.gitee.com/images/1680078594932772013/9d8bfec6_1766278.png '屏幕截图') | ![输入图片说明](https://foruda.gitee.com/images/1680078626493093532/fcfe4ff6_1766278.png '屏幕截图') |
| ![输入图片说明](https://foruda.gitee.com/images/1680078643608812515/0295bd4f_1766278.png '屏幕截图') | ![输入图片说明](https://foruda.gitee.com/images/1680078685196286463/d7612c81_1766278.png '屏幕截图') |
| ![输入图片说明](https://foruda.gitee.com/images/1680078703877318597/56fce0bc_1766278.png '屏幕截图') | ![输入图片说明](https://foruda.gitee.com/images/1680078716586545643/b6dbd68f_1766278.png '屏幕截图') |
| ![输入图片说明](https://foruda.gitee.com/images/1680078734103217688/eb1e6aa6_1766278.png '屏幕截图') | ![输入图片说明](https://foruda.gitee.com/images/1680078759131415480/73c525d8_1766278.png '屏幕截图') |
| ![输入图片说明](https://foruda.gitee.com/images/1680078779416197879/75e3ed02_1766278.png '屏幕截图') | ![输入图片说明](https://foruda.gitee.com/images/1680078802329118061/77e10915_1766278.png '屏幕截图') |
| ![输入图片说明](https://foruda.gitee.com/images/1680078893627848351/34a1c342_1766278.png '屏幕截图') | ![输入图片说明](https://foruda.gitee.com/images/1680078928175016986/f126ec4a_1766278.png '屏幕截图') |
| ![输入图片说明](https://foruda.gitee.com/images/1680078941718318363/b68a0f72_1766278.png '屏幕截图') | ![输入图片说明](https://foruda.gitee.com/images/1680078963175518631/3bb769a1_1766278.png '屏幕截图') |
| ![输入图片说明](https://foruda.gitee.com/images/1680078982294090567/b31c343d_1766278.png '屏幕截图') | ![输入图片说明](https://foruda.gitee.com/images/1680079000642440444/77ca82a9_1766278.png '屏幕截图') |
| ![输入图片说明](https://foruda.gitee.com/images/1680079020995074177/03b7d52e_1766278.png '屏幕截图') | ![输入图片说明](https://foruda.gitee.com/images/1680079039367822173/76811806_1766278.png '屏幕截图') |
| ![输入图片说明](https://foruda.gitee.com/images/1680079274333484664/4dfdc7c0_1766278.png '屏幕截图') | ![输入图片说明](https://foruda.gitee.com/images/1680079290467458224/d6715fcf_1766278.png '屏幕截图') |

@ -95,8 +95,11 @@ const parallelChartRef = ref<HTMLElement>()
const { getChart } = useChartResize(sankeyChartRef, themeRiverChartRef, treemapChartRef, sunburstChartRef, parallelChartRef)
/** 初始化默认时间范围昨天8:30 ~ 今天8:30 */
function initTimeRange() {
const end = new Date(); const start = new Date(end.getTime() - 7 * 24 * 3600 * 1000)
const now = new Date()
const end = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 8, 30, 0)
const start = new Date(end.getTime() - 24 * 3600 * 1000)
const p = (n: number) => n.toString().padStart(2, '0')
const fmt = (d: Date) => `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())} ${p(d.getHours())}:${p(d.getMinutes())}:${p(d.getSeconds())}`
timeRange.value = [fmt(start), fmt(end)]
@ -245,8 +248,31 @@ function renderParallel(data: TempBoardAdvancedVO[]) {
if (!chart || !data.length) return
const dimNames = ['测点', '平均温度', '最高温度', '最低温度', '标准差', '平均延迟(s)']
const fields = ['avgTemp', 'maxTemp', 'minTemp', 'tempStddev', 'avgDelay'] as const
// 线
const colors = ['#409eff', '#67c23a', '#e6a23c', '#f56c6c', '#9b59b6', '#1abc9c', '#e74c3c', '#2ecc71']
// IQR线
function calcAxisRange(field: string): { min: number; max: number } {
const values = data.map(d => (d as any)[field] as number).filter(v => v != null).sort((a, b) => a - b)
if (values.length === 0) return { min: 0, max: 100 }
if (values.length <= 2) {
//
const range = values[values.length - 1] - values[0]
const pad = Math.max(range * 0.1, 1)
return { min: Math.floor(values[0] - pad), max: Math.ceil(values[values.length - 1] + pad) }
}
const q1 = values[Math.floor(values.length * 0.25)]
const q3 = values[Math.floor(values.length * 0.75)]
const iqr = q3 - q1
// Q1 - 1.5*IQR ~ Q3 + 1.5*IQR
const lower = Math.min(q1 - 1.5 * iqr, values[0])
const upper = Math.max(q3 + 1.5 * iqr, values[values.length - 1])
const pad = Math.max((upper - lower) * 0.05, 0.5)
return { min: Math.floor(lower - pad), max: Math.ceil(upper + pad) }
}
//
const axisRanges = fields.map(f => calcAxisRange(f))
chart.setOption({
tooltip: { trigger: 'item' },
legend: {
@ -257,7 +283,18 @@ function renderParallel(data: TempBoardAdvancedVO[]) {
},
parallelAxis: [
{ type: 'category', data: data.map(d => d.monitorName || d.monitorId), dim: 0, name: dimNames[0], axisLabel: { rotate: 30, color: '#666' } },
...fields.map((f, i) => ({ dim: i + 1, name: dimNames[i + 1], axisLabel: { color: '#666' } }))
...fields.map((f, i) => ({
type: 'value',
dim: i + 1,
name: dimNames[i + 1],
min: axisRanges[i].min,
max: axisRanges[i].max,
nameLocation: 'end',
nameTextStyle: { color: '#333', fontSize: 12 },
axisLabel: { color: '#666', fontSize: 11 },
splitLine: { show: true, lineStyle: { color: '#eee' } },
axisTick: { show: true }
}))
],
parallel: { left: 100, right: 50, top: 50, bottom: 30 },
series: data.map((d, idx) => ({

@ -168,8 +168,10 @@ const continuousList = ref<TempBoardAnomalyVO[]>([])
const rapidRiseList = ref<TempBoardAnomalyVO[]>([])
const jitterList = ref<TempBoardAnomalyVO[]>([])
/** 初始化默认时间范围昨天8:30 ~ 今天8:30 */
function initTimeRange() {
const end = new Date()
const now = new Date()
const end = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 8, 30, 0)
const start = new Date(end.getTime() - 24 * 3600 * 1000)
const p = (n: number) => n.toString().padStart(2, '0')
const fmt = (d: Date) => `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())} ${p(d.getHours())}:${p(d.getMinutes())}:${p(d.getSeconds())}`

@ -111,8 +111,11 @@ const fluctuationChartRef = ref<HTMLElement>()
const { getChart } = useChartResize(avgRankChartRef, stabilityChartRef, dailyDiffChartRef, fluctuationChartRef)
/** 初始化默认时间范围昨天8:30 ~ 今天8:30 */
function initTimeRange() {
const end = new Date(); const start = new Date(end.getTime() - 24 * 3600 * 1000)
const now = new Date()
const end = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 8, 30, 0)
const start = new Date(end.getTime() - 24 * 3600 * 1000)
const p = (n: number) => n.toString().padStart(2, '0')
const fmt = (d: Date) => `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())} ${p(d.getHours())}:${p(d.getMinutes())}:${p(d.getSeconds())}`
timeRange.value = [fmt(start), fmt(end)]

@ -123,9 +123,12 @@ const loading = ref(false)
const highTopNChartRef = ref<HTMLElement>()
const lowTopNChartRef = ref<HTMLElement>()
/** 初始化默认时间范围最近24小时 */
/** 初始化默认时间范围昨天8:30 ~ 今天8:30 */
function initDefaultTimeRange() {
const end = new Date()
const now = new Date()
// 8:30:00
const end = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 8, 30, 0)
// 8:30:00
const start = new Date(end.getTime() - 24 * 3600 * 1000)
const fmt = (d: Date) => {
const pad = (n: number) => n.toString().padStart(2, '0')

@ -83,9 +83,11 @@ const hourlyHeatmapRef = ref<HTMLElement>()
const { getChart } = useChartResize(intervalChartRef, histogramChartRef, calendarHeatmapRef, hourlyHeatmapRef)
/** 初始化默认时间范围昨天8:30 ~ 今天8:30 */
function initTimeRange() {
const end = new Date()
const start = new Date(end.getTime() - 7 * 24 * 3600 * 1000)
const now = new Date()
const end = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 8, 30, 0)
const start = new Date(end.getTime() - 24 * 3600 * 1000)
const p = (n: number) => n.toString().padStart(2, '0')
const fmt = (d: Date) => `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())} ${p(d.getHours())}:${p(d.getMinutes())}:${p(d.getSeconds())}`
timeRange.value = [fmt(start), fmt(end)]

@ -131,8 +131,10 @@ const lowTopNChartRef = ref<HTMLElement>()
const { getChart } = useChartResize(highTopNChartRef, lowTopNChartRef)
/** 初始化默认时间范围昨天8:30 ~ 今天8:30 */
function initDefaultTimeRange() {
const end = new Date()
const now = new Date()
const end = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 8, 30, 0)
const start = new Date(end.getTime() - 24 * 3600 * 1000)
const fmt = (d: Date) => {
const p = (n: number) => n.toString().padStart(2, '0')

@ -141,8 +141,11 @@ const activityList = ref<TempBoardQualityVO[]>([])
const { getChart } = useChartResize(delayDistChartRef)
/** 初始化默认时间范围昨天8:30 ~ 今天8:30 */
function initTimeRange() {
const end = new Date(); const start = new Date(end.getTime() - 24 * 3600 * 1000)
const now = new Date()
const end = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 8, 30, 0)
const start = new Date(end.getTime() - 24 * 3600 * 1000)
const p = (n: number) => n.toString().padStart(2, '0')
const fmt = (d: Date) => `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())} ${p(d.getHours())}:${p(d.getMinutes())}:${p(d.getSeconds())}`
timeRange.value = [fmt(start), fmt(end)]

@ -140,8 +140,10 @@ const highTempList = ref<TempBoardRealtimeVO[]>([])
const lowTempList = ref<TempBoardRealtimeVO[]>([])
const staleList = ref<TempBoardRealtimeVO[]>([])
/** 初始化默认时间范围昨天8:30 ~ 今天8:30 */
function initTimeRange() {
const end = new Date()
const now = new Date()
const end = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 8, 30, 0)
const start = new Date(end.getTime() - 24 * 3600 * 1000)
const fmt = (d: Date) => {
const p = (n: number) => n.toString().padStart(2, '0')

@ -93,8 +93,10 @@ const peakValleyList = ref<TempBoardTrendVO[]>([])
const { getChart } = useChartResize(minuteChartRef, hourlyChartRef, dailyChartRef)
/** 初始化默认时间范围昨天8:30 ~ 今天8:30 */
function initTimeRange() {
const end = new Date()
const now = new Date()
const end = new Date(now.getFullYear(), now.getMonth(), now.getDate(), 8, 30, 0)
const start = new Date(end.getTime() - 24 * 3600 * 1000)
const p = (n: number) => n.toString().padStart(2, '0')
const fmt = (d: Date) => `${d.getFullYear()}-${p(d.getMonth() + 1)}-${p(d.getDate())} ${p(d.getHours())}:${p(d.getMinutes())}:${p(d.getSeconds())}`

Loading…
Cancel
Save