Browse Source

Merge remote-tracking branch 'origin/develop' into develop

develop
wangsixiang 1 year ago
parent
commit
cffd0a92ba
  1. 12
      ruoyi-ui/src/api/system/device.js
  2. 62
      ruoyi-ui/src/api/system/product.js
  3. 613
      ruoyi-ui/src/views/system/device/index.vue
  4. 108
      zc-business/src/main/java/com/zc/business/controller/DcEmergencyPlansController.java
  5. 9
      zc-business/src/main/java/com/zc/business/domain/DcDevice.java
  6. 85
      zc-business/src/main/java/com/zc/business/domain/DcEmergencyPlans.java
  7. 79
      zc-business/src/main/java/com/zc/business/domain/DcExecuteAction.java
  8. 38
      zc-business/src/main/java/com/zc/business/enums/EventTypeEnum.java
  9. 68
      zc-business/src/main/java/com/zc/business/mapper/DcEmergencyPlansMapper.java
  10. 60
      zc-business/src/main/java/com/zc/business/mapper/DcExecuteActionMapper.java
  11. 72
      zc-business/src/main/java/com/zc/business/service/DcEmergencyPlansService.java
  12. 54
      zc-business/src/main/java/com/zc/business/service/DcExecuteActionService.java
  13. 15
      zc-business/src/main/java/com/zc/business/service/impl/DcBoardServiceImpl.java
  14. 359
      zc-business/src/main/java/com/zc/business/service/impl/DcEmergencyPlansServiceImpl.java
  15. 72
      zc-business/src/main/java/com/zc/business/service/impl/DcExecuteActionServiceImpl.java
  16. 17
      zc-business/src/main/resources/mapper/business/DcDeviceMapper.xml
  17. 128
      zc-business/src/main/resources/mapper/business/DcEmergencyPlansMapper.xml
  18. 9
      zc-business/src/main/resources/mapper/business/DcEventMapper.xml
  19. 112
      zc-business/src/main/resources/mapper/business/DcExecuteActionMapper.xml

12
ruoyi-ui/src/api/system/device.js

@ -3,7 +3,7 @@ import request from '@/utils/request'
// 查询【请填写功能名称】列表
export function listDevice(query) {
return request({
url: '/system/device/list',
url: '/business/device/list',
method: 'get',
params: query
})
@ -12,7 +12,7 @@ export function listDevice(query) {
// 查询【请填写功能名称】详细
export function getDevice(id) {
return request({
url: '/system/device/' + id,
url: '/business/device/' + id,
method: 'get'
})
}
@ -20,7 +20,7 @@ export function getDevice(id) {
// 新增【请填写功能名称】
export function addDevice(data) {
return request({
url: '/system/device',
url: '/business/device',
method: 'post',
data: data
})
@ -29,7 +29,7 @@ export function addDevice(data) {
// 修改【请填写功能名称】
export function updateDevice(data) {
return request({
url: '/system/device',
url: '/business/device',
method: 'put',
data: data
})
@ -38,7 +38,7 @@ export function updateDevice(data) {
// 删除【请填写功能名称】
export function delDevice(id) {
return request({
url: '/system/device/' + id,
url: '/business/device/' + id,
method: 'delete'
})
}
@ -46,7 +46,7 @@ export function delDevice(id) {
// 导出【请填写功能名称】
export function exportDevice(query) {
return request({
url: '/system/device/export',
url: '/business/device/export',
method: 'get',
params: query
})

62
ruoyi-ui/src/api/system/product.js

@ -0,0 +1,62 @@
import request from '@/utils/request'
// 查询【请填写功能名称】列表
export function listProduct(query) {
return request({
url: '/business/product/list',
method: 'get',
params: query
})
}
// 查询【请填写功能名称】列表
export function queryProduct(query) {
return request({
url: '/business/product/query',
method: 'get',
params: query
})
}
// 查询【请填写功能名称】详细
export function getProduct(id) {
return request({
url: '/business/product/' + id,
method: 'get'
})
}
// 新增【请填写功能名称】
export function addProduct(data) {
return request({
url: '/business/product',
method: 'post',
data: data
})
}
// 修改【请填写功能名称】
export function updateProduct(data) {
return request({
url: '/business/product',
method: 'put',
data: data
})
}
// 删除【请填写功能名称】
export function delProduct(id) {
return request({
url: '/business/product/' + id,
method: 'delete'
})
}
// 导出【请填写功能名称】
export function exportProduct(query) {
return request({
url: '/business/product/export',
method: 'get',
params: query
})
}

613
ruoyi-ui/src/views/system/device/index.vue

@ -1,9 +1,9 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="设备桩号" prop="deviceNo">
<el-form-item label="设备桩号" prop="stakeMark">
<el-input
v-model="queryParams.deviceNo"
v-model="queryParams.stakeMark"
placeholder="请输入设备桩号"
clearable
@keyup.enter.native="handleQuery"
@ -26,36 +26,54 @@
/>
</el-form-item>
<el-form-item label="方向" prop="direction">
<el-input
v-model="queryParams.direction"
placeholder="请输入方向"
clearable
@keyup.enter.native="handleQuery"
/>
<el-select v-model="queryParams.direction" clearable placeholder="请选择方向" class="select-width">
<el-option
v-for="dict in directionList"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="厂家" prop="production">
<el-input
v-model="queryParams.production"
placeholder="请输入厂家"
clearable
@keyup.enter.native="handleQuery"
/>
<el-form-item label="所属部门" prop="groupId">
<el-select v-model="queryParams.groupId" clearable placeholder="请选择所属部门" class="select-width">
<el-option
v-for="dict in groupList"
:key="dict.deptId"
:label="dict.deptName"
:value="dict.deptId"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="型号" prop="model">
<el-input
v-model="queryParams.model"
placeholder="请输入型号"
clearable
@keyup.enter.native="handleQuery"
/>
<el-form-item label="设备状态" prop="deviceState">
<el-select v-model="queryParams.useState" clearable placeholder="请选择使用状态" class="select-width">
<el-option
v-for="dict in useStateList"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="网段" prop="network">
<el-input
v-model="queryParams.network"
placeholder="请输入网段"
clearable
@keyup.enter.native="handleQuery"
/>
<el-form-item label="设备类型" prop="deviceType">
<el-select v-model="queryParams.deviceType" clearable placeholder="请选择设备类型" class="select-width">
<el-option
v-for="dict in deviceTypeList"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="设备所属" prop="deviceType">
<el-select v-model="queryParams.facilitiesType" clearable placeholder="请选择设备所属" class="select-width">
<el-option
v-for="dict in facilitiesTypeList"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
@ -72,7 +90,8 @@
size="mini"
@click="handleAdd"
v-hasPermi="['system:device:add']"
>新增</el-button>
>新增
</el-button>
</el-col>
<el-col :span="1.5">
<el-button
@ -83,7 +102,8 @@
:disabled="single"
@click="handleUpdate"
v-hasPermi="['system:device:edit']"
>修改</el-button>
>修改
</el-button>
</el-col>
<el-col :span="1.5">
<el-button
@ -94,7 +114,8 @@
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['system:device:remove']"
>删除</el-button>
>删除
</el-button>
</el-col>
<el-col :span="1.5">
<el-button
@ -104,23 +125,86 @@
size="mini"
@click="handleExport"
v-hasPermi="['system:device:export']"
>导出</el-button>
>导出
</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="deviceList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="设备ID" align="center" prop="id" />
<el-table-column label="设备桩号" align="center" prop="deviceNo" />
<el-table-column label="设备名称" align="center" prop="deviceName" />
<el-table-column label="设备IP" align="center" prop="deviceIp" />
<el-table-column label="方向" align="center" prop="direction" />
<el-table-column label="厂家" align="center" prop="production" />
<el-table-column label="型号" align="center" prop="model" />
<el-table-column label="网段" align="center" prop="network" />
<el-table-column label="备注" align="center" prop="content" />
<el-table-column label="设备类型" align="center" prop="type" />
<el-table-column type="selection" width="55" align="center"/>
<el-table-column label="设备图片 " align="center" prop="deviceImg">
<template slot-scope="scope">
<el-image
v-if="scope.row.deviceImg"
style="width: 30px; height: 30px"
:src="scope.row.deviceImg"
:preview-src-list="[scope.row.deviceImg]"
>
</el-image>
<p v-else>暂无</p>
</template>
</el-table-column>
<el-table-column label="设备ID" align="center" prop="id"/>
<el-table-column label="物联设备ID" align="center" prop="iotDeviceId"/>
<el-table-column label="设备桩号" align="center" prop="stakeMark"/>
<el-table-column label="设备名称" align="center" prop="deviceName"/>
<el-table-column label="设备IP" align="center" prop="deviceIp"/>
<el-table-column label="设备编号" align="center" prop="deviceCode"/>
<el-table-column label="方向" align="center" prop="direction">
<template slot-scope="scope">
<span v-for="(item, index) in directionList" :key="index" v-if="scope.row.direction === item.value">
{{ item.label }}
</span>
</template>
</el-table-column>
<el-table-column label="所属产品" align="center" prop="productId">
<template slot-scope="scope">
<span v-for="(item, index) in productList" :key="index" v-if="scope.row.productId === item.id">
{{ item.productName }}
</span>
</template>
</el-table-column>
<el-table-column label="所属部门" align="center" prop="groupId">
<template slot-scope="scope">
<span v-for="(item, index) in groupList" :key="index" v-if="scope.row.groupId === item.deptId">
{{ item.deptName }}
</span>
</template>
</el-table-column>
<el-table-column label="设备状态" align="center" prop="deviceState">
<template slot-scope="scope">
<span v-for="(item, index) in deviceStateList" :key="index" v-if="scope.row.deviceState === item.value">
{{ item.label }}
</span>
</template>
</el-table-column>
<el-table-column label="设备类型" align="center" prop="deviceType">
<template slot-scope="scope">
<span v-for="(item, index) in deviceTypeList" :key="index" v-if="scope.row.deviceType === item.value">
{{ item.label }}
</span>
</template>
</el-table-column>
<el-table-column label="生产日期" align="center" prop="productionDate"/>
<el-table-column label="使用年限" align="center" prop="durableYears"/>
<el-table-column label="安装位置" align="center" prop="installationSite"/>
<el-table-column label="使用状态" align="center" prop="useState">
<template slot-scope="scope">
<span v-for="(item, index) in useStateList" :key="index" v-if="scope.row.useState === item.value">
{{ item.label }}
</span>
</template>
</el-table-column>
<el-table-column label="设备所属" align="center" prop="facilitiesType">
<template slot-scope="scope">
<span v-for="(item, index) in facilitiesTypeList" :key="index"
v-if="scope.row.facilitiesType === item.value"
>
{{ item.label }}
</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
@ -129,14 +213,16 @@
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['system:device:edit']"
>修改</el-button>
>修改
</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['system:device:remove']"
>删除</el-button>
>删除
</el-button>
</template>
</el-table-column>
</el-table>
@ -150,28 +236,119 @@
/>
<!-- 添加或修改请填写功能名称对话框 -->
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="设备桩号" prop="deviceNo">
<el-input v-model="form.deviceNo" placeholder="请输入设备桩号" />
<el-dialog :title="title" :visible.sync="open" width="800px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="100px">
<el-form-item label="设备图片" prop="deviceImg">
<div class="photo">
<el-upload
name="file"
:action="reqFileUrl"
:accept="accept"
:before-upload="beforeUpload"
:headers="{'Authorization': 'Bearer ' + getToken()}"
:show-file-list="false"
:on-success="handleSuccess"
>
<img v-if="form.deviceImg" :src="form.deviceImg" class="avatar">
<i v-else class="el-icon-plus avatar-uploader-icon"></i>
</el-upload>
</div>
</el-form-item>
<el-form-item label="物联设备ID" prop="iotDeviceId">
<el-input v-model="form.iotDeviceId" placeholder="请输入物联设备ID"/>
</el-form-item>
<el-form-item label="设备桩号" prop="stakeMark">
<el-input v-model="form.stakeMark" placeholder="请输入设备桩号"/>
</el-form-item>
<el-form-item label="设备名称" prop="deviceName">
<el-input v-model="form.deviceName" placeholder="请输入设备名称" />
<el-input v-model="form.deviceName" placeholder="请输入设备名称"/>
</el-form-item>
<el-form-item label="设备IP" prop="deviceIp">
<el-input v-model="form.deviceIp" placeholder="请输入设备IP" />
<el-input v-model="form.deviceIp" placeholder="请输入设备IP"/>
</el-form-item>
<el-form-item label="设备编号" prop="deviceCode">
<el-input v-model="form.deviceCode" placeholder="请输入设备编号"/>
</el-form-item>
<el-form-item label="方向" prop="direction">
<el-input v-model="form.direction" placeholder="请输入方向" />
<el-select v-model="form.direction" clearable placeholder="请选择方向" class="select-width">
<el-option
v-for="dict in directionList"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="厂家" prop="production">
<el-input v-model="form.production" placeholder="请输入厂家" />
<el-form-item label="所属产品" prop="productId">
<el-select v-model="form.productId" clearable placeholder="请选择所属产品" class="select-width">
<el-option
v-for="dict in productList"
:key="dict.id"
:label="dict.productName"
:value="dict.id"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="型号" prop="model">
<el-input v-model="form.model" placeholder="请输入型号" />
<el-form-item label="所属部门" prop="groupId">
<el-select v-model="form.groupId" clearable placeholder="请选择所属部门" class="select-width">
<el-option
v-for="dict in groupList"
:key="dict.deptId"
:label="dict.deptName"
:value="dict.deptId"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="网段" prop="network">
<el-input v-model="form.network" placeholder="请输入网段" />
<el-form-item label="设备类型" prop="deviceType">
<el-select v-model="form.deviceType" clearable placeholder="请选择设备类型" class="select-width">
<el-option
v-for="dict in deviceTypeList"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
</el-select>
</el-form-item>
<el-row>
<el-col :span="12">
<el-form-item label="生产日期" prop="productionDate">
<el-date-picker
v-model="form.productionDate"
type="datetime"
placeholder="选择日期时间"
>
</el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="使用年限" prop="durableYears">
<el-input-number v-model="form.durableYears" controls-position="right" :min="0">
</el-input-number>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="安装位置" prop="installationSite">
<el-input v-model="form.installationSite" placeholder="请输入安装位置"/>
</el-form-item>
<el-form-item label="使用状态" prop="useState">
<el-select v-model="form.useState" clearable placeholder="请选择使用状态" class="select-width">
<el-option
v-for="dict in useStateList"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="设备所属" prop="facilitiesType">
<el-select v-model="form.facilitiesType" clearable placeholder="请选择设备所属" class="select-width">
<el-option
v-for="dict in facilitiesTypeList"
:key="dict.value"
:label="dict.label"
:value="dict.value"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="备注">
<!-- 脚本 -->
@ -191,16 +368,23 @@
</template>
<script>
import { listDevice, getDevice, delDevice, addDevice, updateDevice } from "@/api/system/device";
import JsonEditor from '@/components/JsonEditor'
import { getToken } from '@/utils/auth'
import { listDevice, getDevice, delDevice, addDevice, updateDevice } from '@/api/system/device'
import { listDept } from '@/api/system/dept'
import { queryProduct } from '@/api/system/product'
import JsonEditor from '@/components/Editor'
export default {
name: "Device",
name: 'Device',
components: {
JsonEditor
},
data() {
return {
//
reqFileUrl: process.env.VUE_APP_BASE_API + '/common/upload',
//
accept: '.jpg,.jpeg,.png,.JPG,.JPEG,.svg,.SVG',
//
editorOptions: {
mode: 'text', // tree,code,form,text,view
@ -221,125 +405,284 @@ export default {
//
deviceList: [],
//
title: "",
title: '',
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
deviceNo: null,
stakeMark: null,
deviceName: null,
deviceIp: null,
direction: null,
production: null,
model: null,
network: null,
content: null,
type: null
groupId: null,
deviceState: null,
deviceType: null
},
//
form: {},
//
rules: {
stakeMark: [
{ required: true, message: '请输入设备桩号', trigger: 'blur' }
],
deviceName: [
{ required: true, message: '请输入设备名称', trigger: 'blur' }
],
deviceType: [
{ required: true, message: '请输入设备类型', trigger: 'blur' }
]
},
//
directionList: [],
//
groupList: [],
//
productList: [],
//
deviceStateList: [],
//
deviceTypeList: [],
// 使
useStateList: [],
//
facilitiesTypeList: []
}
};
},
created() {
this.getList();
this.getList()
this.directionList = [
{
label: '上行',
value: '1'
},
{
label: '中',
value: '2'
},
{
label: '下行',
value: '3'
}
]
listDept().then(response => {
this.groupList = response.data
})
queryProduct().then(response => {
this.productList = response.data
})
this.deviceStateList = [
{
label: '异常',
value: '0'
},
{
label: '正常',
value: '1'
}
]
this.deviceTypeList = [
{
label: '摄像机',
value: 1
},
{
label: '可变信息标志',
value: 2
},
{
label: '气象监测器',
value: 3
},
{
label: '出口诱导灯',
value: 4
},
{
label: '路段语音广播',
value: 5
},
{
label: '护栏碰撞',
value: 6
},
{
label: '毫米波雷达',
value: 7
},
{
label: '合流区预警',
value: 8
},
{
label: '智慧锥桶',
value: 9
},
{
label: '激光疲劳唤醒',
value: 10
},
{
label: '一类交通量调查站',
value: 11
},
{
label: '行车诱导',
value: 12
},
{
label: '智能设备箱',
value: 13
},
{
label: '光线在线监测',
value: 14
}
]
this.useStateList = [
{
label: '未使用',
value: 0
},
{
label: '已使用',
value: 1
}
]
this.facilitiesTypeList = [
{
label: '主干道',
value: '0'
},
{
label: '服务区',
value: '1'
},
{
label: '收费站',
value: '3'
}
]
},
methods: {
//
getToken() {
return getToken()
},
//
handleSuccess(response, file, fileList) {
this.form.deviceImg = response.url
},
//
beforeUpload(file) {
const isLt2M = file.size / 1024 / 1024 < 2 //
if (!isLt2M) {
this.$message({
message: '上传文件大小不能超过 2M ',
type: 'warning'
})
}
return isLt2M
},
/** 查询【请填写功能名称】列表 */
getList() {
this.loading = true;
this.loading = true
listDevice(this.queryParams).then(response => {
this.deviceList = response.rows;
this.total = response.total;
this.loading = false;
});
this.deviceList = response.rows
this.total = response.total
this.loading = false
})
},
//
cancel() {
this.open = false;
this.reset();
this.open = false
this.reset()
},
//
reset() {
this.form = {
id: null,
deviceNo: null,
deviceImg: null,
iotDeviceId: null,
stakeMark: null,
deviceName: null,
deviceIp: null,
deviceCode: null,
direction: null,
production: null,
model: null,
network: null,
content: null,
type: null
};
this.resetForm("form");
productId: null,
groupId: null,
deviceState: null,
productionDate: null,
durableYears: null,
installationSite: null,
useState: null,
facilitiesType: null
}
this.resetForm('form')
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
this.queryParams.pageNum = 1
this.getList()
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm");
this.handleQuery();
this.resetForm('queryForm')
this.handleQuery()
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length!==1
this.single = selection.length !== 1
this.multiple = !selection.length
},
/** 新增按钮操作 */
handleAdd() {
this.reset();
this.open = true;
this.title = "添加【请填写功能名称】";
this.reset()
this.open = true
this.title = '添加【请填写功能名称】'
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset();
this.reset()
const id = row.id || this.ids
getDevice(id).then(response => {
this.form = response.data;
this.open = true;
this.title = "修改【请填写功能名称】";
});
this.form = response.data
this.open = true
this.title = '修改【请填写功能名称】'
})
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
this.$refs['form'].validate(valid => {
if (valid) {
if (this.form.id != null) {
updateDevice(this.form).then(response => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
});
this.$modal.msgSuccess('修改成功')
this.open = false
this.getList()
})
} else {
addDevice(this.form).then(response => {
this.$modal.msgSuccess("新增成功");
this.open = false;
this.getList();
});
this.$modal.msgSuccess('新增成功')
this.open = false
this.getList()
})
}
}
});
})
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids;
const ids = row.id || this.ids
this.$modal.confirm('是否确认删除【请填写功能名称】编号为"' + ids + '"的数据项?').then(function() {
return delDevice(ids);
return delDevice(ids)
}).then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
}).catch(() => {});
this.getList()
this.$modal.msgSuccess('删除成功')
}).catch(() => {
})
},
/** 导出按钮操作 */
handleExport() {
@ -348,5 +691,45 @@ export default {
}, `device_${new Date().getTime()}.xlsx`)
}
}
};
}
</script>
<style lang="scss" scoped>
$width: 150px;
$height: 150px;
::v-deep .el-upload {
border: 1px dashed #d9d9d9;
border-radius: 6px;
cursor: pointer;
position: relative;
overflow: hidden;
width: $width;
height: $height;
}
//
::v-deep .el-upload:hover {
border-color: #409EFF;
}
.avatar-uploader-icon {
font-size: 28px;
color: #8c939d;
width: $width;
height: $height;
line-height: $height;
text-align: center;
}
.avatar {
width: $width;
height: $height;
display: block;
}
.photo {
margin-left: 30%;
}
</style>

108
zc-business/src/main/java/com/zc/business/controller/DcEmergencyPlansController.java

@ -0,0 +1,108 @@
package com.zc.business.controller;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.page.TableDataInfo;
import com.zc.business.domain.DcEmergencyPlans;
import com.zc.business.domain.DcEvent;
import com.zc.business.service.DcEmergencyPlansService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* 事件预案Controller
*
* @author wangjiabao
* @date 2024-02-21
*/
@Api(tags = "事件预案")
@RestController
@RequestMapping("/business/plans")
public class DcEmergencyPlansController extends BaseController {
@Autowired
private DcEmergencyPlansService dcEmergencyPlansService;
/**
* 查询事件预案列表
*/
@ApiOperation("查询事件预案列表")
@PreAuthorize("@ss.hasPermi('business:plans:list')")
@GetMapping("/list")
public TableDataInfo list(DcEmergencyPlans dcEmergencyPlans) {
startPage();
List<DcEmergencyPlans> list = dcEmergencyPlansService.selectDcEmergencyPlansList(dcEmergencyPlans);
return getDataTable(list);
}
/**
* 根据事件预案id查询事件预案列表
*/
@ApiOperation("根据事件预案id查询事件预案列表")
@PreAuthorize("@ss.hasPermi('business:plans:list')")
@GetMapping("/list/{id}")
public AjaxResult list(@PathVariable @ApiParam(name = "id", value = "事件预案id", required = true) Integer id) {
DcEmergencyPlans dcEmergencyPlans = dcEmergencyPlansService.selectDcEmergencyPlans(id);
return AjaxResult.success(dcEmergencyPlans);
}
/**
* 根据事件数据查询事件预案列表
*/
@ApiOperation("根据事件数据查询事件预案列表")
@PreAuthorize("@ss.hasPermi('business:plans:list')")
@PostMapping("/list/event/type")
public AjaxResult listByEventType(@RequestBody DcEvent dcEvent) {
List<DcEmergencyPlans> dcEmergencyPlansList = dcEmergencyPlansService.selectDcEmergencyPlansByEventType(dcEvent);
return AjaxResult.success(dcEmergencyPlansList);
}
/**
* 新增事件预案
*/
@ApiOperation("新增预案")
@PreAuthorize("@ss.hasPermi('business:plans:add')")
@PostMapping
public AjaxResult add(@RequestBody DcEmergencyPlans dcEmergencyPlans) {
return toAjax(dcEmergencyPlansService.insertDcEmergencyPlans(dcEmergencyPlans));
}
/**
* 修改事件预案
*/
@ApiOperation("修改预案")
@PreAuthorize("@ss.hasPermi('business:plans:edit')")
@PutMapping
public AjaxResult update(@RequestBody DcEmergencyPlans dcEmergencyPlans) {
return toAjax(dcEmergencyPlansService.updateDcEmergencyPlans(dcEmergencyPlans));
}
/**
* 批量修改事件预案
*/
// @ApiOperation("修改预案")
// @PreAuthorize("@ss.hasPermi('business:plans:edit')")
// @Log(title = "事件预案", businessType = BusinessType.UPDATE)
@PutMapping("/batch")
public AjaxResult updateBatch(@RequestBody List<DcEmergencyPlans> dcEmergencyPlansList) {
return toAjax(dcEmergencyPlansService.updateBatchDcEmergencyPlans(dcEmergencyPlansList));
}
/**
* 批量删除事件预案
*/
@ApiOperation("批量删除预案")
@PreAuthorize("@ss.hasPermi('business:plans:remove')")
@DeleteMapping("/{ids}")
public AjaxResult update(@PathVariable String[] ids) {
return toAjax(dcEmergencyPlansService.deleteDcEmergencyPlans(ids));
}
}

9
zc-business/src/main/java/com/zc/business/domain/DcDevice.java

@ -1,6 +1,8 @@
package com.zc.business.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@ -20,6 +22,7 @@ public class DcDevice {
public static final String ONLINE = "1";
@ApiModelProperty("ID")
@TableId(value = "id", type = IdType.AUTO)
private Long id;
@ApiModelProperty("物联设备ID")
private String iotDeviceId;
@ -37,6 +40,8 @@ public class DcDevice {
private String deviceCode;
@ApiModelProperty("设备类型")
private Integer deviceType;
@ApiModelProperty("设备图片")
private String deviceImg;
@ApiModelProperty("安装日期")
private Date installationDate;
@ApiModelProperty("生产日期")
@ -55,6 +60,10 @@ public class DcDevice {
private String remark;
@ApiModelProperty("设施归属类型(0:默认1: 道路沿线2:桥梁3: 隧道4:收费广场5: 收费站6: 服务区等")
private String facilitiesType;
@ApiModelProperty("设备ip")
private String deviceIp;
@ApiModelProperty("范围桩号")
private String stakeMarkRange;
@ApiModelProperty("创建时间")
private Date createTime;
@ApiModelProperty("修改时间")

85
zc-business/src/main/java/com/zc/business/domain/DcEmergencyPlans.java

@ -0,0 +1,85 @@
package com.zc.business.domain;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
import java.util.List;
/**
* 事件预案对象 dc_emergency_plans
*
* @author wangjiabao
* @date 2024-02-21
*/
@ApiModel("事件预案实体")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class DcEmergencyPlans {
/**
* 事件预案编号
*/
@ApiModelProperty("事件预案编号")
private Integer id;
/**
* 预案名称
*/
@ApiModelProperty("预案名称")
private String planName;
/**
* 事件类型
*/
@ApiModelProperty("事件类型")
private int eventType;
/**
* 触发机制
*/
@ApiModelProperty("触发机制")
private String triggerMechanism;
@ApiModelProperty("创建时间")
private Date createTime;
@ApiModelProperty("修改时间")
private Date updateTime;
/**
* 设备类型
*/
@ApiModelProperty("设备类型")
private String deviceType;
/**
* 触发条件
*/
@ApiModelProperty("触发条件")
private String triggeringCondition;
/**
* 可控设备
*/
@ApiModelProperty("可控设备")
private String controllableDevice;
/**
* 控制指令
*/
@ApiModelProperty("控制指令")
private String controlCommand;
/**
* 执行操作
*/
@ApiModelProperty("执行操作")
private List<DcExecuteAction> dcExecuteAction;
}

79
zc-business/src/main/java/com/zc/business/domain/DcExecuteAction.java

@ -0,0 +1,79 @@
package com.zc.business.domain;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
/**
* 执行操作对象 dc_execute_action
*
* @author wangjiabao
* @date 2024-02-21
*/
@ApiModel("执行操作实体")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class DcExecuteAction{
/**
* 执行操作编号
*/
@ApiModelProperty("执行操作编号")
private String id;
/**
* 所属预案
*/
@ApiModelProperty("所属预案")
private Integer emergencyPlansId;
/**
* 设备类型
*/
@ApiModelProperty("设备类型")
private int deviceType;
/**
* 操作类型
*/
@ApiModelProperty("操作类型")
private int actionType;
@ApiModelProperty("创建时间")
private Date createTime;
@ApiModelProperty("修改时间")
private Date updateTime;
/**
* 检索规则条件
*/
@ApiModelProperty("检索规则条件")
private int searchRule;
/**
* 个数/里程
*/
@ApiModelProperty("个数/里程")
private Integer number;
/**
* 设备列表
*/
@ApiModelProperty("设备列表")
private String deviceList;
/**
* 其他配置
*/
@ApiModelProperty("其他配置")
private String otherConfig;
}

38
zc-business/src/main/java/com/zc/business/enums/EventTypeEnum.java

@ -0,0 +1,38 @@
package com.zc.business.enums;
/**
* 事件类型
* @author wangjiabao
*/
public enum EventTypeEnum {
TRAFFIC_ACCIDENT(1, "交通事故"),
VEHICLE_MALFUNCTION(2, "车辆故障"),
TRAFFIC_CONTROL(3, "交通管制"),
TRAFFIC_JAM(4, "交通拥堵"),
ILLEGAL_ROAD_USE(5, "非法上路"),
ROADBLOCK_CLEARANCE(6, "路障清除"),
CONSTRUCTION_AND_CONSTRUCTION(7, "施工建设"),
SERVICE_AREA_ABNORMALITY(8, "服务区异常"),
EQUIPMENT_HAZARDS(9, "设施设备隐患"),
ABNORMAL_WEATHER(10, "异常天气"),
OTHER_EVENTS(11, "其他事件");
private final int code;
private final String info;
EventTypeEnum(int code, String info)
{
this.code = code;
this.info = info;
}
public int getCode()
{
return code;
}
public String getInfo()
{
return info;
}
}

68
zc-business/src/main/java/com/zc/business/mapper/DcEmergencyPlansMapper.java

@ -0,0 +1,68 @@
package com.zc.business.mapper;
import com.zc.business.domain.DcEmergencyPlans;
import com.zc.business.domain.DcEvent;
import java.util.List;
/**
* 事件预案Mapper接口
*
* @author wangjiabao
* @date 2024-02-21
*/
public interface DcEmergencyPlansMapper {
/**
* 查询事件预案
*
* @param dcEmergencyPlans 事件预案
* @return 结果
*/
List<DcEmergencyPlans> selectDcEmergencyPlansList(DcEmergencyPlans dcEmergencyPlans);
/**
* 根据事件id查询事件预案
*
* @param id 事件预案
* @return 结果
*/
DcEmergencyPlans selectDcEmergencyPlans(Integer id);
/**
* 根据事件类型查询事件预案
*
* @param event 事件预案
* @return 结果
*/
List<DcEmergencyPlans> selectDcEmergencyPlansByEventType(DcEvent event);
/**
* 新增事件预案
*
* @param dcEmergencyPlans 事件预案
* @return 结果
*/
int insertDcEmergencyPlans(DcEmergencyPlans dcEmergencyPlans);
/**
* 修改事件预案
*
* @param dcEmergencyPlans 事件预案
* @return 结果
*/
int updateDcEmergencyPlans(DcEmergencyPlans dcEmergencyPlans);
/**
* 批量删除事件预案
*
* @param ids 事件预案
* @return 结果
*/
int deleteDcEmergencyPlans(String[] ids);
}

60
zc-business/src/main/java/com/zc/business/mapper/DcExecuteActionMapper.java

@ -0,0 +1,60 @@
package com.zc.business.mapper;
import com.zc.business.domain.DcExecuteAction;
import java.util.List;
/**
* 执行操作Mapper接口
*
* @author wangjiabao
* @date 2024-02-21
*/
public interface DcExecuteActionMapper {
/**
* 批量新增执行操作
*
* @param dcExecuteActionList 执行操作
* @return 结果
*/
int insertDcExecuteActionBatch(List<DcExecuteAction> dcExecuteActionList);
/**
* 批量修改执行操作
*
* @param dcExecuteActionList 执行操作
* @return 结果
*/
int updateDcExecuteActionBatch(List<DcExecuteAction> dcExecuteActionList);
/**
* 批量删除执行操作
*
* @param ids 执行操作
* @return 结果
*/
int deleteDcExecuteActionByEmergencyPlansId(String[] ids);
/**
* 批量删除执行操作
*
* @param ids 执行操作
* @return 结果
*/
int deleteDcExecuteAction(List<String> ids);
/**
* 根据事件预案id查询执行操作
*
* @param emergencyPlansId 执行操作
* @return 结果
*/
List<String> selectDcExecuteActionByEmergencyPlansId(String emergencyPlansId);
}

72
zc-business/src/main/java/com/zc/business/service/DcEmergencyPlansService.java

@ -0,0 +1,72 @@
package com.zc.business.service;
import com.zc.business.domain.DcEmergencyPlans;
import com.zc.business.domain.DcEvent;
import java.util.List;
/**
* 事件预案Service接口
*
* @author wangjiabao
* @date 2024-02-21
*/
public interface DcEmergencyPlansService {
/**
* 查询事件预案
*
* @param dcEmergencyPlans 事件预案
* @return 结果
*/
List<DcEmergencyPlans> selectDcEmergencyPlansList(DcEmergencyPlans dcEmergencyPlans);
/**
* 根据事件id查询事件预案
*
* @param id 事件预案
* @return 结果
*/
DcEmergencyPlans selectDcEmergencyPlans(Integer id);
/**
* 根据事件类型查询事件预案
*
* @param event 事件预案
* @return 结果
*/
List<DcEmergencyPlans> selectDcEmergencyPlansByEventType(DcEvent event);
/**
* 新增事件预案
*
* @param dcEmergencyPlans 事件预案
* @return 结果
*/
int insertDcEmergencyPlans(DcEmergencyPlans dcEmergencyPlans);
/**
* 修改事件预案
*
* @param dcEmergencyPlans 事件预案
* @return 结果
*/
int updateDcEmergencyPlans(DcEmergencyPlans dcEmergencyPlans);
/**
* 批量修改事件预案
*
* @param dcEmergencyPlansList 事件预案
* @return 结果
*/
int updateBatchDcEmergencyPlans(List<DcEmergencyPlans> dcEmergencyPlansList);
/**
* 批量删除事件预案
*
* @param ids 事件预案
* @return 结果
*/
int deleteDcEmergencyPlans(String[] ids);
}

54
zc-business/src/main/java/com/zc/business/service/DcExecuteActionService.java

@ -0,0 +1,54 @@
package com.zc.business.service;
import com.zc.business.domain.DcExecuteAction;
import java.util.List;
/**
* 执行操作Service接口
*
* @author wangjiabao
* @date 2024-02-21
*/
public interface DcExecuteActionService {
/**
* 批量新增执行操作
*
* @param dcExecuteActionList 执行操作
* @return 结果
*/
int insertDcExecuteActionBatch(List<DcExecuteAction> dcExecuteActionList);
/**
* 批量修改执行操作
*
* @param dcExecuteActionList 执行操作
* @return 结果
*/
int updateDcExecuteActionBatch(List<DcExecuteAction> dcExecuteActionList);
/**
* 根据事件预案id批量删除执行操作
*
* @param ids 执行操作
* @return 结果
*/
int deleteDcExecuteActionByEmergencyPlansId(String[] ids);
/**
* 批量删除执行操作
*
* @param ids 执行操作
* @return 结果
*/
int deleteDcExecuteAction(List<String> ids);
/**
* 根据事件预案id查询执行操作
*
* @param emergencyPlansId 执行操作
* @return 结果
*/
List<String> selectDcExecuteActionByEmergencyPlansId(String emergencyPlansId);
}

15
zc-business/src/main/java/com/zc/business/service/impl/DcBoardServiceImpl.java

@ -103,7 +103,7 @@ public class DcBoardServiceImpl implements IDcBoardService {
//发布记录
LoginUser loginUser = SecurityUtils.getLoginUser();
for (Map<String, Object> content : contentList) {
/*for (Map<String, Object> content : contentList) {
DcBoardReleaseLog releaseLog = new DcBoardReleaseLog();
releaseLog.setDeviceId(deviceId);
releaseLog.setDeviceName(dcDevice.getDeviceName());
@ -115,7 +115,18 @@ public class DcBoardServiceImpl implements IDcBoardService {
releaseLog.setReleaseDeptId(loginUser.getDeptId().toString());
releaseLog.setPlatform(loginUser.getUser().getUserType());
dcBoardReleaseLogMapper.insertDcBoardReleaseLog(releaseLog);
}
}*/
DcBoardReleaseLog releaseLog = new DcBoardReleaseLog();
releaseLog.setDeviceId(deviceId);
releaseLog.setDeviceName(dcDevice.getDeviceName());
releaseLog.setReleaseContent(JSON.toJSONString(contentList));
releaseLog.setReleaseIp(loginUser.getIpaddr());
releaseLog.setReleaseStatus(status);
releaseLog.setReleaseUserId(loginUser.getUsername());
releaseLog.setReleaseUserName(loginUser.getUser().getNickName());
releaseLog.setReleaseDeptId(loginUser.getDeptId().toString());
releaseLog.setPlatform(loginUser.getUser().getUserType());
dcBoardReleaseLogMapper.insertDcBoardReleaseLog(releaseLog);
}
return ajaxResult;

359
zc-business/src/main/java/com/zc/business/service/impl/DcEmergencyPlansServiceImpl.java

@ -0,0 +1,359 @@
package com.zc.business.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.ruoyi.common.utils.DateUtils;
import com.zc.business.domain.*;
import com.zc.business.enums.EventTypeEnum;
import com.zc.business.mapper.DcEmergencyPlansMapper;
import com.zc.business.service.DcEmergencyPlansService;
import com.zc.business.service.DcExecuteActionService;
import org.apache.commons.lang3.StringEscapeUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import java.util.*;
import java.util.stream.Collectors;
@Service
public class DcEmergencyPlansServiceImpl implements DcEmergencyPlansService {
@Resource
private DcEmergencyPlansMapper dcEmergencyPlansMapper;
@Resource
private DcExecuteActionService dcExecuteActionService;
/**
* 查询事件预案
*
* @param dcEmergencyPlans 事件预案
* @return 结果
*/
@Override
public List<DcEmergencyPlans> selectDcEmergencyPlansList(DcEmergencyPlans dcEmergencyPlans) {
return dcEmergencyPlansMapper.selectDcEmergencyPlansList(dcEmergencyPlans);
}
/**
* 根据事件id查询事件预案
*
* @param id 事件预案
* @return 结果
*/
@Override
public DcEmergencyPlans selectDcEmergencyPlans(Integer id) {
return dcEmergencyPlansMapper.selectDcEmergencyPlans(id);
}
/**
* 根据事件类型查询事件预案
*
* @param event 事件预案
* @return 结果
*/
@Override
public List<DcEmergencyPlans> selectDcEmergencyPlansByEventType(DcEvent event) {
List<DcEmergencyPlans> dcEmergencyPlansList = dcEmergencyPlansMapper.selectDcEmergencyPlansByEventType(event);
int eventType = Integer.parseInt(event.getEventType().toString());
if (eventType == EventTypeEnum.TRAFFIC_ACCIDENT.getCode()) {
return dcEmergencyPlansList.stream()
.filter(dcEmergencyPlans -> {
String triggerMechanism = dcEmergencyPlans.getTriggerMechanism();
JSONObject triggerJson = JSONObject.parseObject(triggerMechanism);
int eventLevel = Integer.parseInt(triggerJson.get("eventLevel").toString());
return eventLevel == event.getEventLevel();
})
.collect(Collectors.toList());
} else if (eventType == EventTypeEnum.VEHICLE_MALFUNCTION.getCode()) {
return dcEmergencyPlansList.stream()
.filter(dcEmergencyPlans -> {
String triggerMechanism = dcEmergencyPlans.getTriggerMechanism();
JSONObject triggerJson = JSONObject.parseObject(triggerMechanism);
String[] lane = event.getLang().split(",");
int[] intArray = Arrays.stream(lane)
.mapToInt(Integer::parseInt)
.toArray();
JSONArray eventLevel = JSONArray.parseArray(triggerJson.get("roadOccupancy").toString());
return Arrays.stream(intArray).anyMatch(Arrays.asList(eventLevel.toArray())::contains);
})
.collect(Collectors.toList());
} else if (eventType == EventTypeEnum.TRAFFIC_CONTROL.getCode()) {
return dcEmergencyPlansList.stream()
.filter(dcEmergencyPlans -> {
String triggerMechanism = dcEmergencyPlans.getTriggerMechanism();
JSONObject triggerJson = JSONObject.parseObject(triggerMechanism);
// 管制分类
Integer controlType = Integer.parseInt(triggerJson.get("controlType").toString());
// 分类
Integer classify = Integer.parseInt(triggerJson.get("classify").toString());
// 分类原因
Integer controlCause = Integer.parseInt(triggerJson.get("controlCause").toString());
// 事件--交通管制数据
DcEventTrafficControl dcEventTrafficControl = event.getDcEventTrafficControl();
Integer eventControlType = Integer.parseInt(dcEventTrafficControl.getControlType().toString());
Integer eventClassify = Integer.parseInt(dcEventTrafficControl.getClassify().toString());
Integer eventControlCause = Integer.parseInt(dcEventTrafficControl.getControlCause().toString());
return controlType.equals(eventControlType) && classify.equals(eventClassify) && controlCause.equals(eventControlCause);
})
.collect(Collectors.toList());
} else if (eventType == EventTypeEnum.TRAFFIC_JAM.getCode()) {
return dcEmergencyPlansList.stream()
.filter(dcEmergencyPlans -> {
String triggerMechanism = dcEmergencyPlans.getTriggerMechanism();
JSONObject triggerJson = JSONObject.parseObject(triggerMechanism);
// 拥堵原因
Integer congestionCause = Integer.parseInt(triggerJson.get("congestionCause").toString());
// 详细原因
Integer detailedReasons = Integer.parseInt(triggerJson.get("detailedReasons").toString());
// 事件--交通拥堵数据
DcEventTrafficCongestion dcEventTrafficCongestion = event.getDcEventTrafficCongestion();
Integer eventCongestionCause = Integer.parseInt(dcEventTrafficCongestion.getCongestionCause().toString());
Integer eventDetailedReasons = Integer.parseInt(dcEventTrafficCongestion.getDetailedReasons().toString());
return congestionCause.equals(eventCongestionCause) && detailedReasons.equals(eventDetailedReasons);
})
.collect(Collectors.toList());
} else if (eventType == EventTypeEnum.ILLEGAL_ROAD_USE.getCode() || eventType == EventTypeEnum.ROADBLOCK_CLEARANCE.getCode()) {
return dcEmergencyPlansList.stream()
.filter(dcEmergencyPlans -> {
String triggerMechanism = dcEmergencyPlans.getTriggerMechanism();
JSONObject triggerJson = JSONObject.parseObject(triggerMechanism);
String eventSubclass = triggerJson.get("eventSubclass").toString();
// 事件--非法上路/路障清除 数据
String subclass = event.getEventSubclass();
return eventSubclass.equals(subclass);
})
.collect(Collectors.toList());
} else if (eventType == EventTypeEnum.CONSTRUCTION_AND_CONSTRUCTION.getCode()) {
return dcEmergencyPlansList.stream()
.filter(dcEmergencyPlans -> {
String triggerMechanism = dcEmergencyPlans.getTriggerMechanism();
JSONObject triggerJson = JSONObject.parseObject(triggerMechanism);
String subclass = triggerJson.get("eventSubclass").toString();
Integer controlMode = Integer.parseInt(triggerJson.get("controlMode").toString());
JSONArray lane = JSONArray.parseArray(triggerJson.get("lane").toString());
// 事件--施工建设数据
DcEventConstruction dcEventConstruction = event.getDcEventConstruction();
String eventSubclass = event.getEventSubclass();
Integer eventControlMode = Integer.parseInt(dcEventConstruction.getControlMode().toString());
String[] eventLane = event.getLang().split(",");
int[] eventLaneInt = Arrays.stream(eventLane)
.mapToInt(Integer::parseInt)
.toArray();
return subclass.equals(eventSubclass) && controlMode.equals(eventControlMode)
&& Arrays.stream(eventLaneInt).anyMatch(Arrays.asList(lane.toArray())::contains);
})
.collect(Collectors.toList());
} else if (eventType == EventTypeEnum.SERVICE_AREA_ABNORMALITY.getCode()) {
return dcEmergencyPlansList.stream()
.filter(dcEmergencyPlans -> {
String triggerMechanism = dcEmergencyPlans.getTriggerMechanism();
JSONObject triggerJson = JSONObject.parseObject(triggerMechanism);
Integer facilityId = Integer.parseInt(triggerJson.get("facilityId").toString());
Integer disableFacility = Integer.parseInt(triggerJson.get("disableFacility").toString());
// 事件--服务区异常数据
DcEventServiceArea dcEventServiceArea = event.getDcEventServiceArea();
Integer eventFacilityId = Integer.parseInt(dcEventServiceArea.getFacilityId().toString());
Integer eventDisableFacility = Integer.parseInt(dcEventServiceArea.getDisableFacility().toString());
return facilityId.equals(eventFacilityId) && disableFacility.equals(eventDisableFacility);
})
.collect(Collectors.toList());
} else if (eventType == EventTypeEnum.ABNORMAL_WEATHER.getCode()) {
return dcEmergencyPlansList.stream()
.filter(dcEmergencyPlans -> {
String triggerMechanism = dcEmergencyPlans.getTriggerMechanism();
JSONObject triggerJson = JSONObject.parseObject(triggerMechanism);
String unusualWeather = triggerJson.get("unusualWeather").toString();
// 条件
JSONArray conditions = JSON.parseArray(triggerJson.get("conditions").toString());
// 事件--异常天气数据
DcEventAbnormalWeather dcEventAbnormalWeather = event.getDcEventAbnormalWeather();
String weatherSituation = dcEventAbnormalWeather.getWeatherSituation();
// 异常天气数据
Integer numericalValue = Integer.parseInt(dcEventAbnormalWeather.getNumericalValue());
String conditionString = conditions.stream().map(condition -> {
JSONObject conditionJSON = JSON.parseObject(condition.toString());
String comparisonOperator = StringEscapeUtils.unescapeXml(conditionJSON.get("comparisonOperator").toString());
String thresholdValue = conditionJSON.get("thresholdValue").toString();
return numericalValue + comparisonOperator + thresholdValue;
}).collect(Collectors.joining(" && "));
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("js");
boolean result = false;
try {
result = (boolean) engine.eval(conditionString);
} catch (ScriptException e) {
e.printStackTrace();
}
return unusualWeather.equals(weatherSituation) && result;
})
.collect(Collectors.toList());
} else {
return null;
}
}
/**
* 新增事件预案
*
* @param dcEmergencyPlans 事件预案
* @return 结果
*/
@Transactional(rollbackFor = Exception.class)
@Override
public int insertDcEmergencyPlans(DcEmergencyPlans dcEmergencyPlans) {
dcEmergencyPlans.setCreateTime(DateUtils.getNowDate());
List<DcExecuteAction> dcExecuteActionList = dataProcessing(dcEmergencyPlans);
// 插入事件预案表数据
dcEmergencyPlansMapper.insertDcEmergencyPlans(dcEmergencyPlans);
dcExecuteActionList.forEach(dcExecuteAction -> dcExecuteAction.setEmergencyPlansId(dcEmergencyPlans.getId()));
// 插入执行操作表数据
dcExecuteActionList.forEach(dcExecuteAction -> dcExecuteAction.setCreateTime(DateUtils.getNowDate()));
return dcExecuteActionService.insertDcExecuteActionBatch(dcExecuteActionList);
}
/**
* 修改事件预案
*
* @param dcEmergencyPlans 事件预案
* @return 结果
*/
@Transactional(rollbackFor = Exception.class)
@Override
public int updateDcEmergencyPlans(DcEmergencyPlans dcEmergencyPlans) {
dcEmergencyPlans.setUpdateTime(DateUtils.getNowDate());
List<DcExecuteAction> dcExecuteActionList = dataProcessing(dcEmergencyPlans);
// 修改事件预案表数据
dcEmergencyPlansMapper.updateDcEmergencyPlans(dcEmergencyPlans);
// 修改执行操作表数据
dcExecuteActionList.forEach(dcExecuteAction -> dcExecuteAction.setUpdateTime(DateUtils.getNowDate()));
// 过滤出删除掉的执行操作和恢复操作
String dcExecuteActionId = dcExecuteActionList.stream()
.filter(dcExecuteAction -> dcExecuteAction.getId() != null)
.map(DcExecuteAction::getEmergencyPlansId)
.map(String::valueOf)
.findFirst()
.orElse(null);
List<String> ids = dcExecuteActionList.stream()
.filter(dcExecuteAction -> dcExecuteAction.getId() != null)
.map(DcExecuteAction::getId)
.collect(Collectors.toList());
// 查询出事件预案关联的执行操作和恢复操作
List<String> dcExecuteActionIdList = dcExecuteActionService.selectDcExecuteActionByEmergencyPlansId(dcExecuteActionId);
List<String> commonIds = new ArrayList<>(ids);
commonIds.retainAll(dcExecuteActionIdList);
// 删除后的执行操作id和恢复操作id
List<String> idsNotInDcExecuteActionIdList = new ArrayList<>(dcExecuteActionIdList);
idsNotInDcExecuteActionIdList.removeAll(commonIds);
// 根据执行操作id和恢复操作id,进行删除操作
if (idsNotInDcExecuteActionIdList.size() > 0) {
System.out.println("存在需要删除的数据");
dcExecuteActionService.deleteDcExecuteAction(idsNotInDcExecuteActionIdList);
}
// 过滤出新增的执行操作
List<DcExecuteAction> insertDcExecuteActionList = dcExecuteActionList.stream()
.filter(dcExecuteAction -> dcExecuteAction.getId() == null)
.collect(Collectors.toList());
if (insertDcExecuteActionList.size() > 0) {
dcExecuteActionService.insertDcExecuteActionBatch(insertDcExecuteActionList);
}
return dcExecuteActionService.updateDcExecuteActionBatch(dcExecuteActionList);
}
@Override
public int updateBatchDcEmergencyPlans(List<DcEmergencyPlans> dcEmergencyPlansList) {
return 0;
}
/**
* 批量删除事件预案
*
* @param ids 事件预案
* @return 结果
*/
@Transactional(rollbackFor = Exception.class)
@Override
public int deleteDcEmergencyPlans(String[] ids) {
// 批量删除执行操作
dcExecuteActionService.deleteDcExecuteActionByEmergencyPlansId(ids);
// 批量删除事件预案
return dcEmergencyPlansMapper.deleteDcEmergencyPlans(ids);
}
/**
* 将json字符串转Map
*
* @param jsonStr
* @return
*/
public static Map<String, String> jsonToMap(String jsonStr) {
try {
ObjectMapper objectMapper = new ObjectMapper();
return objectMapper.readValue(jsonStr, new TypeReference<Map<String, String>>() {
});
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/**
* 数据处理
*/
public static List<DcExecuteAction> dataProcessing(DcEmergencyPlans dcEmergencyPlans) {
// 过滤出执行操作数据
List<DcExecuteAction> dcExecuteActionOperationList = dcEmergencyPlans.getDcExecuteAction()
.stream()
.filter(dcExecuteAction -> dcExecuteAction.getActionType() == 1)
.collect(Collectors.toList());
List<DcExecuteAction> dcExecuteActionList = dcEmergencyPlans.getDcExecuteAction();
// 设备类型 数据处理
String deviceType = dcExecuteActionOperationList.stream()
.map(DcExecuteAction::getDeviceType)
.map(String::valueOf)
.collect(Collectors.joining(","));
dcEmergencyPlans.setDeviceType(deviceType);
// 可控设备 数据处理
List<DcExecuteAction> dcExecuteActionNewList = dcExecuteActionOperationList.stream()
.filter(dcExecuteAction -> dcExecuteAction.getSearchRule() == 1)
.collect(Collectors.toList());
String controllableDevice = dcExecuteActionNewList.stream()
.map(DcExecuteAction::getDeviceList)
.collect(Collectors.joining("、"));
dcEmergencyPlans.setControllableDevice(controllableDevice);
// 控制指令 数据处理
List<String> otherConfigList = dcExecuteActionOperationList.stream()
.map(DcExecuteAction::getOtherConfig)
.collect(Collectors.toList());
List<String> otherConfigStringList = otherConfigList.stream()
.map(json -> jsonToMap(json))
.filter(Objects::nonNull)
.map(map -> map.values().stream().collect(Collectors.joining(",")))
.collect(Collectors.toList());
String controlCommand = otherConfigStringList.stream()
.collect(Collectors.joining(";"));
dcEmergencyPlans.setControlCommand(controlCommand);
return dcExecuteActionList;
}
}

72
zc-business/src/main/java/com/zc/business/service/impl/DcExecuteActionServiceImpl.java

@ -0,0 +1,72 @@
package com.zc.business.service.impl;
import com.zc.business.domain.DcExecuteAction;
import com.zc.business.mapper.DcExecuteActionMapper;
import com.zc.business.service.DcExecuteActionService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
@Service
public class DcExecuteActionServiceImpl implements DcExecuteActionService {
@Resource
private DcExecuteActionMapper dcExecuteActionMapper;
/**
* 批量新增执行操作
*
* @param dcExecuteActionList 执行操作
* @return 结果
*/
@Override
public int insertDcExecuteActionBatch(List<DcExecuteAction> dcExecuteActionList) {
return dcExecuteActionMapper.insertDcExecuteActionBatch(dcExecuteActionList);
}
/**
* 批量修改执行操作
*
* @param dcExecuteActionList 执行操作
* @return 结果
*/
@Override
public int updateDcExecuteActionBatch(List<DcExecuteAction> dcExecuteActionList) {
return dcExecuteActionMapper.updateDcExecuteActionBatch(dcExecuteActionList);
}
/**
* 根据事件预案id批量删除执行操作
*
* @param ids 执行操作
* @return
*/
@Override
public int deleteDcExecuteActionByEmergencyPlansId(String[] ids) {
return dcExecuteActionMapper.deleteDcExecuteActionByEmergencyPlansId(ids);
}
/**
* 批量删除执行操作
*
* @param ids 执行操作
* @return 结果
*/
@Override
public int deleteDcExecuteAction(List<String> ids) {
return dcExecuteActionMapper.deleteDcExecuteAction(ids);
}
/**
* 根据事件预案id查询执行操作
*
* @param emergencyPlansId 执行操作
* @return 结果
*/
@Override
public List<String> selectDcExecuteActionByEmergencyPlansId(String emergencyPlansId) {
return dcExecuteActionMapper.selectDcExecuteActionByEmergencyPlansId(emergencyPlansId);
}
}

17
zc-business/src/main/resources/mapper/business/DcDeviceMapper.xml

@ -25,6 +25,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="remark" column="remark"/>
<result property="createTime" column="create_time"/>
<result property="updateTime" column="update_time"/>
<result property="facilitiesType" column="facilities_type"/>
<result property="deviceIp" column="device_ip"/>
<result property="stakeMarkRange" column="stake_mark_range"/>
<result property="deviceImg" column="device_img"/>
<result property="longitude" column="longitude"/>
<result property="latitude" column="latitude"/>
</resultMap>
@ -54,14 +58,19 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
other_config,
remark,
create_time,
update_time
update_time,
facilities_type,
device_ip,
stake_mark_range,
device_img
from dc_device
</sql>
<select id="selectDcDeviceList" parameterType="dcDevice" resultMap="DcDevice">
select t1.id, t1.iot_device_id, t1.group_id, t1.product_id, t1.stake_mark, t1.direction, t1.device_name, t1.device_code, t1.device_type,
t1.installation_Date,t1.production_date,t1.durable_years,t1.installation_site,t1.use_state,t1.device_state,t1.other_config,t1.remark,t1.create_time,t1.update_time,
t1.installation_Date,t1.production_date,t1.durable_years,t1.installation_site,t1.use_state,t1.device_state,t1.other_config,t1.remark,
t1.create_time,t1.update_time,t1.facilities_type,t1.device_ip,t1.stake_mark_range,t1.device_img,
t1.facilities_type,t2.longitude,t2.latitude
from dc_device t1
left join dc_stake_mark t2 on t1.stake_mark = t2.stake_mark and t1.direction = t2.direction
@ -85,6 +94,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="remark != null and remark != ''">and t1.remark = #{remark}</if>
<if test="createTime != null and createTime != ''">and t1.create_time = #{createTime}</if>
<if test="updateTime != null and updateTime != ''">and t1.update_time = #{updateTime}</if>
<if test="facilitiesType != null and facilitiesType != ''">and t1.facilities_type = #{facilitiesType}</if>
<if test="deviceIp != null and deviceIp != ''">and t1.device_ip = #{deviceIp}</if>
<if test="stakeMarkRange != null and stakeMarkRange != ''">and t1.stake_mark_range = #{stakeMarkRange}</if>
<if test="deviceImg != null and deviceImg != ''">and t1.device_img = #{deviceImg}</if>
</where>
</select>

128
zc-business/src/main/resources/mapper/business/DcEmergencyPlansMapper.xml

@ -0,0 +1,128 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zc.business.mapper.DcEmergencyPlansMapper">
<resultMap type="DcEmergencyPlans" id="DcEmergencyPlansResult">
<result property="id" column="id"/>
<result property="planName" column="plan_name"/>
<result property="eventType" column="event_type"/>
<result property="triggerMechanism" column="trigger_mechanism"/>
<result property="createTime" column="create_time"/>
<result property="updateTime" column="update_time"/>
<result property="deviceType" column="device_type"/>
<result property="triggeringCondition" column="triggering_condition"/>
<result property="controllableDevice" column="controllable_device"/>
<result property="controlCommand" column="control_command"/>
<collection property="dcExecuteAction" ofType="DcExecuteAction">
<result property="id" column="action_id"/>
<result property="emergencyPlansId" column="action_emergency_plans_id"/>
<result property="deviceType" column="action_device_type"/>
<result property="actionType" column="action_action_type"/>
<result property="createTime" column="action_create_time"/>
<result property="updateTime" column="action_update_time"/>
<result property="searchRule" column="action_search_rule"/>
<result property="number" column="action_number"/>
<result property="deviceList" column="action_device_list"/>
<result property="otherConfig" column="action_other_config"/>
</collection>
</resultMap>
<insert id="insertDcEmergencyPlans" parameterType="DcEmergencyPlans" useGeneratedKeys="true" keyColumn="id"
keyProperty="id">
insert into dc_emergency_plans
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="planName != null and planName != ''">plan_name,</if>
<if test="eventType != null">event_type,</if>
<if test="triggerMechanism != null and triggerMechanism != ''">trigger_mechanism,</if>
<if test="createTime != null">create_time,</if>
<if test="updateTime != null">update_time,</if>
<if test="deviceType != null and deviceType != ''">device_type,</if>
<if test="triggeringCondition != null and triggeringCondition != ''">triggering_condition,</if>
<if test="controllableDevice != null and controllableDevice != ''">controllable_device,</if>
<if test="controlCommand != null and controlCommand != ''">control_command,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="planName != null and planName != ''">#{planName},</if>
<if test="eventType != null">#{eventType},</if>
<if test="triggerMechanism != null and triggerMechanism != ''">#{triggerMechanism},</if>
<if test="createTime != null">#{createTime},</if>
<if test="updateTime != null">#{updateTime},</if>
<if test="deviceType != null and deviceType != ''">#{deviceType},</if>
<if test="triggeringCondition != null and triggeringCondition != ''">#{triggeringCondition},</if>
<if test="controllableDevice != null and controllableDevice != ''">#{controllableDevice},</if>
<if test="controlCommand != null and controlCommand != ''">#{controlCommand},</if>
</trim>
</insert>
<update id="updateDcEmergencyPlans" parameterType="DcEmergencyPlans">
update dc_emergency_plans
set plan_name = #{planName},
event_type = #{eventType},
trigger_mechanism = #{triggerMechanism},
update_time = #{updateTime},
device_type = #{deviceType},
triggering_condition = #{triggeringCondition},
controllable_device = #{controllableDevice},
control_command = #{controlCommand}
where id = #{id}
</update>
<delete id="deleteDcEmergencyPlans" parameterType="String">
delete from dc_emergency_plans where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
<sql id="selectDcEmergencyPlansListAll">
select t1.id,
t1.plan_name,
t1.event_type,
t1.trigger_mechanism,
t1.create_time,
t1.update_time,
t1.device_type,
t1.triggering_condition,
t1.controllable_device,
t1.control_command,
t2.id as action_id,
t2.emergency_plans_id as action_emergency_plans_id,
t2.device_type as action_device_type,
t2.action_type as action_action_type,
t2.create_time as action_create_time,
t2.search_rule as action_search_rule,
t2.`number` as action_number,
t2.device_list as action_device_list,
t2.other_config as action_other_config
from dc_emergency_plans t1
left join dc_execute_action t2
on t1.id = t2.emergency_plans_id
</sql>
<select id="selectDcEmergencyPlansList" parameterType="DcEmergencyPlans" resultMap="DcEmergencyPlansResult">
select t1.id,
t1.plan_name,
t1.event_type,
t1.trigger_mechanism,
t1.create_time,
t1.update_time,
t1.device_type,
t1.triggering_condition,
t1.controllable_device,
t1.control_command
from dc_emergency_plans t1
</select>
<select id="selectDcEmergencyPlans" parameterType="Integer" resultMap="DcEmergencyPlansResult">
<include refid="selectDcEmergencyPlansListAll"/>
where t1.id = #{id}
</select>
<select id="selectDcEmergencyPlansByEventType" parameterType="dcEvent" resultMap="DcEmergencyPlansResult">
<include refid="selectDcEmergencyPlansListAll"/>
where t1.event_type = #{eventType}
</select>
</mapper>

9
zc-business/src/main/resources/mapper/business/DcEventMapper.xml

@ -32,6 +32,7 @@
<result property="lang" column="lang" />
<result property="eventTitle" column="event_title" />
<result property="occurrenceTime" column="occurrence_time" />
<result property="isPerceived" column="is_perceived" />
</resultMap>
<resultMap type="map" id="countMap">
@ -74,6 +75,7 @@
<result property="lang" column="lang" />
<result property="roadName" column="road_name" />
<result property="organizationName" column="organization_name" />
<result property="isPerceived" column="is_perceived" />
</resultMap>
@ -155,6 +157,7 @@
event_level,
event_type,
event_title,
is_perceived,
CASE event_type
WHEN '1' THEN '交通事故'
WHEN '2' THEN '车辆故障'
@ -259,6 +262,7 @@
<sql id="selectDcEventVoListAll"> select dc_event.id AS id,
dc_event.stake_mark,
dc_event.direction,
dc_event.is_perceived,
dc_event.user_id,
dc_event.start_time,
dc_event.end_time,
@ -328,6 +332,7 @@
<if test="eventNature != null "> and event_nature = #{eventNature}</if>
<if test="eventSourceTips != null and eventSourceTips != ''"> and event_source_tips = #{eventSourceTips}</if>
<if test="inTunnel != null "> and in_tunnel = #{inTunnel}</if>
<if test="isPerceived != null "> and is_perceived = #{isPerceived}</if>
</where>
</select>
@ -361,6 +366,7 @@
WHEN '3' THEN '济南方向'
END AS direction,
dc_event.user_id,
dc_event.is_perceived,
dc_event.user_id as user_id,
sys_user.nick_name as nickName,
dc_event.start_time,
@ -505,6 +511,7 @@
<if test="lang != null">lang,</if>
<if test="eventTitle != null">event_title,</if>
<if test="occurrenceTime != null">occurrence_time,</if>
<if test="isPerceived != null">is_perceived,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="id != null">#{id},</if>
@ -532,6 +539,7 @@
<if test="lang != null">#{lang},</if>
<if test="eventTitle != null">#{eventTitle},</if>
<if test="occurrenceTime != null">#{occurrenceTime},</if>
<if test="isPerceived != null">#{isPerceived},</if>
</trim>
</insert>
@ -562,6 +570,7 @@
<if test="lang != null">road_id = #{lang},</if>
<if test="eventTitle != null">event_title = #{eventTitle},</if>
<if test="occurrenceTime != null">occurrence_time = #{occurrenceTime},</if>
<if test="isPerceived != null">is_perceived = #{isPerceived},</if>
</trim>
where id = #{id}
</update>

112
zc-business/src/main/resources/mapper/business/DcExecuteActionMapper.xml

@ -0,0 +1,112 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zc.business.mapper.DcExecuteActionMapper">
<insert id="insertDcExecuteActionBatch" parameterType="java.util.List">
insert into dc_execute_action
(emergency_plans_id,
device_type,
action_type,
create_time,
search_rule,
`number`,
device_list,
other_config
)
values
<foreach collection="list" item="item" separator=",">
(#{item.emergencyPlansId},
#{item.deviceType},
#{item.actionType},
#{item.createTime},
#{item.searchRule},
#{item.number},
#{item.deviceList},
#{item.otherConfig})
</foreach>
</insert>
<update id="updateDcExecuteActionBatch" parameterType="java.util.List">
update dc_execute_action
<trim prefix="set" suffixOverrides=",">
<trim prefix="emergency_plans_id =case" suffix="end,">
<foreach collection="list" item="item" index="index">
when id=#{item.id}
then #{item.emergencyPlansId}
</foreach>
</trim>
<trim prefix="device_type =case" suffix="end,">
<foreach collection="list" item="item" index="index">
when id=#{item.id}
then #{item.deviceType}
</foreach>
</trim>
<trim prefix="action_type =case" suffix="end,">
<foreach collection="list" item="item" index="index">
when id=#{item.id}
then #{item.actionType}
</foreach>
</trim>
<trim prefix="update_time =case" suffix="end,">
<foreach collection="list" item="item" index="index">
when id=#{item.id}
then #{item.updateTime}
</foreach>
</trim>
<trim prefix="search_rule =case" suffix="end,">
<foreach collection="list" item="item" index="index">
when id=#{item.id}
then #{item.searchRule}
</foreach>
</trim>
<trim prefix="number =case" suffix="end,">
<foreach collection="list" item="item" index="index">
when id=#{item.id}
then #{item.number}
</foreach>
</trim>
<trim prefix="device_list =case" suffix="end,">
<foreach collection="list" item="item" index="index">
when id=#{item.id}
then #{item.deviceList}
</foreach>
</trim>
<trim prefix="other_config =case" suffix="end,">
<foreach collection="list" item="item" index="index">
when id=#{item.id}
then #{item.otherConfig}
</foreach>
</trim>
</trim>
where id in
<foreach collection="list" item="item" index="index" separator="," open="(" close=")">
#{item.id}
</foreach>
</update>
<delete id="deleteDcExecuteActionByEmergencyPlansId" parameterType="String">
delete from dc_execute_action where emergency_plans_id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
<delete id="deleteDcExecuteAction" parameterType="java.util.List">
delete from dc_execute_action where id in
<foreach item="id" collection="list" index="index" separator="," open="(" close=")">
#{id}
</foreach>
</delete>
<select id="selectDcExecuteActionByEmergencyPlansId" parameterType="String" resultType="String">
select id from dc_execute_action where emergency_plans_id = #{emergencyPlansId}
</select>
</mapper>
Loading…
Cancel
Save