Browse Source

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

wangqin
刘朋 8 months ago
parent
commit
44a080fa09
  1. 9
      ruoyi-ui/src/api/MonthlyEquipment/index.js
  2. BIN
      ruoyi-ui/src/assets/images/no_img.png
  3. 5
      ruoyi-ui/src/assets/styles/JiHeExpressway.scss
  4. 12
      ruoyi-ui/src/common/menuData.js
  5. 55
      ruoyi-ui/src/views/JiHeExpressway/common/PresetFormItems.js
  6. 2
      ruoyi-ui/src/views/JiHeExpressway/components/Dialog/index.vue
  7. 31
      ruoyi-ui/src/views/JiHeExpressway/components/FormConfig/components/ElCheckboxGroup.vue
  8. 14
      ruoyi-ui/src/views/JiHeExpressway/components/Video/videoStream.js
  9. 2
      ruoyi-ui/src/views/JiHeExpressway/components/infoBoard/BoardPreview.vue
  10. 111
      ruoyi-ui/src/views/JiHeExpressway/components/infoBoard/BoardRecordPreview.vue
  11. BIN
      ruoyi-ui/src/views/JiHeExpressway/images/home-Word/word.png
  12. 5
      ruoyi-ui/src/views/JiHeExpressway/images/layer/路测设备/太阳能板.svg
  13. 3
      ruoyi-ui/src/views/JiHeExpressway/images/layer/路测设备/太阳能板_active.svg
  14. 3
      ruoyi-ui/src/views/JiHeExpressway/images/layer/路测设备/太阳能板_fault.svg
  15. 2
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/PerceiveEvent/index.vue
  16. 55
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/SolarEnergy/components/DeviceControlDialog.vue
  17. 167
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/SolarEnergy/components/DeviceParams.vue
  18. 44
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/SolarEnergy/data.js
  19. 197
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/SolarEnergy/index.vue
  20. 117
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/HomeWord/index.vue
  21. 7
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/RoadAndEvents/index.vue
  22. 4
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/RoadAndEvents/utils/buttonEvent.js
  23. 17
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/RoadAndEvents/utils/map.js
  24. 99
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/index.vue
  25. 41
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/event/EventDetailDialog/Carousel/index.vue
  26. 105
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/event/EventDetailDialog/index.vue
  27. 5
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/event/index.vue
  28. 2
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/governanceAnalysis/components/postTrendsDay/assets/charts.js
  29. 21
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/governanceAnalysis/components/postTrendsMonth/assets/charts.js
  30. 47
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/governanceAnalysis/components/postTrendsMonth/assets/charts2.js
  31. 11
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/governanceAnalysis/components/postTrendsMonth/assets/charts3.js
  32. 8
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/governanceAnalysis/components/postTrendsMonth/index.vue
  33. 71
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/plan/addAndEditDialog/index.vue
  34. 13
      ruoyi-ui/src/views/JiHeExpressway/pages/control/manual/statistic/components/Eventfiltering/index.vue
  35. 4
      ruoyi-ui/src/views/JiHeExpressway/pages/control/manual/statistic/components/Eventfiltering/trafficIncidentsCharts.js
  36. 11
      ruoyi-ui/src/views/JiHeExpressway/pages/control/manual/statistic/components/Sitefiltering/index.vue
  37. 3
      ruoyi-ui/src/views/JiHeExpressway/pages/control/manual/statistic/components/Sitefiltering/trafficIncidentsCharts.js
  38. 5
      ruoyi-ui/src/views/JiHeExpressway/pages/control/manual/statistic/components/Timefiltering/index.vue
  39. 3
      ruoyi-ui/src/views/JiHeExpressway/pages/control/manual/statistic/components/Timefiltering/trafficIncidentsCharts.js
  40. 2
      ruoyi-ui/src/views/JiHeExpressway/pages/maintenanceOperations/chargeableOperations/components/daylyAnalysis/assets/charts.js
  41. 338
      ruoyi-ui/src/views/JiHeExpressway/pages/maintenanceOperations/statisticalAnalysis/components/deviceSummary/index.vue
  42. 78
      ruoyi-ui/src/views/JiHeExpressway/pages/maintenanceOperations/statisticalAnalysis/index.vue
  43. 4
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/trafficFlow/components/classification/index.vue
  44. 2
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/trafficFlow/components/flowstate/assets/charts.js
  45. 2
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/trafficFlow/components/flowstate/index.vue
  46. 2
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/trafficSituation/components/IndicatorAnalysis/components/trafficIndicators/index.vue
  47. 2
      ruoyi-ui/src/views/JiHeExpressway/pages/service/PublishingChannelManagement/index.vue
  48. 63
      ruoyi-ui/src/views/JiHeExpressway/pages/service/boardRecord/data.js
  49. 181
      ruoyi-ui/src/views/JiHeExpressway/pages/service/boardRecord/index.vue
  50. 127
      ruoyi-ui/src/views/JiHeExpressway/utils/enum.js
  51. 6
      ruoyi-ui/vue.config.js

9
ruoyi-ui/src/api/MonthlyEquipment/index.js

@ -53,3 +53,12 @@ export function getSystemStatusExport(query) {
}
);
}
// 拖拽排序
export function getStatusRule(rule) {
return request({
url: "/system/status/rule?rule=" + rule,
method: "get",
});
}

BIN
ruoyi-ui/src/assets/images/no_img.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

5
ruoyi-ui/src/assets/styles/JiHeExpressway.scss

@ -286,5 +286,10 @@
// background-color: #000 !important;
}
}
.el-image__placeholder{
background-color: #133242;
background-image: url("~@/assets/images/no_img.png");
background-size: contain;
}
}

12
ruoyi-ui/src/common/menuData.js

@ -177,12 +177,12 @@ export default [
path: "/service/board",
component: "service/board/index.vue",
},
// {
// title: "情报板记录",
// name: "boardRecord",
// path: "/service/boardRecord",
// component: "service/boardRecord/index.vue",
// },
{
title: "情报板记录",
name: "boardRecord",
path: "/service/boardRecord",
component: "service/boardRecord/index.vue",
},
{
title: "情报板敏感词",
name: "sensitive",

55
ruoyi-ui/src/views/JiHeExpressway/common/PresetFormItems.js

@ -49,12 +49,12 @@ export const releaseChannel = {
default: [],
options: {
options: [
{ key: "1", label: "微博" },
{ key: "3", label: "微信小程序" },
{ key: "4", label: "服务网站" },
{ key: "5", label: "情报板" },
{ key: "6", label: "手机短信" },
{ key: "7", label: "微信公众号" },
{ 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" },
],
},
};
@ -251,33 +251,22 @@ export const startEndStation = {
},
};
// export const direction = {
// label: "方向:",
// key: "direction",
// required: true,
// type: "select",
// options: {
// options: [
// // { key: "济南方向", label: "济南方向" },
// // { key: "菏泽方向", label: "菏泽方向" },
// ],
// },
// };
export const direction = {
label: "路段方向:",
key: "direction",
type: "CheckboxGroup",
isAlone: true,
default: [],
options: {
options: [
{ key: "1", label: "济南方向" },
{ key: "3", label: "菏泽方向" },
{ key: "2", label: "双向" },
],
},
};
export function directionCreater(type){
return {
label: "路段方向:",
key: "direction",
type, //CheckboxGroup 或 RadioGroup
isAlone: true,
default: [],
options: {
options: [
{ key: "1", label: "菏泽方向" },
{ key: "2", label: "双向" },
{ key: "3", label: "济南方向" },
],
},
};
}
export const problemDescription = {
label: "问题描述:",

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

@ -113,7 +113,7 @@ export default {
height: 100%;
background: rgba(0, 0, 0, 0.36);
border-radius: 0px 0px 0px 0px;
z-index: 1100;
z-index: 2100;
// display: flex;
// align-items: center;
// justify-content: center;

31
ruoyi-ui/src/views/JiHeExpressway/components/FormConfig/components/ElCheckboxGroup.vue

@ -1,14 +1,27 @@
<template>
<ElCheckboxGroup v-bind="$attrs" v-on="$listeners" class="ElCheckboxGroup" :style="{ gap }">
<ElCheckbox v-for="item in options" :disabled="item.disabled" :label="item[id] || item[label]"
:key="item[id] || item[label]">
<slot :name="item[id] || item[label]" :data="item">{{
item[label]
}} </slot>
<ElCheckboxGroup
v-bind="$attrs"
v-on="$listeners"
class="ElCheckboxGroup"
:style="{ gap }"
>
<ElCheckbox
v-for="item in options"
:disabled="item.disabled"
:label="item[id] || item[label]"
:key="item[id] || item[label]"
:style="{ width: [item.width ? item.width : 'auto'] }"
>
<slot :name="item[id] || item[label]" :data="item"
>{{ item[label] }}
</slot>
<div v-if="showIcon">
<img v-if="item.deviceState == '0' || item.deviceState == null" src="@/assets/jihe/images/offline.svg"
class="state">
<img v-else src="@/assets/jihe/images/online.svg" class="state">
<img
v-if="item.deviceState == '0' || item.deviceState == null"
src="@/assets/jihe/images/offline.svg"
class="state"
/>
<img v-else src="@/assets/jihe/images/online.svg" class="state" />
</div>
</ElCheckbox>
</ElCheckboxGroup>

14
ruoyi-ui/src/views/JiHeExpressway/components/Video/videoStream.js

@ -8,6 +8,11 @@ import {
getNearCameraNew,
} from "@screen/pages/Home/components/RoadAndEvents/utils/httpList.js";
const ErrorTypesCn = {
NetworkError: "网络错误",
MediaError: "媒体错误",
OtherError: "其他错误",
};
/**
* flv 视频测试
* https://bilibili.github.io/flv.js/demo/
@ -96,7 +101,10 @@ async function getUrl({ camId, url, pileNum, rangeIndex } = {}) {
url = data.liveUrl;
}
if (!url) return Promise.reject("获取 url 失败!");
if (!url) {
Message.warning("未获取到当前相机的播放地址");
return Promise.reject("获取 url 失败!");
}
return url;
}
@ -187,7 +195,9 @@ export class HttpLivePlayer {
console.log("errorType", errorType);
console.log("errorDetail", errorDetail);
console.log("errorInfo", errorInfo);
Message.warning(
`视频流加载失败, ${ErrorTypesCn[errorType] || "其他错误"}`
);
this.initLiveVideo();
});

2
ruoyi-ui/src/views/JiHeExpressway/components/infoBoard/BoardPreview.vue

@ -74,7 +74,7 @@ export default {
this.boardStyle = {
width: `${arr[0] * scale}px`,
height: `${arr[1] * scale}px`,
"background-color":`${this.tpl.backgroundColor}px`,
"background-color":`${this.tpl.backgroundColor}`,
"align-items" : ['flex-start', 'flex-end', 'center'][this.tpl.verticalAlignment] //formatStyle
}
let fontSize = 0;

111
ruoyi-ui/src/views/JiHeExpressway/components/infoBoard/BoardRecordPreview.vue

@ -0,0 +1,111 @@
<template>
<div class="boardPreview" ref="compBox">
<div class="boardBox" :style="boardStyle" v-if="isReady">
<p class="boardTxt" v-for="item,index in contentArr" :key="index" :style="boardTxtStyle" v-html="item" v-if="(index + 1) <= lineTotal">
</p>
</div>
</div>
</template>
<script>
export default {
name:"BoardPreview",
data(){
return {
isReady: false,
boardStyle:null,
boardTxtStyle:null,
contentArr:{
type:Array,
default:()=>[]
},
lineTotal: 0
}
},
props:{
tpl: {
type: Object,
default: ()=>{}
},
},
watch:{
tpl:{
handler(newV){
this.contentArr = this.tpl.CONTENT.replaceAll(/\\\\n/g, '\n').replaceAll(/\\=/g, '=').replaceAll(/\\,/g, ',').replaceAll(/ /g, '&nbsp').split('\n');
this.setStyle();
},
deep:true,
immediate:true
}
},
computed:{
},
mounted(){
},
methods:{
setStyle() {
this.$nextTick(() => {
let boxW = this.$refs["compBox"].clientWidth;
let boxH = this.$refs["compBox"].clientHeight;
let boardW = this.tpl.width;
let boardH = this.tpl.height;
let scale = 1;
if (boxH > 20) { //>020
if (boardW / boardH > boxW / boxH) {
scale = boxW / boardW;
} else {
scale = boxH / boardH;
}
} else {
if (boardW > boxW) {
scale = boxW / boardW;
}
}
this.boardStyle = {
width: `${boardW * scale}px`,
height: `${boardH * scale}px`,
"align-items" : ['flex-start', 'flex-end', 'center'][this.tpl.formatStyle] //formatStyle
}
let fontSize = 0;
if (_.isString(this.tpl.FONT_SIZE)) {
fontSize = this.tpl.FONT_SIZE.replace('px', '') * 1;
} else {
fontSize = this.tpl.fontSize;
}
this.boardTxtStyle = {
"color": "#" + this.tpl.COLOR, //fontColor
"font-size": `${fontSize*scale}px`,
"font-family": this.fontTypeDic[this.tpl.FONT || '3'], //fontType
"min-height": `${fontSize * scale}px`
}
this.lineTotal = Math.floor(boardH / fontSize);
this.isReady = true;
})
}
}
}
</script>
<style lang="scss" scoped>
.boardPreview{
display: flex;
flex-direction: row;
justify-content: center;
align-items: center;
.boardBox {
background-color: #000;
display: flex;
overflow: hidden;
flex-direction: column;
justify-content: center;
.boardTxt{
color: #f00;
line-height: 1;
margin-bottom: 0;
word-break: keep-all;
white-space: nowrap;
}
}
}
</style>

BIN
ruoyi-ui/src/views/JiHeExpressway/images/home-Word/word.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

5
ruoyi-ui/src/views/JiHeExpressway/images/layer/路测设备/太阳能板.svg

@ -0,0 +1,5 @@
<svg width="20" height="17" viewBox="0 0 20 17" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Group 1142815835">
<path id="Vector" d="M10.7401 12.0997V14.218H14.3689V16.1134H5.29693V14.218H8.92573V12.0997H10.7401ZM3.66073 9.01901L3.03433 11.7838H1.22803C0.939128 11.7838 0.666428 11.6488 0.490928 11.4166C0.315428 11.1844 0.261428 10.8847 0.339728 10.6066L0.796028 9.01901H3.66073ZM9.37933 9.01901V11.7838H3.96583L4.59223 9.01901H9.37933ZM15.6622 9.01901L16.2886 11.7838H10.2865V9.01901H15.6622ZM19.1695 9.01901L19.6258 10.6093C19.7041 10.8874 19.6501 11.1871 19.4746 11.4166C19.3018 11.6488 19.0291 11.7838 18.7375 11.7838H17.2174L16.591 9.01901H19.1695ZM4.28713 6.25421L3.86863 8.09831H1.06333L1.59253 6.25421H4.28713ZM9.37933 6.25421V8.09831H4.80013L5.21863 6.25421H9.37933ZM15.0358 6.25421L15.4543 8.09831H10.2865V6.25421H15.0358ZM18.3757 6.25421L18.9049 8.09831H16.3831L15.9673 6.25421H18.3757ZM4.91353 3.48941L4.49503 5.33351H1.85713L2.38633 3.48941H4.91353ZM9.37933 3.48941V5.33351H5.42653L5.84503 3.48941H9.37933ZM14.4094 3.48941L14.8279 5.33351H10.2865V3.48941H14.4094ZM17.5819 3.48941L18.1111 5.33351H15.7567L15.3382 3.48941H17.5819ZM5.53993 0.724609L5.12143 2.56871H2.65093L2.98843 1.39421C3.10183 1.00001 3.46363 0.727309 3.87403 0.727309H5.53993V0.724609ZM9.37933 0.724609V2.56871H6.05293L6.47143 0.724609H9.37933ZM13.783 0.724609L14.2015 2.56871H10.2865V0.724609H13.783ZM16.0942 0.724609C16.5046 0.724609 16.8664 0.997309 16.9798 1.39151L17.3173 2.56871H15.1303L14.7118 0.724609H16.0942Z" fill="#0FD4FF"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

3
ruoyi-ui/src/views/JiHeExpressway/images/layer/路测设备/太阳能板_active.svg

@ -0,0 +1,3 @@
<svg width="20" height="16" viewBox="0 0 20 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path id="Vector" d="M10.4354 11.3751V13.4934H14.0642V15.3888H4.99224V13.4934H8.62104V11.3751H10.4354ZM3.35604 8.2944L2.72964 11.0592H0.923341C0.634441 11.0592 0.361741 10.9242 0.186241 10.692C0.0107407 10.4598 -0.0432593 10.1601 0.0350407 9.882L0.491341 8.2944H3.35604ZM9.07464 8.2944V11.0592H3.66114L4.28754 8.2944H9.07464ZM15.3575 8.2944L15.9839 11.0592H9.98184V8.2944H15.3575ZM18.8648 8.2944L19.3211 9.8847C19.3994 10.1628 19.3454 10.4625 19.1699 10.692C18.9971 10.9242 18.7244 11.0592 18.4328 11.0592H16.9127L16.2863 8.2944H18.8648ZM3.98244 5.5296L3.56394 7.3737H0.758641L1.28784 5.5296H3.98244ZM9.07464 5.5296V7.3737H4.49544L4.91394 5.5296H9.07464ZM14.7311 5.5296L15.1496 7.3737H9.98184V5.5296H14.7311ZM18.071 5.5296L18.6002 7.3737H16.0784L15.6626 5.5296H18.071ZM4.60884 2.7648L4.19034 4.6089H1.55244L2.08164 2.7648H4.60884ZM9.07464 2.7648V4.6089H5.12184L5.54034 2.7648H9.07464ZM14.1047 2.7648L14.5232 4.6089H9.98184V2.7648H14.1047ZM17.2772 2.7648L17.8064 4.6089H15.452L15.0335 2.7648H17.2772ZM5.23524 0L4.81674 1.8441H2.34624L2.68374 0.6696C2.79714 0.2754 3.15894 0.00269997 3.56934 0.00269997H5.23524V0ZM9.07464 0V1.8441H5.74824L6.16674 0H9.07464ZM13.4783 0L13.8968 1.8441H9.98184V0H13.4783ZM15.7895 0C16.1999 0 16.5617 0.2727 16.6751 0.6669L17.0126 1.8441H14.8256L14.4071 0H15.7895Z" fill="#FFDB82"/>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

3
ruoyi-ui/src/views/JiHeExpressway/images/layer/路测设备/太阳能板_fault.svg

@ -0,0 +1,3 @@
<svg width="20" height="16" viewBox="0 0 20 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path id="Vector" d="M10.4354 11.3751V13.4934H14.0642V15.3888H4.99224V13.4934H8.62104V11.3751H10.4354ZM3.35604 8.2944L2.72964 11.0592H0.923341C0.634441 11.0592 0.361741 10.9242 0.186241 10.692C0.0107407 10.4598 -0.0432593 10.1601 0.0350407 9.882L0.491341 8.2944H3.35604ZM9.07464 8.2944V11.0592H3.66114L4.28754 8.2944H9.07464ZM15.3575 8.2944L15.9839 11.0592H9.98184V8.2944H15.3575ZM18.8648 8.2944L19.3211 9.8847C19.3994 10.1628 19.3454 10.4625 19.1699 10.692C18.9971 10.9242 18.7244 11.0592 18.4328 11.0592H16.9127L16.2863 8.2944H18.8648ZM3.98244 5.5296L3.56394 7.3737H0.758641L1.28784 5.5296H3.98244ZM9.07464 5.5296V7.3737H4.49544L4.91394 5.5296H9.07464ZM14.7311 5.5296L15.1496 7.3737H9.98184V5.5296H14.7311ZM18.071 5.5296L18.6002 7.3737H16.0784L15.6626 5.5296H18.071ZM4.60884 2.7648L4.19034 4.6089H1.55244L2.08164 2.7648H4.60884ZM9.07464 2.7648V4.6089H5.12184L5.54034 2.7648H9.07464ZM14.1047 2.7648L14.5232 4.6089H9.98184V2.7648H14.1047ZM17.2772 2.7648L17.8064 4.6089H15.452L15.0335 2.7648H17.2772ZM5.23524 0L4.81674 1.8441H2.34624L2.68374 0.6696C2.79714 0.2754 3.15894 0.00269997 3.56934 0.00269997H5.23524V0ZM9.07464 0V1.8441H5.74824L6.16674 0H9.07464ZM13.4783 0L13.8968 1.8441H9.98184V0H13.4783ZM15.7895 0C16.1999 0 16.5617 0.2727 16.6751 0.6669L17.0126 1.8441H14.8256L14.4071 0H15.7895Z" fill="#FF5F5F"/>
</svg>

After

Width:  |  Height:  |  Size: 1.4 KiB

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

@ -5,7 +5,7 @@
<div class="video-pic">
<Video style="height: 100%; flex: 1" :showHeader="false" :url="dialogData.formData.videoList[0]"
videoType="mp4" />
<Carousel style="flex: 1; height: 100%" :pictures="dialogData.formData.pictures" />
<Carousel style="flex: 1; height: 100%;max-width: 300px;" :pictures="dialogData.formData.pictures" />
</div>
<LineChart class="chart" />
<Form class="form" v-loading="loading" v-model="data" ref="FormConfigRef" :formList="formList" column="1" />

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

@ -0,0 +1,55 @@
<template>
<Dialog v-model="modelVisible" title="设备操作" width="550px">
<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>

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

@ -0,0 +1,167 @@
<template>
<div class='DeviceParams'>
<div class="no-data" v-if="!devicesList.length" v-loading="secondLoading">暂无设备参数</div>
<Descriptions :list="devicesList" :data="devicesData" style="gap: 18px;" column="6">
<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";
import { devicesFormList } from '../data.js';
export default {
name: 'DeviceParams',
components: {
Descriptions,
Switcher
},
props: {
dialogData: {
type: Object,
default: () => ({})
},
disabled: Boolean
},
data() {
return {
secondLoading: true,
devicesList: [],
devicesData: {},
activeOption: {
active: {
text: "开"
},
unActive: {
text: "关"
}
}
}
},
created() {
// this.devicesList = devicesFormList;
this.devicesList = [];
let devs = [];
// Promise.all([this.getAc('A1'), this.getAc('A2'), this.getAc('A3'), this.getAc('A4'), this.getAc('A5'), this.getAc('A6')]).then(res => {
Promise.all([this.getAc()]).then(res => {
console.log('res', res)
request({
url: `/business/device/properties/latest/${this.dialogData.iotDeviceId}`,
method: "get",
}).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;
});
this.devicesList = devs;
})
})
},
methods: {
getAc() {
return request({
url: `/business/device/batchFunctions`,
method: "post",
data: {
devices: [{
iotDeviceId: this.dialogData.iotDeviceId,
id: this.dialogData.id,
deviceType: 15
}],
functions: [
{
functionId: "A1",
params: {}
}, {
functionId: "A2",
params: {}
}, {
functionId: "A3",
params: {}
}, {
functionId: "A4",
params: {}
}, {
functionId: "A5",
params: {}
}, {
functionId: "A6",
params: {}
}
],
// parameter: {}
}
})
},
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(() => {
console.log(data.state, value, 333)
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>

44
ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/SolarEnergy/data.js

@ -0,0 +1,44 @@
export const devicesFormList = [
{
label: "设备内温度过高",
key: `theInternalTemperatureOfTheDeviceOverheats`,
// text: "-",
gridColumn: 2,
},
{
label: "阵列电压",
key: `arrayVoltage`,
// text: "-",
gridColumn: 2,
},
{
label: "阵列电流",
key: `arrayCurrent`,
// text: "-",
gridColumn: 2,
},
{
label: "发电功率L",
key: `generatingPowerL`,
text: "-",
gridColumn: 2,
},
{
label: "发电功率H",
key: `generatingPowerH`,
text: "-",
gridColumn: 2,
},
{
label: "负载电压",
key: `loadVoltage`,
text: "-",
gridColumn: 2,
},
{
label: "负载电流",
key: `loadCurrent`,
text: "-",
gridColumn: 2,
},
];

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

@ -0,0 +1,197 @@
<template>
<Dialog v-model="obverseVisible" title="太阳能板" width="550px">
<Video class="video-stream" :pileNum="dialogData.stakeMark" />
<div class="SolarEnergy">
<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";
import { resolve } from "@antv/x6/lib/registry/node-anchor/util";
//
export default {
name: "SolarEnergy",
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",
// },
{
label: "设备厂商",
key: "manufacturer",
},
],
};
},
async created() {
// if (!this.dialogData.iotDeviceId) this.dialogData.iotDeviceId = '10.0.36.146-1883';
// let deviceInfo = await this.getDeviceInfo();
this.data = {
...this.dialogData,
roadName: null,
// deviceStateLiteral: deviceInfo.data.formatValue.deviceState,
};
// console.log(
// "%c [ dialogData ]-103-index.vue",
// "font-size:15px; background:#36347c; color:#7a78c0;",
// this.dialogData,
// "+++========"
// );
//
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;
},
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>
.SolarEnergy {
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>

117
ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/HomeWord/index.vue

@ -0,0 +1,117 @@
<template>
<div class="HomeVector">
<el-tooltip effect="light" content="高速运营快报" placement="left">
<Button
:class="['btn', { 'btn-active': activeIcon }]"
@click.native="handleClick('Vector')"
>
<div>
<img
src="@screen/images/home-Word/word.png"
style="width: 26px; height: 26px"
/>
</div>
</Button>
</el-tooltip>
</div>
</template>
<script>
import Button from "@screen/components/Buttons/Button.vue";
import Form from "@screen/components/FormConfig";
import { delay, exportFile, confirm } from "@screen/utils/common";
import * as PresetFormItems from "@screen/pages/control/event/event/FormEvent/PresetFormItems.js";
import { merge, cloneDeep } from "lodash";
import { markerClusterIns } from "@screen/pages/Home/components/RoadAndEvents/utils/map.js";
export default {
name: "HomeVector",
components: {
Button,
Form,
},
data() {
return {
activeIcon: null,
};
},
created() {
this.activeIcon = window.showStakeText ? "Vector" : null;
},
methods: {
handleClick(type) {
// this.activeIcon = this.activeIcon === type ? null : type;
// if (this.activeIcon) window.showStakeText = true;
// else window.showStakeText = false;
exportFile({
url: "/business/word/trafficSituationReport",
filename: "通行情况",
ext: "docx",
});
},
filterEnd(data) {
this.activeIcon = null;
// this.filterData = data;
this.$parent.$refs.RoadAndEventsRef?.setFilterData?.(data);
},
},
};
</script>
<style lang="scss">
div.el-popper.global-input-search-popover {
background: rgba(6, 66, 88, 0.8);
border: 1px solid rgba(42, 217, 253, 0.6);
position: relative;
padding-top: 36px;
transform: translateY(24px);
// margin-top: 6vh;
.body {
.title {
background: linear-gradient(
90deg,
#237e9b 0%,
rgba(23, 145, 184, 0) 100%
);
padding: 3px 9px;
position: absolute;
top: 0;
left: 0;
width: 100%;
}
.close {
padding: 3px 9px;
cursor: pointer;
position: absolute;
top: 0;
right: 0;
width: fit-content;
}
}
}
</style>
<style lang="scss" scoped>
.image {
width: 50vw;
height: 65vh;
}
.HomeVector {
.btn {
padding: 9px;
background: linear-gradient(180deg, #152e3c 0%, #163a45 100%);
border-radius: 4px;
overflow: hidden;
height: unset;
border: 1px solid rgba(40, 144, 167, 1);
}
.btn-active {
background: linear-gradient(180deg, #005c79 0%, #009bcc 100%);
}
}
</style>

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

@ -46,11 +46,12 @@ import Broadcast from "./../Dialogs/Broadcast/index.vue";
import TrafficIncidents from "./../Dialogs/TrafficIncidents/index.vue";
import PerceiveEvent from "./../Dialogs/PerceiveEvent/index.vue";
import SmartDevice from "./../Dialogs/SmartDevice/index.vue";
import SolarEnergy from "./../Dialogs/SolarEnergy/index.vue";
import Intermodulation from "./../Dialogs/Intermodulation/index.vue";
import GuardrailCollision from "./../Dialogs/GuardrailCollision/index.vue";
import FatigueWakesUp from "./../Dialogs/FatigueWakesUp/index.vue";
import { addInGraphHandle } from "./utils/map"
import { addInGraphHandle, markerClusterIns } from "./utils/map"
import { lngLatMap } from "./utils/buttonEvent";
export default {
@ -65,6 +66,7 @@ export default {
TrafficIncidents,
PerceiveEvent,
SmartDevice,
SolarEnergy,
Intermodulation,
GuardrailCollision,
FatigueWakesUp
@ -180,6 +182,9 @@ export default {
},
beforeDestroy() {
this.emitter.off("selectedCompleted", this.selectedCompletedHandle);
Object.keys(lngLatMap).forEach(key => delete lngLatMap[key]);
markerClusterIns.clear();
window.renderData = undefined;
},
methods: {
selectedCompletedHandle(item) {

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

@ -74,6 +74,10 @@ export const DeviceForMap = {
deviceType: "10",
dialog: "FatigueWakesUp",
},
太阳能板: {
deviceType: "15",
dialog: "SolarEnergy",
},
};
export const lngLatMap = {}; //优化 缩略图 + 地图 复用lngLatmap

17
ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/RoadAndEvents/utils/map.js

@ -39,7 +39,7 @@ export class MarkerCluster {
markerCluster;
infoWindow;
data = [];
data = []; //标注集合
constructor() {}
@ -115,7 +115,7 @@ export class MarkerCluster {
window.totalPages = totalPages;
let num = (page - 1) * pageSize;
function renderData(page) {
if (page < 1 || page > totalPages) return;
if (!data || page < 1 || page > totalPages) return;
window.page = page;
const pageSize = window.pageSize;
const dataContainer = document.getElementById("dataContainer");
@ -238,19 +238,19 @@ export class MarkerCluster {
const reset = () => {
if (!window.openInfoWindow) {
// console.log(window.openInfoWindow, "rest");
// console.log("窗口movestart中", new Date());
this.infoWindow?.close?.();
}
};
map.on("zoomstart", reset);
map.on("mapmove", reset);
map.on("zoomend", reset);
map.on("movestart", reset);
map.on("moveend", async () => {
if (window.openInfoWindow) {
console.log("窗口位移结束");
// console.log("窗口位移结束", new Date());
window.openInfoWindow = false;
await new Promise((resolve) => setTimeout(resolve, 840));
window.infoWindow?.open?.();
// !window.infoWindow.getIsOpen() && window.infoWindow?.open?.();
}
});
@ -391,6 +391,9 @@ export class MarkerCluster {
setData() {
this.markerCluster.setData(this.data);
}
clear() {
this.data = [];
}
}
export function getContent(data) {

99
ruoyi-ui/src/views/JiHeExpressway/pages/Home/index.vue

@ -1,41 +1,54 @@
<template>
<div class="Home">
<AMapContainer ref="AMapContainerRef" @update:isGisCompleted="(data) => {
this.isGisCompleted = data;
}
" />
<section class="content">
<!-- 左侧 -->
<div class="content-l">
<!-- -->
<FocusedMonitoring class="card-menu" />
<!-- -->
<RoadAndEvents ref="RoadAndEventsRef" :isGisCompleted="isGisCompleted" class="content-l-b card-menu" />
</div>
<!-- 右侧 -->
<div class="content-r">
<div class="home-icons">
<HomeFilter class="item" />
<HomeFrame class="item" />
<HomeVector class="item" />
<!-- <HomeVectorControl class="item" /> -->
<!-- <HomeFrameControl class="item" /> -->
</div>
<ConditionStatistics class="right card-menu" />
</div>
</section>
<footer class="footer card-menu">
<div class="footer-title">
<span>济菏高速缩略图</span>
<i class="el-icon-s-fold" style="color: #2ad9fd; transform: rotate(-90deg)" @click.stop="handleShrink" />
</div>
<div class="footer-content">
<Thumbnail />
<AMapContainer
ref="AMapContainerRef"
@update:isGisCompleted="
(data) => {
this.isGisCompleted = data;
}
"
/>
<section class="content">
<!-- 左侧 -->
<div class="content-l">
<!-- -->
<FocusedMonitoring class="card-menu" />
<!-- -->
<RoadAndEvents
ref="RoadAndEventsRef"
:isGisCompleted="isGisCompleted"
class="content-l-b card-menu"
/>
</div>
<!-- 右侧 -->
<div class="content-r">
<div class="home-icons">
<HomeFilter class="item" />
<HomeFrame class="item" />
<HomeVector class="item" />
<HomeWord class="item" />
<!-- <HomeVectorControl class="item" /> -->
<!-- <HomeFrameControl class="item" /> -->
</div>
</footer>
<ConditionStatistics class="right card-menu" />
</div>
</section>
<footer class="footer card-menu">
<div class="footer-title">
<span>济菏高速缩略图</span>
<i
class="el-icon-s-fold"
style="color: #2ad9fd; transform: rotate(-90deg)"
@click.stop="handleShrink"
/>
</div>
<div class="footer-content">
<Thumbnail />
</div>
</footer>
</div>
</template>
@ -48,10 +61,11 @@ import AMapContainer from "./components/AMapContainer/index.vue";
import HomeFilter from "./components/HomeFilter/index.vue";
import HomeFrame from "./components/HomeFrame/index.vue";
import HomeVector from "./components/HomeVector/index.vue";
import HomeWord from "./components/HomeWord/index.vue";
import HomeFrameControl from "./components/HomeFrameControl/index.vue";
import HomeVectorControl from "./components/HomeVectorControl/index.vue";
import Button from '@screen/components/Buttons/Button.vue';
import Button from "@screen/components/Buttons/Button.vue";
import Vue from "vue";
// import InfoBoard from "./components/InfoBoard"
@ -69,6 +83,7 @@ export default {
HomeVector,
HomeFrameControl,
HomeVectorControl,
HomeWord,
// InfoBoard
},
data() {
@ -81,8 +96,8 @@ export default {
provide() {
return {
getMap: () => this.$refs.AMapContainerRef.getMapInstance(),
activeDeviceTypes: Vue.observable([])
}
activeDeviceTypes: Vue.observable([]),
};
},
methods: {
handleShrink(e) {
@ -132,7 +147,7 @@ export default {
height: min-content;
pointer-events: none;
>div {
> div {
pointer-events: auto;
}
@ -146,7 +161,7 @@ export default {
overflow: hidden;
height: 100%;
>div {
> div {
pointer-events: all;
flex: 1;
}
@ -170,8 +185,6 @@ export default {
.item {
padding-top: 15px;
}
}
.right {
@ -189,7 +202,7 @@ export default {
will-change: height;
bottom: 0;
>div {
> div {
pointer-events: all;
}

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

@ -2,16 +2,21 @@
<div class="Carousel">
<img src="./images/arrow.svg" @click="prevSlide" class="arrow" />
<VueSlickCarousel style="width: 100%" v-if="pictures.length > 0" v-bind="settings" ref="CarouselRef"
class="vueSlickCarousel">
<VueSlickCarousel v-if="pictures.length > 0" v-bind="settings" ref="CarouselRef" class="vueSlickCarousel">
<div v-for="(item, index) in pictures" :key="index" class="item">
<!-- <img :src="require(`@screen/images/${item}`)" style="height: 100%"> -->
<!-- <img :src="item" style="height: 100%"> -->
<el-image style="height: 100%;width:100%" :src="item" :preview-src-list="pictures">
<el-image style="height: 100%" :src="item" :preview-src-list="pictures">
</el-image>
</div>
</VueSlickCarousel>
<VueSlickCarousel v-if="videos.length > 0" v-bind="settings" ref="CarouselRef" class="vueSlickCarousel">
<div v-for="(item, index) in videos " :key="index" class="item">
<Video style="height: 100%;" :showHeader="false" :url="item || ''" videoType="mp4" />
</div>
</VueSlickCarousel>
<img src="./images/arrow.svg" @click="nextSlide" class="arrow" />
</div>
</template>
@ -22,10 +27,11 @@ import VueSlickCarousel from 'vue-slick-carousel'
import 'vue-slick-carousel/dist/vue-slick-carousel.css'
// optional style for arrows & dots
import 'vue-slick-carousel/dist/vue-slick-carousel-theme.css'
import Video from "@screen/components/Video";
export default {
name: "Carousel",
components: { VueSlickCarousel },
components: { VueSlickCarousel,Video },
props: {
pictures: {
type: Array,
@ -40,6 +46,10 @@ export default {
// "require('@screen/images/shareWith/weChat-active.svg')"
]
},
videos: {
type: Array,
default: () => []
},
},
data() {
return {
@ -48,7 +58,7 @@ export default {
infinite: true,
arrows: false,
speed: 600,
slidesToShow: 3,
slidesToShow: 1,
slidesToScroll: 1,
autoplay: true,
autoplaySpeed: 1800,
@ -77,37 +87,20 @@ export default {
.vueSlickCarousel {
flex: 1;
overflow: hidden;
width: 100%;
::v-deep {
.slick-list {
height: 100%;
width: 100%;
.slick-track {
width: 100% !important;
height: 100% !important;
.slick-slide {
width: 100% !important;
div {
width: 100%;
height: 100%;
}
}
div {
height: 100%;
}
}
}
.item {
img {
height: 100%;
width: 100%;
}
}
}

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

@ -1,89 +1,44 @@
<template>
<Dialog v-model="modelVisible" title="事件详情" width="890px" top="15%">
<div
class="EventDetail"
:style="{
height: activeName == '-1' || activeName == '0' ? '380px' : '768px',
}"
>
<Dialog v-model="modelVisible" title="事件详情" width="890px" top="11%">
<div class="EventDetail" :style="{
height: activeName == '-1' || activeName == '0' ? '380px' : '598px',
}">
<Form :formList="formList" :dFormData="formData" label-width="100px" />
<div class="video-pic">
<Video
style="height: 100%; width: 380px"
:showHeader="false"
:url="
formData.videoList && formData.videoList.length > 0
? formData.videoList[0]
: ''
"
:camId="formData.upCamId"
:pileNum="formData.stakeMark"
rangeIndex="upCamera"
:videoType="formData.videoType"
/>
<Video
v-if="activeName != '-1'"
style="height: 100%; width: 380px"
:showHeader="false"
:url="
formData.videoList && formData.videoList.length > 0
? formData.videoList[1]
: ''
"
:camId="formData.downCamId"
:pileNum="formData.stakeMark"
rangeIndex="downCamera"
:videoType="formData.videoType"
/>
<Carousel v-else style="flex: 1" :pictures="formData.pictures" />
<Video v-if="activeName != '-1'" style="height: 100%; width: 380px" :showHeader="false" :url="formData.videoList && formData.videoList.length > 0
? formData.videoList[0] : ''" :camId="formData.upCamId" :pileNum="formData.stakeMark" rangeIndex="upCamera"
:videoType="formData.videoType" />
<Video v-if="activeName != '-1'" style="height: 100%; width: 380px" :showHeader="false" :url="formData.videoList && formData.videoList.length > 0
? formData.videoList[1] : ''" :camId="formData.downCamId" :pileNum="formData.stakeMark" rangeIndex="downCamera"
:videoType="formData.videoType" />
<Carousel v-if="activeName == '-1'" style="flex: 1" :videos="formData.videoList" :pictures="[]"/>
<Carousel v-if="activeName == '-1'" style="flex: 1" :pictures="formData.pictures" :videos="[]"/>
</div>
<!-- <div>{{ formData.videoList[0] }}</div> -->
<TimeLine1
v-if="activeName == '1' || activeName == '2'"
:data="timeLine1List"
/>
<TimeLine2
v-if="activeName == '1' || activeName == '2'"
:data="timeLine2List"
style="flex: 1"
/>
<TimeLine1 v-if="activeName == '1' || activeName == '2'" :data="timeLine1List" />
<TimeLine2 v-if="activeName == '1' || activeName == '2'" :data="timeLine2List" style="flex: 1" />
</div>
<!-- 确认弹窗 -->
<EventPlanDialog
:visible="isShowDialog"
:info="info"
:eventFormData="formData"
:activeName="activeName"
@reInitData="
() => {
this.$emit('update:value', false);
this.$emit('queryData', true);
}
"
@close="onCloseAddNew"
/>
<EventPlanDialog :visible="isShowDialog" :info="info" :eventFormData="formData" :activeName="activeName"
@reInitData="() => {
this.$emit('update:value', false);
this.$emit('queryData', true);
}
" @close="onCloseAddNew" />
<template #footer>
<Button
v-if="activeName == '-1' || activeName == '0'"
style="padding: 0 24px"
@click.native="onDelete"
>误报</Button
>
<Button
:style="{ backgroundColor: '#C9C9C9', padding: '0 24px' }"
@click.native="modelVisible = false"
>取消</Button
>
<Button
v-if="activeName == '-1' || activeName == '0'"
style="padding: 0 24px"
@click.native="onSubmit"
>确认</Button
>
<Button v-if="activeName == '-1' || activeName == '0'" style="padding: 0 24px"
@click.native="onDelete">误报</Button>
<Button :style="{ backgroundColor: '#C9C9C9', padding: '0 24px' }"
@click.native="modelVisible = false">取消</Button>
<Button v-if="activeName == '-1' || activeName == '0'" style="padding: 0 24px"
@click.native="onSubmit">确认</Button>
</template>
</Dialog>
</template>
@ -124,7 +79,7 @@ export default {
activeName: String,
formData: {
type: Object,
default: () => {},
default: () => { },
},
},
data() {

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

@ -294,8 +294,9 @@ export default {
data.visibility = otherConfig.visibility;
data.pictures = otherConfig.pictures || [];
data.videoList = otherConfig.videoList || []
// data.videoList = otherConfig.videoList || ['https://sf1-cdn-tos.huoshanstatic.com/obj/media-fe/xgplayer_doc_video/mp4/xgplayer-demo-480p.mp4']
data.videoList = otherConfig.videoList || [];
// data.videoList = ['https://sf1-cdn-tos.huoshanstatic.com/obj/media-fe/xgplayer_doc_video/mp4/xgplayer-demo-480p.mp4',
// 'https://sf1-cdn-tos.huoshanstatic.com/obj/media-fe/xgplayer_doc_video/mp4/xgplayer-demo-480p.mp4']
}
data.videoType = "mp4";
this.detailDialogFormData = data;

2
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/governanceAnalysis/components/postTrendsDay/assets/charts.js

@ -22,7 +22,7 @@ var options = {
grid: {
top: "15%", //上边距
right: "0", //右边距
left: "15px", //左边距
left: "30px", //左边距
bottom: "10%", //下边距
containLabel: true,
},

21
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/governanceAnalysis/components/postTrendsMonth/assets/charts.js

@ -18,20 +18,24 @@ let data3 = [200, 530, 920, 400, 600, 700, 300, 800];
let options = {
tooltip: {
show: true,
trigger: "axis",
// trigger: "axis",
axisPointer: {
// 坐标轴指示器,坐标轴触发有效
type: "shadow", // 默认为直线,可选为:'line' | 'shadow'
},
valueFormatter: function (value) {
return value + " 起";
formatter: function (params) {
if (params.seriesName == "路段里程数") {
return `<div>${params.marker} ${params.name} <span style="font-weight: bold;">${params.value} 公里</span></div>`;
} else {
return `<div>${params.marker} ${params.name} <span style="font-weight: bold;">${params.value} 起</span></div>`;
}
},
},
grid: {
left: "0",
right: "0",
right: "30px",
top: "90px",
bottom: "20px",
bottom: "-10px",
containLabel: true,
},
xAxis: {
@ -52,11 +56,14 @@ let options = {
interval: 1,
align: "center",
rotate: "1",
margin: "20",
margin: 30,
textStyle: {
fontSize: 10,
color: "#E5E7E8",
},
formatter: (value) => {
return value.split("-").join("\n\n");
},
},
},
yAxis: [
@ -262,7 +269,6 @@ let options = {
opacity: 1,
color: function (params) {
var a = params.name;
// console.log("==========a=============", a);
return new echarts.graphic.LinearGradient(
0,
0,
@ -322,7 +328,6 @@ let options = {
opacity: 1,
color: function (params) {
var a = params.name;
// console.log("==========a=============", a);
return new echarts.graphic.LinearGradient(
0,
0,

47
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/governanceAnalysis/components/postTrendsMonth/assets/charts2.js

@ -4,15 +4,30 @@ let lc2 = [400, 550, 200, 140, 400, 550];
let options = {
tooltip: {
show: true,
trigger: "axis",
valueFormatter: function (value) {
return value + " 起";
trigger: "item",
formatter: function (params) {
console.log(77, params.seriesName);
// params.forEach((item) => {
// console.log(item);
// if (item.seriesName == "平均处置时长") {
// console.log(77, item.seriesName);
// return `<div>${item.marker} ${item.name} <span style="font-weight: bold;">${item.value} 分钟</span></div>`;
// }
// });
if (params.seriesName == "平均处置时长") {
console.log(77, params.seriesName);
return `<div>${params.marker} ${params.name} <span style="font-weight: bold;">${params.value} 分钟</span></div>`;
} else if (params.seriesName == "去年同期平均处置时长") {
return `<div>${params.marker} ${params.name} <span style="font-weight: bold;">${params.value} 分钟</span></div>`;
} else {
return `<div>${params.marker} ${params.name} <span style="font-weight: bold;">${params.value} 起</span></div>`;
}
},
},
grid: {
right: "4%",
top: "90px",
left: "2%",
left: "30px",
bottom: "0%",
containLabel: true,
},
@ -86,12 +101,12 @@ let options = {
// formatter: "{value} °C",
},
},
// axisLine: {
// show: false,
// },
// axisTick: {
// show: false,
// },
axisLine: {
show: false,
},
axisTick: {
show: false,
},
splitLine: {
show: false,
lineStyle: {
@ -227,14 +242,14 @@ let options = {
yAxisIndex: 1,
data: lc2,
type: "line",
symbol: "none",
symbolSize: 20,
// symbol: "none",
symbolSize: 5,
smooth: true,
color: "#E2BA74",
lineStyle: {
color: "#E2BA74",
width: 1,
type: "dashed",
// type: "dashed",
// dashOffset:50
},
},
@ -243,14 +258,14 @@ let options = {
yAxisIndex: 1,
data: lc,
type: "line",
symbol: "none",
symbolSize: 20,
// symbol: "none",
symbolSize: 5,
smooth: true,
color: "#FB6D07",
lineStyle: {
color: "#FB6D07",
width: 1,
type: "dashed",
// type: "dashed",
// dashOffset:50
},
},

11
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/governanceAnalysis/components/postTrendsMonth/assets/charts3.js

@ -23,8 +23,14 @@ var options = {
},
tooltip: {
show: true,
valueFormatter: function (value) {
return value + " 起";
trigger: "item",
formatter: function (params) {
if (params.seriesName == "事件数量(起)") {
console.log(77, params.seriesName);
return `<div>${params.marker} ${params.name} <span style="font-weight: bold;">${params.value} 起</span></div>`;
} else {
return `<div>${params.marker} ${params.name} <span style="font-weight: bold;">${params.value} 分钟</span></div>`;
}
},
},
legend: {
@ -33,6 +39,7 @@ var options = {
itemHeight: 8,
itemWidth: 8,
top: "5%",
right: "0%",
textStyle: {
// fontSize: 12,

8
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/governanceAnalysis/components/postTrendsMonth/index.vue

@ -147,7 +147,7 @@ export default {
value: "4",
},
],
dateTime: "2024-01-01 00:00:00",
dateTime: moment().format("YYYY-MM-DD HH:mm:ss"),
};
},
@ -217,6 +217,7 @@ export default {
},
async searchQuery() {
let startTime = "";
console.log("searchQuery", this.type);
if (this.type == 3) {
let year = moment().year();
// console.log(year, this.quarter);
@ -237,6 +238,7 @@ export default {
// type: this.type,
// startTime: startTime,
// }
console.log("++++++++++++", startTime);
var formData = new FormData();
formData.append("direction", this.direction);
formData.append("type", this.type);
@ -319,12 +321,12 @@ export default {
display: flex;
align-items: center;
height: 40px;
width: 100%;
width: 500px;
font-size: 14px;
margin-bottom: 10px;
left: 20px;
top: 10px;
z-index: 0;
z-index: 1;
div {
white-space: nowrap;

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

@ -4,47 +4,24 @@
<ElForm :model="formData" inline :rules="rules" ref="ruleForm">
<div class="first">
<el-form-item prop="eventCategory">
<el-radio-group
v-model="formData.eventCategory"
@input="changeRadio"
>
<el-radio-group v-model="formData.eventCategory" @input="changeRadio">
<el-radio-button :label="1">交通事件</el-radio-button>
<el-radio-button :label="2">感知事件</el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item required label="预案名称:" prop="planName">
<el-input
v-model="formData.planName"
placeholder="请输入预案名称"
></el-input>
<el-input v-model="formData.planName" placeholder="请输入预案名称"></el-input>
</el-form-item>
<el-form-item required label="事件类型:" prop="eventType">
<el-select
v-model="formData.eventType"
placeholder="请选择事件类型"
@change="changeEventType"
>
<el-option
v-for="item in eventOptions"
:key="item.value"
:label="item.label"
:value="item.value"
>
<el-select v-model="formData.eventType" placeholder="请选择事件类型" @change="changeEventType">
<el-option v-for="item in eventOptions" :key="item.value" :label="item.label" :value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="触发类型:" prop="triggerMechanism">
<el-select
v-model="formData.triggerMechanism"
placeholder="请选择触发类型"
>
<el-option
v-for="item in mechanismOptions"
:key="item.value"
:label="item.label"
:value="item.value"
>
<el-select v-model="formData.triggerMechanism" placeholder="请选择触发类型">
<el-option v-for="item in mechanismOptions" :key="item.value" :label="item.label" :value="item.value">
</el-option>
</el-select>
</el-form-item>
@ -56,11 +33,7 @@
<div class="text"><i style="color: red">*</i>执行操作:</div>
</el-col>
<el-col :span="22">
<FormTable
ref="secondFormTable"
:tableData="secondFormData"
:type="1"
></FormTable>
<FormTable ref="secondFormTable" :tableData="secondFormData" :type="1"></FormTable>
</el-col>
</el-row>
</div>
@ -70,11 +43,7 @@
<div class="text"><i style="color: red">*</i>恢复操作:</div>
</el-col>
<el-col :span="22">
<FormTable
ref="thirdFormTable"
:tableData="thirdFormData"
:type="2"
></FormTable>
<FormTable ref="thirdFormTable" :tableData="thirdFormData" :type="2"></FormTable>
</el-col>
</el-row>
</div>
@ -82,17 +51,9 @@
</div>
<template #footer>
<Button
style="background: #c9c9c9; padding: 0 24px"
@click.native="(modelVisible = false), (submitting = false)"
>取消</Button
>
<Button
style="padding: 0 24px"
@click.native="handleSubmit"
:loading="submitting"
>保存</Button
>
<Button style="background: #c9c9c9; padding: 0 24px"
@click.native="(modelVisible = false), (submitting = false)">取消</Button>
<Button style="padding: 0 24px" @click.native="handleSubmit" :loading="submitting">保存</Button>
</template>
</Dialog>
</template>
@ -111,7 +72,7 @@ import {
gzmsMap,
eventSubClassMap,
trafficKV,
perceptionKV,
WarningTypeList as perceptionKV,
} from "@screen/utils/enum.js";
const typeMap = {
@ -141,7 +102,7 @@ export default {
visible: Boolean,
detail: {
type: Object,
default: () => {},
default: () => { },
},
},
data() {
@ -201,7 +162,7 @@ export default {
},
};
},
mounted() {},
mounted() { },
computed: {
modelVisible: {
get() {
@ -212,7 +173,7 @@ export default {
this.eventOptions = typeMap[this.detail.eventCategory];
this.mechanismOptions =
eventSubClassMap[this.detail.eventCategory || 1][
this.detail.eventType
this.detail.eventType
];
this.initData(this.detail.id);
} else {
@ -327,7 +288,7 @@ export default {
this.eventOptions = typeMap[value];
this.changeEventType(1);
},
handleChange() {},
handleChange() { },
formatData(it, value = 1, id = "") {
let data = { ...it, actionType: value, emergencyPlansId: id };
if (

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

@ -56,7 +56,7 @@ export default {
return {
formData: {
type: "day",
warningTime: "",
warningTime: moment().format("YYYY-MM-DD") + " 00:00:01",
},
trafficIncidents: null,
trafficIncidentsPie: null,
@ -89,6 +89,7 @@ export default {
key: "warningTime",
required: true,
type: "datePicker",
default: moment().format("YYYY-MM-DD") + " 00:00:01",
options: {
valueFormat: "yyyy-MM-dd",
},
@ -107,6 +108,7 @@ export default {
type: "month",
valueFormat: "yyyy-MM-dd",
},
default: moment().format("YYYY-MM-DD") + " 00:00:01",
visible: (data) => {
if (data.type == "month") {
return true;
@ -122,6 +124,7 @@ export default {
type: "year",
valueFormat: "yyyy-MM-dd",
},
default: moment().format("YYYY-MM-DD") + " 00:00:01",
visible: (data) => {
if (data.type == "year") {
return true;
@ -134,9 +137,9 @@ export default {
async mounted() {
setTimeout(() => {
this.$nextTick(async () => {
(this.formData.warningTime =
moment(new Date()).format("YYYY-MM-DD") + " 00:00:01"),
(this.trafficIncidents = echarts.init(this.$refs.trafficIncidents));
// (this.formData.warningTime =
// moment().format("YYYY-MM-DD") + " 00:00:01"),
this.trafficIncidents = echarts.init(this.$refs.trafficIncidents);
this.trafficIncidents.setOption(trafficIncidentsCharts);
this.trafficIncidentsPie = echarts.init(this.$refs.trafficIncidentsPie);
this.trafficIncidentsPie.setOption(trafficIncidentsChartsPie);
@ -166,6 +169,7 @@ export default {
drawRoundRect(context, 410, 406, 320, 24, 10, gr);
drawRoundRect(context, 410, 440, 320, 24, 10, gr);
drawRoundRect(context, 410, 474, 320, 24, 10, gr);
console.log("this.formData", this.formData);
await this.getNonAutomaticWarningType(this.formData);
// drawRoundRect(context, 410, 508, 320, 24, 10, gr);
});
@ -174,6 +178,7 @@ export default {
methods: {
getNonAutomaticWarningType(data) {
let that = this;
console.log("data", data);
return nonAutomaticWarningType(data).then((res) => {
let newData = res.data;
let seriesData = [];

4
ruoyi-ui/src/views/JiHeExpressway/pages/control/manual/statistic/components/Eventfiltering/trafficIncidentsCharts.js

@ -50,6 +50,7 @@ var options = {
fontSize: 18,
align: "center",
},
minInterval: 1,
type: "value",
axisLine: {
show: false,
@ -70,6 +71,7 @@ var options = {
color: "#fff",
fontSize: "18px",
formatter: (value) => {
console.log(789789, value);
return value;
},
},
@ -78,7 +80,7 @@ var options = {
series: [
{
// name: '审限内结案率',
data: [5, 10, 20, 30],
data: [],
type: "pictorialBar",
symbol: "roundRect",
symbolRepeat: true,

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

@ -64,7 +64,7 @@ export default {
trafficIncidentsPie: null,
formData: {
type: "day",
warningTime: "",
warningTime: moment().format("YYYY-MM-DD") + " 00:00:01",
},
searchFormList: [
{
@ -98,6 +98,7 @@ export default {
options: {
valueFormat: "yyyy-MM-dd",
},
default: moment().format("YYYY-MM-DD") + " 00:00:01",
visible: (data) => {
if (data.type == "day") {
return true;
@ -113,6 +114,7 @@ export default {
type: "month",
valueFormat: "yyyy-MM-dd",
},
default: moment().format("YYYY-MM-DD") + " 00:00:01",
visible: (data) => {
if (data.type == "month") {
return true;
@ -128,6 +130,7 @@ export default {
type: "year",
valueFormat: "yyyy-MM-dd",
},
default: moment().format("YYYY-MM-DD") + " 00:00:01",
visible: (data) => {
if (data.type == "year") {
return true;
@ -155,9 +158,9 @@ export default {
getWarningCharts() {
setTimeout(() => {
this.$nextTick(async () => {
(this.formData.warningTime =
moment(new Date()).format("YYYY-MM-DD") + " 00:00:01"),
(this.trafficIncidents = echarts.init(this.$refs.trafficIncidents));
// (this.formData.warningTime =
// moment(new Date()).format("YYYY-MM-DD") + " 00:00:01"),
this.trafficIncidents = echarts.init(this.$refs.trafficIncidents);
this.trafficIncidents.setOption(trafficIncidentsCharts1);
this.trafficIncidentsPie = echarts.init(
this.$refs.trafficIncidentsPie

3
ruoyi-ui/src/views/JiHeExpressway/pages/control/manual/statistic/components/Sitefiltering/trafficIncidentsCharts.js

@ -50,6 +50,7 @@ var options = {
fontSize: 18,
align: "center",
},
minInterval: 1,
type: "value",
axisLine: {
show: false,
@ -78,7 +79,7 @@ var options = {
series: [
{
// name: '审限内结案率',
data: [5, 10, 20, 30],
data: [],
type: "pictorialBar",
symbol: "roundRect",
symbolRepeat: true,

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

@ -33,7 +33,7 @@ export default {
trafficIncidents: null,
formData: {
type: "day",
warningTime: "",
warningTime: moment().format("YYYY-MM-DD") + " 00:00:01",
},
searchFormList: [
{
@ -67,6 +67,7 @@ export default {
options: {
valueFormat: "yyyy-MM-dd",
},
default: moment().format("YYYY-MM-DD") + " 00:00:01",
visible: (data) => {
if (data.type == "day") {
return true;
@ -82,6 +83,7 @@ export default {
type: "month",
valueFormat: "yyyy-MM-dd",
},
default: moment().format("YYYY-MM-DD") + " 00:00:01",
visible: (data) => {
if (data.type == "month") {
return true;
@ -97,6 +99,7 @@ export default {
type: "year",
valueFormat: "yyyy-MM-dd",
},
default: moment().format("YYYY-MM-DD") + " 00:00:01",
visible: (data) => {
if (data.type == "year") {
return true;

3
ruoyi-ui/src/views/JiHeExpressway/pages/control/manual/statistic/components/Timefiltering/trafficIncidentsCharts.js

@ -50,6 +50,7 @@ var options = {
fontSize: 18,
align: "center",
},
minInterval: 1,
type: "value",
axisLine: {
show: false,
@ -78,7 +79,7 @@ var options = {
series: [
{
// name: '审限内结案率',
data: [5, 10, 20, 30],
data: [],
type: "pictorialBar",
symbol: "roundRect",
symbolRepeat: true,

2
ruoyi-ui/src/views/JiHeExpressway/pages/maintenanceOperations/chargeableOperations/components/daylyAnalysis/assets/charts.js

@ -5,7 +5,7 @@ var data2 = [5, 12, 4, 6, 7, 9, 10, 15, 3, 5, 6, 15];
var options = {
tooltip: {
formatter: function (params) {
console.log("params", params);
// console.log("params", params);
if (params.seriesName == "增收金额") {
return `<div>${params.marker} ${params.name} <span style="font-weight: bold;">${params.value} 万元</span></div>`;
} else {

338
ruoyi-ui/src/views/JiHeExpressway/pages/maintenanceOperations/statisticalAnalysis/components/deviceSummary/index.vue

@ -1,148 +1,215 @@
<template>
<Empty v-if="!dataList || dataList.length<=0" text="暂无数据..."></Empty>
<div v-else class='deviceSummary'>
<div class="item" v-for=" (item, index) in dataList" :key="index">
<div class="item_con">
<div class="title-tool">
<span class="text">{{ item.title }}</span>
<Empty v-if="!dataList || dataList.length <= 0" text="暂无数据..."></Empty>
<div v-else class="deviceSummary">
<draggable
tag="div"
:list="dataList"
@end="____onDragend"
ghostClass="ghost_class"
dragClass="drag_class"
chosenClass="chosen_class"
class="draggable"
>
<div class="item" v-for="(item, index) in dataList" :key="index">
<div class="item_con">
<div class="title-tool">
<span class="text">{{ item.title }}</span>
</div>
<div class="item-body">
<div class="left-body">
<div class="icon">
<i class="el-icon-menu" v-if="item.title.includes('全部')" />
<img
src="@screen/images/layer/路测设备/毫米波雷达.svg"
v-if="item.title.includes('雷达')"
/>
<img
src="@screen/images/layer/路测设备/情报板.svg"
v-if="item.title.includes('可变信息标志')"
/>
<img
src="@screen/images/layer/路测设备/摄像机.svg"
v-if="item.title.includes('枪型')"
/>
<img
src="@screen/images/layer/路测设备/设备箱.svg"
v-if="item.title.includes('设备箱')"
/>
<img
src="@screen/images/deviceType/ball.svg"
v-if="item.title.includes('球形摄像机')"
/>
<img
src="@screen/images/layer/路测设备/合流区.svg"
v-if="item.title.includes('合流区预警')"
/>
<img
src="@screen/images/layer/路测设备/行车诱导.svg"
v-if="item.title.includes('行车诱导')"
/>
<img
src="@screen/images/layer/路测设备/护栏碰撞.svg"
v-if="item.title.includes('碰撞')"
/>
<img
src="@screen/images/deviceType/ball.svg"
v-if="item.title.includes('全景摄像机')"
/>
<img
src="@screen/images/layer/路测设备/交调.svg"
v-if="item.title.includes('交通量调')"
/>
<img
src="@screen/images/layer/路测设备/气象检测器.svg"
v-if="item.title.includes('气象')"
/>
<img
src="@screen/images/layer/路测设备/语音广播.svg"
v-if="item.title.includes('语音广播')"
/>
<img
src="@screen/images/layer/路测设备/疲劳唤醒.svg"
v-if="item.title.includes('疲劳唤醒')"
/>
</div>
<div class="numUnit">
<span class="num">{{ item.total }}</span>
<span class="unit"></span>
</div>
</div>
<div class="line"></div>
<div class="right-list">
<div class="list-text">
<span class="title">在用</span>
<div class="value value4">
{{ item.sumUseState }}
</div>
</div>
<div class="item-body">
<div class="left-body">
<div class="icon">
<i class="el-icon-menu" v-if="item.title.includes('全部')"/>
<img src="@screen/images/layer/路测设备/毫米波雷达.svg" v-if="item.title.includes('雷达')" />
<img src="@screen/images/layer/路测设备/情报板.svg" v-if="item.title.includes('可变信息标志')" />
<img src="@screen/images/layer/路测设备/摄像机.svg" v-if="item.title.includes('枪型')" />
<img src="@screen/images/layer/路测设备/设备箱.svg" v-if="item.title.includes('设备箱')" />
<img src="@screen/images/deviceType/ball.svg" v-if="item.title.includes('球形摄像机')" />
<img src="@screen/images/layer/路测设备/合流区.svg" v-if="item.title.includes('合流区预警')" />
<img src="@screen/images/layer/路测设备/行车诱导.svg" v-if="item.title.includes('行车诱导')" />
<img src="@screen/images/layer/路测设备/护栏碰撞.svg" v-if="item.title.includes('碰撞')" />
<img src="@screen/images/deviceType/ball.svg" v-if="item.title.includes('全景摄像机')" />
<img src="@screen/images/layer/路测设备/交调.svg" v-if="item.title.includes('交通量调')" />
<img src="@screen/images/layer/路测设备/气象检测器.svg" v-if="item.title.includes('气象')" />
<img src="@screen/images/layer/路测设备/语音广播.svg" v-if="item.title.includes('语音广播')" />
<img src="@screen/images/layer/路测设备/疲劳唤醒.svg" v-if="item.title.includes('疲劳唤醒')" />
</div>
<div class="numUnit">
<span class="num">{{ item.total }}</span>
<span class="unit"></span>
</div>
<div class="list-text">
<span class="title">在线</span>
<div class="value value1">
{{ item.pctOnl }}
</div>
<div class="line"></div>
<div class="right-list">
<div class="list-text">
<span class="title">在用</span>
<div class="value value4">
{{ item.sumUseState }}
</div>
</div>
<div class="list-text">
<span class="title">在线</span>
<div class="value value1">
{{ item.pctOnl }}
</div>
</div>
<div class="list-text"><span class="title">离线</span>
<div class="value value2">
{{ item.pctOffl }}
</div>
</div>
<div class="list-text">
<span class="title">丢包</span>
<div class="value value3">
{{ item.pctLose }}
</div>
</div>
</div>
<div class="list-text">
<span class="title">离线</span>
<div class="value value2">
{{ item.pctOffl }}
</div>
</div>
<div class="list-text">
<span class="title">丢包</span>
<div class="value value3">
{{ item.pctLose }}
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
name: '',
components: {
},
props:{
dataList:{
type:Array,
default:()=>[],
}
},
data() {
return {
}
},
watch:{
</div>
</draggable>
</div>
</template>
<script>
import draggable from "vuedraggable";
import { getStatusRule } from "@/api/MonthlyEquipment";
export default {
name: "",
components: { draggable },
props: {
dataList: {
type: Array,
default: () => [],
},
created() {
},
methods: {
},
mounted() {
},
data() {
return {};
},
inject: ["initDataList"],
watch: {},
created() {},
methods: {
____onDragend() {
console.log(789, this.dataList);
let data = [];
this.dataList.forEach((item, index) => {
data.push(item.title);
});
getStatusRule(data).then((res) => {
console.log(res);
if (res.code == 200) {
this.initDataList();
}
});
},
}
</script>
<style lang='scss' scoped>
.deviceSummary {
},
mounted() {},
};
</script>
<style lang="scss" scoped>
.deviceSummary {
display: flex;
flex-direction: row;
flex-wrap: wrap;
margin-right: 0px;
overflow-y: scroll;
.draggable {
width: 100%;
display: flex;
flex-direction: row;
flex-wrap: wrap;
margin-right: 0px;
overflow-y: scroll;
>.item {
flex-basis:percentage(1/8);
width: 0;
margin: 0;
padding: 0 15px 15px 0;
height: 194px;
>.item_con{
width: 100%;
height: 100%;
display: flex;
position: relative;
flex-direction: column;
background: linear-gradient(180deg, rgba(6, 66, 88, 0) 0%, #06425868 93%);
border-radius: 3px 3px 3px 3px;
}
.item {
flex-basis: percentage(1/8);
width: 0;
margin: 0;
padding: 0 15px 15px 0;
height: 194px;
> .item_con {
width: 100%;
height: 100%;
display: flex;
position: relative;
flex-direction: column;
background: linear-gradient(180deg, rgba(6, 66, 88, 0) 0%, #06425868 93%);
border-radius: 3px 3px 3px 3px;
.item-body {
height: 90px;
margin-top: 30px;
display: flex;
flex-direction: row;
align-items: stretch;
.left-body {
display: flex;
width: 90px;
flex-direction: column;
justify-content: center;
align-items: center;
.icon{
.icon {
border-radius: 50%;
border: 1px solid #00D1FF;
border: 1px solid #00d1ff;
width: 30px;
height: 30px;
padding:8px;
padding: 8px;
box-sizing: content-box;
text-align: center;
img{
img {
width: 100%;
height: 100%;
}
i{ font-size: 26px; color: #00D1FF; line-height: 30px;}
i {
font-size: 26px;
color: #00d1ff;
line-height: 30px;
}
}
.numUnit{
.numUnit {
display: flex;
flex-direction: row;
justify-content: center;
@ -152,7 +219,7 @@
font-size: 19px;
font-family: PangMenZhengDao;
font-weight: 400;
color: #00D1FF;
color: #00d1ff;
}
.unit {
margin-left: 3px;
@ -160,17 +227,20 @@
padding-top: 3px;
font-family: PingFang SC, PingFang SC;
font-weight: 500;
color: #FFFFFFF0;
color: #fffffff0;
}
}
}
.line {
width: 2px;
margin: 0 10px 0 5px;
background: linear-gradient(180deg, rgba(3, 60, 81, 0), rgba(0, 100, 137, 1), rgba(3, 60, 81, 0));
background: linear-gradient(
180deg,
rgba(3, 60, 81, 0),
rgba(0, 100, 137, 1),
rgba(3, 60, 81, 0)
);
}
.right-list {
@ -187,38 +257,35 @@
font-size: 12px;
font-family: PingFang SC, PingFang SC;
font-weight: 400;
color: #FFFFFF;
color: #ffffff;
.title {
float: left;
width: 40px;
text-align: left;
}
.value{
.value {
font-size: 14px;
font-family: PangMenZhengDao;
font-weight: 800;
}
.value1 {
color: #00EBC1ee;
color: #00ebc1ee;
}
.value2 {
color: #FFFFFFee;
color: #ffffffee;
}
.value3 {
color: #FFD15Cee;
color: #ffd15cee;
}
.value4 {
color: #0D0;
color: #0d0;
}
}
}
}
.title-tool {
@ -227,16 +294,19 @@
justify-content: center;
align-items: center;
height: 36px;
background: linear-gradient(180deg, rgba(1, 139, 182, 0) 0%, #1FCAF160 100%);
background: linear-gradient(
180deg,
rgba(1, 139, 182, 0) 0%,
#1fcaf160 100%
);
border-radius: 3px 3px 0px 0px;
.text {
font-size: 15px;
font-family: "Arial","PingFang","Microsoft YaHei";
font-family: "Arial", "PingFang", "Microsoft YaHei";
font-weight: bold;
color: #FFFFFF;
color: #ffffff;
}
}
.title-tool::after {
@ -245,12 +315,14 @@
bottom: 1px;
width: 100%;
height: 1px;
background: linear-gradient(90deg, rgba(81, 181, 255, 0) 3%, #51B5FF 49%, rgba(81, 181, 255, 0) 100%);
background: linear-gradient(
90deg,
rgba(81, 181, 255, 0) 3%,
#51b5ff 49%,
rgba(81, 181, 255, 0) 100%
);
}
}
}
}
</style>
}
</style>

78
ruoyi-ui/src/views/JiHeExpressway/pages/maintenanceOperations/statisticalAnalysis/index.vue

@ -125,7 +125,7 @@ import {
getSystemStatusTabList,
getSystemStatusType,
getSystemStatusExport,
} from "../../../../../api/MonthlyEquipment";
} from "@/api/MonthlyEquipment";
// import { download } from "../../../../../utils/request.js";
import Pagination from "@screen/components/Pagination.vue";
import InputSearch from "@screen/components/InputSearch/index.vue";
@ -180,11 +180,16 @@ export default {
interval: null,
};
},
provide() {
return {
initDataList: this.initDevice,
};
},
destroyed() {
clearInterval(this.interval);
},
methods: {
handleSizeChange(size){
handleSizeChange(size) {
this.pageSize = size;
this.initData();
},
@ -285,8 +290,7 @@ export default {
initDevice() {
//线线
getSystemStatusType().then((res) => {
if (IS_TESTING && (!res.data || res.msg == "暂无数据")) {
if (process.env.NODE_ENV == "development") {
this.equipments = [];
this.equipSeries.forEach((item) => {
this.equipments.push({
@ -295,28 +299,37 @@ export default {
pctOnl: Math.floor(100 * Math.random()) + "%",
pctOffl: "25%",
pctLose: "15%",
sumUseState: "90%"
sumUseState: "90%",
});
});
return;
}
getSystemStatusType().then((res) => {
let allList = [];
for (let key in res.data) {
let val = res.data[key];
let item = {
title: key,
total: val.sum,
pctOnl: val.sucessRate,
pctOffl: val.failRate,
pctLose: val.lostRate,
sumUseState: val.sumUseState
};
if (key.includes("全部设备")) {
allList.unshift(item);
} else {
allList.push(item);
let sort = res.data["排序规则"].rule.split(",");
sort.forEach((i) => {
for (let key in res.data) {
let val = res.data[key];
let item = {
title: key,
total: val.sum,
pctOnl: val.sucessRate,
pctOffl: val.failRate,
pctLose: val.lostRate,
sumUseState: val.sumUseState,
};
if (i === key) {
allList.push(item);
}
// if (key.includes("")) {
// allList.unshift(item);
// } else {
// allList.push(item);
// }
}
}
});
this.equipments = allList;
});
},
@ -431,7 +444,8 @@ export default {
display: inline-flex;
width: 100%;
flex-direction: row;
flex:1; height: 0;
flex: 1;
height: 0;
.tabs-lo {
display: inline-flex;
@ -537,16 +551,24 @@ export default {
.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%;}
display: flex;
flex-direction: column;
flex: 1;
::v-deep .el-tabs__header {
}
::v-deep .el-tabs__content {
flex: 1;
.el-tab-pane {
width: 100%;
height: 100%;
}
}
}
.tab_con{ display: flex; flex-direction: column;}
.tab_con {
display: flex;
flex-direction: column;
}
.topdiv {
display: inline-flex;

4
ruoyi-ui/src/views/JiHeExpressway/pages/perception/trafficFlow/components/classification/index.vue

@ -1,6 +1,6 @@
<template>
<div class="classification">
<WgtTitle :title="'全路车流量状况'"></WgtTitle>
<WgtTitle :title="'在途车流量车型分类'"></WgtTitle>
<div class="board">
<!-- <div v-for="(item, index) in list" class="list">
<div class="title">{{ item.label }}</div>
@ -134,7 +134,7 @@ export default {
flex-direction: column;
.board {
flex:1;
flex: 1;
width: 100%;
padding: 0px 30px;
background: linear-gradient(180deg, rgba(6, 66, 88, 0.2) 0%, #064258 100%);

2
ruoyi-ui/src/views/JiHeExpressway/pages/perception/trafficFlow/components/flowstate/assets/charts.js

@ -55,7 +55,7 @@ var options = {
" ",
" ",
" ",
" ",
// " ",
// "枢纽",
// "立交",
// "立交",

2
ruoyi-ui/src/views/JiHeExpressway/pages/perception/trafficFlow/components/flowstate/index.vue

@ -1,6 +1,6 @@
<template>
<div class="flowstate">
<WgtTitle title="在途车流量车型分类"></WgtTitle>
<WgtTitle title="全路车流量状况"></WgtTitle>
<div class="board">
<div class="tag1">方向济南</div>
<div class="tag2">方向菏泽</div>

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

@ -194,7 +194,7 @@ export default {
value: "4",
},
],
dateTime: "2024-01-01 00:00:00",
dateTime: moment().format("YYYY-MM-DD HH:mm:ss"),
dataList: [],
quarter: "",
year: "",

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

@ -18,7 +18,7 @@
</div>
<InputSearch
style="width: 402px"
style="width: 480px"
:formList="searchFormList"
@handleSearch="handleSearch"
/>

63
ruoyi-ui/src/views/JiHeExpressway/pages/service/boardRecord/data.js

@ -0,0 +1,63 @@
// import * as PresetFormItems from "@screen/pages/control/event/event/FormEvent/PresetFormItems.js";
import * as PresetFormItems from "@screen/common/PresetFormItems.js";
// import { merge, cloneDeep } from "lodash";
export const searchFormList = [
{
label: "时间范围:",
key: "daterange",
required: false,
type: "datePicker",
options: {
type: "daterange",
format: "yyyy-MM-dd HH:mm:ss",
valueFormat: "yyyy-MM-dd HH:mm:ss",
},
},
PresetFormItems.directionCreater("RadioGroup"),
{
label: "发布状态:",
key: "releaseStatus",
type: "RadioGroup",
default: [],
options: {
options: [
{
key: "1",
label: "成功",
},
{
key: "0",
label: "失败",
},
],
},
},
// {
// label: "内容:",
// key: "releaseContent",
// type: "input",
// default: ""
// },
// {
// ...PresetFormItems.station,
// label: "开始桩号:",
// required: false,
// },
// merge(cloneDeep(PresetFormItems.station), {
// options: {
// options: [
// {
// key: "endStakeMark[0]",
// },
// {
// key: "endStakeMark[1]",
// },
// ],
// },
// label: "结束桩号:",
// required: false,
// }),
];

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

@ -1,10 +1,8 @@
<template>
<div class='board_record'>
<!-- 搜索栏 -->
<div class="filter">
<div>
<ButtonGradient @click="onRefresh" class="refresh-btn">
<ButtonGradient @click="onRefreshForm" class="refresh-btn">
<template #prefix>
<img src="./images/refresh.svg" />
</template>
@ -17,27 +15,49 @@
新增
</ButtonGradient> -->
</div>
</div>
<InputSearch
ref="searchComp"
style="width: 480px"
:formList="searchFormList"
:formConfigOptions="{ dFormData: { eventState: '0' } }"
@handleSearch="handleSearch"
/>
</div>
<!-- 内容 -->
<div class="body">
<Table :data="tableData">
<ElTableColumn label="序号" width="60" />
<ElTableColumn label="发布设备" width="60" />
<ElTableColumn label="屏幕尺寸" width="60" />
<ElTableColumn label="设备方向" width="60" />
<ElTableColumn label="设备桩号" width="60" />
<ElTableColumn prop="eventName" label="发布内容" width="240" />
<ElTableColumn prop="eventName" label="发布事件" width="240" />
<ElTableColumn prop="eventName" label="发布状态" width="240" />
<ElTableColumn prop="eventName" label="发布用户" width="240" />
<Table :data="tableData" height="100%">
<el-table-column label="序号" type="index" :index="indexMethod" width="60"/>
<ElTableColumn label="发布时间" prop="releaseTime" width="180"/>
<ElTableColumn label="设备ID" prop="deviceId" width="120"/>
<ElTableColumn label="设备名称" prop="deviceName" />
<ElTableColumn label="桩号" prop="stakeMark" width="100" />
<el-table-column
prop="direction"
label="方向"
width="110"
:formatter="formatterDirection" />
<ElTableColumn label="内容" prop="releaseContent" width="500" header-align="center">
<template slot-scope="scope">
<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.releaseContent)" :key="index">
<BoardRecordPreview :tpl="item" style="height: 100%;"/>
</el-carousel-item>
</el-carousel>
</template>
</ElTableColumn>
<ElTableColumn label="状态" prop="releaseStatus" width="80" :formatter="formatterStatus"/>
<ElTableColumn label="用户名" prop="releaseUserName" width="120" />
<ElTableColumn label="用户ID" prop="releaseUserId" width="120" />
<ElTableColumn label="用户IP" prop="releaseIp" width="200" />
<!--
<ElTableColumn label="操作" width="210">
<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>
</template>
</ElTableColumn>
-->
</Table>
</div>
@ -56,17 +76,25 @@ import ButtonGradient from '@screen/components/Buttons/ButtonGradient.vue';
import Pagination from '@screen/components/Pagination.vue';
import Table from '@screen/components/Table.vue';
import request from "@/utils/request";
import BoardRecordPreview from '@screen/components/infoBoard/BoardRecordPreview.vue'
import {DirectionTypes} from '@screen/utils/enum.js';
import InputSearch from "@screen/components/InputSearch/index.vue";
import { searchFormList } from "./data";
export default {
name: 'boardRecord',
components: {
ButtonGradient,
Pagination,
Table
Table,
BoardRecordPreview,
InputSearch
},
data() {
return {
testData : {"STAY":"30","ACTION":"1","SPEED":"0","COLOR":"ffff00","FONT":"3","FONT_SIZE":"32","CONTENT":"因改扩建施工 平阴南、梁山收费站出入口封闭","width":"768","height":"64","formatStyle":"2"},
tableData: [],
searchFormList,
isShowPhrases: false,
isShowDisposal: false,
total: 20,
@ -83,9 +111,53 @@ export default {
this.initData();
},
methods: {
onRefreshForm(){
this.searchData.pageNum = 1;
this.$refs.searchComp.handleResetForm();
},
handleSearch(data) {
let daterange = data.daterange;
console.log(data, "dataaaaaaaaaaaa");
// let dStakeMark = data.stakeMark;
// let dendStakeMark = data.endStakeMark;
// let stakeMark = dStakeMark[0] ? `K${dStakeMark[0]}+${dStakeMark[1]}` : "";
// let endStakeMark = dendStakeMark[0]
// ? `K${dendStakeMark[0]}+${dendStakeMark[1]}`
// : "";
let startTime = "";
let endTime = "";
if(daterange && daterange.length > 0){
startTime = daterange[0];
endTime = daterange[1];
}
this.searchData = {
...this.searchData,
// releaseContent: data.releaseContent || "",
direction: data.direction || "",
releaseStatus: data.releaseStatus,
startTime,
endTime,
// stakeMark: stakeMark,
// endStakeMark: endStakeMark,
};
this.initData();
},
indexMethod(index) {
return this.searchData.pageSize*(this.searchData.pageNum-1) + index + 1;
},
formatterDirection(row, column) {
return DirectionTypes[row.direction];
},
formatterStatus(row, column) {
return ["失败", "成功"][row.releaseStatus];
},
initData() {
request({
url: `/business/dcEventType/list`,
url: `/business/boardReleaseLog/list`,
method: "get",
params: this.searchData,
}).then((result) => {
@ -94,46 +166,16 @@ export default {
this.total = result.total;
});
},
onRefresh() {
this.tableData = [];
setTimeout(() => {
this.initData();
}, 100);
},
// onRefresh() {
// this.tableData = [];
// this.searchData.pageNum = 1;
// this.initData();
// },
onSizeChange(pageSize) {
this.tableData = [];
this.searchData.pageSize = pageSize;
this.getData();
},
showPhrases(data) {
if (data?.processConfigList.length <= 0) {
Message.warning('请先配置流程!');
return;
}
let process = []
data.processConfigList.forEach(it => {
process.push({
id: it.id,
commonPhrases: it.commonPhrases,
label: it.processNode,
isActive: false,
})
})
this.process = process;
this.isShowPhrases = true;
this.eventType = data.eventType;
},
showDisposal(eventType) {
this.isShowDisposal = true;
this.eventType = eventType;
},
onClosePhrases() {
this.isShowPhrases = false
},
onCloseDisposal() {
this.isShowDisposal = false;
},
onUpdatePhrasesData(phrasesData) {
this.phrasesData = phrasesData;
this.searchData.pageNum = 1;
this.initData();
}
}
}
@ -141,14 +183,11 @@ export default {
<style lang='scss' scoped>
.board_record {
padding: 21px;
padding: 0 14px 14px;
width:100%;
height: 100%;
display: flex;
flex-direction: column;
z-index: 6;
width: 100%;
height: 100%;
.filter {
height: 60px;
@ -164,15 +203,6 @@ export default {
.body {
flex: 1;
position: relative;
overflow: hidden;
.content {
position: absolute;
width: 100%;
height: 100%;
overflow: auto;
}
}
.footer {
@ -182,5 +212,18 @@ export default {
align-items: center;
justify-content: center;
}
.board_shower{
margin: 4px;
}
::v-deep .el-carousel__indicators--horizontal{
line-height: 0; height: 16px;
.el-carousel__indicator--horizontal{
padding: 7px 4px;
}
}
::v-deep .el-table__cell div.cell {
padding: 0 10px !important;
}
}
</style>

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

@ -163,21 +163,7 @@ export const WarningType = {
99: "其他事件",
};
// 交通事件主类
export const trafficType = {
1: "交通事故",
2: "车辆故障",
3: "交通管制",
4: "交通拥堵",
5: "非法上路",
6: "路障清除",
7: "施工建设",
8: "服务区异常",
9: "设施设备隐患",
10: "异常天气",
11: "其他事件",
};
//========= 感知事件 主类(key vulue) [{value: 1, label: '交通拥堵'}]=========
export const WarningTypeList = Object.keys(WarningType).map((key) => {
return {
value: key * 1,
@ -185,6 +171,11 @@ export const WarningTypeList = Object.keys(WarningType).map((key) => {
};
});
// 交通事件主类 {1: "交通事故" } 格式
export const trafficType = Object.keys(EventTopics).reduce((prev, now) => {
return { ...prev, [EventTopics[now]]: now };
}, {});
// 感知事件主类的子类(上方) warningSubclass
export const WarningSubclass = {
1: {
@ -262,104 +253,14 @@ export const WarningSubclass = {
},
};
//========= 交通事件 主类(key vulue)=========
export const trafficKV = [
{
value: 1,
label: "交通事故",
},
{
value: 2,
label: "车辆故障",
},
{
value: 3,
label: "交通管制",
},
{
value: 4,
label: "交通拥堵",
},
{
value: 5,
label: "非法上路",
},
{
value: 6,
label: "路障清除",
},
{
value: 7,
label: "施工建设",
},
{
value: 8,
label: "服务区异常",
},
{
value: 9,
label: "设施设备隐患",
},
{
value: 10,
label: "异常天气",
},
{
value: 11,
label: "其他事件",
},
];
//========= 感知事件 主类(key vulue)=========
export const perceptionKV = [
{
value: 1,
label: "交通拥堵",
},
{
value: 2,
label: "行人",
},
{
value: 3,
label: "非机动车",
},
{
value: 4,
label: "停车",
},
{
value: 5,
label: "违规驾驶",
},
{
value: 6,
label: "路障",
},
{
value: 7,
label: "道路施工",
},
{
value: 8,
label: "异常天气",
},
{
value: 9,
label: "护栏碰撞",
},
{
value: 10,
label: "交通事故",
},
{
value: 11,
label: "车辆故障",
},
{
value: 99,
label: "其他事件",
},
];
//========= 交通事件 主类(key vulue) =========
export const trafficKV = Object.keys(trafficType).map((key) => {
return {
value: key * 1,
label: trafficType[key],
};
});
//交通事件、感知事件 子类(key vulue)预案使用
export const eventSubClassMap = {
1: {

6
ruoyi-ui/vue.config.js

@ -31,7 +31,7 @@ module.exports = {
devServer: {
host: "0.0.0.0",
port: port,
https: true,
// https: true,
open: true,
proxy: {
// detail: https://cli.vuejs.org/config/#devserver-proxy
@ -52,8 +52,8 @@ 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.68.42:8087`, //王思祥
target: `http://10.168.66.196:8087`, //正晨后台 连现场物联 刘文阁2
// target: `http://10.168.68.42:8087`, //王思祥
// target: `http://10.168.65.194:8087`, //赵祥龙
// target: `http://10.168.65.156:8097`, //孟
// target: `http://10.168.56.165:8087`, //王家宝

Loading…
Cancel
Save