Browse Source

完善指挥调度

wangqin
zhangzhang 7 months ago
parent
commit
886eddd75e
  1. 49
      ruoyi-ui/src/views/JiHeExpressway/components/TimeLine/TimeLine2/index.vue
  2. 143
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/CrowdnessIndicatorRankings/index.vue
  3. 37
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/DeviceControl/index.vue
  4. 1
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/DispatchLiaison/StatsDialogVisible/index.vue
  5. 27
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/DispatchLiaison/index.vue
  6. 22
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/DisposalProcess/DialogVisible/index.vue
  7. 86
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/DisposalProcess/index.vue
  8. 72
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/EventInformation/components/EditEventInformationDialog/index.vue
  9. 106
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/EventInformation/index.vue
  10. 38
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/RealTimeVideo/index.vue
  11. 89
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/ReleaseInformation/index.vue
  12. 69
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/TrafficControl/index.vue
  13. 16
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/index.vue

49
ruoyi-ui/src/views/JiHeExpressway/components/TimeLine/TimeLine2/index.vue

@ -1,5 +1,5 @@
<template>
<div class="TimeLine2">
<div class="TimeLine2" id="scrollbox">
<!-- { "time": "2024/4/16 11:30:07", "name": "1", "desc": "111", "source": 1 } -->
<div class="node" v-for="(item, index) in data" :key="index">
<div class="content" v-if="!item.onlyright">
@ -61,7 +61,53 @@ export default {
default: "auto",
},
},
watch: {
data: {
handler(newValue, oldValue) {
// this.hideScrollFn();
// console.log(789, newValue);
this.$nextTick(() => {
let scrollbox = document.getElementById("scrollbox");
scrollbox.scrollTop = scrollbox.scrollHeight;
});
console.log(88, scrollbox.scrollHeight);
console.log(99, scrollbox.scrollTop);
},
},
},
methods: {
hideScrollFn() {
//
document.documentElement.style.overflow = "hidden";
//
function disableScroll() {
//
const scrollPosition =
window.pageYOffset ||
document.documentElement.scrollTop ||
document.body.scrollTop ||
0;
//
document.body.style.position = "fixed";
document.body.style.top = `-${scrollPosition}px`;
}
//
function enableScroll() {
//
const scrollPosition = parseInt(document.body.style.top || "0", 10);
//
document.body.style.position = "";
document.body.style.top = "";
//
window.scrollTo(0, -scrollPosition);
}
},
getDirection(item, index, position) {
if (this.direction != "auto") return this.direction === position;
if (item.direction) return item.direction === position;
@ -74,6 +120,7 @@ export default {
}
},
},
mounted() {},
};
</script>

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

@ -4,8 +4,9 @@
<AMapContainer
ref="AMapContainerRef"
v-if="delayLoad"
@update:isGisCompleted="(data) => {
this.bindMap(data)
@update:isGisCompleted="
(data) => {
this.bindMap(data);
}
"
style="z-index: 9"
@ -19,7 +20,7 @@
@click="handleClick(item)"
>
<div
v-if="['bar','level','camera'].indexOf(item.key) !== -1"
v-if="['bar', 'level', 'camera'].indexOf(item.key) !== -1"
class="label"
slot="reference"
:style="{
@ -90,6 +91,7 @@ export default {
AMapContainer,
},
mixins: [provideMixin],
inject: ["provideData"],
data() {
return {
active: [],
@ -117,11 +119,11 @@ export default {
],
delayLoad: true,
weatherData: {},
markerBoard:[],
dialogVisible:false,
markerBoard: [],
dialogVisible: false,
dialogData: null,
markerCamera:[],
dialogVisibleCamera:false,
markerCamera: [],
dialogVisibleCamera: false,
dialogDataCamera: null,
};
},
@ -145,6 +147,9 @@ export default {
if (!bool) return;
},
},
// "provideData.detail"(newValue, oldValue) {
// this.provideDetail = newValue;
// },
},
methods: {
handleClick(item) {
@ -162,14 +167,14 @@ export default {
});
} else if (item.key === "bar") {
this.$refs.AMapContainerRef.showRoadConditions(findIndex === -1);
} else if (item.key === 'level'){
} else if (item.key === "level") {
this.getBoard(findIndex === -1);
} else if (item.key === 'camera'){
} else if (item.key === "camera") {
this.getCamera(findIndex === -1);
}
},
getCamera(isShow){
if(isShow){
getCamera(isShow) {
if (isShow) {
const self = this;
this.markerCamera = [];
request({
@ -178,28 +183,36 @@ export default {
params: {
pileNum: this.detailData.stakeMark,
},
}).then(result=>{
if (result.code != 200) return Message.error(`查询失败!${result.msg}`);
const list = [...result.data.downCamera,...result.data.upCamera];
}).then((result) => {
if (result.code != 200)
return Message.error(`查询失败!${result.msg}`);
const list = [...result.data.downCamera, ...result.data.upCamera];
const icon = require(`@screen/images/layer/路测设备/摄像机_active.svg`);
const icon_f = require(`@screen/images/layer/路测设备/摄像机_fault.svg`);
list.forEach(e => {
const p = new AMap.LngLat(parseFloat(e.longitude), parseFloat(e.latitude));
const m = this.addMarker(p,e.useState?icon:icon_f,e.useState,function(){
console.log(e,'-------------')
if(e.useState === 1){
list.forEach((e) => {
const p = new AMap.LngLat(
parseFloat(e.longitude),
parseFloat(e.latitude)
);
const m = this.addMarker(
p,
e.useState ? icon : icon_f,
e.useState,
function () {
if (e.useState === 1) {
self.dialogDataCamera = e;
self.dialogVisibleCamera = true;
} else {
self.$message.warning("设备未接入!!");
}
})
this.markerCamera.push(m)
}
);
this.markerCamera.push(m);
});
});
})
} else {
this.markerCamera.forEach(e => {
this.markerCamera.forEach((e) => {
e.setMap(null);
e = null;
});
@ -208,36 +221,48 @@ export default {
handledDialogCamera(bool) {
this.dialogVisibleCamera = bool;
},
getBoard(isShow){
if(isShow){
getBoard(isShow) {
if (isShow) {
const self = this;
this.markerBoard = [];
const fileData = new FormData(); // new formData
fileData.append("stakeMark", this.detailData.stakeMark);
fileData.append("direction", this.detailData.direction ==='济南方向'?1:2);
fileData.append(
"direction",
this.detailData.direction === "济南方向" ? 1 : 2
);
request({
url: "/business/device/selectNearBoard",
method: "post",
data:fileData
}).then(result=>{
if (result.code != 200) return Message.error(`查询失败!${result.msg}`);
data: fileData,
}).then((result) => {
if (result.code != 200)
return Message.error(`查询失败!${result.msg}`);
const icon = require(`@screen/images/layer/路测设备/情报板_active.svg`);
const icon_f = require(`@screen/images/layer/路测设备/情报板_fault.svg`);
result.data.forEach(e => {
const p = new AMap.LngLat(parseFloat(e.longitude), parseFloat(e.latitude));
const m = this.addMarker(p,e.useState?icon:icon_f,e.useState,function(){
if(e.useState === 1){
result.data.forEach((e) => {
const p = new AMap.LngLat(
parseFloat(e.longitude),
parseFloat(e.latitude)
);
const m = this.addMarker(
p,
e.useState ? icon : icon_f,
e.useState,
function () {
if (e.useState === 1) {
self.dialogData = e;
self.dialogVisible = true;
} else {
self.$message.warning("设备未接入!");
}
})
this.markerBoard.push(m)
}
);
this.markerBoard.push(m);
});
});
})
} else {
this.markerBoard.forEach(e => {
this.markerBoard.forEach((e) => {
e.setMap(null);
e = null;
});
@ -247,41 +272,45 @@ export default {
this.dialogVisible = bool;
},
getWeather() {
getWeatherForecast(117.2, 36.65).then((res) => {
getWeatherForecast(
this.detailData.longitude,
this.detailData.dimension
).then((res) => {
this.weatherData =
res.data.weatherInTheAreaWhereTheIncidentOccurred.now;
console.log("气象", res);
});
},
//
bindMap(isLoaded){
if(!isLoaded){
bindMap(isLoaded) {
if (!isLoaded) {
return;
}
const self = this;
setTimeout(() => {
// map
const {AMap,mapIns} = self.$refs.AMapContainerRef.getMapInstance();
const {longitude,dimension,eventName} = self.detailData;
const { AMap, mapIns } = self.$refs.AMapContainerRef.getMapInstance();
const { longitude, dimension, eventName } = self.detailData;
const icon = require(`@screen/images/layer/事件专题/${eventName}_active.svg`);
const center = new AMap.LngLat(parseFloat(longitude), parseFloat(dimension));
self.addMarker(center,icon, 1);
const center = new AMap.LngLat(
parseFloat(longitude),
parseFloat(dimension)
);
self.addMarker(center, icon, 1);
mapIns.setZoomAndCenter(12, center);
//
console.log(mapIns,AMap,'--------')
console.log(self.detailData,'############');
console.log(mapIns, AMap, "--------");
console.log(self.detailData, "############");
}, 500);
},
addMarker(position,icon, state, fn = null){
const {AMap,mapIns} = this.$refs.AMapContainerRef.getMapInstance();
addMarker(position, icon, state, fn = null) {
const { AMap, mapIns } = this.$refs.AMapContainerRef.getMapInstance();
const nowBg = require(`@screen/images/mapBg/active.svg`);
const nowBg_f = require(`@screen/images/mapBg/fault.svg`);
var marker = new AMap.Marker({
position:position,
position: position,
content: `
<div style="
background-image: url(${state?nowBg:nowBg_f});
background-image: url(${state ? nowBg : nowBg_f});
background-size: 100% 100%;
background-repeat: no-repeat;
width: 51px;
@ -300,16 +329,16 @@ export default {
>
</div>
`,
anchor: 'bottom-center',
anchor: "bottom-center",
});
marker.on("click", (e) => {
if(fn){
fn(e)
if (fn) {
fn(e);
}
})
});
mapIns.add(marker);
return marker;
}
},
},
mounted() {
this.bindMap();

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

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

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

@ -161,7 +161,6 @@ export default {
});
this.form.employees = newEmployees;
this.form.vehicle = newVehiclesMap;
console.log("88888888", this.form);
postUpdateSource(this.form).then((res) => {
this.$emit("handleRefresh");

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

@ -1,7 +1,11 @@
<template>
<Card class="DispatchLiaison" title="调度联络">
<template #title-suffix>
<ButtonGradient class="title-button" @click.native="handleClick">
<ButtonGradient
v-if="detailData.eventState != 2"
class="title-button"
@click.native="handleClick"
>
调度
</ButtonGradient>
</template>
@ -73,8 +77,10 @@ export default {
Descriptions,
StatsDialogVisible,
},
inject: ["provideData"],
data() {
return {
provideDetail: null,
dispatchData: [],
dispatchList: [],
vehicleTypeList: [],
@ -85,6 +91,14 @@ export default {
vehiclesChoice: [],
};
},
watch: {
"provideData.detail"(newValue, oldValue) {
this.provideDetail = newValue;
this.getCommandDispatch();
this.getVehicleTypeList();
// console.log("", this.provideDetail);
},
},
methods: {
handleClick() {
this.statsDialogVisible = true;
@ -94,8 +108,8 @@ export default {
},
getCommandDispatch() {
let data = {
stakeMark: "K100+100",
id: "96b9918efc01488cb22fa1d9d3236dfd",
stakeMark: this.provideDetail.stakeMark,
id: this.provideDetail.id,
};
postCommandDispatch(data).then((res) => {
res.data.listData?.forEach((element) => {
@ -137,8 +151,6 @@ export default {
// this.vehiclesChoice.push(element);
this.vehiclesChoice.push(element.resourceId);
});
// console.log("this.employeesChoice", this.employeesChoice);
// console.log("this.vehiclesChoice", this.vehiclesChoice);
});
},
getVehicleTypeList() {
@ -156,10 +168,7 @@ export default {
.catch((err) => {});
},
},
mounted() {
this.getCommandDispatch();
this.getVehicleTypeList();
},
mounted() {},
};
</script>

22
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/DisposalProcess/DialogVisible/index.vue

@ -610,8 +610,10 @@ export default {
},
eventId: String,
},
inject: ["provideData"],
data() {
return {
provideDetail: {},
type: 0,
newType: 0,
showDocx: false,
@ -649,6 +651,15 @@ export default {
// submitting: false,
};
},
watch: {
async "provideData.detail"(newValue, oldValue) {
this.provideDetail = newValue;
this.eventId = newValue.id;
this.initData();
this.getReportData();
this.getImportantFileStatus();
},
},
computed: {
modelVisible: {
get() {
@ -665,7 +676,7 @@ export default {
methods: {
async initData() {
let infoData = await request({
url: `/dc/system/event/eventSubclass/1/60f022d95a7c4b6cada2d780246543d8`, //
url: `/dc/system/event/eventSubclass/1/${this.eventId}`, //
method: "get",
});
@ -819,6 +830,7 @@ export default {
getImportantFileStatus() {
importantFileStatus(this.eventId).then((res) => {
this.type = res.data;
this.$emit("update:type", this.type);
console.log("事件状态", res.data);
});
},
@ -828,7 +840,7 @@ export default {
deventImportantFileList(this.eventId, type).then((res) => {
if (res.length > 0) {
this.formFileData = res[0];
if (type == "2") {
if (type == "1" || type == "2") {
this.renewedList = res;
}
} else {
@ -919,11 +931,7 @@ export default {
},
},
mounted() {
this.initData();
this.getReportData();
this.getImportantFileStatus();
},
mounted() {},
};
</script>

86
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/DisposalProcess/index.vue

@ -2,15 +2,37 @@
<div>
<Card class="DisposalProcess" title="处置过程">
<template #title-suffix>
<ButtonGradient class="title-button" @click="handleEventRelieve">
<ButtonGradient
v-if="detailData.eventState != 2"
class="title-button"
@click="handleEventRelieve"
>
事件解除
</ButtonGradient>
<!-- <ButtonGradient class="title-button"> 协同调度 </ButtonGradient> -->
<ButtonGradient class="title-button" @click="handleNoWrecker">
<ButtonGradient
v-if="
detailData.eventState != 2 &&
(detailData.eventType == 2 || detailData.eventType == 6)
"
class="title-button"
@click="handleNoWrecker"
>
<!-- v-if=" -->
无需清障
</ButtonGradient>
<ButtonGradient class="title-button" @click="handleClick">
重要事件上报||已初报待续报||重要事件已送报
<ButtonGradient
v-if="detailData.eventState != 2 && detailData.eventType == 4"
class="title-button"
@click="handleClick"
>
{{
dialogType == "0"
? "重要事件上报"
: dialogType == "1" || dialogType == "2"
? "已初报待续报"
: "重要事件已送报"
}}
</ButtonGradient>
<!-- <ButtonGradient class="title-button"> 路赔 </ButtonGradient> -->
@ -35,7 +57,12 @@
<TimeLine2 :data="timeLine2List" style="flex: 1" />
<div v-if="!timeLine2List.length" class="no-data">暂无数据</div>
<div class="bottom">
<ElSelect v-model="processId" clearable placeholder="请选择关键点">
<ElSelect
v-model="processId"
clearable
placeholder="请选择关键点"
:disabled="detailData.eventState == 2"
>
<ElOption
v-for="item in options"
:key="item.nodeNode"
@ -45,6 +72,7 @@
</ElOption>
</ElSelect>
<RadioGroup
:disabled="detailData.eventState == 2"
:options="[
{ key: 'input', label: '输入' },
{ key: 'upload', label: '上传' },
@ -53,12 +81,14 @@
type="button"
/>
<ElInput
:disabled="detailData.eventState == 2"
v-if="testRadio == 'input'"
class="input"
v-model="context"
placeholder="请输入调度指令"
/>
<el-upload
:disabled="detailData.eventState == 2"
v-if="testRadio == 'upload'"
class="input"
:headers="headers"
@ -71,7 +101,12 @@
>
<el-button class="input">点击上传</el-button>
</el-upload>
<ElSelect v-model="text" clearable placeholder="请选择常用语">
<ElSelect
:disabled="detailData.eventState == 2"
v-model="text"
clearable
placeholder="请选择常用语"
>
<ElOption
v-for="item in phrasesOptions"
:key="item"
@ -80,7 +115,11 @@
>
</ElOption>
</ElSelect>
<ButtonGradient class="title-button special-button" @click="onSubmit">
<ButtonGradient
v-if="detailData.eventState != 2"
class="title-button special-button"
@click="onSubmit"
>
发送
</ButtonGradient>
<!-- <ButtonGradient class="title-button special-button">
@ -91,6 +130,7 @@
<DialogVisible
:visible="dialogVisible"
@update:value="handleClose"
@update:type="handleUpdate"
:eventId="eventId"
/>
<!-- :data="dispatchList" -->
@ -116,12 +156,12 @@ import {
// import { provideMixin } from "./../../mixin";
import { timeLine2List } from "./data";
import request from "@/utils/request";
import { provideMixin } from "./../../mixin"
import { provideMixin } from "./../../mixin";
export default {
name: "DisposalProcess",
mixins: [provideMixin],
inject: ["adpScale"],
inject: ["adpScale", "provideData"],
// mixins: [provideMixin],
components: {
Card,
@ -134,8 +174,10 @@ export default {
emit: ["fullHeight"],
data() {
return {
provideDetail: {},
dialogType: "",
dialogVisible: false,
eventId: "f537723231d44eb59df27d81b3341d8d",
eventId: "",
test: null,
testRadio: "input",
timeLine1List: [],
@ -170,6 +212,12 @@ export default {
this.context = newVlaue;
}
},
async "provideData.detail"(newValue, oldValue) {
this.provideDetail = newValue;
this.eventId = newValue.id;
await this.disposalRecords(this.eventId);
// console.log("", this.provideDetail);
},
},
methods: {
filterDistance(distance) {
@ -203,6 +251,7 @@ export default {
//
async disposalRecords(id) {
let processIdMap = {};
console.log("canshu ", id);
getProcessList(id).then((result) => {
console.log("处置过程记录", result);
this.timeLine2List = result.map((item) => {
@ -301,15 +350,18 @@ export default {
handleClose() {
this.dialogVisible = false;
},
handleUpdate(val) {
this.dialogType = val;
console.log("传过来的状态", val);
},
},
async mounted() {
const self = this;
setTimeout(async () => {
self.eventId = self.detailData.id;
self.getProcess();
await self.disposalRecords(self.eventId);
}, 500);
// const self = this;
// setTimeout(async () => {
// self.eventId = self.detailData.id;
// self.getProcess();
// await self.disposalRecords(self.eventId);
// }, 500);
},
};
</script>

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

@ -1,11 +1,19 @@
<template>
<Dialog v-model="modelVisible" title="修改事件信息" width="1100px" top="10%">
<div class="EditEventInformationDialog">
<Form class="form" ref="FormConfigRef" :formList="formConfigList" v-model="fData" labelWidth="120px" />
<Form
class="form"
ref="FormConfigRef"
:formList="formConfigList"
v-model="fData"
labelWidth="120px"
/>
<div class="footer">
<Button @click.native="onSubmit" :loading="submitting">保存</Button>
<Button style="background: #c9c9c9" @click.native="modelVisible = false">关闭</Button>
<Button style="background: #c9c9c9" @click.native="modelVisible = false"
>关闭</Button
>
</div>
</div>
</Dialog>
@ -18,6 +26,7 @@ import Button from "@screen/components/Buttons/Button.vue";
import request from "@/utils/request";
import { tabConfigList } from "./data.js";
import { Message } from "element-ui";
import { provideMixin } from "./../../../../mixin";
export default {
name: "EditEventInformationDialog",
@ -30,61 +39,63 @@ export default {
prop: "visible",
event: "close",
},
mixins: [provideMixin],
props: {
visible: Boolean,
},
// inject: ["provideData"],
data() {
return {
formConfigList: [],
submitting: false,
fData: {},
resultEventData: {},
eventId: '1a91d65cc31f4a9d90122888edb31043',
// eventId: "1a91d65cc31f4a9d90122888edb31043",
roads: [],
direction: [],
lwss: []
lwss: [],
};
},
computed: {
modelVisible: {
get() {
if (this.visible) {
this.initData()
this.initData();
}
return this.visible;
},
set(val) {
console.log('val', val)
console.log("val", val);
this.$emit("close", val);
},
},
},
mounted() {
},
mounted() {},
methods: {
async initData() {
let infoData = await request({
url: `/dc/system/event/eventSubclass/1/60f022d95a7c4b6cada2d780246543d8`,//
url: `/dc/system/event/eventSubclass/1/${this.detailData.id}`, //
method: "get",
})
});
if (infoData.code != 200) return Message.error(infoData?.msg);
this.resultEventData = { ...infoData.data };
let info = infoData.data;
if (typeof info.stakeMark == 'string') {
if (typeof info.stakeMark == "string") {
let numbers = info.stakeMark.match(/\d+/g).map(Number);
// console.log('numbers', numbers);
info.stakeMark = numbers;
}
if (typeof info.lang == 'string') {
info.lang = info.lang.split(',');
if (typeof info.lang == "string") {
info.lang = info.lang.split(",");
}
this.fData = info;
let configList = tabConfigList.find(item => item.label == this.fData.eventName)
this.formConfigList = configList.formConfig.list
let configList = tabConfigList.find(
(item) => item.label == this.fData.eventName
);
this.formConfigList = configList.formConfig.list;
await Promise.all([
//
@ -109,7 +120,7 @@ export default {
})
.then((result) => {
if (result.code != 200) return Message.error(result?.msg);
this.direction = []
this.direction = [];
result.data.forEach((it) => {
this.direction.push({ key: it.dictValue, label: it.dictLabel });
});
@ -137,7 +148,7 @@ export default {
console.log("err", err);
Message.error("查询失败6", err);
}),
])
]);
this.formConfigList.forEach((it) => {
if (it.key == "direction") {
@ -150,7 +161,6 @@ export default {
it.options.options = this.lwss.filter((ss) => ss.type == 6);
}
});
},
onSubmit() {
this.$refs.FormConfigRef.validate().then((formData) => {
@ -158,17 +168,26 @@ export default {
let eventType = this.resultEventData.eventType;
formData.eventType == eventType;
if ((eventType == 1 || eventType == 2) && Array.isArray(formData.lang)) {
if (
(eventType == 1 || eventType == 2) &&
Array.isArray(formData.lang)
) {
formData.lang = formData.lang.join(",");
}
if (eventType == 3 && formData.dcEventTrafficControl.facilityId instanceof Array) {
if (
eventType == 3 &&
formData.dcEventTrafficControl.facilityId instanceof Array
) {
let ids = formData.dcEventTrafficControl.facilityId;
formData.dcEventTrafficControl.facilityIds = ids
formData.dcEventTrafficControl.facilityId = ''
formData.dcEventTrafficControl.facilityIds = ids;
formData.dcEventTrafficControl.facilityId = "";
}
if (formData.endStakeMark && formData.endStakeMark[0] != null) {
let endStakeMark = formData.endStakeMark;
let strMark = endStakeMark && endStakeMark.length > 0 ? "K" + endStakeMark[0] + "+" + endStakeMark[1] : "";
let strMark =
endStakeMark && endStakeMark.length > 0
? "K" + endStakeMark[0] + "+" + endStakeMark[1]
: "";
if (eventType == 4) {
formData.dcEventTrafficCongestion.endStakeMark = strMark;
}
@ -220,9 +239,8 @@ export default {
this.submitting = false;
});
});
}
}
},
},
};
</script>

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

@ -1,98 +1,126 @@
<template>
<Card class='EventInformation' title="事件信息">
<Card class="EventInformation" title="事件信息">
<template #title-suffix>
<ButtonGradient class="title-button">
<ButtonGradient class="title-button" v-if="detailData.eventState != 2">
搜索
</ButtonGradient>
<ButtonGradient class="title-button" @click.native="editEventInformationDialogVisible = true">
<ButtonGradient
v-if="detailData.eventState != 2"
class="title-button"
@click.native="editEventInformationDialogVisible = true"
>
编写
</ButtonGradient>
</template>
<Descriptions :list="list" :data="detailData" style="gap: 15px;" />
<Descriptions :list="list" :data="detailData" style="gap: 15px" />
<div class="road-lane">
<div v-for="i in 11">
<!-- <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 || !detailData.lang.includes((i).toString())) " src="./images/normal.svg">
<img v-if="i != 6 && detailData.lang && detailData.lang.includes((i).toString())" src="./images/congestion.svg">
<img
v-if="
i != 6 &&
(!detailData.lang || !detailData.lang.includes(i.toString()))
"
src="./images/normal.svg"
/>
<img
v-if="
i != 6 && detailData.lang && detailData.lang.includes(i.toString())
"
src="./images/congestion.svg"
/>
</div>
</div>
<div class="bottom-info">
<div class="tag" >{{ detailData.eventLevel?`${detailData.eventCause+['','一','二','三','四','五'][detailData.eventLevel]}级事件` : '暂无事件等级' }}</div>
<div class="tag">
{{
detailData.eventLevel
? `${
detailData.eventCause +
["", "一", "二", "三", "四", "五"][detailData.eventLevel]
}级事件`
: "暂无事件等级"
}}
</div>
</div>
<EditEventInformationDialog v-model="editEventInformationDialogVisible" @close="closeDialog"/>
<EditEventInformationDialog
v-model="editEventInformationDialogVisible"
@close="closeDialog"
/>
</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 EditEventInformationDialog from "./components/EditEventInformationDialog/index"
import { provideMixin } from "./../../mixin"
import ButtonGradient from "@screen/components/Buttons/ButtonGradient.vue";
import Descriptions from "@screen/components/Descriptions.vue";
import EditEventInformationDialog from "./components/EditEventInformationDialog/index";
import { provideMixin } from "./../../mixin";
export default {
name: 'EventInformation',
name: "EventInformation",
mixins: [provideMixin],
components: {
Card,
ButtonGradient,
Descriptions,
EditEventInformationDialog
EditEventInformationDialog,
},
data() {
return {
list: [
{
label: '情报时间',
label: "情报时间",
// text: '2024-01-03 14:00:21',
key: "occurrenceTime",
gridColumn: 2
gridColumn: 2,
},
{
label: '情报来源',
label: "情报来源",
// text: '96659',
key: "stringEventSource",
gridColumn: 2
gridColumn: 2,
},
{
label: '事件类型',
label: "事件类型",
// text: '',
key: 'eventName'
key: "eventName",
},
{
label: '所属路线',
label: "所属路线",
// text: 'G34',
key: 'roadName'
key: "roadName",
},
{
label: '道路方向',
label: "道路方向",
// text: '',
key: 'direction'
key: "direction",
},
{
label: '桩号',
label: "桩号",
// text: "K266+001",
key: 'stakeMark'
}
key: "stakeMark",
},
],
editEventInformationDialogVisible: false
}
editEventInformationDialogVisible: false,
};
},
methods: {
closeDialog(){
closeDialog() {
this.editEventInformationDialogVisible = false;
}
}
}
},
},
mounted() {},
};
</script>
<style lang='scss' scoped>
<style lang="scss" scoped>
.EventInformation {
::v-deep {
>.content {
> .content {
display: flex;
flex-direction: column;
justify-content: space-between;
@ -107,9 +135,9 @@ export default {
background-size: 100% 100%;
// background-size: auto auto;
display: grid;
grid-template-columns: 1fr 1fr 1fr 1fr 1fr .5fr 1fr 1fr 1fr 1fr 1fr;
grid-template-columns: 1fr 1fr 1fr 1fr 1fr 0.5fr 1fr 1fr 1fr 1fr 1fr;
>div {
> div {
display: flex;
align-items: end;
padding-bottom: 18px;
@ -126,12 +154,12 @@ export default {
height: 24px;
background: rgba(245, 80, 80, 0.4);
border-radius: 2px;
border: 1px solid #F55050;
border: 1px solid #f55050;
font-size: 12px;
font-family: Source Han Sans SC, Source Han Sans SC;
font-weight: 400;
color: #F55050;
color: #f55050;
line-height: 14px;
}
}

38
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/RealTimeVideo/index.vue

@ -1,36 +1,46 @@
<template>
<Card class='RealTimeVideo' title="实时视频">
<Card class="RealTimeVideo" title="实时视频">
<div class="item">
<Video v-if="detailData.stakeMark" class="item-video" :pileNum="detailData.stakeMark" rangeIndex="upCamera"
:showHeader="false" />
<Video
v-if="detailData.stakeMark"
class="item-video"
:pileNum="detailData.stakeMark"
rangeIndex="upCamera"
:showHeader="false"
/>
<span>济南方向</span>
</div>
<div class="item">
<Video v-if="detailData.stakeMark" class="item-video" :pileNum="detailData.stakeMark" rangeIndex="downCamera"
:showHeader="false" />
<Video
v-if="detailData.stakeMark"
class="item-video"
:pileNum="detailData.stakeMark"
rangeIndex="downCamera"
:showHeader="false"
/>
<span>菏泽方向</span>
</div>
</Card>
</template>
<script>
import Card from "@screen/components/Card2/Card.vue";;
import Video from "@screen/components/VideoMulti"
import { provideMixin } from "./../../mixin"
import Card from "@screen/components/Card2/Card.vue";
import Video from "@screen/components/VideoMulti";
import { provideMixin } from "./../../mixin";
export default {
name: 'RealTimeVideo',
name: "RealTimeVideo",
mixins: [provideMixin],
inject: ["provideData"],
components: {
Card,
Video
}
}
Video,
},
};
</script>
<style lang='scss' scoped>
<style lang="scss" scoped>
.RealTimeVideo {
::v-deep {
.content {
display: flex;

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

@ -1,6 +1,6 @@
<template>
<Card class='ReleaseInformation' title="信息发布">
<Form :formList="formList" column="1" ref="FormMsgRef" >
<Card class="ReleaseInformation" title="信息发布">
<Form :formList="formList" column="1" ref="FormMsgRef">
<template #type="{ formData, data }">
<CheckboxGroup :options="checkboxList" v-model="formData[data.key]">
<template v-for="item in checkboxList" #[item.key]="{ data }">
@ -25,7 +25,12 @@
</Descriptions> -->
<div class="bottom">
<ButtonGradient @click.native="handleSubmit" :loading="submitting" class="title-button special-button">
<ButtonGradient
v-if="detailData.eventState != 2"
@click.native="handleSubmit"
:loading="submitting"
class="title-button special-button"
>
一键发布
</ButtonGradient>
<!-- <ButtonGradient class="title-button special-button">
@ -37,41 +42,43 @@
<script>
import Card from "@screen/components/Card2/Card.vue";
import ButtonGradient from '@screen/components/Buttons/ButtonGradient.vue';
import Form from '@screen/components/FormConfig';
import CheckboxGroup from '@screen/components/FormConfig/components/ElCheckboxGroup.vue';
import Descriptions from '@screen/components/Descriptions.vue';
import { provideMixin } from "./../../mixin"
import ButtonGradient from "@screen/components/Buttons/ButtonGradient.vue";
import Form from "@screen/components/FormConfig";
import CheckboxGroup from "@screen/components/FormConfig/components/ElCheckboxGroup.vue";
import Descriptions from "@screen/components/Descriptions.vue";
import { provideMixin } from "./../../mixin";
import request from "@/utils/request";
export default {
name: 'ReleaseInformation',
name: "ReleaseInformation",
mixins: [provideMixin],
components: {
Card,
ButtonGradient,
CheckboxGroup,
Form,
Descriptions
Descriptions,
},
inject: ["provideData"],
data() {
return {
list: [
{
label: '情报板',
label: "情报板",
key: "informationBoard",
gridColumn: 1
}
gridColumn: 1,
},
],
checkboxValues: [],
checkboxList: [
{ key: '1', label: '微信' },
{ key: '2', label: '短信' },
{ key: '3', label: '网站' },
{ key: '4', label: '新浪' },
{ key: "1", label: "微信" },
{ key: "2", label: "短信" },
{ key: "3", label: "网站" },
{ key: "4", label: "新浪" },
],
submitting: false,
formList: [{
formList: [
{
label: "发布内容:",
key: "content",
type: "input",
@ -79,32 +86,33 @@ export default {
type: "textarea",
autosize: true,
autosize: { minRows: 4, maxRows: 4 },
showWordLimit: true
}
showWordLimit: true,
},
},
{
label: "发布平台:",
key: "type",
type: "input",
default: []
}],
}
default: [],
},
],
};
},
methods: {
async handleSubmit(){
async handleSubmit() {
await this.$refs.FormMsgRef.validate()
.then(async (res) => {
const {content,type} = res;
if(content === null){
const { content, type } = res;
if (content === null) {
this.$message.warning(`未输入发布内容`);
return;
}
if(type.length === 0){
if (type.length === 0) {
this.$message.warning(`未选择发布平台`);
return;
}
if(type.indexOf('1') !== -1){
res.phone = '13589019062'
if (type.indexOf("1") !== -1) {
res.phone = "13589019062";
}
res.eventId = this.detailData.id;
this.submitting = true;
@ -127,16 +135,15 @@ export default {
});
})
.catch((err) => {
console.log("catch"+err);
console.log("catch" + err);
});
}
}
}
},
},
};
</script>
<style lang='scss' scoped>
<style lang="scss" scoped>
.ReleaseInformation {
::v-deep {
.content {
display: flex;
@ -153,12 +160,12 @@ export default {
align-items: start;
gap: 6px;
>div {
> div {
flex: 1;
font-size: 16px;
font-family: PingFang SC, PingFang SC;
font-weight: 400;
color: rgba(255, 255, 255, .6);
color: rgba(255, 255, 255, 0.6);
line-height: 19px;
letter-spacing: 1px;
}
@ -175,7 +182,13 @@ export default {
}
.line {
background: linear-gradient(to left, transparent 0%, transparent 24%, #3DE8FF 24%, #3DE8FF 100%);
background: linear-gradient(
to left,
transparent 0%,
transparent 24%,
#3de8ff 24%,
#3de8ff 100%
);
background-size: 10px 1px;
background-repeat: repeat-x;
height: 1px;

69
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/commandDispatch/Cards/TrafficControl/index.vue

@ -1,66 +1,79 @@
<template>
<Card class='TrafficControl' title="交通管制">
<Card class="TrafficControl" title="交通管制">
<RadioGroup v-model="eventSubclass" :options="radioList" />
<div class="bottom">
<ButtonGradient class="title-button special-button" @click.native="onSubmit(1)"
style="background: linear-gradient(180deg, #E94D4E 0%, #FF195E 100%);">
<ButtonGradient
v-if="detailData.eventState != 2"
class="title-button special-button"
@click.native="onSubmit(1)"
style="background: linear-gradient(180deg, #e94d4e 0%, #ff195e 100%)"
>
封闭
</ButtonGradient>
<ButtonGradient class="title-button special-button" @click.native="onSubmit(2)"
style="background: linear-gradient(82deg, #FFCD48 0%, #FE861E 100%);">
<ButtonGradient
v-if="detailData.eventState != 2"
class="title-button special-button"
@click.native="onSubmit(2)"
style="background: linear-gradient(82deg, #ffcd48 0%, #fe861e 100%)"
>
限行
</ButtonGradient>
</div>
<AddControlEventInfoDialog v-model="addControlEventInfoDialogVisible" :controlType="controlType"
:eventSubclass="eventSubclass" @close="closeDialog" />
<AddControlEventInfoDialog
v-model="addControlEventInfoDialogVisible"
:controlType="controlType"
:eventSubclass="eventSubclass"
@close="closeDialog"
/>
</Card>
</template>
<script>
import Card from "@screen/components/Card2/Card.vue";
import RadioGroup from '@screen/components/FormConfig/components/RadioGroup/index.vue';
import ButtonGradient from '@screen/components/Buttons/ButtonGradient.vue';
import { provideMixin } from "./../../mixin"
import AddControlEventInfoDialog from "./components/AddControlEventInfoDialog/index.vue"
import RadioGroup from "@screen/components/FormConfig/components/RadioGroup/index.vue";
import ButtonGradient from "@screen/components/Buttons/ButtonGradient.vue";
import { provideMixin } from "./../../mixin";
import AddControlEventInfoDialog from "./components/AddControlEventInfoDialog/index.vue";
export default {
name: 'TrafficControl',
name: "TrafficControl",
mixins: [provideMixin],
components: {
Card,
RadioGroup,
ButtonGradient,
AddControlEventInfoDialog
AddControlEventInfoDialog,
},
inject: ["provideData"],
data() {
return {
eventSubclass: '3-1',
eventSubclass: "3-1",
addControlEventInfoDialogVisible: false,
controlType: 1,
radioList: [
{ key: '3-1', label: '主线管制' },
{ key: '3-2', label: '收费站管制' },
{ key: '3-3', label: '服务区管制' },
{ key: '3-4', label: '枢纽立交管制' },
{ key: '3-5', label: '其他管制' },
]
}
{ key: "3-1", label: "主线管制" },
{ key: "3-2", label: "收费站管制" },
{ key: "3-3", label: "服务区管制" },
{ key: "3-4", label: "枢纽立交管制" },
{ key: "3-5", label: "其他管制" },
],
};
},
methods: {
onSubmit(value) {
this.controlType = value
this.addControlEventInfoDialogVisible = true
this.controlType = value;
this.addControlEventInfoDialogVisible = true;
},
closeDialog() {
this.addControlEventInfoDialogVisible = false
}
}
}
this.addControlEventInfoDialogVisible = false;
},
},
};
</script>
<style lang='scss' scoped>
<style lang="scss" scoped>
.TrafficControl {
::v-deep {
.content {

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

@ -59,18 +59,17 @@ export default {
provideData: {
detail: null,
},
detailId: ''
detailId: "",
};
},
created() {
let h = window.location.href.split('=');
if(h.length === 2){
this.detailId = window.location.href.split('=')[1];
let h = window.location.href.split("=");
if (h.length === 2) {
this.detailId = window.location.href.split("=")[1];
} else {
this.detailId = 'b825c7bbf4de43cdb8f689e270adf7a1';
this.detailId = "b825c7bbf4de43cdb8f689e270adf7a1";
}
this.getDetail();
},
methods: {
getDetail() {
@ -81,9 +80,10 @@ export default {
})
.then((result) => {
if (result.code != 200) return;
result.data.longitude = '116.829275';
result.data.dimension = '36.583156';
result.data.longitude = "116.829275";
result.data.dimension = "36.583156";
this.provideData.detail = result.data;
console.log("这里是事件详情", this.provideData.detail);
if (
["设备设施隐患", "非法上路", "施工建设", "服务区异常"].includes(
result.data.eventName

Loading…
Cancel
Save