Browse Source

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

wangqin
qingzhengli 2 years ago
parent
commit
5f8b9f2f27
  1. 32
      ruoyi-ui/src/api/perception/meteorologyCheck.js
  2. 15
      ruoyi-ui/src/assets/styles/JiHeExpressway.scss
  3. 175
      ruoyi-ui/src/main.js
  4. 8
      ruoyi-ui/src/utils/request.js
  5. 4
      ruoyi-ui/src/views/JiHeExpressway/components/Adaptation.vue
  6. 92
      ruoyi-ui/src/views/JiHeExpressway/components/Descriptions.vue
  7. 81
      ruoyi-ui/src/views/JiHeExpressway/components/Dialog/index.vue
  8. 33
      ruoyi-ui/src/views/JiHeExpressway/components/InputSearch/index.vue
  9. 19
      ruoyi-ui/src/views/JiHeExpressway/components/RoadStateCard/index.vue
  10. 54
      ruoyi-ui/src/views/JiHeExpressway/components/infoBoard/BoardInfoEditor.vue
  11. 4
      ruoyi-ui/src/views/JiHeExpressway/components/infoBoard/BoardPreview.vue
  12. 2
      ruoyi-ui/src/views/JiHeExpressway/components/infoBoard/BoardTplPreview.vue
  13. 3
      ruoyi-ui/src/views/JiHeExpressway/mixins/InfoBoard.js
  14. 68
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/FatigueWakesUp/index.vue
  15. 4
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/SmartDevice/components/DeviceParams.vue
  16. 2
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/TrafficIncidents/index.vue
  17. 96
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/HomeFilter/index.vue
  18. 2
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/RoadAndEvents/utils/buttonEvent.js
  19. 4
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/RoadAndEvents/utils/httpList.js
  20. 40
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/index.vue
  21. 5
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/emergencyProcessManagement/commonPhrases/index.vue
  22. 5
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/emergencyProcessManagement/disposalProcess/index.vue
  23. 12
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/event/FormEvent/index.vue
  24. 6
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/event/index.vue
  25. 5
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/governanceAnalysis/components/auditAnalytics/StatsDialogVisible/index.vue
  26. 5
      ruoyi-ui/src/views/JiHeExpressway/pages/maintenanceOperations/statisticalAnalysis/data.js
  27. 13
      ruoyi-ui/src/views/JiHeExpressway/pages/maintenanceOperations/statisticalAnalysis/index.vue
  28. 20
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/eventQuery/index.vue
  29. 15
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/eventQuery/progressBar.vue
  30. 171
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/meteorologyCheck/components/roadNetwork/index.vue
  31. 720
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/meteorologyCheck/components/sortFaceForecast/index.vue
  32. 235
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/meteorologyCheck/components/weatherForecast/index.vue
  33. 16
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/meteorologyCheck/components/weatherInfoQuery/components/TemperatureTrend/assets/charts.js
  34. 16
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/meteorologyCheck/components/weatherInfoQuery/components/visibilityTrends/assets/charts.js
  35. 299
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/meteorologyCheck/components/weatherWarning/components/infoWarning/index.vue
  36. 107
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/meteorologyCheck/index.vue
  37. 6
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/trafficFlow/components/flowstate/assets/charts.js
  38. 39
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/trafficFlow/components/flowstate/index.vue
  39. 1
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/trafficFlow/index.vue
  40. 5
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/trafficSituation/components/IndicatorAnalysis/components/composeFeatures/assets/charts.js
  41. 5
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/trafficSituation/components/IndicatorAnalysis/components/crowding/assets/charts.js
  42. 5
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/trafficSituation/components/IndicatorAnalysis/components/saturationMax/assets/charts.js
  43. 3
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/trafficSituation/components/IndicatorAnalysis/components/trafficIndicators/assets/charts.js
  44. 30
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/trafficSituation/components/IndicatorAnalysis/components/trafficIndicators/assets/chartsRadar.js
  45. 129
      ruoyi-ui/src/views/JiHeExpressway/pages/perception/trafficSituation/components/IndicatorAnalysis/components/trafficIndicators/index.vue
  46. 132
      ruoyi-ui/src/views/JiHeExpressway/pages/service/board/index.vue
  47. 7
      ruoyi-ui/src/views/JiHeExpressway/pages/service/sensitive/index.vue
  48. 4
      ruoyi-ui/src/views/JiHeExpressway/utils/enum.js
  49. 620
      ruoyi-ui/src/views/event/event/dispatch.vue
  50. 4
      ruoyi-ui/vue.config.js

32
ruoyi-ui/src/api/perception/meteorologyCheck.js

@ -0,0 +1,32 @@
import request from "@/utils/request";
// 查询天气状况
export function getWeatherFacts() {
return request({
url: "/weatherForecast/weatherFacts",
method: "post",
});
}
// 按小时查询天气状况
export function getHourlyWeather() {
return request({
url: "/weatherForecast/hourlyWeather",
method: "post",
});
}
// 查询气象预警
export function getMeteorologicalEarlyWarning() {
return request({
url: "/weatherForecast/meteorologicalEarlyWarning",
method: "post",
});
}
// 查询气象预警数量
export function getQueryTheNumberOfMeteorologicalWarning() {
return request({
url: "/weatherForecast/queryTheNumberOfMeteorologicalWarning",
method: "post",
});
}

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

@ -1,14 +1,17 @@
.theme-jihe { .theme-jihe {
$lightBlue: #3de8ff;
$textColor: #f4f4f4; $textColor: #f4f4f4;
$inputHeight: 26px; $inputHeight: 26px;
color: $textColor; color: $textColor;
.text-center{ text-align: center;}
.tc-lb{ color: $lightBlue;}
.el-tabs__item { .el-tabs__item {
color: $textColor; color: $textColor;
} }
.el-form-item { .el-form-item {
margin-bottom: 14px; margin-bottom: 8px;
} }
.el-form-item__label { .el-form-item__label {
@ -47,11 +50,14 @@
// 多选框组 // 多选框组
.el-checkbox-group { .el-checkbox-group {
// height: $inputHeight;
.el-checkbox__label { .el-checkbox__label {
color: $textColor; color: $textColor;
padding-left: 6px;
} }
.el-checkbox { .el-checkbox {
margin-right: 16px;
.el-checkbox__inner { .el-checkbox__inner {
width: 20px; width: 20px;
height: 20px; height: 20px;
@ -92,12 +98,17 @@
color: #fff; color: #fff;
&.is-disabled { &.is-disabled {
color: #006a99; color: #096d8c;
} }
} }
.el-input { .el-input {
margin: 0; margin: 0;
.el-input__inner{
height: calc($inputHeight + 2px);
background-color: #096d8c;
padding:0 28px;
}
} }
} }
// 单选按钮 // 单选按钮

175
ruoyi-ui/src/main.js

@ -1,83 +1,90 @@
import Vue from 'vue' import Vue from "vue";
import CollapseTransition from 'element-ui/lib/transitions/collapse-transition'; import CollapseTransition from "element-ui/lib/transitions/collapse-transition";
import Cookies from 'js-cookie' import Cookies from "js-cookie";
import Element from 'element-ui' import Element from "element-ui";
import './assets/styles/element-variables.scss' import "./assets/styles/element-variables.scss";
import './views/iot/css/iot.css' import "./views/iot/css/iot.css";
import '@/assets/styles/index.scss' // global css import "@/assets/styles/index.scss"; // global css
import '@/assets/styles/ruoyi.scss' // ruoyi css import "@/assets/styles/ruoyi.scss"; // ruoyi css
import App from './App' import App from "./App";
import store from './store' import store from "./store";
import router from './router/routerCreater' import router from "./router/routerCreater";
import directive from './directive' //directive import directive from "./directive"; //directive
import plugins from './plugins' // plugins import plugins from "./plugins"; // plugins
import './assets/icon/iconfont.css' // 阿里巴巴icon import "./assets/icon/iconfont.css"; // 阿里巴巴icon
import './assets/icons' // icon import "./assets/icons"; // icon
import './permission' // permission control import "./permission"; // permission control
import { Socket } from './utils/socket' import { Socket } from "./utils/socket";
import { getDicts } from "@/api/system/dict/data"; import { getDicts } from "@/api/system/dict/data";
import { getConfigKey } from "@/api/system/config"; import { getConfigKey } from "@/api/system/config";
import { parseTime, resetForm, addDateRange, selectDictLabel, selectDictLabels, handleTree, numberMul } from "@/utils/ruoyi"; import {
parseTime,
resetForm,
addDateRange,
selectDictLabel,
selectDictLabels,
handleTree,
numberMul,
} from "@/utils/ruoyi";
// 分页组件 // 分页组件
import Pagination from "@/components/Pagination"; import Pagination from "@/components/Pagination";
// 自定义表格工具组件 // 自定义表格工具组件
import RightToolbar from "@/components/RightToolbar" import RightToolbar from "@/components/RightToolbar";
// 富文本组件 // 富文本组件
import Editor from "@/components/Editor" import Editor from "@/components/Editor";
// 文件上传组件 // 文件上传组件
import FileUpload from "@/components/FileUpload" import FileUpload from "@/components/FileUpload";
// 图片上传组件 // 图片上传组件
import ImageUpload from "@/components/ImageUpload" import ImageUpload from "@/components/ImageUpload";
// 字典标签组件 // 字典标签组件
import DictTag from '@/components/DictTag' import DictTag from "@/components/DictTag";
// 头部标签组件 // 头部标签组件
import VueMeta from 'vue-meta' import VueMeta from "vue-meta";
// 字典数据组件 // 字典数据组件
import DictData from '@/components/DictData' import DictData from "@/components/DictData";
// 无缝滚动组件 // 无缝滚动组件
import VueSeamlessScroll from 'vue-seamless-scroll' import VueSeamlessScroll from "vue-seamless-scroll";
import VueAwesomeSwiper from 'vue-awesome-swiper' import VueAwesomeSwiper from "vue-awesome-swiper";
import 'swiper/css/swiper.css' import "swiper/css/swiper.css";
//el-table无线滚动 //el-table无线滚动
// 事件弹窗组件 // 事件弹窗组件
import eventDialog from '@/components/eventDialogTable/eventDialog.vue' import eventDialog from "@/components/eventDialogTable/eventDialog.vue";
import eventDialogTable from '@/components/eventDialogTable' import eventDialogTable from "@/components/eventDialogTable";
import evtDialogOneThing from '@/components/eventDialogTable/evtDialogOneThing.vue' import evtDialogOneThing from "@/components/eventDialogTable/evtDialogOneThing.vue";
import evtDialogVideo from '@/components/eventDialogTable/video.vue' import evtDialogVideo from "@/components/eventDialogTable/video.vue";
// 大屏适配 // 大屏适配
import dataV from '@jiaminghi/data-view' import dataV from "@jiaminghi/data-view";
// 字典标签组件 // 字典标签组件
// import reproductionImage from '@/components/reproductionImage' // import reproductionImage from '@/components/reproductionImage'
// jQuery // jQuery
import $ from 'jquery' import $ from "jquery";
import preventClick from './api/clickOnceAtime' import preventClick from "./api/clickOnceAtime";
// gisMap // gisMap
// import gisMap from 'gis-map-tunnel' // import gisMap from 'gis-map-tunnel'
// import gisMap from 'gis-map-admin' // import gisMap from 'gis-map-admin'
import config from '../public/config' import config from "../public/config";
import request from '../public/config' import request from "../public/config";
import moment from 'moment' import moment from "moment";
window.moment = moment window.moment = moment;
import dayjs from "dayjs" import dayjs from "dayjs";
//定义全局过滤器 //定义全局过滤器
Vue.filter('dateformat', function (dataStr, pattern = 'YYY-MM-DD HH:mm:ss') { Vue.filter("dateformat", function (dataStr, pattern = "YYY-MM-DD HH:mm:ss") {
if (dataStr === null || dataStr === "") { if (dataStr === null || dataStr === "") {
return ""; return "";
} }
return moment(dataStr).format(pattern) return moment(dataStr).format(pattern);
//filter两个参数 第一个是函数名,第二个是时间格式化处理的函数 //filter两个参数 第一个是函数名,第二个是时间格式化处理的函数
//(函数里面的参数 第一个是传递的数据,第二个是需要转换的时间格式) //(函数里面的参数 第一个是传递的数据,第二个是需要转换的时间格式)
}) });
window.IS_TESTING = false; window.IS_TESTING = false;
if (process.env.NODE_ENV == 'development'){ if (process.env.NODE_ENV == "development") {
window.IS_TESTING = false; window.IS_TESTING = false;
} }
@ -86,47 +93,45 @@ Vue.component("Empty", Empty);
// 全局方法挂载 // 全局方法挂载
Vue.prototype.dayjs = dayjs; Vue.prototype.dayjs = dayjs;
Vue.prototype.getDicts = getDicts Vue.prototype.getDicts = getDicts;
Vue.prototype.getConfigKey = getConfigKey Vue.prototype.getConfigKey = getConfigKey;
Vue.prototype.parseTime = parseTime Vue.prototype.parseTime = parseTime;
Vue.prototype.resetForm = resetForm Vue.prototype.resetForm = resetForm;
Vue.prototype.addDateRange = addDateRange Vue.prototype.addDateRange = addDateRange;
Vue.prototype.selectDictLabel = selectDictLabel Vue.prototype.selectDictLabel = selectDictLabel;
Vue.prototype.selectDictLabels = selectDictLabels Vue.prototype.selectDictLabels = selectDictLabels;
Vue.prototype.handleTree = handleTree Vue.prototype.handleTree = handleTree;
Vue.prototype.socket = Socket Vue.prototype.socket = Socket;
Vue.prototype.numberMul = numberMul Vue.prototype.numberMul = numberMul;
// gis // gis
Vue.prototype.$GlobalConfig = config.GlobalConfig Vue.prototype.$GlobalConfig = config.GlobalConfig;
Vue.use(preventClick) Vue.use(preventClick);
Vue.use(VueAwesomeSwiper) Vue.use(VueAwesomeSwiper);
Vue.use(dataV) Vue.use(dataV);
// 全局组件挂载 // 全局组件挂载
Vue.component('DictTag', DictTag) Vue.component("DictTag", DictTag);
Vue.component('Pagination', Pagination) Vue.component("Pagination", Pagination);
Vue.component('RightToolbar', RightToolbar) Vue.component("RightToolbar", RightToolbar);
Vue.component('Editor', Editor) Vue.component("Editor", Editor);
Vue.component('FileUpload', FileUpload) Vue.component("FileUpload", FileUpload);
Vue.component('ImageUpload', ImageUpload) Vue.component("ImageUpload", ImageUpload);
Vue.component('VueSeamlessScroll', VueSeamlessScroll) Vue.component("VueSeamlessScroll", VueSeamlessScroll);
Vue.component('eventDialog', eventDialog) Vue.component("eventDialog", eventDialog);
Vue.component('eventDialogTable', eventDialogTable) Vue.component("eventDialogTable", eventDialogTable);
Vue.component('evtDialogOneThing', evtDialogOneThing) Vue.component("evtDialogOneThing", evtDialogOneThing);
Vue.component('evtDialogVideo', evtDialogVideo) Vue.component("evtDialogVideo", evtDialogVideo);
Vue.component(CollapseTransition.name, CollapseTransition);
Vue.component(CollapseTransition.name, CollapseTransition)
// Vue.component('reproductionImage', reproductionImage) // Vue.component('reproductionImage', reproductionImage)
Vue.use(directive) Vue.use(directive);
Vue.use(plugins) Vue.use(plugins);
// Vue.use(gisMap) // Vue.use(gisMap)
Vue.use(VueMeta) Vue.use(VueMeta);
DictData.install() DictData.install();
/** /**
* If you don't want to use mock-server * If you don't want to use mock-server
* you want to use MockJs for mock api * you want to use MockJs for mock api
@ -137,14 +142,14 @@ DictData.install()
*/ */
Vue.use(Element, { Vue.use(Element, {
size: Cookies.get('size') || 'medium' // set element-ui default size size: Cookies.get("size") || "medium", // set element-ui default size
}) });
Vue.config.productionTip = false Vue.config.productionTip = false;
new Vue({ new Vue({
el: '#app', el: "#app",
router, router,
store, store,
render: h => h(App) render: (h) => h(App),
}) });

8
ruoyi-ui/src/utils/request.js

@ -141,6 +141,14 @@ service.interceptors.response.use(res => {
else if (message.includes("Request failed with status code")) { else if (message.includes("Request failed with status code")) {
message = "系统接口" + message.substr(message.length - 3) + "异常"; message = "系统接口" + message.substr(message.length - 3) + "异常";
} }
else if (message.includes("client_offline"))
{
message = "设备离线"
}
else if (message.includes("time_out"))
{
message = "连接超时"
}
Message({ Message({
message: message, message: message,
type: 'error', type: 'error',

4
ruoyi-ui/src/views/JiHeExpressway/components/Adaptation.vue

@ -51,8 +51,8 @@ export default {
return this.scale return this.scale
} }
}, },
watch:{ watch: {
headerHeight(){ headerHeight() {
} }
}, },
methods: { methods: {

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

@ -1,20 +1,37 @@
<template> <template>
<div class='Descriptions keep-ratio' origin="left" :style="getStyle()"> <div class="Descriptions keep-ratio" origin="left" :style="getStyle()">
<div class="item" v-for="(item, index) in getResolveList" :key="`${item.key || item.label}${index}`" <div
:style="[gridStyle(item, index), transformStyle(itemStyle)]"> class="item"
<div class="text title" :style="{ v-for="(item, index) in getResolveList"
:key="`${item.key || item.label}${index}`"
:style="[gridStyle(item, index), transformStyle(itemStyle)]"
>
<div
class="text title"
:style="{
...transformStyle(titleStyle), ...transformStyle(titleStyle),
width: labelWidth width: labelWidth,
}"> }"
>
<p> <p>
<slot :name="`title-${item.key || item.label}`" :data="item"> <slot :name="`title-${item.key || item.label}`" :data="item">
{{ item.label || '-' }} {{ item.label || "-" }}
</slot> </slot>
</p>: </p>
:
</div> </div>
<ContentText :style="transformStyle(titleStyle)" class="content text" :data="data" :_config="item"> <ContentText
:style="transformStyle(titleStyle)"
class="content text"
:data="data"
:_config="item"
>
<template #default="{ value }"> <template #default="{ value }">
<slot :name="`content-${item.key || item.label}`" :value="value" :data="item"> <slot
:name="`content-${item.key || item.label}`"
:value="value"
:data="item"
>
{{ value }} {{ value }}
</slot> </slot>
</template> </template>
@ -24,18 +41,18 @@
</template> </template>
<script> <script>
import { getContent } from "@screen/components/FormConfig/utils/index.js" import { getContent } from "@screen/components/FormConfig/utils/index.js";
import ContentText from "@screen/components/FormConfig/components/Text.vue" import ContentText from "@screen/components/FormConfig/components/Text.vue";
export default { export default {
name: 'Descriptions', name: "Descriptions",
components: { components: {
ContentText ContentText,
}, },
props: { props: {
data: { data: {
type: Object, type: Object,
default: () => ({}) default: () => ({}),
}, },
/** /**
* { * {
@ -47,74 +64,73 @@ export default {
*/ */
list: { list: {
type: Array, type: Array,
default: () => [] default: () => [],
}, },
column: { column: {
type: String, type: String,
default: "2" default: "2",
}, },
labelWidth: String, labelWidth: String,
titleStyle: { titleStyle: {
type: [String, Object], type: [String, Object],
default: null default: null,
}, },
contentStyle: { contentStyle: {
type: [String, Object], type: [String, Object],
default: null default: null,
}, },
itemStyle: { itemStyle: {
type: [String, Object], type: [String, Object],
default: null default: null,
} },
}, },
computed: { computed: {
gridStyle() { gridStyle() {
return (item, index) => ({ return (item, index) => ({
gridRow: `span ${item.gridRow || 1}`, gridRow: `span ${item.gridRow || 1}`,
gridColumn: `span ${item.gridColumn || 1}`, gridColumn: `span ${item.gridColumn || 1}`,
}) });
}, },
getText() { getText() {
return (item) => getContent(this.data, item) return (item) => getContent(this.data, item);
}, },
getResolveList() { getResolveList() {
return this.list.reduce((prev, data) => { return this.list.reduce((prev, data) => {
if (typeof data.visible === "function") {
if (typeof data.visible === 'function') {
if (!data.visible(data)) return prev; if (!data.visible(data)) return prev;
} }
prev.push(data); prev.push(data);
return prev return prev;
}, []) }, []);
} },
}, },
methods: { methods: {
getStyle() { getStyle() {
return { return {
gridTemplateColumns: `repeat(${this.column}, 1fr)`, gridTemplateColumns: `repeat(${this.column}, 1fr)`,
} };
}, },
getComponent(type) { getComponent(type) {
return `Form${type.replace(/^[a-z]/, word => word.toUpperCase())}` return `Form${type.replace(/^[a-z]/, (word) => word.toUpperCase())}`;
}, },
transformStyle(style) { transformStyle(style) {
if (typeof style != 'string') return style; if (typeof style != "string") return style;
return style.split(';').reduce((prev, cur) => { return style.split(";").reduce((prev, cur) => {
const [key, value] = cur.split(":"); const [key, value] = cur.split(":");
prev[key] = value; prev[key] = value;
return prev; return prev;
}, {}); }, {});
} },
} },
} };
</script> </script>
<style lang='scss' scoped> <style lang="scss" scoped>
.Descriptions { .Descriptions {
display: grid; display: grid;
gap: 9px; gap: 9px;
@ -123,7 +139,7 @@ export default {
font-size: 15px; font-size: 15px;
font-family: PingFang SC, PingFang SC; font-family: PingFang SC, PingFang SC;
font-weight: 400; font-weight: 400;
color: #FFF; color: #fff;
line-height: 18px; line-height: 18px;
gap: 3px; gap: 3px;
display: flex; display: flex;
@ -135,7 +151,7 @@ export default {
gap: 6px; gap: 6px;
.title { .title {
color: #3DE8FF; color: #3de8ff;
p { p {
width: 100%; width: 100%;

81
ruoyi-ui/src/views/JiHeExpressway/components/Dialog/index.vue

@ -1,22 +1,38 @@
<template> <template>
<Teleport> <Teleport>
<Transition name="fade"> <Transition name="fade">
<div :class="['mask-layer', { 'none-mask': noneMask }]" v-if="modelVisible"> <div
<BackgroundClip class='dialog' :class="['mask-layer', { 'none-mask': noneMask }]"
v-if="modelVisible"
>
<BackgroundClip
class="dialog"
clipPath="polygon(calc(100% - var(--clip-width)) 0, 100% var(--clip-width), 100% 100%, var(--clip-width) 100%, 0 calc(100% - var(--clip-width)), 0 0)" clipPath="polygon(calc(100% - var(--clip-width)) 0, 100% var(--clip-width), 100% 100%, var(--clip-width) 100%, 0 calc(100% - var(--clip-width)), 0 0)"
borderColor="linear-gradient(180deg, rgba(78, 174, 204, .9), rgba(78, 174, 204, 0))" borderColor="linear-gradient(180deg, rgba(78, 174, 204, .9), rgba(78, 174, 204, 0))"
bgColor="linear-gradient(180deg, rgba(14, 69, 92, 0.9) 0%, rgba(20, 89, 119, 0.9) 100%)" ref="DialogContentRef"> bgColor="linear-gradient(180deg, rgba(14, 69, 92, 0.9) 0%, rgba(20, 89, 119, 0.9) 100%)"
ref="DialogContentRef"
>
<div class="dialog-title"> <div class="dialog-title">
<img class="title-icon" src="@screen/images/dialog/title-icon.svg" /> <img
class="title-icon"
src="@screen/images/dialog/title-icon.svg"
/>
<span>{{ title }}</span> <span>{{ title }}</span>
<img class="icon-close" @click.stop="modelVisible = false" src="@screen/images/dialog/icon-close.svg" /> <img
class="icon-close"
@click.stop="modelVisible = false"
src="@screen/images/dialog/icon-close.svg"
/>
</div> </div>
<div class="dialog-content"> <div class="dialog-content">
<slot /> <slot />
</div> </div>
<img class="bottom-right" src="@screen/images/dialog/right-bottom.svg"> <img
class="bottom-right"
src="@screen/images/dialog/right-bottom.svg"
/>
<div class="footer" v-if="$slots.footer"> <div class="footer" v-if="$slots.footer">
<slot name="footer"></slot> <slot name="footer"></slot>
@ -28,71 +44,74 @@
</template> </template>
<script> <script>
import Teleport from '../Teleport.vue'; import Teleport from "../Teleport.vue";
import BackgroundClip from "@screen/components/Decorations/BackgroundClip.vue"; import BackgroundClip from "@screen/components/Decorations/BackgroundClip.vue";
import { moveable, stopPropagation } from "./utils" import { moveable, stopPropagation } from "./utils";
export default { export default {
components: { components: {
Teleport, Teleport,
BackgroundClip BackgroundClip,
}, },
model: { model: {
prop: 'visible', prop: "visible",
event: "update:value" event: "update:value",
}, },
name: 'Dialog', name: "Dialog",
props: { props: {
title: { title: {
type: String type: String,
}, },
visible: Boolean, visible: Boolean,
noneMask: { noneMask: {
type: Boolean, type: Boolean,
default: false default: false,
} },
}, },
watch: { watch: {
visible: { visible: {
deep: true, deep: true,
handler(bool) { handler(bool) {
this.$nextTick(() => { this.$nextTick(() => {
if (!bool) return this.destroyMoveable?.() if (!bool) return this.destroyMoveable?.();
const container = this.$refs.DialogContentRef.$el; const container = this.$refs.DialogContentRef.$el;
this.destroyMoveable = moveable(container, { target: container.querySelector(".dialog-title") }); this.destroyMoveable = moveable(container, {
target: container.querySelector(".dialog-title"),
});
stopPropagation(container.querySelector(".dialog-title").lastChild) stopPropagation(container.querySelector(".dialog-title").lastChild);
this.$once("hook:beforeDestroy", () => this.destroyMoveable?.()); this.$once("hook:beforeDestroy", () => this.destroyMoveable?.());
}) });
} },
} },
}, },
computed: { computed: {
modelVisible: { modelVisible: {
get() { get() {
return this.visible return this.visible;
}, },
set(val) { set(val) {
this.$emit('update:value', val) console.log("val", val);
} this.$emit("update:value", val);
} },
},
}, },
beforeDestroy() { beforeDestroy() {
this.modelVisible = false; this.modelVisible = false;
}, },
} };
</script> </script>
<style lang='scss' scoped> <style lang="scss" scoped>
.mask-layer { .mask-layer {
position: fixed; position: fixed;
top: 0; top: 0;
width: 100%; width: 100%;
height: 100%; height: 100%;
background: rgba(0, 0, 0, .36); background: rgba(0, 0, 0, 0.36);
border-radius: 0px 0px 0px 0px; border-radius: 0px 0px 0px 0px;
z-index: 100; z-index: 100;
display: flex; display: flex;
@ -111,7 +130,7 @@ export default {
.fade-enter-active, .fade-enter-active,
.fade-leave-active { .fade-leave-active {
transition: opacity .24s; transition: opacity 0.24s;
} }
.fade-enter, .fade-enter,
@ -165,7 +184,7 @@ export default {
.dialog-content { .dialog-content {
padding: 9px 21px 27px 21px; padding: 9px 21px 27px 21px;
max-height: 90vh; max-height: 75vh;
overflow-y: auto; overflow-y: auto;
} }
@ -185,7 +204,7 @@ export default {
padding: 0 27px; padding: 0 27px;
::v-deep { ::v-deep {
>div { > div {
min-width: 96px; min-width: 96px;
} }
} }

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

@ -1,5 +1,6 @@
<template> <template>
<div class="from-content" style="width: 100%"> <div class="from-content" style="width: 100%">
<!-- <div ref="mask" style="position: fixed; z-index: 9999999; left: 0; top:0; bottom: 0; right: 0; background: rgba(0, 0, 0, 0.5);" @click.prevent="onClickMask" v-if="visible"></div> -->
<ElPopover <ElPopover
ref="PopoverRef" ref="PopoverRef"
placement="bottom" placement="bottom"
@ -21,19 +22,20 @@
style="width: 100%" style="width: 100%"
v-model="value" v-model="value"
:placeholder="placeholder" :placeholder="placeholder"
clearable
@change="handleSearch" @change="handleSearch"
></ElInput> ></ElInput>
<img src="./search.svg" v-show="!disable" @click="visible = !visible" /> <img src="./search.svg" v-show="!disable" @click="onOpenPop" />
</div> </div>
<div <div
class="InputSearch" class="InputSearch"
v-else v-else
slot="reference" slot="reference"
ref="ReferenceInputRef" ref="ReferenceInputRef"
@click="visible = !visible" @click="onOpenPop"
> >
<span>{{ placeholder }}</span> <span>{{ placeholder }}</span>
<img src="./search.svg" /> <img src="./search.svg"/>
</div> </div>
<div style="width: 100%; max-height: 360px" v-show="visible"> <div style="width: 100%; max-height: 360px" v-show="visible">
@ -104,6 +106,7 @@ export default {
}, },
data() { data() {
return { return {
isClickedBtn: false,
visible: false, visible: false,
types: this.type, types: this.type,
value: "", value: "",
@ -125,15 +128,33 @@ export default {
}; };
}, },
}, },
mounted(){
// document.getElementById("app")
document.addEventListener("click" , ()=>{
if(!this.isClickedBtn){
setTimeout(() => {
this.visible = false;
}, 100)
}
this.isClickedBtn = false;
} , false)
},
methods: { methods: {
onOpenPop(){
this.isClickedBtn = true;
this.visible = !this.visible;
},
onClickMask(){
this.visible = false;
},
handleShow() { handleShow() {
if (this.width) return; if (this.width) return;
this.width = this.$refs.ReferenceInputRef.getBoundingClientRect().width; this.width = this.$refs.ReferenceInputRef.getBoundingClientRect().width;
}, },
handleResetForm() { handleResetForm() {
this.visible = true; // this.visible = true;
this.$refs.FormConfigRef?.reset(); this.$refs.FormConfigRef?.reset();
this.$refs.FormConfigRef.$refs.ElFormRef.resetFields(); this.$refs.FormConfigRef.$refs.ElFormRef.resetFields();
// this.$refs.PopoverRef.doClose(); // this.$refs.PopoverRef.doClose();
@ -144,7 +165,7 @@ export default {
"reset" "reset"
); );
}, },
async handleSearch() { async handleSearch(value) {
if (this.types === "input") { if (this.types === "input") {
let params = {}; let params = {};
params[this.params] = this.value; params[this.params] = this.value;
@ -172,7 +193,7 @@ export default {
console.log("catch"); console.log("catch");
}); });
} }
}, }
}, },
}; };
</script> </script>

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

@ -2,8 +2,14 @@
<BorderRadiusImage class='RoadStateCard' borderRadius="2px" <BorderRadiusImage class='RoadStateCard' borderRadius="2px"
borderColor="linear-gradient(360deg, rgba(55, 231, 255, 0.3), rgba(55, 231, 255, 0))" borderWidth="2px"> borderColor="linear-gradient(360deg, rgba(55, 231, 255, 0.3), rgba(55, 231, 255, 0))" borderWidth="2px">
<div class="left"> <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`)"> --> <!-- <img :src="require(`./test.png`)"> -->
<ElImage style="width: 212px; height: 159px;" :src="cardData.pictures ? cardData.pictures[0] : null"
:preview-src-list="cardData.pictures || []">
<div slot="error">
<i class="el-icon-picture-outline icon"></i>
</div>
</ElImage>
</div> </div>
<div class="right"> <div class="right">
<div class="info"> <div class="info">
@ -23,7 +29,7 @@
</div> </div>
</div> </div>
<img v-if="cardData.state" class="status" :src="require(`./images/${statusMap[cardData.state]}.svg`)" /> <img v-if="cardData.state" class="status" :src="require(`./images/${statusMap[cardData.state]}.svg`) " />
</BorderRadiusImage> </BorderRadiusImage>
</template> </template>
@ -135,6 +141,15 @@ export default {
width: 212px; width: 212px;
height: 159px; height: 159px;
} }
.icon {
display:inline-block;
width: 212px;
height: 159px;
line-height: 157px;
text-align: center;
border: 1px solid #fff;
}
} }
.right { .right {

54
ruoyi-ui/src/views/JiHeExpressway/components/infoBoard/BoardInfoEditor.vue

@ -101,6 +101,7 @@
:key="item.dictValue" :key="item.dictValue"
:label="item.dictLabel" :label="item.dictLabel"
:value="item.dictValue" :value="item.dictValue"
v-if="+(item.dictValue.replace('px',''))<=maxFontSize"
> >
</el-option> </el-option>
</el-select> </el-select>
@ -191,6 +192,7 @@ import { debounce } from "lodash";
export default { export default {
data() { data() {
return { return {
maxFontSize:100,
alignmentNum: 2, alignmentNum: 2,
content: "", content: "",
boardWidth: "", boardWidth: "",
@ -316,6 +318,17 @@ export default {
speechSpeed: "0", speechSpeed: "0",
font: "3", font: "3",
}, },
templateDefault: {
category: "",
formatStyle: "2",
content: "",
fontColor: "",
fontSize: "",
fontType: "",
stopTime: 50,
inScreenMode: "",
screenSize: "",
},
isLocked: false, isLocked: false,
}; };
}, },
@ -361,6 +374,26 @@ export default {
}, },
}, },
watch: { watch: {
screenSize(newV){
if(newV){
let boardH = newV.split("*")[1];
let fontSize = "20";
if (['64', '48'].includes(boardH)) {
this.maxFontSize = +boardH
fontSize = boardH + ""
} else if (['80'].includes(boardH)) {
this.maxFontSize = +boardH / 2
fontSize = +boardH / 2 + ""
} else if (['160'].includes(boardH)) {
this.maxFontSize = +boardH / 2
fontSize = +boardH / 4 + ""
}
this.deviceCttDefault.fontSize = fontSize
this.templateDefault.screenSize = newV;
this.templateDefault.fontSize = fontSize;
}
},
visible: { visible: {
handler(newV) { handler(newV) {
this.dialogVisible = newV; this.dialogVisible = newV;
@ -400,21 +433,30 @@ export default {
}, },
mounted() {}, mounted() {},
created() { created() {
this.templateDefault.fontType = this.fontTypeList[0].dictValue //
this.getDicts("iot_devices_font_color").then((res) => { this.getDicts("iot_devices_font_color").then((res) => {
this.colorList = res.data; this.colorList = res.data;
this.templateDefault.fontColor = this.colorList[0].dictValue
// console.log(this.colorList, ""); // console.log(this.colorList, "");
}); });
this.getDicts("iot_device_font_inScreen_mode").then((res) => { this.getDicts("iot_device_font_inScreen_mode").then((res) => {
this.inScreenModeList = res.data; this.inScreenModeList = res.data;
this.templateDefault.inScreenMode = this.inScreenModeList[0].dictValue
// console.log(this.inScreenModeList, ""); // console.log(this.inScreenModeList, "");
}); });
this.getDicts("iot_template_category").then((res) => { this.getDicts("iot_template_category").then((res) => {
this.templateCategoryList = res.data; this.templateCategoryList = res.data;
this.templateDefault.category = this.templateCategoryList[0].dictValue
}); });
this.getDicts("iot_device_font_size").then((res) => { this.getDicts("iot_device_font_size").then((res) => {
this.fontSizeList = res.data; this.fontSizeList = res.data;
// this.templateDefault.fontSize = this.fontSizeList[0].dictValue
// this.dataForm.FONT_SIZE = res.data[1].dictValue // this.dataForm.FONT_SIZE = res.data[1].dictValue
}); });
}, },
methods: { methods: {
initData() { initData() {
@ -433,17 +475,7 @@ export default {
if (this.mode == "add") { if (this.mode == "add") {
let tempTpl = null; let tempTpl = null;
if (this.type == "template") { if (this.type == "template") {
tempTpl = { tempTpl = _.merge({}, this.templateDefault, this.tpl);
category: this.templateCategoryList[0].dictValue,
formatStyle: 0,
content: "",
fontColor: this.colorList[0].dictValue,
fontSize: this.fontSizeList[0].dictValue,
fontType: this.fontTypeList[0].dictValue,
stopTime: 50,
inScreenMode: this.inScreenModeList[0].dictValue,
screenSize: this.screenSize,
};
} else { } else {
tempTpl = _.merge({}, this.deviceCttDefault, this.tpl.origin); // tempTpl = _.merge({}, this.deviceCttDefault, this.tpl.origin); //
} }

4
ruoyi-ui/src/views/JiHeExpressway/components/infoBoard/BoardPreview.vue

@ -40,7 +40,7 @@ export default {
}, },
tpl:{ tpl:{
handler(newV){ handler(newV){
this.contentArr = this.tpl.textContent.replaceAll(/\\\\n/g, '\n').replaceAll(/ /g, '&nbsp').split('\n'); this.contentArr = this.tpl.textContent.replaceAll(/\\\\n/g, '\n').replaceAll(/\\=/g, '=').replaceAll(/\\,/g, ',').replaceAll(/ /g, '&nbsp').split('\n');
this.setStyle(); this.setStyle();
}, },
deep:true, deep:true,
@ -113,6 +113,8 @@ export default {
color: #f00; color: #f00;
line-height: 1; line-height: 1;
margin-bottom: 0; margin-bottom: 0;
word-break: keep-all;
white-space: nowrap;
} }
} }
} }

2
ruoyi-ui/src/views/JiHeExpressway/components/infoBoard/BoardTplPreview.vue

@ -110,6 +110,8 @@ export default {
color: #f00; color: #f00;
line-height: 1; line-height: 1;
margin-bottom: 0; margin-bottom: 0;
word-break: keep-all;
white-space: nowrap;
} }
} }
} }

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

@ -11,13 +11,14 @@ export default{
// 新增待下发 // 新增待下发
____onAddDeviceItem() { ____onAddDeviceItem() {
let arr = this.selectedSize.split("*"); let arr = this.selectedSize.split("*");
this.editDialog = { this.editDialog = {
visible: true, visible: true,
mode: "add", mode: "add",
type: "device", type: "device",
tpl: { tpl: {
"textContent": "", "textContent": "",
origin: { "origin": {
displayAreaWidth: +arr[0], displayAreaWidth: +arr[0],
displayAreaHeight: +arr[1] displayAreaHeight: +arr[1]
} }

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

@ -2,42 +2,56 @@
<Dialog v-model="obverseVisible" title="疲劳唤醒弹窗"> <Dialog v-model="obverseVisible" title="疲劳唤醒弹窗">
<div class="FatigueWakesUp"> <div class="FatigueWakesUp">
<Video class="video-stream" :pileNum="dialogData.stakeMark" /> <Video class="video-stream" :pileNum="dialogData.stakeMark" />
<ElTabs v-model="activeName" @tab-click="handleClickTabs" class="tabs">
<Descriptions labelWidth="72px" :list="list" :data="data" style="gap: 18px" /> <ElTabPane label="基本信息" name="first">
<Descriptions
labelWidth="72px"
:list="list"
:data="data"
style="gap: 18px"
/>
</ElTabPane>
<ElTabPane label="设备参数" name="second">设备参数</ElTabPane>
<ElTabPane label="在线率统计" name="third">在线率统计</ElTabPane>
</ElTabs>
</div> </div>
<template #footer> <template #footer>
<Button @click.native="deviceControlVisible = true">设备操作</Button> <Button @click.native="deviceControlVisible = true">设备操作</Button>
</template> </template>
<DeviceControlDialog v-model="deviceControlVisible" :deviceId="dialogData.iotDeviceId" /> <DeviceControlDialog
v-model="deviceControlVisible"
:deviceId="dialogData.iotDeviceId"
/>
</Dialog> </Dialog>
</template> </template>
<script> <script>
import Dialog from "@screen/components/Dialog/index.vue"; import Dialog from "@screen/components/Dialog/index.vue";
import Descriptions from '@screen/components/Descriptions.vue'; import Descriptions from "@screen/components/Descriptions.vue";
import Button from "@screen/components/Buttons/Button.vue" import Button from "@screen/components/Buttons/Button.vue";
// import { getRoadInfoByStakeMark, getProduct } from "@screen/pages/Home/components/RoadAndEvents/utils/httpList.js" // import { getRoadInfoByStakeMark, getProduct } from "@screen/pages/Home/components/RoadAndEvents/utils/httpList.js"
import Video from "@screen/components/Video" import Video from "@screen/components/Video";
import DeviceControlDialog from "./components/DeviceControlDialog.vue" import DeviceControlDialog from "./components/DeviceControlDialog.vue";
import request from "@/utils/request"; import request from "@/utils/request";
import { dialogDelayVisible } from "./../mixin" import { dialogDelayVisible } from "./../mixin";
// //
export default { export default {
name: 'FatigueWakesUp', name: "FatigueWakesUp",
mixins: [dialogDelayVisible], mixins: [dialogDelayVisible],
components: { components: {
Dialog, Dialog,
Descriptions, Descriptions,
Video, Video,
DeviceControlDialog, DeviceControlDialog,
Button Button,
}, },
data() { data() {
return { return {
activeName: "first",
deviceControlVisible: false, deviceControlVisible: false,
data: { data: {
deviceType: "行车诱导", deviceType: "行车诱导",
@ -49,52 +63,52 @@ export default {
}, },
list: [ list: [
{ {
label: '设备名称', label: "设备名称",
key: "deviceName", key: "deviceName",
}, },
{ {
label: '设备桩号', label: "设备桩号",
key: "stakeMark", key: "stakeMark",
}, },
{ {
label: '道路名称', label: "道路名称",
key: "roadName", key: "roadName",
}, },
{ {
label: '设备方向', label: "设备方向",
key: "direction", key: "direction",
enum: "CameraDirectionEnum" enum: "CameraDirectionEnum",
}, },
{ {
label: '设备状态', label: "设备状态",
key: "deviceState", key: "deviceState",
enum: "DeviceTypeEnum" enum: "DeviceTypeEnum",
}, },
{ {
label: '设备厂商', label: "设备厂商",
key: "brand", key: "brand",
}, },
] ],
} };
}, },
async created() { async created() {
this.data = { ...this.dialogData }; this.data = { ...this.dialogData };
getProduct(this.dialogData.productId) getProduct(this.dialogData.productId).then((data) => {
.then(data => {
this.dialogData.brand = data.brand; this.dialogData.brand = data.brand;
}) });
const roadInfo = await getRoadInfoByStakeMark(this.dialogData.stakeMark); const roadInfo = await getRoadInfoByStakeMark(this.dialogData.stakeMark);
if (roadInfo) this.data.roadName = roadInfo.roadName; if (roadInfo) this.data.roadName = roadInfo.roadName;
}, },
methods: { methods: {
} handleClickTabs() {},
} },
};
</script> </script>
<style lang='scss' scoped> <style lang="scss" scoped>
.FatigueWakesUp { .FatigueWakesUp {
width: 420px; width: 420px;
color: #fff; color: #fff;
@ -130,7 +144,7 @@ export default {
align-items: center; align-items: center;
justify-content: end; justify-content: end;
>div { > div {
font-size: 16px; font-size: 16px;
padding: 6px 12px; padding: 6px 12px;
} }

4
ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/Dialogs/SmartDevice/components/DeviceParams.vue

@ -129,8 +129,8 @@ export default {
methods: { methods: {
async handleSwitcherChange(value, data) { async handleSwitcherChange(value, data) {
data.state = value; data.state = value;
let op = ["关闭", "开启"][+data.state];
const isContinue = await confirm({ message: "是否要删除该辖段信息?" }) const isContinue = await confirm({ message: `${op}该支路?` })
.catch(() => { .catch(() => {
data.state = !value; data.state = !value;
}); });

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

@ -132,7 +132,7 @@ export default {
if (code != 200) return; if (code != 200) return;
this.data = { ...data, ...this.data }; this.data = { ...data, ...this.data };
console.log(data); console.log('trafficIncidents',data);
}) })
.catch((err) => {}); .catch((err) => {});
}, },

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

@ -1,24 +1,38 @@
<template> <template>
<div class='HomeFilter'> <div class="HomeFilter">
<ElPopover trigger="manual" :value="activeIcon === 'filter'" :visibleArrow="false" placement="left" <ElPopover
popper-class="global-input-search-popover"> trigger="manual"
<Button :class="['btn', { 'btn-active': activeIcon }]" slot="reference" @click.native="handleClick('filter')"> :value="activeIcon === 'filter'"
<img src="@screen/images/home-filter/filter.svg"> :visibleArrow="false"
placement="left"
popper-class="global-input-search-popover"
>
<Button
:class="['btn', { 'btn-active': activeIcon }]"
slot="reference"
@click.native="handleClick('filter')"
>
<img src="@screen/images/home-filter/filter.svg" />
</Button> </Button>
<div class="body"> <div class="body">
<div class="title"> <div class="title">设备筛选</div>
设备筛选 <Form
</div> labelWidth="90px"
<Form labelWidth="90px" column="1" class="form" ref="FormConfigRef" :formList="formList" /> column="1"
class="form"
ref="FormConfigRef"
:formList="formList"
/>
<div class="footer"> <div class="footer">
<Button style="background-color: rgba(0, 179, 204, .3);" @click.native="handleResetForm"> <Button
style="background-color: rgba(0, 179, 204, 0.3)"
@click.native="handleResetForm"
>
重置 重置
</Button> </Button>
<Button @click.native="handleSearch"> <Button @click.native="handleSearch"> 搜索 </Button>
搜索
</Button>
</div> </div>
</div> </div>
</ElPopover> </ElPopover>
@ -26,17 +40,18 @@
</template> </template>
<script> <script>
import Button from '@screen/components/Buttons/Button.vue'; import Button from "@screen/components/Buttons/Button.vue";
import Form from '@screen/components/FormConfig'; import Form from "@screen/components/FormConfig";
import * as PresetFormItems from "@screen/common/PresetFormItems.js"; import * as PresetFormItems from "@screen/common/PresetFormItems.js";
import { merge, cloneDeep } from "lodash" import { merge, cloneDeep } from "lodash";
import request from "@/utils/request"; import request from "@/utils/request";
import { log } from "mathjs";
export default { export default {
name: 'HomeFilter', name: "HomeFilter",
components: { components: {
Button, Button,
Form Form,
}, },
data() { data() {
return { return {
@ -49,7 +64,7 @@ export default {
key: "deviceType", key: "deviceType",
type: "select", type: "select",
options: { options: {
options: [] options: [],
}, },
// visible: data => { // visible: data => {
// if (data.searchType == 1) { // if (data.searchType == 1) {
@ -57,29 +72,32 @@ export default {
// } // }
// }, // },
}, },
] ],
} };
}, },
methods: { methods: {
handleClick(type) { handleClick(type) {
console.log("type: ", type);
this.activeIcon = this.activeIcon === type ? null : type; this.activeIcon = this.activeIcon === type ? null : type;
console.log("this.activeIcon", this.activeIcon);
}, },
filterEnd(data) { filterEnd(data) {
this.activeIcon = null;
// this.filterData = data;
this.$parent.$refs.RoadAndEventsRef?.setFilterData?.(data); this.$parent.$refs.RoadAndEventsRef?.setFilterData?.(data);
}, },
async handleResetForm() { async handleResetForm() {
this.$refs.FormConfigRef?.reset(); this.$refs.FormConfigRef?.reset();
this.filterEnd(null) this.activeIcon = "filter";
this.filterEnd(null);
}, },
async handleSearch() { async handleSearch() {
const data = await this.$refs.FormConfigRef.validate(); const data = await this.$refs.FormConfigRef.validate();
if (!data.startStakeMark[0] || !data.startStakeMark[1]) delete data.startStakeMark; if (!data.startStakeMark[0] || !data.startStakeMark[1])
if (!data.endStakeMark[0] || !data.endStakeMark[1]) delete data.endStakeMark; delete data.startStakeMark;
if (!data.endStakeMark[0] || !data.endStakeMark[1])
this.filterEnd(data) delete data.endStakeMark;
this.activeIcon = null;
this.filterEnd(data);
}, },
async getDeviceTypeOptions() { async getDeviceTypeOptions() {
// try { // try {
@ -90,15 +108,15 @@ export default {
// }); // });
// } catch (e) { console.error(e); } // } catch (e) { console.error(e); }
// return ; // return ;
} },
}, },
async created() { async created() {
// await this.getDeviceTypeOptions(); // await this.getDeviceTypeOptions();
} },
} };
</script> </script>
<style lang='scss'> <style lang="scss">
div.el-popper.global-input-search-popover { div.el-popper.global-input-search-popover {
background: rgba(6, 66, 88, 0.8); background: rgba(6, 66, 88, 0.8);
border: 1px solid rgba(42, 217, 253, 0.6); border: 1px solid rgba(42, 217, 253, 0.6);
@ -108,23 +126,25 @@ div.el-popper.global-input-search-popover {
.body { .body {
.title { .title {
background: linear-gradient(90deg, #237E9B 0%, rgba(23, 145, 184, 0) 100%); background: linear-gradient(
90deg,
#237e9b 0%,
rgba(23, 145, 184, 0) 100%
);
padding: 3px 9px; padding: 3px 9px;
position: absolute; position: absolute;
top: 0; top: 0;
left: 0; left: 0;
width: 100%; width: 100%;
} }
} }
} }
</style> </style>
<style lang='scss' scoped> <style lang="scss" scoped>
.HomeFilter { .HomeFilter {
.btn { .btn {
padding: 9px; padding: 9px;
background: linear-gradient(180deg, #152E3C 0%, #163A45 100%); background: linear-gradient(180deg, #152e3c 0%, #163a45 100%);
border-radius: 4px; border-radius: 4px;
overflow: hidden; overflow: hidden;
height: unset; height: unset;
@ -132,7 +152,7 @@ div.el-popper.global-input-search-popover {
} }
.btn-active { .btn-active {
background: linear-gradient(180deg, #005C79 0%, #009BCC 100%); background: linear-gradient(180deg, #005c79 0%, #009bcc 100%);
} }
} }
</style> </style>

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

@ -230,7 +230,7 @@ export const eventMap = {
iconClass: "el-icon-loading", iconClass: "el-icon-loading",
}); });
} }
const data = await getPerceiveEventList() const data = await getPerceiveEventList({warningState: 1})
.then(async (data) => { .then(async (data) => {
await delay(600); await delay(600);
return data; return data;

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

@ -297,12 +297,12 @@ export function getEventTopicList(eventType) {
* 感知事件根据类型获取 * 感知事件根据类型获取
* @param {number} eventType * @param {number} eventType
*/ */
export function getPerceiveEventList() { export function getPerceiveEventList(data = {}) {
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
request({ request({
url: `/perceivedEvents/warning/perceivedEventsList`, url: `/perceivedEvents/warning/perceivedEventsList`,
method: "POST", method: "POST",
data: {}, data: {...data},
}) })
.then(({ code, rows }) => { .then(({ code, rows }) => {
if (code != 200) { if (code != 200) {

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

@ -1,6 +1,9 @@
<template> <template>
<div class='Home'> <div class="Home">
<AMapContainer ref="AMapContainerRef" @update:isGisCompleted="(data) => { this.isGisCompleted = data; }" /> <AMapContainer ref="AMapContainerRef" @update:isGisCompleted="(data) => {
this.isGisCompleted = data;
}
" />
<section class="content"> <section class="content">
<!-- 左侧 --> <!-- 左侧 -->
<div class="content-l"> <div class="content-l">
@ -25,7 +28,7 @@
<footer class="footer card-menu"> <footer class="footer card-menu">
<div class="footer-title"> <div class="footer-title">
<span>济菏高速缩略图</span> <span>济菏高速缩略图</span>
<i class="el-icon-s-fold" style="color: #2AD9FD; transform: rotate(-90deg);" @click.stop="handleShrink" /> <i class="el-icon-s-fold" style="color: #2ad9fd; transform: rotate(-90deg)" @click.stop="handleShrink" />
</div> </div>
<div class="footer-content"> <div class="footer-content">
<Thumbnail /> <Thumbnail />
@ -48,7 +51,7 @@ import Button from '@screen/components/Buttons/Button.vue';
// import InfoBoard from "./components/InfoBoard" // import InfoBoard from "./components/InfoBoard"
export default { export default {
name: 'Home', name: "Home",
components: { components: {
FocusedMonitoring, FocusedMonitoring,
ConditionStatistics, ConditionStatistics,
@ -66,34 +69,37 @@ export default {
isShowInfoBoard: false, isShowInfoBoard: false,
selectedDevice: null, selectedDevice: null,
isGisCompleted: false, isGisCompleted: false,
} };
}, },
provide() { provide() {
return { return {
getMap: () => this.$refs.AMapContainerRef.getMapInstance() getMap: () => this.$refs.AMapContainerRef.getMapInstance(),
} };
}, },
methods: { methods: {
handleShrink(e) { handleShrink(e) {
const translateXElement = e.target.parentElement.parentElement; const translateXElement = e.target.parentElement.parentElement;
const result = (e.target.style.transform.match(/[-0-9]+/)?.[0] || -90) * -1 const result =
(e.target.style.transform.match(/[-0-9]+/)?.[0] || -90) * -1;
e.target.style.transform = `rotate(${result}deg)`; e.target.style.transform = `rotate(${result}deg)`;
if (translateXElement.style.transform !== `translateY(calc(100% - 36px))`) { if (
translateXElement.style.transform = `translateY(calc(100% - 36px))` translateXElement.style.transform !== `translateY(calc(100% - 36px))`
) {
translateXElement.style.transform = `translateY(calc(100% - 36px))`;
translateXElement.style.position = `absolute`; translateXElement.style.position = `absolute`;
translateXElement.style.bottom = `0px`; translateXElement.style.bottom = `0px`;
} else { } else {
translateXElement.style.transform = `translateY(0)` translateXElement.style.transform = `translateY(0)`;
translateXElement.style.position = `relative`; translateXElement.style.position = `relative`;
} }
} },
} },
} };
</script> </script>
<style lang='scss' scoped> <style lang="scss" scoped>
.Home { .Home {
height: 100%; height: 100%;
z-index: 6; z-index: 6;
@ -104,7 +110,7 @@ export default {
justify-content: center; justify-content: center;
.card-menu { .card-menu {
transition: all .24s linear; transition: all 0.24s linear;
} }
.content { .content {
@ -202,7 +208,7 @@ export default {
} }
i { i {
transition: all .24s linear; transition: all 0.24s linear;
cursor: pointer; cursor: pointer;
} }

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

@ -39,9 +39,9 @@
</div> </div>
<template #footer> <template #footer>
<Button style="padding: 0 24px;" @click.native="submitTable">确认</Button>
<Button :style="{ backgroundColor: '#C9C9C9', padding: '0 24px' }" @click.native="modelVisible = false"> <Button :style="{ backgroundColor: '#C9C9C9', padding: '0 24px' }" @click.native="modelVisible = false">
取消</Button> 取消</Button>
<Button style="padding: 0 24px;" @click.native="submitTable">确认</Button>
</template> </template>
</Dialog> </Dialog>
</template> </template>
@ -235,7 +235,8 @@ export default {
display: flex; display: flex;
gap: 9px; gap: 9px;
width: 836px; width: 836px;
height: 768px; // height: 768px;
min-height: 500px;
margin-top: 20px; margin-top: 20px;
flex-direction: column; flex-direction: column;

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

@ -47,9 +47,9 @@
</div> </div>
<template #footer> <template #footer>
<Button style="padding: 0 24px;" @click.native="submitTable">确认</Button>
<Button :style="{ backgroundColor: '#C9C9C9', padding: '0 24px' }" @click.native="modelVisible = false"> <Button :style="{ backgroundColor: '#C9C9C9', padding: '0 24px' }" @click.native="modelVisible = false">
取消</Button> 取消</Button>
<Button style="padding: 0 24px;" @click.native="submitTable">确认</Button>
</template> </template>
</Dialog> </Dialog>
</template> </template>
@ -276,7 +276,8 @@ export default {
display: flex; display: flex;
gap: 9px; gap: 9px;
width: 836px; width: 836px;
height: 768px; min-height: 500px;
// height: 768px;
flex-direction: column; flex-direction: column;
.video-pic { .video-pic {

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

@ -8,13 +8,13 @@
<Transition name="fade"> <Transition name="fade">
<Form class="form" ref="FormConfigRef" :formList="formConfig.list" v-bind="getFormOptions" labelWidth="120px" /> <Form class="form" ref="FormConfigRef" :formList="formConfig.list" v-bind="getFormOptions" labelWidth="120px" />
</Transition> </Transition>
</div>
<div class="footer"> <template #footer>
<Button style="padding:0 24px;" @click.native="handleSubmit" :loading="submitting">保存</Button>
<Button style="background: #C9C9C9;padding:0 24px;" <Button style="background: #C9C9C9;padding:0 24px;"
@click.native="modelVisible = false, submitting = false">取消</Button> @click.native="modelVisible = false, submitting = false">取消</Button>
</div> <Button style="padding:0 24px;" @click.native="handleSubmit" :loading="submitting">保存</Button>
</div> </template>
</Dialog> </Dialog>
</template> </template>
@ -195,7 +195,7 @@ export default {
Message.error("提交失败"); Message.error("提交失败");
}).finally(() => { }).finally(() => {
this.submitting = false; this.submitting = false;
this.$emit('queryData',true); this.$emit('queryData', true);
}) })
}) })
@ -219,7 +219,7 @@ export default {
.EventDetailDialog { .EventDetailDialog {
gap: 9px; gap: 9px;
width: 1050px; width: 1050px;
height: 810px; // height: 810px;
display: flex; display: flex;
flex-direction: column; flex-direction: column;

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

@ -359,8 +359,8 @@ export default {
data.visibility = otherConfig.visibility; data.visibility = otherConfig.visibility;
data.pictures = otherConfig.pictures || []; data.pictures = otherConfig.pictures || [];
// data.videoList = otherConfig.videoList || [] data.videoList = otherConfig.videoList || []
data.videoList = otherConfig.videoList || ['https://sf1-cdn-tos.huoshanstatic.com/obj/media-fe/xgplayer_doc_video/mp4/xgplayer-demo-480p.mp4'] // data.videoList = otherConfig.videoList || ['https://sf1-cdn-tos.huoshanstatic.com/obj/media-fe/xgplayer_doc_video/mp4/xgplayer-demo-480p.mp4']
} }
this.detailDialogFormData = data; this.detailDialogFormData = data;
@ -377,7 +377,7 @@ export default {
let data = result.data; let data = result.data;
data.stringDirection = gzDirectionMapping[data.direction] || data.direction; data.stringDirection = gzDirectionMapping[data.direction] || data.direction;
data.videoList = ['https://sf1-cdn-tos.huoshanstatic.com/obj/media-fe/xgplayer_doc_video/mp4/xgplayer-demo-480p.mp4']; data.videoList = [];
if (data.otherConfig) { if (data.otherConfig) {
let otherConfig = JSON.parse(data.otherConfig); let otherConfig = JSON.parse(data.otherConfig);
// data.pictures = otherConfig.pictures || []; // data.pictures = otherConfig.pictures || [];

5
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/governanceAnalysis/components/auditAnalytics/StatsDialogVisible/index.vue

@ -1,5 +1,6 @@
<template> <template>
<Dialog v-model="modelVisible" title="收费站管制统计" style="width: 100%"> <Dialog v-model="modelVisible" title="收费站管制统计" style="width: 100%">
{{ modelVisible }}
<div class="search"> <div class="search">
<InputSearch <InputSearch
:formList="searchFormList" :formList="searchFormList"
@ -379,9 +380,7 @@ export default {
}); });
this.searchFormList[2].options.options = dataList; this.searchFormList[2].options.options = dataList;
this.facilityIds = res[0].value.data.map((item) => item.id); this.facilityIds = res[0].value.data.map((item) => item.id);
this.searchFormList[2].default = res[0].value.data.map( this.searchFormList[2].default = dataList.map((item) => item.key);
(item) => item.id
);
console.log(56, this.searchFormList[2].default); console.log(56, this.searchFormList[2].default);
let currentMonth = moment().format("YYYY-MM"); let currentMonth = moment().format("YYYY-MM");
let currentDate = moment().format("YYYY-MM-DD"); let currentDate = moment().format("YYYY-MM-DD");

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

@ -29,6 +29,10 @@ export const searchFormList = [
key: "time", key: "time",
required: true, required: true,
type: "datePicker", type: "datePicker",
default: [
moment().startOf("month").format("YYYY-MM-DD HH:mm:ss"),
moment().format("YYYY-MM-DD HH:mm:ss"),
],
options: { options: {
format: "yyyy-MM-dd", format: "yyyy-MM-dd",
type: "daterange", type: "daterange",
@ -39,6 +43,7 @@ export const searchFormList = [
key: "type", key: "type",
required: true, required: true,
type: "select", type: "select",
default: "1",
options: { options: {
options: [ options: [
{ {

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

@ -202,8 +202,7 @@ export default {
initData() { initData() {
this.startTime = moment().startOf("month").format("YYYY-MM-DD HH:mm:ss"); this.startTime = moment().startOf("month").format("YYYY-MM-DD HH:mm:ss");
this.time = moment().format("YYYY-MM-DD HH:mm:ss"); this.time = moment().format("YYYY-MM-DD HH:mm:ss");
this.typeQuery = searchFormList[1].options.options[0].value; this.typeQuery = this.searchFormList[1].options.options[0].value;
console.log(8888, this.startTime, this.time, this.typeQuery);
clearInterval(this.interval); clearInterval(this.interval);
if (this.activeName == "first") { if (this.activeName == "first") {
this.initDevice(); this.initDevice();
@ -247,8 +246,8 @@ export default {
handleSearch(data) { handleSearch(data) {
console.log(777, data); console.log(777, data);
this.typeQuery = data.type; this.typeQuery = data.type;
this.startTime = this.formatDate(data.time[0]); this.startTime = moment(data.time[0]).format("YYYY-MM-DD HH:mm:ss");
this.time = this.formatDate(data.time[1]); this.time = moment(data.time[1]).format("YYYY-MM-DD HH:mm:ss");
let typeText = let typeText =
this.searchFormList[1].options.options[this.typeQuery - 1].label; this.searchFormList[1].options.options[this.typeQuery - 1].label;
this.searchText = `${moment(this.startTime).format( this.searchText = `${moment(this.startTime).format(
@ -259,7 +258,6 @@ export default {
}, },
changeTabs() { changeTabs() {
this.initData(); this.initData();
console.log("======================", this.queryChart);
this.$nextTick(() => { this.$nextTick(() => {
this.queryChart.resize(); this.queryChart.resize();
}); });
@ -414,8 +412,9 @@ export default {
}); });
}, },
}, },
mounted() { async mounted() {
this.initData(); console.log("__________________", searchFormList[0].default);
await this.initData();
}, },
}; };
</script> </script>

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

@ -1,7 +1,8 @@
<template> <template>
<div class="congestion"> <div class="congestion">
<div class="board"> <div class="board">
<ProgressBar class="keep-ratio" @selectItem="selectProgress" :dataList="dataList" :selectIndex="selectIndex" /> <ProgressBar class="keep-ratio" @selectItem="selectProgress" :dataList="dataList" :selectIndex="selectIndex"
:reset="reset" />
<div class="searchPanel"> <div class="searchPanel">
<RadioGroup :options="[ <RadioGroup :options="[
{ key: '1', label: '菏泽' }, { key: '1', label: '菏泽' },
@ -26,7 +27,8 @@
: '' : ''
" placeholder="请选择" :clearable="false" /> " placeholder="请选择" :clearable="false" />
<el-button type="primary" size="mini" class="btnSearch" @click="searchQuery" icon="el-icon-search">查询</el-button> <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-button class="btnReset" size="mini" icon="el-icon-refresh-left" @click="onReset">重置</el-button>
</div> </div>
</div> </div>
@ -149,8 +151,9 @@ export default {
dateTime: "2024", dateTime: "2024",
direction: "1", direction: "1",
dataList: [], dataList: [],
selectIndex: 2, selectIndex: 1,
selectId: 2, selectId: 1,
reset: false,
type: "year", type: "year",
chart1List: [], chart1List: [],
chart2List: [], chart2List: [],
@ -206,16 +209,17 @@ export default {
selectProgress(item, index) { selectProgress(item, index) {
this.selectIndex = index; this.selectIndex = index;
this.selectId = item.id; this.selectId = item.id;
this.reset = false;
this.searchQuery(); this.searchQuery();
}, },
onReset() { onReset() {
this.direction = "1"; this.direction = "1";
this.type = "year"; this.type = "year";
this.dateTime = "2024"; this.dateTime = "2024";
this.selectId = this.dataList[0].id; this.selectId = 1;
this.selectId = 2; this.selectIndex = 1;
this.selectIndex = 2; this.reset = true;
this.searchQuery() this.searchQuery();
}, },
searchQuery() { searchQuery() {
let startTime = ""; let startTime = "";

15
ruoyi-ui/src/views/JiHeExpressway/pages/perception/eventDetection/components/eventQuery/progressBar.vue

@ -36,6 +36,10 @@ export default {
selectIndex: { selectIndex: {
type: Number, type: Number,
default: 1 default: 1
},
reset: {
type: Boolean,
default: false
} }
}, },
data() { data() {
@ -46,6 +50,16 @@ export default {
}, },
created() { created() {
},
watch: {
reset: {
handler(newV) {
if (newV) {
this.selectLine = -1;
}
},
immediate: true,
},
}, },
methods: { methods: {
selectItem(index, num, item) { selectItem(index, num, item) {
@ -205,4 +219,3 @@ export default {
} }
} }
</style> </style>

171
ruoyi-ui/src/views/JiHeExpressway/pages/perception/meteorologyCheck/components/roadNetwork/index.vue

@ -1,99 +1,111 @@
<template> <template>
<div class='congestion'> <div class="congestion">
<WgtTitle :title="'路网交通状况'"></WgtTitle> <WgtTitle :title="'路网交通状况'"></WgtTitle>
<div class="board"> <div class="board">
<div class="showRoad" > <div class="showRoad">
<div :class="it.type?it.type+' item':'item'" v-for="(it,index) in dataList" > <div
<div class="text" >{{ it.text }}</div> :class="it.type ? it.type + ' item' : 'item'"
<div v-if="it.type == null || it.type == 'red'" class="num" > v-for="(it, index) in dataList"
>
<div class="text">{{ it.text }}</div>
<div v-if="it.type == null || it.type == 'red'" class="num">
<span>{{ it.value }}</span> <span>{{ it.value }}</span>
<span class="typeClass" >{{ it.class }}</span> <span class="typeClass">{{ it.class }}</span>
</div> </div>
<div v-if="it.type == 'array' || it.type == 'arrayRed'" class="num" > <div v-if="it.type == 'array' || it.type == 'arrayRed'" class="num">
<span>{{ it.value[0] }}</span> <span>{{ it.value[0] }}</span>
<span class="typeClass" >{{ it.class[0] }}</span> <span class="typeClass">{{ it.class[0] }}</span>
<span class="midd" style="color:#fff;font-weight: 800; margin-right:2px;">/</span> <span
class="midd"
style="color: #fff; font-weight: 800; margin-right: 2px"
>/</span
>
<span>{{ it.value[1] }}</span> <span>{{ it.value[1] }}</span>
<span class="typeClass" >{{ it.class[1] }}</span> <span class="typeClass">{{ it.class[1] }}</span>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</template> </template>
<script> <script>
import WgtTitle from "../../../widgets/title";
import { getQueryTheNumberOfMeteorologicalWarning } from "@/api/perception/meteorologyCheck";
import WgtTitle from '../../../widgets/title' export default {
name: "MonthStatistics",
export default {
name: 'MonthStatistics',
components: { components: {
WgtTitle WgtTitle,
}, },
data() { data() {
return { return {
dataList:[ dataList: [
{ {
text:"气象正常路段里程", text: "气象正常路段里程",
value:"189", value: "189",
class:"km" class: "km",
}, },
{ {
text:"降水路段里程", text: "降水路段里程",
value:"0", value: "0",
class:"km" class: "km",
}, },
{ {
text:"团雾路段里程", text: "团雾路段里程",
type:"array", type: "array",
value:["0",'0'], value: ["0", "0"],
class:['处',"km"] class: ["处", "km"],
}, },
{ {
text:"气象预警信息", text: "气象预警信息",
type:"red", type: "red",
value:"0", value: "0",
class:"" class: "",
}, },
{ {
text:"能见度检测器", text: "能见度检测器",
type:"arrayRed", type: "arrayRed",
value:["0",'5'], value: ["0", "5"],
class:['',""] class: ["", ""],
}
]
}
}, },
],
created() { };
}, },
methods: {
created() {},
methods: {
getWeatherNum() {
getQueryTheNumberOfMeteorologicalWarning().then((res) => {
this.dataList[3].value = res.data;
console.log("res", res);
});
},
}, },
mounted() { mounted() {
setTimeout(() => { this.getWeatherNum();
this.$nextTick(() => { //
});
});
}, },
} };
</script> </script>
<style lang='scss' scoped> <style lang="scss" scoped>
.congestion { .congestion {
width: 100%; width: 100%;
.board{ .board {
height:150px; height: 150px;
width: 100%; width: 100%;
padding: 0px 20px; padding: 0px 20px;
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; border-radius: 5px 5px 5px 5px;
opacity: 1; opacity: 1;
border: 1px solid; 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; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
@ -101,41 +113,41 @@
.showRoad { .showRoad {
display: inline-flex; display: inline-flex;
width:100%; width: 100%;
height:100%; height: 100%;
padding-top:40px; padding-top: 40px;
.item.red { .item.red {
.num { .num {
font-size: 20px; font-size: 20px;
font-family: PangMenZhengDao; font-family: PangMenZhengDao;
font-weight: 400; font-weight: 400;
color: #D9001B; color: #d9001b;
position: relative; position: relative;
left:30px; left: 30px;
} }
} }
.item.arrayRed { .item.arrayRed {
.num span:first-child { .num span:first-child {
color: #D9001B; color: #d9001b;
margin:0px; margin: 0px;
margin-left:20px; margin-left: 20px;
} }
.midd { .midd {
color:#00D1FF !important; color: #00d1ff !important;
} }
.typeClass { .typeClass {
margin:0px; margin: 0px;
} }
} }
.item { .item {
display: inline-flex; display: inline-flex;
width:20%; width: 20%;
height:90px; height: 90px;
flex-direction: column; flex-direction: column;
.text { .text {
@ -143,21 +155,21 @@
font-size: 14px; font-size: 14px;
font-family: PingFang SC, PingFang SC; font-family: PingFang SC, PingFang SC;
font-weight: 500; font-weight: 500;
color: #FFFFFF; color: #ffffff;
} }
.num { .num {
margin-left:8px; margin-left: 8px;
font-size: 20px; font-size: 20px;
font-family: PangMenZhengDao; font-family: PangMenZhengDao;
font-weight: 400; font-weight: 400;
color: #00D1FF; color: #00d1ff;
position: relative; position: relative;
} }
.typeClass { .typeClass {
margin-left:8px; margin-left: 8px;
margin-right:8px; margin-right: 8px;
font-size: 12px; font-size: 12px;
font-family: PingFang SC, PingFang SC; font-family: PingFang SC, PingFang SC;
font-weight: 500; font-weight: 500;
@ -165,13 +177,10 @@
} }
} }
} }
} }
} }
.charts { .charts {
height:180px; height: 180px;
width: 100%; width: 100%;
} }
</style>
</style>

720
ruoyi-ui/src/views/JiHeExpressway/pages/perception/meteorologyCheck/components/sortFaceForecast/index.vue

File diff suppressed because it is too large

235
ruoyi-ui/src/views/JiHeExpressway/pages/perception/meteorologyCheck/components/weatherForecast/index.vue

@ -1,36 +1,36 @@
<template> <template>
<div class='congestion'> <div class="congestion">
<WgtTitle :title="'天气预报'"></WgtTitle> <WgtTitle :title="'天气预报'"></WgtTitle>
<div class="board"> <div class="board">
<div class="showRoad" > <div class="showRoad">
<div class="weaterIcon" > <div class="weaterIcon">
<img src="./assets/weather.png" /> <img src="./assets/weather.png" />
<div > <div>
{{ weaterType }} {{ weaterType }}
</div> </div>
</div> </div>
<div class="weaterNum" > <div class="weaterNum">
<div class="num">{{ weaterNum }}° </div> <div class="num">{{ weaterNum }}°</div>
<div class="maxMin" > <div class="maxMin">
{{ weaterMaxMin }} {{ weaterMaxMin }}
</div> </div>
</div> </div>
<div class="windType" > <div class="windType">
<div class="Warnings" >{{ windWarnings }} </div> <div class="Warnings">{{ windWarnings }}</div>
<div class="windTypeStr" > <div class="windTypeStr">
{{ windType }} {{ windType }}
</div> </div>
</div> </div>
<div class="line" ></div> <div class="line"></div>
<div class="cityType" > <div class="cityType">
<img src="./assets/cityPosition.png" /> <img src="./assets/cityPosition.png" />
<div class="cityText" > <div class="cityText">
{{ city }} {{ city }}
</div> </div>
</div> </div>
<div class="temperature" > <div class="temperature">
<div class="temperItem" v-for="(it,index) in temperatures" > <div class="temperItem" v-for="(it, index) in temperatures">
<div class="text" > <div class="text">
<img src="./assets/polygon.png" /><span>{{ it.text }}</span> <img src="./assets/polygon.png" /><span>{{ it.text }}</span>
</div> </div>
<div class="val"> <div class="val">
@ -41,74 +41,72 @@
</div> </div>
</div> </div>
</div> </div>
</template> </template>
<script> <script>
import WgtTitle from "../../../widgets/title";
import WgtTitle from '../../../widgets/title' export default {
name: "MonthStatistics",
export default {
name: 'MonthStatistics',
components: { components: {
WgtTitle WgtTitle,
}, },
data() { data() {
return { return {
weaterNum:"21", weaterNum: "21",
weaterMaxMin:"12 / 23°", weaterMaxMin: "12 / 23°",
weaterType:"睛转小雨", weaterType: "睛转小雨",
windWarnings:"大风预警", windWarnings: "大风预警",
windType:"东北风三级", windType: "东北风三级",
city:"济南", city: "济南",
temperatures:[ temperatures: [
{ {
text:"体感", text: "体感",
value:"-14℃", value: "-14℃",
}, },
{ {
text:"PM2.5", text: "PM2.5",
value:"90", value: "90",
}, },
{ {
text:"湿度", text: "湿度",
value:"94%", value: "94%",
}, },
{ {
text:"紫外线", text: "紫外线",
value:"3", value: "3",
}
]
}
}, },
],
created() { };
}, },
methods: {
}, created() {},
methods: {},
mounted() { mounted() {
setTimeout(() => { setTimeout(() => {
this.$nextTick(() => { this.$nextTick(() => {});
});
}); });
}, },
} };
</script> </script>
<style lang='scss' scoped> <style lang="scss" scoped>
.congestion { .congestion {
width: 100%; width: 100%;
.board{ .board {
height:150px; height: 150px;
width: 100%; width: 100%;
padding: 0px 20px; padding: 0px 20px;
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; border-radius: 5px 5px 5px 5px;
opacity:1; opacity: 1;
border: 1px solid; 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; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
@ -116,131 +114,131 @@
.showRoad { .showRoad {
display: inline-flex; display: inline-flex;
width:100%; width: 100%;
height:100%; height: 100%;
padding-top:40px; padding-top: 40px;
padding-left:58px; padding-left: 58px;
> div { > div {
display: inline-flex; display: inline-flex;
flex-direction: column; flex-direction: column;
} }
.weaterIcon { .weaterIcon {
display: inline-flex; display: inline-flex;
width:60px; width: 60px;
height:80px; height: 80px;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
margin-right:27px; margin-right: 27px;
>img { > img {
display: inline-flex; display: inline-flex;
width:43px; width: 43px;
height:43px; height: 43px;
} }
>div { > div {
font-size: 12px; font-size: 12px;
font-family: PingFang SC, PingFang SC; font-family: PingFang SC, PingFang SC;
font-weight: 500; font-weight: 500;
color: #FFFFFF; color: #ffffff;
margin-top:10px; margin-top: 10px;
} }
} }
.weaterNum { .weaterNum {
display: inline-flex; display: inline-flex;
width:60px; width: 60px;
height:80px; height: 80px;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
margin-right:27px; margin-right: 27px;
.num { .num {
font-size: 34px; font-size: 34px;
font-family: PingFang SC, PingFang SC; font-family: PingFang SC, PingFang SC;
font-weight: 500; font-weight: 500;
color: #FFFFFF; color: #ffffff;
} }
.maxMin { .maxMin {
font-size: 12px; font-size: 12px;
font-family: PingFang SC, PingFang SC; font-family: PingFang SC, PingFang SC;
font-weight: 500; font-weight: 500;
color: #FFFFFF; color: #ffffff;
margin-top:6px; margin-top: 6px;
} }
} }
.windType{ .windType {
display: inline-flex; display: inline-flex;
width:60px; width: 60px;
height:80px; height: 80px;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
margin-right:27px; margin-right: 27px;
.Warnings { .Warnings {
display: inline-flex; display: inline-flex;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
margin-top:23px; margin-top: 23px;
width: 67px; width: 67px;
height: 18px; height: 18px;
background: rgba(245,80,80,0.4); background: rgba(245, 80, 80, 0.4);
border-radius: 2px 2px 2px 2px; border-radius: 2px 2px 2px 2px;
opacity: 1; opacity: 1;
border: 1px solid #F55050; border: 1px solid #f55050;
font-size: 12px; font-size: 12px;
font-family: Source Han Sans SC, Source Han Sans SC; font-family: Source Han Sans SC, Source Han Sans SC;
font-weight: 400; font-weight: 400;
color: #F55050; color: #f55050;
} }
.windTypeStr { .windTypeStr {
font-size: 12px; font-size: 12px;
font-family: PingFang SC, PingFang SC; font-family: PingFang SC, PingFang SC;
font-weight: 500; font-weight: 500;
color: #FFFFFF; color: #ffffff;
margin-top:13px; margin-top: 13px;
} }
} }
.line { .line {
margin-left:37px; margin-left: 37px;
margin-right:45px; margin-right: 45px;
width: 1px; width: 1px;
height: 86px; height: 86px;
opacity: 1; opacity: 1;
border: 1px solid; border: 1px solid;
border-image: linear-gradient(320deg, rgba(6, 92, 120, 1), rgba(6, 92, 120, 0)) 1 1; border-image: linear-gradient(
320deg,
rgba(6, 92, 120, 1),
rgba(6, 92, 120, 0)
)
1 1;
} }
.cityType { .cityType {
display: inline-flex; display: inline-flex;
width:60px; width: 60px;
height:80px; height: 80px;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
margin-right:27px; margin-right: 27px;
img { img {
width:38px; width: 38px;
height:40px; height: 40px;
} }
.cityText { .cityText {
font-size: 12px; font-size: 12px;
font-family: PingFang SC, PingFang SC; font-family: PingFang SC, PingFang SC;
font-weight: 500; font-weight: 500;
color: #FFFFFF; color: #ffffff;
margin-top: 10px;; margin-top: 10px;
} }
} }
@ -252,14 +250,19 @@
background: transparent; background: transparent;
opacity: 1; opacity: 1;
border: 1px solid; border: 1px solid;
border-image: linear-gradient(180deg, rgba(1, 37, 48, 0), rgba(1, 149, 196, 1)) 1 1; border-image: linear-gradient(
180deg,
rgba(1, 37, 48, 0),
rgba(1, 149, 196, 1)
)
1 1;
border-radius: 8px; border-radius: 8px;
>div { > div {
display: inline-flex; display: inline-flex;
flex-direction: column; flex-direction: column;
width:25%; width: 25%;
height:100%; height: 100%;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
@ -269,28 +272,26 @@
font-weight: 500; font-weight: 500;
> span { > span {
opacity: 0.5; opacity: 0.5;
margin-left:10px; margin-left: 10px;
} }
} }
.val { .val {
margin-top:10px; margin-top: 10px;
font-size: 14px; font-size: 14px;
font-family: PingFang SC, PingFang SC; font-family: PingFang SC, PingFang SC;
font-weight: 500; font-weight: 500;
color: #FFFFFF; color: #ffffff;
position: relative; position: relative;
left:10px; left: 10px;
}
} }
} }
} }
} }
} }
.charts { }
height:180px; .charts {
height: 180px;
width: 100%; width: 100%;
} }
</style>
</style>

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

@ -6,10 +6,10 @@ var options = {
}, },
color: "#FFD15C", color: "#FFD15C",
grid: { grid: {
left: "2%", left: "0",
right: "5%", right: "0",
bottom: "10%", bottom: "0",
top: "10%", top: "30px",
containLabel: true, containLabel: true,
}, },
legend: { legend: {
@ -72,14 +72,12 @@ var options = {
], ],
}, },
yAxis: { yAxis: {
name: "℃ ",
type: "value", type: "value",
min: 0,
max: 40,
minInterval: 1,
nameTextStyle: { nameTextStyle: {
fontSize: 10, fontSize: 12,
color: "#fff", color: "#fff",
align: "center", align: "right",
}, },
splitLine: { splitLine: {
lineStyle: { lineStyle: {

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

@ -11,10 +11,10 @@ var options = {
// }, // },
}, },
grid: { grid: {
left: "2%", left: "0",
right: "5%", right: "0",
bottom: "10%", bottom: "0",
top: "10%", top: "30px",
containLabel: true, containLabel: true,
}, },
legend: { legend: {
@ -75,15 +75,13 @@ var options = {
], ],
}, },
yAxis: { yAxis: {
name: "M ",
type: "value", type: "value",
min: 0,
max: 40,
minInterval: 5,
splitNumber: 5, splitNumber: 5,
nameTextStyle: { nameTextStyle: {
fontSize: 12, fontSize: 12,
color: "#BDD8FB", color: "#fff",
align: "center", align: "right",
}, },
splitLine: { splitLine: {
lineStyle: { lineStyle: {

299
ruoyi-ui/src/views/JiHeExpressway/pages/perception/meteorologyCheck/components/weatherWarning/components/infoWarning/index.vue

@ -1,149 +1,167 @@
<template> <template>
<div class='congestion'> <div class="congestion">
<WgtTitle :title="'气象预警信息'"></WgtTitle> <WgtTitle :title="'气象预警信息'"></WgtTitle>
<div class="board"> <div class="board">
<div class="weaterMain"> <div class="weaterMain">
<div class="weaterTitle"> <div class="weaterTitle">
<span class="text">当前气象预警信息数</span> <span class="text">当前气象预警信息数</span>
<span class="num">113</span> <span class="num">{{ warningData.length }}</span>
</div> </div>
<div> <div>
<el-select v-model="colorSelect" size="mini" class="selectRoad" placeholder="请选择"> <el-select
<el-option v-for="item in colors" :key="item.value" :label="item.label" :value="item.value"> v-model="colorSelect"
size="mini"
class="selectRoad"
placeholder="请选择"
>
<el-option
v-for="item in colors"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option> </el-option>
</el-select> </el-select>
</div> </div>
</div> </div>
<div class="warningList"> <div class="warningList" v-if="warningList.length > 0">
<div class="itemWarning" v-for="(item, i) in warnings"> <div class="itemWarning" v-for="item in warningList">
<div class="left-w"> <div class="left-w">
<div class="left-row"> <div class="left-row">
<div class="label"> <div class="label">预警类型</div>
预警类型
</div>
<div class="value"> <div class="value">
{{ item.class }} {{ item.typeName }}
</div> </div>
</div> </div>
<div class="left-row"> <div class="left-row">
<div class="label"> <div class="label">预警等级</div>
预警等级 <div :class="item.severityColor">
</div> {{ item.severityColor }}
<div :class="'value ' + item.type"> {{
{{ item.lay }} item.severity == "Cancel"
? "取消"
: item.severity == "None"
? "无"
: item.severity == "Unknown"
? "未知"
: item.severity == "Standard"
? "标准"
: item.severity == "Minor"
? "次要"
: item.severity == "Moderate"
? "温和"
: item.severity == "Major"
? "主要"
: item.severity == "Severe"
? "严峻"
: item.severity == "Extreme"
? "极端"
: ""
}}
</div> </div>
</div> </div>
<div class="left-row"> <!-- <div class="left-row">
<div class="label"> <div class="label">预警范围</div>
预警范围
</div>
<div class="value"> <div class="value">
{{ item.scope }} {{ item.scope }}
</div> </div>
</div> </div> -->
<div class="left-row"> <div class="left-row">
<div class="label"> <div class="label">预警发布时间</div>
预警发布时间
</div>
<div class="value"> <div class="value">
{{ item.dateTime }} {{ item.pubTime }}
</div> </div>
</div> </div>
</div> </div>
<div class="right-w"> <div class="right-w">
<div class="right-row"> <div class="right-row">预警内容:</div>
预警内容:
</div>
<div class="right-text"> <div class="right-text">
{{ item.text }} {{ item.text }}
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<Empty v-else text="暂无数据..."></Empty>
</div> </div>
</div> </div>
</template> </template>
<script> <script>
import { color } from 'echarts'; import { color } from "echarts";
import WgtTitle from '../../../../../widgets/title' import WgtTitle from "../../../../../widgets/title";
import { getMeteorologicalEarlyWarning } from "@/api/perception/meteorologyCheck";
export default { export default {
name: 'infoWarning', name: "infoWarning",
components: { components: {
WgtTitle WgtTitle,
}, },
data() { data() {
return { return {
colorSelect: "org", warningList: [],
warningData: [
// { typeName: "warning", severityColor: "Red", severity: "Severe" },
// { typeName: "warning", severityColor: "White", severity: "" },
// { typeName: "warning", severityColor: "Blue", severity: "" },
],
colorSelect: "all",
colors: [ colors: [
{ label: '全部', value: "all" }, { label: "全部", value: "all" },
{ label: '橙色', value: "org" }, { label: "白色", value: "White" },
{ label: '红色', value: "red" }, { label: "蓝色", value: "Blue" },
{ label: '蓝色', value: "bule" }, { label: "绿色", value: "Green" },
{ label: "黄色", value: "Yellow" },
{ label: "橙色", value: "Orange" },
{ label: "红色", value: "Red" },
{ label: "黑色", value: "Black" },
], ],
warnings: [ };
{
type: "org",
class: "道路结冰",
lay: "橙色",
scope: "K100+000",
dateTime: "2023-12-31 13:00:00",
text: "威海市文登区气象台2023年12月21日7时30分将道路结冰黄色预警信号升级为道路结冰橙色预警信号:受降雪和低温影响,我区全部乡镇和街道仍有对交通有较大影响的道路结冰和积雪。请注意防范道路结冰对交通运输、室外作业、农业生产等带来的不利影响。"
},
{
type: "org",
class: "道路结冰",
lay: "橙色",
scope: "K100+000",
dateTime: "2023-12-31 13:00:00",
text: "威海市文登区气象台2023年12月21日7时30分将道路结冰黄色预警信号升级为道路结冰橙色预警信号:受降雪和低温影响,我区全部乡镇和街道仍有对交通有较大影响的道路结冰和积雪。请注意防范道路结冰对交通运输、室外作业、农业生产等带来的不利影响。"
},
{
type: "org",
class: "道路结冰",
lay: "橙色",
scope: "K100+000",
dateTime: "2023-12-31 13:00:00",
text: "威海市文登区气象台2023年12月21日7时30分将道路结冰黄色预警信号升级为道路结冰橙色预警信号:受降雪和低温影响,我区全部乡镇和街道仍有对交通有较大影响的道路结冰和积雪。请注意防范道路结冰对交通运输、室外作业、农业生产等带来的不利影响。"
}, },
{ watch: {
type: "org", colorSelect(val) {
class: "道路结冰", if (val !== "all") {
lay: "橙色", const data = this.warningData.filter(
scope: "K100+000", (item) => item.severityColor === val
dateTime: "2023-12-31 13:00:00", );
text: "威海市文登区气象台2023年12月21日7时30分将道路结冰黄色预警信号升级为道路结冰橙色预警信号:受降雪和低温影响,我区全部乡镇和街道仍有对交通有较大影响的道路结冰和积雪。请注意防范道路结冰对交通运输、室外作业、农业生产等带来的不利影响。" this.warningList = data;
this.warningList = data;
} else {
this.warningList = this.warningData;
} }
]
}
},
created() {
// this.changeValue(val);
}, },
},
created() {},
methods: { methods: {
selectItem(index) { getWarningData() {
this.selectIndex = index; getMeteorologicalEarlyWarning().then((res) => {
console.log("气象预警", res.data);
let data = [];
for (let key in res.data) {
if (res.data[key].length > 0) {
res.data[key].forEach((value) => {
data.push(value);
});
}
}
this.warningData = data;
this.warningList = this.warningData;
});
}, },
}, },
mounted() { mounted() {
this.getWarningData();
setTimeout(() => {
this.$nextTick(() => {
});
});
}, },
} };
</script> </script>
<style lang='scss' scoped> <style lang="scss" scoped>
.selectRoad { .selectRoad {
width: 89px; width: 89px;
margin-top: 5px; margin-top: 5px;
margin-left: 20px; margin-left: 20px;
border: 1px solid #00B3CC; border: 1px solid #00b3cc;
::v-deep { ::v-deep {
.el-input__inner { .el-input__inner {
@ -179,7 +197,7 @@ export default {
width: 100%; width: 100%;
height: calc(100% - 40px); height: calc(100% - 40px);
>div::after { > div::after {
content: ""; content: "";
top: 0; top: 0;
left: -3px; left: -3px;
@ -192,7 +210,7 @@ export default {
transform: rotate(-45deg); transform: rotate(-45deg);
} }
>div::before { > div::before {
content: ""; content: "";
bottom: 0; bottom: 0;
right: -3px; right: -3px;
@ -205,7 +223,7 @@ export default {
transform: rotate(135deg); transform: rotate(135deg);
} }
>div { > div {
position: relative; position: relative;
display: inline-flex; display: inline-flex;
width: 100%; width: 100%;
@ -214,15 +232,20 @@ export default {
border-radius: 2px 2px 2px 2px; border-radius: 2px 2px 2px 2px;
opacity: 1; opacity: 1;
border: 1px solid; border: 1px solid;
border-image: linear-gradient(360deg, rgba(55, 231, 255, 0.2), rgba(55, 231, 255, 0)) 1 1; border-image: linear-gradient(
360deg,
rgba(55, 231, 255, 0.2),
rgba(55, 231, 255, 0)
)
1 1;
margin-top: 20px; margin-top: 20px;
padding: 23px 29px; padding: 23px 29px;
font-size: 14px; font-size: 14px;
font-family: PingFang SC, PingFang SC; font-family: PingFang SC, PingFang SC;
font-weight: 400; font-weight: 400;
color: #37E7FF; color: #37e7ff;
>.left-w { > .left-w {
display: inline-flex; display: inline-flex;
width: 40%; width: 40%;
height: 100%; height: 100%;
@ -235,7 +258,7 @@ export default {
height: 30px; height: 30px;
flex-direction: row; flex-direction: row;
>.value { > .value {
color: #fff; color: #fff;
} }
@ -244,13 +267,33 @@ export default {
margin-top: 2px; margin-top: 2px;
font-family: PangMenZhengDao; font-family: PangMenZhengDao;
font-weight: 400; font-weight: 400;
color: #F4A125 color: #f4a125;
}
.White {
color: #fff;
}
.Blue {
color: blue;
}
.Green {
color: green;
}
.Yellow {
color: yellow;
}
.Orange {
color: orange;
}
.Red {
color: red;
}
.Black {
color: #000;
} }
} }
} }
>.right-w { > .right-w {
margin-left: 30px; margin-left: 30px;
display: inline-flex; display: inline-flex;
width: 100%; width: 100%;
@ -265,7 +308,6 @@ export default {
color: #fff; color: #fff;
} }
} }
} }
} }
@ -275,13 +317,12 @@ export default {
width: 100%; width: 100%;
height: 40px; height: 40px;
.buttons { .buttons {
width: 100%; width: 100%;
height: 38px; height: 38px;
margin-left: 20px; margin-left: 20px;
>div { > div {
display: inline-flex; display: inline-flex;
width: 10%; width: 10%;
height: 35px; height: 35px;
@ -290,17 +331,21 @@ export default {
font-size: 12px; font-size: 12px;
font-family: PangMenZhengDao; font-family: PangMenZhengDao;
font-weight: 800; font-weight: 800;
color: #FFFFFF; color: #ffffff;
z-index: 9; z-index: 9;
} }
>div::after { > div::after {
content: ""; content: "";
position: absolute; position: absolute;
display: inline-flex; display: inline-flex;
width: 55px; width: 55px;
height: 36px; height: 36px;
background: linear-gradient(180deg, #6557D7 0%, rgba(101, 87, 216, 0) 100%); background: linear-gradient(
180deg,
#6557d7 0%,
rgba(101, 87, 216, 0) 100%
);
border-radius: 50%; border-radius: 50%;
opacity: 1; opacity: 1;
z-index: -1; z-index: -1;
@ -308,19 +353,35 @@ export default {
} }
.redSel::after { .redSel::after {
background: linear-gradient(180deg, #E73A14 0%, rgba(240, 92, 9, 0) 100%); background: linear-gradient(
180deg,
#e73a14 0%,
rgba(240, 92, 9, 0) 100%
);
} }
.yelSel::after { .yelSel::after {
background: linear-gradient(180deg, #FFFA79 0%, rgba(255, 208, 137, 0) 100%); background: linear-gradient(
180deg,
#fffa79 0%,
rgba(255, 208, 137, 0) 100%
);
} }
.bluSel::after { .bluSel::after {
background: linear-gradient(180deg, #121ADE 0%, rgba(40, 18, 228, 0) 100%); background: linear-gradient(
180deg,
#121ade 0%,
rgba(40, 18, 228, 0) 100%
);
} }
.orgSel::after { .orgSel::after {
background: linear-gradient(180deg, #FFA623 0%, rgba(255, 173, 53, 0) 100%); background: linear-gradient(
180deg,
#ffa623 0%,
rgba(255, 173, 53, 0) 100%
);
} }
} }
@ -331,7 +392,12 @@ export default {
left: 0px; left: 0px;
width: 100%; width: 100%;
height: 2px; height: 2px;
background: linear-gradient(90deg, rgba(189, 255, 246, 0) 0%, #BDFFF6 52%, rgba(189, 255, 246, 0) 100%); background: linear-gradient(
90deg,
rgba(189, 255, 246, 0) 0%,
#bdfff6 52%,
rgba(189, 255, 246, 0) 100%
);
border-radius: 0px 0px 0px 0px; border-radius: 0px 0px 0px 0px;
opacity: 1; opacity: 1;
} }
@ -343,7 +409,12 @@ export default {
left: 0px; left: 0px;
width: 100%; width: 100%;
height: 2px; height: 2px;
background: linear-gradient(90deg, rgba(189, 255, 246, 0) 0%, #BDFFF6 52%, rgba(189, 255, 246, 0) 100%); background: linear-gradient(
90deg,
rgba(189, 255, 246, 0) 0%,
#bdfff6 52%,
rgba(189, 255, 246, 0) 100%
);
border-radius: 0px 0px 0px 0px; border-radius: 0px 0px 0px 0px;
opacity: 1; opacity: 1;
} }
@ -353,23 +424,25 @@ export default {
display: inline-flex; display: inline-flex;
width: 287px; width: 287px;
height: 38px; height: 38px;
background: linear-gradient(269deg, rgba(55, 231, 255, 0) 6%, rgba(55, 231, 255, 0.6) 50%, rgba(55, 231, 255, 0) 92%); background: linear-gradient(
269deg,
rgba(55, 231, 255, 0) 6%,
rgba(55, 231, 255, 0.6) 50%,
rgba(55, 231, 255, 0) 92%
);
border-radius: 0px 0px 0px 0px; border-radius: 0px 0px 0px 0px;
opacity: 1; opacity: 1;
justify-content: center; justify-content: center;
align-items: center; align-items: center;
margin-left: 30px; margin-left: 30px;
; > span.text {
>span.text {
display: inline-flex; display: inline-flex;
font-size: 16px; font-size: 16px;
font-family: PingFang SC, PingFang SC; font-family: PingFang SC, PingFang SC;
font-weight: 400; font-weight: 400;
color: #FFFFFF; color: #ffffff;
} }
.num { .num {
display: inline-flex; display: inline-flex;
justify-content: center; justify-content: center;
@ -377,11 +450,10 @@ export default {
font-size: 20px; font-size: 20px;
font-family: PangMenZhengDao; font-family: PangMenZhengDao;
font-weight: 400; font-weight: 400;
color: #D9001B; color: #d9001b;
} }
} }
} }
} }
} }
@ -390,4 +462,3 @@ export default {
width: 100%; width: 100%;
} }
</style> </style>

107
ruoyi-ui/src/views/JiHeExpressway/pages/perception/meteorologyCheck/index.vue

@ -1,13 +1,13 @@
<template> <template>
<div class='TrafficFlow'> <div class="TrafficFlow">
<section class="content"> <section class="content">
<RoadNetwork class="content-l" /> <RoadNetwork class="content-l" />
<WeatherForecast class="content-l" /> <WeatherForecast class="content-l" style="margin-right: 0" />
</section> </section>
<section class="foot"> <section class="foot">
<el-tabs class="footTabs" v-model="activeName" @tab-click="changeTabs"> <el-tabs class="footTabs" v-model="activeName" @tab-click="changeTabs">
<el-tab-pane label="短临预报" name="first"> <el-tab-pane label="短临预报" name="first">
<div class="foot-shot" > <div class="foot-shot">
<SortFaceForecast /> <SortFaceForecast />
</div> </div>
</el-tab-pane> </el-tab-pane>
@ -20,75 +20,72 @@
</el-tabs> </el-tabs>
</section> </section>
</div> </div>
</template> </template>
<script> <script>
import RoadNetwork from './components/roadNetwork'; import RoadNetwork from "./components/roadNetwork";
import WeatherForecast from './components/weatherForecast'; import WeatherForecast from "./components/weatherForecast";
import SortFaceForecast from './components/sortFaceForecast'; import SortFaceForecast from "./components/sortFaceForecast";
import WeatherInfoQuery from './components/weatherInfoQuery'; import WeatherInfoQuery from "./components/weatherInfoQuery";
import WeatherWarning from './components/weatherWarning'; import WeatherWarning from "./components/weatherWarning";
export default { export default {
name: 'MeteorologyCheck', name: "MeteorologyCheck",
components: { components: {
RoadNetwork, RoadNetwork,
WeatherForecast, WeatherForecast,
SortFaceForecast, SortFaceForecast,
WeatherInfoQuery, WeatherInfoQuery,
WeatherWarning WeatherWarning,
}, },
data(){ data() {
return { return {
activeName:"first" activeName: "first",
} };
}, },
methods:{ methods: {
changeTabs(){ changeTabs() {
this.$refs.infoQuery.resizeChart(); this.$refs.infoQuery.resizeChart();
} },
} },
};
} </script>
</script>
<style lang='scss' scoped>
::v-deep .el-tabs__item{ <style lang="scss" scoped>
::v-deep .el-tabs__item {
display: inline-flex; display: inline-flex;
justify-content: center; justify-content: center;
font-size: 16px; font-size: 16px;
font-family: PingFang SC, PingFang SC; font-family: PingFang SC, PingFang SC;
font-weight: 500; font-weight: 500;
color: #FFFFFF; color: #ffffff;
min-width:128px; min-width: 128px;
position: relative; position: relative;
left:10px; left: 10px;
} }
::v-deep .el-tabs__active-bar { ::v-deep .el-tabs__active-bar {
min-width:128px; min-width: 128px;
} }
::v-deep .el-tabs__nav-wrap::after { ::v-deep .el-tabs__nav-wrap::after {
background-color: #133242; background-color: #133242;
opacity: 0.1; opacity: 0.1;
} }
.footTabs { .footTabs {
display: inline; display: inline;
width:99%; width: 100%;
}
}
.TrafficFlow { .TrafficFlow {
width: 100%; width: 100%;
height: 100%; height: 100%;
position: relative; position: relative;
z-index: 6; z-index: 6;
color: white; color: white;
.head{ .head {
width: 98%; width: 98%;
margin: auto; margin: auto;
margin-top: 15px; margin-top: 15px;
@ -100,27 +97,25 @@
flex: 1; flex: 1;
pointer-events: none; pointer-events: none;
margin-top: 19px; margin-top: 19px;
>div { > div {
pointer-events: auto; pointer-events: auto;
} }
.content-l { .content-l {
width: calc(50%); width: calc(50%);
min-width:460px; min-width: 460px;
margin-right:20px; margin-right: 20px;
} }
.content-m { .content-m {
display: inline-flex; display: inline-flex;
flex-direction: column; flex-direction: column;
width: calc(100% / 4 ); width: calc(100% / 4);
margin-right:20px; margin-right: 20px;
.content-m-t { .content-m-t {
width:100%; width: 100%;
height:240px; height: 240px;
margin-bottom: 20px; margin-bottom: 20px;
} }
} }
@ -128,7 +123,7 @@
width: 49.4%; width: 49.4%;
} }
} }
.foot{ .foot {
width: 98%; width: 98%;
margin: auto; margin: auto;
display: flex; display: flex;
@ -136,13 +131,12 @@
flex: 1; flex: 1;
pointer-events: none; pointer-events: none;
margin-top: 8px; margin-top: 8px;
>div { > div {
pointer-events: auto; pointer-events: auto;
} }
.foot-w { .foot-w {
width:100%; width: 100%;
} }
.foot-l { .foot-l {
@ -155,6 +149,5 @@
width: 493px; width: 493px;
} }
} }
} }
</style> </style>

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

@ -9,7 +9,11 @@ var options = {
"" ""
)}<br/>${params[0].marker}${ )}<br/>${params[0].marker}${
params[0].seriesName params[0].seriesName
}: <span style="font-weight:bold;"> ${params[0].value} </span>`; }: <span style="font-weight:bold;"> ${params[0].value} </span><br/>${
params[1].marker
}${params[1].seriesName}: <span style="font-weight:bold;"> ${
params[1].value
} </span>`;
}, },
}, },
axisPointer: { axisPointer: {

39
ruoyi-ui/src/views/JiHeExpressway/pages/perception/trafficFlow/components/flowstate/index.vue

@ -1,47 +1,42 @@
<template> <template>
<div class='flowstate'> <div class="flowstate">
<WgtTitle :title="'全路车流量状况'"></WgtTitle> <WgtTitle :title="'全路车流量状况'"></WgtTitle>
<div class="board"> <div class="board">
<div class="tag1">方向济南</div> <div class="tag1">方向济南</div>
<div class="tag2">方向菏泽</div> <div class="tag2">方向菏泽</div>
<div class="charts keep-ratio " id="flowStateEchartBox"></div> <div class="charts keep-ratio" id="flowStateEchartBox"></div>
</div> </div>
</div> </div>
</template> </template>
<script> <script>
import WgtTitle from "../../../widgets/title";
import WgtTitle from '../../../widgets/title'
import * as echarts from "echarts"; import * as echarts from "echarts";
import chartsStatistics from "./assets/charts"; import chartsStatistics from "./assets/charts";
export default { export default {
name: 'Flowstate', name: "Flowstate",
components: { components: {
WgtTitle WgtTitle,
}, },
data() { data() {
return { return {};
}
}, },
mounted() { mounted() {
setTimeout(() => { setTimeout(() => {
this.$nextTick(() => { this.$nextTick(() => {
var myChart = echarts.init(document.getElementById('flowStateEchartBox')); var myChart = echarts.init(
document.getElementById("flowStateEchartBox")
);
myChart.setOption(chartsStatistics); myChart.setOption(chartsStatistics);
}); });
}); });
}, },
created() { created() {},
methods: {},
}, };
methods: {
}
}
</script> </script>
<style lang='scss' scoped> <style lang="scss" scoped>
.flowstate { .flowstate {
width: 100%; width: 100%;
@ -53,11 +48,15 @@ export default {
border-radius: 5px 5px 5px 5px; border-radius: 5px 5px 5px 5px;
opacity: 1; opacity: 1;
border: 1px solid; border: 1px solid;
border-image: linear-gradient(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; display: flex;
justify-content: space-between; justify-content: space-between;
align-items: center; align-items: center;
} }
.charts { .charts {

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

@ -6,7 +6,6 @@
<!-- 在途车流量车型分类 --> <!-- 在途车流量车型分类 -->
<!-- 全路段拥堵状况 --> <!-- 全路段拥堵状况 -->
<Congestion class="content-l"></Congestion> <Congestion class="content-l"></Congestion>
<!-- 畅通率 --> <!-- 畅通率 -->
<!-- <Unblocked class="content-m" /> --> <!-- <Unblocked class="content-m" /> -->
<!-- 全路车流量状况 --> <!-- 全路车流量状况 -->

5
ruoyi-ui/src/views/JiHeExpressway/pages/perception/trafficSituation/components/IndicatorAnalysis/components/composeFeatures/assets/charts.js

@ -11,6 +11,9 @@ var options = {
tooltip: { tooltip: {
show: true, show: true,
trigger: "axis", trigger: "axis",
valueFormatter: function (value) {
return value + " 指标";
},
}, },
xAxis: { xAxis: {
type: "category", type: "category",
@ -44,7 +47,7 @@ var options = {
}, },
yAxis: { yAxis: {
type: "value", type: "value",
name: '(指标)', name: "(指标)",
nameTextStyle: { nameTextStyle: {
color: "#fff", color: "#fff",
fontSize: 10, fontSize: 10,

5
ruoyi-ui/src/views/JiHeExpressway/pages/perception/trafficSituation/components/IndicatorAnalysis/components/crowding/assets/charts.js

@ -11,6 +11,9 @@ var options = {
tooltip: { tooltip: {
show: true, show: true,
trigger: "axis", trigger: "axis",
valueFormatter: function (value) {
return value + " 指标";
},
}, },
xAxis: { xAxis: {
type: "category", type: "category",
@ -44,7 +47,7 @@ var options = {
}, },
yAxis: { yAxis: {
type: "value", type: "value",
name: '(指标)', name: "(指标)",
nameTextStyle: { nameTextStyle: {
color: "#fff", color: "#fff",
fontSize: 10, fontSize: 10,

5
ruoyi-ui/src/views/JiHeExpressway/pages/perception/trafficSituation/components/IndicatorAnalysis/components/saturationMax/assets/charts.js

@ -4,6 +4,9 @@ var options = {
tooltip: { tooltip: {
show: true, show: true,
trigger: "axis", trigger: "axis",
valueFormatter: function (value) {
return value + " 指标";
},
}, },
grid: { grid: {
left: "2px", left: "2px",
@ -45,7 +48,7 @@ var options = {
}, },
yAxis: { yAxis: {
type: "value", type: "value",
name: '(指标)', name: "(指标)",
nameTextStyle: { nameTextStyle: {
color: "#fff", color: "#fff",
fontSize: 10, fontSize: 10,

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

@ -62,6 +62,9 @@ var options = {
tooltip: { tooltip: {
show: true, show: true,
trigger: "axis", trigger: "axis",
valueFormatter: function (value) {
return value + " 指标";
},
}, },
legend: { legend: {
// orient: 'vertical', // orient: 'vertical',

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

@ -1,14 +1,22 @@
import * as echarts from "echarts"; window.radarData = { 交通特征: 9, 拥挤度: 8, 饱和度: 5 };
let options = { let options = {
legend: { legend: {
show: false, show: false,
}, },
tooltip: {
trigger: "item",
formatter: function (params) {
let data = params.data;
return `<span style="width:60px;display:inline-block">交通特征:</span> <span style="font-weight: bold;"> ${data.value[0]} 指标</span><br><span style="width:60px;display:inline-block">拥挤度: </span><span style="font-weight: bold;"> ${data.value[1]} 指标</span><br><span style="width:60px;display:inline-block">饱和度:</span> <span style="font-weight: bold;"> ${data.value[2]} 指标</span>`;
},
},
radar: [ radar: [
{ {
indicator: [ indicator: [
{ text: "Indicator1" }, { name: "交通特征", max: 10 },
{ text: "Indicator2" }, { name: "拥挤度", max: 10 },
{ text: "Indicator3" }, { name: "饱和度", max: 10 },
], ],
center: ["50%", "55%"], center: ["50%", "55%"],
radius: 70, radius: 70,
@ -16,8 +24,10 @@ let options = {
splitNumber: 4, splitNumber: 4,
shape: "circle", shape: "circle",
axisName: { axisName: {
formatter: "{value}", formatter: function (value) {
color: "#428BD4", return value + " " + (radarData[value] / 10) * 100 + "%";
},
color: "#fff",
}, },
splitArea: { splitArea: {
areaStyle: { areaStyle: {
@ -45,8 +55,8 @@ let options = {
}, },
data: [ data: [
{ {
value: [1, 5, 1], value: [9, 8, 5],
name: "Data B", name: "月指标",
areaStyle: { areaStyle: {
color: { color: {
type: "linear", type: "linear",
@ -56,12 +66,12 @@ let options = {
y2: 1, y2: 1,
colorStops: [ colorStops: [
{ {
offset: 0.1, offset: 0,
color: "#DC6A00", // 0% 处的颜色 color: "#DC6A00", // 0% 处的颜色
}, },
{ {
offset: 0.5, offset: 0.5,
color: "#5D887C", // 100% 处的颜色 color: "#5D887C", // 50% 处的颜色
}, },
{ {
offset: 1, offset: 1,

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

@ -33,87 +33,38 @@
<el-button type="primary" size="mini" class="btnSearch" icon="el-icon-search">查询</el-button> <el-button type="primary" size="mini" class="btnSearch" icon="el-icon-search">查询</el-button>
<el-button class="btnReset" size="mini" icon="el-icon-refresh-left" >重置</el-button> <el-button class="btnReset" size="mini" icon="el-icon-refresh-left" >重置</el-button>
</div> --> </div> -->
<ProgressBar <ProgressBar :dataList="dataList" class="keep-ratio progressbar" :selectIndex="7" />
:dataList="dataList"
class="keep-ratio progressbar"
:selectIndex="7"
/>
<div class="body"> <div class="body">
<div class="body-l"> <div class="body-l">
<div class="searchPanel_1"> <div class="searchPanel_1">
<!-- <el-from ref="form"> --> <!-- <el-from ref="form"> -->
<RadioGroup <RadioGroup :options="[
:options="[
{ key: '1', label: '菏泽' }, { key: '1', label: '菏泽' },
{ key: '3', label: '济南' }, { key: '3', label: '济南' },
]" ]" v-model="direction" type="button" />
v-model="direction" <el-select v-model="type" size="mini" class="selectRoad" placeholder="请选择">
type="button" <el-option v-for="item in typeOptions" :key="item.value" :label="item.label" :value="item.value">
/>
<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-option>
</el-select> </el-select>
<el-select <el-select v-model="quarter" size="medium" v-if="type == '3'" class="selectRoad-medium" placeholder="请选择">
v-model="quarter" <el-option v-for="item in quarterOptions" :key="item.value" :label="item.label" :value="item.value">
size="medium"
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-option> </el-option>
</el-select> </el-select>
<!-- <el-quarter-picker size="mini" class="selectRoad" style="width:180px;" v-if="type == '3'" v-model="dateTime" <!-- <el-quarter-picker size="mini" class="selectRoad" style="width:180px;" v-if="type == '3'" v-model="dateTime"
aria-placeholder="请选季度" /> --> aria-placeholder="请选季度" /> -->
<el-date-picker <el-date-picker size="mini" v-if="type != '3'" class="selectRoad" v-model="dateTime" style="width: 140px"
size="mini" :type="type == 1
v-if="type != '3'"
class="selectRoad"
v-model="dateTime"
style="width: 140px"
:type="
type == 1
? 'date' ? 'date'
: type == 2 : type == 2
? 'month' ? 'month'
: type == 4 : type == 4
? 'year' ? 'year'
: '' : ''
" " placeholder="请选择" />
placeholder="请选择"
/>
<el-button <el-button type="primary" size="mini" class="btnSearch" @click="searchQuery"
type="primary" icon="el-icon-search">查询</el-button>
size="mini" <el-button class="btnReset" size="mini" icon="el-icon-refresh-left" @click="handleClear">重置</el-button>
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> --> <!-- </el-from> -->
</div> </div>
<!-- <div class="searchPanel_1"> <!-- <div class="searchPanel_1">
@ -138,7 +89,7 @@
<div class="chartOrg"> <div class="chartOrg">
<div class="itemChart"> <div class="itemChart">
<div class="title">上月指标</div> <div class="title">上月指标</div>
<div id="chart2" class="keep-ratio"></div> <div id="chart2" class=""></div>
</div> </div>
<div class="itemChart"> <div class="itemChart">
<div class="title">本月指标</div> <div class="title">本月指标</div>
@ -338,7 +289,7 @@ export default {
}; };
}, },
created() {}, created() { },
methods: {}, methods: {},
mounted() { mounted() {
setTimeout(() => { setTimeout(() => {
@ -358,46 +309,60 @@ export default {
canvas.height = parentDiv.offsetHeight; canvas.height = parentDiv.offsetHeight;
parentDiv.appendChild(canvas); parentDiv.appendChild(canvas);
const context = canvas.getContext("2d"); const context = canvas.getContext("2d");
context.lineWidth = 1; // 线
// //
var gr = context.createLinearGradient(247, 63, 450, 0); var gr = context.createLinearGradient(140, 0, 180, 0);
// //
gr.addColorStop(1, "rgba(92,197,255,0)"); gr.addColorStop(1, "rgba(92,197,255,0)");
gr.addColorStop(0, "rgba(92,197,255,0.5)"); gr.addColorStop(0, "rgba(92,197,255,0.5)");
context.lineWidth = 1; // 线
// //
drawRoundRect(context, 300, 78, 160, 24, 12, gr); drawRoundRect(context, 98, 1, 90, 22, 12, gr);
var gr = context.createLinearGradient(240, 63, 450, 0); var gr = context.createLinearGradient(35, 0, 75, 0);
// //
gr.addColorStop(1, "rgba(92,197,255,0)"); gr.addColorStop(1, "rgba(92,197,255,0)");
gr.addColorStop(0, "rgba(92,197,255,0.5)"); gr.addColorStop(0, "rgba(92,197,255,0.5)");
drawRoundRect(context, 300, 148, 160, 24, 12, gr); drawRoundRect(context, -1, 136, 80, 20, 12, gr);
var gr = context.createLinearGradient(240, 63, 450, 0); var gr = context.createLinearGradient(230, 0, 275, 0);
// //
gr.addColorStop(1, "rgba(92,197,255,0)"); gr.addColorStop(1, "rgba(92,197,255,0)");
gr.addColorStop(0, "rgba(92,197,255,0.5)"); gr.addColorStop(0, "rgba(92,197,255,0.5)");
drawRoundRect(context, 300, 218, 160, 24, 12, gr); context.lineWidth = 1; // 线
drawRoundRect(context, 211, 136, 220, 20, 12, gr);
const domMap3 = document.getElementById("chart3");
let parentDiv3 = domMap3.firstChild;
// canvas
let canvas3 = document.createElement("canvas");
canvas3.width = parentDiv3.offsetWidth;
canvas3.height = parentDiv3.offsetHeight;
parentDiv3.appendChild(canvas3);
const context3 = canvas3.getContext("2d");
context3.lineWidth = 1; // 线
var gr = context.createLinearGradient(400, 63, 450, 0); //
var gr = context3.createLinearGradient(140, 0, 180, 0);
// //
gr.addColorStop(1, "rgba(92,197,255,0)"); gr.addColorStop(1, "rgba(92,197,255,0)");
gr.addColorStop(0, "rgba(92,197,255,0.5)"); gr.addColorStop(0, "rgba(92,197,255,0.5)");
//
drawRoundRect(context3, 98, 4, 90, 20, 12, gr);
drawRoundRect(context, 460, 78, 160, 24, 12, gr); var gr = context3.createLinearGradient(35, 0, 75, 0);
var gr = context.createLinearGradient(350, 63, 450, 0);
// //
gr.addColorStop(1, "rgba(92,197,255,0)"); gr.addColorStop(1, "rgba(92,197,255,0)");
gr.addColorStop(0, "rgba(92,197,255,0.5)"); gr.addColorStop(0, "rgba(92,197,255,0.5)");
drawRoundRect(context, 460, 148, 160, 24, 12, gr); drawRoundRect(context3, -1, 138, 80, 20, 12, gr);
var gr = context.createLinearGradient(300, 63, 450, 0);
var gr = context3.createLinearGradient(240, 0, 290, 0);
// //
gr.addColorStop(1, "rgba(92,197,255,0)"); gr.addColorStop(1, "rgba(92,197,255,0)");
gr.addColorStop(0, "rgba(92,197,255,0.5)"); gr.addColorStop(0, "rgba(92,197,255,0.5)");
drawRoundRect(context, 460, 218, 160, 24, 12, gr); context3.lineWidth = 1; // 线
drawRoundRect(context3, 211, 138, 220, 20, 12, gr);
}); });
}); });
}, },
@ -420,7 +385,7 @@ export default {
width: 100%; width: 100%;
font-size: 14px; font-size: 14px;
> div { >div {
display: inline-flex; display: inline-flex;
flex-direction: column; flex-direction: column;
height: 100%; height: 100%;
@ -436,7 +401,7 @@ export default {
.chartOrg { .chartOrg {
flex-direction: row !important; flex-direction: row !important;
> div { >div {
display: inline-flex; display: inline-flex;
flex-direction: column; flex-direction: column;
width: 50%; width: 50%;
@ -444,7 +409,7 @@ export default {
} }
.itemChart { .itemChart {
> .title { >.title {
display: inline-flex; display: inline-flex;
width: 100%; width: 100%;
height: 30px; height: 30px;

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

@ -10,12 +10,14 @@
<!-- </div> --> <!-- </div> -->
<WgtTitle :title="'情报板列表'"></WgtTitle> <WgtTitle :title="'情报板列表'"></WgtTitle>
<el-form <el-form
ref="form"
:model="form" :model="form"
class="partCon" class="formSearch" size="mini"
style="display: flex; flex-direction: column"
> >
<el-form-item style="margin-bottom: 12px"> <!-- class="partCon" -->
<!-- style="display: flex; flex-direction: column" -->
<!-- ref="form" -->
<el-form-item>
<el-col :span="12">
<el-select <el-select
v-model="form.selectedDirection" v-model="form.selectedDirection"
size="medium" size="medium"
@ -27,11 +29,44 @@
:key="item.dictValue" :key="item.dictValue"
:label="item.dictLabel" :label="item.dictLabel"
:value="item.dictValue" :value="item.dictValue"
@click.native="____changeDirection(item.dictValue)"
/> />
<!-- @click.native="____changeDirection(item.dictValue)" -->
</el-select> </el-select>
</el-col>
<el-col :span="11" :offset="1">
<el-checkbox-group v-model="form.status" style="height:26px">
<el-checkbox label="1">在线</el-checkbox>
<el-checkbox label="0">离线</el-checkbox>
</el-checkbox-group>
</el-col>
</el-form-item>
<el-form-item label="开始桩号:">
<el-col :span="2" class="text-center tc-lb">K</el-col>
<el-col :span="7">
<el-input-number v-model="form.stakeFrom[0]" style="width: 100%;" :precision="0" :min="0" :max="1000"></el-input-number>
</el-col>
<el-col :span="2" class="text-center tc-lb">+</el-col>
<el-col :span="7">
<el-input-number v-model="form.stakeFrom[1]" style="width: 100%;" :precision="0" :min="0" :max="1000"></el-input-number>
</el-col>
</el-form-item>
<el-form-item label="结束桩号:">
<el-col :span="2" class="text-center tc-lb">K</el-col>
<el-col :span="7">
<el-input-number v-model="form.stakeTo[0]" style="width: 100%;" :precision="0" :min="0" :max="1000"></el-input-number>
</el-col>
<el-col :span="2" class="text-center tc-lb">+</el-col>
<el-col :span="7">
<el-input-number v-model="form.stakeTo[1]" style="width: 100%;" :precision="0" :min="0" :max="1000"></el-input-number>
</el-col>
</el-form-item>
<el-form-item style="display: flex; justify-content: center;">
<el-button class="btnInfoBoard" type="add" @click.native="____onSearchDevice()">搜索</el-button>
<el-button type="publish" @click.native="____onResetSearchDevice()">重置</el-button>
</el-form-item> </el-form-item>
<vuescroll :ops="scrollOptions" style="flex: 1; height: 0"> </el-form>
<div style="flex:1; height: 0; padding:0 10px 10px">
<vuescroll :ops="scrollOptions">
<el-collapse <el-collapse
v-model="selectedSize" v-model="selectedSize"
accordion accordion
@ -46,7 +81,7 @@
> >
<div v-if="item.list.length > 0"> <div v-if="item.list.length > 0">
<el-checkbox-group <el-checkbox-group
class="checkbox" class="deviceList"
v-model="checkedDeviceIds" v-model="checkedDeviceIds"
:max="2" :max="2"
@change="____onSelectDevices" @change="____onSelectDevices"
@ -57,8 +92,8 @@
:key="index" :key="index"
> >
<div class="title">{{ itm.deviceName }}</div> <div class="title">{{ itm.deviceName }}</div>
<el-tooltip :content="(item.deviceState == 0 || item.deviceState == null) ? '离线' : '在线'" placement="top"> <el-tooltip :content="(itm.deviceState == 0 || itm.deviceState == null) ? '离线' : '在线'" placement="top">
<img src="@/assets/jihe/images/offline.svg" class="state" v-if="item.deviceState==0 || item.deviceState==null"> <img src="@/assets/jihe/images/offline.svg" class="state" v-if="itm.deviceState=='0' || itm.deviceState==null">
<img src="@/assets/jihe/images/online.svg" class="state" v-else> <img src="@/assets/jihe/images/online.svg" class="state" v-else>
</el-tooltip> </el-tooltip>
<el-tooltip content="回读" placement="top"> <el-tooltip content="回读" placement="top">
@ -80,7 +115,7 @@
</el-collapse-item> </el-collapse-item>
</el-collapse> </el-collapse>
</vuescroll> </vuescroll>
</el-form> </div>
</div> </div>
<!-- ++++++++++中间部分单个设备++++++++++ --> <!-- ++++++++++中间部分单个设备++++++++++ -->
<div style="width: 37.8%" class="part partMiddle"> <div style="width: 37.8%" class="part partMiddle">
@ -357,13 +392,7 @@ export default {
deviceList: [], // deviceList: [], //
checkedDeviceIds: [], // checkedDeviceIds: [], //
templateAvailable: [], templateAvailable: [],
form: { form: {},
selectedDirection: "",
company: null,
mechanism: null,
localInfo: null,
selectedPixel: null,
}, //
supplier: null, // supplier: null, //
activeNames: [], // activeNames: [], //
tplCategory: [], // tplCategory: [], //
@ -408,6 +437,7 @@ export default {
// } // }
}, },
created() { created() {
this.____resetForm();
Promise.all([ Promise.all([
this.____initDirection(), this.____initDirection(),
this.____getBoardPixel(), this.____getBoardPixel(),
@ -455,7 +485,7 @@ export default {
res.data.forEach((item) => { res.data.forEach((item) => {
this.boardSizeDic[item.dictValue] = { this.boardSizeDic[item.dictValue] = {
label: item.dictLabel, label: item.dictLabel,
list: [], list: []
}; };
}); });
}); });
@ -501,9 +531,25 @@ export default {
this.____getIotBoard(); this.____getIotBoard();
}, },
____onSearchDevice(){
this.____getIotBoard();
},
____resetForm(){
this.form = {
selectedDirection: "",
status: ["0", "1"],
stakeFrom: [55, 378],
stakeTo: [208, 153]
}
},
____onResetSearchDevice(){
this.____resetForm();
this.____initDirection();
this.____getIotBoard();
},
// //
____getIotBoard() { ____getIotBoard() {
this.checkAll = false; // this.checkAll = false;
for (let key in this.boardSizeDic) { for (let key in this.boardSizeDic) {
this.boardSizeDic[key].list = []; this.boardSizeDic[key].list = [];
} }
@ -511,6 +557,13 @@ export default {
let param = { let param = {
direction: this.form.selectedDirection, direction: this.form.selectedDirection,
}; };
let stakeFrom = this.form.stakeFrom[0] * 1000 + this.form.stakeFrom[1];
let stakeTo = this.form.stakeTo[0] * 1000 + this.form.stakeTo[1];
let statusForm = _.cloneDeep(this.form.status);
if(statusForm.includes("0")){
statusForm.push(null)
}
if (IS_TESTING) { if (IS_TESTING) {
let res = testDeviceList; let res = testDeviceList;
res.data.forEach((item) => { res.data.forEach((item) => {
@ -533,7 +586,13 @@ export default {
if (_.isString(item.otherConfig)) { if (_.isString(item.otherConfig)) {
item.otherConfig = JSON.parse(item.otherConfig); item.otherConfig = JSON.parse(item.otherConfig);
} }
item.iotDeviceId = item.iotDeviceId || "null_" + item.id;
let stakeThis = +item?.stakeMark?.replace(/[K\+]/g, "") || -1;
if(stakeThis >= stakeFrom && stakeThis <= stakeTo && statusForm.includes(item.deviceState)){
this.boardSizeDic[item.otherConfig.screenSize].list.push(item); this.boardSizeDic[item.otherConfig.screenSize].list.push(item);
}
if (!this.selectedSize) { if (!this.selectedSize) {
this.selectedSize = item.otherConfig.screenSize; this.selectedSize = item.otherConfig.screenSize;
} }
@ -569,7 +628,7 @@ export default {
this.selectedBdMsg = []; this.selectedBdMsg = [];
this.selectedBdMsg = _.cloneDeep(testDeviceInfo.data["3A"].content); this.selectedBdMsg = _.cloneDeep(testDeviceInfo.data["3A"].content);
} else { } else {
if (!deviceFrom.iotDeviceId) { if (!deviceFrom.iotDeviceId || deviceFrom.iotDeviceId.includes("null_")) {
this.$message.warning("设备未接入!"); this.$message.warning("设备未接入!");
return; return;
} }
@ -586,12 +645,16 @@ export default {
} }
}, },
____onAddTemplate() { ____onAddTemplate() {
// if(selectedSize){
// fontSize = "64px"
// }
this.editDialog = { this.editDialog = {
visible: true, visible: true,
mode: "add", mode: "add",
type: "template", type: "template",
tpl: { tpl: {
content: "", content: ""
}, },
}; };
}, },
@ -783,8 +846,8 @@ export default {
return; return;
} }
this.checkedDeviceIds = [arr.pop()]; this.checkedDeviceIds = [arr.pop()];
if (!this.checkedDeviceIds[0]) { if (!this.checkedDeviceIds[0] || this.checkedDeviceIds[0].includes("null_")) {
this.$message.warning("该设备缺少iotDeviceId参数!"); this.$message.warning("设备未接入!");
} }
this.selectedDevice = _.find(this.boardSizeDic[this.selectedSize].list, { this.selectedDevice = _.find(this.boardSizeDic[this.selectedSize].list, {
iotDeviceId: this.checkedDeviceIds[0], iotDeviceId: this.checkedDeviceIds[0],
@ -1104,10 +1167,15 @@ export default {
}; };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
::v-deep .formSearch{
padding: 20px 20px 0;
.el-form-item__label{ color: #fff;}
}
.direction { .direction {
::v-deep .el-input { ::v-deep .el-input {
.el-input__inner { .el-input__inner {
font-size: 16px !important; font-size: 14px !important;
padding: 8px 5px; padding: 8px 5px;
} }
} }
@ -1286,7 +1354,8 @@ export default {
padding-bottom: 0px; padding-bottom: 0px;
} }
::v-deep .el-checkbox__label { .deviceList{
::v-deep .el-checkbox__label {
display: flex !important; display: flex !important;
justify-content: space-between; justify-content: space-between;
width: 100%; width: 100%;
@ -1306,12 +1375,13 @@ export default {
.huiduButton:hover { .huiduButton:hover {
color: #05afe3 !important; color: #05afe3 !important;
} }
} }
.el-checkbox { .el-checkbox {
display: flex !important; display: flex !important;
padding-top: 10px; padding-top: 10px;
margin: 0; margin: 0;
}
} }
::v-deep .el-table { ::v-deep .el-table {
@ -1378,10 +1448,6 @@ export default {
padding-left: 5px; padding-left: 5px;
} }
::v-deep .el-checkbox + .el-checkbox {
margin-left: 0px !important;
}
::v-deep .el-collapse-item__header { ::v-deep .el-collapse-item__header {
background-color: #053b4f; background-color: #053b4f;
color: #fff; color: #fff;
@ -1405,10 +1471,6 @@ export default {
border: none; border: none;
} }
::v-deep .el-checkbox__label {
color: #ff0;
}
::v-deep .el-button--medium { ::v-deep .el-button--medium {
width: 96px; width: 96px;
height: 23px; height: 23px;

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

@ -32,7 +32,6 @@
type="input" type="input"
params="word" params="word"
:disable="true" :disable="true"
:placeholder="searchText"
@handleSearch="handleSearch" @handleSearch="handleSearch"
/> />
</div> </div>
@ -85,7 +84,7 @@
:total="numTotal" :total="numTotal"
:current-page.sync="currentPage" :current-page.sync="currentPage"
:page-size="pageSize" :page-size="pageSize"
layout="total,prev, pager, next, jumper" layout="total,sizes,prev, pager, next, jumper"
@size-change="handleSizeChange" @size-change="handleSizeChange"
@current-change="handleCurrentChange" @current-change="handleCurrentChange"
/> />
@ -140,10 +139,6 @@ export default {
key: "word", key: "word",
label: "关键词", label: "关键词",
}, },
{
key: "id",
label: "id",
},
{ {
key: "createTime", key: "createTime",
label: "创建时间", label: "创建时间",

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

@ -40,13 +40,13 @@ export const CameraDirectionEnum = {
// text: "上下行 (双向)", // text: "上下行 (双向)",
// }, // },
1: { 1: {
text: "上行(菏泽方向)", text: "菏泽方向",
}, },
2: { 2: {
text: "中", text: "中",
}, },
3: { 3: {
text: "下行(济南方向)", text: "济南方向",
}, },
}; };

620
ruoyi-ui/src/views/event/event/dispatch.vue

File diff suppressed because it is too large

4
ruoyi-ui/vue.config.js

@ -51,8 +51,8 @@ module.exports = {
// target: `http://10.0.81.204:8087`, //现场后台 刘文阁 // target: `http://10.0.81.204:8087`, //现场后台 刘文阁
// target: `http://10.168.69.255:8087`, //正晨后台 连现场物联 刘文阁 // target: `http://10.168.69.255:8087`, //正晨后台 连现场物联 刘文阁
// target: `http://10.168.78.135:8087`, //王钦 // target: `http://10.168.78.135:8087`, //王钦
// target: `http://10.168.66.196:8087`, //正晨后台 连现场物联 刘文阁2 target: `http://10.168.66.196:8087`, //正晨后台 连现场物联 刘文阁2
target: `http://10.168.68.42:8087`, //王思祥 // target: `http://10.168.68.42:8087`, //王思祥
changeOrigin: true, changeOrigin: true,
pathRewrite: { pathRewrite: {
["^" + process.env.VUE_APP_BASE_API]: "", ["^" + process.env.VUE_APP_BASE_API]: "",

Loading…
Cancel
Save