Browse Source

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

wangqin
qingzhengli 1 year ago
parent
commit
535154f92c
  1. 82
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/index.vue
  2. 128
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/event/EventDetailDialog/eventPlanDialog/index.vue
  3. 336
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/event/EventDetailDialog/formTable/index.vue
  4. 3
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/event/EventDetailDialog/index.vue
  5. 308
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/event/EventDetailDialog/qbbDialog/index.vue
  6. 22
      ruoyi-ui/src/views/JiHeExpressway/pages/control/manual/events/images/refresh.svg
  7. BIN
      ruoyi-ui/src/views/JiHeExpressway/pages/control/manual/events/img.png
  8. 160
      ruoyi-ui/src/views/JiHeExpressway/pages/control/manual/events/index.vue
  9. 13
      ruoyi-ui/src/views/JiHeExpressway/pages/maintenanceOperations/statisticalAnalysis/components/deviceSummary/index.vue
  10. 8
      ruoyi-ui/src/views/JiHeExpressway/pages/maintenanceOperations/statisticalAnalysis/components/deviceUptime/index.vue
  11. 10
      ruoyi-ui/src/views/JiHeExpressway/pages/maintenanceOperations/statisticalAnalysis/components/monthlyEquipment/index.vue
  12. 2
      ruoyi-ui/src/views/JiHeExpressway/pages/maintenanceOperations/statisticalAnalysis/data.js
  13. 29
      ruoyi-ui/src/views/JiHeExpressway/pages/maintenanceOperations/statisticalAnalysis/index.vue
  14. 97
      ruoyi-ui/src/views/JiHeExpressway/pages/maintenanceOperations/statisticalAnalysis/testDeviceData.js
  15. 1
      ruoyi-ui/src/views/JiHeExpressway/pages/service/board/index.vue
  16. 7
      ruoyi-ui/src/views/JiHeExpressway/pages/service/publicService/index.vue
  17. 3
      ruoyi-ui/vue.config.js

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

@ -1,41 +1,41 @@
<template>
<div class="Home">
<AMapContainer ref="AMapContainerRef" @update:isGisCompleted="(data) => {
this.isGisCompleted = data;
}
" />
<section class="content">
<!-- 左侧 -->
<div class="content-l">
<!-- -->
<FocusedMonitoring class="card-menu" />
<!-- -->
<RoadAndEvents ref="RoadAndEventsRef" :isGisCompleted="isGisCompleted" class="content-l-b card-menu" />
</div>
<!-- 右侧 -->
<div class="content-r">
<div class="home-icons">
<HomeFilter class="item" />
<HomeFrame class="item" />
<HomeVector class="item" />
<!-- <HomeVectorControl class="item" /> -->
<!-- <HomeFrameControl class="item" /> -->
<AMapContainer ref="AMapContainerRef" @update:isGisCompleted="(data) => {
this.isGisCompleted = data;
}
" />
<section class="content">
<!-- 左侧 -->
<div class="content-l">
<!-- -->
<FocusedMonitoring class="card-menu" />
<!-- -->
<RoadAndEvents ref="RoadAndEventsRef" :isGisCompleted="isGisCompleted" class="content-l-b card-menu" />
</div>
<!-- 右侧 -->
<div class="content-r">
<div class="home-icons">
<HomeFilter class="item" />
<HomeFrame class="item" />
<HomeVector class="item" />
<!-- <HomeVectorControl class="item" /> -->
<!-- <HomeFrameControl class="item" /> -->
</div>
<ConditionStatistics class="right card-menu" />
</div>
</section>
<footer class="footer card-menu">
<div class="footer-title">
<span>济菏高速缩略图</span>
<i class="el-icon-s-fold" style="color: #2ad9fd; transform: rotate(-90deg)" @click.stop="handleShrink" />
</div>
<div class="footer-content">
<Thumbnail />
</div>
<ConditionStatistics class="right card-menu" />
</div>
</section>
<footer class="footer card-menu">
<div class="footer-title">
<span>济菏高速缩略图</span>
<i class="el-icon-s-fold" style="color: #2ad9fd; transform: rotate(-90deg)" @click.stop="handleShrink" />
</div>
<div class="footer-content">
<Thumbnail />
</div>
</footer>
</footer>
</div>
</template>
@ -109,13 +109,15 @@ export default {
<style lang="scss" scoped>
.Home {
width: 100%;
height: 100%;
z-index: 6;
display: flex;
flex-direction: column;
gap: 30px;
// height: 100%;
// z-index: 6;
// display: flex;
// flex-direction: column;
// gap: 30px;
padding: 19px 31px 0 25px;
justify-content: center;
// justify-content: center;
.card-menu {
transition: all 0.24s linear;

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

@ -13,7 +13,7 @@
<div class="text">联动设备:</div>
</el-col>
<el-col :span="22">
<FormTable ref="secondFormTable" :tableData="secondFormData"></FormTable>
<FormTable ref="secondFormTable" :tableData="secondFormData" :type="1"></FormTable>
</el-col>
</el-row>
</div>
@ -23,14 +23,16 @@
<div class="text">恢复操作:</div>
</el-col>
<el-col :span="22">
<FormTable ref="thirdFormTable" :tableData="thirdFormData"></FormTable>
<FormTable ref="thirdFormTable" :tableData="thirdFormData" :type="2"></FormTable>
</el-col>
</el-row>
</div>
</div>
<template #footer>
<Button style="padding:0 24px;" @click.native="handleSubmit" :loading="submitting">强制恢复</Button>
<Button v-if="isDisBtn" style="padding:0 24px; pointer-events: none; background-color: #C9C9C9;"
@click.native="handleRestore" :loading="submitting">强制恢复</Button>
<Button v-else style="padding:0 24px;" @click.native="handleRestore" :loading="submitting">强制恢复</Button>
<Button style="padding:0 24px;" @click.native="handleSubmit" :loading="submitting">确认</Button>
<Button style="background: #C9C9C9;padding:0 24px;"
@click.native="modelVisible = false, submitting = false">取消</Button>
@ -40,12 +42,11 @@
<script>
import Dialog from "@screen/components/Dialog/index";
import FormTable from '../../../plan/formTable/index.vue';
import FormTable from '../formTable/index.vue';
import Button from '@screen/components/Buttons/Button.vue';
import request from '@/utils/request';
import { Message } from "element-ui";
import { throttle } from "lodash"
import { isDate } from 'mathjs';
export default {
@ -66,17 +67,23 @@ export default {
},
props: {
visible: Boolean,
activeName: String,
info: {
type: Array,
default: () => []
},
eventFormData: {
type: Object,
default: () => { }
}
},
data() {
return {
title: '事件确认',
isDisBtn: true,
dialogType: 1,
planId: 0,
plans: [],
planInfo: {},
submitting: false,
secondFormData: [{
deviceType: 1,
@ -186,6 +193,7 @@ export default {
if (this.visible) {
if (this.info.length > 0) {
this.planName = this.info[0]?.planName || '';
this.planInfo = this.info[0];
this.initData(this.info[0]);
}
}
@ -243,10 +251,21 @@ export default {
}
return this.deviceData;
},
async getTemplateAutomatic() {
request({
url: `/business/plans/event/automatic`,
method: "post",
}).then((result) => {
if (result.code != 200) return Message.error(result?.msg);
this.sbOptions = result.data;
}).catch(() => {
Message.error("查询可变信息标识失败");
})
},
changeRadio(value) {
console.log('va', value)
let plan = this.info.find(it => it.planName == value);
console.log('plan', plan)
this.planInfo = plan;
this.initData(plan);
},
formatData(it, value = 1) {
@ -289,47 +308,53 @@ export default {
},
handleSubmit() {
// this.submitting = false;
let secondFormTable = this.$refs['secondFormTable'].tableData || [];
let thirdFormTable = this.$refs['thirdFormTable'].tableData || [];
console.log('12', thirdFormTable);
let dcArr = [];
let id = '';
if (this.dialogType == 2) id = this.planId;
secondFormTable.forEach(it => {
dcArr.push(this.formatData(it, 1, id));
})
thirdFormTable.forEach(it => {
dcArr.push(this.formatData(it, 2, id));
})
console.log({
dcExecuteAction: dcArr
})
return;
if (this.dialogType == 1) {//
// let secondFormTable = this.$refs['secondFormTable'].tableData || [];
// let thirdFormTable = this.$refs['thirdFormTable'].tableData || [];
// console.log('12', thirdFormTable);
// let dcArr = [];
// let id = '';
// if (this.dialogType == 2) id = this.planId;
// secondFormTable.forEach(it => {
// dcArr.push(this.formatData(it, 1, id));
// })
// thirdFormTable.forEach(it => {
// dcArr.push(this.formatData(it, 2, id));
// })
} else if (this.dialogType == 2) {//
// request({
// url: `/business/plans`,
// method: "put",
// data: {
// ...this.formData,
// id: this.planId,
// dcExecuteAction: dcArr
// }
// }).then((result) => {
// if (result.code != 200) return Message.error(result?.msg);
// Message.success("");
// this.modelVisible = false;
// }).catch(() => {
// Message.error("");
// }).finally(() => {
// this.submitting = false;
// this.$emit('reInitData', true);
// })
let reqData = {
operationType: 1,//1- 2-
dcEmergencyPlans: this.planInfo,
dcEvent: this.eventFormData
};
// let url = '';
// if (this.activeName == '-1') {//
// url = '/business/plans/event/confirm';
// reqData = { ...reqData, dcWarning: { ...reqData.dcEvent } }
// } else {//
// url = '/business/plans/event/confirm';
// }
console.log('reqData', reqData)
return;
request({
url: url,
method: "post",
data: reqData
}).then((result) => {
if (result.code != 200) return Message.error(result?.msg);
Message.success("提交成功");
this.modelVisible = false;
}).catch(() => {
Message.error("提交失败");
}).finally(() => {
this.submitting = false;
// this.$emit('reInitData', true);
})
}
},
handleRestore() {
}
}
@ -349,7 +374,7 @@ export default {
.EventAddPlanDialog {
gap: 9px;
width: 1080px;
width: 1280px;
height: 310px;
display: flex;
flex-direction: column;
@ -376,5 +401,16 @@ export default {
justify-content: end;
gap: 15px;
}
// .disabledBtn {
// height: 24px;
// border-radius: 48px;
// background: #C9C9C9;
// padding: 0 24px;
// color: white !important;
// display: flex;
// align-items: center;
// justify-content: center;
// }
}
</style>

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

@ -0,0 +1,336 @@
<template>
<div class="EventDetail">
<Table :data="tableData" :show-header="false">
<ElTableColumn prop="deviceType" width="160">
<template slot-scope="scope">
<el-select v-model="scope.row.deviceType" placeholder="请选择设备类型" @change="changeDeviceType">
<el-option v-for="item in deviceOptions" :key="item.value" :label="item.label"
:value="item.value">
</el-option>
</el-select>
</template>
</ElTableColumn>
<ElTableColumn prop="searchRule" width="230">
<template slot-scope="scope">
<div class="plhx">
<el-select v-model="scope.row.searchRule" placeholder="检索规则条件">
<el-option v-for="item in zyOptions" :key="item.value" :label="item.label"
:value="item.value">
</el-option>
</el-select>
<el-input-number v-if="scope.row.searchRule == 2 || scope.row.searchRule == 3"
v-model="scope.row.number" :min="0" :max="9999" style="width: 130px;"></el-input-number>
<p v-if="scope.row.searchRule == 2 || scope.row.searchRule == 3"></p>
<el-input-number v-if="scope.row.searchRule == 4" v-model="scope.row.number" :min="0"
:max="9999" style="width: 130px;"></el-input-number>
<p v-if="scope.row.searchRule == 4" style="width: 56px;">公里</p>
</div>
</template>
</ElTableColumn>
<ElTableColumn prop="deviceList" width="400">
<template slot-scope="scope">
<div class="mjs">
<el-select v-if="scope.row.searchRule == 1" v-model="scope.row.deviceList" placeholder="请选择设备"
multiple collapse-tags>
<el-option v-for="item in sbOptions" :key="item.id" :label="item.deviceName"
:value="item.id">
</el-option>
</el-select>
<el-input @click.native="clickQbb(scope.$index)" v-if="scope.row.deviceType == 2"
placeholder="请选择" v-model="scope.row.qbb" readonly>
<i slot="suffix" class="el-input__icon el-icon-search"></i>
</el-input>
<el-select v-if="scope.row.deviceType == 10" v-model="scope.row.gzms" placeholder="工作模式">
<el-option v-for="item in gzmsOptions" :key="item.value" :label="item.label"
:value="item.value"></el-option>
</el-select>
<el-input-number v-if="scope.row.deviceType == 10" placeholder="时长(分钟)"
v-model="scope.row.operationDuration" :min="0" :max="999"></el-input-number>
<el-select v-if="scope.row.deviceType == 12" v-model="scope.row.controlModel"
placeholder="请选择模式">
<el-option label="手动模式" value="00"></el-option>
<el-option label="自动模式" value="01"></el-option>
<el-option label="万年历" value="02"></el-option>
</el-select>
<el-time-picker v-if="scope.row.controlModel == '01' && scope.row.deviceType == 12"
v-model="scope.row.time" is-range style="" range-separator="-" placeholder="选择时间"
value-format="HH:mm" format="HH:mm">
</el-time-picker>
<el-select v-if="scope.row.deviceType == 12" v-model="scope.row.state" placeholder="工作状态">
<el-option v-for="item in gzztOptions" :key="item.value" :label="item.label"
:value="item.value"></el-option>
</el-select>
<el-input v-if="scope.row.deviceType == 5" v-model="scope.row.content"
placeholder="请输入发布内容"></el-input>
</div>
</template>
</ElTableColumn>
<ElTableColumn label="操作" width="100">
<template slot-scope="scope">
<ElButton class="elButton" icon="el-icon-plus" plain size="mini"
@click.native="onAdd(scope.row.id)" />
<ElButton class="elButton" icon="el-icon-delete" plain size="mini"
@click.native="onDel(scope.$index)" />
</template>
</ElTableColumn>
</Table>
<!-- 情报板弹窗 -->
<QbbDialog :visible="isShowDialog" :info="qbbData" :type="type" @close="onCloseDialog" @dialogSubmit="dialogSubmit" />
</div>
</template>
<script>
import Table from '@screen/components/Table.vue';
import Button from '@screen/components/Buttons/Button.vue';
import request from "@/utils/request";
import QbbDialog from "../qbbDialog/index.vue";
import { Message } from 'element-ui'
import { planDeviceOptions } from "@screen/utils/enum.js";
export default {
name: 'formTable',
components: {
Button,
Table,
QbbDialog
},
model: {
prop: 'visible',
event: 'update:value'
},
inject: ['loadData'],
props: {
visible: Boolean,
eventType: Number,
type: Number,
tableData: {
type: Array,
default: () => [{
deviceType: 1,
searchRule: 1,
qbb: ''
}]
}
},
data() {
return {
// tableData: [
// {
// deviceType: 1,
// searchRule: 1,
// qbb: ''
// }
// ],
isShowDialog: false,
deviceOptions: planDeviceOptions,
zyOptions: [
{
value: 1,
label: '指定设备资源'
},
{
value: 2,
label: '事发上游最近'
},
{
value: 3,
label: '事发下游最近'
},
{
value: 4,
label: '最近公里数'
},
],
gzztOptions: [
{
value: "01",
label: "常亮"
},
{
value: "02",
label: "流水"
},
{
value: "03",
label: "闪烁"
},
{
value: "04",
label: "关闭",
}
],
gzmsOptions: [
{
value: "SETMD0",
label: "激光关闭"
},
{
value: "SETMD1",
label: "常亮模式"
},
{
value: "SETMD2",
label: "间隔100ms闪烁模式"
},
{
value: "SETMD3",
label: "间隔200ms闪烁模式",
},
{
value: "SETMD4",
label: "间隔500ms闪烁模式",
},
{
value: "SETMD5",
label: "2次闪烁模式"
},
{
value: "SETMD6",
label: "SOS模式"
},
{
value: "SETMD7",
label: "自定义模式1",
},
{
value: "SETMD8",
label: "自定义模式2",
},
{
value: "SETMD9",
label: "自定义模式3",
}
],
qbbData: {},
sbOptions: [],
deviceType: 1,
index: 1
}
},
async created() {
let loadData = await this.loadData(1);
// console.log('aa',loadData)
this.sbOptions = loadData;
},
methods: {
initData() {
// request({
// url: `business/device/query?deviceType=2`,
// method: "get",
// }).then((result) => {
// if (result.code != 200) return Message.error(result?.msg);
// this.sbOptions = result.data;
// }).catch(() => {
// Message.error("");
// })
},
async changeDeviceType(value) {
this.deviceType = value;
console.log('value', value)
this.sbOptions = await this.loadData(value);
},
onAdd(id) {
this.tableData.push({
deviceType: 1,
searchRule: 1,
qbb: ''
})
},
onDel(index) {
if (this.tableData.length <= 1) {
return Message.warning('最后一项不可删除!');
}
this.tableData.splice(index, 1)
},
clickQbb(index) {
this.index = index;
this.qbbData = this.tableData[index].dcInfoBoardTemplate;
if (this.type == 1) {
this.isShowDialog = true;
}
},
onCloseDialog() {
this.isShowDialog = false;
},
dialogSubmit(data) {
this.tableData[this.index].qbb = data.content;
this.tableData[this.index].otherConfig = JSON.stringify(data);
}
}
}
</script>
<style lang="scss" scoped>
.EventDetail {
display: flex;
gap: 9px;
width: 100%;
// height: 768px;
min-height: 50px;
margin-top: 5px;
flex-direction: column;
::v-deep {
.el-table .el-table__cell {
padding: 0 5px;
}
}
.mjs {
display: flex;
>div {
margin-right: 10px;
}
}
.ms {
width: 160px;
}
.plhx {
display: flex;
}
::v-deep {
.el-tag.el-tag--info {
max-width: 100px;
}
.el-range-editor--medium .el-range__icon,
.el-range-editor--medium .el-range__close-icon {
display: none;
}
}
}
.elButton {
background: #2ba8c3;
border-radius: 2px 2px 2px 2px;
color: #FFFFFF;
}
.elButton:hover,
.elButton:focus {
background: #2ba8c3;
border-radius: 2px 2px 2px 2px;
border-color: #FFFFFF;
color: #FFFFFF;
}
</style>

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

@ -18,7 +18,8 @@
</div>
<!-- 确认弹窗 -->
<EventPlanDialog :visible="isShowDialog" :info="info" @close="onCloseAddNew" />
<EventPlanDialog :visible="isShowDialog" :info="info" :eventFormData="formData" :activeName="activeName"
@close="onCloseAddNew" />
<template #footer>
<Button style="padding: 0 24px;" @click.native="onDelete">误报</Button>

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

@ -0,0 +1,308 @@
<template>
<Dialog v-model="modelVisible" title="情报板确认">
<div class="EventAddPlanDialog">
<h4>预案内容</h4>
<dev class="listBox disPid">
<div class="tplItem">
<!-- 模板内容 -->
<BoardTplPreview class="boardPreview" boardWH="1400*200" :tpl="{}"></BoardTplPreview>
<!-- 操作按钮 -->
<div class="infoBtnBox infoBtnBoxSm">
<p class="btn">
<!-- <el-radio v-model="radio1" :label="1" @input="changeRadio(1)" /> -->
</p>
</div>
</div>
</dev>
<h4>自动生成</h4>
<dev class="listBox disPid">
<div class="tplItem">
<!-- 模板内容 -->
<BoardTplPreview class="boardPreview" boardWH="1400*200" :tpl="{}"></BoardTplPreview>
<!-- 操作按钮 -->
<div class="infoBtnBox infoBtnBoxSm">
<p class="btn">
<!-- <el-radio v-model="radio1" :label="2" @input="changeRadio(2)" /> -->
</p>
</div>
</div>
</dev>
<h4>情报板模版</h4>
<vuescroll :ops="scrollOptions" class="listBox">
<div v-for="(item) in templateAvailable" :key="item.dictValue">
<!-- 原来是<el-collapse v-model="activeNames"> -->
<h5>{{ item.dictLabel }}</h5>
<div v-for="(itm, indx) in item.list" :key="indx" class="tplItem">
<!-- 模板内容 -->
<BoardTplPreview class="boardPreview" boardWH="1400*200" :tpl="itm"></BoardTplPreview>
<!-- 操作按钮 -->
<div class="infoBtnBox infoBtnBoxSm">
<p class="btn">
<el-radio v-model="radio1" :label="itm.id" @input="changeRadio(itm)" />
</p>
</div>
</div>
</div>
</vuescroll>
</div>
<template #footer>
<Button style="background: #C9C9C9;padding:0 24px;"
@click.native="modelVisible = false, submitting = false">取消</Button>
<Button style="padding:0 24px;" @click.native="handleSubmit" :loading="submitting">确认</Button>
</template>
</Dialog>
</template>
<script>
import vuescroll from "vuescroll";
import scrollOptions from "@/common/scrollbar.js";
import BoardTplPreview from "@screen/components/infoBoard/BoardTplPreview.vue";
import Dialog from "@screen/components/Dialog/index";
import Button from '@screen/components/Buttons/Button.vue';
import { getTemplateList } from "@/api/board/template";
import DeviceControlDialog from '../../../../../Home/components/Dialogs/DrivingGuidance/components/DeviceControlDialog.vue';
export default {
name: 'qbbDialog',
components: {
Dialog,
Button,
vuescroll,
BoardTplPreview,
DeviceControlDialog
},
model: {
prop: 'visible',
event: 'close'
},
props: {
visible: Boolean,
type: Number,
info: {
type: Object,
default: () => { }
}
},
data() {
return {
submitting: false,
selectedSize: "",
scrollOptions,
templateAvailable: null,
tplCategory: [],
templateAll: [],
radio1: '',
itmData: {}
}
},
mounted() {
if (this.type == 1) {
this.initData();
}
},
computed: {
modelVisible: {
get() {
if (this.visible) {
if (this.info && this.info.id) {
this.radio1 = Number(this.info.id);
}
}
return this.visible;
},
set(val) {
this.$emit('close', val)
}
},
},
methods: {
initData() {
if (this.tplCategory.length && this.templateAll.length) {
this.____setAvailableTemplate();
} else {
Promise.all([
this.____getTemplateCategory(),
this.____getAllTemplate(),
]).then((res) => {
this.____setAvailableTemplate();
});
}
},
//
____getTemplateCategory() {
return this.getDicts("iot_template_category").then((res) => {
this.tplCategory = res.data;
});
},
//
____getAllTemplate() {
return getTemplateList().then((res) => {
this.templateAll = res.data;
});
},
//
____setAvailableTemplate() {
this.templateAvailable = [];
this.tplCategory.forEach((item, index) => {
let arr = this.templateAll["" + index];
if (arr.length > 0) {
let temp = [];
arr.forEach((tpl) => {
if (tpl.screenSize) {
temp.push(tpl);
}
});
if (temp.length > 0) {
this.templateAvailable.push({
...item,
list: temp,
});
}
}
});
},
changeRadio(data) {
this.itmData = data;
},
handleSubmit() {
this.modelVisible = false;
this.$emit('dialogSubmit', this.itmData);
}
}
}
</script>
<style lang="scss" scoped>
.listBox {
padding: 20px;
.tplItem {
margin-right: 14px;
display: flex;
align-items: stretch;
padding-bottom: 10px;
.boardPreview {
border: 1px solid rgba(61, 232, 255, 0.5);
// width: 560px;
// height:80px;
flex: 1;
}
.infoBtnBox {
&.infoBtnBoxSm {
width: 60px;
}
width: 110px;
height: 80px;
display: flex;
margin-left: 10px;
/* // border: solid 1px #05afe3; */
border: 1px solid rgba(61, 232, 255, 0.5);
display: flex;
justify-content: space-around;
align-items: center;
.btn {
background-repeat: no-repeat;
background-size: 100% 100%;
width: 15px;
height: 30px;
&.btnApply {
background-image: url(~@/assets/jihe/images/button/toLeft.svg);
}
&.btnEdit {
background-image: url(~@/assets/jihe/images/button/edit.svg);
}
&.btnDelete {
background-image: url(~@/assets/jihe/images/button/delete.svg);
}
}
i {
font-size: 24px;
color: #666;
padding-left: 4px;
cursor: pointer;
caret-color: rgba(0, 0, 0, 0);
user-select: none;
}
i:hover {
color: #05afe3;
}
.disabledClass {
pointer-events: none;
cursor: auto !important;
color: #ccc;
}
}
}
.controlBox {
margin-top: 10px;
margin-bottom: 10px;
display: flex;
justify-content: center;
}
.el-collapse {
max-height: 100% !important;
overflow: auto;
border-bottom: none;
border-top: none;
padding: 0 0.5vw;
}
}
.disPid {
padding: 0 20px !important;
}
.fade-enter-active,
.fade-leave-active {
transition: opacity .24s;
}
.fade-enter,
.fade-leave-to {
opacity: 0;
}
.EventAddPlanDialog {
gap: 9px;
width: 650px;
height: 700px;
display: flex;
flex-direction: column;
h4 {
margin: 0 0 5px 0;
}
::v-deep {
.el-radio__label {
display: none;
}
}
.form {
flex: 1;
overflow-y: auto;
}
.footer {
display: flex;
justify-content: end;
gap: 15px;
}
}
</style>

22
ruoyi-ui/src/views/JiHeExpressway/pages/control/manual/events/images/refresh.svg

@ -0,0 +1,22 @@
<svg width="16" height="14" viewBox="0 0 16 14" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Group 1142814398">
<g id="Group 1142814396">
<path id="Rectangle 1304" d="M1.0437 2.41495L4.5636 2.01738L4.91112 6.00562" stroke="white" stroke-linecap="round"/>
<g id="Ellipse 835">
<mask id="path-2-inside-1_290_77" fill="white">
<path d="M4.29579 2.52494C4.09359 2.27296 3.71712 2.25216 3.51748 2.50144C2.86315 3.31847 2.39514 4.30903 2.15904 5.38649C1.87758 6.67096 1.93836 8.02122 2.3337 9.26652C2.72904 10.5118 3.44118 11.5962 4.38007 12.3826C5.16561 13.0406 6.08036 13.4652 7.0411 13.6229C7.35243 13.674 7.61901 13.4293 7.63212 13.1145C7.64523 12.7997 7.39954 12.5346 7.08935 12.4765C6.32757 12.3339 5.60349 11.9884 4.97813 11.4646C4.19938 10.8124 3.6087 9.91289 3.28078 8.87998C2.95287 7.84706 2.90245 6.72709 3.13591 5.66169C3.33404 4.75752 3.72906 3.92712 4.28182 3.24492C4.4503 3.03698 4.46523 2.7361 4.29579 2.52494Z"/>
</mask>
<path d="M4.29579 2.52494C4.09359 2.27296 3.71712 2.25216 3.51748 2.50144C2.86315 3.31847 2.39514 4.30903 2.15904 5.38649C1.87758 6.67096 1.93836 8.02122 2.3337 9.26652C2.72904 10.5118 3.44118 11.5962 4.38007 12.3826C5.16561 13.0406 6.08036 13.4652 7.0411 13.6229C7.35243 13.674 7.61901 13.4293 7.63212 13.1145C7.64523 12.7997 7.39954 12.5346 7.08935 12.4765C6.32757 12.3339 5.60349 11.9884 4.97813 11.4646C4.19938 10.8124 3.6087 9.91289 3.28078 8.87998C2.95287 7.84706 2.90245 6.72709 3.13591 5.66169C3.33404 4.75752 3.72906 3.92712 4.28182 3.24492C4.4503 3.03698 4.46523 2.7361 4.29579 2.52494Z" stroke="white" stroke-width="2" mask="url(#path-2-inside-1_290_77)"/>
</g>
</g>
<g id="Group 1142814397">
<path id="Rectangle 1304_2" d="M15.0437 11.585L11.5238 11.9826L11.1763 7.99438" stroke="white" stroke-linecap="round"/>
<g id="Ellipse 835_2">
<mask id="path-4-inside-2_290_77" fill="white">
<path d="M11.7916 11.4751C11.9938 11.727 12.3703 11.7478 12.5699 11.4986C13.2242 10.6815 13.6923 9.69097 13.9284 8.61351C14.2098 7.32904 14.149 5.97878 13.7537 4.73348C13.3584 3.48817 12.6462 2.40376 11.7073 1.61737C10.9218 0.95942 10.007 0.534814 9.0463 0.377109C8.73497 0.326006 8.46839 0.570722 8.45528 0.885536C8.44218 1.20035 8.68786 1.46544 8.99805 1.5235C9.75983 1.6661 10.4839 2.01159 11.1093 2.53538C11.888 3.18765 12.4787 4.08711 12.8066 5.12002C13.1345 6.15294 13.1849 7.27291 12.9515 8.33831C12.7534 9.24248 12.3583 10.0729 11.8056 10.7551C11.6371 10.963 11.6222 11.2639 11.7916 11.4751Z"/>
</mask>
<path d="M11.7916 11.4751C11.9938 11.727 12.3703 11.7478 12.5699 11.4986C13.2242 10.6815 13.6923 9.69097 13.9284 8.61351C14.2098 7.32904 14.149 5.97878 13.7537 4.73348C13.3584 3.48817 12.6462 2.40376 11.7073 1.61737C10.9218 0.95942 10.007 0.534814 9.0463 0.377109C8.73497 0.326006 8.46839 0.570722 8.45528 0.885536C8.44218 1.20035 8.68786 1.46544 8.99805 1.5235C9.75983 1.6661 10.4839 2.01159 11.1093 2.53538C11.888 3.18765 12.4787 4.08711 12.8066 5.12002C13.1345 6.15294 13.1849 7.27291 12.9515 8.33831C12.7534 9.24248 12.3583 10.0729 11.8056 10.7551C11.6371 10.963 11.6222 11.2639 11.7916 11.4751Z" stroke="white" stroke-width="2" mask="url(#path-4-inside-2_290_77)"/>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 3.1 KiB

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 369 KiB

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

@ -1,42 +1,152 @@
<template>
<div class='comp_box'>
<img src="./img.png" />
<div class="RoadNetworkMonitoring">
<!-- 搜索栏 -->
<div class="filter">
<ButtonGradient @click="onRefresh" class="refresh-btn">
<template #prefix>
<img src="./images/refresh.svg" />
</template>
刷新
</ButtonGradient>
<InputSearch
style="width: 402px"
:formList="searchFormList"
:formConfigOptions="{ dFormData: { eventState: '0' } }"
@handleSearch="handleSearch"
/>
</div>
<!-- 内容 -->
<div class="body">
<RoadStateCard
v-for="(item, index) in data"
:key="index"
:cardData="item"
@firstBtnClick="firstBtnClick"
@lastBtnClick="lastBtnClick"
/>
</div>
<!-- 分页 -->
<div class="footer">
<Pagination
@current-change="initData"
@size-change="onSizeChange"
width="'100%'"
:page-sizes="[12, 16, 20, 30, 50]"
:page-size="searchData.pageSize"
:current-page.sync="searchData.pageNum"
layout="total, sizes, prev, pager, next"
:total="total"
>
</Pagination>
</div>
</div>
</template>
<script>
import ButtonGradient from "@screen/components/Buttons/ButtonGradient.vue";
import Pagination from "@screen/components/Pagination.vue";
import InputSearch from "@screen/components/InputSearch/index.vue";
import RoadStateCard from "@screen/components/RoadStateCard/index.vue";
// import EventDetailDialog from "./EventDetailDialog/index";
// import EventDispatchDialog from "./EventDispatchDialog/index";
// import { searchFormList } from "./data";
import request from "@/utils/request";
const directionMapping = {
1: "菏泽方向",
2: "双向",
3: "济南方向",
};
export default {
name: 'InDevelopment',
name: "RoadNetworkMonitoring",
components: {
Pagination,
RoadStateCard,
InputSearch,
Pagination,
ButtonGradient,
},
props: {
text: {
type: String,
default: "暂无数据"
}
data() {
return {
searchFormList: {},
detailDialogFormData: {},
total: 0,
data: [],
eventId: "0",
searchData: {
pageSize: 16,
pageNum: 1,
eventState: "0",
},
};
},
mounted() {
}
}
created() {
this.initData();
},
methods: {
initData() {
request({
// url: `/dc/system/event/dispatchEventList`,
url: "/dc/system/event/list",
method: "get",
params: this.searchData,
}).then((result) => {
if (result.code != 200) return Message.error(result?.msg);
this.total = result.total;
result.rows.forEach((it) => {
it.stringDirection = directionMapping[it.direction] || it.direction;
});
this.data = result.rows;
});
},
onSizeChange(pageSize) {},
getStateCardBind(item) {},
onRefresh() {},
firstBtnClick(id) {},
handleSearch(data) {},
},
};
</script>
<style lang='scss' scoped>
.comp_box {
// padding-top:160px;
width: 100%;
<style lang="scss" scoped>
.RoadNetworkMonitoring {
padding: 21px;
height: 100%;
color: #8A9EAA;
display: flex;
justify-content: center;
align-items: center;
position: relative;
img {
position: absolute;
left: 0;
top: 0;
bottom: 0;
right: 0;
flex-direction: column;
z-index: 6;
.filter {
height: 38px;
display: flex;
// justify-content: flex-end;
justify-content: space-between;
.refresh-btn {
}
}
.body {
flex: 1;
overflow: auto;
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-gap: 20px;
// grid-row-gap: 9px;
// grid-column-gap: 9px;
grid-auto-rows: min-content;
}
.footer {
margin-top: 15px;
height: 36px;
display: flex;
align-items: center;
justify-content: center;
}
}
</style>

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

@ -32,6 +32,12 @@
</div>
<div class="line"></div>
<div class="right-list">
<div class="list-text">
<span class="title">在用</span>
<div class="value value4">
{{ item.sumUseState }}
</div>
</div>
<div class="list-text">
<span class="title">在线</span>
<div class="value value1">
@ -175,8 +181,8 @@
align-items: center;
.list-text {
height: 30px;
line-height: 30px;
height: 24px;
line-height: 24px;
width: 100%;
font-size: 12px;
font-family: PingFang SC, PingFang SC;
@ -205,6 +211,9 @@
.value3 {
color: #FFD15Cee;
}
.value4 {
color: #0D0;
}
}
}

8
ruoyi-ui/src/views/JiHeExpressway/pages/maintenanceOperations/statisticalAnalysis/components/deviceUptime/index.vue

@ -1,12 +1,12 @@
<template>
<div class='congestion'>
<WgtTitle :title="'设备在线率'"></WgtTitle>
<WgtTitle :title="'设备在线率雷达图'"></WgtTitle>
<div class="board">
<Empty v-if="isEmpty" text="暂无数据..."></Empty>
<div v-else class="charts keep-ratio " ref="deviceUptime"></div>
</div>
</div>
</div></template>
</template>
<script>
import WgtTitle from "../../../../perception/widgets/title";
@ -77,12 +77,12 @@ export default {
<style lang='scss' scoped>
.congestion {
width: 100%;
width: 100%; height: 100%;
display: flex;
flex-direction: column;
.board {
height: 510px;
flex: 1;
width: 100%;
padding: 0px 20px;
background: linear-gradient(180deg, rgba(6, 66, 88, 0) 0%, rgba(6, 66, 88, 0.4) 100%);

10
ruoyi-ui/src/views/JiHeExpressway/pages/maintenanceOperations/statisticalAnalysis/components/monthlyEquipment/index.vue

@ -1,6 +1,6 @@
<template>
<div class='congestion'>
<WgtTitle :title="'月设备变化曲线'"></WgtTitle>
<WgtTitle :title="'设备在线率气泡图'"></WgtTitle>
<div class="board" ref="box">
<Empty v-if="isEmpty" text="暂无数据..."></Empty>
<template v-else>
@ -103,8 +103,12 @@ export default {
return a - b
})
let temp3 = _.chunk(temp2, Math.floor(temp2.length / 4));
temp3[3] = _.concat(temp3[3], temp3[4]);
temp3.splice(4, 1);
if(temp3.length>4){
for(let i=4; i<temp3.length; i++){
temp3[3] = _.concat(temp3[3], temp3[i]);
}
temp3.length = 4;
}
levelArr = temp3;
//

2
ruoyi-ui/src/views/JiHeExpressway/pages/maintenanceOperations/statisticalAnalysis/data.js

@ -117,4 +117,4 @@ export const searchFormList = [
],
},
},
];
];

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

@ -1,7 +1,7 @@
<template>
<div class="statisticAnalysis">
<el-tabs class="saContent" v-model="activeName" @tab-click="changeTabs">
<el-tab-pane label="设备分析" name="first" class="deviceAnalysis">
<el-tabs class="full_tab" v-model="activeName" @tab-click="changeTabs">
<el-tab-pane label="设备分析" name="first" class="tab_con">
<DeviceSummary
class="deviceSummary"
:dataList="equipments"
@ -11,7 +11,7 @@
<MonthlyEquipment class="tabs-mo" :dataList="equipments" />
</div>
</el-tab-pane>
<el-tab-pane label="设备查询" name="second">
<el-tab-pane label="设备查询" name="second" class="tab_con">
<div class="topdiv">
<div class="left-div">
<el-button
@ -290,6 +290,7 @@ export default {
pctOnl: Math.floor(100 * Math.random()) + "%",
pctOffl: "25%",
pctLose: "15%",
sumUseState: "90%"
});
});
return;
@ -303,6 +304,7 @@ export default {
pctOnl: val.sucessRate,
pctLose: val.failRate,
pctOffl: val.lostRate,
sumUseState: val.sumUseState
};
if (key.includes("全部设备")) {
allList.unshift(item);
@ -329,7 +331,6 @@ export default {
this.setStatus("01", "doing");
let data = this.searchFormList[1].options.options;
let typeLabel = "";
console.log("data", data);
data.forEach((item) => {
if (item.value == this.typeQuery) {
typeLabel = item.label;
@ -426,7 +427,7 @@ export default {
display: inline-flex;
width: 100%;
flex-direction: row;
height: 100%;
flex:1; height: 0;
.tabs-lo {
display: inline-flex;
@ -442,7 +443,7 @@ export default {
.deviceSummary {
height: 390px;
margin-bottom: 10px;
margin-bottom: 6px;
}
.btnSearch {
@ -529,14 +530,20 @@ export default {
opacity: 0.1;
}
.saContent {
.full_tab {
width: 100%;
height: 100%;
.deviceAnalysis {
display: flex; flex-direction: column; flex: 1;
::v-deep .el-tabs__header{}
::v-deep .el-tabs__content{ flex: 1;
.el-tab-pane{ width: 100%; height: 100%;}
}
}
.tab_con{ display: flex; flex-direction: column;}
.topdiv {
display: inline-flex;
position: relative;
@ -552,7 +559,9 @@ export default {
}
.statisticAnalysis {
padding: 8px 20px;
width: 100%;
height: 100%;
padding: 8px 20px 20px;
.header-shot {
width: 98%;

97
ruoyi-ui/src/views/JiHeExpressway/pages/maintenanceOperations/statisticalAnalysis/testDeviceData.js

@ -0,0 +1,97 @@
export default {
"msg": "操作成功",
"code": 200,
"data": {
"站前悬臂式可变信息标志": {
"sucessRate": "100.00%",
"failRate": "0.00%",
"sumUseState": "2",
"sum": "10",
"lostRate": "0.00%"
},
"高清网络枪型固定摄像机": {
"sucessRate": "72.73%",
"failRate": "27.27%",
"sumUseState": "33",
"sum": "315",
"lostRate": "27.27%"
},
"智能设备箱": {
"sucessRate": "91.67%",
"failRate": "8.33%",
"sumUseState": "12",
"sum": "219",
"lostRate": "8.33%"
},
"智能行车诱导系统": {
"sucessRate": "25.00%",
"failRate": "75.00%",
"sumUseState": "4",
"sum": "21",
"lostRate": "75.00%"
},
"门架式可变信息标志": {
"sucessRate": "100.00%",
"failRate": "0.00%",
"sumUseState": "5",
"sum": "31",
"lostRate": "0.00%"
},
"护栏碰撞预警系统": {
"sucessRate": "100.00%",
"failRate": "0.00%",
"sumUseState": "1",
"sum": "18",
"lostRate": "0.00%"
},
"180°全景摄像机": {
"sucessRate": "50.00%",
"failRate": "50.00%",
"sumUseState": "2",
"sum": "10",
"lostRate": "50.00%"
},
"360°全景摄像机": {
"sucessRate": "100.00%",
"failRate": "0.00%",
"sumUseState": "2",
"sum": "15",
"lostRate": "0.00%"
},
"一类交通量调查站": {
"sucessRate": "100.00%",
"failRate": "0.00%",
"sumUseState": "1",
"sum": "8",
"lostRate": "0.00%"
},
"全部设备": {
"sucessRate": "73.83%",
"failRate": "26.17%",
"sumUseState": "107",
"sum": "1190",
"lostRate": "26.17%"
},
"路段语音广播系统": {
"sucessRate": "100.00%",
"failRate": "0.00%",
"sumUseState": "1",
"sum": "27",
"lostRate": "0.00%"
},
"激光疲劳唤醒": {
"sucessRate": "100.00%",
"failRate": "0.00%",
"sumUseState": "1",
"sum": "6",
"lostRate": "0.00%"
},
"高清网络球形摄像机": {
"sucessRate": "67.44%",
"failRate": "32.56%",
"sumUseState": "43",
"sum": "161",
"lostRate": "32.56%"
}
}
}

1
ruoyi-ui/src/views/JiHeExpressway/pages/service/board/index.vue

@ -1051,6 +1051,7 @@ export default {
}
}
.infoBoardBox {
width: 100%; height: 100%;
.infoBoardCon {
width: 100%;
height: 100%;

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

@ -2,7 +2,7 @@
<div class="public_service_statistic">
<el-tabs class="content_tab" v-model="activeName" @tab-click="changeTabs">
<el-tab-pane label="公众服务统计分析" name="first" class="first_tab">
<el-tab-pane label="公众服务统计分析" name="first" class="con_tab first_tab">
<TopComponent class="line_01"/>
<div class="line_02">
<ChannelAnalytics class="unit" />
@ -15,7 +15,7 @@
<NucleusThrough class="unit" />
</div>
</el-tab-pane>
<el-tab-pane label="公众服务统计查询" name="second"> </el-tab-pane>
<el-tab-pane label="公众服务统计查询" name="second" class="con_tab"> </el-tab-pane>
</el-tabs>
</div>
@ -90,8 +90,9 @@ export default {
::v-deep .el-tabs__content{ flex: 1;}
}
.con_tab{width: 100%; height: 100%;}
.first_tab{
width: 100%; height: 100%; display: flex; flex-direction: column;
display: flex; flex-direction: column;
.line_01 {
flex-basis: 140px; margin-bottom: 16px;
}

3
ruoyi-ui/vue.config.js

@ -56,7 +56,8 @@ module.exports = {
// target: `http://10.168.68.42:8087`, //王思祥
target: `http://10.168.65.194:8087`, //赵祥龙
// target: `http://10.168.65.156:8097`, //孟
// target: `http://10.168.76.181:8087`, //王家宝
target: `http://10.168.56.165:8087`, //王家宝
// target: `http://10.168.65.103:8097`,
changeOrigin: true,
pathRewrite: {

Loading…
Cancel
Save