Browse Source

更新

wangqin
hui 11 months ago
parent
commit
061a004b91
  1. 244
      ruoyi-ui/src/views/JiHeExpressway/components/CameraShower/index.vue
  2. 7
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/Camera/components/CameraControlDialog.vue
  3. 7
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/Camera/index.vue
  4. 366
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/FatigueWakesUp/components/DeviceControlDialog.vue
  5. 24
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/FatigueWakesUp/index.vue
  6. 2
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/GuardrailCollision/index.vue
  7. 11
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/Intermodulation/components/LineChartForTraffic/index.vue
  8. 27
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/RoadAndEvents/utils/httpList.js
  9. 42
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/RoadAndEvents/utils/map.js
  10. 6
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/views/dutyOfficer/components/ModifyDutyInformationTable.vue
  11. 33
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/event/EventDetailDialog/eventPlanDialog/index.vue
  12. 16
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/event/EventDetailDialog/formTable/index.vue
  13. 4
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/event/EventDetailDialog/index.vue
  14. 22
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/event/EventDetailDialog/qbbDialog/index.vue
  15. 12
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/event/index.vue
  16. 293
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/eventQuery/index.vue
  17. 23
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/typeAnalysis/index.vue
  18. 10
      ruoyi-ui/src/views/JiHeExpressway/pages/service/PublishingChannelManagement/components/Switcher.vue
  19. 4
      ruoyi-ui/src/views/JiHeExpressway/utils/enum.js

244
ruoyi-ui/src/views/JiHeExpressway/components/CameraShower/index.vue

@ -1,38 +1,54 @@
<template> <template>
<div v-if="visible" class="compBox"> <div v-if="visible" class="compBox">
<div class="head" style="height:4vh;"> <div class="head" style="height:4vh;">
<div class="tit">附近相机</div> <div class="tit">附近相机</div>
<img class="btnCls" src="@/assets/jihe/images/dialog/ibCls.png" alt="" @click="onClose"> <img class="btnCls" src="@/assets/jihe/images/dialog/ibCls.png" alt="" @click="onClose">
<img class="deco" src="@/assets/jihe/images/dialog/ibHeadDeco.png" alt=""> <img class="deco" src="@/assets/jihe/images/dialog/ibHeadDeco.png" alt="">
</div>
<template v-if="list.length > 0">
<!-- <p>{{ list }}</p> -->
<div class="videoPlayer">
<!-- <videoView :url="slectedVideo" /> -->
<Video class="video-stream" :camId="selectedCamera.camId" />
</div> </div>
<template v-if="list.length>0">
<!-- <p>{{ list }}</p> -->
<div class="videoPlayer">
<!-- <videoView :url="slectedVideo" /> -->
<Video class="video-stream" :camId="selectedCamera.camId" />
</div>
<div class="operation">
<div class="selectCam">
<div class="label">选择相机: </div>
<div class="val">
<el-select v-model="selectedCameraIndex" placeholder="请选择" size="mini" @change="onChangeCamera">
<el-option v-for="item,index in list" :key="index" :label="item.camName" :value="index">
</el-option>
</el-select>
</div>
</div>
<el-button type="primary" icon="el-icon-s-operation" class="controlCam" v-if="selectedCamera.ptzCtrl == 0" @click="controlDialogVisible=!controlDialogVisible"></el-button>
<CameraController :visible.sync="controlDialogVisible" v-if="controlDialogVisible" :deviceId="selectedCamera.camId" class="cameraControl"/>
</div> <div class="operation">
<div class="flex1 txtInfo"> <div class="selectCam">
<p v-for="item in cameraInfo" :key="item.value" class="txtItem"> <div class="label">选择相机: </div>
<span class="label">{{ item.title }}: </span> <div class="val">
<span class="val">{{ item.value }}</span> <el-select v-model="selectedCameraIndex" placeholder="请选择" size="mini" @change="onChangeCamera">
</p> <el-option v-for="item, index in list" :key="index" :label="item.camName" :value="index">
</div> </el-option>
<!-- <div class="camera_bom_right"> </el-select>
</div>
</div>
<el-button type="primary" icon="el-icon-s-operation" class="controlCam" v-if="selectedCamera.ptzCtrl == 0"
@click="controlDialogVisible = !controlDialogVisible"></el-button>
<CameraController :visible.sync="controlDialogVisible" v-if="controlDialogVisible"
:deviceId="selectedCamera.camId" class="cameraControl" />
</div>
<div class="flex1 txtInfo">
<p v-for="item in cameraInfo" :key="item.value" class="txtItem">
<span class="label">{{ item.title }}: </span>
<span class="val">{{ item.value }}</span>
</p>
<div v-if="PanoramicCameraTypes.indexOf(selectedCamera.childType) == -1" style="width: 50%; display: flex;">
<span style="
color: #3de8ff;
font-size: 15px;
font-family: PingFang SC, PingFang SC;
font-weight: 400;
line-height: 18px;
">
雨刷:
</span>
<Button style="margin-left: 5px" @click.native="controlClick(49)"></Button>
<Button style="margin-left: 5px" @click.native="controlClick(48)"></Button>
</div>
</div>
<!-- <div class="camera_bom_right">
<div class="camera_bom_right_t"> <div class="camera_bom_right_t">
<div class="camera_bom_right_t_box"></div> <div class="camera_bom_right_t_box"></div>
<div class="camera_bom_right_t_h_po" v-for="item in cameraBtnList" :key="item.id" <div class="camera_bom_right_t_h_po" v-for="item in cameraBtnList" :key="item.id"
@ -58,11 +74,16 @@
import Video from "@screen/components/Video" import Video from "@screen/components/Video"
import CameraController from "./CameraController.vue"; import CameraController from "./CameraController.vue";
import { controlCamera, getDeviceInfo } from "@screen/pages/Home/components/RoadAndEvents/utils/httpList.js";
import { PanoramicCameraTypes, CameraChildTypes } from "@screen/utils/enum.js";
import { throttle } from "lodash";
import Button from "@screen/components/Buttons/Button.vue";
export default { export default {
name: '', name: '',
components: { components: {
Video, Video,
Button,
CameraController CameraController
}, },
props: { props: {
@ -70,78 +91,94 @@ export default {
type: Array, type: Array,
default: () => [] default: () => []
}, },
visible:{ visible: {
type:Boolean, type: Boolean,
default:false default: false
} }
}, },
data() { data() {
return { return {
booooooool:true, booooooool: true,
selectedCameraIndex:null, selectedCameraIndex: null,
selectedCamera:{}, selectedCamera: {},
cameraInfo:[], PanoramicCameraTypes,
controlDialogVisible:false cameraInfo: [],
controlDialogVisible: false
} }
}, },
watch:{ watch: {
list:{ list: {
handler(){ handler() {
this.selectCamera(); this.selectCamera();
}, },
deep:true, deep: true,
} }
}, },
mounted(){ mounted() {
}, },
methods:{ methods: {
onClose (){ controlClick: throttle(function (type) {
this.$emit("update:visible" , false) if (this.selectedCamera.deviceState != "0")
}, controlCamera(this.selectedCamera.camId, type, false);
onChangeCamera(val){ else this.$message.info("设备离线, 无法操作")
}, 150),
onClose() {
this.$emit("update:visible", false)
},
onChangeCamera(val) {
this.selectCamera(); this.selectCamera();
}, },
selectCamera(){ async selectCamera() {
if(this.list.length <= 0){ if (this.list.length <= 0) {
return return
} }
if(this.selectedCameraIndex == null){ if (this.selectedCameraIndex == null) {
this.selectedCameraIndex = 0; this.selectedCameraIndex = 0;
} }
this.selectedCamera = this.list[this.selectedCameraIndex]; this.selectedCamera = this.list[this.selectedCameraIndex];
const deviceInfo = (await getDeviceInfo(this.selectedCamera.camId))?.[0] || {};
const childType = deviceInfo.childType;
this.$set(this.selectedCamera, 'childType', childType);
this.$set(this.selectedCamera, 'deviceState', deviceInfo.deviceState);
let cmr = this.selectedCamera; let cmr = this.selectedCamera;
this.cameraInfo = [ this.cameraInfo = [
{title:"道路名称", value:cmr.deptName }, { title: "道路名称", value: cmr.deptName },
{title:"道路编号", value:cmr.road }, { title: "道路编号", value: cmr.road },
{title:"设备名称", value:cmr.camName }, { title: "设备名称", value: cmr.camName },
{title:"设备编号", value:cmr.camId }, { title: "设备编号", value: cmr.camId },
{title:"设备桩号", value:cmr.pileNum }, { title: "设备桩号", value: cmr.pileNum },
{title:"相机类型", value:["球机","枪机"][+cmr.ptzCtrl] }, { title: "相机类型", value: childType ? CameraChildTypes[childType] : ["球机", "枪机"][+cmr.ptzCtrl] },
// {title:"", value:cmr.camStatus } // {title:"", value:cmr.camStatus }
]; ];
}, },
onControlCamera(val){ onControlCamera(val) {
console.log(val , "vallllllllll") console.log(val, "vallllllllll")
} }
} }
} }
</script> </script>
<style lang='scss' scoped> <style lang='scss' scoped>
@mixin fontClass{ @mixin fontClass {
fontSize:14px; color:#FFF; fontSize: 14px;
color: #FFF;
} }
$colorLabel: #3DE8FF; $colorLabel: #3DE8FF;
.compBox{
.compBox {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
position: relative; position: relative;
.cameraControl{
.cameraControl {
position: absolute; position: absolute;
right: -2px; right: -2px;
top:-2px; top: -2px;
transform: translateX(100%); transform: translateX(100%);
} }
.head { .head {
height: 48px; height: 48px;
padding: 0 10px; padding: 0 10px;
@ -153,18 +190,18 @@ $colorLabel: #3DE8FF;
display: flex; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
.tit { .tit {
color: #3de8ff; color: #3de8ff;
font-size: 18px; font-size: 18px;
} }
.btnCls { .btnCls {
width: 13px; width: 13px;
height: 13px; height: 13px;
cursor: pointer; cursor: pointer;
} }
.deco { .deco {
width: 55%; width: 55%;
height: 5px; height: 5px;
@ -173,39 +210,74 @@ $colorLabel: #3DE8FF;
top: 0; top: 0;
} }
} }
.flex1{
flex: 1; height:0; .flex1 {
flex: 1;
height: 0;
} }
.videoPlayer { height: 246px;
.video-stream{ width: 100%; height: 100%;} .videoPlayer {
height: 246px;
.video-stream {
width: 100%;
height: 100%;
}
} }
.operation{
display: flex; flex-direction: row; height: 36px; justify-content: space-between; align-items: center; padding: 0 20px; border-bottom:1px solid #3DE8FF; position: relative; .operation {
.selectCam{ display: flex; flex-direction: row; display: flex;
.label{ flex-direction: row;
height: 36px;
justify-content: space-between;
align-items: center;
padding: 0 20px;
border-bottom: 1px solid #3DE8FF;
position: relative;
.selectCam {
display: flex;
flex-direction: row;
.label {
margin-right: 6px; margin-right: 6px;
@include fontClass; @include fontClass;
color: $colorLabel; color: $colorLabel;
} }
.val{ width: 220px; }
.val {
width: 220px;
}
} }
.controlCam{
.controlCam {
padding: 3px; padding: 3px;
font-size: 20px; font-size: 20px;
background: linear-gradient(180deg, #005C79 0%, #009BCC 100%); background: linear-gradient(180deg, #005C79 0%, #009BCC 100%);
border: none; border: none;
box-shadow: 0 0 4px rgba(0,0,0,0.3); box-shadow: 0 0 4px rgba(0, 0, 0, 0.3);
} }
} }
.txtInfo{
flex: 1; overflow-y: scroll; padding: 20px 20px 10px; display: flex; flex-wrap: wrap; align-content:flex-start; .txtInfo {
.txtItem{ flex: 1;
width: 0; flex-basis: 50%; height: 34px; overflow-y: scroll;
.label{ padding: 20px 20px 10px;
display: flex;
flex-wrap: wrap;
align-content: flex-start;
.txtItem {
width: 0;
flex-basis: 50%;
height: 34px;
.label {
@include fontClass; @include fontClass;
color: $colorLabel; color: $colorLabel;
} }
.val{
.val {
@include fontClass; @include fontClass;
} }
} }

7
ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/Camera/components/CameraControlDialog.vue

@ -54,7 +54,8 @@ export default {
}, },
props: { props: {
visible: Boolean, visible: Boolean,
deviceId: String deviceId: String,
dialogData: Object
}, },
data() { data() {
return { return {
@ -103,7 +104,9 @@ export default {
}, },
methods: { methods: {
controlClick: throttle(function (type) { controlClick: throttle(function (type) {
controlCamera(this.deviceId, type) if (this.dialogData.deviceState != "0")
controlCamera(this.deviceId, type)
else this.$message.info("设备离线, 无法操作")
}, 150), }, 150),
async handleSwitcherChange(value, data) { async handleSwitcherChange(value, data) {
let str = data.state ? "关闭" : "开启"; let str = data.state ? "关闭" : "开启";

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

@ -40,7 +40,7 @@
</div> --> </div> -->
</div> </div>
<CameraControlDialog :deviceId="dialogData.iotDeviceId" v-model="controlDialogVisible" /> <CameraControlDialog :deviceId="dialogData.iotDeviceId" :dialogData="dialogData" v-model="controlDialogVisible" />
</Dialog> </Dialog>
</template> </template>
@ -140,7 +140,10 @@ export default {
}, },
methods: { methods: {
controlClick: throttle(function (type) { controlClick: throttle(function (type) {
controlCamera(this.dialogData.iotDeviceId, type, false); // console.log(this.dialogData, "dialogData")
if (this.dialogData.deviceState != "0")
controlCamera(this.dialogData.iotDeviceId, type, false);
else this.$message.info("设备离线, 无法操作")
}, 150), }, 150),
visibleClose(bool) { visibleClose(bool) {
if (bool) return; if (bool) return;

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

@ -2,13 +2,80 @@
<Dialog v-model="modelVisible" title="设备操作"> <Dialog v-model="modelVisible" title="设备操作">
<div class='DeviceControlDialog'> <div class='DeviceControlDialog'>
<ElTabs v-model="activeName" class="tabs"> <ElTabs v-model="activeName" class="tabs" @tab-click="tabClick">
<ElTabPane label="一般模式" name="first"> <ElTabPane label="一般模式" name="first">
<Form v-model="formData" class="form" ref="FormConfigRef" :formList="formList1" column="1" <Form v-model="formData" class="form" ref="FormConfigRef" :formList="formList1" column="1"
labelWidth="120px" /> labelWidth="120px" />
</ElTabPane> </ElTabPane>
<ElTabPane label="自定义模式" name="second"> <ElTabPane label="自定义模式" name="second">
<Form class="form" ref="FormConfigRef" :formList="formList2" column="1" labelWidth="120px" /> <div style="display: flex; margin: 20px 0;">
<p style="width: 115px;">工作时长():</p>
<el-input-number v-model="onWorkStatus2" :min="0" :max="999" label="工作时长(s分):"></el-input-number>
</div>
<Table :data="tableData">
<ElTableColumn prop="ds" label="段数"></ElTableColumn>
<ElTableColumn prop="time" width="120" label="时间">
<template slot-scope="scope">
<div style="display: flex;">
<el-input-number style="width: 80px;" v-model="scope.row.time" :min="0" :max="999"></el-input-number>
<p></p>
</div>
</template>
</ElTableColumn>
<ElTableColumn prop="A" label="线路A">
<template slot-scope="scope">
<el-switch v-model="scope.row.A" active-color="#13ce66" inactive-color="#C9C9C9">
</el-switch>
</template>
</ElTableColumn>
<ElTableColumn prop="B" label="线路B">
<template slot-scope="scope">
<el-switch v-model="scope.row.B" active-color="#13ce66" inactive-color="#C9C9C9">
</el-switch>
</template>
</ElTableColumn>
<ElTableColumn prop="C" label="线路C">
<template slot-scope="scope">
<el-switch v-model="scope.row.C" active-color="#13ce66" inactive-color="#C9C9C9">
</el-switch>
</template>
</ElTableColumn>
<ElTableColumn prop="D" label="线路D">
<template slot-scope="scope">
<el-switch v-model="scope.row.D" active-color="#13ce66" inactive-color="#C9C9C9">
</el-switch>
</template>
</ElTableColumn>
<ElTableColumn prop="E" label="线路E">
<template slot-scope="scope">
<el-switch v-model="scope.row.E" active-color="#13ce66" inactive-color="#C9C9C9">
</el-switch>
</template>
</ElTableColumn>
<ElTableColumn prop="F" label="线路F">
<template slot-scope="scope">
<el-switch v-model="scope.row.F" active-color="#13ce66" inactive-color="#C9C9C9">
</el-switch>
</template>
</ElTableColumn>
<ElTableColumn prop="G" label="线路G">
<template slot-scope="scope">
<el-switch v-model="scope.row.G" active-color="#13ce66" inactive-color="#C9C9C9">
</el-switch>
</template>
</ElTableColumn>
<ElTableColumn prop="H" label="线路H">
<template slot-scope="scope">
<el-switch v-model="scope.row.H" active-color="#13ce66" inactive-color="#C9C9C9">
</el-switch>
</template>
</ElTableColumn>
</Table>
</ElTabPane> </ElTabPane>
</ElTabs> </ElTabs>
</div> </div>
@ -25,13 +92,11 @@
</template> </template>
<script> <script>
import Table from '@screen/components/Table.vue';
import Dialog from "@screen/components/Dialog/index.vue"; import Dialog from "@screen/components/Dialog/index.vue";
import Button from "@screen/components/Buttons/Button.vue" import Button from "@screen/components/Buttons/Button.vue"
import Form from '@screen/components/FormConfig'; import Form from '@screen/components/FormConfig';
import { delay } from "@screen/utils/common.js"
import request from "@/utils/request"; import request from "@/utils/request";
import { Message } from "element-ui"; import { Message } from "element-ui";
@ -40,7 +105,8 @@ export default {
components: { components: {
Dialog, Dialog,
Button, Button,
Form Form,
Table
}, },
model: { model: {
prop: 'visible', prop: 'visible',
@ -54,40 +120,77 @@ export default {
return { return {
submitting: false, submitting: false,
activeName: "first", activeName: "first",
onWorkStatus2: 0,
formData: {}, formData: {},
duan: ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T'],
tableData: [
// {
// ds: 'A',
// time: 0,
// A: false,
// B: false,
// C: false,
// D: false,
// E: false,
// F: false,
// G: false,
// H: false,
// }
],
formList1: [ formList1: [
{ {
label: "设备模式:", label: "工作模式:",
key: "controlType", key: "controlType",
type: "RadioGroup", type: "select",
default: "00", default: "1",
options: { options: {
type: 'circle',
options: [ options: [
{ {
key: "00", value: "0",
label: "常量", label: "激光关闭"
}, },
{ {
key: "01", value: "1",
label: "闪烁", label: "常亮模式"
} },
{
value: "2",
label: "间隔100ms闪烁模式"
},
{
value: "3",
label: "间隔200ms闪烁模式",
},
{
value: "4",
label: "间隔500ms闪烁模式",
},
{
value: "5",
label: "2次闪烁模式"
},
{
value: "6",
label: "SOS模式"
},
], ],
}, },
}, },
{ {
label: "操作时长:", label: "工作时长(分):",
key: "onWorkStatus", key: "onWorkStatus",
required: true, required: true,
type: "select", default: 0,
type: "inputNumber",
options: { options: {
placeholder: "请选择", min: 0,
max: 999
} }
}, },
], ],
formList2: [ formList2: [
{ {
label: "设备模式:", label: "工作模式:",
key: "controlType", key: "controlType",
type: "RadioGroup", type: "RadioGroup",
default: "00", default: "00",
@ -115,7 +218,7 @@ export default {
} }
}, },
{ {
label: "作时长:", label: "作时长:",
key: "onWorkStatus", key: "onWorkStatus",
required: true, required: true,
type: "select", type: "select",
@ -123,12 +226,21 @@ export default {
placeholder: "请选择", placeholder: "请选择",
} }
}, },
] ],
rules: {
onWorkStatus: [
{ required: true, message: '工作时长不能为空', trigger: 'blur' },
],
}
} }
}, },
computed: { computed: {
modelVisible: { modelVisible: {
get() { get() {
if (this.visible) {
this.deviceId = 'K82+285';
this.initData();
}
return this.visible return this.visible
}, },
set(val) { set(val) {
@ -136,138 +248,128 @@ export default {
} }
} }
}, },
watch: { // watch: {
modelVisible: { // modelVisible: {
immediate: true, // immediate: true,
handler(bool) { // handler(bool) {
if (!bool) return; // if (!bool) return;
// this.reDisplay(); // // this.requestURL();
} // }
} // }
}, // },
methods: { methods: {
requestURL(functionId, options = {}) { async initData() {
return new Promise((resolve, reject) => { //
request.post(`business/device/functions/${this.deviceId}/${functionId}`, options) let result = await this.requestURL('ASKMD');
.then((result) => { if (result.data == 7) {
if (result.code != 200) return reject(); this.activeName = 'second';
this.tabClick();
resolve(result.data[0]); } else {
}) this.formData.controlType = result.data + "" || '1';
.catch((err) => { //
reject(); let resultTime = await this.requestURL('ASKTM');
}); this.formData.onWorkStatus = resultTime.data || 0;
this.activeName = 'first';
}
},
async requestURL(functionId, options = {}) {
let result = await request({
url: `/business/device/functions/${this.deviceId}/${functionId}`,
method: "post",
data: options,
}); });
if (result.code != 200) return Message.error(result?.msg);
//SETMDASKMDSETTMASKTMSETDFASKDF
console.log('aaaa', result);
return result;
}, },
reDisplay() { async tabClick() {
this.requestURL(52) if (this.activeName == 'second') {
.then(async (data) => { //
await delay(0); let result = await request({
url: `/business/device/properties/latest/${this.deviceId}`,
const formData = this.$refs.FormConfigRef?.formData; method: "get",
});
if (result.code != 200) return Message.error(result?.msg);
formData.controlType = data.mode; this.tableData = [];
let tData = [];
switch (data.mode) { result.data.forEach(item => {
case "00": if (item.property == 'TM') {
formData.onWorkStatus = data.onWorkStatus; this.onWorkStatus2 = item.value;
formData.inWorkStatus = data.inWorkStatus; } else if (item.property == 'MD') {
break; } else {
case "01": let data = JSON.parse(item.value || {});
case "02": tData.push({ ...data, ds: item.property })
await this.requestURL("3C")
.then((data2) => {
formData.onWorkStatus = data2.onWorkStatus;
formData.inWorkStatus = data2.inWorkStatus;
if (data.mode === '01')
formData.displayTime = [data.startDisplay, data.endDisplay];
})
.catch(() => { });
break;
} }
this.oldFormData = { ...formData };
}) })
this.tableData = tData;
}
}, },
handleSubmit() { async handleSubmit() {
const result = {}, formData = this.$refs.FormConfigRef?.formData; if (this.activeName == 'first') {//
this.$refs.FormConfigRef.validate().then(async (formData) => {
result.mode = formData.controlType; console.log('formData', formData);
//
delete result.controlType; await this.requestURL('SETMD', { SET: formData.controlType })
//
let res = await this.requestURL('SETTM', { SET: formData.onWorkStatus })
console.log('res', res)
if (res.code == 200) {
Message.success('设置成功!');
this.$emit('update:value', false)
}
});
} else if (this.activeName == 'second') {//
let rData = [];
if (result.mode === '01') { this.tableData.forEach((it, index) => {
if (!formData.displayTime?.length) return Message.error(`时间不能为空!`); rData.push({
} order: 7,
time: it.time,
numberOfSegments: this.duan[index],
A: Number(it.A),
B: Number(it.B),
C: Number(it.C),
D: Number(it.D),
E: Number(it.E),
F: Number(it.F),
G: Number(it.G),
H: Number(it.H),
})
})
if (!formData.onWorkStatus || !formData.inWorkStatus) return Message.error(`工作状态不能为空!`); //
await request({
url: `/business/device/batchLaserFatigueInvokedFunction`,
method: "post",
data: {
deviceId: this.deviceId,
functionId: 'SETDF',
params: rData
}
});
//
let res = await this.requestURL('SETTM', { SET: this.onWorkStatus2 });
if (res.code == 200) {
Message.success('设置成功!')
this.$emit('update:value', false)
}
if (["01", "02"].includes(result.mode)) {
if (["04", "00"].includes(formData.onWorkStatus)) return Message.error(`上行工作状态不能选择当前类型!`);
if (["04", "00"].includes(formData.inWorkStatus)) return Message.error(`下行工作状态不能选择当前类型!`);
} }
result.onWorkStatus = formData.onWorkStatus;
result.inWorkStatus = formData.inWorkStatus;
this.submitting = true;
// this.submitting = false;
// return;
/**
* 接口 地址
*
* https://www.showdoc.com.cn/2450725213006196/10877717880262686
*/
let promise = [];
switch (result.mode) {
case "00":
promise.push(this.requestURL("51", result))
break;
case "01":
case "02":
const options = { mode: result.mode };
if (result.mode === '01') {
options.startDisplayTime = formData.displayTime[0];
options.endDisplayTime = formData.displayTime[1];
}
promise.push(
this.requestURL("30", {
onWorkStatus: result.onWorkStatus,
inWorkStatus: result.inWorkStatus,
}),
this.requestURL("51", options),
)
break;
}
Promise.all(promise)
.then(() => {
this.modelVisible = false;
})
.catch((err) => {
console.log("%c [ err ]-110-「DeviceControlDialog.vue」", "font-size:15px; background:#547bf2; color:#98bfff;", err);
Message.error(`设备操作失败!`);
})
.finally(() => {
this.submitting = false;
})
} }
}, },
} }
</script> </script>
<style lang='scss' scoped> <style lang='scss' scoped>
.DeviceControlDialog { .DeviceControlDialog {
width: 450px; width: 850px;
height: 210px; min-height: 410px;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
gap: 15px; gap: 15px;

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

@ -4,20 +4,11 @@
<Video class="video-stream" :pileNum="dialogData.stakeMark" /> <Video class="video-stream" :pileNum="dialogData.stakeMark" />
<ElTabs v-model="activeName" @tab-click="handleClickTabs" class="tabs"> <ElTabs v-model="activeName" @tab-click="handleClickTabs" class="tabs">
<ElTabPane label="基本信息" name="first"> <ElTabPane label="基本信息" name="first">
<Descriptions <Descriptions labelWidth="72px" :list="list" :data="data" style="gap: 18px" />
labelWidth="72px"
:list="list"
:data="data"
style="gap: 18px"
/>
</ElTabPane> </ElTabPane>
<ElTabPane label="设备参数" name="second">设备参数</ElTabPane> <ElTabPane label="设备参数" name="second">设备参数</ElTabPane>
<ElTabPane label="在线率统计" name="third"> <ElTabPane label="在线率统计" name="third">
<LineChart <LineChart v-if="activeName === 'third'" :productId="dialogData.id" style="height: 180px" />
v-if="activeName === 'third'"
:productId="dialogData.id"
style="height: 180px"
/>
</ElTabPane> </ElTabPane>
</ElTabs> </ElTabs>
</div> </div>
@ -25,11 +16,8 @@
<template #footer> <template #footer>
<Button @click.native="deviceControlVisible = true">设备操作</Button> <Button @click.native="deviceControlVisible = true">设备操作</Button>
</template> </template>
<!-- 设备操作弹窗 -->
<DeviceControlDialog <DeviceControlDialog v-model="deviceControlVisible" :deviceId="dialogData.iotDeviceId" />
v-model="deviceControlVisible"
:deviceId="dialogData.iotDeviceId"
/>
</Dialog> </Dialog>
</template> </template>
@ -114,7 +102,7 @@ export default {
if (roadInfo) this.$set(this.data, "roadName", roadInfo.roadName); if (roadInfo) this.$set(this.data, "roadName", roadInfo.roadName);
}, },
methods: { methods: {
handleClickTabs() {}, handleClickTabs() { },
}, },
}; };
</script> </script>
@ -155,7 +143,7 @@ export default {
align-items: center; align-items: center;
justify-content: end; justify-content: end;
> div { >div {
font-size: 16px; font-size: 16px;
padding: 6px 12px; padding: 6px 12px;
} }

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

@ -179,7 +179,7 @@ div.switcher {
align-items: center; align-items: center;
justify-content: end; justify-content: end;
> div { >div {
font-size: 16px; font-size: 16px;
padding: 6px 12px; padding: 6px 12px;
} }

11
ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/Intermodulation/components/LineChartForTraffic/index.vue

@ -5,7 +5,7 @@
<script> <script>
import * as echarts from "echarts"; import * as echarts from "echarts";
import { lineChartOption } from "./chart" import { lineChartOption } from "./chart"
import { cloneDeep } from "lodash";
export default { export default {
name: 'LineChart', name: 'LineChart',
props: { props: {
@ -20,10 +20,11 @@ export default {
}, },
mounted() { mounted() {
const chartIns = echarts.init(this.$refs.LineChartRef); const chartIns = echarts.init(this.$refs.LineChartRef);
console.log('lineChartOption', lineChartOption) const options = cloneDeep(lineChartOption);
lineChartOption.xAxis.data = this.xData; options.yAxis.axisLabel.fontSize = 11;
lineChartOption.series[0].data = this.yData; options.xAxis.data = this.xData;
chartIns.setOption(lineChartOption); options.series[0].data = this.yData;
chartIns.setOption(options);
}, },
} }
</script> </script>

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

@ -237,6 +237,33 @@ export function getDeviceList(deviceType, options) {
}); });
} }
export function getDeviceInfo(iotDeviceId, options) {
return new Promise((resolve, reject) => {
const data = {
iotDeviceId,
...options,
};
request({
url: "/business/device/query",
method: "GET",
params: data,
})
.then(({ code, data }) => {
if (code != 200) {
reject();
// return Message.error(`${DeviceTypeMap[deviceType]}设备加载失败!`);
}
resolve(data);
})
.catch(() => {
// Message.error(`${DeviceTypeMap[deviceType]}设备加载失败!`);
reject();
});
});
}
/** /**
* 获取 所属机构 * 获取 所属机构
* @param {*} iotDeviceId 设备ID iotDeviceId * @param {*} iotDeviceId 设备ID iotDeviceId

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

@ -106,8 +106,9 @@ export class MarkerCluster {
const pageSize = 6; const pageSize = 6;
let page = 1; let page = 1;
const totalPages = Math.ceil(data.length / pageSize); const totalPages = Math.ceil(data.length / pageSize);
const dataFirstPage = const currentPageData =
totalPages > 1 ? data.slice((page - 1) * pageSize, pageSize) : data; totalPages > 1 ? data.slice((page - 1) * pageSize, pageSize) : data;
window.currentPageData = currentPageData;
window.pageSize = pageSize; window.pageSize = pageSize;
window.page = page; window.page = page;
window.totalPages = totalPages; window.totalPages = totalPages;
@ -127,7 +128,7 @@ export class MarkerCluster {
// 截取当前页的数据 // 截取当前页的数据
const currentPageData = data.slice(startIndex, endIndex); const currentPageData = data.slice(startIndex, endIndex);
window.currentPageData = currentPageData;
const itemsTpl = currentPageData const itemsTpl = currentPageData
.map( .map(
(item) => ` (item) => `
@ -144,15 +145,7 @@ export class MarkerCluster {
.join(""); .join("");
// 渲染当前页数据 // 渲染当前页数据
dataContainer.innerHTML = itemsTpl; dataContainer.innerHTML = itemsTpl;
window.infoWindow.dom bindItemClick();
.querySelectorAll(".info-window-item")
.forEach((item, index) => {
item.onclick = () =>
data[index].config.markerClick?.(
data[index].extData,
data[index].config?.item
);
});
} }
window.renderData = renderData; window.renderData = renderData;
@ -173,7 +166,7 @@ export class MarkerCluster {
<img class="info-close" style="width: 12px;cursor: pointer;" src="${require("@screen/images/dialog/icon-close.svg")}" /> <img class="info-close" style="width: 12px;cursor: pointer;" src="${require("@screen/images/dialog/icon-close.svg")}" />
</div> </div>
<div id="dataContainer" style="padding: 15px 9px;flex: 1; overflow: auto;" class="info-window-content"> <div id="dataContainer" style="padding: 15px 9px;flex: 1; overflow: auto;" class="info-window-content">
${dataFirstPage ${currentPageData
.map( .map(
(item) => ` (item) => `
<div style="cursor: pointer; padding: 3px 6px;display: flex;align-items: center; gap: 6px;" class="info-window-item"> <div style="cursor: pointer; padding: 3px 6px;display: flex;align-items: center; gap: 6px;" class="info-window-item">
@ -199,7 +192,7 @@ export class MarkerCluster {
} }
</div>`); </div>`);
window.infoWindow = this.infoWindow; window.infoWindow = this.infoWindow;
this.infoWindow.open(map, data[0].lnglat); this.infoWindow.open(map, currentPageData[0].lnglat);
this.infoWindow.dom.querySelector(".info-close").onclick = () => this.infoWindow.dom.querySelector(".info-close").onclick = () =>
this.infoWindow.close(); this.infoWindow.close();
@ -211,15 +204,20 @@ export class MarkerCluster {
this.infoWindow.dom.querySelector(".info-window-content").onwheel = (e) => this.infoWindow.dom.querySelector(".info-window-content").onwheel = (e) =>
e.stopPropagation(); e.stopPropagation();
this.infoWindow.dom function bindItemClick() {
.querySelectorAll(".info-window-item") window.infoWindow.dom
.forEach((item, index) => { .querySelectorAll(".info-window-item")
item.onclick = () => .forEach((item, index) => {
data[index].config.markerClick?.( item.onclick = () => {
data[index].extData, const currentPageData = window.currentPageData;
data[index].config?.item currentPageData[index].config.markerClick?.(
); currentPageData[index].extData,
}); currentPageData[index].config?.item
);
};
});
}
bindItemClick();
} }
async setMarkerCluster() { async setMarkerCluster() {

6
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/views/dutyOfficer/components/ModifyDutyInformationTable.vue

@ -189,7 +189,7 @@ export default {
const closeMessage = loadingMessage({ message: "人员获取中..." }); const closeMessage = loadingMessage({ message: "人员获取中..." });
request({ request({
url: `/business/employees/list`, url: `/business/employees/listAll`,
method: "GET", method: "GET",
params: { params: {
organizationId: stationId, organizationId: stationId,
@ -197,11 +197,11 @@ export default {
}) })
.then((result) => { .then((result) => {
if (result.code != 200) return Message.error("人员获取失败"); if (result.code != 200) return Message.error("人员获取失败");
if (!result.rows?.length) return Message.warning("该驻点下暂无人员"); if (!result.data?.length) return Message.warning("该驻点下暂无人员");
// Message.success("") // Message.success("")
this.peopleList = result.rows; this.peopleList = result.data;
}) })
.catch((err) => { .catch((err) => {
Message.error("人员获取失败"); Message.error("人员获取失败");

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

@ -96,6 +96,7 @@ export default {
qbb: '' qbb: ''
}], }],
planName: '', planName: '',
automaticInfo: {},
dcExecuteAction: [], dcExecuteAction: [],
deviceData: [], deviceData: [],
eventOptions: [ eventOptions: [
@ -252,16 +253,32 @@ export default {
return this.deviceData; return this.deviceData;
}, },
async getTemplateAutomatic() { async getTemplateAutomatic() {
request({ let url = '';
url: `/business/plans/event/automatic`, let data = {};
let plan = this.info.find(it => it.planName == this.planName);
if (this.activeName == '-1') {//
url = '/business/plans/warning/confirm';
data = {
dcEmergencyPlans: plan,
dcWarning: this.eventFormData
}
} else {//
url = '/business/plans/event/automatic';
data = {
dcEmergencyPlans: plan,
dcEvent: this.eventFormData
}
}
const result = await request({
url: url,
method: "post", method: "post",
}).then((result) => { data: data
if (result.code != 200) return Message.error(result?.msg);
this.sbOptions = result.data;
}).catch(() => {
Message.error("查询可变信息标识失败");
}) })
if (result.code != 200) {
Message.error(result?.msg);
return {};
}
return result.data;
}, },
changeRadio(value) { changeRadio(value) {
let plan = this.info.find(it => it.planName == value); let plan = this.info.find(it => it.planName == value);

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

@ -87,7 +87,8 @@
</Table> </Table>
<!-- 情报板弹窗 --> <!-- 情报板弹窗 -->
<QbbDialog :visible="isShowDialog" :info="qbbData" :type="type" @close="onCloseDialog" @dialogSubmit="dialogSubmit" /> <!-- <QbbDialog :visible="isShowDialog" :info="qbbData" :type="type" @close="onCloseDialog"
@dialogSubmit="dialogSubmit" /> -->
</div> </div>
</template> </template>
@ -95,7 +96,7 @@
import Table from '@screen/components/Table.vue'; import Table from '@screen/components/Table.vue';
import Button from '@screen/components/Buttons/Button.vue'; import Button from '@screen/components/Buttons/Button.vue';
import request from "@/utils/request"; import request from "@/utils/request";
import QbbDialog from "../qbbDialog/index.vue"; // import QbbDialog from "../qbbDialog/index.vue";
import { Message } from 'element-ui' import { Message } from 'element-ui'
import { planDeviceOptions } from "@screen/utils/enum.js"; import { planDeviceOptions } from "@screen/utils/enum.js";
@ -105,15 +106,14 @@ export default {
components: { components: {
Button, Button,
Table, Table,
QbbDialog // QbbDialog
},
model: {
prop: 'visible',
event: 'update:value'
}, },
// model: {
// prop: 'visible',
// event: 'update:value'
// },
inject: ['loadData'], inject: ['loadData'],
props: { props: {
visible: Boolean,
eventType: Number, eventType: Number,
type: Number, type: Number,
tableData: { tableData: {

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

@ -4,9 +4,9 @@
<Form :formList="formList" :dFormData="formData" label-width="100px" /> <Form :formList="formList" :dFormData="formData" label-width="100px" />
<div class="video-pic"> <div class="video-pic">
<Video style="height: 100%; width: 380px;" :showHeader="activeName != '-1'" <Video style="height: 100%; width: 380px;" :showHeader="false"
:url="(formData.videoList && formData.videoList.length > 0) ? formData.videoList[0] : ''" videoType="mp4" /> :url="(formData.videoList && formData.videoList.length > 0) ? formData.videoList[0] : ''" videoType="mp4" />
<Video v-if="activeName != '-1'" style="height: 100%; width: 380px;" <Video v-if="activeName != '-1'" style="height: 100%; width: 380px;" :showHeader="false"
:url="(formData.videoList && formData.videoList.length > 0) ? formData.videoList[1] : ''" videoType="mp4" /> :url="(formData.videoList && formData.videoList.length > 0) ? formData.videoList[1] : ''" videoType="mp4" />
<Carousel v-else style="flex: 1" :pictures="formData.pictures" /> <Carousel v-else style="flex: 1" :pictures="formData.pictures" />

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

@ -1,11 +1,11 @@
<template> <template>
<Dialog v-model="modelVisible" title="情报板确认"> <Dialog v-model="modelVisible" title="情报板确认">
<div class="EventAddPlanDialog"> <div v-if="type == 1" class="EventAddPlanDialog">
<h4>预案内容</h4> <h4>预案内容</h4>
<dev class="listBox disPid"> <dev class="listBox disPid">
<div class="tplItem"> <div class="tplItem">
<!-- 模板内容 --> <!-- 模板内容 -->
<BoardTplPreview class="boardPreview" boardWH="1400*200" :tpl="{}"></BoardTplPreview> <!-- <BoardTplPreview class="boardPreview" boardWH="1400*200" :tpl="{}"></BoardTplPreview> -->
<!-- 操作按钮 --> <!-- 操作按钮 -->
<div class="infoBtnBox infoBtnBoxSm"> <div class="infoBtnBox infoBtnBoxSm">
<p class="btn"> <p class="btn">
@ -18,7 +18,7 @@
<dev class="listBox disPid"> <dev class="listBox disPid">
<div class="tplItem"> <div class="tplItem">
<!-- 模板内容 --> <!-- 模板内容 -->
<BoardTplPreview class="boardPreview" boardWH="1400*200" :tpl="{}"></BoardTplPreview> <!-- <BoardTplPreview class="boardPreview" boardWH="1400*200" :tpl="{}"></BoardTplPreview> -->
<!-- 操作按钮 --> <!-- 操作按钮 -->
<div class="infoBtnBox infoBtnBoxSm"> <div class="infoBtnBox infoBtnBoxSm">
<p class="btn"> <p class="btn">
@ -28,14 +28,11 @@
</div> </div>
</dev> </dev>
<h4>情报板模版</h4> <h4>情报板模版</h4>
<vuescroll :ops="scrollOptions" class="listBox"> <!-- <vuescroll :ops="scrollOptions" class="listBox">
<div v-for="(item) in templateAvailable" :key="item.dictValue"> <div v-for="(item) in templateAvailable" :key="item.dictValue">
<!-- 原来是<el-collapse v-model="activeNames"> -->
<h5>{{ item.dictLabel }}</h5> <h5>{{ item.dictLabel }}</h5>
<div v-for="(itm, indx) in item.list" :key="indx" class="tplItem"> <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"> <div class="infoBtnBox infoBtnBoxSm">
<p class="btn"> <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)" />
@ -43,7 +40,7 @@
</div> </div>
</div> </div>
</div> </div>
</vuescroll> </vuescroll> -->
</div> </div>
<template #footer> <template #footer>
<Button style="background: #C9C9C9;padding:0 24px;" <Button style="background: #C9C9C9;padding:0 24px;"
@ -75,9 +72,13 @@ export default {
prop: 'visible', prop: 'visible',
event: 'close' event: 'close'
}, },
// inject: ['getTemplateAutomatic'],
props: { props: {
visible: Boolean, visible: Boolean,
type: Number, type: {
type: Number,
default: 1
},
info: { info: {
type: Object, type: Object,
default: () => { } default: () => { }
@ -102,11 +103,12 @@ export default {
}, },
computed: { computed: {
modelVisible: { modelVisible: {
get() { async get() {
if (this.visible) { if (this.visible) {
if (this.info && this.info.id) { if (this.info && this.info.id) {
this.radio1 = Number(this.info.id); this.radio1 = Number(this.info.id);
} }
// console.log('123', this.getTemplateAutomatic());
} }
return this.visible; return this.visible;
}, },

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

@ -65,7 +65,7 @@ import request from "@/utils/request";
import { Message } from "element-ui"; import { Message } from "element-ui";
import { Loading } from 'element-ui'; import { Loading } from 'element-ui';
import { WarningType as warningTypeMapping, WarningSubclass as warningSubclassTypeMapping } from "@screen/utils/enum.js" import { WarningType as warningTypeMapping, WarningSubclass as warningSubclassTypeMapping } from "@screen/utils/enum.js"
import { getNearCameraNew } from "@screen/pages/Home/components/RoadAndEvents/utils/httpList.js"
const warningSourceMapping = { const warningSourceMapping = {
1: '视频AI', 1: '视频AI',
@ -261,7 +261,7 @@ export default {
}, },
firstBtnClick(id) { firstBtnClick(id) {
console.log("id", id); console.log("id", id);
if (this.activeName == '-1') { // if (this.activeName == '-1') {
request({ request({
url: `/perceivedEvents/warning/getWarningById`,// url: `/perceivedEvents/warning/getWarningById`,//
method: "post", method: "post",
@ -297,7 +297,7 @@ export default {
}); });
} else { } else {
request({ request({
url: `/dc/system/event/${id}`, url: `/dc/system/event/${id}`,//
method: "get", method: "get",
}).then((result) => { }).then((result) => {
if (result.code != 200) return Message.error(result?.msg); if (result.code != 200) return Message.error(result?.msg);
@ -305,11 +305,15 @@ export default {
data.stringDirection = gzDirectionMapping[data.direction] || data.direction; data.stringDirection = gzDirectionMapping[data.direction] || data.direction;
data.startTime = data?.occurrenceTime || ''; data.startTime = data?.occurrenceTime || '';
data.videoList = []; data.videoList = [];
// const cameraData = (await getNearCameraNew(data.stakeMark));//
// console.log("cameraData", cameraData)
if (data.otherConfig) { if (data.otherConfig) {
let otherConfig = JSON.parse(data.otherConfig); let otherConfig = JSON.parse(data.otherConfig);
// data.pictures = otherConfig.pictures || []; // data.pictures = otherConfig.pictures || [];
data.videoList = otherConfig.videoList || [] data.videoList = otherConfig.videoList || [];
//data.videoList = otherConfig.videoList || ['https://sf1-cdn-tos.huoshanstatic.com/obj/media-fe/xgplayer_doc_video/mp4/xgplayer-demo-480p.mp4'] //data.videoList = otherConfig.videoList || ['https://sf1-cdn-tos.huoshanstatic.com/obj/media-fe/xgplayer_doc_video/mp4/xgplayer-demo-480p.mp4']
} }

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

@ -1,87 +1,35 @@
<template> <template>
<div class="congestion"> <div class="congestion">
<div class="condition"> <div class="condition">
<ProgressBar <ProgressBar class="keep-ratio" @selectItem="selectProgress" :dataList="dataList" :selectIndex="selectIndex"
class="keep-ratio" :reset="reset" />
@selectItem="selectProgress"
:dataList="dataList"
:selectIndex="selectIndex"
:reset="reset"
/>
<div class="searchPanel"> <div class="searchPanel">
<RadioGroup <RadioGroup :options="[
:options="[ { key: '1', label: '菏泽' },
{ key: '1', label: '菏泽' }, { key: '3', label: '济南' },
{ key: '3', label: '济南' }, ]" v-model="direction" type="button" />
]" <el-select v-model="type" size="mini" class="selectRoad" placeholder="请选择" @change="changeType">
v-model="direction" <el-option v-for="item in typeOptions" :key="item.value" :label="item.label" :value="item.value">
type="button"
/>
<el-select
v-model="type"
size="mini"
class="selectRoad"
placeholder="请选择"
@change="changeType"
>
<el-option
v-for="item in typeOptions"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option> </el-option>
</el-select> </el-select>
<el-select <el-select v-model="quarter" size="medium" v-if="type == 'quarter'" class="selectRoad-medium" placeholder="请选择">
v-model="quarter" <el-option v-for="item in quarterOptions" :key="item.value" :label="item.label" :value="item.value"
size="medium" style="width: 140px">
v-if="type == 'quarter'"
class="selectRoad-medium"
placeholder="请选择"
>
<el-option
v-for="item in quarterOptions"
:key="item.value"
:label="item.label"
:value="item.value"
style="width: 140px"
>
</el-option> </el-option>
</el-select> </el-select>
<el-date-picker <el-date-picker size="mini" v-if="type != 'quarter'" class="selectRoad" v-model="dateTime" style="width: 140px"
size="mini" :type="type == 'date'
v-if="type != 'quarter'" ? 'date'
class="selectRoad" : type == 'month'
v-model="dateTime" ? 'month'
style="width: 140px" : type == 'year'
:type=" ? 'year'
type == 'date' : ''
? 'date' " placeholder="请选择" :clearable="false" />
: type == 'month'
? 'month' <el-button type="primary" size="mini" class="btnSearch" @click="searchQuery"
: type == 'year' icon="el-icon-search">查询</el-button>
? 'year' <el-button class="btnReset" size="mini" icon="el-icon-refresh-left" @click="onReset">重置</el-button>
: ''
"
placeholder="请选择"
:clearable="false"
/>
<el-button
type="primary"
size="mini"
class="btnSearch"
@click="searchQuery"
icon="el-icon-search"
>查询</el-button
>
<el-button
class="btnReset"
size="mini"
icon="el-icon-refresh-left"
@click="onReset"
>重置</el-button
>
</div> </div>
</div> </div>
@ -90,7 +38,7 @@
<WgtTitle :title="'感知事件趋势分析'"></WgtTitle> <WgtTitle :title="'感知事件趋势分析'"></WgtTitle>
<div class="unit_con"> <div class="unit_con">
<Empty v-if="!chart1List || chart1List.length <= 0" text="暂无数据..." class="empty"></Empty> <Empty v-if="!chart1List || chart1List.length <= 0" text="暂无数据..." class="empty"></Empty>
<div v-else id="chart1" class="chart_div" ></div> <div v-else id="chart1" class="chart_div"></div>
</div> </div>
</div> </div>
@ -98,7 +46,11 @@
<WgtTitle :title="'感知事件类型分析'"></WgtTitle> <WgtTitle :title="'感知事件类型分析'"></WgtTitle>
<div class="unit_con unit_con_02"> <div class="unit_con unit_con_02">
<Empty v-show="!chart2List || chart2List.length <= 0" text="暂无数据..." class="empty"></Empty> <Empty v-show="!chart2List || chart2List.length <= 0" text="暂无数据..." class="empty"></Empty>
<<<<<<< HEAD
<div ref="chart2" class="chart_div" style="width: 540px; height: 270px;" ></div> <div ref="chart2" class="chart_div" style="width: 540px; height: 270px;" ></div>
=======
<div id="chart2" class="chart_div"></div>
>>>>>>> 25407af3e8fe5fa68f3e9252cc6270c7da576ce6
</div> </div>
</div> </div>
@ -106,7 +58,7 @@
<WgtTitle :title="'桩号范围内事件分析趋势'"></WgtTitle> <WgtTitle :title="'桩号范围内事件分析趋势'"></WgtTitle>
<div class="unit_con"> <div class="unit_con">
<Empty v-show="!chart3List || chart3List.length <= 0" text="暂无数据..." class="empty"></Empty> <Empty v-show="!chart3List || chart3List.length <= 0" text="暂无数据..." class="empty"></Empty>
<div id="chart3" class="chart_div" ></div> <div id="chart3" class="chart_div"></div>
</div> </div>
</div> </div>
</div> </div>
@ -263,7 +215,7 @@ export default {
], ],
}; };
}, },
created() {}, created() { },
methods: { methods: {
selectProgress(item, index) { selectProgress(item, index) {
this.selectIndex = index; this.selectIndex = index;
@ -411,7 +363,7 @@ export default {
chart1.series[0].data = numbers; chart1.series[0].data = numbers;
} }
} }
this.$nextTick(()=>{ this.$nextTick(() => {
this.initChart1(); this.initChart1();
}) })
}); });
@ -425,15 +377,43 @@ export default {
quarter: this.quarter, quarter: this.quarter,
}).then((res) => { }).then((res) => {
chart2.series[0].data = []; chart2.series[0].data = [];
let types = [];
if (res.code == 200) { if (res.code == 200) {
let types = [];
let numbers = []; let numbers = [];
this.chart2List = res.data; this.chart2List = res.data;
let data = res.data.warningTypeList ; let data = res.data.warningTypeList ;
let total = res.data.total; let total = res.data.total;
data.forEach((it) => { data.forEach((it) => {
<<<<<<< HEAD
types.push(WarningType[it.warningType]); types.push(WarningType[it.warningType]);
=======
if (it.warningType == 1) {
types.push("交通拥堵");
} else if (it.warningType == 2) {
types.push("行人");
} else if (it.warningType == 3) {
types.push("非机动车");
} else if (it.warningType == 4) {
types.push("停车");
} else if (it.warningType == 5) {
types.push("违规驾驶");
} else if (it.warningType == 6) {
types.push("路障");
} else if (it.warningType == 7) {
types.push("道路施工");
} else if (it.warningType == 8) {
types.push("异常天气");
} else if (it.warningType == 9) {
types.push("护栏碰撞");
} else if (it.warningType == 10) {
types.push("交通事故");
} else if (it.warningType == 11) {
types.push("车辆故障");
} else if (it.warningType == 99) {
types.push("其他");
}
>>>>>>> 25407af3e8fe5fa68f3e9252cc6270c7da576ce6
numbers.push({ numbers.push({
name: types[types.length - 1], name: types[types.length - 1],
@ -480,8 +460,8 @@ export default {
// this.myChart2.setOption(chart2); // this.myChart2.setOption(chart2);
// }) // })
} }
this.$nextTick(()=>{ this.$nextTick(() => {
this.initChart2(); this.initChart2(types);
}) })
}); });
// //
@ -552,8 +532,8 @@ export default {
chart3.series[0].data = values1; chart3.series[0].data = values1;
chart3.series[1].data = values2; chart3.series[1].data = values2;
} }
this.$nextTick(()=>{ this.$nextTick(() => {
this.initChart3(); this.initChart3();
}) })
}); });
// if (this.type == "day") // if (this.type == "day")
@ -606,29 +586,29 @@ export default {
}, },
}, },
mounted() { mounted() {
getRoadSectionList().then((res) => { getRoadSectionList().then((res) => {
console.log(res); console.log(res);
if (res.code == 200) { if (res.code == 200) {
let rows = res.data; let rows = res.data;
this.dataList = []; this.dataList = [];
rows.forEach((it) => { rows.forEach((it) => {
this.dataList.push({ this.dataList.push({
title: it.sectionName.split("-")[0], title: it.sectionName.split("-")[0],
id: it.id, id: it.id,
}); });
});
//
if (rows.length > 1) {
this.dataList.push({
title: rows[rows.length - 1].sectionName.split("-")[1],
id: rows[rows.length - 1].id,
});
}
console.log("dataList", this.dataList);
}
this.searchQuery();
}); });
//
if (rows.length > 1) {
this.dataList.push({
title: rows[rows.length - 1].sectionName.split("-")[1],
id: rows[rows.length - 1].id,
});
}
console.log("dataList", this.dataList);
}
this.searchQuery();
});
} }
}; };
</script> </script>
@ -638,38 +618,49 @@ export default {
position: relative; position: relative;
.comp_body { .comp_body {
width: 100%; height: 100%; width: 100%;
height: 100%;
display: flex; display: flex;
align-items: stretch; align-items: stretch;
font-size: 14px; font-size: 14px;
> div { >div {
flex: 1; flex: 1;
background: linear-gradient( background: linear-gradient(180deg,
180deg, rgba(6, 66, 88, 0.2) 0%,
rgba(6, 66, 88, 0.2) 0%, #064258 100%);
#064258 100%
);
border: 1px solid; border: 1px solid;
border-image: linear-gradient( border-image: linear-gradient(360deg,
360deg,
rgba(55, 231, 255, 0.3), rgba(55, 231, 255, 0.3),
rgba(55, 231, 255, 0) rgba(55, 231, 255, 0)) 1 1;
) display: flex;
1 1; flex-direction: column;
display: flex; flex-direction: column; align-items: stretch; align-items: stretch;
margin-right: 14px; margin-right: 14px;
&:last-child{ margin-right: 0;}
&:last-child {
margin-right: 0;
}
} }
.unit_con { .unit_con {
flex: 1; flex: 1;
<<<<<<< HEAD
margin: 95px 20px 30px; position: relative; margin: 95px 20px 30px; position: relative;
// &.unit_con_02{ margin: 105px 0px 20px; } // &.unit_con_02{ margin: 105px 0px 20px; }
=======
margin: 95px 20px 30px;
position: relative;
>>>>>>> 25407af3e8fe5fa68f3e9252cc6270c7da576ce6
}
.empty {
position: absolute;
} }
.empty{ position: absolute;}
.chart_div{ .chart_div {
width: 100%; height: 100%; width: 100%;
height: 100%;
} }
} }
@ -761,54 +752,12 @@ export default {
</style> </style>
<style lang="scss"> <style lang="scss">
div.el-popover:has(> .el-date-picker) div.el-popover:has(> .el-date-picker) div .el-picker-panel__body .el-picker-panel__content table tr td.today span,
div div.el-popover:has(> .el-date-picker) div .el-picker-panel__body .el-picker-panel__content table tr td.today .cell,
.el-picker-panel__body div.el-picker-panel.el-date-picker.el-popper div .el-picker-panel__body .el-picker-panel__content table tr td.today span,
.el-picker-panel__content div.el-picker-panel.el-date-picker.el-popper div .el-picker-panel__body .el-picker-panel__content table tr td.today .cell,
table div.el-picker-panel.el-date-range-picker.el-popper div .el-picker-panel__body .el-picker-panel__content table tr td.today span,
tr div.el-picker-panel.el-date-range-picker.el-popper div .el-picker-panel__body .el-picker-panel__content table tr td.today .cell {
td.today
span,
div.el-popover:has(> .el-date-picker)
div
.el-picker-panel__body
.el-picker-panel__content
table
tr
td.today
.cell,
div.el-picker-panel.el-date-picker.el-popper
div
.el-picker-panel__body
.el-picker-panel__content
table
tr
td.today
span,
div.el-picker-panel.el-date-picker.el-popper
div
.el-picker-panel__body
.el-picker-panel__content
table
tr
td.today
.cell,
div.el-picker-panel.el-date-range-picker.el-popper
div
.el-picker-panel__body
.el-picker-panel__content
table
tr
td.today
span,
div.el-picker-panel.el-date-range-picker.el-popper
div
.el-picker-panel__body
.el-picker-panel__content
table
tr
td.today
.cell {
color: #fff; color: #fff;
} }
</style> </style>

23
ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/typeAnalysis/index.vue

@ -49,7 +49,7 @@ export default {
data() { data() {
return {}; return {};
}, },
created() {}, created() { },
methods: {}, methods: {},
mounted() { mounted() {
setTimeout(() => { setTimeout(() => {
@ -83,17 +83,17 @@ export default {
value: 0, value: 0,
}, },
{ {
name: "倒车/逆行", name: "违规驾驶",
warningType: 5, warningType: 5,
value: 0, value: 0,
}, },
{ {
name: "烟火", name: "路障",
warningType: 6, warningType: 6,
value: 0, value: 0,
}, },
{ {
name: "撒落物", name: "道路施工",
warningType: 7, warningType: 7,
value: 0, value: 0,
}, },
@ -191,20 +191,15 @@ export default {
.congestion { .congestion {
.board { .board {
padding: 0px 20px; padding: 0px 20px;
background: linear-gradient( background: linear-gradient(180deg,
180deg, rgba(6, 66, 88, 0.2) 0%,
rgba(6, 66, 88, 0.2) 0%, #06425888 100%);
#06425888 100%
);
border-radius: 5px 5px 5px 5px; border-radius: 5px 5px 5px 5px;
opacity: 1; opacity: 1;
border: 1px solid; border: 1px solid;
border-image: linear-gradient( border-image: linear-gradient(360deg,
360deg,
rgba(55, 231, 255, 0.1), rgba(55, 231, 255, 0.1),
rgba(55, 231, 255, 0) rgba(55, 231, 255, 0)) 1 1;
)
1 1;
display: flex; display: flex;
justify-content: center; justify-content: center;
align-items: center; align-items: center;

10
ruoyi-ui/src/views/JiHeExpressway/pages/service/PublishingChannelManagement/components/Switcher.vue

@ -9,7 +9,7 @@
<span :style="{ opacity: +active }">{{ getActiveOptions.unActive.text }}</span> <span :style="{ opacity: +active }">{{ getActiveOptions.unActive.text }}</span>
<div class="active" :style="{ left: active ? '0%' : '50%' }">{{ getActiveOptions[active ? 'active' : <div class="active" :style="{ left: active ? '0%' : '50%' }">{{ getActiveOptions[active ? 'active' :
'unActive'].text }}</div> 'unActive'].text }}</div>
</div> </div>
</template> </template>
@ -38,14 +38,14 @@ export default {
return { return {
active: { active: {
text: "启用", text: "启用",
color: "#fff", color: "#00B3CC",
textColor: "#00B3CC", textColor: "#fff",
...this.activeOption?.active ...this.activeOption?.active
}, },
unActive: { unActive: {
text: "停用", text: "停用",
color: "#00B3CC", color: "#fff",
textColor: "#fff", textColor: "#00B3CC",
...this.activeOption?.unActive ...this.activeOption?.unActive
} }
} }

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

@ -970,7 +970,7 @@ export const SchedulingEnum = {
}, },
}; };
const CameraChildTypes = { export const CameraChildTypes = {
"1-1": "高清网络枪型固定摄像机", "1-1": "高清网络枪型固定摄像机",
"1-2": "高清网络球形摄像机", "1-2": "高清网络球形摄像机",
"1-3": "桥下高清网络球形摄像机", "1-3": "桥下高清网络球形摄像机",
@ -978,7 +978,7 @@ const CameraChildTypes = {
"1-5": "180°全景摄像机", "1-5": "180°全景摄像机",
}; };
const BoardChildTypes = { export const BoardChildTypes = {
"2-1": "门架式可变信息标志", "2-1": "门架式可变信息标志",
"2-2": "大学城入口站前板", "2-2": "大学城入口站前板",
"2-3": "雨棚可变信息标志", "2-3": "雨棚可变信息标志",

Loading…
Cancel
Save