Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
D
DC-TOM
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
刘照晖
DC-TOM
Commits
eb1cbab7
Commit
eb1cbab7
authored
May 28, 2025
by
蔡伟
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'feat/layout-style' into 'dev'
Feat/layout style See merge request
!18
parents
d11833c6
0474d56b
Changes
9
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
529 additions
and
349 deletions
+529
-349
bagMonitor.js
src/request/api/bagMonitor.js
+24
-0
chart.js
src/utils/chart.js
+5
-1
map-svg.vue
src/views/dashboard/components/map-svg.vue
+1
-0
bag-monitoring.vue
src/views/dustMonitoring/bag-monitoring.vue
+461
-337
healthyProgress.vue
src/views/dustMonitoring/components/healthyProgress.vue
+1
-1
warn.vue
src/views/dustMonitoring/components/warn.vue
+7
-4
index.vue
src/views/dustMonitoring/index.vue
+13
-2
valveSettingDialog.vue
src/views/dustOverview/components/valveSettingDialog.vue
+2
-2
index.vue
src/views/dustOverview/index.vue
+15
-2
No files found.
src/request/api/bagMonitor.js
0 → 100644
View file @
eb1cbab7
import
request
from
"../index.js"
;
export
function
getMonitorRealtime
(
params
)
{
return
request
({
url
:
"/api/duster/monitor/chamber"
,
method
:
"get"
,
params
,
});
}
export
function
getMonitorToday
(
params
)
{
return
request
({
url
:
"/api/duster/monitor/curve"
,
method
:
"get"
,
params
,
});
}
export
function
getMonitorList
(
params
)
{
return
request
({
url
:
"/api/duster/monitor/list"
,
method
:
"get"
,
params
,
});
}
src/utils/chart.js
View file @
eb1cbab7
...
@@ -132,6 +132,7 @@ export const getBagMonitoringChartOption = (xData = [], seriesData = []) => ({
...
@@ -132,6 +132,7 @@ export const getBagMonitoringChartOption = (xData = [], seriesData = []) => ({
top
:
"3%"
,
top
:
"3%"
,
containLabel
:
true
,
containLabel
:
true
,
},
},
// x轴的文字去除年月日
xAxis
:
{
xAxis
:
{
type
:
"category"
,
type
:
"category"
,
boundaryGap
:
false
,
boundaryGap
:
false
,
...
@@ -145,6 +146,9 @@ export const getBagMonitoringChartOption = (xData = [], seriesData = []) => ({
...
@@ -145,6 +146,9 @@ export const getBagMonitoringChartOption = (xData = [], seriesData = []) => ({
fontSize
:
12
,
fontSize
:
12
,
interval
:
"auto"
,
interval
:
"auto"
,
rotate
:
0
,
rotate
:
0
,
formatter
:
function
(
value
)
{
return
value
.
split
(
' '
)[
1
];
}
},
},
axisTick
:
{
axisTick
:
{
show
:
false
,
show
:
false
,
...
@@ -154,7 +158,7 @@ export const getBagMonitoringChartOption = (xData = [], seriesData = []) => ({
...
@@ -154,7 +158,7 @@ export const getBagMonitoringChartOption = (xData = [], seriesData = []) => ({
yAxis
:
{
yAxis
:
{
type
:
"value"
,
type
:
"value"
,
min
:
0
,
min
:
0
,
max
:
600
,
//
max: 600,
interval
:
200
,
interval
:
200
,
axisLabel
:
{
axisLabel
:
{
color
:
"rgba(0,0,0,0.6)"
,
color
:
"rgba(0,0,0,0.6)"
,
...
...
src/views/dashboard/components/map-svg.vue
View file @
eb1cbab7
...
@@ -46,6 +46,7 @@
...
@@ -46,6 +46,7 @@
<span
class=
"label"
>
描述:
</span>
<span
class=
"label"
>
描述:
</span>
<div
class=
"value"
>
<div
class=
"value"
>
<span
class=
"value-item"
v-for=
"(item, index) in spot.description"
:key=
"index"
>
{{
item
}}
</span>
<span
class=
"value-item"
v-for=
"(item, index) in spot.description"
:key=
"index"
>
{{
item
}}
</span>
<span
class=
"value-item"
v-if=
"spot.description.length === 0"
>
暂无
</span>
</div>
</div>
</div>
</div>
...
...
src/views/dustMonitoring/bag-monitoring.vue
View file @
eb1cbab7
...
@@ -2,57 +2,71 @@
...
@@ -2,57 +2,71 @@
<div
class=
"page-container bag-monitoring-container"
>
<div
class=
"page-container bag-monitoring-container"
>
<div
class=
"header"
>
<div
class=
"header"
>
<div
class=
"select-container"
>
<div
class=
"select-container"
>
<span>
检测仪器
11
</span>
<span>
检测仪器
</span>
<el-select
v-model=
"selectedDevice"
placeholder=
"1#布袋检测仪"
>
<el-select
v-model=
"selectedDevice"
placeholder=
"1#布袋检测仪"
>
<el-option
label=
"1#布袋检测仪"
value=
"1"
></el-option>
<el-option
v-for=
"item in deviceList"
:key=
"item.deviceNo"
:label=
"item.deviceName"
:value=
"item.deviceNo"
></el-option>
</el-select>
</el-select>
</div>
</div>
<div
class=
"title"
>
BME布袋监测
</div>
<div
class=
"title"
>
BME布袋监测
</div>
</div>
</div>
<div
class=
"chart-container"
>
<div
class=
"chart-container"
>
<div
class=
"chart-wrapper"
ref=
"chartRef"
></div>
<div
class=
"chart-wrapper"
ref=
"chartRef"
></div>
<div
class=
"chart-wrapper no-data"
v-if=
"chartData.xData.length === 0"
>
<div
class=
"data-panel"
:class=
"
{ 'collapsed': !isPanelOpen }">
<div
class=
"no-data-text"
>
暂无数据
</div>
<div
class=
"panel-toggle"
:class=
"
{ 'collapsed-icon': !isPanelOpen, 'expanded-icon': isPanelOpen }" @click="togglePanel">
</div>
<el-icon
v-if=
"isPanelOpen"
><ArrowRightBold
/></el-icon>
</div>
<el-icon
v-if=
"!isPanelOpen"
><ArrowLeftBold
/></el-icon>
<div
class=
"data-panel"
:class=
"
{ collapsed: !isPanelOpen }">
<div
class=
"panel-toggle"
:class=
"
{
'collapsed-icon': !isPanelOpen,
'expanded-icon': isPanelOpen,
}"
@click="togglePanel"
>
<el-icon
v-if=
"isPanelOpen"
><ArrowRightBold
/></el-icon>
<el-icon
v-if=
"!isPanelOpen"
><ArrowLeftBold
/></el-icon>
</div>
<div
class=
"data-box"
>
<div
class=
"data-item"
>
<div>
时间:
{{
currentData
.
time
}}
</div>
<div>
仓室:
{{
currentData
.
compartNo
}}
</div>
<div>
反吹:
{{
currentData
.
blowBack
}}
</div>
</div>
</div>
<div
class=
"data-box"
>
<div
class=
"data-item"
>
<div
class=
"data-item"
>
<div>
时间:
{{
currentData
.
time
}}
</div>
<div>
仓室:
{{
currentData
.
chamber
}}
</div>
<div>
反吹:
{{
currentData
.
backwash
}}
</div>
</div>
<div
class=
"data-item"
>
<div>
DI3:
{{
currentData
.
di3
}}
</div>
<div>
DI3:
{{
currentData
.
di3
}}
</div>
<div>
排:
{{
currentData
.
row
}}
</div>
<div>
排:
{{
currentData
.
row
}}
</div>
<div>
实时值:
{{
currentData
.
real
Value
}}
</div>
<div>
实时值:
{{
currentData
.
real
Data
}}
</div>
</div>
</div>
<div
class=
"data-item"
>
<div
class=
"data-item"
>
<div>
基线值:
{{
currentData
.
baseline
}}
</div>
<div>
基线值:
{{
currentData
.
baseline
}}
</div>
<div>
Delay:
{{
currentData
.
delay
}}
</div>
<div>
Delay:
{{
currentData
.
delay
}}
</div>
<div>
totaltime:
{{
currentData
.
total
t
ime
}}
</div>
<div>
totaltime:
{{
currentData
.
total
T
ime
}}
</div>
</div>
</div>
<div
class=
"data-item"
>
<div
class=
"data-item"
>
<div>
{{
currentData
.
next
}}
</div>
<div>
next:
{{
currentData
.
next
}}
</div>
<div>
valve:
{{
currentData
.
valve
}}
</div>
<div>
valve:
{{
currentData
.
valve
No
}}
</div>
<div>
DI_TIME=
{{
currentData
.
di
_t
ime
}}
</div>
<div>
DI_TIME=
{{
currentData
.
di
T
ime
}}
</div>
</div>
</div>
<div
class=
"data-item"
>
<div
class=
"data-item"
>
<div>
false:
{{
currentData
.
false
}}
</div>
<div>
peak=
{{
currentData
.
peak
}}
</div>
<div>
peak=
{{
currentData
.
peak
}}
</div>
</div>
</div>
</div>
<div
class=
"data-box second-box"
>
<div>
时间:
{{
secondaryData
.
time
}}
, 仓室:
{{
secondaryData
.
chamber
}}
, 反吹:
{{
secondaryData
.
backwash
}}
, 谷值:
{{
secondaryData
.
valleyValue
}}
, 仓室状态阀门
{{
secondaryData
.
status
}}
False
{{
secondaryData
.
falseVal
}}
</div>
</div>
</div>
</div>
<!--
<div
class=
"data-box second-box"
>
<div>
时间:
{{
secondaryData
.
time
}}
, 仓室:
{{
secondaryData
.
chamber
}}
, 反吹:
{{
secondaryData
.
backwash
}}
, 谷值:
{{
secondaryData
.
valleyValue
}}
, 仓室状态阀门
{{
secondaryData
.
status
}}
False
{{
secondaryData
.
falseVal
}}
</div>
</div>
-->
</div>
</div>
<div
class=
"data-table"
>
<div
class=
"data-table"
>
<div
class=
"time-controls"
>
<div
class=
"time-controls"
>
<el-button
@
click=
"navigateBackward"
>
<el-button
@
click=
"navigateBackward"
>
<el-icon><ArrowLeftBold
/>
向前
</el-icon>
<el-icon><ArrowLeftBold
/>
向前
</el-icon>
...
@@ -71,363 +85,451 @@
...
@@ -71,363 +85,451 @@
<thead>
<thead>
<tr>
<tr>
<th>
名称
</th>
<th>
名称
</th>
<th
v-for=
"i in 20"
:key=
"i"
>
{{
i
}}
仓
</th>
<th
v-for=
"(value, index) in tableData"
:key=
"index"
>
{{
value
.
compartName
}}
</th>
</tr>
</tr>
</thead>
</thead>
<tbody>
<tbody>
<tr>
<tr>
<td>
峰值_R
</td>
<td>
峰值_R
</td>
<td
v-for=
"(value, index) in peakValuesR"
:key=
"'r'+index"
>
{{
value
}}
</td>
<td
v-for=
"(value, index) in tableData"
:key=
"'r' + index"
>
{{
value
.
peakValueR
||
"-"
}}
</td>
</tr>
</tr>
<tr>
<tr>
<td>
峰值_H
</td>
<td>
峰值_H
</td>
<td
v-for=
"(value, index) in peakValuesH"
:key=
"'h'+index"
>
{{
value
}}
</td>
<td
v-for=
"(value, index) in tableData"
:key=
"'h' + index"
>
{{
value
.
peakValueH
||
"-"
}}
</td>
</tr>
</tr>
<tr>
<tr>
<td>
状态
</td>
<td>
状态
</td>
<td
v-for=
"(value, index) in statusValues"
:key=
"'s'+index"
:class=
"
{ 'error': value === '故障' }">
{{
value
}}
</td>
<td
v-for=
"(value, index) in tableData"
:key=
"'s' + index"
:class=
"
{ error: value.status === 1 }"
>
{{
value
.
status
===
1
?
"故障"
:
"正常"
}}
</td>
</tr>
</tr>
<tr>
<tr>
<td>
反吹中
</td>
<td>
反吹中
</td>
<td
v-for=
"(value, index) in backwashValues"
:key=
"'b'+index"
>
{{
value
}}
</td>
<td
v-for=
"(value, index) in tableData"
:key=
"'b' + index"
>
{{
value
.
blowBack
||
"-"
}}
</td>
</tr>
</tr>
<tr>
<tr>
<td>
谷值
</td>
<td>
谷值
</td>
<td
v-for=
"(value, index) in valleyValues"
:key=
"'v'+index"
>
{{
value
}}
</td>
<td
v-for=
"(value, index) in tableData"
:key=
"'v' + index"
>
{{
value
.
valleyValue
||
"-"
}}
</td>
</tr>
</tr>
</tbody>
</tbody>
</table>
</table>
</div>
</div>
</div>
</div>
</
template
>
</
template
>
<
script
setup
>
<
script
setup
>
import
{
ref
,
reactive
,
onMounted
,
onBeforeUnmount
}
from
'vue'
import
{
ref
,
reactive
,
onMounted
,
onBeforeUnmount
,
watch
}
from
"vue"
;
import
*
as
echarts
from
'echarts'
import
*
as
echarts
from
"echarts"
;
import
{
ArrowRightBold
,
ArrowLeftBold
}
from
'@element-plus/icons-vue'
import
moment
from
"moment"
;
import
{
getBagMonitoringChartOption
}
from
'@/utils/chart.js'
import
{
ArrowRightBold
,
ArrowLeftBold
}
from
"@element-plus/icons-vue"
;
import
{
getBagMonitoringChartOption
}
from
"@/utils/chart.js"
;
import
{
getMonitorToday
,
getMonitorList
,
getMonitorRealtime
,
}
from
"@/request/api/bagMonitor"
;
import
{
useRoute
}
from
"vue-router"
;
// 获取路由参数
const
route
=
useRoute
();
// 设备选择
// 设备选择
const
selectedDevice
=
ref
(
'1'
)
const
selectedDevice
=
ref
(
null
);
const
isPanelOpen
=
ref
(
true
)
const
isPanelOpen
=
ref
(
true
)
;
// 图表相关
// 图表相关
const
chartRef
=
ref
(
null
)
const
chartRef
=
ref
(
null
);
let
chartInstance
=
null
let
chartInstance
=
null
;
let
updateTimer
=
null
// 定时器引用
let
updateTimer
=
null
;
// 定时器引用
let
lastTimePoint
=
null
;
// 控制是否获取实时设备状态数据
let
showRealtimeDeviceStatus
=
true
;
// 时间导航相关
// 从路由参数获取dusterNo
let
isRealTimeMode
=
true
const
dusterNo
=
ref
(
let
lastTimePoint
=
null
route
.
params
.
dusterNo
||
route
.
query
.
dusterNo
||
"ZH-ZL-1GL-001"
);
// 默认值作为fallback
// 图表数据
// 图表数据
const
chartData
=
reactive
({
const
chartData
=
reactive
({
xData
:
[],
xData
:
[],
seriesData
:
[]
seriesData
:
[],
})
});
const
deviceList
=
ref
([]);
const
currentTime
=
ref
(
null
);
// 当前数据面板
// 当前数据面板
const
currentData
=
reactive
({
const
currentData
=
ref
({
time
:
'641'
,
realtime
:
""
,
chamber
:
'5'
,
time
:
""
,
backwash
:
'0'
,
compartNo
:
""
,
di3
:
'0, 0,'
,
blowBack
:
""
,
row
:
'1,'
,
di3
:
""
,
realValue
:
'18.87,'
,
row
:
""
,
baseline
:
'10,'
,
realData
:
""
,
delay
:
'0,'
,
baseline
:
""
,
totaltime
:
'1837'
,
delay
:
""
,
next
:
'next:765,'
,
totalTime
:
""
,
valve
:
'5'
,
next
:
""
,
di_time
:
'1848'
,
valveNo
:
""
,
false
:
'0:0,'
,
diTime
:
""
,
peak
:
'4, 1, 46'
peak
:
""
,
})
});
// 次要数据面板
const
secondaryData
=
reactive
({
time
:
'784'
,
chamber
:
'6'
,
backwash
:
'0'
,
valleyValue
:
'3'
,
status
:
'212'
,
falseVal
:
'0'
})
// 表格数据
// 表格数据
const
peakValuesR
=
[
0
,
0
,
-
30
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
]
const
tableData
=
ref
([
const
peakValuesH
=
[
30
,
56
,
60
,
70
,
18
,
56
,
18
,
41
,
41
,
0
,
41
,
41
,
41
,
41
,
41
,
41
,
500
,
41
,
31
,
41
]
{
const
statusValues
=
Array
(
20
).
fill
(
'正常'
)
compartName
:
"默认"
,
statusValues
[
2
]
=
'故障'
peakValueR
:
0
,
statusValues
[
16
]
=
'故障'
peakValueH
:
0
,
status
:
0
,
const
backwashValues
=
[
0
,
15
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
]
blowBack
:
0
,
const
valleyValues
=
[
-
8
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
-
9
,
0
,
0
,
0
,
0
,
0
]
valleyValue
:
0
,
},
]);
// 时间控制
// 时间控制
const
timeInterval
=
ref
(
'10'
)
const
timeInterval
=
ref
(
"10"
);
const
togglePanel
=
()
=>
{
const
togglePanel
=
()
=>
{
isPanelOpen
.
value
=
!
isPanelOpen
.
value
isPanelOpen
.
value
=
!
isPanelOpen
.
value
;
}
};
// 格式化时间为 HH:MM:SS 格式
const
formatTime
=
(
date
)
=>
{
const
hours
=
date
.
getHours
().
toString
().
padStart
(
2
,
'0'
)
const
minutes
=
date
.
getMinutes
().
toString
().
padStart
(
2
,
'0'
)
const
seconds
=
date
.
getSeconds
().
toString
().
padStart
(
2
,
'0'
)
return
`
${
hours
}
:
${
minutes
}
:
${
seconds
}
`
}
// 初始化图表
// 初始化图表
const
initChart
=
()
=>
{
const
initChart
=
()
=>
{
if
(
chartInstance
)
{
if
(
chartInstance
)
{
chartInstance
.
dispose
()
chartInstance
.
dispose
()
;
}
}
// 初始化图表数据
// 初始化图表数据
initChartData
()
initChartData
();
};
chartInstance
=
echarts
.
init
(
chartRef
.
value
)
// updateChart()
// 启动定时更新
startRealTimeUpdates
()
}
// 初始化图表数据
// 初始化图表数据
const
initChartData
=
()
=>
{
const
initChartData
=
()
=>
{
const
now
=
new
Date
()
if
(
!
dusterNo
.
value
||
!
selectedDevice
.
value
)
{
chartData
.
xData
=
[]
console
.
warn
(
"缺少dusterNo或deviceNo,无法获取数据"
);
chartData
.
seriesData
=
[]
return
;
// 创建初始数据点,从5分钟前开始
for
(
let
i
=
300
;
i
>=
0
;
i
--
)
{
const
time
=
new
Date
(
now
.
getTime
()
-
i
*
1000
)
chartData
.
xData
.
push
(
formatTime
(
time
))
chartData
.
seriesData
.
push
(
generateRandomValue
())
}
}
}
// 生成一个介于 20-300 之间的随机值,模拟实时数据
// 获取昨天这个之前的数据
const
generateRandomValue
=
()
=>
{
const
startTime
=
moment
()
// 有10%的概率生成峰值
.
subtract
(
5
,
"minutes"
)
if
(
Math
.
random
()
<
0.1
)
{
.
format
(
"YYYY-MM-DD HH:mm:ss"
);
return
Math
.
floor
(
Math
.
random
()
*
200
)
+
200
// 200-400之间的峰值
const
endTime
=
moment
().
format
(
"YYYY-MM-DD HH:mm:ss"
);
}
chartData
.
xData
=
[];
return
Math
.
floor
(
Math
.
random
()
*
130
)
+
20
// 20-150之间的基础值
chartData
.
seriesData
=
[];
}
getMonitorToday
({
dusterNo
:
dusterNo
.
value
,
deviceNo
:
selectedDevice
.
value
,
startTime
:
startTime
,
endTime
:
endTime
,
})
.
then
((
res
)
=>
{
// 将data中的date和realData数据添加到chartData中,要求大数据量下速度快
if
(
res
.
data
&&
res
.
data
.
length
>
0
)
{
res
.
data
.
forEach
((
item
)
=>
{
chartData
.
xData
.
push
(
item
.
date
);
chartData
.
seriesData
.
push
(
item
.
realData
);
});
// 当前时间
currentTime
.
value
=
res
.
data
[
res
.
data
.
length
-
1
].
date
;
chartInstance
=
echarts
.
init
(
chartRef
.
value
);
// 启动定时更新
startRealTimeUpdates
();
}
else
{
console
.
warn
(
"未获取到初始数据"
);
}
})
.
catch
((
err
)
=>
{
console
.
error
(
"获取初始数据失败:"
,
err
);
});
};
// 更新图表
// 更新图表
const
updateChart
=
()
=>
{
const
updateChart
=
()
=>
{
if
(
chartInstance
)
{
if
(
chartInstance
)
{
chartInstance
.
setOption
(
getBagMonitoringChartOption
(
chartData
.
xData
,
chartData
.
seriesData
))
chartInstance
.
setOption
(
getBagMonitoringChartOption
(
chartData
.
xData
,
chartData
.
seriesData
)
);
}
}
}
}
;
// 启动实时更新
// 启动实时更新
const
startRealTimeUpdates
=
()
=>
{
const
startRealTimeUpdates
=
()
=>
{
if
(
updateTimer
)
{
if
(
updateTimer
)
{
clearInterval
(
updateTimer
)
clearInterval
(
updateTimer
)
;
}
}
updateTimer
=
setInterval
(()
=>
{
updateTimer
=
setInterval
(()
=>
{
// 添加新数据点
updateFunction
();
const
now
=
new
Date
()
},
1000
);
chartData
.
xData
.
push
(
formatTime
(
now
))
chartData
.
seriesData
.
push
(
generateRandomValue
())
showRealtimeDeviceStatus
=
true
;
};
// 移除最旧的数据点以保持固定长度
if
(
chartData
.
xData
.
length
>
31
)
{
// 保持30秒的数据
// 更新函数
chartData
.
xData
.
shift
()
const
updateFunction
=
()
=>
{
chartData
.
seriesData
.
shift
()
if
(
!
dusterNo
.
value
||
!
selectedDevice
.
value
)
return
;
// 从API获取实时数据
if
(
showRealtimeDeviceStatus
)
{
getMonitorRealtime
({
dusterNo
:
dusterNo
.
value
,
deviceNo
:
selectedDevice
.
value
,
})
.
then
((
res
)
=>
{
if
(
res
.
data
)
{
// 更新数据面板
if
(
res
.
data
.
realtimeCompart
)
{
tableData
.
value
=
res
.
data
.
realtimeCompart
;
}
if
(
res
.
data
.
realtimePanel
)
{
currentData
.
value
=
res
.
data
.
realtimePanel
;
}
}
})
.
catch
((
err
)
=>
{
console
.
error
(
"获取实时数据失败:"
,
err
);
});
}
// 结束时间往后推一秒
let
endTime
=
moment
(
new
Date
(
currentTime
.
value
))
.
add
(
1
,
"seconds"
)
.
format
(
"YYYY-MM-DD HH:mm:ss"
);
getMonitorToday
({
dusterNo
:
dusterNo
.
value
,
deviceNo
:
selectedDevice
.
value
,
startTime
:
currentTime
.
value
,
endTime
:
endTime
,
}).
then
((
res
)
=>
{
if
(
res
.
data
&&
res
.
data
.
length
>
0
)
{
const
item
=
res
.
data
[
res
.
data
.
length
-
1
];
chartData
.
xData
.
push
(
item
.
date
);
chartData
.
seriesData
.
push
(
item
.
realData
||
0
);
// 移除最旧的数据点以保持固定长度
if
(
chartData
.
xData
.
length
>
301
)
{
// 保持300秒的数据
chartData
.
xData
.
shift
();
chartData
.
seriesData
.
shift
();
}
currentTime
.
value
=
endTime
;
// 更新图表
updateChart
();
}
}
});
// 更新图表
};
updateChart
()
updateDataPanels
()
},
1000
)
isRealTimeMode
=
true
}
// 停止实时更新
// 停止实时更新
const
stopRealTimeUpdates
=
()
=>
{
const
stopRealTimeUpdates
=
()
=>
{
if
(
updateTimer
)
{
if
(
updateTimer
)
{
clearInterval
(
updateTimer
)
clearInterval
(
updateTimer
)
;
updateTimer
=
null
updateTimer
=
null
;
}
}
isRealTimeMode
=
false
showRealtimeDeviceStatus
=
false
;
}
}
;
// 向前导航(查看更早的数据)
// 向前导航(查看更早的数据)
const
navigateBackward
=
()
=>
{
const
navigateBackward
=
()
=>
{
// 关闭实时更新
// 不完全关闭轮询,只禁用实时设备状态获取
stopRealTimeUpdates
()
showRealtimeDeviceStatus
=
false
;
// 获取时间间隔(分钟)
// 获取时间间隔(分钟)
const
interval
=
parseInt
(
timeInterval
.
value
)
||
10
const
interval
=
parseInt
(
timeInterval
.
value
)
||
10
;
const
intervalMs
=
interval
*
60
*
1000
const
intervalMs
=
interval
*
60
*
1000
;
// 如果是第一次点击,以当前最后一条数据的时间为参考
// 如果是第一次点击,以当前最后一条数据的时间为参考
if
(
lastTimePoint
===
null
&&
chartData
.
xData
.
length
>
0
)
{
if
(
lastTimePoint
===
null
&&
chartData
.
xData
.
length
>
0
)
{
const
lastTimeString
=
chartData
.
xData
[
chartData
.
xData
.
length
-
1
]
const
lastTimeString
=
chartData
.
xData
[
chartData
.
xData
.
length
-
1
];
const
[
hours
,
minutes
,
seconds
]
=
lastTimeString
.
split
(
':'
).
map
(
Number
)
lastTimePoint
=
new
Date
(
lastTimeString
);
const
now
=
new
Date
()
lastTimePoint
=
new
Date
(
now
.
getFullYear
(),
now
.
getMonth
(),
now
.
getDate
(),
hours
,
minutes
,
seconds
)
}
else
if
(
lastTimePoint
===
null
)
{
}
else
if
(
lastTimePoint
===
null
)
{
// 如果没有数据,使用当前时间
// 如果没有数据,使用当前时间
lastTimePoint
=
new
Date
()
lastTimePoint
=
new
Date
()
;
}
}
// 计算新的时间范围
// 计算新的时间范围
const
endTime
=
new
Date
(
lastTimePoint
.
getTime
()
-
intervalMs
)
const
endTime
=
new
Date
(
lastTimePoint
.
getTime
()
-
intervalMs
)
;
lastTimePoint
=
endTime
lastTimePoint
=
endTime
;
// 重新生成数据
// 重新生成数据
generateHistoricalData
(
endTime
,
interval
)
generateHistoricalData
(
endTime
,
interval
)
;
}
}
;
// 向后导航(查看更近的数据)
// 向后导航(查看更近的数据)
const
navigateForward
=
()
=>
{
const
navigateForward
=
()
=>
{
//
关闭实时更新
//
不完全关闭轮询,只禁用实时设备状态获取
s
topRealTimeUpdates
()
s
howRealtimeDeviceStatus
=
false
;
// 获取时间间隔(分钟)
// 获取时间间隔(分钟)
const
interval
=
parseInt
(
timeInterval
.
value
)
||
10
const
interval
=
parseInt
(
timeInterval
.
value
)
||
10
;
const
intervalMs
=
interval
*
60
*
1000
const
intervalMs
=
interval
*
60
*
1000
;
// 如果是第一次点击,以当前最后一条数据的时间为参考
// 如果是第一次点击,以当前最后一条数据的时间为参考
if
(
lastTimePoint
===
null
&&
chartData
.
xData
.
length
>
0
)
{
if
(
lastTimePoint
===
null
&&
chartData
.
xData
.
length
>
0
)
{
const
lastTimeString
=
chartData
.
xData
[
chartData
.
xData
.
length
-
1
]
const
lastTimeString
=
chartData
.
xData
[
chartData
.
xData
.
length
-
1
];
const
[
hours
,
minutes
,
seconds
]
=
lastTimeString
.
split
(
':'
).
map
(
Number
)
lastTimePoint
=
new
Date
(
lastTimeString
);
const
now
=
new
Date
()
lastTimePoint
=
new
Date
(
now
.
getFullYear
(),
now
.
getMonth
(),
now
.
getDate
(),
hours
,
minutes
,
seconds
)
}
else
if
(
lastTimePoint
===
null
)
{
}
else
if
(
lastTimePoint
===
null
)
{
// 如果没有数据,使用当前时间
// 如果没有数据,使用当前时间
lastTimePoint
=
new
Date
()
lastTimePoint
=
new
Date
()
;
}
}
// 计算新的时间范围
// 计算新的时间范围
const
endTime
=
new
Date
(
lastTimePoint
.
getTime
()
+
intervalMs
)
const
endTime
=
new
Date
(
lastTimePoint
.
getTime
()
+
intervalMs
)
;
//
//
如果新的结束时间超过当前时间,则切换回实时模式
// 如果新的结束时间超过当前时间,则切换回实时模式
const
now
=
new
Date
()
const
now
=
moment
();
if
(
endTime
>
now
)
{
if
(
endTime
>
now
)
{
lastTimePoint
=
null
lastTimePoint
=
null
;
// startRealTimeUpdates()
showRealtimeDeviceStatus
=
true
;
return
return
;
}
}
lastTimePoint
=
endTime
lastTimePoint
=
endTime
;
// 重新生成数据
// 重新生成数据
generateHistoricalData
(
endTime
,
interval
)
generateHistoricalData
(
endTime
,
interval
)
;
}
}
;
const
reset
=
()
=>
{
const
reset
=
()
=>
{
// 清空现有数据
// 清空现有数据
chartData
.
xData
=
[]
chartData
.
xData
=
[];
chartData
.
seriesData
=
[]
chartData
.
seriesData
=
[];
lastTimePoint
=
null
lastTimePoint
=
null
;
// 恢复实时设备状态获取
showRealtimeDeviceStatus
=
true
;
// 重新生成当前时间往前300秒的数据
// 重新生成当前时间往前300秒的数据
const
now
=
new
Date
()
const
now
=
new
Date
();
generateHistoricalData
(
now
,
5
)
generateHistoricalData
(
now
,
5
);
// 开启实时更新
// 开启实时更新
startRealTimeUpdate
()
startRealTimeUpdate
()
;
}
}
;
// 开启实时更新(重置用)
// 开启实时更新(重置用)
const
startRealTimeUpdate
=
()
=>
{
const
startRealTimeUpdate
=
()
=>
{
// 确保之前的定时器已清除
// 确保之前的定时器已清除
stopRealTimeUpdates
()
stopRealTimeUpdates
();
// 初始化实时模式标志
isRealTimeMode
=
true
// 启动定时更新
// 启动定时更新
updateTimer
=
setInterval
(()
=>
{
updateTimer
=
setInterval
(()
=>
{
// 添加新数据点
updateFunction
();
const
now
=
new
Date
()
},
1000
);
chartData
.
xData
.
push
(
formatTime
(
now
))
};
chartData
.
seriesData
.
push
(
generateRandomValue
())
// 移除最旧的数据点以保持固定长度
if
(
chartData
.
xData
.
length
>
31
)
{
// 保持30秒的数据
chartData
.
xData
.
shift
()
chartData
.
seriesData
.
shift
()
}
// 更新图表
updateChart
()
updateDataPanels
()
},
1000
)
}
// 生成历史数据
// 生成历史数据
const
generateHistoricalData
=
(
endTime
,
intervalMinutes
)
=>
{
const
generateHistoricalData
=
(
endTime
,
intervalMinutes
)
=>
{
// 清空现有数据
if
(
!
dusterNo
.
value
||
!
selectedDevice
.
value
)
return
;
chartData
.
xData
=
[]
chartData
.
seriesData
=
[]
// 计算开始时间(结束时间减去间隔)
const
startTime
=
new
Date
(
endTime
.
getTime
()
-
intervalMinutes
*
60
*
1000
)
// 生成数据点(每秒一个)
for
(
let
time
=
new
Date
(
startTime
);
time
<=
endTime
;
time
=
new
Date
(
time
.
getTime
()
+
1000
))
{
chartData
.
xData
.
push
(
formatTime
(
time
))
chartData
.
seriesData
.
push
(
generateRandomValue
())
}
// 更新图表
updateChart
()
}
// 更新数据面板
// 清空现有数据
const
updateDataPanels
=
()
=>
{
chartData
.
xData
=
[];
// 随机更新当前数据面板的实时值
chartData
.
seriesData
=
[];
currentData
.
realValue
=
(
Math
.
random
()
*
30
+
10
).
toFixed
(
2
)
+
','
const
startTime
=
new
Date
(
endTime
.
getTime
()
-
intervalMinutes
*
60
*
1000
);
// 更新时间显示
const
startTimeStr
=
moment
(
startTime
).
format
(
"YYYY-MM-DD HH:mm:ss"
);
const
now
=
new
Date
()
const
endTimeStr
=
moment
(
endTime
).
format
(
"YYYY-MM-DD HH:mm:ss"
);
currentData
.
time
=
Math
.
floor
((
now
.
getTime
()
/
1000
)
%
1000
).
toString
()
// 从API获取历史数据
// 每10秒更新一次次要数据面板
getMonitorToday
({
if
(
now
.
getSeconds
()
%
1
===
0
)
{
dusterNo
:
dusterNo
.
value
,
secondaryData
.
time
=
Math
.
floor
((
now
.
getTime
()
/
1000
)
%
1000
).
toString
()
deviceNo
:
selectedDevice
.
value
,
secondaryData
.
valleyValue
=
Math
.
floor
(
Math
.
random
()
*
10
).
toString
()
startTime
:
startTimeStr
,
}
endTime
:
endTimeStr
,
}
})
.
then
((
res
)
=>
{
if
(
res
.
data
&&
res
.
data
.
length
>
0
)
{
res
.
data
.
forEach
((
item
)
=>
{
chartData
.
xData
.
push
(
item
.
date
);
chartData
.
seriesData
.
push
(
item
.
realData
);
});
// 更新图表
updateChart
();
}
})
.
catch
((
err
)
=>
{
console
.
error
(
"获取历史数据失败:"
,
err
);
});
};
// 监听窗口大小变化,调整图表大小
// 监听窗口大小变化,调整图表大小
const
handleResize
=
()
=>
{
const
handleResize
=
()
=>
{
if
(
chartInstance
)
{
if
(
chartInstance
)
{
chartInstance
.
resize
()
chartInstance
.
resize
()
;
}
}
}
};
const
getDeviceList
=
()
=>
{
if
(
!
dusterNo
.
value
)
return
;
getMonitorList
({
dusterNo
:
dusterNo
.
value
,
}).
then
((
res
)
=>
{
deviceList
.
value
=
res
.
data
.
devices
||
[];
if
(
deviceList
.
value
.
length
>
0
)
{
selectedDevice
.
value
=
deviceList
.
value
[
0
].
deviceNo
;
tableData
.
value
=
Array
.
from
(
{
length
:
res
.
data
.
compartCount
},
(
item
,
index
)
=>
({
compartName
:
`
${
index
+
1
}
仓`
,
peakValueR
:
0
,
peakValueH
:
0
,
status
:
0
,
blowBack
:
0
,
})
);
}
initChart
();
});
};
// 监听dusterNo变化
watch
(
dusterNo
,
(
newVal
)
=>
{
if
(
newVal
)
{
// 重新获取设备列表
getDeviceList
();
}
});
onMounted
(()
=>
{
onMounted
(()
=>
{
initChart
()
console
.
log
(
"dusterNo"
,
route
);
window
.
addEventListener
(
'resize'
,
handleResize
)
if
(
dusterNo
.
value
)
{
})
getDeviceList
();
}
window
.
addEventListener
(
"resize"
,
handleResize
);
});
onBeforeUnmount
(()
=>
{
onBeforeUnmount
(()
=>
{
window
.
removeEventListener
(
'resize'
,
handleResize
)
window
.
removeEventListener
(
"resize"
,
handleResize
);
// 清除定时器
// 清除定时器
if
(
updateTimer
)
{
if
(
updateTimer
)
{
clearInterval
(
updateTimer
)
clearInterval
(
updateTimer
)
;
updateTimer
=
null
updateTimer
=
null
;
}
}
// 销毁图表实例
// 销毁图表实例
if
(
chartInstance
)
{
if
(
chartInstance
)
{
chartInstance
.
dispose
()
chartInstance
.
dispose
()
;
chartInstance
=
null
chartInstance
=
null
;
}
}
})
})
;
</
script
>
</
script
>
<
style
scoped
lang=
"scss"
>
<
style
scoped
lang=
"scss"
>
...
@@ -435,15 +537,16 @@ onBeforeUnmount(() => {
...
@@ -435,15 +537,16 @@ onBeforeUnmount(() => {
width
:
100%
;
width
:
100%
;
height
:
calc
(
100%
-
14px
);
height
:
calc
(
100%
-
14px
);
box-sizing
:
border-box
;
box-sizing
:
border-box
;
overflow-x
:
hidden
;
// overflow-x: hidden;
position
:
relative
;
.header
{
.header
{
position
:
relative
;
position
:
relative
;
display
:
flex
;
display
:
flex
;
justify-content
:
center
;
justify-content
:
center
;
align-items
:
center
;
align-items
:
center
;
margin-bottom
:
1
0
px
;
margin-bottom
:
1
6
px
;
.select-container
{
.select-container
{
position
:
absolute
;
position
:
absolute
;
left
:
0
;
left
:
0
;
...
@@ -452,28 +555,28 @@ onBeforeUnmount(() => {
...
@@ -452,28 +555,28 @@ onBeforeUnmount(() => {
display
:
flex
;
display
:
flex
;
align-items
:
center
;
align-items
:
center
;
z-index
:
99
;
z-index
:
99
;
span
{
span
{
display
:
block
;
display
:
block
;
width
:
110px
;
width
:
110px
;
margin-right
:
10px
;
margin-right
:
10px
;
}
}
.device-number
{
.device-number
{
background
:
#fcf0c2
;
background
:
#fcf0c2
;
padding
:
2px
8px
;
padding
:
2px
8px
;
margin-left
:
10px
;
margin-left
:
10px
;
border-radius
:
4
px
;
border-radius
:
6
px
;
}
}
}
}
.title
{
.title
{
font-size
:
18px
;
font-size
:
18px
;
font-weight
:
bold
;
font-weight
:
bold
;
color
:
#409
EFF
;
color
:
#409
eff
;
}
}
}
}
.chart-container
{
.chart-container
{
width
:
100%
;
width
:
100%
;
height
:
calc
(
100%
-
350px
);
height
:
calc
(
100%
-
350px
);
...
@@ -481,106 +584,127 @@ onBeforeUnmount(() => {
...
@@ -481,106 +584,127 @@ onBeforeUnmount(() => {
border-radius
:
4px
;
border-radius
:
4px
;
display
:
flex
;
display
:
flex
;
flex-direction
:
column
;
flex-direction
:
column
;
position
:
relative
;
.chart-wrapper
{
.chart-wrapper
{
flex
:
1
;
flex
:
1
;
width
:
100%
;
width
:
100%
;
}
.no-data-text
{
width
:
100%
;
.data-panel
{
height
:
100%
;
position
:
absolute
;
top
:
80px
;
right
:
25px
;
width
:
320px
;
z-index
:
10
;
transition
:
transform
0
.3s
ease-in-out
;
&
.collapsed
{
transform
:
translateX
(
345px
);
}
.panel-toggle
{
position
:
absolute
;
width
:
25px
;
height
:
30px
;
background
:
#fff
;
top
:
1px
;
display
:
flex
;
display
:
flex
;
align-items
:
center
;
align-items
:
center
;
justify-content
:
center
;
justify-content
:
center
;
cursor
:
pointer
;
font-size
:
14px
;
color
:
#999
;
background-color
:
#f5f7fa
;
border-radius
:
4px
;
border-radius
:
4px
;
}
}
}
.no-data
{
position
:
absolute
;
top
:
0
;
left
:
0
;
width
:
100%
;
height
:
100%
;
z-index
:
10
;
}
}
.collapsed-icon
{
.data-panel
{
left
:
-23px
;
position
:
absolute
;
}
top
:
0px
;
.expanded-icon
{
right
:
0px
;
right
:
-23px
;
width
:
320px
;
}
z-index
:
100
;
transition
:
transform
0
.3s
ease-in-out
;
.data-box
{
padding
:
10px
;
&
.collapsed
{
background-color
:
rgba
(
255
,
255
,
255
,
0
.9
);
transform
:
translateX
(
345px
);
border-radius
:
4px
;
}
border
:
1px
solid
#ebeef5
;
box-shadow
:
0
2px
12px
0
rgba
(
0
,
0
,
0
,
0
.1
);
.panel-toggle
{
margin-bottom
:
10px
;
position
:
absolute
;
width
:
25px
;
.data-item
{
height
:
30px
;
display
:
flex
;
background
:
#fff
;
justify-content
:
space-between
;
top
:
1px
;
margin-bottom
:
5px
;
display
:
flex
;
font-size
:
14px
;
align-items
:
center
;
justify-content
:
center
;
div
{
cursor
:
pointer
;
flex
:
1
;
border-radius
:
4px
;
}
}
.collapsed-icon
{
left
:
-23px
;
}
.expanded-icon
{
right
:
-23px
;
}
.data-box
{
padding
:
10px
;
background-color
:
rgba
(
255
,
255
,
255
,
0
.9
);
border-radius
:
4px
;
border
:
1px
solid
#ebeef5
;
box-shadow
:
0
2px
12px
0
rgba
(
0
,
0
,
0
,
0
.1
);
margin-bottom
:
10px
;
.data-item
{
display
:
flex
;
justify-content
:
space-between
;
margin-bottom
:
5px
;
font-size
:
14px
;
div
{
flex
:
1
;
}
}
}
}
}
.second-box
{
font-size
:
12px
;
.second-box
{
}
font-size
:
12px
;
}
}
}
}
.data-table
{
.data-table
{
background-color
:
#fff
;
background-color
:
#fff
;
border-radius
:
4px
;
border-radius
:
4px
;
padding
:
10px
0
;
padding
:
10px
0
;
box-sizing
:
border-box
;
box-sizing
:
border-box
;
table
{
table
{
width
:
100%
;
width
:
100%
;
border-collapse
:
collapse
;
border-collapse
:
collapse
;
th
,
td
{
th
,
border
:
1px
solid
#EBEEF5
;
td
{
border
:
1px
solid
#ebeef5
;
text-align
:
center
;
text-align
:
center
;
padding
:
8px
;
padding
:
8px
;
font-size
:
14px
;
font-size
:
14px
;
}
}
th
{
th
{
background-color
:
#
F5F7FA
;
background-color
:
#
f5f7fa
;
color
:
#606266
;
color
:
#606266
;
}
}
.error
{
.error
{
color
:
#
F56C6C
;
color
:
#
f56c6c
;
}
}
.highlight
{
.highlight
{
background-color
:
#
FCF8E
3
;
background-color
:
#
fcf8e
3
;
position
:
relative
;
position
:
relative
;
&
:
:
after
{
&
:
:
after
{
content
:
""
;
content
:
""
;
position
:
absolute
;
position
:
absolute
;
width
:
16px
;
width
:
16px
;
height
:
16px
;
height
:
16px
;
background-color
:
#
E6A23C
;
background-color
:
#
e6a23c
;
border-radius
:
50%
;
border-radius
:
50%
;
top
:
50%
;
top
:
50%
;
left
:
50%
;
left
:
50%
;
...
@@ -589,17 +713,18 @@ onBeforeUnmount(() => {
...
@@ -589,17 +713,18 @@ onBeforeUnmount(() => {
}
}
}
}
}
}
.time-controls
{
.time-controls
{
margin-bottom
:
10px
;
margin-bottom
:
10px
;
display
:
flex
;
display
:
flex
;
align-items
:
center
;
align-items
:
center
;
justify-content
:
flex-end
;
justify-content
:
flex-end
;
.time-label
,
.time-unit
{
.time-label
,
.time-unit
{
margin
:
0
5px
;
margin
:
0
5px
;
}
}
.time-input
{
.time-input
{
width
:
60px
;
width
:
60px
;
}
}
...
@@ -607,4 +732,3 @@ onBeforeUnmount(() => {
...
@@ -607,4 +732,3 @@ onBeforeUnmount(() => {
}
}
}
}
</
style
>
</
style
>
\ No newline at end of file
src/views/dustMonitoring/components/healthyProgress.vue
View file @
eb1cbab7
...
@@ -9,7 +9,7 @@
...
@@ -9,7 +9,7 @@
class=
"healthy-progress-bar h-full transition-all duration-500 ease-out bg-gradient-to-r from-secondary to-green-400 diagonal-pattern diagonal-pattern-animation"
class=
"healthy-progress-bar h-full transition-all duration-500 ease-out bg-gradient-to-r from-secondary to-green-400 diagonal-pattern diagonal-pattern-animation"
></div>
></div>
<div
class=
"justify-between items-center mb-2 healthy-text-position"
>
<div
class=
"justify-between items-center mb-2 healthy-text-position"
>
<span
class=
"font-semibold"
>
健康度
</span>
<span
class=
"font-semibold"
>
健康度
:
</span>
<span
id=
"square-progress-value"
class=
"text-lg font-bold"
>
45%
</span>
<span
id=
"square-progress-value"
class=
"text-lg font-bold"
>
45%
</span>
</div>
</div>
</div>
</div>
...
...
src/views/dustMonitoring/components/warn.vue
View file @
eb1cbab7
<
template
>
<
template
>
<div
class=
"title layout1"
>
<div
class=
"title layout1"
>
<span
class=
"warn-title"
>
{{
title
}}
:
</span>
<span
class=
"warn-title"
>
告警
:
</span>
<
span
class=
"jump-icon"
>
>>
</span
>
<
!--
<span
class=
"jump-icon"
>
>>
</span>
--
>
</div>
</div>
<div
class=
"content"
>
<div
class=
"content"
>
<div
class=
"item"
v-for=
"item in listInfo"
:key=
"item"
>
<div
class=
"item"
v-for=
"item in listInfo"
:key=
"item"
>
...
@@ -45,12 +45,15 @@ const props = defineProps({
...
@@ -45,12 +45,15 @@ const props = defineProps({
width
:
100%
;
width
:
100%
;
display
:
flex
;
display
:
flex
;
align-items
:
center
;
align-items
:
center
;
margin-bottom
:
10
px
;
margin-bottom
:
5
px
;
padding
:
4px
0px
4px
2px
;
padding
:
4px
0px
4px
2px
;
box-shadow
:
rgba
(
53
,
58
,
62
,
0
.08
)
0px
1px
10px
0px
,
rgba
(
53
,
58
,
62
,
0
.08
)
0px
2px
4px
0px
;
box-shadow
:
rgba
(
53
,
58
,
62
,
0
.04
)
0px
1px
10px
0px
,
rgba
(
53
,
58
,
62
,
0
.04
)
0px
2px
4px
0px
;
font-size
:
14px
;
color
:
#333
;
img
{
img
{
width
:
20px
;
width
:
20px
;
height
:
auto
;
height
:
auto
;
margin-right
:
10px
;
}
}
}
}
}
}
...
...
src/views/dustMonitoring/index.vue
View file @
eb1cbab7
...
@@ -75,6 +75,7 @@
...
@@ -75,6 +75,7 @@
:class=
"item.healthStatus == 1 ? 'health' : 'warn'"
:class=
"item.healthStatus == 1 ? 'health' : 'warn'"
v-for=
"item in detailObj.compartHealthList[0]"
v-for=
"item in detailObj.compartHealthList[0]"
:key=
"item"
:key=
"item"
@
click=
"handleStatusDotClick()"
></div>
></div>
</div>
</div>
<div
class=
"part"
>
<div
class=
"part"
>
...
@@ -119,6 +120,7 @@
...
@@ -119,6 +120,7 @@
</
template
>
</
template
>
<
script
setup
>
<
script
setup
>
import
{
ref
,
reactive
,
onMounted
,
onUnmounted
,
watch
,
computed
}
from
"vue"
;
import
{
ref
,
reactive
,
onMounted
,
onUnmounted
,
watch
,
computed
}
from
"vue"
;
import
{
useRouter
}
from
"vue-router"
;
import
*
as
echarts
from
"echarts"
;
import
*
as
echarts
from
"echarts"
;
import
{
getDataFun
}
from
"@/request/method.js"
;
import
{
getDataFun
}
from
"@/request/method.js"
;
import
{
useUsersStore
}
from
"@/pinia/user.js"
;
import
{
useUsersStore
}
from
"@/pinia/user.js"
;
...
@@ -150,6 +152,7 @@ const option = {
...
@@ -150,6 +152,7 @@ const option = {
},
},
],
],
};
};
const
router
=
useRouter
();
const
chartInstance
=
reactive
({});
const
chartInstance
=
reactive
({});
const
chartData
=
reactive
([{},
{},
{}]);
const
chartData
=
reactive
([{},
{},
{}]);
const
initChart
=
(
instance
,
option
,
domEl
)
=>
{
const
initChart
=
(
instance
,
option
,
domEl
)
=>
{
...
@@ -548,6 +551,14 @@ const dusterName = computed(() => {
...
@@ -548,6 +551,14 @@ const dusterName = computed(() => {
return
dusterList
.
value
.
find
((
item
)
=>
item
.
dusterNo
==
form
.
dusterNo
)
return
dusterList
.
value
.
find
((
item
)
=>
item
.
dusterNo
==
form
.
dusterNo
)
?.
dusterName
;
?.
dusterName
;
});
});
const
handleStatusDotClick
=
()
=>
{
router
.
push
({
path
:
"/bag-monitor"
,
query
:
{
dusterNo
:
form
.
dusterNo
,
}
});
};
</
script
>
</
script
>
<
style
lang=
"scss"
scoped
>
<
style
lang=
"scss"
scoped
>
$borderColor
:
#bbbdc3
91
;
$borderColor
:
#bbbdc3
91
;
...
@@ -592,7 +603,7 @@ $borderColor: #bbbdc391;
...
@@ -592,7 +603,7 @@ $borderColor: #bbbdc391;
.part1
{
.part1
{
width
:
100%
;
width
:
100%
;
height
:
6
vh
;
height
:
5
vh
;
border-radius
:
6px
;
border-radius
:
6px
;
border
:
1px
solid
rgba
(
13
,
15
,
18
,
0
.1
);
border
:
1px
solid
rgba
(
13
,
15
,
18
,
0
.1
);
box-shadow
:
0px
3px
6px
0px
rgba
(
13
,
15
,
18
,
0
.1
);
box-shadow
:
0px
3px
6px
0px
rgba
(
13
,
15
,
18
,
0
.1
);
...
@@ -607,7 +618,7 @@ $borderColor: #bbbdc391;
...
@@ -607,7 +618,7 @@ $borderColor: #bbbdc391;
.part2
{
.part2
{
margin-top
:
10px
;
margin-top
:
10px
;
width
:
100%
;
width
:
100%
;
height
:
calc
(
5
7
vh
-
10px
);
height
:
calc
(
5
8
vh
-
10px
);
border-radius
:
6px
;
border-radius
:
6px
;
border
:
1px
solid
rgba
(
13
,
15
,
18
,
0
.1
);
border
:
1px
solid
rgba
(
13
,
15
,
18
,
0
.1
);
box-shadow
:
0px
3px
6px
0px
rgba
(
13
,
15
,
18
,
0
.1
);
box-shadow
:
0px
3px
6px
0px
rgba
(
13
,
15
,
18
,
0
.1
);
...
...
src/views/dustOverview/components/valveSettingDialog.vue
View file @
eb1cbab7
...
@@ -345,7 +345,7 @@ const handleConfirm = () => {
...
@@ -345,7 +345,7 @@ const handleConfirm = () => {
}
}
.valve-cell
{
.valve-cell
{
width
:
41px
;
min-
width
:
41px
;
background
:
white
;
background
:
white
;
padding
:
4px
8px
;
padding
:
4px
8px
;
border-radius
:
4px
;
border-radius
:
4px
;
...
@@ -368,7 +368,7 @@ const handleConfirm = () => {
...
@@ -368,7 +368,7 @@ const handleConfirm = () => {
.cell-value
{
.cell-value
{
display
:
flex
;
display
:
flex
;
justify-content
:
center
;
justify-content
:
center
;
align-items
:
end
;
align-items
:
baseline
;
font-size
:
16px
;
font-size
:
16px
;
color
:
#606266
;
color
:
#606266
;
span
{
span
{
...
...
src/views/dustOverview/index.vue
View file @
eb1cbab7
...
@@ -102,14 +102,15 @@
...
@@ -102,14 +102,15 @@
<
template
#
compartHealthList=
"{ row }"
>
<
template
#
compartHealthList=
"{ row }"
>
<div
class=
"status-matrix"
v-if=
"row.compartHealthList.length > 0"
>
<div
class=
"status-matrix"
v-if=
"row.compartHealthList.length > 0"
>
<div
<div
v-for=
"(
r
ow, rowIndex) in row.compartHealthList"
v-for=
"(
childR
ow, rowIndex) in row.compartHealthList"
:key=
"rowIndex"
:key=
"rowIndex"
class=
"matrix-row"
class=
"matrix-row"
>
>
<div
<div
v-for=
"(status, colIndex) in
r
ow"
v-for=
"(status, colIndex) in
childR
ow"
:key=
"colIndex"
:key=
"colIndex"
class=
"status-dot"
class=
"status-dot"
@
click=
"handleStatusDotClick(row, colIndex)"
:class=
"
{
:class=
"
{
'status-normal': status.healthStatus === 1,
'status-normal': status.healthStatus === 1,
'status-warning': status.healthStatus === 2,
'status-warning': status.healthStatus === 2,
...
@@ -175,6 +176,7 @@ import {
...
@@ -175,6 +176,7 @@ import {
postAddCompartAllocation
,
postAddCompartAllocation
,
postAddValveInfo
,
postAddValveInfo
,
}
from
"@/request/api/dustOverview"
;
}
from
"@/request/api/dustOverview"
;
import
{
useRouter
}
from
"vue-router"
;
import
{
getToken
}
from
"@/utils/auth"
;
import
{
getToken
}
from
"@/utils/auth"
;
import
CommonTable
from
"@/components/commonTable/index.vue"
;
import
CommonTable
from
"@/components/commonTable/index.vue"
;
import
{
ElMessageBox
,
ElMessage
}
from
"element-plus"
;
import
{
ElMessageBox
,
ElMessage
}
from
"element-plus"
;
...
@@ -182,6 +184,8 @@ import RoomSettingDialog from "./components/roomSettingDialog.vue";
...
@@ -182,6 +184,8 @@ import RoomSettingDialog from "./components/roomSettingDialog.vue";
import
ValveSettingDialog
from
"./components/valveSettingDialog.vue"
;
import
ValveSettingDialog
from
"./components/valveSettingDialog.vue"
;
import
AddDustCollectorDialog
from
"./components/addDustCollectorDialog.vue"
;
import
AddDustCollectorDialog
from
"./components/addDustCollectorDialog.vue"
;
const
router
=
useRouter
();
const
formInline
=
ref
({
const
formInline
=
ref
({
deviceName
:
""
,
deviceName
:
""
,
region
:
"all"
,
region
:
"all"
,
...
@@ -357,6 +361,15 @@ const handleValveNumClick = (row) => {
...
@@ -357,6 +361,15 @@ const handleValveNumClick = (row) => {
}
}
};
};
const
handleStatusDotClick
=
(
row
,
colIndex
)
=>
{
router
.
push
({
path
:
"/bag-monitor"
,
query
:
{
dusterNo
:
row
.
deviceNo
,
}
});
};
// 确认电磁阀设置
// 确认电磁阀设置
const
handleValveSettingConfirm
=
(
updatedStatusData
)
=>
{
const
handleValveSettingConfirm
=
(
updatedStatusData
)
=>
{
const
list
=
updatedStatusData
.
map
((
item
)
=>
{
const
list
=
updatedStatusData
.
map
((
item
)
=>
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment