Browse Source

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

wangqin
qingzhengli 10 months ago
parent
commit
eaacb9bf6b
  1. 22
      ruoyi-ui/src/api/commandDispatch/index.js
  2. 10
      ruoyi-ui/src/views/JiHeExpressway/components/Card1/index.vue
  3. 27
      ruoyi-ui/src/views/JiHeExpressway/components/Descriptions.vue
  4. 2
      ruoyi-ui/src/views/JiHeExpressway/components/Dialog/index.vue
  5. 18
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/AMapContainer/index.vue
  6. 2
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/FatigueWakesUp/components/DeviceControlDialog.vue
  7. 5
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/PerceiveEvent/index.vue
  8. 5
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/components/PeopleCard/index.vue
  9. 26
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/views/firstResponders/components/AddNEditDialog.vue
  10. 2
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/views/firstResponders/index.vue
  11. 83
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/CrowdnessIndicatorRankings/charts.js
  12. 158
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/CrowdnessIndicatorRankings/index.vue
  13. 51
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/DeviceControl/index.vue
  14. 207
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/DeviceControl/utils.js
  15. 187
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/DispatchLiaison/StatsDialogVisible/index.vue
  16. 203
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/DispatchLiaison/index.vue
  17. BIN
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/EventInformation/images/lane.jpg
  18. 79
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/EventInformation/images/lane.svg
  19. 15
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/EventInformation/index.vue
  20. 11
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/ReleaseInformation/index.vue
  21. 101
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/index.vue
  22. 413
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/plan/addAndEditDialog/ScopeTable.vue
  23. 472
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/plan/addAndEditDialog/index copy.vue
  24. 259
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/plan/addAndEditDialog/index.vue
  25. 58
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/plan/data.js
  26. 14
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/plan/index.vue
  27. 34
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/plan/qbbDialog/index.vue
  28. 86
      ruoyi-ui/src/views/JiHeExpressway/utils/enum.js
  29. 6
      ruoyi-ui/vue.config.js

22
ruoyi-ui/src/api/commandDispatch/index.js

@ -0,0 +1,22 @@
import request from "@/utils/request";
// 查询事件气象
export function WeatherForecast(lng, lat) {
return request({
url:
"/weatherForecast/queryTheSpecifiedLatitudeAndLongitudeWeather/" +
lng +
"/" +
lat,
method: "get",
});
}
// 查询调度联络
export function commandDispatch(data) {
return request({
url: "/business/warning/commandAndDispatch",
method: "post",
data,
});
}

10
ruoyi-ui/src/views/JiHeExpressway/components/Card1/index.vue

@ -11,7 +11,7 @@
<span>{{ item.label }}: </span>
<span>
<slot :name="`form-${item.key}`" :data="cardData">
{{ getValue(item.key) }}{{ item.suffix }}
{{ getValue(item) }}{{ item.suffix }}
</slot>
</span>
</p>
@ -106,8 +106,12 @@ export default {
};
},
methods: {
getValue(key) {
return pathGet(this.cardData, key) ?? "-";
getValue(item) {
let value = pathGet(this.cardData, item.key) ?? "-";
if (item.value) {
value = item.value(this.cardData);
}
return value;
},
onClick() {

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

@ -1,8 +1,16 @@
<template>
<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)]" v-if="item.visible != false">
<div class="text title" :style="{...transformStyle(titleStyle), width: labelWidth }">
<div
class="item"
v-for="(item, index) in getResolveList"
:key="`${item.key || item.label}${index}`"
:style="[gridStyle(item, index), transformStyle(itemStyle)]"
v-if="item.visible != false"
>
<div
class="text title"
:style="{ ...transformStyle(titleStyle), width: labelWidth }"
>
<p>
<slot :name="`title-${item.key || item.label}`" :data="item">
{{ item.label || "-" }}
@ -10,9 +18,18 @@
</p>
:
</div>
<ContentText :style="transformStyle(titleStyle)" class="content text" :data="data" :_config="item">
<ContentText
:style="transformStyle(titleStyle)"
class="content text"
:data="data"
:_config="item"
>
<template #default="{ value }">
<slot :name="`content-${item.key || item.label}`" :value="value" :data="item">
<slot
:name="`content-${item.key || item.label}`"
:value="value"
:data="item"
>
{{ value }}
</slot>
</template>

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: 2100;
z-index: 1100;
// display: flex;
// align-items: center;
// justify-content: center;

18
ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/AMapContainer/index.vue

@ -53,6 +53,16 @@ export default {
Vue.prototype.mapIns = this.aMapIns;
//
this.trafficLayer = new this.AMap.TileLayer.Traffic({
zIndex: 99999999999,
zooms: [7, 22],
visible: false,
});
this.trafficLayer.setMap(this.aMapIns);
this.trafficLayer.hide();
this.aMapIns.on("complete", () => { //map
this.loading = false;
this.$emit("update:isGisCompleted", true);
@ -211,6 +221,14 @@ export default {
mapIns: this.aMapIns,
};
},
showRoadConditions(visible){
if(visible){
this.trafficLayer.show();
} else {
this.trafficLayer.hide();
}
}
},
// unmounted() {
beforeDestroy() {

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

@ -431,7 +431,7 @@ export default {
//
await request({
url: `/business/device/batchLaserFatigueInvokedFunction`,
url: `/business/device/batchFunctions`,
method: "post",
data: {
deviceId: this.deviceId,

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

@ -3,8 +3,9 @@
<div class="PerceiveEvent">
<!-- <Video class="item-video" /> -->
<div class="video-pic">
<Video style="height: 100%; flex: 1" :showHeader="false" :url="dialogData.formData.videoList[0]"
videoType="mp4" />
<!-- <Video style="height: 100%; flex: 1" :showHeader="false" :url="dialogData.formData.videoList[0]"
videoType="mp4" /> -->
<Carousel style="flex: 1; height: 100%;max-width: 350px;" :videos="dialogData.formData.videoList" />
<Carousel style="flex: 1; height: 100%;max-width: 300px;" :pictures="dialogData.formData.pictures" />
</div>
<LineChart class="chart" />

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

@ -42,6 +42,10 @@ export default {
key: "name",
label: "姓名"
},
{
key: "type",
label: "类型"
},
{
key: "postName",
label: "岗位"
@ -72,6 +76,7 @@ export default {
display: flex;
flex-direction: column;
gap: 6px;
font-size: 14px;
}
.btns {

26
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/views/firstResponders/components/AddNEditDialog.vue

@ -7,7 +7,7 @@
ref="FormConfigRef"
:formList="formList"
column="1"
labelWidth="90px"
labelWidth="100px"
/>
</div>
@ -68,6 +68,24 @@ export default {
},
],
},
{
label: "人员类型:",
key: "employeesType",
required: true,
type: "select",
options: {
options: [
{
key: 1,
label: "路管人员",
},
{
key: 2,
label: "应急人员",
},
],
},
},
{
label: "岗位:",
key: "postId",
@ -127,7 +145,7 @@ export default {
getSelectOptionsStation(2),
]).then(([post, organization]) => {
if (post.status === "fulfilled" && post.value.code == 200) {
this.formList[2].options.options = post.value.data.map((item) => ({
this.formList[3].options.options = post.value.data.map((item) => ({
key: item.postId + "",
label: item.postName,
}));
@ -137,7 +155,7 @@ export default {
organization.status === "fulfilled" &&
Array.isArray(organization.value)
) {
this.formList[3].options.options = organization.value;
this.formList[4].options.options = organization.value;
}
});
},
@ -181,7 +199,7 @@ export default {
<style lang="scss" scoped>
.AddNEditDialog {
width: 450px;
height: 150px;
height: 200px;
display: flex;
flex-direction: column;
gap: 15px;

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

@ -203,7 +203,7 @@ export default {
grid-gap: 9px;
// grid-auto-flow: row;
justify-content: space-between;
grid-auto-rows: minmax(270px, max-content);
grid-auto-rows: minmax(280px, max-content);
position: relative;
}
}

83
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/CrowdnessIndicatorRankings/charts.js

@ -0,0 +1,83 @@
import * as echarts from "echarts";
export const StatChartOption = {
width: "100%",
height: "100%",
color: ["#2AD9FD"],
xAxis: {
name: "日",
type: "category",
// boundaryGap: ["15%", "15%"],
nameTextStyle: {
color: "#2AD9FD",
align: "right",
fontSize: 15,
padding: [0, -15, 0, 0],
},
boundaryGap: false,
data: ["1", "5", "10", "15", "20", "25", "30"],
axisTick: {
show: false,
},
axisLabel: {
color: "#fff",
fontSize: 12,
},
axisLine: {
lineStyle: {
color: "#668598",
},
},
},
grid: {
left: 50,
top: 10,
// bottom: 30,
// right: 30,
},
tooltip: {
trigger: "axis",
valueFormatter: (value) => {
return value + "%";
},
},
yAxis: {
max: 100,
type: "value",
splitLine: {
lineStyle: {
type: [6, 9],
color: "rgba(255,255,255, .3)",
},
},
axisLabel: {
color: "#fff",
fontSize: 12,
formatter: "{value} %",
},
},
series: [
{
data: [0, 90, 65, 90, 45, 36, 27],
type: "line",
showSymbol: false,
smooth: true,
lineStyle: {
color: "#2AD9FD",
},
areaStyle: {
opacity: 0.8,
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{
offset: 0,
color: "rgb(90, 227, 255, .9)",
},
{
offset: 1,
color: "rgba(42,217,253,0)",
},
]),
},
},
],
};

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

@ -1,17 +1,46 @@
<template>
<Card class='CrowdnessIndicatorRankings border' title="拥挤度指标排名情况">
<Card class="CrowdnessIndicatorRankings border" title="拥挤度指标排名情况">
<div class="map">
<AMapContainer v-if="delayLoad" style="z-index: 9;" />
<AMapContainer ref="AMapContainerRef" v-if="delayLoad" style="z-index: 9" />
</div>
<div class="right border">
<div :class="['item', { active: isActive(item) }]" v-for="item in operation" :key="item.key"
@click="handleClick(item)">
<ElPopover trigger="manual" :value="isActive(item)" :disabled="item.key !== 'weather'" placement="left">
<div v-if="item.key === 'weather'">
天气 能见度 风向西南 风力1
<div
:class="['item', { active: isActive(item) }]"
v-for="item in operation"
:key="item.key"
@click="handleClick(item)"
>
<div
v-if="item.key === 'bar'"
class="label"
slot="reference"
:style="{
backgroundImage: `url(${require(`./images/${item.key}${
isActive(item) ? '-active' : ''
}.svg`)})`,
}"
/>
<ElPopover v-else trigger="manual" :value="isActive(item)" placement="left">
<div v-if="item.key === 'weather'" class="weather">
<span>天气{{ weatherData.text }}</span>
<span>能见度{{ weatherData.vis }}公里</span>
<span>风向{{ weatherData.windDir }}</span>
<span>风力{{ weatherData.windScale }}</span>
</div>
<div class="label" slot="reference"
:style="{ backgroundImage: `url(${require(`./images/${item.key}${isActive(item) ? '-active' : ''}.svg`)})` }" />
<div
v-else-if="item.key === 'pie'"
class="statistics"
id="statChartRef"
></div>
<div
class="label"
slot="reference"
:style="{
backgroundImage: `url(${require(`./images/${item.key}${
isActive(item) ? '-active' : ''
}.svg`)})`,
}"
/>
</ElPopover>
</div>
</div>
@ -19,15 +48,18 @@
</template>
<script>
import Card from "@screen/components/Card2/Card.vue";;
import AMapContainer from "@screen/pages/Home/components/AMapContainer/index.vue"
import { provideMixin } from "./../../mixin"
import Card from "@screen/components/Card2/Card.vue";
import AMapContainer from "@screen/pages/Home/components/AMapContainer/index.vue";
import { provideMixin } from "./../../mixin";
import { WeatherForecast } from "@/api/commandDispatch";
import * as echarts from "echarts";
import { StatChartOption } from "./charts";
export default {
name: 'CrowdnessIndicatorRankings',
name: "CrowdnessIndicatorRankings",
components: {
Card,
AMapContainer
AMapContainer,
},
mixins: [provideMixin],
data() {
@ -35,58 +67,78 @@ export default {
active: [],
operation: [
{
key: 'weather',
label: "天气"
key: "weather",
label: "天气",
},
{
key: 'camera',
label: "摄像机"
key: "camera",
label: "附近相机",
},
{
key: 'bar',
label: "柱状图"
key: "bar",
label: "线路通行情况",
},
{
key: 'level',
label: "天气"
key: "level",
label: "情报板",
},
// {
// key: "car",
// label: "",
// },
{
key: 'car',
label: "天气"
},
{
key: 'pie',
label: "天气"
key: "pie",
label: "断面车流量",
},
],
delayLoad: false
}
delayLoad: true,
weatherData: {},
};
},
computed: {
isActive() {
return item => this.active.includes(item.key)
}
return (item) => this.active.includes(item.key);
},
},
methods: {
handleClick(item) {
const findIndex = this.active.indexOf(item.key);
if (findIndex === -1) this.active.push(item.key);
else
this.active.splice(findIndex, 1)
}
},
mounted() {
setTimeout(() => {
this.delayLoad = true
}, 240);
else this.active.splice(findIndex, 1);
if (item.key === "weather") {
this.getWeatherForecast();
} else if (item.key === "pie") {
this.$nextTick(() => {
const statChart = echarts.init(
document.getElementById("statChartRef")
);
statChart.setOption(StatChartOption);
});
} else if (item.key === 'bar'){
this.$refs.AMapContainerRef.showRoadConditions(findIndex === -1)
}
},
getWeatherForecast() {
WeatherForecast(117.2, 36.65).then((res) => {
this.weatherData =
res.data.weatherInTheAreaWhereTheIncidentOccurred.now;
console.log("气象", res);
});
},
},
}
mounted() {},
};
</script>
<style lang='scss' scoped>
<style lang="scss" scoped>
.border {
border: 1px solid;
border-image: linear-gradient(360deg, rgba(55, 231, 255, .42), rgba(55, 231, 255, 0)) 1 1;
border-image: linear-gradient(
360deg,
rgba(55, 231, 255, 0.42),
rgba(55, 231, 255, 0)
)
1 1;
}
.CrowdnessIndicatorRankings {
@ -108,7 +160,11 @@ export default {
height: 100%;
top: 0;
width: 34px;
background: linear-gradient(180deg, rgba(25, 40, 52, .6) 0%, rgba(28, 50, 60, .6) 100%);
background: linear-gradient(
180deg,
rgba(25, 40, 52, 0.6) 0%,
rgba(28, 50, 60, 0.6) 100%
);
border-right: 0;
border-bottom: 0;
@ -125,7 +181,7 @@ export default {
div {
width: 100%;
height: 100%;
transition: all .15s linear;
transition: all 0.15s linear;
background-size: 100% 100%;
background-repeat: no-repeat;
background-position: center;
@ -133,8 +189,18 @@ export default {
}
.active {
background: linear-gradient(180deg, #005C79 0%, #009BCC 100%);
background: linear-gradient(180deg, #005c79 0%, #009bcc 100%);
}
}
}
.weather span {
margin-right: 20px;
display: inline-block;
}
.statistics {
width: 300px;
height: 180px;
display: flex;
margin: 5px;
}
</style>

51
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/DeviceControl/index.vue

@ -0,0 +1,51 @@
<template>
<Card class='DeviceControl' title="设备管控">
TODO
</Card>
</template>
<script>
import Card from "@screen/components/Card2/Card.vue";;
import { merge } from "lodash";
import { provideMixin } from "./../../mixin"
export default {
name: 'DeviceControl',
mixins: [provideMixin],
components: {
Card
},
data() {
return {
data: null
}
},
watch: {
data() {
}
},
mounted() {
},
methods: {
},
}
</script>
<style lang='scss' scoped>
.DeviceControl {
::v-deep {
.content {
display: flex;
flex-direction: column;
}
}
}
</style>

207
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/DeviceControl/utils.js

@ -0,0 +1,207 @@
export function getQuadrant(angle) {
angle %= 360.0;
if (angle < 0) angle += 360.0;
var quadrant = Math.floor(angle / 90) + 1;
return quadrant;
}
export function calcPoint(x0, y0, width, height, angle) {
const parseAngle = parseFloat(angle);
angle = (Math.PI / 180) * parseFloat(parseAngle);
x0 += width / 2;
y0 += height / 2;
const hypotenuse = width / 2 > height / 2 ? width / 2 : height / 2;
// 对边
let oppositeEdge = Math.abs(hypotenuse * Math.sin(angle));
// 邻边
let adjacentEdge = Math.abs(hypotenuse * Math.cos(angle));
let point0 = [],
point1 = [];
switch (parseFloat(parseAngle) % 360.0) {
case 180:
oppositeEdge = adjacentEdge;
adjacentEdge = 0;
break;
case 90:
case 270:
adjacentEdge = oppositeEdge;
oppositeEdge = 0;
break;
}
switch (getQuadrant(parseAngle)) {
case 1:
point0 = [x0 - adjacentEdge, y0 + oppositeEdge];
point1 = [x0 + adjacentEdge, y0 - oppositeEdge];
break;
case 2:
point0 = [x0 - adjacentEdge, y0 - oppositeEdge];
point1 = [x0 + adjacentEdge, y0 + oppositeEdge];
break;
case 3:
point0 = [x0 + adjacentEdge, y0 - oppositeEdge];
point1 = [x0 - adjacentEdge, y0 + oppositeEdge];
break;
case 4:
point0 = [x0 + adjacentEdge, y0 + oppositeEdge];
point1 = [x0 - adjacentEdge, y0 - oppositeEdge];
break;
}
return angle > 0 ? [point0, point1] : [point1, point0];
}
export class CanvasFlow {
canvas = null;
context = null;
zoom = 3;
constructor(canvas) {
this.canvas = canvas;
this.context = canvas.getContext("2d");
this.canvas.width = canvas.clientWidth * this.zoom;
this.canvas.height = canvas.clientHeight * this.zoom;
}
drawRectangle({
x,
y,
width,
height,
borderWidth,
borderColor,
backgroundColor,
radius,
}) {
this.context.beginPath();
if (backgroundColor) this.context.fillStyle = backgroundColor;
x *= this.zoom;
y *= this.zoom;
width *= this.zoom;
height *= this.zoom;
if (radius) {
this.context.roundRect(x, y, width, height, radius);
this.context.fill();
} else {
this.context.fillRect(x, y, width, height);
}
if (typeof borderWidth === "number") {
borderWidth *= this.zoom;
this.context.lineWidth = borderWidth;
this.context.strokeStyle = borderColor;
this.context.stroke();
}
}
transformCssLinearGradient(x, y, width, height, linearGradient) {
const [_, deg, ...stopStrings] = linearGradient.match(/[^,()]+/g);
const stops = stopStrings.map((stop) => {
const [color, offset] = stop.trim().split(" ");
return {
color,
offset: parseFloat(offset) * 0.01,
};
});
const [point0, point1] = calcPoint(x, y, width, height, deg);
return [
{
x0: point0[0],
y0: point0[1],
x1: point1[0],
y1: point1[1],
},
stops,
];
}
setLinearGradient({ x0, y0, x1, y1 }, stops) {
x0 *= this.zoom;
x1 *= this.zoom;
y0 *= this.zoom;
y1 *= this.zoom;
const gradient = this.context.createLinearGradient(x0, y0, x1, y1);
stops.forEach(({ offset, color }) => {
gradient.addColorStop(offset, color);
});
this.context.fillStyle = gradient;
}
drawLine({ x, y, color, lineWidth = 1 }, vertices) {
x *= this.zoom;
y *= this.zoom;
this.context.beginPath();
this.context.moveTo(x, y);
vertices.forEach(({ x, y }) => {
this.context.lineTo(x * this.zoom, y * this.zoom);
});
this.context.strokeStyle = color;
this.context.lineWidth = lineWidth;
this.context.stroke();
}
fillText(
text,
{
x,
y,
fontSize = 15,
color,
align = "center",
fontWeight = "normal",
fontFamily = "微软雅黑",
} = {},
{ width: rectWidth = 0, height: rectHeight = 0 } = {}
) {
this.context.beginPath();
this.context.font = `${fontWeight} ${fontSize * this.zoom}px ${fontFamily}`;
this.context.textBaseline = "middle";
const textWidth = this.context.measureText(text).width;
x *= this.zoom;
switch (align) {
case "center":
x += (rectWidth * this.zoom - textWidth) / 2;
y += rectHeight / 2;
break;
}
this.context.fillStyle = color;
this.context.fillText(text, x, y * this.zoom);
}
clear() {
this.context.clearRect(0, 0, this.canvas.width, this.canvas.height);
}
}

187
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/DispatchLiaison/StatsDialogVisible/index.vue

@ -0,0 +1,187 @@
<template>
<Dialog v-model="modelVisible" title="智能调度" width="1200px">
<div class="StatsDetail">
<el-form ref="form" :model="form">
<el-table :data="data">
<el-table-column
prop="organizationName"
label="路管驻点"
width="180"
align="center"
>
</el-table-column>
<el-table-column
prop="difference"
label="距离"
width="180"
align="center"
>
<template slot-scope="scope">
<span>{{ scope.row.difference }}公里</span>
</template>
</el-table-column>
<el-table-column label="人员" align="center">
<template slot-scope="scope">
<el-checkbox-group v-model="form.personnel">
<el-checkbox
v-for="item in scope.row.shiftsMap"
:label="item.shiftsName"
></el-checkbox>
</el-checkbox-group>
<!-- <span v-for="item in scope.row.shiftsMap">
{{ item.shiftsName }}</span
> -->
</template>
</el-table-column>
<el-table-column label="车辆" align="center">
<template slot-scope="scope">
<el-checkbox-group v-model="form.vehicle">
<el-checkbox
v-for="item in scope.row.vehiclesMap"
:label="item.vehiclePlate + ' -' + item.vehicleText"
></el-checkbox>
</el-checkbox-group>
<!-- <span v-for="item in scope.row.vehiclesMap">
{{ item.vehiclePlate }}</span
> -->
</template>
</el-table-column>
</el-table>
</el-form>
</div>
<template #footer>
<Button
style="background-color: rgba(0, 179, 204, 0.3)"
@click.native="(modelVisible = false), (submitting = false)"
>
取消
</Button>
<Button @click.native="handleSubmit" :loading="submitting"> 确定 </Button>
</template>
</Dialog>
</template>
<script>
import Dialog from "@screen/components/Dialog/index";
import InputSearch from "@screen/components/InputSearch/index.vue";
import Table from "@screen/components/Table.vue";
import { selectTollStation } from "@/api/event/governanceAnalysis";
import request from "@/utils/request";
import Button from "@screen/components/Buttons/Button.vue";
export default {
name: "StatsDetail",
components: {
Dialog,
InputSearch,
Table,
Button,
},
model: {
prop: "visible",
event: "update:value",
},
props: {
visible: Boolean,
data: Array,
},
data() {
return {
form: { personnel: [], vehicle: [] },
};
},
computed: {
modelVisible: {
get() {
return this.visible;
},
set(val) {
this.$emit("update:value", val);
},
},
},
methods: {
handleSubmit() {},
},
mounted() {},
};
</script>
<style lang="scss" scoped>
.dialog {
min-height: 800px;
}
.search {
display: flex;
flex-direction: row-reverse;
}
::v-deep .is-scrolling-none {
background: #0b6581;
}
::v-deep .el-table__empty-text {
color: #3ae0f8;
}
.StatsDetail {
// height: 770px;
margin: 20px 0;
width: 100%;
display: flex;
gap: 5px;
}
.el-table {
border: 1px solid #07aec6;
background: #0b6581;
}
::v-deep .el-table .el-table__header-wrapper th,
.el-table .el-table__fixed-header-wrapper th {
background: #0b6581;
border: 1px solid #07aec6;
}
::v-deep .el-table th.el-table__cell > .cell {
color: #3de8ff;
}
::v-deep .el-table thead.is-group th.el-table__cell {
background: #0b6581;
border: 1px solid #07aec6;
}
// ::v-deep .el-table th.el-table__cell.is-leaf,
::v-deep .el-table td.el-table__cell {
border: 1px solid #07aec6;
background: #1b586d;
color: #fff;
}
::v-deep .el-table tr {
border: 1px solid #07aec6;
background-color: #0b6581;
}
::v-deep
.el-table--enable-row-hover
.el-table__body
tr:hover
> td.el-table__cell {
background: #1b586d;
border: 1px solid #07aec6;
}
::v-deep .el-table::before,
.el-table--group::after,
.el-table--border::after {
background: none;
}
.footer {
margin-top: 20px;
display: flex;
}
</style>

203
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/DispatchLiaison/index.vue

@ -1,95 +1,172 @@
<template>
<Card class='DispatchLiaison' title="调度联络">
<Card class="DispatchLiaison" title="调度联络">
<template #title-suffix>
<ButtonGradient class="title-button" @click.native="handleClick">
调度
</ButtonGradient>
</template>
<Descriptions :list="list" style="gap: 24px; flex: 1;">
<template #content-phone1="{ data: { text } }">
{{ text }}
<img src="./images/phone.svg" />
</template>
<template #content-phone2="{ data: { text } }">
{{ text }}
<img src="./images/phone.svg" />
<img src="./images/camera.svg" />
</template>
<template #content-rescueVehicles="{ data: { text } }">
{{ text }}
<img src="./images/rescueVehicles.svg" />
</template>
</Descriptions>
<div class="dispatch-content">
<div class="dispatch-item">
<span class="label">业务单位</span>
<span class="value">{{
dispatchData.organizationName ? dispatchData.organizationName : "-"
}}</span>
</div>
<div class="dispatch-item">
<div>
<span class="label">值班领导</span>
<span class="value">{{
dispatchData.shiftsName ? dispatchData.shiftsName : "-"
}}</span>
</div>
<div>
<span class="label">手机号</span>
<span class="value">{{
dispatchData.shiftsNumber ? dispatchData.shiftsNumber : "-"
}}</span>
</div>
</div>
<div class="dispatch-item">
<span class="label">调度人员</span>
<span class="value" v-for="item in dispatchData.shiftsMap">{{
dispatchData.shiftsMap.length > 0 ? item.shiftsName : "-"
}}</span>
</div>
<div class="dispatch-item">
<div>
<span class="label">路管人员</span>
<span class="value">{{
dispatchData.name ? dispatchData.name : "-"
}}</span>
</div>
<div>
<span class="label">手机号</span>
<span class="value">{{
dispatchData.contactNumber ? dispatchData.contactNumber : "-"
}}</span>
</div>
</div>
<div class="dispatch-item">
<span class="label">救援车辆 </span>
<span class="value" v-for="item in dispatchData.vehiclesMap">{{
dispatchData.vehiclesMap.length > 0
? item.vehiclePlate + item.vehicleText
: "-"
}}</span>
</div>
</div>
<StatsDialogVisible
:visible="statsDialogVisible"
:data="dispatchList"
@update:value="handleClose"
/>
</Card>
</template>
<script>
import Card from "@screen/components/Card2/Card.vue";
import ButtonGradient from '@screen/components/Buttons/ButtonGradient.vue';
import Descriptions from '@screen/components/Descriptions.vue';
import { provideMixin } from "./../../mixin"
import ButtonGradient from "@screen/components/Buttons/ButtonGradient.vue";
import Descriptions from "@screen/components/Descriptions.vue";
import { provideMixin } from "./../../mixin";
import { commandDispatch } from "@/api/commandDispatch";
import StatsDialogVisible from "./StatsDialogVisible/index.vue";
import request from "@/utils/request";
export default {
name: 'DispatchLiaison',
name: "DispatchLiaison",
mixins: [provideMixin],
components: {
Card,
ButtonGradient,
Descriptions
Descriptions,
StatsDialogVisible,
},
data() {
return {
list: [
{
label: '业务单位',
text: '山东正晨科技股份有限公司',
gridColumn: 2
},
{
label: '值班领导',
text: '张亮亮',
},
{
label: '手机',
key: "phone1",
text: '18888888888',
},
{
label: '调度人员',
text: '',
gridColumn: 2
},
{
label: '路管人员',
text: '王一博',
},
{
label: '手机',
key: "phone2",
text: '16666666666',
},
{
label: '救援车辆',
key: "rescueVehicles",
text: '鲁A34567 (大型清障车)',
gridColumn: 2
},
]
}
dispatchData: [],
dispatchList: [],
vehicleTypeList: [],
statsDialogVisible: false,
};
},
methods: {
handleClick() {
}
}
}
console.log("-------");
this.statsDialogVisible = true;
},
handleClose() {
this.statsDialogVisible = false;
},
getCommandDispatch() {
let data = {
stakeMark: "K099+750",
};
commandDispatch(data).then((res) => {
res.data.forEach((element) => {
if (element.vehiclesMap.length > 0) {
element.vehiclesMap.forEach((item) => {
console.log(789, item);
this.vehicleTypeList.forEach((i) => {
console.log(456, i);
if (item.vehicleType == i.dictValue) {
item.vehicleText = "(" + i.dictLabel + ")";
}
});
});
}
});
this.dispatchList = res.data;
this.dispatchData = res.data[0];
});
},
getVehicleTypeList() {
if (this.vehicleTypeList.length) return;
request({
url: `/system/dict/data/type/sys_vehicle_type`,
method: "GET",
params: {},
})
.then(({ data, code }) => {
if (code != 200) return; //Message.error("");
this.vehicleTypeList = data;
})
.catch((err) => {});
},
},
mounted() {
this.getCommandDispatch();
this.getVehicleTypeList();
},
};
</script>
<style lang='scss' scoped>
<style lang="scss" scoped>
.DispatchLiaison {
::v-deep {
.content {
display: flex;
align-items: center;
align-items: flex-start;
}
}
.dispatch-content {
width: 100%;
.dispatch-item {
display: flex;
width: 100%;
align-items: flex-start;
margin: 15px 0;
div {
width: 50%;
}
.label {
font-size: 14px;
color: #38d2e7;
}
.value {
font-size: 14px;
color: #fff;
}
}
}
}

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

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

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

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 2.6 MiB

After

Width:  |  Height:  |  Size: 2.6 KiB

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

@ -13,12 +13,13 @@
<div class="road-lane">
<div v-for="i in 11">
<img v-if="i != 6" src="./images/normal.svg">
<!-- <img v-if="i != 6" src="./images/congestion.svg"> -->
<!-- <img v-if="i != 6" :src="'./images/'+(detailData.lang.indexOf((i+1).toString())===-1?'normal.svg':'congestion.svg')"> -->
<img v-if="i != 6 && !detailData.lang.includes((i).toString()) " src="./images/normal.svg">
<img v-if="i != 6 && detailData.lang.includes((i).toString())" src="./images/congestion.svg">
</div>
</div>
<div class="bottom-info">
<div class="tag">拥堵五级事件</div>
<div class="tag" >{{ detailData.eventLevel?`${detailData.eventCause+['','一','二','三','四','五'][detailData.eventLevel]}级事件` : '暂无事件等级' }}</div>
</div>
<EditEventInformationDialog v-model="editEventInformationDialogVisible" />
@ -69,8 +70,7 @@ export default {
{
label: '道路方向',
// text: '',
key: 'direction',
enum: 'CameraDirectionEnum'
key: 'direction'
},
{
label: '桩号',
@ -96,12 +96,13 @@ export default {
}
.road-lane {
background-image: url(./images/lane.svg);
background-image: url(./images/lane.jpg);
flex: 1;
background-repeat: no-repeat;
background-size: 100% 100%;
// background-size: auto auto;
display: grid;
grid-template-columns: 1.2fr 1fr 1fr 1fr 1fr 0.6fr 1fr 1fr 1fr 1fr 1.2fr;
grid-template-columns: 1fr 1fr 1fr 1fr 1fr .5fr 1fr 1fr 1fr 1fr 1fr;
>div {
display: flex;

11
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/ReleaseInformation/index.vue

@ -13,7 +13,7 @@
</template>
</Form>
<div class="line"></div>
<!-- <div class="line"></div>
<Descriptions :list="list" style="flex: 1;" column="1" titleStyle="align-self: flex-start;">
<template #content-informationBoard>
@ -22,15 +22,15 @@
<img src="./images/add.svg" />
</div>
</template>
</Descriptions>
</Descriptions> -->
<div class="bottom">
<ButtonGradient class="title-button special-button">
一键发布
</ButtonGradient>
<ButtonGradient class="title-button special-button">
<!-- <ButtonGradient class="title-button special-button">
发布预案
</ButtonGradient>
</ButtonGradient> -->
</div>
</Card>
</template>
@ -76,8 +76,7 @@ export default {
options: {
type: "textarea",
autosize: true,
maxlength: 200,
autosize: { minRows: 9, maxRows: 9 },
autosize: { minRows: 4, maxRows: 4 },
showWordLimit: true
}
},

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

@ -1,14 +1,20 @@
<template>
<div class='CommandDispatch' :style="{ '--row': row }">
<component :is="key" v-for="(_, key) in gridAreaMap" :key="key" :ref="key" :style="{ gridArea: gridAreaMap[key] }"
@fullHeight="opacityKey => handleFullHeight(key, opacityKey)" />
<div class="CommandDispatch" :style="{ '--row': row }">
<component
:is="key"
v-for="(_, key) in gridAreaMap"
:key="key"
:ref="key"
:style="{ gridArea: gridAreaMap[key] }"
@fullHeight="(opacityKey) => handleFullHeight(key, opacityKey)"
/>
</div>
</template>
<script>
import request from "@/utils/request";
const files = require.context('./Cards', true, /[^/]+\/index\.vue$/);
const files = require.context("./Cards", true, /[^/]+\/index\.vue$/);
const components = files.keys().reduce((components, key) => {
components[key.match(/[^/]+/g)[1]] = files(key).default;
@ -17,58 +23,73 @@ const components = files.keys().reduce((components, key) => {
}, {});
const originGridArea = {
EventInformation: "1 / 1 / span 9 / 1",
DispatchLiaison: "10 / 1 / span 7 / 2",
DisposalPlan: "17 / 1 / span 9 / 2",
CrowdnessIndicatorRankings: "1 / 2 / span 11 / 2",
DisposalProcess: "12 / 2 / span 14 / 2",
RealTimeVideo: "1 / 3 / span 6 / 3",
ReleaseInformation: "7 / 3 / span 14 / 3",
TrafficControl: "21 / 3 / span 5 / 3",
}
EventInformation: "1 / 1 / span 12 / 1", // 1
DispatchLiaison: "13 / 1 / span 11 / 2", // 2
TrafficControl: "24 / 1 / span 10 / 2", //3
CrowdnessIndicatorRankings: "1 / 2 / span 12 / 2", // / 1
DisposalProcess: "13 / 2 / span 21 / 2", //2
RealTimeVideo: "1 / 3 / span 9 / 3", //1
ReleaseInformation: "10 / 3 / span 7 / 3", //2
DeviceControl: "17 / 3 / span 17 / 3", //3
// DisposalPlan: "17 / 1 / span 9 / 2", //
};
export default {
name: 'CommandDispatch',
name: "CommandDispatch",
components: {
...components,
},
props: {
detailId: {
type: [String, Number],
default: 2
}
default: '96b9918efc01488cb22fa1d9d3236dfd',
},
},
provide() {
return {
provideData: this.provideData,
}
};
},
data() {
return {
gridAreaMap: {
...originGridArea
...originGridArea,
},
row: 24,
provideData: {
detail: null
}
}
detail: null,
},
};
},
created() {
this.getDetail();
},
methods: {
getDetail() {
// -
request({
url: `/dc/system/event/${this.detailId}`,
method: "GET",
})
.then((result) => {
if (result.code != 200) return;
console.log(result.data)
this.provideData.detail = result.data;
if(['设备设施隐患','非法上路','施工建设','服务区异常'].includes(result.data.eventName)){
const gridArea = {...originGridArea}
//
gridArea['DispatchLiaison'] = '10 / 1 / span 20 / 2'
delete gridArea.TrafficControl;
if(['设备设施隐患','非法上路'].includes(result.data.eventName)){
//
gridArea['RealTimeVideo'] = '1 / 3 / span 17 / 3'
delete gridArea.ReleaseInformation;
}
this.provideData.detail = result.data
this.gridAreaMap = gridArea;
}
})
.catch((err) => { });
.catch((err) => {});
},
handleFullHeight(key, opacityKey) {
if (this.gridAreaMap[key] !== originGridArea[key]) {
@ -76,30 +97,32 @@ export default {
if (this.$refs[opacityKey]?.[0]) {
this.$refs[opacityKey][0].$el.style.opacity = 1;
this.$refs[opacityKey][0].$el.style.pointerEvents = "auto";
};
}
} else {
let index = 0;
if (this.$refs[opacityKey]?.[0]) {
this.$refs[opacityKey][0].$el.style.opacity = 0;
this.$refs[opacityKey][0].$el.style.pointerEvents = "none";
};
this.gridAreaMap[key] = originGridArea[key].replace(/[0-9]+/g, (num) => {
try {
return { 0: '1', 2: this.row + 1 }[index] || num;
} catch (error) {
}
} finally {
index++;
this.gridAreaMap[key] = originGridArea[key].replace(
/[0-9]+/g,
(num) => {
try {
return { 0: "1", 2: this.row + 1 }[index] || num;
} catch (error) {
} finally {
index++;
}
}
});
);
}
}
}
}
},
},
};
</script>
<style lang='scss' scoped>
<style lang="scss" scoped>
.CommandDispatch {
padding: 24px 12px 21px 12px;
display: grid;
@ -107,8 +130,8 @@ export default {
grid-template-rows: repeat(var(--row), 1fr);
gap: 18px;
>div {
transition: all .18s linear;
> div {
transition: all 0.18s linear;
}
::v-deep {

413
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/plan/addAndEditDialog/ScopeTable.vue

@ -0,0 +1,413 @@
<template>
<div class="ScopeTable">
<el-row>
<el-col :span="2">
<p>设备资源:</p>
</el-col>
<el-col :span="4">
<!-- 设备类型 -->
<el-select v-model="tableInfo.deviceType" placeholder="" @change="changeDeviceType" transfer="true"
:popper-append-to-body="false">
<el-option v-for="item in deviceOptions" :key="item.value" :label="item.label" :value="item.value">
</el-option>
</el-select>
</el-col>
<el-col :span="4">
<!-- 规则条件 -->
<el-select v-model="tableInfo.searchRule" placeholder="">
<el-option v-for="item in zyOptions" :key="item.value" :label="item.label" :value="item.value">
</el-option>
</el-select>
</el-col>
<el-col :span="4">
<!-- 设备列表 -->
<el-select v-if="tableInfo.searchRule == 1" v-model="tableInfo.devList" placeholder="请选择设备" multiple
collapse-tags>
<el-option v-for="item in sbOptions" :key="item.id" :label="item.deviceName" :value="item.id">
</el-option>
</el-select>
<!-- -->
<el-input-number v-if="tableInfo.searchRule == 2 || tableInfo.searchRule == 3"
v-model="tableInfo.number" :min="0" :max="9999" style="width: 130px;"></el-input-number>
<span v-if="tableInfo.searchRule == 2 || tableInfo.searchRule == 3"></span>
<!-- 公里 -->
<el-input-number v-if="tableInfo.searchRule == 4" v-model="tableInfo.number" :min="0" :max="9999"
style="width: 130px;"></el-input-number>
<span v-if="tableInfo.searchRule == 4" style="width: 56px;">公里</span>
</el-col>
</el-row>
<el-row>
<el-col :span="2">
<p>执行操作:</p>
</el-col>
<!-- 可变信息标识 -->
<el-col v-if="tableInfo.deviceType == 2" :span="4">
<el-select v-model="tableInfo.zx_operationType" placeholder="请选择">
<el-option label="自定义发布" :value="1"></el-option>
<el-option label="智能发布" :value="2"></el-option>
</el-select>
</el-col>
<el-col v-if="tableInfo.deviceType == 2 && tableInfo.zx_operationType == 1" :span="4">
<el-input @click.native="clickQbb('zx_content')" placeholder="请选择" v-model="tableInfo.zx_content" readonly>
<i slot="suffix" class="el-input__icon el-icon-search"></i>
</el-input>
</el-col>
<!-- 疲劳唤醒 -->
<el-col v-if="tableInfo.deviceType == 10" :span="4">
<el-select v-model="tableInfo.zx_name" placeholder="工作模式">
<el-option v-for="item in gzmsOptions" :key="item.value" :label="item.label"
:value="item.value"></el-option>
</el-select>
</el-col>
<el-col v-if="tableInfo.deviceType == 10" :span="4">
<el-input-number placeholder="" v-model="tableInfo.zx_operationDuration" :min="0"
:max="999"></el-input-number>
</el-col>
<el-col v-if="tableInfo.deviceType == 10" :span="2">
<span>时长(分钟)</span>
</el-col>
<!-- 行车诱导 -->
<el-col v-if="tableInfo.deviceType == 12" :span="4">
<el-select v-model="tableInfo.zx_controlModel" placeholder="请选择模式" transfer="true"
:popper-append-to-body="false">
<el-option label="手动模式" value="00"></el-option>
<el-option label="自动模式" value="01"></el-option>
<el-option label="万年历" value="02"></el-option>
</el-select>
</el-col>
<el-col v-if="tableInfo.deviceType == 12 && tableInfo.zx_controlModel == '01'" :span="4">
<el-time-picker v-model="tableInfo.zx_time" is-range style="" range-separator="-" placeholder="选择时间"
value-format="HH:mm" format="HH:mm">
</el-time-picker>
</el-col>
<el-col v-if="tableInfo.deviceType == 12" :span="4">
<el-select v-model="tableInfo.zx_state" placeholder="工作状态">
<el-option v-for="item in gzztOptions" :key="item.value" :label="item.label"
:value="item.value"></el-option>
</el-select>
</el-col>
<!-- 语音广播 -->
<el-col v-if="tableInfo.deviceType == 5" :span="4">
<el-select v-model="tableInfo.zx_operationType" placeholder="请选择">
<el-option label="自定义发布" :value="1"></el-option>
<el-option label="智能发布" :value="2"></el-option>
</el-select>
</el-col>
<el-col v-if="tableInfo.deviceType == 5 && tableInfo.zx_operationType == 1" :span="4">
<el-input v-model="tableInfo.zx_content" placeholder="请输入发布内容"></el-input>
</el-col>
</el-row>
<el-row>
<el-col :span="2">
<p>恢复操作:</p>
</el-col>
<!-- 可变信息标识 -->
<el-col v-if="tableInfo.deviceType == 2" :span="4">
<el-select v-model="tableInfo.hf_operationType" placeholder="请选择">
<el-option label="自定义发布" :value="1"></el-option>
<el-option label="还原上次" :value="2"></el-option>
</el-select>
</el-col>
<el-col v-if="tableInfo.deviceType == 2 && tableInfo.hf_operationType == 1" :span="4">
<el-input @click.native="clickQbb('hf_content')" placeholder="请选择" v-model="tableInfo.hf_content" readonly>
<i slot="suffix" class="el-input__icon el-icon-search"></i>
</el-input>
</el-col>
<!-- 疲劳唤醒 -->
<el-col v-if="tableInfo.deviceType == 10" :span="4">
<el-select v-model="tableInfo.hf_name" placeholder="工作模式">
<el-option v-for="item in gzmsOptions" :key="item.value" :label="item.label"
:value="item.value"></el-option>
</el-select>
</el-col>
<el-col v-if="tableInfo.deviceType == 10" :span="4">
<el-input-number placeholder="" v-model="tableInfo.hf_operationDuration" :min="0"
:max="999"></el-input-number>
</el-col>
<el-col v-if="tableInfo.deviceType == 10" :span="2">
<span>时长(分钟)</span>
</el-col>
<!-- 行车诱导 -->
<el-col v-if="tableInfo.deviceType == 12" :span="4">
<el-select v-model="tableInfo.hf_controlModel" placeholder="请选择模式" transfer="true"
:popper-append-to-body="false">
<el-option label="手动模式" value="00"></el-option>
<el-option label="自动模式" value="01"></el-option>
<el-option label="万年历" value="02"></el-option>
</el-select>
</el-col>
<el-col v-if="tableInfo.deviceType == 12 && tableInfo.hf_controlModel == '01'" :span="4">
<el-time-picker v-model="tableInfo.hf_time" is-range style="" range-separator="-" placeholder="选择时间"
value-format="HH:mm" format="HH:mm">
</el-time-picker>
</el-col>
<el-col v-if="tableInfo.deviceType == 12" :span="4">
<el-select v-model="tableInfo.hf_state" placeholder="工作状态">
<el-option v-for="item in gzztOptions" :key="item.value" :label="item.label"
:value="item.value"></el-option>
</el-select>
</el-col>
<!-- 语音广播 -->
<!-- <el-col v-if="tableInfo.deviceType == 5" :span="4">
<el-select v-model="tableInfo.hf_operationType" placeholder="请选择">
<el-option label="自定义发布" :value="1"></el-option>
<el-option label="智能发布" :value="2"></el-option>
</el-select>
</el-col> -->
<el-col v-if="tableInfo.deviceType == 5 && tableInfo.hf_operationType == 1" :span="4">
<el-input v-model="tableInfo.hf_content" placeholder="请输入发布内容"></el-input>
</el-col>
</el-row>
<!-- 情报板弹窗 -->
<QbbDialog :visible="isShowDialog" :info="qbbData" @close="onCloseDialog" @dialogSubmit="dialogSubmit" />
</div>
</template>
<script>
import Table from '@screen/components/Table.vue';
import Button from '@screen/components/Buttons/Button.vue';
import request from "@/utils/request";
import QbbDialog from "../qbbDialog/index.vue";
import { Message } from 'element-ui'
import { planDeviceOptions } from "@screen/utils/enum.js";
import { defaultTableInfo } from "../data";
export default {
name: 'ScopeTable',
components: {
Button,
Table,
QbbDialog
},
model: {
prop: 'visible',
event: 'update:value'
},
inject: ['loadData'],
props: {
visible: Boolean,
eventType: Number,
type: Number,
tableInfo: {
type: Object,
default: () => ({...defaultTableInfo})
}
},
data() {
return {
isShowDialog: false,
deviceOptions: planDeviceOptions,
zyOptions: [
{
value: 1,
label: '指定设备资源'
},
{
value: 2,
label: '事发上游最近'
},
{
value: 3,
label: '事发下游最近'
},
{
value: 4,
label: '最近公里数'
},
],
gzztOptions: [
{
value: "01",
label: "常亮"
},
{
value: "02",
label: "流水"
},
{
value: "03",
label: "闪烁"
},
{
value: "04",
label: "关闭",
}
],
gzmsOptions: [
{
value: "激光关闭",
label: "激光关闭"
},
{
value: "常亮模式",
label: "常亮模式"
},
{
value: "间隔100ms闪烁模式",
label: "间隔100ms闪烁模式"
},
{
value: "间隔200ms闪烁模式",
label: "间隔200ms闪烁模式",
},
{
value: "间隔500ms闪烁模式",
label: "间隔500ms闪烁模式",
},
{
value: "2次闪烁模式",
label: "2次闪烁模式"
},
{
value: "SOS模式",
label: "SOS模式"
},
{
value: "自定义模式1",
label: "自定义模式1",
},
{
value: "自定义模式2",
label: "自定义模式2",
},
{
value: "自定义模式3",
label: "自定义模式3",
}
],
qbbData: {},
sbOptions: [],
deviceType: 1,
clickQbbName: 1
}
},
watch: {
// async tableData(newValue) {
// console.log('newValue', newValue)
// if (newValue) {
// const item = this.tableData.find(it => it.searchRule == 1);
// console.log('item', item);
// if (item && item.deviceType) {
// let loadData = await this.loadData(item.deviceType);
// console.log('aa', loadData)
// this.sbOptions = loadData;
// }
// }
// }
},
async mounted() {
let loadData = await this.loadData(2);
// console.log('aa', loadData)
this.sbOptions = loadData;
},
methods: {
initData() {
},
async changeDeviceType(value) {
this.deviceType = value;
console.log('value', value)
this.sbOptions = await this.loadData(value);
},
onAdd(id) {
this.tableData.push({
deviceType: 1,
searchRule: 1,
qbb: ''
})
},
onDel(index) {
if (this.tableData.length <= 1) {
return Message.warning('最后一项不可删除!');
}
this.tableData.splice(index, 1)
},
clickQbb(name) {
this.clickQbbName = name;
// this.qbbData = this.tableData[index].dcInfoBoardTemplate;
this.isShowDialog = true;
},
onCloseDialog() {
this.isShowDialog = false;
},
dialogSubmit(data) {
console.log('qbbData',data)
this.tableInfo[this.clickQbbName] = data.content;
// this.tableData[this.index].otherConfig = JSON.stringify(data);
}
}
}
</script>
<style lang="scss" scoped>
.ScopeTable {
display: flex;
gap: 9px;
width: 100%;
// height: 768px;
min-height: 50px;
margin-top: 5px;
flex-direction: column;
p {
color: aqua;
}
::v-deep {
.el-table .el-table__cell {
padding: 0 5px;
}
.el-col-4 {
margin-left: 6px;
}
}
.mjs {
display: flex;
>div {
margin-right: 10px;
}
}
.ms {
width: 160px;
}
.plhx {
display: flex;
}
::v-deep {
.el-tag.el-tag--info {
max-width: 100px;
}
.el-range-editor--medium .el-range__icon,
.el-range-editor--medium .el-range__close-icon {
display: none;
}
}
}
.elButton {
background: #2ba8c3;
border-radius: 2px 2px 2px 2px;
color: #FFFFFF;
}
.elButton:hover,
.elButton:focus {
background: #2ba8c3;
border-radius: 2px 2px 2px 2px;
border-color: #FFFFFF;
color: #FFFFFF;
}
</style>

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

@ -0,0 +1,472 @@
<template>
<Dialog v-model="modelVisible" :title="title" width="1330px">
<div class="EventAddPlanDialog">
<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-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-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-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-option>
</el-select>
</el-form-item>
</div>
<div class="second">
<el-row>
<el-col :span="2">
<div class="text"><i style="color: red">*</i>执行操作:</div>
</el-col>
<el-col :span="22">
<FormTable ref="secondFormTable" :tableData="secondFormData" :type="1"></FormTable>
</el-col>
</el-row>
</div>
<div class="third">
<el-row>
<el-col :span="2">
<div class="text"><i style="color: red">*</i>恢复操作:</div>
</el-col>
<el-col :span="22">
<FormTable ref="thirdFormTable" :tableData="thirdFormData" :type="2"></FormTable>
</el-col>
</el-row>
</div>
</ElForm>
</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>
</template>
</Dialog>
</template>
<script>
import Dialog from "@screen/components/Dialog/index";
import Form from "@screen/components/FormConfig";
import FormTable from "../formTable/index";
import Button from "@screen/components/Buttons/Button.vue";
import request from "@/utils/request";
import { Message } from "element-ui";
import { throttle } from "lodash";
import {
controlModelMap,
gzztMap,
gzmsMap,
eventSubClassMap,
trafficKV,
WarningTypeList as perceptionKV,
} from "@screen/utils/enum.js";
const typeMap = {
1: trafficKV,
2: perceptionKV,
};
export default {
name: "addAndEditDialog",
components: {
Dialog,
Form,
Button,
FormTable,
},
model: {
prop: "visible",
event: "close",
},
provide() {
return {
// loadData: throttle(this.loadData, 100)
loadData: this.loadData,
};
},
props: {
visible: Boolean,
detail: {
type: Object,
default: () => { },
},
},
data() {
return {
title: "新增预案",
dialogType: 1,
planId: 0,
submitting: false,
formData: {
eventCategory: 1,
eventType: 1,
triggerMechanism: "",
},
secondFormData: [
{
deviceType: 1,
searchRule: 1,
qbb: "",
},
],
thirdFormData: [
{
deviceType: 1,
searchRule: 1,
qbb: "",
},
],
deviceData: [],
eventOptions: trafficKV,
mechanismOptions: [
{
value: "1-1",
label: "追尾",
},
{
value: "1-2",
label: "侧翻",
},
{
value: "1-3",
label: "撞护栏",
},
{
value: "1-4",
label: "自然",
},
{
value: "1-5",
label: "其他事故",
},
],
rules: {
planName: [{ required: true, message: "请输入预案名称" }],
eventType: [
{ required: true, message: "请选择事件类型", trigger: "change" },
],
},
};
},
mounted() { },
computed: {
modelVisible: {
get() {
if (this.visible) {
if (Object.keys(this.detail).length > 0) {
this.title = "修改预案";
this.dialogType = 2;
this.eventOptions = typeMap[this.detail.eventCategory];
this.mechanismOptions =
eventSubClassMap[this.detail.eventCategory || 1][
this.detail.eventType
];
this.initData(this.detail.id);
} else {
this.title = "新增预案";
this.dialogType = 1;
this.formData = {
eventCategory: 1,
eventType: 1,
triggerMechanism: "",
};
this.secondFormData = [
{
deviceType: 1,
searchRule: 1,
qbb: "",
},
];
this.thirdFormData = [
{
deviceType: 1,
searchRule: 1,
qbb: "",
},
];
}
}
return this.visible;
},
set(val) {
this.$emit("close", val);
},
},
},
methods: {
initData(id = 1) {
request({
url: `/business/plans/list/${id}`,
method: "get",
})
.then((result) => {
if (result.code != 200) return Message.error(result?.msg);
let data = result.data;
let dcExecuteAction = result.data.dcExecuteAction;
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) => {
let action = {};
if (it.otherConfig) {
let config = JSON.parse(it.otherConfig);
let qbb = "";
if (config.id) {
qbb = config.content;
config = { dcInfoBoardTemplate: config };
}
// 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) {
this.secondFormData.push(action);
} else if (it.actionType == 2) {
this.thirdFormData.push(action);
}
});
console.log("secondFormData", this.secondFormData);
})
// console.log('secondFormData', this.secondFormData)
// }).catch((err) => {
// console.log(err)
// Message.error("", err);
// })
.catch((err) => {
console.log(err);
Message.error("查询事件预案列表失败", err);
});
},
async loadData(deviceType = 1) {
this.deviceData = [];
let result = await request({
url: `business/device/query?deviceType=${deviceType}`,
method: "get",
});
if (result.code != 200) return Message.error(result?.msg);
if (deviceType == 1) {
this.deviceData = result.data.filter((it) => it.childType !== "1-1");
} else {
this.deviceData = result.data;
}
return this.deviceData;
},
changeEventType(value = 1) {
this.mechanismOptions =
eventSubClassMap[this.formData.eventCategory || 1][value];
},
changeRadio(value = 1) {
this.formData.triggerMechanism = "";
this.eventOptions = typeMap[value];
this.changeEventType(1);
},
handleChange() { },
formatData(it, value = 1, id = "") {
let data = { ...it, actionType: value, emergencyPlansId: id };
if (
it.deviceList &&
typeof it.deviceList !== "string" &&
it.deviceList.length > 0
) {
data.deviceList = it.deviceList.join(",");
} else {
data.deviceList = "";
}
if (it.content) {
data.otherConfig = JSON.stringify({ content: it.content });
}
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],
};
}
data.otherConfig = JSON.stringify(other);
}
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 flg = false;
// for (let item of secondFormTable) {
// if (this.areAllValuesEmpty(item)) { flg = true; break };
// }
// if (flg) return Message.warning('');
// for (let item of thirdFormTable) {
// if (this.areAllValuesEmpty(item)) { flg = true; break };
// }
// if (flg) return Message.warning('');
// console.log('12', secondFormTable);
// console.log('34', 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({
...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);
});
}
}
});
},
areAllValuesEmpty(obj) {
console.log("ass", obj);
return Object.keys(obj).every(function (key) {
const value = obj[key];
return (
value == null ||
value === "" ||
(Array.isArray(value) && value.length === 0) ||
(value instanceof Object && Object.keys(value).length === 0)
);
});
},
},
};
</script>
<style lang="scss" scoped>
.fade-enter-active,
.fade-leave-active {
transition: opacity 0.24s;
}
.fade-enter,
.fade-leave-to {
opacity: 0;
}
.EventAddPlanDialog {
gap: 9px;
width: 1280px;
height: 310px;
display: flex;
flex-direction: column;
.first,
.second,
.third {
padding: 5px 10px 8px;
background-color: #296887;
margin-bottom: 15px;
.text {
margin-top: 12px;
}
}
.form {
flex: 1;
overflow-y: auto;
}
.footer {
display: flex;
justify-content: end;
gap: 15px;
}
}
</style>

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

@ -3,12 +3,6 @@
<div class="EventAddPlanDialog">
<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-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-form-item>
@ -18,35 +12,26 @@
</el-option>
</el-select>
</el-form-item>
<el-form-item label="触发类型:" prop="triggerMechanism">
<el-select v-model="formData.triggerMechanism" placeholder="请选择触发类型">
<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-option>
</el-select>
</el-form-item>
</div>
<div class="second">
<el-row>
<el-col :span="2">
<div class="text"><i style="color: red">*</i>执行操作:</div>
</el-col>
<div>
<el-row v-for="(item, index) in tableData" :key="item.id" class="rowBlock">
<el-col :span="22">
<FormTable ref="secondFormTable" :tableData="secondFormData" :type="1"></FormTable>
<ScopeTable :tableInfo="item"></ScopeTable>
</el-col>
</el-row>
</div>
<div class="third">
<el-row>
<el-col :span="2">
<div class="text"><i style="color: red">*</i>恢复操作:</div>
</el-col>
<el-col :span="22">
<FormTable ref="thirdFormTable" :tableData="thirdFormData" :type="2"></FormTable>
<ElButton class="elButton" icon="el-icon-plus" plain size="mini" @click.native="onAdd()" />
<ElButton class="elButton" icon="el-icon-delete" plain size="mini" @click.native="onDel(index)" />
</el-col>
</el-row>
</div>
</ElForm>
</div>
@ -65,21 +50,17 @@ import FormTable from "../formTable/index";
import Button from "@screen/components/Buttons/Button.vue";
import request from "@/utils/request";
import { Message } from "element-ui";
import { throttle } from "lodash";
import ScopeTable from "./ScopeTable.vue";
import { defaultTableInfo } from "../data";
import Table from '@screen/components/Table.vue';
import {
controlModelMap,
gzztMap,
gzmsMap,
eventSubClassMap,
trafficKV,
WarningTypeList as perceptionKV,
trafficKV
} from "@screen/utils/enum.js";
const typeMap = {
1: trafficKV,
2: perceptionKV,
};
export default {
name: "addAndEditDialog",
components: {
@ -87,6 +68,8 @@ export default {
Form,
Button,
FormTable,
Table,
ScopeTable
},
model: {
prop: "visible",
@ -112,24 +95,10 @@ export default {
planId: 0,
submitting: false,
formData: {
eventCategory: 1,
eventType: 1,
triggerMechanism: "",
},
secondFormData: [
{
deviceType: 1,
searchRule: 1,
qbb: "",
},
],
thirdFormData: [
{
deviceType: 1,
searchRule: 1,
qbb: "",
},
],
tableData: [],
deviceData: [],
eventOptions: trafficKV,
mechanismOptions: [
@ -170,34 +139,17 @@ export default {
if (Object.keys(this.detail).length > 0) {
this.title = "修改预案";
this.dialogType = 2;
this.eventOptions = typeMap[this.detail.eventCategory];
this.mechanismOptions =
eventSubClassMap[this.detail.eventCategory || 1][
this.detail.eventType
];
this.mechanismOptions = eventSubClassMap[1][this.detail.eventType];
this.initData(this.detail.id);
} else {
this.title = "新增预案";
this.dialogType = 1;
this.formData = {
eventCategory: 1,
eventType: 1,
triggerMechanism: "",
};
this.secondFormData = [
{
deviceType: 1,
searchRule: 1,
qbb: "",
},
];
this.thirdFormData = [
{
deviceType: 1,
searchRule: 1,
qbb: "",
},
];
console.log('defaultTableInfo', { ...defaultTableInfo })
this.tableData = [{ ...defaultTableInfo }]
}
}
return this.visible;
@ -216,43 +168,38 @@ export default {
.then((result) => {
if (result.code != 200) return Message.error(result?.msg);
let data = result.data;
let dcExecuteAction = result.data.dcExecuteAction;
let dcExecuteAction = data.dcExecuteAction;
this.planId = data.id;
this.formData = {
eventCategory: data.eventCategory,
planName: data.planName,
eventType: data.eventType,
triggerMechanism: data.triggerMechanism,
};
this.secondFormData = [];
this.thirdFormData = [];
let dcArr = [];
dcExecuteAction.forEach((it) => {
let action = {};
if (it.otherConfig) {
let config = JSON.parse(it.otherConfig);
let qbb = "";
if (config.id) {
qbb = config.content;
config = { dcInfoBoardTemplate: config };
}
// if (config.state) {
// config.gzms = config.state
// }
action = { ...it, ...config, qbb: qbb };
let action = { ...it };
if (it.executeConfig) {
let executeConfig = JSON.parse(it.executeConfig);
let execute = this.mapKeys(executeConfig, 'zx_');
action = { ...action, ...execute };
}
if (it.recoverConfig) {
let recoverConfig = JSON.parse(it.recoverConfig);
let recover = this.mapKeys(recoverConfig, 'hf_');
action = { ...action, ...recover };
}
if (it.deviceList) {
action.deviceList = it.deviceList
action.devList = it.deviceList
.split(",")
.map((str) => Number(str));
}
if (it.actionType == 1) {
this.secondFormData.push(action);
} else if (it.actionType == 2) {
this.thirdFormData.push(action);
}
dcArr.push(action);
});
console.log("secondFormData", this.secondFormData);
this.tableData = dcArr;
console.log("tableData", this.tableData);
})
// console.log('secondFormData', this.secondFormData)
// }).catch((err) => {
@ -265,6 +212,12 @@ export default {
Message.error("查询事件预案列表失败", err);
});
},
mapKeys(obj, prefix) {
return Object.keys(obj).reduce((result, key) => {
result[`${prefix}${key}`] = obj[key];
return result;
}, {});
},
async loadData(deviceType = 1) {
this.deviceData = [];
let result = await request({
@ -280,87 +233,80 @@ export default {
return this.deviceData;
},
changeEventType(value = 1) {
this.mechanismOptions =
eventSubClassMap[this.formData.eventCategory || 1][value];
},
changeRadio(value = 1) {
this.formData.triggerMechanism = "";
this.eventOptions = typeMap[value];
this.changeEventType(1);
console.log('changeEventType', value)
this.mechanismOptions = eventSubClassMap[1][value];
this.formData.triggerMechanism = ''
},
handleChange() { },
formatData(it, value = 1, id = "") {
let data = { ...it, actionType: value, emergencyPlansId: id };
if (
it.deviceList &&
typeof it.deviceList !== "string" &&
it.deviceList.length > 0
) {
data.deviceList = it.deviceList.join(",");
} else {
data.deviceList = "";
}
if (it.content) {
data.otherConfig = JSON.stringify({ content: it.content });
onAdd() {
this.tableData.push({ ...defaultTableInfo })
},
onDel(index) {
if (this.tableData.length <= 1) {
return Message.warning('最后一项不可删除!');
}
this.tableData.splice(index, 1)
},
formatData(it) {
let data = {};
if (it.controlModel) {
let other = {
data = {
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],
data = {
...data,
startTime: it.time[0],
endTime: it.time[1],
};
}
data.otherConfig = JSON.stringify(other);
}
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 flg = false;
// for (let item of secondFormTable) {
// if (this.areAllValuesEmpty(item)) { flg = true; break };
// }
// if (flg) return Message.warning('');
// for (let item of thirdFormTable) {
// if (this.areAllValuesEmpty(item)) { flg = true; break };
// }
// if (flg) return Message.warning('');
// console.log('12', secondFormTable);
// console.log('34', 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));
});
this.tableData.forEach(item => {
let dcData = {
id: item.id || '',
deviceType: item.deviceType,
searchRule: item.searchRule,
number: item.number
}
if (this.dialogType == 2) {
dcData.emergencyPlansId = this.planId;
}
if (item.devList && item.devList.length > 0) {
dcData.deviceList = item.devList.join(",");
}
let zxData = {}, hfData = {};
Object.keys(item).forEach(key => {
if (/^zx_/.test(key)) {
let keyName = key.substring(3);
zxData[keyName] = item[key];
}
if (/^hf_/.test(key)) {
let keyName = key.substring(3);
hfData[keyName] = item[key];
}
})
if (item.deviceType == 12) {
zxData = this.formatData(zxData);
hfData = this.formatData(hfData);
}
dcData.executeConfig = JSON.stringify(zxData);
dcData.recoverConfig = JSON.stringify(hfData);
dcArr.push(dcData);
})
console.log({
...this.formData,
dcExecuteAction: dcArr,
dcExecuteAction: dcArr
});
// return;
if (this.dialogType == 1) {
@ -468,5 +414,26 @@ export default {
justify-content: end;
gap: 15px;
}
.rowBlock {
background-color: #296887;
padding: 5px 10px;
margin-bottom: 10px;
}
}
.elButton {
background: #2ba8c3;
border-radius: 2px 2px 2px 2px;
color: #FFFFFF;
}
.elButton:hover,
.elButton:focus {
background: #2ba8c3;
border-radius: 2px 2px 2px 2px;
border-color: #FFFFFF;
color: #FFFFFF;
}
</style>

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

@ -1,5 +1,4 @@
import * as PresetFormItems from "@screen/pages/control/event/event/FormEvent/PresetFormItems.js";
import { merge, cloneDeep } from "lodash";
import { planDeviceOptions } from "@screen/utils/enum.js";
export const searchFormList = [
{
@ -7,50 +6,19 @@ export const searchFormList = [
key: "planName",
},
{
label: "事件分类:",
key: "eventCategory",
type: "RadioGroup",
label: "设备类型:",
key: "deviceType",
type: "select",
options: {
options: [
{
key: "1",
label: "交通事件",
},
{
key: "2",
label: "感知事件",
},
],
options: planDeviceOptions,
},
},
// {
// 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.station,
// label: "开始桩号:",
// required: false,
// },
// merge(cloneDeep(PresetFormItems.station), {
// options: {
// options: [
// {
// key: "endStakeMark[0]",
// },
// {
// key: "endStakeMark[1]",
// },
// ],
// },
// label: "结束桩号:",
// required: false,
// }),
];
export const defaultTableInfo = {
deviceType: 2,
searchRule: 1,
number: 0,
// zx_operationType: 2,
// hf_operationType: 2,
};

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

@ -24,9 +24,9 @@
<!-- 内容 -->
<div class="body">
<Table :data="tableData">
<ElTableColumn prop="strEventCategory" label="事件分类" width="100" align="center" />
<ElTableColumn prop="strEventType" label="事件类型" width="100" align="center" />
<!-- <ElTableColumn prop="strEventCategory" label="事件分类" width="100" align="center" /> -->
<ElTableColumn prop="planName" label="预案名称" width="140" align="center" />
<ElTableColumn prop="strEventType" label="事件类型" width="140" align="center" />
<ElTableColumn prop="triggeringCondition" label="检索条件" width="140" />
<ElTableColumn prop="deviceType" label="设备类型" />
<ElTableColumn prop="controllableDeviceName" label="可控设备" />
@ -63,12 +63,7 @@ import request from "@/utils/request";
import { confirm } from "@screen/utils/common";
import { Message } from 'element-ui'
import { searchFormList } from './data';
import { WarningType, trafficType } from "@screen/utils/enum.js";
const eventTypeMap = {
1: trafficType,
2: WarningType,
}
import { trafficType } from "@screen/utils/enum.js";
export default {
name: 'controlEventPlan',
@ -106,8 +101,7 @@ export default {
}).then((result) => {
if (result.code != 200) return Message.error(result?.msg);
result.rows.forEach(it => {
it.strEventCategory = it.eventCategory == 1 ? '交通事件' : '感知事件';
it.strEventType = eventTypeMap[it.eventCategory || 0][it.eventType];
it.strEventType = trafficType[it.eventType];
// it.strDeviceType = deviceMap[it.deviceType];
})
this.tableData = result.rows;

34
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/plan/qbbDialog/index.vue

@ -1,25 +1,17 @@
<template>
<Dialog v-model="modelVisible" title="选择情报板" width="550px">
<div class="EventAddPlanDialog">
<Dialog v-model="modelVisible" title="选择情报板" width="700px">
<div class="PlanQbbDialog">
<vuescroll :ops="scrollOptions" class="listBox">
<div v-for="item in templateAvailable" :key="item.dictValue">
<!-- 原来是<el-collapse v-model="activeNames"> -->
<h3>{{ item.dictLabel }}</h3>
<div v-for="(itm, indx) in item.list" :key="indx" class="tplItem">
<!-- 模板内容 -->
<BoardTplPreview
class="boardPreview"
boardWH="1400*200"
:tpl="itm"
></BoardTplPreview>
<BoardTplPreview class="boardPreview" boardWH="1400*200" :tpl="itm"></BoardTplPreview>
<!-- 操作按钮 -->
<div class="infoBtnBox infoBtnBoxSm">
<p class="btn">
<el-radio
v-model="radio1"
:label="itm.id"
@input="changeRadio(itm)"
/>
<el-radio v-model="radio1" :label="itm.id" @input="changeRadio(itm)" />
</p>
</div>
</div>
@ -28,17 +20,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>
@ -67,7 +51,7 @@ export default {
visible: Boolean,
info: {
type: Object,
default: () => {},
default: () => { },
},
},
data() {
@ -255,7 +239,7 @@ export default {
opacity: 0;
}
.EventAddPlanDialog {
.PlanQbbDialog {
gap: 9px;
width: 650px;
height: 510px;

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

@ -288,49 +288,49 @@ export const eventSubClassMap = {
],
2: [
{
value: 1,
value: '1',
label: "高速主线",
},
{
value: 2,
value: '2',
label: "服务区",
},
{
value: 3,
value: '3',
label: "立交桥",
},
{
value: 4,
value: '4',
label: "收费站",
},
],
3: [
{
value: 1,
value: '1',
label: "主线关闭",
},
{
value: 2,
value: '2',
label: "主线限行",
},
{
value: 6,
value: '6',
label: "收费站关闭",
},
{
value: 7,
value: '7',
label: "收费站限行",
},
{
value: 10,
value: '10',
label: "匝道立交关闭",
},
{
value: 12,
value: '12',
label: "匝道立交限行",
},
{
value: 14,
value: '14',
label: "服务区关闭",
},
],
@ -394,43 +394,43 @@ export const eventSubClassMap = {
],
7: [
{
value: 1,
value: '1',
label: "道路养护施工",
},
{
value: 2,
value: '2',
label: "收费站养护施工",
},
{
value: 3,
value: '3',
label: "服务区养护施工",
},
{
value: 4,
value: '4',
label: "枢纽立交匝道养护施工",
},
{
value: 5,
value: '5',
label: "地方道路养护施工",
},
{
value: 6,
value: '6',
label: "道路工程建设施工",
},
{
value: 7,
value: '7',
label: "收费站工程建设施工",
},
{
value: 8,
value: '8',
label: "服务区工程建设施工",
},
{
value: 9,
value: '9',
label: "枢纽立交匝道工程建设施工",
},
{
value: 10,
value: '10',
label: "地方道路工程建设施工",
},
],
@ -450,27 +450,27 @@ export const eventSubClassMap = {
],
9: [
{
value: 1,
value: '1',
label: "摄像机",
},
{
value: 2,
value: '2',
label: "护栏",
},
{
value: 3,
value: '3',
label: "隔离栅",
},
{
value: 4,
value: '4',
label: "情报板",
},
{
value: 5,
value: '5',
label: "防炫板",
},
{
value: 6,
value: '6',
label: "其他",
},
],
@ -514,7 +514,7 @@ export const eventSubClassMap = {
],
11: [
{
value: 1,
value: '1',
label: "其他事件",
},
],
@ -763,10 +763,10 @@ export const planDeviceMap = {
};
//预案设备Options
export const planDeviceOptions = [
{
value: 1,
label: "摄像机",
},
// {
// value: 1,
// label: "摄像机",
// },
{
value: 2,
label: "可变信息标志",
@ -781,7 +781,7 @@ export const planDeviceOptions = [
// },
{
value: 5,
label: "路段语音广播",
label: "语音广播",
},
// {
// value: 6,
@ -791,17 +791,17 @@ export const planDeviceOptions = [
// value: 7,
// label: "毫米波雷达",
// },
{
value: 8,
label: "合流区预警",
},
// {
// value: 8,
// label: "合流区预警",
// },
// {
// value: 9,
// label: "智慧锥桶",
// },
{
value: 10,
label: "激光疲劳唤醒",
label: "疲劳唤醒",
},
// {
// value: 11,
@ -813,12 +813,12 @@ export const planDeviceOptions = [
},
{
value: 13,
label: "智能设备箱",
},
{
value: 14,
label: "光线在线监测",
label: "设备箱",
},
// {
// value: 14,
// label: "光线在线监测",
// },
];
// 非机预警事件主类

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