Browse Source

感知事件检测

wangqin
zhoule 1 year ago
parent
commit
3b6557268f
  1. 39
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/dailyDisposal/assets/charts.js
  2. 86
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/dailyDisposal/index.vue
  3. 20
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/dayTotal/assets/charts.js
  4. 96
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/dayTotal/index.vue
  5. 24
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/eventQuery/assets/charts.js
  6. 297
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/eventQuery/assets/charts2.js
  7. 39
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/eventQuery/assets/charts3.js
  8. 594
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/eventQuery/index.vue
  9. 138
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/eventQuery/progressBar.vue
  10. 109
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/eventSource/assets/charts.js
  11. 141
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/eventSource/index.vue
  12. 20
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/monthStatistics/assets/charts.js
  13. 59
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/monthStatistics/index.vue
  14. 23
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/railway/assets/charts.js
  15. 139
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/railway/index.vue
  16. 23
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/railwayDay/assets/charts.js
  17. 25
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/railwayDay/index.vue
  18. 52
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/typeAnalysis/assets/charts.js
  19. 114
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/typeAnalysis/index.vue
  20. 2
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/index.vue

39
ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/dailyDisposal/assets/charts.js

@ -1,22 +1,22 @@
window.echartsData = [
{ value: 25, name: '处理中' },
{ value: 32, name: '待处理' },
{ value: 30, name: '已处理' },]
{ value: 40, name: '待处理' },
{ value: 35, name: '已处理' },]
window.colorList = [
"#FFee0B",
"#61D8FF",
"#6AE0BC",
]
]
window.count = 0;
echartsData.forEach((it)=>{
echartsData.forEach((it) => {
count += it.value;
})
})
var options = {
var options = {
color: colorList,
legend: {
orient: 'vertical',
@ -29,24 +29,23 @@ window.count = 0;
textStyle: {
color: "#fff",
fontSize: 12,
rich:{
rich: {
ast: {
align: "left",
fontSize: 12,
width:35,
width: 35,
},
bst: {
align: "left",
fontSize: 12,
marginLeft:20,
color:"#37E7FF"
marginLeft: 20,
color: "#37E7FF"
}
}
},
formatter: (params) => {
let obj = echartsData.filter(it=>{ return it.name == params})
console.log(obj);
return `{ast|${obj[0].name}} {bst|${Math.round(obj[0].value/count* 100) }%}`
let obj = echartsData.filter(it => { return it.name == params })
return `{ast|${obj[0].name}} {bst|${Math.round(obj[0].value)}%}`
},
data: echartsData?.map(x => x),
},
@ -64,7 +63,7 @@ window.count = 0;
position: 'outside',
fontSize: 16,
formatter: (params) => {
return `{a|${params.name}} {b|${params.value/count}%}`
return `{a|${params.name}} {b|${params.value / count}%}`
},
rich: {
a: {
@ -84,7 +83,7 @@ window.count = 0;
},
},
labelLine: {
show:false,
show: false,
length: 10,
length2: 30,
},
@ -96,7 +95,7 @@ window.count = 0;
}
}
})
},{
}, {
name: '',
type: 'pie',
radius: '90%',
@ -120,13 +119,13 @@ window.count = 0;
},
itemStyle: {
normal: {
opacity:0.3,
opacity: 0.3,
shadowColor: "rgba(0, 0, 0, 0.8)",
shadowBlur: 50,
},
},
labelLine: {
show:false,
show: false,
length: 10,
length2: 30,
},
@ -139,6 +138,6 @@ window.count = 0;
}
})
}]
};
};
export default options;
export default options;

86
ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/dailyDisposal/index.vue

@ -5,16 +5,16 @@
<div class="charts keep-ratio " id="dailyDisposal"></div>
</div>
</div>
</template>
</template>
<script>
<script>
import WgtTitle from '../../../widgets/title'
import * as echarts from "echarts";
import chartsStatistics from "./assets/charts";
import { getWarningStateDay } from '../../../../../../../api/event/perceiveEvent';
import WgtTitle from '../../../widgets/title'
import * as echarts from "echarts";
import chartsStatistics from "./assets/charts";
import { getWarningStateDay } from '../../../../../../../api/event/perceiveEvent';
const drawRoundRect = ( ctx, x, y, width, height, radius ,gr) => {
const drawRoundRect = (ctx, x, y, width, height, radius, gr) => {
// ctx, x, y, , ,
ctx.beginPath();
ctx.fillStyle = gr;
@ -23,14 +23,14 @@
ctx.arc(width - radius + x, radius + y, radius, Math.PI * 3 / 2, Math.PI * 2);
ctx.lineTo(width + x, height + y - radius);
ctx.arc(width - radius + x, height - radius + y, radius, 0, Math.PI * 1 / 2);
ctx.lineTo(radius + x, height +y);
ctx.lineTo(radius + x, height + y);
ctx.arc(radius + x, height - radius + y, radius, Math.PI * 1 / 2, Math.PI);
ctx.closePath();
//ctx.stroke();
ctx.fill()
}
export default {
export default {
name: 'dailyDisposal',
components: {
WgtTitle
@ -52,36 +52,36 @@
this.$nextTick(() => {
var myChart = echarts.init(document.getElementById('dailyDisposal'));
getWarningStateDay().then(res=>{
if ( res.code == 200 ) {
getWarningStateDay().then(res => {
if (res.code == 200) {
let data = res.data;
console.log(data);
if (data.lemgth > 0) {
window.echartsData = [];
for (let i = 0;i < data.length;i++){
for (let i = 0; i < data.length; i++) {
let it = data[i];
if ( it.warningState == 1 ) {
if (it.warningState == 1) {
echartsData.push({
name:"上报",
name: "上报",
value: it.number
});
}
if (it.warningState == 2 ) {
if (it.warningState == 2) {
echartsData.push({
name:"已完成",
name: "已完成",
value: it.number
});
}
if (it.warningState == 3 ) {
if (it.warningState == 3) {
echartsData.push({
name:"已终止",
name: "已终止",
value: it.number
});
}
if (it.warningState == 4 ) {
if (it.warningState == 4) {
echartsData.push({
name:"自动结束",
name: "自动结束",
value: it.number
});
@ -89,14 +89,12 @@
}
count = 0;
let count = 0;
echartsData.forEach((it)=>{
echartsData.forEach((it) => {
count += it.value;
})
console.log(echartsData);
chartsStatistics.legend.data = window.echartsData?.map(x => x);
chartsStatistics.series[0].data = echartsData.map((item, index) => {
return {
@ -115,6 +113,7 @@
}
})
}
}
myChart.setOption(chartsStatistics);
});
@ -127,7 +126,7 @@
// canvas
let canvas = document.createElement('canvas');
canvas.width = parentDiv.offsetWidth;
canvas.height =parentDiv.offsetHeight;
canvas.height = parentDiv.offsetHeight;
parentDiv.appendChild(canvas);
const context = canvas.getContext('2d');
@ -141,38 +140,39 @@
context.lineWidth = 1; // 线
//
drawRoundRect(context, 260, 50, 120, 24, 12,gr)
drawRoundRect(context, 260, 78, 120, 24, 12,gr)
drawRoundRect(context, 260, 106, 120, 24, 12,gr)
// drawRoundRect(context, 260, 50, 120, 24, 12, gr)
// drawRoundRect(context, 260, 78, 120, 24, 12, gr)
// drawRoundRect(context, 260, 106, 120, 24, 12, gr)
});
});
},
}
</script>
}
</script>
<style lang='scss' scoped>
.congestion {
<style lang='scss' scoped>
.congestion {
width: 100%;
.board{
height:200px;
.board {
height: 200px;
width: 100%;
padding: 0px 20px;
background: linear-gradient(180deg, rgba(6,66,88,0.2) 0%, #064258 100%);
background: linear-gradient(180deg, rgba(6, 66, 88, 0.2) 0%, #064258 100%);
border-radius: 5px 5px 5px 5px;
opacity: 1;
border: 1px solid;
border-image: linear-gradient(360deg, rgba(55, 231, 255,0.3), rgba(55, 231, 255, 0)) 1 1;
border-image: linear-gradient(360deg, rgba(55, 231, 255, 0.3), rgba(55, 231, 255, 0)) 1 1;
display: flex;
justify-content: space-between;
align-items: center;
}
}
.charts {
height:180px;
width: 100%;
}
}
</style>
.charts {
height: 180px;
width: 100%;
}
</style>

20
ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/dayTotal/assets/charts.js

@ -8,23 +8,13 @@ const sxnja = [
})
console.log(minArray)
let xaxisData = [
'1月',
'2月',
'3月',
'4月',
'5月',
'6月',
'7月',
'8月',
'9月',
'10月',
];
var options = {
title: {
text: '单位/%',
top: '4%',
left: '3%',
// text: '单位/%',
top: '0%',
left: '0%',
textStyle: {
fontSize: '10px',
fontWeight: 300,
@ -34,7 +24,7 @@ const sxnja = [
},
tooltip: {
valueFormatter: function (value) {
return (value + minNumber).toFixed(2) + ' %';
return (value + minNumber).toFixed(2);
}
},
grid: {
@ -100,7 +90,7 @@ const sxnja = [
],
series: [
{
name: '审限内结案率',
// name: '审限内结案率',
data: minArray,
type: 'pictorialBar',
symbol: 'roundRect',

96
ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/dayTotal/index.vue

@ -1,20 +1,20 @@
<template>
<div class='congestion'>
<WgtTitle :title="'日累计感知事件'"></WgtTitle>
<WgtTitle :title="'日累计感知事件趋势'"></WgtTitle>
<div class="board">
<div class="charts keep-ratio " id="daytotal"></div>
</div>
</div>
</template>
</template>
<script>
<script>
import WgtTitle from '../../../widgets/title'
import * as echarts from "echarts";
import chartsStatistics from "./assets/charts";
import { getDailyCumulative } from '../../../../../../../api/event/perceiveEvent';
import WgtTitle from '../../../widgets/title'
import * as echarts from "echarts";
import chartsStatistics from "./assets/charts";
import { getDailyCumulative } from '../../../../../../../api/event/perceiveEvent';
export default {
export default {
name: 'RailWayDay',
components: {
WgtTitle
@ -36,13 +36,58 @@
this.$nextTick(() => {
var myChart = echarts.init(document.getElementById('daytotal'));
getDailyCumulative().then(res=>{
if ( res.code == 200) {
getDailyCumulative().then(res => {
if (res.code == 200) {
let data = res.data;
let timer = [];
let number = [];
//
if(data.length < 1){
data = [
{
time: '00:00',
number: 800
},
{
time: '02:00',
number: 1000
},
{
time: '04:00',
number: 800
},
{
time: '06:00',
number: 700
},
{
time: '08:00',
number: 400
},
{
time: '10:00',
number: 1000
},
{
time: '12:00',
number: 800
},
{
time: '14:00',
number: 500
},
{
time: '16:00',
number: 800
},
{
time: '18:00',
number: 500
},
]
}
data.forEach((it)=>{
data.forEach((it) => {
timer.push(it.time);
number.push(it.number);
});
@ -58,31 +103,32 @@
});
});
},
}
</script>
}
</script>
<style lang='scss' scoped>
.congestion {
<style lang='scss' scoped>
.congestion {
width: 100%;
.board{
height:200px;
.board {
height: 200px;
width: 100%;
padding: 0px 20px;
background: linear-gradient(180deg, rgba(6,66,88,0.2) 0%, #064258 100%);
background: linear-gradient(180deg, rgba(6, 66, 88, 0.2) 0%, #064258 100%);
border-radius: 5px 5px 5px 5px;
opacity: 1;
border: 1px solid;
border-image: linear-gradient(360deg, rgba(55, 231, 255,0.3), rgba(55, 231, 255, 0)) 1 1;
border-image: linear-gradient(360deg, rgba(55, 231, 255, 0.3), rgba(55, 231, 255, 0)) 1 1;
display: flex;
justify-content: space-between;
align-items: center;
}
}
.charts {
height:180px;
width: 100%;
}
}
</style>
.charts {
height: 180px;
width: 100%;
}
</style>

24
ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/eventQuery/assets/charts.js

@ -1,8 +1,8 @@
/* 数据 */
let nameList = ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"]; // 类别
let valueList = [800, 520, 650, 950, 420, 600, 450, 720, 303, 503 , 203 ,703 , 903 ]; // 人数
var yList = [ "1000","800","轻度拥堵","基本畅通","畅通"]
let valueList = [800, 520, 650, 950, 420, 600, 450, 720, 303, 503, 203, 703, 903]; // 人数
// var yList = ["1000", "800", "轻度拥堵", "基本畅通", "畅通"]
/* 数据整合 */
let dataList = [];
nameList.map((item, index) => {
@ -32,7 +32,7 @@ nameList.map((item, index) => {
dataList.push({
name: item,
value: valueList[index],
itemStyle:{
itemStyle: {
borderRadius: 6
}
})
@ -41,11 +41,14 @@ nameList.map((item, index) => {
var options = {
grid: {
top: '5%',//上边距
top: '7%',//上边距
right: '0',//右边距
left: '0',//左边距
bottom: "0%",//下边距
bottom: "2%",//下边距
containLabel: true,
},
tooltip: {
},
xAxis: {
type: 'category',
@ -61,14 +64,14 @@ var options = {
axisLabel: {
show: true,
color: '#B6E6FF',
fontSize:8,
fontSize: 8,
fontFamily: 'Source Han Sans CN-Regular',
},
},
yAxis: [{
type: 'value',
name: "",
splitNumber:5,
splitNumber: 5,
nameTextStyle: {
color: '#B6E6FF',
fontSize: 13,
@ -99,7 +102,7 @@ var options = {
series: [{
type: 'bar',
data: dataList,
z:4,
z: 4,
itemStyle: {
color: {
type: 'linear',
@ -116,8 +119,9 @@ var options = {
},
borderRadius: [4, 4, 0, 0]
},
barWidth:10,
label: {show:false,
barWidth: 10,
label: {
show: false,
}
},
]

297
ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/eventQuery/assets/charts2.js

@ -1,155 +1,182 @@
import * as echarts from "echarts";
let data = [{
average:20,
typeName:'行人',
percent:0.2
},{
average:35,
typeName:'非机动车',
percent:0.25
},{
average:23,
typeName:'抛洒物',
percent:0.08
},{
average:20,
typeName:'烟火',
percent:0.14
},{
average:8,
typeName:'拥堵',
percent:0.14
},{
average:5,
typeName:'逆行',
percent:0.14
}]
let chartData = [],lengData=[], colorList = ['#50EED3', '#5DEF9E', '#29B3FF', '#FB5C38', '#FB5C38','#FCBB14'];
for (let i = 0; i < data.length; i++) {
let data = [
{
average: 10,
typeName: "交通拥堵",
percent: 0.1,
},
{
average: 11,
typeName: "行人",
percent: 0.11,
},
{
average: 12,
typeName: "非机动车",
percent: 0.12,
},
{
average: 13,
typeName: "停车",
percent: 0.13,
},
{
average: 5,
typeName: "倒车/逆行",
percent: 0.05,
},
{
average: 15,
typeName: "烟火",
percent: 0.15,
},
{
average: 10,
typeName: "撒落物",
percent: 0.1,
},
{
average: 10,
typeName: "异常天气",
percent: 0.1,
},
{
average: 14,
typeName: "护栏碰撞",
percent: 0.14,
},
];
let chartData = [],
lengData = [],
colorList = [
"#50EED3",
"#5DEF9E",
"#29B3FF",
"#FB5C38",
"#FB5C38",
"#FCBB14",
];
for (let i = 0; i < data.length; i++) {
chartData.push({
value: data[i].average,
name: data[i].typeName,
percent: data[i].percent,
color: colorList[i]
})
color: colorList[i],
});
lengData.push({
name: data[i].typeName,
color: colorList[i]
})
}
color: colorList[i],
});
}
let a = chartData.map(t=>{
t.value = parseInt(t.value)
return t
})
const sum = a.reduce((per, cur) => per + cur.value, 0);
const gap = (1 * sum) / 100;
const pieData1 = [];
const gapData = {
let a = chartData.map((t) => {
t.value = parseInt(t.value);
return t;
});
const sum = a.reduce((per, cur) => per + cur.value, 0);
const gap = (1 * sum) / 100;
const pieData1 = [];
const gapData = {
name: "",
value: gap,
itemStyle: {
color: "transparent",
},
};
let total = 0;
chartData.forEach((item) => {
};
let total = 0;
chartData.forEach((item) => {
total += parseInt(item.value);
});
});
for (let i = 0; i < chartData.length; i++) {
for (let i = 0; i < chartData.length; i++) {
// 第一圈数据
pieData1.push({
...chartData[i],
});
pieData1.push(gapData);
}
}
console.log(pieData1);
var options = {
console.log(pieData1);
var options = {
tooltip: {
confine: true,
textStyle: {
fontSize: 14 // 字体大小
fontSize: 14, // 字体大小
},
},
title:{ //圆环中间内容
text: '100%',
subtext: '类型分析',
left:"19%",
top:"40%",
textStyle:{
color:"#fff",
fontSize:26,
align:"center"
title: {
//圆环中间内容
text: "100%",
subtext: "类型分析",
left: "19%",
top: "40%",
textStyle: {
color: "#fff",
fontSize: 26,
align: "center",
},
subtextStyle: {
fontSize: 18,
fontWeight: '400',
fontWeight: "400",
top: -8,
align:"center",
color:'#fff'
align: "center",
color: "#fff",
},
},
color:['#50EED3', '#5F8EFE','#29B3FF', '#5DEF9E', '#FB5C38', '#FCBB14','#50EED3'],
color: colorList,
legend: {
top:'20%',
right: -10,
top: "15%",
right: -5,
orient: "vertical", //改变排列方式
icon: "circle", //改变legend小图标形状
itemGap: 20, // 设置legend的间距
itemWidth: 12, // 设置宽度
itemHeight: 12, // 设置高度
itemStyle:{
},
itemWidth: 10, // 设置宽度
itemHeight: 10, // 设置高度
textStyle: {
right: -19,
fontSize: 50,
fontSize: 30,
color: "#fff",
rich:{
a:{
width:45,
rich: {
a: {
width: 45,
fontSize: 12,
},
b:{
fontSize:14,
color:"#37E7FF",
marginLeft:-0,
}
b: {
fontSize: 14,
color: "#37E7FF",
marginLeft: -0,
},
},
},
itemStyle: {
borderColor: "transparent",
},
data: lengData,
formatter: function(name){
let total = 0
let target
formatter: function (name) {
let total = 0;
let target;
for (let i = 0; i < data.length; i++) {
total += data[i].average
if (data[i].typeName === name) {
target = data[i].average
total += data[i].average;
if (data[i].typeName == name) {
target = data[i].average;
}
}
var arr = [
'{a|' + name + '}',
'{b|' + ((target / total) * 100).toFixed(2) + '%}',
]
return arr.join(' ')
"{a|" + name + "}",
"{b|" + ((target / total) * 100).toFixed(2) + "%}",
];
return arr.join(" ");
},
},
series: [
{
name: '',
roseType: 'radius',
startAngle:-220,
avoidLabelOverlap: true,//防止标签重叠
type: 'pie',
radius: ['63%', '90%'], //大小
center : ['25%','50%'], //位置
name: "",
roseType: "radius",
startAngle: -220,
avoidLabelOverlap: true, //防止标签重叠
type: "pie",
radius: ["50%", "80%"], //大小
center: ["25%", "50%"], //位置
hoverAnimation: true,
itemStyle: {
normal: {
@ -159,87 +186,55 @@ let data = [{
},
},
labelLine: {
show:false,
show: false,
lineStyle: {
width: 3,
},
normal: {
length: 30, // 指示线长度
length2:80
length2: 80,
},
},
data: pieData1,
label: {
show: false,
formatter: function(params){ },
formatter: function (params) {},
textStyle: {
fontSize: '18',
fontWeight: 'bold',
color:'#fff'
fontSize: "18",
fontWeight: "bold",
color: "#fff",
},
rich: {
color0: {
color: '#D56383',
color: "#D56383",
},
color1: {
color: '#00FF95',
color: "#00FF95",
},
color3: {
color: '#FFE900',
color: "#FFE900",
},
color2: {
color: '#F5B157',
color: "#F5B157",
},
color4: {
color: '#1DA7FF',
color: "#1DA7FF",
},
color5: {
color: "#2967EA",
},
color5:{
color:'#2967EA'
}
},
},
emphasis: {
show: false,
},
},
// {
// type: 'gauge',
// zlevel: 0,
// splitNumber: 360,
// radius: '50%',
// center: ['25%', '50%'],
// startAngle: 90,
// endAngle: -269.9999,
// axisLine: {
// show: false,
// },
// axisTick: {
// show: false,
// },
// axisLabel: {
// show: false,
// },
// splitLine: {
// show: true,
// length:68,
// lineStyle: {
// width: 2,
// color: '#277DCA',
// },
// },
// pointer: {
// show: 0,
// },
// detail: {
// show: 0,
// },
// },
{
type: 'gauge',
type: "gauge",
zlevel: 2,
splitNumber: 185,
radius: '70%',
center: ['25%', '50%'],
radius: "70%",
center: ["25%", "50%"],
startAngle: 90,
endAngle: -269.9999,
axisLine: {
@ -253,10 +248,10 @@ let data = [{
},
splitLine: {
show: true,
length:2,
length: 2,
lineStyle: {
width: 1,
color: '#017383',
color: "#017383",
},
},
pointer: {
@ -266,7 +261,7 @@ let data = [{
show: 0,
},
},
]
};
],
};
export default options
export default options;

39
ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/eventQuery/assets/charts3.js

@ -13,23 +13,10 @@ let xData = [
"10月",
"11月",
"12月"
];
let data1 = [200, 530, 920, 400, 600, 700, 300, 800, 900, 120, 570, 800];
let options = {
];
let data1 = [200, 530, 920, 400, 600, 700, 300, 800, 900, 120, 570, 800];
let options = {
tooltip: {
show:false,
trigger: "axis",
axisPointer: {
// 坐标轴指示器,坐标轴触发有效
type: "shadow", // 默认为直线,可选为:'line' | 'shadow'
},
textStyle: {
color: "#fff",
fontSize: 14,
},
backgroundColor: "rgba(3, 31, 71, .0)", //设置背景颜色
borderColor: "rgba(3, 31, 71, .1)",
formatter: "健康监测<br>{b1}:{c1}人",
},
grid: {
left: "2%",
@ -102,13 +89,13 @@ let xData = [
series: [
// 下半截柱状图linear-gradient(180deg, #61D8FF 0%, #003B4E 100%); linear-gradient(180deg, #06D7B1 0%, #003B4E 100%)
{
name: "种植面积",
// name: "种植面积",
type: "bar",
barWidth: "10px",
barGap: "-100%",
selectedMode:true,
select:{
itemStyle:{
selectedMode: true,
select: {
itemStyle: {
opacity: 1,
color: function (params) {
var a = params;
@ -138,8 +125,8 @@ let xData = [
opacity: 0.6,
color: function (params) {
var a = params.name;
console.log("==========a=============",a);
if ( a == "6月" ) {
console.log("==========a=============", a);
if (a == "6月") {
return new echarts.graphic.LinearGradient(
0,
0,
@ -180,7 +167,7 @@ let xData = [
data: data1,
},
// 进度条的小圆圈
{
{
name: "小圈圈",
type: "scatter",
emphasis: {
@ -200,9 +187,9 @@ let xData = [
zlevel: 10,
data: data1,
animationDelay: 500
}
}
],
};
};
export default options;
export default options;

594
ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/eventQuery/index.vue

@ -1,66 +1,58 @@
<template>
<div class='congestion'>
<WgtTitle :title="'感知事件查询'" ></WgtTitle>
<div class="board">
<ProgressBar class="keep-ratio" @selectItem="selectProgress" :dataList="dataList" :selectIndex="7" />
<ProgressBar class="keep-ratio" @selectItem="selectProgress" :dataList="dataList" :selectIndex="selectId" />
<div class="searchPanel">
<el-select v-model="area" size="mini" class="selectRoad" placeholder="请选择">
<el-option
v-for="item in areaOptions"
:key="item.value"
:label="item.label"
:value="item.value">
<el-select v-model="area" size="mini" class="selectRoad" placeholder="请选择" default-first-option>
<el-option v-for="item in areaOptions" :key="item.value" :label="item.label" :value="item.value">
</el-option>
</el-select>
<el-select v-model="year" size="mini" class="selectRoad" placeholder="请选择">
<el-option
v-for="item in yearOptions"
:key="item.value"
:label="item.label"
:value="item.value">
<el-option v-for="item in yearOptions" :key="item.value" :label="item.label" :value="item.value">
</el-option>
</el-select>
<el-date-picker
size="mini"
v-if="year != 'quarter'"
class="selectRoad"
v-model="dateTime"
style="width:140px;"
:type="year"
placeholder="请选择"
/>
<el-quarter-picker size="mini" class="selectRoad" style="width:180px;" v-if="year == 'quarter'" v-model="dateTime" aria-placeholder="请选季度" />
<el-date-picker size="mini" v-if="year != 'quarter'" class="selectRoad" v-model="dateTime" style="width:140px;"
:type="year" placeholder="请选择" />
<el-quarter-picker size="mini" class="selectRoad" style="width:180px;" v-if="year == 'quarter'" v-model="dateTime"
aria-placeholder="请选季度" />
<el-button type="primary" size="mini" class="btnSearch" @click="searchQuery" icon="el-icon-search">查询</el-button>
<el-button class="btnReset" size="mini" icon="el-icon-refresh-left" >重置</el-button>
<el-button class="btnReset" size="mini" icon="el-icon-refresh-left" @click="onReset">重置</el-button>
</div>
</div>
<div class="body" >
<div id="chart1" class="keep-ratio" >
<div class="body">
<div>
<WgtTitle :title="'感知事件趋势分析'"></WgtTitle>
<div id="chart1" class="btnChart" />
</div>
<div id="chart2" class="keep-ratio" >
<div>
<WgtTitle :title="'感知事件类型分析'"></WgtTitle>
<div id="chart2" class="btnChart" />
</div>
<div id="chart3" class="keep-ratio" >
<div>
<WgtTitle :title="'桩号范围内事件分析趋势'"></WgtTitle>
<div id="chart3" class="btnChart" />
</div>
</div>
</div>
</template>
</template>
<script>
<script>
import WgtTitle from '../../../widgets/title'
import ProgressBar from './progressBar.vue';
import * as echarts from "echarts";
import chart1 from "./assets/charts";
import chart2 from "./assets/charts2";
import chart3 from "./assets/charts3";
import ElQuarterPicker from './ElQuarterPicker'
import { getWarningTrend,getWarningSectionType,getSectionMarkNumber,getRoadSectionList } from '../../../../../../../api/event/perceiveEvent';
import WgtTitle from '../../../widgets/title'
import ProgressBar from './progressBar';
import * as echarts from "echarts";
import chart1 from "./assets/charts";
import chart2 from "./assets/charts2";
import chart3 from "./assets/charts3";
import ElQuarterPicker from './ElQuarterPicker'
import { getWarningTrend, getWarningSectionType, getSectionMarkNumber, getRoadSectionList } from '../../../../../../../api/event/perceiveEvent';
const drawRoundRect = ( ctx, x, y, width, height, radius ,gr) => {
const drawRoundRect = (ctx, x, y, width, height, radius, gr) => {
// ctx, x, y, , ,
ctx.beginPath();
ctx.fillStyle = gr;
@ -69,14 +61,14 @@
ctx.arc(width - radius + x, radius + y, radius, Math.PI * 3 / 2, Math.PI * 2);
ctx.lineTo(width + x, height + y - radius);
ctx.arc(width - radius + x, height - radius + y, radius, 0, Math.PI * 1 / 2);
ctx.lineTo(radius + x, height +y);
ctx.lineTo(radius + x, height + y);
ctx.arc(radius + x, height - radius + y, radius, Math.PI * 1 / 2, Math.PI);
ctx.closePath();
//ctx.stroke();
ctx.fill()
}
export default {
export default {
name: 'EventQuery',
components: {
WgtTitle,
@ -85,11 +77,11 @@
},
data() {
return {
yearOptions:[
yearOptions: [
{
value: 'year',
label: '年'
},{
label: '年'
}, {
value: 'month',
label: '月'
},
@ -102,127 +94,132 @@
label: '季'
},],
areaOptions: [{
value: '0531',
label: '济南'
value: '1',
label: '济南方向'
}, {
value: '菏泽',
label: '菏泽'
value: '2',
label: '菏泽方向'
}],
dateTime:"",
area: '0531',
dataList:[
dateTime: "2024",
area: '1',
dataList: [
{
title:"殷家林枢纽"
title: "殷家林枢纽"
},
{
title:"大学城立交"
title: "大学城立交"
},
{
title:"长清立交"
title: "长清立交"
},
{
title:"松竹枢纽"
title: "松竹枢纽"
},
{
title:"孝里立交"
title: "孝里立交"
},
{
title:"平阴立交"
title: "平阴立交"
},
{
title:"孔村枢纽"
title: "孔村枢纽"
},
{
title:"平阴南立交"
title: "平阴南立交"
},
{
title:"魏雪枢纽"
title: "魏雪枢纽"
},
{
title:"东平立交"
title: "东平立交"
},
{
title:"东平湖枢纽"
title: "东平湖枢纽"
},
{
title:"韩岗立交"
title: "韩岗立交"
},
{
title:"梁山立交"
title: "梁山立交"
},
{
title:"鄄郓枢纽"
title: "鄄郓枢纽"
},
{
title:"嘉祥西立交"
title: "嘉祥西立交"
},
{
title:"王官屯枢纽"
title: "王官屯枢纽"
}
],
quarter:"",
selectId:1,
year:"year",
list:[
{name:'大学城-长清', direction:'济南方向', state:"正常",speed:'108.14km/h', follow:'161'},
{name:'大学城-长清', direction:'济南方向', state:"正常",speed:'108.14km/h', follow:'161'},
{name:'大学城-长清', direction:'济南方向', state:"正常",speed:'108.14km/h', follow:'161'},
{name:'大学城-长清', direction:'济南方向', state:"正常",speed:'108.14km/h', follow:'161'},
{name:'大学城-长清', direction:'济南方向', state:"正常",speed:'108.14km/h', follow:'161'},
{name:'大学城-长清', direction:'济南方向', state:"正常",speed:'108.14km/h', follow:'161'}
quarter: "",
selectId: 3,
year: "year",
list: [
{ name: '大学城-长清', direction: '济南方向', state: "正常", speed: '108.14km/h', follow: '161' },
{ name: '大学城-长清', direction: '济南方向', state: "正常", speed: '108.14km/h', follow: '161' },
{ name: '大学城-长清', direction: '济南方向', state: "正常", speed: '108.14km/h', follow: '161' },
{ name: '大学城-长清', direction: '济南方向', state: "正常", speed: '108.14km/h', follow: '161' },
{ name: '大学城-长清', direction: '济南方向', state: "正常", speed: '108.14km/h', follow: '161' },
{ name: '大学城-长清', direction: '济南方向', state: "正常", speed: '108.14km/h', follow: '161' }
]
}
},
created() {
},
methods: {
selectProgress(item){
selectProgress(item) {
this.selectId = item.id;
},
searchQuery(){
onReset() {
this.area = '1';
this.year = "year";
this.dateTime = '2024';
this.selectId = 1;
},
searchQuery() {
let dateTime = this.dateTime;
if ( dateTime == "" ) {
if (dateTime == "") {
this.$message.error('没有选日期参数!');
return
}
var quarter = 0;
if ( this.year == "year") {
if (this.year == "year") {
dateTime = new Date(dateTime);
dateTime = dateTime.getFullYear() + "-01-01 00:00:00";
console.log(dateTime);
}
if ( this.year == "month") {
if (this.year == "month") {
dateTime = new Date(dateTime);
let m = dateTime.getMonth()+1;
m = m < 10?"0"+m:m;
dateTime = dateTime.getFullYear() + "-" + m +"-01 00:00:00";
let m = dateTime.getMonth() + 1;
m = m < 10 ? "0" + m : m;
dateTime = dateTime.getFullYear() + "-" + m + "-01 00:00:00";
console.log(dateTime);
}
if ( this.year == "quarter" ) {
if (this.year == "quarter") {
console.log(dateTime);
dateTime = new Date(dateTime);
let m = dateTime.getMonth()+1;
if ( m == 1) m = 1;
if ( m == 2) m = 4;
if ( m == 3) m = 7;
if ( m == 4) m = 10;
let m = dateTime.getMonth() + 1;
if (m == 1) m = 1;
if (m == 2) m = 4;
if (m == 3) m = 7;
if (m == 4) m = 10;
quarter = m;
m = m < 10?"0"+m:m;
dateTime = dateTime.getFullYear() + "-" + m +"-01 00:00:00";
m = m < 10 ? "0" + m : m;
dateTime = dateTime.getFullYear() + "-" + m + "-01 00:00:00";
console.log(dateTime);
}
if ( this.year == "date" ) {
if (this.year == "date") {
this.year = "day";
dateTime = new Date(dateTime);
let m = dateTime.getMonth()+1;
m = m < 10?"0"+m:m;
let m = dateTime.getMonth() + 1;
m = m < 10 ? "0" + m : m;
let d = dateTime.getDate();
d = d < 10?"0"+d:d;
dateTime = dateTime.getFullYear() + "-" + m +"-"+d+" 00:00:00";
d = d < 10 ? "0" + d : d;
dateTime = dateTime.getFullYear() + "-" + m + "-" + d + " 00:00:00";
}
//
@ -230,57 +227,65 @@
"type": this.year,
"sectionId": this.selectId,
"createTime": dateTime,
"direction":1,
}).then(res=>{
console.log(res);
chart1.series[0].data = [];
if ( res.code == 200 ) {
"direction": this.area,
}).then(res => {
if (res.code == 200) {
let data = res.data;
if ( this.year == "year" ) {
let years = [];
chart1.series[0].data = [];
if (data.length > 0) {
const maxObject = data.reduce((prev, current) => (current.number > prev.number ? current : prev));
let xData = [];
let numbers = [];
data.forEach(it=>{
years.push(it.month+"月");
numbers.push(it.number);
})
chart1.xAxis.data = years;
chart1.series[0].data = numbers;
}
if ( this.year == "month" ) {
let months = [];
let numbers = [];
data.forEach(it=>{
months.push(it.day.split("-")[2]+"日");
numbers.push(it.number);
})
chart1.xAxis.data = months;
chart1.series[0].data = numbers;
data.forEach(it => {
if (this.year == "year") {
xData.push(it.month + "月");
}
if ( this.year == "day" ) {
let times = [];
let numbers = [];
data.forEach(it=>{
times.push(it.time.split(" ")[1]+"小时");
numbers.push(it.number);
})
chart1.xAxis.data = times;
chart1.series[0].data = numbers;
if (this.year == "month") {
xData.push(it.day.split("-")[2] + "日");
}
if (this.year == "day") {
xData.push(it.time.split(" ")[1] + "小时");
}
if (this.year == "quarter") {
xData.push(it.QUARTER);
}
if (it.number == maxObject.number) {
numbers.push({
value: it.number,
itemStyle: {
color: {
type: 'linear',
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [{
offset: 0, color: '#FFB904' // 0%
}, {
offset: 1, color: '#FF6969' // 100%
}],
global: false // false
},
borderRadius: 6
}
});
} else {
numbers.push({
value: it.number,
itemStyle: {
borderRadius: 6
}
});
}
if ( this.year == "quarter" ) {
let months = [];
let numbers = [];
data.forEach(it=>{
months.push(it.MONTH+"月");
numbers.push(it.number);
})
chart1.xAxis.data = months;
chart1.xAxis.data = xData;
chart1.series[0].data = numbers;
}
}
this.myChart1.setOption(chart1);
});
@ -289,69 +294,57 @@
"type": this.year,
"sectionId": this.selectId,
"createTime": dateTime,
"direction":1,
}).then(res=>{
console.log(res);
"direction": this.area,
}).then(res => {
chart2.series[0].data = [];
if ( res.code == 200 ) {
if (res.code == 200) {
let types = [];
let numbers = [];
const gapData = {
name: "",
value: 0.5,
itemStyle: {
color: "transparent",
},
};
let data = res.data.warningTypeList;
let total= res.data.total;
let total = res.data.total;
data.forEach((it)=>{
// 1- 2- 3- 4-5-/ 6-7-8- 9-
if ( it.warningType == 1) {
data.forEach((it) => {
if (it.warningType == 1) {
types.push("交通拥堵");
}
if ( it.warningType == 2) {
if (it.warningType == 2) {
types.push("行人");
}
if ( it.warningType == 3) {
if (it.warningType == 3) {
types.push("非机动车");
}
if ( it.warningType == 4) {
if (it.warningType == 4) {
types.push("停车");
}
if ( it.warningType == 5) {
if (it.warningType == 5) {
types.push("倒车/逆行");
}
if ( it.warningType == 6) {
if (it.warningType == 6) {
types.push("烟火");
}
if ( it.warningType == 7) {
if (it.warningType == 7) {
types.push("撒落物");
}
if ( it.warningType == 8) {
if (it.warningType == 8) {
types.push("异常天气");
}
if ( it.warningType == 9) {
if (it.warningType == 9) {
types.push("护栏碰撞");
}
numbers.push({
name:types[types.length - 1],
value:it.number
name: types[types.length - 1],
value: it.number
});
numbers.push(gapData);
})
console.log(types);
chart2.legend.data = types;
chart2.legend.formatter = function(name){
chart2.legend.formatter = function (name) {
let total = 0
let target
for (let i = 0; i < numbers.length; i++) {
total += numbers[i].value;
if (types[i] === name) {
if (types[i] == name) {
target = numbers[i].value;
}
}
@ -369,7 +362,7 @@
return
}
console.log(params);
chart2.title.text = Math.round(params.data.value/total * 100) + "%";
chart2.title.text = Math.round(params.data.value / total * 100) + "%";
chart2.title.subtext = params.data.name;
this.myChart2.setOption(chart2);
})
@ -389,20 +382,20 @@
"type": this.year,
"sectionId": this.selectId,
"createTime": dateTime,
"direction":1,
}).then(res=>{
console.log(res);
"direction": this.area,
}).then(res => {
chart3.series[0].data = [];
chart3.series[1].data = [];
if ( res.code == 200 ) {
if (res.code == 200) {
let data = res.data;
if ( this.year != "quarter" ) {
if (this.year != "quarter") {
let zhs = [];
let values = [];
data.forEach((it)=>{
console.log(it);
data.forEach((it) => {
if (it.sectionNumber > 0) {
values.push(it.sectionNumber);
zhs.push(it.stakeMarkId);
}
})
chart3.xAxis.data = zhs;
chart3.series[0].data = values;
@ -410,25 +403,27 @@
} else {
let zhs = [];
let values = [];
data.forEach((dt,i)=>{
dt.forEach((it)=>{
console.log(it);
if ( quarter == 1 && it.QUARTER == "第一季度") {
data.forEach((dt, i) => {
dt.forEach((it) => {
if (it.number > 0) {
if (quarter == 1 && it.QUARTER == "第一季度") {
values[i] = it.number;
zhs[i] = it.stakeMark;
}
if ( quarter == 4 && it.QUARTER == "第二季度") {
if (quarter == 4 && it.QUARTER == "第二季度") {
values[i] = it.number;
zhs[i] = it.stakeMark;
}
if ( quarter == 7 && it.QUARTER == "第三季度") {
if (quarter == 7 && it.QUARTER == "第三季度") {
values[i] = it.number;
zhs[i] = it.stakeMark;
}
if ( quarter == 10 && it.QUARTER == "第四季度") {
if (quarter == 10 && it.QUARTER == "第四季度") {
values[i] = it.number;
zhs[i] = it.stakeMark;
}
}
})
})
chart3.xAxis.data = zhs;
@ -439,7 +434,7 @@
this.myChart3.setOption(chart3);
})
if ( this.year == "day" )
if (this.year == "day")
this.year = "date";
},
},
@ -447,19 +442,28 @@
setTimeout(() => {
this.$nextTick(() => {
getRoadSectionList().then(res=>{
getRoadSectionList().then(res => {
console.log(res);
if ( res.code == 200 ) {
if (res.code == 200) {
let rows = res.rows;
this.dataList = [];
rows.forEach(it=>{
rows.forEach(it => {
this.dataList.push({
title:it.sectionName.split("-")[0],
id:it.id,
title: it.sectionName.split("-")[0],
id: it.id,
});
})
if (rows.length > 0) {
let lastRoad = rows[rows.length - 1].sectionName.split("-")[1];
this.dataList.push({
title: lastRoad,
id: rows[rows.length - 1].id,
});
}
}
this.searchQuery();
})
@ -481,146 +485,192 @@
// canvas
let canvas = document.createElement('canvas');
canvas.width = parentDiv.offsetWidth;
canvas.height =parentDiv.offsetHeight;
canvas.height = parentDiv.offsetHeight;
parentDiv.appendChild(canvas);
const context = canvas.getContext('2d');
//
var gr = context.createLinearGradient(247, 63, 450, 0);
//
gr.addColorStop(1, 'rgba(92,197,255,0)');
gr.addColorStop(0, 'rgba(92,197,255,0.5)');
context.lineWidth = 1; // 线
//
drawRoundRect(context, 300, 78, 160, 24, 12,gr)
var gr = context.createLinearGradient(240, 63, 450, 0);
//
gr.addColorStop(1, 'rgba(92,197,255,0)');
gr.addColorStop(0, 'rgba(92,197,255,0.5)');
drawRoundRect(context, 300, 148, 160, 24, 12,gr)
var gr = context.createLinearGradient(240, 63, 450, 0);
//
gr.addColorStop(1, 'rgba(92,197,255,0)');
gr.addColorStop(0, 'rgba(92,197,255,0.5)');
drawRoundRect(context, 300, 218, 160, 24, 12,gr)
var gr = context.createLinearGradient(400, 63, 450, 0);
//
//
gr.addColorStop(1, 'rgba(92,197,255,0)');
gr.addColorStop(0, 'rgba(92,197,255,0.5)');
// var gr = context.createLinearGradient(247, 63, 450, 0);
// gr.addColorStop(1, 'rgba(92,197,255,0)');
// gr.addColorStop(0, 'rgba(92,197,255,0.5)');
// drawRoundRect(context, 267, 57, 140, 24, 12, gr)
// //
// var gr = context.createLinearGradient(247, 63, 450, 0);
// gr.addColorStop(1, 'rgba(92,197,255,0)');
// gr.addColorStop(0, 'rgba(92,197,255,0.5)');
// drawRoundRect(context, 267, 108, 140, 24, 12, gr)
// //
// var gr = context.createLinearGradient(240, 63, 450, 0);
// gr.addColorStop(1, 'rgba(92,197,255,0)');
// gr.addColorStop(0, 'rgba(92,197,255,0.5)');
// drawRoundRect(context, 267, 157, 140, 24, 12, gr)
// //
// var gr = context.createLinearGradient(240, 63, 450, 0);
// gr.addColorStop(1, 'rgba(92,197,255,0)');
// gr.addColorStop(0, 'rgba(92,197,255,0.5)');
// drawRoundRect(context, 267, 208, 140, 24, 12, gr)
// //
// var gr = context.createLinearGradient(240, 63, 450, 0);
// gr.addColorStop(1, 'rgba(92,197,255,0)');
// gr.addColorStop(0, 'rgba(92,197,255,0.5)');
// drawRoundRect(context, 267, 258, 140, 24, 12, gr)
// //
// var gr = context.createLinearGradient(400, 63, 450, 0);
// gr.addColorStop(1, 'rgba(92,197,255,0)');
// gr.addColorStop(0, 'rgba(92,197,255,0.5)');
// drawRoundRect(context, 416, 57, 140, 24, 12, gr)
// //
// var gr = context.createLinearGradient(350, 63, 450, 0);
// gr.addColorStop(1, 'rgba(92,197,255,0)');
// gr.addColorStop(0, 'rgba(92,197,255,0.5)');
// drawRoundRect(context, 416, 108, 140, 24, 12, gr)
// //
// var gr = context.createLinearGradient(300, 63, 450, 0);
// gr.addColorStop(1, 'rgba(92,197,255,0)');
// gr.addColorStop(0, 'rgba(92,197,255,0.5)');
// drawRoundRect(context, 416, 157, 140, 24, 12, gr)
// //
// var gr = context.createLinearGradient(300, 63, 450, 0);
// gr.addColorStop(1, 'rgba(92,197,255,0)');
// gr.addColorStop(0, 'rgba(92,197,255,0.5)');
// drawRoundRect(context, 416, 208, 140, 24, 12, gr);
drawRoundRect(context, 460, 78, 160, 24, 12,gr)
var gr = context.createLinearGradient(350, 63, 450, 0);
//
gr.addColorStop(1, 'rgba(92,197,255,0)');
gr.addColorStop(0, 'rgba(92,197,255,0.5)');
drawRoundRect(context, 460, 148, 160, 24, 12,gr)
var gr = context.createLinearGradient(300, 63, 450, 0);
//
gr.addColorStop(1, 'rgba(92,197,255,0)');
gr.addColorStop(0, 'rgba(92,197,255,0.5)');
drawRoundRect(context, 460, 218, 160, 24, 12,gr)
});
});
},
}
</script>
}
</script>
<style lang='scss' scoped>
.congestion {
<style lang='scss' scoped>
.congestion {
width: 100%;
position: relative;
.body {
display: flex;
flex-direction: row;
align-items: center;
height: 320px;
width:100%;
justify-content: space-evenly;
font-size: 14px;
> div {
display: inline-flex;
height:100%;
width:33%;
margin-right:px;
background: linear-gradient(180deg, rgba(6,66,88,0) 0%, rgba(19, 39, 47, 0.9725490196) 93%);
padding: 10px;
>div {
width: 33%;
height: 470px;
background: linear-gradient(180deg, rgba(6, 66, 88, 0.2) 0%, #064258 100%);
border: 1px solid;
border-image: linear-gradient(360deg, rgba(55, 231, 255, 0.3), rgba(55, 231, 255, 0)) 1 1;
}
:nth-child(1) {
margin-right: 6px;
}
:nth-child(2) {
margin-left: 6px;
margin-right: 6px;
}
:nth-child(3) {
margin-left: 6px;
}
.btnChart {
height: 330px;
width: 90%;
margin: 95px auto 0;
}
}
.board{
height:100px;
.board {
height: 100px;
width: 100%;
padding:10px 20px;
background: linear-gradient(180deg, rgba(6,66,88,0.2) 0%, #064258 100%);
position: absolute;
top: 30px;
padding: 18px 20px;
// background: linear-gradient(180deg, rgba(6, 66, 88, 0.2) 0%, #064258 100%);
border-radius: 5px 5px 5px 5px;
opacity: 1;
border: 1px solid;
border-image: linear-gradient(360deg, rgba(55, 231, 255,0.3), rgba(55, 231, 255, 0)) 1 1;
// border: 1px solid;
// border-image: linear-gradient(360deg, rgba(55, 231, 255, 0.3), rgba(55, 231, 255, 0)) 1 1;
display: flex;
justify-content: space-between;
align-items: center;
flex-direction: column;
.searchPanel{
.searchPanel {
display: flex;
align-items: center;
height: 40px;
width:100%;
width: 100%;
font-size: 14px;
margin-top: 10px;
div{
div {
white-space: nowrap;
margin-right: 4px;
}
.inputZh{
.inputZh {
width: 47px;
::v-deep{
.el-input__inner{
::v-deep {
.el-input__inner {
background-color: #064258 !important;
border-width: 0px !important;
}
}
}
.inputJl{
.inputJl {
margin-left: 5px;
margin-right: 10px;
}
.selectRoad{
width:89px;
border:1px solid #00B3CC;
::v-deep{
.el-input__inner{
.selectRoad {
width: 100px;
border: 1px solid #00B3CC;
::v-deep {
.el-input__inner {
background-color: #064258 !important;
border-width: 0px !important;
}
}
}
.btnSearch{
.btnSearch {
background: linear-gradient(180deg, #005C79 0%, #009BCC 100%);
margin-left: 10px;
border-color: transparent;
}
.btnReset{
background: linear-gradient(180deg, #005C79 0%, #009BCC 100%);;
.btnReset {
background: linear-gradient(180deg, #005C79 0%, #009BCC 100%);
;
border-color: transparent;
color: white;
}
}
}
}
.charts {
height:100px;
width: 100%;
}
}
</style>
.charts {
height: 100px;
width: 100%;
}
</style>

138
ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/eventQuery/progressBar.vue

@ -1,77 +1,79 @@
<template>
<div class='congestion'>
<div :style="{width: dataList.length * 300}" >
<div :class="selectIndex == index?selectLine < 1?'item action Abefore':'item action Aafter':selectIndex + selectLine == index?selectLine < 1?'item action Aafter':'item action Abefore':'item'" v-for="(item,index) in dataList" :key="index" >
<i class="after" @click="selectItem(index,-1, dataList[index - 1])"></i>
<i class="before" @click="selectItem(index,+1,item)" ></i>
<div :style="{ width: dataList.length * 300 }">
<div :class="selectIndex == index ? selectLine < 1 ? 'item action Abefore' : 'item action Aafter' : selectIndex + selectLine == index ? selectLine < 1 ? 'item action Aafter' : 'item action Abefore' : 'item'"
v-for="(item, index) in dataList" :key="index">
<i class="after" @click="selectItem(index, -1, dataList[index - 1])"></i>
<i class="before" @click="selectItem(index, +1, item)"></i>
<span></span>
<div>{{ item.title }}</div>
</div>
</div>
</div>
</template>
</template>
<script>
import { number } from 'echarts';
<script>
export default {
export default {
name: 'ProgressBar',
components: {
},
props:{
dataList:{
type:Array,
props: {
dataList: {
type: Array,
default: () => {
return []
}
},
selectIndex: {
type: Number,
default: 1
}
},
data() {
return {
selectIndex:0,
selectLine:-1,
// selectIndex: 0,
selectLine: -1,
}
},
created() {
},
methods: {
selectItem(index,num,item){
selectItem(index, num, item) {
this.selectIndex = index;
this.selectLine = num;
if ( item )
this.$emit("selectItem",item);
if (item)
this.$emit("selectItem", item);
}
},
mounted() {
},
}
</script>
}
</script>
<style lang='scss' scoped>
.congestion {
<style lang='scss' scoped>
.congestion {
width: 100%;
height:35px;
height: 35px;
display: inline-flex;
flex-direction: row;
> div {
>div {
position: relative;
width: 100%;
height:35px;
height: 35px;
display: inline-flex;
flex-direction: row;
>.item .after {
position: absolute;
display: inline-flex;
left:0px;
top:-5px;
width:45px !important;
height:35px !important;
left: 0px;
top: -5px;
width: 45px !important;
height: 35px !important;
background-color: transparent;
cursor: pointer;
}
@ -80,20 +82,20 @@ import { number } from 'echarts';
content: "";
position: absolute;
display: inline-flex;
left:0px;
top:8px;
width:45px !important;
height:3px !important;
left: 0px;
top: 8px;
width: 45px !important;
height: 3px !important;
background-color: #C7C7C7;
}
>.item .before {
position: absolute;
display: inline-flex;
right:0px;
top:-5px;
width:45px;
height:35px;
right: 0px;
top: -5px;
width: 45px;
height: 35px;
background-color: transparent;
cursor: pointer;
}
@ -102,55 +104,55 @@ import { number } from 'echarts';
content: "";
position: absolute;
display: inline-flex;
left:0px;
top:8px;
width:45px !important;
height:3px !important;
left: 0px;
top: 8px;
width: 45px !important;
height: 3px !important;
background-color: #C7C7C7;
}
.item.action .after::after {
background-color: #72FDC9 ;
background-color: #72FDC9;
}
.item.action.Aafter .after::after{
.item.action.Aafter .after::after {
background-color: #C7C7C7 !important;
}
> .item.action.Aafter .before::after {
background-color: #72FDC9 ;
>.item.action.Aafter .before::after {
background-color: #72FDC9;
}
> .item.action.Abefore .after::after {
background-color: #72FDC9 ;
>.item.action.Abefore .after::after {
background-color: #72FDC9;
}
> .bef::before {
>.bef::before {
background-color: #72FDC9 !important;
}
> .aft::after {
>.aft::after {
background-color: #72FDC9 !important;
}
> .item.action span {
background-color: #72FDC9 ;
>.item.action span {
background-color: #72FDC9;
cursor: pointer;
}
> .item.action span::after {
border-color: #72FDC9 ;
>.item.action span::after {
border-color: #72FDC9;
}
> .action div {
color:#72FDC9 !important;
>.action div {
color: #72FDC9 !important;
}
>.item {
position: relative;
width: 113px;
height:35px;
height: 35px;
display: inline-flex;
flex-direction: column;
justify-items: center;
@ -158,40 +160,40 @@ import { number } from 'echarts';
>span {
position: absolute;
display:inline-flex;
display: inline-flex;
width: 9px;
height: 9px;
background: #C7C7C7;
border-radius: 50%;
opacity: 1;
left:53px;
left: 53px;
}
>div {
position: relative;
display:inline-flex;
width:100%;
display: inline-flex;
width: 100%;
align-items: center;
justify-content: center;
top: 5px;
margin-top:10px;
color:#C7C7C7;
margin-top: 10px;
color: #C7C7C7;
}
>span::after {
content: "";
position: absolute;
display:inline-flex;
display: inline-flex;
width: 15px;
height: 15px;
border:1px solid #C7C7C7;
border: 1px solid #C7C7C7;
border-radius: 50%;
opacity: 1;
top:-3.5px;
left:-3px;
}
top: -3.5px;
left: -3px;
}
}
}
</style>
}
</style>

109
ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/eventSource/assets/charts.js

@ -1,24 +1,24 @@
let data = [{
average:30,
typeName:'视频识别',
percent:0.2
},{
average:25,
typeName:'雷达识别',
percent:0.25
},{
average:15,
typeName:'锥桶',
percent:0.08
},{
average:30,
typeName:'护栏碰撞',
percent:0.14
average: 30,
typeName: '视频识别',
percent: 0.2
}, {
average: 25,
typeName: '雷达识别',
percent: 0.25
}, {
average: 15,
typeName: '锥桶',
percent: 0.08
}, {
average: 30,
typeName: '护栏碰撞',
percent: 0.14
}]
window.mainData = data;
let chartData = [],lengData=[], colorList = ['#006EDF', '#00FF00', '#FFC30D', '#FF8400', '#1DA7FF','#2967EA'];
let chartData = [], lengData = [], colorList = ['#006EDF', '#00FF00', '#FFC30D', '#FF8400', '#1DA7FF', '#2967EA'];
for (let i = 0; i < data.length; i++) {
chartData.push({
value: data[i].average,
@ -32,7 +32,7 @@ for (let i = 0; i < data.length; i++) {
})
}
let a = chartData.map(t=>{
let a = chartData.map(t => {
t.value = parseInt(t.value)
return t
})
@ -58,40 +58,39 @@ for (let i = 0; i < chartData.length; i++) {
});
pieData1.push(gapData);
}
console.log(pieData1);
var options = {
tooltip: {
confine: true,
textStyle: {
fontSize: 10, // 字体大小
color:'#333',
color: '#333',
},
color:'#333',
backgroundColor:"#ffffff",
color: '#333',
backgroundColor: "#ffffff",
},
title:{ //圆环中间内容
title: { //圆环中间内容
text: '99% ',
subtext: ' 占比',
left:"22%",
top:"40%",
textStyle:{
color:"#fff",
fontSize:21,
align:"center"
left: "22%",
top: "40%",
textStyle: {
color: "#fff",
fontSize: 21,
align: "center"
},
subtextStyle: {
fontSize: 13,
fontWeight: '400',
top: 0,
marginLeft:20,
align:"center",
color:'#fff'
marginLeft: 20,
align: "center",
color: '#fff'
},
},
color:['#5973FF', '#14d8b4', '#FFC30D', '#61D8FF', '#1DA7FF','#2967EA'],
color: ['#5973FF', '#14d8b4', '#FFC30D', '#61D8FF', '#1DA7FF', '#2967EA'],
legend: {
top:'20%',
top: '20%',
right: 0,
orient: "vertical", //改变排列方式
icon: "circle", //改变legend小图标形状
@ -101,15 +100,15 @@ var options = {
textStyle: {
fontSize: 12,
color: "#fff",
rich:{
a:{
rich: {
a: {
fontSize: 12,
},
b:{
b: {
fontSize: 12,
padding: 5,
marginLeft:5,
color:"#37E7FF",
marginLeft: 5,
color: "#37E7FF",
}
},
},
@ -117,20 +116,20 @@ var options = {
borderColor: "transparent",
},
data: lengData,
formatter: function(name){
formatter: function (name) {
let total = 0
let target
if ( !mainData ) return "";
let target = 0
if (!mainData) return "";
for (let i = 0; i < data.length; i++) {
if ( window.mainData[i] ) {
total += window.mainData[i].value
if ( window.mainData[i].name === name) {
target = window.mainData[i].value
if (window.mainData[i]) {
total += window.mainData[i].percent
if (window.mainData[i].typeName === name) {
target = window.mainData[i].percent
}
}
}
var arr = [
'{a|' + name + '}',
'{a|' + name + (name.length == 4 ? '}' : '} '),
'{b|' + ((target / total) * 100).toFixed(2) + '%}',
]
return arr.join(' ')
@ -143,7 +142,7 @@ var options = {
avoidLabelOverlap: true,//防止标签重叠
type: 'pie',
radius: ['63%', '73%'], //大小
center : ['30%','50%'], //位置
center: ['30%', '50%'], //位置
hoverAnimation: true,
itemStyle: {
normal: {
@ -153,23 +152,23 @@ var options = {
},
},
labelLine: {
show:false,
show: false,
lineStyle: {
width: 3,
},
normal: {
length: 30, // 指示线长度
length2:80
length2: 80
},
},
data: pieData1,
label: {
show: false,
formatter: function(params){ },
formatter: function (params) { },
textStyle: {
fontSize: '18',
fontWeight: 'bold',
color:'#fff'
color: '#fff'
},
rich: {
color0: {
@ -187,8 +186,8 @@ var options = {
color4: {
color: '#1DA7FF',
},
color5:{
color:'#2967EA'
color5: {
color: '#2967EA'
}
},
},
@ -215,7 +214,7 @@ var options = {
},
splitLine: {
show: true,
length:68,
length: 68,
lineStyle: {
width: 2,
color: '#277DCA',
@ -247,7 +246,7 @@ var options = {
},
splitLine: {
show: true,
length:2,
length: 2,
lineStyle: {
width: 1,
color: '#017383',

141
ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/eventSource/index.vue

@ -5,16 +5,32 @@
<div class="charts keep-ratio " id="eventSource"></div>
</div>
</div>
</template>
<script>
import WgtTitle from '../../../widgets/title'
import * as echarts from "echarts";
import chartsStatistics from "./assets/charts";
import { getWarningSourceGroup } from '../../../../../../../api/event/perceiveEvent';
export default {
</template>
<script>
import WgtTitle from '../../../widgets/title'
import * as echarts from "echarts";
import chartsStatistics from "./assets/charts";
import { getWarningSourceGroup } from '../../../../../../../api/event/perceiveEvent';
const drawRoundRect = (ctx, x, y, width, height, radius, gr) => {
// ctx, x, y, , ,
ctx.beginPath();
ctx.fillStyle = gr;
ctx.arc(x + radius, y + radius, radius, Math.PI, Math.PI * 3 / 2);
ctx.lineTo(width - radius + x, y);
ctx.arc(width - radius + x, radius + y, radius, Math.PI * 3 / 2, Math.PI * 2);
ctx.lineTo(width + x, height + y - radius);
ctx.arc(width - radius + x, height - radius + y, radius, 0, Math.PI * 1 / 2);
ctx.lineTo(radius + x, height + y);
ctx.arc(radius + x, height - radius + y, radius, Math.PI * 1 / 2, Math.PI);
ctx.closePath();
//ctx.stroke();
ctx.fill()
}
export default {
name: 'EventSource',
components: {
WgtTitle
@ -29,73 +45,73 @@
},
methods: {
changeReisze(){
changeReisze() {
this.myChart.resize();
},
},
mounted() {
setTimeout(() => {
let currentIndex = -1;
this.$nextTick(() => {
var myChart = echarts.init(document.getElementById('eventSource'));
getWarningSourceGroup().then((res)=>{
if ( res.code == 200 ) {
console.log("=================",res);
getWarningSourceGroup().then((res) => {
if (res.code == 200) {
let data = res.data.warningSourceList;
let total = res.data.total;
if (data.length > 0) {
let warningTypes = [];
let number = [];
data.forEach(it=>{
if ( it.warningSource == 1) {
data.forEach((it, index )=> {
if (it.warningSource == 1) {
warningTypes.push('交通拥堵');
}
if ( it.warningSource == 2) {
if (it.warningSource == 2) {
warningTypes.push('行人');
}
if ( it.warningSource == 3) {
if (it.warningSource == 3) {
warningTypes.push('非机动车');
}
if ( it.warningSource == 4) {
if (it.warningSource == 4) {
warningTypes.push('停车');
}
if ( it.warningSource == 5) {
if (it.warningSource == 5) {
warningTypes.push('倒车/逆行');
}
if ( it.warningSource == 6) {
if (it.warningSource == 6) {
warningTypes.push('烟火');
}
if ( it.warningSource == 7) {
if (it.warningSource == 7) {
warningTypes.push('撒落物');
}
if ( it.warningSource == 8) {
if (it.warningSource == 8) {
warningTypes.push('异常天气');
}
if ( it.warningSource == 9) {
if (it.warningSource == 9) {
warningTypes.push('护栏碰撞');
}
number.push(it.number);
// drawRoundRect(context, 241, 37 + (index * 27), 134, 20, 12, gr);
})
let colorList = ['#006EDF', '#00FF00', '#FFC30D', '#FF8400', '#1DA7FF','#2967EA'];
let colorList = ['#006EDF', '#00FF00', '#FFC30D', '#FF8400', '#1DA7FF', '#2967EA'];
let lengData = [];
let mainData = [];
let mainCount = 0;
for (let j =0;j < number.length;j++){
mainCount+= number[j];
for (let j = 0; j < number.length; j++) {
mainCount += number[j];
}
for (let i = 0;i < warningTypes.length;i++){
for (let i = 0; i < warningTypes.length; i++) {
let it = warningTypes[i];
lengData.push({
name:it,
color:colorList[i],
value:number[i],
name: it,
color: colorList[i],
value: number[i],
});
mainData.push({
name:it,
color:colorList[i],
value:number[i],
percent: number[i]/mainCount
name: it,
color: colorList[i],
value: number[i],
percent: number[i] / mainCount
})
}
window.mainData = mainData;
@ -107,7 +123,6 @@
if (params.componentType == 'graphic') {
return
}
console.log(params);
chartsStatistics.title.text = params.percent + "%";
chartsStatistics.title.subtext = params.data.name;
chartsStatistics.title.left = "22%";
@ -122,39 +137,63 @@
myChart.setOption(chartsStatistics);
})
}
}
myChart.setOption(chartsStatistics);
})
const domMap = document.getElementById("eventSource");
let parentDiv = domMap.firstChild;
// canvas
let canvas = document.createElement('canvas');
canvas.width = parentDiv.offsetWidth;
canvas.height = parentDiv.offsetHeight;
parentDiv.appendChild(canvas);
const context = canvas.getContext('2d');
//
let gr = context.createLinearGradient(247, 63, 450, 0);
gr.addColorStop(1, 'rgba(92,197,255,0)');
gr.addColorStop(0, 'rgba(92,197,255,0.3)');
// drawRoundRect(context, 241, 37, 134, 20, 12, gr);
// drawRoundRect(context, 241, 64, 134, 20, 12, gr);
// drawRoundRect(context, 241, 91, 134, 20, 12, gr);
// drawRoundRect(context, 241, 118, 134, 20, 12, gr);
context.lineWidth = 1; // 线
this.myChart = myChart;
});
});
},
}
</script>
}
</script>
<style lang='scss' scoped>
.congestion {
<style lang='scss' scoped>
.congestion {
width: 100%;
.board{
height:200px;
.board {
height: 200px;
width: 100%;
padding: 40px 40px;
background: linear-gradient(180deg, rgba(6,66,88,0.2) 0%, #064258 100%);
background: linear-gradient(180deg, rgba(6, 66, 88, 0.2) 0%, #064258 100%);
border-radius: 5px 5px 5px 5px;
opacity: 1;
border: 1px solid;
border-image: linear-gradient(360deg, rgba(55, 231, 255,0.3), rgba(55, 231, 255, 0)) 1 1;
border-image: linear-gradient(360deg, rgba(55, 231, 255, 0.3), rgba(55, 231, 255, 0)) 1 1;
display: flex;
justify-content: space-between;
align-items: center;
}
}
.charts {
height:180px;
width: 100%;
}
}
</style>
.charts {
height: 180px;
width: 100%;
}
</style>

20
ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/monthStatistics/assets/charts.js

@ -30,14 +30,14 @@ var options = {
// 'image://data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/PjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCI+PHN2ZyB0PSIxNTg2NDg1MzkzMjI2IiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjQ3MzUiIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCI+PGRlZnM+PHN0eWxlIHR5cGU9InRleHQvY3NzIj48L3N0eWxlPjwvZGVmcz48cGF0aCBkPSJNNTEyIDBDMjI2Ljc0Mjg1NyAwIDAgMjI2Ljc0Mjg1NyAwIDUxMnMyMjYuNzQyODU3IDUxMiA1MTIgNTEyIDUxMi0yMjYuNzQyODU3IDUxMi01MTItMjI2Ljc0Mjg1Ny01MTItNTEyLTUxMnogbTAgODc3LjcxNDI4NmMtMjA0LjggMC0zNjUuNzE0Mjg2LTE2MC45MTQyODYtMzY1LjcxNDI4Ni0zNjUuNzE0Mjg2czE2MC45MTQyODYtMzY1LjcxNDI4NiAzNjUuNzE0Mjg2LTM2NS43MTQyODYgMzY1LjcxNDI4NiAxNjAuOTE0Mjg2IDM2NS43MTQyODYgMzY1LjcxNDI4Ni0xNjAuOTE0Mjg2IDM2NS43MTQyODYtMzY1LjcxNDI4NiAzNjUuNzE0Mjg2eiIgZmlsbD0iIzRBQkRDRiIgcC1pZD0iNDczNiI+PC9wYXRoPjxwYXRoIGQ9Ik01MTIgNTEybS0zNjUuNzE0Mjg2IDBhMzY1LjcxNDI4NiAzNjUuNzE0Mjg2IDAgMSAwIDczMS40Mjg1NzIgMCAzNjUuNzE0Mjg2IDM2NS43MTQyODYgMCAxIDAtNzMxLjQyODU3MiAwWiIgZmlsbD0iI0ZGRkZGRiIgcC1pZD0iNDczNyI+PC9wYXRoPjwvc3ZnPg==',
handleStyle: {
color: '#0BDADA',
borderWidth :0,
borderWidth: 0,
},
moveHandleStyle:{
moveHandleStyle: {
color: 'transparent',
borderWidth:0,
opacity:0,
borderWidth: 0,
opacity: 0,
},
selectedDataBackground:{
selectedDataBackground: {
color: 'transparent',
areaStyle: {
opacity: 0
@ -46,7 +46,7 @@ var options = {
opacity: 0
}
},
backgroundColor:new echarts.graphic.LinearGradient(
backgroundColor: new echarts.graphic.LinearGradient(
0, 0, 1, 0,
[{
offset: 0,
@ -175,9 +175,9 @@ var options = {
showSymbol: false,
smooth: true, // 是否曲线
name: "", // 图例对应类别
data: [400, 600, 700, 200, 500, 700, 900,400, 600, 700, 200, 500, 700, 900,400, 600, 700, 200, 500, 700, 900,400, 600, 700, 200, 500, 700, 900], // 纵坐标数据
lineStyle :{
color:"#39B1FF"
data: [400, 600, 700, 200, 500, 700, 900, 400, 600, 700, 200, 500, 700, 900, 400, 600, 700, 200, 500, 700, 900, 400, 600, 700, 200, 500, 700, 900], // 纵坐标数据
lineStyle: {
color: "#39B1FF"
},
areaStyle: {
// 区域颜色
@ -204,7 +204,7 @@ var options = {
},
{
offset: 1,
opacity:0.01,
opacity: 0.01,
color: '#39b1ff01' // 100% 处的颜色
}
]

59
ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/monthStatistics/index.vue

@ -5,16 +5,16 @@
<div class="charts keep-ratio " id="monthStatistics"></div>
</div>
</div>
</template>
</template>
<script>
<script>
import WgtTitle from '../../../widgets/title'
import * as echarts from "echarts";
import chartsStatistics from "./assets/charts";
import { getDailyCumulativeMonth } from '../../../../../../../api/event/perceiveEvent';
import WgtTitle from '../../../widgets/title'
import * as echarts from "echarts";
import chartsStatistics from "./assets/charts";
import { getDailyCumulativeMonth } from '../../../../../../../api/event/perceiveEvent';
export default {
export default {
name: 'MonthStatistics',
components: {
WgtTitle
@ -35,24 +35,24 @@
setTimeout(() => {
this.$nextTick(() => {
var myChart = echarts.init(document.getElementById('monthStatistics'));
getDailyCumulativeMonth().then((res)=>{
getDailyCumulativeMonth().then((res) => {
console.log(res);
if ( res.code == 200 ) {
if (res.code == 200) {
let data = res.data;
let timeData = [];
let datasN = [];
for (var i = 0; i < 24;i++){
for (var i = 0; i < 24; i++) {
let k = 0;
for (var j = 0;j < data.length;j++){
for (var j = 0; j < data.length; j++) {
let it = data[j];
if ( it.time == i ) {
timeData.push( i +"点至"+ (i +1)+"点");
if (it.time == i) {
timeData.push(i + "点至" + (i + 1) + "点");
datasN.push(it.number);
k++;
}
}
if ( k == 0 ) {
timeData.push( i +"点至"+ (i +1)+"点");
if (k == 0) {
timeData.push(i + "点至" + (i + 1) + "点");
datasN.push(0);
}
}
@ -66,31 +66,32 @@
});
});
},
}
</script>
}
</script>
<style lang='scss' scoped>
.congestion {
<style lang='scss' scoped>
.congestion {
width: 100%;
.board{
height:200px;
.board {
height: 200px;
width: 100%;
padding: 0px 20px;
background: linear-gradient(180deg, rgba(6,66,88,0.2) 0%, #064258 100%);
background: linear-gradient(180deg, rgba(6, 66, 88, 0.2) 0%, #064258 100%);
border-radius: 5px 5px 5px 5px;
opacity: 1;
border: 1px solid;
border-image: linear-gradient(360deg, rgba(55, 231, 255,0.3), rgba(55, 231, 255, 0)) 1 1;
border-image: linear-gradient(360deg, rgba(55, 231, 255, 0.3), rgba(55, 231, 255, 0)) 1 1;
display: flex;
justify-content: space-between;
align-items: center;
}
}
.charts {
height:180px;
width: 100%;
}
}
</style>
.charts {
height: 180px;
width: 100%;
}
</style>

23
ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/railway/assets/charts.js

@ -11,14 +11,13 @@ let dataZoomMove = {
end: 4
}
var options = {
grid: {
containLabel: true,
// 边距自行修改
bottom: '0%',
left: '0%',
top: '20%',
right: '10%',
top: '2%',
right: '15%',
},
xAxis: {
type: 'value',
@ -44,12 +43,12 @@ var options = {
fontSize: '14px',
inside: true,
verticalAlign: 'bottom',
color:'#fff',
padding:10,
margin:-5,
formatter: function (value) {
let index = xdata.value.indexOf(value);
return `{a|Top${index + 2}} {b|${value}}`
color: '#fff',
padding: 10,
margin: -5,
formatter: function (value, index) {
// let index = xdata.value.indexOf(value);
return `{a|Top${index + 1}} {b|${value}}`
},
rich: {
a: {
@ -101,7 +100,7 @@ var options = {
position: 'right',
distance: -10,
data: sdata,
color:'#fff',
color: '#fff',
formatter: (c) => {
return `{a|}{b|${c.value}辆}`
},
@ -113,8 +112,8 @@ var options = {
image: chartIcon
},
},
b:{
padding:[0,0,0,10]
b: {
padding: [0, 0, 0, 10]
}
}
}

139
ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/railway/index.vue

@ -1,47 +1,91 @@
<template>
<div class='situation'>
<div class="situation">
<WgtTitle :title="'路段感知事件排名'"></WgtTitle>
<div class="board">
<!-- <div class="tag">
<div class="checked">路段车流量Top10</div>
<div>断面交通量Top10</div>
</div> -->
<div class="charts keep-ratio " id="situationEchartBox"></div>
<div class="charts keep-ratio" id="situationEchartBox"></div>
</div>
</div>
</template>
</template>
<script>
<script>
import WgtTitle from "../../../widgets/title";
import * as echarts from "echarts";
import chartsStatistics from "./assets/charts";
import { getSectionPerceivedList } from "../../../../../../../api/event/perceiveEvent";
import WgtTitle from '../../../widgets/title'
import * as echarts from "echarts";
import chartsStatistics from "./assets/charts";
import { getSectionPerceivedList } from '../../../../../../../api/event/perceiveEvent';
export default {
name: 'Situation',
export default {
name: "Situation",
components: {
WgtTitle
WgtTitle,
},
data() {
return {
}
return {};
},
mounted() {
setTimeout(() => {
this.$nextTick(() => {
var myChart = echarts.init(document.getElementById('situationEchartBox'));
var myChart = echarts.init(
document.getElementById("situationEchartBox")
);
getSectionPerceivedList({}).then((res)=>{
getSectionPerceivedList({}).then((res) => {
console.log(res);
if ( res.code == 200 ) {
if (res.code == 200) {
let data = res.data;
let texts = [];
let datas = [];
data.forEach(it => {
//
if (data.length <= 0) {
data = [
{
sectionName: "华山北枢纽-济南虚",
number: 32774,
},
{
sectionName: "东客站虚-华山北枢纽",
number: 30067,
},
{
sectionName: "小许家枢纽-东客站虚",
number: 30057,
},
{
sectionName: "临沂枣园枢纽-临沂虚",
number: 28774,
},
{
sectionName: "华山北枢纽-济南虚",
number: 26021,
},
{
sectionName: "华山北枢纽-济南虚",
number: 24061,
},
{
sectionName: "华山北枢纽-济南虚",
number: 20150,
},
{
sectionName: "华山北枢纽-济南虚",
number: 20140,
},
{
sectionName: "华山北枢纽-济南虚",
number: 20050,
},
{
sectionName: "华山北枢纽-济南虚",
number: 20010,
},
];
}
data.forEach((it) => {
texts.push(it.sectionName);
datas.push(it.number);
});
@ -52,60 +96,63 @@
myChart.setOption(chartsStatistics);
}
});
});
});
},
created() {
},
methods: {
}
}
</script>
created() {},
methods: {},
};
</script>
<style lang='scss' scoped>
.situation {
<style lang="scss" scoped>
.situation {
width: 100%;
.board{
.board {
height: 455px;
width: 100%;
padding: 0px 30px;
background: linear-gradient(180deg, rgba(6,66,88,0.2) 0%, #064258 100%);
padding: 10px 10px;
background: linear-gradient(180deg, rgba(6, 66, 88, 0.2) 0%, #064258 100%);
border-radius: 5px 5px 5px 5px;
opacity: 1;
border: 1px solid;
border-image: linear-gradient(360deg, rgba(55, 231, 255,0.3), rgba(55, 231, 255, 0)) 1 1;
border-image: linear-gradient(
360deg,
rgba(55, 231, 255, 0.3),
rgba(55, 231, 255, 0)
)
1 1;
display: flex;
justify-content: flex-start;
align-items: center;
flex-direction: column;
}
.charts {
margin-top: -40px;
height: 400px;
// margin-top: -40px;
height: 450px;
width: 100%;
}
.tag{
.tag {
margin-top: 20px;
display: flex;
width: 100%;
justify-content: flex-start;
div{
div {
width: 150px;
height: 25px;
line-height: 25px;
border-radius: 20px;
text-align: center;
background-color: #C87800;
background-color: #c87800;
margin-right: 10px;
}
.checked{
background-color: #00B3CC;;
}
.checked {
background-color: #00b3cc;
}
}
</style>
}
</style>

23
ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/railwayDay/assets/charts.js

@ -1,12 +1,13 @@
/* 数据 */
let nameList = ["大学城", "长清", "孝里", "安城", "平阴北", "平阴南", "东平", "梁山东", "嘉祥西"]; // 类别
let valueList = [800, 520, 650, 950, 420, 600, 450, 720, 303 ]; // 人数
var yList = [ "1000","800","轻度拥堵","基本畅通","畅通"]
let valueList = [800, 520, 650, 950, 420, 600, 450, 720, 303]; // 人数
// var yList = [ "1000","800","轻度拥堵","基本畅通","畅通"]
/* 数据整合 */
const minNumber = 0;
let dataList = [];
nameList.map((item, index) => {
if (index === 4) {
if (index === 3) {
dataList.push({
name: item,
value: valueList[index],
@ -32,7 +33,7 @@ nameList.map((item, index) => {
dataList.push({
name: item,
value: valueList[index],
itemStyle:{
itemStyle: {
borderRadius: 6
}
})
@ -47,6 +48,11 @@ var options = {
bottom: "0%",//下边距
containLabel: true,
},
tooltip: {
valueFormatter: function (value) {
return (value + minNumber).toFixed(2);
}
},
xAxis: {
type: 'category',
data: nameList,
@ -61,7 +67,7 @@ var options = {
axisLabel: {
show: true,
color: '#B6E6FF',
fontSize:8,
fontSize: 8,
fontFamily: 'Source Han Sans CN-Regular',
},
},
@ -99,7 +105,7 @@ var options = {
series: [{
type: 'bar',
data: dataList,
z:4,
z: 4,
itemStyle: {
color: {
type: 'linear',
@ -116,8 +122,9 @@ var options = {
},
borderRadius: [4, 4, 0, 0]
},
barWidth:10,
label: {show:false,
barWidth: 10,
label: {
show: false,
}
},
]

25
ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/railwayDay/index.vue

@ -35,9 +35,10 @@ export default {
setTimeout(() => {
this.$nextTick(() => {
var myChart = echarts.init(document.getElementById('railwayDay'));
getSectionPerceivedNumber().then((res)=>{
if ( res.code == 200 ) {
getSectionPerceivedNumber().then((res) => {
if (res.code == 200) {
let data = res.data;
if (data.length > 0) {
let texts = [];
let datas = [];
@ -48,8 +49,9 @@ export default {
chartsStatistics.xAxis.data = texts;
chartsStatistics.series[0].data = datas;
}
myChart.setOption(chartsStatistics);
}
})
});
@ -61,24 +63,25 @@ export default {
<style lang='scss' scoped>
.congestion {
width: 100%;
.board{
height:200px;
.board {
height: 200px;
width: 100%;
padding: 0px 20px;
background: linear-gradient(180deg, rgba(6,66,88,0.2) 0%, #064258 100%);
background: linear-gradient(180deg, rgba(6, 66, 88, 0.2) 0%, #064258 100%);
border-radius: 5px 5px 5px 5px;
opacity: 1;
border: 1px solid;
border-image: linear-gradient(360deg, rgba(55, 231, 255,0.3), rgba(55, 231, 255, 0)) 1 1;
border-image: linear-gradient(360deg, rgba(55, 231, 255, 0.3), rgba(55, 231, 255, 0)) 1 1;
display: flex;
justify-content: space-between;
align-items: center;
}
}
.charts {
height:180px;
width: 100%;
}
.charts {
height: 180px;
width: 100%;
}
</style>

52
ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/typeAnalysis/assets/charts.js

@ -1,10 +1,11 @@
window.typeAnalysisData = [
{ value: 100, name: '行人' },
{ value: 90, name: '非机动车' },
{ value: 80, name: '拥堵' },
{ value: 60, name: '逆行' },
{ value: 50, name: '抛洒物' },
{ value: 45, name: '烟火' }]
// { value: 90, name: '非机动车' },
// { value: 80, name: '拥堵' },
// { value: 60, name: '逆行' },
// { value: 50, name: '抛洒物' },
// { value: 45, name: '烟火' }
]
window.colorList = [
"#019AFF",
@ -19,13 +20,6 @@ window.colorList1 = [
"#FFB905",
"#6AE0BC",]
window.count = 0;
typeAnalysisData.forEach((it)=>{
count += it.value;
})
var options = {
color: colorList,
legend: {
@ -39,26 +33,30 @@ var options = {
textStyle: {
color: "#fff",
fontSize: 12,
rich:{
rich: {
ast: {
align: "left",
fontSize: 12,
width:30,
width: 30,
},
bst: {
align: "left",
fontSize: 12,
marginLeft:20,
color:"#37E7FF"
marginLeft: 20,
color: "#37E7FF"
}
}
},
formatter: (params) => {
let obj = typeAnalysisData.filter(it=>{ return it.name == params})
console.log(obj);
return `{ast|${obj[0].name}} {bst|${Math.round(obj[0].value/count* 100) }%}`
let count = 0;
typeAnalysisData.forEach((it) => {
count += it.value;
})
let obj = typeAnalysisData.filter(it => { return it.name == params })
// console.log(obj);
return `{ast|${obj[0].name}} {bst|${Math.round((obj[0].value / count) * 100)}%}`
},
data: typeAnalysisData?.map(x => x.name),
// data: typeAnalysisData?.map(x => x.name),
},
tooltip: {
trigger: 'item',
@ -68,9 +66,9 @@ var options = {
type: 'pie',
radius: '80%',
center: ['40%', '50%'],
clockwise:false,
clockwise: false,
roseType: 'radius',
startAngle1:180,
startAngle1: 180,
label: {
show: false,
position: 'outside',
@ -92,7 +90,7 @@ var options = {
},
},
labelLine: {
show:false,
show: false,
length: 10,
length2: 30,
},
@ -104,13 +102,13 @@ var options = {
}
}
})
},{
}, {
name: '',
type: 'pie',
radius: '90%',
hoverAnimation: false,
emphasis: { scale: false },
clockwise:false,
clockwise: false,
center: ['40%', '50%'],
roseType: 'radius',
label: {
@ -129,13 +127,13 @@ var options = {
},
itemStyle: {
normal: {
opacity:0.3,
opacity: 0.3,
shadowColor: "rgba(0, 0, 0, 0.8)",
shadowBlur: 50,
},
},
labelLine: {
show:false,
show: false,
length: 10,
length2: 30,
},

114
ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/typeAnalysis/index.vue

@ -5,17 +5,17 @@
<div class="charts keep-ratio " id="typeAnalysis"></div>
</div>
</div>
</template>
</template>
<script>
<script>
import WgtTitle from '../../../widgets/title'
import * as echarts from "echarts";
import chartsStatistics from "./assets/charts";
import { getWarningTypeDay } from '../../../../../../../api/event/perceiveEvent';
import WgtTitle from '../../../widgets/title'
import * as echarts from "echarts";
import chartsStatistics from "./assets/charts";
import { getWarningTypeDay } from '../../../../../../../api/event/perceiveEvent';
const drawRoundRect = ( ctx, x, y, width, height, radius ,gr) => {
const drawRoundRect = (ctx, x, y, width, height, radius, gr) => {
// ctx, x, y, , ,
ctx.beginPath();
ctx.fillStyle = gr;
@ -24,7 +24,7 @@
ctx.arc(width - radius + x, radius + y, radius, Math.PI * 3 / 2, Math.PI * 2);
ctx.lineTo(width + x, height + y - radius);
ctx.arc(width - radius + x, height - radius + y, radius, 0, Math.PI * 1 / 2);
ctx.lineTo(radius + x, height +y);
ctx.lineTo(radius + x, height + y);
ctx.arc(radius + x, height - radius + y, radius, Math.PI * 1 / 2, Math.PI);
ctx.closePath();
//ctx.stroke();
@ -32,7 +32,7 @@
}
export default {
export default {
name: 'TypeAnalysis',
components: {
WgtTitle
@ -42,7 +42,6 @@
}
},
created() {
},
@ -55,70 +54,70 @@
var myChart = echarts.init(document.getElementById('typeAnalysis'));
getWarningTypeDay().then(res=>{
getWarningTypeDay().then(res => {
console.log(res);
if ( res.code == 200 ) {
if (res.code == 200) {
let data = res.data;
console.log("===================",data);
console.log("===================", data);
typeAnalysisData = [];
for (var i = 0;i < data.length;i++){
for (var i = 0; i < data.length; i++) {
var it = data[i];
if ( it.warningType == 1) {
if (it.warningType == 1) {
typeAnalysisData.push({
name:'交通拥堵',
value:it.number
name: '交通拥堵',
value: it.number
});
}
if ( it.warningType == 2) {
if (it.warningType == 2) {
typeAnalysisData.push({
name:'行人',
value:it.number
name: '行人',
value: it.number
});
}
if ( it.warningType == 3) {
if (it.warningType == 3) {
typeAnalysisData.push({
name:'非机动车',
value:it.number
name: '非机动车',
value: it.number
});
}
if ( it.warningType == 4) {
if (it.warningType == 4) {
typeAnalysisData.push({
name:'停车',
value:it.number
name: '停车',
value: it.number
});
}
if ( it.warningType == 5) {
if (it.warningType == 5) {
typeAnalysisData.push({
name:'倒车/逆行',
value:it.number
name: '倒车/逆行',
value: it.number
});
}
if ( it.warningType == 6) {
if (it.warningType == 6) {
typeAnalysisData.push({
name:'烟火',
value:it.number
name: '烟火',
value: it.number
});
}
if ( it.warningType == 7) {
if (it.warningType == 7) {
typeAnalysisData.push({
name:'撒落物',
value:it.number
name: '撒落物',
value: it.number
});
}
if ( it.warningType == 8) {
if (it.warningType == 8) {
typeAnalysisData.push({
name:'异常天气',
value:it.number
name: '异常天气',
value: it.number
});
}
if ( it.warningType == 9) {
if (it.warningType == 9) {
typeAnalysisData.push({
name:'护栏碰撞',
value:it.number
name: '护栏碰撞',
value: it.number
});
}
drawRoundRect(context, 260, 8 + i * 28, 120, 24, 12,gr)
drawRoundRect(context, 260, 8 + i * 28, 120, 24, 12, gr)
}
chartsStatistics.legend.data = typeAnalysisData?.map(x => x.name);
@ -148,7 +147,7 @@
// canvas
let canvas = document.createElement('canvas');
canvas.width = parentDiv.offsetWidth;
canvas.height =parentDiv.offsetHeight;
canvas.height = parentDiv.offsetHeight;
parentDiv.appendChild(canvas);
const context = canvas.getContext('2d');
@ -171,31 +170,32 @@
});
});
},
}
</script>
}
</script>
<style lang='scss' scoped>
.congestion {
<style lang='scss' scoped>
.congestion {
width: 100%;
.board{
height:200px;
.board {
height: 200px;
width: 100%;
padding: 0px 20px;
background: linear-gradient(180deg, rgba(6,66,88,0.2) 0%, #06425888 100%);
background: linear-gradient(180deg, rgba(6, 66, 88, 0.2) 0%, #06425888 100%);
border-radius: 5px 5px 5px 5px;
opacity: 1;
border: 1px solid;
border-image: linear-gradient(360deg, rgba(55, 231, 255,0.1), rgba(55, 231, 255, 0)) 1 1;
border-image: linear-gradient(360deg, rgba(55, 231, 255, 0.1), rgba(55, 231, 255, 0)) 1 1;
display: flex;
justify-content: space-between;
align-items: center;
}
}
.charts {
height:180px;
width: 100%;
}
}
</style>
.charts {
height: 180px;
width: 100%;
}
</style>

2
ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/index.vue

@ -1,9 +1,7 @@
<template>
<div class='TrafficFlow'>
<section class="content">
<!-- 在途车流量车型分类 -->
<Railway class="content-l" />
<!-- -->
<div class="content-m" >
<RailWayDay class="content-m-t" />
<DayTotal class="content-m-t" />

Loading…
Cancel
Save