Browse Source

封版v1.0【2024-07-26】

wangqin
王钦 1 year ago
parent
commit
3de385fe44
  1. 2
      ruoyi-ui/src/views/JiHeExpressway/components/ChartExport/index.vue
  2. 3
      ruoyi-ui/src/views/JiHeExpressway/components/Dialog/index.vue
  3. 4
      ruoyi-ui/src/views/JiHeExpressway/components/HeaderMenu/WarningList.vue
  4. 58
      ruoyi-ui/src/views/JiHeExpressway/components/HeaderMenu/dialogWarn/chartsFee.js
  5. 5
      ruoyi-ui/src/views/JiHeExpressway/components/HeaderMenu/index.vue
  6. 30
      ruoyi-ui/src/views/JiHeExpressway/components/RoadStateCard/index.vue
  7. 6
      ruoyi-ui/src/views/JiHeExpressway/components/Video/index.vue
  8. 2
      ruoyi-ui/src/views/JiHeExpressway/components/VideoMulti/index.vue
  9. 8
      ruoyi-ui/src/views/JiHeExpressway/components/WarningNotify.vue
  10. BIN
      ruoyi-ui/src/views/JiHeExpressway/images/device/180全景摄像机.png
  11. BIN
      ruoyi-ui/src/views/JiHeExpressway/images/device/360全景摄像机.png
  12. BIN
      ruoyi-ui/src/views/JiHeExpressway/images/device/RSU天线.png
  13. BIN
      ruoyi-ui/src/views/JiHeExpressway/images/device/UPS.png
  14. BIN
      ruoyi-ui/src/views/JiHeExpressway/images/device/view.png
  15. BIN
      ruoyi-ui/src/views/JiHeExpressway/images/device/一类交通量.png
  16. BIN
      ruoyi-ui/src/views/JiHeExpressway/images/device/太阳能板.png
  17. BIN
      ruoyi-ui/src/views/JiHeExpressway/images/device/扫码报警B.png
  18. BIN
      ruoyi-ui/src/views/JiHeExpressway/images/device/护栏碰撞预警系统.png
  19. BIN
      ruoyi-ui/src/views/JiHeExpressway/images/device/护栏碰撞预警系统B.png
  20. BIN
      ruoyi-ui/src/views/JiHeExpressway/images/device/智慧锥灯.png
  21. BIN
      ruoyi-ui/src/views/JiHeExpressway/images/device/智能行车诱导.png
  22. BIN
      ruoyi-ui/src/views/JiHeExpressway/images/device/桥下监控摄像机.png
  23. BIN
      ruoyi-ui/src/views/JiHeExpressway/images/device/毫米波雷达.png
  24. BIN
      ruoyi-ui/src/views/JiHeExpressway/images/device/毫米波雷达B.png
  25. BIN
      ruoyi-ui/src/views/JiHeExpressway/images/device/气象监测器.png
  26. BIN
      ruoyi-ui/src/views/JiHeExpressway/images/device/气象监测器B.png
  27. BIN
      ruoyi-ui/src/views/JiHeExpressway/images/device/河流区预警-超级雾灯.png
  28. BIN
      ruoyi-ui/src/views/JiHeExpressway/images/device/激光疲劳唤醒.png
  29. BIN
      ruoyi-ui/src/views/JiHeExpressway/images/device/监控智能设备箱.png
  30. BIN
      ruoyi-ui/src/views/JiHeExpressway/images/device/设备箱.png
  31. BIN
      ruoyi-ui/src/views/JiHeExpressway/images/device/语音广播.png
  32. BIN
      ruoyi-ui/src/views/JiHeExpressway/images/device/远端机.png
  33. BIN
      ruoyi-ui/src/views/JiHeExpressway/images/device/锥桶B.png
  34. BIN
      ruoyi-ui/src/views/JiHeExpressway/images/device/门架监控摄像机.png
  35. BIN
      ruoyi-ui/src/views/JiHeExpressway/images/device/高清网络摄像机.png
  36. BIN
      ruoyi-ui/src/views/JiHeExpressway/images/device/高清网络枪型固定摄像机.png
  37. 11
      ruoyi-ui/src/views/JiHeExpressway/mixins/InfoBoard.js
  38. 6
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/Broadcast/index.vue
  39. 56
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/Camera/components/CameraControlDialog.vue
  40. 10
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/Camera/index.vue
  41. 2
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/ConfluenceArea/index.vue
  42. 6
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/DrivingGuidance/index.vue
  43. 2
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/FatigueWakesUp/index.vue
  44. 2
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/GuardrailCollision/index.vue
  45. 2
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/Intermodulation/index.vue
  46. 2
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/MeteorologicalDetection/index.vue
  47. 2
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/MillimeterWaveRadar/index.vue
  48. 28
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/PerceiveEvent/index.vue
  49. 6
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/RemoteMachine/index.vue
  50. 8
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/RoadNetworkFacilities/index.vue
  51. 6
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/SmartDevice/index.vue
  52. 2
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/SolarEnergy/index.vue
  53. 2
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/TrafficIncidents/index.vue
  54. 52
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/HomeFrameControl/index.vue
  55. 74
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/HomeTraffic/index.vue
  56. 9
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/HomeWeather/index.vue
  57. 27
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/InfoBoard/InfoBoard.vue
  58. 25
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/RoadAndEvents/index.vue
  59. 5
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/RoadAndEvents/utils/buttonEvent.js
  60. 63
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Thumbnail/index.vue
  61. 16
      ruoyi-ui/src/views/JiHeExpressway/pages/control/device/record/index.vue
  62. 7
      ruoyi-ui/src/views/JiHeExpressway/pages/control/device/strategy/components/AddNEditDialog.vue
  63. 4
      ruoyi-ui/src/views/JiHeExpressway/pages/control/device/strategy/components/taskEditDialog.vue
  64. 6
      ruoyi-ui/src/views/JiHeExpressway/pages/control/device/strategy/components/timeEditDialog.vue
  65. 496
      ruoyi-ui/src/views/JiHeExpressway/pages/control/device/strategy/componentsAdd/AddDialog.vue
  66. 226
      ruoyi-ui/src/views/JiHeExpressway/pages/control/device/strategy/componentsAdd/TaskItem.vue
  67. 19
      ruoyi-ui/src/views/JiHeExpressway/pages/control/device/strategy/componentsAdd/assets/editor.svg
  68. 466
      ruoyi-ui/src/views/JiHeExpressway/pages/control/device/strategy/componentsAdd/taskEditDialog.vue
  69. 166
      ruoyi-ui/src/views/JiHeExpressway/pages/control/device/strategy/componentsAdd/timeEditDialog.vue
  70. 28
      ruoyi-ui/src/views/JiHeExpressway/pages/control/device/strategy/index.vue
  71. 19
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/CrowdnessIndicatorRankings/components/DialogCamera.vue
  72. 15
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/CrowdnessIndicatorRankings/index.vue
  73. BIN
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/EventInformation/images/lane.png
  74. BIN
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/EventInformation/images/lane.psd
  75. BIN
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/EventInformation/images/lane_v1.jpg
  76. 8
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/EventInformation/index.vue
  77. 6
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/dispatch/data.js
  78. 4
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/dispatch/index.vue
  79. 5
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/event/EventDetailDialog/Carousel/index.vue
  80. 11
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/event/EventDetailDialog/data.js
  81. 97
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/event/EventDetailDialog/index.vue
  82. 16
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/event/data.js
  83. 10
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/event/index.vue
  84. 12
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/governanceAnalysis/audit/StatsDialogVisible/index.vue
  85. 2
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/governanceAnalysis/cmodel/charts.js
  86. 15
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/governanceAnalysis/search/index.vue
  87. 8
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/plan/addAndEditDialog/index.vue
  88. 3
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/plan/data.js
  89. 22
      ruoyi-ui/src/views/JiHeExpressway/pages/control/manual/events/data.js
  90. 7
      ruoyi-ui/src/views/JiHeExpressway/pages/control/manual/events/index.vue
  91. 8
      ruoyi-ui/src/views/JiHeExpressway/pages/control/manual/statistic/components/Eventfiltering/index.vue
  92. 10
      ruoyi-ui/src/views/JiHeExpressway/pages/control/manual/statistic/components/Sitefiltering/index.vue
  93. 40
      ruoyi-ui/src/views/JiHeExpressway/pages/control/manual/statistic/components/Timefiltering/index.vue
  94. 56
      ruoyi-ui/src/views/JiHeExpressway/pages/datav/roadNet/index.vue
  95. 44
      ruoyi-ui/src/views/JiHeExpressway/pages/maintenanceOperations/smart/statisticalAnalysis/analysis/components/deviceUptime/assets/charts.js
  96. 120
      ruoyi-ui/src/views/JiHeExpressway/pages/maintenanceOperations/smart/statisticalAnalysis/data_2024-05-23.js
  97. 673
      ruoyi-ui/src/views/JiHeExpressway/pages/maintenanceOperations/smart/statisticalAnalysis/index_2024-05-23.md
  98. 114
      ruoyi-ui/src/views/JiHeExpressway/pages/maintenanceOperations/smart/statisticalAnalysis/query/chartRecord.js
  99. 33
      ruoyi-ui/src/views/JiHeExpressway/pages/maintenanceOperations/smart/statisticalAnalysis/query/charts.js
  100. 24
      ruoyi-ui/src/views/JiHeExpressway/pages/maintenanceOperations/smart/statisticalAnalysis/query/data.js

2
ruoyi-ui/src/views/JiHeExpressway/components/ChartExport/index.vue

@ -44,7 +44,7 @@ export default {
.iconDl{
margin-left: 10px;
cursor: pointer;
z-index: 2049;
z-index: 1900;
width: 18px;
height: 18px;
padding: 3px;

3
ruoyi-ui/src/views/JiHeExpressway/components/Dialog/index.vue

@ -213,7 +213,8 @@ export default {
.dialog-content {
padding: 9px 21px 9px 21px;
max-height: 95vh;
overflow-y: auto;
// overflow-y: auto;
overflow: hidden;
}
.bottom-right {

4
ruoyi-ui/src/views/JiHeExpressway/components/HeaderMenu/WarningList.vue

@ -192,8 +192,8 @@ export default {
data.windSpeed = otherConfig.windSpeed;
data.visibility = otherConfig.visibility;
data.pictures = otherConfig.pictures || [];
data.videoList = otherConfig.videoList || [];
data.pictures = otherConfig.pictures || otherConfig.imgUrl ||[];
data.videoList = otherConfig.videoList || otherConfig.videoUrl|| [];
// data.videoList = ['https://sf1-cdn-tos.huoshanstatic.com/obj/media-fe/xgplayer_doc_video/mp4/xgplayer-demo-480p.mp4',
// 'https://sf1-cdn-tos.huoshanstatic.com/obj/media-fe/xgplayer_doc_video/mp4/xgplayer-demo-480p.mp4']
}

58
ruoyi-ui/src/views/JiHeExpressway/components/HeaderMenu/dialogWarn/chartsFee.js

@ -3,19 +3,53 @@ var options = {
tooltip: {
show: true,
trigger: "axis",
formatter: (params) => {
let name = params[0].axisValue + (params[0].axisIndex === 0?' 入口':' 出口') ;
for(let i =0; i < params.length; i++){
if(i%2===0){
name+='<br />'
} else{
name+='<span style="margin-left:10px;"></span>'
}
name += `${params[i].marker}${params[i].seriesName}: <span style="font-weight:bold;"> ${params[i].value} 辆</span>`
enterable: true,//滚动条
extraCssText: "max-width:60%;max-height:83%; overflow: auto; ",//滚动条
//改变提示框的位置 不超出屏幕显示
position: function(point, params, dom, rect, size) {
//其中point为当前鼠标的位置,
//size中有两个属性:viewSize和contentSize,分别为外层div和tooltip提示框的大小
// 鼠标坐标和提示框位置的参考坐标系是:以外层div的左上角那一点为原点,x轴向右,y轴向下
// 提示框位置
var x = 0; // x坐标位置
var y = 0; // y坐标位置
// 当前鼠标位置
var pointX = point[0];
var pointY = point[1];
// 提示框大小
var boxWidth = size.contentSize[0];
var boxHeight = size.contentSize[1];
// boxWidth > pointX 说明鼠标左边放不下提示框
if (boxWidth > pointX) {
x = 5;
} else {
// 左边放的下
x = pointX - boxWidth;
}
// boxHeight > pointY 说明鼠标上边放不下提示框
if (boxHeight > pointY) {
y = 5;
} else {
// 上边放得下
y = pointY - boxHeight;
}
return [x, y];
},
// formatter: (params) => {
// let name = params[0].axisValue + (params[0].axisIndex === 0?' 入口':' 出口') ;
// for(let i =0; i < params.length; i++){
// if(i%2===0){
// name+='<br />'
// } else{
// name+='<span style="margin-left:10px;"></span>'
// }
// name += `${params[i].marker}${params[i].seriesName}: <span style="font-weight:bold;"> ${params[i].value} 辆</span>`
}
return name;
}
// }
// return name;
// }
},
axisPointer: {
link: [

5
ruoyi-ui/src/views/JiHeExpressway/components/HeaderMenu/index.vue

@ -74,7 +74,9 @@ export default {
path:e.path.substr(1),
children:[]
}
e.children.forEach(c => {
if(e.children){
e.children.forEach(c => {
if(c.children){
const _children = [];
c.children.forEach(cc => {
@ -101,6 +103,7 @@ export default {
})
}
})
}
}
if(index < 4){
_menuLeft.push(menuItem)

30
ruoyi-ui/src/views/JiHeExpressway/components/RoadStateCard/index.vue

@ -2,12 +2,17 @@
<BorderRadiusImage class="RoadStateCard" borderRadius="2px"
borderColor="linear-gradient(360deg, rgba(55, 231, 255, 0.3), rgba(55, 231, 255, 0))" borderWidth="2px">
<div class="left" v-if="isShowLeft">
<ElImage style="width: 212px; height: 159px" :src="cardData.pictures ? cardData.pictures[0] : null"
<ElImage style="width: 212px; height: 159px" v-if="cardData.pictures && cardData.pictures.length>0" class="imgPicture"
:src="cardData.pictures[0]"
:preview-src-list="cardData.pictures || []">
<div slot="error">
<i class="el-icon-picture-outline icon"></i>
</div>
</ElImage>
<div style="width: 212px; height: 159px;" v-else class="imgPicture"
:preview-src-list="cardData.pictures || []">
<img :src=getDeviceSource(cardData) style="width: auto; height: 80px">
</div>
</div>
<div class="right">
<div class="info">
@ -105,6 +110,22 @@ export default {
this.statusMap = statusMap;
},
methods: {
getDeviceSource(data){
const {warningSource, pictures} = data;
if(warningSource === 2){
return require(`@screen/images/device/毫米波雷达B.png`)
} else if(warningSource ===3){
return require(`@screen/images/device/锥桶B.png`)
} else if(warningSource ===4){
return require(`@screen/images/device/护栏碰撞预警系统B.png`)
} else if(warningSource ===5 && (!pictures || pictures.length === 0)){
return require(`@screen/images/device/扫码报警B.png`)
} else if(warningSource ===7){
return require(`@screen/images/device/气象监测器B.png`)
} else {
return require(`@screen/images/device/view.png`)
}
},
getFirstBtnText(state) {
let text = "详情";
if (state == 5) text = "去确认";
@ -208,4 +229,11 @@ export default {
top: 0;
}
}
.imgPicture{
background: linear-gradient(to top, #104864 0%, #133242 100%);
border: 1px solid #20627e;
display: flex;
justify-content: center;
align-items: center;
}
</style>

6
ruoyi-ui/src/views/JiHeExpressway/components/Video/index.vue

@ -16,7 +16,7 @@
<Video :rangeIndex="rangeIndex" v-if="active === 'video'" class="video-stream" :pileNum="pileNum" :camId="camId"
:url="url" :videoType="videoType" />
<img v-else src="./view.png" />
<img v-else :src="require(`@screen/images/device/${img}.png`)" />
</Transition>
</div>
</template>
@ -54,6 +54,10 @@ export default {
showHeader: {
type: Boolean,
default: true
},
img: {
type: String,
default: 'view'
}
},
data() {

2
ruoyi-ui/src/views/JiHeExpressway/components/VideoMulti/index.vue

@ -16,7 +16,7 @@
<video controls autoplay muted class="video-stream" v-bind="$attrs" ref="videoContainerRef" />
</Transition>
<CameraControlDialog :deviceId="dialogData.iotDeviceId" :dialogData="dialogData" :visible="controlDialogVisible" @update:value="handleClose" />
<CameraControlDialog :deviceId="dialogData.iotDeviceId" :dialogData="dialogData" :visible="controlDialogVisible" @update:value="handleClose" />
</div>
</template>

8
ruoyi-ui/src/views/JiHeExpressway/components/WarningNotify.vue

@ -194,7 +194,9 @@ export default {
}).then((result) => {
if (result.code != 200) return Message.error(result?.msg);
let data = result.data;
if(data.warningSource === 6){
return;
}
data.stringEventSource = data?.warningSource ? warningSourceMapping[data.warningSource] : '';
data.nickName = data.userName;
// data.direction = gzDirectionMapping[data.direction] || data.direction;
@ -211,8 +213,8 @@ export default {
data.windSpeed = otherConfig.windSpeed;
data.visibility = otherConfig.visibility;
data.pictures = otherConfig.pictures || [];
data.videoList = otherConfig.videoList || [];
data.pictures = otherConfig.pictures || otherConfig.imgUrl ||[];
data.videoList = otherConfig.videoList || otherConfig.videoUrl || [];
// data.videoList = ['https://sf1-cdn-tos.huoshanstatic.com/obj/media-fe/xgplayer_doc_video/mp4/xgplayer-demo-480p.mp4',
// 'https://sf1-cdn-tos.huoshanstatic.com/obj/media-fe/xgplayer_doc_video/mp4/xgplayer-demo-480p.mp4']
}

BIN
ruoyi-ui/src/views/JiHeExpressway/images/device/180全景摄像机.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 191 KiB

BIN
ruoyi-ui/src/views/JiHeExpressway/images/device/360全景摄像机.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 191 KiB

BIN
ruoyi-ui/src/views/JiHeExpressway/images/device/RSU天线.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

BIN
ruoyi-ui/src/views/JiHeExpressway/images/device/UPS.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 666 KiB

BIN
ruoyi-ui/src/views/JiHeExpressway/images/device/view.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

BIN
ruoyi-ui/src/views/JiHeExpressway/images/device/一类交通量.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 39 KiB

BIN
ruoyi-ui/src/views/JiHeExpressway/images/device/太阳能板.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 356 KiB

BIN
ruoyi-ui/src/views/JiHeExpressway/images/device/扫码报警B.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
ruoyi-ui/src/views/JiHeExpressway/images/device/护栏碰撞预警系统.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 460 KiB

BIN
ruoyi-ui/src/views/JiHeExpressway/images/device/护栏碰撞预警系统B.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
ruoyi-ui/src/views/JiHeExpressway/images/device/智慧锥灯.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 475 KiB

BIN
ruoyi-ui/src/views/JiHeExpressway/images/device/智能行车诱导.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 181 KiB

BIN
ruoyi-ui/src/views/JiHeExpressway/images/device/桥下监控摄像机.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 167 KiB

BIN
ruoyi-ui/src/views/JiHeExpressway/images/device/毫米波雷达.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 181 KiB

BIN
ruoyi-ui/src/views/JiHeExpressway/images/device/毫米波雷达B.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

BIN
ruoyi-ui/src/views/JiHeExpressway/images/device/气象监测器.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 798 KiB

BIN
ruoyi-ui/src/views/JiHeExpressway/images/device/气象监测器B.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

BIN
ruoyi-ui/src/views/JiHeExpressway/images/device/河流区预警-超级雾灯.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 467 KiB

BIN
ruoyi-ui/src/views/JiHeExpressway/images/device/激光疲劳唤醒.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 244 KiB

BIN
ruoyi-ui/src/views/JiHeExpressway/images/device/监控智能设备箱.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 211 KiB

BIN
ruoyi-ui/src/views/JiHeExpressway/images/device/设备箱.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 676 KiB

BIN
ruoyi-ui/src/views/JiHeExpressway/images/device/语音广播.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

BIN
ruoyi-ui/src/views/JiHeExpressway/images/device/远端机.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 657 KiB

BIN
ruoyi-ui/src/views/JiHeExpressway/images/device/锥桶B.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

BIN
ruoyi-ui/src/views/JiHeExpressway/images/device/门架监控摄像机.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 399 KiB

BIN
ruoyi-ui/src/views/JiHeExpressway/images/device/高清网络摄像机.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 125 KiB

BIN
ruoyi-ui/src/views/JiHeExpressway/images/device/高清网络枪型固定摄像机.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 98 KiB

11
ruoyi-ui/src/views/JiHeExpressway/mixins/InfoBoard.js

@ -76,6 +76,11 @@ export default {
let content = [];
this.selectedBdMsg.forEach((item) => {
const ctext = item.textContent.replaceAll(",", "\\,").replaceAll("\n", "\\\\n");
if(ctext.indexOf('=') !== -1 && ctext.indexOf('\\=') === -1){
ctext = ctext.replaceAll("=", "\\=");
}
content.push({
STAY: item.playbackDuration,
ACTION: item.screenEntryMethod,
@ -83,10 +88,7 @@ export default {
COLOR: item.foregroundColor,
FONT: item.font,
FONT_SIZE: item.fontSize,
CONTENT: item.textContent
.replaceAll(",", "\\,")
.replaceAll("=", "\\=")
.replaceAll("\n", "\\\\n"),
CONTENT: ctext,
width: item.displayAreaWidth,
height: item.displayAreaHeight,
formatStyle: item.verticalAlignment,
@ -94,7 +96,6 @@ export default {
});
let data = { content: content, deviceList };
if (IS_TESTING) {
// this.saveLog(content);
this.____getDeviceInfo();

6
ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/Broadcast/index.vue

@ -1,6 +1,6 @@
<template>
<Dialog v-model="obverseVisible" title="语音广播" width="655px">
<Video class="video-stream" :camId="camId" />
<Dialog v-model="obverseVisible" title="语音广播" width="470px">
<Video class="video-stream" :camId="camId" img="语音广播" />
<div class="Broadcast">
<ElTabs v-model="activeName" @tab-click="handleClickTabs" class="tabs">
@ -131,7 +131,7 @@ export default {
<style lang="scss" scoped>
.Broadcast {
width: 600px;
width: 420px;
height: 240px;
color: #fff;
display: flex;

56
ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/Camera/components/CameraControlDialog.vue

@ -30,16 +30,14 @@
</div>
</div>
<div class="position">
<div class="ptitle">
预置位列表
<el-popover v-model="addVisible" placement="bottom" width="200" trigger="manual">
<el-popover v-model="addVisible" placement="bottom" width="200" trigger="manual">
<div style="display: flex;">
<el-input placeholder="请输入名称" v-model="pName" style="flex:1"></el-input>
<el-input id="txtInput" placeholder="请输入名称" @blur="onUnAddClick" v-model="pName" style="flex:1"></el-input>
<ButtonGradient @click.native="addName">确认</ButtonGradient>
</div>
<div class="add" slot="reference" @click="addVisible= !addVisible">
<div class="add" slot="reference" @click="onAddClick">
新增 <i class="el-icon-plus"></i>
</div>
</el-popover>
@ -92,6 +90,7 @@ export default {
pName: '',
pList: [],
addVisible: false,
addTimestate: 0,
options: [
{
label: "变倍",
@ -130,6 +129,8 @@ export default {
get() {
if(this.visible){
this.bindPosition();
this.pName = '';
this.addVisible = false;
}
return this.visible;
@ -140,9 +141,30 @@ export default {
},
},
mounted() {
console.log('$$$------$$$')
},
methods: {
onUnAddClick(){
this.addVisible= !this.addVisible
this.addTimestate = new Date().getTime();
},
onAddClick(){
if(new Date().getTime() - this.addTimestate < 200){
return;
}
this.addVisible= !this.addVisible
this.pName = '';
setTimeout(() => {
let pop = document.getElementsByClassName('el-popover')
for(let i of pop){
if(i.getAttribute('aria-hidden') === 'false'){
i.style['z-index'] = '9999'
}
}
document.getElementById('txtInput').focus();
}, 100);
},
onControl(speed,type){
controlCamera(this.deviceId, type, false, speed);
this.$message.success(type===8?'保存成功':'指令已发送')
@ -180,6 +202,7 @@ export default {
this.$message.error('请输入预置位名称')
return
}
request({
url: `/video/addPreset?camId=${this.deviceId}&presetName=${this.pName}`,
method: 'get'
@ -187,11 +210,32 @@ export default {
if (result.code != 200) return this.$message.error(result?.msg);
this.bindPosition();
this.addVisible = false;
this.pName = '';
})
}
},
};
</script>
<style lang="scss">
// .el-popover {
// position: absolute;
// background: #FFFFFF;
// min-width: 150px;
// border-radius: 4px;
// border: 1px solid #e6ebf5;
// padding: 12px;
// z-index: 2000;
// color: #606266;
// line-height: 1.4;
// text-align: justify;
// font-size: 14px;
// -webkit-box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
// box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1);
// word-break: break-all;
// z-index: 2099 !important;
// }
</style>
<style lang="scss" scoped>
.CameraControlDialog {

10
ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/Camera/index.vue

@ -1,7 +1,7 @@
<template>
<Dialog v-model="obverseVisible" :title="dialogData.deviceName" @update:close="visibleClose" width="450px">
<div class="Camera">
<Video class="video-stream" :camId="dialogData.iotDeviceId" />
<Video class="video-stream" :camId="dialogData.iotDeviceId" :img="AENUM[dialogData.formData.childType]" />
<ElTabs v-model="activeName" class="tabs">
<ElTabPane label="基本信息" name="first">
<Descriptions :list="list" :data="data" style="gap: 18px">
@ -101,6 +101,13 @@ export default {
},
data() {
return {
AENUM:{
15: '门架监控摄像机',
14: '360全景摄像机',
13: '高清网络摄像机',
12: '180全景摄像机',
11: '高清网络枪型固定摄像机',
},
PanoramicCameraTypes,
activeName: "first",
controlDialogVisible: false,
@ -148,7 +155,6 @@ export default {
watch: {},
async created() {
this.data = { ...this.dialogData, organizationName: null, roadName: null };
getOrganizationName(this.dialogData.iotDeviceId).then((data) => {
this.data.organizationName = data?.organizationName;
});

2
ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/ConfluenceArea/index.vue

@ -1,6 +1,6 @@
<template>
<Dialog v-model="obverseVisible" title="合流区预警" width="550px">
<Video class="video-stream" :camId="camId" />
<Video class="video-stream" :camId="camId" img="河流区预警-超级雾灯" />
<div class="confluencearea">
<ElTabs v-model="activeName" class="tabs">

6
ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/DrivingGuidance/index.vue

@ -1,7 +1,7 @@
<template>
<Dialog v-model="obverseVisible" title="行车诱导" width="650px">
<Dialog v-model="obverseVisible" title="行车诱导" width="470px">
<div class="DrivingGuidance">
<Video class="video-stream" :camId="camId" />
<Video class="video-stream" :camId="camId" img="智能行车诱导" />
<ElTabs v-model="activeName" @tab-click="handleClickTabs" class="tabs">
<ElTabPane label="基本信息" name="first">
@ -202,7 +202,7 @@ export default {
<style lang="scss" scoped>
.DrivingGuidance {
width: 600px;
width: 420px;
color: #fff;
display: flex;
flex-direction: column;

2
ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/FatigueWakesUp/index.vue

@ -1,7 +1,7 @@
<template>
<Dialog v-model="obverseVisible" title="疲劳唤醒弹窗" width="470px">
<div class="FatigueWakesUp">
<Video class="video-stream" :camId="camId" />
<Video class="video-stream" :camId="camId" img="激光疲劳唤醒" />
<ElTabs v-model="activeName" @tab-click="handleClickTabs" class="tabs">
<ElTabPane label="基本信息" name="first">
<Descriptions labelWidth="72px" :list="list" :data="data" style="gap: 18px" />

2
ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/GuardrailCollision/index.vue

@ -1,6 +1,6 @@
<template>
<Dialog v-model="obverseVisible" title="护栏碰撞弹窗" width="600px">
<Video class="video-stream" :camId="camId" />
<Video class="video-stream" :camId="camId" img="护栏碰撞预警系统" />
<div class="GuardrailCollision">
<ElTabs v-model="activeName" class="tabs">

2
ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/Intermodulation/index.vue

@ -1,6 +1,6 @@
<template>
<Dialog v-model="obverseVisible" title="一类交调站弹窗" width="600px">
<Video class="video-stream" :camId="camId" />
<Video class="video-stream" :camId="camId" img="一类交通量" />
<div class="Intermodulation">
<ElTabs v-model="activeName" class="tabs">

2
ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/MeteorologicalDetection/index.vue

@ -1,7 +1,7 @@
<template>
<Dialog v-model="obverseVisible" title="气象设备" width="470px">
<div class="MeteorologicalDetection">
<Video class="video-stream" :camId="camId" />
<Video class="video-stream" :camId="camId" img="气象监测器" />
<ElTabs v-model="activeName" @tab-click="handleClickTabs" class="tabs">
<ElTabPane label="基本信息" name="first" style="height: 150px">
<Descriptions labelWidth="72px" :list="list" :data="data" style="gap: 18px;" />

2
ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/MillimeterWaveRadar/index.vue

@ -1,7 +1,7 @@
<template>
<Dialog v-model="obverseVisible" title="毫米波雷达" width="470px">
<div class="MillimeterWaveRadar">
<Video class="video-stream" :camId="camId" />
<Video class="video-stream" :camId="camId" img="毫米波雷达" />
<ElTabs v-model="activeName" @tab-click="handleClickTabs" class="tabs">
<ElTabPane label="基本信息" name="first">
<Descriptions labelWidth="72px" :list="list" :data="data" style="gap: 18px" />

28
ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/PerceiveEvent/index.vue

@ -7,6 +7,8 @@
<script>
import request from "@/utils/request";
import { WarningType as warningTypeMapping, DirectionTypes as gzDirectionMapping, warningSourceMapping, warningStateMapping } from "@screen/utils/enum.js"
import { dialogDelayVisible } from "./../mixin";
//
export default {
@ -31,6 +33,32 @@ export default {
},
}).then(result => {
if (result.code != 200) return Message.error("详情获取失败");
let data = result.data;
data.stringEventSource = data?.warningSource ? warningSourceMapping[data.warningSource] : '';
data.nickName = data.userName;
data.startTime = data.warningTime;
data.stringEventState = warningStateMapping[data.warningState];
data.stringEventType = warningTypeMapping[data.warningType];
data.actionSource = this.activeName
data.videoList = [];
if (data.otherConfig) {
let otherConfig = JSON.parse(data.otherConfig);
data.waterFilmThickness = otherConfig.waterFilmThickness;
data.windSpeed = otherConfig.windSpeed;
data.visibility = otherConfig.visibility;
data.pictures = otherConfig.pictures || otherConfig.imgUrl ||[];
data.videoList = otherConfig.videoList || otherConfig.videoUrl || [];
// data.videoList = ['https://sf1-cdn-tos.huoshanstatic.com/obj/media-fe/xgplayer_doc_video/mp4/xgplayer-demo-480p.mp4',
// 'https://sf1-cdn-tos.huoshanstatic.com/obj/media-fe/xgplayer_doc_video/mp4/xgplayer-demo-480p.mp4']
}
data.videoType = "mp4";
data.component = "Video";
data.description = data.remark;
this.data = { ...data, ...this.data };
})
.catch((err) => { });

6
ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/RemoteMachine/index.vue

@ -1,6 +1,6 @@
<template>
<Dialog v-model="obverseVisible" title="远端机" width="600px">
<Video class="video-stream" :camId="camId" />
<Dialog v-model="obverseVisible" title="远端机" width="470px">
<Video class="video-stream" :camId="camId" img="远端机" />
<div class="RemoteMachine">
<ElTabs v-model="activeName" class="tabs">
@ -158,7 +158,7 @@ div.switcher {
</style>
<style lang="scss" scoped>
.RemoteMachine {
width: 510px;
width: 420px;
// height: 240px;
color: #fff;
display: flex;

8
ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/RoadNetworkFacilities/index.vue

@ -104,7 +104,9 @@ export default {
obverseVisible:{
handler(val){
if(val === false){
this.$refs.refVideo.closeContrl()
if(this.$refs.refVideo.closeContrl){
this.$refs.refVideo.closeContrl()
}
}
}
},
@ -173,7 +175,9 @@ export default {
},
methods: {
camClose(){
this.$refs.refVideo.closeContrl()
if(this.$refs.refVideo.closeContrl){
this.$refs.refVideo.closeContrl()
}
this.upsList =[]
},
bindUPS(id){

6
ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/SmartDevice/index.vue

@ -1,6 +1,6 @@
<template>
<Dialog v-model="obverseVisible" title="智能设备箱" width="600px">
<Video class="video-stream" :camId="camId" />
<Dialog v-model="obverseVisible" title="智能设备箱" width="470px">
<Video class="video-stream" :camId="camId" img="设备箱" />
<div class="SmartDevice">
<ElTabs v-model="activeName" class="tabs">
@ -166,7 +166,7 @@ div.switcher {
</style>
<style lang="scss" scoped>
.SmartDevice {
width: 510px;
width: 420px;
// height: 240px;
color: #fff;
display: flex;

2
ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/SolarEnergy/index.vue

@ -1,6 +1,6 @@
<template>
<Dialog v-model="obverseVisible" title="太阳能板" width="550px">
<Video class="video-stream" :camId="camId" />
<Video class="video-stream" :camId="camId" img="太阳能板" />
<div class="SolarEnergy">
<ElTabs v-model="activeName" class="tabs">

2
ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/TrafficIncidents/index.vue

@ -29,7 +29,7 @@ export default {
})
.then(({ code, data }) => {
if (code != 200) return;
this.activeName = data.eventState;
this.data = { ...data, ...this.data };
})
.catch((err) => { });

52
ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/HomeFrameControl/index.vue

@ -15,7 +15,7 @@
<el-tab-pane label="定时管控" name="2"></el-tab-pane>
<el-tab-pane label="管控记录" name="3"></el-tab-pane>
</el-tabs>
<div class="body2">
<div class="body2" style="z-index: 2003 !important;">
<div class="title">批量控制</div>
<span class="close" @click="() => { this.activeIcon = null; }">
<i class="el-icon-close" />
@ -71,7 +71,7 @@
inactive-value="1" @change="(value) => handleSwitcherChange(value, item)">
</el-switch>
<Button @click.native="() => goStrategy(item)">
查看
管理
</Button>
</template>
</Card>
@ -93,24 +93,24 @@
<Form v-model="dataRecord" style="width:100%;" labelWidth="90px" column="2" class="form" ref="FormRecordRef"
:formList="formRecord" />
<Table :data="tableData" height="500px" style="margin: 20px 20px 0px 20px;width:95%">
<ElTableColumn label="管控时间" prop="operTime" width="180" />
<ElTableColumn label="管控时间" prop="operTime" width="120" />
<ElTableColumn label="管控方式" prop="operType" width="80" />
<ElTableColumn label="操作人" prop="operName" width="80" />
<ElTableColumn label="设备类型" width="80">
<ElTableColumn label="设备类型" width="120">
<template slot-scope="scope">
<div>
<p v-for="item in scope.row.arydcDeviceType">{{ item }}</p>
</div>
</template>
</ElTableColumn>
<ElTableColumn label="设备名称" width="180">
<ElTableColumn label="设备名称">
<template slot-scope="scope">
<div>
<p v-for="item in scope.row.arydcDeviceName">{{ item }}</p>
</div>
</template>
</ElTableColumn>
<ElTableColumn label="执行内容" prop="remark" :show-overflow-tooltip="true" >
<ElTableColumn label="执行内容" width="250" prop="remark" :show-overflow-tooltip="true" >
<template slot-scope="scope">
<div>
<p v-for="item in scope.row.aryRemark">{{ item }}</p>
@ -139,10 +139,13 @@
</div>
</div>
</ElPopover>
</div>
<AddNEditDialog v-model="isShowDialog" :propData="dialogData" @onSuccess="onSizeChange2" />
</div>
</template>
<script>
import AddNEditDialog from "@screen/pages/control/device/strategy/components/AddNEditDialog.vue";
import Button from "@screen/components/Buttons/Button.vue";
import Form from "@screen/components/FormConfig";
import Card from "@screen/components/Card1/index.vue";
@ -261,7 +264,8 @@ export default {
BroadcastParam,
FatigueWakesUpParam,
DrivingGuidanceParam,
InfoBoardParam
InfoBoardParam,
AddNEditDialog
},
watch: {
dataRecord(e) {
@ -524,7 +528,11 @@ export default {
pageSize: 20,
pageNum: 1,
},
digResultVisible: false
digResultVisible: false,
dialogData: {},
isShowDialog: false,
}
},
@ -573,8 +581,10 @@ export default {
// this.filterData = data;
this.$parent.$refs.RoadAndEventsRef?.setFilterData?.(data);
},
goStrategy(item) {
this.$router.push(`/control/device/strategy?id=${item.id}`);
goStrategy(data) {
this.isShowDialog = true;
this.dialogData = data;
// this.$router.push(`/control/device/strategy?id=${item.id}`);
},
async handleSwitcherChange(value, item) {
request({
@ -605,7 +615,7 @@ export default {
.finally(() => {
});
},
onSizeChange2(pageSize) {
onSizeChange2(pageSize = 20) {
this.data2 = [];
this.searchData2.pageSize = pageSize;
this.searchData2.pageNum = 1;
@ -634,6 +644,15 @@ export default {
if (result.code != 200) return;
result.rows.forEach(e => {
const resJson = JSON.parse(e.jsonResult)
const resCodes = [];
const resCodesDeivce = [];
for(let i of resJson){
if(resCodesDeivce.indexOf(i.device) === -1){
resCodesDeivce.push(i.device)
resCodes.push(i.result.code)
}
}
const resParam = JSON.parse(e.operParam)[0].devices
const aryRemark = [];
e.remark.split(',').filter(x=>{
@ -645,7 +664,7 @@ export default {
e.operType= _.find(this.Enum_ControlType, { key: e.operType }).label
e.arydcDeviceName = e.dcDeviceName.replace(/[\[\]]/g,'').split(',');
e.aryRemark = aryRemark;
e.aryState = resJson.map(x=>x.result.code)
e.aryState = resCodes
e.arydcDeviceType = resParam.map(x=>enum_deviceType[x.deviceType])
});
this.tableData = result.rows;
@ -686,7 +705,12 @@ export default {
// },
};
</script>
<style lang='scss' scoped>
::v-deep .el-table .cell {
text-overflow: clip !important;
-webkit-line-clamp: 100;
}
</style>
<style lang="scss">
div.el-popper.global-input-search-popover {
background: rgba(6, 66, 88, 0.8);

74
ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/HomeTraffic/index.vue

@ -17,6 +17,7 @@
:step="1"
:max="max"
:marks="marks"
@change="sliderChange"
:format-tooltip="formatTooltip"
show-stops>
</el-slider>
@ -54,13 +55,60 @@ export default {
max:100,
silderVisible: false,
isPlay: false,
lnglats:{}
lnglats:{},
lnglatsNode: {},
nodeList: []
};
},
created() {
this.activeIcon = window.showStakeText ? 'Vector' : null;
},
methods: {
drawThumbail(list){
this.nodeList.forEach(e => {
window.graphInstance.removeNode(e)
});
this.nodeList = []
list.forEach(e => {
const id = e.event_id;
const a = e.start_pile_no;
const b = e.end_pile_no;
let xA = a, xB = b;
if(a>b){
xA = b;
xB = a;
}
if(xA>=54.394 && xB<209){
xA = (xA- 54.394) * window.canvasRatio + window.canvasWidth * window.offsetRatio;
xB = (xB- 54.394) * window.canvasRatio + window.canvasWidth * window.offsetRatio;
window.graphInstance.addNode({
id:id,
x: xA,
y: e.dir_code==='DOWN'?60:120,
width: (xB-xA),
height: 8,
zIndex:0,
attrs: {
body: {
fill: {
type: 'linearGradient',
stops: [
{ offset: '0%', color: enum_color[e.pub_run_status] },
{ offset: '100%', color: enum_color[e.pub_run_status] },
],
},
strokeWidth: 0
}
}
});
this.nodeList.push(id)
}
});
},
formatTooltip(val) {
if(this.marks[val]){
@ -83,16 +131,25 @@ export default {
this.showLnglat();
setTimeout(() => {
this.updateTick()
}, 2000);
}, 2500);
}
},
sliderChange(t){
this.isPlay = false;
this.showLnglat()
},
handleClick(type) {
this.nodeList.forEach(e => {
window.graphInstance.removeNode(e)
});
this.nodeList = [];
if(this.activeIcon === type){
this.activeIcon = null;
this.isPlay = false;
setTimeout(() => {
Vue.prototype.mapIns.addPointByArr( {pointList:[]}, 'lineLayer', true);
Vue.prototype.mapIns.removeLayerByName('lineLayer');
window.graphInstance.removeNode('roadError')
}, 200);
this.silderVisible = false;
@ -134,6 +191,7 @@ export default {
},
async showLnglat(){
if(!this.lnglats[this.timeTick]){
//
if(this.timeTick === 0){
let res = await request({ url: '/business/traffic-statistics/current/getTheCurrentCongestedSection', method: 'get'});
let aryLine = [];
@ -141,11 +199,13 @@ export default {
const lines = e.link_lng_lats.split(';').map(x=>x.split(','))
aryLine.push({
width: 3, // 线
color: enum_color[e.pub_run_status], // 线
xyArr: lines
color: enum_color[e.pub_run_status], // 线
xyArr: lines,
})
});
});
this.drawThumbail(res.data);
this.lnglats[this.timeTick] = _.cloneDeep(aryLine);
this.lnglatsNode[this.timeTick] = res.data;
} else {
let res = await request({ url: `/system/information/${this.marks[this.timeTick].cid}`, method: 'get'});
let _line = JSON.parse(res.data.otherConfig)
@ -159,7 +219,11 @@ export default {
})
});
this.lnglats[this.timeTick] = _.cloneDeep(aryLine);
this.lnglatsNode[this.timeTick] = _line;
this.drawThumbail(_line);
}
} else {
this.drawThumbail(this.lnglatsNode[this.timeTick]);
}
Vue.prototype.mapIns.addPointByArr( {pointList:[]}, 'lineLayer', true);
Vue.prototype.mapIns.removeLayerByName('lineLayer');

9
ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/HomeWeather/index.vue

@ -155,7 +155,14 @@ export default {
map2d.removeLayerByName('jhweather')
const aryPoints = [];
list.forEach(e=>{
let cityWeather = getWeatherFormat(e,true)
let z = e;
if(z.forecastList && z.forecastList.length > 0){
z.forecastList.sort((a, b) => moment.duration(moment(b.weatherTime).diff(moment(a.weatherTime))))
z = {...z,...e.forecastList[0]}
z.weatherTime = z.forecastTime;
}
let cityWeather = getWeatherFormat(z,true)
const item = {
title:'短临预报',
};

27
ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/InfoBoard/InfoBoard.vue

@ -85,11 +85,10 @@
</div>
<div class="dialogContent_bottom_btn">
<el-button class="btnInfoBoard" type="add" @click.native="____onAddDeviceItem()">添加信息</el-button>
<el-button class="btnInfoBoard" type="publish" @click="____publishInfo"
:disabled="selectedBdMsg.length <= 0 ||
(isMultiControl && selectItems.length === 0) ||
(!isMultiControl && [undefined, null].indexOf(selectedDevice.iotDeviceId) !== -1
)
<el-button class="btnInfoBoard" type="publish" @click="____publishInfo" :disabled="selectedBdMsg.length <= 0 ||
(isMultiControl && selectItems.length === 0) ||
(!isMultiControl && [undefined, null].indexOf(selectedDevice.iotDeviceId) !== -1
)
">发布信息</el-button>
</div>
<div class="sideSwitch" @click="____onShowTemplate">
@ -243,7 +242,7 @@ export default {
type: Array,
default: () => []
},
selectedSizeMutl:{
selectedSizeMutl: {
type: String
}
},
@ -254,8 +253,8 @@ export default {
this.____initData();
},
immediate: true,
},selectedSizeMutl:{
handler(v){
}, selectedSizeMutl: {
handler(v) {
this.selectedSize = v;
this.____initData();
}
@ -271,7 +270,7 @@ export default {
CameraShower,
},
created() {
},
computed: {},
async mounted() {
@ -307,7 +306,7 @@ export default {
},
//
async ____initData() {
if(this.selectedDevice?.otherConfig){
if (this.selectedDevice?.otherConfig) {
this.selectedSize = JSON.parse(this.selectedDevice.otherConfig).screenSize;
}
if (this.tplCategory.length && this.templateAll.length) {
@ -317,10 +316,10 @@ export default {
await this.____getAllTemplate();
this.____setAvailableTemplate();
}
if (!this.isMultiControl){
if (!this.isMultiControl) {
this.____getDeviceInfo();
}
},
//
____getDeviceInfo() {
@ -336,8 +335,8 @@ export default {
})
.catch((err) => { });
else {
// this.$emit("update:visible", false);
// this.isShowTemplate = false;
// this.$emit("update:visible", false);
// this.isShowTemplate = false;
this.$message.error("设备未接入");
}
}

25
ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/RoadAndEvents/index.vue

@ -39,6 +39,8 @@
<script>
import { getLayerData } from "./utils/layerImages";
import { debounce } from "lodash";
import { delay } from "@screen/utils/common";
import { eventMap, cacheRemoveFunc, getHandleDeviceType } from "./utils/buttonEvent";
import Bg1 from "@screen/components/Decorations/bg-1.vue"
@ -165,9 +167,9 @@ export default {
async handler(bool) {
if (!bool) return;
await Promise.allSettled((this.tabContentData || []).map(item => this.handleDeviceImmediate(item, true)))
Object.keys(lngLatMap).forEach(key => {
addInGraphHandle(lngLatMap[key]);
});
// Object.keys(lngLatMap).forEach(key => {
// addInGraphHandle(lngLatMap[key]);
// });
}
}
},
@ -303,19 +305,22 @@ export default {
await this.handleDeviceImmediate(item,true);
})
},
handleCleared() {
this.layerData.forEach(({ children }) => {
children.forEach(item => item.status = "")
});
async handleCleared() {
//
for (const key in cacheRemoveFunc) {
cacheRemoveFunc[key]?.();
}
this.layerData.forEach(({ children }) => {
children.forEach(item => item.status = "")
});
setTimeout(() => {
//
for (const key in cacheRemoveFunc) {
cacheRemoveFunc[key]?.();
}
}, 200);
if(this.mapContainer === 'AMapContainer'){
const { mapIns } = this.getMap();
if (!mapIns) return;

5
ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/RoadAndEvents/utils/buttonEvent.js

@ -340,9 +340,7 @@ export const eventMap = {
iconClass: "el-icon-loading",
});
}
// if (!isDefault) {
// }
const warningState = 1;
const data = await getPerceiveEventList({ warningState }, filterData)
.then(async (data) => {
@ -371,6 +369,7 @@ export const eventMap = {
resolveDataOptions.call(this, item, options, "PerceiveEvent", isDefault)
);
addDataPreHandle(removeData);
markerClusterIns.addData(removeData, isDefault);
this.emitter.emit("selectedCompleted", item);

63
ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Thumbnail/index.vue

@ -62,7 +62,8 @@ export default {
list: [], // *canvasItem.distance
translateX: 0,
translateY: 50,
allInstance: 0
allInstance: 0,
width: window.innerWidth
};
},
props: {
@ -81,11 +82,15 @@ export default {
// this.allInstance = 0
// this.mapInit();
// });
window.addEventListener("resize", () => {
if (this.timeout) clearTimeout(this.timeout);
this.timeout = setTimeout(() => {
this.debug();
}, 200);
window.addEventListener("resize", (x) => {
if(this.width !== window.innerWidth){
if (this.timeout) clearTimeout(this.timeout);
this.timeout = setTimeout(() => {
this.width = window.innerWidth
this.debug();
}, 200);
}
});
},
methods: {
@ -167,6 +172,18 @@ export default {
height = content.clientHeight;
const baseData = {
nodes: [
{
type: "text",
label: "⇦ 济南方向",
x: 66,
y: height / 2 - 50,
attrs: {
text: {
fontSize: 12,
fill: "#7dd7fe",
}
}
},
{
type: "text",
label: "G2001济南绕城高速",
@ -179,6 +196,18 @@ export default {
}
}
},
{
type: "text",
label: "菏泽方向 ⇨",
x: width - 50,
y: height - 50,
attrs: {
text: {
fontSize: 12,
fill: "#7dd7fe",
}
}
},
{
type: "text",
label: "G3021德上高速",
@ -289,6 +318,17 @@ export default {
const { shape, nowBg, src, length } = data;
const { height, width } = node.prop().size;
const div = document.createElement('div')
let marginHeight = (data.extData.direction === '3'?height*-.3:height*2.2)
if(data.length && data.extNode.length > 1){
let d1 = data.extNode.filter(x=>x.extData.direction === '1')
let d3 = data.extNode.filter(x=>x.extData.direction === '3')
if(d1.length > 0 && d3.length > 0){
marginHeight = (height)
}
}
if (shape === "singleNode-html") {
div.innerHTML = `
<div style="
@ -296,7 +336,8 @@ export default {
background-size: 100% 100%;
background-repeat: no-repeat;
width: ${width * 1.2}px;
height: ${height * 1.2}px;
height: ${height * 1.2}px;
margin-top:${marginHeight}px;
display: flex;
justify-content: center;
">
@ -319,6 +360,7 @@ export default {
align-items: center;
width: ${width * 1.2}px;
height: ${height * 1.2}px;
margin-top:${marginHeight}px;
padding-bottom: ${height * 0.1}px;
">
${length}
@ -330,15 +372,19 @@ export default {
})
window.graphInstance = graph;
//
graph.addNodes(baseData.nodes);
this.drawCongestionAreas(graph, 1404, 80);
//
// this.drawCongestionAreas(graph, 1404, 80);
const ratio = ((width - width * 0.08 * 2) / allActualDis); //
window.canvasRatio = ratio;
window.canvasWidth = width;
window.offsetRatio = 0.0755;
// /
this.list.forEach(item => this.allInstance += item.distance);
for (let index in this.list) {
const info = this.list[index];
@ -450,7 +496,6 @@ export default {
drawCongestionAreas(graph, x, y) {
// x = translateX * -1 + x;
// y = translateY * -1 + y;
const rectWidth = 160;
const rectHeight = 8;

16
ruoyi-ui/src/views/JiHeExpressway/pages/control/device/record/index.vue

@ -166,18 +166,24 @@ export default {
result.rows.forEach(e => {
const resJson = JSON.parse(e.jsonResult)
const resCodes = [];
const resCodesDeivce = [];
for(let i of resJson){
if(resCodesDeivce.indexOf(i.device) === -1){
resCodesDeivce.push(i.device)
resCodes.push(i.result.code)
}
}
const resParam = JSON.parse(e.operParam)[0].devices
const aryRemark = [];
e.remark.split(',').filter(x=>{
x.split('、').filter(y=>{
aryRemark.push(y)
})
e.remark.split('_').filter(x=>{
aryRemark.push(x)
})
e.operTime= moment(e.operTime).format('YYYY-MM-DD HH:mm:ss')
e.operType= _.find(this.Enum_ControlType, { key: e.operType }).label
e.arydcDeviceName = e.dcDeviceName.replace(/[\[\]]/g,'').split(',');
e.aryRemark = aryRemark;
e.aryState = resJson.map(x=>x.result.code)
e.aryState = resCodes
e.arydcDeviceType = resParam.map(x=>enum_deviceType[x.deviceType])
})

7
ruoyi-ui/src/views/JiHeExpressway/pages/control/device/strategy/components/AddNEditDialog.vue

@ -2,7 +2,8 @@
<Dialog
v-model="modelVisible"
top="10%"
:title="propData.id ? '修改' : '新增'"
style="z-index: 2049;"
:title="propData.id ? '管理' : '新增'"
width="1000px"
>
<div class="AddNEditDialog">
@ -284,6 +285,9 @@ export default {
if (Object.keys(this.selectedTaskGroup).length > 0) {
let aryTime = time.split(':')
if(aryTime.length === 3){
if(aryTime[0].length === 1){
aryTime[0] = '0'+aryTime[0]
}
if(aryTime[1].length === 1){
aryTime[1] = '0'+aryTime[1]
}
@ -370,6 +374,7 @@ export default {
});
this.$set(item, "tasksEdit", arr);
// item.tasksEdit = arr;
console.log(this.taskGroupsEditing,333344)
});
});
}

4
ruoyi-ui/src/views/JiHeExpressway/pages/control/device/strategy/components/taskEditDialog.vue

@ -1,5 +1,5 @@
<template>
<Dialog v-model="modelVisible" title="修改" width="600px" label-width="120px">
<Dialog v-model="modelVisible" title="修改" width="600px" label-width="120px" style="z-index: 2050;">
<el-form>
<el-form-item label="设备类型">
<!-- <el-radio-group v-model="searchData.deviceType" @input="onChange">
@ -328,7 +328,7 @@ export default {
this.$message.error('请选择工作模式')
return;
}
if(!params.SETTM){
if(params.SETTM === undefined){
this.$message.error('请输入工作时长')
return;
}

6
ruoyi-ui/src/views/JiHeExpressway/pages/control/device/strategy/components/timeEditDialog.vue

@ -1,15 +1,15 @@
<template>
<Dialog v-model="modelVisible" title="触发时间设置" width="400px" label-width="120px">
<Dialog v-model="modelVisible" title="触发时间设置" width="400px" label-width="120px" style="z-index: 2050;">
<el-form>
<el-form-item label="时(支持cron表达式)">
<el-input-number :min="0" :max="24" v-model="editData.hour"></el-input-number>
</el-form-item>
<el-form-item label="分(支持cron表达式)">
<el-input-number :min="0" :max="60" v-model="editData.minute"></el-input-number>
<el-input-number :min="0" :max="59" v-model="editData.minute"></el-input-number>
</el-form-item>
<el-form-item label="秒(固定值 0)">
<el-input-number value="0" :disabled="true"></el-input-number>
<el-input-number value="00" :disabled="true"></el-input-number>
</el-form-item>
<el-form-item>
<el-button size="mini" type="primary" @click="onSubmit">保存</el-button>

496
ruoyi-ui/src/views/JiHeExpressway/pages/control/device/strategy/componentsAdd/AddDialog.vue

@ -0,0 +1,496 @@
<template>
<Dialog
v-model="modelVisible"
top="10%"
:title="'新增'"
width="1000px"
>
<div class="AddNEditDialog">
<el-form
ref="basicInfoForm"
:model="editData"
label-width="60px"
:inline="true"
:rules="groupBasicRules"
>
<el-row :gutter="5" >
<el-col :span="10">
<el-form-item label="名称" prop="groupName">
<el-input
v-model="editData.groupName"
placeholder="任务组名称" style="width: 320px;"
></el-input>
</el-form-item>
</el-col>
<el-col :span="10">
<el-form-item label="描述" prop="remark">
<el-input
v-model="editData.remark"
placeholder="任务组描述" style="width: 320px"
></el-input>
</el-form-item>
</el-col>
<el-col :span="4">
<div style="display: flex; justify-content: center;padding-top: 5px;">
<Button
@click.native="(modelVisible = false), (submitting = false)"
type="info" style="background-color: #3d697f;margin-right: 20px;"
>
取消
</Button>
<Button
type="primary"
@click.native="onSaveTaskGroup"
:loading="submitting"
>
保存
</Button>
</div></el-col>
</el-row>
</el-form>
<div class="line" ></div>
<template >
<!-- 如果是新增的还没有保存的任务组不能添加任务 -->
<div class="fl-around task_op">
<el-button size="mini" type="primary" @click="onAddTaskGroup"
>新增任务组</el-button
>
</div>
<div class="all_groups">
<div
class="task_group"
v-for="(taskGroup, index) in taskGroupsEditing"
>
<div class="fl-around task_info">
<div class="time_show">
<div
class="time_label"
>{{ taskGroup.time }}</div>
<img src="./assets/editor.svg" @click="onModifyTime(taskGroup)" class="arrow" />
</div>
<div class="fl-around task_op">
<el-button
size="mini"
type="primary"
@click="onAddTaskItem(index)"
>新增子任务</el-button
>
<el-button
size="mini"
type="danger"
@click="onDeleteTaskGroup(index)"
>删除任务组</el-button
>
</div>
</div>
<div>
<TaskItem
v-for="(item, idx) in taskGroup.tasksEdit"
:propData="item"
:groupIndex="[index,idx]"
@onModify="onEditTaskItem"
@onDelete="onDeleteTaskItem"
>
</TaskItem>
</div>
</div>
</div>
</template>
</div>
<template #footer> </template>
<taskEditDialog
v-model="isEditing"
:groupIndex="[-1,-1]"
:propData="selectedTaskData"
@onSubmit="onSubmitTaskItem"
/>
<timeEditDialog
v-model="isShowTimeEdit"
:propData="editingTime"
@onSubmit="onSubmitTime"
/>
</Dialog>
</template>
<script>
import Dialog from "@screen/components/Dialog/index.vue";
import Button from "@screen/components/Buttons/Button.vue";
import Form from "@screen/components/FormConfig";
import request from "@/utils/request";
import { Message } from "element-ui";
import { addEditFormList } from "./../data";
import taskEditDialog from "./taskEditDialog.vue";
import timeEditDialog from "./timeEditDialog.vue";
import TaskItem from "./TaskItem.vue";
export default {
name: "AddNEditDialog",
components: {
Dialog,
Button,
Form,
TaskItem,
taskEditDialog,
timeEditDialog,
},
model: {
prop: "visible",
event: "update:value",
},
props: {
visible: Boolean,
},
data() {
let gNameValidator = (rule, value, callback) => {
return callback(new Error("请输入任务组名称"));
};
return {
editingTime: "",
editData: {},
mode: "",
isEditing: false,
isShowTimeEdit: false,
group: {},
submitting: false,
formList: addEditFormList,
taskGroupsEditing: [],
selectedTaskGroup: {},
selectedTaskIndex: -1,
selectedTaskData: {},
groupBasicRules: {
groupName: [
{ required: true, message: "请输入活动名称", trigger: "blur" },
],
},
selectedGroupIndex: -1,
};
},
computed: {
modelVisible: {
get() {
return this.visible;
},
set(val) {
this.$emit("onSuccess");
this.$emit("update:value", val);
},
},
},
watch: {
modelVisible: {
immediate: true,
handler(bool) {
if (!bool) return;
this.initEditingData();
},
},
},
mounted() {
},
methods: {
initEditingData() {
this.taskGroupsEditing = [{time:"08:00:00",tasksEdit:[]}];
this.mode = "add";
this.editData = {
groupName: "",
remark: "",
detailedConfiguration: '[]',
};
},
//
onAddTaskGroup() {
this.editingTime = "0:0:0";
this.isShowTimeEdit = true;
this.selectedGroupIndex = -1;
},
onDeleteTaskGroup(index) {
this.$confirm("确定要删除任务组?", "操作确认", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
})
.then(() => {
const _tastInfo = _.cloneDeep(this.taskGroupsEditing);
_tastInfo.splice(index,1);
setTimeout(() => {
this.taskGroupsEditing =_tastInfo
}, 100);
})
.catch(() => {
this.$message.warn("取消删除。");
});
},
onAddTaskItem(taskGroupIndex) {
this.selectedTaskGroupIndex = taskGroupIndex;
this.selectedTaskIndex = -1;
this.selectedTaskData = {};
this.isEditing = true;
},
onDeleteTaskItem(groupIndex){
const _tastInfo = _.cloneDeep(this.taskGroupsEditing);
_tastInfo[groupIndex[0]].tasksEdit.splice(groupIndex[1],1);
setTimeout(() => {
this.taskGroupsEditing =_tastInfo
}, 100);
},
onEditTaskItem(groupIndex){
this.selectedTaskGroupIndex = groupIndex[0];
this.selectedTaskIndex = groupIndex[1];
this.selectedTaskData = this.taskGroupsEditing[this.selectedTaskGroupIndex].tasksEdit[this.selectedTaskIndex];
this.isEditing = true;
},
onSubmitTaskItem(data) {
this.isEditing = false;
const tastInfo = {
direction:data.others.direction,
deviceType:data.others.deviceType,
devices: data.devices,
params:data.params,
screenSize:data.others.screenSize,
others:data.others
}
const _tastInfo = _.cloneDeep(this.taskGroupsEditing);
this.taskGroupsEditing = []
setTimeout(() => {
if(this.selectedTaskIndex === -1){
_tastInfo[this.selectedTaskGroupIndex].tasksEdit.push(tastInfo)
} else {
_tastInfo[this.selectedTaskGroupIndex].tasksEdit[this.selectedTaskIndex] = tastInfo
}
this.taskGroupsEditing =_tastInfo
}, 100);
},
onModifyTime(taskG) {
this.editingTime = taskG.time;
this.selectedTaskGroup = taskG;
this.isShowTimeEdit = true;
},
onSubmitTime(time) {
this.isShowTimeEdit = false;
let aryTime = time.split(':')
if(aryTime.length === 3){
if(aryTime[0].length === 1){
aryTime[0] = '0'+aryTime[0]
}
if(aryTime[1].length === 1){
aryTime[1] = '0'+aryTime[1]
}
if(aryTime[2].length === 1){
aryTime[2] = '0'+aryTime[1]
}
}
let _time = aryTime.join(':');
if (Object.keys(this.selectedTaskGroup).length > 0) {
this.selectedTaskGroup.time = _time;
this.selectedTaskGroup = {};
} else {
this.taskGroupsEditing.push({ time:_time, tasksEdit: [] });
}
},
onSaveTaskGroup() {
this.$refs['basicInfoForm'].validate((valid) => {
if (!valid) {
return;
}
let submitForm = {
groupName: this.editData.groupName.trim(),
status: "1",
remark: this.editData.remark.trim(),
detailedConfiguration: "",
dcBatchFunctionsJobList:[]
}
function formatParamter (devices, params, others){
let functions;
let deviceType = others.deviceType;
if (deviceType == '2'){ //
functions = [
{
"functionId": "11",
"params": {
"size": "65535",
"fileName": "play012.lst"
}
},
{
"functionId": "13",
"params": {
parameters: [params]
}
},
{
"functionId": "1B",
"params": {
"fileId": "12"
}
}
]
} else if (deviceType == '5'){ //广
functions = [
{
"functionId": "",
"params": {
"name": "task-3",
"outVol": "6",
"priority": "1",
"text": params.text,
"repeatTimes": "3",
"termList": [
{
"zoneld": "6001",
"termDN": "601"
}
],
"functionType": "startPaTts"
}
}
]
} else if (deviceType == '10') { //
functions = [
{
"functionId": "SETMD",
"params": { SET: params.SETMD }
},
{
"functionId": "SETTM",
"params": { SET: params.SETTM }
}
]
} else if (deviceType == '12') { //
// { mode: "00", onWorkStatus: "01", inWorkStatus: "02" }
functions = [{ functionId: "51", params }]
} else if (deviceType == '13') { //
functions = [
{
"functionId": "SETMD",
"params": { SET: params.SETMD }
},
{
"functionId": "SETTM",
"params": { SET: params.SETTM }
}
]
}
let temp = {
...others,
devices,
functions
};
return temp
}
this.taskGroupsEditing.forEach((t,idx) => {
let arycallParameter = [];
t.tasksEdit.forEach(e=>{
arycallParameter.push(formatParamter(e.devices,e.params,e.others))
})
submitForm.dcBatchFunctionsJobList.push({
"jobId": idx,
"jobName": "",
"invokeTarget": "com.zc.business.task.ScheduledTaskSchedulingTask.invokeTarget()",
"callParameter": JSON.stringify(arycallParameter),
"status": "0",
"time": t.time
})
});
this.submitting = true;
request({
url: `/business/dcBatchFunctionsJobGroup/add`,
method: "POST",
data: submitForm,
})
.then((result) => {
if (result.code != 200) return;
Message.success(`保存成功`);
this.$emit("onSuccess");
})
.catch((err) => {
console.log(
"%c [ err ]-110-「DeviceControlDialog.vue」",
"font-size:15px; background:#547bf2; color:#98bfff;",
err
);
// Message.error(``);
})
.finally(() => {
this.submitting = false;
});
});
},
},
};
</script>
<style lang="scss" scoped>
.AddNEditDialog {
width: 100%;
display: flex;
flex-direction: column;
gap: 15px;
.tips {
font-size: 12px;
}
}
.line{
height:1px;
width: 100%;
border-bottom: 1px dashed #00B3CC;
}
.all_groups {
max-height: 500px;
overflow-y: scroll;
padding-right: 5px;
}
.task_group {
border: 1px solid #09b;
margin-bottom: 20px;
.task_info {
padding: 10px;
background: #004050;
.time_show {
display: flex;
justify-content: center;
align-items: center;
.time_label{
width: 160px;
border:1px solid #2B93A5;
border-radius: 5px;
color:#2ab8a9;
height: 22px;
line-height: 20px;
padding-left: 5px;
}
.arrow{
width:20px;
height: 20px;
margin-left: 10px;
cursor: pointer;
}
color: #0ac;
}
}
.task_op {
}
}
</style>

226
ruoyi-ui/src/views/JiHeExpressway/pages/control/device/strategy/componentsAdd/TaskItem.vue

@ -0,0 +1,226 @@
<template>
<div class="task_editor_box" v-if="isCompReady">
<div class="flex main_ctt">
<div class="device_type">
<span v-if="editData.deviceType">{{ deviceTypeDic[editData.deviceType].label }}</span>
</div>
<div class="devices">
<template v-if="editData.devices">
<span v-for="item, index in editData.devices" v-if="index < 1" class="title">
{{ item.deviceName }}
</span>
<span v-if="editData.devices.length > 1" class="other">+{{ editData.devices.length - 1 }}</span>
</template>
</div>
<div class="content">
<template v-if="editData.deviceType == '2'">
<BoardRecordPreview :tpl="editData.params" class="board">
</BoardRecordPreview>
</template>
<template v-if="editData.deviceType == '5'">
<div class="textArea">{{ editData.params.text }}</div>
</template>
<template v-if="editData.deviceType == '10' || editData.deviceType == '13'">
<div class="center mode10">
<div class="mode10_m">
<div
:class="awakerWorkModeDic[editData.params.SETMD] !== '常亮模式' ? 'mode10_mc mode10_mc2' : 'mode10_mc mode10_mc1'">
</div>{{ awakerWorkModeDic[editData.params.SETMD] }}
</div>
<div>时长<span style="color:#15a5c0">{{ editData.params.SETTM }}分钟</span></div>
</div>
</template>
<template v-if="editData.deviceType == '12'">
<div class="center mode10">
<div class="mode10_m">
<div
:class="inducerModeDic[editData.params.mode] !== '常亮模式' ? 'mode10_mc mode10_mc2' : 'mode10_mc mode10_mc1'">
</div>{{ inducerModeDic[editData.params.mode] }}
</div>
<div>
<p>上行{{ inducerWorkType[editData.params.onWorkStatus] }}</p>
<p>下行{{ inducerWorkType[editData.params.inWorkStatus] }}</p>
</div>
</div>
</template>
</div>
<div class="button">
<el-button type="primary" icon="el-icon-edit" size="mini" circle @click="onModify"></el-button>
<el-button type="danger" icon="el-icon-delete" size="mini" circle @click="onDelete"></el-button>
</div>
</div>
</div>
</template>
<script>
import request from "@/utils/request";
import { deviceTypeDic, awakerWorkModeDic, inducerWorkTypeDic, inducerModeDic } from "@screen/utils/enum.js"
import { getDeviceList } from "@screen/utils/api/device.js"
import BoardRecordPreview from '@screen/components/infoBoard/BoardRecordPreview.vue'
export default {
name: "TaskItem",
components: {
BoardRecordPreview
},
props: {
groupIndex: Array,
propData: Object
},
data() {
return {
isCompReady: false,
editData: {},
isEditingTask: false,
selectedType: "",
deviceTypeDic: "",
awakerWorkModeDic: "",
inducerModeDic: "",
inducerWorkType: "",
deviceDic: {},
deviceList: []
};
},
computed: {
},
watch: {
},
mounted() {
this.deviceTypeDic = deviceTypeDic;
this.awakerWorkModeDic = awakerWorkModeDic;
this.inducerModeDic = inducerModeDic;
this.inducerWorkType = inducerWorkTypeDic;
this.editData = {
direction: this.propData.direction,
deviceType: this.propData.deviceType,
devices: this.propData.devices,
params: this.propData.params,
screenSize: this.propData.screenSize
};
this.isCompReady = true;
},
methods: {
onModify() {
this.$emit("onModify", this.groupIndex);
},
onDelete() {
this.$emit("onDelete", this.groupIndex);
},
},
};
</script>
<style lang="scss" scoped>
.task_editor_box {
.main_ctt {
align-items: stretch;
border-top: 1px dashed #0AC;
padding: 6px 8px;
max-height: 80px;
.device_type {
width: 200px;
display: flex;
flex-direction: row;
align-items: center;
}
.devices {
flex: 1;
display: flex;
flex-wrap: wrap;
align-items: center;
span {
font-size: 14px;
margin: 0 4px 3px 0;
border-radius: 3px;
white-space: nowrap;
word-break: break-all;
float: left;
}
.title {
border: 1px solid #0AC;
padding: 2px 8px;
}
.other {
padding: 3px 5px;
border: 1px solid #00b3cc;
color: #00b3cc;
border-radius: 3px;
}
}
.content {
width: 300px;
display: flex;
align-items: stretch;
.board {
flex: 1;
}
.textArea {
flex: 1;
display: flex;
overflow-y: auto;
overflow-x: hidden;
background-color: #000;
color: yellow;
}
.center {
flex: 1;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}
}
.button {
width: 120px;
margin-left: 10px;
display: flex;
align-items: center;
justify-content: flex-end;
}
}
}
.mode10 {
display: flex;
flex-direction: row !important;
justify-content: flex-start !important;
.mode10_m {
margin-right: 30px;
display: flex;
align-items: center;
.mode10_mc {
width: 10px;
height: 10px;
border-radius: 50%;
margin-right: 10px;
}
.mode10_mc1 {
background-color: #15a5c0;
}
.mode10_mc2 {
width: 10px;
background-color: #eef54e;
}
}
}
</style>

19
ruoyi-ui/src/views/JiHeExpressway/pages/control/device/strategy/componentsAdd/assets/editor.svg

@ -0,0 +1,19 @@
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Group 1321314660">
<g id="Group 1321314647">
<circle id="Ellipse 41" cx="9" cy="9" r="9" fill="url(#paint0_linear_1192_398)"/>
</g>
<g id="Frame" clip-path="url(#clip0_1192_398)">
<path id="Vector" d="M13.6582 13.8242H4.3418C4.16921 13.8242 4.0293 13.6843 4.0293 13.5117C4.0293 13.3391 4.16921 13.1992 4.3418 13.1992H13.6582C13.8308 13.1992 13.9707 13.3391 13.9707 13.5117C13.9707 13.6843 13.8308 13.8242 13.6582 13.8242ZM4.18555 13.2578L4.89844 11.1875L6.90039 13.2676L4.18555 13.2578ZM5.46484 10.4941L7.4375 12.5351L11.7734 8.20896L9.78125 6.207L5.46484 10.4941ZM10.4355 5.44529L12.4082 7.41794L12.9746 6.832C12.9746 6.832 13.1895 6.5195 13.1211 6.27536C13.0527 6.03122 11.8223 4.94724 11.6855 4.81052C11.5488 4.6738 11.2852 4.69333 10.9922 4.93747C10.6992 5.18161 10.4355 5.44529 10.4355 5.44529Z" fill="white"/>
</g>
</g>
<defs>
<linearGradient id="paint0_linear_1192_398" x1="8.67672" y1="3.43511" x2="8.67672" y2="17.5878" gradientUnits="userSpaceOnUse">
<stop stop-color="#39D5BF"/>
<stop offset="1" stop-color="#1FAED6"/>
</linearGradient>
<clipPath id="clip0_1192_398">
<rect width="10" height="10" fill="white" transform="translate(4 4)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

466
ruoyi-ui/src/views/JiHeExpressway/pages/control/device/strategy/componentsAdd/taskEditDialog.vue

@ -0,0 +1,466 @@
<template>
<Dialog v-model="modelVisible" title="修改" width="600px" label-width="120px">
<el-form>
<el-form-item label="设备类型">
<!-- <el-radio-group v-model="searchData.deviceType" @input="onChange">
<el-radio-button v-for="item in deviceTypeOptions" :key="item.value" :label="item.label" :value="item.value"
v-if="item.timingControl"></el-radio-button>
</el-radio-group> -->
<el-select v-model="searchData.deviceType" placeholder="请选择设备类型" @change="onSelectDeviceType"
:disabled="mode=='edit'">
<el-option v-for="item in deviceTypeOptions" :key="item.value" :label="item.label" :value="item.value+''"
v-if="item.timingControl">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="方向">
<el-select v-model="searchData.direction" placeholder="请选择方向" @change="onChange" clearable>
<el-option v-for="item in directionOptions" :key="item.value" :label="item.label" :value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="选择设备" v-if="searchData.deviceType != '2'">
<el-select v-model="editData.devices" multiple placeholder="请选择设备" filterable>
<el-option v-for="item in deviceArr" :key="item.id" :label="item.deviceName" :value="item.id">
</el-option>
</el-select>
</el-form-item>
<template v-if="searchData.deviceType=='2'">
<el-form-item label="屏幕像素">
<el-select v-model="filterData.screenSize" placeholder="请选择" clearable @change="resetEditData">
<el-option v-for="item in boardPixelOptions" :key="item.value" :label="item.label" :value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="选择设备">
<el-select v-model="editData.devices" multiple placeholder="请选择设备" filterable>
<el-option v-for="item in deviceArr" :key="item.id" :label="item.deviceName" :value="item.id"
v-if="item.screenSize == filterData.screenSize">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="预览" v-if="filterData.screenSize">
<div class="tplItem">
<!-- 模板内容 -->
<BoardPreview class="boardPreview" :boardWH="filterData.screenSize" :tpl="editData.type2" />
<!-- 操作按钮 -->
<div class="infoBtnBox">
<el-tooltip content="编辑" placement="top">
<p @click="onEditBoard" class="btn btnEdit"></p>
</el-tooltip>
</div>
</div>
</el-form-item>
</template>
<template v-else-if="searchData.deviceType == '5'">
<!-- 语音广播 -->
<el-form-item label="广播内容">
<el-input type="textarea" :maxlength="150" v-model="editData.type5.text"></el-input>
</el-form-item>
</template>
<template v-else-if="searchData.deviceType == '10'">
<!-- 激光疲劳唤醒 -->
<el-form-item label="工作模式">
<el-select v-model="editData.type10.SETMD" placeholder="请选择">
<el-option v-for="value,key in awakerWorkModeDic" :key="key" :label="value" :value="key" />
</el-select>
</el-form-item>
<el-form-item label="工作时长">
<el-col :span="8">
<el-input-number v-model="editData.type10.SETTM" :min="0" :max="100000" />
</el-col>
<el-col :span="4" style="margin-left: 10px;">分钟</el-col>
</el-form-item>
</template>
<template v-else-if="searchData.deviceType == '12'">
<!-- 行车诱导 -->
<el-alert title="行车诱导设备开启后无法自动关闭,需要再新增一个定时任务将其关闭。" type="warning" :closable="false" show-icon>
</el-alert>
<el-form-item label="工作模式(定时控制只能使用手动模式)">
<el-select v-model="editData.type12.mode" placeholder="请选择" disabled>
<el-option v-for="value, key in inducerModeDic" :key="key" :label="value" :value="key" />
</el-select>
</el-form-item>
<el-form-item label="上行工作模式">
<el-select v-model="editData.type12.onWorkStatus" placeholder="请选择">
<el-option v-for="value, key in inducerWorkTypeDic" :key="key" :label="value" :value="key" />
</el-select>
</el-form-item>
<el-form-item label="下行工作模式">
<el-select v-model="editData.type12.inWorkStatus" placeholder="请选择">
<el-option v-for="value, key in inducerWorkTypeDic" :key="key" :label="value" :value="key" />
</el-select>
</el-form-item>
</template>
<template v-else-if="searchData.deviceType == '13'">
<!-- 智能设备箱 -->
<el-form-item label="工作模式">
<el-select v-model="editData.type13.SETMD" placeholder="请选择">
<el-option v-for="value, key in awakerWorkModeDic" :key="key" :label="value" :value="key" />
</el-select>
</el-form-item>
<el-form-item label="工作时长">
<el-col :span="8">
<el-input-number v-model="editData.type13.SETTM" :min="0" :max="100000" />
</el-col>
<el-col :span="4" style="margin-left: 10px;">分钟</el-col>
</el-form-item>
</template>
<el-form-item style="display: flex; justify-content: flex-end;">
<el-button size="mini" type="primary" @click="onSubmit">保存</el-button>
</el-form-item>
</el-form>
<BoardInfoEditor @afterSubmit="____onEditSubmit" :mode="editDialog.mode" :type="editDialog.type"
:visible.sync="editDialog.visible" :screenSize="filterData.screenSize" :tpl="editDialog.tpl"></BoardInfoEditor>
</Dialog>
</template>
<script>
import Dialog from "@screen/components/Dialog/index.vue";
import { deviceTypeOptions, directionOptions, awakerWorkModeDic, inducerModeDic, inducerWorkTypeDic } from "@screen/utils/enum.js"
import { getDeviceList } from "@screen/utils/api/device.js"
import BoardPreview from "@screen/components/infoBoard/BoardPreview.vue";
import BoardInfoEditor from "@screen/components/infoBoard/BoardInfoEditor";
import BoardUtils from "@screen/utils/infoBoard.js"
import { submitTaskRequest } from "@screen/utils/api/batch.js"
export default {
name: "taskEditDialog",
components: {
Dialog, BoardInfoEditor, BoardPreview
},
model: {
prop: "visible",
event: "update:value",
},
props: {
deviceDic:Object,
deviceList:Array,
groupId: Number,
time: String,
visible: Boolean,
propData: Object
},
data() {
return {
mode:"add",
deviceTypeOptions,
directionOptions,
awakerWorkModeDic,
inducerModeDic,
inducerWorkTypeDic,
deviceArr:[],
searchData: {
deviceType: "",
direction: ""
},
filterData:{
screenSize:""
},
editData:{
devices:[],
type2:{},
type5:{},
type10:{},
type12:{},
type13:{}
},
editDialog:{}
};
},
computed: {
modelVisible: {
get() {
return this.visible;
},
set(val) {
this.$emit("update:value", val);
},
},
},
watch: {
modelVisible: {
immediate: true,
handler(bool) {
if (!bool) return;
this.initBasicData();
},
},
},
mounted() {
},
methods: {
async initBasicData(){
//props
if (this.propData.deviceType){
this.searchData.deviceType = this.propData.deviceType;
this.searchData.direction = this.propData.direction;
this.filterData.screenSize = this.propData.screenSize;
await this.onChange();
this.editData.devices = _.map(this.propData.devices, "id");
if (this.propData.deviceType == "2"){
this.editData.type2 = BoardUtils.contentToDeviceItem(this.propData.params);
} else if (["5","10","13"].includes(this.propData.deviceType)){
this.editData["type" + this.propData.deviceType] = { ...this.propData.params};
} else if (["12"].includes(this.propData.deviceType)) {
this.editData["type" + this.propData.deviceType] = { ...this.propData.params };
}
this.editData
}else{
this.searchData.deviceType = "";
this.searchData.direction = "";
this.filterData.screenSize = "";
this.editData = {
devices:[],
type2:{},
type5:{},
type10:{},
type12:{},
type13:{}
};
}
},
onEditBoard(){
let arr = this.filterData.screenSize.split("*");
console.log(arr, "传入的尺寸")
this.editDialog = {
visible: true,
mode: this.mode,
type: "device",
tpl: {
...this.editData.type2,
origin:{
displayAreaWidth: arr[0],
displayAreaHeight: arr[1]
}
}
};
},
____onEditSubmit(data){
this.editDialog.visible = false;
this.editData.type2 = data.data;
},
onSubmit(){
// this.boardDataTransform();
let devices = [];
this.deviceArr.forEach((item,index)=>{
if (this.editData.devices.includes(item.id)){
let temp = {
id: item.id,
deviceName: item.deviceName,
iotDeviceId: item.iotDeviceId,
deviceType: item.deviceType,
direction: item.direction
}
if(item.type == '2'){
temp.screenSize = item.screenSize;
}
devices.push(temp);
}
});
if(this.searchData.deviceType === ''){
this.$message.error('请选择设备类型')
return;
}
if(devices.length === 0){
this.$message.error('请选择设备')
return;
}
let params = this.processParams();
// 广
if(this.searchData.deviceType == "5" && (!params.text || params.text === '')){
this.$message.error('请输入广播内容')
return;
}
//
if(this.searchData.deviceType == "10"){
if(!params.SETMD){
this.$message.error('请选择工作模式')
return;
}
if(params.SETTM === undefined){
this.$message.error('请输入工作时长')
return;
}
}
console.log(params.SETTM,333)
//
if(this.searchData.deviceType == "12"){
if(!params.inWorkStatus){
this.$message.error('请选择上行工作模式')
return;
}
if(!params.onWorkStatus){
this.$message.error('请选择下行工作模式')
return;
}
}
this.$emit("onSubmit",{
devices, params, others:{ direction: this.searchData.direction, deviceType: this.searchData.deviceType, screenSize: this.filterData.screenSize }})
},
processParams(){
if(this.searchData.deviceType == "2"){
return BoardUtils.deviceItemToContent(this.editData.type2);
}else if(this.searchData.deviceType == "5"){
return {
text : this.editData.type5.text
}
} else if (this.searchData.deviceType == "10") {
return {
SETMD: this.editData.type10.SETMD,
SETTM: this.editData.type10.SETTM
}
} else if (this.searchData.deviceType == "12") {
return this.editData.type12
} else if (this.searchData.deviceType == "13") {
return {
SETMD: this.editData.type13.SETMD,
SETTM: this.editData.type13.SETTM
}
}
},
onSelectDeviceType(){
if (Object.keys(this.editData['type' + this.searchData.deviceType]).length<=0){
this.editData['type'+this.searchData.deviceType] = {};
}
if (this.searchData.deviceType == "12") {
this.$set(this.editData["type" + this.searchData.deviceType], "mode", "00");
}
this.onChange();
},
async onChange() {
this.resetEditData();
this.deviceArr = [];
const res = await getDeviceList(this.searchData)
if (this.searchData.deviceType == '2'){
res.data.forEach(item => {
item.screenSize = JSON.parse(item.otherConfig).screenSize;
// this.deviceArr.push(item);
})
}
this.deviceArr = res.data;
},
resetEditData(){
this.editData.devices = [];
let arr = this.filterData.screenSize.split("*");
this.editData.type2 = {
origin:{
displayAreaWidth: +arr[0],
displayAreaHeight: +arr[1]
}
};
}
}
};
</script>
<style lang="scss" scoped>
.AddNEditDialog {
width: 100%;
display: flex;
flex-direction: column;
gap: 15px;
.tips {
font-size: 12px;
}
}
.task{
border: 1px solid #FFF;
.task_info{
}
.task_op{
}
}
.tplItem {
margin-right: 14px;
display: flex;
align-items: stretch;
padding-bottom: 10px;
.boardPreview {
border: 1px solid rgba(61, 232, 255, 0.5);
// width: 560px;
// height:80px;
flex: 1;
}
.infoBtnBox {
&.infoBtnBoxSm {
width: 60px;
}
width: 110px;
height: 80px;
display: flex;
margin-left: 10px;
/* // border: solid 1px #05afe3; */
border: 1px solid rgba(61, 232, 255, 0.5);
display: flex;
justify-content: space-around;
align-items: center;
.btn {
background-repeat: no-repeat;
background-size: 100% 100%;
width: 30px;
height: 30px;
&.btnApply {
background-image: url(~@/assets/jihe/images/button/toLeft.svg);
}
&.btnEdit {
background-image: url(~@/assets/jihe/images/button/edit.svg);
}
&.btnDelete {
background-image: url(~@/assets/jihe/images/button/delete.svg);
}
}
i {
font-size: 24px;
color: #666;
padding-left: 4px;
cursor: pointer;
caret-color: rgba(0, 0, 0, 0);
user-select: none;
}
i:hover {
color: #05afe3;
}
.disabledClass {
pointer-events: none;
cursor: auto !important;
color: #ccc;
}
}
}
</style>

166
ruoyi-ui/src/views/JiHeExpressway/pages/control/device/strategy/componentsAdd/timeEditDialog.vue

@ -0,0 +1,166 @@
<template>
<Dialog v-model="modelVisible" title="触发时间设置" width="400px" label-width="120px">
<el-form>
<el-form-item label="时(支持cron表达式)">
<el-input-number :min="0" :max="24" v-model="editData.hour"></el-input-number>
</el-form-item>
<el-form-item label="分(支持cron表达式)">
<el-input-number :min="0" :max="59" v-model="editData.minute"></el-input-number>
</el-form-item>
<el-form-item label="秒(固定值 0)">
<el-input-number value="0" :disabled="true"></el-input-number>
</el-form-item>
<el-form-item>
<el-button size="mini" type="primary" @click="onSubmit">保存</el-button>
</el-form-item>
</el-form>
</Dialog>
</template>
<script>
import Dialog from "@screen/components/Dialog/index.vue";
export default {
name: "timeEditDialog",
components: {
Dialog
},
model: {
prop: "visible",
event: "update:value",
},
props: {
visible: Boolean,
propData: String
},
data() {
return {
editData:{
hour:"",
minute:""
}
};
},
computed: {
modelVisible: {
get() {
return this.visible;
},
set(val) {
this.$emit("update:value", val);
},
},
},
watch: {
modelVisible: {
immediate: true,
handler(bool) {
if (!bool) return;
this.transformData();
},
},
},
mounted() {
},
methods: {
onSubmit(){
let time = [this.editData.hour, this.editData.minute, "00"].join(":");
this.$emit("onSubmit", time)
},
transformData(){
let arr = this.propData.split(":");
this.editData.hour = arr[0];
this.editData.minute = arr[1];
}
}
};
</script>
<style lang="scss" scoped>
.AddNEditDialog {
width: 100%;
display: flex;
flex-direction: column;
gap: 15px;
.tips {
font-size: 12px;
}
}
.task{
border: 1px solid #FFF;
.task_info{
}
.task_op{
}
}
.tplItem {
margin-right: 14px;
display: flex;
align-items: stretch;
padding-bottom: 10px;
.boardPreview {
border: 1px solid rgba(61, 232, 255, 0.5);
// width: 560px;
// height:80px;
flex: 1;
}
.infoBtnBox {
&.infoBtnBoxSm {
width: 60px;
}
width: 110px;
height: 80px;
display: flex;
margin-left: 10px;
/* // border: solid 1px #05afe3; */
border: 1px solid rgba(61, 232, 255, 0.5);
display: flex;
justify-content: space-around;
align-items: center;
.btn {
background-repeat: no-repeat;
background-size: 100% 100%;
width: 30px;
height: 30px;
&.btnApply {
background-image: url(~@/assets/jihe/images/button/toLeft.svg);
}
&.btnEdit {
background-image: url(~@/assets/jihe/images/button/edit.svg);
}
&.btnDelete {
background-image: url(~@/assets/jihe/images/button/delete.svg);
}
}
i {
font-size: 24px;
color: #666;
padding-left: 4px;
cursor: pointer;
caret-color: rgba(0, 0, 0, 0);
user-select: none;
}
i:hover {
color: #05afe3;
}
.disabledClass {
pointer-events: none;
cursor: auto !important;
color: #ccc;
}
}
}
</style>

28
ruoyi-ui/src/views/JiHeExpressway/pages/control/device/strategy/index.vue

@ -68,12 +68,14 @@
</div>
<AddNEditDialog v-model="isShowDialog" :propData="dialogData" @onSuccess="getData" />
<AddDialog v-model="isShowAddDialog" @onSuccess="addSuccess" />
</div>
</template>
<script>
import Card from "@screen/components/Card1/index.vue";
import AddNEditDialog from "./components/AddNEditDialog.vue";
import AddDialog from "./componentsAdd/AddDialog.vue";
import InputSearch from "@screen/components/InputSearch/index.vue";
import ButtonGradient from "@screen/components/Buttons/ButtonGradient.vue";
import Button from "@screen/components/Buttons/Button.vue";
@ -97,6 +99,7 @@ export default {
ButtonGradient,
InputSearch,
AddNEditDialog,
AddDialog,
Button,
},
data() {
@ -132,10 +135,22 @@ export default {
dialogData: {},
isShowDialog: false,
isFirst: true,
isShowAddDialog: false
};
},
created() {
this.getData();
let h = window.location.href.split("=");
if (h.length === 2) {
let id = window.location.href.split("=")[1];
request({
url: `/business/dcBatchFunctionsJobGroup/${id}`,
method: "get"
}).then((result) => {
this.onAddEdit(result.data)
})
}
// this.getSearchOptions();
},
methods: {
@ -185,8 +200,13 @@ export default {
});
},
onAddEdit(data) {
this.isShowDialog = true;
this.dialogData = data||{};
if(data){
this.isShowDialog = true;
this.dialogData = data||{};
} else {
this.isShowAddDialog = true;
}
},
// handleExport() {
// exportFile({
@ -253,6 +273,10 @@ export default {
this.currentPage = currentPage;
this.getData();
},
addSuccess(){
this.isShowAddDialog = false;
this.getData();
}
},
};
</script>

19
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/CrowdnessIndicatorRankings/components/DialogCamera.vue

@ -1,6 +1,14 @@
<template>
<Dialog v-if="data" v-model="visibleModel" :title="data.deviceName" width="600px">
<img @click="controlDialogVisible = true" v-if="[0, '0'].includes(
data.parseOtherConfig &&
data.parseOtherConfig.ptzCtrl
)
" src="@screen/images/camera-control-icon.svg" width="18px" height="18px"
style="cursor: pointer;background-color: #0d5f79;position: absolute;right: 60px; margin-top:-42px;" />
<Video class="video-stream" :camId="data.iotDeviceId" />
<CameraControlDialog :deviceId="data.iotDeviceId" :dialogData="data" :visible="controlDialogVisible" @update:value="handleClose" />
</Dialog>
</template>
@ -11,13 +19,15 @@ import Button from "@screen/components/Buttons/Button.vue";
import Video from "@screen/components/Video/Video.vue"
import request from "@/utils/request";
import { getBoardDeviceInfo } from "@/api/board/board";
import CameraControlDialog from "@screen/pages/Home/components/Dialogs/Camera/components/CameraControlDialog.vue";
export default {
name: "DialogCamera",
components: {
Dialog,
Button,
Video
Video,
CameraControlDialog,
},
props: {
visible: {
@ -33,7 +43,9 @@ export default {
data() {
return {
selectedBdMsg:[],
selectedSize:null
selectedSize:null,
controlDialogVisible: false,
dialogData: {},
};
},
computed: {
@ -48,6 +60,9 @@ export default {
},
},
methods: {
handleClose() {
this.controlDialogVisible = false;
},
getData() {
},

15
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/CrowdnessIndicatorRankings/index.vue

@ -1,5 +1,5 @@
<template>
<Card class="CrowdnessIndicatorRankings border" title="拥挤度指标排名情况">
<Card class="CrowdnessIndicatorRankings border" title="实况地图">
<div class="map">
<component :is="mapContainer" v-if="delayLoad" ref="MapContainerRef" height="300px"
@update:isGisCompleted="(data) => { this.bindMap(data); }" style="z-index: 9" />
@ -196,15 +196,22 @@ export default {
const map2d = this.$refs.MapContainerRef.getMapInstance();
const icon = require(`@screen/images/layerb/路测设备/摄像机_active.svg`);
const icon_f = require(`@screen/images/layerb/路测设备/摄像机_fault.svg`);
const iconb = require(`@screen/images/deviceType/ballb_active.svg`);
const iconb_f = require(`@screen/images/deviceType/ballb_fault.svg`);
const points = [];
list.forEach((e) => {
if(e.otherConfig){
e.parseOtherConfig = JSON.parse(e.otherConfig)
}
points.push({
type: 'event',
longitude: parseFloat(e.longitude),
latitude: parseFloat(e.latitude),
iconUrl: e.useState ? icon : icon_f,
iconUrl: e.childType==='1-1'?(e.useState ? icon : icon_f):(e.useState ? iconb : iconb_f),
otherInfo: {
ext: null,
name: e.deviceName,
state: e.useState,
config:{
item: e,
markerClick:function(ext,e){
@ -223,7 +230,7 @@ export default {
map2d.addPointByArr(
{pointList: points},
'jhlayers_camera',
false
true
);
}
} else {
@ -296,6 +303,8 @@ export default {
iconUrl: e.useState ? icon : icon_f,
otherInfo: {
ext: null,
name: e.deviceName,
state: e.useState,
config:{
item: e,
markerClick:function(ext,e){

BIN
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/EventInformation/images/lane.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

BIN
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/EventInformation/images/lane.psd

Binary file not shown.

BIN
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/EventInformation/images/lane_v1.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

8
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/EventInformation/index.vue

@ -13,12 +13,12 @@
<div class="road-lane">
<div v-for="i in 5">
<img :src=" detailData.direction === '菏泽方向' && detailData.lang && detailData.lang.includes(enum_lang[(i-1).toString()])?require('./images/congestion.svg'):require('./images/normal.svg')"
<img :src=" detailData.direction === '济南方向' && detailData.lang && detailData.lang.includes(enum_lang[(i-1).toString()])?require('./images/congestion.svg'):require('./images/normal.svg')"
/>
</div>
<div></div>
<div v-for="i in 5">
<img :src=" detailData.direction === '济南方向' && detailData.lang && detailData.lang.includes(enum_lang_jn[(i-1).toString()])?require('./images/congestion.svg'):require('./images/normal.svg')"
<img :src=" detailData.direction === '菏泽方向' && detailData.lang && detailData.lang.includes(enum_lang_jn[(i-1).toString()])?require('./images/congestion.svg'):require('./images/normal.svg')"
/>
</div>
</div>
@ -131,7 +131,7 @@ export default {
}
.road-lane {
background-image: url(./images/lane.jpg);
background-image: url(./images/lane.png);
height: 90px;
background-repeat: no-repeat;
background-size: 100% 100%;
@ -142,7 +142,7 @@ export default {
> div {
display: flex;
align-items: end;
padding-bottom: 18px;
padding-bottom: 12px;
justify-content: center;
}
}

6
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/dispatch/data.js

@ -29,7 +29,7 @@ export const searchFormList = [
{
label: "方向:",
key: "direction",
type: "RadioGroup",
type: "select",
options: {
options: [
{
@ -40,6 +40,10 @@ export const searchFormList = [
key: "3",
label: "济南方向",
},
{
key: "2",
label: "双向",
},
],
},
},

4
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/dispatch/index.vue

@ -40,7 +40,7 @@
@current-change="initData"
@size-change="onSizeChange"
width="'100%'"
:page-sizes="[12, 16, 20, 30, 50]"
:page-sizes="[15, 25, 35, 50]"
:page-size="searchData.pageSize"
:current-page.sync="searchData.pageNum"
layout="total, sizes, prev, pager, next"
@ -92,7 +92,7 @@ export default {
data: [],
eventId: "0",
searchData: {
pageSize: 16,
pageSize: 15,
pageNum: 1,
eventState: "0",
},

5
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/event/EventDetailDialog/Carousel/index.vue

@ -2,8 +2,9 @@
<div class="Carousel">
<VueSlickCarousel v-if="list.length > 0" v-bind="settings" ref="CarouselRef" class="vueSlickCarousel">
<div v-for="(item, index) in list " :key="index" class="item">
<el-image v-if="type==='picture'" fit="fill" :src="item" :preview-src-list="list"></el-image>
<Video v-else style="height: 100%;width:100%;" :showHeader="false" :url="item || ''" videoType="mp4" />
<el-image v-if="type==='picture' && index === (pageNum-1)" fit="fill" :src="item" :preview-src-list="list"></el-image>
<Video v-if="type==='video' && index === (pageNum-1)" style="height: 100%;width:100%;" :showHeader="false" :url="item || ''" videoType="mp4" />
<div v-if="index !== (pageNum-1)" style="height: 100%;width:100%;" ></div>
</div>
</VueSlickCarousel>
<div class="pagep" v-if="total>1">

11
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/event/EventDetailDialog/data.js

@ -161,6 +161,17 @@ export const _formList = [
return false;
},
},
{
label: "影响车道:",
key: "lane",
type: "CheckboxGroup",
isAlone: true,
options: {
disabled: true,
options: LaneOccupancyList,
gap: "12px",
},
},
];
export const _formListGz_v1 = [
{

97
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/event/EventDetailDialog/index.vue

@ -1,40 +1,43 @@
<template>
<!-- 事件弹窗 - 通用 -->
<Dialog v-model="modelVisible" style="z-index: 2050;" title="事件详情" width="950px" top="4%">
<Dialog v-model="modelVisible" style="z-index: 2050;" title="事件详情" width="950px" :top="(activeName == '1' || activeName == '2')?'1%':'8%'">
<div class="EventDetail" >
<!-- :style="{height: activeName == '-1' || activeName == '0' ? '480px' : '598px',}" -->
<Form ref="FormConfigRef" :formList="formList" v-model="data" label-width="110px" />
<div class="video-pic" v-if="activeName == '-1' && [1,2,5].indexOf(data.warningSource) !== -1">
<!-- 视频组件 -->
<div class="video-pic" v-if="['-1','-2'].indexOf(activeName) !== -1 && [1,2,5].indexOf(data.warningSource) !== -1">
<div style="flex: 1; height: 100%;position: relative;">
<div class="radio">
<span @click="videoClick('downCamera')" :class="{ active: realVideo === 'downCamera' }">菏泽</span>
<span @click="videoClick('upCamera') " :class="{ active: realVideo === 'upCamera' }">济南</span>
<div class="radio">
<span @click="videoClick('downCamera')" :class="{ active: realVideo === 'downCamera' }">菏泽</span>
<span @click="videoClick('upCamera') " :class="{ active: realVideo === 'upCamera' }">济南</span>
</div>
<Video v-if="realVideo"
class="item-video"
:pileNum="data.stakeMark"
:rangeIndex="realVideo"
:showHeader="false"
/>
</div>
<Video v-if="realVideo"
class="item-video"
:pileNum="data.stakeMark"
:rangeIndex="realVideo"
:showHeader="false"
/>
</div>
<div style="flex: 1; height: 100%;width:0px;position: relative;">
<div class="radio">
<span @click="realType = 'video'" :class="{ active: realType === 'video' }">视频</span>
<span @click="realType = 'picture'" :class="{ active: realType === 'picture' }">图像</span>
<div style="flex: 1; height: 100%;width:0px;position: relative;">
<div class="radio" v-if="[2,4,7].indexOf(formData.warningSource) === -1">
<span @click="realType = 'video'" :class="{ active: realType === 'video' }">视频</span>
<span @click="realType = 'picture'" :class="{ active: realType === 'picture' }">图像</span>
</div>
<Carousel style="height: 100%;" :list="realType === 'video'?(formData.videoList || []):formData.pictures || []" :type="realType" />
</div>
<Carousel style="height: 100%;" :list="realType === 'video'?(data.videoList || []):data.pictures || []" :type="realType" />
</div>
</div>
<div v-if="(activeName == '-1' && [1,2,5].indexOf(data.warningSource) === -1) || activeName !== '-1'" class="video-stream">
<div class="item"> <Video
<!-- 组件 -->
<div v-else class="video-stream">
<div class="item">
<Video
class="item-video"
:pileNum="data.stakeMark"
rangeIndex="upCamera"
:showHeader="false"
/>
<span>济南方向</span></div>
<div class="item">
<span>济南方向</span></div>
<div class="item">
<Video
class="item-video"
:pileNum="data.stakeMark"
@ -46,7 +49,7 @@
<TimeLine1 style="width: 100%;" v-if="activeName == '1' || activeName == '2'" :data="timeLine1List" />
<TimeLine2 style="width: 100%;height:160px;" v-if="activeName == '1' || activeName == '2'" :data="timeLine2List" />
</div>
<!-- 确认弹窗 -->
<EventPlanDialog :visible="isShowDialog" :info="info" :eventFormData="data" :activeName="activeName"
@reInitData="() => {
@ -173,7 +176,7 @@ export default {
if (this.visible) {
this.isError = false
this.getProcess();
if(this.activeName === '-1'){
if(this.activeName === '-1' || this.activeName === '-2' ){
_formListGz[4].options.options = WarningSubclassOptions[this.formData.warningType];
this.formList = [..._formListGz]
@ -181,17 +184,22 @@ export default {
_data.direction=DirectionTypes[_data.direction]
_data.roadName = '济菏高速'
_data.duration = getDuration(_data.warningTime);
if(_data.lane){
_data.lane = _data.lane.toString().split(",") || []
_data.lane =_data.lane.toString().split(",") || []
} else if(_data.lang){
_data.lane =_data.lang.toString().split(",") || []
}
this.data = _data;
this.data = _data
} else {
this.formList = [..._formList]
let _data = _.cloneDeep(this.formData)
if(_data.lane){
_data.lane =_data.lane.toString().split(",") || []
} else if(_data.lang){
_data.lane =_data.lang.toString().split(",") || []
}
_data.direction=DirectionTypes[_data.direction]
this.data = _data;
}
}
@ -226,10 +234,9 @@ export default {
getProcessList(this.formData.id).then(async (rows) => {
this.timeLine1List = [];
this.timeLine2List = [];
if(this.formData.processConfigList){
if(this.data.processConfigList){
this.data.processConfigList.forEach((it) => {
this.formData.processConfigList.forEach((it) => {
const process = rows.find((row) => it.nodeNode == row.processId && row.processType === 1);
if (process) {
@ -287,28 +294,7 @@ export default {
this.timeLine2List = _resList;
});
},
getProcessNode() {
return request({
url:
`/dc/system/event/getProcessNode/${this.formData.id}`,
method: "GET",
})
.then((result) => {
if (result.code != 200) return [];
// this.timeLine1List = result.data.map((item) => {
// return {
// time: item.operationTime,
// label: item.processNode,
// isActive: item.status == 1 ? true : false,
// };
// });
// this.options = result.data.filter((item) => {
// item.status == 0;
// return item;
// });
})
.catch((err) => []);
},
onCloseAddNew() {
this.isShowDialog = false;
},
@ -437,6 +423,7 @@ export default {
this.modelVisible = false;
this.$emit("queryData", true);
this.$root.$emit('refresh-event');
this.$root.$emit('delete-event');
const self = this;
setTimeout(() => {
self.$router.push(`/control/event/commandDispatch?eventId=${self.formData.id}`);

16
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/event/data.js

@ -152,7 +152,7 @@ export const gjSearchFormList = [
{
label: "方向:",
key: "direction",
type: "RadioGroup",
type: "select",
options: {
options: [
{
@ -163,6 +163,10 @@ export const gjSearchFormList = [
key: "3",
label: "济南方向",
},
{
key: "2",
label: "双向",
},
],
},
},
@ -319,7 +323,7 @@ export const gzSearchFormList = [
{
label: "方向:",
key: "direction",
type: "RadioGroup",
type: "select",
options: {
options: [
{
@ -330,10 +334,10 @@ export const gzSearchFormList = [
key: "3",
label: "济南方向",
},
// {
// key: "双向",
// label: "双向",
// },
{
key: "2",
label: "双向",
},
],
},
},

10
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/event/index.vue

@ -191,7 +191,7 @@ export default {
if (it.otherConfig) {
let otherConfig = JSON.parse(it.otherConfig);
it.pictures = otherConfig.pictures || [];
it.pictures = otherConfig.pictures || otherConfig.imgUrl || [];
}
})
@ -301,15 +301,13 @@ export default {
data.stringEventType = warningTypeMapping[data.warningType];
data.videoList = [];
if (data.otherConfig) {
if (data.otherConfig ) {
let otherConfig = JSON.parse(data.otherConfig);
data.waterFilmThickness = otherConfig.waterFilmThickness;
data.windSpeed = otherConfig.windSpeed;
data.visibility = otherConfig.visibility;
data.pictures = otherConfig.pictures || [];
data.videoList = otherConfig.videoList || [];
data.pictures = otherConfig.pictures || otherConfig.imgUrl ||[];
data.videoList = otherConfig.videoList || otherConfig.videoUrl|| [];
// data.videoList = ['https://sf1-cdn-tos.huoshanstatic.com/obj/media-fe/xgplayer_doc_video/mp4/xgplayer-demo-480p.mp4',
// 'https://sf1-cdn-tos.huoshanstatic.com/obj/media-fe/xgplayer_doc_video/mp4/xgplayer-demo-480p.mp4']
}

12
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/governanceAnalysis/audit/StatsDialogVisible/index.vue

@ -1,5 +1,5 @@
<template>
<Dialog v-model="modelVisible" title="收费站管制统计" style="width: 100%;z-index: 3000;">
<Dialog v-model="modelVisible" title="收费站管制统计" style="width: 100%;z-index: 1999 !important;">
<div class="search">
<InputSearch
:formList="searchFormList"
@ -498,7 +498,17 @@ export default {
};
</script>
<style>
::v-deep {
.el-popover {
z-index: 2099 !important;
/* 请根据你的项目需求设置合适的值 */
}
}
</style>
<style lang="scss" scoped>
.dialog {
min-height: 800px;
}

2
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/governanceAnalysis/cmodel/charts.js

@ -27,7 +27,7 @@ var options = {
formatter: function (params) {
let mark = ''
params.forEach(e => {
mark += e.marker + e.seriesName + ':'+e.value+'<br />'
mark += e.marker + e.seriesName + ':'+e.value+(e.seriesIndex===0?'起':'分钟')+'<br />'
});
return `<div>${params[0].name}</div>${mark}`;
},

15
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/governanceAnalysis/search/index.vue

@ -97,7 +97,10 @@ export default {
searchQuery() {
let startTime = "";
if (this.type == 2) {
startTime = moment(this.dateTime).format("YYYY-MM-01 00:00:00");
startTime = moment().format("YYYY-MM-01 00:00:00");
if(this.dateTime){
startTime = moment(this.dateTime).format("YYYY-MM-01 00:00:00");
}
} else if (this.type == 3) {
let year = moment().year();
if (this.quarter == 1) {
@ -110,9 +113,15 @@ export default {
startTime = `${year}-10-01 00:00:00`;
}
} else if (this.type == 4) {
startTime = moment(this.dateTime).format("YYYY-01-01 00:00:00");
startTime = moment().format("YYYY-01-01 00:00:00");
if(this.dateTime){
startTime = moment(this.dateTime).format("YYYY-MM-01 00:00:00");
}
} else {
startTime = moment(this.dateTime).format("YYYY-MM-DD HH:mm:ss");
startTime = moment().format("YYYY-MM-DD HH:mm:ss");
if(this.dateTime){
startTime = moment(this.dateTime).format("YYYY-MM-01 00:00:00");
}
}
this.$parent.bindCharts({

8
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/plan/addAndEditDialog/index.vue

@ -346,6 +346,10 @@ export default {
})
.then((result) => {
if (result.code != 200) return Message.error(result?.msg);
if(result.msg==='存在相同类型的预案'){
return Message.error(result?.msg);
}
Message.success("提交成功");
this.modelVisible = false;
})
@ -369,6 +373,10 @@ export default {
})
.then((result) => {
if (result.code != 200) return Message.error(result?.msg);
if(result.msg==='存在相同类型的预案'){
return Message.error(result?.msg);
}
Message.success("提交成功");
this.modelVisible = false;
this.$emit("reInitData", true);

3
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/plan/data.js

@ -16,8 +16,7 @@ export const searchFormList = [
ons: {
change(value, ...args) {
const { data, formList } = args.slice(-1)[0];
formList[2].options.options = eventSubClassMap[1][value];
formList[1].options.options = eventSubClassMap[1][value];
data.triggerMechanism =''
},
},

22
ruoyi-ui/src/views/JiHeExpressway/pages/control/manual/events/data.js

@ -62,7 +62,27 @@ export const searchFormList = [
],
},
}
}, {
label: "方向:",
key: "direction",
type: "select",
options: {
options: [
{
key: "1",
label: "菏泽方向",
},
{
key: "3",
label: "济南方向",
},
{
key: "2",
label: "双向",
},
],
},
},
// {
// ...PresetFormItems.station,
// label: "开始桩号:",

7
ruoyi-ui/src/views/JiHeExpressway/pages/control/manual/events/index.vue

@ -46,7 +46,7 @@
@current-change="initData"
@size-change="onSizeChange"
width="'100%'"
:page-sizes="[12, 16, 20, 30, 50]"
:page-sizes="[12, 16, 20, 32, 48]"
:page-size="pageSize"
:current-page.sync="pageNum"
layout="total, sizes, prev, pager, next"
@ -174,6 +174,11 @@ export default {
} else {
delete this.searchData.warningType;
}
if(data.direction){
this.searchData.direction = data.direction
} else {
delete this.searchData.direction;
}
this.initData();
},
},

8
ruoyi-ui/src/views/JiHeExpressway/pages/control/manual/statistic/components/Eventfiltering/index.vue

@ -62,7 +62,7 @@ export default {
return {
formData: {
type: "day",
warningTime: moment().format("YYYY-MM-DD") + " 00:00:01",
warningTime: moment().format("YYYY-MM-DD") + ' 00:00:00',
},
trafficIncidents: null,
trafficIncidentsPie: null,
@ -95,7 +95,7 @@ export default {
key: "warningTime",
required: true,
type: "datePicker",
default: moment().format("YYYY-MM-DD") + " 00:00:01",
default: moment().format("YYYY-MM-DD"),
options: {
valueFormat: "yyyy-MM-dd",
},
@ -114,7 +114,7 @@ export default {
type: "month",
valueFormat: "yyyy-MM-dd",
},
default: moment().format("YYYY-MM-DD") + " 00:00:01",
default: moment().format("YYYY-MM-DD"),
visible: (data) => {
if (data.type == "month") {
return true;
@ -130,7 +130,7 @@ export default {
type: "year",
valueFormat: "yyyy-MM-dd",
},
default: moment().format("YYYY-MM-DD") + " 00:00:01",
default: moment().format("YYYY-MM-DD"),
visible: (data) => {
if (data.type == "year") {
return true;

10
ruoyi-ui/src/views/JiHeExpressway/pages/control/manual/statistic/components/Sitefiltering/index.vue

@ -68,7 +68,7 @@ export default {
trafficIncidentsPie: null,
formData: {
type: "day",
warningTime: moment().format("YYYY-MM-DD") + " 00:00:01",
warningTime: moment().format("YYYY-MM-DD") + " 00:00:00",
},
searchFormList: [
{
@ -102,7 +102,7 @@ export default {
options: {
valueFormat: "yyyy-MM-dd",
},
default: moment().format("YYYY-MM-DD") + " 00:00:01",
default: moment().format("YYYY-MM-DD"),
visible: (data) => {
if (data.type == "day") {
return true;
@ -118,7 +118,7 @@ export default {
type: "month",
valueFormat: "yyyy-MM-dd",
},
default: moment().format("YYYY-MM-DD") + " 00:00:01",
default: moment().format("YYYY-MM-DD"),
visible: (data) => {
if (data.type == "month") {
return true;
@ -134,7 +134,7 @@ export default {
type: "year",
valueFormat: "yyyy-MM-dd",
},
default: moment().format("YYYY-MM-DD") + " 00:00:01",
default: moment().format("YYYY-MM-DD"),
visible: (data) => {
if (data.type == "year") {
return true;
@ -242,7 +242,7 @@ export default {
});
},
handleSearch(value) {
value.warningTime = value.warningTime + " 00:00:01";
value.warningTime = value.warningTime + " 00:00:00";
this.formData = { ...value };
this.getNonAutomaticWarningFacility(this.formData);
},

40
ruoyi-ui/src/views/JiHeExpressway/pages/control/manual/statistic/components/Timefiltering/index.vue

@ -6,6 +6,7 @@
@handleSearch="handleSearch"
/>
<ButtonGradient @click="onExportClick" style="width:50px">导出</ButtonGradient>
<div class="entity"><div></div>{{ sfzname }}</div>
<div class="Eventfiltering-content">
<div class="Eventfiltering-left" ref="trafficIncidents"></div>
</div>
@ -35,10 +36,11 @@ export default {
},
data() {
return {
sfzname: '所有收费站',
trafficIncidents: null,
formData: {
type: "day",
warningTime: moment().format("YYYY-MM-DD") + " 00:00:01",
warningTime: moment().format("YYYY-MM-DD") + " 00:00:00",
},
searchFormList: [
{
@ -72,7 +74,7 @@ export default {
options: {
valueFormat: "yyyy-MM-dd",
},
default: moment().format("YYYY-MM-DD") + " 00:00:01",
default: moment().format("YYYY-MM-DD"),
visible: (data) => {
if (data.type == "day") {
return true;
@ -88,7 +90,7 @@ export default {
type: "month",
valueFormat: "yyyy-MM-dd",
},
default: moment().format("YYYY-MM-DD") + " 00:00:01",
default: moment().format("YYYY-MM-DD"),
visible: (data) => {
if (data.type == "month") {
return true;
@ -104,7 +106,7 @@ export default {
type: "year",
valueFormat: "yyyy-MM-dd",
},
default: moment().format("YYYY-MM-DD") + " 00:00:01",
default: moment().format("YYYY-MM-DD"),
visible: (data) => {
if (data.type == "year") {
return true;
@ -139,6 +141,10 @@ export default {
mounted() {},
methods: {
onExportClick(){
const _data = this.data;
if(_data.type === 'year'){
_data.warningTime = _data.warningTime.substr(0,4)
}
exportFile({
method:'get',
url: "/perceivedEvents/warning/exportNonAutomaticWarningTimeType",
@ -169,7 +175,7 @@ export default {
setTimeout(() => {
this.$nextTick(async () => {
(this.formData.warningTime =
moment(new Date()).format("YYYY-MM-DD") + " 00:00:01"),
moment(new Date()).format("YYYY-MM-DD") + " 00:00:00"),
(this.trafficIncidents = echarts.init(this.$refs.trafficIncidents));
this.trafficIncidents.setOption(trafficIncidentsCharts2);
await this.getNonAutomaticWarningTimeType(this.formData);
@ -216,9 +222,13 @@ export default {
});
},
handleSearch(value) {
if(value.facilityId === ''){
value.facilityId = null;
if(value.facilityId === null || value.facilityId === ''){
delete value.facilityId;
this.sfzname = '所有收费站'
} else {
this.sfzname = _.find(this.searchFormList[4].options.options,{key:value.facilityId}).label
}
value.warningTime = value.warningTime + " 00:00:01";
this.formData = { ...value };
this.getNonAutomaticWarningTimeType(this.formData);
@ -228,6 +238,22 @@ export default {
</script>
<style lang="scss" scoped>
.entity{
position: absolute;
right: 10px;
color: white;
font-size: 14px;
margin-top: 20px;
display: flex;
align-items: center;
div{
width: 8px;
height: 8px;
background-color: aqua;
border-radius: 50%;
margin-right: 10px;
}
}
.Eventfiltering {
width: 99%;
height: 94%;

56
ruoyi-ui/src/views/JiHeExpressway/pages/datav/roadNet/index.vue

@ -29,47 +29,47 @@
<img class="arrow arrow_02" src="./img/arrowRight.svg" alt="">
<img class="arrow arrow_03" src="./img/arrowRight.svg" alt="">
<div class="manageTotal">
<h4 class="keep-ratio">济菏运管中心</h4>
<h4 >济菏运管中心</h4>
<p>内存<em>{{ summaryMem.memUsed }}</em>/{{ summaryMem.memTotal }}GB CPU<em>{{ summaryMem.cpuUsed }}</em>/{{ summaryMem.cputTotal }}<br>存储<em>{{ summaryMem.filUsed }}</em>/{{ summaryMem.filTotal }}GB</p>
</div>
<ul class="manageDetail">
<li v-for="item in manage">
<div class="con">
<h4 class="keep-ratio">{{ item.title }}</h4>
<p class="keep-ratio"><em>{{ item.value }}</em><i></i></p>
<h4 >{{ item.title }}</h4>
<p ><em>{{ item.value }}</em><i></i></p>
</div>
</li>
</ul>
</div>
<div class="part partCalc">
<img class="arrow" src="./img/arrowRight.svg" alt="">
<div class="calcUnit small">
<h4 class="keep-ratio">实时计算</h4>
<div class="calcUnit small" style="margin-top: -20px;">
<h4 >实时计算</h4>
<div class="con">
<p class="total keep-ratio">25,568,876</p>
<ul>
<li class="keep-ratio">节点</li>
<li class="keep-ratio">5/5</li>
<li class="keep-ratio">实时清洗</li>
<li class="keep-ratio">实时加工</li>
<li class="keep-ratio">实时汇报</li>
<li class="keep-ratio">实时分析</li>
<li >节点</li>
<li >5/5</li>
<li >实时清洗</li>
<li >实时加工</li>
<li >实时汇报</li>
<li >实时分析</li>
</ul>
</div>
</div>
<div class="calcUnit big">
<div class="calcUnit big" style="margin-top:-20px;margin-bottom: 20px;">
<h4>AI模型</h4>
<div class="con">
<p class="total">33,210</p>
<ul>
<li class="keep-ratio">实时交通态势感知模型</li>
<li class="keep-ratio">交通预警模型</li>
<li class="keep-ratio">在途车辆分析模型</li>
<li class="keep-ratio">应急指挥疏导模型</li>
<li class="keep-ratio">智能行车诱导模型</li>
<li class="keep-ratio">短临预报算法模型</li>
<li class="keep-ratio">交通综合指数模型</li>
<li class="keep-ratio">路网分析模型</li>
<li >实时交通态势感知模型</li>
<li >交通预警模型</li>
<li >在途车辆分析模型</li>
<li >应急指挥疏导模型</li>
<li >智能行车诱导模型</li>
<li >短临预报算法模型</li>
<li >交通综合指数模型</li>
<li >路网分析模型</li>
</ul>
</div>
</div>
@ -78,12 +78,12 @@
<div class="con">
<p class="total">2,017</p>
<ul>
<li class="keep-ratio">节点</li>
<li class="keep-ratio">6/6</li>
<li class="keep-ratio">实时清洗</li>
<li class="keep-ratio">批量加工</li>
<li class="keep-ratio">数据汇聚</li>
<li class="keep-ratio">数据分析</li>
<li >节点</li>
<li >6/6</li>
<li >实时清洗</li>
<li >批量加工</li>
<li >数据汇聚</li>
<li >数据分析</li>
</ul>
</div>
</div>
@ -111,8 +111,8 @@
<div class="applyUnit" v-for="item in apply" :key="item.title">
<div class="con">
<img src="./img/applyitem.svg" alt="">
<h4 class="keep-ratio">{{ item.title }}</h4>
<p class="keep-ratio">调用<em>{{ item.value }}</em></p>
<h4 >{{ item.title }}</h4>
<p >调用<em>{{ item.value }}</em></p>
</div>
</div>
</div>

44
ruoyi-ui/src/views/JiHeExpressway/pages/maintenanceOperations/smart/statisticalAnalysis/analysis/components/deviceUptime/assets/charts.js

@ -19,7 +19,7 @@ let indicator = [
]
let data = [{
value: [60, 30, 50, 80, 90, 98, 50, 56],
name: "哈哈哈佛挡杀佛很多事"
name: ""
}];
let counter = -1;
@ -27,15 +27,39 @@ let options = {
tooltip:{
show: true,
trigger:"item",
backgroundColor:"rgba(20,89,119,0.9)",
borderColor:"rgba(78, 174, 204, 1)",
borderWidth:1,
padding:20,
textStyle:{
color:"#f4f4f4"
},
// formatter(params){
// }
enterable: true,//滚动条
extraCssText: "max-width:60%;max-height:83%; overflow: auto; ",//滚动条
//改变提示框的位置 不超出屏幕显示
position: function(point, params, dom, rect, size) {
//其中point为当前鼠标的位置,
//size中有两个属性:viewSize和contentSize,分别为外层div和tooltip提示框的大小
// 鼠标坐标和提示框位置的参考坐标系是:以外层div的左上角那一点为原点,x轴向右,y轴向下
// 提示框位置
var x = 0; // x坐标位置
var y = 0; // y坐标位置
// 当前鼠标位置
var pointX = point[0];
var pointY = point[1];
// 提示框大小
var boxWidth = size.contentSize[0];
var boxHeight = size.contentSize[1];
// boxWidth > pointX 说明鼠标左边放不下提示框
if (boxWidth > pointX) {
x = 5;
} else {
// 左边放的下
x = pointX - boxWidth;
}
// boxHeight > pointY 说明鼠标上边放不下提示框
if (boxHeight > pointY) {
y = 5;
} else {
// 上边放得下
y = pointY - boxHeight;
}
return [x, y];
}
},
radar: {
center: ['50%', '50%'],

120
ruoyi-ui/src/views/JiHeExpressway/pages/maintenanceOperations/smart/statisticalAnalysis/data_2024-05-23.js

@ -1,120 +0,0 @@
import * as PresetFormItems from "@screen/pages/control/event/event/FormEvent/PresetFormItems.js";
export const tabMap = {
AlarmEvents: {
state: 5,
textColor: "#007FF4",
text: "去确认",
},
EventsConfirmed: {
state: 5,
textColor: "#007FF4",
text: "去确认",
},
DisposingEvents: {
state: 4,
textColor: "#007FF4",
text: "去处置",
},
IncidentDisposed: {
state: 3,
textColor: "#007FF4",
text: "处置记录",
},
};
export const searchFormList = [
{
label: "时间范围:",
key: "time",
required: true,
type: "datePicker",
default: [
moment().startOf("month").format("YYYY-MM-DD HH:mm:ss"),
moment().format("YYYY-MM-DD HH:mm:ss"),
],
options: {
format: "yyyy-MM-dd",
type: "daterange",
},
},
{
label: "设备类型:",
key: "type",
required: true,
type: "select",
default: "1-1",
options: {
options: [
{
value: "1-1",
label: "高清网络枪型固定摄像机",
},
{
value: "1-2",
label: "高清网络球形摄像机",
},
{
value: "1-3",
label: "桥下高清网络球形摄像机",
},
{
value: "1-4",
label: "360°全景摄像机",
},
{
value: "1-5",
label: "180°全景摄像机",
},
{
value: "2-1",
label: "门架式可变信息标志",
},
{
value: "2-3",
label: "雨棚可变信息标志",
},
{
value: "2-4",
label: "站前悬臂式可变信息标志",
},
{
value: "3",
label: "气象检测器",
},
{
value: "5",
label: "路段语音广播系统",
},
{
value: "6",
label: "护栏碰撞预警系统",
},
{
value: "7",
label: "毫米波雷达",
},
{
value: "8",
label: "合流区预警系统",
},
{
value: "10",
label: "激光疲劳唤醒",
},
{
value: "11",
label: "一类交通量调查站",
},
{
value: "12",
label: "智能行车诱导系统",
},
{
value: "13",
label: "智能设备箱",
},
],
},
},
];

673
ruoyi-ui/src/views/JiHeExpressway/pages/maintenanceOperations/smart/statisticalAnalysis/index_2024-05-23.md

@ -1,673 +0,0 @@
<template>
<div class="statisticAnalysis">
<el-tabs class="full_tab" v-model="activeName" @tab-click="changeTabs">
<el-tab-pane label="设备分析" name="first" class="tab_con">
<DeviceSummary
class="deviceSummary"
:dataList="equipments"
></DeviceSummary>
<div class="bottomTabs">
<DeviceUptime :dataList="equipments" class="tabs-lo" />
<OnLineBarCharts :dataList="sectionData" class="tabs-mo" />
<!-- <MonthlyEquipment class="tabs-mo" :dataList="equipments" /> -->
</div>
</el-tab-pane>
<el-tab-pane label="设备查询" name="second" class="tab_con">
<div class="topdiv">
<div class="left-div">
<el-button
size="mini"
icon="el-icon-refresh-left"
class="btnSearch"
@click="onRefreshData"
>刷新</el-button
>
<el-button
size="mini"
icon="el-icon-download"
class="btnSearch"
@click="SystemStatusExport"
>导出Excel</el-button
>
</div>
<div class="right-div">
<InputSearch
:formList="searchFormList"
@handleSearch="handleSearch"
/>
<!-- :placeholder="searchText" -->
</div>
</div>
<div class="queryChart">
<!-- v-if="isEmpty01" -->
<Empty
v-if="isEmpty01"
class="floatEmpty"
:text="emptyText01"
></Empty>
<div ref="queryChart" class="keep-ratio"></div>
</div>
<div style="position: relative; bottom: 15px">
<Empty
v-if="isEmpty02"
class="floatEmpty"
:text="emptyText02"
></Empty>
<el-table
:border="false"
:data="tableData"
height="420"
header-align="left"
empty-text=" "
>
<el-table-column prop="order" label="序号" width="80">
</el-table-column>
<el-table-column
prop="deviceName"
label="设备名称"
></el-table-column>
<el-table-column prop="deviceNo" label="设备桩号">
</el-table-column>
<el-table-column
prop="direction"
label="方向"
class-name="showClass"
>
<template slot-scope="scope">
<span>{{
scope.row.direction == "1"
? "菏泽"
: scope.row.direction == "2"
? "双向"
: "济南"
}}</span>
</template>
</el-table-column>
<el-table-column prop="deviceIp" label="设备IP"> </el-table-column>
<el-table-column prop="production" label="厂家"> </el-table-column>
<!-- <el-table-column prop="model" label="型号"> </el-table-column> -->
<!-- <el-table-column prop="network" label="网段"> </el-table-column> -->
<el-table-column prop="time" label="监测时间"> </el-table-column>
<el-table-column prop="deviceStatus" label="设备状态">
<template slot-scope="scope">
<div v-if="scope.row.deviceStatus == 1">在线</div>
<div v-if="scope.row.deviceStatus == 0" style="color: #bbb">
离线
</div>
</template>
</el-table-column>
</el-table>
<div class="footer">
<Pagination
@current-change="changePage"
width="'100%'"
:page-size="pageSize"
:current-page.sync="pageIndex"
layout="total, sizes, prev, pager, next"
:total="pageTotal"
@size-change="handleSizeChange"
>
</Pagination>
</div>
</div>
</el-tab-pane>
</el-tabs>
</div>
</template>
<script>
import * as echarts from "echarts";
import onlineCharts from "./assets/charts";
// import barCharts from "./assets/barCharts";
import DeviceUptime from "./components/deviceUptime";
import OnLineBarCharts from "./components/onLineBarCharts";
import MonthlyEquipment from "./components/monthlyEquipment";
import DeviceSummary from "./components/deviceSummary";
import {
getSystemStatusList,
getSystemStatusTabList,
getSystemStatusType,
getSystemStatusExport,
getStatusSection,
} from "@/api/MonthlyEquipment";
// import { download } from "../../../../../utils/request.js";
import Pagination from "@screen/components/Pagination.vue";
import InputSearch from "@screen/components/InputSearch/index.vue";
import { searchFormList } from "./data";
import { Loading } from "element-ui";
import { first } from "lodash";
export default {
name: "publicService",
components: {
DeviceUptime,
MonthlyEquipment,
Pagination,
InputSearch,
DeviceSummary,
OnLineBarCharts,
},
data() {
return {
searchText: "请设置查询条件",
isEmpty01: true,
emptyText01: "请输入参数查询...",
isEmpty02: true,
emptyText02: "请输入参数查询...",
startTime: "",
time: "",
typeQuery: "", //高清网络枪型固定摄像机
pageTotal: 0,
pageIndex: 1,
pageSize: 30,
searchFormList,
equipSeries: [
"高清网络球形摄像机",
"360°全景摄像机",
"门架式可变信息标志",
"站前悬臂式可变信息标志",
"气象检测器",
"合流区预警系统",
"高清网络枪型固定摄像机",
"智能设备箱",
"毫米波雷达",
"路段语音广播系统",
"护碰撞预警系统",
"激光疲劳唤醒系统",
"180°全景摄像机",
"一类交通量调音站",
"雨棚可变信息标志",
"智能行车诱导系统",
],
equipments: [],
activeName: "first",
tableData: [],
interval: null,
sectionData: [],
};
},
provide() {
return {
initDataList: this.initDevice,
};
},
destroyed() {
clearInterval(this.interval);
},
methods: {
getSection() {
getStatusSection().then((res) => {
this.sectionData = res.data;
});
},
handleSizeChange(size) {
this.pageSize = size;
this.initData();
},
initData() {
this.startTime = moment().startOf("month").format("YYYY-MM-DD HH:mm:ss");
this.time = moment().format("YYYY-MM-DD HH:mm:ss");
this.typeQuery = this.searchFormList[1].options.options[0].value;
clearInterval(this.interval);
if (this.activeName == "first") {
this.initDevice();
} else if (this.activeName == "second") {
this.queryChart = echarts.init(this.$refs["queryChart"]);
this.queryChart.setOption(onlineCharts);
this.initQueryChart();
this.initQueryTable(1);
}
this.interval = setInterval(() => {
if (this.activeName == "first") {
this.initDevice();
}
}, 30000);
},
changePage(page) {
this.initQueryTable(page);
},
formatDate(val) {
let year = val.getFullYear();
var m = val.getMonth() + 1;
var day = val.getDate();
m = m < 10 ? "0" + m : "" + m;
day = day < 10 ? "0" + day : "" + day;
return year + "-" + m + "-" + day + " 00:00:00";
},
onRefreshData() {
if (!this.typeQuery || !this.startTime) {
this.$message({
message: "请先设置查询条件!",
type: "warning",
});
return;
}
this.initQueryChart();
this.initQueryTable(1);
},
handleSearch(data) {
this.typeQuery = data.type;
this.startTime = moment(data.time[0]).format("YYYY-MM-DD HH:mm:ss");
this.time = moment(data.time[1]).format("YYYY-MM-DD HH:mm:ss");
let typeText =
this.searchFormList[1].options.options[this.typeQuery - 1]?.label;
this.searchText = `${moment(this.startTime).format(
"YYYY年MM月DD日"
)}-${moment(this.time).format("YYYY年MM月DD日")},${typeText}`;
this.initQueryChart();
this.initQueryTable(1);
},
changeTabs() {
this.initData();
this.$nextTick(() => {
this.queryChart.resize();
});
},
//导出
SystemStatusExport() {
let loadingInstance = Loading.service({
fullscreen: true,
background: "#00000052",
text: "文件正在下载...",
});
getSystemStatusExport({
startTime: this.startTime,
time: this.time,
type: this.typeQuery,
})
.then((res) => {
const url = window.URL.createObjectURL(new Blob([res]));
let link = document.createElement("a");
link.style.display = "none";
link.href = url;
link.setAttribute("download", "设备统计信息.xlsx");
document.body.appendChild(link);
link.click();
URL.revokeObjectURL(link.href); // 释放URL 对象
document.body.removeChild(link);
link = null;
loadingInstance.close();
})
.catch((err) => {
Message.error(err);
loadingInstance.close();
});
},
initDevice() {
//设备在线离线率接口
// if (process.env.NODE_ENV == "development") {
// this.equipments = [];
// this.equipSeries.forEach((item) => {
// this.equipments.push({
// title: item,
// total: Math.floor(Math.random() * 600) + 800,
// pctOnl: Math.floor(100 * Math.random()) + "%",
// pctOffl: "25%",
// pctLose: "15%",
// sumUseState: "90%",
// });
// });
// return;
// }
getSystemStatusType().then((res) => {
let allList = [];
let sort = res.data["排序规则"].rule.split(",");
sort.forEach((i) => {
for (let key in res.data) {
let val = res.data[key];
let item = {
title: key,
total: val.sum,
pctOnl: val.sucessRate,
pctOffl: val.failRate,
pctLose: val.lostRate,
sumUseState: val.sumUseState,
};
if (i === key) {
allList.push(item);
}
// if (key.includes("全部设备")) {
// allList.unshift(item);
// } else {
// allList.push(item);
// }
}
});
this.equipments = allList;
});
},
setStatus(id, status) {
if (status == "doing") {
this["isEmpty" + id] = true;
this["emptyText" + id] = "数据查询中...";
} else if (status == "empty") {
this["isEmpty" + id] = true;
this["emptyText" + id] = "暂无数据...";
} else if (status == "finish") {
this["isEmpty" + id] = false;
this["emptyText" + id] = "";
}
},
initQueryChart() {
this.setStatus("01", "doing");
let data = this.searchFormList[1].options.options;
let typeLabel = "";
data.forEach((item) => {
if (item.value == this.typeQuery) {
typeLabel = item.label;
}
});
getSystemStatusList({
startTime: this.startTime,
time: this.time,
type: this.typeQuery,
}).then((res) => {
if (res.code == 200) {
this.setStatus("01", "finish");
let origin = res.data;
let startStamp = +moment(this.startTime).startOf("day").format("x");
let endStamp = +moment(this.time).endOf("day").format("x");
let oneDay = 86400000;
let daysTotal = Math.ceil((endStamp - startStamp) / oneDay);
let queryChartData = [];
let dataX = [];
let data0 = [];
let data1 = [];
for (let i = 0; i < daysTotal; i++) {
let ts = startStamp + i * oneDay;
let date = moment(ts).format("YYYY-M-D");
let val = origin[date] ? +origin[date].replace("%", "") : 0;
dataX.push(moment(ts).format("MM-DD"));
data0.push(val);
data1.push(100);
}
onlineCharts.xAxis.data = dataX;
onlineCharts.series[0].data = data0;
onlineCharts.series[0].name = typeLabel;
onlineCharts.series[1].data = data1;
onlineCharts.yAxis[0].name = "在线率(%)";
this.$nextTick(() => {
this.queryChart.setOption(onlineCharts);
});
// } else {
// this.setStatus("01", "empty");
// }
}
});
},
//查询列表
initQueryTable(pageIndex) {
this.setStatus("02", "doing");
getSystemStatusTabList({
startTime: this.startTime,
time: this.time,
type: this.typeQuery,
pageNum: pageIndex,
pageSize: this.pageSize,
}).then((res) => {
if (res.code == 200) {
// if (res.rows && res.rows.length > 0) {
this.setStatus("02", "finish");
this.pageIndex = pageIndex;
this.pageTotal = res.total;
this.tableData = res.rows;
this.tableData.forEach((it, index) => {
it.order = (pageIndex - 1) * this.pageSize + index + 1;
});
// } else {
// this.setStatus("02", "empty");
// }
}
});
},
},
async mounted() {
await this.initData();
this.getSection();
},
};
</script>
<style lang="scss" scoped>
.floatEmpty {
position: absolute;
z-index: 100;
// background: rgba($color: #000000, $alpha: 0.2);
left: 0;
top: 0;
right: 0;
bottom: 0;
}
.bottomTabs {
position: relative;
display: inline-flex;
width: 100%;
flex-direction: row;
flex: 1;
height: 0;
.tabs-lo {
display: inline-flex;
width: 670px;
margin-right: 15px;
}
.tabs-mo {
display: inline-flex;
flex: 1;
}
}
.deviceSummary {
height: 390px;
margin-bottom: 6px;
}
.btnSearch {
background: linear-gradient(180deg, #005c79 0%, #009bcc 100%);
margin-left: 10px;
border-color: transparent;
color: #fff;
}
::v-deep .el-table .cell {
padding-left: 0px !important;
}
::v-deep .el-table .el-table__header-wrapper th {
background-color: #064258 !important;
color: #00d1ff;
border-color: #064258 !important;
border: 0px !important;
font-size: 14px;
font-family: PingFang SC, PingFang SC;
font-weight: 500;
}
::v-deep .el-table {
border: 0px !important;
background-color: transparent;
font-size: 12px !important;
}
::v-deep .el-table__body-wrapper {
background-color: #064258;
color: #fff;
}
::v-deep .el-table .el-table__cell {
height: 47px;
padding-left: 15px;
font-size: 14px;
font-family: PingFang SC, PingFang SC;
font-weight: 500;
color: #ffffff;
}
::v-deep .el-table tr:hover td {
background: #1b2528 !important;
color: #00d1ff;
height: 47px;
}
::v-deep .el-table tr:nth-child(odd) td {
background-color: #13272f;
border: 0px !important;
}
::v-deep .el-table tr:nth-child(even) td {
border: 0px !important;
}
::v-deep .el-table tr {
background-color: #133242 !important;
border-collapse: 0;
border: 0px !important;
background-color: transparent !important;
}
::v-deep .el-tabs__item {
display: inline-flex;
justify-content: center;
font-size: 16px;
font-family: PingFang SC, PingFang SC;
font-weight: 500;
color: #ffffff;
min-width: 128px;
position: relative;
left: 10px;
}
::v-deep .el-tabs__active-bar {
min-width: 128px;
}
::v-deep .el-tabs__nav-wrap::after {
background-color: #133242;
opacity: 0.1;
}
.full_tab {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
flex: 1;
::v-deep .el-tabs__header {
}
::v-deep .el-tabs__content {
flex: 1;
.el-tab-pane {
width: 100%;
height: 100%;
}
}
}
.tab_con {
display: flex;
flex-direction: column;
}
.topdiv {
display: inline-flex;
position: relative;
width: 100%;
height: 40px;
justify-content: space-between;
align-items: center;
.right-div {
display: inline;
width: 450px;
}
}
.statisticAnalysis {
width: 100%;
height: 100%;
padding: 8px 20px 20px;
.header-shot {
width: 98%;
margin: auto;
margin-top: 15px;
height: 160px;
}
.queryChart {
position: relative;
display: inline-flex;
width: 100%;
height: 343px;
margin-top: 20px;
padding: 0 20px;
background: linear-gradient(180deg, rgba(6, 66, 88, 0) 0%, #06425860 100%);
margin-bottom: 30px;
--keep-ratio: scaleX(1);
> div {
display: inline-flex;
width: 100%;
height: 100%;
}
}
.content {
width: 100%;
margin: auto;
display: flex;
flex: 1;
pointer-events: none;
margin-top: 19px;
> div {
pointer-events: auto;
}
.content-l {
width: calc(25%);
margin-right: 20px;
}
.content-mi {
width: calc(50%);
margin-right: 20px;
}
.content-m {
display: inline-flex;
flex-direction: column;
width: calc(100% / 4);
margin-right: 20px;
.content-m-t {
width: 100%;
height: 240px;
margin-bottom: 20px;
}
}
.content-r {
width: 49.4%;
}
}
}
.footer {
margin: 15px 0;
height: 36px;
display: flex;
align-items: center;
justify-content: center;
}
</style>

114
ruoyi-ui/src/views/JiHeExpressway/pages/maintenanceOperations/smart/statisticalAnalysis/query/chartRecord.js

@ -0,0 +1,114 @@
var options = {
tooltip: {
show: true,
trigger: "axis",
formatter: function(params) {
console.log(params)
let text= `${params[0].axisValue} <br />`
for(let i of params){
if(i.seriesIndex===0){
text += `${i.marker} ${i.seriesName}${i.data}%<br />`
}
if(i.seriesIndex===1){
text += `${i.marker} ${i.seriesName}${i.data}ms<br />`
}
}
return text
}
},
legend: {
top: "5%",
x: "right",
textStyle: {
color: "#fff",
},
},
grid: {
top: "25%", //上边距
right: "0%", //右边距
left: "0%", //左边距
bottom: "10%", //下边距
containLabel: true,
},
xAxis: {
data: [],
axisTick: {
show: false, //隐藏X轴刻度
},
axisLine: {
lineStyle: {
color: "rgba(49, 217, 255, 0.8)",
},
},
axisLabel: {
show: true,
color: "#fff",
fontFamily: "Source Han Sans CN-Regular",
},
},
yAxis: [
{
type: "value",
name: "%",
nameTextStyle: {
color: "#fff",
fontFamily: "Source Han Sans CN-Regular",
align: "right",
},
axisLabel: {
color: "#fff",
},
splitLine: {
lineStyle: {
color: "rgba(49, 217, 255, 0.5)",
},
},
}, {
type: "value",
name: "ms",
nameTextStyle: {
color: "#fff",
align: "right",
verticalAlign: "center",
},
axisLabel: {
color: "#fff",
},
splitLine: {
show: false,
lineStyle: {
color: "rgba(49, 217, 255, 0.5)",
},
},
},
],
series: [
{
name: "丢包率",
type: "line",
symbol: "circle",
itemStyle: {
color: "#1890ff",
},
lineStyle: {
width: 2,
},
data: []
}, {
name: "平均往返时延",
type: "line",
symbol: "circle",
yAxisIndex: 1, // 与第二个 y 轴关联
itemStyle: {
color: "#ff7272",
},
lineStyle: {
width: 2,
},
data: []
}
],
};
export default options;

33
ruoyi-ui/src/views/JiHeExpressway/pages/maintenanceOperations/smart/statisticalAnalysis/query/charts.js

@ -6,6 +6,39 @@ var options = {
valueFormatter: function (value) {
return value + " %";
},
enterable: true,//滚动条
extraCssText: "max-width:60%;max-height:83%; overflow: auto; ",//滚动条
//改变提示框的位置 不超出屏幕显示
position: function(point, params, dom, rect, size) {
//其中point为当前鼠标的位置,
//size中有两个属性:viewSize和contentSize,分别为外层div和tooltip提示框的大小
// 鼠标坐标和提示框位置的参考坐标系是:以外层div的左上角那一点为原点,x轴向右,y轴向下
// 提示框位置
var x = 0; // x坐标位置
var y = 0; // y坐标位置
// 当前鼠标位置
var pointX = point[0];
var pointY = point[1];
// 提示框大小
var boxWidth = size.contentSize[0];
var boxHeight = size.contentSize[1];
// boxWidth > pointX 说明鼠标左边放不下提示框
if (boxWidth > pointX) {
x = 5;
} else {
// 左边放的下
x = pointX - boxWidth;
}
// boxHeight > pointY 说明鼠标上边放不下提示框
if (boxHeight > pointY) {
y = 5;
} else {
// 上边放得下
y = pointY - boxHeight;
}
return [x, y];
}
},
legend: {
icon: "circle",

24
ruoyi-ui/src/views/JiHeExpressway/pages/maintenanceOperations/smart/statisticalAnalysis/query/data.js

@ -136,18 +136,18 @@ export const searchFormList = [
}
},
},
{
label: "方向:",
key: "direction",
type: "select",
options: {
options: [
{ key: "3", label: "济南方向" },
{ key: "1", label: "菏泽方向" },
{ key: "2", label: "双向" },
],
},
}
// {
// label: "方向:",
// key: "direction",
// type: "select",
// options: {
// options: [
// { key: "3", label: "济南方向" },
// { key: "1", label: "菏泽方向" },
// { key: "2", label: "双向" },
// ],
// },
// }
];
export const testDeviceData = {

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save