Browse Source

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

wangqin
hui 12 months ago
parent
commit
c17ded9baf
  1. 90
      ruoyi-ui/src/api/MonthlyEquipment/index.js
  2. 2
      ruoyi-ui/src/views/JiHeExpressway/components/InputSearch/index.vue
  3. 104
      ruoyi-ui/src/views/JiHeExpressway/components/RoadStateCard/index.vue
  4. 104
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/HomeFilter/index.vue
  5. 44
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/RoadAndEvents/index.vue
  6. 25
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/RoadAndEvents/utils/buttonEvent.js
  7. 36
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/RoadAndEvents/utils/httpList.js
  8. 9
      ruoyi-ui/src/views/JiHeExpressway/pages/Home/index.vue
  9. 162
      ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/views/dutyOfficer/index.vue
  10. 4
      ruoyi-ui/src/views/JiHeExpressway/pages/maintenanceOperations/statisticalAnalysis/assets/charts.js
  11. 36
      ruoyi-ui/src/views/JiHeExpressway/pages/maintenanceOperations/statisticalAnalysis/data.js
  12. 40
      ruoyi-ui/src/views/JiHeExpressway/pages/maintenanceOperations/statisticalAnalysis/index.vue
  13. 74
      ruoyi-ui/src/views/JiHeExpressway/pages/service/PublishingChannelManagement/components/AddNEditDialog.vue
  14. 20
      ruoyi-ui/src/views/JiHeExpressway/utils/enum.js

90
ruoyi-ui/src/api/MonthlyEquipment/index.js

@ -1,49 +1,55 @@
import request from '@/utils/request'
import { download } from '../../utils/request'
import request from "@/utils/request";
import { download } from "../../utils/request";
// 全景数据 - 运行环境接口
// 设备状态柱状图按时间和类型
export function getSystemStatusList(query) {
return request({
url: '/system/status/list',
method: 'get',
params: {
...query,
}
})
}
//设备状态列表按时间和类型
export function getSystemStatusTabList(query) {
//system/status/tablist
return request({
url: '/system/status/tablist',
method: 'get',
params: {
...query,
}
})
}
return request({
url: "/system/status/list",
method: "get",
params: {
...query,
},
});
}
//设备状态列表按时间和类型
export function getSystemStatusTabList(query) {
//system/status/tablist
return request({
url: "/system/status/tablist",
method: "get",
params: {
...query,
},
});
}
//设备状态列表按类型
export function getSystemStatusType() {
//system/status/tablist
return request({
url: '/system/status/type',
method: 'get',
params: {
// ...query,
}
})
}
//system/status/type
//设备状态列表按类型
export function getSystemStatusType() {
//system/status/tablist
return request({
url: "/system/status/type",
method: "get",
});
}
//system/status/type
//设备状态列表按类型
export function getSystemStatusExport(query) {
//system/status/export
//return download('/system/status/export',query,"file.xlsx");
return request.post('/system/status/export?startTime='+query.startTime+"&time="+ query.time +"&type="+query.type,{},{ headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
responseType: 'blob'})
}
//设备状态列表按类型
export function getSystemStatusExport(query) {
//system/status/export
//return download('/system/status/export',query,"file.xlsx");
return request.post(
"/system/status/export?startTime=" +
query.startTime +
"&time=" +
query.time +
"&type=" +
query.type,
{},
{
headers: { "Content-Type": "application/x-www-form-urlencoded" },
responseType: "blob",
}
);
}

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

@ -118,7 +118,7 @@ export default {
},
};
},
emit: ["handleSearch"],
emit: ["handleSearch", "handleResetForm"],
computed: {
getFormConfigOptions() {
return {

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

@ -1,11 +1,18 @@
<template>
<BorderRadiusImage class='RoadStateCard' borderRadius="2px"
borderColor="linear-gradient(360deg, rgba(55, 231, 255, 0.3), rgba(55, 231, 255, 0))" borderWidth="2px">
<BorderRadiusImage
class="RoadStateCard"
borderRadius="2px"
borderColor="linear-gradient(360deg, rgba(55, 231, 255, 0.3), rgba(55, 231, 255, 0))"
borderWidth="2px"
>
<div class="left">
<!-- <img :src="(cardData.pictures ? cardData.pictures[0] : null) || require(`./test.png`)"> -->
<!-- <img :src="require(`./test.png`)"> -->
<ElImage style="width: 212px; height: 159px;" :src="cardData.pictures ? cardData.pictures[0] : null"
:preview-src-list="cardData.pictures || []">
<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>
@ -19,27 +26,35 @@
</p>
</div>
<div class="controls">
<Button :style="{ background: firstBtnColor, width: '50%' }"
@click.native="$emit('firstBtnClick', cardData.id)">{{
getFirstBtnText(cardData.state)
}}</Button>
<Button v-if="cardData.state == 4" :style="{ background: lastBtnColor, width: '50%' }"
@click.native="$emit('lastBtnClick', cardData.id)">{{ getLastBtnText(cardData.state)
}}</Button>
<Button
:style="{ background: firstBtnColor, width: '50%' }"
@click.native="$emit('firstBtnClick', cardData.id)"
>{{ getFirstBtnText(cardData.state) }}</Button
>
<Button
v-if="cardData.state == 4"
:style="{ background: lastBtnColor, width: '50%' }"
@click.native="$emit('lastBtnClick', cardData.id)"
>{{ getLastBtnText(cardData.state) }}</Button
>
</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>
</template>
<script>
import Button from "@screen/components/Buttons/Button.vue";
import BorderRadiusImage from "@screen/components/BorderRadiusImage.vue";
import { statusMap } from "./data.js"
import { statusMap } from "./data.js";
export default {
name: 'RoadStateCard',
name: "RoadStateCard",
props: {
cardData: {
type: Object,
@ -48,80 +63,80 @@ export default {
source: "视频智能识别",
location: "k100+000",
direction: "济南方向",
})
}),
},
firstBtnText: {
type: String,
default: "详情"
default: "详情",
},
lastBtnText: {
type: String,
default: "调度记录"
default: "调度记录",
},
firstBtnColor: {
type: String,
default: "#00B3CC"
default: "#00B3CC",
},
lastBtnColor: {
type: String,
default: "#CB7A00"
default: "#CB7A00",
},
keyMap: {
type: Array,
default: () => ([
default: () => [
{
key: "stringEventType",
label: "事件"
label: "事件",
},
{
key: "stringEventSource",
label: "来源"
label: "来源",
},
{
key: "stakeMark",
label: "位置"
label: "位置",
},
{
key: "stringDirection",
label: "方向"
label: "方向",
},
{
key: "startTime",
label: "时间"
label: "时间",
},
])
}
],
},
},
data() {
return {
picUrl: './test.png'
}
picUrl: "./test.png",
};
},
emit: ['firstBtnClick', "lastBtnClick"],
emit: ["firstBtnClick", "lastBtnClick"],
components: {
Button,
BorderRadiusImage
BorderRadiusImage,
},
created() {
this.statusMap = statusMap;
},
methods: {
getFirstBtnText(state) {
let text = '详情';
if (state == 5) text = '去确认'
if (state == 4) text = '详情'
if (state == 3) text = '处置记录'
let text = "详情";
if (state == 5) text = "去确认";
if (state == 4) text = "详情";
if (state == 3) text = "处置记录";
return text;
},
getLastBtnText(state) {
let text = '去处置';
let text = "去处置";
return text;
},
}
}
},
};
</script>
<style lang='scss' scoped>
<style lang="scss" scoped>
.RoadStateCard {
color: #fff;
display: flex;
@ -143,7 +158,7 @@ export default {
}
.icon {
display:inline-block;
display: inline-block;
width: 212px;
height: 159px;
line-height: 157px;
@ -165,13 +180,13 @@ export default {
display: flex;
flex-direction: column;
>p {
> p {
font-size: 12px;
color: #f4f4f4;
line-height: 24px;
&:nth-child(-n+2) {
color: #37E7FF;
&:nth-child(-n + 2) {
color: #37e7ff;
font-size: 16px;
font-weight: bold;
}
@ -179,7 +194,6 @@ export default {
&:nth-child(2) {
margin-bottom: 3px;
}
}
.linText {
@ -198,7 +212,7 @@ export default {
display: flex;
gap: 9px;
>div {
> div {
// flex: 1;
}
}

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

@ -1,35 +1,16 @@
<template>
<div class="HomeFilter">
<ElPopover
trigger="manual"
:value="activeIcon === 'filter'"
:visibleArrow="false"
placement="left"
popper-class="global-input-search-popover"
>
<Button
:class="['btn', { 'btn-active': activeIcon }]"
slot="reference"
@click.native="handleClick('filter')"
>
<ElPopover trigger="manual" :value="activeIcon === 'filter'" :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>
<div class="body">
<div class="title">设备筛选</div>
<Form
labelWidth="90px"
column="1"
class="form"
ref="FormConfigRef"
:formList="formList"
/>
<Form labelWidth="90px" column="1" class="form" ref="FormConfigRef" :formList="formList" />
<div class="footer">
<Button
style="background-color: rgba(0, 179, 204, 0.3)"
@click.native="handleResetForm"
>
<Button style="background-color: rgba(0, 179, 204, 0.3)" @click.native="handleResetForm">
重置
</Button>
<Button @click.native="handleSearch"> 搜索 </Button>
@ -43,10 +24,12 @@
import Button from "@screen/components/Buttons/Button.vue";
import Form from "@screen/components/FormConfig";
import * as PresetFormItems from "@screen/common/PresetFormItems.js";
import { merge, cloneDeep } from "lodash";
import { merge, cloneDeep, find } from "lodash";
import request from "@/utils/request";
import { log } from "mathjs";
import { ChildTypes } from "@screen/utils/enum.js"
const DeviceTypeIds = [1, 2];
export default {
name: "HomeFilter",
components: {
@ -61,19 +44,59 @@ export default {
PresetFormItems.endStation,
{
label: "设备类型:",
key: "deviceType",
key: "childType",
type: "select",
options: {
options: [],
},
// visible: data => {
// if (data.searchType == 1) {
// return true
// }
// },
visible: data => {
for (let id of DeviceTypeIds) {
if (this.activeDeviceTypes.indexOf(`路测设备_${id}`) >= 0)
return true;
}
},
},
{
label: "设备状态:",
key: "deviceState",
type: "select",
default: null,
options: {
options: [{
label: "所有",
value: null
}, {
label: "在线",
value: 1
}, {
label: "离线",
value: 0
}]
},
visible: data => {
if (find(this.activeDeviceTypes, (type => type.match("路测设备_"))))
return true;
},
},
],
};
]
}
},
watch: {
activeDeviceTypes: {
handler(val) {
const options = []
for (let id of DeviceTypeIds) {
if (this.activeDeviceTypes.indexOf(`路测设备_${id}`) >= 0) {
const IdChildTypes = ChildTypes[id];
options.push(...Object.keys(IdChildTypes).map(key => { return { label: IdChildTypes[key], value: key } }));
}
// if (this.activeDeviceTypes.indexOf("_2") >= 0) options.push(...Object.keys(BoardChildTypes).map(key => { return { label: BoardChildTypes[key], value: key } }));
}
this.formList[2].options.options = options;
},
immediate: true,
deep: true
}
},
methods: {
handleClick(type) {
@ -96,7 +119,8 @@ export default {
delete data.startStakeMark;
if (!data.endStakeMark[0] || !data.endStakeMark[1])
delete data.endStakeMark;
// this.activeIcon = null;
this.activeIcon = null;
console.log(data, "data");
this.filterEnd(data);
},
async getDeviceTypeOptions() {
@ -110,6 +134,7 @@ export default {
// return ;
},
},
inject: ["activeDeviceTypes"],
async created() {
// await this.getDeviceTypeOptions();
},
@ -126,11 +151,9 @@ div.el-popper.global-input-search-popover {
.body {
.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;
position: absolute;
top: 0;
@ -140,7 +163,8 @@ div.el-popper.global-input-search-popover {
}
}
</style>
<style lang="scss" scoped>
<style lang='scss' scoped>
.HomeFilter {
.btn {
padding: 9px;

44
ruoyi-ui/src/views/JiHeExpressway/pages/Home/components/RoadAndEvents/index.vue

@ -142,16 +142,13 @@ export default {
async handler(bool) {
if (!bool) return;
await Promise.allSettled((this.tabContentData || []).map(item => this.handleDeviceImmediate(item, true)))
// for (let item of this.tabContentData || []) {
// await this.handleDeviceImmediate(item, true);
// };
Object.keys(lngLatMap).forEach(key => {
addInGraphHandle(lngLatMap[key]);
})
}
}
},
inject: ['getMap'],
inject: ['getMap', 'activeDeviceTypes'],
created() {
const defaultActive = 0;
@ -177,15 +174,31 @@ export default {
getMinMapLayers();
},
methods: {
setFilterData(data) {
async setFilterData(data) {
this.filterData = data;
const tabContentData = [];
this.layerData.forEach((layerDataItem => {
layerDataItem.children.forEach(item => {
if (!item.status) return;
tabContentData.push(item);
// this.handleDeviceImmediate(item);
// this.handleDeviceImmediate(item);
})
}));
const eventMapCall = async (item, isDefault) => {
const key = getHandleDeviceType(item) || `${this.active}/${item.title}`;
const status = item.status;
// if (!eventMap[`${key}${status ? "_close" : ""}`]) return this.$emit("onClickItem", item);
// console.log(`${key}${status ? "" : "_close"}`, this.filterData, 'xxx');
await eventMap[`${key}${status ? "" : "_close"}`]?.call(this, item, this.filterData, isDefault);
}
await Promise.allSettled(tabContentData.map(item => eventMapCall(item, true)))
// Object.keys(lngLatMap).forEach(key => {
// addInGraphHandle(lngLatMap[key]);
// });
this.layerData[1].children.forEach(item => {
if (!item.status) return;
this.handleDeviceImmediate(item);
this.handleDeviceImmediate(item);
})
},
handleClick(item) {
this.active = item.title;
@ -201,8 +214,15 @@ export default {
console.log("%c [ key ]-102-「index.vue」", "font-size:15px; background:#9d63e9; color:#e1a7ff;", key);
if (!eventMap[`${key}${status ? "_close" : ""}`]) return this.$emit("onClickItem", item);
await eventMap[`${key}${status ? "_close" : ""}`]?.call(this, item, this.filterData, isDefault);
console.log(`${key}${status ? "_close" : ""}`, this.filterData, isDefault)
const cb = (item, config) => {
const deviceType = config.deviceType;
const activeDeviceTypes = this.activeDeviceTypes;
const findIndex = activeDeviceTypes.indexOf(deviceType);
if (item.status) findIndex === -1 && activeDeviceTypes.push(deviceType);
else findIndex !== -1 && activeDeviceTypes.splice(findIndex, 1);
}
await eventMap[`${key}${status ? "_close" : ""}`]?.call(this, item, this.filterData, isDefault, cb);
},
handleDevice: debounce(function (item) {
this.handleDeviceImmediate(item);

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

@ -114,7 +114,7 @@ function resolveDataOptions(data, config, component, isDefault) {
export const eventMap = {
// 设备 需要在地图显示的
async "地图路测设备/map"(item, filterData, isDefault) {
async "地图路测设备/map"(item, filterData, isDefault, cb) {
const config = DeviceForMap[item.title];
let loadingMessage;
if (!isDefault) {
@ -140,7 +140,9 @@ export const eventMap = {
return Message.warning(`没有${item.title}事件数据!`);
eventMap[`地图路测设备/map_close`](item);
const cbCall = () =>
cb?.(item, { deviceType: `路测设备_${config.deviceType}` });
cbCall();
const options = {
item,
...config.options,
@ -155,9 +157,11 @@ export const eventMap = {
removeData
);
addDataPreHandle(removeData);
markerClusterIns.addData(removeData, isDefault);
cacheRemoveFunc[`地图路测设备/${item.title}`] = () => {
cbCall();
removeDataPreHandle(removeData);
markerClusterIns.removeData(removeData);
};
@ -167,7 +171,8 @@ export const eventMap = {
},
// 事件 需要在地图显示的
async "地图事件专题/map"(item, filterData, isDefault) {
async "地图事件专题/map"(item, filterData, isDefault, cb) {
const deviceType = EventTopics[item.title];
let loadingMessage;
if (!isDefault) {
loadingMessage = Message.info({
@ -177,7 +182,7 @@ export const eventMap = {
iconClass: "el-icon-loading",
});
}
const data = await getEventTopicList(EventTopics[item.title])
const data = await getEventTopicList(deviceType, filterData)
.then(async (data) => {
await delay(600);
return data;
@ -192,6 +197,8 @@ export const eventMap = {
return Message.warning(`没有${item.title}事件数据!`);
eventMap[`地图事件专题/map_close`](item);
const cbCall = () => cb?.(item, { deviceType: `事件专题_${deviceType}` });
cbCall();
const options = {
stateCallback: () => true,
@ -211,6 +218,7 @@ export const eventMap = {
markerClusterIns.addData(removeData, isDefault);
cacheRemoveFunc[`地图事件专题/${item.title}`] = () => {
cbCall();
removeDataPreHandle(removeData);
markerClusterIns.removeData(removeData);
};
@ -220,7 +228,7 @@ export const eventMap = {
},
// 感知事件
async "事件专题/感知事件"(item, filterData, isDefault) {
async "事件专题/感知事件"(item, filterData, isDefault, cb) {
let loadingMessage;
if (!isDefault) {
loadingMessage = Message.info({
@ -230,7 +238,8 @@ export const eventMap = {
iconClass: "el-icon-loading",
});
}
const data = await getPerceiveEventList({warningState: 1})
const warningState = 1;
const data = await getPerceiveEventList({ warningState })
.then(async (data) => {
await delay(600);
return data;
@ -238,13 +247,14 @@ export const eventMap = {
.catch(() => {});
loadingMessage?.close();
if (!data) return;
if (!data?.length && !isDefault)
return Message.warning(`没有${item.title}数据!`);
eventMap[`事件专题/感知事件_close`](item);
const cbCall = () => cb?.(item, { deviceType: `感知事件_${warningState}` });
cbCall();
const options = {
stateCallback: () => true,
@ -260,6 +270,7 @@ export const eventMap = {
loadingMessage?.close();
cacheRemoveFunc[`事件专题/${item.title}`] = () => {
cbCall();
removeDataPreHandle(removeData);
markerClusterIns.removeData(removeData);
};

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

@ -1,6 +1,6 @@
import { Message } from "element-ui";
// import { axiosIns } from "@screen/utils/axios/auth.js";
import moment from "moment";
import request from "@/utils/request";
/**
@ -11,15 +11,16 @@ import request from "@/utils/request";
*/
export async function getCameraStream(camId, media = 1) {
let data = await request({
url: "/video/externalVideoStreaming",
method: "get",
params: {
camId,
},
});
url: "/video/externalVideoStreaming",
method: "get",
params: {
camId,
},
});
if (data.code == 200){
data.data.liveUrl = "https://10.0.81.202/camera?target=" + data.data.liveUrl.substring(7);
if (data.code == 200) {
data.data.liveUrl =
"https://10.0.81.202/camera?target=" + data.data.liveUrl.substring(7);
}
return data;
@ -273,15 +274,15 @@ export function getProduct(productId) {
* 交通事件 列表 根据类型获取
* @param {number} eventType
*/
export function getEventTopicList(eventType) {
export function getEventTopicList(eventType, options) {
return new Promise((resolve, reject) => {
if (!eventType) {
Message.error(`事件加载失败!`);
return reject();
}
// console.log(options, "options xxxx");
request({
url: `/business/trafficIncidents/getEventList/${eventType}`,
url: `/business/trafficIncidents/getEventList?eventType=${eventType}`,
method: "post",
})
.then(({ code, data }) => {
@ -305,17 +306,20 @@ export function getEventTopicList(eventType) {
*/
export function getPerceiveEventList(data = {}) {
return new Promise((resolve, reject) => {
const completeTime = moment().format("YYYY-MM-DD");
const startTime = moment().add(-30, "d").format("YYYY-MM-DD");
data.startTime = startTime;
data.completeTime = completeTime;
request({
url: `/perceivedEvents/warning/perceivedEventsList`,
url: `/perceivedEvents/warning/warningList`,
method: "POST",
data: {...data},
data: { ...data },
})
.then(({ code, rows }) => {
.then(({ code, data: rows }) => {
if (code != 200) {
reject();
return Message.error(`事件加载失败!`);
}
resolve(rows);
})
.catch(() => {

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

@ -1,8 +1,8 @@
<template>
<div class="Home">
<AMapContainer ref="AMapContainerRef" @update:isGisCompleted="(data) => {
this.isGisCompleted = data;
}
this.isGisCompleted = data;
}
" />
<section class="content">
<!-- 左侧 -->
@ -47,7 +47,7 @@ import HomeFilter from "./components/HomeFilter/index.vue";
import HomeFrame from "./components/HomeFrame/index.vue";
import HomeVector from "./components/HomeVector/index.vue";
import Button from '@screen/components/Buttons/Button.vue';
import Vue from "vue";
// import InfoBoard from "./components/InfoBoard"
export default {
@ -74,7 +74,8 @@ export default {
provide() {
return {
getMap: () => this.$refs.AMapContainerRef.getMapInstance(),
};
activeDeviceTypes: Vue.observable([])
}
},
methods: {
handleShrink(e) {

162
ruoyi-ui/src/views/JiHeExpressway/pages/control/event/businessDataManagement/views/dutyOfficer/index.vue

@ -1,5 +1,5 @@
<template>
<div class='DutyOfficer'>
<div class="DutyOfficer">
<div class="filter">
<div>
<ButtonGradient @click.native="handleExport">
@ -35,24 +35,27 @@
</div>
<InputSearch
style="width: 402px;"
style="width: 402px"
:formList="searchFormList"
:formConfigOptions="{ labelWidth: '100px' }"
placeholder="请输入姓名、电话,回车搜索"
type="input"
:params="params"
@handleSearch="handleSearch" />
@handleSearch="handleSearch"
/>
</div>
<div class="body">
<ElEmpty v-if="!data.length && !isFirst" description="暂无数据" style="width: 100%;height: 100%;position: absolute;" />
<ElEmpty
v-if="!data.length && !isFirst"
description="暂无数据"
style="width: 100%; height: 100%; position: absolute"
/>
<!-- <div v-if="!data.length && !isFirst" class="no-data" style="position: absolute">暂无数据</div> -->
<SpecialTable v-else :columns="columns" :data="data" class="body">
<template #title-DateDuty>
<div class="special-title">
值班中心
</div>
<div class="special-title">值班中心</div>
</template>
<template #content-date="{ data }">
<div class="item">
@ -64,46 +67,62 @@
<div class="parent">
<div class="item">
<img src="@screen/images/form/location.svg" />
{{ data['organizationName'] }}
{{ data["organizationName"] }}
</div>
</div>
</template>
<template #content-dayShift="{ data }">
<div class="item-parent" v-if="data.dayShift && data.dayShift.length">
<div class="item" v-for="(item,index) in data.dayShift" :key="index" >
<div
class="item"
v-for="(item, index) in data.dayShift"
:key="index"
>
<img src="@screen/images/form/people.svg" />
{{ item.name }}
</div>
</div>
<div class="no-data" v-else>
无值班人员
</div>
<div class="no-data" v-else>无值班人员</div>
</template>
<template #content-graveyardShift="{ data }">
<div class="item-parent" v-if="data.graveyardShift && data.graveyardShift.length">
<div class="item" v-for="(item,index) in data.graveyardShift" :key="index">
<div
class="item-parent"
v-if="data.graveyardShift && data.graveyardShift.length"
>
<div
class="item"
v-for="(item, index) in data.graveyardShift"
:key="index"
>
<img src="@screen/images/form/people.svg" />
{{ item.name }}
</div>
</div>
<div class="no-data" v-else>
无值班人员
</div>
<div class="no-data" v-else>无值班人员</div>
</template>
<template #operation-content="{ data }">
<ButtonGradient class="operate-button" @click.native="handleModifyDutyInformationTable(true, data)">
<ButtonGradient
class="operate-button"
@click.native="handleModifyDutyInformationTable(true, data)"
>
<template #prefix>
<img src="@screen/images/form/edit.svg" />
</template>
修改
</ButtonGradient>
<ButtonGradient class="operate-button" @click.native="handleOperateRecord(true, data)">
<ButtonGradient
class="operate-button"
@click.native="handleOperateRecord(true, data)"
>
<template #prefix>
<img src="@screen/images/form/record.svg" />
</template>
记录
</ButtonGradient>
<ButtonGradient class="operate-button" @click.native="handleDelete(data)">
<ButtonGradient
class="operate-button"
@click.native="handleDelete(data)"
>
<template #prefix>
<img src="@screen/images/form/delete.svg" />
</template>
@ -113,60 +132,66 @@
</SpecialTable>
</div>
<OperateRecord
:visible="operateRecordVisible"
@close="handleOperateRecord(false)"
:data="dialogData"
/>
<OperateRecord :visible="operateRecordVisible" @close="handleOperateRecord(false)" :data="dialogData" />
<ModifyDutyInformationTable :visible="modifyDutyInformationTableVisible" :data="dialogData"
@close="handleModifyDutyInformationTable(false)" />
<ModifyDutyInformationTable
:visible="modifyDutyInformationTableVisible"
:data="dialogData"
@close="handleModifyDutyInformationTable(false)"
/>
</div>
</template>
<script>
import SpecialTable from "./../../components/SpecialTable.vue"
import OperateRecord from "./components/OperateRecord.vue"
import ModifyDutyInformationTable from "./components/ModifyDutyInformationTable.vue"
import ButtonGradient from '@screen/components/Buttons/ButtonGradient.vue';
import InputSearch from '@screen/components/InputSearch/index.vue';
import SpecialTable from "./../../components/SpecialTable.vue";
import OperateRecord from "./components/OperateRecord.vue";
import ModifyDutyInformationTable from "./components/ModifyDutyInformationTable.vue";
import ButtonGradient from "@screen/components/Buttons/ButtonGradient.vue";
import InputSearch from "@screen/components/InputSearch/index.vue";
import { searchFormList } from "./data";
import request from "@/utils/request";
import { setLoading } from "@screen/utils/index.js"
import { setLoading } from "@screen/utils/index.js";
import { delay, exportFile, confirm, uploadFile } from "@screen/utils/common";
import { Message } from "element-ui";
import { getSelectOptionsStation } from "@screen/pages/control/event/businessDataManagement/utils.js";
export default {
name: 'DutyOfficer',
name: "DutyOfficer",
components: {
SpecialTable,
OperateRecord,
ModifyDutyInformationTable,
ButtonGradient,
InputSearch
InputSearch,
},
inject: ['getPagination', 'setTotal', 'setCurrentPage'],
inject: ["getPagination", "setTotal", "setCurrentPage"],
data() {
return {
columns: [
{
key: "date",
title: "值班日期",
width: "210px"
width: "210px",
},
{
key: "organizationName",
title: "驻点",
width: "240px"
width: "240px",
},
{
key: "dayShift",
title: "白班",
width: "510px"
width: "510px",
},
{
key: "graveyardShift",
title: "夜班",
width: "510px"
width: "510px",
},
],
data: [],
@ -177,8 +202,8 @@ export default {
required: false,
type: "datePicker",
options: {
valueFormat: "yyyy-MM-dd"
}
valueFormat: "yyyy-MM-dd",
},
},
{
label: "驻点:",
@ -195,7 +220,7 @@ export default {
dialogData: null,
isFirst: true,
params: "name",
}
};
},
created() {
this.getData();
@ -203,7 +228,6 @@ export default {
},
methods: {
async getOptions() {
const result = await getSelectOptionsStation(2);
this.searchFormList[1].options.options = result;
@ -230,8 +254,8 @@ export default {
filename: "机构值班表",
data: {
...this.searchData,
...this.getPagination()
}
...this.getPagination(),
},
});
},
handleExportTemplate() {
@ -240,8 +264,8 @@ export default {
filename: "机构值班表面板",
data: {
...this.searchData,
...this.getPagination()
}
...this.getPagination(),
},
});
},
handleSearch(data) {
@ -258,35 +282,36 @@ export default {
method: "get",
params: {
...this.searchData,
...this.getPagination()
}
...this.getPagination(),
},
})
.then(result => {
.then((result) => {
if (result.code != 200) return;
this.data = result.rows.map(item => {
this.data = result.rows.map((item) => {
const result = {
date: item.date,
organizationName: item.organizationName,
station: item.station,
id: item.id
}
id: item.id,
};
item.shiftsList.forEach(item => {
const key = { 1: 'dayShift', 2: 'graveyardShift' }[item.scheduling];
item.shiftsList.forEach((item) => {
const key = { 1: "dayShift", 2: "graveyardShift" }[
item.scheduling
];
if (!result[key]) result[key] = [];
result[key].push(item);
})
});
return result
return result;
});
this.setTotal(result.total);
})
.finally(() => {
this.isFirst = false;
closeLoading();
})
});
},
async handleDelete(data) {
await confirm({ message: "是否要删除该值班信息?" });
@ -297,31 +322,30 @@ export default {
data: {
date: data.date,
station: data.station,
}
},
})
.then(result => {
.then((result) => {
if (result.code != 200) return Message.error("删除失败");
this.setCurrentPage(1)
this.setCurrentPage(1);
Message.success("删除成功")
Message.success("删除成功");
})
.catch(() => {
Message.error("删除失败")
})
Message.error("删除失败");
});
},
uploadFile() {
uploadFile({ url: "/business/shifts/importEquipment" });
}
}
}
},
},
};
</script>
<style lang='scss' scoped>
<style lang="scss" scoped>
.DutyOfficer {
.special-title {
background: linear-gradient(180deg, #FFC071 0%, #D68D00 100%);
background: linear-gradient(180deg, #ffc071 0%, #d68d00 100%);
background-clip: text;
color: transparent;
}

4
ruoyi-ui/src/views/JiHeExpressway/pages/maintenanceOperations/statisticalAnalysis/assets/charts.js

@ -48,9 +48,7 @@ let options = {
},
yAxis: [
{
min: 0,
max: 100,
type: "value",
type: "category",
minInterval: 20,
maxInterval: 20,
name: "",

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

@ -43,75 +43,75 @@ export const searchFormList = [
key: "type",
required: true,
type: "select",
default: "1",
default: "1-1",
options: {
options: [
{
value: "1",
value: "1-1",
label: "高清网络枪型固定摄像机",
},
{
value: "2",
value: "1-2",
label: "高清网络球形摄像机",
},
{
value: "3",
value: "1-3",
label: "桥下高清网络球形摄像机",
},
{
value: "4",
value: "1-4",
label: "360°全景摄像机",
},
{
value: "5",
value: "1-5",
label: "180°全景摄像机",
},
{
value: "6",
value: "2-1",
label: "门架式可变信息标志",
},
{
value: "7",
value: "2-3",
label: "雨棚可变信息标志",
},
{
value: "8",
value: "2-4",
label: "站前悬臂式可变信息标志",
},
{
value: "9",
value: "3",
label: "气象检测器",
},
{
value: "10",
value: "5",
label: "路段语音广播系统",
},
{
value: "11",
value: "6",
label: "护栏碰撞预警系统",
},
{
value: "12",
value: "7",
label: "毫米波雷达",
},
{
value: "13",
value: "8",
label: "合流区预警系统",
},
{
value: "14",
value: "10",
label: "激光疲劳唤醒",
},
{
value: "15",
value: "11",
label: "一类交通量调查站",
},
{
value: "16",
value: "12",
label: "智能行车诱导系统",
},
{
value: "17",
value: "13",
label: "智能设备箱",
},
],

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

@ -80,23 +80,23 @@
</el-table-column>
<el-table-column prop="type" label="型号" width="">
<template slot-scope="scope">
<div v-if="scope.row.type == 1">高清网络枪型固定摄像机</div>
<div v-if="scope.row.type == 2">高清网络球形摄像机</div>
<div v-if="scope.row.type == 3">桥下高清网络球形摄像机</div>
<div v-if="scope.row.type == 4">360°全景摄像机</div>
<div v-if="scope.row.type == 5">180°全景摄像机</div>
<div v-if="scope.row.type == 6">门架式可变信息标志</div>
<div v-if="scope.row.type == 7">雨棚可变信息标志</div>
<div v-if="scope.row.type == 8">站前悬臂式可变信息标志</div>
<div v-if="scope.row.type == 9">气象检测器</div>
<div v-if="scope.row.type == 10">路段语音广播系统</div>
<div v-if="scope.row.type == 11">护栏碰撞预警系统</div>
<div v-if="scope.row.type == 12">毫米波雷达</div>
<div v-if="scope.row.type == 13">合流区预警系统</div>
<div v-if="scope.row.type == 14">激光疲劳唤醒</div>
<div v-if="scope.row.type == 15">一类交通量调查站</div>
<div v-if="scope.row.type == 16">智能行车诱导系统</div>
<div v-if="scope.row.type == 17">智能设备箱</div>
<div v-if="scope.row.type == '1-1'">高清网络枪型固定摄像机</div>
<div v-if="scope.row.type == '1-2'">高清网络球形摄像机</div>
<div v-if="scope.row.type == '1-3'">桥下高清网络球形摄像机</div>
<div v-if="scope.row.type == '1-4'">360°全景摄像机</div>
<div v-if="scope.row.type == '1-5'">180°全景摄像机</div>
<div v-if="scope.row.type == '2-1'">门架式可变信息标志</div>
<div v-if="scope.row.type == '2-3'">雨棚可变信息标志</div>
<div v-if="scope.row.type == '2-4'">站前悬臂式可变信息标志</div>
<div v-if="scope.row.type == '3'">气象检测器</div>
<div v-if="scope.row.type == '5'">路段语音广播系统</div>
<div v-if="scope.row.type == '6'">护栏碰撞预警系统</div>
<div v-if="scope.row.type == '7'">毫米波雷达</div>
<div v-if="scope.row.type == '8'">合流区预警系统</div>
<div v-if="scope.row.type == '10'">激光疲劳唤醒</div>
<div v-if="scope.row.type == '11'">一类交通量调查站</div>
<div v-if="scope.row.type == '12'">智能行车诱导系统</div>
<div v-if="scope.row.type == '13'">智能设备箱</div>
</template>
</el-table-column>
<el-table-column prop="network" label="网段" width="">
@ -141,7 +141,7 @@ import {
getSystemStatusType,
getSystemStatusExport,
} from "../../../../../api/MonthlyEquipment";
import { download } from "../../../../../utils/request.js";
// import { download } from "../../../../../utils/request.js";
import Pagination from "@screen/components/Pagination.vue";
import InputSearch from "@screen/components/InputSearch/index.vue";
import { searchFormList } from "./data";
@ -249,7 +249,7 @@ export default {
this.startTime = moment(data.time[0]).format("YYYY-MM-DD HH:mm:ss");
this.time = moment(data.time[1]).format("YYYY-MM-DD HH:mm:ss");
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(
"YYYY年MM月DD日"
)}-${moment(this.time).format("YYYY年MM月DD日")},${typeText}`;
@ -327,6 +327,7 @@ export default {
}
}
this.equipments = allList;
console.log("Equipments", allList);
});
},
setStatus(id, status) {
@ -413,7 +414,6 @@ export default {
},
},
async mounted() {
console.log("__________________", searchFormList[0].default);
await this.initData();
},
};

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

@ -1,24 +1,32 @@
<template>
<Dialog v-model="modelVisible" :title="data ? '修改' : '新增'">
<div class='AddNEditDialog'>
<Form v-model="formData" class="form" ref="FormConfigRef" :formList="formList" column="1" labelWidth="90px" />
<div class="AddNEditDialog">
<Form
v-model="formData"
class="form"
ref="FormConfigRef"
:formList="formList"
column="1"
labelWidth="90px"
/>
</div>
<template #footer>
<Button style="background-color: rgba(0, 179, 204, .3);" @click.native="modelVisible = false, submitting = false">
<Button
style="background-color: rgba(0, 179, 204, 0.3)"
@click.native="(modelVisible = false), (submitting = false)"
>
取消
</Button>
<Button @click.native="handleSubmit" :loading="submitting">
确定
</Button>
<Button @click.native="handleSubmit" :loading="submitting"> 确定 </Button>
</template>
</Dialog>
</template>
<script>
import Dialog from "@screen/components/Dialog/index.vue";
import Button from "@screen/components/Buttons/Button.vue"
import Form from '@screen/components/FormConfig';
import Button from "@screen/components/Buttons/Button.vue";
import Form from "@screen/components/FormConfig";
import request from "@/utils/request";
import { getSelectOptionsStation } from "@screen/pages/control/event/businessDataManagement/utils.js";
@ -26,21 +34,21 @@ import { Message } from "element-ui";
import * as PresetFormItems from "@screen/common/PresetFormItems.js";
export default {
name: 'AddNEditDialog',
name: "AddNEditDialog",
components: {
Dialog,
Button,
Form
Form,
},
model: {
prop: 'visible',
event: "update:value"
prop: "visible",
event: "update:value",
},
props: {
visible: Boolean,
data: Object
data: Object,
},
inject: ['setCurrentPage'],
inject: ["setCurrentPage"],
data() {
return {
submitting: false,
@ -68,7 +76,7 @@ export default {
PresetFormItems.releaseChannel,
{
label: "审核方式:",
key: "level",
key: "process",
type: "RadioGroup",
isAlone: true,
options: {
@ -89,21 +97,20 @@ export default {
label: "启用日期:",
key: "startDate",
type: "DatePicker",
required: true
}
]
}
required: true,
},
],
};
},
computed: {
modelVisible: {
get() {
return this.visible
return this.visible;
},
set(val) {
this.$emit('update:value', val)
}
}
this.$emit("update:value", val);
},
},
},
watch: {
modelVisible: {
@ -112,24 +119,21 @@ export default {
if (!bool) return;
this.formData = {
...this.data
}
...this.data,
};
this.getOptions();
}
}
},
},
},
methods: {
getOptions() {
},
handleSubmit() {
}
getOptions() {},
handleSubmit() {},
},
}
};
</script>
<style lang='scss' scoped>
<style lang="scss" scoped>
.AddNEditDialog {
width: 450px;
height: 200px;

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

@ -263,3 +263,23 @@ export const SchedulingEnum = {
text: "夜班",
},
};
const CameraChildTypes = {
11: "高清网络枪型固定摄像机",
12: "高清网络球形摄像机",
13: "桥下高清网络球形摄像机",
14: "360°全景摄像机",
15: "180°全景摄像机",
};
const BoardChildTypes = {
21: "门架式可变信息标志",
22: "大学城入口站前板",
23: "雨棚可变信息标志",
24: "站前悬臂式可变信息标志",
};
export const ChildTypes = {
1: CameraChildTypes,
2: BoardChildTypes,
};

Loading…
Cancel
Save