提交代码
parent
c281a11886
commit
910b277071
|
@ -1,417 +0,0 @@
|
|||
<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="projectId">
|
||||
<el-input
|
||||
v-model="queryParams.projectId"
|
||||
placeholder="请输入项目主键"
|
||||
clearable
|
||||
@keyup.enter.native="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="部门主键" prop="deptId">
|
||||
<el-input
|
||||
v-model="queryParams.deptId"
|
||||
placeholder="请输入部门主键"
|
||||
clearable
|
||||
@keyup.enter.native="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="设备名称" prop="deviceName">
|
||||
<el-input
|
||||
v-model="queryParams.deviceName"
|
||||
placeholder="请输入设备名称"
|
||||
clearable
|
||||
@keyup.enter.native="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="车牌号" prop="plateNo">
|
||||
<el-input
|
||||
v-model="queryParams.plateNo"
|
||||
placeholder="请输入车牌号"
|
||||
clearable
|
||||
@keyup.enter.native="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
|
||||
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<el-row :gutter="10" class="mb8">
|
||||
<el-col :span="1.5">
|
||||
<el-button
|
||||
type="primary"
|
||||
plain
|
||||
icon="el-icon-plus"
|
||||
size="mini"
|
||||
@click="handleAdd"
|
||||
v-hasPermi="['project:aiBoxProjectData:add']"
|
||||
>新增</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button
|
||||
type="success"
|
||||
plain
|
||||
icon="el-icon-edit"
|
||||
size="mini"
|
||||
:disabled="single"
|
||||
@click="handleUpdate"
|
||||
v-hasPermi="['project:aiBoxProjectData:edit']"
|
||||
>修改</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button
|
||||
type="danger"
|
||||
plain
|
||||
icon="el-icon-delete"
|
||||
size="mini"
|
||||
:disabled="multiple"
|
||||
@click="handleDelete"
|
||||
v-hasPermi="['project:aiBoxProjectData:remove']"
|
||||
>删除</el-button>
|
||||
</el-col>
|
||||
<el-col :span="1.5">
|
||||
<el-button
|
||||
type="warning"
|
||||
plain
|
||||
icon="el-icon-download"
|
||||
size="mini"
|
||||
@click="handleExport"
|
||||
v-hasPermi="['project:aiBoxProjectData:export']"
|
||||
>导出</el-button>
|
||||
</el-col>
|
||||
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
|
||||
</el-row>
|
||||
|
||||
<el-table v-loading="loading" :data="aiBoxProjectDataList" @selection-change="handleSelectionChange">
|
||||
<el-table-column type="selection" width="55" align="center" />
|
||||
<el-table-column label="主键" align="center" prop="id" />
|
||||
<el-table-column label="项目主键" align="center" prop="projectId" />
|
||||
<el-table-column label="部门主键" align="center" prop="deptId" />
|
||||
<el-table-column label="设备ID" align="center" prop="deviceId" />
|
||||
<el-table-column label="设备名称" align="center" prop="deviceName" />
|
||||
<el-table-column label="设备网口 0 IP 地址" align="center" prop="deviceAddr0" />
|
||||
<el-table-column label="设备网口 1 IP 地址" align="center" prop="deviceAddr1" />
|
||||
<el-table-column label="设备的序列号" align="center" prop="serialNumber" />
|
||||
<el-table-column label="相机的序列号" align="center" prop="ipcSerialNum" />
|
||||
<el-table-column label="相机的 IP 地址" align="center" prop="ipcAddr" />
|
||||
<el-table-column label="行为分析图片地址" align="center" prop="imageUrl" />
|
||||
<el-table-column label="通道号,用来唯一标识任务 ID" align="center" prop="channelId" />
|
||||
<el-table-column label="通道名称" align="center" prop="channelName" />
|
||||
<el-table-column label="报警类型" align="center" prop="alarmType" />
|
||||
<el-table-column label="告警 ID" align="center" prop="alarmId" />
|
||||
<el-table-column label="上报间隔" align="center" prop="reportRate" />
|
||||
<el-table-column label="采集时间" align="center" prop="timestamp" width="180">
|
||||
<template slot-scope="scope">
|
||||
<span>{{ parseTime(scope.row.timestamp, '{y}-{m}-{d}') }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="左上角 X 坐标" align="center" prop="leftTopX" />
|
||||
<el-table-column label="左上角 Y 坐标" align="center" prop="leftTopY" />
|
||||
<el-table-column label="右下角 X 坐标" align="center" prop="rightBtmX" />
|
||||
<el-table-column label="右下角 Y 坐标" align="center" prop="rightBtmY" />
|
||||
<el-table-column label="当前告警区域人数" align="center" prop="personNum" />
|
||||
<el-table-column label="绊线进入人数数量" align="center" prop="inNum" />
|
||||
<el-table-column label="绊线离开人数数量" align="center" prop="outNum" />
|
||||
<el-table-column label="车牌号" align="center" prop="plateNo" />
|
||||
<el-table-column label="ValueType 为 1 时,代表明火检测;ValueType 为 2 时,代表烟雾检测;" align="center" prop="valueType" />
|
||||
<el-table-column label="告警短视频的地址" align="center" prop="alarmVideourl" />
|
||||
<el-table-column label="告警短视频的名称" align="center" prop="alarmVideoName" />
|
||||
<el-table-column label="人脸比对结果" align="center" prop="compareResult" />
|
||||
<el-table-column label="数据状态" align="center" prop="isDel" />
|
||||
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
|
||||
<template slot-scope="scope">
|
||||
<el-button
|
||||
size="mini"
|
||||
type="text"
|
||||
icon="el-icon-edit"
|
||||
@click="handleUpdate(scope.row)"
|
||||
v-hasPermi="['project:aiBoxProjectData:edit']"
|
||||
>修改</el-button>
|
||||
<el-button
|
||||
size="mini"
|
||||
type="text"
|
||||
icon="el-icon-delete"
|
||||
@click="handleDelete(scope.row)"
|
||||
v-hasPermi="['project:aiBoxProjectData:remove']"
|
||||
>删除</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
<pagination
|
||||
v-show="total>0"
|
||||
:total="total"
|
||||
:page.sync="queryParams.pageNum"
|
||||
:limit.sync="queryParams.pageSize"
|
||||
@pagination="getList"
|
||||
/>
|
||||
|
||||
<!-- 添加或修改设备数据对话框 -->
|
||||
<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="projectId">
|
||||
<el-input v-model="form.projectId" placeholder="请输入项目主键" />
|
||||
</el-form-item>
|
||||
<el-form-item label="部门主键" prop="deptId">
|
||||
<el-input v-model="form.deptId" placeholder="请输入部门主键" />
|
||||
</el-form-item>
|
||||
<el-form-item label="设备ID" prop="deviceId">
|
||||
<el-input v-model="form.deviceId" placeholder="请输入设备ID" />
|
||||
</el-form-item>
|
||||
<el-form-item label="设备名称" prop="deviceName">
|
||||
<el-input v-model="form.deviceName" placeholder="请输入设备名称" />
|
||||
</el-form-item>
|
||||
<el-form-item label="设备网口 0 IP 地址" prop="deviceAddr0">
|
||||
<el-input v-model="form.deviceAddr0" placeholder="请输入设备网口 0 IP 地址" />
|
||||
</el-form-item>
|
||||
<el-form-item label="设备网口 1 IP 地址" prop="deviceAddr1">
|
||||
<el-input v-model="form.deviceAddr1" placeholder="请输入设备网口 1 IP 地址" />
|
||||
</el-form-item>
|
||||
<el-form-item label="设备的序列号" prop="serialNumber">
|
||||
<el-input v-model="form.serialNumber" placeholder="请输入设备的序列号" />
|
||||
</el-form-item>
|
||||
<el-form-item label="相机的序列号" prop="ipcSerialNum">
|
||||
<el-input v-model="form.ipcSerialNum" placeholder="请输入相机的序列号" />
|
||||
</el-form-item>
|
||||
<el-form-item label="相机的 IP 地址" prop="ipcAddr">
|
||||
<el-input v-model="form.ipcAddr" placeholder="请输入相机的 IP 地址" />
|
||||
</el-form-item>
|
||||
<el-form-item label="行为分析图片地址" prop="imageUrl">
|
||||
<el-input v-model="form.imageUrl" placeholder="请输入行为分析图片地址" />
|
||||
</el-form-item>
|
||||
<el-form-item label="通道号,用来唯一标识任务 ID" prop="channelId">
|
||||
<el-input v-model="form.channelId" placeholder="请输入通道号,用来唯一标识任务 ID" />
|
||||
</el-form-item>
|
||||
<el-form-item label="通道名称" prop="channelName">
|
||||
<el-input v-model="form.channelName" placeholder="请输入通道名称" />
|
||||
</el-form-item>
|
||||
<el-form-item label="告警 ID" prop="alarmId">
|
||||
<el-input v-model="form.alarmId" placeholder="请输入告警 ID" />
|
||||
</el-form-item>
|
||||
<el-form-item label="上报间隔" prop="reportRate">
|
||||
<el-input v-model="form.reportRate" placeholder="请输入上报间隔" />
|
||||
</el-form-item>
|
||||
<el-form-item label="采集时间" prop="timestamp">
|
||||
<el-date-picker clearable
|
||||
v-model="form.timestamp"
|
||||
type="date"
|
||||
value-format="yyyy-MM-dd"
|
||||
placeholder="请选择采集时间">
|
||||
</el-date-picker>
|
||||
</el-form-item>
|
||||
<el-form-item label="左上角 X 坐标" prop="leftTopX">
|
||||
<el-input v-model="form.leftTopX" placeholder="请输入左上角 X 坐标" />
|
||||
</el-form-item>
|
||||
<el-form-item label="左上角 Y 坐标" prop="leftTopY">
|
||||
<el-input v-model="form.leftTopY" placeholder="请输入左上角 Y 坐标" />
|
||||
</el-form-item>
|
||||
<el-form-item label="右下角 X 坐标" prop="rightBtmX">
|
||||
<el-input v-model="form.rightBtmX" placeholder="请输入右下角 X 坐标" />
|
||||
</el-form-item>
|
||||
<el-form-item label="右下角 Y 坐标" prop="rightBtmY">
|
||||
<el-input v-model="form.rightBtmY" placeholder="请输入右下角 Y 坐标" />
|
||||
</el-form-item>
|
||||
<el-form-item label="当前告警区域人数" prop="personNum">
|
||||
<el-input v-model="form.personNum" placeholder="请输入当前告警区域人数" />
|
||||
</el-form-item>
|
||||
<el-form-item label="绊线进入人数数量" prop="inNum">
|
||||
<el-input v-model="form.inNum" placeholder="请输入绊线进入人数数量" />
|
||||
</el-form-item>
|
||||
<el-form-item label="绊线离开人数数量" prop="outNum">
|
||||
<el-input v-model="form.outNum" placeholder="请输入绊线离开人数数量" />
|
||||
</el-form-item>
|
||||
<el-form-item label="车牌号" prop="plateNo">
|
||||
<el-input v-model="form.plateNo" placeholder="请输入车牌号" />
|
||||
</el-form-item>
|
||||
<el-form-item label="告警短视频的地址" prop="alarmVideourl">
|
||||
<el-input v-model="form.alarmVideourl" placeholder="请输入告警短视频的地址" />
|
||||
</el-form-item>
|
||||
<el-form-item label="告警短视频的名称" prop="alarmVideoName">
|
||||
<el-input v-model="form.alarmVideoName" placeholder="请输入告警短视频的名称" />
|
||||
</el-form-item>
|
||||
<el-form-item label="人脸比对结果" prop="compareResult">
|
||||
<el-input v-model="form.compareResult" type="textarea" placeholder="请输入内容" />
|
||||
</el-form-item>
|
||||
<el-form-item label="数据状态" prop="isDel">
|
||||
<el-input v-model="form.isDel" placeholder="请输入数据状态" />
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div slot="footer" class="dialog-footer">
|
||||
<el-button type="primary" @click="submitForm">确 定</el-button>
|
||||
<el-button @click="cancel">取 消</el-button>
|
||||
</div>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { listAiBoxProjectData, getAiBoxProjectData, delAiBoxProjectData, addAiBoxProjectData, updateAiBoxProjectData } from "@/api/project/aiBoxProjectData";
|
||||
|
||||
export default {
|
||||
name: "AiBoxProjectData",
|
||||
data() {
|
||||
return {
|
||||
// 遮罩层
|
||||
loading: true,
|
||||
// 选中数组
|
||||
ids: [],
|
||||
// 非单个禁用
|
||||
single: true,
|
||||
// 非多个禁用
|
||||
multiple: true,
|
||||
// 显示搜索条件
|
||||
showSearch: true,
|
||||
// 总条数
|
||||
total: 0,
|
||||
// 设备数据表格数据
|
||||
aiBoxProjectDataList: [],
|
||||
// 弹出层标题
|
||||
title: "",
|
||||
// 是否显示弹出层
|
||||
open: false,
|
||||
// 查询参数
|
||||
queryParams: {
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
projectId: null,
|
||||
deptId: null,
|
||||
deviceName: null,
|
||||
alarmType: null,
|
||||
plateNo: null,
|
||||
},
|
||||
// 表单参数
|
||||
form: {},
|
||||
// 表单校验
|
||||
rules: {
|
||||
}
|
||||
};
|
||||
},
|
||||
created() {
|
||||
this.getList();
|
||||
},
|
||||
methods: {
|
||||
/** 查询设备数据列表 */
|
||||
getList() {
|
||||
this.loading = true;
|
||||
listAiBoxProjectData(this.queryParams).then(response => {
|
||||
this.aiBoxProjectDataList = response.rows;
|
||||
this.total = response.total;
|
||||
this.loading = false;
|
||||
});
|
||||
},
|
||||
// 取消按钮
|
||||
cancel() {
|
||||
this.open = false;
|
||||
this.reset();
|
||||
},
|
||||
// 表单重置
|
||||
reset() {
|
||||
this.form = {
|
||||
id: null,
|
||||
projectId: null,
|
||||
deptId: null,
|
||||
deviceId: null,
|
||||
deviceName: null,
|
||||
deviceAddr0: null,
|
||||
deviceAddr1: null,
|
||||
serialNumber: null,
|
||||
ipcSerialNum: null,
|
||||
ipcAddr: null,
|
||||
imageUrl: null,
|
||||
channelId: null,
|
||||
channelName: null,
|
||||
alarmType: null,
|
||||
alarmId: null,
|
||||
reportRate: null,
|
||||
timestamp: null,
|
||||
leftTopX: null,
|
||||
leftTopY: null,
|
||||
rightBtmX: null,
|
||||
rightBtmY: null,
|
||||
personNum: null,
|
||||
inNum: null,
|
||||
outNum: null,
|
||||
plateNo: null,
|
||||
valueType: null,
|
||||
alarmVideourl: null,
|
||||
alarmVideoName: null,
|
||||
compareResult: null,
|
||||
createTime: null,
|
||||
isDel: null
|
||||
};
|
||||
this.resetForm("form");
|
||||
},
|
||||
/** 搜索按钮操作 */
|
||||
handleQuery() {
|
||||
this.queryParams.pageNum = 1;
|
||||
this.getList();
|
||||
},
|
||||
/** 重置按钮操作 */
|
||||
resetQuery() {
|
||||
this.resetForm("queryForm");
|
||||
this.handleQuery();
|
||||
},
|
||||
// 多选框选中数据
|
||||
handleSelectionChange(selection) {
|
||||
this.ids = selection.map(item => item.id)
|
||||
this.single = selection.length!==1
|
||||
this.multiple = !selection.length
|
||||
},
|
||||
/** 新增按钮操作 */
|
||||
handleAdd() {
|
||||
this.reset();
|
||||
this.open = true;
|
||||
this.title = "添加设备数据";
|
||||
},
|
||||
/** 修改按钮操作 */
|
||||
handleUpdate(row) {
|
||||
this.reset();
|
||||
const id = row.id || this.ids
|
||||
getAiBoxProjectData(id).then(response => {
|
||||
this.form = response.data;
|
||||
this.open = true;
|
||||
this.title = "修改设备数据";
|
||||
});
|
||||
},
|
||||
/** 提交按钮 */
|
||||
submitForm() {
|
||||
this.$refs["form"].validate(valid => {
|
||||
if (valid) {
|
||||
if (this.form.id != null) {
|
||||
updateAiBoxProjectData(this.form).then(response => {
|
||||
this.$modal.msgSuccess("修改成功");
|
||||
this.open = false;
|
||||
this.getList();
|
||||
});
|
||||
} else {
|
||||
addAiBoxProjectData(this.form).then(response => {
|
||||
this.$modal.msgSuccess("新增成功");
|
||||
this.open = false;
|
||||
this.getList();
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
/** 删除按钮操作 */
|
||||
handleDelete(row) {
|
||||
const ids = row.id || this.ids;
|
||||
this.$modal.confirm('是否确认删除设备数据编号为"' + ids + '"的数据项?').then(function() {
|
||||
return delAiBoxProjectData(ids);
|
||||
}).then(() => {
|
||||
this.getList();
|
||||
this.$modal.msgSuccess("删除成功");
|
||||
}).catch(() => {});
|
||||
},
|
||||
/** 导出按钮操作 */
|
||||
handleExport() {
|
||||
this.download('project/aiBoxProjectData/export', {
|
||||
...this.queryParams
|
||||
}, `aiBoxProjectData_${new Date().getTime()}.xlsx`)
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
|
@ -0,0 +1,256 @@
|
|||
<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="projectName">
|
||||
<el-input
|
||||
v-model="queryParams.projectName"
|
||||
placeholder="请输入项目名称"
|
||||
clearable
|
||||
@keyup.enter.native="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="单位名称" prop="deptName">
|
||||
<el-input
|
||||
v-model="queryParams.deptName"
|
||||
placeholder="请输入单位名称"
|
||||
clearable
|
||||
@keyup.enter.native="handleQuery"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="预警类型" prop="alarmType">
|
||||
<el-select v-model="queryParams.alarmType" placeholder="预警类型" clearable>
|
||||
<el-option
|
||||
v-for="dict in dict.type.aibox_alarm_type"
|
||||
:key="dict.value"
|
||||
:label="dict.label"
|
||||
:value="dict.value"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="预警时间">
|
||||
<el-date-picker
|
||||
v-model="daterangeMarksTime"
|
||||
style="width: 240px"
|
||||
value-format="yyyy-MM-dd"
|
||||
type="daterange"
|
||||
range-separator="-"
|
||||
start-placeholder="开始日期"
|
||||
end-placeholder="结束日期"
|
||||
></el-date-picker>
|
||||
</el-form-item>
|
||||
<el-form-item
|
||||
label="责任主体"
|
||||
prop="projectDeptId"
|
||||
v-hasPermi="['project:project:zgs']"
|
||||
>
|
||||
<el-select
|
||||
v-model="queryParams.projectDeptId"
|
||||
placeholder="请选择责任主体"
|
||||
clearable
|
||||
>
|
||||
<el-option
|
||||
v-for="dict in depts"
|
||||
:key="dict.deptId"
|
||||
:label="dict.deptName"
|
||||
:value="dict.deptId"
|
||||
></el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"
|
||||
>搜索</el-button
|
||||
>
|
||||
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<el-table
|
||||
v-loading="loading"
|
||||
:data="dataList" stripe
|
||||
>
|
||||
<el-table-column
|
||||
label="项目名称"
|
||||
align="center"
|
||||
prop="projectName"
|
||||
width="260"
|
||||
/>
|
||||
<el-table-column
|
||||
label="单位名称"
|
||||
align="center"
|
||||
prop="deptName"
|
||||
width="220"
|
||||
/>
|
||||
<el-table-column label="预警图片" align="center" property="path" width="220">
|
||||
<template slot-scope="scope">
|
||||
<el-image
|
||||
ref="preview"
|
||||
style="width: 200px; height: 100px"
|
||||
:src="getSrc(scope.row.imageUrl)"
|
||||
@click="onPreview(scope.row.imageUrl)"
|
||||
>
|
||||
</el-image>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="预警类型" align="center" prop="alarmType">
|
||||
<template slot-scope="scope">
|
||||
<dict-tag :options="dict.type.aibox_alarm_type" :value="scope.row.alarmType" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
label="设备通道"
|
||||
align="center"
|
||||
prop="channelName"
|
||||
width="180"
|
||||
show-overflow-tooltip
|
||||
/>
|
||||
<el-table-column
|
||||
label="设备名称"
|
||||
align="center"
|
||||
prop="deviceName"
|
||||
width="220"
|
||||
/>
|
||||
<el-table-column
|
||||
label="设备名称"
|
||||
align="center"
|
||||
prop="serialNumber"
|
||||
width="220"
|
||||
/>
|
||||
<el-table-column
|
||||
label="预警时间"
|
||||
align="center"
|
||||
prop="createTime"
|
||||
width="180"
|
||||
>
|
||||
<template slot-scope="scope">
|
||||
<span>{{ parseTime(scope.row.createTime, "{y}-{m}-{d} {h}:{i}:{s}") }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="数据状态" align="center" prop="isDel">
|
||||
<template slot-scope="scope">
|
||||
<dict-tag :options="dict.type.sys_common_isdel" :value="scope.row.isDel" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
<pagination
|
||||
v-show="total > 0"
|
||||
:total="total"
|
||||
:page.sync="queryParams.pageNum"
|
||||
:limit.sync="queryParams.pageSize"
|
||||
@pagination="getList"
|
||||
/>
|
||||
|
||||
<el-image-viewer v-if="showViewer" :on-close="closeViewer" :url-list="srcList" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { listAiBoxProjectData } from "@/api/project/aiBoxProjectData";
|
||||
import ElImageViewer from "element-ui/packages/image/src/image-viewer";
|
||||
|
||||
export default {
|
||||
name: "SspProblemmodify",
|
||||
components: {
|
||||
ElImageViewer,
|
||||
},
|
||||
dicts: ["aibox_alarm_type", "sys_common_isdel"],
|
||||
data() {
|
||||
return {
|
||||
showViewer: false,
|
||||
// 遮罩层
|
||||
loading: true,
|
||||
// 选中数组
|
||||
ids: [],
|
||||
// 非单个禁用
|
||||
single: true,
|
||||
// 非多个禁用
|
||||
multiple: true,
|
||||
// 显示搜索条件
|
||||
showSearch: true,
|
||||
// 总条数
|
||||
total: 0,
|
||||
// 安全整改表格数据
|
||||
dataList: [],
|
||||
// 弹出层标题
|
||||
title: "",
|
||||
// 是否显示弹出层
|
||||
open: false,
|
||||
openVideo: false,
|
||||
videoSrc: null,
|
||||
// 更新时间时间范围
|
||||
daterangeMarksTime: [],
|
||||
// 查询参数
|
||||
queryParams: {
|
||||
pageNum: 1,
|
||||
pageSize: 10,
|
||||
projectId: null,
|
||||
projectName: null,
|
||||
deptId: null,
|
||||
deptName: null,
|
||||
projectDeptId: null,
|
||||
},
|
||||
depts: null,
|
||||
// 表单参数
|
||||
form: {},
|
||||
// 表单校验
|
||||
rules: {},
|
||||
srcList: [],
|
||||
};
|
||||
},
|
||||
created() {
|
||||
this.getList();
|
||||
this.$api.publics.getZgsDeptList().then((d) => {
|
||||
this.depts = d?.data || [];
|
||||
});
|
||||
},
|
||||
methods: {
|
||||
getSrc(url){
|
||||
return url + '.min.jpg'
|
||||
},
|
||||
onPreview(urls) {
|
||||
var arrayurls = urls.split(",");
|
||||
this.srcList = [];
|
||||
arrayurls.forEach((v, i) => {
|
||||
this.srcList.push(v);
|
||||
});
|
||||
this.showViewer = true;
|
||||
},
|
||||
closeViewer() {
|
||||
this.showViewer = false;
|
||||
},
|
||||
/** 查询安全整改列表 */
|
||||
getList() {
|
||||
this.loading = true;
|
||||
this.queryParams.params = {};
|
||||
if (null != this.daterangeMarksTime && "" != this.daterangeMarksTime) {
|
||||
this.queryParams.params["beginMarksTime"] = this.daterangeMarksTime[0];
|
||||
this.queryParams.params["endMarksTime"] = this.daterangeMarksTime[1];
|
||||
}
|
||||
listAiBoxProjectData(this.queryParams).then((response) => {
|
||||
this.dataList = response.rows;
|
||||
this.total = response.total;
|
||||
this.loading = false;
|
||||
});
|
||||
},
|
||||
/** 搜索按钮操作 */
|
||||
handleQuery() {
|
||||
this.queryParams.pageNum = 1;
|
||||
this.getList();
|
||||
},
|
||||
/** 重置按钮操作 */
|
||||
resetQuery() {
|
||||
this.queryParams.roleTypes=[];
|
||||
this.daterangeMarksTime = [];
|
||||
this.resetForm("queryForm");
|
||||
this.handleQuery();
|
||||
},
|
||||
},
|
||||
};
|
||||
</script>
|
|
@ -3,11 +3,7 @@ package com.yanzhu.jh.project.controller;
|
|||
import java.util.List;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
import com.ruoyi.common.core.text.Convert;
|
||||
import com.ruoyi.common.enums.SysRoleEnum;
|
||||
import com.ruoyi.system.service.ISysDeptService;
|
||||
import com.yanzhu.jh.project.domain.SurProjectUnitInfo;
|
||||
import com.yanzhu.jh.project.service.ISurProjectUnitInfoService;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
|
|
|
@ -6,7 +6,6 @@ import java.util.List;
|
|||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
import com.yanzhu.jh.project.domain.vo.MajorPlanExport;
|
||||
import com.yanzhu.jh.project.domain.vo.SurProjectBuildNodeDataExport;
|
||||
import com.yanzhu.jh.project.domain.vo.UrbanPlanExport;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
|
|
|
@ -6,7 +6,6 @@ import javax.servlet.http.HttpServletResponse;
|
|||
|
||||
import com.ruoyi.common.core.text.Convert;
|
||||
import com.ruoyi.common.enums.SysRoleEnum;
|
||||
import com.ruoyi.common.utils.file.ImageUtils;
|
||||
import com.ruoyi.system.service.ISysDeptService;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
package com.yanzhu.jh.project.mapper;
|
||||
|
||||
import java.util.List;
|
||||
import com.yanzhu.jh.project.domain.DevAiProjectConfig;
|
||||
import com.yanzhu.jh.video.domain.DevAiProjectConfig;
|
||||
|
||||
/**
|
||||
* 设备配置Mapper接口
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
package com.yanzhu.jh.project.mapper;
|
||||
|
||||
import java.util.List;
|
||||
import com.yanzhu.jh.project.domain.DevAiProjectData;
|
||||
import com.yanzhu.jh.video.domain.DevAiProjectData;
|
||||
|
||||
/**
|
||||
* 设备数据Mapper接口
|
||||
|
|
|
@ -1,10 +1,13 @@
|
|||
package com.yanzhu.jh.publics;
|
||||
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.ruoyi.common.core.controller.BaseController;
|
||||
import com.yanzhu.jh.project.domain.DevAiProjectData;
|
||||
import com.yanzhu.jh.project.domain.vo.DevAiProjectDataVO;
|
||||
import com.yanzhu.jh.video.domain.DevAiProjectDataVO;
|
||||
import com.yanzhu.jh.video.service.IDevAiProjectDataService;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.PostMapping;
|
||||
import org.springframework.web.bind.annotation.RequestBody;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
|
@ -23,6 +26,9 @@ import java.util.Map;
|
|||
@RequestMapping("/publics/aiBox")
|
||||
public class AIBoxController extends BaseController {
|
||||
|
||||
@Autowired
|
||||
private IDevAiProjectDataService devAiProjectDataService;
|
||||
|
||||
private static final Logger logger = LoggerFactory.getLogger("AIBoxController");
|
||||
|
||||
/**
|
||||
|
@ -32,13 +38,12 @@ public class AIBoxController extends BaseController {
|
|||
public void list(@RequestBody Map<String,Object> dataMap)
|
||||
{
|
||||
try{
|
||||
List<DevAiProjectDataVO> devAiProjectDataVOs = (List<DevAiProjectDataVO>)dataMap.get("BehaviorResults");
|
||||
if(devAiProjectDataVOs!=null && devAiProjectDataVOs.size()>0){
|
||||
DevAiProjectDataVO devAiProjectDataVO = devAiProjectDataVOs.get(0);
|
||||
|
||||
}
|
||||
List<Map<String,Object>> list = (List<Map<String,Object>>)dataMap.get("BehaviorResults");
|
||||
DevAiProjectDataVO devAiProjectDataVO = JSON.parseObject(JSONObject.toJSONString(list.get(0)), DevAiProjectDataVO.class);
|
||||
devAiProjectDataService.insertHttpDevAiProjectData(devAiProjectDataVO);
|
||||
}catch (Exception e){
|
||||
logger.info("AiBox解析参数失败!!!");
|
||||
logger.info(dataMap.toString());
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
package com.yanzhu.jh.project.controller;
|
||||
package com.yanzhu.jh.video.controller;
|
||||
|
||||
import java.util.List;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
@ -16,8 +16,8 @@ import com.ruoyi.common.annotation.Log;
|
|||
import com.ruoyi.common.core.controller.BaseController;
|
||||
import com.ruoyi.common.core.domain.AjaxResult;
|
||||
import com.ruoyi.common.enums.BusinessType;
|
||||
import com.yanzhu.jh.project.domain.DevAiProjectConfig;
|
||||
import com.yanzhu.jh.project.service.IDevAiProjectConfigService;
|
||||
import com.yanzhu.jh.video.domain.DevAiProjectConfig;
|
||||
import com.yanzhu.jh.video.service.IDevAiProjectConfigService;
|
||||
import com.ruoyi.common.utils.poi.ExcelUtil;
|
||||
import com.ruoyi.common.core.page.TableDataInfo;
|
||||
|
|
@ -1,7 +1,11 @@
|
|||
package com.yanzhu.jh.project.controller;
|
||||
package com.yanzhu.jh.video.controller;
|
||||
|
||||
import java.util.List;
|
||||
import javax.servlet.http.HttpServletResponse;
|
||||
|
||||
import com.ruoyi.common.core.text.Convert;
|
||||
import com.ruoyi.common.enums.SysRoleEnum;
|
||||
import com.ruoyi.system.service.ISysDeptService;
|
||||
import org.springframework.security.access.prepost.PreAuthorize;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
|
@ -16,8 +20,8 @@ import com.ruoyi.common.annotation.Log;
|
|||
import com.ruoyi.common.core.controller.BaseController;
|
||||
import com.ruoyi.common.core.domain.AjaxResult;
|
||||
import com.ruoyi.common.enums.BusinessType;
|
||||
import com.yanzhu.jh.project.domain.DevAiProjectData;
|
||||
import com.yanzhu.jh.project.service.IDevAiProjectDataService;
|
||||
import com.yanzhu.jh.video.domain.DevAiProjectData;
|
||||
import com.yanzhu.jh.video.service.IDevAiProjectDataService;
|
||||
import com.ruoyi.common.utils.poi.ExcelUtil;
|
||||
import com.ruoyi.common.core.page.TableDataInfo;
|
||||
|
||||
|
@ -31,6 +35,9 @@ import com.ruoyi.common.core.page.TableDataInfo;
|
|||
@RequestMapping("/project/aiBoxProjectData")
|
||||
public class DevAiProjectDataController extends BaseController
|
||||
{
|
||||
@Autowired
|
||||
private ISysDeptService sysDeptService;
|
||||
|
||||
@Autowired
|
||||
private IDevAiProjectDataService devAiProjectDataService;
|
||||
|
||||
|
@ -42,6 +49,14 @@ public class DevAiProjectDataController extends BaseController
|
|||
public TableDataInfo list(DevAiProjectData devAiProjectData)
|
||||
{
|
||||
startPage();
|
||||
devAiProjectData.setNowRole(Convert.toStr(getUserFirstRole()));
|
||||
if(SysRoleEnum.ZGS.getCode().equals(devAiProjectData.getNowRole())){
|
||||
devAiProjectData.setNowDept(Convert.toStr(sysDeptService.getZGSDeptId(getDeptId())));
|
||||
}else{
|
||||
devAiProjectData.setNowDept(Convert.toStr(getDeptId()));
|
||||
}
|
||||
devAiProjectData.setNowUser(Convert.toStr(getUserId()));
|
||||
devAiProjectData.setNowUserName(getUsername());
|
||||
List<DevAiProjectData> list = devAiProjectDataService.selectDevAiProjectDataList(devAiProjectData);
|
||||
return getDataTable(list);
|
||||
}
|
|
@ -1,4 +1,4 @@
|
|||
package com.yanzhu.jh.project.domain;
|
||||
package com.yanzhu.jh.video.domain;
|
||||
|
||||
import org.apache.commons.lang3.builder.ToStringBuilder;
|
||||
import org.apache.commons.lang3.builder.ToStringStyle;
|
|
@ -1,4 +1,4 @@
|
|||
package com.yanzhu.jh.project.domain;
|
||||
package com.yanzhu.jh.video.domain;
|
||||
|
||||
import java.util.Date;
|
||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||
|
@ -24,10 +24,14 @@ public class DevAiProjectData extends BaseEntity
|
|||
@Excel(name = "项目主键")
|
||||
private Long projectId;
|
||||
|
||||
private String projectName;
|
||||
|
||||
/** 部门主键 */
|
||||
@Excel(name = "部门主键")
|
||||
private Long deptId;
|
||||
|
||||
private String deptName;
|
||||
|
||||
/** 设备ID */
|
||||
@Excel(name = "设备ID")
|
||||
private Long deviceId;
|
||||
|
@ -137,6 +141,22 @@ public class DevAiProjectData extends BaseEntity
|
|||
@Excel(name = "数据状态")
|
||||
private String isDel;
|
||||
|
||||
public String getProjectName() {
|
||||
return projectName;
|
||||
}
|
||||
|
||||
public void setProjectName(String projectName) {
|
||||
this.projectName = projectName;
|
||||
}
|
||||
|
||||
public String getDeptName() {
|
||||
return deptName;
|
||||
}
|
||||
|
||||
public void setDeptName(String deptName) {
|
||||
this.deptName = deptName;
|
||||
}
|
||||
|
||||
public void setId(Long id)
|
||||
{
|
||||
this.id = id;
|
|
@ -1,4 +1,4 @@
|
|||
package com.yanzhu.jh.project.domain.vo;
|
||||
package com.yanzhu.jh.video.domain;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Date;
|
|
@ -1,7 +1,7 @@
|
|||
package com.yanzhu.jh.project.service;
|
||||
package com.yanzhu.jh.video.service;
|
||||
|
||||
import java.util.List;
|
||||
import com.yanzhu.jh.project.domain.DevAiProjectConfig;
|
||||
import com.yanzhu.jh.video.domain.DevAiProjectConfig;
|
||||
|
||||
/**
|
||||
* 设备配置Service接口
|
|
@ -1,8 +1,8 @@
|
|||
package com.yanzhu.jh.project.service;
|
||||
package com.yanzhu.jh.video.service;
|
||||
|
||||
import java.util.List;
|
||||
import com.yanzhu.jh.project.domain.DevAiProjectData;
|
||||
import com.yanzhu.jh.project.domain.vo.DevAiProjectDataVO;
|
||||
import com.yanzhu.jh.video.domain.DevAiProjectData;
|
||||
import com.yanzhu.jh.video.domain.DevAiProjectDataVO;
|
||||
|
||||
/**
|
||||
* 设备数据Service接口
|
|
@ -1,12 +1,12 @@
|
|||
package com.yanzhu.jh.project.service.impl;
|
||||
package com.yanzhu.jh.video.service.impl;
|
||||
|
||||
import java.util.List;
|
||||
import com.ruoyi.common.utils.DateUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import com.yanzhu.jh.project.mapper.DevAiProjectConfigMapper;
|
||||
import com.yanzhu.jh.project.domain.DevAiProjectConfig;
|
||||
import com.yanzhu.jh.project.service.IDevAiProjectConfigService;
|
||||
import com.yanzhu.jh.video.domain.DevAiProjectConfig;
|
||||
import com.yanzhu.jh.video.service.IDevAiProjectConfigService;
|
||||
import com.ruoyi.common.utils.SecurityUtils;
|
||||
/**
|
||||
* 设备配置Service业务层处理
|
|
@ -1,4 +1,4 @@
|
|||
package com.yanzhu.jh.project.service.impl;
|
||||
package com.yanzhu.jh.video.service.impl;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
@ -8,15 +8,14 @@ import com.ruoyi.common.enums.PublicStateEnum;
|
|||
import com.ruoyi.common.utils.DateUtils;
|
||||
import com.ruoyi.common.utils.file.FileUploadUtils;
|
||||
import com.ruoyi.common.utils.file.MultipartFileUtils;
|
||||
import com.yanzhu.jh.project.domain.vo.DevAiProjectDataVO;
|
||||
import com.yanzhu.jh.video.domain.DevAiProjectDataVO;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import com.yanzhu.jh.project.mapper.DevAiProjectDataMapper;
|
||||
import com.yanzhu.jh.project.domain.DevAiProjectData;
|
||||
import com.yanzhu.jh.project.service.IDevAiProjectDataService;
|
||||
import com.ruoyi.common.utils.SecurityUtils;
|
||||
import com.yanzhu.jh.video.domain.DevAiProjectData;
|
||||
import com.yanzhu.jh.video.service.IDevAiProjectDataService;
|
||||
import org.springframework.web.multipart.MultipartFile;
|
||||
|
||||
/**
|
||||
|
@ -79,7 +78,7 @@ public class DevAiProjectDataServiceImpl implements IDevAiProjectDataService
|
|||
@Override
|
||||
public void insertHttpDevAiProjectData(DevAiProjectDataVO devAiProjectDataVO)
|
||||
{
|
||||
logger.info("上报消息解析成功!!开始转换实体!!!");
|
||||
logger.info("AiBox消息解析成功!!开始转换实体!!!");
|
||||
DevAiProjectData devAiProjectData = new DevAiProjectData();
|
||||
devAiProjectData.setDeviceId(devAiProjectDataVO.getDeviceId());
|
||||
/** 设备名称 */
|
||||
|
@ -133,7 +132,7 @@ public class DevAiProjectDataServiceImpl implements IDevAiProjectDataService
|
|||
logger.info("实体转换成功!!Base64开始转换图片!!!");
|
||||
String objImg64 = devAiProjectDataVO.getBigImage().get("Image").toString();
|
||||
try {
|
||||
MultipartFile file = MultipartFileUtils.base64ToMultipartFile(objImg64);
|
||||
MultipartFile file = MultipartFileUtils.base64ToMultipartFile("data:image/png;base64,"+objImg64);
|
||||
// 上传文件路径
|
||||
String filePath = RuoYiConfig.getUploadPath();
|
||||
// 上传并返回新文件名称
|
|
@ -7,7 +7,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||
<resultMap type="DevAiProjectData" id="DevAiProjectDataResult">
|
||||
<result property="id" column="id" />
|
||||
<result property="projectId" column="project_id" />
|
||||
<result property="projectName" column="projectName" />
|
||||
<result property="deptId" column="dept_id" />
|
||||
<result property="deptName" column="deptName" />
|
||||
<result property="deviceId" column="device_id" />
|
||||
<result property="deviceName" column="device_name" />
|
||||
<result property="deviceAddr0" column="device_addr0" />
|
||||
|
@ -39,23 +41,38 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
|||
</resultMap>
|
||||
|
||||
<sql id="selectDevAiProjectDataVo">
|
||||
select id, project_id, dept_id, device_id, device_name, device_addr0, device_addr1, serial_number, ipc_serial_num, ipc_addr, image_url, channel_id, channel_name, alarm_type, alarm_id, report_rate, timestamp, left_top_x, left_top_y, right_btm_x, right_btm_y, person_num, in_num, out_num, plate_no, value_type, alarm_videoURL, alarm_video_name, compare_result, create_time, is_del from dev_ai_project_data
|
||||
select dapd.id, dapd.project_id, sp.projectName, dapd.dept_id, sd.dept_name as deptName, dapd.device_id, dapd.device_name, dapd.device_addr0, dapd.device_addr1, dapd.serial_number, dapd.ipc_serial_num, dapd.ipc_addr, dapd.image_url, dapd.channel_id, dapd.channel_name, dapd.alarm_type, dapd.alarm_id, dapd.report_rate, dapd.timestamp, dapd.left_top_x, dapd.left_top_y, dapd.right_btm_x, dapd.right_btm_y, dapd.person_num, dapd.in_num, dapd.out_num, dapd.plate_no, dapd.value_type, dapd.alarm_videoURL, dapd.alarm_video_name, dapd.compare_result, dapd.create_time, dapd.is_del from dev_ai_project_data dapd
|
||||
left join sur_project sp on sp.id=dapd.project_id
|
||||
left join sys_dept sd on sd.dept_id=dapd.dept_id
|
||||
</sql>
|
||||
|
||||
<select id="selectDevAiProjectDataList" parameterType="DevAiProjectData" resultMap="DevAiProjectDataResult">
|
||||
<include refid="selectDevAiProjectDataVo"/>
|
||||
<where>
|
||||
<if test="projectId != null "> and project_id = #{projectId}</if>
|
||||
<if test="deptId != null "> and dept_id = #{deptId}</if>
|
||||
<if test="deviceName != null and deviceName != ''"> and device_name like concat('%', #{deviceName}, '%')</if>
|
||||
<if test="alarmType != null "> and alarm_type = #{alarmType}</if>
|
||||
<if test="plateNo != null "> and plate_no = #{plateNo}</if>
|
||||
and dapd.is_del='0'
|
||||
<if test="projectId != null "> and dapd.project_id = #{projectId}</if>
|
||||
<if test="projectName != null and projectName != ''"> and sp.projectName like concat('%', #{projectName}, '%')</if>
|
||||
<if test="deptId != null "> and dapd.dept_id = #{deptId}</if>
|
||||
<if test="deptName != null and deptName != ''"> and sd.dept_name like concat('%', #{deptName}, '%')</if>
|
||||
<if test="deviceName != null and deviceName != ''"> and dapd.device_name like concat('%', #{deviceName}, '%')</if>
|
||||
<if test="alarmType != null "> and dapd.alarm_type = #{alarmType}</if>
|
||||
<if test="plateNo != null "> and dapd.plate_no = #{plateNo}</if>
|
||||
<!-- 查询条件-项目部门 -->
|
||||
<if test="projectDeptId != null "> and sp.deptId = #{projectDeptId}</if>
|
||||
<!--子部门数据-->
|
||||
<if test='nowRole == "4"'> and sp.deptId = #{nowDept}</if>
|
||||
<!--监理单位/总包公司/分包单位查询当前关联数据-->
|
||||
<if test='nowRole == "5" or nowRole == "6" or nowRole == "7"'> and sp.id in (select spui.projectId from sur_project_unit_info spui where spui.unitId = #{nowDept} and spui.del_flag=0 )</if>
|
||||
<!--普通用户查询项目人员-->
|
||||
<if test='nowRole == "15" or nowRole == "16" or nowRole == "17" or nowRole == "99"'>
|
||||
and sp.id in (select spu.project_id from sur_project_userinfo spu where spu.user_id = #{nowUser} and spu.is_del=0)
|
||||
</if>
|
||||
</where>
|
||||
</select>
|
||||
|
||||
<select id="selectDevAiProjectDataById" parameterType="Long" resultMap="DevAiProjectDataResult">
|
||||
<include refid="selectDevAiProjectDataVo"/>
|
||||
where id = #{id}
|
||||
where dapd.id = #{id}
|
||||
</select>
|
||||
|
||||
<insert id="insertDevAiProjectData" parameterType="DevAiProjectData" useGeneratedKeys="true" keyProperty="id">
|
Loading…
Reference in New Issue