Browse Source

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

wangqin
zhangzhang 11 months ago
parent
commit
a04e32a560
  1. 24
      ruoyi-ui/src/common/menuData.js
  2. 2
      ruoyi-ui/src/views/JiHeExpressway/components/CameraShower/CameraController.vue
  3. 6
      ruoyi-ui/src/views/JiHeExpressway/components/Descriptions.vue
  4. 29
      ruoyi-ui/src/views/JiHeExpressway/components/FormConfig/components/ElCheckboxGroup.vue
  5. 1
      ruoyi-ui/src/views/JiHeExpressway/components/FormConfig/components/Text.vue
  6. 32
      ruoyi-ui/src/views/JiHeExpressway/components/Video/Video.vue
  7. 20
      ruoyi-ui/src/views/JiHeExpressway/components/Video/videoStream.js
  8. 42
      ruoyi-ui/src/views/JiHeExpressway/components/infoBoard/BoardInfoEditor.vue
  9. 8
      ruoyi-ui/src/views/JiHeExpressway/index.vue
  10. 39
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/Broadcast/components/BroadcastReleases.vue
  11. 25
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/Broadcast/index.vue
  12. 20
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/DrivingGuidance/components/DeviceControlDialog.vue
  13. 49
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/DrivingGuidance/index.vue
  14. 5
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/FatigueWakesUp/components/DeviceControlDialog.vue
  15. 50
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/PerceiveEvent/index.vue
  16. 53
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/SmartDevice/components/DeviceParams.vue
  17. 7
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/SmartDevice/index.vue
  18. 4
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/TrafficIncidents/index.vue
  19. 1
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/RoadAndEvents/utils/buttonEvent.js
  20. 27
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/RoadAndEvents/utils/httpList.js
  21. 309
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/event/EventDetailDialog/eventPlanDialog/index.vue
  22. 2
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/event/EventDetailDialog/index.vue
  23. 1471
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/plan/addAndEditDialog/index.vue
  24. BIN
      ruoyi-ui/src/views/JiHeExpressway/pages/control/manual/events/img.png
  25. 42
      ruoyi-ui/src/views/JiHeExpressway/pages/control/manual/events/index.vue
  26. BIN
      ruoyi-ui/src/views/JiHeExpressway/pages/control/manual/statistic/img.png
  27. 42
      ruoyi-ui/src/views/JiHeExpressway/pages/control/manual/statistic/index.vue
  28. 39
      ruoyi-ui/src/views/JiHeExpressway/pages/control/qrCode/index.vue
  29. 18
      ruoyi-ui/src/views/JiHeExpressway/pages/service/publicService/components/auditAnalytics/assets/charts.js
  30. 6
      ruoyi-ui/src/views/JiHeExpressway/pages/service/publicService/components/auditAnalytics/index.vue
  31. 17
      ruoyi-ui/src/views/JiHeExpressway/pages/service/publicService/components/channelAnalytics/assets/charts.js
  32. 6
      ruoyi-ui/src/views/JiHeExpressway/pages/service/publicService/components/channelAnalytics/index.vue
  33. 18
      ruoyi-ui/src/views/JiHeExpressway/pages/service/publicService/components/eventTypeAnalysis/assets/charts.js
  34. 8
      ruoyi-ui/src/views/JiHeExpressway/pages/service/publicService/components/eventTypeAnalysis/index.vue
  35. 7
      ruoyi-ui/src/views/JiHeExpressway/pages/service/publicService/components/nucleusThrough/index.vue
  36. 6
      ruoyi-ui/src/views/JiHeExpressway/pages/service/publicService/components/postTrendsDay/index.vue
  37. 8
      ruoyi-ui/src/views/JiHeExpressway/pages/service/publicService/components/postTrendsMonth/index.vue
  38. 2
      ruoyi-ui/src/views/JiHeExpressway/pages/service/publicService/components/topComponent/index.vue
  39. 131
      ruoyi-ui/src/views/JiHeExpressway/pages/service/publicService/index.vue
  40. 20
      ruoyi-ui/src/views/JiHeExpressway/utils/deviceControl.js
  41. 24
      ruoyi-ui/src/views/JiHeExpressway/utils/enum.js
  42. 3
      ruoyi-ui/vue.config.js

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

@ -102,6 +102,30 @@ export default [
},
],
},
{
title: "扫码报警",
name: "controlQR",
path: "/control/qrCode",
component: "control/qrCode/index.vue"
},
{
title: "非机预警",
name: "controlManual",
children: [
{
title: "事件列表",
name: "controlManualEvents",
path: "/control/manual/events",
component: "control/manual/events/index.vue",
},
{
title: "统计分析",
name: "controlManualStatistic",
path: "/control/manual/statistic",
component: "control/manual/statistic/index.vue",
}
]
}
],
},
{

2
ruoyi-ui/src/views/JiHeExpressway/components/CameraShower/CameraController.vue

@ -126,7 +126,7 @@ export default {
.compHead{
display: flex; justify-content: flex-end; padding-bottom: 20px;
// img{ width: 20px; height: 20px; pointer-events: all;}
.iconfont{font-size: 18px; pointer-events: all;}
.iconfont{font-size: 18px; pointer-events: all; color: #3DE8FF;}
}
.compCon {
display: flex;

6
ruoyi-ui/src/views/JiHeExpressway/components/Descriptions.vue

@ -2,10 +2,7 @@
<div class="Descriptions keep-ratio" origin="left" :style="getStyle()">
<div class="item" v-for="(item, index) in getResolveList" :key="`${item.key || item.label}${index}`"
:style="[gridStyle(item, index), transformStyle(itemStyle)]">
<div class="text title" :style="{
...transformStyle(titleStyle),
width: labelWidth,
}">
<div class="text title" :style="{...transformStyle(titleStyle), width: labelWidth }">
<p>
<slot :name="`title-${item.key || item.label}`" :data="item">
{{ item.label || "-" }}
@ -85,7 +82,6 @@ export default {
}
prev.push(data);
return prev;
}, []);
},

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

@ -1,19 +1,15 @@
<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]"
>
<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>
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">
</div>
</ElCheckbox>
</ElCheckboxGroup>
</template>
@ -43,6 +39,10 @@ export default {
gap: {
default: "24px",
},
showIcon: {
type: Boolean,
default: false,
},
},
};
</script>
@ -58,7 +58,6 @@ export default {
display: flex;
align-items: center;
gap: 6px;
width: 100px;
.el-checkbox__input {
line-height: 0;

1
ruoyi-ui/src/views/JiHeExpressway/components/FormConfig/components/Text.vue

@ -33,7 +33,6 @@ export default {
);
if (templateResult && templateResult != item.key) return templateResult;
return result || item.text || "-";
},
getDisplayColor() {

32
ruoyi-ui/src/views/JiHeExpressway/components/Video/Video.vue

@ -10,6 +10,11 @@ import { HttpLivePlayer, openLiveVideo } from "./videoStream.js"
export default {
name: 'Video',
data() {
return {
player: null
}
},
props: {
camId: {
type: String,
@ -28,22 +33,33 @@ export default {
default: 'flv'
},
rangeIndex: {
type: Number,
default: 0
}
},
watch: {
camId: {
handler(newV) {
this.playVideo();
}
// immediate: true
}
},
async mounted() {
// setTimeout(() => {
// this.$nextTick(() => {
if (this.videoType == 'flv') {
// const player = await openLiveVideo(this.$refs.videoContainerRef, { camId: this.camId, url: this.url, pileNum: this.pileNum })
const player = new HttpLivePlayer(this.$refs.videoContainerRef, { camId: this.camId, url: this.url, pileNum: this.pileNum, rangeIndex: this.rangeIndex });
this.$once("hook:beforeDestroy", () => player?.destroy());
}
this.playVideo();
this.$once("hook:beforeDestroy", () => this.player?.destroy());
// })
// })
},
methods: {
playVideo() {
this.player?.destroy();
if (this.videoType == 'flv') {
// const player = await openLiveVideo(this.$refs.videoContainerRef, { camId: this.camId, url: this.url, pileNum: this.pileNum })
this.player = new HttpLivePlayer(this.$refs.videoContainerRef, { camId: this.camId, url: this.url, pileNum: this.pileNum, rangeIndex: this.rangeIndex });
}
}
}
}
</script>

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

@ -5,6 +5,7 @@ import { Message } from "element-ui";
import {
getCameraStream,
getNearCamera,
getNearCameraNew,
} from "@screen/pages/Home/components/RoadAndEvents/utils/httpList.js";
/**
@ -63,13 +64,26 @@ async function getUrl({ camId, url, pileNum, rangeIndex } = {}) {
if (url) return url;
if (pileNum) {
const { code, data } = await getNearCamera(pileNum).catch(() => ({}));
if (code != 200 || !data?.length) {
let code, data, cameraData;
if (rangeIndex) {
if (typeof rangeIndex === "string")
cameraData = await getNearCameraNew(pileNum).catch(() => ({}));
else cameraData = await getNearCamera(pileNum).catch(() => ({}));
} else {
cameraData = await getNearCamera(pileNum).catch(() => ({}));
}
code = cameraData.code;
data = cameraData.data;
// console.log(rangeIndex, "rangeIndex", cameraData);
if (
code != 200 ||
(Array.isArray(data) ? !data?.length : !Object.keys(data || {}).length)
) {
Message.warning("未获取到附近的相机信息");
return;
}
camId = data[rangeIndex || 0]?.camId;
console.log(rangeIndex, "rangeIndex", data, data[rangeIndex], cameraData);
}
if (camId) {

42
ruoyi-ui/src/views/JiHeExpressway/components/infoBoard/BoardInfoEditor.vue

@ -374,25 +374,27 @@ export default {
},
},
watch: {
screenSize(newV){
if(newV){
let boardH = newV.split("*")[1];
let fontSize = "20";
if (['64', '48'].includes(boardH)) {
this.maxFontSize = +boardH
fontSize = boardH + ""
} else if (['80'].includes(boardH)) {
this.maxFontSize = +boardH / 2
fontSize = +boardH / 2 + ""
} else if (['160'].includes(boardH)) {
this.maxFontSize = +boardH / 2
fontSize = +boardH / 4 + ""
screenSize:{
handler(newV){
if(newV){
let boardH = newV.split("*")[1];
let fontSize = "20";
if (['64', '48'].includes(boardH)) {
this.maxFontSize = +boardH
fontSize = boardH + ""
} else if (['80'].includes(boardH)) {
this.maxFontSize = +boardH / 2
fontSize = +boardH / 2 + ""
} else if (['160'].includes(boardH)) {
this.maxFontSize = +boardH / 2
fontSize = +boardH / 4 + ""
}
this.deviceCttDefault.fontSize = fontSize
this.templateDefault.screenSize = newV;
this.templateDefault.fontSize = fontSize;
}
this.deviceCttDefault.fontSize = fontSize
this.templateDefault.screenSize = newV;
this.templateDefault.fontSize = fontSize;
}
},
immediate:true
},
visible: {
handler(newV) {
@ -453,10 +455,6 @@ export default {
// this.templateDefault.fontSize = this.fontSizeList[0].dictValue
// this.dataForm.FONT_SIZE = res.data[1].dictValue
});
},
methods: {
initData() {

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

@ -113,16 +113,16 @@ export default {
}
.content {
display: flex;
flex-direction: row;
// display: flex;
// flex-direction: row;
pointer-events: none;
::v-deep {
>div {
top: -6px;
// top: -6px;
z-index: -1;
pointer-events: auto;
height: calc(100% + 6px);
// height: calc(100% + 6px);
}
}

39
ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/Broadcast/components/BroadcastReleases.vue

@ -4,8 +4,8 @@
<div class="body">
<div class="left">
<div class="title">路测广播列表</div>
<CheckboxGroup class="checkbox-group" gap="9px" v-model="checkList" :options="musicList" id="otherConfig"
label="deviceName">
<CheckboxGroup class="checkbox-group" gap="9px" :showIcon="true" v-model="checkList" :options="musicList"
id="otherConfig" label="deviceName">
<template #[otherConfig]="{ data }">
<span style="color: #6EE5FE;">
{{ data.deviceName }}(当前设备)
@ -150,6 +150,41 @@ export default {
flex-direction: column;
gap: 9px;
::v-deep .el-checkbox__label {
display: flex !important;
justify-content: space-between;
width: 100%;
.title {
flex: 1;
width: 0;
overflow: hidden;
text-overflow: ellipsis;
word-break: keep-all;
}
.state {
width: 18px;
height: 18px;
margin-right: 4px;
}
.huiduButton {
background: transparent;
border: none;
height: 18px;
width: 18px;
line-height: 20px;
padding: 0;
color: #fff;
font-size: 16px;
}
.huiduButton:hover {
color: #05afe3 !important;
}
}
.checkbox-group {
display: flex;
flex-direction: column;

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

@ -7,15 +7,15 @@
<ElTabPane label="基本信息" name="first">
<Descriptions :list="list" :data="data" style="gap: 18px">
<template #content-deviceState>
<img
<!-- <img
:src="
require(`./images/${
data.deviceState == 1 ? 'online' : 'offline'
}.jpg`)
"
width="18"
/>
{{ DeviceTypeEnum[data.deviceState] || "" }}
/> -->
{{ DeviceTypeEnum[data.deviceState] || "-" }}
</template>
</Descriptions>
</ElTabPane>
@ -28,13 +28,8 @@
</div>
</div>
<BroadcastReleases
v-model="releaseVisible"
:deviceId="dialogData.iotDeviceId"
:pileNum="dialogData.stakeMark"
:otherConfig="dialogData.otherConfig"
:currentId="dialogData.id"
/>
<BroadcastReleases v-model="releaseVisible" :deviceId="dialogData.iotDeviceId" :pileNum="dialogData.stakeMark"
:otherConfig="dialogData.otherConfig" :currentId="dialogData.id" />
</Dialog>
</template>
@ -44,8 +39,10 @@ import Button from "@screen/components/Buttons/Button.vue";
import Descriptions from "@screen/components/Descriptions.vue";
import BroadcastReleases from "./components/BroadcastReleases.vue";
import Video from "@screen/components/Video";
import { DeviceTypeEnum } from "@screen/utils/enum.js";
const DeviceTypeEnum = {
0: "异常",
1: "正常",
};
import {
getRoadInfoByStakeMark,
getOrganizationName,
@ -133,7 +130,7 @@ export default {
if (roadInfo) this.data.roadName = roadInfo.roadName;
},
methods: {
handleClickTabs() {},
handleClickTabs() { },
},
};
</script>
@ -173,7 +170,7 @@ export default {
align-items: center;
justify-content: end;
> div {
>div {
font-size: 16px;
padding: 6px 12px;
}

20
ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/DrivingGuidance/components/DeviceControlDialog.vue

@ -35,6 +35,7 @@ import request from "@/utils/request";
import { Message } from "element-ui";
// import { axiosIns } from "@screen/utils/axios/auth.js";
import { handle3CResult } from "@screen/utils/deviceControl.js"
const workStatus = [
{
@ -198,24 +199,7 @@ export default {
formData.controlType = data.mode;
switch (data.mode) {
case "00":
formData.onWorkStatus = data.onWorkStatus;
formData.inWorkStatus = data.inWorkStatus;
break;
case "01":
case "02":
await this.requestURL("3C")
.then((data2) => {
formData.onWorkStatus = data2.onWorkStatus;
formData.inWorkStatus = data2.inWorkStatus;
if (data.mode === '01')
formData.displayTime = [data.startDisplay, data.endDisplay];
})
.catch(() => { });
break;
}
await handle3CResult(data, formData, this.requestURL);
this.oldFormData = { ...formData };

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

@ -17,10 +17,7 @@
</div>
<!-- <DeviceControlDialog v-model="deviceControlVisible" :deviceId="dialogData.iotDeviceId || '8697-1'" /> -->
<DeviceControlDialog
v-model="deviceControlVisible"
:deviceId="dialogData.iotDeviceId"
/>
<DeviceControlDialog v-model="deviceControlVisible" :deviceId="dialogData.iotDeviceId" />
</Dialog>
</template>
@ -35,7 +32,10 @@ import {
} from "@screen/pages/Home/components/RoadAndEvents/utils/httpList.js";
import Video from "@screen/components/Video";
import request from "@/utils/request";
import { delay } from "@screen/utils/common.js"
import { handle3CResult } from "@screen/utils/deviceControl.js"
import { controlModelMap, gzztMap } from "@screen/utils/enum.js";
import { find } from "lodash";
import { dialogDelayVisible } from "./../mixin";
//
@ -116,19 +116,30 @@ export default {
.then((data) => {
this.dialogData.brand = data.brand;
})
.catch((err) => {});
this.requestURL(52)
.then((result) => {
this.data.workMode = {
"00": "手动控制",
"01": "自动控制",
"02": "万年历",
}[result.mode];
this.data.onWorkStatus = result.onWorkStatus;
this.data.inWorkStatus = result.inWorkStatus;
})
.catch((err) => {});
.catch((err) => { });
// this.requestURL(52)
// .then((result) => {
// this.data.workMode = {
// "00": "",
// "01": "",
// "02": "",
// }[result.mode];
// this.data.onWorkStatus = result.onWorkStatus;
// this.data.inWorkStatus = result.inWorkStatus;
// })
// .catch((err) => { });
this.requestURL()
.then(async (data) => {
await delay(0);
const formData = {};
formData.controlType = data.mode;
await handle3CResult(data, formData, this.requestURL);
formData.controlType && (this.$set(this.data, "workMode", controlModelMap[formData.controlType]))//(this.data.workMode = controlModelMap[formData.controlType]);
formData.inWorkStatus && (this.$set(this.data, "inWorkStatus", gzztMap[formData.inWorkStatus]))//(this.data.inWorkStatus = gzztMap[formData.inWorkStatus]);
formData.onWorkStatus && (this.$set(this.data, "onWorkStatus", gzztMap[formData.onWorkStatus]))//(this.data.onWorkStatus = gzztMap[formData.onWorkStatus]);
});
const roadInfo = await getRoadInfoByStakeMark(this.dialogData.stakeMark);
console.log(
@ -195,7 +206,7 @@ export default {
align-items: center;
justify-content: end;
> div {
>div {
font-size: 16px;
padding: 6px 12px;
}

5
ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/FatigueWakesUp/components/DeviceControlDialog.vue

@ -4,7 +4,8 @@
<ElTabs v-model="activeName" class="tabs">
<ElTabPane label="一般模式" name="first">
<Form v-model="formData" class="form" ref="FormConfigRef" :formList="formList1" column="1" labelWidth="120px" />
<Form v-model="formData" class="form" ref="FormConfigRef" :formList="formList1" column="1"
labelWidth="120px" />
</ElTabPane>
<ElTabPane label="自定义模式" name="second">
<Form class="form" ref="FormConfigRef" :formList="formList2" column="1" labelWidth="120px" />
@ -141,7 +142,7 @@ export default {
handler(bool) {
if (!bool) return;
this.reDisplay();
// this.reDisplay();
}
}
},

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

@ -26,7 +26,6 @@
</div>
<template #footer>
{{ WarningTypeList }}
<Button>误报</Button>
<Button
style="background-color: rgba(0, 179, 204, 0.3)"
@ -52,10 +51,31 @@ import Carousel from "@screen/pages/control/event/event/EventDetailDialog/Carous
import { WarningTypeList, WarningSubclassList } from "@screen/utils/enum.js";
// import { getRoadInfoByStakeMark, getProduct } from "@screen/pages/Home/components/RoadAndEvents/utils/httpList.js"
import { dialogDelayVisible } from "./../mixin";
import { LaneOccupancyList } from "@screen/utils/enum.js";
import { LaneOccupancyList, DirectionTypes } from "@screen/utils/enum.js";
let vehicleTypeList = [];
function getDuration(warningTime) {
const currentTime = moment();
const specifiedTime = moment(warningTime);
const duration = moment.duration(currentTime.diff(specifiedTime));
const hours = Math.floor(duration.asHours());
const minutes = Math.floor(duration.asMinutes()) % 60;
const seconds = Math.floor(duration.asSeconds()) % 60;
return `${padZero(hours)}:${padZero(minutes)}:${padZero(seconds)}`;
}
function padZero(num) {
num = num.toString();
while (num.length < 2) {
num = "0" + num;
}
return num;
}
//
export default {
name: "PerceiveEvent",
@ -71,6 +91,7 @@ export default {
},
data() {
return {
interval: null,
loading: true,
activeName: "first",
deviceControlVisible: false,
@ -95,6 +116,12 @@ export default {
key: "stakeMark",
type: "text",
},
{
label: "路段方向:",
key: "direction",
type: "text",
isAlone: true,
},
{
label: "事件来源:",
key: "warningSource",
@ -158,11 +185,11 @@ export default {
key: "duration",
type: "text",
},
{
label: "天气情况:",
key: "weather",
type: "text",
},
// {
// label: ":",
// key: "weather",
// type: "text",
// },
],
};
},
@ -170,6 +197,10 @@ export default {
this.getDetails();
this.getVehicleTypeList();
},
async mounted() {},
beforeDestroy() {
clearInterval(this.interval);
},
methods: {
getVehicleTypeList() {
if (vehicleTypeList.length) return;
@ -252,6 +283,11 @@ export default {
setTimeout(() => {
this.$refs.FormConfigRef.reset(true);
});
this.data.direction = DirectionTypes[this.data.direction];
this.data.duration = getDuration(this.data.warningTime);
this.interval = setInterval(() => {
this.data.duration = getDuration(this.data.warningTime);
}, 1000);
})
.catch((e) => {
Message.error("详情获取失败" + e);

53
ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/SmartDevice/components/DeviceParams.vue

@ -63,6 +63,22 @@ export default {
dc: '12v',
}
// {
// ac_out_electricity_1 :"0.07A"
// ac_out_electricity_2 :"4.69A"
// ac_out_voltage_1 :"217.26V"
// ac_out_voltage_2 :"217.30V"
// dc_out_electricity_1 :"0.00A"
// dc_out_electricity_2 :"0.00A"
// dc_out_voltage_1 :"11.44V"
// dc_out_voltage_2 :"11.45V"
// door_status :"1"
// fan_status :"0"
// humidity :"20.3"
// power_status :"1"
// temperature :"18.4"
// }
for (const key in deviceInfo.formatValue) {
// electricity
// voltage
@ -70,6 +86,7 @@ export default {
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]}) 电压`,
@ -91,21 +108,24 @@ export default {
{
label: '风扇',
key: `fan_status`,
// key: `aa_electricity_1`,
text: { 0: '正常', 1: '开' }[deviceInfo.formatValue['fan_status']] || '-',
gridColumn: 1
},
{
label: '箱门',
key: `door_status`,
text: { 0: '关闭', 1: '打开' }[deviceInfo.formatValue['door_status']] || '-',
gridColumn: 1
gridColumn: 2,
state: (deviceInfo.formatValue['fan_status']==='0')
},
{
label: '温度',
key: `temperature`,
text: deviceInfo.formatValue['temperature'] ? `${deviceInfo.formatValue['temperature']} °C` : '-',
gridColumn: 1
gridColumn: 2
},
{
label: '箱门',
key: `door_status`,
text: { 0: '关闭', 1: '打开' }[deviceInfo.formatValue['door_status']] || '-',
gridColumn: 1
},
{
label: '湿度',
key: `humidity`,
@ -128,10 +148,19 @@ export default {
},
methods: {
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;
let op = ["关闭", "开启"][+data.state];
const isContinue = await confirm({ message: `${op}该支路?` })
const isContinue = await confirm({ message: `${str}` })
.catch(() => {
console.log(data.state,value,333)
data.state = !value;
});
@ -142,7 +171,7 @@ export default {
url: `/business/device/functions/${this.dialogData.iotDeviceId}/${102}`,
method: "POST",
data: {
deviceName: data.key.match(/^[a-z]+_out|[0-9]+/g).join("_") + "_en",
deviceName,
// 1=0=
value: value ? 1 : 0
}
@ -161,7 +190,7 @@ export default {
})
},
getSlotKey(key) {
return key.includes('electricity') ? key : ''
return key.includes('electricity') || key.includes('fan') ? key : ''
}
}
}

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

@ -15,9 +15,9 @@
</ElTabPane>
</ElTabs>
</div>
<template #footer>
<Button @click.native="deviceControlVisible = true"> 设备操作 </Button>
<Button v-if="data.deviceState == '1'" @click.native="deviceControlVisible = true"> 设备操作 </Button>
<Button v-else style="background-color: #bbb;"> 设备离线 </Button>
</template>
<DeviceControlDialog
@ -107,7 +107,8 @@ export default {
console.log(
"%c [ dialogData ]-103-「index.vue」",
"font-size:15px; background:#36347c; color:#7a78c0;",
this.dialogData
this.dialogData,
"+++========"
);
getProduct(this.dialogData.productId).then((data) => {

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

@ -2,8 +2,8 @@
<Dialog v-model="obverseVisible" :title="dialogData._itemData && dialogData._itemData.title">
<div class="TrafficIncidents">
<div class="header">
<Video class="video-stream" :pileNum="dialogData.stakeMark" />
<Video class="video-stream" :pileNum="dialogData.stakeMark" :rangeIndex="1" />
<Video class="video-stream" :pileNum="dialogData.stakeMark" rangeIndex="upCamera" :showHeader="false" />
<Video class="video-stream" :pileNum="dialogData.stakeMark" rangeIndex="downCamera" :showHeader="false" />
</div>
<Descriptions labelWidth="72px" :list="list" :data="data" style="gap: 18px" column="7" />

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

@ -100,6 +100,7 @@ function resolveDataOptions(data, config, component, isDefault) {
const formData = extData?.otherConfig
? JSON.parse(extData.otherConfig)
: null;
console.log(component, "DialogComponent");
this.dialogConfig = {
component,
data: {

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

@ -41,6 +41,23 @@ export function getNearCamera(pileNum) {
});
}
export function getNearCameraNew(pileNum) {
return request({
url: "/video/nearCamPileNum",
method: "get",
params: {
pileNum,
},
});
}
function padZero(num) {
num = num.toString();
while (num.length < 3) {
num = "0" + num;
}
return num;
}
/**
* 球机进行控制
* @param {string} camId 相机 ID
@ -269,13 +286,7 @@ export function getProduct(productId) {
});
});
}
function padZero(num) {
num = num.toString();
while (num.length < 3) {
num = "0" + num;
}
return num;
}
/**
* 交通事件 列表 根据类型获取
* @param {number} eventType
@ -327,7 +338,7 @@ export function getEventTopicList(eventType, options = {}) {
export function getPerceiveEventList(data = {}, options = {}) {
return new Promise((resolve, reject) => {
const completeTime = moment().add(1, "d").format("YYYY-MM-DD");
const startTime = moment().add(-30, "d").format("YYYY-MM-DD");
const startTime = moment().add(-7, "d").format("YYYY-MM-DD");
data.startTime = startTime;
data.completeTime = completeTime;

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

@ -1,34 +1,32 @@
<template>
<Dialog v-model="modelVisible" :title="title">
<div class="EventAddPlanDialog">
<ElForm :model="formData" inline :rules="rules" ref="ruleForm">
<div class="first">
<el-radio-group v-model="planName">
<el-radio-button v-for="item in info" :key="item.id" :label="item.planName"></el-radio-button>
</el-radio-group>
</div>
<div class="first">
<el-radio-group v-model="planName" @input="changeRadio">
<el-radio-button v-for="item in info" :key="item.id" :label="item.planName"></el-radio-button>
</el-radio-group>
</div>
<div class="second">
<el-row>
<el-col :span="2">
<div class="text">联动设备:</div>
</el-col>
<el-col :span="22">
<FormTable ref="secondFormTable" :tableData="secondFormData"></FormTable>
</el-col>
</el-row>
</div>
<div class="third">
<el-row>
<el-col :span="2">
<div class="text">恢复操作:</div>
</el-col>
<el-col :span="22">
<FormTable ref="thirdFormTable" :tableData="thirdFormData"></FormTable>
</el-col>
</el-row>
</div>
</ElForm>
<div class="second">
<el-row>
<el-col :span="2">
<div class="text">联动设备:</div>
</el-col>
<el-col :span="22">
<FormTable ref="secondFormTable" :tableData="secondFormData"></FormTable>
</el-col>
</el-row>
</div>
<div class="third">
<el-row>
<el-col :span="2">
<div class="text">恢复操作:</div>
</el-col>
<el-col :span="22">
<FormTable ref="thirdFormTable" :tableData="thirdFormData"></FormTable>
</el-col>
</el-row>
</div>
</div>
<template #footer>
@ -47,6 +45,7 @@ import Button from '@screen/components/Buttons/Button.vue';
import request from '@/utils/request';
import { Message } from "element-ui";
import { throttle } from "lodash"
import { isDate } from 'mathjs';
export default {
@ -77,12 +76,8 @@ export default {
title: '事件确认',
dialogType: 1,
planId: 0,
plans: [],
submitting: false,
formData: {
eventCategory: 1,
eventType: 1,
triggerMechanism: 1
},
secondFormData: [{
deviceType: 1,
searchRule: 1,
@ -180,15 +175,6 @@ export default {
label: '小于(<)'
},
],
rules: {
planName: [
{ required: true, message: '请输入预案名称', trigger: 'blur' },
],
eventType: [
{ required: true, message: '请选择事件类型', trigger: 'change' }
],
}
}
},
mounted() {
@ -198,8 +184,10 @@ export default {
modelVisible: {
get() {
if (this.visible) {
this.planName = this.info[0]?.planName || '';
this.dcExecuteAction = this.info[0]?.dcExecuteAction || [];
if (this.info.length > 0) {
this.planName = this.info[0]?.planName || '';
this.initData(this.info[0]);
}
}
return this.visible;
},
@ -210,26 +198,37 @@ export default {
},
methods: {
initData(data) {
this.planId = data.id;
this.formData = {
eventCategory: data.eventCategory,
planName: data.planName,
eventType: data.eventType,
triggerMechanism: data.triggerMechanism,
}
this.secondFormData = [];
this.thirdFormData = [];
dcExecuteAction.forEach(it => {
if (it.deviceList) {
it.deviceList = it.deviceList.split(',');
console.log('data', data)
if (!data) return;
// this.planId = data.id;
let dcExecuteAction = data.dcExecuteAction;
let secondFormData = [];
let thirdFormData = [];
dcExecuteAction.forEach(it => {
let action = { ...it };
if (it.otherConfig) {
let config = JSON.parse(it.otherConfig);
let qbb = ''
if (config.id) {
qbb = config.content;
config = { dcInfoBoardTemplate: config };
}
if (it.actionType == 1) {
this.secondFormData.push(it);
} else if (it.actionType == 2) {
this.thirdFormData.push(it);
}
})
// if (config.state) {
// config.gzms = config.state
// }
action = { ...it, ...config, qbb: qbb };
}
if (it.deviceList) {
action.deviceList = it.deviceList.split(',').map(str => Number(str));
}
if (it.actionType == 1) {
secondFormData.push(action);
} else if (it.actionType == 2) {
thirdFormData.push(action);
}
})
this.secondFormData = secondFormData;
this.thirdFormData = thirdFormData;
},
async loadData() {
if (this.deviceData.length <= 0) {
@ -238,91 +237,20 @@ export default {
method: "get",
})
if (result.code != 200) return Message.error(result?.msg);
console.log('123');
// console.log('123');
this.deviceData = result.data;
// return result.data;
}
return this.deviceData;
},
changeEventType(value = 1) {
this.mechanismOptions = optionsMap[this.formData.eventCategory || 1][value];
},
changeRadio(value = 1) {
const optionsMap = {
1: [{
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: '路障清除'
}],
2: [{
value: 1,
label: '异常天气'
},
{
value: 2,
label: '拥堵'
},
{
value: 3,
label: '非机动车'
},
{
value: 4,
label: '行人'
},
{
value: 5,
label: '烟火'
},
{
value: 6,
label: '抛洒物'
},
{
value: 7,
label: '逆行'
},
]
}
this.eventOptions = optionsMap[value];
this.changeEventType();
},
handleChange() {
changeRadio(value) {
console.log('va', value)
let plan = this.info.find(it => it.planName == value);
console.log('plan', plan)
this.initData(plan);
},
formatData(it, value = 1) {
let data = { ...it, actionType: value }
let data = { ...it, actionType: value, emergencyPlansId: id }
if (it.deviceList && typeof it.deviceList !== 'string' && it.deviceList.length > 0) {
data.deviceList = it.deviceList.join(',');
} else {
@ -334,12 +262,16 @@ export default {
if (it.controlModel) {
let other = {
controlModel: it.controlModel,
controlModelName: controlModelMap[it.controlModel],
state: it.state,
name: gzztMap[it.state]
}
if (it.time && it?.time[0]) {
other = {
controlModel: it.controlModel,
controlModelName: controlModelMap[it.controlModel],
state: it.state,
name: gzztMap[it.state],
startTime: it.time[0],
endTime: it.time[1]
}
@ -349,74 +281,55 @@ export default {
if (it.gzms) {
data.otherConfig = JSON.stringify({
state: it.gzms,
name: gzmsMap[it.gzms],
operationDuration: it.operationDuration,
})
}
return data;
},
handleSubmit() {
this.$refs['ruleForm'].validate((valid) => {
if (valid) {
// this.submitting = false;
let secondFormTable = this.$refs['secondFormTable'].tableData || [];
let thirdFormTable = this.$refs['thirdFormTable'].tableData || [];
let dcArr = [];
secondFormTable.forEach(it => {
dcArr.push(this.formatData(it, 1));
})
thirdFormTable.forEach(it => {
dcArr.push(this.formatData(it, 2));
})
console.log({
...this.formData,
dcExecuteAction: dcArr
})
// return;
if (this.dialogType == 1) {//
request({
url: `/business/plans`,
method: "post",
data: {
...this.formData,
dcExecuteAction: dcArr
}
}).then((result) => {
if (result.code != 200) return Message.error(result?.msg);
Message.success("提交成功");
this.modelVisible = false;
}).catch(() => {
Message.error("提交失败");
}).finally(() => {
this.submitting = false;
this.$emit('reInitData', true);
})
} else if (this.dialogType == 2) {//
request({
url: `/business/plans`,
method: "put",
data: {
...this.formData,
id: this.planId,
dcExecuteAction: dcArr
}
}).then((result) => {
if (result.code != 200) return Message.error(result?.msg);
Message.success("提交成功");
this.modelVisible = false;
}).catch(() => {
Message.error("提交失败");
}).finally(() => {
this.submitting = false;
this.$emit('reInitData', true);
})
// this.submitting = false;
let secondFormTable = this.$refs['secondFormTable'].tableData || [];
let thirdFormTable = this.$refs['thirdFormTable'].tableData || [];
console.log('12', thirdFormTable);
let dcArr = [];
let id = '';
if (this.dialogType == 2) id = this.planId;
secondFormTable.forEach(it => {
dcArr.push(this.formatData(it, 1, id));
})
thirdFormTable.forEach(it => {
dcArr.push(this.formatData(it, 2, id));
})
}
console.log({
dcExecuteAction: dcArr
})
return;
if (this.dialogType == 1) {//
} else if (this.dialogType == 2) {//
// request({
// url: `/business/plans`,
// method: "put",
// data: {
// ...this.formData,
// id: this.planId,
// dcExecuteAction: dcArr
// }
// }).then((result) => {
// if (result.code != 200) return Message.error(result?.msg);
// Message.success("");
// this.modelVisible = false;
// }).catch(() => {
// Message.error("");
// }).finally(() => {
// this.submitting = false;
// this.$emit('reInitData', true);
// })
}
}
})
}
}

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

@ -187,7 +187,6 @@ export default {
},
onSubmit() {
this.isShowDialog = true;
let url = '/business/plans/list/warning/type'
if (this.activeName == '-1') {
url = '/business/plans/list/warning/type'
@ -201,6 +200,7 @@ export default {
}).then(result => {
if (result.code != 200) return Message.error(result?.msg);
this.info = result.data;
this.isShowDialog = true;
})
}

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

File diff suppressed because it is too large

BIN
ruoyi-ui/src/views/JiHeExpressway/pages/control/manual/events/img.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 369 KiB

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

@ -0,0 +1,42 @@
<template>
<div class='comp_box'>
<img src="./img.png" />
</div>
</template>
<script>
export default {
name: 'InDevelopment',
components: {
},
props: {
text: {
type: String,
default: "暂无数据"
}
},
mounted() {
}
}
</script>
<style lang='scss' scoped>
.comp_box {
// padding-top:160px;
width: 100%;
height: 100%;
color: #8A9EAA;
display: flex;
justify-content: center;
align-items: center;
position: relative;
img {
position: absolute;
left: 0;
top: 0;
bottom: 0;
right: 0;
}
}
</style>

BIN
ruoyi-ui/src/views/JiHeExpressway/pages/control/manual/statistic/img.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 496 KiB

42
ruoyi-ui/src/views/JiHeExpressway/pages/control/manual/statistic/index.vue

@ -0,0 +1,42 @@
<template>
<div class='comp_box'>
<img src="./img.png" />
</div>
</template>
<script>
export default {
name: 'InDevelopment',
components: {
},
props:{
text:{
type:String,
default:"暂无数据"
}
},
mounted() {
}
}
</script>
<style lang='scss' scoped>
.comp_box {
// padding-top:160px;
width: 100%;
height: 100%;
color: #8A9EAA;
display: flex;
justify-content: center;
align-items: center;
position: relative;
img{
position: absolute;
left: 0;
top:0;
bottom: 0;
right: 0;
}
}
</style>

39
ruoyi-ui/src/views/JiHeExpressway/pages/control/qrCode/index.vue

@ -0,0 +1,39 @@
<template>
<div class='comp_box'>
<iframe class="iframe" src="https://10.0.81.202:83/alarm-ui/single?u=pDo/guSkRP8=&p=u4johJJOFTyugiay04vYxQ==&t=za4NgrFfeTdF76uSUrhJuA==&route=/warning/QRCode" frameborder="0"></iframe>
</div>
</template>
<script>
export default {
name: 'InDevelopment',
components: {
},
props:{
text:{
type:String,
default:"暂无数据"
}
},
mounted() {
}
}
</script>
<style lang='scss' scoped>
.comp_box {
// padding-top:160px;
width: 100%;
height: 100%;
color: #8A9EAA;
display: flex;
justify-content: center;
align-items: center;
position: relative;
.iframe {
position: absolute;
left: 0; top:0; width: 100%; height: 100%;
}
}
</style>

18
ruoyi-ui/src/views/JiHeExpressway/pages/service/publicService/components/auditAnalytics/assets/charts.js

@ -34,7 +34,7 @@ for (var i = 0; i < res.length; i++) {
});
if (res[i].name != "") legendData.push(res[i].name);
}
let decoDelta = 48;
var options = {
color: ["#5CC5FF", "#54EFD5", "#FD9666", "#5C8CFE", "#51D5AD"],
title: [
@ -154,7 +154,7 @@ var options = {
coordinateSystem: "none",
renderItem: (params, api) => {
let x0 = api.getWidth() / 2;
let y0 = api.getHeight() / 2 - 59;
let y0 = api.getHeight() / 2 - decoDelta;
let r = (Math.min(api.getWidth(), api.getHeight()) / 2) * 0.5;
return {
type: "circle",
@ -181,7 +181,7 @@ var options = {
type: "arc",
shape: {
cx: api.getWidth() / 2,
cy: api.getHeight() / 2 - 59,
cy: api.getHeight() / 2 - decoDelta,
r: (Math.min(api.getWidth(), api.getHeight()) / 2) * 0.5,
startAngle: ((350 + -angle) * Math.PI) / 180,
endAngle: ((120 + -angle) * Math.PI) / 180,
@ -201,7 +201,7 @@ var options = {
coordinateSystem: "none",
renderItem: (params, api) => {
let x0 = api.getWidth() / 2;
let y0 = api.getHeight() / 2 - 59;
let y0 = api.getHeight() / 2 - decoDelta;
let r = (Math.min(api.getWidth(), api.getHeight()) / 2) * 0.5;
return {
type: "circle",
@ -228,7 +228,7 @@ var options = {
type: "arc",
shape: {
cx: api.getWidth() / 2,
cy: api.getHeight() / 2 - 59,
cy: api.getHeight() / 2 - decoDelta,
r: (Math.min(api.getWidth(), api.getHeight()) / 2) * 0.5,
startAngle: ((150 + -angle) * Math.PI) / 180,
endAngle: ((-30 + -angle) * Math.PI) / 180,
@ -248,7 +248,7 @@ var options = {
coordinateSystem: "none",
renderItem: (params, api) => {
let x0 = api.getWidth() / 2;
let y0 = api.getHeight() / 2 - 59;
let y0 = api.getHeight() / 2 - decoDelta;
let r = (Math.min(api.getWidth(), api.getHeight()) / 2) * 0.56;
return {
type: "circle",
@ -275,7 +275,7 @@ var options = {
type: "arc",
shape: {
cx: api.getWidth() / 2,
cy: api.getHeight() / 2 - 59,
cy: api.getHeight() / 2 - decoDelta,
r: (Math.min(api.getWidth(), api.getHeight()) / 2) * 0.56,
startAngle: ((590 + -angle) * Math.PI) / 180,
endAngle: ((350 + -angle) * Math.PI) / 180,
@ -295,7 +295,7 @@ var options = {
coordinateSystem: "none",
renderItem: (params, api) => {
let x0 = api.getWidth() / 2;
let y0 = api.getHeight() / 2 - 59;
let y0 = api.getHeight() / 2 - decoDelta;
let r = (Math.min(api.getWidth(), api.getHeight()) / 2) * 0.56;
return {
type: "circle",
@ -322,7 +322,7 @@ var options = {
type: "arc",
shape: {
cx: api.getWidth() / 2,
cy: api.getHeight() / 2 - 59,
cy: api.getHeight() / 2 - decoDelta,
r: (Math.min(api.getWidth(), api.getHeight()) / 2) * 0.56,
startAngle: ((90 + -angle) * Math.PI) / 180,
endAngle: ((160 + -angle) * Math.PI) / 180,

6
ruoyi-ui/src/views/JiHeExpressway/pages/service/publicService/components/auditAnalytics/index.vue

@ -42,10 +42,10 @@ export default {
<style lang='scss' scoped>
.congestion {
width: 100%;
display: flex; flex-direction: column;
.board {
height: 346px;
width: 100%;
flex: 1;
padding: 0px 20px;
background: linear-gradient(180deg, rgba(6, 66, 88, 0.2) 0%, #064258 100%);
border-radius: 5px 5px 5px 5px;
@ -60,7 +60,7 @@ export default {
}
.charts {
height: 376px;
height: 100%;
width: 100%;
}
</style>

17
ruoyi-ui/src/views/JiHeExpressway/pages/service/publicService/components/channelAnalytics/assets/charts.js

@ -36,6 +36,7 @@ for (var i = 0; i < res.length; i++) {
if (res[i].name != "") legendData.push(res[i].name);
}
let angle = 0; //角度,用来做简单的动画效果的
let decoDelta = 48;
var options = {
color: ["#68F4DD", "#FFDD69", "#3CC3F0", "#5C8CFE", "#51D5AD"],
title: [
@ -155,7 +156,7 @@ var options = {
coordinateSystem: "none",
renderItem: (params, api) => {
let x0 = api.getWidth() / 2;
let y0 = api.getHeight() / 2 - 59;
let y0 = api.getHeight() / 2 - decoDelta;
let r = (Math.min(api.getWidth(), api.getHeight()) / 2) * 0.5;
return {
type: "circle",
@ -182,7 +183,7 @@ var options = {
type: "arc",
shape: {
cx: api.getWidth() / 2,
cy: api.getHeight() / 2 - 59,
cy: api.getHeight() / 2 - decoDelta,
r: (Math.min(api.getWidth(), api.getHeight()) / 2) * 0.5,
startAngle: ((350 + -angle) * Math.PI) / 180,
endAngle: ((120 + -angle) * Math.PI) / 180,
@ -202,7 +203,7 @@ var options = {
coordinateSystem: "none",
renderItem: (params, api) => {
let x0 = api.getWidth() / 2;
let y0 = api.getHeight() / 2 - 59;
let y0 = api.getHeight() / 2 - decoDelta;
let r = (Math.min(api.getWidth(), api.getHeight()) / 2) * 0.5;
return {
type: "circle",
@ -229,7 +230,7 @@ var options = {
type: "arc",
shape: {
cx: api.getWidth() / 2,
cy: api.getHeight() / 2 - 59,
cy: api.getHeight() / 2 - decoDelta,
r: (Math.min(api.getWidth(), api.getHeight()) / 2) * 0.5,
startAngle: ((150 + -angle) * Math.PI) / 180,
endAngle: ((-30 + -angle) * Math.PI) / 180,
@ -249,7 +250,7 @@ var options = {
coordinateSystem: "none",
renderItem: (params, api) => {
let x0 = api.getWidth() / 2;
let y0 = api.getHeight() / 2 - 59;
let y0 = api.getHeight() / 2 - decoDelta;
let r = (Math.min(api.getWidth(), api.getHeight()) / 2) * 0.56;
return {
type: "circle",
@ -276,7 +277,7 @@ var options = {
type: "arc",
shape: {
cx: api.getWidth() / 2,
cy: api.getHeight() / 2 - 59,
cy: api.getHeight() / 2 - decoDelta,
r: (Math.min(api.getWidth(), api.getHeight()) / 2) * 0.56,
startAngle: ((590 + -angle) * Math.PI) / 180,
endAngle: ((350 + -angle) * Math.PI) / 180,
@ -296,7 +297,7 @@ var options = {
coordinateSystem: "none",
renderItem: (params, api) => {
let x0 = api.getWidth() / 2;
let y0 = api.getHeight() / 2 - 59;
let y0 = api.getHeight() / 2 - decoDelta;
let r = (Math.min(api.getWidth(), api.getHeight()) / 2) * 0.56;
return {
type: "circle",
@ -323,7 +324,7 @@ var options = {
type: "arc",
shape: {
cx: api.getWidth() / 2,
cy: api.getHeight() / 2 - 59,
cy: api.getHeight() / 2 - decoDelta,
r: (Math.min(api.getWidth(), api.getHeight()) / 2) * 0.56,
startAngle: ((90 + -angle) * Math.PI) / 180,
endAngle: ((160 + -angle) * Math.PI) / 180,

6
ruoyi-ui/src/views/JiHeExpressway/pages/service/publicService/components/channelAnalytics/index.vue

@ -42,9 +42,9 @@ export default {
<style lang='scss' scoped>
.congestion {
width: 100%;
display: flex; flex-direction: column;
.board {
height: 346px;
flex: 1;
width: 100%;
padding: 0px 20px;
background: linear-gradient(180deg, rgba(6, 66, 88, 0.2) 0%, #064258 100%);
@ -60,7 +60,7 @@ export default {
}
.charts {
height: 376px;
height: 100%;
width: 100%;
}
</style>

18
ruoyi-ui/src/views/JiHeExpressway/pages/service/publicService/components/eventTypeAnalysis/assets/charts.js

@ -51,7 +51,7 @@ for (var i = 0; i < res.length; i++) {
});
if (res[i].name != "") legendData.push(res[i].name);
}
let decoDelta = 48;
var options = {
color: [
"#2867FF",
@ -180,7 +180,7 @@ var options = {
coordinateSystem: "none",
renderItem: (params, api) => {
let x0 = api.getWidth() / 2;
let y0 = api.getHeight() / 2 - 59;
let y0 = api.getHeight() / 2 - decoDelta;
let r = (Math.min(api.getWidth(), api.getHeight()) / 2) * 0.5;
return {
type: "circle",
@ -207,7 +207,7 @@ var options = {
type: "arc",
shape: {
cx: api.getWidth() / 2,
cy: api.getHeight() / 2 - 59,
cy: api.getHeight() / 2 - decoDelta,
r: (Math.min(api.getWidth(), api.getHeight()) / 2) * 0.5,
startAngle: ((350 + -angle) * Math.PI) / 180,
endAngle: ((120 + -angle) * Math.PI) / 180,
@ -227,7 +227,7 @@ var options = {
coordinateSystem: "none",
renderItem: (params, api) => {
let x0 = api.getWidth() / 2;
let y0 = api.getHeight() / 2 - 59;
let y0 = api.getHeight() / 2 - decoDelta;
let r = (Math.min(api.getWidth(), api.getHeight()) / 2) * 0.5;
return {
type: "circle",
@ -254,7 +254,7 @@ var options = {
type: "arc",
shape: {
cx: api.getWidth() / 2,
cy: api.getHeight() / 2 - 59,
cy: api.getHeight() / 2 - decoDelta,
r: (Math.min(api.getWidth(), api.getHeight()) / 2) * 0.5,
startAngle: ((150 + -angle) * Math.PI) / 180,
endAngle: ((-30 + -angle) * Math.PI) / 180,
@ -274,7 +274,7 @@ var options = {
coordinateSystem: "none",
renderItem: (params, api) => {
let x0 = api.getWidth() / 2;
let y0 = api.getHeight() / 2 - 59;
let y0 = api.getHeight() / 2 - decoDelta;
let r = (Math.min(api.getWidth(), api.getHeight()) / 2) * 0.56;
return {
type: "circle",
@ -301,7 +301,7 @@ var options = {
type: "arc",
shape: {
cx: api.getWidth() / 2,
cy: api.getHeight() / 2 - 59,
cy: api.getHeight() / 2 - decoDelta,
r: (Math.min(api.getWidth(), api.getHeight()) / 2) * 0.56,
startAngle: ((590 + -angle) * Math.PI) / 180,
endAngle: ((350 + -angle) * Math.PI) / 180,
@ -321,7 +321,7 @@ var options = {
coordinateSystem: "none",
renderItem: (params, api) => {
let x0 = api.getWidth() / 2;
let y0 = api.getHeight() / 2 - 59;
let y0 = api.getHeight() / 2 - decoDelta;
let r = (Math.min(api.getWidth(), api.getHeight()) / 2) * 0.56;
return {
type: "circle",
@ -348,7 +348,7 @@ var options = {
type: "arc",
shape: {
cx: api.getWidth() / 2,
cy: api.getHeight() / 2 - 59,
cy: api.getHeight() / 2 - decoDelta,
r: (Math.min(api.getWidth(), api.getHeight()) / 2) * 0.56,
startAngle: ((90 + -angle) * Math.PI) / 180,
endAngle: ((160 + -angle) * Math.PI) / 180,

8
ruoyi-ui/src/views/JiHeExpressway/pages/service/publicService/components/eventTypeAnalysis/index.vue

@ -1,5 +1,5 @@
<template>
<div class='congestion '>
<div class='congestion'>
<WgtTitle :title="'今日发布事件类型分析'"></WgtTitle>
<div class="board">
<div class="charts keep-ratio" id="eventTypeAnalysis"></div>
@ -42,10 +42,10 @@ export default {
<style lang='scss' scoped>
.congestion {
width: 100%;
display: flex; flex-direction: column;
.board {
height: 346px;
width: 100%;
flex: 1;
padding: 0px 20px;
background: linear-gradient(180deg, rgba(6, 66, 88, 0.2) 0%, #064258 100%);
border-radius: 5px 5px 5px 5px;
@ -60,7 +60,7 @@ export default {
}
.charts {
height: 376px;
height: 100%;
width: 100%;
}
</style>

7
ruoyi-ui/src/views/JiHeExpressway/pages/service/publicService/components/nucleusThrough/index.vue

@ -2,7 +2,7 @@
<div class="congestion">
<WgtTitle :title="'月审核通过趋势分析'"></WgtTitle>
<div class="board">
<div class="searchPanel_1">
<div class="searchPanel_1 keep-ratio">
<el-date-picker
size="mini"
type="month"
@ -66,12 +66,11 @@ export default {
<style lang="scss" scoped>
.congestion {
width: 100%;
display: flex; flex-direction: column;
.board {
position: relative;
height: 300px;
width: 100%;
flex: 1;
padding: 0px 20px;
background: linear-gradient(180deg, rgba(6, 66, 88, 0.2) 0%, #064258 100%);
border-radius: 5px 5px 5px 5px;

6
ruoyi-ui/src/views/JiHeExpressway/pages/service/publicService/components/postTrendsDay/index.vue

@ -42,10 +42,10 @@ export default {
<style lang='scss' scoped>
.congestion {
width: 100%;
display: flex; flex-direction: column;
.board {
height: 346px;
width: 100%;
flex: 1;
padding: 0px 20px;
background: linear-gradient(180deg, rgba(6, 66, 88, 0.2) 0%, #064258 100%);
border-radius: 5px 5px 5px 5px;
@ -60,7 +60,7 @@ export default {
}
.charts {
height: 346px;
height: 100%;
width: 100%;
}
</style>

8
ruoyi-ui/src/views/JiHeExpressway/pages/service/publicService/components/postTrendsMonth/index.vue

@ -2,7 +2,7 @@
<div class="congestion">
<WgtTitle title="月发布渠道趋势分析"></WgtTitle>
<div class="board">
<div class="searchPanel_1">
<div class="searchPanel_1 keep-ratio">
<el-date-picker
size="mini"
class="selectRoad"
@ -58,12 +58,10 @@ export default {
<style lang="scss" scoped>
.congestion {
width: 100%;
display: flex; flex-direction: column;
.board {
flex: 1;
position: relative;
height: 300px;
width: 100%;
padding: 0px 20px;
background: linear-gradient(180deg, rgba(6, 66, 88, 0.2) 0%, #064258 100%);
border-radius: 5px 5px 5px 5px;

2
ruoyi-ui/src/views/JiHeExpressway/pages/service/publicService/components/topComponent/index.vue

@ -144,7 +144,6 @@ export default {
.TrafficFlow {
width: 100%;
height: 182px;
display: inline-flex;
position: relative;
z-index: 6;
@ -247,6 +246,7 @@ export default {
justify-content: center;
align-items: center;
}
.item:last-child::after{ background: none;}
}
}
</style>

131
ruoyi-ui/src/views/JiHeExpressway/pages/service/publicService/index.vue

@ -1,25 +1,23 @@
<template>
<div class="TrafficFlow">
<section class="foot">
<el-tabs class="footTabs" v-model="activeName" @tab-click="changeTabs">
<el-tab-pane label="公众服务统计分析" name="first">
<div class="header-shot">
<TopComponent />
<div class="public_service_statistic">
<el-tabs class="content_tab" v-model="activeName" @tab-click="changeTabs">
<el-tab-pane label="公众服务统计分析" name="first" class="first_tab">
<TopComponent class="line_01"/>
<div class="line_02">
<ChannelAnalytics class="unit" />
<EventTypeAnalysis class="unit" />
<AuditAnalytics class="unit" />
<PostTrendsDay class="unit" />
</div>
<div class="content">
<ChannelAnalytics class="content-l" />
<EventTypeAnalysis class="content-l" />
<AuditAnalytics class="content-l" />
<PostTrendsDay class="content-l" style="margin-right: 0" />
</div>
<div class="content">
<PostTrendsMonth class="content-mi" />
<NucleusThrough class="content-mi" style="margin-right: 0" />
<div class="line_03">
<PostTrendsMonth class="unit" />
<NucleusThrough class="unit" />
</div>
</el-tab-pane>
<el-tab-pane label="公众服务统计查询" name="second"> </el-tab-pane>
</el-tabs>
</section>
</div>
</template>
@ -76,90 +74,41 @@ export default {
opacity: 0.1;
}
.footTabs {
display: inline;
width: 100%;
}
.TrafficFlow {
.public_service_statistic {
width: 100%;
height: 100%;
position: relative;
padding: 15px;
display: flex; justify-content: stretch; align-items: stretch;
// position: relative;
z-index: 6;
color: white;
overflow: hidden;
.header-shot {
width: 98%;
margin: auto;
margin-top: 15px;
height: 160px;
.content_tab{
display: flex; flex-direction: column; flex: 1;
::v-deep .el-tabs__header{}
::v-deep .el-tabs__content{ flex: 1;}
}
.content {
width: 100%;
margin: auto;
display: flex;
flex: 1;
pointer-events: none;
margin-top: 19px;
--keep-ratio: scaleX(1);
> div {
pointer-events: auto;
}
.content-l {
width: calc(25%);
margin-right: 20px;
}
.content-mi {
width: calc(50%);
margin-right: 20px;
}
.content-m {
display: inline-flex;
flex-direction: column;
width: calc(100% / 4);
margin-right: 20px;
.content-m-t {
width: 100%;
height: 240px;
margin-bottom: 20px;
}
}
.content-r {
width: 49.4%;
}
}
.foot {
width: 98%;
margin: auto;
display: flex;
justify-content: space-between;
flex: 1;
pointer-events: none;
margin-top: 8px;
> div {
pointer-events: auto;
}
.foot-w {
width: 100%;
}
.foot-l {
width: 726px;
.first_tab{
width: 100%; height: 100%; display: flex; flex-direction: column;
.line_01 {
flex-basis: 140px; margin-bottom: 16px;
}
.foot-m {
width: 613px;
.line_02{
flex: 1;
height: 0;
display: flex;
margin-bottom: 16px;
.unit{ margin-right: 16px; flex: 1; width: 0;}
.unit:last-child{ margin-right: 0;}
}
.foot-r {
width: 493px;
.line_03{
height: 0;
flex: 1;
display: flex; align-items: stretch;
.unit{ margin-right: 16px; flex: 1; }
.unit:last-child{ margin-right: 0;}
}
}
}

20
ruoyi-ui/src/views/JiHeExpressway/utils/deviceControl.js

@ -0,0 +1,20 @@
export async function handle3CResult(data, formData, requestURL) {
switch (data.mode) {
case "00":
formData.onWorkStatus = data.onWorkStatus;
formData.inWorkStatus = data.inWorkStatus;
break;
case "01":
case "02":
await requestURL("3C")
.then((data2) => {
formData.onWorkStatus = data2.onWorkStatus;
formData.inWorkStatus = data2.inWorkStatus;
if (data.mode === "01")
formData.displayTime = [data.startDisplay, data.endDisplay];
})
.catch(() => {});
break;
}
}

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

@ -254,7 +254,7 @@ export const WarningSubclassList = Object.keys(WarningSubclass).reduce(
export const LaneOccupancy = {
0: {
text: "应急车道",
text: "应急",
},
1: {
text: "行1",
@ -307,3 +307,25 @@ export const ChildTypes = {
1: CameraChildTypes,
2: BoardChildTypes,
};
export const DirectionTypes = {
1: "菏泽方向",
3: "济南方向",
2: "双向",
};
//行车诱导相关
export const controlModelMap = {
"00": "手动模式",
"01": "自动模式",
"02": "万年历",
};
export const gzztMap = {
"00": "不更新",
"01": "常亮",
"02": "流水",
"03": "闪烁",
"04": "关闭",
};

3
ruoyi-ui/vue.config.js

@ -56,7 +56,8 @@ module.exports = {
// 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.65.103:8097`,
target: `http://10.168.76.181:8087`, //王家宝
// target: `http://10.168.65.103:8097`,
changeOrigin: true,
pathRewrite: {
["^" + process.env.VUE_APP_BASE_API]: "",

Loading…
Cancel
Save