Browse Source

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

wangqin
hui 1 year ago
parent
commit
cdc1235598
  1. 2
      ruoyi-ui/src/api/event/perceiveEvent.js
  2. 3
      ruoyi-ui/src/assets/styles/JiHeExpressway.scss
  3. 46
      ruoyi-ui/src/views/JiHeExpressway/common/PresetFormItems.js
  4. 192
      ruoyi-ui/src/views/JiHeExpressway/components/InputSearch/index copy.vue
  5. 192
      ruoyi-ui/src/views/JiHeExpressway/components/InputSearch/index.vue
  6. 23
      ruoyi-ui/src/views/JiHeExpressway/components/RoadStateCard/index.vue
  7. 6
      ruoyi-ui/src/views/JiHeExpressway/components/Video/index.vue
  8. 10
      ruoyi-ui/src/views/JiHeExpressway/mixins/InfoBoard.js
  9. 72
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/HomeFilter/index.vue
  10. 131
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/HomeFrame/index.vue
  11. 61
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/RoadAndEvents/utils/buttonEvent.js
  12. 45
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/RoadAndEvents/utils/map.js
  13. 2
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Thumbnail/index.vue
  14. 118
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/views/firstResponders/index.vue
  15. 12
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/views/jurisdictionalManagement/data.js
  16. 22
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/coordinateSchedulingRecords/data.js
  17. 5
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/coordinateSchedulingRecords/index.vue
  18. 6
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/event/EventDetailDialog/Carousel/index.vue
  19. 29
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/event/EventDetailDialog/index.vue
  20. 84
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/event/FormEvent/PresetFormItems.js
  21. 1887
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/event/FormEvent/data.js
  22. 58
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/event/FormEvent/index.vue
  23. 2
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/event/data.js
  24. 21
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/event/index.vue
  25. 5
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/governanceAnalysis/components/postTrendsDay/assets/charts.js
  26. 4
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/governanceAnalysis/components/postTrendsMonth/assets/charts2.js
  27. 1
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/governanceAnalysis/components/postTrendsMonth/assets/charts3.js
  28. 282
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/governanceAnalysis/components/postTrendsMonth/index.vue
  29. 6
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/dailyDisposal/assets/charts.js
  30. 9
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/dailyDisposal/index.vue
  31. 53
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/dayTotal/assets/charts.js
  32. 13
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/eventQuery/assets/charts.js
  33. 7
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/eventQuery/assets/charts3.js
  34. 2
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/eventQuery/index copy.vue
  35. 542
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/eventQuery/index.vue
  36. 8
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/eventSource/assets/charts.js
  37. 15
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/monthStatistics/assets/charts.js
  38. 212
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/railway/assets/charts.js
  39. 26
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/railwayDay/assets/charts.js
  40. 2
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/typeAnalysis/assets/charts.js
  41. 280
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/meteorologyCheck/components/weatherInfoQuery/components/TemperatureTrend/assets/charts.js
  42. 290
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/meteorologyCheck/components/weatherInfoQuery/components/visibilityTrends/assets/charts.js
  43. 187
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/trafficFlow/components/classification/index.vue
  44. 2
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/trafficFlow/components/flowstate/assets/charts.js
  45. 1
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/trafficFlow/components/situation/index.vue
  46. 79
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/trafficSituation/components/IndicatorAnalysis/components/trafficIndicators/assets/chartsRadar.js
  47. 5
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/trafficSituation/components/IndicatorAnalysis/components/trafficIndicators/index.vue
  48. 144
      ruoyi-ui/src/views/JiHeExpressway/pages/service/PublishingChannelManagement/components/AddNEditDialog.vue
  49. 6
      ruoyi-ui/src/views/JiHeExpressway/pages/service/PublishingChannelManagement/components/Card.vue
  50. 56
      ruoyi-ui/src/views/JiHeExpressway/pages/service/PublishingChannelManagement/data.js
  51. 54
      ruoyi-ui/src/views/JiHeExpressway/pages/service/PublishingChannelManagement/index.vue
  52. 4
      ruoyi-ui/src/views/websocket.vue

2
ruoyi-ui/src/api/event/perceiveEvent.js

@ -165,7 +165,7 @@ export function geTwarningTotal(query) {
export function getRoadSectionList(query) {
//system/status/tablist
return request({
url: '/business/roadSection/list',
url: '/business/roadSection/listAll',
method: 'get',
params: {
...query,

3
ruoyi-ui/src/assets/styles/JiHeExpressway.scss

@ -133,7 +133,8 @@
.el-radio__label{ color: #fff; }
&.is-checked{
.el-radio__label {
color: #3de8ff;
// color: #3de8ff;
color: #fff;
}
}
}

46
ruoyi-ui/src/views/JiHeExpressway/common/PresetFormItems.js

@ -41,6 +41,24 @@ export const source = {
},
};
export const releaseChannel = {
label: "发布渠道:",
key: "channel",
type: "CheckboxGroup",
isAlone: true,
default: [],
options: {
options: [
{ key: "1", label: "微博" },
{ key: "3", label: "微信小程序" },
{ key: "4", label: "服务网站" },
{ key: "5", label: "情报板" },
{ key: "6", label: "手机短信" },
{ key: "7", label: "微信公众号" },
],
},
};
export const illegalTriggeringType = {
label: "类型:",
key: "eventSubclass",
@ -100,7 +118,7 @@ export const station = {
};
export const startStation = {
label: "始桩号:",
label: "始桩号:",
key: "startStakeMark",
required: false,
type: "MultipleLabelItem",
@ -205,15 +223,30 @@ export const startEndStation = {
},
};
// export const direction = {
// label: "方向:",
// key: "direction",
// required: true,
// type: "select",
// options: {
// options: [
// // { key: "济南方向", label: "济南方向" },
// // { key: "菏泽方向", label: "菏泽方向" },
// ],
// },
// };
export const direction = {
label: "方向:",
label: "路段方向:",
key: "direction",
required: true,
type: "select",
type: "CheckboxGroup",
isAlone: true,
default: [],
options: {
options: [
// { key: "济南方向", label: "济南方向" },
// { key: "菏泽方向", label: "菏泽方向" },
{ key: "1", label: "济南方向" },
{ key: "3", label: "菏泽方向" },
{ key: "2", label: "双向" },
],
},
};
@ -290,6 +323,7 @@ export const eventLevel = {
},
};
export const laneOccupancy = {
label: "车道占用:",
key: "lang",

192
ruoyi-ui/src/views/JiHeExpressway/components/InputSearch/index copy.vue

@ -0,0 +1,192 @@
<template>
<div class="from-content" style="width: 100%">
<div class="InputSearch input" v-if="params && types == 'input'">
<ElInput
style="width: 100%"
v-model="value"
:placeholder="placeholder"
@change="handleSearch"
></ElInput>
<img src="./search.svg" @click="handleFormShow" />
</div>
<ElPopover
v-else
ref="PopoverRef"
placement="bottom"
popper-class="global-input-search-popover"
:popperOptions="popperOptions"
:visibleArrow="false"
:width="this.width"
trigger="click"
@show="handleShow"
style="width: 100%"
>
<div class="InputSearch" slot="reference" ref="ReferenceInputRef">
<span>{{ placeholder }}</span>
<img src="./search.svg" @click="handleFormShow" />
</div>
<div style="width: 100%; max-height: 360px">
<slot>
<Form
v-if="formList && formList.length"
class="form"
ref="FormConfigRef"
:formList="formList"
v-bind="getFormConfigOptions"
/>
<!-- <ElEmpty v-else description="暂无搜索内容"></ElEmpty> -->
<div v-else class="no-data">暂无数据</div>
</slot>
<div class="footer">
<Button
style="background-color: rgba(0, 179, 204, 0.3)"
@click.native="handleResetForm"
>
重置
</Button>
<Button @click.native="handleSearch"> 搜索 </Button>
</div>
</div>
</ElPopover>
</div>
</template>
<script>
import Button from "@screen/components/Buttons/Button.vue";
import Form from "@screen/components/FormConfig";
import { cloneDeep } from "lodash";
export default {
name: "InputSearch",
components: {
Button,
Form,
},
props: {
type: {
type: String,
default: "form",
},
placeholder: {
type: String,
default: "请点击右侧图标筛选",
},
valueData: {
type: String,
},
params: {
type: String,
},
queryParams: {
type: Array,
},
formConfigOptions: {
type: Object,
default: null,
},
formList: {
type: Array,
default: () => [],
},
},
data() {
return {
types: this.type,
value: this.valueData,
width: null,
popperOptions: {
popHideCallBack: () => {
// console.log("---")
},
},
};
},
emit: ["handleSearch"],
computed: {
getFormConfigOptions() {
return {
column: "1",
labelWidth: "120px",
...this.formConfigOptions,
};
},
},
methods: {
handleFormShow() {
console.log(this.params, this.types);
if (this.params) {
if (this.types == "form") {
this.types = "input";
} else {
this.types = "form";
}
} else {
this.types = "form";
}
console.log(this.params, this.types);
},
handleShow() {
if (this.width) return;
this.width = this.$refs.ReferenceInputRef.getBoundingClientRect().width;
},
handleResetForm() {
this.$refs.FormConfigRef?.reset();
this.$refs.PopoverRef.doClose();
this.$emit("handleSearch", cloneDeep(this.$refs.FormConfigRef?.formData));
},
handleSearch() {
if (this.types == "form") {
this.$refs.FormConfigRef.validate()
.then((result) => {
this.$refs.PopoverRef.doClose();
this.$emit("handleSearch", result);
})
.catch((err) => {
console.log("catch");
});
} else {
let params = {};
params[this.params] = this.value;
this.$emit("handleSearch", params);
}
},
},
};
</script>
<style lang="scss" scoped>
.InputSearch {
width: 100%;
height: 26px;
background: linear-gradient(180deg, #005c79 0%, #009bcc 100%) !important;
color: #fff;
border-radius: 2px;
display: flex;
align-items: center;
justify-content: space-between;
padding: 3px 15px;
padding-right: 9px;
cursor: pointer;
font-size: 12px;
font-family: PingFang SC, PingFang SC;
font-weight: 400;
color: #ffffff;
line-height: 14px;
}
.input ::v-deep .el-input__inner {
background: none;
height: auto !important;
font-size: 12px;
padding: 0px 0;
line-height: 14px;
}
::v-deep .el-input__inner::placeholder {
font-size: 12px;
}
</style>

192
ruoyi-ui/src/views/JiHeExpressway/components/InputSearch/index.vue

@ -1,109 +1,179 @@
<template>
<ElPopover ref="PopoverRef" placement="bottom" popper-class="global-input-search-popover" :popperOptions="popperOptions"
:visibleArrow="false" :width="this.width" trigger="click" @show="handleShow">
<div class='InputSearch' slot="reference" ref="ReferenceInputRef">
<span>{{ placeholder }}</span>
<img src="./search.svg">
</div>
<div class="from-content" style="width: 100%">
<ElPopover
ref="PopoverRef"
placement="bottom"
popper-class="global-input-search-popover"
:popperOptions="popperOptions"
:width="this.width"
trigger="manual"
v-model="visible"
@show="handleShow"
style="width: 100%"
>
<div
class="InputSearch input"
v-if="params && types == 'input'"
slot="reference"
ref="ReferenceInputRef"
>
<ElInput
style="width: 100%"
v-model="value"
:placeholder="placeholder"
@change="handleSearch"
></ElInput>
<img src="./search.svg" @click="visible = !visible" />
</div>
<div
class="InputSearch"
v-else
slot="reference"
ref="ReferenceInputRef"
@click="visible = !visible"
>
<span>{{ placeholder }}</span>
<img src="./search.svg" />
</div>
<div style="width: 100%;max-height: 360px;">
<slot>
<Form v-if="formList && formList.length" class="form" ref="FormConfigRef" :formList="formList"
v-bind="getFormConfigOptions" />
<!-- <ElEmpty v-else description="暂无搜索内容"></ElEmpty> -->
<div v-else class="no-data">暂无数据</div>
</slot>
<div style="width: 100%; max-height: 360px" v-show="visible">
<slot>
<Form
v-if="formList && formList.length"
class="form"
ref="FormConfigRef"
:formList="formList"
v-bind="getFormConfigOptions"
/>
<!-- <ElEmpty v-else description="暂无搜索内容"></ElEmpty> -->
<div v-else class="no-data">暂无数据</div>
</slot>
<div class="footer">
<Button style="background-color: rgba(0, 179, 204, .3);" @click.native="handleResetForm">
重置
</Button>
<Button @click.native="handleSearch">
搜索
</Button>
<div class="footer">
<Button
style="background-color: rgba(0, 179, 204, 0.3)"
@click.native="handleResetForm"
>
重置
</Button>
<Button @click.native="handleSearch"> 搜索 </Button>
</div>
</div>
</div>
</ElPopover>
</ElPopover>
</div>
</template>
<script>
import Button from '@screen/components/Buttons/Button.vue';
import Form from '@screen/components/FormConfig';
import { cloneDeep } from "lodash"
import Button from "@screen/components/Buttons/Button.vue";
import Form from "@screen/components/FormConfig";
import { cloneDeep } from "lodash";
export default {
name: 'InputSearch',
name: "InputSearch",
components: {
Button,
Form
Form,
},
props: {
type: {
type: String,
default: "form",
},
placeholder: {
type: String,
default: "请点击右侧图标筛选"
default: "请点击右侧图标筛选",
},
valueData: {
type: String,
},
params: {
type: String,
},
queryParams: {
type: Array,
},
formConfigOptions: {
type: Object,
default: null
default: null,
},
formList: {
type: Array,
default: () => []
default: () => [],
},
},
data() {
return {
visible: false,
types: this.type,
value: "",
width: null,
popperOptions: {
popHideCallBack: () => {
// console.log("---")
}
}
}
},
},
};
},
emit: [
"handleSearch"
],
emit: ["handleSearch"],
computed: {
getFormConfigOptions() {
return {
column: "1",
labelWidth: "120px",
...this.formConfigOptions
}
}
...this.formConfigOptions,
};
},
},
methods: {
handleShow() {
if (this.width) return;
this.width = this.$refs.ReferenceInputRef.getBoundingClientRect().width
this.width = this.$refs.ReferenceInputRef.getBoundingClientRect().width;
},
handleResetForm() {
this.$refs.FormConfigRef?.reset();
this.$refs.PopoverRef.doClose();
this.$emit('handleSearch', cloneDeep(this.$refs.FormConfigRef?.formData));
this.$emit("handleSearch", cloneDeep(this.$refs.FormConfigRef?.formData));
},
handleSearch() {
this.$refs.FormConfigRef.validate()
.then((result) => {
this.$refs.PopoverRef.doClose();
this.$emit('handleSearch', result);
})
.catch((err) => {
console.log("catch")
});
}
}
}
async handleSearch() {
if (this.types === "input") {
let params = {};
params[this.params] = this.value;
let result = {};
await this.$refs.FormConfigRef.validate()
.then((res) => {
result = res;
this.$refs.PopoverRef.doClose();
})
.catch((err) => {
console.log("catch");
});
let resultParams = { ...result, ...params };
this.$emit("handleSearch", resultParams);
} else {
this.$refs.FormConfigRef.validate()
.then((result) => {
this.$refs.PopoverRef.doClose();
this.$emit("handleSearch", result);
})
.catch((err) => {
console.log("catch");
});
}
},
},
};
</script>
<style lang='scss' scoped>
<style lang="scss" scoped>
.InputSearch {
width: 100%;
height: 26px;
background: linear-gradient(180deg, #005C79 0%, #009BCC 100%) !important;
background: linear-gradient(180deg, #005c79 0%, #009bcc 100%) !important;
color: #fff;
border-radius: 2px;
display: flex;
@ -116,7 +186,17 @@ export default {
font-size: 12px;
font-family: PingFang SC, PingFang SC;
font-weight: 400;
color: #FFFFFF;
color: #ffffff;
line-height: 14px;
}
.input ::v-deep .el-input__inner {
background: none;
height: auto !important;
font-size: 12px;
padding: 0px 0;
line-height: 14px;
}
::v-deep .el-input__inner::placeholder {
font-size: 12px;
}
</style>

23
ruoyi-ui/src/views/JiHeExpressway/components/RoadStateCard/index.vue

@ -2,7 +2,7 @@
<BorderRadiusImage class='RoadStateCard' borderRadius="2px"
borderColor="linear-gradient(360deg, rgba(55, 231, 255, 0.3), rgba(55, 231, 255, 0))" borderWidth="2px">
<div class="left">
<img :src="(cardData.pictures ? cardData.pictures[0] : null) || require(`./test.png` )">
<img :src="(cardData.pictures ? cardData.pictures[0] : null) || require(`./test.png`)">
<!-- <img :src="require(`./test.png`)"> -->
</div>
<div class="right">
@ -15,10 +15,10 @@
<div class="controls">
<Button :style="{ background: firstBtnColor, width: '50%' }"
@click.native="$emit('firstBtnClick', cardData.id)">{{
firstBtnText
getFirstBtnText(cardData.state)
}}</Button>
<Button v-if="cardData.state != 3" :style="{ background: lastBtnColor, width: '50%' }"
@click.native="$emit('lastBtnClick', cardData.id)">{{ lastBtnText
<Button v-if="cardData.state == 4" :style="{ background: lastBtnColor, width: '50%' }"
@click.native="$emit('lastBtnClick', cardData.id)">{{ getLastBtnText(cardData.state)
}}</Button>
</div>
</div>
@ -82,7 +82,7 @@ export default {
])
}
},
data(){
data() {
return {
picUrl: './test.png'
}
@ -94,6 +94,19 @@ export default {
},
created() {
this.statusMap = statusMap;
},
methods: {
getFirstBtnText(state) {
let text = '详情';
if(state == 5) text = '去确认'
if(state == 4) text = '详情'
if(state == 3) text = '处置记录'
return text;
},
getLastBtnText(state) {
let text = '去处置';
return text;
},
}
}
</script>

6
ruoyi-ui/src/views/JiHeExpressway/components/Video/index.vue

@ -1,6 +1,6 @@
<template>
<div class="video-container">
<div class="header">
<div class="header" v-if="showHeader">
<div class="left">
<div class="radio">
<span @click="active = 'img'" :class="{ active: active === 'img' }">图像</span>
@ -46,6 +46,10 @@ export default {
rangeIndex: {
type: Number,
default: 0
},
showHeader: {
type: Boolean,
default: true
}
},
data() {

10
ruoyi-ui/src/views/JiHeExpressway/mixins/InfoBoard.js

@ -37,7 +37,7 @@ export default{
displayAreaWidth: +arr[0],
displayAreaHeight: +arr[1]
}
this.editDialog = {
visible: showDialog == false ? false : true,
mode: "toDevice",
@ -80,16 +80,16 @@ export default{
let data = { content: content, deviceId: this.selectedDevice.iotDeviceId }
if (IS_TESTING) {
this.saveLog(content);
// this.saveLog(content);
this.____getDeviceInfo();
loading.close()
} else {
publishToBoard(data).then(res => {
this.saveLog(content);
// this.saveLog(content);
this.____getDeviceInfo();
}).catch(err=>{
}).finally(()=>{
loading.close()
});
@ -138,4 +138,4 @@ export default{
})
}
}
}
}

72
ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/HomeFilter/index.vue

@ -28,7 +28,7 @@
<script>
import Button from '@screen/components/Buttons/Button.vue';
import Form from '@screen/components/FormConfig';
import * as PresetFormItems from "@screen/pages/control/event/event/FormEvent/PresetFormItems.js";
import * as PresetFormItems from "@screen/common/PresetFormItems.js";
import { merge, cloneDeep } from "lodash"
import request from "@/utils/request";
@ -42,74 +42,8 @@ export default {
return {
activeIcon: null,
formList: [
merge(cloneDeep(PresetFormItems.station), {
required: false,
label: "起始桩号:",
options: {
options: [
{
rules: [
{
message: "请补全桩号",
callback(value, data) {
if (!value?.trim() && data.startStakeMark[1]?.trim())
return false;
else return true;
},
},
],
key: "startStakeMark[0]",
},
{
rules: [
{
message: "请补全桩号",
callback(value, data) {
if (!value?.trim() && data.startStakeMark[0]?.trim())
return false;
else return true;
},
},
],
key: "startStakeMark[1]",
},
],
},
}),
merge(cloneDeep(PresetFormItems.station), {
required: false,
label: "结束桩号:",
options: {
options: [
{
rules: [
{
message: "请补全桩号",
callback(value, data) {
if (!value?.trim() && data.endStakeMark[1]?.trim())
return false;
else return true;
},
},
],
key: "endStakeMark[0]",
},
{
rules: [
{
message: "请补全桩号",
callback(value, data) {
if (!value?.trim() && data.endStakeMark[0]?.trim())
return false;
else return true;
},
},
],
key: "endStakeMark[1]",
},
],
},
}),
PresetFormItems.startStation,
PresetFormItems.endStation,
{
label: "设备类型:",
key: "deviceType",

131
ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/HomeFrame/index.vue

@ -1,22 +1,22 @@
<template>
<div class='HomeFrame'>
<ElPopover trigger="manual" :value="activeIcon === 'Frame'" :visibleArrow="false" placement="left"
popper-class="global-input-search-popover">
<Button :class="['btn', { 'btn-active': activeIcon }]" slot="reference" @click.native="handleClick('Frame')">
<img src="@screen/images/home-Frame/Frame.svg">
</Button>
<div class='HomeFrame'>
<ElPopover trigger="manual" :value="activeIcon === 'Frame'" :visibleArrow="false" placement="left"
popper-class="global-input-search-popover">
<Button :class="['btn', { 'btn-active': activeIcon }]" slot="reference" @click.native="handleClick('Frame')">
<img src="@screen/images/home-Frame/Frame.svg">
</Button>
<div class="body">
<div class="title">
图标含义
</div>
<!-- <Form labelWidth="90px" column="1" class="form" ref="FormConfigRef" :formList="formList" /> -->
<img class="image" src="@screen/images/home-Frame/logoMean.jpg">
<div class="footer">
</div>
</div>
</ElPopover>
</div>
<div class="body">
<div class="title">
图标含义
</div>
<!-- <Form labelWidth="90px" column="1" class="form" ref="FormConfigRef" :formList="formList" /> -->
<img class="image" src="@screen/images/home-Frame/logoMean.jpg">
<!-- <div class="footer">
</div> -->
</div>
</ElPopover>
</div>
</template>
<script>
@ -26,69 +26,70 @@ import * as PresetFormItems from "@screen/pages/control/event/event/FormEvent/Pr
import { merge, cloneDeep } from "lodash"
export default {
name: 'HomeFrame',
components: {
Button,
Form
},
data() {
return {
activeIcon: null
}
},
methods: {
handleClick(type) {
this.activeIcon = this.activeIcon === type ? null : type;
},
filterEnd(data) {
this.activeIcon = null;
// this.filterData = data;
this.$parent.$refs.RoadAndEventsRef?.setFilterData?.(data);
},
}
name: 'HomeFrame',
components: {
Button,
Form
},
data() {
return {
activeIcon: null
}
},
methods: {
handleClick(type) {
this.activeIcon = this.activeIcon === type ? null : type;
},
filterEnd(data) {
this.activeIcon = null;
// this.filterData = data;
this.$parent.$refs.RoadAndEventsRef?.setFilterData?.(data);
},
}
}
</script>
<style lang='scss'>
div.el-popper.global-input-search-popover {
background: rgba(6, 66, 88, 0.8);
border: 1px solid rgba(42, 217, 253, 0.6);
position: relative;
padding-top: 36px;
transform: translateY(24px);
background: rgba(6, 66, 88, 0.8);
border: 1px solid rgba(42, 217, 253, 0.6);
position: relative;
padding-top: 36px;
transform: translateY(24px);
margin-top: 3vh;
.body {
.title {
background: linear-gradient(90deg, #237E9B 0%, rgba(23, 145, 184, 0) 100%);
padding: 3px 9px;
position: absolute;
top: 0;
left: 0;
width: 100%;
.body {
.title {
background: linear-gradient(90deg, #237E9B 0%, rgba(23, 145, 184, 0) 100%);
padding: 3px 9px;
position: absolute;
top: 0;
left: 0;
width: 100%;
}
}
}
}
}
</style>
<style lang='scss' scoped>
.image {
width: 1440px;
height: 900px;
width: 45vw;
height: 65vh;
}
.HomeFrame {
.btn {
padding: 9px;
background: linear-gradient(180deg, #152E3C 0%, #163A45 100%);
border-radius: 4px;
overflow: hidden;
height: unset;
border: 1px solid rgba(40, 144, 167, 1);
}
.btn {
padding: 9px;
background: linear-gradient(180deg, #152E3C 0%, #163A45 100%);
border-radius: 4px;
overflow: hidden;
height: unset;
border: 1px solid rgba(40, 144, 167, 1);
}
.btn-active {
background: linear-gradient(180deg, #005C79 0%, #009BCC 100%);
}
.btn-active {
background: linear-gradient(180deg, #005C79 0%, #009BCC 100%);
}
}
</style>

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

@ -7,8 +7,10 @@ import { delay } from "@screen/utils/common";
import { Message } from "element-ui";
import { EventTopics } from "@screen/utils/enum.js";
import { debounce } from "lodash";
import Vue from "vue";
import { markerClusterIns } from "./map";
const canvasCtx = Vue.prototype.canvasCtx;
const cameraIcon = {
// 球机
@ -75,6 +77,7 @@ export const DeviceForMap = {
},
};
export const lngLatMap = {}; //优化 缩略图 + 地图 复用lngLatmap
export function getHandleDeviceType(item) {
if (DeviceForMap[item.title]) return "地图路测设备/map";
if (EventTopics[item.title]) return "地图事件专题/map";
@ -153,11 +156,13 @@ export const eventMap = {
"font-size:15px; background:#83c806; color:#c7ff4a;",
removeData
);
addDataPreHandle(removeData);
markerClusterIns.addData(removeData);
cacheRemoveFunc[`地图路测设备/${item.title}`] = () =>
cacheRemoveFunc[`地图路测设备/${item.title}`] = () => {
removeDataPreHandle(removeData);
markerClusterIns.removeData(removeData);
};
},
"地图路测设备/map_close"(item) {
cacheRemoveFunc[`地图路测设备/${item.title}`]?.();
@ -204,11 +209,13 @@ export const eventMap = {
isDefault
)
);
addDataPreHandle(removeData);
markerClusterIns.addData(removeData);
cacheRemoveFunc[`地图事件专题/${item.title}`] = () =>
cacheRemoveFunc[`地图事件专题/${item.title}`] = () => {
removeDataPreHandle(removeData);
markerClusterIns.removeData(removeData);
};
},
"地图事件专题/map_close"(item) {
cacheRemoveFunc[`地图事件专题/${item.title}`]?.();
@ -249,15 +256,57 @@ export const eventMap = {
let removeData = data.map((item) =>
resolveDataOptions.call(this, item, options, "PerceiveEvent", isDefault)
);
addDataPreHandle(removeData);
markerClusterIns.addData(removeData);
loadingMessage?.close();
cacheRemoveFunc[`事件专题/${item.title}`] = () =>
cacheRemoveFunc[`事件专题/${item.title}`] = () => {
removeDataPreHandle(removeData);
markerClusterIns.removeData(removeData);
};
},
"事件专题/感知事件_close"(item) {
cacheRemoveFunc[`事件专题/${item.title}`]?.();
},
};
function lngLatMapHandle(markers, cb) {
markers.forEach((markerData) => {
const lnglat = markerData.lnglat;
if (lnglat) {
const getLatAndLng = () => {
if (Array.isArray(lnglat)) return { lng: lnglat[0], lat: lnglat[1] };
else return lnglat;
};
const { lat, lng } = getLatAndLng();
const lngLatStr = `${lng}/${lat}`;
cb(lngLatStr, markerData);
}
});
}
function addDataPreHandle(markers) {
const cb = (lngLatStr, markerData) => {
if (lngLatMap[lngLatStr])
!lngLatMap[lngLatStr].includes(markerData) &&
lngLatMap[lngLatStr].push(markerData);
else lngLatMap[lngLatStr] = [markerData];
};
lngLatMapHandle(markers, cb);
}
function removeDataPreHandle(markers) {
const cb = (lngLatStr, markerData) => {
if (lngLatMap[lngLatStr]) {
if (lngLatMap[lngLatStr].length < 2) delete lngLatMap[lngLatStr];
else {
const findIndex = lngLatMap[lngLatStr].findIndex(
(removeData) => removeData === markerData
);
lngLatMap[lngLatStr].splice(findIndex, 1);
}
}
};
lngLatMapHandle(markers, cb);
}

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

@ -1,6 +1,7 @@
import { loadAMap } from "@screen/pages/Home/components/AMapContainer/loadAMap.js";
// import { Message } from "element-ui";
import Vue from "vue";
import { lngLatMap } from "./buttonEvent";
/**
* @typedef {Object} Point
* @property {number} weight - The weight of the item.
@ -32,8 +33,6 @@ export class MarkerCluster {
markerCluster;
infoWindow;
lngLatMap = {};
data = [];
constructor() {}
@ -74,11 +73,17 @@ export class MarkerCluster {
map.setZoom(10);
setTimeout(() => {
map.setFitView([...this.markerCluster.U], false, [0, 0, 0, 0], 10);
map.setFitView([...this.markerCluster.U], false, [0, 0, 0, 0], 10); //自适应. 覆盖物数组, 动画过渡到指定位置, 周围边距,上、下、左、右, 最大 zoom 级别
}, 150);
}
getState({ config, extData }) {
getState(data) {
if (Array.isArray(data)) {
return data.every((item) => this.getStateSingle(item));
} else return this.getStateSingle(data);
}
getStateSingle({ config, extData }) {
return typeof config.stateCallback === "function"
? config.stateCallback?.()
: extData.deviceState == 1;
@ -107,11 +112,11 @@ export class MarkerCluster {
getContent(data) {
const faultBg = require(`@screen/images/mapBg/fault.svg`);
const normalBg = require(`@screen/images/mapBg/active.svg`);
const nowBg = this.getState(data) ? normalBg : faultBg;
if (data.length === 1) {
return `
<div style="
background-image: url(${this.getState(data[0]) ? normalBg : faultBg});
background-image: url(${nowBg});
background-size: 100% 100%;
background-repeat: no-repeat;
width: 51px;
@ -134,7 +139,7 @@ export class MarkerCluster {
return `
<div style="
background-image: url(${normalBg});
background-image: url(${nowBg});
background-size: 100% 100%;
background-repeat: no-repeat;
width: ${width};
@ -268,19 +273,14 @@ export class MarkerCluster {
context.marker.setContent(div);
},
renderMarker: (context) => {
const markerData = context.data[0];
const {
extData,
lnglat: { lat, lng },
} = context.data[0];
} = markerData;
const lngLatStr = `${lng}/${lat}`;
if (this.lngLatMap[lngLatStr])
!this.lngLatMap[lngLatStr].includes(context.data[0]) &&
this.lngLatMap[lngLatStr].push(context.data[0]);
else this.lngLatMap[lngLatStr] = [context.data[0]];
context.marker.setContent(this.getContent(this.lngLatMap[lngLatStr]));
context.marker.setContent(this.getContent(lngLatMap[lngLatStr]));
context.marker.setAnchor("bottom-center");
@ -292,7 +292,7 @@ export class MarkerCluster {
context.marker.on("click", (e) => {
hasClick = true;
const data = this.lngLatMap[lngLatStr];
const data = lngLatMap[lngLatStr];
if (data.length > 1) {
this.showInfoWindow(data);
return;
@ -325,19 +325,6 @@ export class MarkerCluster {
(removeData) => removeData === item
);
const lngLatStr = `${item.lnglat.lng}/${item.lnglat.lat}`;
if (this.lngLatMap[lngLatStr]) {
if (this.lngLatMap[lngLatStr].length < 2)
delete this.lngLatMap[lngLatStr];
else {
const findIndex = this.lngLatMap[lngLatStr].findIndex(
(removeData) => removeData === item
);
this.lngLatMap[lngLatStr].splice(findIndex, 1);
}
}
if (findIndex > -1) this.data.splice(findIndex, 1);
});

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

@ -5,6 +5,7 @@
<script>
import { getScaleByActualData } from "./utils"
import { onceObserver } from "@screen/utils/resizeObserver";
import Vue from "vue";
function setFont(size, bold = "normal", family = "微软雅黑") {
return `${bold} ${size}px ${family}`;
@ -41,6 +42,7 @@ export default {
content.appendChild(canvas);
const ctx = canvas.getContext("2d");
Vue.prototype.canvasCtx = ctx;
ctx.textAlign = "center";
ctx.textBaseline = "middle";
var imgbg = await this.loadImage(require("./images/bg.png"));

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

@ -1,5 +1,5 @@
<template>
<div class='FirstResponders'>
<div class="FirstResponders">
<div class="filter">
<div>
<ButtonGradient @click.native="handleOpenDialogAddEdit()">
@ -22,15 +22,31 @@
</ButtonGradient>
</div>
<InputSearch style="width: 402px;" :formList="searchFormList" :formConfigOptions="{ labelWidth: '72px' }"
@handleSearch="handleSearch" />
<InputSearch
style="width: 402px"
:formList="searchFormList"
:formConfigOptions="{ labelWidth: '72px' }"
placeholder="请输入姓名、电话,回车搜索"
type="input"
:params="params"
@handleSearch="handleSearch"
/>
</div>
<div class='body'>
<ElEmpty v-if="!data.length && !isFirst" description="暂无数据" style="width: 100%;height: 100%;position: absolute;" />
<div class="body">
<ElEmpty
v-if="!data.length && !isFirst"
description="暂无数据"
style="width: 100%; height: 100%; position: absolute"
/>
<template v-else>
<PeopleCard v-for="(item, index) in data" :cardData="item" :key="index"
@edit="data => handleOpenDialogAddEdit(data)" @delete="handleDelete" />
<PeopleCard
v-for="(item, index) in data"
:cardData="item"
:key="index"
@edit="(data) => handleOpenDialogAddEdit(data)"
@delete="handleDelete"
/>
</template>
</div>
@ -40,27 +56,28 @@
<script>
import PeopleCard from "./../../components/PeopleCard/index.vue";
import InputSearch from '@screen/components/InputSearch/index.vue';
import ButtonGradient from '@screen/components/Buttons/ButtonGradient.vue';
import AddNEditDialog from "./components/AddNEditDialog.vue"
import InputSearch from "@screen/components/InputSearch/index.vue";
import ButtonGradient from "@screen/components/Buttons/ButtonGradient.vue";
import AddNEditDialog from "./components/AddNEditDialog.vue";
import { Message } from "element-ui";
import { searchFormList } from "./data";
import request from "@/utils/request";
import { setLoading } from "@screen/utils/index.js"
import { setLoading } from "@screen/utils/index.js";
import { delay, exportFile, confirm } from "@screen/utils/common";
import { getSelectOptionsStation } from "@screen/pages/control/event/businessDataManagement/utils.js";
import { values } from "lodash";
//
export default {
name: 'FirstResponders',
name: "FirstResponders",
components: {
PeopleCard,
ButtonGradient,
InputSearch,
AddNEditDialog
AddNEditDialog,
},
inject: ['getPagination', 'setTotal', 'setCurrentPage'],
inject: ["getPagination", "setTotal", "setCurrentPage"],
data() {
return {
searchFormList,
@ -68,7 +85,10 @@ export default {
addNEditDialogVisible: false,
dialogData: null,
isFirst: true,
}
valueData: "",
params: "value",
queryParams: ["phone", "name"],
};
},
created() {
this.getData();
@ -81,11 +101,11 @@ export default {
request({
url: `/business/employees/${data.id}`,
method: "DELETE",
data: {}
data: {},
})
.then((result) => {
if (result.code != 200) return Message.error(`删除失败!`);
this.setCurrentPage(1)
this.setCurrentPage(1);
Message.success(`删除成功!`);
})
.catch((err) => {
@ -102,24 +122,28 @@ export default {
request({
url: `/business/employees/sysPost`,
method: "post",
data: {}
data: {},
}),
//
getSelectOptionsStation()
])
.then(([post, organization]) => {
if (post.status === 'fulfilled' && post.value.code == 200) {
this.searchFormList[0].options.options = post.value.data.map(item => ({
getSelectOptionsStation(),
]).then(([post, organization]) => {
if (post.status === "fulfilled" && post.value.code == 200) {
this.searchFormList[0].options.options = post.value.data.map(
(item) => ({
key: item.postId,
label: item.postName,
}))
}
})
);
}
if (organization.status === 'fulfilled' && Array.isArray(organization.value)) {
this.searchFormList[1].options.options = organization.value;
}
})
if (
organization.status === "fulfilled" &&
Array.isArray(organization.value)
) {
this.searchFormList[1].options.options = organization.value;
}
});
},
handleExport() {
exportFile({
@ -127,11 +151,12 @@ export default {
filename: "应急人员",
data: {
...this.searchData,
...this.getPagination()
}
...this.getPagination(),
},
});
},
handleSearch(data) {
console.log(88888, data);
this.searchData = data;
this.getData();
},
@ -145,26 +170,27 @@ export default {
method: "get",
params: {
...this.searchData,
...this.getPagination()
}
}).then(result => {
if (result.code != 200) return;
...this.getPagination(),
},
})
.then((result) => {
if (result.code != 200) return;
this.data = result.rows;
this.data = result.rows;
this.setTotal(result.total)
}).finally(() => {
this.isFirst = false;
closeLoading();
})
}
}
}
this.setTotal(result.total);
})
.finally(() => {
this.isFirst = false;
closeLoading();
});
},
},
};
</script>
<style lang='scss' scoped>
<style lang="scss" scoped>
.FirstResponders {
.body {
display: grid;
grid-template-columns: repeat(10, 1fr);

12
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/views/jurisdictionalManagement/data.js

@ -1,15 +1,9 @@
import { cloneDeep, merge } from "lodash";
import * as PresetFormItems from "@screen/pages/control/event/event/FormEvent/PresetFormItems.js";
import * as PresetFormItems from "@screen/common/PresetFormItems.js";
export const searchFormList = [
{
label: "开始桩号:",
key: "startStakeMark",
},
{
label: "结束桩号:",
key: "endStakeMark",
},
PresetFormItems.startStation,
PresetFormItems.endStation
];
export const addEditFormList = [

22
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/coordinateSchedulingRecords/data.js

@ -0,0 +1,22 @@
import * as PresetFormItems from "@screen/common/PresetFormItems.js";
import { merge, cloneDeep } from "lodash";
export const searchFormList = [
PresetFormItems.eventType,
PresetFormItems.direction,
{
label: "时间范围:",
key: "daterange",
required: false,
type: "datePicker",
options: {
type: "daterange",
format: "yyyy-MM-dd HH:mm:ss",
valueFormat: "yyyy-MM-dd HH:mm:ss",
},
},
PresetFormItems.startStation,
PresetFormItems.endStation
];

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

@ -9,7 +9,7 @@
刷新
</ButtonGradient>
<InputSearch style="width: 402px;" />
<InputSearch style="width: 402px;" :formConfigOptions="{ labelWidth: '82px' }" :formList="searchFormList" @handleSearch="handleSearch" />
</div>
<!-- 内容 -->
@ -30,6 +30,8 @@ import InputSearch from '@screen/components/InputSearch/index.vue';
import Card from './components/Card/index.vue';
import ButtonGradient from '@screen/components/Buttons/ButtonGradient.vue';
import { searchFormList } from "./data";
export default {
name: 'CoordinateSchedulingRecords',
components: {
@ -40,6 +42,7 @@ export default {
},
data() {
return {
searchFormList,
eventDetailDialogVisible: false
}
},

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

@ -2,7 +2,7 @@
<div class="Carousel">
<img src="./images/arrow.svg" @click="prevSlide" class="arrow" />
<VueSlickCarousel v-bind="settings" ref="CarouselRef" class="vueSlickCarousel">
<VueSlickCarousel v-if="pictures.length > 0" v-bind="settings" ref="CarouselRef" class="vueSlickCarousel">
<div v-for="(item, index) in pictures" :key="index" class="item">
<!-- <img :src="require(`@screen/images/${item}`)" style="height: 100%"> -->
<!-- <img :src="item" style="height: 100%"> -->
@ -29,8 +29,8 @@ export default {
pictures: {
type: Array,
default: () => [
"https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg",
"https://cube.elemecdn.com/6/94/4d3ea53c084bad6931a56d5158a48jpeg.jpeg",
// "https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg",
// "https://cube.elemecdn.com/6/94/4d3ea53c084bad6931a56d5158a48jpeg.jpeg",
// "require('@screen/images/shareWith/message-active.svg')",
// "require('@screen/images/shareWith/message.svg')",
// "require('@screen/images/shareWith/website-active.svg')",

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

@ -1,21 +1,23 @@
<template>
<Dialog v-model="modelVisible" title="事件详情">
<div class="EventDetail">
<div class="EventDetail" :style="{ height: (activeName == '-1' || activeName == '0') ? '380px' : '768px'}">
<Form :formList="formList" :dFormData="formData" label-width="100px" />
<div class="video-pic">
<Video style="height: 100%;" />
<Video style="height: 100%;" :showHeader="activeName != '-1'"/>
<Video v-if="activeName != '-1'" style="height: 100%;" />
<Carousel style="flex: 1" :pictures="formData.pictures"/>
<Carousel v-else style="flex: 1" :pictures="formData.pictures"/>
</div>
<TimeLine1 :data="timeLine1List" />
<TimeLine2 :data="timeLine2List" style="flex: 1;" />
<TimeLine1 v-if="activeName == '1' || activeName == '2'" :data="timeLine1List" />
<TimeLine2 v-if="activeName == '1' || activeName == '2'" :data="timeLine2List" style="flex: 1;" />
</div>
<template #footer>
<Button style="padding: 0 24px;" @click.native="modelVisible = false">确认</Button>
<Button :style="{ backgroundColor: '#C9C9C9', padding: '0 24px' }" @click.native="modelVisible = false"> 取消</Button>
<Button v-if="activeName == '-1' || activeName == '0'" style="padding: 0 24px;" @click.native="modelVisible = false">误报</Button>
<Button :style="{ backgroundColor: '#C9C9C9', padding: '0 24px' }" @click.native="modelVisible = false">取消</Button>
<Button v-if="activeName == '-1' || activeName == '0'" style="padding: 0 24px;" @click.native="modelVisible = false">确认</Button>
</template>
</Dialog>
</template>
@ -50,6 +52,7 @@ export default {
},
props: {
visible: Boolean,
activeName: String,
formData: {
type: Object,
default: () => { }
@ -89,6 +92,11 @@ export default {
},
methods: {
getProcess() {
if(this.activeName == '-1' || this.activeName == '0'){
this.timeLine1List = [];
this.timeLine2List = [];
return;
}
let directionFlg = true;
@ -146,13 +154,14 @@ export default {
display: flex;
gap: 9px;
width: 836px;
height: 768px;
// height: 768px;
flex-direction: column;
.video-pic {
display: flex;
height: 150px;
gap: 15px
height: 190px;
gap: 15px;
justify-content: space-around;
}
}
</style>

84
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/event/FormEvent/PresetFormItems.js

@ -1,5 +1,6 @@
import request from '@/utils/request'
import { Message } from "element-ui";
import moment from "moment";
export const source = {
label: "来源:",
@ -7,6 +8,7 @@ export const source = {
type: "RadioGroup",
isAlone: true,
required: true,
default: '1',
options: {
activeColor: "linear-gradient(180deg, #37E7FF 0%, #009BCC 100%)",
options: [
@ -48,6 +50,7 @@ export const illegalTriggeringType = {
type: "RadioGroup",
isAlone: true,
required: true,
default: '5-1',
options: {
activeColor: "linear-gradient(180deg, #37E7FF 0%, #009BCC 100%)",
options: [
@ -99,7 +102,7 @@ export const station = {
],
},
visible: (data) => {
if (data?.dcEventAccident?.locationType != 1) {
if (data.dcEventAccident && data.dcEventAccident.locationType != 1) {
return false;
}
return true;
@ -187,6 +190,7 @@ export const startTime = {
required: true,
isAlone: true,
type: "datePicker",
default: moment(new Date()).format("YYYY-MM-DD HH:mm:ss"),
options: {
type: "datetime",
format: "yyyy-MM-dd HH:mm:ss",
@ -470,7 +474,7 @@ export const remark = {
autosize: { minRows: 6, maxRows: 6 },
showWordLimit: true,
},
required: true,
// required: true,
};
export const isInTunnel = {
@ -478,6 +482,7 @@ export const isInTunnel = {
key: "inTunnel",
// isAlone: true,
required: true,
default: '0',
type: "RadioGroup",
options: {
activeColor: "linear-gradient(180deg, #37E7FF 0%, #009BCC 100%)",
@ -575,52 +580,15 @@ export const weatherSituation = {
key: "1-6",
label: "暴雨",
},
{
key: "2-1",
label: "小雪",
},
{
key: "2-2",
label: "中雪",
},
{
key: "2-3",
label: "大雪",
},
{
key: "2-4",
label: "暴雪",
},
{
key: "2-5",
label: "大暴雪",
},
{
key: "2-6",
label: "特大暴雪",
},
{
key: "3-1",
label: "轻雾",
},
{
key: "3-2",
label: "大雾",
},
{
key: "3-3",
label: "浓雾",
},
{
key: "3-4",
label: "强浓雾",
},
{
key: "3-5",
label: "团雾",
},
],
},
visible: (data) => {
if (data?.eventSubclass == '10-1' || data?.eventSubclass == '10-2' || data?.eventSubclass == '10-3') {
return true;
}
return false;
},
};
export const additionalNotes = {
@ -716,7 +684,13 @@ export const locationMode = {
},
ons: {
change(value, ...args) {
const { formList } = args.slice(-1)[0];
const { data, formList } = args.slice(-1)[0];
if(data.dcEventAccident) {
data.dcEventAccident.facilityId = null;
}
if(data.dcEventVehicleAccident) {
data.dcEventVehicleAccident.facilityId = null;
}
let facilityType = 1;
if (value == 2) {
@ -744,7 +718,7 @@ export const locationMode = {
}).catch((err) => {
console.log('err',err)
Message.error("查询失败", err);
Message.error("查询失败1", err);
})
}
@ -764,6 +738,7 @@ export const eventHappenTime = {
key: "occurrenceTime",
required: true,
type: "datePicker",
default: moment(new Date()).format("YYYY-MM-DD HH:mm:ss"),
options: {
type: "datetime",
format: "yyyy-MM-dd HH:mm:ss",
@ -965,6 +940,7 @@ export const constructionMeasurement = {
type: "RadioGroup",
isAlone: true,
required: true,
default:'0',
options: {
activeColor: "linear-gradient(180deg, #37E7FF 0%, #009BCC 100%)",
options: [
@ -994,6 +970,7 @@ export const locationType = {
type: "RadioGroup",
isAlone: true,
required: true,
default: '1',
options: {
activeColor: "linear-gradient(180deg, #37E7FF 0%, #009BCC 100%)",
options: [
@ -1015,6 +992,7 @@ export const specialConstruction = {
type: "RadioGroup",
isAlone: true,
required: true,
default: '1',
options: {
activeColor: "linear-gradient(180deg, #37E7FF 0%, #009BCC 100%)",
options: [
@ -1129,9 +1107,9 @@ export const congestionCause = {
},
ons: {
input(value, ...args) {
console.log(value);
// console.log(value);
const { formList } = args.slice(-1)[0];
const config = formList.find((it) => it.key == "xxyy");
const config = formList.find((it) => it.key == "detailedReasons");
let ad = {
1: [
{
@ -1181,4 +1159,10 @@ export const congestionCause = {
config.options.options = value != 1 ? ad[1] : ad[2];
},
},
visible: (data) => {
if (data?.eventSubclass != '4-1') {
return false;
}
return true;
},
};

1887
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/event/FormEvent/data.js

File diff suppressed because it is too large

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

@ -88,7 +88,7 @@ export default {
this.roads.push({ key: it.id, label: it.roadName })
})
}).catch((err) => {
Message.error("查询失败", err);
Message.error("查询失败4", err);
}),
//
request({
@ -100,7 +100,7 @@ export default {
this.direction.push({ key: it.dictValue, label: it.dictLabel })
})
}).catch((err) => {
Message.error("查询失败", err);
Message.error("查询失败5", err);
}),
// 1 2 3 4 5 6
request({
@ -108,9 +108,10 @@ export default {
method: "get"
}).then((result) => {
if (result.code != 200) return Message.error(result?.msg);
result.data.forEach(it => this.lwss.push({ key: it.id, label: it.facilityName, type: facilityType }))
result.data.forEach(it => this.lwss.push({ key: it.id, label: it.facilityName, type: it.facilityType }))
}).catch((err) => {
Message.error("查询失败", err);
console.log('err', err)
Message.error("查询失败6", err);
})
])
@ -119,7 +120,7 @@ export default {
// console.log('index',index)
this.index = index;
let formConfig = tabConfigList[index].formConfig;
console.log('formConfig', formConfig)
formConfig.list.forEach(it => {
if (it.key == 'direction') {
it.options.options = this.direction;
@ -127,7 +128,7 @@ export default {
if (it.key == 'roadId') {
it.options.options = this.roads;
}
if (index == 7 || it.key === 'dcEventServiceArea.facilityId') {
if (index == 7 && it.key == 'dcEventServiceArea.facilityId') {
it.options.options = this.lwss.filter(ss => ss.type == 6);
}
// if (index == 0 || index == 1 || index == 7) {
@ -147,15 +148,32 @@ export default {
if (this.index == 0 || this.index == 1) {
formData.lang = formData.lang.join(',')
} else {
formData.lang = ''
}
if (this.index == 9) {
if (formData.endStakeMark && formData.endStakeMark[0] != null) {
let endStakeMark = formData.endStakeMark;
formData.dcEventAbnormalWeather.endStakeMark = (endStakeMark && endStakeMark.length > 0) ? ('K' + endStakeMark[0] + '+' + endStakeMark[1]) : '';
let strMark = (endStakeMark && endStakeMark.length > 0) ? ('K' + endStakeMark[0] + '+' + endStakeMark[1]) : '';
if (this.index == 3) {
formData.dcEventTrafficCongestion.endStakeMark = strMark;
}
if (this.index == 6) {
formData.dcEventConstruction.endStakeMark = strMark;
}
if (this.index == 9) {
formData.dcEventAbnormalWeather.endStakeMark = strMark;
}
formData.endStakeMark = '';
} else {
formData.endStakeMark = '';
}
// console.log('formData',formData)
// return;
let stakeMark = formData.stakeMark;
// console.log('formData', {
// ...formData,
// eventType: Number(this.index) + 1,
// stakeMark: (stakeMark && stakeMark[0] != null) ? ((stakeMark && stakeMark.length > 0) ? ('K' + stakeMark[0] + '+' + stakeMark[1]) : '') : '',
// })
// return;
request({
url: `/dc/system/event`,
@ -163,19 +181,17 @@ export default {
data: {
...formData,
eventType: Number(this.index) + 1,
stakeMark: (stakeMark && stakeMark.length > 0) ? ('K' + stakeMark[0] + '+' + stakeMark[1]) : '',
stakeMark: (stakeMark && stakeMark[0] != null) ? ((stakeMark && stakeMark.length > 0) ? ('K' + stakeMark[0] + '+' + stakeMark[1]) : '') : '',
}
}).then((result) => {
if (result.code != 200) return Message.error(result?.msg);
Message.success("提交成功");
this.modelVisible = false;
}).catch(() => {
Message.error("提交失败");
}).finally(() => {
this.submitting = false;
})
.then((result) => {
if (result.code != 200) return Message.error(result?.msg);
Message.success("提交成功");
this.modelVisible = false;
})
.catch(() => {
Message.error("提交失败");
}).finally(() => {
this.submitting = false;
})
})

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

@ -109,7 +109,7 @@ export const gjSearchFormList = [
required: false,
type: "datePicker",
options: {
type: "daterange",
type: "datetimerange",
format: "yyyy-MM-dd HH:mm:ss",
valueFormat: "yyyy-MM-dd HH:mm:ss",
},

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

@ -43,7 +43,7 @@
</div>
<!-- "详情"弹出框 -->
<EventDetailDialog :visible="eventDetailDialogVisible" :formData="detailDialogFormData" @update:value="handleClose" />
<EventDetailDialog :visible="eventDetailDialogVisible" :formData="detailDialogFormData" :activeName="activeName" @update:value="handleClose" />
<!-- "新增"弹出框 -->
<FormEvent :visible="isShowAddNew" @close="onCloseAddNew" />
</div>
@ -87,6 +87,11 @@ const directionMapping = {
'2': '中',
'3': '下行'
}
const gzDirectionMapping = {
'1': '菏泽方向',
'2': '双向',
'3': '济南方向'
}
const warningStateMapping = {
1: '上报',
2: '已完成',
@ -184,7 +189,7 @@ export default {
}).then((result) => {
if (result.code != 200) return Message.error(result?.msg);
result.rows.forEach(it => {
it.stringEventSource = warningSourceMapping[it.warningSource];
it.stringEventSource = it?.warningSource ? warningSourceMapping[it?.warningSource] : '';
it.stringDirection = directionMapping[it.direction] || it.direction;
it.startTime = it.warningTime;
@ -194,6 +199,7 @@ export default {
}
})
// console.log('result.rows',result.rows[0])
this.data = result.rows;
this.total = result.total;
@ -205,6 +211,13 @@ export default {
params: this.searchData,
}).then((result) => {
if (result.code != 200) return Message.error(result?.msg);
result.rows.forEach(it => {
it.stringDirection = gzDirectionMapping[it.direction] || it.direction;
// if (it.otherConfig) {
// let otherConfig = JSON.parse(it.otherConfig);
// it.pictures = otherConfig.pictures || [];
// }
})
this.data = result.rows;
this.total = result.total;
});
@ -290,7 +303,7 @@ export default {
if (result.code != 200) return Message.error(result?.msg);
let data = result.data;
data.stringEventSource = warningSourceMapping[data.warningSource];
data.stringEventSource = data?.warningSource ? warningSourceMapping[data.warningSource] : '';
data.direction = directionMapping[data.direction] || data.direction;
data.startTime = data.warningTime;
data.stringEventState = warningStateMapping[data.warningState];
@ -341,7 +354,7 @@ export default {
...this.searchData,
eventType: data.eventType,
eventSources: data.eventSources,
warningSource: data.warningSource,
warningSource: data?.warningSource || '',
direction: data.direction,
startTime: daterange && daterange.length > 0 ? daterange[0] : "",
endTime: daterange && daterange.length > 0 ? daterange[1] : "",

5
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/governanceAnalysis/components/postTrendsDay/assets/charts.js

@ -24,7 +24,7 @@ var options = {
grid: {
top: "15%", //上边距
right: "0", //右边距
left: "1px", //左边距
left: "10px", //左边距
bottom: "10%", //下边距
containLabel: true,
},
@ -49,10 +49,11 @@ var options = {
yAxis: [
{
type: "value",
name: "()",
name: "()",
nameTextStyle: {
color: "#E5E7E8",
fomtSize: 10,
align: "right",
},
// splitNumber: 5,
// nameTextStyle: {

4
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/governanceAnalysis/components/postTrendsMonth/assets/charts2.js

@ -48,10 +48,10 @@ let options = {
yAxis: [
{
type: "value",
name: "(起) ",
name: "(起)",
nameTextStyle: {
color: "#E5E7E8",
left: 10,
align: "right",
fomtSize: 10,
},
axisLabel: {

1
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/governanceAnalysis/components/postTrendsMonth/assets/charts3.js

@ -138,6 +138,7 @@ var options = {
// barWidth:'40%',
itemStyle: {
color: "#51BFA4",
align: "right",
},
},
{

282
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/governanceAnalysis/components/postTrendsMonth/index.vue

@ -1,39 +1,86 @@
<template>
<div class='congestion'>
<div class="congestion">
<WgtTitle :title="'事件分析'"></WgtTitle>
<div class="main-board">
<div class="board board-m">
<div class="searchPanel_1">
<!-- <el-from ref="form"> -->
<RadioGroup :options="[{ key: '1', label: '菏泽' }, { key: '3', label: '济南' }]" v-model="direction"
type="button" />
<el-select v-model="type" size="mini" class="selectRoad" placeholder="请选择">
<el-option v-for="item in typeOptions" :key="item.value" :label="item.label" :value="item.value">
<RadioGroup
:options="[
{ key: '1', label: '菏泽' },
{ key: '3', label: '济南' },
]"
v-model="direction"
type="button"
/>
<el-select
v-model="type"
size="mini"
class="selectRoad"
placeholder="请选择"
>
<el-option
v-for="item in typeOptions"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
<el-select v-model="quarter" size="medium" v-if="type == '3'" class="selectRoad-medium" placeholder="请选择">
<el-option v-for="item in quarterOptions" :key="item.value" :label="item.label" :value="item.value">
<el-select
v-model="quarter"
size="medium"
v-if="type == '3'"
class="selectRoad-medium"
placeholder="请选择"
style="width: 140px"
>
<el-option
v-for="item in quarterOptions"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
<!-- <el-quarter-picker size="mini" class="selectRoad" style="width:180px;" v-if="type == '3'" v-model="dateTime"
aria-placeholder="请选季度" /> -->
<el-date-picker size="mini" v-if="type != '3'" class="selectRoad" v-model="dateTime" style="width:140px;"
:type="type == 1 ? 'date' : type == 2 ? 'month' : type == 4 ? 'year' : ''" placeholder="请选择" />
<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="handleClear">重置</el-button>
<el-date-picker
size="mini"
v-if="type != '3'"
class="selectRoad"
v-model="dateTime"
style="width: 140px"
:type="
type == 1 ? 'date' : type == 2 ? 'month' : type == 4 ? 'year' : ''
"
placeholder="请选择"
/>
<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="handleClear"
>重置</el-button
>
<!-- </el-from> -->
</div>
<div class="charts keep-ratio " id="chart1"></div>
<div class="charts keep-ratio" id="chart1"></div>
</div>
<div class="board board-l">
<div class="charts keep-ratio " id="chart2"></div>
<div class="charts keep-ratio" id="chart2"></div>
</div>
<div class="board board-s">
<div class="charts keep-ratio " id="chart3"></div>
<div class="charts keep-ratio" id="chart3"></div>
</div>
</div>
</div>
@ -42,18 +89,22 @@
<script>
import moment from "moment";
import WgtTitle from "@screen/pages/perception/widgets/title";
import RadioGroup from '@screen/components/FormConfig/components/RadioGroup/index.vue';
import RadioGroup from "@screen/components/FormConfig/components/RadioGroup/index.vue";
import * as echarts from "echarts";
import chartsStatistics from "./assets/charts";
import chartsStatistics2 from "./assets/charts2";
import chartsStatistics3 from "./assets/charts3";
import { selectRoadSection, selectEventType, selectAccidentVehicle } from "@/api/event/governanceAnalysis"
import {
selectRoadSection,
selectEventType,
selectAccidentVehicle,
} from "@/api/event/governanceAnalysis";
export default {
name: 'postTrendsMonth',
name: "postTrendsMonth",
components: {
WgtTitle,
RadioGroup
RadioGroup,
},
data() {
return {
@ -61,109 +112,108 @@ export default {
type: "1",
typeOptions: [
{
label: '年',
value: '4'
label: "年",
value: "4",
},
{
label: '月',
value: '2'
label: "月",
value: "2",
},
{
label: '日',
value: '1'
label: "日",
value: "1",
},
{
label: '季',
value: '3'
}
label: "季",
value: "3",
},
],
quarter: '1',
quarter: "1",
quarterOptions: [
{
label: "第一季度",
value: "1"
value: "1",
},
{
label: "第二季度",
value: "2"
value: "2",
},
{
label: "第三季度",
value: "3"
value: "3",
},
{
label: "第四季度",
value: "4"
}
value: "4",
},
],
dateTime: "2024-01-01 00:00:00"
}
dateTime: "2024-01-01 00:00:00",
};
},
async created() {
await this.searchQuery()
await this.searchQuery();
},
methods: {
getSelectRoadSection(formData) {
return selectRoadSection(formData).then((res) => {
// console.log("", res.data)
let sectionNameData = []
let avgNumData = []
let lastNumData = []
let numData = []
let mileageData = []
res.data.forEach(item => {
avgNumData.push(item.avgNum)
lastNumData.push(item.lastNum)
numData.push(item.num)
mileageData.push(item.mileage)
sectionNameData.push(item.section_name)
let sectionNameData = [];
let avgNumData = [];
let lastNumData = [];
let numData = [];
let mileageData = [];
res.data.forEach((item) => {
avgNumData.push(item.avgNum);
lastNumData.push(item.lastNum);
numData.push(item.num);
mileageData.push(item.mileage);
sectionNameData.push(item.section_name);
});
chartsStatistics.series[0].data = numData //
chartsStatistics.series[1].data = avgNumData //
chartsStatistics.series[2].data = lastNumData //
chartsStatistics.series[3].data = mileageData //
chartsStatistics.xAxis.data = sectionNameData
})
chartsStatistics.series[0].data = numData; //
chartsStatistics.series[1].data = avgNumData; //
chartsStatistics.series[2].data = lastNumData; //
chartsStatistics.series[3].data = mileageData; //
chartsStatistics.xAxis.data = sectionNameData;
});
},
getSelectEventType(formData) {
return selectEventType(formData).then((res) => {
// console.log("_____________", res.data)
let lastAvgTimeData = []
let avgTimeData = []
let numData = []
let lastNumData = []
let eventSubclassData = []
let lastAvgTimeData = [];
let avgTimeData = [];
let numData = [];
let lastNumData = [];
let eventSubclassData = [];
res.data.forEach((item) => {
lastAvgTimeData.push(item.lastAvgTime)
numData.push(item.num)
avgTimeData.push(item.avgTime)
lastNumData.push(item.lastNum)
eventSubclassData.push(item.eventSubclassName)
chartsStatistics2.series[0].data = numData //
chartsStatistics2.series[1].data = lastNumData //
chartsStatistics2.series[2].data = avgTimeData //
chartsStatistics2.series[3].data = lastAvgTimeData //
chartsStatistics2.xAxis.data = eventSubclassData
})
})
lastAvgTimeData.push(item.lastAvgTime);
numData.push(item.num);
avgTimeData.push(item.avgTime);
lastNumData.push(item.lastNum);
eventSubclassData.push(item.eventSubclassName);
chartsStatistics2.series[0].data = numData; //
chartsStatistics2.series[1].data = lastNumData; //
chartsStatistics2.series[2].data = avgTimeData; //
chartsStatistics2.series[3].data = lastAvgTimeData; //
chartsStatistics2.xAxis.data = eventSubclassData;
});
});
},
getSelectAccidentVehicle(formData) {
return selectAccidentVehicle(formData).then((res) => {
// console.log("______", res.data)
let typeNameData = []
let numData = []
let avgTimeData = []
let typeNameData = [];
let numData = [];
let avgTimeData = [];
res.data.forEach((item) => {
typeNameData.push(item.typeName)
numData.push(item.num)
avgTimeData.push(item.avgTime)
})
chartsStatistics3.series[0].data = numData //
chartsStatistics3.series[1].data = avgTimeData //
chartsStatistics3.xAxis.data = typeNameData
})
typeNameData.push(item.typeName);
numData.push(item.num);
avgTimeData.push(item.avgTime);
});
chartsStatistics3.series[0].data = numData; //
chartsStatistics3.series[1].data = avgTimeData; //
chartsStatistics3.xAxis.data = typeNameData;
});
},
async searchQuery() {
let startTime = "";
@ -171,16 +221,16 @@ export default {
let year = moment().year();
// console.log(year, this.quarter);
if (this.quarter == 1) {
startTime = `${year}-01-01 00:00:00`
startTime = `${year}-01-01 00:00:00`;
} else if (this.quarter == 2) {
startTime = `${year}-04-01 00:00:00`
startTime = `${year}-04-01 00:00:00`;
} else if (this.quarter == 3) {
startTime = `${year}-07-01 00:00:00`
startTime = `${year}-07-01 00:00:00`;
} else {
startTime = `${year}-10-01 00:00:00`
startTime = `${year}-10-01 00:00:00`;
}
} else {
startTime = moment(this.dateTime).format('YYYY-MM-DD HH:mm:ss')
startTime = moment(this.dateTime).format("YYYY-MM-DD HH:mm:ss");
}
// let data = {
// direction: this.direction,
@ -191,38 +241,35 @@ export default {
formData.append("direction", this.direction);
formData.append("type", this.type);
formData.append("startTime", startTime);
await this.getSelectRoadSection(formData)
await this.getSelectEventType(formData)
await this.getSelectAccidentVehicle(formData)
this.renderCharts()
await this.getSelectRoadSection(formData);
await this.getSelectEventType(formData);
await this.getSelectAccidentVehicle(formData);
this.renderCharts();
},
handleClear() {
this.direction = "1"
this.type = "1"
this.quarter = "1"
this.dateTime = "2024-01-01 00:00:00"
this.direction = "1";
this.type = "1";
this.quarter = "1";
this.dateTime = "2024-01-01 00:00:00";
},
renderCharts() {
this.$nextTick(() => {
var myChart = echarts.init(document.getElementById('chart1'));
var myChart = echarts.init(document.getElementById("chart1"));
myChart.setOption(chartsStatistics);
var myChart1 = echarts.init(document.getElementById('chart2'));
var myChart1 = echarts.init(document.getElementById("chart2"));
myChart1.setOption(chartsStatistics2);
var myChart2 = echarts.init(document.getElementById('chart3'));
var myChart2 = echarts.init(document.getElementById("chart3"));
myChart2.setOption(chartsStatistics3);
});
},
},
mounted() {
},
}
mounted() {},
};
</script>
<style lang='scss' scoped>
<style lang="scss" scoped>
.congestion {
width: 100%;
@ -245,7 +292,6 @@ export default {
.board-s {
width: calc(100% / 6 * 1) !important;
}
.board {
@ -257,7 +303,12 @@ export default {
border-radius: 5px 5px 5px 5px;
opacity: 1;
border: 1px solid;
border-image: linear-gradient(360deg, rgba(55, 231, 255, 0.3), rgba(55, 231, 255, 0)) 1 1;
border-image: linear-gradient(
360deg,
rgba(55, 231, 255, 0.3),
rgba(55, 231, 255, 0)
)
1 1;
display: flex;
justify-content: space-between;
align-items: center;
@ -298,7 +349,7 @@ export default {
.selectRoad {
width: 89px;
border: 1px solid #00B3CC;
border: 1px solid #00b3cc;
::v-deep {
.el-input__inner {
@ -310,7 +361,7 @@ export default {
.selectRoad-medium {
width: 120px;
border: 1px solid #00B3CC;
border: 1px solid #00b3cc;
::v-deep {
.el-input__inner {
@ -321,20 +372,17 @@ export default {
}
.btnSearch {
background: linear-gradient(180deg, #005C79 0%, #009BCC 100%);
background: linear-gradient(180deg, #005c79 0%, #009bcc 100%);
margin-left: 10px;
border-color: transparent;
}
.btnReset {
background: linear-gradient(180deg, #005C79 0%, #009BCC 100%);
;
background: linear-gradient(180deg, #005c79 0%, #009bcc 100%);
border-color: transparent;
color: white;
}
}
}
}

6
ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/dailyDisposal/assets/charts.js

@ -55,7 +55,7 @@ var options = {
});
return `{ast|${obj[0].name}} {bst|${Math.round(
(obj[0].value / count) * 100
)}%} {cst|${obj[0].value}}`;
)}%} {cst|${obj[0].value}}`;
},
data: echartsData?.map((x) => x),
},
@ -66,7 +66,7 @@ var options = {
{
name: "",
type: "pie",
radius: "120px",
radius: "60px",
width: "200px",
center: ["130px", "50%"],
roseType: "radius",
@ -111,7 +111,7 @@ var options = {
{
name: "",
type: "pie",
radius: "130px",
radius: "70px",
hoverAnimation: false,
emphasis: { scale: false },
center: ["130px", "50%"],

9
ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/dailyDisposal/index.vue

@ -66,6 +66,7 @@ export default {
for (let i = 0; i < data.length; i++) {
let it = data[i];
if (it.warningState == 1) {
// it.number = 86;
echartsData.push({
name: "上报",
value: it.number
@ -141,10 +142,10 @@ export default {
context.lineWidth = 1; // 线
//
drawRoundRect(context, 242, 36, 180, 24, 12, gr)
drawRoundRect(context, 242, 63, 180, 24, 12, gr)
drawRoundRect(context, 242, 90, 180, 24, 12, gr)
drawRoundRect(context, 242, 117, 180, 24, 12, gr)
drawRoundRect(context, 230, 36, 180, 24, 12, gr)
drawRoundRect(context, 230, 63, 180, 24, 12, gr)
drawRoundRect(context, 230, 90, 180, 24, 12, gr)
drawRoundRect(context, 230, 117, 180, 24, 12, gr)
});
});
},

53
ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/dayTotal/assets/charts.js

@ -1,5 +1,17 @@
/* 数据 */
let nameList = [
"大学城",
"长清",
"孝里",
"安城",
"平阴北",
"平阴南",
"东平",
"梁山东",
"嘉祥西",
];
const sxnja = [
293.67, 493.44, 694.34, 894.5, 697.82, 895.09, 495.79, 497.49, 393.72, 293.52,
293.67, 493.44, 694.34, 894.5, 697.82, 895.09, 495.79, 497.49, 393.72,
];
const minNumber = 0;
const minArray = [];
@ -35,21 +47,32 @@ var options = {
},
xAxis: {
type: "category",
data: xaxisData,
data: [
"00:00",
"01:00",
"02:00",
"03:00",
"04:00",
"05:00",
"06:00",
"07:00",
"08:00",
"09:00",
"10:00",
"11:00",
"12:00",
],
axisLine: {
show: true,
lineStyle: {
width: 1,
color: "#545454",
color: "rgba(49, 217, 255, 0.8)",
},
},
axisTick: {
show: false,
},
axisLabel: {
color: "#B5C5D4",
color: "#fff",
fontSize: "10px",
interval: 0,
},
},
yAxis: [
@ -58,8 +81,13 @@ var options = {
// min: function (value) {
// return value.min*0.9;
// },
name: "(起)",
nameTextStyle: {
color: "#fff",
fontSize: 10,
align: "right",
},
type: "value",
// max: yAxisMax,
axisLine: {
show: false,
lineStyle: {
@ -68,19 +96,16 @@ var options = {
},
},
splitLine: {
show: true,
lineStyle: {
color: "#B2C2D3",
opacity: 0.3,
type: "dotted",
color: "rgba(49, 217, 255, 0.5)",
},
},
axisTick: {
show: false,
},
axisLabel: {
color: "#B5C5D4",
fontSize: "12px",
color: "#fff",
fontSize: "10px",
formatter: (value) => {
return value + minNumber;
},

13
ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/eventQuery/assets/charts.js

@ -60,7 +60,7 @@ nameList.map((item, index) => {
var options = {
grid: {
top: "7%", //上边距
top: "15%", //上边距
right: "0", //右边距
left: "0", //左边距
bottom: "2%", //下边距
@ -88,14 +88,15 @@ var options = {
yAxis: [
{
type: "value",
name: "",
name: "(起)",
splitNumber: 5,
nameTextStyle: {
color: "#B6E6FF",
color: "#fff",
fontSize: 10,
fontFamily: "Source Han Sans CN-Regular",
align: "left",
verticalAlign: "center",
align: "right",
// fontFamily: "Source Han Sans CN-Regular",
// align: "left",
// verticalAlign: "center",
},
axisLabel: {
fontSize: "10px",

7
ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/eventQuery/assets/charts3.js

@ -51,15 +51,16 @@ let options = {
},
yAxis: [
{
name: "(起) ",
name: "(起)",
nameTextStyle: {
color: "#E5E7E8",
color: "#fff",
fomtSize: 10,
align: "right",
},
min: 0,
axisLine: {
lineStyle: {
color: "#1C82C5",
color: "#fff",
},
},
splitLine: {

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

@ -437,7 +437,7 @@ export default {
getRoadSectionList().then(res => {
console.log(res);
if (res.code == 200) {
let rows = res.rows;
let rows = res.data;
this.dataList = [];
rows.forEach(it => {
this.dataList.push({

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

@ -1,125 +1,224 @@
<template>
<div class='congestion'>
<div class="congestion">
<div class="board">
<ProgressBar class="keep-ratio" @selectItem="selectProgress" :dataList="dataList" :selectIndex="selectIndex" />
<ProgressBar
class="keep-ratio"
@selectItem="selectProgress"
:dataList="dataList"
:selectIndex="selectIndex"
/>
<div class="searchPanel">
<RadioGroup :options="[{ key: '1', label: '菏泽' }, { key: '3', label: '济南' }]" v-model="direction" type="button" />
<el-select v-model="type" size="mini" class="selectRoad" placeholder="请选择">
<el-option v-for="item in typeOptions" :key="item.value" :label="item.label" :value="item.value">
<RadioGroup
:options="[
{ key: '1', label: '菏泽' },
{ key: '3', label: '济南' },
]"
v-model="direction"
type="button"
/>
<el-select
v-model="type"
size="mini"
class="selectRoad"
placeholder="请选择"
>
<el-option
v-for="item in typeOptions"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
<el-select v-model="quarter" size="medium" 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-select
v-model="quarter"
size="medium"
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-select>
<el-date-picker size="mini" v-if="type != 'quarter'" class="selectRoad" v-model="dateTime" style="width:140px;"
:type="type == 'date' ? 'date' : type == 'month' ? 'month' : type == 'year' ? 'year' : ''" 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>
<el-date-picker
size="mini"
v-if="type != 'quarter'"
class="selectRoad"
v-model="dateTime"
style="width: 140px"
:type="
type == 'date'
? 'date'
: type == 'month'
? 'month'
: type == 'year'
? 'year'
: ''
"
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 class="body">
<div>
<WgtTitle :title="'感知事件趋势分析'"></WgtTitle>
<Empty v-show="!chart1List || chart1List.length <= 0" text="暂无数据..."></Empty>
<div v-show="chart1List || chart1List.length > 0" id="chart1" class="btnChart" />
<Empty
v-show="!chart1List || chart1List.length <= 0"
text="暂无数据..."
></Empty>
<div
v-show="chart1List || chart1List.length > 0"
id="chart1"
class="btnChart"
/>
</div>
<div>
<WgtTitle :title="'感知事件类型分析'"></WgtTitle>
<Empty v-show="!chart2List || chart2List.length <= 0" text="暂无数据..."></Empty>
<div id="chart2" class="btnChart" />
<Empty
v-show="!chart2List || chart2List.length <= 0"
text="暂无数据..."
></Empty>
<div
v-show="chart2List || chart2List.length > 0"
id="chart2"
class="btnChart"
/>
</div>
<div>
<WgtTitle :title="'桩号范围内事件分析趋势'"></WgtTitle>
<Empty v-show="!chart3List || chart3List.length <= 0" text="暂无数据..."></Empty>
<div id="chart3" class="btnChart" />
<Empty
v-show="!chart3List || chart3List.length <= 0"
text="暂无数据..."
></Empty>
<div
v-show="chart3List || chart3List.length > 0"
id="chart3"
class="btnChart"
/>
</div>
</div>
</div>
</template>
<script>
import WgtTitle from '../../../widgets/title'
import RadioGroup from '@screen/components/FormConfig/components/RadioGroup/index.vue';
import ProgressBar from './progressBar';
<script>
import WgtTitle from "../../../widgets/title";
import RadioGroup from "@screen/components/FormConfig/components/RadioGroup/index.vue";
import ProgressBar from "./progressBar";
import * as echarts from "echarts";
import chart1 from "./assets/charts";
import chart2 from "./assets/charts2";
import chart3 from "./assets/charts3";
import ElQuarterPicker from './ElQuarterPicker'
import { getWarningTrend, getWarningSectionType, getSectionMarkNumber, getRoadSectionList } from '../../../../../../../api/event/perceiveEvent';
import ElQuarterPicker from "./ElQuarterPicker";
import {
getWarningTrend,
getWarningSectionType,
getSectionMarkNumber,
getRoadSectionList,
} from "../../../../../../../api/event/perceiveEvent";
const drawRoundRect = (ctx, x, y, width, height, radius, gr) => {
// ctx, x, y, , ,
// ctx, x, y, , ,
ctx.beginPath();
ctx.fillStyle = gr;
ctx.arc(x + radius, y + radius, radius, Math.PI, Math.PI * 3 / 2);
ctx.arc(x + radius, y + radius, radius, Math.PI, (Math.PI * 3) / 2);
ctx.lineTo(width - radius + x, y);
ctx.arc(width - radius + x, radius + y, radius, Math.PI * 3 / 2, Math.PI * 2);
ctx.arc(
width - radius + x,
radius + y,
radius,
(Math.PI * 3) / 2,
Math.PI * 2
);
ctx.lineTo(width + x, height + y - radius);
ctx.arc(width - radius + x, height - radius + y, radius, 0, Math.PI * 1 / 2);
ctx.arc(
width - radius + x,
height - radius + y,
radius,
0,
(Math.PI * 1) / 2
);
ctx.lineTo(radius + x, height + y);
ctx.arc(radius + x, height - radius + y, radius, Math.PI * 1 / 2, Math.PI);
ctx.arc(radius + x, height - radius + y, radius, (Math.PI * 1) / 2, Math.PI);
ctx.closePath();
//ctx.stroke();
ctx.fill()
}
ctx.fill();
};
export default {
name: 'EventQuery',
name: "EventQuery",
components: {
WgtTitle,
ProgressBar,
ElQuarterPicker,
RadioGroup
RadioGroup,
},
data() {
return {
typeOptions: [
{
value: 'year',
label: '年'
}, {
value: 'month',
label: '月'
value: "year",
label: "年",
},
{
value: "month",
label: "月",
},
{
value: 'date',
label: '日'
value: "date",
label: "日",
},
{
value: 'quarter',
label: '季'
}],
quarter: '1',
value: "quarter",
label: "季",
},
],
quarter: "1",
quarterOptions: [
{
label: "第一季度",
value: "1"
value: "1",
},
{
label: "第二季度",
value: "2"
value: "2",
},
{
label: "第三季度",
value: "3"
value: "3",
},
{
label: "第四季度",
value: "4"
}
value: "4",
},
],
dateTime: "2024",
direction: '1',
direction: "1",
dataList: [],
selectIndex: 3,
selectId: 3,
@ -128,36 +227,70 @@ export default {
chart2List: [],
chart3List: [],
list: [
{ name: '大学城-长清', direction: '济南方向', state: "正常", speed: '108.14km/h', follow: '161' },
{ name: '大学城-长清', direction: '济南方向', state: "正常", speed: '108.14km/h', follow: '161' },
{ name: '大学城-长清', direction: '济南方向', state: "正常", speed: '108.14km/h', follow: '161' },
{ name: '大学城-长清', direction: '济南方向', state: "正常", speed: '108.14km/h', follow: '161' },
{ name: '大学城-长清', direction: '济南方向', state: "正常", speed: '108.14km/h', follow: '161' },
{ name: '大学城-长清', direction: '济南方向', state: "正常", speed: '108.14km/h', follow: '161' }
]
}
},
created() {
{
name: "大学城-长清",
direction: "济南方向",
state: "正常",
speed: "108.14km/h",
follow: "161",
},
{
name: "大学城-长清",
direction: "济南方向",
state: "正常",
speed: "108.14km/h",
follow: "161",
},
{
name: "大学城-长清",
direction: "济南方向",
state: "正常",
speed: "108.14km/h",
follow: "161",
},
{
name: "大学城-长清",
direction: "济南方向",
state: "正常",
speed: "108.14km/h",
follow: "161",
},
{
name: "大学城-长清",
direction: "济南方向",
state: "正常",
speed: "108.14km/h",
follow: "161",
},
{
name: "大学城-长清",
direction: "济南方向",
state: "正常",
speed: "108.14km/h",
follow: "161",
},
],
};
},
created() {},
methods: {
selectProgress(item, index,) {
this.selectIndex = index
selectProgress(item, index) {
this.selectIndex = index;
this.selectId = item.id;
this.searchQuery()
this.searchQuery();
},
onReset() {
this.direction = '1';
this.direction = "1";
this.type = "year";
this.dateTime = '2024';
this.dateTime = "2024";
this.selectId = this.dataList[0].id;
this.selectIndex = 1
this.selectIndex = 1;
},
searchQuery() {
let startTime = "";
let qType = this.type == 'date' ? 'day' : this.type;
let qType = this.type == "date" ? "day" : this.type;
if (this.type == "quarter") {
console.log('dateTime', this.quarter)
console.log("dateTime", this.quarter);
// let year = moment().year();
// if (this.quarter == 1) {
// startTime = `${year}-01-01 00:00:00`
@ -169,30 +302,31 @@ export default {
// startTime = `${year}-10-01 00:00:00`
// }
} else {
startTime = moment(this.dateTime).format('YYYY-MM-DD HH:mm:ss')
startTime = moment(this.dateTime).format("YYYY-MM-DD HH:mm:ss");
}
console.log("startTime", startTime)
console.log("startTime", startTime);
//
getWarningTrend({
"type": qType,
"sectionId": this.selectId,
"createTime": startTime,
"direction": this.direction,
"quarter": this.quarter
}).then(res => {
type: qType,
sectionId: this.selectId,
createTime: startTime,
direction: this.direction,
quarter: this.quarter,
}).then((res) => {
if (res.code == 200) {
this.chart1List = res.data
this.chart1List = res.data;
let data = res.data;
chart1.series[0].data = [];
chart1.xAxis.data = [];
if (data.length > 0) {
const maxObject = data.reduce((prev, current) => (current.number > prev.number ? current : prev));
const maxObject = data.reduce((prev, current) =>
current.number > prev.number ? current : prev
);
let xData = [];
let numbers = [];
data.forEach(it => {
data.forEach((it) => {
if (this.type == "year") {
xData.push(it.month + "月");
}
@ -203,42 +337,45 @@ export default {
xData.push(it.time.split(" ")[1] + "时");
}
if (this.type == "quarter") {
xData.push(it.month + '月');
xData.push(it.month + "月");
}
if (it.number == maxObject.number) {
numbers.push({
value: it.number,
itemStyle: {
color: {
type: 'linear',
type: "linear",
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [{
offset: 0, color: '#FFB904' // 0%
}, {
offset: 1, color: '#FF6969' // 100%
}],
global: false // false
colorStops: [
{
offset: 0,
color: "#FFB904", // 0%
},
{
offset: 1,
color: "#FF6969", // 100%
},
],
global: false, // false
},
borderRadius: 6
}
borderRadius: 6,
},
});
} else {
numbers.push({
value: it.number,
itemStyle: {
borderRadius: 6
}
borderRadius: 6,
},
});
}
})
});
chart1.xAxis.data = xData;
chart1.series[0].data = numbers;
}
}
this.myChart1.setOption(chart1);
@ -246,17 +383,17 @@ export default {
//
getWarningSectionType({
"type": qType,
"sectionId": this.selectId,
"createTime": startTime,
"direction": this.direction,
"quarter": this.quarter
}).then(res => {
type: qType,
sectionId: this.selectId,
createTime: startTime,
direction: this.direction,
quarter: this.quarter,
}).then((res) => {
chart2.series[0].data = [];
if (res.code == 200) {
let types = [];
let numbers = [];
this.chart2List = res.data
this.chart2List = res.data;
let data = res.data.warningTypeList;
let total = res.data.total;
@ -291,13 +428,13 @@ export default {
numbers.push({
name: types[types.length - 1],
value: it.number
value: it.number,
});
})
});
chart2.legend.data = types;
chart2.legend.formatter = function (name) {
let total = 0
let target
let total = 0;
let target;
for (let i = 0; i < numbers.length; i++) {
total += numbers[i].value;
if (types[i] == name) {
@ -305,11 +442,11 @@ export default {
}
}
var arr = [
'{a|' + name + '}',
'{b|' + ((target / total) * 100).toFixed(2) + '%} ',
"{c|" + target + "}",
]
return arr.join(' ')
"{a|" + name + "}",
"{b|" + ((target / total) * 100).toFixed(2) + "%} ",
"{c|" + target + "}",
];
return arr.join(" ");
};
chart2.title.text = `{zb|${total}}`;
@ -335,23 +472,26 @@ export default {
// })
}
this.myChart2.setOption(chart2);
})
});
//
getSectionMarkNumber({
"type": qType,
"sectionId": this.selectId,
"createTime": startTime,
"direction": this.direction,
"quarter": this.quarter
}).then(res => {
type: qType,
sectionId: this.selectId,
createTime: startTime,
direction: this.direction,
quarter: this.quarter,
}).then((res) => {
chart3.series[0].data = [];
chart3.series[1].data = [];
chart3.xAxis.data = [];
if (res.code == 200 && res.data.length > 0) {
this.chart3List = res.data
this.chart3List = res.data;
let data = res.data;
const maxObject = data.filter(it => it.sectionNumber > 0).reduce((prev, current) => (current.sectionNumber > prev.sectionNumber ? current : prev));
const maxObject = data
.filter((it) => it.sectionNumber > 0)
.reduce((prev, current) =>
current.sectionNumber > prev.sectionNumber ? current : prev
);
let zhs = [];
let values1 = [];
let values2 = [];
@ -366,32 +506,36 @@ export default {
value: it.sectionNumber,
itemStyle: {
color: {
type: 'linear',
type: "linear",
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [{
offset: 0, color: '#01D5BC' // 0%
}, {
offset: 1, color: '#003B4E' // 100%
}],
global: false // false
colorStops: [
{
offset: 0,
color: "#01D5BC", // 0%
},
{
offset: 1,
color: "#003B4E", // 100%
},
],
global: false, // false
},
borderRadius: 6
borderRadius: 6,
},
})
});
} else {
values1.push({
value: it.sectionNumber,
itemStyle: {
borderRadius: 6
borderRadius: 6,
},
})
});
}
}
})
});
chart3.xAxis.data = zhs;
chart3.series[0].data = values1;
@ -399,7 +543,7 @@ export default {
}
this.myChart3.setOption(chart3);
})
});
// if (this.type == "day")
// this.type = "date";
},
@ -407,19 +551,18 @@ export default {
mounted() {
setTimeout(() => {
this.$nextTick(() => {
getRoadSectionList().then(res => {
getRoadSectionList().then((res) => {
console.log(res);
if (res.code == 200) {
let rows = res.rows;
let rows = res.data;
this.dataList = [];
rows.forEach(it => {
rows.forEach((it) => {
this.dataList.push({
title: it.sectionName.split("-")[0],
id: it.id,
});
})
console.log("dataList", this.dataList)
});
console.log("dataList", this.dataList);
// if (rows.length > 0) {
// let lastRoad = rows[rows.length - 1].sectionName.split("-")[1];
// this.dataList.push({
@ -427,21 +570,17 @@ export default {
// id: rows[rows.length - 1].id,
// });
// }
}
this.searchQuery();
});
})
var myChart1 = echarts.init(document.getElementById('chart1'));
var myChart1 = echarts.init(document.getElementById("chart1"));
myChart1.setOption(chart1);
var myChart2 = echarts.init(document.getElementById('chart2'));
var myChart2 = echarts.init(document.getElementById("chart2"));
myChart2.setOption(chart2);
var myChart3 = echarts.init(document.getElementById('chart3'));
var myChart3 = echarts.init(document.getElementById("chart3"));
myChart3.setOption(chart3);
this.myChart1 = myChart1;
this.myChart2 = myChart2;
this.myChart3 = myChart3;
@ -449,11 +588,11 @@ export default {
const domMap = document.getElementById("chart2");
let parentDiv = domMap.firstChild;
// canvas
let canvas = document.createElement('canvas');
let canvas = document.createElement("canvas");
canvas.width = parentDiv.offsetWidth;
canvas.height = parentDiv.offsetHeight;
parentDiv.appendChild(canvas);
const context = canvas.getContext('2d');
const context = canvas.getContext("2d");
context.lineWidth = 1; // 线
//
@ -510,15 +649,13 @@ export default {
// gr.addColorStop(1, 'rgba(92,197,255,0)');
// gr.addColorStop(0, 'rgba(92,197,255,0.5)');
// drawRoundRect(context, 416, 208, 140, 24, 12, gr);
});
});
},
}
};
</script>
<style lang='scss' scoped>
<style lang="scss" scoped>
.congestion {
width: 100%;
position: relative;
@ -529,12 +666,21 @@ export default {
justify-content: space-evenly;
font-size: 14px;
>div {
> div {
width: 33%;
height: 470px;
background: linear-gradient(180deg, rgba(6, 66, 88, 0.2) 0%, #064258 100%);
background: linear-gradient(
180deg,
rgba(6, 66, 88, 0.2) 0%,
#064258 100%
);
border: 1px solid;
border-image: linear-gradient(360deg, rgba(55, 231, 255, 0.3), rgba(55, 231, 255, 0)) 1 1;
border-image: linear-gradient(
360deg,
rgba(55, 231, 255, 0.3),
rgba(55, 231, 255, 0)
)
1 1;
}
:nth-child(1) {
@ -555,7 +701,6 @@ export default {
width: 90%;
margin: 95px auto 0;
}
}
.board {
@ -607,7 +752,7 @@ export default {
.selectRoad {
width: 100px;
border: 1px solid #00B3CC;
border: 1px solid #00b3cc;
::v-deep {
.el-input__inner {
@ -619,7 +764,7 @@ export default {
.selectRoad-medium {
width: 120px;
border: 1px solid #00B3CC;
border: 1px solid #00b3cc;
::v-deep {
.el-input__inner {
@ -630,19 +775,17 @@ export default {
}
.btnSearch {
background: linear-gradient(180deg, #005C79 0%, #009BCC 100%);
background: linear-gradient(180deg, #005c79 0%, #009bcc 100%);
margin-left: 10px;
border-color: transparent;
}
.btnReset {
background: linear-gradient(180deg, #005C79 0%, #009BCC 100%);
;
background: linear-gradient(180deg, #005c79 0%, #009bcc 100%);
border-color: transparent;
color: white;
}
}
}
}
@ -653,13 +796,54 @@ export default {
</style>
<style lang="scss">
div.el-popover:has(> .el-date-picker) div .el-picker-panel__body .el-picker-panel__content table tr 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
div.el-popover:has(> .el-date-picker)
div
.el-picker-panel__body
.el-picker-panel__content
table
tr
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;
}
</style>

8
ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/eventSource/assets/charts.js

@ -77,7 +77,6 @@ var options = {
tooltip: {
confine: true,
textStyle: {
fontSize: 10, // 字体大小
color: "#333",
},
color: "#333",
@ -129,13 +128,14 @@ var options = {
if (!mainData) return "";
for (let i = 0; i < window.mainData.length; i++) {
if (window.mainData[i].name === name) {
target = window.mainData[i].percent;
target = window.mainData[i].value;
}
}
console.log('starget',target)
var arr = [
"{ast|" + name + "}",
"{bst|" + (target * 100).toFixed(0) + "% }",
"{cst|" + target+ "件}",
"{bst|" + Math.round((target * 100).toFixed(0)) + "% }",
"{cst|" + Math.round(target) + "起}",
];
return arr.join(" ");
},

15
ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/monthStatistics/assets/charts.js

@ -8,8 +8,8 @@ var options = {
},
},
grid: {
left: "0%",
right: "5%",
left: "1%",
right: "0",
bottom: "30px",
top: "30px",
containLabel: true,
@ -112,7 +112,7 @@ var options = {
axisLabel: {
// interval:0,
color: "#fff",
fontSize: 12,
fontSize: 10,
},
axisTick: {
show: false,
@ -145,14 +145,13 @@ var options = {
],
},
yAxis: {
name: "(件) ",
name: "(起)",
nameTextStyle: {
color: "#fff",
fomtSize: 10,
fontSize: 10,
align: "right",
},
type: "value",
min: 0,
minInterval: 1,
splitLine: {
lineStyle: {
color: "rgba(255, 255, 255, 0.15)",
@ -167,7 +166,7 @@ var options = {
show: false,
},
axisLabel: {
fontSize: 12,
fontSize: 10,
fontFamily: "Bebas",
color: "#fff",
},

212
ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/railway/assets/charts.js

@ -1,124 +1,124 @@
let chartIcon = `data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAACXBIWXMAAC4jAAAuIwF4pT92AAAFw2lUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4wLWMwMDAgNzkuMTcxYzI3ZmFiLCAyMDIyLzA4LzE2LTIyOjM1OjQxICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjQuMCAoTWFjaW50b3NoKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjMtMTItMjlUMTA6MTM6MTQrMDg6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIzLTEyLTI5VDEwOjQ2OjE3KzA4OjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIzLTEyLTI5VDEwOjQ2OjE3KzA4OjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDplYzhkN2NkNS01ZjdjLTQ5Y2ItOTgyMy1lOTM4ODViNjRjMmIiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6ZjE1ZWVkNDgtNDA3ZS00MDU0LTliNTMtYTllZmQ1ODE5YjVmIiB4bXBNTTpPcmlnaW5hbERvY3VtZW50SUQ9InhtcC5kaWQ6ZjE1ZWVkNDgtNDA3ZS00MDU0LTliNTMtYTllZmQ1ODE5YjVmIj4gPHhtcE1NOkhpc3Rvcnk+IDxyZGY6U2VxPiA8cmRmOmxpIHN0RXZ0OmFjdGlvbj0iY3JlYXRlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDpmMTVlZWQ0OC00MDdlLTQwNTQtOWI1My1hOWVmZDU4MTliNWYiIHN0RXZ0OndoZW49IjIwMjMtMTItMjlUMTA6MTM6MTQrMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyNC4wIChNYWNpbnRvc2gpIi8+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJzYXZlZCIgc3RFdnQ6aW5zdGFuY2VJRD0ieG1wLmlpZDplYzhkN2NkNS01ZjdjLTQ5Y2ItOTgyMy1lOTM4ODViNjRjMmIiIHN0RXZ0OndoZW49IjIwMjMtMTItMjlUMTA6NDY6MTcrMDg6MDAiIHN0RXZ0OnNvZnR3YXJlQWdlbnQ9IkFkb2JlIFBob3Rvc2hvcCAyNC4wIChNYWNpbnRvc2gpIiBzdEV2dDpjaGFuZ2VkPSIvIi8+IDwvcmRmOlNlcT4gPC94bXBNTTpIaXN0b3J5PiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PibZhN0AAAHBSURBVDiNfdTtThNREAbgZ5sCrRTaRaBqQDTR6AXaq9grJEaiKCJWaAv9ENDUH2fWLkU8yeTkZGbe885nNp/PVU9vIMMGNtHGo1BNMQoZF7k7jlkVqDewji72sI5VrIT6F64xwRecFbnJPaDeQBsv8RSdCpsS6BYzDENOcVTkLv8CBZPX2McOdrEVITYC6BpjnKOP7zjG+yI3yd5dzLNg8jbY7MW9g+2lHJUgpzgJOcRRPX7dj3C6eIaDAO+iGUCzYPERWSXU5+jXIxct5MFgN0AOsLaoi9Ul0HHkaoBOLZg0IoQNPMaTJZAqWDfytylVtol2LdishNFaKBv/AClPI3waISto1UKZoRZ39h8QFZus8laTqvEbNyEzqdQPnZ/hcyMl/BbTmpSsacg43v0wXD43+BE2V+FzjWFdmp1ZKAZheByUt91tyD4+S/00wGWAjerxOJYS2JSSngX4lrsNeREfnUg9dRG+o3JEWniDF1Lpd6U2KEdkHoyuwvkM36TmPCxy4+rQdvDKoss7FhugzM8kIjiPED8UuSH310jLYkRaUl9V18gswD7ha5Ebl77ZA4utLY1MOT4sRmKI0fJi+wM9v6Q1QC+Y6wAAAABJRU5ErkJggg==`;
let xdata = {
value: ['平阴停车区']
value: ["平阴停车区"],
};
let sdata = {
value: [32774]
}
value: [32774],
};
let dataZoomMove = {
start: 0,
end: 4
}
start: 0,
end: 4,
};
var options = {
grid: {
containLabel: true,
// 边距自行修改
bottom: '0%',
left: '0%',
top: '2%',
right: '15%',
},
xAxis: {
type: 'value',
grid: {
containLabel: true,
// 边距自行修改
bottom: "0%",
left: "0%",
top: "2%",
right: "15%",
},
xAxis: {
type: "value",
axisLabel: {
show: false,
},
axisLine: {
show: false,
},
axisTick: {
show: false,
},
splitLine: {
show: false,
},
},
yAxis: [
{
type: "category",
data: xdata.value,
inverse: true,
axisLabel: {
show: false
fontSize: "14px",
inside: true,
verticalAlign: "bottom",
color: "#fff",
padding: 10,
margin: -5,
formatter: function (value, index) {
// let index = xdata.value.indexOf(value);
return `{a|Top${index + 1}} {b|${value}}`;
},
rich: {
a: {
fontSize: "14px",
},
b: {
fontSize: "14px",
padding: [0, 0, 0, 70],
},
},
},
axisLine: {
show: false,
show: false,
},
axisTick: {
show: false,
},
splitLine: {
show: false,
show: false,
},
},
yAxis: [
{
type: 'category',
data: xdata.value,
inverse: true,
axisLabel: {
fontSize: '14px',
inside: true,
verticalAlign: 'bottom',
color: '#fff',
padding: 10,
margin: -5,
formatter: function (value, index) {
// let index = xdata.value.indexOf(value);
return `{a|Top${index + 1}} {b|${value}}`
},
],
series: [
{
data: sdata.value,
type: "bar",
barWidth: 8,
itemStyle: {
borderRadius: 40,
color: {
type: "linear",
x: 0,
y: 0,
x2: 1,
y2: 0,
colorStops: [
{
offset: 0,
color: "#1cd0f000", // 0% 处的颜色
},
rich: {
a: {
fontSize: '14px',
},
b: {
fontSize: '14px',
padding: [0, 0, 0, 70],
}
{
offset: 1,
color: "#1cd0f0", // 100% 处的颜色
},
},
axisLine: {
show: false,
},
axisTick: {
show: false,
}
}
],
series: [
{
data: sdata.value,
type: 'bar',
barWidth: 8,
itemStyle: {
borderRadius: 40,
color: {
type: 'linear',
x: 0,
y: 0,
x2: 1,
y2: 0,
colorStops: [
{
offset: 0,
color: '#1cd0f000', // 0% 处的颜色
},
{
offset: 1,
color: '#1cd0f0', // 100% 处的颜色
},
],
global: false, // 缺省为 false
}
},
label: {
show: true,
position: 'right',
distance: -10,
data: sdata,
color: '#fff',
formatter: (c) => {
return `{a|}{b|${c.value}件}`
],
global: false, // 缺省为 false
},
},
label: {
show: true,
position: "right",
distance: -10,
data: sdata,
color: "#fff",
formatter: (c) => {
return `{a|}{b|${c.value}起}`;
},
rich: {
a: {
widht: 20,
height: 20,
backgroundColor: {
image: chartIcon,
},
rich: {
a: {
widht: 20,
height: 20,
backgroundColor: {
image: chartIcon
},
},
b: {
padding: [0, 0, 0, 10]
}
}
}
}
]
}
},
b: {
padding: [0, 0, 0, 10],
},
},
},
},
],
};
export default options;

26
ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/railwayDay/assets/charts.js

@ -56,7 +56,7 @@ nameList.map((item, index) => {
var options = {
grid: {
top: "5%", //上边距
top: "15%", //上边距
right: "0", //右边距
left: "0", //左边距
bottom: "0%", //下边距
@ -69,7 +69,7 @@ var options = {
},
xAxis: {
type: "category",
data: [],
data: nameList,
axisTick: {
show: false, //隐藏X轴刻度
},
@ -80,26 +80,22 @@ var options = {
},
axisLabel: {
show: true,
color: "#B6E6FF",
fontSize: 8,
fontFamily: "Source Han Sans CN-Regular",
color: "#fff",
fontSize: 10,
},
},
yAxis: [
{
type: "value",
name: "",
name: "(起)",
nameTextStyle: {
color: "#B6E6FF",
fontSize: 13,
fontFamily: "Source Han Sans CN-Regular",
align: "left",
verticalAlign: "center",
color: "#fff",
fontSize: 10,
align: "right",
},
axisLabel: {
fontSize: 13,
color: "#B6E6FF",
fontSize: 10,
color: "#fff",
fontFamily: "HarmonyOS Sans-Regular",
// formatter:function(value,index){
// return yList[index]
@ -121,7 +117,7 @@ var options = {
series: [
{
type: "bar",
data: [],
data: valueList,
z: 4,
itemStyle: {
color: {

2
ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/typeAnalysis/assets/charts.js

@ -63,7 +63,7 @@ var options = {
// console.log(obj);
return `{ast|${obj[0].name}} {bst|${
Math.round((obj[0].value / count) * 100) || 0
}%} {cst|${obj[0].value}}`;
}%} {cst|${obj[0].value}}`;
},
// data: typeAnalysisData?.map(x => x.name),
},

280
ruoyi-ui/src/views/JiHeExpressway/pages/perception/meteorologyCheck/components/weatherInfoQuery/components/TemperatureTrend/assets/charts.js

@ -1,148 +1,152 @@
import * as echarts from "echarts";
var options = {
color: ["#5090FF", "#01B3E4"],
grid: {
left: "2%",
right: "5%",
bottom: "10%",
top: "10%",
containLabel: true,
},
legend: {
icon: 'rect',
top: '0%',
right: '5%',
data: ['实时数据'],
itemWidth:18,
itemHeight: 5,
itemGap: 30,
itemStyle:{
color:"#FFD15C",
},
textStyle: {
fontSize: 12,
color: '#fff',
padding: [0, 0, 0, 10],
},
},
xAxis: {
type: "category",
axisLine: {
lineStyle: {
color: "#BDD8FB",
fontSize: 12,
},
tooltip: {
show: true,
trigger: "axis",
},
color: "#FFD15C",
grid: {
left: "2%",
right: "5%",
bottom: "10%",
top: "10%",
containLabel: true,
},
legend: {
icon: "rect",
top: "0%",
right: "5%",
data: ["实时数据"],
itemWidth: 18,
itemHeight: 5,
itemGap: 30,
// itemStyle: {
// color: "#FFD15C",
// },
textStyle: {
fontSize: 12,
color: "#fff",
padding: [0, 0, 0, 10],
},
},
xAxis: {
type: "category",
axisLine: {
lineStyle: {
color: "#FFD15C",
},
axisLabel: {
// interval:0,
color: "#BDD8FB",
fontSize: 12,
},
axisTick: {
show: false,
},
axisLabel: {
// interval:0,
color: "#fff",
fontSize: 10,
},
axisTick: {
show: false,
},
data: [
"00:00",
"01:00",
"02:00",
"03:00",
"04:00",
"05:00",
"06:00",
"07:00",
"08:00",
"09:00",
"10:00",
"11:00",
"12:00",
"13:00",
"14:00",
"15:00",
"16:00",
"17:00",
"18:00",
"19:00",
"20:00",
"21:00",
"22:00",
"23:00",
],
},
yAxis: {
type: "value",
min: 0,
max: 40,
minInterval: 1,
nameTextStyle: {
fontSize: 10,
color: "#fff",
align: "center",
},
splitLine: {
lineStyle: {
color: "rgba(255, 255, 255, 0.15)",
// type: 'dashed', // dotted 虚线
},
},
splitArea: { show: false },
axisLine: {
show: false,
},
axisTick: {
show: false,
},
axisLabel: {
fontSize: 10,
fontFamily: "Bebas",
color: "#fff",
},
},
series: [
{
type: "line",
// symbol: "none",
showSymbol: false,
smooth: true, // 是否曲线
name: "实时数据", // 图例对应类别
data: [
"00:00",
"01:00",
"02:00",
"03:00",
"04:00",
"05:00",
"06:00",
"07:00",
"08:00",
"09:00",
"10:00",
"11:00",
"12:00",
"13:00",
"14:00",
"15:00",
"16:00",
"17:00",
"18:00",
"19:00",
"20:00",
"21:00",
"22:00",
"23:00",
],
},
yAxis: {
type: "value",
min: 0,
max:40,
minInterval: 1,
nameTextStyle: {
fontSize: 12,
color: "#BDD8FB",
align: "center",
},
splitLine: {
lineStyle: {
color: "rgba(255, 255, 255, 0.15)",
// type: 'dashed', // dotted 虚线
},
12, 12, 23, 23, 30, 12, 26, 28, 31, 23, 25, 12, 18, 18, 18, 18, 23, 21,
20, 20, 20, 20, 20, 22, 22, 12, 12, 12,
], // 纵坐标数据
lineStyle: {
color: "#FFD15C",
},
splitArea: { show: false },
axisLine: {
show: false,
},
axisTick: {
show: false,
},
axisLabel: {
fontSize: 12,
fontFamily: "Bebas",
color: "#BDD8FB",
},
},
series: [
{
type: "line",
// symbol: "none",
showSymbol: false,
smooth: true, // 是否曲线
name: "实时数据", // 图例对应类别
data: [12, 12, 23, 23, 30, 12, 26,28, 31, 23, 25, 12, 18, 18,18, 18, 23, 21, 20, 20, 20,20, 20, 22, 22, 12, 12, 12], // 纵坐标数据
lineStyle :{
color:"#FFD15C"
},
areaStyle: {
// 区域颜色
// color: new graphic.LinearGradient(0, 0, 0, 1, [
// {
// offset: 0,
// color: "#5090FF",
// },
// {
// offset: 1,
// color: "#1057E5",
// },
// ]),
color: {
type: 'linear',
x: 0, //右
y: 0, //下
x2: 0, //左
y2: 1, //上
colorStops: [
{
offset: 0.1,
color: '#FFD15C99' // 0% 处的颜色
},
{
offset: 1,
opacity:0.01,
color: '#FFD15C01' // 100% 处的颜色
}
]
areaStyle: {
// 区域颜色
// color: new graphic.LinearGradient(0, 0, 0, 1, [
// {
// offset: 0,
// color: "#5090FF",
// },
// {
// offset: 1,
// color: "#1057E5",
// },
// ]),
color: {
type: "linear",
x: 0, //右
y: 0, //下
x2: 0, //左
y2: 1, //上
colorStops: [
{
offset: 0.1,
color: "#FFD15C99", // 0% 处的颜色
},
{
offset: 1,
opacity: 0.01,
color: "#FFD15C01", // 100% 处的颜色
},
},
],
},
},
],
},
],
};
export default options;
export default options;

290
ruoyi-ui/src/views/JiHeExpressway/pages/perception/meteorologyCheck/components/weatherInfoQuery/components/visibilityTrends/assets/charts.js

@ -1,154 +1,156 @@
import * as echarts from "echarts";
var options = {
color: ["#5090FF", "#01B3E4"],
tooltip: {
trigger: "axis",
backgroundColor: "rgba(0,0,0,.6)",
borderColor: "rgba(147, 235, 248, .8)",
textStyle: {
color: "#FFF",
},
},
grid: {
left: "2%",
right: "5%",
bottom: "10%",
top: "10%",
containLabel: true,
},
legend: {
icon: 'rect',
top: '0%',
right: '5%',
data: ['实时数据'],
itemWidth:18,
itemHeight: 5,
itemGap: 30,
textStyle: {
fontSize: 12,
color: '#C9D2FA',
padding: [0, 0, 0, 10],
},
},
xAxis: {
type: "category",
axisLine: {
lineStyle: {
color: "#BDD8FB",
fontSize: 12,
},
color: "#0783FA",
tooltip: {
show: true,
trigger: "axis",
// backgroundColor: "rgba(0,0,0,.6)",
// borderColor: "rgba(147, 235, 248, .8)",
// textStyle: {
// color: "#FFF",
// },
},
grid: {
left: "2%",
right: "5%",
bottom: "10%",
top: "10%",
containLabel: true,
},
legend: {
icon: "rect",
top: "0%",
right: "5%",
data: ["实时数据"],
itemWidth: 18,
itemHeight: 5,
itemGap: 30,
textStyle: {
fontSize: 10,
color: "#fff",
padding: [0, 0, 0, 10],
},
},
xAxis: {
type: "category",
axisLine: {
lineStyle: {
color: "#0783FA",
fontSize: 10,
},
axisLabel: {
// interval:0,
color: "#BDD8FB",
fontSize: 12,
},
axisTick: {
show: false,
},
axisLabel: {
// interval:0,
color: "#fff",
fontSize: 10,
},
axisTick: {
show: false,
},
data: [
"00:00",
"01:00",
"02:00",
"03:00",
"04:00",
"05:00",
"06:00",
"07:00",
"08:00",
"09:00",
"10:00",
"11:00",
"12:00",
"13:00",
"14:00",
"15:00",
"16:00",
"17:00",
"18:00",
"19:00",
"20:00",
"21:00",
"22:00",
"23:00",
],
},
yAxis: {
type: "value",
min: 0,
max: 40,
minInterval: 5,
splitNumber: 5,
nameTextStyle: {
fontSize: 12,
color: "#BDD8FB",
align: "center",
},
splitLine: {
lineStyle: {
color: "rgba(255, 255, 255, 0.15)",
// type: 'dashed', // dotted 虚线
},
},
splitArea: { show: false },
axisLine: {
show: false,
},
axisTick: {
show: false,
},
axisLabel: {
fontSize: 10,
fontFamily: "Bebas",
color: "#fff",
},
},
series: [
{
type: "line",
// symbol: "none",
showSymbol: false,
smooth: true, // 是否曲线
name: "实时数据", // 图例对应类别
data: [
"00:00",
"01:00",
"02:00",
"03:00",
"04:00",
"05:00",
"06:00",
"07:00",
"08:00",
"09:00",
"10:00",
"11:00",
"12:00",
"13:00",
"14:00",
"15:00",
"16:00",
"17:00",
"18:00",
"19:00",
"20:00",
"21:00",
"22:00",
"23:00",
],
},
yAxis: {
type: "value",
min: 0,
max:40,
minInterval: 5,
splitNumber:5,
nameTextStyle: {
fontSize: 12,
color: "#BDD8FB",
align: "center",
},
splitLine: {
lineStyle: {
color: "rgba(255, 255, 255, 0.15)",
// type: 'dashed', // dotted 虚线
},
12, 12, 23, 23, 30, 12, 26, 28, 31, 23, 25, 12, 18, 18, 18, 18, 23, 21,
20, 20, 20, 20, 20, 22, 22, 12, 12, 12,
], // 纵坐标数据
lineStyle: {
color: "#0783FA",
},
splitArea: { show: false },
axisLine: {
show: false,
},
axisTick: {
show: false,
},
axisLabel: {
fontSize: 12,
fontFamily: "Bebas",
color: "#BDD8FB",
},
},
series: [
{
type: "line",
// symbol: "none",
showSymbol: false,
smooth: true, // 是否曲线
name: "实时数据", // 图例对应类别
data: [12, 12, 23, 23, 30, 12, 26,28, 31, 23, 25, 12, 18, 18,18, 18, 23, 21, 20, 20, 20,20, 20, 22, 22, 12, 12, 12], // 纵坐标数据
lineStyle :{
color:"#0783FA"
},
areaStyle: {
// 区域颜色
// color: new graphic.LinearGradient(0, 0, 0, 1, [
// {
// offset: 0,
// color: "#5090FF",
// },
// {
// offset: 1,
// color: "#1057E5",
// },
// ]),
color: {
type: 'linear',
x: 0, //右
y: 0, //下
x2: 0, //左
y2: 1, //上
colorStops: [
{
offset: 0.1,
color: '#0783FA99' // 0% 处的颜色
},
{
offset: 1,
opacity:0.01,
color: '#0783FA01' // 100% 处的颜色
}
]
areaStyle: {
// 区域颜色
// color: new graphic.LinearGradient(0, 0, 0, 1, [
// {
// offset: 0,
// color: "#5090FF",
// },
// {
// offset: 1,
// color: "#1057E5",
// },
// ]),
color: {
type: "linear",
x: 0, //右
y: 0, //下
x2: 0, //左
y2: 1, //上
colorStops: [
{
offset: 0.1,
color: "#0783FA99", // 0% 处的颜色
},
{
offset: 1,
opacity: 0.01,
color: "#0783FA01", // 100% 处的颜色
},
},
],
},
},
],
},
],
};
export default options;
export default options;

187
ruoyi-ui/src/views/JiHeExpressway/pages/perception/trafficFlow/components/classification/index.vue

@ -1,5 +1,5 @@
<template>
<div class='classification'>
<div class="classification">
<WgtTitle :title="'全路车流量状况'"></WgtTitle>
<div class="board">
<!-- <div v-for="(item, index) in list" class="list">
@ -14,65 +14,85 @@
</div>
</div>
</div> -->
<div id="classification" class="keep-ratio" >
</div>
<div id="classification" class="keep-ratio"></div>
</div>
</div>
</template>
<script>
import * as echarts from "echarts";
import WgtTitle from '../../../widgets/title'
import WgtTitle from "../../../widgets/title";
import chartsStatistics from "./assets/charts";
const drawRoundRect = ( ctx, x, y, width, height, radius ) => {
// ctx, x, y, , ,
ctx.beginPath();
ctx.arc(x + radius, y + radius, radius, Math.PI, Math.PI * 3 / 2);
ctx.lineTo(width - radius + x, y);
ctx.arc(width - radius + x, radius + y, radius, Math.PI * 3 / 2, Math.PI * 2);
ctx.lineTo(width + x, height + y - radius);
ctx.arc(width - radius + x, height - radius + y, radius, 0, Math.PI * 1 / 2);
ctx.lineTo(radius + x, height +y);
ctx.arc(radius + x, height - radius + y, radius, Math.PI * 1 / 2, Math.PI);
ctx.closePath();
const drawRoundRect = (ctx, x, y, width, height, radius) => {
// ctx, x, y, , ,
ctx.beginPath();
ctx.arc(x + radius, y + radius, radius, Math.PI, (Math.PI * 3) / 2);
ctx.lineTo(width - radius + x, y);
ctx.arc(
width - radius + x,
radius + y,
radius,
(Math.PI * 3) / 2,
Math.PI * 2
);
ctx.lineTo(width + x, height + y - radius);
ctx.arc(
width - radius + x,
height - radius + y,
radius,
0,
(Math.PI * 1) / 2
);
ctx.lineTo(radius + x, height + y);
ctx.arc(radius + x, height - radius + y, radius, (Math.PI * 1) / 2, Math.PI);
ctx.closePath();
//ctx.stroke();
ctx.fill()
}
ctx.fill();
};
export default {
name: 'Classification',
name: "Classification",
components: {
WgtTitle
WgtTitle,
},
data() {
return {
list:[
{label:'客车',value:63,detail:[
{ color:"#FF5A62", label: '客1', value: '13456', perce: '34.2' },
{ color:"#23E7B2",label: '客2', value: '13456', perce: '34.2' },
{ color:"#0294FF",label: '客3', value: '13456', perce: '34.2' },
]
}, {label:'货车',value:63,detail:[
{ color:"#FF5A62",label: '货1', value: '13456', perce: '34.2' },
{ color:"#23E7B2",label: '货2', value: '13456', perce: '34.2' },
{ color:"#0294FF",label: '货3', value: '13456', perce: '34.2' },
]
}, {label:'专车',value:63,detail:[
{ color:"#FF5A62",label: '专1', value: '13456', perce: '34.2' },
{ color:"#23E7B2",label: '专2', value: '13456', perce: '34.2' },
{ color:"#0294FF",label: '专3', value: '13456', perce: '34.2' },
]
}
]
}
list: [
{
label: "客车",
value: 63,
detail: [
{ color: "#FF5A62", label: "客1", value: "13456", perce: "34.2" },
{ color: "#23E7B2", label: "客2", value: "13456", perce: "34.2" },
{ color: "#0294FF", label: "客3", value: "13456", perce: "34.2" },
],
},
{
label: "货车",
value: 63,
detail: [
{ color: "#FF5A62", label: "货1", value: "13456", perce: "34.2" },
{ color: "#23E7B2", label: "货2", value: "13456", perce: "34.2" },
{ color: "#0294FF", label: "货3", value: "13456", perce: "34.2" },
],
},
{
label: "专车",
value: 63,
detail: [
{ color: "#FF5A62", label: "专1", value: "13456", perce: "34.2" },
{ color: "#23E7B2", label: "专2", value: "13456", perce: "34.2" },
{ color: "#0294FF", label: "专3", value: "13456", perce: "34.2" },
],
},
],
};
},
mounted() {
setTimeout(() => {
this.$nextTick(() => {
var myChart0 = echarts.init(document.getElementById('classification'));
var myChart0 = echarts.init(document.getElementById("classification"));
myChart0.setOption(chartsStatistics);
// var myChart1 = echarts.init(document.getElementById('busEchartBox1'));
// myChart1.setOption(chartsStatistics);
@ -80,40 +100,35 @@ export default {
// myChart2.setOption(chartsStatistics);
const domMap = document.getElementById("classification");
let parentDiv = domMap.firstChild;
let parentDiv = domMap.firstChild;
// canvas
let canvas = document.createElement('canvas');
let canvas = document.createElement("canvas");
canvas.width = parentDiv.offsetWidth;
canvas.height =parentDiv.offsetHeight;
canvas.height = parentDiv.offsetHeight;
parentDiv.appendChild(canvas);
const context = canvas.getContext('2d');
const context = canvas.getContext("2d");
//
var gr = context.createLinearGradient(247, 63, 450, 0);
//
gr.addColorStop(1, 'rgba(92,197,255,0)');
gr.addColorStop(0, 'rgba(92,197,255,0.5)');
context.fillStyle = gr
gr.addColorStop(1, "rgba(92,197,255,0)");
gr.addColorStop(0, "rgba(92,197,255,0.5)");
context.fillStyle = gr;
context.lineWidth = 1; // 线
for (var i = 0;i < 8;i++)
//
drawRoundRect(context, 340, 50 + 34 * i, 300, 24, 12)
for (var i = 0; i < 8; i++)
//
drawRoundRect(context, 340, 50 + 34 * i, 300, 24, 12);
});
});
},
created() {
},
methods: {
}
}
created() {},
methods: {},
};
</script>
<style lang='scss' scoped>
<style lang="scss" scoped>
.classification {
width: 100%;
height: 100%;
@ -122,24 +137,28 @@ export default {
height: 400px;
width: 100%;
padding: 0px 30px;
background: linear-gradient(180deg, rgba(6,66,88,0.2) 0%, #064258 100%);
background: linear-gradient(180deg, rgba(6, 66, 88, 0.2) 0%, #064258 100%);
border-radius: 5px 5px 5px 5px;
opacity: 1;
border: 1px solid;
border-image: linear-gradient(360deg, rgba(55, 231, 255,0.3), rgba(55, 231, 255, 0)) 1 1;
opacity: 1;
border: 1px solid;
border-image: linear-gradient(
360deg,
rgba(55, 231, 255, 0.3),
rgba(55, 231, 255, 0)
)
1 1;
display: flex;
justify-content: space-between;
align-items: center;
#classification {
display: inline-flex;
width:100%;
height:350px;
width: 100%;
height: 350px;
}
.title {
background:url('./assets/bg.png') no-repeat;
background: url("./assets/bg.png") no-repeat;
background-size: 100% 100%;
width: 209px;
height: 30px;
@ -147,34 +166,34 @@ export default {
line-height: 30px;
}
}
.list{
.list {
display: flex;
justify-content:center;
justify-content: center;
align-items: center;
flex-direction: column;
}
.charts{
height:164px;
.charts {
height: 164px;
width: 164px;
}
.detail{
width:100%;
.detail {
width: 100%;
}
.detailItem{
.detailItem {
display: flex;
align-items: center;
font-size: 14px;
letter-spacing: 2px;
}
.detailItem span{
color: #37E7FF;
.detailItem span {
color: #37e7ff;
}
.tag{
background-color: #FF5A62;
.tag {
background-color: #ff5a62;
width: 6px;
height: 6px;
border-radius: 50%;
margin-right: 5px;
}
}</style>
}
</style>

2
ruoyi-ui/src/views/JiHeExpressway/pages/perception/trafficFlow/components/flowstate/assets/charts.js

@ -87,7 +87,7 @@ var options = {
],
yAxis: [
{
name: "车流量",
name: "车流量 ",
type: "value",
// max: 300,
interval: 50,

1
ruoyi-ui/src/views/JiHeExpressway/pages/perception/trafficFlow/components/situation/index.vue

@ -90,6 +90,7 @@ export default {
text-align: center;
background-color: #00b3cc;
margin-right: 10px;
cursor: pointer;
}
.checked {
background-color: #c87800 !important;

79
ruoyi-ui/src/views/JiHeExpressway/pages/perception/trafficSituation/components/IndicatorAnalysis/components/trafficIndicators/assets/chartsRadar.js

@ -0,0 +1,79 @@
import * as echarts from "echarts";
let options = {
legend: {
show: false,
},
radar: [
{
indicator: [
{ text: "Indicator1" },
{ text: "Indicator2" },
{ text: "Indicator3" },
],
center: ["50%", "55%"],
radius: 70,
startAngle: 90,
splitNumber: 4,
shape: "circle",
axisName: {
formatter: "{value}",
color: "#428BD4",
},
splitArea: {
areaStyle: {
color: ["#0987CD", "#0A7BB9", "#0B6A9C", "#0D5173"],
// opacity: 0.3,
},
},
axisLine: {
show: false,
},
splitLine: {
show: false,
},
},
],
series: [
{
type: "radar",
color: "#07A3FB",
emphasis: { show: false },
symbol: "none",
lineStyle: {
show: false,
color: "none",
},
data: [
{
value: [1, 5, 1],
name: "Data B",
areaStyle: {
color: {
type: "linear",
x: 0,
y: 0,
x2: 0,
y2: 1,
colorStops: [
{
offset: 0.1,
color: "#DC6A00", // 0% 处的颜色
},
{
offset: 0.5,
color: "#5D887C", // 100% 处的颜色
},
{
offset: 1,
color: "#099CCD", // 100% 处的颜色
},
],
global: false, // 缺省为 false
},
},
},
],
},
],
};
export default options;

5
ruoyi-ui/src/views/JiHeExpressway/pages/perception/trafficSituation/components/IndicatorAnalysis/components/trafficIndicators/index.vue

@ -158,6 +158,7 @@ import * as echarts from "echarts";
import chart1 from "./assets/charts";
import chart2 from "./assets/charts2";
import chart3 from "./assets/charts3";
import chartsRadar from "./assets/chartsRadar";
import ElQuarterPicker from "./ElQuarterPicker";
const drawRoundRect = (ctx, x, y, width, height, radius, gr) => {
@ -345,9 +346,9 @@ export default {
var myChart1 = echarts.init(document.getElementById("chart1"));
myChart1.setOption(chart1);
var myChart2 = echarts.init(document.getElementById("chart2"));
myChart2.setOption(chart2);
myChart2.setOption(chartsRadar);
var myChart3 = echarts.init(document.getElementById("chart3"));
myChart3.setOption(chart2);
myChart3.setOption(chartsRadar);
const domMap = document.getElementById("chart2");
let parentDiv = domMap.firstChild;

144
ruoyi-ui/src/views/JiHeExpressway/pages/service/PublishingChannelManagement/components/AddNEditDialog.vue

@ -0,0 +1,144 @@
<template>
<Dialog v-model="modelVisible" :title="data ? '修改' : '新增'">
<div class='AddNEditDialog'>
<Form v-model="formData" class="form" ref="FormConfigRef" :formList="formList" column="1" labelWidth="90px" />
</div>
<template #footer>
<Button style="background-color: rgba(0, 179, 204, .3);" @click.native="modelVisible = false, submitting = false">
取消
</Button>
<Button @click.native="handleSubmit" :loading="submitting">
确定
</Button>
</template>
</Dialog>
</template>
<script>
import Dialog from "@screen/components/Dialog/index.vue";
import Button from "@screen/components/Buttons/Button.vue"
import Form from '@screen/components/FormConfig';
import request from "@/utils/request";
import { getSelectOptionsStation } from "@screen/pages/control/event/businessDataManagement/utils.js";
import { Message } from "element-ui";
import * as PresetFormItems from "@screen/common/PresetFormItems.js";
export default {
name: 'AddNEditDialog',
components: {
Dialog,
Button,
Form
},
model: {
prop: 'visible',
event: "update:value"
},
props: {
visible: Boolean,
data: Object
},
inject: ['setCurrentPage'],
data() {
return {
submitting: false,
formData: {},
formList: [
{
label: "信息级别:",
key: "level",
type: "RadioGroup",
isAlone: true,
options: {
activeColor: "linear-gradient(180deg, #37E7FF 0%, #009BCC 100%)",
options: [
{
key: "1",
label: "影响通行",
},
{
key: "2",
label: "不影响通行",
},
],
},
},
PresetFormItems.releaseChannel,
{
label: "审核方式:",
key: "level",
type: "RadioGroup",
isAlone: true,
options: {
activeColor: "linear-gradient(180deg, #37E7FF 0%, #009BCC 100%)",
options: [
{
key: "1",
label: "单人审核",
},
{
key: "2",
label: "双人审核",
},
],
},
},
{
label: "启用日期:",
key: "startDate",
type: "DatePicker",
required: true
}
]
}
},
computed: {
modelVisible: {
get() {
return this.visible
},
set(val) {
this.$emit('update:value', val)
}
}
},
watch: {
modelVisible: {
immediate: true,
handler(bool) {
if (!bool) return;
this.formData = {
...this.data
}
this.getOptions();
}
}
},
methods: {
getOptions() {
},
handleSubmit() {
}
},
}
</script>
<style lang='scss' scoped>
.AddNEditDialog {
width: 450px;
height: 200px;
display: flex;
flex-direction: column;
gap: 15px;
.tips {
font-size: 12px;
}
}
</style>

6
ruoyi-ui/src/views/JiHeExpressway/pages/service/PublishingChannelManagement/components/Card.vue

@ -16,7 +16,10 @@
<Descriptions :list="list" style="gap: 15px; flex: 1; margin-top: 9px;" column="1" />
<div class="footer">
<Button>修改</Button>
<Button @click.native="() => handleOpenDialogAddEdit(item)">修改</Button>
<Button style="background-color: #FF5F5F;" @click.native="handleDelete(item)">
删除
</Button>
</div>
</div>
</template>
@ -96,6 +99,7 @@ export default {
width: 100%;
align-items: center;
justify-content: flex-end;
gap: 6px;
}
}
</style>

56
ruoyi-ui/src/views/JiHeExpressway/pages/service/PublishingChannelManagement/data.js

@ -0,0 +1,56 @@
import * as PresetFormItems from "@screen/common/PresetFormItems.js";
import { merge, cloneDeep } from "lodash";
export const searchFormList = [
{
label: "启用日期:",
key: "daterange",
required: false,
type: "datePicker",
options: {
type: "daterange",
format: "yyyy-MM-dd HH:mm:ss",
valueFormat: "yyyy-MM-dd HH:mm:ss",
},
},
PresetFormItems.eventType,
PresetFormItems.releaseChannel,
{
label: "信息级别:",
key: "level",
type: "RadioGroup",
isAlone: true,
options: {
activeColor: "linear-gradient(180deg, #37E7FF 0%, #009BCC 100%)",
options: [
{
key: "1",
label: "影响通行",
},
{
key: "2",
label: "不影响通行",
},
],
},
},
{
label: "启用状态:",
key: "status",
type: "RadioGroup",
isAlone: true,
options: {
activeColor: "linear-gradient(180deg, #37E7FF 0%, #009BCC 100%)",
options: [
{
key: "1",
label: "启用",
},
{
key: "2",
label: "停用",
},
],
},
},
];

54
ruoyi-ui/src/views/JiHeExpressway/pages/service/PublishingChannelManagement/index.vue

@ -2,14 +2,22 @@
<div class='PublishingChannelManagement'>
<!-- 搜索栏 -->
<div class="filter">
<ButtonGradient>
<template #prefix>
<img src="@screen/images/refresh.svg" />
</template>
刷新
</ButtonGradient>
<div>
<ButtonGradient @click.native="handleOpenDialogAddEdit()">
<template #prefix>
<img src="@screen/images/insert.svg" />
</template>
新增
</ButtonGradient>
<ButtonGradient>
<template #prefix>
<img src="@screen/images/refresh.svg" />
</template>
刷新
</ButtonGradient>
</div>
<InputSearch style="width: 402px;" />
<InputSearch style="width: 402px;" :formList="searchFormList" @handleSearch="handleSearch" />
</div>
<!-- 内容 -->
@ -21,6 +29,9 @@
<div class="footer">
<Pagination :total="90" />
</div>
<!-- 新增编辑弹窗 -->
<AddNEditDialog v-model="addNEditDialogVisible" :data="dialogData" />
</div>
</template>
@ -29,6 +40,9 @@ import Pagination from '@screen/components/Pagination.vue';
import InputSearch from '@screen/components/InputSearch/index.vue';
import Card from './components/Card';
import ButtonGradient from '@screen/components/Buttons/ButtonGradient.vue';
import AddNEditDialog from "./components/AddNEditDialog.vue";
import { searchFormList } from './data';
export default {
name: 'PublishingChannelManagement',
@ -36,8 +50,28 @@ export default {
Pagination,
InputSearch,
Card,
ButtonGradient
ButtonGradient,
AddNEditDialog
},
data() {
return {
searchFormList,
data: [],
addNEditDialogVisible: false,
dialogData: null
}
},
methods: {
handleOpenDialogAddEdit(data) {
console.log('data', data);
this.addNEditDialogVisible = true;
this.dialogData = data;
},
handleSearch(data) {
// this.searchData = data;
// this.getData();
},
}
}
</script>
@ -56,6 +90,10 @@ export default {
height: 60px;
display: flex;
justify-content: space-between;
div {
display: flex;
gap: 6px;
}
}
.body {

4
ruoyi-ui/src/views/websocket.vue

@ -30,8 +30,8 @@ export default {
// console.log(location.hostname )
// websocket
this.socket.initialize({
// url: 'ws://' + location.hostname + ':' + port + path,
url: "ws://10.7.179.15" + ":" + port + path,
url: 'ws://' + location.hostname + ':' + port + path,
// url: "ws://10.7.179.15" + ":" + port + path,
// url: "ws://10.168.64.171" + ":" + port + path,
// url: 'ws://10.168.78.127'+ ':' + port + path,

Loading…
Cancel
Save