Browse Source

Merge branch 'develop' of http://39.106.31.193:9211/mengff/jihe-hs into develop

wangqin
王钦 1 year ago
parent
commit
e41494f750
  1. 7
      ruoyi-ui/src/App.vue
  2. 16
      ruoyi-ui/src/api/perception/meteorologyCheck.js
  3. 61
      ruoyi-ui/src/api/service/PublishingChannelManagement.js
  4. 32
      ruoyi-ui/src/store/modules/menu.js
  5. 36
      ruoyi-ui/src/views/JiHeExpressway/components/RecentPages/ContextMenu.vue
  6. 75
      ruoyi-ui/src/views/JiHeExpressway/components/RecentPages/index.vue
  7. 5
      ruoyi-ui/src/views/JiHeExpressway/images/layer/路测设备/远端机.svg
  8. 3
      ruoyi-ui/src/views/JiHeExpressway/images/layer/路测设备/远端机_active.svg
  9. 3
      ruoyi-ui/src/views/JiHeExpressway/images/layer/路测设备/远端机_fault.svg
  10. 1
      ruoyi-ui/src/views/JiHeExpressway/index.vue
  11. 184
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/MeteorologicalDetection/components/DeviceControlDialog.vue
  12. 114
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/MeteorologicalDetection/components/chart.js
  13. 218
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/MeteorologicalDetection/index.vue
  14. 55
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/RemoteMachine/components/DeviceControlDialog.vue
  15. 199
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/RemoteMachine/components/DeviceParams.vue
  16. 166
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/RemoteMachine/components/DeviceParamsMulti.vue
  17. 195
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/RemoteMachine/index.vue
  18. 24
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/SmartDevice/index.vue
  19. 15
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/SolarEnergy/components/DeviceParams.vue
  20. 9
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/SolarEnergy/index.vue
  21. 10
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/RoadAndEvents/index.vue
  22. 9
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/RoadAndEvents/utils/buttonEvent.js
  23. 44
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/RoadAndEvents/utils/httpList.js
  24. 4
      ruoyi-ui/src/views/JiHeExpressway/pages/control/device/strategy/components/TaskItem.vue
  25. 6
      ruoyi-ui/src/views/JiHeExpressway/pages/control/device/strategy/components/taskEditDialog.vue
  26. 2
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/event/EventDetailDialog/index.vue
  27. 4
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/eventQuery/index.vue
  28. 16
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/index.vue
  29. 20
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/meteorologyCheck/components/roadNetwork/index.vue
  30. 10
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/meteorologyCheck/components/weatherInfoQuery/components/weaterData/index.vue
  31. 1
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/meteorologyCheck/components/weatherWarning/components/infoWarning/index.vue
  32. 20
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/trafficFlow/index.vue
  33. 2
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/trafficSituation/components/IndicatorAnalysis/components/changesIndicators/assets/charts3.js
  34. 22
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/trafficSituation/components/IndicatorAnalysis/components/changesIndicators/index.vue
  35. 138
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/trafficSituation/components/IndicatorAnalysis/components/composeFeatures/index.vue
  36. 41
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/trafficSituation/components/IndicatorAnalysis/components/congestionIndicator/index.vue
  37. 138
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/trafficSituation/components/IndicatorAnalysis/components/crowding/index.vue
  38. 719
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/trafficSituation/components/IndicatorAnalysis/components/roadIndicators/index.vue
  39. 140
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/trafficSituation/components/IndicatorAnalysis/components/saturationMax/index.vue
  40. 2
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/trafficSituation/components/IndicatorAnalysis/components/trafficIndicators/assets/charts.js
  41. 27
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/trafficSituation/components/IndicatorAnalysis/components/trafficIndicators/index.vue
  42. 119
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/trafficSituation/components/IndicatorAnalysis/index.vue
  43. 36
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/trafficSituation/index.vue
  44. 189
      ruoyi-ui/src/views/JiHeExpressway/pages/service/PublishingChannelManagement/components/AddNEditDialog.vue
  45. 182
      ruoyi-ui/src/views/JiHeExpressway/pages/service/PublishingChannelManagement/components/Card.vue
  46. 82
      ruoyi-ui/src/views/JiHeExpressway/pages/service/PublishingChannelManagement/data.js
  47. 66
      ruoyi-ui/src/views/JiHeExpressway/pages/service/PublishingChannelManagement/index.vue
  48. 42
      ruoyi-ui/src/views/JiHeExpressway/pages/service/boardRecord/index.vue
  49. 122
      ruoyi-ui/src/views/JiHeExpressway/utils/enum.js
  50. 4
      ruoyi-ui/vue.config.js

7
ruoyi-ui/src/App.vue

@ -21,16 +21,19 @@ export default {
name: "App",
data() {
return {
path: this.$route.path,
// path: this.$route.path,
};
},
mounted(){
this.$store.commit("menu/resetRecent");
},
components: {
websocket,
// websocket_phone
},
watch: {
$route(to, from) {
this.path = this.$route.path;
// this.path = this.$route.path;
},
},
metaInfo() {

16
ruoyi-ui/src/api/perception/meteorologyCheck.js

@ -63,3 +63,19 @@ export function getListVisibility() {
method: "get",
});
}
// 路网交通状况
export function getTrafficConditions() {
return request({
url: "/business/weatherMonitoring/getTrafficConditions",
method: "get",
});
}
// 获取县城经纬度
export function getRegionList() {
return request({
url: "/business/region/list",
method: "get",
});
}

61
ruoyi-ui/src/api/service/PublishingChannelManagement.js

@ -0,0 +1,61 @@
import request from "@/utils/request";
// 发布渠道列表
export function getChannelsList(pageNum, pageSize, data) {
return request({
url: `/business/channels/list?pageNum=${pageNum}&pageSize=${pageSize}`,
method: "post",
data,
});
}
// 导出发布渠道列表
export function getChannelsExport() {
return request({
url: "/business/channels/export",
method: "post",
});
}
// 获取发布渠道详情
export function getChannels(id) {
return request({
url: "/business/channels/" + id,
method: "get",
});
}
// 新增发布渠道
export function addChannels(data) {
return request({
url: "/business/channels",
method: "post",
data,
});
}
// 修改发布渠道
export function editChannels(data) {
return request({
url: "/business/channels",
method: "put",
data,
});
}
// 删除发布渠道
export function delChannels(id) {
return request({
url: "/business/channels/" + id,
method: "delete",
});
}
// 发布渠道修改状态
export function updateEnabledChannels(data) {
return request({
url: "business/channels/updateEnabled",
method: "post",
data,
});
}

32
ruoyi-ui/src/store/modules/menu.js

@ -1,3 +1,4 @@
import Vue from "vue"
const state = {
recentPages: [],
isRecentOpen:"",
@ -5,12 +6,12 @@ const state = {
const mutations = {
saveRecent(state){
sessionStorage.setItem("recentPages", JSON.stringify(state.recentPages));
localStorage.setItem("recentPages", JSON.stringify(state.recentPages));
},
addRecent(state, item) {
if(state.recentPages.length == 0 ){
state.recentPages = JSON.parse(sessionStorage.getItem("recentPages") || "[]");
state.recentPages = JSON.parse(localStorage.getItem("recentPages") || "[]");
}
let temp;
state.recentPages.forEach((unit,index)=>{
@ -29,13 +30,22 @@ const state = {
mutations.saveRecent(state);
},
pinRecent(state, item){
state.recentPages.forEach((unit, index) => {
if (unit.path == item.path) {
// unit.isPinned = !unit.isPinned;
Vue.prototype.$set(unit, "isPinned", !unit.isPinned);
}
});
mutations.saveRecent(state);
},
openRecent(state){
state.isRecentOpen = true;
sessionStorage.setItem("isRecentOpen", true);
localStorage.setItem("isRecentOpen", true);
},
closeRecent(state){
state.isRecentOpen = false;
sessionStorage.setItem("isRecentOpen", false);
localStorage.setItem("isRecentOpen", false);
},
removeRecent(state, item) {
let i = state.recentPages.findIndex(unit => unit.path == item.path);
@ -43,9 +53,15 @@ const state = {
mutations.saveRecent(state);
},
resetRecent(state, para){
state.isRecentOpen = false;
sessionStorage.setItem("isRecentOpen", false);
sessionStorage.removeItem("recentPages")
let temp = JSON.parse(localStorage.getItem("recentPages") || "[]");
state.recentPages = [];
temp.forEach((unit, index) => {
if (unit.isPinned) {
state.recentPages.push(unit);
}
});
localStorage.setItem("recentPages", JSON.stringify(state.recentPages));
state.isRecentOpen = true;
}
}
@ -53,7 +69,7 @@ const state = {
const getters = {
isRecentOpen(state){
if (state.isRecentOpen === ""){
state.isRecentOpen = JSON.parse(sessionStorage.getItem("isRecentOpen")) || false;
state.isRecentOpen = JSON.parse(localStorage.getItem("isRecentOpen")) || false;
}
return state.isRecentOpen;
}

36
ruoyi-ui/src/views/JiHeExpressway/components/RecentPages/ContextMenu.vue

@ -0,0 +1,36 @@
<template>
<div ref="ele" class="comp_box">
<slot></slot>
<ul class="sub_menu">
<li>菜单一</li>
</ul>
</div>
</template>
<script>
export default{
name:"ContextMenu",
data(){
return {
}
},
computed:{
},
watch:{
},
mounted(){
this.$refs["ele"].addEventListener("contextmenu", this.showMenu)
},
methods:{
showMenu(e){
e.preventDefault();
e.stopPropagation();
}
}
}
</script>
<style lang="scss" scoped>
.comp_box{
position: relative; border: 1px solid #f00;
.sub_menu{ position: absolute; z-index: 9999;border: 1px solid #0f0; left: 0; top:0; }
}
</style>

75
ruoyi-ui/src/views/JiHeExpressway/components/RecentPages/index.vue

@ -1,24 +1,39 @@
<template>
<div class="recent_pages">
<h4><i class="iconfont icon-recent"></i>最近访问:</h4>
<div class="history_buttons">
<div class="btn_left" @click="onLeft" :class="{'disabled' : startIndex <= 0 }"><i class="iconfont icon-left"></i></div>
<div class="list_box" ref="box">
<div class="list" :style="btnListStyle" ref="btnlist">
<div class="unit" :class="isActive(item) ? 'active' : ''" v-for="item,index in recentPages" ref="unit">
<p class="btn_main" @click="onClickItem(item)" :key="item.path" :style="{width:item.title.length*14+'px'}">
{{item.title}}
</p>
<i class="btn_close iconfont icon-guanbi" @click="onRemoveItem(item)"></i>
<div class="recent_pages">
<h4><i class="iconfont icon-recent"></i>
<!-- <ContextMenu>最近访问:</ContextMenu> -->
最近访问:
</h4>
<div class="history_buttons">
<div class="btn_left" @click="onLeft" :class="{'disabled' : startIndex <= 0 }"><i
class="iconfont icon-left"></i></div>
<div class="list_box" ref="box">
<div class="list" :style="btnListStyle" ref="btnlist">
<div class="unit" :class="isActive(item) ? 'active' : ''" v-for="item,index in recentPages"
ref="unit">
<p class="btn_main" @click="onClickItem(item)" :key="item.path"
:style="{width:item.title.length*14+'px'}">
{{item.title}}
</p>
<el-tooltip effect="light" content="记住" placement="bottom">
<p class="btn_pin" :class="item.isPinned ? 'active' :'unactive'" @click="onPin(item)">
<i></i>
</p>
</el-tooltip>
<!-- <p class=" btn_pin" :class="{active:item.isPinned}" @click="onPin(item)"><i></i></p> -->
<i class="btn_close iconfont icon-guanbi" @click="onRemoveItem(item)"></i>
</div>
</div>
</div>
<div class="btn_right" @click="onRight"
:class="{ 'disabled': lastIndex == -1 || lastIndex >= widthArr.length - 1 }"><i
class="iconfont icon-right"></i></div>
</div>
<div class="btn_right" @click="onRight" :class="{ 'disabled': lastIndex == -1 || lastIndex >= widthArr.length - 1 }"><i class="iconfont icon-right"></i></div>
</div>
</div>
</template>
<script>
import { mapMutations, mapState } from 'vuex';
import ContextMenu from './ContextMenu.vue';
export default{
data(){
return {
@ -31,6 +46,9 @@ export default{
currentIndex : -1
}
},
components:{
ContextMenu
},
computed:{
...mapState("menu", ["recentPages"]),
btnListStyle(){
@ -86,19 +104,15 @@ export default{
}
},
mounted(){
//
// for (let i = 0; i < 30; i++) {
// this.addRecent({
// title: `${i}`,
// path: "url" + i
// });
// }
},
methods:{
...mapMutations("menu", ["addRecent","removeRecent"]),
...mapMutations("menu", ["addRecent", "removeRecent","pinRecent"]),
onClickItem(item){
this.$route.path != item.path && this.$router.push(item.path);
},
onPin(item){
this.pinRecent(item);
},
onRemoveItem(item){
this.removeRecent(item);
if(this.$route.path == item.path){
@ -189,7 +203,7 @@ export default{
<style lang="scss" scoped>
.recent_pages{
display: flex; flex-direction: row; align-items:stretch; padding: 0 20px;
h4{ width: 110px; height: 32px; line-height: 32px; text-align: center; margin: 0; padding: 0; font-weight: bold; color: #3de8ff;
h4{ width: 110px; height: 32px; line-height: 32px; text-align: center; margin: 0; padding: 0; font-weight: bold; color: #3de8ff; display: flex; align-items: center; justify-content: center;
.iconfont{ margin-right: 3px;}
}
.history_buttons {
@ -225,7 +239,22 @@ export default{
border:1px solid #03a9b1;
}
}
.btn_pin{
position: absolute;
left:0;
bottom:0;
width:16px; height: 10px;
display: flex; align-items: center; justify-content: center;
i{
display: none;
width:6px; height: 6px; border-radius: 3px;
}
&.active i{ display: block; background-color: #FA0; }
}
&:hover .btn_pin.unactive i {
display: block;
background-color: #999;
}
.btn_close {
position: absolute;
right: 6px;

5
ruoyi-ui/src/views/JiHeExpressway/images/layer/路测设备/远端机.svg

@ -0,0 +1,5 @@
<svg width="21" height="19" viewBox="0 0 21 19" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Group 1142815835">
<path id="Vector" d="M20.6037 11.8437C20.6037 11.8079 20.6037 11.7722 20.5903 11.7364L18.8482 2.20744C18.7812 1.84965 18.5936 1.49187 18.3256 1.25335C18.0308 0.990976 17.6422 0.835938 17.1866 0.835938H3.7329C3.27729 0.835938 2.84849 1.0029 2.54028 1.26528C2.24548 1.52765 2.07128 1.88543 2.05788 2.26707L0.315863 11.6648C0.302463 11.7244 0.289062 11.7841 0.289062 11.8318M3.6123 2.43403C3.6257 2.39825 3.6257 2.36248 3.6257 2.31477C3.6257 2.29092 3.6391 2.26707 3.6525 2.25514C3.6793 2.23129 3.7061 2.21936 3.7329 2.21936H17.1732C17.1866 2.21936 17.2 2.21936 17.2 2.24321C17.2536 2.29092 17.2804 2.36248 17.2938 2.44596L18.4194 8.54018C18.3658 8.52826 18.3256 8.52826 18.272 8.52826H2.63409C2.59388 8.52826 2.54028 8.52826 2.48668 8.54018L3.6123 2.43403ZM2.32588 9.42271C2.40628 9.37501 2.52688 9.33923 2.63409 9.33923H18.2854C18.3926 9.33923 18.4998 9.36308 18.5936 9.42271L18.8348 10.7227H2.09808L2.32588 9.42271ZM20.1213 18.2599H0.784868C0.516865 18.2599 0.289062 18.0691 0.289062 17.8187V15.8866C0.289062 15.6481 0.503465 15.4454 0.784868 15.4454H20.1213C20.3893 15.4454 20.6171 15.6362 20.6171 15.8866V17.8306C20.6171 18.0691 20.4027 18.2599 20.1213 18.2599ZM20.1079 12.2253H0.811668C0.530265 12.2253 0.302463 12.4281 0.302463 12.6785V14.5748C0.302463 14.8252 0.530265 15.028 0.811668 15.028H20.0945C20.3759 15.028 20.6037 14.8252 20.6037 14.5748V12.6785C20.6171 12.44 20.3893 12.2253 20.1079 12.2253ZM4.67091 14.4674C4.67091 14.6106 4.5503 14.7179 4.3895 14.7179C4.2287 14.7179 4.1081 14.6106 4.1081 14.4674V12.8932C4.1081 12.7501 4.2287 12.6428 4.3895 12.6428C4.5503 12.6428 4.67091 12.7501 4.67091 12.8932V14.4674ZM5.85012 14.4674C5.85012 14.6106 5.72952 14.7179 5.56871 14.7179C5.40791 14.7179 5.28731 14.6106 5.28731 14.4674V12.8932C5.28731 12.7501 5.40791 12.6428 5.56871 12.6428C5.72952 12.6428 5.85012 12.7501 5.85012 12.8932V14.4674ZM7.02933 14.4674C7.02933 14.6106 6.90873 14.7179 6.74793 14.7179C6.58712 14.7179 6.46652 14.6106 6.46652 14.4674V12.8932C6.46652 12.7501 6.58712 12.6428 6.74793 12.6428C6.90873 12.6428 7.02933 12.7501 7.02933 12.8932V14.4674ZM16.8784 14.5867C16.2888 14.5867 15.8064 14.1574 15.8064 13.6326C15.8064 13.1079 16.2888 12.6785 16.8784 12.6785C17.468 12.6785 17.9504 13.1079 17.9504 13.6326C17.9504 14.1574 17.4814 14.5867 16.8784 14.5867Z" fill="#0FD4FF"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

3
ruoyi-ui/src/views/JiHeExpressway/images/layer/路测设备/远端机_active.svg

@ -0,0 +1,3 @@
<svg width="22" height="18" viewBox="0 0 22 18" fill="none" xmlns="http://www.w3.org/2000/svg">
<path id="Vector" d="M21.2267 11.0922C21.2267 11.0565 21.2267 11.0207 21.2133 10.9849L19.4713 1.45597C19.4043 1.09819 19.2167 0.740407 18.9487 0.501885C18.6539 0.239512 18.2653 0.0844727 17.8097 0.0844727H4.35594C3.90034 0.0844727 3.47153 0.251438 3.16333 0.513812C2.86853 0.776185 2.69433 1.13397 2.68093 1.5156L0.93891 10.9134C0.92551 10.973 0.912109 11.0326 0.912109 11.0803M4.23534 1.68257C4.24874 1.64679 4.24874 1.61101 4.24874 1.56331C4.24874 1.53945 4.26214 1.5156 4.27554 1.50368C4.30234 1.47982 4.32914 1.4679 4.35594 1.4679H17.7963C17.8097 1.4679 17.8231 1.4679 17.8231 1.49175C17.8767 1.53945 17.9035 1.61101 17.9169 1.69449L19.0425 7.78872C18.9889 7.77679 18.9487 7.77679 18.8951 7.77679H3.25713C3.21693 7.77679 3.16333 7.77679 3.10973 7.78872L4.23534 1.68257ZM2.94893 8.67125C3.02933 8.62354 3.14993 8.58777 3.25713 8.58777H18.9085C19.0157 8.58777 19.1229 8.61162 19.2167 8.67125L19.4579 9.97119H2.72113L2.94893 8.67125ZM20.7443 17.5085H1.40791C1.13991 17.5085 0.912109 17.3177 0.912109 17.0672V15.1352C0.912109 14.8967 1.12651 14.6939 1.40791 14.6939H20.7443C21.0123 14.6939 21.2401 14.8847 21.2401 15.1352V17.0791C21.2401 17.3177 21.0257 17.5085 20.7443 17.5085ZM20.7309 11.4739H1.43471C1.15331 11.4739 0.92551 11.6766 0.92551 11.9271V13.8233C0.92551 14.0738 1.15331 14.2765 1.43471 14.2765H20.7175C20.9989 14.2765 21.2267 14.0738 21.2267 13.8233V11.9271C21.2401 11.6885 21.0123 11.4739 20.7309 11.4739ZM5.29395 13.716C5.29395 13.8591 5.17335 13.9664 5.01255 13.9664C4.85175 13.9664 4.73115 13.8591 4.73115 13.716V12.1417C4.73115 11.9986 4.85175 11.8913 5.01255 11.8913C5.17335 11.8913 5.29395 11.9986 5.29395 12.1417V13.716ZM6.47316 13.716C6.47316 13.8591 6.35256 13.9664 6.19176 13.9664C6.03096 13.9664 5.91036 13.8591 5.91036 13.716V12.1417C5.91036 11.9986 6.03096 11.8913 6.19176 11.8913C6.35256 11.8913 6.47316 11.9986 6.47316 12.1417V13.716ZM7.65238 13.716C7.65238 13.8591 7.53177 13.9664 7.37097 13.9664C7.21017 13.9664 7.08957 13.8591 7.08957 13.716V12.1417C7.08957 11.9986 7.21017 11.8913 7.37097 11.8913C7.53177 11.8913 7.65238 11.9986 7.65238 12.1417V13.716ZM17.5015 13.8352C16.9119 13.8352 16.4295 13.4059 16.4295 12.8812C16.4295 12.3564 16.9119 11.9271 17.5015 11.9271C18.0911 11.9271 18.5735 12.3564 18.5735 12.8812C18.5735 13.4059 18.1045 13.8352 17.5015 13.8352Z" fill="#FFDB82"/>
</svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

3
ruoyi-ui/src/views/JiHeExpressway/images/layer/路测设备/远端机_fault.svg

@ -0,0 +1,3 @@
<svg width="21" height="18" viewBox="0 0 21 18" fill="none" xmlns="http://www.w3.org/2000/svg">
<path id="Vector" d="M20.9533 11.0922C20.9533 11.0565 20.9533 11.0207 20.9399 10.9849L19.1979 1.45597C19.1309 1.09819 18.9433 0.740407 18.6752 0.501885C18.3804 0.239512 17.9918 0.0844727 17.5362 0.0844727H4.08251C3.6269 0.0844727 3.1981 0.251438 2.88989 0.513812C2.59509 0.776185 2.42089 1.13397 2.40749 1.5156L0.665472 10.9134C0.652072 10.973 0.638672 11.0326 0.638672 11.0803M3.9619 1.68257C3.9753 1.64679 3.9753 1.61101 3.9753 1.56331C3.9753 1.53945 3.9887 1.5156 4.0021 1.50368C4.0289 1.47982 4.05571 1.4679 4.08251 1.4679H17.5228C17.5362 1.4679 17.5496 1.4679 17.5496 1.49175C17.6032 1.53945 17.63 1.61101 17.6434 1.69449L18.769 7.78872C18.7154 7.77679 18.6752 7.77679 18.6216 7.77679H2.98369C2.94349 7.77679 2.88989 7.77679 2.83629 7.78872L3.9619 1.68257ZM2.67549 8.67125C2.75589 8.62354 2.87649 8.58777 2.98369 8.58777H18.635C18.7422 8.58777 18.8494 8.61162 18.9433 8.67125L19.1845 9.97119H2.44769L2.67549 8.67125ZM20.4709 17.5085H1.13448C0.866474 17.5085 0.638672 17.3177 0.638672 17.0672V15.1352C0.638672 14.8967 0.853074 14.6939 1.13448 14.6939H20.4709C20.7389 14.6939 20.9667 14.8847 20.9667 15.1352V17.0791C20.9667 17.3177 20.7523 17.5085 20.4709 17.5085ZM20.4575 11.4739H1.16128C0.879874 11.4739 0.652072 11.6766 0.652072 11.9271V13.8233C0.652072 14.0738 0.879874 14.2765 1.16128 14.2765H20.4441C20.7255 14.2765 20.9533 14.0738 20.9533 13.8233V11.9271C20.9667 11.6885 20.7389 11.4739 20.4575 11.4739ZM5.02051 13.716C5.02051 13.8591 4.89991 13.9664 4.73911 13.9664C4.57831 13.9664 4.45771 13.8591 4.45771 13.716V12.1417C4.45771 11.9986 4.57831 11.8913 4.73911 11.8913C4.89991 11.8913 5.02051 11.9986 5.02051 12.1417V13.716ZM6.19973 13.716C6.19973 13.8591 6.07912 13.9664 5.91832 13.9664C5.75752 13.9664 5.63692 13.8591 5.63692 13.716V12.1417C5.63692 11.9986 5.75752 11.8913 5.91832 11.8913C6.07912 11.8913 6.19973 11.9986 6.19973 12.1417V13.716ZM7.37894 13.716C7.37894 13.8591 7.25834 13.9664 7.09754 13.9664C6.93673 13.9664 6.81613 13.8591 6.81613 13.716V12.1417C6.81613 11.9986 6.93673 11.8913 7.09754 11.8913C7.25834 11.8913 7.37894 11.9986 7.37894 12.1417V13.716ZM17.228 13.8352C16.6384 13.8352 16.156 13.4059 16.156 12.8812C16.156 12.3564 16.6384 11.9271 17.228 11.9271C17.8176 11.9271 18.3 12.3564 18.3 12.8812C18.3 13.4059 17.831 13.8352 17.228 13.8352Z" fill="#FF5F5F"/>
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

1
ruoyi-ui/src/views/JiHeExpressway/index.vue

@ -57,6 +57,7 @@ export default {
}
},
mounted(){
// this.$store.commit("menu/resetRecent");
getBoardBaseData().then(res => {
this.isShowContent = true;
});

184
ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/MeteorologicalDetection/components/DeviceControlDialog.vue

@ -0,0 +1,184 @@
<template>
<Dialog v-model="modelVisible" :title="title" width="910px">
<div class="DeviceControlDialog">
<div class="headSearch">
<p>时间范围:</p>
<el-radio-group v-model="radio1" @input="onChangeRadio">
<el-radio-button label="1"></el-radio-button>
<el-radio-button label="2">月度</el-radio-button>
<el-radio-button label="3">年度</el-radio-button>
</el-radio-group>
<el-date-picker style="width:140px;" v-model="time" :type="pickerType" placeholder="请选择" :format="valueFormat"
value-format="yyyy-MM-dd" :clearable="false" @change="initData">
</el-date-picker>
</div>
<div v-if="chartVisible" class='chart LineChart' ref="LineChartRef" />
</div>
</Dialog>
</template>
<script>
import * as echarts from "echarts";
import { lineChartOption } from "./chart"
import Dialog from "@screen/components/Dialog/index.vue";
import request from "@/utils/request";
import { throttle } from "lodash"
import { Message } from "element-ui";
export default {
name: "DeviceControlDialog",
components: {
Dialog,
},
model: {
prop: "visible",
event: "update:value",
},
props: {
visible: Boolean,
deviceName: String,
btnType: Number,
},
data() {
return {
submitting: false,
chartVisible: true,
title: '气温变化趋势',
pickerType: 'date',
valueFormat: 'yyyy-MM-dd',
radio1: '1',
time: ''
};
},
computed: {
modelVisible: {
get() {
return this.visible;
},
set(val) {
this.$emit("update:value", val);
},
},
},
watch: {
visible: {
immediate: true,
handler(bool) {
if (bool) {
if (this.btnType == 1) {
this.title = '气温变化趋势'
} else {
this.title = '能见度变化趋势'
}
this.initData();
}
},
},
},
mounted() {
this.time = new Date().format('yyyy-MM-dd')
},
methods: {
async initData() {
console.log('ll', this.radio1, this.time)
let lastPath = 'deviceHour'
if (this.pickerType == 'date') {
lastPath = 'deviceHour'
} else if (this.pickerType == 'month') {
lastPath = 'deviceDay'
} else if (this.pickerType == 'year') {
lastPath = 'deviceYears'
}
let qsData = await request({
url: `/dc/system/meteorologicalDetector/${lastPath}?deviceName=${this.deviceName}&specificDate=${this.time}`,
method: "get",
})
if (qsData.code !== 200) {
return Message.error('查询气象变化趋势数据失败');
}
let times = [], datas = [];
qsData.rows.forEach(item => {
if (lastPath == 'deviceHour') {
times.push(item.timeSlot);
} else if (lastPath == 'deviceDay') {
times.push(new Date(item.date).format('dd'));
} else if (lastPath == 'deviceYears') {
times.push(new Date(item.month).format('MM'));
}
datas.push(this.btnType == 1 ? item.avgTemperature : item.avgVisibility)
})
// console.log('datas',datas)
if (lastPath == 'deviceHour') {
lineChartOption.xAxis.name = '时'
} else if (lastPath == 'deviceDay') {
lineChartOption.xAxis.name = '日'
} else if (lastPath == 'deviceYears') {
lineChartOption.xAxis.name = '月'
}
lineChartOption.xAxis.data = times;
lineChartOption.yAxis.name = this.btnType == 1 ? '℃' : '米';
lineChartOption.series[0].name = this.btnType == 1 ? '温度(℃)' : '能见度(米)'
lineChartOption.series[0].data = datas;
const chartIns = echarts.init(this.$refs.LineChartRef);
chartIns.setOption(lineChartOption);
},
async handleSubmit() {
this.$refs.DeviceParam?.handleSubmit();
},
onChangeRadio(value) {
this.time = '';
if (value == '1') {
this.pickerType = 'date'
this.valueFormat = 'yyyy-MM-dd'
} else if (value == '2') {
this.pickerType = 'month'
this.valueFormat = 'yyyy-MM'
} else if (value == '3') {
this.pickerType = 'year'
this.valueFormat = 'yyyy'
}
}
},
};
</script>
<style lang="scss" scoped>
.DeviceControlDialog {
width: 860px;
max-height: 78vh;
height: 410px;
display: flex;
flex-direction: column;
gap: 15px;
.headSearch {
display: flex;
p {
margin-right: 10px;
}
::v-deep {
.el-input__prefix {
top: -5px
}
}
}
.tips {
font-size: 12px;
}
.LineChart {
flex: 1;
height: 100%;
}
}
</style>

114
ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/MeteorologicalDetection/components/chart.js

@ -0,0 +1,114 @@
import * as echarts from "echarts";
export const lineChartOption = {
color: ["#2AD9FD"],
xAxis: {
name: "时",
type: "category",
// boundaryGap: ["15%", "15%"],
nameTextStyle: {
color: "#2AD9FD",
align: "right",
fontSize: 15,
padding: [0, -15, 0, 0],
},
boundaryGap: false,
data: ['00:00','02:00','04:00','06:00'],
axisTick: {
show: false,
},
axisLabel: {
color: "#fff",
fontSize: 12,
},
axisLine: {
lineStyle: {
color: "#668598",
},
},
},
yAxis: {
name: "辆",
type: "value",
nameTextStyle: {
color: "#2AD9FD",
// align: "right",
fontSize: 15,
// padding: [0, -15, 0, 0],
},
// nameGap: 24,
splitLine: {
lineStyle: {
type: [6, 9],
color: "rgba(255,255,255, .3)",
// dashOffset: [10, 10],
// cap: 21,
// width: 2
},
},
axisLabel: {
color: "#fff",
fontSize: 12,
formatter: "{value}",
},
},
grid: {
left: 33,
top: 33,
bottom: 24,
right: 36,
},
tooltip: {
trigger: "axis",
backgroundColor: "rgba(0,0,0,0.36)",
borderWidth: 0,
textStyle: {
color: "#fff",
},
formatter: "{b}:{c}",
// formatter: function([axisData]) {
// console.log(axisData)
// let str = axisData.name + ' ' + axisData.data + '辆</br>';
// // params.forEach(item => {
// // if (item.seriesName === '供温' || item.seriesName === '回温') {
// // str += item.marker + item.seriesName + ' : ' + item.data.value + ' ℃' + '</br>';
// // } else if (item.seriesName === '压力值(Mpa)') {
// // // 柱状图渐变时设置marker
// // item.marker = '<span style="display:inline-block;margin-right:5px;border-radius:10px;width:10px;height:10px;background-color:#6C50F3;"></span>';
// // str += item.marker + item.seriesName + ' : ' + item.data.value + ' m';
// // }
// // });
// return str;
// }
},
legend: {
textStyle: {
color: '#2AD9FD'
}
},
series: [
{
data: [1,2,3,4],
type: "line",
showSymbol: false,
smooth: true,
name: '温度(℃)',
lineStyle: {
color: "#2AD9FD",
},
areaStyle: {
opacity: 0.8,
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{
offset: 0,
color: "rgb(90, 227, 255, .9)",
},
{
offset: 1,
color: "rgba(42,217,253,0)",
},
]),
},
},
],
};

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

@ -0,0 +1,218 @@
<template>
<Dialog v-model="obverseVisible" title="气象设备" width="470px">
<div class="MeteorologicalDetection">
<Video class="video-stream" :pileNum="dialogData.stakeMark" />
<ElTabs v-model="activeName" @tab-click="handleClickTabs" class="tabs">
<ElTabPane label="基本信息" name="first">
<Descriptions labelWidth="72px" :list="list" :data="data" style="gap: 18px" />
</ElTabPane>
<ElTabPane label="气象情况" name="second">
<Descriptions labelWidth="104px" :list="weatherList" :data="weatherData" style="gap: 14px" />
</ElTabPane>
</ElTabs>
</div>
<template #footer>
<Button @click.native="deviceControlVisible = true; btnType = 1">气温变化趋势</Button>
<Button @click.native="deviceControlVisible = true; btnType = 2">能见度变化趋势</Button>
</template>
<!-- 设备操作弹窗 -->
<DeviceControlDialog v-model="deviceControlVisible" :deviceName="dialogData.deviceName" :btnType="btnType" />
</Dialog>
</template>
<script>
import Dialog from "@screen/components/Dialog/index.vue";
import Descriptions from "@screen/components/Descriptions.vue";
import Button from "@screen/components/Buttons/Button.vue";
import {
getRoadInfoByStakeMark,
getProduct,
getMeteorologicalDetector
} from "@screen/pages/Home/components/RoadAndEvents/utils/httpList.js";
import Video from "@screen/components/Video";
import DeviceControlDialog from "./components/DeviceControlDialog.vue";
import request from "@/utils/request";
import { dialogDelayVisible } from "./../mixin";
import LineChart from "../../LineChart/index.vue";
//
export default {
name: "MeteorologicalDetection",
mixins: [dialogDelayVisible],
components: {
Dialog,
Descriptions,
Video,
DeviceControlDialog,
Button,
LineChart,
},
data() {
return {
activeName: "first",
deviceControlVisible: false,
data: {
deviceType: "行车诱导",
deviceStation: "k094+079",
roadName: "G35济泽高速",
direction: "1",
deviceState: "0",
deviceVendors: "XXX厂家",
},
btnType: 1,
weatherData: {},
list: [
{
label: "设备名称",
key: "deviceName",
},
{
label: "设备桩号",
key: "stakeMark",
},
{
label: "道路名称",
key: "roadName",
},
{
label: "设备方向",
key: "direction",
enum: "CameraDirectionEnum",
},
{
label: "设备状态",
key: "deviceState",
enum: "DeviceTypeEnum",
},
{
label: "设备厂商",
key: "manufacturer",
},
],
weatherList: [
{
label: "路面状态",
key: "remoteRoadSurfaceStatus",
enum: "remoteRoadSurfaceStatus",
},
{
label: "路表温度(℃)",
key: "remoteRoadSurfaceTemperature",
},
{
label: "下雨类型",
key: "precipitationType",
enum: "precipitationType",
},
{
label: "雨量(mm)",
key: "rainfall",
},
{
label: "能见度类型",
key: "visibilityType",
enum: "visibilityType",
},
{
label: "能见度(km)",
key: "visibility",
},
{
label: "温度(℃)",
key: "temperature",
},
{
label: "湿度",
key: "humidity",
},
{
label: "风向",
key: "windDirection",
},
{
label: "风速(m/s)",
key: "windSpeed",
},
{
label: "水膜厚度(mm)",
key: "waterFilmlceSnowValue",
},
{
label: "大气压力(hPa)",
key: "atmosphericPressure",
},
{
label: "时间",
key: "createTime",
gridColumn: 2,
},
]
};
},
async created() {
this.data = { ...this.dialogData };
getProduct(this.dialogData.productId).then((data) => {
this.dialogData.brand = data.brand;
});
const roadInfo = await getRoadInfoByStakeMark(this.dialogData.stakeMark);
if (roadInfo) this.$set(this.data, "roadName", roadInfo.roadName);
const weatherInfo = await getMeteorologicalDetector(this.dialogData.deviceName)
this.weatherData = { ...weatherInfo }
},
methods: {
handleClickTabs() { },
},
};
</script>
<style lang="scss" scoped>
.MeteorologicalDetection {
width: 420px;
color: #fff;
display: flex;
flex-direction: column;
gap: 12px;
// padding-bottom: 24px;
.camera-video {
flex: 1.5;
}
.tabs {
flex: 1;
display: flex;
flex-direction: column;
::v-deep {
.el-tabs__content {
flex: 1;
.el-tab-pane {
height: 100%;
}
}
}
}
.bottom {
margin-top: 12px;
display: flex;
gap: 9px;
align-items: center;
justify-content: end;
>div {
font-size: 16px;
padding: 6px 12px;
}
}
}
</style>

55
ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/RemoteMachine/components/DeviceControlDialog.vue

@ -0,0 +1,55 @@
<template>
<Dialog v-model="modelVisible" title="设备操作" width="600px">
<div class="DeviceControlDialog">
<DeviceParams :dialogData="dialogData" />
</div>
</Dialog>
</template>
<script>
import Dialog from "@screen/components/Dialog/index.vue";
import DeviceParams from "./DeviceParams.vue";
export default {
name: "DeviceControlDialog",
components: {
Dialog,
DeviceParams,
},
model: {
prop: "visible",
event: "update:value",
},
props: {
visible: Boolean,
dialogData: {
type: Object,
default: () => ({}),
},
},
computed: {
modelVisible: {
get() {
return this.visible;
},
set(val) {
this.$emit("update:value", val);
},
},
},
};
</script>
<style lang="scss" scoped>
.DeviceControlDialog {
width: 510px;
display: flex;
flex-direction: column;
gap: 15px;
min-height: 360px;
.tips {
font-size: 12px;
}
}
</style>

199
ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/RemoteMachine/components/DeviceParams.vue

@ -0,0 +1,199 @@
<template>
<div class='DeviceParams'>
<div class="no-data" v-if="!devicesList.length" v-loading="secondLoading">暂无设备参数</div>
<Descriptions :list="devicesList" style="gap: 18px;" column="5">
<template v-for="item in devicesList.slice(0, -1)" #[`content-${getSlotKey(item.key)}`]="{ data }">
<span>{{ data.text }}</span>
<Switcher v-if="!disabled" class="switcher" :activeOption="activeOption" :value="data.state"
@change="(value) => handleSwitcherChange(value, data)" />
<ElTag style="margin-left: 20px;" v-else effect="dark" :type="data.state ? '' : 'info'">{{ data.state ? '开' :
'关' }}
</ElTag>
</template>
</Descriptions>
</div>
</template>
<script>
import Descriptions from '@screen/components/Descriptions.vue';
import Switcher from '@screen/pages/service/PublishingChannelManagement/components/Switcher.vue';
import request from "@/utils/request";
import { Message } from 'element-ui';
import { confirm } from "@screen/utils/common";
export default {
name: 'DeviceParams',
components: {
Descriptions,
Switcher
},
props: {
dialogData: {
type: Object,
default: () => ({})
},
disabled: Boolean
},
data() {
return {
secondLoading: true,
devicesList: [],
activeOption: {
active: {
text: "开"
},
unActive: {
text: "关"
}
}
}
},
created() {
Promise.all([this.getAc(), this.getDc()]).then(res => {
// if (result.code != 200) return;
let ac = res[0].data;
let dc = res[1].data;
let deviceInfo = _.merge({}, ac, dc);
const typeMap = {
ac: '220v',
dc: '12v',
}
for (const key in deviceInfo.formatValue) {
// electricity
// voltage
if (key.includes('electricity')) {
const args = key.match(/[a-z]+|[0-9]+$/g);
const type = args[0], num = args.slice(-1)[0], prefix = args.slice(0, 2).join('_');
// console.log(type , num , prefix , "+++=========="); //dc 2 dc_out
this.devicesList.push(
{
label: `支路${num}${typeMap[type]}) 电压`,
key: `${prefix}_voltage_${num}`,
text: deviceInfo.formatValue[`${prefix}_voltage_${num}`],
gridColumn: 3
},
{
label: '电流',
key: `${prefix}_electricity_${num}`,
text: deviceInfo.formatValue[key],
gridColumn: 2,
state: deviceInfo.value[key] > 0
}
);
}
}
this.devicesList.push(
{
label: '风扇',
key: `fan_status`,
// key: `aa_electricity_1`,
text: { 0: '正常', 1: '开' }[deviceInfo.formatValue['fan_status']] || '-',
gridColumn: 2,
state: (deviceInfo.formatValue['fan_status'] === '0')
},
{
label: '温度',
key: `temperature`,
text: deviceInfo.formatValue['temperature'] ? `${deviceInfo.formatValue['temperature']} °C` : '-',
gridColumn: 2
},
{
label: '箱门',
key: `door_status`,
text: { 0: '关闭', 1: '打开' }[deviceInfo.formatValue['door_status']] || '-',
gridColumn: 1
},
{
label: '湿度',
key: `humidity`,
text: deviceInfo.formatValue['humidity'] ? `${deviceInfo.formatValue['humidity']} %` : '-',
gridColumn: 2
},
{
label: '市电掉电',
key: `power_status`,
text: { 0: '正常', 1: '掉电' }[deviceInfo.formatValue['power_status']] || '-',
gridColumn: 2
},
)
// this.data = result.rows;
// this.total = result.total;
})
.finally(() => {
this.secondLoading = false
})
},
methods: {
getAc() {
return request({
url: `/business/device/properties/latest/${this.dialogData.iotDeviceId || '10.0.36.143-1883'}/1ac`,
method: "get",
params: {}
})
},
getDc() {
return request({
url: `/business/device/properties/latest/${this.dialogData.iotDeviceId || '10.0.36.143-1883'}/1dc`,
method: "get",
params: {}
})
},
async handleSwitcherChange(value, data) {
let str = data.state ? "关闭" : "开启";
let deviceName = "";
if (data.key.includes("fan")) {
str += "风扇?";
deviceName = "fan_out_en";
} else {
str += "该支路?"
deviceName = data.key.match(/^[a-z]+_out|[0-9]+/g).join("_") + "_en"; //dc_out_2_en ac_out_2_en;
}
data.state = value;
const isContinue = await confirm({ message: `${str}` })
.catch(() => {
data.state = !value;
});
if (!isContinue) return;
// https://www.yuque.com/dayuanzhong-ovjwn/gkht0m/ww776d5kzs72ilzh?singleDoc=
request({
url: `/business/device/functions/${this.dialogData.iotDeviceId}/${102}`,
method: "POST",
data: {
deviceName,
// 1=0=
value: value ? 1 : 0
}
})
.then(result => {
if (result.code != 200) {
Message.error("操作失败");
data.state = !value;
return;
};
Message.success("操作成功");
})
.catch(() => {
data.state = !value;
Message.error("操作失败");
})
},
getSlotKey(key) {
return key.includes('electricity') || key.includes('fan') ? key : ''
}
}
}
</script>
<style lang='scss' scoped>
.DeviceParams {
height: 100%;
}
</style>

166
ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/RemoteMachine/components/DeviceParamsMulti.vue

@ -0,0 +1,166 @@
<template>
<div class='DeviceParams'>
<div class="no-data" v-if="!devicesList.length" v-loading="secondLoading">暂无设备参数</div>
<Descriptions :list="devicesList" style="gap: 18px;" column="5">
<template v-for="item in devicesList" #[`content-${item.key}`]="{ data }">
<span style="font-size: 15px;font-weight: 400;color: #3de8ff;">{{ data.text }}</span>
<Switcher v-if="!disabled" class="switcher" :activeOption="activeOption" :value="data.state"
@change="(value) => handleSwitcherChange(value, data)" />
<ElTag style="margin-left: 20px;" v-else effect="dark" :type="data.state ? '' : 'info'">{{ data.state ? '开' :
'关' }}
</ElTag>
</template>
</Descriptions>
</div>
</template>
<script>
import Descriptions from '@screen/components/Descriptions.vue';
import Switcher from '@screen/pages/service/PublishingChannelManagement/components/Switcher.vue';
import { cloneDeep } from 'lodash';
import request from "@/utils/request";
import { Message } from 'element-ui';
import { confirm } from "@screen/utils/common";
import { batchFunctions } from "@screen/pages/Home/components/RoadAndEvents/utils/httpList.js";
import { multiResultShow } from "@screen/utils/common";
export default {
name: 'DeviceParams',
components: {
Descriptions,
Switcher
},
props: {
dialogData: {
type: Object,
default: () => ({})
},
disabled: Boolean,
isMultiControl: Boolean,
selectItems: {
type: Array,
default: () => []
}
},
data() {
return {
secondLoading: true,
devicesList: [
{
labelHidden: true,
text: `支路1 (220v): `,
key: `ac_out_1_en`,
// text: deviceInfo.formatValue[`${prefix}_voltage_${num}`],
gridColumn: 1,
state: 0
},
{
labelHidden: true,
text: `支路2 (220v): `,
key: `ac_out_2_en`,
// text: deviceInfo.formatValue[`${prefix}_voltage_${num}`],
gridColumn: 1,
state: 0
},
{
labelHidden: true,
text: `支路1 (12v): `,
key: `dc_out_1_en`,
// text: deviceInfo.formatValue[`${prefix}_voltage_${num}`],
gridColumn: 1,
state: 0
},
{
labelHidden: true,
text: `支路2 (12v): `,
key: `dc_out_2_en`,
// text: deviceInfo.formatValue[`${prefix}_voltage_${num}`],
gridColumn: 1,
state: 0
},
{
labelHidden: true,
text: '风扇:',
key: `fan_out_en`,
// text: { 0: '', 1: '' }[deviceInfo.formatValue['fan_status']] || '-',
gridColumn: 1,
state: 0
},
],
activeOption: {
active: {
text: "开"
},
unActive: {
text: "关"
}
}
}
},
created() {
},
methods: {
async handleSwitcherChange(value, data) {
let str = data.state ? "关闭" : "开启";
let deviceName = data.key;
str += `${data.text.replace(":", "")}?`;
// if (data.key.includes("fan")) {
// str += "?";
// deviceName = "fan_out_en";
// } else {
// str += "?"
// deviceName = data.key.match(/^[a-z]+_out|[0-9]+/g).join("_") + "_en"; //dc_out_2_en ac_out_2_en;
// }
data.state = value;
if (!this.selectItems.length) {
setTimeout(() => { data.state = !value; }, 10);
return Message.error("请至少选择一个设备!");
}
const selectItems = this.selectItems.map(item => JSON.parse(item));
const isContinue = await confirm({ message: `${str}` })
.catch(() => {
data.state = !value;
});
if (!isContinue) return;
batchFunctions(
{
"devices": selectItems,
"functions": [
{
"functionId": "102",
"params": {
deviceName,
// 1=0=
value: value ? 1 : 0
}
}
]
})
.then(result => {
multiResultShow(result.data, item => item.result.code == 200, "操作");
})
.catch(() => {
data.state = !value;
Message.error("操作失败");
})
},
getSlotKey(key) {
return key.includes('electricity') || key.includes('fan') ? key : ''
}
}
}
</script>
<style lang='scss' scoped>
.DeviceParams {
height: 100%;
padding-right: 9px;
padding-left: 14px;
margin-top: 15px;
}
</style>

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

@ -0,0 +1,195 @@
<template>
<Dialog v-model="obverseVisible" title="远端机" width="600px">
<Video class="video-stream" :pileNum="dialogData.stakeMark" />
<div class="RemoteMachine">
<ElTabs v-model="activeName" class="tabs">
<ElTabPane label="基本信息" name="first">
<!-- {{ dialogData }} -->
<Descriptions :list="list" :data="data" style="gap: 18px" />
</ElTabPane>
<ElTabPane label="设备参数" name="second">
<DeviceParams disabled :dialogData="dialogData" />
</ElTabPane>
<ElTabPane label="在线率统计" name="third">
<LineChart v-if="activeName === 'third'" :productId="dialogData.id" style="height: 180px" />
</ElTabPane>
</ElTabs>
</div>
<template #footer>
<Button v-if="activeName != 'first' && data.deviceState == '1'" @click.native="deviceControlVisible = true">
设备操作
</Button>
<Button v-else-if="activeName != 'first'" style="background-color: #bbb">
设备离线
</Button>
</template>
<DeviceControlDialog v-model="deviceControlVisible" :dialogData="dialogData" />
</Dialog>
</template>
<script>
import Dialog from "@screen/components/Dialog/index.vue";
import Button from "@screen/components/Buttons/Button.vue";
import Descriptions from "@screen/components/Descriptions.vue";
import Video from "@screen/components/Video";
import LineChart from "../../LineChart/index.vue";
import DeviceParams from "./components/DeviceParams.vue";
import DeviceControlDialog from "./components/DeviceControlDialog.vue";
import request from "@/utils/request";
import {
getRoadInfoByStakeMark,
getProduct,
} from "@screen/pages/Home/components/RoadAndEvents/utils/httpList.js";
import { dialogDelayVisible } from "./../mixin";
// 广
export default {
name: "RemoteMachine",
mixins: [dialogDelayVisible],
components: {
Dialog,
Descriptions,
LineChart,
Video,
Button,
DeviceParams,
DeviceControlDialog,
},
data() {
return {
activeName: "first",
releaseVisible: false,
deviceControlVisible: false,
data: {
deviceName: "LH24",
roadName: "G35济泽高速",
stakeMark: "k094+079",
direction: "1",
organizationName: "山东高速济南发展公司",
brand: "XXX厂家",
deviceState: "0",
},
list: [
{
label: "设备名称",
key: "deviceName",
},
{
label: "设备桩号",
key: "stakeMark",
},
{
label: "道路名称",
key: "roadName",
},
{
label: "设备方向",
key: "direction",
enum: "CameraDirectionEnum",
},
{
label: "设备状态",
key: "deviceState",
// enum: "DeviceTypeEnum",
visible: false,
},
{
label: "设备状态",
key: "deviceStateLiteral",
// enum: "DeviceTypeEnum",
},
{
label: "设备厂商",
key: "manufacturer",
},
],
};
},
async created() {
if (this.dialogData) {
this.data = {
...this.dialogData,
}
}
let deviceInfo = await this.getDeviceInfo();
this.data = {
roadName: null,
deviceStateLiteral: deviceInfo?.data.formatValue.deviceState,
...this.data
};
getProduct(this.dialogData.productId).then((data) => {
this.dialogData.brand = data.brand;
});
const roadInfo = await getRoadInfoByStakeMark(this.dialogData.stakeMark);
if (roadInfo) this.data.roadName = roadInfo.roadName;
console.log('this.data', this.data)
},
methods: {
async getDeviceInfo() {
return request({
url: `/business/device/properties/latest/${this.dialogData.iotDeviceId || "10.0.36.143-1883"
}/3`,
method: "get",
params: {},
});
},
},
};
</script>
<style lang="scss">
div.switcher {
font-size: 12px;
padding: 2px;
}
</style>
<style lang="scss" scoped>
.RemoteMachine {
width: 510px;
// height: 240px;
color: #fff;
display: flex;
flex-direction: column;
.camera-video {
flex: 1.5;
}
.tabs {
flex: 1;
display: flex;
flex-direction: column;
::v-deep {
.el-tabs__content {
flex: 1;
.el-tab-pane {
height: 100%;
}
}
}
}
.bottom {
margin-top: 12px;
display: flex;
gap: 9px;
align-items: center;
justify-content: end;
>div {
font-size: 16px;
padding: 6px 12px;
}
}
}
</style>

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

@ -12,19 +12,12 @@
<DeviceParams disabled :dialogData="dialogData" />
</ElTabPane>
<ElTabPane label="在线率统计" name="third">
<LineChart
v-if="activeName === 'third'"
:productId="dialogData.id"
style="height: 180px"
/>
<LineChart v-if="activeName === 'third'" :productId="dialogData.id" style="height: 180px" />
</ElTabPane>
</ElTabs>
</div>
<template #footer>
<Button
v-if="activeName != 'first' && data.deviceState == '1'"
@click.native="deviceControlVisible = true"
>
<Button v-if="activeName != 'first' && data.deviceState == '1'" @click.native="deviceControlVisible = true">
设备操作
</Button>
<Button v-else-if="activeName != 'first'" style="background-color: #bbb">
@ -32,10 +25,7 @@
</Button>
</template>
<DeviceControlDialog
v-model="deviceControlVisible"
:dialogData="dialogData"
/>
<DeviceControlDialog v-model="deviceControlVisible" :dialogData="dialogData" />
</Dialog>
</template>
@ -131,6 +121,7 @@ export default {
this.data = {
roadName: null,
deviceStateLiteral: deviceInfo?.data.formatValue.deviceState,
...this.data
};
// console.log(
@ -151,9 +142,8 @@ export default {
methods: {
async getDeviceInfo() {
return request({
url: `/business/device/properties/latest/${
this.dialogData.iotDeviceId || "10.0.36.143-1883"
}/3`,
url: `/business/device/properties/latest/${this.dialogData.iotDeviceId || "10.0.36.143-1883"
}/3`,
method: "get",
params: {},
});
@ -203,7 +193,7 @@ div.switcher {
align-items: center;
justify-content: end;
> div {
>div {
font-size: 16px;
padding: 6px 12px;
}

15
ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/SolarEnergy/components/DeviceParams.vue

@ -63,12 +63,15 @@ export default {
}).then(result => {
if (result.code != 200) return Message.error("操作失败");
result.data.forEach(item => {
devs.push({
label: item.propertyName,
key: item.property,
gridColumn: 3,
});
this.devicesData[item.property] = item.formatValue;
if (item.propertyName) {
devs.push({
label: item.propertyName,
key: item.property,
gridColumn: 3,
});
this.devicesData[item.property] = item.formatValue;
}
});
this.devicesList = devs;
})

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

@ -156,11 +156,18 @@ div.switcher {
<style lang="scss" scoped>
.SolarEnergy {
width: 508px;
// height: 240px;
// height: 248px;
color: #fff;
display: flex;
flex-direction: column;
::v-deep {
.el-tabs__content {
overflow-y: auto;
max-height: 220px;
}
}
.camera-video {
flex: 1.5;
}

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

@ -47,9 +47,11 @@ import TrafficIncidents from "./../Dialogs/TrafficIncidents/index.vue";
import PerceiveEvent from "./../Dialogs/PerceiveEvent/index.vue";
import RoadNetworkFacilities from "./../Dialogs/RoadNetworkFacilities/index.vue";
import SmartDevice from "./../Dialogs/SmartDevice/index.vue";
import RemoteMachine from "./../Dialogs/RemoteMachine/index.vue";
import SolarEnergy from "./../Dialogs/SolarEnergy/index.vue";
import Intermodulation from "./../Dialogs/Intermodulation/index.vue";
import GuardrailCollision from "./../Dialogs/GuardrailCollision/index.vue";
import MeteorologicalDetection from "./../Dialogs/MeteorologicalDetection/index.vue";
import FatigueWakesUp from "./../Dialogs/FatigueWakesUp/index.vue";
import { addInGraphHandle, markerClusterIns } from "./utils/map"
@ -71,7 +73,9 @@ export default {
Intermodulation,
GuardrailCollision,
FatigueWakesUp,
RoadNetworkFacilities
RoadNetworkFacilities,
RemoteMachine,
MeteorologicalDetection
},
data() {
return {
@ -288,10 +292,10 @@ export default {
gridColumnStart: (index % columns) + 1,
}
},
async handleTrafficRelieve(e){
async handleTrafficRelieve(e) {
await this.handleDeviceImmediate(e._itemData)
setTimeout(async () => {
await this.handleDeviceImmediate(e._itemData)
await this.handleDeviceImmediate(e._itemData)
}, 500);
this.dialogConfig = {
// 0 ControlCamera | 1 Camera

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

@ -70,6 +70,7 @@ export const DeviceForMap = {
},
气象检测器: {
deviceType: "3",
dialog: "MeteorologicalDetection",
},
疲劳唤醒: {
deviceType: "10",
@ -79,6 +80,10 @@ export const DeviceForMap = {
deviceType: "15",
dialog: "SolarEnergy",
},
远端机: {
deviceType: "16",
dialog: "RemoteMachine",
},
};
export const lngLatMap = {}; //优化 缩略图 + 地图 复用lngLatmap
@ -107,7 +112,7 @@ function resolveDataOptions(data, config, component, isDefault) {
name: "",
config: {
markerClick: (extData, item) => {
const formData = extData?.otherConfig
const formData = (extData?.otherConfig && typeof extData?.otherConfig !== 'string')
? JSON.parse(extData.otherConfig)
: null;
// formData.pictures = ["https://pic1.zhimg.com/80/v2-c00beaae1f6e3c09a6d77c16c70002fe_1440w.webp?source=1def8aca","https://pic1.zhimg.com/80/v2-c56626621906417a453d262ac11f3385_1440w.webp?source=1def8aca"]
@ -117,7 +122,7 @@ function resolveDataOptions(data, config, component, isDefault) {
data: {
...extData,
formData,
parseOtherConfig: JSON.parse(extData.otherConfig || "{}"),
parseOtherConfig: JSON.parse((extData.otherConfig && typeof extData.otherConfig !== 'string')|| "{}"),
_itemData: item,
},
};

44
ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/RoadAndEvents/utils/httpList.js

@ -205,7 +205,7 @@ const DeviceTypeMap = {
14: "光线在线监测",
*/
export function getDeviceList(deviceType, options) {
console.log(deviceType, options,'------------')
console.log(deviceType, options, "------------");
return new Promise((resolve, reject) => {
if (!deviceType) {
// Message.error(`${DeviceTypeMap[deviceType]}设备加载失败!`);
@ -223,13 +223,13 @@ export function getDeviceList(deviceType, options) {
let data = {
deviceType: deviceType,
endStakeMark: newEndStakeMark,
startStakeMark: newStartStakeMark
}
if(options.childType && options.childType.split('-')[0] === deviceType){
data.childType = options.childType
startStakeMark: newStartStakeMark,
};
if (options.childType && options.childType.split("-")[0] === deviceType) {
data.childType = options.childType;
}
if(options.deviceState && options.deviceState !== ''){
data['deviceState'] = options.deviceState
if (options.deviceState && options.deviceState !== "") {
data["deviceState"] = options.deviceState;
}
request(
Object.keys(options || {}).length
@ -461,3 +461,33 @@ export function getRoadNetworkFacilitiesList(facilityType, options = {}) {
});
});
}
/**
* 气象检测器 获取气象信息
* @param {string} deviceName
*/
export function getMeteorologicalDetector(deviceName, options = {}) {
return new Promise((resolve, reject) => {
if (!deviceName) {
Message.error(`气象信息加载失败!`);
return reject();
}
request({
url: `/dc/system/meteorologicalDetector/device/${deviceName}`,
method: "get",
})
.then(({ code, rows }) => {
if (code != 200) {
reject();
return Message.error(`气象信息加载失败!`);
}
resolve(rows[0] || {});
})
.catch(() => {
Message.error(`气象信息加载失败!`);
reject();
});
});
}

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

@ -107,7 +107,7 @@ export default {
// temp.functions[1].params.CONTENT = temp.functions[1].params.CONTENT.replaceAll(/\\n/g, '\\\\n').replaceAll(/=/g, '\\=').replaceAll(/,/g, '\\,').replaceAll(/&nbsp/g, ' ');
let params = {};
if (temp.deviceType == '2'){
params = temp.functions[1].params
params = temp.functions[1].params.parameters[0]
} else if (temp.deviceType == '5'){
params = temp.functions[0].params
} else if (temp.deviceType == '10') {
@ -202,7 +202,7 @@ export default {
.text{ flex: 1; display: flex; align-items: center; justify-content: center; word-break: break-all;}
.center{ flex: 1; display: flex; flex-direction: column; justify-content: center; align-items: center;}
}
.button{ width:140px; margin-left: 10px; display: flex; align-items: center;}
.button{ width:120px; margin-left: 10px; display: flex; align-items: center; justify-content: flex-end;}
}
}
</style>

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

@ -6,7 +6,8 @@
<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">
<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>
@ -196,8 +197,8 @@ export default {
handler(bool) {
if (!bool) return;
this.propData?.id ? this.mode = 'edit' : this.mode = 'add';
this.transformData();
this.initBasicData();
this.transformData();
},
},
},
@ -220,6 +221,7 @@ export default {
this.editData.devices = _.map(this.propData.devices, "id");
// { "STAY": 90, "ACTION": "1", "SPEED": "0", "COLOR": "ffff00", "FONT": "3", "FONT_SIZE": "24", "CONTENT": "\\\\n", "width": "160", "height": "80", "formatStyle": "2" }
if (this.propData.deviceType == "2"){
console.log(this.propData.params , "++========");
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};

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

@ -11,7 +11,7 @@
<div
class="video-pic"
:style="{
height: formData.component === 'VideoMulti' ? '220px' : undefined,
height: formData.component === 'VideoMulti' ? '242px' : undefined,
}"
>
<component

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

@ -388,7 +388,7 @@ export default {
// xData.push(it.day.split("-")[2] + "");
xData.push(it.day + "日");
}
if (this.type == "date") {
if (this.type == "day") {
xData.push(it.time + "时");
}
if (this.type == "quarter") {
@ -515,7 +515,7 @@ export default {
});
//
getSectionMarkNumber({
type: qType,
type: this.type,
sectionId: this.selectId,
createTime: startTime,
direction: this.direction,

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

@ -51,11 +51,13 @@ export default {
display: flex;
flex-direction: column;
align-items: stretch;
padding:8px 16px 16px;
padding: 8px 16px 16px;
.row_01 {
flex-basis: 55%; margin-bottom: 15px;
display: flex; align-items: stretch;
flex-basis: 55%;
margin-bottom: 15px;
display: flex;
align-items: stretch;
pointer-events: none;
> div {
@ -77,14 +79,16 @@ export default {
width: 100%;
flex-basis: 50%;
margin-bottom: 15px;
&:last-child{ margin-bottom: 0;}
&:last-child {
margin-bottom: 0;
}
}
}
}
.row_02 {
flex: 1; height: 0;
flex: 1;
height: 0;
// pointer-events: none;
}
}

20
ruoyi-ui/src/views/JiHeExpressway/pages/perception/meteorologyCheck/components/roadNetwork/index.vue

@ -31,7 +31,10 @@
<script>
import WgtTitle from "../../../widgets/title";
import { getQueryTheNumberOfMeteorologicalWarning } from "@/api/perception/meteorologyCheck";
import {
getQueryTheNumberOfMeteorologicalWarning,
getTrafficConditions,
} from "@/api/perception/meteorologyCheck";
export default {
name: "MonthStatistics",
@ -54,7 +57,7 @@ export default {
{
text: "团雾路段里程",
type: "array",
value: ["0", "0"],
value: [],
class: ["处", "km"],
},
{
@ -66,7 +69,7 @@ export default {
{
text: "能见度检测器",
type: "arrayRed",
value: ["0", "5"],
value: [],
class: ["", ""],
},
],
@ -78,7 +81,16 @@ export default {
getWeatherNum() {
getQueryTheNumberOfMeteorologicalWarning().then((res) => {
this.dataList[3].value = res.data;
console.log("res", res);
});
getTrafficConditions().then((res) => {
this.trafficData = res.data;
this.dataList[0].value = res.data.normalMileage;
this.dataList[1].value = res.data.rainfallMileage;
this.dataList[2].value.push(
res.data.heavyFogNum,
res.data.heavyFogMileage
);
this.dataList[4].value.push(res.data.anomalies, res.data.deviceNum);
});
},
},

10
ruoyi-ui/src/views/JiHeExpressway/pages/perception/meteorologyCheck/components/weatherInfoQuery/components/weaterData/index.vue

@ -53,14 +53,16 @@
<span class="label">下雨类型</span>
<span class="text">{{
data.rainfall == 0
? "无降"
? "无降"
: data.rainfall == 1
? "雨"
: data.rainfall == 2
? "雪"
: data.rainfall == 3
? "毛毛雨"
: "雨夹雪"
: data.rainfall == 4
? "雨夹雪"
: "-"
}}</span>
</div>
<div class="item">
@ -84,7 +86,9 @@
? "积雪"
: data.rainfall == "05"
? "冰水混合物"
: "泥泞"
: data.rainfall == "06"
? "泥泞"
: "-"
}}</span>
</div>
<div class="item">

1
ruoyi-ui/src/views/JiHeExpressway/pages/perception/meteorologyCheck/components/weatherWarning/components/infoWarning/index.vue

@ -36,7 +36,6 @@
<div class="left-row">
<div class="label">预警等级</div>
<div :class="item.severityColor">
{{ item.severityColor }}
{{
item.severity == "Cancel"
? "取消"

20
ruoyi-ui/src/views/JiHeExpressway/pages/perception/trafficFlow/index.vue

@ -5,7 +5,7 @@
<section class="row_02">
<!-- 在途车流量车型分类 -->
<!-- 全路段拥堵状况 -->
<Congestion class="unit_01"></Congestion>
<Congestion class="unit_01" />
<!-- 畅通率 -->
<!-- <Unblocked class="content-m" /> -->
<!-- 全路车流量状况 -->
@ -48,9 +48,12 @@ export default {
height: 100%;
padding: 14px;
.row_01 { height: 160px;}
.row_01 {
height: 160px;
}
.row_02 { overflow: hidden;
.row_02 {
overflow: hidden;
// --keep-ratio: scaleX(1);
display: flex;
pointer-events: none;
@ -59,8 +62,13 @@ export default {
> div {
pointer-events: auto;
}
.unit_01{ flex-basis: 50%; margin-right: 14px;}
.unit_02{ flex-basis: 50%;}
.unit_01 {
flex-basis: 50%;
margin-right: 14px;
}
.unit_02 {
flex-basis: 50%;
}
}
.row_03 {
@ -84,7 +92,7 @@ export default {
}
.unit_03 {
flex:1;
flex: 1;
}
}
}

2
ruoyi-ui/src/views/JiHeExpressway/pages/perception/trafficSituation/components/IndicatorAnalysis/components/changesIndicators/assets/charts3.js

@ -29,7 +29,7 @@ let options = {
left: 0,
right: 0,
top: "15%",
bottom: "6%",
bottom: "8%",
containLabel: true,
},
xAxis: {

22
ruoyi-ui/src/views/JiHeExpressway/pages/perception/trafficSituation/components/IndicatorAnalysis/components/changesIndicators/index.vue

@ -158,12 +158,13 @@ export default {
.congestion {
display: inline-flex;
width: 100%;
height: 310px;
// height: 310px;
flex-direction: column;
--keep-ratio: scaleX(1);
.board {
height: 300px;
// height: 300px;
flex: 1;
width: 100%;
padding: 0px 20px;
border-radius: 5px 5px 5px 5px;
@ -175,15 +176,20 @@ export default {
background: linear-gradient(180deg, rgba(6, 66, 88, 0) 0%, #064258 93%);
#ChangesIndictors {
display: inline-flex;
height: 280px;
// display: inline-flex;
height: 180px;
// width: 100%;
width: 100%;
display: flex;
flex: 1;
// height: 0;
position: relative;
}
}
}
.charts {
height: 180px;
width: 100%;
}
// .charts {
// height: 180px;
// width: 100%;
// }
</style>

138
ruoyi-ui/src/views/JiHeExpressway/pages/perception/trafficSituation/components/IndicatorAnalysis/components/composeFeatures/index.vue

@ -1,76 +1,74 @@
<template>
<div class='congestion'>
<WgtTitle :title="'近一年交通组成特征指数最大值'"></WgtTitle>
<div class="board">
<div class="charts keep-ratio " id="composeFeatures"></div>
</div>
<div class="congestion">
<WgtTitle :title="'近一年交通组成特征指数最大值'"></WgtTitle>
<div class="board">
<div class="charts keep-ratio" id="composeFeatures"></div>
</div>
</template>
<script>
import WgtTitle from '../../../../../widgets/title'
import * as echarts from "echarts";
import chartsStatistics from "./assets/charts";
export default {
name: 'ComposeFeatures',
components: {
WgtTitle
},
data() {
return {
myChart:null,
}
},
created() {
},
methods: {
reiszeChart(){
this.$nextTick(() => {
if ( this.myChart ) {
this.myChart.resize();
}
});
}
},
update(){
},
mounted() {
setTimeout(() => {
this.$nextTick(() => {
this.myChart = echarts.init(document.getElementById('composeFeatures'));
this.myChart.setOption(chartsStatistics);
});
</div>
</template>
<script>
import WgtTitle from "../../../../../widgets/title";
import * as echarts from "echarts";
import chartsStatistics from "./assets/charts";
export default {
name: "ComposeFeatures",
components: {
WgtTitle,
},
data() {
return {
myChart: null,
};
},
created() {},
methods: {
reiszeChart() {
this.$nextTick(() => {
if (this.myChart) {
this.myChart.resize();
}
});
},
}
</script>
<style lang='scss' scoped>
.congestion {
},
update() {},
mounted() {
setTimeout(() => {
this.$nextTick(() => {
this.myChart = echarts.init(document.getElementById("composeFeatures"));
this.myChart.setOption(chartsStatistics);
});
});
},
};
</script>
<style lang="scss" scoped>
.congestion {
width: 100%;
.board {
// height: 150px;
flex: 1;
width: 100%;
.board{
height:150px;
width: 100%;
padding: 0px 20px;
background: linear-gradient(180deg, rgba(6,66,88,0.2) 0%, #064258 100%);
border-radius: 5px 5px 5px 5px;
opacity: 1;
border: 1px solid;
border-image: linear-gradient(360deg, rgba(55, 231, 255,0.3), rgba(55, 231, 255, 0)) 1 1;
display: flex;
justify-content: space-between;
align-items: center;
}
padding: 0px 20px;
background: linear-gradient(180deg, rgba(6, 66, 88, 0.2) 0%, #064258 100%);
border-radius: 5px 5px 5px 5px;
opacity: 1;
border: 1px solid;
border-image: linear-gradient(
360deg,
rgba(55, 231, 255, 0.3),
rgba(55, 231, 255, 0)
)
1 1;
display: flex;
justify-content: space-between;
align-items: center;
}
.charts {
height:120px;
width: 100%;
}
</style>
}
.charts {
height: 120px;
width: 100%;
}
</style>

41
ruoyi-ui/src/views/JiHeExpressway/pages/perception/trafficSituation/components/IndicatorAnalysis/components/congestionIndicator/index.vue

@ -165,7 +165,8 @@ export default {
flex-direction: column;
.board {
height: 275px;
// height: 275px;
flex: 1;
width: 100%;
padding: 0px 0px;
border-radius: 5px 5px 5px 5px;
@ -173,23 +174,29 @@ export default {
display: flex;
align-items: center;
flex-direction: column;
margin-top: 20px;
margin-top: 10px;
overflow: hidden;
background: linear-gradient(180deg, rgba(6, 66, 88, 0) 0%, #064258 93%);
.bodySort {
position: relative;
display: inline-block;
width: 100%;
height: 100%;
flex: 1;
// height: 120px;
// position: relative;
// display: inline-block;
// width: 100%;
// height: 100%;
overflow: auto;
padding: 5px 10px;
// padding: 5px 10px;
> div:first-child {
.barTitle {
background: linear-gradient(180deg, #ff6969 0%, #ffb904 100%);
}
.text {
font-size: 12px;
}
.lineHight .inner {
background: linear-gradient(180deg, #ff6969 0%, #ffb904 100%);
}
@ -197,11 +204,11 @@ export default {
> div {
display: inline-flex;
width: 95%;
width: 100%;
height: 41px;
background: #0d517460;
border-radius: 0px 0px 0px 0px;
margin: 5px;
// margin: 5px;
font-size: 14px;
font-family: PingFang SC, PingFang SC;
font-weight: 500;
@ -225,6 +232,10 @@ export default {
margin: 0 10px;
}
.text {
font-size: 12px;
}
.lineHight {
width: 60%;
height: 8px;
@ -249,7 +260,7 @@ export default {
.textStr {
display: inline-flex;
width: 100%;
height: 45px;
height: 35px;
flex-direction: row;
> div {
@ -278,8 +289,8 @@ export default {
}
}
.charts {
height: 180px;
width: 100%;
}
// .charts {
// height: 180px;
// width: 100%;
// }
</style>

138
ruoyi-ui/src/views/JiHeExpressway/pages/perception/trafficSituation/components/IndicatorAnalysis/components/crowding/index.vue

@ -1,76 +1,74 @@
<template>
<div class='congestion'>
<WgtTitle :title="'近一年拥挤度最大值'"></WgtTitle>
<div class="board">
<div class="charts keep-ratio " id="Crowding"></div>
</div>
<div class="congestion">
<WgtTitle :title="'近一年拥挤度最大值'"></WgtTitle>
<div class="board">
<div class="charts keep-ratio" id="Crowding"></div>
</div>
</template>
<script>
import WgtTitle from '../../../../../widgets/title'
import * as echarts from "echarts";
import chartsStatistics from "./assets/charts";
export default {
name: 'Crowding',
components: {
WgtTitle
},
data() {
return {
myChart:null,
}
},
created() {
},
methods: {
reiszeChart(){
this.$nextTick(() => {
if ( this.myChart ) {
this.myChart.resize();
}
});
}
},
update(){
},
mounted() {
setTimeout(() => {
this.$nextTick(() => {
this.myChart = echarts.init(document.getElementById('Crowding'));
this.myChart.setOption(chartsStatistics);
});
</div>
</template>
<script>
import WgtTitle from "../../../../../widgets/title";
import * as echarts from "echarts";
import chartsStatistics from "./assets/charts";
export default {
name: "Crowding",
components: {
WgtTitle,
},
data() {
return {
myChart: null,
};
},
created() {},
methods: {
reiszeChart() {
this.$nextTick(() => {
if (this.myChart) {
this.myChart.resize();
}
});
},
}
</script>
<style lang='scss' scoped>
.congestion {
},
update() {},
mounted() {
setTimeout(() => {
this.$nextTick(() => {
this.myChart = echarts.init(document.getElementById("Crowding"));
this.myChart.setOption(chartsStatistics);
});
});
},
};
</script>
<style lang="scss" scoped>
.congestion {
width: 100%;
.board {
// height: 150px;
flex: 1;
width: 100%;
.board{
height:150px;
width: 100%;
padding: 0px 20px;
background: linear-gradient(180deg, rgba(6,66,88,0.2) 0%, #064258 100%);
border-radius: 5px 5px 5px 5px;
opacity: 1;
border: 1px solid;
border-image: linear-gradient(360deg, rgba(55, 231, 255,0.3), rgba(55, 231, 255, 0)) 1 1;
display: flex;
justify-content: space-between;
align-items: center;
}
padding: 0px 20px;
background: linear-gradient(180deg, rgba(6, 66, 88, 0.2) 0%, #064258 100%);
border-radius: 5px 5px 5px 5px;
opacity: 1;
border: 1px solid;
border-image: linear-gradient(
360deg,
rgba(55, 231, 255, 0.3),
rgba(55, 231, 255, 0)
)
1 1;
display: flex;
justify-content: space-between;
align-items: center;
}
.charts {
height:120px;
width: 100%;
}
</style>
}
.charts {
height: 120px;
width: 100%;
}
</style>

719
ruoyi-ui/src/views/JiHeExpressway/pages/perception/trafficSituation/components/IndicatorAnalysis/components/roadIndicators/index.vue

@ -1,374 +1,411 @@
<template>
<div class='congestion'>
<WgtTitle :title="'道路指标情况'"></WgtTitle>
<div class="board">
<div id="roadChart1" class="keep-ratio" >
</div>
<div id="roadChart2" class="keep-ratio" >
</div>
<div id="roadChart3" class="keep-ratio" >
</div>
</div>
<div class="congestion">
<WgtTitle :title="'道路指标情况'"></WgtTitle>
<div class="board">
<div id="roadChart1" class="keep-ratio"></div>
<div id="roadChart2" class="keep-ratio"></div>
<div id="roadChart3" class="keep-ratio"></div>
</div>
</template>
<script>
import WgtTitle from '../../../../../widgets/title'
import chartsStatistics from './assets/chart1';
import chartsStatistics2 from './assets/chart2';
import chartsStatistics3 from './assets/chart3';
import * as echarts from "echarts";
export default {
name: 'RoadIndicators',
components: {
WgtTitle
},
data() {
return {
tableData: [{
date: '2023-12-31 13:00:00',
name: '2640.78m',
address: 'K100+000-K110+000'
},{
date: '2023-12-31 13:00:00',
name: '2640.78m',
address: 'K100+000-K110+000'
},{
date: '2023-12-31 13:00:00',
name: '2640.78m',
address: 'K100+000-K110+000'
},{
date: '2023-12-31 13:00:00',
name: '2640.78m',
address: 'K100+000-K110+000'
},{
date: '2023-12-31 13:00:00',
name: '2640.78m',
address: 'K100+000-K110+000'
},{
date: '2023-12-31 13:00:00',
name: '2640.78m',
address: 'K100+000-K110+000'
},{
date: '2023-12-31 13:00:00',
name: '2640.78m',
address: 'K100+000-K110+000'
},{
date: '2023-12-31 13:00:00',
name: '2640.78m',
address: 'K100+000-K110+000'
},{
date: '2023-12-31 13:00:00',
name: '2640.78m',
address: 'K100+000-K110+000'
},{
date: '2023-12-31 13:00:00',
name: '2640.78m',
address: 'K100+000-K110+000'
},{
date: '2023-12-31 13:00:00',
name: '2640.78m',
address: 'K100+000-K110+000'
},{
date: '2023-12-31 13:00:00',
name: '2640.78m',
address: 'K100+000-K110+000'
},{
date: '2023-12-31 13:00:00',
name: '2640.78m',
address: 'K100+000-K110+000'
</div>
</template>
<script>
import WgtTitle from "../../../../../widgets/title";
import chartsStatistics from "./assets/chart1";
import chartsStatistics2 from "./assets/chart2";
import chartsStatistics3 from "./assets/chart3";
import * as echarts from "echarts";
export default {
name: "RoadIndicators",
components: {
WgtTitle,
},
data() {
return {
tableData: [
{
date: "2023-12-31 13:00:00",
name: "2640.78m",
address: "K100+000-K110+000",
},
]
}
},
created() {
},
methods: {
selectItem(index){
this.selectIndex = index;
},
{
date: "2023-12-31 13:00:00",
name: "2640.78m",
address: "K100+000-K110+000",
},
{
date: "2023-12-31 13:00:00",
name: "2640.78m",
address: "K100+000-K110+000",
},
{
date: "2023-12-31 13:00:00",
name: "2640.78m",
address: "K100+000-K110+000",
},
{
date: "2023-12-31 13:00:00",
name: "2640.78m",
address: "K100+000-K110+000",
},
{
date: "2023-12-31 13:00:00",
name: "2640.78m",
address: "K100+000-K110+000",
},
{
date: "2023-12-31 13:00:00",
name: "2640.78m",
address: "K100+000-K110+000",
},
{
date: "2023-12-31 13:00:00",
name: "2640.78m",
address: "K100+000-K110+000",
},
{
date: "2023-12-31 13:00:00",
name: "2640.78m",
address: "K100+000-K110+000",
},
{
date: "2023-12-31 13:00:00",
name: "2640.78m",
address: "K100+000-K110+000",
},
{
date: "2023-12-31 13:00:00",
name: "2640.78m",
address: "K100+000-K110+000",
},
{
date: "2023-12-31 13:00:00",
name: "2640.78m",
address: "K100+000-K110+000",
},
{
date: "2023-12-31 13:00:00",
name: "2640.78m",
address: "K100+000-K110+000",
},
],
};
},
created() {},
methods: {
selectItem(index) {
this.selectIndex = index;
},
mounted() {
setTimeout(() => {
this.$nextTick(() => {
var myChart = echarts.init(document.getElementById('roadChart1'));
myChart.setOption(chartsStatistics);
var myChart2 = echarts.init(document.getElementById('roadChart2'));
myChart2.setOption(chartsStatistics2);
var myChart3 = echarts.init(document.getElementById('roadChart3'));
myChart3.setOption(chartsStatistics3);
});
},
mounted() {
setTimeout(() => {
this.$nextTick(() => {
var myChart = echarts.init(document.getElementById("roadChart1"));
myChart.setOption(chartsStatistics);
var myChart2 = echarts.init(document.getElementById("roadChart2"));
myChart2.setOption(chartsStatistics2);
var myChart3 = echarts.init(document.getElementById("roadChart3"));
myChart3.setOption(chartsStatistics3);
});
},
}
</script>
<style lang='scss' scoped>
.showClass {
color:#00EBC1;
}
::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:12px !important;
}
::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 tr:hover td {
background: #1b2528 !important;
color:#00D1FF;
}
::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;
}
.congestion {
display: inline-flex;
});
},
};
</script>
<style lang="scss" scoped>
.showClass {
color: #00ebc1;
}
::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: 12px !important;
}
::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 tr:hover td {
background: #1b2528 !important;
color: #00d1ff;
}
::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;
}
.congestion {
display: inline-flex;
width: 100%;
// height: 188px;
flex-direction: column;
.board {
// height: 150px;
flex: 1;
width: 100%;
height: 188px;
flex-direction: column;
padding: 0px 0px;
border-radius: 5px 5px 5px 5px;
opacity: 1;
display: flex;
justify-content: space-between;
align-items: center;
flex-direction: row;
margin-top: 20px;
background: linear-gradient(180deg, rgba(6, 66, 88, 0) 0%, #064258 93%);
> div {
display: inline-flex;
width: 33%;
height: 100%;
position: relative;
top: -10px;
}
.board{
height: 150px;
.warningList {
display: inline-flex;
flex-direction: column;
width: 100%;
padding: 0px 0px;
border-radius: 5px 5px 5px 5px;
opacity: 1;
display: flex;
justify-content: space-between;
align-items: center;
flex-direction: row;
margin-top:20px;
background: linear-gradient(180deg, rgba(6,66,88,0) 0%, #064258 93%);
height: calc(100% - 40px);
> div {
display: inline-flex;
width:33%;
height:100%;
position: relative;
top:-10px;
}
.warningList {
display: inline-flex;
flex-direction: column;
width:100%;
height:calc(100% - 40px);
>div {
width: 100%;
height: 138px;
background: #133242;
border-radius: 2px 2px 2px 2px;
opacity: 1;
border: 1px solid;
border-image: linear-gradient(
360deg,
rgba(55, 231, 255, 1),
rgba(55, 231, 255, 0)
)
1 1;
overflow: hidden;
margin-top: 20px;
padding: 23px 29px;
font-size: 14px;
font-family: PingFang SC, PingFang SC;
font-weight: 400;
color: #37e7ff;
> .left-w {
display: inline-flex;
width: 40%;
height: 100%;
flex-direction: column;
.left-row {
margin: 2px;
display: inline-flex;
width:100%;
height:138px;
background: #133242;
border-radius: 2px 2px 2px 2px;
opacity: 1;
border: 1px solid;
border-image: linear-gradient(360deg, rgba(55, 231, 255, 1), rgba(55, 231, 255, 0)) 1 1;
overflow: hidden;
margin-top:20px;
padding:23px 29px;
font-size: 14px;
font-family: PingFang SC, PingFang SC;
font-weight: 400;
color: #37E7FF;
>.left-w {
display: inline-flex;
width:40%;
height:100%;
flex-direction: column;
.left-row {
margin:2px;
display: inline-flex;
width:100%;
height:30px;
flex-direction: row;
>.value {
color:#fff;
}
.org {
font-size: 14px;
font-family: PangMenZhengDao;
font-weight: 400;
color: #F4A125
}
}
}
width: 100%;
height: 30px;
flex-direction: row;
>.right-w {
margin-left:30px;
display: inline-flex;
width:100%;
height:100%;
flex-direction: column;
.right-row {
margin-bottom: 10px;
}
.right-text {
color:#fff;
}
> .value {
color: #fff;
}
.org {
font-size: 14px;
font-family: PangMenZhengDao;
font-weight: 400;
color: #f4a125;
}
}
}
}
.weaterMain {
display: inline-flex;
flex-direction: row;
width:100%;
height: 40px;
.buttons {
width:100%;
height:38px;
>div {
display: inline-flex;
width:10%;
height:35px;
justify-content: center;
align-items: center;
font-size: 12px;
font-family: PangMenZhengDao;
font-weight: 800;
color: #FFFFFF;
z-index: 9;
}
> .right-w {
margin-left: 30px;
display: inline-flex;
width: 100%;
height: 100%;
flex-direction: column;
>div::after {
content: "";
position: absolute;
display: inline-flex;
width: 55px;
height: 36px;
background: linear-gradient(180deg, #6557D7 0%, rgba(101,87,216,0) 100%);
border-radius: 50%;
opacity: 1;
z-index:-1;
}
.right-row {
margin-bottom: 10px;
}
.redSel::after {
background: linear-gradient(180deg, #E73A14 0%, rgba(240,92,9,0) 100%);
}
.right-text {
color: #fff;
}
}
}
}
.yelSel::after {
background: linear-gradient(180deg, #FFFA79 0%, rgba(255,208,137,0) 100%);
}
.weaterMain {
display: inline-flex;
flex-direction: row;
width: 100%;
height: 40px;
.bluSel::after {
background: linear-gradient(180deg, #121ADE 0%, rgba(40,18,228,0) 100%);
}
.buttons {
width: 100%;
height: 38px;
> div {
display: inline-flex;
width: 10%;
height: 35px;
justify-content: center;
align-items: center;
font-size: 12px;
font-family: PangMenZhengDao;
font-weight: 800;
color: #ffffff;
z-index: 9;
}
.orgSel::after{
background: linear-gradient(180deg, #FFA623 0%, rgba(255,173,53,0) 100%);
}
> div::after {
content: "";
position: absolute;
display: inline-flex;
width: 55px;
height: 36px;
background: linear-gradient(
180deg,
#6557d7 0%,
rgba(101, 87, 216, 0) 100%
);
border-radius: 50%;
opacity: 1;
z-index: -1;
}
.weaterTitle::after {
content: "";
position: absolute;
top:0px;
left:0px;
width:100%;
height:2px;
background: linear-gradient(90deg, rgba(189,255,246,0) 0%, #BDFFF6 52%, rgba(189,255,246,0) 100%);
border-radius: 0px 0px 0px 0px;
opacity: 1;
.redSel::after {
background: linear-gradient(
180deg,
#e73a14 0%,
rgba(240, 92, 9, 0) 100%
);
}
.weaterTitle::before {
content: "";
position: absolute;
top:38px;
left:0px;
width:100%;
height:2px;
background: linear-gradient(90deg, rgba(189,255,246,0) 0%, #BDFFF6 52%, rgba(189,255,246,0) 100%);
border-radius: 0px 0px 0px 0px;
opacity: 1;
.yelSel::after {
background: linear-gradient(
180deg,
#fffa79 0%,
rgba(255, 208, 137, 0) 100%
);
}
.weaterTitle {
position: relative;
display: inline-flex;
width: 277px;
height: 38px;
background: linear-gradient(269deg, rgba(55,231,255,0) 6%, rgba(55,231,255,0.6) 50%, rgba(55,231,255,0) 92%);
border-radius: 0px 0px 0px 0px;
opacity: 1;
justify-content: center;
align-items: center;
>span.text {
display: inline-flex;
font-size: 16px;
font-family: PangMenZhengDao;
font-weight: 400;
color: #FFFFFF;
}
.bluSel::after {
background: linear-gradient(
180deg,
#121ade 0%,
rgba(40, 18, 228, 0) 100%
);
}
.num {
display: inline-flex;
justify-content: center;
align-items: center;
font-size: 22px;
font-family: PangMenZhengDao;
font-weight: 400;
color: #D9001B;
}
.orgSel::after {
background: linear-gradient(
180deg,
#ffa623 0%,
rgba(255, 173, 53, 0) 100%
);
}
}
}
}
.charts {
height:180px;
.weaterTitle::after {
content: "";
position: absolute;
top: 0px;
left: 0px;
width: 100%;
height: 2px;
background: linear-gradient(
90deg,
rgba(189, 255, 246, 0) 0%,
#bdfff6 52%,
rgba(189, 255, 246, 0) 100%
);
border-radius: 0px 0px 0px 0px;
opacity: 1;
}
.weaterTitle::before {
content: "";
position: absolute;
top: 38px;
left: 0px;
width: 100%;
height: 2px;
background: linear-gradient(
90deg,
rgba(189, 255, 246, 0) 0%,
#bdfff6 52%,
rgba(189, 255, 246, 0) 100%
);
border-radius: 0px 0px 0px 0px;
opacity: 1;
}
.weaterTitle {
position: relative;
display: inline-flex;
width: 277px;
height: 38px;
background: linear-gradient(
269deg,
rgba(55, 231, 255, 0) 6%,
rgba(55, 231, 255, 0.6) 50%,
rgba(55, 231, 255, 0) 92%
);
border-radius: 0px 0px 0px 0px;
opacity: 1;
justify-content: center;
align-items: center;
> span.text {
display: inline-flex;
font-size: 16px;
font-family: PangMenZhengDao;
font-weight: 400;
color: #ffffff;
}
.num {
display: inline-flex;
justify-content: center;
align-items: center;
font-size: 22px;
font-family: PangMenZhengDao;
font-weight: 400;
color: #d9001b;
}
}
</style>
}
}
}
.charts {
height: 180px;
width: 100%;
}
</style>

140
ruoyi-ui/src/views/JiHeExpressway/pages/perception/trafficSituation/components/IndicatorAnalysis/components/saturationMax/index.vue

@ -1,76 +1,76 @@
<template>
<div class='congestion'>
<WgtTitle :title="'近一年饱和度最大值'"></WgtTitle>
<div class="board">
<div class="charts keep-ratio " id="temperatureTrend"></div>
</div>
<div class="congestion">
<WgtTitle :title="'近一年饱和度最大值'"></WgtTitle>
<div class="board">
<div class="charts keep-ratio" id="temperatureTrend"></div>
</div>
</template>
<script>
import WgtTitle from '../../../../../widgets/title'
import * as echarts from "echarts";
import chartsStatistics from "./assets/charts";
export default {
name: 'SaturationMax',
components: {
WgtTitle
},
data() {
return {
myChart:null,
}
},
created() {
},
methods: {
reiszeChart(){
this.$nextTick(() => {
if ( this.myChart ) {
this.myChart.resize();
}
});
}
},
update(){
},
mounted() {
setTimeout(() => {
this.$nextTick(() => {
this.myChart = echarts.init(document.getElementById('temperatureTrend'));
this.myChart.setOption(chartsStatistics);
});
</div>
</template>
<script>
import WgtTitle from "../../../../../widgets/title";
import * as echarts from "echarts";
import chartsStatistics from "./assets/charts";
export default {
name: "SaturationMax",
components: {
WgtTitle,
},
data() {
return {
myChart: null,
};
},
created() {},
methods: {
reiszeChart() {
this.$nextTick(() => {
if (this.myChart) {
this.myChart.resize();
}
});
},
}
</script>
<style lang='scss' scoped>
.congestion {
},
update() {},
mounted() {
setTimeout(() => {
this.$nextTick(() => {
this.myChart = echarts.init(
document.getElementById("temperatureTrend")
);
this.myChart.setOption(chartsStatistics);
});
});
},
};
</script>
<style lang="scss" scoped>
.congestion {
width: 100%;
.board {
// height: 150px;
flex: 1;
width: 100%;
.board{
height:150px;
width: 100%;
padding: 0px 20px;
background: linear-gradient(180deg, rgba(6,66,88,0.2) 0%, #064258 100%);
border-radius: 5px 5px 5px 5px;
opacity: 1;
border: 1px solid;
border-image: linear-gradient(360deg, rgba(55, 231, 255,0.3), rgba(55, 231, 255, 0)) 1 1;
display: flex;
justify-content: space-between;
align-items: center;
}
padding: 0px 20px;
background: linear-gradient(180deg, rgba(6, 66, 88, 0.2) 0%, #064258 100%);
border-radius: 5px 5px 5px 5px;
opacity: 1;
border: 1px solid;
border-image: linear-gradient(
360deg,
rgba(55, 231, 255, 0.3),
rgba(55, 231, 255, 0)
)
1 1;
display: flex;
justify-content: space-between;
align-items: center;
}
.charts {
height:120px;
width: 100%;
}
</style>
}
.charts {
height: 120px;
width: 100%;
}
</style>

2
ruoyi-ui/src/views/JiHeExpressway/pages/perception/trafficSituation/components/IndicatorAnalysis/components/trafficIndicators/assets/charts.js

@ -81,7 +81,7 @@ var options = {
top: "25%", //上边距
right: "0", //右边距
left: "0", //左边距
bottom: "0%", //下边距
bottom: "5%", //下边距
containLabel: true,
},
xAxis: {

27
ruoyi-ui/src/views/JiHeExpressway/pages/perception/trafficSituation/components/IndicatorAnalysis/components/trafficIndicators/index.vue

@ -92,7 +92,7 @@
<div class="chartOrg">
<div class="itemChart">
<div class="title">上月指标</div>
<div id="chart2" class=""></div>
<div id="chart2" class="keep-ratio"></div>
</div>
<div class="itemChart">
<div class="title">本月指标</div>
@ -317,20 +317,20 @@ export default {
gr.addColorStop(1, "rgba(92,197,255,0)");
gr.addColorStop(0, "rgba(92,197,255,0.5)");
//
drawRoundRect(context, 98, 11, 90, 22, 12, gr);
drawRoundRect(context, 98, 41, 90, 22, 12, gr);
var gr = context.createLinearGradient(35, 0, 75, 0);
//
gr.addColorStop(1, "rgba(92,197,255,0)");
gr.addColorStop(0, "rgba(92,197,255,0.5)");
drawRoundRect(context, -1, 146, 80, 20, 12, gr);
drawRoundRect(context, -1, 176, 80, 20, 12, gr);
var gr = context.createLinearGradient(230, 0, 275, 0);
//
gr.addColorStop(1, "rgba(92,197,255,0)");
gr.addColorStop(0, "rgba(92,197,255,0.5)");
context.lineWidth = 1; // 线
drawRoundRect(context, 211, 146, 220, 20, 12, gr);
drawRoundRect(context, 211, 176, 220, 20, 12, gr);
const domMap3 = document.getElementById("chart3");
let parentDiv3 = domMap3.firstChild;
@ -348,20 +348,20 @@ export default {
gr.addColorStop(1, "rgba(92,197,255,0)");
gr.addColorStop(0, "rgba(92,197,255,0.5)");
//
drawRoundRect(context3, 98, 14, 90, 20, 12, gr);
drawRoundRect(context3, 98, 44, 90, 20, 12, gr);
var gr = context3.createLinearGradient(35, 0, 75, 0);
//
gr.addColorStop(1, "rgba(92,197,255,0)");
gr.addColorStop(0, "rgba(92,197,255,0.5)");
drawRoundRect(context3, -1, 148, 80, 20, 12, gr);
drawRoundRect(context3, -1, 178, 80, 20, 12, gr);
var gr = context3.createLinearGradient(240, 0, 290, 0);
//
gr.addColorStop(1, "rgba(92,197,255,0)");
gr.addColorStop(0, "rgba(92,197,255,0.5)");
context3.lineWidth = 1; // 线
drawRoundRect(context3, 211, 148, 200, 20, 12, gr);
drawRoundRect(context3, 211, 178, 200, 20, 12, gr);
});
});
},
@ -374,14 +374,15 @@ export default {
}
.congestion {
width: 100%;
margin: 5px 0;
// width: 100%;
// margin: 5px 0;
.body {
display: flex;
flex-direction: row;
align-items: center;
height: 395px;
// height: 395px;
flex: 1;
width: 100%;
font-size: 14px;
@ -417,6 +418,7 @@ export default {
font-family: PingFang SC, PingFang SC;
font-weight: 500;
color: #30bfec;
padding-top: 20px;
}
#chart2 {
@ -441,9 +443,10 @@ export default {
}
.board {
height: 320px;
// height: 320px;
flex: 1;
width: 100%;
padding: 10px 0px;
padding-top: 10px;
border-radius: 5px 5px 5px 5px;
opacity: 1;

119
ruoyi-ui/src/views/JiHeExpressway/pages/perception/trafficSituation/components/IndicatorAnalysis/index.vue

@ -4,9 +4,9 @@
<RoadIndicators class="content-l" />
<SaturationMax class="content-l" />
<Crowding class="content-l" />
<ComposeFeatures class="content-l" />
<ComposeFeatures class="content-l" style="margin-right: 0" />
</section>
<section class="content">
<section class="content-c">
<TrafficIndicators class="content-max" />
</section>
<section class="foot">
@ -79,36 +79,43 @@ export default {
height: 100%;
}
.content {
width: 100%;
display: inline-flex;
justify-content: space-between;
pointer-events: none;
margin-top: 19px;
margin-left: 19px;
> div {
pointer-events: auto;
}
.content-w {
width: 66.5%;
}
.content-max {
width: 100%;
}
.content-l {
width: 25%;
margin-left: 0px;
}
}
// .content {
// // width: 100%;
// // display: inline-flex;
// // justify-content: space-between;
// // pointer-events: none;
// // margin-top: 19px;
// // margin-left: 19px;
// width: 100%;
// margin: auto;
// display: flex;
// flex: 1;
// pointer-events: none;
// margin-top: 19px;
// flex-basis: 20%;
// > div {
// pointer-events: auto;
// }
// .content-w {s
// width: 66.5%;
// }
// .content-l {
// margin-right: 20px;
// flex-basis: 25%;
// display: flex;
// flex-direction: column;
// }
// }
.TrafficFlow {
width: 100%;
height: 100%;
position: relative;
display: flex;
flex-direction: column;
// position: relative;
z-index: 6;
color: white;
@ -119,36 +126,48 @@ export default {
flex: 1;
pointer-events: none;
margin-top: 19px;
flex-basis: 25%;
.content-l {
width: calc(50%);
min-width: 460px;
margin-right: 20px;
> div {
pointer-events: auto;
}
.content-m {
display: inline-flex;
flex-direction: column;
width: calc(100% / 4);
margin-right: 20px;
// .content-w {
// width: 66.5%;
// }
.content-m-t {
width: 100%;
height: 240px;
margin-bottom: 20px;
}
.content-l {
margin-right: 20px;
flex-basis: 25%;
display: flex;
flex-direction: column;
}
}
.content-c {
width: 100%;
margin: auto;
display: flex;
// flex: 1;
pointer-events: none;
margin-top: 19px;
flex-basis: 50%;
.content-r {
width: 30%;
.content-max {
flex: 1;
width: 100%;
display: flex;
justify-content: space-between;
align-items: center;
flex-direction: column;
}
}
.foot {
width: 100%;
margin: auto;
display: flex;
flex: 1;
height: 0;
// flex: 1;
flex-basis: 35%;
pointer-events: none;
margin-top: 19px;
@ -161,8 +180,8 @@ export default {
}
.foot-l {
width: 70%;
height: 330px;
flex-basis: 70%;
// height: 330px;
}
.foot-m {
@ -171,7 +190,9 @@ export default {
.foot-r {
margin-left: 20px;
width: 33%;
flex-basis: 30%;
flex: 1;
display: flex;
}
}
}

36
ruoyi-ui/src/views/JiHeExpressway/pages/perception/trafficSituation/index.vue

@ -1,6 +1,6 @@
<template>
<div class="TrafficFlowMax">
<el-tabs class="footTabs" v-model="activeName" @tab-click="changeTabs">
<el-tabs class="full_tab" v-model="activeName" @tab-click="changeTabs">
<el-tab-pane label="综合指标分析" name="first">
<IndicatorAnalysis />
</el-tab-pane>
@ -33,6 +33,22 @@ export default {
</script>
<style lang="scss" scoped>
.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%;
}
}
}
::v-deep .el-tabs__item {
display: inline-flex;
justify-content: center;
@ -58,10 +74,10 @@ export default {
margin: 0px !important;
}
.footTabs {
display: inline;
width: 99%;
}
// .footTabs {
// display: inline;
// width: 99%;
// }
.TrafficFlowMax {
width: 100%;
@ -87,11 +103,11 @@ export default {
pointer-events: auto;
}
.content-l {
width: calc(50%);
min-width: 460px;
margin-right: 20px;
}
// .content-l {
// width: calc(50%);
// min-width: 460px;
// margin-right: 20px;
// }
.content-m {
display: inline-flex;

189
ruoyi-ui/src/views/JiHeExpressway/pages/service/PublishingChannelManagement/components/AddNEditDialog.vue

@ -27,11 +27,10 @@
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 { getSelectOptionsStation } from "@screen/pages/control/event/businessDataManagement/utils.js";
import { Message } from "element-ui";
import * as PresetFormItems from "@screen/common/PresetFormItems.js";
import {
addChannels,
editChannels,
} from "@/api/service/PublishingChannelManagement.js";
export default {
name: "AddNEditDialog",
@ -48,57 +47,149 @@ export default {
visible: Boolean,
data: Object,
},
inject: ["setCurrentPage"],
data() {
return {
submitting: false,
formData: {},
formList: [
{
label: "信息级别:",
key: "level",
type: "RadioGroup",
isAlone: true,
label: "事件类型:",
key: "dataCategory",
type: "select",
required: true,
options: {
activeColor: "linear-gradient(180deg, #37E7FF 0%, #009BCC 100%)",
disabled: false,
options: [
{
key: "1",
label: "影响通行",
key: 1,
label: "交通事故",
},
{
key: "2",
label: "不影响通行",
key: 2,
label: "车辆故障",
},
{
key: 3,
label: "交通管制",
},
{
key: 4,
label: "交通拥堵",
},
{
key: 5,
label: "非法上路",
},
{
key: 6,
label: "路障清除",
},
{
key: 7,
label: "施工建设",
},
{
key: 8,
label: "服务区异常",
},
{
key: 9,
label: "设施设备隐患",
},
{
key: 10,
label: "异常天气",
},
{
key: 11,
label: "其他事件",
},
],
},
},
PresetFormItems.releaseChannel,
{
label: "审核方式:",
key: "process",
label: "发布渠道:",
key: "publishChannels",
type: "CheckboxGroup",
isAlon: true,
required: true,
default: [],
options: {
options: [
{ key: "1", label: "手机短信", width: "87px" },
{ key: "2", label: "微信公众号", width: "87px" },
{ key: "3", label: "微博", width: "87px" },
{ key: "4", label: "情报板", width: "87px" },
{ key: "5", label: "服务网站", width: "87px" },
{ key: "6", label: "微信小程序", width: "87px" },
],
},
},
{
label: "信息级别:",
key: "infoLevel",
type: "RadioGroup",
isAlone: true,
required: true,
default: 1,
options: {
activeColor: "linear-gradient(180deg, #37E7FF 0%, #009BCC 100%)",
options: [
{
key: "1",
label: "单人审核",
key: 1,
label: "影响通行",
},
{
key: "2",
label: "双人审核",
key: 2,
label: "不影响通行",
},
],
},
},
{
label: "启用日期:",
key: "startDate",
type: "DatePicker",
required: true,
},
// {
// label: ":",
// key: "auditMethod",
// type: "RadioGroup",
// default: 1,
// options: {
// activeColor: "linear-gradient(180deg, #37E7FF 0%, #009BCC 100%)",
// options: [
// {
// key: 1,
// label: "",
// },
// {
// key: 2,
// label: "",
// },
// ],
// },
// },
// {
// label: ":",
// key: "enabled",
// type: "RadioGroup",
// default: "1",
// options: {
// activeColor: "linear-gradient(180deg, #37E7FF 0%, #009BCC 100%)",
// options: [
// {
// key: "1",
// label: "",
// },
// {
// key: "2",
// label: "",
// },
// ],
// },
// },
// {
// label: ":",
// key: "enableDate",
// type: "DatePicker",
// required: true,
// },
],
};
},
@ -114,21 +205,49 @@ export default {
},
watch: {
modelVisible: {
immediate: true,
handler(bool) {
if (!bool) return;
handler() {
this.formData = {
...this.data,
};
if (this.data.id) {
this.formList[0].options.disabled = true;
}
this.getOptions();
},
immediate: true,
deep: true,
},
},
methods: {
getOptions() {},
handleSubmit() {},
handleSubmit() {
if (this.formData && this.formData.publishChannels) {
this.formData.publishChannels =
this.formData.publishChannels.toString();
}
this.$refs.FormConfigRef.validate().then((data) => {
this.submitting = true;
let params = {
...this.formData,
id: this.data.id,
};
if (this.data.id) {
editChannels(params).then((res) => {
this.modelVisible = false;
this.submitting = false;
this.$parent.handleSearch();
});
} else {
addChannels(this.formData).then((res) => {
this.modelVisible = false;
this.submitting = false;
this.$parent.handleSearch();
});
}
});
console.log("新增", this.formData);
},
},
};
</script>

182
ruoyi-ui/src/views/JiHeExpressway/pages/service/PublishingChannelManagement/components/Card.vue

@ -1,23 +1,33 @@
<template>
<div class='Card'>
<div class="Card">
<div class="header">
<BackgroundClip class="left" clipPath="inset(0 0 0 0 round 24px)"
<BackgroundClip
class="left"
clipPath="inset(0 0 0 0 round 24px)"
borderColor="linear-gradient(90deg, rgba(251, 19, 19, 1), rgba(214, 0, 0, 0))"
bgColor="linear-gradient(270deg, rgba(243, 0, 0, 0) 0%, #6B0000 100%)">
bgColor="linear-gradient(270deg, rgba(243, 0, 0, 0) 0%, #6B0000 100%)"
>
<img src="@screen/images/TrafficAccidents.svg" />
交通事故
{{ typeText }}
</BackgroundClip>
<div class="right">
<Switcher />
<Switcher
:value="enabled"
@change="(val) => handleChangeSwitcher(val)"
/>
<!-- <ElSwitch active-color="#fff" inactive-color="#48B0CB" /> -->
</div>
</div>
<Descriptions :list="list" style="gap: 15px; flex: 1; margin-top: 9px;" column="1" />
<Descriptions
:list="list"
style="gap: 15px; flex: 1; margin-top: 9px"
column="1"
/>
<div class="footer">
<Button @click.native="() => handleOpenDialogAddEdit(item)">修改</Button>
<Button style="background-color: #FF5F5F;" @click.native="handleDelete(item)">
<Button @click.native="() => handleOpenDialogEdit()">修改</Button>
<Button style="background-color: #ff5f5f" @click.native="handleDelete()">
删除
</Button>
</div>
@ -25,53 +35,163 @@
</template>
<script>
import Button from '@screen/components/Buttons/Button.vue';
import BackgroundClip from '@screen/components/Decorations/BackgroundClip.vue';
import Descriptions from '@screen/components/Descriptions.vue';
import Switcher from './Switcher.vue';
import Button from "@screen/components/Buttons/Button.vue";
import BackgroundClip from "@screen/components/Decorations/BackgroundClip.vue";
import Descriptions from "@screen/components/Descriptions.vue";
import Switcher from "./Switcher.vue";
import {
delChannels,
updateEnabledChannels,
} from "@/api/service/PublishingChannelManagement.js";
export default {
name: 'Card',
name: "Card",
components: {
Button,
BackgroundClip,
Descriptions,
Switcher
Switcher,
},
props: {
data: {
type: Object,
default: () => ({}),
},
},
methods: {
handleOpenDialogEdit() {
this.$parent.handleOpenDialogAddEdit(this.data);
},
handleDelete(item) {
this.$confirm("确定要删除该任务么?", "操作确认", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
})
.then(() => {
delChannels(this.data.id).then((res) => {
this.$message.success("删除成功");
this.$parent.handleSearch();
});
})
.catch(() => {
// Message.error("");
});
// this.$emit("handleDelete", item);
},
initData() {
console.log("初始化数据", this.data);
},
handleChangeSwitcher(val) {
let data = {
id: this.data.id,
enabled: val ? 2 : 0,
};
updateEnabledChannels(data).then(() => {
this.$parent.handleSearch();
});
console.log(88888, val);
},
},
mounted() {
this.initData();
},
watch: {
data: {
handler(val) {
let publishChannels = val.publishChannels.toString().split(",");
let newPublishChannels = [];
publishChannels.forEach((item) => {
newPublishChannels.push(
item == 1
? "手机短信"
: item == 2
? "微信公众号"
: item == 3
? "微博"
: item == 4
? "情报板"
: item == 5
? "服务网站"
: "微信小程序"
);
});
this.list[0].text = val.infoLevel == "1" ? "影响交通" : "不影响交通";
this.list[1].text = newPublishChannels.toString();
// this.list[2].text = val.auditMethod == "1" ? "" : "";
this.list[2].text = val.enableDate;
this.enabled = val.enabled == "2" ? true : false;
this.typeText =
val.dataCategory == "1"
? "交通事故"
: val.dataCategory == "2"
? "车辆故障"
: val.dataCategory == "3"
? "交通管制"
: val.dataCategory == "4"
? "交通拥堵"
: val.dataCategory == "5"
? "非法上路"
: val.dataCategory == "6"
? "路障清除"
: val.dataCategory == "7"
? "施工建设"
: val.dataCategory == "8"
? "服务区异常"
: val.dataCategory == "9"
? "设施设备隐患"
: val.dataCategory == "10"
? "异常天气"
: val.dataCategory == "11"
? "其他事件"
: "-";
},
immediate: true,
deep: true,
},
},
data() {
return {
typeText: "",
enabled: false,
list: [
{
label: '信息级别',
text: '影响通行',
label: "信息级别",
text: "",
},
{
label: '发布渠道',
text: '情报板、微博',
label: "发布渠道",
text: "",
},
// {
// label: "",
// text: "",
// },
{
label: '审核方式',
text: '双人审核',
label: "启用日期",
text: "",
},
{
label: '启用日期',
text: '2023.12.22 13:00:00',
}
]
}
}
}
],
};
},
};
</script>
<style lang='scss' scoped>
<style lang="scss" scoped>
.Card {
height: 226px;
background: #133242;
border-radius: 2px;
border: 1px solid;
padding: 15px 21px;
border-image: linear-gradient(360deg, rgba(55, 231, 255, .42), rgba(55, 231, 255, 0)) 1 1;
border-image: linear-gradient(
360deg,
rgba(55, 231, 255, 0.42),
rgba(55, 231, 255, 0)
)
1 1;
display: flex;
flex-direction: column;
justify-content: space-between;

82
ruoyi-ui/src/views/JiHeExpressway/pages/service/PublishingChannelManagement/data.js

@ -4,7 +4,7 @@ import { merge, cloneDeep } from "lodash";
export const searchFormList = [
{
label: "启用日期:",
key: "daterange",
key: "date",
required: false,
type: "datePicker",
options: {
@ -13,11 +13,79 @@ export const searchFormList = [
valueFormat: "yyyy-MM-dd HH:mm:ss",
},
},
PresetFormItems.eventType,
PresetFormItems.releaseChannel,
{
label: "事件类型:",
key: "dataCategory",
type: "select",
options: {
options: [
{
key: "1",
label: "交通事故",
},
{
key: "2",
label: "车辆故障",
},
{
key: "3",
label: "交通管制",
},
{
key: "4",
label: "交通拥堵",
},
{
key: "5",
label: "非法上路",
},
{
key: "6",
label: "路障清除",
},
{
key: "7",
label: "施工建设",
},
{
key: "8",
label: "服务区异常",
},
{
key: "9",
label: "设施设备隐患",
},
{
key: "10",
label: "异常天气",
},
{
key: "11",
label: "其他事件",
},
],
},
},
{
label: "发布渠道:",
key: "publishChannels",
type: "CheckboxGroup",
isAlone: true,
default: [],
options: {
options: [
{ key: "1", label: "微博", width: "87px" },
{ key: "3", label: "微信小程序", width: "87px" },
{ key: "4", label: "服务网站", width: "87px" },
{ key: "5", label: "情报板", width: "87px" },
{ key: "6", label: "手机短信", width: "87px" },
{ key: "7", label: "微信公众号", width: "87px" },
],
},
},
{
label: "信息级别:",
key: "level",
key: "infoLevel",
type: "RadioGroup",
isAlone: true,
options: {
@ -36,18 +104,18 @@ export const searchFormList = [
},
{
label: "启用状态:",
key: "status",
key: "enabled",
type: "RadioGroup",
isAlone: true,
options: {
activeColor: "linear-gradient(180deg, #37E7FF 0%, #009BCC 100%)",
options: [
{
key: "1",
key: "2",
label: "启用",
},
{
key: "2",
key: "0",
label: "停用",
},
],

66
ruoyi-ui/src/views/JiHeExpressway/pages/service/PublishingChannelManagement/index.vue

@ -9,7 +9,7 @@
</template>
新增
</ButtonGradient>
<ButtonGradient>
<ButtonGradient @click.native="onRefreshForm">
<template #prefix>
<img src="@screen/images/refresh.svg" />
</template>
@ -18,6 +18,7 @@
</div>
<InputSearch
ref="searchComp"
style="width: 480px"
:formList="searchFormList"
@handleSearch="handleSearch"
@ -26,12 +27,22 @@
<!-- 内容 -->
<div class="body">
<Card v-for="item in 8" :key="item" />
<Card v-for="item in channelsList" :key="item.id" :data="item" />
</div>
<!-- 分页 -->
<div class="footer">
<Pagination layout="total,prev, pager, next, jumper" :total="90" />
<Pagination
@current-change="handleCurrentChange"
@size-change="handleSizeChange"
width="'100%'"
:page-sizes="[10]"
:page-size="searchData.pageSize"
:current-page.sync="searchData.pageNum"
layout="total, sizes, prev, pager, next"
:total="total"
>
</Pagination>
</div>
<!-- 新增编辑弹窗 -->
@ -45,6 +56,10 @@ import InputSearch from "@screen/components/InputSearch/index.vue";
import Card from "./components/Card";
import ButtonGradient from "@screen/components/Buttons/ButtonGradient.vue";
import AddNEditDialog from "./components/AddNEditDialog.vue";
import {
getChannelsList,
getChannels,
} from "@/api/service/PublishingChannelManagement.js";
import { searchFormList } from "./data";
@ -63,18 +78,55 @@ export default {
data: [],
addNEditDialogVisible: false,
dialogData: null,
channelsList: [],
total: 0,
searchData: {
pageSize: 10,
pageNum: 1,
},
};
},
methods: {
handleOpenDialogAddEdit(data) {
console.log("data", data);
this.addNEditDialogVisible = true;
this.dialogData = data;
if (data) {
data.publishChannels = data.publishChannels.toString().split(",");
this.dialogData = data;
}
},
onRefreshForm() {
this.$refs.searchComp.handleResetForm();
},
handleSearch(data) {
// this.searchData = data;
// this.getData();
if (data && data.publishChannels) {
data.publishChannels = data.publishChannels.toString();
}
if (data && data.date) {
data.startDate = data.date[0];
data.endDate = data.date[1];
// data.date = "";
}
data = { ...this.searchData, ...data };
getChannelsList(
this.searchData.pageNum,
this.searchData.pageSize,
data
).then((res) => {
this.channelsList = res.rows;
this.total = res.rows.length;
});
},
handleCurrentChange(pageNum) {
searchData.pageNum = pageNum;
this.handleSearch();
},
handleSizeChange(size) {
searchData.pageSize = size;
this.handleSearch();
},
},
mounted() {
this.handleSearch();
},
};
</script>

42
ruoyi-ui/src/views/JiHeExpressway/pages/service/boardRecord/index.vue

@ -22,36 +22,36 @@
<!-- 内容 -->
<div class="body">
<Table :data="tableData" height="100%">
<el-table-column label="序号" type="index" :index="indexMethod" width="60" />
<ElTableColumn label="发布时间" prop="operTime" width="180" />
<ElTableColumn label="设备ID" prop="dcDeviceId" width="120" />
<el-table-column label="序号" type="index" :index="indexMethod" width="100" />
<ElTableColumn label="发布时间" prop="operTime" width="280">
<template slot-scope="scope">
{{ moment(scope.row.operTime).format("yyyy/MM/DD hh:mm") }}
</template>
</ElTableColumn>
<ElTableColumn label="设备ID" prop="dcDeviceId" width="120">
<template slot-scope="scope">
{{ JSON.parse(scope.row.dcDeviceId).join("、") }}
</template>
</ElTableColumn>
<ElTableColumn label="设备名称" prop="dcDeviceName" />
<!-- <ElTableColumn label="桩号" prop="stakeMark" width="100" /> -->
<!-- <el-table-column prop="direction" label="方向" width="110" :formatter="formatterDirection" /> -->
<ElTableColumn label="内容" prop="operParam" width="500" header-align="center">
<ElTableColumn label="内容" prop="operParam" width="400" header-align="center">
<template slot-scope="scope">
{{ scope.row.operParam }}
<!-- {{ scope.row.operParam && scope.row.operParam.functions && scope.row.operParam.functions[1] && scope.row.operParam.functions[1].params }} -->
<!-- <el-carousel direction="horizontal" :autoplay="false" indicator-position="inside" height="80px"
<el-carousel direction="horizontal" :autoplay="false" indicator-position="inside" height="80px"
arrow="never" class="board_shower">
<el-carousel-item v-for="item,index in JSON.parse(scope.row.operParam).paremeters" :key="index">
<el-carousel-item v-for="item,index in JSON.parse(scope.row.operParam)[0].functions[1].params.parameters"
:key="index">
<BoardRecordPreview :tpl="item" style="height: 100%;" />
</el-carousel-item>
</el-carousel> -->
</el-carousel>
</template>
</ElTableColumn>
<ElTableColumn label="状态" prop="status" width="80" :formatter="formatterStatus" />
<ElTableColumn label="用户名" prop="operName" width="120" />
<!-- <ElTableColumn label="用户ID" prop="operName" width="120" /> -->
<ElTableColumn label="用户IP" prop="operIp" width="200" />
<!--
<ElTableColumn label="操作" width="210">
<ElTableColumn label="状态" prop="status" width="140" :formatter="formatterStatus" />
<ElTableColumn label="用户名" prop="operName" width="160" />
<ElTableColumn label="用户IP" prop="operIp" width="200">
<template slot-scope="scope">
<ElButton type="text" style="color: #00D1FF;" @click="showDisposal(scope.row.eventType)">流程配置</ElButton>
<ElButton type="text" style="color: #00EBC1;" @click="showPhrases(scope.row)">常用语</ElButton>
{{ ["unknown"].includes(scope.row.operIp) ? "" : scope.row.operIp }}
</template>
</ElTableColumn>
-->
</Table>
</div>
@ -74,6 +74,7 @@ import BoardRecordPreview from '@screen/components/infoBoard/BoardRecordPreview.
import {DirectionTypes} from '@screen/utils/enum.js';
import InputSearch from "@screen/components/InputSearch/index.vue";
import { searchFormList } from "./data";
import moment from "moment";
export default {
name: 'boardRecord',
@ -86,6 +87,7 @@ export default {
},
data() {
return {
moment,
testData : {"STAY":"30","ACTION":"1","SPEED":"0","COLOR":"ffff00","FONT":"3","FONT_SIZE":"32","CONTENT":"因改扩建施工 平阴南、梁山收费站出入口封闭","width":"768","height":"64","formatStyle":"2"},
tableData: [],
searchFormList,

122
ruoyi-ui/src/views/JiHeExpressway/utils/enum.js

@ -126,7 +126,7 @@ export const RoadNFTopics = {
服务区: 6,
停车区: 7,
清障驻点: 8,
边坡: 9
边坡: 9,
};
// 事件类型 eventType
@ -168,21 +168,21 @@ export const InfoWarningSource = {
};
export const warningSourceMapping = {
1: '视频AI',
2: '雷达识别',
3: '锥桶',
4: '护栏碰撞',
5: '扫码报警',
6: '非机预警',
1: "视频AI",
2: "雷达识别",
3: "锥桶",
4: "护栏碰撞",
5: "扫码报警",
6: "非机预警",
// 7: '气象监测器'
}
};
export const warningStateMapping = {
1: '上报',
2: '已完成',
3: '已终止',
4: '自动结束'
}
1: "上报",
2: "已完成",
3: "已终止",
4: "自动结束",
};
// 感知事件主类 warningType
export const WarningType = {
@ -288,16 +288,16 @@ export const trafficType = Object.keys(EventTopics).reduce((prev, now) => {
//激光疲劳唤醒工作模式
export const awakerWorkModeDic = {
"0": "激光关闭",
"1": "常亮模式",
"2": "间隔100ms闪烁模式",
"3": "间隔200ms闪烁模式",
"4": "间隔500ms闪烁模式",
"5": "2次闪烁模式",
"6": "SOS模式",
"7": "自定义模式1",
"8": "自定义模式2",
"9": "自定义模式3",
0: "激光关闭",
1: "常亮模式",
2: "间隔100ms闪烁模式",
3: "间隔200ms闪烁模式",
4: "间隔500ms闪烁模式",
5: "2次闪烁模式",
6: "SOS模式",
7: "自定义模式1",
8: "自定义模式2",
9: "自定义模式3",
};
// 感知事件主类的子类(上方) warningSubclass
@ -1077,14 +1077,14 @@ export const EventSubclass = {
"9-6": "其他",
"10-1": "雨",
"10-2": "雪",
"10-3":"雾",
"10-4":"大风",
"10-5":"低温寒潮",
"10-6":"路面积雪",
"10-7":"路面结冰",
"10-8":"路面积水",
"10-9":"其他",
"11-1":"其他事件"
"10-3": "雾",
"10-4": "大风",
"10-5": "低温寒潮",
"10-6": "路面积雪",
"10-7": "路面结冰",
"10-8": "路面积水",
"10-9": "其他",
"11-1": "其他事件",
};
export const directionOptions = [
{ value: "1", label: "菏泽方向" },
@ -1181,4 +1181,62 @@ export const usageStatus = {
1: {
text: "未使用",
},
}
};
//路面类型
export const remoteRoadSurfaceStatus = {
"00": {
text: "干燥",
},
"01": {
text: "潮湿",
},
"02": {
text: "积水",
},
"03": {
text: "结冰",
},
"04": {
text: "积雪",
},
"05": {
text: "冰水混合物",
},
"06": {
text: "泥泞",
},
};
//下雨类型
export const precipitationType = {
0: {
text: "无降雨",
},
1: {
text: "雨",
},
2: {
text: "雪",
},
3: {
text: "毛毛雨",
},
4: {
text: "雨夹雪",
},
};
//能见度类型
export const visibilityType = {
4: {
text: "良好",
},
3: {
text: "阴霾",
},
2: {
text: "雾",
},
1: {
text: "浓雾",
},
};

4
ruoyi-ui/vue.config.js

@ -52,9 +52,9 @@ module.exports = {
// target: `http://10.0.81.204:8087`, //现场后台 刘文阁
// target: `http://10.168.69.255:8087`, //正晨后台 连现场物联 刘文阁
// target: `http://10.168.78.135:8087`, //王钦
// target: `http://10.168.66.196:8087`, //正晨后台 连现场物联 刘文阁2
target: `http://10.168.66.196:8087`, //正晨后台 连现场物联 刘文阁2
// target: `http://10.168.68.42:8087`, //王思祥
target: `http://10.168.72.174:8087`, //赵祥龙
// target: `http://10.168.72.174:8087`, //赵祥龙
// target: `http://10.168.65.156:8097`, //孟
// target: `http://10.168.56.165:8087`, //王家宝
// target: `http://10.168.77.128:8087`, //王兴琳

Loading…
Cancel
Save