Commit 07463a28 by 潘建波

稳定版本保存

1 parent 97a3bd35
Showing 67 changed files with 5600 additions and 3226 deletions
No preview for this file type
No preview for this file type
......@@ -17,6 +17,7 @@
"moment": "^2.24.0",
"ol": "^6.1.1",
"particles.js": "^2.0.0",
"rimraf": "^3.0.2",
"vue": "^2.6.10",
"vue-router": "^3.1.3",
"vuex": "^3.0.1"
......
......@@ -114,17 +114,27 @@
//加载参数树
function loadParameterTree(xmlK, xmlV) {
let xmlValue = $.parseXML(xmlV)
let xmlValue = "";
let xmlKey = "";
try {
xmlValue = $.parseXML(xmlV)
edit_xml = xmlValue;
console.log(edit_xml)
let xmlKey = $.parseXML(xmlK);
console.log(xmlKey)
console.log(xmlValue)
} catch (error) {
console.error("baseconfig,xml结构解析失败请检查格式是否正确")
console.log("basXML",xmlV)
}
try {
xmlKey = $.parseXML(xmlK);
} catch (error) {
console.error("config,xml结构解析失败请检查格式是否正确")
console.log("configxml",xmlV)
}
let jsonData = convertXmlToJson(xmlKey, xmlValue);
window.xmlStr = ""; //XMLtoString(jsonData);
$('.datagrid-body').html('')
$("#ptree").tree("loadData", jsonData);
// var url = "/do/trafficController/configVal?t=" + new Date().getTime();
// var dataUrl = "/do/trafficController/configKey?t=" + new Date().getTime();
// if (isDebug) {
......
{"version":"2.0.2","Info":"��ɶ","Bug":"��ɶ","date":"2020-05-07T05:51:19.187Z"}
\ No newline at end of file
{"version":"2.0.3","Info":"ɶ�ط�","Bug":"ɶ�ط�","date":"2020-05-07T02:48:19.951Z"}
\ No newline at end of file
......@@ -16,7 +16,7 @@ export default {
}
let token = localStorage.getItem("atoken");
if (!token) {
this.$router.push("/login");
this.$router.push("/login").catch(err => {err});
}
},
mounted() {
......
......@@ -43,7 +43,7 @@ service.interceptors.request.use(
config.headers.authorization = atoken;
}
} else {
router.push("/login");
router.push("/login").catch(err => {err});
// endLoading();
}
if (config.method == "get") {
......
......@@ -3,7 +3,9 @@ import axios from "axios";
console.log(process.env.NODE_ENV);
switch (process.env.NODE_ENV) {
case "development":
// baseUrl = "http://192.168.9.234:20080"; // 测试环境url
baseUrl = "http://192.168.9.233:20080"; // 测试环境url
// baseUrl = "http://192.168.9.82:8080"; // 测试环境url
// baseUrl = "http://192.168.9.61:8086";
// baseUrl = 'http://vion-panda.51vip.biz:52510';
break;
......
......@@ -16,6 +16,6 @@ export default {
return `${baseUrl}/api/v1/codes/traffic/cates/${cate_unid}/codes`;
},
editTrafficCode(cate_unid, code_unid) {
return `${baseUrl}/api/v1/codes/traffic/cates/${cate_unid}}/codes/${code_unid}`;
return `${baseUrl}/api/v1/codes/traffic/cates/${cate_unid}/codes/${code_unid}`;
}
};
......@@ -32,12 +32,18 @@ export default {
return api.get(`${baseUrl}/api/v1/devconf_fx/devs/${devuid}/vchans/${refid}`); //获取分析流
},
sipSet(devid, userid) {
return api.get(`${baseUrl}/devconf_fx/devs/${devid}/${userid}/sip_server`);
return api.get(`${baseUrl}/api/v1/devconf_fx/devs/${devid}/${userid}/sip_server`);
},
getStore(params) {
return api.get(`${baseUrl}/api/v1/devconf_fx/store_confs`, params);
},
getFreelist(dev_unid, params) {
return api.get(`${baseUrl}/api/v1/devconf_fx/devs/${dev_unid}/fx_devs/free`, params)
return api.get(`${baseUrl}/api/v1/devconf_fx/devs/${dev_unid}/fx_devs/free`, params);
},
getDevStatus(dev_unid, params) {
return api.get(`${baseUrl}/api/v1/devconf_fx/devs/${dev_unid}/status`, params);
},
getSubTaskStatus() {
return api.get(`${baseUrl}/api/v1/devconf_fx/tasks/subtasks/status`);
}
};
import api from "../index";
import baseUrl from "../baseUrl";
export default {
devs(params){
return api.get(`${baseUrl}/api/v1/devconf_fx/devs`, params)
devs(params) {
return api.get(`${baseUrl}/api/v1/devconf_fx/devs`, params);
},
treeList(params,id) {
return api.get(`${baseUrl}/api/v1/devconf_fx/devs/${id}/vchan_struct`, params)
treeList(params, id) {
return api.get(
`${baseUrl}/api/v1/devconf_fx/devs/${id}/vchan_struct`,
params
);
},
getVideoList(params,id) {
return api.get(`${baseUrl}/api/v1/devconf_fx/devs/${id}/vchans`, params)
getVideoList(params, id) {
return api.get(`${baseUrl}/api/v1/devconf_fx/devs/${id}/vchans`, params);
},
addCode(params,id) {
return api.post(`${baseUrl}/api/v1/codes/custom/cates/${id}/codes`, params)
addCode(params, id) {
return api.post(`${baseUrl}/api/v1/codes/custom/cates/${id}/codes`, params);
},
addNode(params,id){
return api.post(`${baseUrl}/api/v1/org`, params)
addNode(params, id) {
return api.post(`${baseUrl}/api/v1/org`, params);
},
getCode(params,id){
return api.get(`${baseUrl}/api/v1/codes/custom/cates/${id}/codes`, params)
getCode(params, id) {
return api.get(`${baseUrl}/api/v1/codes/custom/cates/${id}/codes`, params);
},
editCode(params,id,unid){
return api.post(`${baseUrl}/api/v1/codes/custom/cates/${id}/codes/${unid}`, params)
editCode(params, id, unid) {
return api.post(
`${baseUrl}/api/v1/codes/custom/cates/${id}/codes/${unid}`,
params
);
},
delCode(params,id,unid){
return api.delete(`${baseUrl}/api/v1/codes/custom/cates/${id}/codes/${unid}`, params)
delCode(params, id, unid) {
return api.delete(
`${baseUrl}/api/v1/codes/custom/cates/${id}/codes/${unid}`,
params
);
},
delOrg(params,id){
return api.delete(`${baseUrl}/api/v1/org/${id}`, params)
delOrg(params, id) {
return api.delete(`${baseUrl}/api/v1/org/${id}`, params);
},
delCamera(params,id,id2){
return api.delete(`${baseUrl}/api/v1/devconf_fx/devs/${id}/vchans/${id2}`, params)
delCamera(params, id, id2) {
return api.delete(
`${baseUrl}/api/v1/devconf_fx/devs/${id}/vchans/${id2}`,
params
);
},
getCameraTable(params,id,id2){
console.log(id2)
if(id2){
return api.get(`${baseUrl}/api/v1/devconf_fx/devs/${id}/vchans/${id2}`, params)
}else{
return api.get(`${baseUrl}/api/v1/devconf_fx/devs/${id}/vchans`, params)
getCameraTable(params, id, id2) {
console.log(id2);
if (id2) {
return api.get(
`${baseUrl}/api/v1/devconf_fx/devs/${id}/vchans/${id2}`,
params
);
} else {
return api.get(`${baseUrl}/api/v1/devconf_fx/devs/${id}/vchans`, params);
}
},
editVideo(params,id,id2){
return api.post(`${baseUrl}/api/v1/devconf_fx/devs/${id}/vchans/${id2}`, params)
editVideo(params, id, id2) {
return api.post(
`${baseUrl}/api/v1/devconf_fx/devs/${id}/vchans/${id2}`,
params
);
},
delVideo(params,id,id2){
return api.delete(`${baseUrl}/api/v1/devconf_fx/devs/${id}/vchans/${id2}`, params)
delVideo(params, id, id2) {
return api.delete(
`${baseUrl}/api/v1/devconf_fx/devs/${id}/vchans/${id2}`,
params
);
},
addCamera(params,id){
return api.post(`${baseUrl}/api/v1/devconf_fx/devs/${id}/vchans`, params)
addCamera(params, id) {
return api.post(`${baseUrl}/api/v1/devconf_fx/devs/${id}/vchans`, params);
},
editCamera(params,id,id2){
return api.post(`${baseUrl}/api/v1/devconf_fx/devs/${id}/vchans/${id2}`, params)
editCamera(params, id, id2) {
return api.post(
`${baseUrl}/api/v1/devconf_fx/devs/${id}/vchans/${id2}`,
params
);
},
uploadFile(params,id){
return api.post(`${baseUrl}/api/v1/devconf_fx/devs/${id}/vfile_vchans`, params,{'Content-Type': 'multipart/form-data'})
uploadFile(params, id) {
return api.post(
`${baseUrl}/api/v1/devconf_fx/devs/${id}/vfile_vchans`,
params,
{ "Content-Type": "multipart/form-data" }
);
},
getResource(params, id) {
......
......@@ -294,3 +294,6 @@ body{
.el-submenu__title{
font-size: 15px;
}
.el-table--small td, .el-table--small th {
height: 55px;
}
\ No newline at end of file
import {CalcRealCoor,CalcImgCoor,Mat_Multiply,CalcInvK,CalcK} from "./Camera_Parameters.js"
const PI = 3.14159265
import {
CalcRealCoor,
CalcImgCoor,
Mat_Multiply,
CalcInvK,
CalcK
} from "./Camera_Parameters.js";
const PI = 3.14159265;
const CameraParameter = {
m_fTiltAngle: '', //倾斜角度,摄像头与水平面夹角,单位度
m_fRollAngle: '', //滚动角度,摄像头“滚”的角度,单位度 (备用参数,可能不需要)
m_fPanAngle: '', //旋转角度,摄像头“摇”的角度,单位度 (备用参数,可
m_fCCDWidth: '', //ccd宽度=图像宽度×ccd水平像素距离,(单位:毫米)
m_fCCDHeight: '', //ccd高度=图像高度×ccd垂直像素距离,(单
m_fFocusX: '', //中间数据
m_fFo: '',
m_fHeight: '', //相机高度
m_fCameraFoucs: '', //摄像头的焦
m_fTiltAngle: "", //倾斜角度,摄像头与水平面夹角,单位度
m_fRollAngle: "", //滚动角度,摄像头“滚”的角度,单位度 (备用参数,可能不需要)
m_fPanAngle: "", //旋转角度,摄像头“摇”的角度,单位度 (备用参数,可
m_fCCDWidth: "", //ccd宽度=图像宽度×ccd水平像素距离,(单位:毫米)
m_fCCDHeight: "", //ccd高度=图像高度×ccd垂直像素距离,(单
m_fFocusX: "", //中间数据
m_fFo: "",
m_fHeight: "", //相机高度
m_fCameraFoucs: "", //摄像头的焦
m_dblK: [], //成像矩阵,以相机为原点,x轴向右,y轴向下,z轴向前
m_dblInvK: [],
}
m_dblInvK: []
};
var CameraParam = CameraParameter;
var CarLength = 4.5, CarWidth = 1.7, CarHeight = 1.5;
var PedLength = 0.3, PedWidth = 0.5, PedHeight = 1.7;
var ModelLength = 4.5,ModelWidth = 1.7,ModelHeight = 1.5;
export var changeModelData = function(type){
if(type == 'car'){
var CarLength = 4.5,
CarWidth = 1.7,
CarHeight = 1.5;
var PedLength = 0.3,
PedWidth = 0.5,
PedHeight = 1.7;
var ModelLength = 4.5,
ModelWidth = 1.7,
ModelHeight = 1.5;
export var changeModelData = function(type) {
if (type == "car") {
ModelLength = CarLength;
ModelWidth = CarWidth;
ModelHeight = CarHeight;
}
if(type == 'person'){
if (type == "person") {
ModelLength = PedLength;
ModelWidth = PedWidth;
ModelHeight = PedHeight;
}
}
var CalcCrossPoint = function (p1, p2, p3, p4) {
var fDetM1 = '', fDetM2 = '', fa = '';
};
var CalcCrossPoint = function(p1, p2, p3, p4) {
var fDetM1 = "",
fDetM2 = "",
fa = "";
var p5 = {};
fDetM1 = (p2.x - p1.x) * (p4.y - p3.y) - (p4.x - p3.x) * (p2.y - p1.y);
if (fDetM1 < 0.000001 && fDetM1 > -0.000001) {
......@@ -48,7 +61,7 @@ var CalcCrossPoint = function (p1, p2, p3, p4) {
p5.x = p1.x + fa * (p2.x - p1.x);
p5.y = p1.y + fa * (p2.y - p1.y);
return p5;
}
};
/**
* 根据平行线和一个标定距离计算相机标定
......@@ -57,64 +70,91 @@ var CalcCrossPoint = function (p1, p2, p3, p4) {
* @param {Array} Points //标定的6个点的相对坐标,前四个是一组平行线;最后两点是标定好的距离
* @param {float} fDist //标定最后两点的距离
*/
export var scRTEngineCalcBaseon6Points = function (fHeight, fRatioW2H, Points, fDist) {
var VanishPoint, fTanTilt, fy, fMinError = 1000;
export var scRTEngineCalcBaseon6Points = function(
fHeight,
fRatioW2H,
Points,
fDist
) {
var VanishPoint,
fTanTilt,
fy,
fMinError = 1000;
var copyCameraParameter = JSON.stringify(CameraParameter);
var TempParam = JSON.parse(copyCameraParameter);
if (fHeight <= 0 || fDist <= 0 || fRatioW2H <= 0)
return;
if (fHeight <= 0 || fDist <= 0 || fRatioW2H <= 0) return;
VanishPoint = CalcCrossPoint(Points[0], Points[1], Points[2], Points[3]);
if (VanishPoint.y < -100000 || VanishPoint.y > 100000) //标定线平行则放弃
if (VanishPoint.y < -100000 || VanishPoint.y > 100000)
//标定线平行则放弃
return;
TempParam.m_fHeight = fHeight;
CameraParam.m_fHeight = fHeight;
//搜索error最小的标定
for (fTanTilt = 0.01; fTanTilt < 1; fTanTilt += 0.005) //范围45~89度
{
for (
fTanTilt = 0.01;
fTanTilt < 1;
fTanTilt += 0.005 //范围45~89度
) {
var fTiltAngle; //fTiltAngle为相机与水平线的夹角
if (VanishPoint.y <= 0.5) //如果标定线交点在图像上方,认为其是地面平行线相交的无穷远点,夹角取值范围0~45度
{
fTiltAngle = Math.atan(fTanTilt) * 180 / PI;
if (VanishPoint.y <= 0.5) {
//如果标定线交点在图像上方,认为其是地面平行线相交的无穷远点,夹角取值范围0~45度
fTiltAngle = (Math.atan(fTanTilt) * 180) / PI;
fy = (0.5 - VanishPoint.y) / fTanTilt;
} else //否则认为是纵向平行线相交的地心点,此时fTiltAngle的取值范围45~89度,fTanTilt可认为是ctg(tilt),地心点的图像坐标y=fy*ctg(tilt)
{
fTiltAngle = Math.atan(1.0 / fTanTilt) * 180 / PI;
} //否则认为是纵向平行线相交的地心点,此时fTiltAngle的取值范围45~89度,fTanTilt可认为是ctg(tilt),地心点的图像坐标y=fy*ctg(tilt)
else {
fTiltAngle = (Math.atan(1.0 / fTanTilt) * 180) / PI;
fy = (VanishPoint.y - 0.5) / fTanTilt;
}
TempParam.m_fTiltAngle = fTiltAngle;
TempParam.m_fFocusX = fy / fRatioW2H;
TempParam.m_fFocusY = fy;
if(TempParam.m_fFocusX != 0)
{
var fTanPan = -(VanishPoint.x-0.5)*Math.cos(TempParam.m_fTiltAngle/180*PI)/TempParam.m_fFocusX;//pan角度,根据消失点计算
TempParam.m_fPanAngle = Math.atan(fTanPan)*180/PI;
}
else
{
if (TempParam.m_fFocusX != 0) {
var fTanPan =
(-(VanishPoint.x - 0.5) *
Math.cos((TempParam.m_fTiltAngle / 180) * PI)) /
TempParam.m_fFocusX; //pan角度,根据消失点计算
TempParam.m_fPanAngle = (Math.atan(fTanPan) * 180) / PI;
} else {
TempParam.m_fPanAngle = 0;
}
TempParam.m_dblK = CalcK(TempParam.m_dblK,TempParam.m_fFocusX, TempParam.m_fFocusY, TempParam.m_fTiltAngle, 0, TempParam.m_fPanAngle);
TempParam.m_dblInvK = CalcInvK(TempParam.m_dblInvK,TempParam.m_fFocusX, TempParam.m_fFocusY, TempParam.m_fTiltAngle, 0, TempParam.m_fPanAngle);
TempParam.m_dblK = CalcK(
TempParam.m_dblK,
TempParam.m_fFocusX,
TempParam.m_fFocusY,
TempParam.m_fTiltAngle,
0,
TempParam.m_fPanAngle
);
TempParam.m_dblInvK = CalcInvK(
TempParam.m_dblInvK,
TempParam.m_fFocusX,
TempParam.m_fFocusY,
TempParam.m_fTiltAngle,
0,
TempParam.m_fPanAngle
);
//计算头两点的距离,搜索error最小的标定
{
var fCurrrError = '';
var P0 = '',P1 = '';
var fCurrrError = "";
var P0 = "",
P1 = "";
P0 = CalcRealCoor(Points[4], TempParam.m_dblInvK, TempParam.m_fHeight);
P1 = CalcRealCoor(Points[5], TempParam.m_dblInvK, TempParam.m_fHeight);
fCurrrError = Math.abs(Math.sqrt((P0.x-P1.x)*(P0.x-P1.x) + (P0.z-P1.z)*(P0.z-P1.z)) - fDist);
fCurrrError = Math.abs(
Math.sqrt(
(P0.x - P1.x) * (P0.x - P1.x) + (P0.z - P1.z) * (P0.z - P1.z)
) - fDist
);
if (fCurrrError < fMinError)
{
if (fCurrrError < fMinError) {
fMinError = fCurrrError;
var a = JSON.stringify(TempParam);
var b = JSON.parse(a);
......@@ -122,7 +162,7 @@ export var scRTEngineCalcBaseon6Points = function (fHeight, fRatioW2H, Points, f
}
}
}
}
};
/**
* 计算车或人的模型框点位
......@@ -130,16 +170,17 @@ export var scRTEngineCalcBaseon6Points = function (fHeight, fRatioW2H, Points, f
* @param {*} P2 模型线点
* @param {*} CarOutline 传入参数
*/
export var CalcCarOutline = function (P1, P2, CarOutline)
{
var P3d1 = {}, P3d2 = {};
var Xdire = {}, Zdire = {};
export var CalcCarOutline = function(P1, P2, CarOutline) {
var P3d1 = {},
P3d2 = {};
var Xdire = {},
Zdire = {};
var ftempN;
P3d1 = CalcRealCoor(P1, CameraParam.m_dblInvK, CameraParam.m_fHeight, P3d1);
P3d2 = CalcRealCoor(P2, CameraParam.m_dblInvK, CameraParam.m_fHeight, P3d2);
Zdire.x = P3d2.x-P3d1.x;
Zdire.y = P3d2.z-P3d1.z;
ftempN = Math.sqrt(Zdire.x*Zdire.x+Zdire.y*Zdire.y);
Zdire.x = P3d2.x - P3d1.x;
Zdire.y = P3d2.z - P3d1.z;
ftempN = Math.sqrt(Zdire.x * Zdire.x + Zdire.y * Zdire.y);
Zdire.x /= ftempN;
Zdire.y /= ftempN;
Xdire.x = Zdire.y;
......@@ -147,48 +188,45 @@ export var CalcCarOutline = function (P1, P2, CarOutline)
{
//左上点
P3d2.x = P3d1.x-ModelWidth/2*Xdire.x;
P3d2.y = CameraParam.m_fHeight-ModelHeight;
P3d2.z = P3d1.z-ModelWidth/2*Xdire.y;
P3d2.x = P3d1.x - (ModelWidth / 2) * Xdire.x;
P3d2.y = CameraParam.m_fHeight - ModelHeight;
P3d2.z = P3d1.z - (ModelWidth / 2) * Xdire.y;
CalcImgCoor(CarOutline[0], CameraParam.m_dblK, P3d2);
//右上点
P3d2.x = P3d1.x+ModelWidth/2*Xdire.x;
P3d2.y = CameraParam.m_fHeight-ModelHeight;
P3d2.z = P3d1.z+ModelWidth/2*Xdire.y;
P3d2.x = P3d1.x + (ModelWidth / 2) * Xdire.x;
P3d2.y = CameraParam.m_fHeight - ModelHeight;
P3d2.z = P3d1.z + (ModelWidth / 2) * Xdire.y;
CalcImgCoor(CarOutline[1], CameraParam.m_dblK, P3d2);
//右下点
P3d2.x = P3d1.x+ModelWidth/2*Xdire.x;
P3d2.x = P3d1.x + (ModelWidth / 2) * Xdire.x;
P3d2.y = CameraParam.m_fHeight;
P3d2.z = P3d1.z+ModelWidth/2*Xdire.y;
P3d2.z = P3d1.z + (ModelWidth / 2) * Xdire.y;
CalcImgCoor(CarOutline[2], CameraParam.m_dblK, P3d2);
//左下点
P3d2.x = P3d1.x-ModelWidth/2*Xdire.x;
P3d2.x = P3d1.x - (ModelWidth / 2) * Xdire.x;
P3d2.y = CameraParam.m_fHeight;
P3d2.z = P3d1.z-ModelWidth/2*Xdire.y;
P3d2.z = P3d1.z - (ModelWidth / 2) * Xdire.y;
CalcImgCoor(CarOutline[3], CameraParam.m_dblK, P3d2);
//前左上点
P3d2.x = P3d1.x-ModelWidth/2*Xdire.x+ModelLength*Zdire.x;
P3d2.y = CameraParam.m_fHeight-ModelHeight;
P3d2.z = P3d1.z-ModelWidth/2*Xdire.y+ModelLength*Zdire.y;
P3d2.x = P3d1.x - (ModelWidth / 2) * Xdire.x + ModelLength * Zdire.x;
P3d2.y = CameraParam.m_fHeight - ModelHeight;
P3d2.z = P3d1.z - (ModelWidth / 2) * Xdire.y + ModelLength * Zdire.y;
CalcImgCoor(CarOutline[4], CameraParam.m_dblK, P3d2);
//前右上点
P3d2.x = P3d1.x+ModelWidth/2*Xdire.x+ModelLength*Zdire.x;
P3d2.y = CameraParam.m_fHeight-ModelHeight;
P3d2.z = P3d1.z+ModelWidth/2*Xdire.y+ModelLength*Zdire.y;
P3d2.x = P3d1.x + (ModelWidth / 2) * Xdire.x + ModelLength * Zdire.x;
P3d2.y = CameraParam.m_fHeight - ModelHeight;
P3d2.z = P3d1.z + (ModelWidth / 2) * Xdire.y + ModelLength * Zdire.y;
CalcImgCoor(CarOutline[5], CameraParam.m_dblK, P3d2);
//前右下点
P3d2.x = P3d1.x+ModelWidth/2*Xdire.x+ModelLength*Zdire.x;
P3d2.x = P3d1.x + (ModelWidth / 2) * Xdire.x + ModelLength * Zdire.x;
P3d2.y = CameraParam.m_fHeight;
P3d2.z = P3d1.z+ModelWidth/2*Xdire.y+ModelLength*Zdire.y;
P3d2.z = P3d1.z + (ModelWidth / 2) * Xdire.y + ModelLength * Zdire.y;
CalcImgCoor(CarOutline[6], CameraParam.m_dblK, P3d2);
//前左下点
P3d2.x = P3d1.x-ModelWidth/2*Xdire.x+ModelLength*Zdire.x;
P3d2.x = P3d1.x - (ModelWidth / 2) * Xdire.x + ModelLength * Zdire.x;
P3d2.y = CameraParam.m_fHeight;
P3d2.z = P3d1.z-ModelWidth/2*Xdire.y+ModelLength*Zdire.y;
P3d2.z = P3d1.z - (ModelWidth / 2) * Xdire.y + ModelLength * Zdire.y;
CalcImgCoor(CarOutline[7], CameraParam.m_dblK, P3d2);
}
return CarOutline
}
return CarOutline;
};
......@@ -152,6 +152,7 @@ class Codes {
}
// 违法类型
try {
this.result.illegalTypestate = parseInt(this.allData.event_data.illegal.state);
this.result.illegalType =
parseInt(this.allData.event_data.illegal.state) === 1
? this.getCode("违法类型", this.allData.event_data.illegal.code)
......
module.exports = {
data(){
return {
workers: {
video_free: 0,
video_busy: 0
},
dev_unid: localStorage.getItem("dev_unid"),
taskstatus:{
running: 0,
total: 0
}
}
},
methods: {
getDevStatus() {
this.$api.device.getDevStatus(this.dev_unid).then(res => {
if (res.ecode != 500) {
this.workers = res.works;
} else {
this.$message({
type: "error",
message: res.enote
});
}
});
},
getSubTaskStatus() {
this.$api.device.getSubTaskStatus().then(res => {
if (res.ecode != 500) {
this.taskstatus = res;
} else {
this.$message({
type: "error",
message: res.enote
});
}
});
}
},
created() {
this.getSubTaskStatus();
this.getDevStatus();
}
}
\ No newline at end of file
......@@ -20,14 +20,12 @@ Vue.prototype.$moment = moment;
Vue.prototype.$buildCode = buildCode;
Vue.prototype.oParse = new XML.ObjTree();
Vue.prototype.axios = axios;
// import VueParticles from "vue-particles";
// Vue.use(VueParticles);
Vue.use(api);
Vue.use(ElementUI, { size: "small", zIndex: 3000 });
Vue.use(resetCss);
Vue.config.productionTip = false;
new Vue({
router,
......@@ -38,3 +36,4 @@ new Vue({
// window.onunload = function() {
// localStorage.clear();
// };
......@@ -127,7 +127,7 @@ export default {
localStorage.removeItem("curmenu");
this.$store.commit(types.ATOKEN, "");
localStorage.removeItem("atoken");
this.$router.push("/login");
this.$router.push("/login").catch(err => {err});
}
},
created() {
......
......@@ -8,7 +8,7 @@
:unique-opened="true"
wdth="116vw"
>
<el-submenu index="1" class="menu-icon">
<!-- <el-submenu index="1" class="menu-icon">
<template slot="title">
<i class="icon-fanxing-iconxuanzhongshouye1"></i>
<span slot="title">态势总览</span>
......@@ -16,17 +16,26 @@
<el-menu-item index="/trficcshow">
<i class="submenuicon"></i>交通展示
</el-menu-item>
<!-- <el-menu-item index="/behaviorshow">
<el-menu-item index="/behaviorshow">
<i class="submenuicon"></i>综治展示
</el-menu-item> -->
</el-submenu>
<el-submenu v-for="(fristmenu,index) in permission_routers" :index="fristmenu.path" :key="index" class="menu-icon">
</el-menu-item>
</el-submenu> -->
<el-submenu
v-for="(fristmenu, index) in permission_routers"
:index="fristmenu.path"
:key="index"
class="menu-icon"
>
<template slot="title">
<i :class="fristmenu.meta.icon"></i>
<span slot="title">{{fristmenu.name}}</span>
<span slot="title">{{ fristmenu.name }}</span>
</template>
<el-menu-item v-for="(twomenu,index) in fristmenu.children" :key="index" :index="twomenu.path">
<i class="submenuicon"></i>{{twomenu.name}}
<el-menu-item
v-for="(twomenu, index) in fristmenu.children"
:key="index"
:index="twomenu.path"
>
<i class="submenuicon"></i>{{ twomenu.name }}
</el-menu-item>
</el-submenu>
</el-menu>
......@@ -42,12 +51,14 @@ export default {
full: false,
isCollapse: false,
activemenu: "/indexshow",
topbar:[]
topbar: []
};
},
methods: {
handleSelect(key, keyPath) {
this.$router.push(key);
this.$router.push(key).catch(err => {
err;
});
localStorage.setItem("curmenu", key);
this.activemenu = key;
},
......@@ -60,24 +71,27 @@ export default {
},
created() {
// let activemenu = localStorage.getItem("curmenu");
let activemenu = location.href.split('#')[1];
let activemenu = location.href.split("#")[1];
if (activemenu) {
this.activemenu = activemenu;
this.$router.push(activemenu);
this.$router.push(activemenu).catch(err => {
err;
});
} else {
this.$router.push("/");
this.activemenu = '/';
this.$router.push("/").catch(err => {
err;
});
this.activemenu = "/";
}
},
watch:{
$route(t, f){
console.log('to',t)
watch: {
$route(t, f) {
let obj = {
name:t.name,
path:t.path,
name: t.name,
path: t.path
// icon:t.meta.icon
}
this.$emit("setTopBar",obj)
};
this.$emit("setTopBar", obj);
}
}
};
......
......@@ -145,7 +145,7 @@ export default {
this.$store
.dispatch("GetMenuRole", res.menu_tree[0].children)
.then(res => {
this.$router.push("/trficcshow");
this.$router.push("/video_task/config").catch(err => {err});
});
});
},
......@@ -357,12 +357,15 @@ h1 {
outline: none;
box-shadow: none;
}
.box {
width: 25%;
position: absolute;
left: 52%;
top: 20%;
}
button {
width: 100%;
margin-top: 40px;
......
<template>
<div class>
<el-header class="headers">
<span class="title">分析展示</span>
<span class="title">分析展示</span>
</el-header>
<el-container style="min-height:calc(100vh - 64px);" class="showbox">
<el-main style="padding: 12px;overflow:hidden">
......@@ -137,9 +137,7 @@ export default {
},
mounted() {
this.$refs.videoplay.videoPlay();
},
components: {
videoplay
......@@ -258,7 +256,7 @@ export default {
}
};
</script>
<style scoped="scoped" lang="scss">
<style scoped="scoped">
.headers {
line-height: 60px;
}
......
......@@ -3,13 +3,13 @@
<div class="item-box">
<div class="item-info-box">
<div>分析资源</div>
<div><span>64</span></div>
<div><span>{{workers.video_free + workers.video_busy}}</span></div>
</div>
</div>
<div class="item-box">
<div class="item-info-box">
<div>运行路数</div>
<div> <span>47</span></div>
<div> <span>{{taskstatus.running}}</span></div>
</div>
</div>
<div class="item-box">
......@@ -28,9 +28,20 @@
</template>
<script>
import mixin from "../../assets/js/mixin";
export default {
mixins:[mixin],
data() {
return {};
return {
};
},
methods:{
},
created() {
}
};
</script>
......
......@@ -7,77 +7,235 @@
<el-col :span="2" class="ml10">
<el-button type="primary">查询</el-button>
</el-col>
<el-col :span="8" style="float:right">
<span class="resource-box">
<span class="title">可用分析资源:</span>
<span class="num">{{ workers.video_free }}</span>
</span>
<span class="resource-box">
<span class="title">在用分析资源:</span>
<span class="num">{{ workers.video_busy }}</span>
</span>
</el-col>
</div>
<!-- 外层内容 -->
<div class="content-box" id="eqcontentbox">
<div class="left-box">
<div class="master-box">
master
<div
class="master-box"
v-if="devData.length > 0"
@click="getSubDev(devData[0])"
>
<div>{{ devData[0].device_name }}</div>
<div>{{ devData[0].out_ip }}</div>
</div>
<div class="submast-box">
<div
:class="{ 'sbumast-item': true, 'top-line': true }"
v-for="(item, index) in itemlength"
:key="item"
@click="getleval($event, index)"
:style="`background:rgba(${setsubcolor(index)},.2);borderColor:rgb(${setsubcolor(index)})`"
:class="{ 'submast-item': true, 'top-line': true,'oneline':subDevData.length == 1 }"
v-for="(subitem, index) in subDevData"
:key="index"
ref="subitem"
@click.stop="getleval($event, index, subitem)"
:style="
`background:rgba(${setsubcolor(
index
)},.2);borderColor:rgb(${setsubcolor(index)})`
"
>
<div :class="{ 'sub-line': index == curindex }"></div>
{{ item }}
</div>
<div
:class="{ 'sub-line': index == curindex && slaveData.length > 0 }"
:style="`background:${curlevalbordercolor}`"
></div>
<div>{{ subitem.device_name }}</div>
<div>{{ subitem.out_ip }}</div>
</div>
<!-- <div class="leval-box" :style="'top:'+topheihgt+'px;'" >
<div :class="{'sbumast-item':true,'top-line':istop,'bottom-line':!istop}" v-for="item in levallength" :key="item" @click="getleval($event)">
{{item}}
</div>
</div> -->
<!-- 叶子节点 -->
<div
v-if="istop"
:style="`top:${topheihgt}px;left:${item * 14 + 12}vw`"
v-for="item in 3"
:key="item"
v-if="istop && slaveData.length > 0"
:style="`top:${topheihgt + 1}px;left:${loopitem * 14 + 00}px`"
v-for="(loopitem, loopindex) in Math.ceil(slaveData.length / 6)"
:key="loopindex"
class="leval-box"
>
<span
class="leval-top-line"
:style="`background:${curlevalbordercolor}`"
></span>
<div
:class="{
'sbumast-item': true,
'leval-sbumast-item': true,
'leval-submast-item': true,
'top-line': istop,
'bottom-line': !istop
'bottom-line': !istop,
offline: item.online == 0
}"
v-for="item in levallength"
:key="item"
:style="`background:${curlevalcolor};borderColor:${curlevalbordercolor}`"
v-for="(item, cindex) in setslaveData(slaveData, loopindex)"
:key="cindex"
:style="
`background:${curlevalcolor};borderColor:${curlevalbordercolor}`
"
>
{{ '192.168.9.99' }}
<span
class="left-line"
:style="`background:${curlevalbordercolor}`"
></span>
<span
class="vertical-line"
:style="`background:${curlevalbordercolor}`"
></span>
<div>{{ item.device_name }}</div>
<div>{{ item.in_ip }}</div>
</div>
</div>
<div
v-if="!istop"
:style="`bottom:${bottomHeight}px;left:${item * 14 + 12}vw`"
v-for="item in 3"
:key="item"
v-if="!istop && slaveData.length > 0"
:style="`bottom:${bottomHeight + 5}px;left:${loopitem * 14 + 11}px`"
v-for="(loopitem, loopindex) in Math.ceil(slaveData.length / 6)"
:key="loopitem"
class="leval-bottom-box"
>
<span
class="leval-bottom-line"
:style="`background:${curlevalbordercolor}`"
></span>
<div
ref="submast"
:class="{
'sbumast-item': true,
'leval-sbumast-item': true,
'leval-submast-item': true,
'top-line': istop,
'bottom-line': !istop
'bottom-line': !istop,
offline: item.online == 0
}"
v-for="item in levallength"
:key="item"
:style="`background:${curlevalcolor};borderColor:${curlevalbordercolor}`"
v-for="(item, xindex) in setslaveData(slaveData, loopindex)"
:key="xindex"
:style="
`background:${curlevalcolor};borderColor:${curlevalbordercolor}`
"
>
{{ '192.168.9.99' }}
<span
class="left-line"
:style="`background:${curlevalbordercolor}`"
></span>
<span
class="vertical-line"
:style="`background:${curlevalbordercolor}`"
></span>
<div>{{ item.device_name }}</div>
<div>{{ item.in_ip }}</div>
</div>
</div>
</div>
<div class="right-box">
<span>xxxx</span>
<div class="info-box">
<div class="info-title">
<span class="icon el-icon-star-off"></span>
<span class="title">设备信息</span>
</div>
<div class="info-content">
<div class="con-item">
<span class="con-label">平台类型:</span>
<span class="con-text"></span>
</div>
<div class="con-item">
<span class="con-label">设备类型:</span>
<span class="con-text"></span>
</div>
<div class="con-item">
<span class="con-label">设备名称:</span>
<span class="con-text">{{ curDevData.device_name }}</span>
</div>
<div class="con-item">
<span class="con-label">设备ID:</span>
<span class="con-text">{{ curDevData.device_id }}</span>
</div>
<div class="con-item">
<span class="con-label">内网信息:</span>
<span class="con-text">{{ curDevData.in_ip }}</span>
</div>
<div class="con-item">
<span class="con-label">外网信息:</span>
<span class="con-text">{{ curDevData.out_ip }}</span>
</div>
</div>
</div>
<div class="info-box">
<div class="info-title">
<span class="icon el-icon-star-off"></span>
<span class="title">系统版本</span>
</div>
<div class="info-content">
<div class="con-item">
<span class="con-label">系统版本:</span>
<span class="con-text">{{
curDevData.system_version ? curDevData.system_version : "无"
}}</span>
</div>
<div class="con-item">
<span class="con-label">算法版本:</span>
<span class="con-text">{{
curDevData.algorithm_version
? curDevData.algorithm_version
: "无"
}}</span>
</div>
<div class="con-item">
<span class="con-label">软件版本:</span>
<span class="con-text">{{
curDevData.software_version ? curDevData.software_version : "无"
}}</span>
</div>
<div class="con-item">
<span class="con-label">固件版本:</span>
<span class="con-text">{{
curDevData.firmware_version ? curDevData.firmware_version : "无"
}}</span>
</div>
</div>
</div>
<div class="info-box">
<div class="info-title">
<span class="icon el-icon-star-off"></span>
<span class="title">系统信息</span>
</div>
<div class="info-content">
<div class="con-item">
<span class="con-label">分析资源数:</span>
<span class="con-text">{{
curDevData.picture_total
? parseInt(curDevData.picture_total) +
parseInt(curDevData.video_total)
: curDevData.video_total
? parseInt(curDevData.picture_total) +
parseInt(curDevData.video_total)
: 0
}}</span>
</div>
<div class="con-item">
<span class="con-label">已用资源数:</span>
<span class="con-text">{{
curDevData.picture_busy
? parseInt(curDevData.picture_busy) +
parseInt(curDevData.video_busy)
: curDevData.video_busy
? parseInt(curDevData.picture_busy) +
parseInt(curDevData.video_busy)
: 0
}}</span>
</div>
<div class="con-item">
<span class="con-label">离线资源数:</span>
<span class="con-text">{{
curDevData.picture_free
? parseInt(curDevData.picture_free) +
parseInt(curDevData.video_free)
: curDevData.video_free
? parseInt(curDevData.picture_free) +
parseInt(curDevData.video_free)
: 0
}}</span>
</div>
</div>
</div>
</div>
</div>
<div style="clear: both;"></div>
......@@ -89,7 +247,11 @@ export default {
data() {
return {
treeData: [],
itemlength: 10,
subDevData: [],
workers: {
video_free: 0,
video_busy: 0
},
topheihgt: 120,
searchval: "",
styleheight: 0,
......@@ -98,73 +260,102 @@ export default {
curindex: -1,
curlevalcolor: "#f0f0f0",
curlevalbordercolor: "#f0f0f0",
submastcolor:['48,210,255','86,183,202','237,140,36','181,184,41','104,182,69','105,199,187','71,157,248','0,105,255','116,96,238','232,84,30'],
parentData: {},
slaveData: [],
devData: [],
submastcolor: [
"48,210,255",
"86,183,202",
"237,140,36",
"181,184,41",
"104,182,69",
"105,199,187",
"71,157,248",
"0,105,255",
"116,96,238",
"232,84,30"
],
curDevData: {},
defaultProps: {
children: "childs",
label: "device_name"
},
bottomHeight:0,
stylebottom:{
},
dev_unid: sessionStorage.getItem("dev_unid")
bottomHeight: 0,
stylebottom: {},
dev_unid: localStorage.getItem("dev_unid")
};
},
mounted() {
this.styleheight = 55 * 6;
this.itemlength = 39;
this.levallength = 6;
Math.ceil(9 / 6);
this.subDevData = 0;
},
created() {
this.dataInit();
this.getDevStatus();
},
methods: {
getleval(ev, index) {
getleval(ev, index, dev) {
this.curDevType = "sub";
let obj = {
parent_id: dev.device_id
};
this.curDevData = dev;
this.$api.device.getSubdev(this.parentData, obj).then(res => {
this.slaveData = res.list_data;
var eqc = document.getElementById("eqcontentbox").clientHeight;
console.log(ev);
this.curindex = index;
this.topheihgt = ev.toElement.offsetTop + 70 + 30;
this.topheihgt = this.$refs.subitem[index].offsetTop + 70 + 30;
if (index === 2) {
this.topheihgt = ev.toElement.offsetTop + 70 + 29;
this.topheihgt = this.$refs.subitem[index].offsetTop + 70 + 29;
}
if (index > 4) {
if (this.topheihgt > 340) {
this.istop = false;
} else {
this.istop = true;
}
this.bottomHeight = eqc - ev.toElement.offsetTop - 62;
this.bottomHeight = eqc - this.$refs.subitem[index].offsetTop - 62;
if (index % 3 == 0) {
this.bottomHeight = eqc - ev.toElement.offsetTop - 61;
this.bottomHeight = eqc - this.$refs.subitem[index].offsetTop - 61;
}
this.curlevalcolor = ev.toElement.style.backgroundColor;
this.curlevalbordercolor = ev.toElement.style.borderColor;
let a = document.querySelectorAll(".leval-sbumast-item");
this.curlevalcolor = this.$refs.subitem[index].style.backgroundColor;
this.curlevalbordercolor = this.$refs.subitem[index].style.borderColor;
});
},
setsubcolor(index) {
let color = "";
if (index >= 10) {
let c = String(index);
let i = Number(c[c.length-1]);
let i = Number(c[c.length - 1]);
color = this.submastcolor[i];
} else {
color = this.submastcolor[index];
}
return color;
},
getTree() {
this.$api.resource
.getDevsName(
{
is_leaf: 0
dataInit: function() {
this.$api.device.getDev().then(res => {
this.parentData = res[0].dev_unid;
this.getDev();
});
},
this.dev_unid
)
.then(res => {
this.treeData = res.list_data;
this.treeData.forEach(item => {
this.getChild(item.device_id);
getDev() {
this.$api.device.getSubdev(this.parentData).then(res => {
this.devData = res.list_data;
this.curDevType = "master";
this.curDevData = res.list_data[0];
});
},
getSubDev(dev) {
let obj = {
parent_id: dev.device_id
};
this.$api.device.getSubdev(this.parentData, obj).then(res => {
this.subDevData = res.list_data;
});
},
setslaveData(data, index) {
return data.slice(index * 6, 6 * (index + 1));
},
getChild(id) {
this.$api.resource
.getDevsName(
......@@ -186,6 +377,11 @@ export default {
},
handleNodeClick(data) {
console.log(data);
},
getDevStatus() {
this.$api.device.getDevStatus(this.dev_unid).then(res => {
this.workers = res.works;
});
}
}
};
......@@ -212,14 +408,16 @@ export default {
}
.left-box {
overflow: auto;
width: 65vw;
width: 73vw;
position: relative;
height: 100%;
margin: 0 0 12vh 0;
}
.left-box::-webkit-scrollbar {display:none}
.left-box::-webkit-scrollbar {
display: none;
}
.right-box {
width: 10vw;
width: 20vw;
height: 100%;
border-left: 10px solid #f5f7f9;
}
......@@ -227,121 +425,179 @@ export default {
position: absolute;
height: 40px;
width: 140px;
line-height: 40px;
text-align: center;
background: rgba(18, 62, 108, 0.2);
border: 1px solid rgba(18, 62, 108, 1);
border-radius: 5px;
left: 20px;
top: 20px;
left: 30px;
top: 25px;
cursor: pointer;
}
.submast-box {
position: absolute;
left: 12vw;
left: 200px;
top: 70px;
padding: 0 0 10vh 0;
padding: 0 0 100px 0;
}
.sbumast-item {
.submast-item,
.leval-submast-item {
position: relative;
height: 5vh;
width: 7vw;
height: 40px;
width: 140px;
text-align: center;
border-radius: 5px;
margin-top: 1vh;
margin-top: 14px;
border: 1px solid #333;
cursor: pointer;
}
.sbumast-item::before {
.submast-item::before {
content: "";
display: block;
position: absolute;
left: -5vw;
top: 2.5vh;
background: #123E6C;
width: 5vw;
left: -97px;
top: 20px;
background: #123e6c;
width: 97px;
height: 1px;
}
.sbumast-item::after {
.submast-item::after {
content: "";
display: block;
position: absolute;
left: -97px;
background: #123e6c;
width: 1px;
height: 90px;
}
.leval-submast-item .left-line {
display: block;
position: absolute;
left: -5vw;
top: 1.5vh;
background: #123E6C;
top: 2.5vh;
background: #123e6c;
width: 5vw;
height: 1px;
}
.leval-submast-item .vertical-line {
position: absolute;
left: -3vw;
top: 2.1vh;
background: #123e6c;
width: 1px;
height: 7.3vh;
height: 6.5vh;
}
.top-line:first-child::after {
height: 10vh;
top: -2.2vh;
top: -1.5vh;
}
.sbumast-item:last-child::after {
height: 0;
.top-line .vertical-line {
height: 106px;
top: -25px;
}
.bottom-line:last-child::after {
height: 7.35vh;
.oneline:first-child::after{
height: 35px!important;
}
.submast-item:last-child::after {
height: 0;
}
.leval-box {
position: absolute;
}
.leval-box::before{
position: absolute;
content: "";
height: 1px;
width: 16.1vw;
left: -5vw;
top: -1.1vh;
background: #ED8C24;
}
.leval-box:last-child::before {
width: 0;
}
.leval-bottom-box {
position: absolute;
}
.leval-bottom-box::before {
position: absolute;
content:"";
height: 1px;
width: 15.1vw;
left: -4vw;
bottom: -3.8vh;
background: #ED8C24;
}
.leval-bottom-box:last-child::before {
width: 0;
}
.leval-bottom-box .sbumast-item::after {
height: 6.4vh;
top: 2.5vh;
background: #ED8C24;
}
.leval-bottom-box .sbumast-item::before,
.leval-box .sbumast-item::before {
.leval-bottom-box .left-line,
.leval-box .left-line {
left: -3vw;
background: #ED8C24;
background: #ed8c24;
width: 3vw;
height: 1px;
}
.leval-bottom-box .sbumast-item::after,
.leval-box .sbumast-item::after {
.leval-bottom-box .vertical-line,
.leval-box .vertical-line {
left: -3vw;
background: #ED8C24;
background: #ed8c24;
}
.leval-submast-item:last-child .vertical-line {
height: 0;
}
.leval-bottom-box .bottom-line .vertical-line {
height: 6.3vh;
top: 2.5vh;
}
.sub-line {
position: absolute;
height: 1px;
width: 3vw;
right: -3vw;
background: #ED8C24;
width: 83px;
right: -83px;
top: 20px;
}
.leval-top-line {
position: absolute;
height: 1px;
width: 16.1vw;
left: -5vw;
top: -1.1vh;
width: 14vw;
left: -19vw;
background: #ED8C24;
background: #ed8c24;
}
.leval-bottom-line {
position: absolute;
height: 1px;
width: 15.1vw;
left: -4vw;
bottom: -3.8vh;
background: #ed8c24;
}
.leval-bottom-box:last-child .leval-bottom-line {
width: 0;
}
.leval-box:last-child .leval-top-line {
width: 0;
}
.info-box {
padding: 1.5vw 0 0 1.5vw;
overflow: hidden;
}
.info-title .icon {
display: inline-block;
height: 30px;
width: 30px;
border-radius: 30px;
background: rgba(59, 183, 255, 1);
text-align: center;
line-height: 30px;
font-size: 20px;
color: #fff;
}
.info-title .title {
padding: 0 0 0 20px;
vertical-align: top;
font-size: 16px;
color: #000;
}
.info-content {
margin-left: 50px;
font-size: 14px;
color: #000;
}
.offline {
border: 1px solid rgba(65, 60, 60, 0.2) !important;
background: rgba(65, 60, 60, 0.2) !important;
}
.resource-box {
margin-left: 40px;
display: inline-block;
padding-top: 4px;
}
.resource-box .title {
color: #000;
padding-right: 10px;
}
.resource-box .num {
font-size: 18px;
font-weight: 600;
}
</style>
......@@ -7,17 +7,31 @@
<el-col :span="2" class="ml10">
<el-button type="primary">查询</el-button>
</el-col>
<el-col :span="8" style="float:right">
<span class="resource-box">
<span class="title">可用分析资源:</span>
<span class="num">{{ workers.video_free }}</span>
</span>
<span class="resource-box">
<span class="title">在用分析资源:</span>
<span class="num">{{ workers.video_busy }}</span>
</span>
</el-col>
</div>
<!-- 外层内容 -->
<div class="content-box" id="eqcontentbox">
<div class="left-box">
<div class="master-box" v-if="devData.length > 0" @click="getSubDev(devData[0])">
<div>{{devData[0].device_name}}</div>
<div>{{devData[0].out_ip}}</div>
<div
class="master-box"
v-if="devData.length > 0"
@click="getSubDev(devData[0])"
>
<div>{{ devData[0].device_name }}</div>
<div>{{ devData[0].out_ip }}</div>
</div>
<div class="submast-box">
<div
:class="{ 'submast-item': true, 'top-line': true }"
:class="{ 'submast-item': true, 'top-line': true,'onceline':subDevData.length ==1 }"
v-for="(subitem, index) in subDevData"
:key="index"
ref="subitem"
......@@ -32,14 +46,14 @@
:class="{ 'sub-line': index == curindex && slaveData.length > 0 }"
:style="`background:${curlevalbordercolor}`"
></div>
<div>{{subitem.device_name}}</div>
<div>{{subitem.out_ip}}</div>
<div>{{ subitem.device_name }}</div>
<div>{{ subitem.out_ip }}</div>
</div>
</div>
<!-- 叶子节点 -->
<div
v-if="istop && slaveData.length > 0"
:style="`top:${topheihgt+1}px;left:${loopitem * 14 + 11.01}vw`"
:style="`top:${topheihgt + 1}px;left:${loopitem * 14 + 11.01}vw`"
v-for="(loopitem, loopindex) in Math.ceil(slaveData.length / 6)"
:key="loopindex"
class="leval-box"
......@@ -52,7 +66,8 @@
:class="{
'leval-submast-item': true,
'top-line': istop,
'bottom-line': !istop
'bottom-line': !istop,
offline: item.online == 0
}"
v-for="(item, cindex) in setslaveData(slaveData, loopindex)"
:key="cindex"
......@@ -68,13 +83,13 @@
class="vertical-line"
:style="`background:${curlevalbordercolor}`"
></span>
<div>{{item.device_name}}</div>
<div>{{item.in_ip}}</div>
<div>{{ item.device_name }}</div>
<div>{{ item.in_ip }}</div>
</div>
</div>
<div
v-if="!istop && slaveData.length > 0"
:style="`bottom:${bottomHeight +5}px;left:${loopitem * 14 + 11}vw`"
:style="`bottom:${bottomHeight + 5}px;left:${loopitem * 14 + 11}vw`"
v-for="(loopitem, loopindex) in Math.ceil(slaveData.length / 6)"
:key="loopitem"
class="leval-bottom-box"
......@@ -88,7 +103,8 @@
:class="{
'leval-submast-item': true,
'top-line': istop,
'bottom-line': !istop
'bottom-line': !istop,
offline: item.online == 0
}"
v-for="(item, xindex) in setslaveData(slaveData, loopindex)"
:key="xindex"
......@@ -104,8 +120,8 @@
class="vertical-line"
:style="`background:${curlevalbordercolor}`"
></span>
<div>{{item.device_name}}</div>
<div>{{item.in_ip}}</div>
<div>{{ item.device_name }}</div>
<div>{{ item.in_ip }}</div>
</div>
</div>
</div>
......@@ -126,19 +142,19 @@
</div>
<div class="con-item">
<span class="con-label">设备名称:</span>
<span class="con-text">{{curDevData.device_name}}</span>
<span class="con-text">{{ curDevData.device_name }}</span>
</div>
<div class="con-item">
<span class="con-label">设备ID:</span>
<span class="con-text">{{curDevData.device_id}}</span>
<span class="con-text">{{ curDevData.device_id }}</span>
</div>
<div class="con-item">
<span class="con-label">内网信息:</span>
<span class="con-text">{{curDevData.in_ip}}</span>
<span class="con-text">{{ curDevData.in_ip }}</span>
</div>
<div class="con-item">
<span class="con-label">外网信息:</span>
<span class="con-text">{{curDevData.out_ip}}</span>
<span class="con-text">{{ curDevData.out_ip }}</span>
</div>
</div>
</div>
......@@ -150,19 +166,29 @@
<div class="info-content">
<div class="con-item">
<span class="con-label">系统版本:</span>
<span class="con-text">{{curDevData.system_version?curDevData.system_version:"无"}}</span>
<span class="con-text">{{
curDevData.system_version ? curDevData.system_version : "无"
}}</span>
</div>
<div class="con-item">
<span class="con-label">算法版本:</span>
<span class="con-text">{{curDevData.algorithm_version?curDevData.algorithm_version:"无"}}</span>
<span class="con-text">{{
curDevData.algorithm_version
? curDevData.algorithm_version
: "无"
}}</span>
</div>
<div class="con-item">
<span class="con-label">软件版本:</span>
<span class="con-text">{{curDevData.software_version?curDevData.software_version:"无"}}</span>
<span class="con-text">{{
curDevData.software_version ? curDevData.software_version : "无"
}}</span>
</div>
<div class="con-item">
<span class="con-label">固件版本:</span>
<span class="con-text">{{curDevData.firmware_version?curDevData.firmware_version:"无"}}</span>
<span class="con-text">{{
curDevData.firmware_version ? curDevData.firmware_version : "无"
}}</span>
</div>
</div>
</div>
......@@ -173,16 +199,40 @@
</div>
<div class="info-content">
<div class="con-item">
<span class="con-label">分析设备数:</span>
<span class="con-text">{{ curDevData.picture_total ? parseInt(curDevData.picture_total)+parseInt(curDevData.video_total) : (curDevData.video_total ? parseInt(curDevData.picture_total)+parseInt(curDevData.video_total) : 0)}}</span>
<span class="con-label">分析资源数:</span>
<span class="con-text">{{
curDevData.picture_total
? parseInt(curDevData.picture_total) +
parseInt(curDevData.video_total)
: curDevData.video_total
? parseInt(curDevData.picture_total) +
parseInt(curDevData.video_total)
: 0
}}</span>
</div>
<div class="con-item">
<span class="con-label">已用设备:</span>
<span class="con-text">{{ curDevData.picture_busy ? parseInt(curDevData.picture_busy)+parseInt(curDevData.video_busy) : (curDevData.video_busy ? parseInt(curDevData.picture_busy)+parseInt(curDevData.video_busy) : 0) }}</span>
<span class="con-label">已用资源数:</span>
<span class="con-text">{{
curDevData.picture_busy
? parseInt(curDevData.picture_busy) +
parseInt(curDevData.video_busy)
: curDevData.video_busy
? parseInt(curDevData.picture_busy) +
parseInt(curDevData.video_busy)
: 0
}}</span>
</div>
<div class="con-item">
<span class="con-label">离线资源:</span>
<span class="con-text">{{ curDevData.picture_free ? parseInt(curDevData.picture_free)+parseInt(curDevData.video_free) : (curDevData.video_free ? parseInt(curDevData.picture_free)+parseInt(curDevData.video_free) : 0) }}</span>
<span class="con-label">离线资源数:</span>
<span class="con-text">{{
curDevData.picture_free
? parseInt(curDevData.picture_free) +
parseInt(curDevData.video_free)
: curDevData.video_free
? parseInt(curDevData.picture_free) +
parseInt(curDevData.video_free)
: 0
}}</span>
</div>
</div>
</div>
......@@ -198,6 +248,10 @@ export default {
return {
treeData: [],
subDevData: [],
workers: {
video_free: 0,
video_busy: 0
},
topheihgt: 120,
searchval: "",
styleheight: 0,
......@@ -207,8 +261,8 @@ export default {
curlevalcolor: "#f0f0f0",
curlevalbordercolor: "#f0f0f0",
parentData: {},
slaveData:[],
devData:[],
slaveData: [],
devData: [],
submastcolor: [
"48,210,255",
"86,183,202",
......@@ -228,7 +282,7 @@ export default {
},
bottomHeight: 0,
stylebottom: {},
dev_unid: sessionStorage.getItem("dev_unid")
dev_unid: localStorage.getItem("dev_unid")
};
},
mounted() {
......@@ -237,6 +291,7 @@ export default {
},
created() {
this.dataInit();
this.getDevStatus();
},
methods: {
getleval(ev, index, dev) {
......@@ -244,12 +299,10 @@ export default {
let obj = {
parent_id: dev.device_id
};
this.curDevData = dev;
this.$api.device.getSubdev(this.parentData, obj).then(res => {
this.slaveData = res.list_data;
var eqc = document.getElementById("eqcontentbox").clientHeight;
console.log(ev);
this.curindex = index;
this.topheihgt = this.$refs.subitem[index].offsetTop + 70 + 30;
if (index === 2) {
......@@ -290,7 +343,6 @@ export default {
this.devData = res.list_data;
this.curDevType = "master";
this.curDevData = res.list_data[0];
console.log(this.curDevData);
});
},
getSubDev(dev) {
......@@ -301,8 +353,8 @@ export default {
this.subDevData = res.list_data;
});
},
setslaveData(data, index){
return data.slice(index*6,6*(index+1))
setslaveData(data, index) {
return data.slice(index * 6, 6 * (index + 1));
},
getChild(id) {
this.$api.resource
......@@ -325,6 +377,11 @@ export default {
},
handleNodeClick(data) {
console.log(data);
},
getDevStatus() {
this.$api.device.getDevStatus(this.dev_unid).then(res => {
this.workers = res.works;
});
}
}
};
......@@ -443,7 +500,6 @@ export default {
.submast-item:last-child::after {
height: 0;
}
.leval-box {
position: absolute;
}
......@@ -525,4 +581,24 @@ export default {
font-size: 14px;
color: #000;
}
.offline {
border: 1px solid rgba(65, 60, 60, 0.2) !important;
background: rgba(65, 60, 60, 0.2) !important;
}
.resource-box {
margin-left: 40px;
display: inline-block;
padding-top: 4px;
}
.resource-box .title {
color: #000;
padding-right: 10px;
}
.resource-box .num {
font-size: 18px;
font-weight: 600;
}
.onceline:first-child::after {
height: 4vh!important;
}
</style>
......@@ -139,7 +139,7 @@
},
methods:{
handleClick(tab, event) {
console.log(tab, event);
},
timer(){
setInterval(()=>{
......
......@@ -2,12 +2,16 @@
<div style="padding-left: 28px;">
<el-form ref="form" label-width="86px">
<!-- 恢复出厂设置 -->
<div class="lineBox big">
<i class="el-icon-share"></i>恢复出厂设置
</div>
<div class="lineBox big"><i class="el-icon-share"></i>恢复出厂设置</div>
<div class="radioContent">
<div class="lineBox">
<el-button type="primary" size="small" class="primaryButton" @click="reset">恢复出厂设置</el-button>
<el-button
type="primary"
size="small"
class="primaryButton"
@click="reset"
>恢复出厂设置</el-button
>
</div>
<div class="lineBox">
<span class="tip">恢复出厂设置说明:完全恢复设备参数到出厂设置</span>
......@@ -15,13 +19,14 @@
</div>
<div class="line"></div>
<!-- 数据备份 -->
<div class="lineBox big">
<i class="el-icon-share"></i>数据备份
</div>
<div class="lineBox big"><i class="el-icon-share"></i>数据备份</div>
<div class="radioContent">
<div class="lineBox">
<span class="upTit">参数导入</span><span class="upTit2">选择导入文件</span>
<div class="upInput"><el-input v-model="selectFilename"></el-input></div>
<span class="upTit">参数导入</span
><span class="upTit2">选择导入文件</span>
<div class="upInput">
<el-input v-model="selectFilename"></el-input>
</div>
<span style="display: inline-block;">
<el-upload
class="upload-demo"
......@@ -30,24 +35,47 @@
:multiple="false"
:show-file-list="false"
action="https://jsonplaceholder.typicode.com/posts/"
:auto-upload="false">
<el-button slot="trigger" size="small" type="primary" class="primaryButton upButton">浏览</el-button>
<el-button size="small" type="primary" @click="submitUpload" plain class="plainButton">参数导入</el-button>
:auto-upload="false"
>
<el-button
slot="trigger"
size="small"
type="primary"
class="primaryButton upButton"
>浏览</el-button
>
<el-button
size="small"
type="primary"
@click="submitUpload"
plain
class="plainButton"
>参数导入</el-button
>
</el-upload>
</span>
</div>
<div class="lineBox">
<span class="upTit">参数导出</span><span class="upTit2"><el-button size="small" type="primary" class="primaryButton">参数导出</el-button></span>
<span class="upTit">参数导出</span
><span class="upTit2"
><el-button size="small" type="primary" class="primaryButton"
>参数导出</el-button
></span
>
</div>
</div>
<div class="line"></div>
<div class="lineBox big">
<i class="el-icon-share"></i>重启设置
</div>
<div class="lineBox big"><i class="el-icon-share"></i>重启设置</div>
<div class="radioContent">
<div class="lineBox">
<el-button size="small" type="primary" class="primaryButton" @click="manualRebootClick">手动重启</el-button>
<el-button
size="small"
type="primary"
class="primaryButton"
@click="manualRebootClick"
>手动重启</el-button
>
</div>
<div class="lineBox">
<el-checkbox v-model="openRestart">开启定时重启</el-checkbox>
......@@ -59,7 +87,8 @@
:disabled="!openRestart"
v-model="timeArr[0]"
value-format="HH:mm"
placeholder="选择时间">
placeholder="选择时间"
>
</el-time-select>
</el-form-item>
<el-form-item label="每天:">
......@@ -67,7 +96,8 @@
:disabled="!openRestart"
v-model="timeArr[1]"
value-format="HH:mm"
placeholder="选择时间">
placeholder="选择时间"
>
</el-time-select>
</el-form-item>
<el-form-item label="每天:">
......@@ -75,7 +105,8 @@
:disabled="!openRestart"
v-model="timeArr[2]"
value-format="HH:mm"
placeholder="选择时间">
placeholder="选择时间"
>
</el-time-select>
</el-form-item>
</div>
......@@ -85,7 +116,8 @@
:disabled="!openRestart"
v-model="timeArr[3]"
value-format="HH:mm"
placeholder="选择时间">
placeholder="选择时间"
>
</el-time-select>
</el-form-item>
<el-form-item label="每天:">
......@@ -93,16 +125,23 @@
:disabled="!openRestart"
v-model="timeArr[4]"
value-format="HH:mm"
placeholder="选择时间">
placeholder="选择时间"
>
</el-time-select>
</el-form-item>
<el-form-item label=" ">
<span>自动进行校时(可设置多个时间点,不得超过5个)</span>
</el-form-item>
<el-form-item label=" ">
<el-button type="primary" size="small" class="primaryButton rightButton" :disabled="!openRestart" @click="intervalRebootClick">保存</el-button>
<el-button
type="primary"
size="small"
class="primaryButton rightButton"
:disabled="!openRestart"
@click="intervalRebootClick"
>保存</el-button
>
</el-form-item>
</div>
</el-form>
</div>
......@@ -110,176 +149,189 @@
</div>
</template>
<script>
export default {
data(){
return{
openRestart:false,
selectFilename:'',
timeArr:[],
file:null,
dev_unid:localStorage.getItem('dev_unid'),
device_id:sessionStorage.getItem('device_id'),
}
export default {
data() {
return {
openRestart: false,
selectFilename: "",
timeArr: [],
file: null,
dev_unid: localStorage.getItem("dev_unid"),
device_id: sessionStorage.getItem("device_id")
};
},
components:{},
mounted(){
components: {},
mounted() {
this.getRebootSetting();
},
methods:{
methods: {
getRebootSetting() {
if(this.dev_unid != '' && this.device_id != ''){
this.$api.ops.getRebootSetting({},this.dev_unid,this.device_id).then(res=>{
if(!res.ecode){
if(res.enabled == 1){
if (this.dev_unid != "" && this.device_id != "") {
this.$api.ops
.getRebootSetting({}, this.dev_unid, this.device_id)
.then(res => {
if (!res.ecode) {
if (res.enabled == 1) {
this.openRestart = true;
this.timeArr=res.reboot_time
this.timeArr = res.reboot_time;
}
} else {
this.$message({
type: 'error',
type: "error",
message: res.enote
})
});
}
})
}else{
});
} else {
this.$message({
type: 'info',
message: '未找到设备ID,请重新登录'
type: "info",
message: "未找到设备ID,请重新登录"
});
}
},
submitUpload(){
let importFileExt = this.file.name.substr(this.file.name.lastIndexOf('.'));
if(importFileExt !== ".zip"){
submitUpload() {
let importFileExt = this.file.name.substr(
this.file.name.lastIndexOf(".")
);
if (importFileExt !== ".zip") {
this.$message({
type: 'warning',
type: "warning",
message: '只支持"*.zip"文件'
})
});
return;
}
this.$refs.upload.submit(); // 这里是执行文件上传的函数,其实也就是获取我们要上传的文件
// 最重要的就是这段代码
var importParams = new FormData() // 首先创建FormData对象
importParams.append('file',this.file);
this.$api.ops.importParams(importParams,this.dev_unid,this.device_id).then(res=>{
if(res.ecode != undefined && res.ecode != 200) {
var importParams = new FormData(); // 首先创建FormData对象
importParams.append("file", this.file);
this.$api.ops
.importParams(importParams, this.dev_unid, this.device_id)
.then(res => {
if (res.ecode != undefined && res.ecode != 200) {
this.$message({
type: 'error',
message: '导入失败!' + res.enote
})
type: "error",
message: "导入失败!" + res.enote
});
} else {
this.$message({
type: 'success',
message: '导入成功!'
})
type: "success",
message: "导入成功!"
});
}
})
});
},
fileChange(file,fileList){
this.selectFilename=file.name;
this.file=file;
fileChange(file, fileList) {
this.selectFilename = file.name;
this.file = file;
},
reset(){
this.$confirm('此操作将恢复出厂设置, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
if(this.dev_unid != '' && this.device_id != ''){
this.$api.ops.factoryReset({},this.dev_unid,this.device_id).then(res=>{
if(res.ecode == 200){
this.$message({
type: 'success',
message: '恢复出厂设置成功!'
reset() {
this.$confirm("此操作将恢复出厂设置, 是否继续?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
})
.then(() => {
if (this.dev_unid != "" && this.device_id != "") {
this.$api.ops
.factoryReset({}, this.dev_unid, this.device_id)
.then(res => {
if (res.ecode == 200) {
this.$message({
type: "success",
message: "恢复出厂设置成功!"
});
} else {
this.$message({
type: 'error',
message: '恢复出厂设置失败!' + res.enote
})
type: "error",
message: "恢复出厂设置失败!" + res.enote
});
}
})
}else{
});
} else {
this.$message({
type: 'info',
message: '未找到设备ID,请重新登录'
type: "info",
message: "未找到设备ID,请重新登录"
});
}
}).catch(() => {
})
.catch(() => {
this.$message({
type: 'info',
message: '已取消'
type: "info",
message: "已取消"
});
});
},
exportFileClick(){
if(this.dev_unid != '' && this.device_id != ''){
this.$api.ops.exportParams({},this.dev_unid,this.device_id).then(res=>{
if(res.ecode && res.ecode != 200) {
exportFileClick() {
if (this.dev_unid != "" && this.device_id != "") {
this.$api.ops
.exportParams({}, this.dev_unid, this.device_id)
.then(res => {
if (res.ecode && res.ecode != 200) {
this.$message({
type: 'error',
type: "error",
message: res.enote
})
});
} else {
let exportFileUrl = res.file_path;
window.location.href = exportFileUrl;
}
})
}else{
});
} else {
this.$message({
type: 'info',
message: '未找到设备ID,请重新登录'
type: "info",
message: "未找到设备ID,请重新登录"
});
}
},
manualRebootClick () {
this.$confirm('此操作将重启设备, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
if(this.dev_unid != '' && this.device_id != ''){
this.$api.ops.manualReboot({},this.dev_unid,this.device_id).then(res=>{
if(res.ecode == 200){
this.$message({
type: 'success',
message: '重启成功!'
manualRebootClick() {
this.$confirm("此操作将重启设备, 是否继续?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
})
.then(() => {
if (this.dev_unid != "" && this.device_id != "") {
this.$api.ops
.manualReboot({}, this.dev_unid, this.device_id)
.then(res => {
if (res.ecode == 200) {
this.$message({
type: "success",
message: "重启成功!"
});
} else {
this.$message({
type: 'error',
message: '重启失败!' + res.enote
})
type: "error",
message: "重启失败!" + res.enote
});
}
})
}else{
});
} else {
this.$message({
type: 'info',
message: '未找到设备ID,请重新登录'
type: "info",
message: "未找到设备ID,请重新登录"
});
}
}).catch(() => {
})
.catch(() => {
this.$message({
type: 'info',
message: '已取消'
type: "info",
message: "已取消"
});
});
},
intervalRebootClick(){
intervalRebootClick() {
//数组去空值
let arr=[];
this.timeArr.forEach(item=>{
if(item!=""&&typeof(item)!="undefined"){
arr.push(item)
let arr = [];
this.timeArr.forEach(item => {
if (item != "" && typeof item != "undefined") {
arr.push(item);
}
})
if(new Set(arr).size !== arr.length){
  this.$message({
type: 'error',
message: '定时时间重复,请重新选择'
});
if (new Set(arr).size !== arr.length) {
this.$message({
type: "error",
message: "定时时间重复,请重新选择"
});
return false;
}
......@@ -287,65 +339,65 @@
enabled: 1,
reboot_policy: "day",
reboot_time: this.timeArr
}
this.$api.ops.intervalReboot(autoRebootParams,this.dev_unid,this.device_id).then(res=>{
if(res.ecode == 200){
};
this.$api.ops
.intervalReboot(autoRebootParams, this.dev_unid, this.device_id)
.then(res => {
if (res.ecode == 200) {
this.$message({
type: 'success',
message: '自动重启配置成功!!'
})
type: "success",
message: "自动重启配置成功!!"
});
this.getRebootSetting();
} else {
console.log("自动重启配置失败!");
}
})
});
}
},
}
};
</script>
<style lang="scss" scoped>
.upButton{
.upButton {
margin-right: 10px;
}
.upTit{
}
.upTit {
margin-right: 44px;
}
.upTit2{
}
.upTit2 {
margin-right: 6px;
}
.upInput{
}
.upInput {
display: inline-block;
width: 250px;
margin:0 12px;
}
.tip{
font-size:14px;
color:rgba(0,0,0,0.25);
}
.line{
height:1px;
background:rgba(232,232,232,1);
margin: 0 12px;
}
.tip {
font-size: 14px;
color: rgba(0, 0, 0, 0.25);
}
.line {
height: 1px;
background: rgba(232, 232, 232, 1);
margin-top: 18px;
margin-bottom: 15px;
}
.lineBox{
}
.lineBox {
padding: 12px 0 12px 50px;
}
.radioContent{
}
.radioContent {
margin-left: 38px;
}
.rightButton{
}
.rightButton {
float: right;
margin-right: 20%;
}
.inputBox{
}
.inputBox {
width: 220px;
}
.big i{
}
.big i {
font-size: 18px;
color: #CCCCCC;
margin-right:22px;
}
color: #cccccc;
margin-right: 22px;
}
</style>
......@@ -36,7 +36,7 @@ export default {
},
methods: {
handleClick(tab, event) {
console.log(tab, event);
}
}
};
......
......@@ -27,20 +27,20 @@ export default {
methods: {
videoPlay: function() {
this.urlFlag = false;
console.log(this.playurl)
if (!this.playurl.sip_serv_ip) {
let url = this.playurl.rtsp_url;
let myVideo = document.getElementById("VionVideo");
try {
let isLoadingOcx = typeof myVideo.GetVersion() === "string" ? true : false;
let isLoadingOcx = typeof document.getElementById("VionVideo").GetVersion() === "string" ? true : false;
if (isLoadingOcx) {
let ocxPlayRes = document.getElementById("VionVideo").StartPlay(url, 0);
console.log("视频流:", url);
} else {
this.installOcxInfo();
}
if (ocxPlayRes != 0) {
alert("播放失败!");
}
} else {
this.installOcxInfo();
}
} catch (error) {
console.log(error);
}
......
......@@ -120,7 +120,6 @@ export default {
authordetail
},
created() {
this.getCates();
},
methods: {
submitUpload() {
......
......@@ -33,7 +33,7 @@
export default {
data() {
return {
detailVisible: true,
detailVisible: false,
detailData: {}
};
},
......
......@@ -249,9 +249,15 @@ export default {
});
},
saveEditCode() {
let data = {
"code_unid": this.codeData.code_unid,
"code":this.codeData.code,
"name":this.codeData.name,
"note":this.codeData.note,
"active":this.codeData.active }
this.$api.codes
.editTrafficCode(
this.codeData,
data,
this.curCateUnid,
this.codeData.code_unid
)
......
<template>
<div class="innnerBox">
<div class="title">sip视频设置</div>
<el-form :model="sipSetting" ref="form" :rules="rules" label-width="100px" class="demo-ruleForm" inline-message hide-required-asterisk>
<el-form-item
label="用户名"
prop="sip_username">
<el-form
:model="sipSetting"
ref="form"
:rules="rules"
label-width="100px"
class="demo-ruleForm"
inline-message
hide-required-asterisk
>
<el-form-item label="用户名" prop="sip_username">
<div style="width: 30%;">
<el-input v-model="sipSetting.sip_username" autocomplete="off"></el-input>
<el-input
v-model="sipSetting.sip_username"
autocomplete="off"
></el-input>
</div>
</el-form-item>
<el-form-item label="密码" prop="sip_password">
<div style="width: 30%;">
<el-input type="password" v-model="sipSetting.sip_password" autocomplete="off"></el-input>
<el-input
type="password"
v-model="sipSetting.sip_password"
autocomplete="off"
></el-input>
</div>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="addSip('form')" v-if="!isGetted">提交</el-button>
<el-button type="primary" @click="editSip('form')" v-if="isGetted">编辑</el-button>
<el-button type="primary" @click="delFun()" v-if="isGetted">删除</el-button>
<el-button type="primary" @click="addSip('form')" v-if="!isGetted"
>提交</el-button
>
<el-button type="primary" @click="editSip('form')" v-if="isGetted"
>编辑</el-button
>
<el-button type="primary" @click="delFun()" v-if="isGetted"
>删除</el-button
>
</el-form-item>
</el-form>
</div>
</template>
<script>
export default {
data(){
export default {
data() {
var validateUser = (rule, value, callback) => {
if (value === '') {
callback(new Error('请输入用户名'));
if (value === "") {
callback(new Error("请输入用户名"));
} else {
callback();
}
};
var validatePass = (rule, value, callback) => {
if (value === '') {
callback(new Error('请输入密码'));
if (value === "") {
callback(new Error("请输入密码"));
} else {
callback();
}
};
return{
return {
rules: {
sip_username:[
{ validator: validateUser, trigger: 'change' }
],
sip_password: [
{ validator: validatePass, trigger: 'change' }
],
sip_username: [{ validator: validateUser, trigger: "change" }],
sip_password: [{ validator: validatePass, trigger: "change" }]
},
user_unid:sessionStorage.getItem('user_unid'),
dev_unid:localStorage.getItem('dev_unid'),
isGetted:false,
sipSetting:{
sip_username: '', // string
sip_password: ''
user_unid: sessionStorage.getItem("user_unid"),
dev_unid: localStorage.getItem("dev_unid"),
isGetted: false,
sipSetting: {
sip_username: "", // string
sip_password: ""
},
sip_unid:''
}
sip_unid: ""
};
},
watch:{},
components:{},
mounted(){
watch: {},
components: {},
mounted() {
this.getSipParam();
},
methods:{
methods: {
addSip(formName) {
this.$refs[formName].validate((valid) => {
this.$refs[formName].validate(valid => {
if (valid) {
this.$api.resource.addSip(this.sipSetting,this.dev_unid,this.user_unid).then(res=>{
this.$api.resource
.addSip(this.sipSetting, this.dev_unid, this.user_unid)
.then(res => {
// console.log(res.data);
if(res.ecode == 200) {
if (res.ecode == 200) {
this.isGetted = true;
this.$message({
type: 'success',
type: "success",
message: res.enote
})
});
} else {
this.isGetted = false;
this.$message({
type: 'error',
type: "error",
message: res.enote
})
});
}
})
});
} else {
return false;
}
});
},
editSip(formName){
this.$refs[formName].validate((valid) => {
editSip(formName) {
this.$refs[formName].validate(valid => {
if (valid) {
this.$api.resource.editSip(this.sipSetting,this.dev_unid,this.user_unid,this.sip_unid).then(res=>{
this.$api.resource
.editSip(
this.sipSetting,
this.dev_unid,
this.user_unid,
this.sip_unid
)
.then(res => {
// console.log(res.data);
if(res.ecode == 200) {
if (res.ecode == 200) {
this.$message({
type: 'success',
message: '修改成功!'
})
type: "success",
message: "修改成功!"
});
} else {
this.$message({
type: 'error',
type: "error",
message: res.enote
})
});
}
})
});
} else {
return false;
}
});
},
delFun(){
this.$confirm('此操作将永久删除, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.$api.resource.delSip(this.sipSetting,this.dev_unid,this.user_unid,this.sip_unid).then(res=>{
if(res.ecode == 200) {
this.$message({
type: 'success',
message: '删除成功!'
delFun() {
this.$confirm("此操作将永久删除, 是否继续?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
})
for(let j in this.sipSetting) {
this.sipSetting[j] = '';
.then(() => {
this.$api.resource
.delSip(
this.sipSetting,
this.dev_unid,
this.user_unid,
this.sip_unid
)
.then(res => {
if (res.ecode == 200) {
this.$message({
type: "success",
message: "删除成功!"
});
for (let j in this.sipSetting) {
this.sipSetting[j] = "";
}
this.isGetted = false;
} else {
this.$message({
type: 'error',
type: "error",
message: res.enote
})
});
}
});
})
}).catch(() => {
.catch(() => {
this.$message({
type: 'info',
message: '已取消'
type: "info",
message: "已取消"
});
});
},
getSipParam() {
this.$api.resource.getsip({},this.dev_unid,this.user_unid).then(res=>{
if(res.ecode) {
this.$api.resource.getsip({}, this.dev_unid, this.user_unid).then(res => {
if (res.ecode) {
this.isGetted = false;
} else {
this.isGetted = true;
......@@ -151,20 +183,19 @@
this.sipSetting.sip_password = res.sip_password;
this.sip_unid = res.sip_unid;
}
})
});
}
},
}
};
</script>
<style lang="scss" scoped>
.title{
.title {
height: 30px;
line-height: 30px;
padding-left: 30px;
font-size: 14px;
background: #3bb7ff;
color: #FFFFFF;
color: #ffffff;
margin-bottom: 20px;
}
}
</style>
<template>
<div>
<!-- 添加相机 -->
<el-dialog
title="添加相机"
:visible.sync="cameraAddVisible"
width="450px">
<el-dialog title="添加相机" :visible.sync="cameraAddVisible" width="450px">
<div>
<el-form label-position="left" label-width="120px" :model="addVideoParam" :rules="rules" ref="cameraDialog" inline-message hide-required-asterisk>
<el-form
label-position="left"
label-width="120px"
:model="addVideoParam"
:rules="rules"
ref="cameraDialog"
inline-message
hide-required-asterisk
>
<el-form-item label="组织编号">
<el-input v-model="initParam.orgId" disabled></el-input>
</el-form-item>
......@@ -20,14 +25,26 @@
<el-input v-model="initParam.addr_name" disabled></el-input>
</el-form-item>
<el-form-item label="设备编号" prop="vchan_refid">
<el-input v-model="addVideoParam.vchan_refid" :disabled="type=='edit'"></el-input>
<el-input
v-model="addVideoParam.vchan_refid"
:disabled="type == 'edit'"
></el-input>
</el-form-item>
<el-form-item label="设备名称" prop="name">
<el-input v-model="addVideoParam.name"></el-input>
</el-form-item>
<el-form-item label="方向">
<el-select v-model="addVideoParam.dir_code" placeholder="请选择方向" :popper-append-to-body=false>
<el-option :key="item.code" :label="item.name" :value="item.code" v-for="item in dirCodeList"></el-option>
<el-select
v-model="addVideoParam.dir_code"
placeholder="请选择方向"
:popper-append-to-body="false"
>
<el-option
:key="item.code"
:label="item.name"
:value="item.code"
v-for="item in dirCodeList"
></el-option>
</el-select>
</el-form-item>
<el-form-item label="IP地址">
......@@ -37,7 +54,11 @@
<el-input v-model="addVideoParam.port"></el-input>
</el-form-item>
<el-form-item label="协议">
<el-select v-model="addVideoParam.video_protocol_id" placeholder="请选择协议" :popper-append-to-body=false>
<el-select
v-model="addVideoParam.video_protocol_id"
placeholder="请选择协议"
:popper-append-to-body="false"
>
<el-option label="rtsp" value="rtsp"></el-option>
<el-option label="onvif" value="onvif"></el-option>
</el-select>
......@@ -66,177 +87,172 @@
</el-form>
</div>
<span slot="footer" class="dialog-footer">
<el-button @click="cameraAddVisible=false">取 消</el-button>
<el-button type="primary" @click="save" v-if="type!='detail'">确 定</el-button>
<el-button @click="cameraAddVisible = false">取 消</el-button>
<el-button type="primary" @click="save" v-if="type != 'detail'"
>确 定</el-button
>
</span>
</el-dialog>
</div>
</template>
<script>
export default{
data(){
return{
addVideoParam:{
vchan_refid:'',
name:'',
port:'',
video_source_url:'',
addr_unid:'',
dir_code:'',
ip:'',
video_protocol_id:'',
user_name:'',
password:'',
extend_1:'',
extend_2:'',
is_dome:false,
vchan_type:'camera',
longitude:'',
latitude:''
export default {
data() {
return {
addVideoParam: {
vchan_refid: "",
name: "",
port: "",
video_source_url: "",
addr_unid: "",
dir_code: "",
ip: "",
video_protocol_id: "",
user_name: "",
password: "",
extend_1: "",
extend_2: "",
is_dome: false,
vchan_type: "camera",
longitude: "",
latitude: ""
},
initParam:{
},
cameraAddVisible:false,
dirCodeList:JSON.parse(localStorage.getItem('卡口方向')),
type:'',
devsId:'',
initParam: {},
cameraAddVisible: false,
dirCodeList: [],
type: "",
devsId: "",
rules: {
vchan_refid: [
{ required: true, message: '设备编号不能为空', trigger: 'change' }
],
name:[
{ required: true, message: '设备名称不能为空', trigger: 'change' }
{ required: true, message: "设备编号不能为空", trigger: "change" }
],
port:[
{ required: true, message: '端口不能为空', trigger: 'change' }
name: [
{ required: true, message: "设备名称不能为空", trigger: "change" }
],
video_source_url:[
{ required: true, message: '取流地址不能为空', trigger: 'change' }
port: [{ required: true, message: "端口不能为空", trigger: "change" }],
video_source_url: [
{ required: true, message: "取流地址不能为空", trigger: "change" }
]
}
}
};
},
methods:{
initDialog(node,type,devsId){
this.cameraAddVisible=true;
this.devsId=devsId;
if(type == 'add'){
this.type='add'
this.addVideoParam.addr_unid=node.data.unid;
methods: {
initDialog(node, type, devsId) {
this.cameraAddVisible = true;
this.devsId = devsId;
if (type == "add") {
this.type = "add";
this.addVideoParam.addr_unid = node.data.unid;
this.initParam.addr_name = node.data.org_name;
this.initParam.addr_code = node.data.org_code;
this.initParam.orgName = node.parent.data.org_name;
this.initParam.orgId = node.parent.data.org_code;
}else if(type == 'edit'){
this.type = 'edit';
} else if (type == "edit") {
this.type = "edit";
this.addVideoParam.addr_unid = node.addrNode.unid;
this.initParam.addr_name = node.addrNode.org_name;
this.initParam.addr_code = node.addrNode.org_code;
this.initParam.orgName = node.orgNode.org_name;
this.initParam.orgId = node.orgNode.org_code;
this.addVideoParam.vchan_refid = node.id;
this.addVideoParam.name = node.label;
this.addVideoParam.dir_code=node.dir_code;
this.addVideoParam.ip=node.ip;
this.addVideoParam.port=node.port;
this.addVideoParam.video_protocol_id=node.video_proto;
this.addVideoParam.video_source_url=node.url;
this.addVideoParam.user_name=node.username;
this.addVideoParam.password=node.password;
this.addVideoParam.extend_1=node.extend_1;
this.addVideoParam.extend_2=node.extend_2;
this.addVideoParam.longitude=node.longitude;
this.addVideoParam.latitude=node.latitude;
}else if(type == 'detail'){
this.type = 'detail';
this.addVideoParam.dir_code = node.dir_code;
this.addVideoParam.ip = node.ip;
this.addVideoParam.port = node.port;
this.addVideoParam.video_protocol_id = node.video_proto;
this.addVideoParam.video_source_url = node.url;
this.addVideoParam.user_name = node.username;
this.addVideoParam.password = node.password;
this.addVideoParam.extend_1 = node.extend_1;
this.addVideoParam.extend_2 = node.extend_2;
this.addVideoParam.longitude = node.longitude;
this.addVideoParam.latitude = node.latitude;
} else if (type == "detail") {
this.type = "detail";
this.addVideoParam.addr_unid = node.addrNode.unid;
this.initParam.addr_name = node.addrNode.org_name;
this.initParam.addr_code = node.addrNode.org_code;
this.initParam.orgName = node.orgNode.org_name;
this.initParam.orgId = node.orgNode.org_code;
this.addVideoParam.vchan_refid = node.id;
this.addVideoParam.name = node.label;
this.addVideoParam.dir_code=node.dir_code;
this.addVideoParam.ip=node.ip;
this.addVideoParam.port=node.port;
this.addVideoParam.video_protocol_id=node.video_proto;
this.addVideoParam.video_source_url=node.url;
this.addVideoParam.user_name=node.username;
this.addVideoParam.password=node.password;
this.addVideoParam.extend_1=node.extend_1;
this.addVideoParam.extend_2=node.extend_2;
this.addVideoParam.longitude=node.longitude;
this.addVideoParam.latitude=node.latitude;
this.addVideoParam.dir_code = node.dir_code;
this.addVideoParam.ip = node.ip;
this.addVideoParam.port = node.port;
this.addVideoParam.video_protocol_id = node.video_proto;
this.addVideoParam.video_source_url = node.url;
this.addVideoParam.user_name = node.username;
this.addVideoParam.password = node.password;
this.addVideoParam.extend_1 = node.extend_1;
this.addVideoParam.extend_2 = node.extend_2;
this.addVideoParam.longitude = node.longitude;
this.addVideoParam.latitude = node.latitude;
}
},
save(){
if(this.type == 'add'){
this.$refs['cameraDialog'].validate((valid) => {
save() {
if (this.type == "add") {
this.$refs["cameraDialog"].validate(valid => {
if (valid) {
this.$api.resource.addCamera(this.addVideoParam,localStorage.getItem('dev_unid')).then(res=>{
if(res.ecode==200){
this.$api.resource
.addCamera(this.addVideoParam, localStorage.getItem("dev_unid"))
.then(res => {
if (res.ecode == 200) {
this.$message({
message: res.enote,
type: 'success'
type: "success"
});
let data={
org_type:"address",
unid:this.addVideoParam.addr_unid
}
this.$emit('getAllData',data)
let data = {
org_type: "address",
unid: this.addVideoParam.addr_unid
};
this.$emit("getAllData", data);
// this.$parent.$parent.$parent.submitLaterGet(data)
this.cameraAddVisible=false;
}else{
this.cameraAddVisible = false;
} else {
this.$message.error(res.enote);
}
})
});
} else {
console.log('error submit!!');
console.log("error submit!!");
return false;
}
});
}else if(this.type == 'edit'){
this.addVideoParam.is_dome=false;
this.$refs['cameraDialog'].validate((valid) => {
} else if (this.type == "edit") {
this.addVideoParam.is_dome = false;
this.$refs["cameraDialog"].validate(valid => {
if (valid) {
this.$api.resource.editCamera(this.addVideoParam,this.devsId,this.addVideoParam.vchan_refid).then(res=>{
if(res.ecode==200){
this.$api.resource
.editCamera(
this.addVideoParam,
this.devsId,
this.addVideoParam.vchan_refid
)
.then(res => {
if (res.ecode == 200) {
this.$message({
message: res.enote,
type: 'success'
type: "success"
});
let data={
org_type:"address",
unid:this.addVideoParam.addr_unid
}
this.$emit('getData',data)
this.cameraAddVisible=false;
}else{
let data = {
org_type: "address",
unid: this.addVideoParam.addr_unid
};
this.$emit("getData", data);
this.cameraAddVisible = false;
} else {
this.$message.error(res.enote);
}
})
});
} else {
console.log('error submit!!');
console.log("error submit!!");
return false;
}
});
}
}
}
}
};
</script>
<style>
</style>
<style></style>
......@@ -4,35 +4,64 @@
class="filter-tree"
accordion
:data="treeData"
:props='defaultProps'
:props="defaultProps"
@node-click="handleNodeClick"
:expand-on-click-node="false"
:filter-node-method="filterNode"
ref="tree">
ref="catree"
>
<span class="custom-tree-node" slot-scope="{ node, data }">
<span>
<span class="tree-label" v-if="data.org_name||data.org_name==''">{{ data.org_name=="" ? '未命名' : data.org_name}}</span>
<span class="tree-label" v-else-if="!data.org_name">{{ data.vchan_name=="" ? '未命名' : data.vchan_name}}</span>
<span
class="tree-label"
v-if="data.label || data.label == ''"
>{{ data.label == "" ? "未命名" : data.label }}</span
>
<span class="tree-label" v-else-if="!data.label">{{
data.vchan_name == "" ? "未命名" : data.vchan_name
}}</span>
</span>
<span class="tree-btn" v-if="data.org_name||data.org_name==''">
<i class="el-icon-plus" @click.stop="nodeAddClick(node,data)"></i>
<i class="el-icon-edit" @click.stop="nodeEditClick(node,data)" v-if="data.org_type!='root'"></i>
<i class="el-icon-delete" @click.stop="nodeDelClick(node,data)" v-if="data.org_type!='root'"></i>
<span class="tree-btn" v-if="data.label || data.label == ''">
<i class="el-icon-plus" @click.stop="nodeAddClick(node, data)"></i>
<i
class="el-icon-edit"
@click.stop="nodeEditClick(node, data)"
v-if="data.org_type != 'root'"
></i>
<i
class="el-icon-delete"
@click.stop="nodeDelClick(node, data)"
v-if="data.org_type != 'root'"
></i>
</span>
</span>
</el-tree>
<el-dialog
title="添加"
:visible.sync="addVisible"
width="450px">
<el-dialog title="添加" :visible.sync="addVisible" width="450px">
<div>
<el-form label-position="left" label-width="120px" :model="formData" :rules="rules" ref="addForm" hide-required-asterisk >
<el-form
label-position="left"
label-width="120px"
:model="formData"
:rules="rules"
ref="addForm"
hide-required-asterisk
>
<el-form-item label="添加目标类型">
<el-select v-model="formData.targetType" placeholder="请选择" :popper-append-to-body=false>
<el-option :key="item.value" :label="item.label" :value="item.value" v-for="item in targetOpt"> </el-option>
<el-select
v-model="formData.targetType"
placeholder="请选择"
:popper-append-to-body="false"
>
<el-option
:key="item.value"
:label="item.label"
:value="item.value"
v-for="item in targetOpt"
>
</el-option>
</el-select>
</el-form-item>
<div v-if="formData.targetType=='org'">
<div v-if="formData.targetType == 'org'">
<el-form-item label="组织编号">
<el-input v-model="formData.code"></el-input>
</el-form-item>
......@@ -40,7 +69,7 @@
<el-input v-model="formData.name"></el-input>
</el-form-item>
</div>
<div v-else-if="formData.targetType=='address'">
<div v-else-if="formData.targetType == 'address'">
<el-form-item label="地点编号">
<el-input v-model="formData.code"></el-input>
</el-form-item>
......@@ -51,26 +80,30 @@
</el-form>
</div>
<span slot="footer" class="dialog-footer">
<el-button @click="addVisible=false">取 消</el-button>
<el-button @click="addVisible = false">取 消</el-button>
<el-button type="primary" @click="save">确 定</el-button>
</span>
</el-dialog>
<!-- 编辑dialog -->
<el-dialog
title="修改"
:visible.sync="editVisible"
width="450px">
<el-dialog title="修改" :visible.sync="editVisible" width="450px">
<div>
<el-form label-position="left" label-width="120px" :model="editForm" :rules="rules" hide-required-asterisk ref="editForm" >
<div v-if="editForm.targetType=='org'">
<el-form
label-position="left"
label-width="120px"
:model="editForm"
:rules="rules"
hide-required-asterisk
ref="editForm"
>
<div v-if="editForm.targetType == 'org'">
<el-form-item label="组织编号">
<el-input v-model="editForm.code" disabled></el-input>
</el-form-item>
<el-form-item label="组织名称" prop="name">
<el-input v-model="editForm.name" ></el-input>
<el-input v-model="editForm.name"></el-input>
</el-form-item>
</div>
<div v-else-if="editForm.targetType=='address'">
<div v-else-if="editForm.targetType == 'address'">
<el-form-item label="地点编号">
<el-input v-model="editForm.code" disabled></el-input>
</el-form-item>
......@@ -81,7 +114,7 @@
</el-form>
</div>
<span slot="footer" class="dialog-footer">
<el-button @click="editVisible=false">取 消</el-button>
<el-button @click="editVisible = false">取 消</el-button>
<el-button type="primary" @click="editFinish">确 定</el-button>
</span>
</el-dialog>
......@@ -90,203 +123,233 @@
</template>
<script>
import addCamera from './cameraDialog'
export default{
data(){
return{
formData:{
targetType:'org'
},
editForm:{
targetType:'',
name:'',
code:''
import addCamera from "./cameraDialog";
export default {
data() {
return {
formData: {
targetType: "org"
},
addVideoParam:{
editForm: {
targetType: "",
name: "",
code: ""
},
addVideoParam: {},
treeData: [
{
unid: '0',
org_pid: '0',
org_name: '手动添加相机资源',
org_type: 'root',
childs: []
unid: "0",
org_pid: "0",
label: "手动添加相机资源",
type: "root",
org_type: "root",
children: []
}
],
currentNodeId:'',
defaultProps:{
children: "childs",
currentNodeId: "",
defaultProps: {
children: "children",
disabled: "disabled",
label: "org_name"
label: "label"
},
addVisible:false,
editVisible:false,
targetOpt:[],
addVisible: false,
editVisible: false,
targetOpt: [],
rules: {
name: [
{ required: true, message: '请输入名称', trigger: 'blur' },
{ min: 2, max: 9, message: '长度在 2 到 9 个字符', trigger: 'blur' }
],
{ required: true, message: "请输入名称", trigger: "blur" },
{ min: 2, max: 9, message: "长度在 2 到 9 个字符", trigger: "blur" }
]
},
dev_unid: localStorage.getItem('dev_unid'),
}
dev_unid: localStorage.getItem("dev_unid")
};
},
components:{
components: {
addCamera
},
props:{
filterText:{
type:String,
default:''
},
treeDatas:{
type:Array,
defalut:[]
props: {
filterText: {
type: String,
default: ""
},
treeDatas: {
type: Array,
defalut: []
}
},
watch:{
watch: {
filterText(val) {
this.$refs.tree.filter(val);
this.$refs.catree.filter(val);
},
treeDatas(val){
this.treeData[0].childs=val;
treeDatas(val) {
this.treeData[0].children = val;
}
},
methods:{
addCamareAfterGet(data){
this.$emit('getData',data)
methods: {
addCamareAfterGet(data) {
this.$emit("getData", data);
},
handleNodeClick(data){
this.$emit('clickHandle',data,'camera');
handleNodeClick(data) {
this.$emit("clickHandle", data, "camera");
},
nodeDelClick(node,data){
this.$confirm('此操作将永久删除该选项, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
let cate_unid = this.getCustomCate('组织', 'residence');
this.$api.resource.getCode({
limit:9999
},cate_unid).then(res=>{
let editObj=[];
editObj=res.list_data.filter(item => item.code==data.org_code);
this.$api.resource.delCode({},cate_unid,editObj[0].unid).then(res=>{
nodeDelClick(node, data) {
this.$confirm("此操作将永久删除该选项, 是否继续?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
})
this.$api.resource.delOrg({},data.unid).then(res=>{
if(!res.enote){
.then(() => {
let cate_unid = this.getCustomCate("组织", "residence");
this.$api.resource
.getCode(
{
limit: 9999
},
cate_unid
)
.then(res => {
let editObj = [];
editObj = res.list_data.filter(
item => item.code == data.org_code
);
this.$api.resource
.delCode({}, cate_unid, editObj[0].unid)
.then(res => {});
this.$api.resource.delOrg({}, data.unid).then(res => {
if (!res.enote) {
this.$message({
type: 'success',
message: '删除成功!'
type: "success",
message: "删除成功!"
});
this.$emit('getTree');
this.$emit("getTree");
}
});
});
})
})
}).catch(() => {
.catch(() => {
this.$message({
type: 'info',
message: '已取消删除'
type: "info",
message: "已取消删除"
});
});
},
nodeEditClick(node,data){
this.editForm.targetType=data.org_type;
this.editForm.code=data.org_code;
this.editForm.name=data.org_name;
this.editVisible=true;
nodeEditClick(node, data) {
this.editForm.targetType = data.org_type;
this.editForm.code = data.org_code;
this.editForm.name = data.org_name;
this.editVisible = true;
},
editFinish(){
this.$refs['editForm'].validate((valid) => {
editFinish() {
this.$refs["editForm"].validate(valid => {
if (valid) {
let cate_unid = this.getCustomCate('组织', 'residence');
this.$api.resource.getCode({
limit:9999
},cate_unid).then(res=>{
let editObj=[];
editObj=res.list_data.filter(item => item.code==this.editForm.code);
this.$api.resource.editCamera({
name:this.editForm.name,
code:this.editForm.code
},cate_unid,editObj[0].unid).then(data=>{
if(res.ecode) {
let cate_unid = this.getCustomCate("组织", "residence");
this.$api.resource
.getCode(
{
limit: 9999
},
cate_unid
)
.then(res => {
let editObj = [];
editObj = res.list_data.filter(
item => item.code == this.editForm.code
);
this.$api.resource
.editCamera(
{
name: this.editForm.name,
code: this.editForm.code
},
cate_unid,
editObj[0].unid
)
.then(data => {
if (res.ecode) {
this.$message({
type: 'error',
type: "error",
message: res.enote
})
});
} else {
this.editVisible=false;
this.$emit('getTree')
this.editVisible = false;
this.$emit("getTree");
}
})
})
});
});
} else {
return false;
}
});
},
nodeAddClick(node,data){
if(data.org_type == 'address'){
nodeAddClick(node, data) {
if (data.org_type == "address") {
//添加视频
this.$refs.addCamera.initDialog(node,'add',this.dev_unid)
}else{
this.$refs.addCamera.initDialog(node, "add", this.dev_unid);
} else {
//添加组织关系
this.currentNodeId=data.unid;
this.formData={
targetType:'org',
name:'',
code:''
this.currentNodeId = data.unid;
this.formData = {
targetType: "org",
name: "",
code: ""
};
if (data.org_type === "root") {
this.targetOpt = [
{
label: "组织",
value: "org"
}
];
} else if (data.org_type === "org") {
this.targetOpt = [
{
label: "组织",
value: "org"
},
{
label: "地点",
value: "address"
}
if(data.org_type === "root") {
this.targetOpt = [{
label: '组织',
value: 'org'
}];
} else if(data.org_type === "org") {
this.targetOpt = [{
label: '组织',
value: 'org'
},{
label: '地点',
value: 'address'
}];
];
} else {
this.targetOpt = [{
label: '地点',
value: 'address'
}];
this.targetOpt = [
{
label: "地点",
value: "address"
}
this.addVisible=true;
];
}
this.addVisible = true;
}
},
getCustomCate(name, cate) {
let localKey = name + '-' + cate;
let localKey = name + "-" + cate;
return window.localStorage.getItem(localKey);
},
save(){
this.$refs['addForm'].validate((valid) => {
save() {
this.$refs["addForm"].validate(valid => {
if (valid) {
let cate_unid = this.getCustomCate('组织', 'residence');
let cate_unid = this.getCustomCate("组织", "residence");
// console.log('添加节点分类unid:', cate_unid);
if(cate_unid) {
this.$api.resource.addCode({
if (cate_unid) {
this.$api.resource
.addCode(
{
code: this.formData.code,
name: this.formData.name
},cate_unid).then(res=>{
if(res.ecode) {
},
cate_unid
)
.then(res => {
if (res.ecode) {
this.$message({
type: 'error',
type: "error",
message: res.enote
})
});
} else {
this.orgServ(); // org service
}
})
});
}
} else {
return false;
......@@ -294,35 +357,35 @@
});
},
orgServ() {
this.$api.resource.addNode({
this.$api.resource
.addNode({
org_pid: this.currentNodeId,
org_type: this.formData.targetType,
org_code: this.formData.code,
is_leaf: false
}).then(res=>{
if(res.ecode) {
})
.then(res => {
if (res.ecode) {
this.$message({
type: 'error',
type: "error",
message: res.enote
})
});
} else {
this.$message({
type: 'success',
message: '添加成功!'
})
type: "success",
message: "添加成功!"
});
this.addVisible = false;
this.$emit('getTree')
this.$emit("getTree");
}
})
});
},
filterNode(value, data) {
if (!value) return true;
return data.org_name.indexOf(value) !== -1;
},
return data.label.indexOf(value) !== -1;
}
}
};
</script>
<style>
</style>
<style></style>
<template>
<div>
<!-- 添加相机 -->
<el-dialog title="设备详情" :visible.sync="cameraAddVisible" width="450px">
<div>
<el-form
label-position="left"
label-width="120px"
:model="addVideoParam"
ref="cameraDialog"
inline-message
hide-required-asterisk
>
<el-form-item label="设备编号">
<el-input v-model="initParam.id" disabled></el-input>
</el-form-item>
<el-form-item label="设备名称">
<el-input v-model="initParam.label" disabled></el-input>
</el-form-item>
<el-form-item label="地点编号">
<el-input v-model="initParam.addr_unid" disabled></el-input>
</el-form-item>
<el-form-item label="地点名称">
<el-input v-model="initParam.addr_name" disabled></el-input>
</el-form-item>
<el-form-item label="IP地址">
<el-input v-model="addVideoParam.ip"></el-input>
</el-form-item>
<el-form-item label="端口" prop="port">
<el-input v-model="addVideoParam.port"></el-input>
</el-form-item>
<el-form-item label="协议">
<el-select
v-model="addVideoParam.video_protocol_id"
placeholder="请选择协议"
:popper-append-to-body="false"
>
<el-option label="rtsp" value="rtsp"></el-option>
<el-option label="onvif" value="onvif"></el-option>
</el-select>
</el-form-item>
<el-form-item label="取流地址" prop="video_source_url">
<el-input v-model="addVideoParam.video_source_url"></el-input>
</el-form-item>
<el-form-item label="用户名">
<el-input v-model="addVideoParam.user_name"></el-input>
</el-form-item>
<el-form-item label="密码">
<el-input v-model="addVideoParam.password"></el-input>
</el-form-item>
<el-form-item label="经度">
<el-input v-model="addVideoParam.longitude"></el-input>
</el-form-item>
<el-form-item label="纬度">
<el-input v-model="addVideoParam.latitude"></el-input>
</el-form-item>
<el-form-item label="扩展字段1">
<el-input v-model="addVideoParam.extend_1"></el-input>
</el-form-item>
<el-form-item label="扩展字段2">
<el-input v-model="addVideoParam.extend_2"></el-input>
</el-form-item>
</el-form>
</div>
<span slot="footer" class="dialog-footer">
<el-button @click="cameraAddVisible = false">取 消</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
export default {
data() {
return {
addVideoParam:{},
initParam: {},
cameraAddVisible: false,
type: "",
devsId: ""
};
},
methods: {
initDialog(node, type, devsId) {
this.cameraAddVisible = true;
this.initParam = node;
}
}
};
</script>
<style></style>
<template>
<div class="sync-tree scrollbar">
<el-tree
ref="synctree"
v-if="isLoadingTree"
:accordion="true"
:filter-node-method="filterNode"
:data="syncTreeData"
class="resource-wrap"
node-key="id"
:expand-on-click-node="false"
@node-click="handleNodeClick"
></el-tree>
</div>
</template>
<script>
// import TreeRender from "../treeRender";
export default {
data() {
return {
isLoadingTree: false,
syncTreeData: [
{
id: "0",
unid: "0",
label: "平台同步资源",
root: "平台同步资源",
children: []
}
],
defaultProps: {
children: "children",
label: "label"
}
};
},
props: {
filterText: {
type: String,
default: ""
},
treeDatas: {
type: Array,
defalut: []
}
},
components: {},
watch: {
filterText(val) {
this.$refs.synctree.filter(val);
},
treeDatas(val) {
this.treeData[0].childs = val;
}
},
methods: {
initTree(data) {
this.syncTreeData[0].children = data;
this.isLoadingTree = true;
},
filterNode(value, data) {
// console.log('filterNode:', data)
if (!value) return true;
return data.label.indexOf(value) !== -1;
},
handleNodeClick(data){
if(data.label === "平台同步资源") return;
this.$emit('syncTable', data)
},
handleRefresh(s, d, n) {
// console.log(s, d, n)
console.log("调用父级方法: ", this);
this.syncTreeData = [
{
id: "1",
label: "平台同步资源",
root: "平台同步资源",
children: []
}
];
this.$parent.getSyncTree();
}
}
};
</script>
<style scoped>
.sync-tree {
/* max-height: 216px; */
/* overflow: hidden; */
}
</style>
......@@ -4,42 +4,48 @@
class="filter-tree"
accordion
:data="treeData"
:props='defaultProps'
:props="defaultProps"
@node-click="handleNodeClick"
:expand-on-click-node="false"
:filter-node-method="filterNode"
ref="tree">
ref="tree"
>
<span class="custom-tree-node" slot-scope="{ node, data }">
<span>
<span class="tree-label">{{ data.vchan_name=="" ? '未命名' : data.vchan_name}}</span>
<span class="tree-label">{{
data.vchan_name == "" ? "未命名" : data.vchan_name
}}</span>
</span>
<span class="tree-btn" v-if="data.org_type">
<i class="el-icon-plus" @click.stop="nodeAddClick(node,data)"></i>
<i class="el-icon-plus" @click.stop="nodeAddClick(node, data)"></i>
</span>
</span>
</el-tree>
<el-dialog
title="添加"
:visible.sync="addVisible"
width="450px">
<el-dialog title="添加" :visible.sync="addVisible" width="450px">
<div>
<el-form label-position="left" label-width="120px">
<el-form-item label="添加录像">
<el-upload
ref="upload"
action="uploadUrl"
:http-request="httpRequest"
:action="uploadUrl"
:before-upload="beforeup"
multiple
:data="updata"
name="file"
:auto-upload="false">
<el-button slot="trigger" size="small" type="primary">选取文件</el-button>
:auto-upload="false"
:on-success="upsuccess"
:on-error="uperror"
>
<el-button slot="trigger" size="small" type="primary"
>选取文件</el-button
>
<!-- <div slot="tip" class="el-upload__tip">只能上传视频文件</div> -->
</el-upload>
</el-form-item>
</el-form>
</div>
<span slot="footer" class="dialog-footer">
<el-button @click="addVisible=false">取 消</el-button>
<el-button @click="addVisible = false">取 消</el-button>
<el-button type="primary" @click="save">上 传</el-button>
</span>
</el-dialog>
......@@ -47,108 +53,104 @@
</template>
<script>
import baseUrl from '../../../api/baseUrl'
export default{
data(){
return{
uploadUrl: '',
file:[],
import baseUrl from "../../../api/baseUrl";
export default {
data() {
return {
uploadUrl: `${baseUrl}/api/v1/devconf_fx/devs/${this.devsId}/vfile_vchans`,
file: [],
updata: {},
treeData: [
{
unid: '0',
org_pid: '0',
vchan_name: '手动添加录像资源',
org_type: 'video',
unid: "0",
org_pid: "0",
vchan_name: "手动添加录像资源",
org_type: "video",
childs: []
}
],
defaultProps:{
defaultProps: {
children: "childs",
disabled: "disabled",
label: "vchan_name"
},
addVisible:false,
}
},
components:{
addVisible: false
};
},
props:{
filterText:{
type:String,
default:''
components: {},
props: {
filterText: {
type: String,
default: ""
},
treeDatas:{
type:Array,
defalut:[]
treeDatas: {
type: Array,
defalut: []
},
devsId:{
type:String,
default:''
devsId: {
type: String,
default: ""
}
},
watch:{
watch: {
filterText(val) {
setTimeout(() => {
this.$refs.tree.filter(val);
}, 100);
},
treeDatas(val){
this.treeData[0].childs=val;
treeDatas(val) {
this.treeData[0].childs = val;
},
devsId(val){
this.devsId=val;
devsId(val) {
this.devsId = val;
}
},
methods:{
methods: {
// 自定义的上传函数
httpRequest(param) {
this.file=[];
this.file = [];
// 一般情况下是在这里创建FormData对象,但我们需要上传多个文件,为避免发送多次请求,因此在这里只进行文件的获取,param可以拿到文件上传的所有信息
this.file.push(param.file)
},
handleNodeClick(data){
this.$emit('clickHandle',data,'video');
// this.$parent.$parent.getVideoTable(data,'video')
this.file.push(param.file);
},
nodeAddClick(node,data){
this.addVisible=true;
beforeup(file) {
this.updata.name = file.name;
this.updata.vchan_type = "vfile";
this.updata.vchan_refid = new Date().getTime();
},
save(){
this.$refs.upload.submit(); // 这里是执行文件上传的函数,其实也就是获取我们要上传的文件
// 最重要的就是这段代码
var upData = new FormData() // 首先创建FormData对象
this.file.forEach(function (file) {
upData.append('file', file); // 因为要上传多个文件,所以需要遍历一下才行
upData.append('name', file.name);
upData.append('vchan_type', 'vfile');
upData.append('vchan_refid', new Date().getTime());
})
const loading = this.$loading({
lock: true,
text: 'Loading',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
upsuccess(req) {
if (req.ecode == 200) {
this.$message({
message: "添加成功",
type: "success"
});
this.$api.resource.uploadFile(upData,this.devsId).then(res=>{
if(res.enote==400){
this.$message.error(res.ecode);
}else{
this.$emit('getTree');
this.$parent.$parent.$parent.getVideoTree();
} else {
this.$message({
message: '添加成功',
type: 'success'
message: req.enote,
type: "error"
});
this.addVisible=false;
loading.close();
}
})
},
uperror(req) {
console.log("error", req);
},
handleNodeClick(data) {
debugger
this.$emit("clickHandle", data, "video");
// this.$parent.$parent.getVideoTable(data,'video')
},
nodeAddClick(node, data) {
this.addVisible = true;
},
save() {
this.$refs.upload.submit(); // 这里是执行文件上传的函数,其实也就是获取我们要上传的文件
},
filterNode(value, data) {
if (!value) return true;
return data.org_name.indexOf(value) !== -1;
},
return data.vchan_name.indexOf(value) !== -1;
}
}
};
</script>
<style>
</style>
<style></style>
......@@ -2,59 +2,172 @@
<div class="innnerBox">
<el-row :gutter="12">
<el-col :span="6" class="treeBox minHeight">
<el-input class="search-input" prefix-icon="el-icon-search" placeholder="请输入内容" v-model="searchText">
<el-input
class="search-input"
prefix-icon="el-icon-search"
placeholder="请输入内容"
v-model="searchText"
>
</el-input>
<cameraTree :filterText="searchText" :treeDatas="cameraTree" @clickHandle="getTable" @getTree="getCameraTree" @getData="submitLaterGet"></cameraTree>
<videoTree :filterText="searchText" :treeDatas="videoTree" :devsId="dev_unid" @clickHandle="getTable" @getTree="getVideoTree"></videoTree>
<SyncTree ref="syncRef" :treeDatas="syncTree" @syncTable="syncTable">
</SyncTree>
<cameraTree
:filterText="searchText"
:treeDatas="cameraTreeData"
@clickHandle="getTable"
@getTree="getCameraTree"
@getData="submitLaterGet"
></cameraTree>
<videoTree
:filterText="searchText"
:treeDatas="videoTree"
:devsId="dev_unid"
@clickHandle="getTable"
@getTree="getVideoTree"
></videoTree>
</el-col>
<el-col :span="18" >
<el-table :data="formattterData" stripe border v-if="tableType=='camera'" :height="tableHeight">
<el-col :span="18">
<el-table
:data="formattterData"
stripe
border
v-if="tableType == 'camera'"
:height="tableHeight"
>
<el-table-column prop="label" align="center" label="名称">
</el-table-column>
<el-table-column prop="url" align="center" label="取流地址">
</el-table-column>
<el-table-column align="center" label="操作">
<template slot-scope="scope">
<el-tooltip content="修改" placement="bottom" effect="light" :visible-arrow=false>
<span class="icon-fanxing-xiugai editIcon" @click="editFun(scope.$index, scope.row)"></span>
<el-tooltip
content="修改"
placement="bottom"
effect="light"
:visible-arrow="false"
>
<span
class="icon-fanxing-xiugai editIcon"
@click="editFun(scope.$index, scope.row)"
></span>
</el-tooltip>
<span class="tableSpanBorder"></span>
<el-tooltip content="删除" placement="bottom" effect="light" :visible-arrow=false>
<span class="el-icon-delete delIcon" @click="delFun(scope.$index, scope.row)"></span>
<el-tooltip
content="删除"
placement="bottom"
effect="light"
:visible-arrow="false"
>
<span
class="el-icon-delete delIcon"
@click="delFun(scope.$index, scope.row)"
></span>
</el-tooltip>
<span class="tableSpanBorder"></span>
<el-tooltip content="详情" placement="bottom" effect="light" :visible-arrow=false >
<span class="el-icon-info editIcon" @click="detailFun(scope.$index, scope.row)"></span>
<el-tooltip
content="详情"
placement="bottom"
effect="light"
:visible-arrow="false"
>
<span
class="el-icon-info editIcon"
@click="detailFun(scope.$index, scope.row)"
></span>
</el-tooltip>
</template>
</el-table-column>
</el-table>
<el-table :data="formattterData" stripe border v-else-if="tableType=='video'" :height="tableHeight">
<el-table
:data="formattterData"
stripe
border
v-else-if="tableType == 'video'"
:height="tableHeight"
>
<el-table-column prop="vchan_name" align="center" label="名称">
</el-table-column>
<el-table-column prop="video_url" align="center" label="取流地址">
</el-table-column>
<el-table-column align="center" label="操作">
<template slot-scope="scope">
<el-tooltip content="修改" placement="bottom" effect="light" :visible-arrow=false>
<span class="icon-fanxing-xiugai editIcon" @click="editVideo(scope.$index, scope.row)"></span>
<el-tooltip
content="修改"
placement="bottom"
effect="light"
:visible-arrow="false"
>
<span
class="icon-fanxing-xiugai editIcon"
@click="editVideo(scope.$index, scope.row)"
></span>
</el-tooltip>
<span class="tableSpanBorder"></span>
<el-tooltip content="删除" placement="bottom" effect="light" :visible-arrow=false>
<span class="el-icon-delete delIcon" @click="delVideo(scope.$index, scope.row)"></span>
<el-tooltip
content="删除"
placement="bottom"
effect="light"
:visible-arrow="false"
>
<span
class="el-icon-delete delIcon"
@click="delVideo(scope.$index, scope.row)"
></span>
</el-tooltip>
</template>
</el-table-column>
</el-table>
<el-table
:data="formattterData"
stripe
border
v-if="tableType == 'sync'"
:height="tableHeight"
>
<el-table-column prop="label" align="center" label="名称">
</el-table-column>
<el-table-column prop="url" align="center" label="取流地址">
</el-table-column>
<el-table-column prop="video_url" align="center" label="操作">
<template slot-scope="scope">
<el-tooltip
content="详情"
placement="bottom"
effect="light"
:visible-arrow="false"
>
<span
class="el-icon-info editIcon"
@click="syncdetail(scope.$index, scope.row)"
></span>
</el-tooltip>
<span class="tableSpanBorder"></span>
</template>
</el-table-column>
</el-table>
</el-col>
<cameraDialog ref="editCamera" @getData="submitLaterGet"></cameraDialog>
<syncDialog ref="syncdetail"></syncDialog>
<el-dialog
title="修改视频"
:visible.sync="videoEditVisible"
width="450px">
width="450px"
>
<div>
<el-form label-position="left" label-width="120px" :model="videoEditParam" ref="videoDialog" inline-message hide-required-asterisk>
<el-form-item label="名称" :rules="[ { required: true, message: '请输入名称', trigger: 'change' }]">
<el-form
label-position="left"
label-width="120px"
:model="videoEditParam"
ref="videoDialog"
inline-message
hide-required-asterisk
>
<el-form-item
label="名称"
:rules="[
{ required: true, message: '请输入名称', trigger: 'change' }
]"
>
<el-input v-model="videoEditParam.vchan_name"></el-input>
</el-form-item>
<el-form-item label="取流地址">
......@@ -69,7 +182,7 @@
</el-form>
</div>
<span slot="footer" class="dialog-footer">
<el-button @click="videoEditVisible=false">取 消</el-button>
<el-button @click="videoEditVisible = false">取 消</el-button>
<el-button type="primary" @click="editSave">确 定</el-button>
</span>
</el-dialog>
......@@ -77,285 +190,408 @@
</div>
</template>
<script>
import cameraTree from './treeComponents/cameraTree'
import videoTree from './treeComponents/videoTree'
import cameraDialog from './treeComponents/cameraDialog'
export default {
import SyncTree from "./treeComponents/syncTree";
import cameraTree from "./treeComponents/cameraTree";
import videoTree from "./treeComponents/videoTree";
import cameraDialog from "./treeComponents/cameraDialog";
import syncDialog from "./treeComponents/syncDialog";
export default {
data() {
return {
searchText: '',
searchText: "",
detailObj: {},
detailImg: '',
detailImg: "",
detailVisible: false,
tableType:'camera',
tableType: "camera",
tableData: [],
formattterData: [],
selectcheck: [],
currentIndex: 0,
eventList: JSON.parse(window.localStorage.getItem('安防事件')),
playurl: '',
dev_unid: localStorage.getItem('dev_unid'),
cameraArr:[],
cameraTree:[],
videoTree:[],
videoEditParam:{
vchan_name:'',
video_url:'',
longitude:'',
latitude:''
// eventList: JSON.parse(window.localStorage.getItem("安防事件")),
playurl: "",
dev_unid: localStorage.getItem("dev_unid"),
cameraArr: [],
cameraTreeData: [],
syncTree: [],
videoTree: [],
videoEditParam: {
vchan_name: "",
video_url: "",
longitude: "",
latitude: ""
},
videoEditVisible:false,
vchan_duid:'',
tableHeight:window.videoEquitTableHeight
}
},
watch: {
videoEditVisible: false,
vchan_duid: "",
tableHeight: window.videoEquitTableHeight
};
},
watch: {},
components: {
cameraTree,cameraDialog,videoTree
cameraTree,
cameraDialog,
videoTree,
SyncTree,
syncDialog
},
mounted() {
console.log('aa',this.tableHeight)
console.log("aa", this.tableHeight);
this.getCameraTree();
this.getVideoTree();
this.getSyncTree();
},
methods: {
getCameraTree(){
this.tableType='camera'
this.$api.resource.treeList({
syncdetail(index, data) {
this.$refs.syncdetail.initDialog(data);
console.log(data);
},
getCameraTree() {
this.tableType = "camera";
this.$api.resource
.treeList(
{
vchan_type: "camera"
},this.dev_unid).then(res=>{
this.cameraTree=res.vchan_struct;
this.cameraArr=[];
this.cameraBuildTree(res.vchan_struct)
})
},
getVideoTree(){
this.tableType='video'
this.$api.resource.getVideoList({
this.dev_unid
)
.then(res => {
this.cameraArr = [];
if (res.vchan_struct.length) {
this.cameraTreeData = this.cameraBuildTree(res.vchan_struct);
}
});
},
getVideoTree() {
this.tableType = "video";
this.$api.resource
.getVideoList(
{
vchan_type: "vfile"
},this.dev_unid).then(res=>{
this.videoTree=res.list_data;
this.getTable(this.videoTree,'video')
},
this.dev_unid
)
.then(res => {
this.videoTree = res.list_data;
// this.getTable(this.videoTree, "video");
});
},
getSyncTree() {
this.tableType = "sync";
this.$api.resource
.treeList(
{
vchan_type: "extern"
},
this.dev_unid
)
.then(m => {
if (m.vchan_struct.length > 0) {
var sync_data = this.syncBuildTree(m.vchan_struct);
console.log(sync_data);
this.$refs.syncRef.initTree(sync_data);
} else {
let emptyChild = [];
this.$refs.syncRef.initTree(emptyChild);
}
})
.catch(err => {
console.log(err.message);
let emptyData = [];
// this.$message({
// type: 'error',
// message: '获取同步平台资源失败!' + err.message
// })
});
},
submitLaterGet(data){
this.tableType='camera'
this.$api.resource.treeList({
submitLaterGet(data) {
this.tableType = "camera";
this.$api.resource
.treeList(
{
vchan_type: "camera"
},this.dev_unid).then(res=>{
this.cameraTree=res.vchan_struct;
this.cameraArr=[];
},
this.dev_unid
)
.then(res => {
this.cameraTree = res.vchan_struct;
this.cameraArr = [];
this.cameraBuildTree(res.vchan_struct);
this.getTable(data,'camera')
})
this.getTable(data, "camera");
});
},
syncBuildTree(data) {
let newData = [];
for (var i = 0; i < data.length; i++) {
let obj = {};
obj["id"] = data[i].refid;
obj["label"] = data[i].name === "" ? "未命名" : data[i].name;
obj["typea"] = data[i].typea;
obj["url"] = data[i].url;
obj["root"] = "平台同步资源";
if (data[i].childs) {
obj["children"] = this.syncBuildChild(data[i].childs);
} else {
obj["children"] = [];
}
newData.push(obj);
}
return newData;
},
syncBuildChild(data) {
var childData = [];
for (var i = 0; i < data.length; i++) {
let obj = {};
obj["id"] = data[i].refid;
obj["label"] = data[i].name === "" ? "未命名" : data[i].name;
obj["typea"] = data[i].typea;
obj["url"] = data[i].url;
obj["root"] = "平台同步资源";
if (data[i].childs) {
obj["children"] = this.syncBuildTree(data[i].childs);
childData.push(obj);
} else {
obj["children"] = [];
childData.push(obj);
}
}
return childData;
},
//处理树状图数据
cameraBuildTree(data, orgObject, addrObject) { // 获取相机资源
cameraBuildTree(data, orgObject, addrObject) {
// 获取相机资源
let newData = [];
for (var i = 0; i < data.length; i++) {
let obj = {};
if(data[i].org_type === 'org' || data[i].org_type === 'address') {
obj['id'] = data[i].org_code;
obj['unid'] = data[i].unid;
obj['label'] = data[i].org_name === '' ? '未命名' : data[i].org_name;
obj['url'] = '暂无';
obj['root'] = '手动添加相机资源';
obj['pid'] = data[i].org_pid;
obj['type'] = data[i].org_type;
if(data[i].childs) {
if(data[i].org_type === 'org') {
obj['children'] = this.cameraBuildTree(data[i].childs, data[i], addrObject);
if (data[i].org_type === "org" || data[i].org_type === "address") {
obj["id"] = data[i].org_code;
obj["unid"] = data[i].unid;
obj["label"] = data[i].org_name === "" ? "未命名" : data[i].org_name;
obj["url"] = "暂无";
obj["root"] = "手动添加相机资源";
obj["pid"] = data[i].org_pid;
obj["type"] = data[i].org_type;
obj["org_type"] = data[i].org_type;
obj["org_name"] = data[i].org_name;
obj["org_code"] = data[i].org_code;
if (data[i].childs) {
if (data[i].org_type === "org") {
obj["children"] = this.cameraBuildTree(
data[i].childs,
data[i],
addrObject
);
} else {
obj['children'] = this.cameraBuildTree(data[i].childs, orgObject, data[i]);
obj["children"] = this.cameraBuildTree(
data[i].childs,
orgObject,
data[i]
);
}
} else {
obj['children'] = [];
obj["children"] = [];
}
} else if(data[i].vchan_type === 'camera') {
obj['id'] = data[i].vchan_refid;
obj['label'] = data[i].vchan_name === '' ? '未命名' : data[i].vchan_name;
obj['type'] = data[i].vchan_type;
obj['root'] = '手动添加相机资源';
obj['orgNode'] = orgObject;
obj['addrNode'] = addrObject;
obj['dir_code'] = data[i].dir_code;
obj['dir_name'] = data[i].dir_name;
obj['ip'] = data[i].ip;
obj['port'] = data[i].port;
obj['video_proto'] = data[i].video_proto;
obj['url'] = data[i].video_url; // 取流地址
obj['username'] = data[i].username;
obj['password'] = data[i].password;
obj['extend_1'] = data[i].extend_1;
obj['extend_2'] = data[i].extend_2;
this.cameraArr.push(obj)
} else if (data[i].vchan_type === "camera") {
obj["id"] = data[i].vchan_refid;
obj["label"] =
data[i].vchan_name === "" ? "未命名" : data[i].vchan_name;
obj["type"] = data[i].vchan_type;
obj["root"] = "手动添加相机资源";
obj["orgNode"] = orgObject;
obj["addrNode"] = addrObject;
obj["dir_code"] = data[i].dir_code;
obj["dir_name"] = data[i].dir_name;
obj["ip"] = data[i].ip;
obj["port"] = data[i].port;
obj["video_proto"] = data[i].video_proto;
obj["url"] = data[i].video_url; // 取流地址
obj["username"] = data[i].username;
obj["password"] = data[i].password;
obj["extend_1"] = data[i].extend_1;
obj["extend_2"] = data[i].extend_2;
this.cameraArr.push(obj);
}
newData.push(obj);
}
return newData;
},
editFun(index,row){
this.$refs.editCamera.initDialog(row,'edit',this.dev_unid)
editFun(index, row) {
this.$refs.editCamera.initDialog(row, "edit", this.dev_unid);
},
delFun(index,row){
this.$confirm('此操作将永久删除该选项, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.$api.resource.delCamera({},this.dev_unid,row.id).then(res=>{
if(res.ecode==200){
delFun(index, row) {
this.$confirm("此操作将永久删除该选项, 是否继续?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
})
.then(() => {
this.$api.resource.delCamera({}, this.dev_unid, row.id).then(res => {
if (res.ecode == 200) {
this.$message({
type: 'success',
message: '删除成功!'
type: "success",
message: "删除成功!"
});
let data={
org_type:"address",
unid:row.addrNode.unid
}
let data = {
org_type: "address",
unid: row.addrNode.unid
};
this.submitLaterGet(data);
}
});
})
}).catch(() => {
.catch(() => {
this.$message({
type: 'info',
message: '已取消删除'
type: "info",
message: "已取消删除"
});
});
},
detailFun(index,row){
this.$refs.editCamera.initDialog(row,'detail',this.dev_unid)
detailFun(index, row) {
this.$refs.editCamera.initDialog(row, "detail", this.dev_unid);
},
getTable(data,type) {
if(data.org_type!="root"){
this.tableType=type;
if(this.tableType=="camera"){
if(data.org_type){
this.tableType=type;
getTable(data, type) {
if (data.org_type != "root") {
this.tableType = type;
if (this.tableType == "camera") {
if (data.type) {
this.tableType = type;
this.formattterData = [];
let filterData=[];
let filterData = [];
let search_params = {
vchan_type: "camera",
org_unid:data.unid
}
this.$api.resource.getCameraTable(search_params,this.dev_unid).then((res) => {
if(res.list_data.length > 0) {
for(var i = 0; i < res.list_data.length; i++) {
org_unid: data.unid
};
this.$api.resource
.getCameraTable(search_params, this.dev_unid)
.then(res => {
if (res.list_data.length > 0) {
for (var i = 0; i < res.list_data.length; i++) {
filterData = this.cameraArr.filter(list => {
return list.id === res.list_data[i].vchan_refid;
})
if(filterData.length > 0) {
});
if (filterData.length > 0) {
this.formattterData.push(filterData[0]);
}
}
}
}).catch((err) => {
})
}else{
.catch(err => {});
} else {
this.formattterData = [];
let filterData=[];
this.$api.resource.getCameraTable({},this.dev_unid,data.vchan_refid).then((res) => {
let filterData = [];
this.$api.resource
.getCameraTable({}, this.dev_unid, data.vchan_refid)
.then(res => {
filterData = this.cameraArr.filter(list => {
return list.id === res.refid;
})
if(filterData.length > 0) {
});
if (filterData.length > 0) {
this.formattterData.push(filterData[0]);
}
}).catch((err) => {
})
.catch(err => {});
}
}else if(this.tableType=="video"){
if(data.org_type=='video'){
this.formattterData=data.childs;
}else{
this.formattterData=data;
} else if (this.tableType == "video") {
if (data.org_type == "video") {
this.formattterData = data.childs;
} else {
this.formattterData = [data];
}
}
}
},
getVideoTable(data,type){
this.tableType=type;
this.formattterData=[];
if(data.childs){
this.formattterData=data.childs;
}else{
this.formattterData.push(data)
syncTable(data) {
this.tableType = "sync";
this.formattterData = [];
this.formattterData.push(data);
console.log(this.formattterData);
},
getVideoTable(data, type) {
this.tableType = type;
this.formattterData = [];
if (data.childs) {
this.formattterData = data.childs;
} else {
this.formattterData.push(data);
}
},
editVideo(index,row){
this.vchan_duid=row.vchan_duid;
editVideo(index, row) {
this.vchan_duid = row.vchan_duid;
this.videoEditParam.vchan_name = row.vchan_name;
this.videoEditParam.video_url = row.video_url;
this.videoEditParam.longitude = row.longitude;
this.videoEditParam.latitude = row.latitude;
this.videoEditVisible=true;
this.videoEditVisible = true;
},
editSave(){
this.$api.resource.editVideo({
name:this.videoEditParam.vchan_name,
longitude : this.videoEditParam.longitude,
editSave() {
this.$api.resource
.editVideo(
{
name: this.videoEditParam.vchan_name,
longitude: this.videoEditParam.longitude,
latitude: this.videoEditParam.latitude
},this.dev_unid,this.vchan_duid).then(res=>{
if(res.ecode==200){
},
this.dev_unid,
this.vchan_duid
)
.then(res => {
if (res.ecode == 200) {
this.$message({
type: 'success',
type: "success",
message: res.enote
});
this.getVideoTree();
this.formattterData.forEach(item=>{
if(item.vchan_duid==this.vchan_duid){
item.vchan_name=this.videoEditParam.vchan_name
this.formattterData.forEach(item => {
if (item.vchan_duid == this.vchan_duid) {
item.vchan_name = this.videoEditParam.vchan_name;
}
})
}else{
});
} else {
this.$message.error(res.enote);
}
this.videoEditVisible=false;
})
this.videoEditVisible = false;
});
},
delVideo(index,row){
this.$confirm('此操作将永久删除该文件, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.$api.resource.delVideo({},this.dev_unid,row.vchan_duid).then(res=>{
if(res.ecode==200){
delVideo(index, row) {
this.$confirm("此操作将永久删除该文件, 是否继续?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
})
.then(() => {
this.$api.resource
.delVideo({}, this.dev_unid, row.vchan_duid)
.then(res => {
if (res.ecode == 200) {
this.$message({
type: 'success',
type: "success",
message: res.enote
});
this.getVideoTree();
this.getTable(row, "video");
// this.formattterData.forEach(item=>{
// if(item.vchan_duid==this.vchan_duid){
// item.vchan_name=this.videoEditParam.vchan_name
// }
// })
}else{
} else {
this.$message.error(res.enote);
}
});
})
}).catch(() => {
.catch(() => {
this.$message({
type: 'info',
message: '已取消删除'
type: "info",
message: "已取消删除"
});
});
}
},
}
};
</script>
<style lang="scss" scoped>
.treeBox{
border: 1px solid #EBEEF5;
.treeBox {
border: 1px solid #ebeef5;
padding: 12px;
}
}
</style>
......@@ -3,32 +3,60 @@
<el-row v-if="allAlarmData.length > 0">
<!-- 交通事件类 -->
<!-- 机动车事件 -->
<el-col :span="24" ref="picbox" :class="{'pic-box':true,'pic-hover':true,'illclass':item.illegalTypeCode == 1?true:false}" v-for="(item, index) in allAlarmData" :key="index" v-if="item.event_cate !== 'flow'">
<el-col :lg="12" :md="10" :sm="11" v-if='item.task_algo_type!="1"'>
<el-col
:span="24"
ref="picbox"
:class="{
'pic-box': true,
'pic-hover': true,
illclass: item.illegalTypeCode == 1 ? true : false
}"
v-for="(item, index) in allAlarmData"
:key="index"
v-if="item.event_cate !== 'flow'"
>
<el-col :lg="12" :md="10" :sm="11" v-if="item.task_algo_type != '1'">
<el-card :body-style="{ padding: 0 }">
<div class="img-wrap" @click="showInfo(index)">
<b class="img-border"></b>
<div class="picbackground">
<img :src = "item.pic" class="photos"/>
<img :src="item.pic" class="photos" />
</div>
</div>
</el-card>
</el-col>
<el-col :lg="11" :md="14" :sm="13" v-if="item.event_type === 'vehicle' || item.event_type === 'xcycle'">
<el-col
:lg="11"
:md="14"
:sm="13"
v-if="item.event_type === 'vehicle' || item.event_type === 'xcycle'"
>
<ul class="pic-info">
<li v-if="item.event_type === 'vehicle'" :title="item.vehicle_plate_text">
<li
v-if="item.event_type === 'vehicle'"
:title="item.vehicle_plate_text"
>
<span>车牌号码:</span>
<span>{{ item.vehicle_plate_text }}</span>
</li>
<li v-if="item.event_type === 'vehicle'" :title="item.vehicle_body_type_text">
<li
v-if="item.event_type === 'vehicle'"
:title="item.vehicle_body_type_text"
>
<span>车辆类型:</span>
<span>{{ item.vehicle_body_type_text }}</span>
</li>
<li v-if="item.event_type === 'vehicle'" :title="item.vehicle_body_color_text">
<li
v-if="item.event_type === 'vehicle'"
:title="item.vehicle_body_color_text"
>
<span>车身颜色:</span>
<span>{{ item.vehicle_body_color_text }}</span>
</li>
<li v-if="item.event_type === 'vehicle'" :title="item.vehicle_body_logo_text">
<li
v-if="item.event_type === 'vehicle'"
:title="item.vehicle_body_logo_text"
>
<span>车辆品牌:</span>
<span>{{ item.vehicle_body_logo_text }}</span>
</li>
......@@ -38,7 +66,10 @@
</li>
<!-- 非机动车 -->
<li v-if="item.event_type === 'xcycle'" :title="item.xcycle_type_text">
<li
v-if="item.event_type === 'xcycle'"
:title="item.xcycle_type_text"
>
<!-- 非机动车类型 -->
<span>车辆类型:</span>
<span>{{ item.xcycle_type_text }}</span>
......@@ -54,19 +85,31 @@
<span>运营公司:</span>
<span>{{ item.company }}</span>
</li>
<li v-if="item.event_type === 'xcycle'" :title="item.xcycle_color_type">
<li
v-if="item.event_type === 'xcycle'"
:title="item.xcycle_color_type"
>
<span>车辆颜色:</span>
<span>{{ item.xcycle_color_type }}</span>
</li>
<li v-if="item.event_type === 'xcycle'" :title="item.driver_face_upbody_text">
<li
v-if="item.event_type === 'xcycle'"
:title="item.driver_face_upbody_text"
>
<span>上身颜色:</span>
<span>{{ item.driver_face_upbody_text }}</span>
</li>
<li :title="item.driver_face_lobody_text" v-if="item.event_type === 'xcycle'">
<li
:title="item.driver_face_lobody_text"
v-if="item.event_type === 'xcycle'"
>
<span>速度:</span>
<span>{{ item.location_speed }}</span>
</li>
<li :title="item.driver_face_lobody_text" v-if="item.event_type === 'xcycle'">
<li
:title="item.driver_face_lobody_text"
v-if="item.event_type === 'xcycle'"
>
<span>戴帽子:</span>
<span>{{ item.driver_face_with_hats }}</span>
</li>
......@@ -77,7 +120,12 @@
</ul>
</el-col>
<!-- 行人事件 -->
<el-col :lg="12" :md="14" :sm="13" v-if="item.event_type === 'pedestrian'">
<el-col
:lg="12"
:md="14"
:sm="13"
v-if="item.event_type === 'pedestrian'"
>
<ul class="pic-info">
<!-- <li :title="item.shoot_date">
<span>抓拍日期:</span>
......@@ -120,9 +168,9 @@
<!--安防事件-->
<el-col :span="12" v-if="item.event_cate === 'behavior'">
<ul class="pic-info">
<li :title="getCode('安防事件',item.event_type)">
<li :title="item.event_type">
<span>事件类型:</span>
<span>{{ getCode('安防事件',String(item.event_type)) }}</span>
<span>{{ item.event_type }}</span>
</li>
<!-- 区域人数 -->
<li v-if="item.event_type == '21'">
......@@ -144,7 +192,13 @@
</el-col>
</el-col>
<!--客流事件-->
<el-col :span="22" class="pic-box" v-for="(item, index) in allAlarmData" :key="index" v-if="item.event_cate === 'flow'">
<el-col
:span="22"
class="pic-box"
v-for="(item, index) in allAlarmData"
:key="index"
v-if="item.event_cate === 'flow'"
>
<el-col :span="24">
<ul class="pic-info">
<li :title="item.shoot_date">
......@@ -179,44 +233,43 @@
</template>
<script>
export default {
data(){
return{
allAlarmData:[],
curPicData:''
}
data() {
return {
allAlarmData: [],
curPicData: ""
};
},
props:["itemData"],
methods:{
props: ["itemData"],
methods: {
showInfo: function(index) {
this.curPicData = this.allAlarmData[index];
if(this.curPicData) {
this.$emit("showDitail",this.curPicData)
if (this.curPicData) {
this.$emit("showDitail", this.curPicData);
}
}
},
created() {
},
mounted() {
},
watch:{
itemData(val){
if(val == '') {
created() {},
mounted() {},
watch: {
itemData(val) {
if (val == "") {
this.allAlarmData = [];
return
return;
}
var timer = new Date().getTime()
if(val.event_cate === 'flow' || val.event_type === 'pflow' ||val.event_type === 'pdensity') return
if(this.allAlarmData.length > 20) {
var timer = new Date().getTime();
if (
val.event_cate === "flow" ||
val.event_type === "pflow" ||
val.event_type === "pdensity"
)
return;
if (this.allAlarmData.length > 20) {
this.allAlarmData.pop();
} else {
this.allAlarmData.unshift(val);
}
}
}
}
};
</script>
<style lang="stylus" scoped>
</style>
<style lang="stylus" scoped></style>
......@@ -3,18 +3,28 @@
<el-row v-if="eventAlarmData.length > 0">
<!-- 交通事件类 -->
<!-- 机动车事件 -->
<el-col :span="22" class="pic-box" v-for="(item, index) in eventAlarmData" :key="index">
<el-col :span="12" v-if='item.task_algo_type!="1"'>
<el-col
:span="22"
class="pic-box"
v-for="(item, index) in eventAlarmData"
:key="index"
>
<el-col :span="12" v-if="item.task_algo_type != '1'">
<el-card :body-style="{ padding: 0 }">
<div class="img-wrap" @click="showInfo(index)">
<b class="img-border"></b>
<div class="picbackground">
<img :src="item.pic" class="photos"/>
<img :src="item.pic" class="photos" />
</div>
</div>
</el-card>
</el-col>
<el-col :lg="11" :md="14" :sm="13" v-if="item.event_type === 'vehicle' || item.event_type === 'xcycle'">
<el-col
:lg="11"
:md="14"
:sm="13"
v-if="item.event_type === 'vehicle' || item.event_type === 'xcycle'"
>
<ul class="pic-info">
<!-- <li :title="item.shoot_date">
<span>抓拍日期:</span>
......@@ -28,7 +38,10 @@
<span>地点名称:</span>
<span>{{ item.location_name }}</span>
</li> -->
<li v-if="item.event_type === 'vehicle'" :title="item.vehicle_plate_text">
<li
v-if="item.event_type === 'vehicle'"
:title="item.vehicle_plate_text"
>
<span>车牌号码:</span>
<span>{{ item.vehicle_plate_text }}</span>
</li>
......@@ -36,28 +49,46 @@
<span>车辆类型:</span>
<span>{{ item.vehicle_body_type_text }}</span>
</li> -->
<li v-if="item.event_type === 'vehicle'" :title="item.vehicle_body_color_text">
<li
v-if="item.event_type === 'vehicle'"
:title="item.vehicle_body_color_text"
>
<span>车身颜色:</span>
<span>{{ item.vehicle_body_color_text }}</span>
</li>
<li v-if="item.event_type === 'vehicle'" :title="item.vehicle_body_logo_text">
<li
v-if="item.event_type === 'vehicle'"
:title="item.vehicle_body_logo_text"
>
<span>车辆品牌:</span>
<span>{{ item.vehicle_body_logo_text }}</span>
</li>
<li v-if="item.event_type === 'vehicle'" :title="item.vehicle_RefinedFeature_text">
<li
v-if="item.event_type === 'vehicle'"
:title="item.vehicle_RefinedFeature_text"
>
<span>标志物:</span>
<span>{{ item.RefinedFeature_text }}</span>
</li>
<!-- 非机动车 -->
<li v-if="item.event_type === 'xcycle'" :title="item.xcycle_type_text">
<li
v-if="item.event_type === 'xcycle'"
:title="item.xcycle_type_text"
>
<span>骑车类型:</span>
<span>{{ item.xcycle_type_text }}</span>
</li>
<li v-if="item.event_type === 'xcycle'" :title="item.xcycle_color_type">
<li
v-if="item.event_type === 'xcycle'"
:title="item.xcycle_color_type"
>
<span>车辆颜色:</span>
<span>{{ item.xcycle_color_type }}</span>
</li>
<li :title="item.driver_face_sex" v-if="item.event_type === 'xcycle'">
<li
:title="item.driver_face_sex"
v-if="item.event_type === 'xcycle'"
>
<span>性别:</span>
<span>{{ item.driver_face_sex }}</span>
</li>
......@@ -65,15 +96,24 @@
<span>运营公司:</span>
<span>{{ item.company }}</span>
</li> -->
<li v-if="item.event_type === 'xcycle'" :title="item.driver_face_upbody_text">
<li
v-if="item.event_type === 'xcycle'"
:title="item.driver_face_upbody_text"
>
<span>上身颜色:</span>
<span>{{ item.driver_face_upbody_text }}</span>
</li>
<li :title="item.driver_face_lobody_text" v-if="item.event_type === 'xcycle'">
<li
:title="item.driver_face_lobody_text"
v-if="item.event_type === 'xcycle'"
>
<span>速度:</span>
<span>{{ item.location_speed }}</span>
</li>
<li :title="item.driver_face_lobody_text" v-if="item.event_type === 'xcycle'">
<li
:title="item.driver_face_lobody_text"
v-if="item.event_type === 'xcycle'"
>
<span>戴帽子:</span>
<span>{{ item.driver_face_with_hats }}</span>
</li>
......@@ -127,9 +167,9 @@
<!--安防事件-->
<el-col :span="12" v-if="item.event_cate === 'behavior'">
<ul class="pic-info">
<li :title="getCode('安防事件',item.event_type)">
<li :title="getCode('安防事件', item.event_type)">
<span>事件类型:</span>
<span>{{ getCode('安防事件',item.event_type) }}</span>
<span>{{ item.event_type }}</span>
</li>
<li :title="item.shoot_date">
<span>抓拍日期:</span>
......@@ -151,7 +191,13 @@
</el-col>
</el-col>
<!--客流事件-->
<el-col :span="22" class="pic-box" v-for="(item, index) in eventAlarmData" :key="index" v-if="item.event_cate === 'flow'">
<el-col
:span="22"
class="pic-box"
v-for="(item, index) in eventAlarmData"
:key="index"
v-if="item.event_cate === 'flow'"
>
<el-col :span="24">
<ul class="pic-info">
<li :title="item.shoot_date">
......@@ -162,9 +208,9 @@
<span class="flow-left">抓拍时间:</span>
<span class="flow-right">{{ item.shoot_time }}</span>
</li>
<li :title="item.event_type_text">
<li :title="item.event_type">
<span class="flow-left">事件类型:</span>
<span class="flow-right">{{ item.event_type_text }}</span>
<span class="flow-right">{{ item.event_type }}</span>
</li>
<li v-if="item.event_type === 'inout_num'" :title="item.inNum">
<span class="flow-left">进入人数:</span>
......@@ -186,39 +232,36 @@
</template>
<script>
export default {
data(){
return{
eventAlarmData:[],
}
data() {
return {
eventAlarmData: []
};
},
props:["itemData"],
methods:{
props: ["itemData"],
methods: {
showInfo: function(index) {
this.curPicData = this.eventAlarmData[index];
if(this.curPicData) {
this.$emit("showDitail",this.curPicData)
if (this.curPicData) {
this.$emit("showDitail", this.curPicData);
}
}
},
created() {
},
mounted() {
},
watch:{
itemData(val){
if(val == '') {
created() {},
mounted() {},
watch: {
itemData(val) {
if (val == "") {
this.eventAlarmData = [];
}
if(val.event_cate == "behavior"){
this.eventAlarmData.push(val);
if (val.event_cate == "behavior") {
if (this.eventAlarmData.length > 20) {
this.eventAlarmData.pop();
} else {
this.eventAlarmData.unshift(val);
}
}
}
}
}
};
</script>
<style scoped lang="stylus">
</style>
<style scoped lang="stylus"></style>
......@@ -3,18 +3,29 @@
<el-row v-if="illegalAlarmData.length > 0">
<!-- 交通事件类 -->
<!-- 机动车事件 -->
<el-col :span="22" class="pic-box" v-for="(item, index) in illegalAlarmData" :key="index" v-if="item.event_cate !== 'flow'">
<el-col :span="12" v-if='item.task_algo_type!="1"'>
<el-col
:span="22"
class="pic-box"
v-for="(item, index) in illegalAlarmData"
:key="index"
v-if="item.event_cate !== 'flow'"
>
<el-col :span="12" v-if="item.task_algo_type != '1'">
<el-card :body-style="{ padding: 0 }">
<div class="img-wrap" @click="showInfo(index)">
<b class="img-border"></b>
<div class="picbackground">
<img v-lazy="item.pic" class="photos"/>
<img :src="item.pic" class="photos" />
</div>
</div>
</el-card>
</el-col>
<el-col :lg="11" :md="14" :sm="13" v-if="item.event_type === 'vehicle' || item.event_type === 'xcycle'">
<el-col
:lg="11"
:md="14"
:sm="13"
v-if="item.event_type === 'vehicle' || item.event_type === 'xcycle'"
>
<ul class="pic-info">
<!-- <li :title="item.shoot_date">
<span>抓拍日期:</span>
......@@ -28,7 +39,10 @@
<span>地点名称:</span>
<span>{{ item.location_name }}</span>
</li> -->
<li v-if="item.event_type === 'vehicle'" :title="item.vehicle_plate_text">
<li
v-if="item.event_type === 'vehicle'"
:title="item.vehicle_plate_text"
>
<span>车牌号码:</span>
<span>{{ item.vehicle_plate_text }}</span>
</li>
......@@ -36,34 +50,52 @@
<span>车辆类型:</span>
<span>{{ item.vehicle_body_type_text }}</span>
</li> -->
<li v-if="item.event_type === 'vehicle'" :title="item.vehicle_body_color_text">
<li
v-if="item.event_type === 'vehicle'"
:title="item.vehicle_body_color_text"
>
<span>车身颜色:</span>
<span>{{ item.vehicle_body_color_text }}</span>
</li>
<li v-if="item.event_type === 'vehicle'" :title="item.vehicle_body_logo_text">
<li
v-if="item.event_type === 'vehicle'"
:title="item.vehicle_body_logo_text"
>
<span>车辆品牌:</span>
<span>{{ item.vehicle_body_logo_text }}</span>
</li>
<li v-if="item.event_type === 'vehicle'" :title="item.vehicle_plate_text">
<li
v-if="item.event_type === 'vehicle'"
:title="item.vehicle_plate_text"
>
<span>违法类型:</span>
<span>{{ item.illegalType}}</span>
<span>{{ item.illegalType }}</span>
</li>
<!-- 非机动车 -->
<li v-if="item.event_type === 'xcycle'" :title="item.xcycle_type_text">
<li
v-if="item.event_type === 'xcycle'"
:title="item.xcycle_type_text"
>
<span>骑车类型:</span>
<span>{{ item.xcycle_type_text }}</span>
</li>
<li v-if="item.event_type === 'xcycle'" :title="item.xcycle_color_type">
<li
v-if="item.event_type === 'xcycle'"
:title="item.xcycle_color_type"
>
<span>车辆颜色:</span>
<span>{{ item.xcycle_color_type }}</span>
</li>
<li :title="item.driver_face_lobody_text" v-if="item.event_type === 'xcycle'">
<li
:title="item.driver_face_lobody_text"
v-if="item.event_type === 'xcycle'"
>
<span>速度:</span>
<span>{{ item.location_speed }}</span>
</li>
<li v-if="item.event_type === 'xcycle'">
<span>违法类型:</span>
<span>{{ item.illegalType}}</span>
<span>{{ item.illegalType }}</span>
</li>
</ul>
</el-col>
......@@ -107,9 +139,9 @@
<span>抓拍时间:</span>
<span>{{ item.shoot_time }}</span>
</li>
<li :title="getCode('安防事件',item.event_type)">
<li :title="item.event_type">
<span>事件类型:</span>
<span>{{ getCode('安防事件',item.event_type) }}</span>
<span>{{ item.event_type }}</span>
</li>
<li v-if="item.illegalType" :title="item.illegalType">
<span>违法类型:</span>
......@@ -123,39 +155,37 @@
</template>
<script>
export default {
data(){
return{
illegalAlarmData:[]
}
data() {
return {
illegalAlarmData: []
};
},
props:["itemData"],
methods:{
props: ["itemData"],
methods: {
showInfo: function(index) {
this.curPicData = this.illegalAlarmData[index];
if(this.curPicData) {
this.$emit("showDitail",this.curPicData)
if (this.curPicData) {
this.$emit("showDitail", this.curPicData);
}
}
},
created() {
},
mounted() {
},
watch:{
itemData(val){
if(val == '') {
created() {},
mounted() {},
watch: {
itemData(val) {
if (val == "") {
this.illegalAlarmData = [];
return
return;
}
if (val.illegalType && val.illegalTypestate == 1) {
if (this.illegalAlarmData.length > 20) {
this.illegalAlarmData.pop();
} else {
this.illegalAlarmData.unshift(val);
}
if(val.illegalTypeCode && val.illegalTypeCode == 1) {
this.illegalAlarmData.push(val);
}
}
}
}
};
</script>
<style lang="stylus" scoped>
</style>
<style lang="stylus" scoped></style>
......@@ -52,9 +52,7 @@ export default {
// ...mapState(["eventData", "wsclient"])
},
methods: {
handleClick(tab, event) {
console.log(tab, event);
},
handleClick(tab, event) {},
dataInit(cid, type) {
this.$refs.allalarm.allAlarmData = [];
this.$refs.caralarm.carAlarmData = [];
......
......@@ -18,6 +18,7 @@
v-for="(item, index) in taskdata"
:key="index"
@click="selecttask(item, index)"
v-if=" item.status == 'Running'"
>
<span
:class="{
......@@ -71,6 +72,7 @@
:subtaskid="currentSubtaskId"
:subtaskdata="subtaskdata"
:playurl="playurl"
:vchan="vchandata"
></setting>
</div>
</div>
......@@ -103,6 +105,7 @@ export default {
taskdata: [],
subtaskdata: "",
subTasks: [],
vchandata:{},
subindex: -1,
playurl: "",
taskID: "",
......@@ -167,6 +170,7 @@ export default {
type: "error"
});
} else {
this.vchandata = vdata.vchan;
setTimeout(() => {
this.getPlayUrl();
}, 2000);
......@@ -184,7 +188,7 @@ export default {
setTimeout(() => {
this.$refs.videoplay.videoPlay();
}, 2000);
console.log("视频播放地址:", this.playurl.rtsp_url);
console.info("视频播放地址:", this.playurl.rtsp_url);
} else {
this.$message({
message: "获取rtsp播放地址失败!请重试!",
......@@ -220,6 +224,7 @@ export default {
margin 2px auto
color #fff
overflow hidden
min-height 700px
padding 10px
}
.tree-box{
......
......@@ -80,6 +80,15 @@
<i class="el-icon-delete icon"></i>
</span>
</div>
<div>
<span
@click="cutpic"
class="delbtn editbtn"
v-if="!canvasState"
>
<i class="el-icon-picture icon" style="color:#3bb7ff;"></i>
</span>
</div>
</div>
</div>
</el-row>
......@@ -128,13 +137,15 @@ export default {
XMLStr: "",
modelnum: 0, //标记模型编号
bgUrl: "",
taskData: ""
taskData: "",
mtaskdata: ""
};
},
// props: ['bgUrl'],
methods: {
checkBrower: function() {},
showModal: function(data, mtaskdata) {
this.mtaskdata = mtaskdata;
var _this = this;
this.$store.commit("setocxstate", 0);
this.taskData = data;
......@@ -143,21 +154,7 @@ export default {
// this.type = 2;
this.bgUrl = "";
//获取视频截图
this.$api.task
.cutpic(
mtaskdata.vchan.vdev_unid,
mtaskdata.vchan.vchan_refid,
mtaskdata.subtask_id
).then(res => {
if (!res.ecode) {
this.src = "data:image/png;base64," + res.pic_base64;
} else {
alert("标定设置截图失败!" + res.enote);
}
})
.catch(err => {
console.log("标定设置截图返回异常:", err.message);
});
this.cutpic(mtaskdata);
// this.src = document.getElementById('VionVideo').CapturePicture(filePath) + '?stamp=' + new Date().getTime();
if (this.src) {
setTimeout(() => {
......@@ -220,9 +217,29 @@ export default {
}
}, 0);
},
cutpic() {
var mtaskdata = this.mtaskdata;
this.src = "";
//获取视频截图
this.$api.task
.cutpic(
mtaskdata.vchan.vdev_unid,
mtaskdata.vchan.vchan_refid,
mtaskdata.subtask_id
)
.then(res => {
if (!res.ecode) {
this.src = "data:image/png;base64," + res.pic_base64;
} else {
alert("标定设置截图失败!" + res.enote);
}
})
.catch(err => {
console.error("标定设置截图返回异常:", err.message);
});
},
configInit: function(xml) {
if (!xml) {
console.log("xml 为空!");
xml = configxml.xml;
}
let allline = [];
......@@ -270,7 +287,35 @@ export default {
this.signLayer.add(line);
}
});
changeModelData("car")
this.initModel();
},
initModel(){
//初始化一个模型
let po = [354, 313, 360, 244];
this.getModelData(po);
var line = this.drawLine(
{
x: po[0],
y: po[1]
},
{
x: po[2],
y: po[3]
},
"red",
11
);
this.signLayer.add(line);
this.stage.draw();
let P1 = {},
P2 = {};
P1.x = Number((po[0] / 800).toFixed(6));
P1.y = Number((po[1] / 500).toFixed(6));
P2.x = Number((po[2] / 800).toFixed(6));
P2.y = Number((po[3] / 500).toFixed(6));
this.drawArrows(P1, P2);
},
beforeHideModal: function() {
this.clear();
......@@ -307,7 +352,9 @@ export default {
this.signLayer.draw();
//变换线模型
let mtype = index == 0 ? "car" : "person";
changeModelData(mtype);
this.initModel();
},
changeCanvasState: function() {
......@@ -533,7 +580,7 @@ export default {
topY = headlen * Math.sin(angle1),
botX = headlen * Math.cos(angle2),
botY = headlen * Math.sin(angle2);
var arrowX = c1.x * 800 - topX,
var arrowX = c1.x * 800 - topX ,
arrowY = c1.y * 500 - topY;
arrowX = c2.x * 800 + topX;
arrowY = c2.y * 500 + topY;
......@@ -628,6 +675,7 @@ export default {
},
//根据模型线改变模型改变箭头
changeModel(modelnum) {
console.log(modelnum);
let mlinepoints = this.selectedShape.attrs.points;
let curmodel = this.signLayer.get(".model");
let arrows = this.signLayer.get(".arrows");
......@@ -661,6 +709,7 @@ export default {
});
},
drawLine: function(start, end, col, types, linenum) {
debugger;
linenum = linenum ? linenum : 0;
let points = [start.x, start.y, end.x, end.y];
let line = new Kinetic.Line({
......
......@@ -21,9 +21,9 @@
</template>
</el-table-column>
<el-table-column align="center" label="预设位置配置" width="120">
<template>
<template slot-scope="scope">
<div class="yzw-setbox">
<span class="icon el-icon-delete" @click="resetRoi"></span>
<span class="icon el-icon-delete" @click="resetRoi(scope.row)"></span>
</div>
</template>
</el-table-column>
......@@ -31,7 +31,6 @@
<template slot-scope="scope">
<div class="yzw-setbox">
<setTimer
ref="settimer"
:runtime="scope.row.runtime"
:runindex="scope.$index"
......@@ -59,7 +58,7 @@
场景配置 <span class="set-icon el-icon-circle-plus"></span>
</div>
<div class="set-item">
播放
播放
<span class="set-icon">
<el-switch :width="25" v-model="switchstate" @change="suspends">
</el-switch>
......@@ -82,6 +81,7 @@
ref="yt"
@subpostion="submitPosion"
@deleteytconfig="deleteytconfig"
:vchan="vchan"
></ytconfig>
</div>
<div>
......@@ -107,7 +107,8 @@ export default {
data() {
return {
timer: 0,
loading:false,
user_unid: "",
loading: false,
polling_state: false,
timersel: 0,
timerDialog: false,
......@@ -124,7 +125,7 @@ export default {
switchstate: false
};
},
props: ["taskid", "subtaskid", "playurl"],
props: ["taskid", "subtaskid", "playurl", "vchan"],
components: {
areas,
demarcate,
......@@ -149,7 +150,7 @@ export default {
setDemarcate(scenesdata, index) {
if (this.checkpollstate()) {
this.curindex = index;
console.log("scenesdata",scenesdata)
console.log("scenesdata", scenesdata);
this.$refs.demarcate.showModal(scenesdata, this.taskInfo);
}
},
......@@ -159,13 +160,42 @@ export default {
setsounces() {
if (this.checkpollstate()) {
this.$refs.yt.openyt(this.currentRow);
this.getSipSetting();
}
},
getSipSetting: function() {
if (this.dev_unid) {
this.$api.device.sipSet(this.dev_unid, this.user_unid).then(res => {
if (!res.ecode) {
console.log("获取sip配置返回:", JSON.stringify(res));
document
.getElementById("VionVideo")
.PtzRegistDev(
res.sip_serv_ip,
res.sip_unid,
res.sip_password,
res.sip_serv_id
);
} else {
this.$message({
message: "获取播放地址失败,请前往配置sip服务!!请重试!",
type: "error"
});
}
});
} else {
console.log("运维ID获取失败");
this.$message({
type: "warning",
message: "运维ID获取失败"
});
}
},
TaskParams(subid) {
this.loading = true;
this.$api.task.getTaskParams(this.taskid, subid).then(res => {
this.taskInfo = res;
this.switchstate = res.alternate_status == 1 ? true : false;
this.switchstate = res.alternate_status == "1" ? true : false;
this.loading = false;
this.$forceUpdate();
});
......@@ -177,7 +207,8 @@ export default {
this.timerDialog = true;
this.timer = data.runtime;
},
resetRoi() {
resetRoi(row) {
var that = this;
this.$store.commit("setocxstate", 0);
this.$confirm("删除参数设置,区域设置,标定设置信息?", "提示", {
confirmButtonText: "确定",
......@@ -185,14 +216,15 @@ export default {
type: "warning"
})
.then(() => {
this.taskInfo.mtasks[0].scenes.map(ele => {
if (ele.scene_unid == this.currentRow.scene_unid) {
debugger
that.taskInfo.mtasks[0].scenes.map(ele => {
if (ele.scene_unid == row.scene_unid) {
ele.config = {};
ele.rois = [];
ele.rois[0].roi = '<?xml version="1.0" encoding="UTF-8" ?><roi><flow_roi><flow_type></flow_type><flow_region><polygon_point_count>0</polygon_point_count></flow_region></flow_roi><plate_detect_region><detect_polygon><polygon_point_count>0</polygon_point_count></detect_polygon></plate_detect_region><lane_line><line_count>0</line_count></lane_line><lanes><lane_count>0</lane_count></lanes><lights><light_count>0</light_count></lights><no_stop_region><region_count>0</region_count></no_stop_region><pedestrian_detection_region><region_count>0</region_count></pedestrian_detection_region><median_lines><lane_count>0</lane_count></median_lines><pedestrian_density_region><region_count>0</region_count></pedestrian_density_region><foreign_detection_region><region_count>0</region_count></foreign_detection_region><test_result_region><region_count>0</region_count></test_result_region></roi>';
ele.runtime = 0;
}
});
this.subRoi(this.taskInfo.mtasks);
that.subRoi(that.taskInfo.mtasks);
})
.catch(() => {
this.$store.commit("setocxstate", 1);
......@@ -210,12 +242,14 @@ export default {
this.$store.commit("setocxstate", 1);
},
handleCurrentChange(val) {
if (val.algo_type == 3) {
this.currentRow = val;
this.$api.task
.switchScene(this.taskid, this.subtaskid, val.scene_unid)
.then(res => {
console.log(res);
});
}
},
suspends() {
if (this.subtaskid) {
......@@ -231,7 +265,7 @@ export default {
let state = false;
if (this.switchstate) {
this.$message({
message: "请先关闭预置位在进行操作!",
message: "请先关闭轮循再进行操作!",
type: "warning"
});
state = false;
......@@ -241,7 +275,6 @@ export default {
return state;
},
submitPosion(positionnum) {
debugger
this.taskInfo.mtasks[0].scenes.map(ele => {
if (ele.scene_unid == this.currentRow.scene_unid) {
ele.position_num = positionnum;
......@@ -353,6 +386,9 @@ export default {
});
}
},
created(){
this.user_unid = window.sessionStorage.getItem("user_unid");
},
watch: {
// subtaskid(val) {
// this.loading = true;
......@@ -401,14 +437,15 @@ export default {
color #3BB7FF
}
.set-header{
height 3vh
line-height 3vh
height 30px
line-height 30px
text-align center
background #ACC1FF
}
.set-item{
height 3vh
line-height 3vh
min-height 30px
padding:0 10px
color #555555
margin-top 1vh
......
......@@ -7,6 +7,13 @@
:before-close="handleClose"
>
<span>
<el-input placeholder="请输入内容" v-model="paramsval" class="input-with-select">
<el-button
slot="append"
icon="el-icon-search"
@click="$refs.iframe.contentWindow.clickButton(paramsval)"
></el-button>
</el-input>
<iframe
id="iframe"
ref="iframe"
......@@ -28,6 +35,7 @@
export default {
data() {
return {
paramsval:"",
dialogVisible: false,
XMLStr: "",
basicXml: "",
......@@ -54,21 +62,24 @@ export default {
xmlInit: function(obj) {
this.XMLStr =
obj.config.xml || '<?xml version="1.0" encoding="GBK"?><root></root>';
console.log("XML:" + this.XMLStr.split("@").length);
if (this.XMLStr.split("@").length > 1) {
this.XMLStr = '<?xml version="1.0" encoding="GBK"?><root></root>';
}
if (obj && obj.basicConfig && obj.basicConfig.xml) {
this.basicXml = obj.basicConfig.xml;
this.$refs.iframe.contentWindow.loadParameterTree(
this.basicXml,
this.XMLStr
);
} else {
console.error("参数配置存在错误!请检测basicConfig是否为空");
}
},
save: function() {
this.$refs.iframe.contentWindow.submit();
//ifram 传递回来的饿xml
this.XMLStr = this.$refs.iframe.contentWindow.xmlStr;
this.dialogVisible = false;
this.handleClose();
this.$parent.submit(this.XMLStr, "config");
},
handleClose(done) {
......@@ -78,4 +89,9 @@ export default {
}
};
</script>
<style lang="stylus" scoped></style>
<style lang="stylus" scoped>
.input-with-select{
width 300px
margin-bottom 5px;
}
</style>
<template>
<div class="control-box" v-show="showyt">
<div class="control-let-box">
<div>
<div class="yzw-box">
<span
@mousedown="Ytontroller('SIP_CTRL_PTZ_UPLEFT')"
@mouseup="stopYtontroller('SIP_CTRL_PTZ_UPLEFT')"
@mousedown="Ytontroller(5)"
@mouseup="stopYtontroller(11)"
class="control-btn icon-fanxing-zuoshang"
></span>
<span
@mousedown="Ytontroller('SIP_CTRL_PTZ_UP')"
@mouseup="stopYtontroller('SIP_CTRL_PTZ_UP')"
@mousedown="Ytontroller(3)"
@mouseup="stopYtontroller(11)"
class="control-btn icon-fanxing-shang"
></span>
<span
@mousedown="Ytontroller('SIP_CTRL_PTZ_UPRIGHT')"
@mouseup="stopYtontroller('SIP_CTRL_PTZ_UPRIGHT')"
@mousedown="Ytontroller(6)"
@mouseup="stopYtontroller(11)"
class="control-btn icon-fanxing-youshang"
></span>
</div>
<div>
<div class="yzw-box">
<span
@mousedown="Ytontroller('SIP_CTRL_PTZ_LEFT')"
@mouseup="stopYtontroller('SIP_CTRL_PTZ_LEFT')"
@mousedown="Ytontroller(1)"
@mouseup="stopYtontroller(11)"
class="control-btn icon-fanxing-zuo"
></span>
<span
@mousedown="Ytontroller('12')"
@mouseup="stopYtontroller('12')"
@mouseup="stopYtontroller(11)"
class="control-btn icon-fanxing-zhongzhi"
></span>
<span
@mousedown="Ytontroller('SIP_CTRL_PTZ_RIGHT')"
@mouseup="stopYtontroller('SIP_CTRL_PTZ_RIGHT')"
@mousedown="Ytontroller(2)"
@mouseup="stopYtontroller(11)"
class="control-btn icon-fanxing-you"
></span>
</div>
<div>
<div class="yzw-box">
<span
@mousedown="Ytontroller('SIP_CTRL_PTZ_DOWNLEFT')"
@mouseup="stopYtontroller('SIP_CTRL_PTZ_DOWNLEFT')"
@mousedown="Ytontroller(7)"
@mouseup="stopYtontroller(11)"
class="control-btn icon-fanxing-zuoxia"
></span>
<span
@mousedown="Ytontroller('SIP_CTRL_PTZ_DOWN')"
@mouseup="stopYtontroller('SIP_CTRL_PTZ_DOWN')"
@mousedown="Ytontroller(4)"
@mouseup="stopYtontroller(11)"
class="control-btn icon-fanxing-xia"
></span>
<span
@mousedown="Ytontroller('SIP_CTRL_PTZ_DOWNRIGHT')"
@mouseup="stopYtontroller('SIP_CTRL_PTZ_DOWNRIGHT')"
@mousedown="Ytontroller(8)"
@mouseup="stopYtontroller(11)"
class="control-btn icon-fanxing-youxia"
></span>
</div>
......@@ -108,9 +108,10 @@ export default {
value3: 0,
value4: 0,
presetindex: "",
curtask:{},
curtask: {}
};
},
props: ["vchan"],
methods: {
openyt(curtask) {
if (curtask) {
......@@ -132,9 +133,27 @@ export default {
* @param {code}
*/
Ytontroller(nType, nParam = null) {
VionVideo.VionPTZonrol(null, nType, nParam);
try {
let vrefid = this.vchan.refid || this.vchan.vchan_refid;
document
.getElementById("VionVideo")
.VionPTZControl(String(vrefid), Number(nType), 1);
} catch (error) {
console.log(error);
}
console.log(nType);
},
stopYtontroller(nType) {
let vrefid = this.vchan.refid || this.vchan.vchan_refid;
document
.getElementById("VionVideo")
.VionPTZControl(String(vrefid), Number(nType), 1);
},
subset() {
let vrefid = this.vchan.refid || this.vchan.vchan_refid;
document
.getElementById("VionVideo")
.VionPTZControl(String(vrefid), Number(18), Number(this.presetindex));
this.$emit("subpostion", this.presetindex);
},
deleteytconfig() {
......@@ -217,4 +236,7 @@ export default {
.delbtn {
margin-left:.4vw
}
.yzw-box .control-btn:hover{
color #409EFF
}
</style>
......@@ -4,37 +4,82 @@
<el-form ref="form" label-width="80px" inline>
<el-form-item label="任务名称">
<span class="selectBox">
<el-select placeholder="请选择" :popper-append-to-body=false v-model="conditions.task_id" @change="getSubTask">
<el-option v-for='item in taskList' :value="item.task_id" :key="item.task_id" :label='item.task_name'></el-option>
<el-select
filterable
placeholder="请选择"
:popper-append-to-body="false"
v-model="conditions.task_id"
@change="getSubTask"
>
<el-option
v-for="item in taskList"
:value="item.task_id"
:key="item.task_id"
:label="item.task_name"
></el-option>
</el-select>
</span>
</el-form-item>
<el-form-item label="视频名称">
<span class="selectBox">
<el-select placeholder="请选择" :popper-append-to-body=false v-model="conditions.subtask_id">
<el-option v-for='item in subTaskList' :value="item.subtask_id" :key="item.subtask_id" :label='item.subtask_name'></el-option>
<el-select
filterable
placeholder="请选择"
:popper-append-to-body="false"
v-model="conditions.subtask_id"
>
<el-option
v-for="item in subTaskList"
:value="item.subtask_id"
:key="item.subtask_id"
:label="item.subtask_name"
></el-option>
</el-select>
</span>
</el-form-item>
<el-form-item label="事件分类">
<span class="selectBox">
<el-select placeholder="请选择" :popper-append-to-body=false v-model="conditions.event_cate" @change="cateChange">
<el-select
filterable
placeholder="请选择"
:popper-append-to-body="false"
v-model="conditions.event_cate"
@change="cateChange"
>
<el-option value="安防事件" label="全部"></el-option>
<el-option v-for='item in cateList' :value="item.code" :key="item.code" :label='item.name'></el-option>
<el-option
v-for="item in cateList"
:value="item.code"
:key="item.code"
:label="item.name"
></el-option>
</el-select>
</span>
</el-form-item>
<el-form-item label="事件类型">
<span class="selectBox">
<el-select placeholder="请选择" :popper-append-to-body=false v-model="conditions.type">
<el-select
filterable
placeholder="请选择"
:popper-append-to-body="false"
v-model="conditions.type"
>
<el-option value="" label="全部"></el-option>
<el-option v-for='item in eventList' :value="item.code" :key="item.code" :label='item.name'></el-option>
<el-option
v-for="item in eventList"
:value="item.code"
:key="item.code"
:label="item.name"
></el-option>
</el-select>
</span>
</el-form-item>
<el-form-item label="组织名称">
<span class="inputBox">
<el-input placeholder="请输入组织名称" v-model="conditions.location_code"></el-input>
<el-input
placeholder="请输入组织名称"
v-model="conditions.location_code"
></el-input>
</span>
</el-form-item>
<el-form-item label="起始时间">
......@@ -46,7 +91,8 @@
type="datetimerange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期">
end-placeholder="结束日期"
>
</el-date-picker>
</span>
</el-form-item>
......@@ -54,8 +100,12 @@
</el-col>
<el-col :span="2">
<div style="margin-bottom: 6px;padding-top: 3px;">
<el-button type="primary" style="" @click="query" class="block">查询</el-button>
<el-button type="success" class="block compatibleBtn" @click="exportFun">导出</el-button>
<el-button type="primary" style="" @click="query" class="block"
>查询</el-button
>
<el-button type="success" class="block compatibleBtn" @click="exportFun"
>导出</el-button
>
</div>
</el-col>
<div style="">
......@@ -65,57 +115,79 @@
stripe
v-loading="loading"
border
@selection-change="handleSelectionChange">
@selection-change="handleSelectionChange"
>
<el-table-column
prop="index"
align="center"
label="#"
:formatter="indexFormatter"
width="50">
width="50"
>
</el-table-column>
<el-table-column
prop="event_cate"
align="center"
:formatter="cateFormatter"
label="事件分类">
label="事件分类"
>
</el-table-column>
<el-table-column
prop="event_type"
align="center"
label="事件类型">
<el-table-column prop="event_type" align="center" label="事件类型">
</el-table-column>
<el-table-column
prop="event_data.location.code"
align="center"
label="组织名称">
label="组织名称"
>
</el-table-column>
<el-table-column
align="center"
label="抓拍地点">
<template slot-scope="scope" >
<el-table-column align="center" label="抓拍地点">
<template slot-scope="scope">
<div>
<span v-if="scope.row.event_cate == 'behavior'&&scope.row.event_data&&scope.row.event_data">{{scope.row.event_data.locate_name}}</span>
<span v-if="scope.row.event_data && scope.row.event_data">{{
scope.row.event_data.location
? scope.row.event_data.location.name
: ""
}}</span>
</div>
</template>
</el-table-column>
<el-table-column
prop="shoot_date"
align="center"
label="抓拍时间">
<el-table-column prop="shoot_date" align="center" label="抓拍时间">
<template slot-scope="scope">
<span v-if="scope.row.event_cate == 'behavior'&&scope.row.event_data">{{scope.row.shoot_date}} {{scope.row.shoot_time}}</span>
<span v-if="scope.row.event_data"
>{{ scope.row.shoot_date }} {{ scope.row.shoot_time }}</span
>
</template>
</el-table-column>
<el-table-column
align="center"
label="操作">
<el-table-column align="center" label="操作">
<template slot-scope="scope">
<el-tooltip content="播放" placement="bottom" effect="light" :visible-arrow=false>
<span :class="{'iconfont icon-fanxing-qidong playIcon':true,'no-btn':scope.row.video&&scope.row.video[0].src_url!=''?false:true}" @click="playFun(scope.$index, scope.row)"></span>
<el-tooltip
content="播放"
placement="bottom"
effect="light"
:visible-arrow="false"
>
<span
:class="{
'iconfont icon-fanxing-qidong playIcon': true,
'no-btn':
scope.row.video && scope.row.video[0].src_url != ''
? false
: true
}"
@click="playFun(scope.$index, scope.row)"
></span>
</el-tooltip>
<span class="tableSpanBorder"></span>
<el-tooltip content="详情" placement="bottom" effect="light" :visible-arrow=false>
<span class="el-icon-info editIcon" @click="detailFun(scope.$index, scope.row)"></span>
<el-tooltip
content="详情"
placement="bottom"
effect="light"
:visible-arrow="false"
>
<span
class="el-icon-info editIcon"
@click="detailFun(scope.$index, scope.row)"
></span>
</el-tooltip>
</template>
</el-table-column>
......@@ -131,7 +203,8 @@
:current-page="page"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:total="total">
:total="total"
>
</el-pagination>
<div style="clear: both;"></div>
</div>
......@@ -141,21 +214,30 @@
top="12vh"
:visible.sync="detailVisible"
class="detailDialog"
width="800px">
width="800px"
>
<div style="position: relative;padding: 10px 20px;">
<!-- <div class="leftArrow" @click="leftFun"><i class="el-icon-d-arrow-left"></i></div> -->
<div class="detaiCon">
<el-image style="width: 100%;" :src="this.detailImg">
<div slot="error" class="image-slot">
<img :src="carImg" alt="" style="width: 40%;display: block;margin: 0 auto;">
<img
:src="carImg"
alt=""
style="width: 40%;display: block;margin: 0 auto;"
/>
</div>
</el-image>
<el-form label-width="80px" inline>
<el-form-item label="经过日期:">
<span>{{ detailObj.shoot_date ? detailObj.shoot_date : '' }}</span>
<span>{{
detailObj.shoot_date ? detailObj.shoot_date : ""
}}</span>
</el-form-item>
<el-form-item label="经过时间:">
<span>{{ detailObj.shoot_time ? detailObj.shoot_time : '' }}</span>
<span>{{
detailObj.shoot_time ? detailObj.shoot_time : ""
}}</span>
</el-form-item>
<el-form-item label="事件类型:">
<span>{{ detailObj.event_type }}</span>
......@@ -174,217 +256,237 @@
</div>
</template>
<script>
import videoDialog from '@/components/video'
export default {
data(){
let start_dt = this.$moment('2019-12-20').format('YYYY-MM-DD')+' 00:00:00';
let end_dt = this.$moment().format('YYYY-MM-DD')+' 23:59:59';
return{
detailObj:{},
carImg:require("@/assets/img/home/defaultImg.png"),
detailImg:'',
detailVisible:false,
dates:[ start_dt,end_dt ],
import videoDialog from "@/components/video";
export default {
data() {
let start_dt =
this.$moment("2019-12-20").format("YYYY-MM-DD") + " 00:00:00";
let end_dt = this.$moment().format("YYYY-MM-DD") + " 23:59:59";
return {
detailObj: {},
carImg: require("@/assets/img/home/defaultImg.png"),
detailImg: "",
detailVisible: false,
dates: [start_dt, end_dt],
conditions: {
start_dt:start_dt,
end_dt:end_dt,
type: '',
task_id:'',
subtask_id:'',
location_code:'',
event_cate:'安防事件'
start_dt: start_dt,
end_dt: end_dt,
type: "",
task_id: "",
subtask_id: "",
location_code: "",
event_cate: "安防事件"
},
tableData:[],
loading:false,
formattterData:[],
total:0,
page:1,
pageSize:30,
selectcheck:[],
currentIndex:0,
cateList:JSON.parse(window.localStorage.getItem('cate列表')),
eventList:JSON.parse(window.localStorage.getItem('安防事件')),
playurl:'',
taskList:[],
subTaskList:[],
tableHeight:window.twoSearchTableHeight,
}
tableData: [],
loading: false,
formattterData: [],
total: 0,
page: 1,
pageSize: 30,
selectcheck: [],
currentIndex: 0,
cateList: JSON.parse(window.localStorage.getItem("cate列表")) || [],
eventList: JSON.parse(window.localStorage.getItem("安防事件")) || [],
playurl: "",
taskList: [],
subTaskList: [],
tableHeight: window.twoSearchTableHeight
};
},
watch:{
dates(val){
this.conditions.start_dt=val[0];
this.conditions.end_dt=val[1];
watch: {
dates(val) {
this.conditions.start_dt = val[0];
this.conditions.end_dt = val[1];
}
},
components:{
components: {
videoDialog
},
mounted(){
mounted() {
this.getTaskList();
this.getData()
this.getData();
},
methods:{
indexFormatter(row, column, cellValue, index){
return index+(this.page-1)*this.pageSize+1;
methods: {
indexFormatter(row, column, cellValue, index) {
return index + (this.page - 1) * this.pageSize + 1;
},
cateFormatter(row, column, cellValue, index){
let name=''
this.cateList.forEach(item=>{
if(item.code==cellValue){
name=item.name
cateFormatter(row, column, cellValue, index) {
let name = "";
this.cateList.forEach(item => {
if (item.code == cellValue) {
name = item.name;
}
})
});
return name;
},
getTaskList(){
this.$api.task.getTask({
getTaskList() {
this.$api.task
.getTask({
source_type: "pull_video_stream",
task_type: "normal"
}).then(res=>{
this.taskList=res.list_data;
this.taskList.unshift({
task_id:'',
task_name:'全部'
})
})
.then(res => {
this.taskList = res.list_data;
this.taskList.unshift({
task_id: "",
task_name: "全部"
});
});
},
getSubTask(){
getSubTask() {
this.$api.task.getSubTask(this.conditions.task_id).then(res => {
if(res.list_data==null){
this.subTaskList=[];
}else{
if (res.list_data == null) {
this.subTaskList = [];
} else {
this.subTaskList = res.list_data;
}
this.subTaskList.unshift({
subtask_id:'',
subtask_name:'全部'
})
this.conditions.subtask_id='';
})
subtask_id: "",
subtask_name: "全部"
});
this.conditions.subtask_id = "";
});
},
cateChange(){
let name=this.conditions.event_cate;
this.type = '';
cateChange() {
let name = this.conditions.event_cate;
this.type = "";
this.eventList = JSON.parse(window.localStorage.getItem(name));
},
exportFun(){
let cate='';
if(this.conditions.event_cate!='安防事件'){
cate=this.conditions.event_cate
exportFun() {
let cate = "";
if (this.conditions.event_cate != "安防事件") {
cate = this.conditions.event_cate;
}
let url=
process.env.VUE_APP_URL+
"/api/v1/behavior/events/export?s=" + Math.random()+
'&event_dt__gte='+ this.$moment(this.conditions.start_dt).utc().format('YYYY-MM-DD HH:mm:ss') +
'&event_dt__lt='+this.$moment(this.conditions.end_dt).utc().format('YYYY-MM-DD HH:mm:ss') +
'&task_id='+this.conditions.task_id+
'&subtask_id='+this.conditions.subtask_id+
'&location_code__like='+this.conditions.location_code ? this.conditions.location_code.replace(/\s\s*/g, '') : this.conditions.location_code+
'&event_type='+this.conditions.type+
'&event_cate='+cate;
window.open(
encodeURI(url)
);
let url =
process.env.VUE_APP_URL +
"/api/v1/behavior/events/export?s=" +
Math.random() +
"&event_dt__gte=" +
this.$moment(this.conditions.start_dt)
.utc()
.format("YYYY-MM-DD HH:mm:ss") +
"&event_dt__lt=" +
this.$moment(this.conditions.end_dt)
.utc()
.format("YYYY-MM-DD HH:mm:ss") +
"&task_id=" +
this.conditions.task_id +
"&subtask_id=" +
this.conditions.subtask_id +
"&location_code__like=" +
this.conditions.location_code
? this.conditions.location_code.replace(/\s\s*/g, "")
: this.conditions.location_code +
"&event_type=" +
this.conditions.type +
"&event_cate=" +
cate;
window.open(encodeURI(url));
},
leftFun(){
if(this.currentIndex-1<0){
leftFun() {
if (this.currentIndex - 1 < 0) {
this.$message({
message: '目前为第一条',
type: 'warning'
message: "目前为第一条",
type: "warning"
});
return false;
}
this.detailObj=this.formattterData[this.currentIndex-1];
this.currentIndex-=1;
this.detailObj = this.formattterData[this.currentIndex - 1];
this.currentIndex -= 1;
this.getImg(this.detailObj.pics[0].pic_unid);
},
rightFun(){
if(this.currentIndex==this.formattterData.length-1){
rightFun() {
if (this.currentIndex == this.formattterData.length - 1) {
this.$message({
message: '目前为最后一条',
type: 'warning'
message: "目前为最后一条",
type: "warning"
});
return false;
}
this.detailObj=this.formattterData[this.currentIndex+1];
this.currentIndex+=1;
this.detailObj = this.formattterData[this.currentIndex + 1];
this.currentIndex += 1;
this.getImg(this.detailObj.pics[0].pic_unid);
},
handleSelectionChange(obj){
handleSelectionChange(obj) {
this.selectcheck = [];
obj.forEach(item => {
this.selectcheck.push(item.id)
this.selectcheck.push(item.id);
});
},
handleSizeChange(val) {
this.pageSize=val;
this.pageSize = val;
this.getData();
},
handleCurrentChange(val) {
this.page=val;
this.page = val;
this.getData();
},
query(){
query() {
this.getData();
},
getData(){
this.loading=true;
this.formattterData=[];
getData() {
this.loading = true;
this.formattterData = [];
let offset = (this.page - 1) * this.pageSize;
let search_params = {
limit: this.pageSize,
offset: offset,
task_id:this.conditions.task_id,
subtask_id:this.conditions.subtask_id,
location_code__like: this.conditions.location_code ? this.conditions.location_code.replace(/\s\s*/g, '') : this.conditions.location_code,
task_id: this.conditions.task_id,
subtask_id: this.conditions.subtask_id,
location_code__like: this.conditions.location_code
? this.conditions.location_code.replace(/\s\s*/g, "")
: this.conditions.location_code,
event_type: this.conditions.type,
event_dt__gte: this.$moment(this.conditions.start_dt).utc().format('YYYY-MM-DD HH:mm:ss'),
event_dt__lt:this.$moment(this.conditions.end_dt).utc().format('YYYY-MM-DD HH:mm:ss')
}
if(this.conditions.event_cate=="安防事件"){
search_params.event_cate='';
}else{
search_params.event_cate=this.conditions.event_cate;
event_dt__gte: this.$moment(this.conditions.start_dt)
.utc()
.format("YYYY-MM-DD HH:mm:ss"),
event_dt__lt: this.$moment(this.conditions.end_dt)
.utc()
.format("YYYY-MM-DD HH:mm:ss")
};
if (this.conditions.event_cate == "安防事件") {
search_params.event_cate = "";
} else {
search_params.event_cate = this.conditions.event_cate;
}
this.$api.search.eventTableList(search_params
).then((res)=>{
this.total=res.total_num;
res.list_data.forEach((item,index)=>{
this.$api.search
.eventTableList(search_params)
.then(res => {
this.total = res.total_num;
res.list_data.forEach((item, index) => {
this.formattterData.push(this.$buildCode.init(item));
});
this.loading = false;
})
this.loading=false;
}).catch((err)=>{
})
.catch(err => {});
},
getImg(unid){
this.$api.search.detailImg({
},unid).then(res=>{
this.detailImg=res.pic_url ? res.pic_url : carImg;
}).catch(e=>{
getImg(unid) {
this.$api.search
.detailImg({}, unid)
.then(res => {
this.detailImg = res.pic_url ? res.pic_url : carImg;
})
.catch(e => {});
},
playFun(index,row){
if(!row.video) {
return
playFun(index, row) {
if (!row.video) {
return;
}
var play_url = '';
if(row.video) {
play_url = row.video[0].src_url
var play_url = "";
if (row.video) {
play_url = row.video[0].src_url;
}
this.$refs.visableDialog.playvideos(play_url);
},
detailFun(index,row){
this.currentIndex=index;
if(row.pics.length>0){
this.detailObj = Object.assign({},row);
detailFun(index, row) {
this.currentIndex = index;
if (row.pics.length > 0) {
this.detailObj = Object.assign({}, row);
this.getImg(row.pics[0].pic_unid);
}
this.detailVisible=true;
this.detailVisible = true;
}
},
}
};
</script>
<style lang="scss" scoped>
</style>
\ No newline at end of file
<style lang="scss" scoped></style>
......@@ -4,52 +4,116 @@
<el-form ref="form" label-width="80px" inline>
<el-form-item label="任务名称">
<span class="selectBox">
<el-select placeholder="请选择" :popper-append-to-body=false v-model="conditions.task_id" @change="getSubTask">
<el-option v-for='item in taskList' :value="item.task_id" :key="item.task_id" :label='item.task_name'></el-option>
<el-select
filterable
placeholder="请选择"
:popper-append-to-body="false"
v-model="conditions.task_id"
@change="getSubTask"
>
<el-option
v-for="item in taskList"
:value="item.task_id"
:key="item.task_id"
:label="item.task_name"
></el-option>
</el-select>
</span>
</el-form-item>
<el-form-item label="视频名称">
<span class="selectBox">
<el-select placeholder="请选择" :popper-append-to-body=false v-model="conditions.subtask_id">
<el-option v-for='item in subTaskList' :value="item.subtask_id" :key="item.subtask_id" :label='item.subtask_name'></el-option>
<el-select
filterable
placeholder="请选择"
:popper-append-to-body="false"
v-model="conditions.subtask_id"
>
<el-option
v-for="item in subTaskList"
:value="item.subtask_id"
:key="item.subtask_id"
:label="item.subtask_name"
></el-option>
</el-select>
</span>
</el-form-item>
<el-form-item label="车牌号码">
<span class="inputBox">
<el-input placeholder="请输入车牌号码" v-model="conditions.plate"></el-input>
<el-input
placeholder="请输入车牌号码"
v-model="conditions.plate"
></el-input>
</span>
</el-form-item>
<el-form-item label="车牌颜色">
<span class="selectBox">
<el-select placeholder="请选择" :popper-append-to-body=false v-model="conditions.plate_color" >
<el-option value="" label='全部'></el-option>
<el-option v-for='item in plateColorList' :value="item.code" :key="item.code" :label='item.name'></el-option>
<el-select
filterable
placeholder="请选择"
:popper-append-to-body="false"
v-model="conditions.plate_color"
>
<el-option value="" label="全部"></el-option>
<el-option
v-for="item in plateColorList"
:value="item.code"
:key="item.code"
:label="item.name"
></el-option>
</el-select>
</span>
</el-form-item>
<el-form-item label="车辆类型">
<span class="selectBox">
<el-select placeholder="请选择" :popper-append-to-body=false v-model="conditions.car_type" >
<el-option value="" label='全部'></el-option>
<el-option v-for='item in vehicleTypeList' :value="item.code" :key="item.code" :label='item.name'></el-option>
<el-select
filterable
placeholder="请选择"
:popper-append-to-body="false"
v-model="conditions.car_type"
>
<el-option value="" label="全部"></el-option>
<el-option
v-for="item in vehicleTypeList"
:value="item.code"
:key="item.code"
:label="item.name"
></el-option>
</el-select>
</span>
</el-form-item>
<el-form-item label="车辆颜色">
<span class="selectBox">
<el-select placeholder="请选择" :popper-append-to-body=false v-model="conditions.car_color">
<el-option value="" label='全部'></el-option>
<el-option v-for='item in vehicleColorList' :value="item.code" :key="item.code" :label='item.name'></el-option>
<el-select
filterable
placeholder="请选择"
:popper-append-to-body="false"
v-model="conditions.car_color"
>
<el-option value="" label="全部"></el-option>
<el-option
v-for="item in vehicleColorList"
:value="item.code"
:key="item.code"
:label="item.name"
></el-option>
</el-select>
</span>
</el-form-item>
<el-form-item label="违法类型">
<span class="selectBox">
<el-select placeholder="请选择" :popper-append-to-body=false v-model="conditions.illegal">
<el-option value="all" label='全部'></el-option>
<el-option v-for='item in illegalList' :value="item.code" :key="item.code" :label='item.name'></el-option>
<el-select
filterable
placeholder="请选择"
:popper-append-to-body="false"
v-model="conditions.illegal"
>
<el-option value="all" label="全部"></el-option>
<el-option
v-for="item in illegalList"
:value="item.code"
:key="item.code"
:label="item.name"
></el-option>
</el-select>
</span>
</el-form-item>
......@@ -63,7 +127,8 @@
type="datetimerange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期">
end-placeholder="结束日期"
>
</el-date-picker>
</span>
</el-form-item>
......@@ -71,11 +136,17 @@
</el-col>
<el-col :span="2">
<div style="margin-bottom: 6px;padding-top: 3px;">
<el-button type="primary" style="" @click="query" class="block">查询</el-button>
<el-button type="success" class="block compatibleBtn" @click="exportFun">导出</el-button>
<el-button type="primary" style="" @click="query" class="block"
>查询</el-button
>
<el-button type="success" class="block compatibleBtn" @click="exportFun"
>导出</el-button
>
</div>
<div>
<el-button type="success" class="block" @click="batchdel">批量删除</el-button>
<el-button type="success" class="block" @click="batchdel"
>批量删除</el-button
>
</div>
</el-col>
<div style="">
......@@ -85,77 +156,99 @@
v-loading="loading"
stripe
border
@selection-change="handleSelectionChange">
<el-table-column
type="selection"
align="center"
width="55">
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" align="center" width="55">
</el-table-column>
<el-table-column
prop="index"
align="center"
label="#"
:formatter="indexFormatter"
width="50">
width="50"
>
</el-table-column>
<el-table-column
prop="vehicle_plate_text"
align="center"
label="车牌号码">
label="车牌号码"
>
</el-table-column>
<el-table-column
prop="vehicle_body_type_text"
align="center"
label="车辆类型">
label="车辆类型"
>
</el-table-column>
<el-table-column
prop="vehicle_body_logo_text"
align="center"
label="车辆品牌">
label="车辆品牌"
>
</el-table-column>
<el-table-column
prop="vehicle_body_color_text"
align="center"
label="车身颜色">
label="车身颜色"
>
</el-table-column>
<el-table-column
prop="plate_color_text"
align="center"
label="车牌颜色">
label="车牌颜色"
>
</el-table-column>
<el-table-column
prop="illegalType"
align="center"
label="违法类型">
<el-table-column prop="illegalType" align="center" label="违法类型">
</el-table-column>
<el-table-column
prop="shoot_date"
align="center"
label="违法日期">
<el-table-column prop="shoot_date" align="center" label="违法日期">
<template slot-scope="scope">
<span>{{scope.row.shoot_date}} {{scope.row.shoot_time}}</span>
<span>{{ scope.row.shoot_date }} {{ scope.row.shoot_time }}</span>
</template>
</el-table-column>
<el-table-column
prop="location_name"
align="center"
label="抓拍地点">
<el-table-column prop="location_name" align="center" label="抓拍地点">
</el-table-column>
<el-table-column
align="center"
width="150"
label="操作">
<el-table-column align="center" width="150" label="操作">
<template slot-scope="scope">
<el-tooltip content="播放" placement="bottom" effect="light" :visible-arrow=false>
<span :class="{'iconfont icon-bofang playIcon':true,'no-btn':scope.row.video&&scope.row.video[0].src_url!=''?false:true}" @click="playFun(scope.$index, scope.row)"></span>
<el-tooltip
content="播放"
placement="bottom"
effect="light"
:visible-arrow="false"
>
<span
:class="{
'iconfont icon-fanxing-qidong playIcon': true,
'no-btn':
scope.row.video && scope.row.video[0].src_url != ''
? false
: true
}"
@click="playFun(scope.$index, scope.row)"
></span>
</el-tooltip>
<span class="tableSpanBorder"></span>
<el-tooltip content="详情" placement="bottom" effect="light" :visible-arrow=false>
<span class="el-icon-info editIcon" @click="detailFun(scope.$index, scope.row)"></span>
<el-tooltip
content="详情"
placement="bottom"
effect="light"
:visible-arrow="false"
>
<span
class="el-icon-info editIcon"
@click="detailFun(scope.$index, scope.row)"
></span>
</el-tooltip>
<span class="tableSpanBorder"></span>
<el-tooltip content="删除" placement="bottom" effect="light" :visible-arrow=false>
<span class="el-icon-delete delIcon" @click="delFun(scope.$index, scope.row)"></span>
<el-tooltip
content="删除"
placement="bottom"
effect="light"
:visible-arrow="false"
>
<span
class="el-icon-delete delIcon"
@click="delFun(scope.$index, scope.row)"
></span>
</el-tooltip>
</template>
</el-table-column>
......@@ -171,7 +264,8 @@
:current-page="page"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:total="total">
:total="total"
>
</el-pagination>
<div style="clear: both;"></div>
</div>
......@@ -181,13 +275,22 @@
top="12vh"
:visible.sync="detailVisible"
class="detailDialog"
width="1000px">
width="1000px"
>
<div style="position: relative;padding: 10px 20px;">
<!-- <div class="leftArrow" @click="leftFun"><i class="el-icon-d-arrow-left"></i></div> -->
<div class="detaiCon">
<el-image style="width: 60%;display: block;margin: 0 auto;" :src="this.detailImg" :preview-src-list="srcList">
<el-image
style="width: 60%;display: block;margin: 0 auto;"
:src="this.detailImg"
:preview-src-list="srcList"
>
<div slot="error" class="image-slot">
<img :src="carImg" alt="" style="width: 40%;display: block;margin: 0 auto;">
<img
:src="carImg"
alt=""
style="width: 40%;display: block;margin: 0 auto;"
/>
</div>
</el-image>
<el-form label-width="90px" inline>
......@@ -195,10 +298,14 @@
<span>{{ detailObj.vehicle_plate_text }}</span>
</el-form-item>
<el-form-item label="经过日期:">
<span>{{ detailObj.shoot_date ? detailObj.shoot_date : '' }}</span>
<span>{{
detailObj.shoot_date ? detailObj.shoot_date : ""
}}</span>
</el-form-item>
<el-form-item label="经过时间:">
<span>{{ detailObj.shoot_time ? detailObj.shoot_time : '' }}</span>
<span>{{
detailObj.shoot_time ? detailObj.shoot_time : ""
}}</span>
</el-form-item>
<el-form-item label="经过地点:">
<span>{{ detailObj.location_name }}</span>
......@@ -226,7 +333,9 @@
<!-- <div class="rightArrow" @click="rightFun"><i class="el-icon-d-arrow-right"></i></div> -->
</div>
<span slot="footer" class="dialog-footer">
<el-button type="danger" @click="detailDel" class="leftButton">删 除</el-button>
<el-button type="danger" @click="detailDel" class="leftButton"
>删 除</el-button
>
<el-button type="primary" @click="leftFun">上一条</el-button>
<el-button type="primary" @click="rightFun">下一条</el-button>
<el-button @click="detailVisible = false">关 闭</el-button>
......@@ -236,287 +345,321 @@
</div>
</template>
<script>
import videoDialog from '@/components/video'
export default {
data(){
let start_dt = this.$moment('2019-12-20').format('YYYY-MM-DD')+' 00:00:00';
let end_dt = this.$moment().format('YYYY-MM-DD')+' 23:59:59';
return{
loading:false,
playurl:'',
detailObj:{},
carImg:require("@/assets/img/home/defaultImg.png"),
detailImg:'',
import videoDialog from "@/components/video";
export default {
data() {
let start_dt =
this.$moment("2019-12-20").format("YYYY-MM-DD") + " 00:00:00";
let end_dt = this.$moment().format("YYYY-MM-DD") + " 23:59:59";
return {
loading: false,
playurl: "",
detailObj: {},
carImg: require("@/assets/img/home/defaultImg.png"),
detailImg: "",
srcList: [],
detailVisible:false,
dates:[ start_dt,end_dt ],
detailVisible: false,
dates: [start_dt, end_dt],
conditions: {
start_dt:start_dt,
end_dt:end_dt,
task_id:'',
subtask_id:'',
plate:'',
plate_color:'',
car_type: '',
car_color: '',
illegal:'all',
source_type: 'pull_video_stream',
is_key_vehicle:false,
start_dt: start_dt,
end_dt: end_dt,
task_id: "",
subtask_id: "",
plate: "",
plate_color: "",
car_type: "",
car_color: "",
illegal: "all",
source_type: "pull_video_stream",
is_key_vehicle: false
},
brandList:this.$buildCode.getCodeList('车辆品牌'),
vehicleTypeList:this.$buildCode.getCodeList('车辆类型'),
vehicleColorList:this.$buildCode.getCodeList('车身颜色'),
illegalList:this.$buildCode.getCodeList('违法类型'),
plateColorList:this.$buildCode.getCodeList('号牌颜色'),
tableData:[],
formatterData:[],
total:0,
page:1,
pageSize:30,
selectcheck:[],
currentIndex:0,
taskList:[],
subTaskList:[],
tableHeight:window.twoSearchTableHeight,
}
brandList: this.$buildCode.getCodeList("车辆品牌"),
vehicleTypeList: this.$buildCode.getCodeList("车辆类型"),
vehicleColorList: this.$buildCode.getCodeList("车身颜色"),
illegalList: this.$buildCode.getCodeList("违法类型"),
plateColorList: this.$buildCode.getCodeList("号牌颜色"),
tableData: [],
formatterData: [],
total: 0,
page: 1,
pageSize: 30,
selectcheck: [],
currentIndex: 0,
taskList: [],
subTaskList: [],
tableHeight: window.twoSearchTableHeight
};
},
watch:{
dates(val){
this.conditions.start_dt=val[0];
this.conditions.end_dt=val[1];
watch: {
dates(val) {
this.conditions.start_dt = val[0];
this.conditions.end_dt = val[1];
}
},
components:{videoDialog},
mounted(){
components: { videoDialog },
mounted() {
this.getTaskList();
this.getData()
this.getData();
},
methods:{
indexFormatter(row, column, cellValue, index){
return index+(this.page-1)*this.pageSize+1;
methods: {
indexFormatter(row, column, cellValue, index) {
return index + (this.page - 1) * this.pageSize + 1;
},
getTaskList(){
this.$api.task.getTask({
getTaskList() {
this.$api.task
.getTask({
source_type: "pull_video_stream",
task_type: "normal"
}).then(res=>{
this.taskList=res.list_data;
this.taskList.unshift({
task_id:'',
task_name:'全部'
})
})
.then(res => {
this.taskList = res.list_data;
this.taskList.unshift({
task_id: "",
task_name: "全部"
});
});
},
getSubTask(){
getSubTask() {
this.$api.task.getSubTask(this.conditions.task_id).then(res => {
if(res.list_data==null){
this.subTaskList=[];
}else{
if (res.list_data == null) {
this.subTaskList = [];
} else {
this.subTaskList = res.list_data;
}
this.subTaskList.unshift({
subtask_id:'',
subtask_name:'全部'
})
this.conditions.subtask_id='';
})
subtask_id: "",
subtask_name: "全部"
});
this.conditions.subtask_id = "";
});
},
playFun(index,row){
if(!row.video) {
return
playFun(index, row) {
if (!row.video) {
return;
}
var play_url = '';
if(row.video) {
play_url = row.video[0].src_url
var play_url = "";
if (row.video) {
play_url = row.video[0].src_url;
}
this.$refs.visableDialog.playvideos(play_url);
},
exportFun(){
window.open(encodeURI(process.env.VUE_APP_URL +
'/api/v1/traffic/events/export?s=' + Math.random()+
'&event_type=&event_dt__gte='+this.$moment(this.conditions.start_dt).utc().format('YYYY-MM-DD HH:mm:ss')+
'&event_dt__lt='+this.$moment(this.conditions.end_dt).utc().format('YYYY-MM-DD HH:mm:ss')+
'&source_type='+this.conditions.source_type+
'&task_id='+this.conditions.task_id+
'&subtask_id='+this.conditions.subtask_id+
'&plate_number__like='+this.conditions.plate+
'&plate_color='+this.conditions.plate_color+
'&vehicle_type='+this.conditions.car_type+
'&body_color='+this.conditions.car_color+
'&is_key_vehicle='+this.conditions.is_key_vehicle+
'&illegal_code='+this.conditions.illegal))
exportFun() {
window.open(
encodeURI(
process.env.VUE_APP_URL +
"/api/v1/traffic/events/export?s=" +
Math.random() +
"&event_type=&event_dt__gte=" +
this.$moment(this.conditions.start_dt)
.utc()
.format("YYYY-MM-DD HH:mm:ss") +
"&event_dt__lt=" +
this.$moment(this.conditions.end_dt)
.utc()
.format("YYYY-MM-DD HH:mm:ss") +
"&source_type=" +
this.conditions.source_type +
"&task_id=" +
this.conditions.task_id +
"&subtask_id=" +
this.conditions.subtask_id +
"&plate_number__like=" +
this.conditions.plate +
"&plate_color=" +
this.conditions.plate_color +
"&vehicle_type=" +
this.conditions.car_type +
"&body_color=" +
this.conditions.car_color +
"&is_key_vehicle=" +
this.conditions.is_key_vehicle +
"&illegal_code=" +
this.conditions.illegal
)
);
},
batchdel(){
if(this.selectcheck.length==0){
batchdel() {
if (this.selectcheck.length == 0) {
this.$message({
message: '请选择至少一条记录',
type: 'warning'
message: "请选择至少一条记录",
type: "warning"
});
return false
return false;
}
this.$confirm('此操作将永久删除选中记录, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
this.$confirm("此操作将永久删除选中记录, 是否继续?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$api.search.patchdel({
"event_unids":this.selectcheck
}).then(res=>{
if(res.ecode == '200'){
this.$api.search
.patchdel({
event_unids: this.selectcheck
})
.then(res => {
if (res.ecode == "200") {
this.$message({
type: 'success',
message: '删除成功!'
type: "success",
message: "删除成功!"
});
this.getData();
}else{
this.$message.error('删除失败!');
} else {
this.$message.error("删除失败!");
}
})
})
});
});
},
leftFun(){
if(this.currentIndex-1<0){
leftFun() {
if (this.currentIndex - 1 < 0) {
this.$message({
message: '目前为第一条',
type: 'warning'
message: "目前为第一条",
type: "warning"
});
return false;
}
this.detailObj=this.formatterData[this.currentIndex-1];
this.currentIndex-=1;
this.detailObj = this.formatterData[this.currentIndex - 1];
this.currentIndex -= 1;
this.getImg(this.detailObj.pics[0].pic_unid);
},
rightFun(){
if(this.currentIndex==this.formatterData.length-1){
rightFun() {
if (this.currentIndex == this.formatterData.length - 1) {
this.$message({
message: '目前为最后一条',
type: 'warning'
message: "目前为最后一条",
type: "warning"
});
return false;
}
this.detailObj=this.formatterData[this.currentIndex+1];
this.currentIndex+=1;
this.detailObj = this.formatterData[this.currentIndex + 1];
this.currentIndex += 1;
this.getImg(this.detailObj.pics[0].pic_unid);
},
handleSelectionChange(obj){
handleSelectionChange(obj) {
this.selectcheck = [];
obj.forEach(item => {
this.selectcheck.push(item.id)
this.selectcheck.push(item.id);
});
},
handleSizeChange(val) {
this.pageSize=val;
this.pageSize = val;
this.getData();
},
handleCurrentChange(val) {
this.page=val;
this.page = val;
this.getData();
},
query(){
query() {
this.getData();
},
getData(){
this.loading=true;
this.formatterData=[];
getData() {
this.loading = true;
this.formatterData = [];
let offset = (this.page - 1) * this.pageSize;
let search_params = {
limit: this.pageSize,
offset: offset,
event_dt__gte: this.$moment(this.conditions.start_dt).utc().format('YYYY-MM-DD HH:mm:ss'),
event_dt__lt:this.$moment(this.conditions.end_dt).utc().format('YYYY-MM-DD HH:mm:ss'),
task_id:this.conditions.task_id,
subtask_id:this.conditions.subtask_id,
event_dt__gte: this.$moment(this.conditions.start_dt)
.utc()
.format("YYYY-MM-DD HH:mm:ss"),
event_dt__lt: this.$moment(this.conditions.end_dt)
.utc()
.format("YYYY-MM-DD HH:mm:ss"),
task_id: this.conditions.task_id,
subtask_id: this.conditions.subtask_id,
plate_number__like: this.conditions.plate,
plate_color:this.conditions.plate_color,
plate_color: this.conditions.plate_color,
vehicle_type: this.conditions.car_type,
body_color: this.conditions.car_color,
illegal_code:this.conditions.illegal,
illegal_code: this.conditions.illegal,
source_type: this.conditions.source_type,
is_key_vehicle:this.conditions.is_key_vehicle,
event_type: '',
}
this.$api.search.tableList(search_params
).then((res)=>{
this.total=res.total_num;
res.list_data.forEach((item,index)=>{
is_key_vehicle: this.conditions.is_key_vehicle,
event_type: ""
};
this.$api.search
.tableList(search_params)
.then(res => {
this.total = res.total_num;
res.list_data.forEach((item, index) => {
this.formatterData.push(this.$buildCode.init(item));
});
this.loading = false;
})
this.loading=false;
}).catch((err)=>{
})
.catch(err => {});
},
getImg(unid){
this.srcList=[];
this.$api.search.detailImg({
},unid).then(res=>{
this.detailImg=res.pic_url ? res.pic_url : carImg;
this.srcList.push(this.detailImg)
}).catch(e=>{
getImg(unid) {
this.srcList = [];
this.$api.search
.detailImg({}, unid)
.then(res => {
this.detailImg = res.pic_url ? res.pic_url : carImg;
this.srcList.push(this.detailImg);
})
.catch(e => {});
},
detailFun(index,row){
this.currentIndex=index;
if(row.pics.length>0){
this.detailObj = Object.assign({},row);
detailFun(index, row) {
this.currentIndex = index;
if (row.pics.length > 0) {
this.detailObj = Object.assign({}, row);
this.getImg(row.pics[0].pic_unid);
}
this.detailVisible=true;
this.detailVisible = true;
},
delFun(index,row){
this.$confirm('此操作将永久删除该记录, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
delFun(index, row) {
this.$confirm("此操作将永久删除该记录, 是否继续?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$api.search.delVehicle({
},row.id).then(res=>{
if(res.ecode==200){
this.$api.search
.delVehicle({}, row.id)
.then(res => {
if (res.ecode == 200) {
this.formatterData.splice(index);
this.$message({
type: 'success',
message: '删除成功!'
type: "success",
message: "删除成功!"
});
}else{
this.$message.error('删除失败!');
this.getData();
} else {
this.$message.error("删除失败!");
}
}).catch(e=>{
this.$message.error('删除失败!');
})
})
.catch(e => {
this.$message.error("删除失败!");
});
});
},
detailDel(){
this.$confirm('此操作将永久删除该记录, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
detailDel() {
this.$confirm("此操作将永久删除该记录, 是否继续?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$api.search.delVehicle({},this.detailObj.id).then(res=>{
if(res.ecode==200){
this.formatterData.splice(this.currentIndex,1);
this.detailObj = Object.assign({},this.formatterData[this.currentIndex]);
this.getImg(this.formatterData[this.currentIndex].pics[0].pic_unid);
this.$api.search
.delVehicle({}, this.detailObj.id)
.then(res => {
if (res.ecode == 200) {
this.formatterData.splice(this.currentIndex, 1);
this.detailObj = Object.assign(
{},
this.formatterData[this.currentIndex]
);
this.getImg(
this.formatterData[this.currentIndex].pics[0].pic_unid
);
this.$message({
type: 'success',
message: '删除成功!'
type: "success",
message: "删除成功!"
});
}else{
this.$message.error('删除失败!');
} else {
this.$message.error("删除失败!");
}
}).catch(e=>{
this.$message.error('删除失败!');
})
})
.catch(e => {
this.$message.error("删除失败!");
});
});
}
},
}
};
</script>
<style lang="scss" scoped>
</style>
\ No newline at end of file
<style lang="scss" scoped></style>
......@@ -2,28 +2,57 @@
<div class="innnerBox">
<el-col :span="22">
<el-form ref="form" label-width="80px" inline>
<el-form-item label="抓拍地点" >
<el-form-item label="抓拍地点">
<span class="inputBox">
<el-input placeholder="请输入抓拍地点" v-model="conditions.location_name"></el-input>
<el-input
placeholder="请输入抓拍地点"
v-model="conditions.location_name"
></el-input>
</span>
</el-form-item>
<el-form-item label="任务名称">
<span class="selectBox">
<el-select placeholder="请选择" :popper-append-to-body=false v-model="conditions.task_id" @change="getSubTask">
<el-option v-for='item in taskList' :value="item.task_id" :key="item.task_id" :label='item.task_name'></el-option>
<el-select
placeholder="请选择"
:popper-append-to-body="false"
v-model="conditions.task_id"
@change="getSubTask"
filterable
>
<el-option
v-for="item in taskList"
:value="item.task_id"
:key="item.task_id"
:label="item.task_name"
></el-option>
</el-select>
</span>
</el-form-item>
<el-form-item label="相机名称">
<span class="selectBox">
<el-select placeholder="请选择" :popper-append-to-body=false v-model="conditions.subtask_id">
<el-option v-for='item in subTaskList' :value="item.subtask_id" :key="item.subtask_id" :label='item.subtask_name'></el-option>
<el-select
placeholder="请选择"
:popper-append-to-body="false"
v-model="conditions.subtask_id"
filterable
>
<el-option
v-for="item in subTaskList"
:value="item.subtask_id"
:key="item.subtask_id"
:label="item.subtask_name"
></el-option>
</el-select>
</span>
</el-form-item>
<el-form-item label="性别">
<span class="selectBox">
<el-select placeholder="请选择" :popper-append-to-body=false v-model="conditions.sex">
<el-select
placeholder="请选择"
:popper-append-to-body="false"
v-model="conditions.sex"
filterable
>
<el-option value="" label="全部"></el-option>
<el-option value="1" label="男"></el-option>
<el-option value="2" label="女"></el-option>
......@@ -32,17 +61,36 @@
</el-form-item>
<el-form-item label="上身颜色">
<span class="selectBox">
<el-select placeholder="请选择" :popper-append-to-body=false v-model="conditions.upbodyColor">
<el-option value="" label='全部'></el-option>
<el-option v-for='item in bodyColorList' :value="item.value" :key="item.value" :label='item.label'></el-option>
<el-select
placeholder="请选择"
:popper-append-to-body="false"
v-model="conditions.upbodyColor"
>
<el-option value="" label="全部"></el-option>
<el-option
v-for="item in bodyColorList"
:value="item.value"
:key="item.value"
:label="item.label"
></el-option>
</el-select>
</span>
</el-form-item>
<el-form-item label="下身颜色">
<span class="selectBox">
<el-select placeholder="请选择" :popper-append-to-body=false v-model="conditions.lobodyColor">
<el-option value="" label='全部'></el-option>
<el-option v-for='item in bodyColorList' :value="item.value" :key="item.value" :label='item.label'></el-option>
<el-select
placeholder="请选择"
:popper-append-to-body="false"
v-model="conditions.lobodyColor"
filterable
>
<el-option value="" label="全部"></el-option>
<el-option
v-for="item in bodyColorList"
:value="item.value"
:key="item.value"
:label="item.label"
></el-option>
</el-select>
</span>
</el-form-item>
......@@ -55,7 +103,8 @@
type="datetimerange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期">
end-placeholder="结束日期"
>
</el-date-picker>
</span>
</el-form-item>
......@@ -63,11 +112,17 @@
</el-col>
<el-col :span="2">
<div style="margin-bottom: 6px;padding-top: 3px;">
<el-button type="primary" style="" @click="query" class="block">查询</el-button>
<el-button type="success" class="block" @click="exportFun">导出</el-button>
<el-button type="primary" style="" @click="query" class="block"
>查询</el-button
>
<el-button type="success" class="block" @click="exportFun"
>导出</el-button
>
</div>
<div>
<el-button type="success" class="block" @click="batchdel">批量删除</el-button>
<el-button type="success" class="block" @click="batchdel"
>批量删除</el-button
>
</div>
</el-col>
<div style="">
......@@ -76,46 +131,43 @@
height="574"
stripe
border
@selection-change="handleSelectionChange">
<el-table-column
type="selection"
align="center"
width="55">
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" align="center" width="55">
</el-table-column>
<el-table-column
prop="driver_face_upbody_text"
align="center"
label="上身颜色">
label="上身颜色"
>
</el-table-column>
<el-table-column
prop="driver_face_lobody_text"
align="center"
label="下身颜色">
label="下身颜色"
>
</el-table-column>
<el-table-column
prop="driver_face_sex"
align="center"
label="性别">
<el-table-column prop="driver_face_sex" align="center" label="性别">
</el-table-column>
<el-table-column
prop="shoot_date"
align="center"
label="抓拍时间">
<el-table-column prop="shoot_date" align="center" label="抓拍时间">
<template slot-scope="scope">
<span>{{scope.row.shoot_date}} {{scope.row.shoot_time}}</span>
<span>{{ scope.row.shoot_date }} {{ scope.row.shoot_time }}</span>
</template>
</el-table-column>
<el-table-column
prop="location_name"
align="center"
label="抓拍地点">
<el-table-column prop="location_name" align="center" label="抓拍地点">
</el-table-column>
<el-table-column
align="center"
label="操作">
<el-table-column align="center" label="操作">
<template slot-scope="scope">
<el-tooltip content="详情" placement="bottom" effect="light" :visible-arrow=false>
<span class="el-icon-info editIcon" @click="detailFun(scope.$index, scope.row)"></span>
<el-tooltip
content="详情"
placement="bottom"
effect="light"
:visible-arrow="false"
>
<span
class="el-icon-info editIcon"
@click="detailFun(scope.$index, scope.row)"
></span>
</el-tooltip>
</template>
</el-table-column>
......@@ -131,7 +183,8 @@
:current-page="page"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:total="total">
:total="total"
>
</el-pagination>
<div style="clear: both;"></div>
</div>
......@@ -140,22 +193,33 @@
title="详情"
top="12vh"
:visible.sync="detailVisible"
width="700px">
width="700px"
>
<div style="position: relative;padding: 10px 20px;">
<div class="leftArrow" @click="leftFun"><i class="el-icon-d-arrow-left"></i></div>
<div class="leftArrow" @click="leftFun">
<i class="el-icon-d-arrow-left"></i>
</div>
<div class="detaiCon">
<el-image style="width: 100%;" :src="this.detailImg">
<div slot="error" class="image-slot">
<img :src="carImg" alt="" style="width: 40%;display: block;margin: 0 auto;">
<img
:src="carImg"
alt=""
style="width: 40%;display: block;margin: 0 auto;"
/>
</div>
</el-image>
<el-form label-width="120px" inline>
<div>
<el-form-item label="经过日期:">
<span>{{ detailObj.shoot_date ? detailObj.shoot_date : '' }}</span>
<span>{{
detailObj.shoot_date ? detailObj.shoot_date : ""
}}</span>
</el-form-item>
<el-form-item label="经过时间:">
<span>{{ detailObj.shoot_time ? detailObj.shoot_time : '' }}</span>
<span>{{
detailObj.shoot_time ? detailObj.shoot_time : ""
}}</span>
</el-form-item>
</div>
<div>
......@@ -192,259 +256,288 @@
</div>
</el-form>
</div>
<div class="rightArrow" @click="rightFun"><i class="el-icon-d-arrow-right"></i></div>
<div class="rightArrow" @click="rightFun">
<i class="el-icon-d-arrow-right"></i>
</div>
</div>
<span slot="footer" class="dialog-footer">
<!-- <el-button @click="detailDel">删 除</el-button> -->
<el-button type="primary" @click="detailVisible = false">关 闭</el-button>
<el-button type="primary" @click="detailVisible = false"
>关 闭</el-button
>
</span>
</el-dialog>
</div>
</template>
<script>
export default {
data(){
let start_dt = this.$moment('2019-12-20').format('YYYY-MM-DD')+' 00:00:00';
let end_dt = this.$moment().format('YYYY-MM-DD')+' 23:59:59';
return{
detailObj:{},
carImg:require("@/assets/img/home/defaultImg.png"),
detailImg:'',
detailVisible:false,
dates:[ start_dt,end_dt ],
export default {
data() {
let start_dt =
this.$moment("2019-12-20").format("YYYY-MM-DD") + " 00:00:00";
let end_dt = this.$moment().format("YYYY-MM-DD") + " 23:59:59";
return {
detailObj: {},
carImg: require("@/assets/img/home/defaultImg.png"),
detailImg: "",
detailVisible: false,
dates: [start_dt, end_dt],
conditions: {
start_dt:start_dt,
end_dt:end_dt,
event_type: 'pedestrian',
location_name:'',
subtask_id:null,
task_id:null,
upbodyColor: '',
lobodyColor: '',
sex:''
start_dt: start_dt,
end_dt: end_dt,
event_type: "pedestrian",
location_name: "",
subtask_id: null,
task_id: null,
upbodyColor: "",
lobodyColor: "",
sex: ""
},
bodyColorList:this.$buildCode.getCodeList('车身颜色'),
tableData:[],
formattterData:[],
total:0,
page:1,
pageSize:30,
selectcheck:[],
currentIndex:0,
taskList:[],
subTaskList:[]
}
bodyColorList: this.$buildCode.getCodeList("车身颜色"),
tableData: [],
formattterData: [],
total: 0,
page: 1,
pageSize: 30,
selectcheck: [],
currentIndex: 0,
taskList: [],
subTaskList: []
};
},
watch:{
dates(val){
this.conditions.start_dt=val[0];
this.conditions.end_dt=val[1];
watch: {
dates(val) {
this.conditions.start_dt = val[0];
this.conditions.end_dt = val[1];
}
},
components:{},
mounted(){
this.getData()
components: {},
mounted() {
this.getData();
this.getTaskList();
},
methods:{
getTaskList(){
this.$api.task.getTask({
methods: {
getTaskList() {
this.$api.task
.getTask({
source_type: "pull_video_stream",
task_type: "normal"
}).then(res=>{
this.taskList=res.list_data;
})
.then(res => {
this.taskList = res.list_data;
});
},
getSubTask(){
this.conditions.subtask_id=null;
getSubTask() {
this.conditions.subtask_id = null;
this.$api.task.getSubTask(this.conditions.task_id).then(res => {
this.subTaskList = res.list_data;
if( this.subTaskList.length>0){
this.conditions.subtask_id=this.subTaskList[0].subtask_id
if (this.subTaskList.length > 0) {
this.conditions.subtask_id = this.subTaskList[0].subtask_id;
}
})
});
},
exportFun(){
exportFun() {
window.open(
encodeURI(
process.env.VUE_APP_URL+
"/api/v1/traffic/events/export?s=" + Math.random()+
'&event_type=pedestrian&event_dt__gte='+ this.$moment(this.conditions.start_dt).utc().format('YYYY-MM-DD HH:mm:ss') +
'&event_dt__lt='+this.$moment(this.conditions.end_dt).utc().format('YYYY-MM-DD HH:mm:ss') +
'&location_name='+this.conditions.location_name+
'&task_id='+this.conditions.task_id+
'&subtask_id='+this.conditions.subtask_id+
'&upbodyColor='+this.conditions.upbodyColor+
'&lobodyColor='+this.conditions.lobodyColor+
'&sex='+this.conditions.sex
process.env.VUE_APP_URL +
"/api/v1/traffic/events/export?s=" +
Math.random() +
"&event_type=pedestrian&event_dt__gte=" +
this.$moment(this.conditions.start_dt)
.utc()
.format("YYYY-MM-DD HH:mm:ss") +
"&event_dt__lt=" +
this.$moment(this.conditions.end_dt)
.utc()
.format("YYYY-MM-DD HH:mm:ss") +
"&location_name=" +
this.conditions.location_name +
"&task_id=" +
this.conditions.task_id +
"&subtask_id=" +
this.conditions.subtask_id +
"&upbodyColor=" +
this.conditions.upbodyColor +
"&lobodyColor=" +
this.conditions.lobodyColor +
"&sex=" +
this.conditions.sex
)
);
},
batchdel(){
if(this.selectcheck.length==0){
batchdel() {
if (this.selectcheck.length == 0) {
this.$message({
message: '请选择至少一条记录',
type: 'warning'
message: "请选择至少一条记录",
type: "warning"
});
return false
return false;
}
this.$confirm('此操作将永久删除选中记录, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
this.$confirm("此操作将永久删除选中记录, 是否继续?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$api.search.patchdel({
"event_unids":this.selectcheck
}).then(res=>{
if(res.ecode == '200'){
this.$api.search
.patchdel({
event_unids: this.selectcheck
})
.then(res => {
if (res.ecode == "200") {
this.$message({
type: 'success',
message: '删除成功!'
type: "success",
message: "删除成功!"
});
this.getData();
}else{
this.$message.error('删除失败!');
} else {
this.$message.error("删除失败!");
}
})
})
});
});
},
leftFun(){
if(this.currentIndex-1<0){
leftFun() {
if (this.currentIndex - 1 < 0) {
this.$message({
message: '目前为第一条',
type: 'warning'
message: "目前为第一条",
type: "warning"
});
return false;
}
this.detailObj=this.formattterData[this.currentIndex-1];
this.currentIndex-=1;
this.detailObj = this.formattterData[this.currentIndex - 1];
this.currentIndex -= 1;
this.getImg(this.detailObj.pics[0].pic_unid);
},
rightFun(){
if(this.currentIndex==this.formattterData.length-1){
rightFun() {
if (this.currentIndex == this.formattterData.length - 1) {
this.$message({
message: '目前为最后一条',
type: 'warning'
message: "目前为最后一条",
type: "warning"
});
return false;
}
this.detailObj=this.formattterData[this.currentIndex+1];
this.currentIndex+=1;
this.detailObj = this.formattterData[this.currentIndex + 1];
this.currentIndex += 1;
this.getImg(this.detailObj.pics[0].pic_unid);
},
handleSelectionChange(obj){
handleSelectionChange(obj) {
this.selectcheck = [];
obj.forEach(item => {
this.selectcheck.push(item.id)
this.selectcheck.push(item.id);
});
},
handleSizeChange(val) {
this.pageSize=val;
this.pageSize = val;
this.getData();
},
handleCurrentChange(val) {
this.page=val;
this.page = val;
this.getData();
},
query(){
query() {
this.getData();
},
getData(){
this.formattterData=[];
getData() {
this.formattterData = [];
let offset = (this.page - 1) * this.pageSize;
let search_params = {
limit: this.pageSize,
offset: offset,
event_type: "pedestrian",
event_dt__gte: this.$moment(this.conditions.start_dt).utc().format('YYYY-MM-DD HH:mm:ss'),
event_dt__lt:this.$moment(this.conditions.end_dt).utc().format('YYYY-MM-DD HH:mm:ss'),
event_dt__gte: this.$moment(this.conditions.start_dt)
.utc()
.format("YYYY-MM-DD HH:mm:ss"),
event_dt__lt: this.$moment(this.conditions.end_dt)
.utc()
.format("YYYY-MM-DD HH:mm:ss"),
upbodyColor: this.conditions.upbodyColor,
lobodyColor: this.conditions.lobodyColor,
sex: this.conditions.sex,
task_id: this.conditions.task_id,
subtask_id: this.conditions.subtask_id,
location_name: this.conditions.location_name
}
this.$api.search.tableList(search_params
).then((res)=>{
this.total=res.total_num;
res.list_data.forEach((item,index)=>{
};
this.$api.search
.tableList(search_params)
.then(res => {
this.total = res.total_num;
res.list_data.forEach((item, index) => {
this.formattterData.push(this.$buildCode.init(item));
});
})
}).catch((err)=>{
})
.catch(err => {});
},
getImg(unid){
this.$api.search.detailImg({
},unid).then(res=>{
this.detailImg=res.pic_url ? res.pic_url : carImg;
}).catch(e=>{
getImg(unid) {
this.$api.search
.detailImg({}, unid)
.then(res => {
this.detailImg = res.pic_url ? res.pic_url : carImg;
})
.catch(e => {});
},
detailFun(index,row){
this.currentIndex=index;
if(row.pics.length>0){
this.detailObj = Object.assign({},row);
detailFun(index, row) {
this.currentIndex = index;
if (row.pics.length > 0) {
this.detailObj = Object.assign({}, row);
this.getImg(row.pics[0].pic_unid);
}
this.detailVisible=true;
this.detailVisible = true;
},
delFun(index,row){
this.$confirm('此操作将永久删除该记录, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
delFun(index, row) {
this.$confirm("此操作将永久删除该记录, 是否继续?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$api.search.delVehicle({
},row.id).then(res=>{
if(res.ecode==200){
this.$api.search
.delVehicle({}, row.id)
.then(res => {
if (res.ecode == 200) {
this.formattterData.splice(index);
this.$message({
type: 'success',
message: '删除成功!'
type: "success",
message: "删除成功!"
});
}else{
this.$message.error('删除失败!');
} else {
this.$message.error("删除失败!");
}
}).catch(e=>{
this.$message.error('删除失败!');
})
})
.catch(e => {
this.$message.error("删除失败!");
});
});
},
detailDel(){
this.$confirm('此操作将永久删除该记录, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
detailDel() {
this.$confirm("此操作将永久删除该记录, 是否继续?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$api.search.delVehicle({},this.detailObj.id).then(res=>{
if(res.ecode==200){
this.formattterData.splice(this.currentIndex,1);
this.detailObj = Object.assign({},this.formattterData[this.currentIndex]);
this.getImg(this.formattterData[this.currentIndex].pics[0].pic_unid);
this.$api.search
.delVehicle({}, this.detailObj.id)
.then(res => {
if (res.ecode == 200) {
this.formattterData.splice(this.currentIndex, 1);
this.detailObj = Object.assign(
{},
this.formattterData[this.currentIndex]
);
this.getImg(
this.formattterData[this.currentIndex].pics[0].pic_unid
);
this.$message({
type: 'success',
message: '删除成功!'
type: "success",
message: "删除成功!"
});
}else{
this.$message.error('删除失败!');
} else {
this.$message.error("删除失败!");
}
}).catch(e=>{
this.$message.error('删除失败!');
})
})
.catch(e => {
this.$message.error("删除失败!");
});
});
}
},
}
};
</script>
<style lang="scss" scoped>
</style>
\ No newline at end of file
<style lang="scss" scoped></style>
......@@ -2,28 +2,57 @@
<div class="innnerBox">
<el-col :span="22">
<el-form ref="form" label-width="80px" inline>
<el-form-item label="抓拍地点" >
<el-form-item label="抓拍地点">
<span class="inputBox">
<el-input placeholder="请输入抓拍地点" v-model="conditions.location_name"></el-input>
<el-input
placeholder="请输入抓拍地点"
v-model="conditions.location_name"
></el-input>
</span>
</el-form-item>
<el-form-item label="任务名称">
<span class="selectBox">
<el-select placeholder="请选择" :popper-append-to-body=false v-model="conditions.task_id" @change="getSubTask">
<el-option v-for='item in taskList' :value="item.task_id" :key="item.task_id" :label='item.task_name'></el-option>
<el-select
filterable
placeholder="请选择"
:popper-append-to-body="false"
v-model="conditions.task_id"
@change="getSubTask"
>
<el-option
v-for="item in taskList"
:value="item.task_id"
:key="item.task_id"
:label="item.task_name"
></el-option>
</el-select>
</span>
</el-form-item>
<el-form-item label="相机名称">
<span class="selectBox">
<el-select placeholder="请选择" :popper-append-to-body=false v-model="conditions.subtask_id">
<el-option v-for='item in subTaskList' :value="item.subtask_id" :key="item.subtask_id" :label='item.subtask_name'></el-option>
<el-select
filterable
placeholder="请选择"
:popper-append-to-body="false"
v-model="conditions.subtask_id"
>
<el-option
v-for="item in subTaskList"
:value="item.subtask_id"
:key="item.subtask_id"
:label="item.subtask_name"
></el-option>
</el-select>
</span>
</el-form-item>
<el-form-item label="性别">
<span class="selectBox">
<el-select placeholder="请选择" :popper-append-to-body=false v-model="conditions.sex">
<el-select
filterable
placeholder="请选择"
:popper-append-to-body="false"
v-model="conditions.sex"
>
<el-option value="" label="全部"></el-option>
<el-option value="1" label="男"></el-option>
<el-option value="2" label="女"></el-option>
......@@ -32,17 +61,37 @@
</el-form-item>
<el-form-item label="上身颜色">
<span class="selectBox">
<el-select placeholder="请选择" :popper-append-to-body=false v-model="conditions.upbodyColor">
<el-option value="" label='全部'></el-option>
<el-option v-for='item in bodyColorList' :value="item.value" :key="item.value" :label='item.label'></el-option>
<el-select
filterable
placeholder="请选择"
:popper-append-to-body="false"
v-model="conditions.upbodyColor"
>
<el-option value="" label="全部"></el-option>
<el-option
v-for="item in bodyColorList"
:value="item.value"
:key="item.value"
:label="item.label"
></el-option>
</el-select>
</span>
</el-form-item>
<el-form-item label="下身颜色">
<span class="selectBox">
<el-select placeholder="请选择" :popper-append-to-body=false v-model="conditions.lobodyColor">
<el-option value="" label='全部'></el-option>
<el-option v-for='item in bodyColorList' :value="item.value" :key="item.value" :label='item.label'></el-option>
<el-select
filterable
placeholder="请选择"
:popper-append-to-body="false"
v-model="conditions.lobodyColor"
>
<el-option value="" label="全部"></el-option>
<el-option
v-for="item in bodyColorList"
:value="item.value"
:key="item.value"
:label="item.label"
></el-option>
</el-select>
</span>
</el-form-item>
......@@ -55,7 +104,8 @@
type="datetimerange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期">
end-placeholder="结束日期"
>
</el-date-picker>
</span>
</el-form-item>
......@@ -63,11 +113,17 @@
</el-col>
<el-col :span="2">
<div style="margin-bottom: 6px;padding-top: 3px;">
<el-button type="primary" style="" @click="query" class="block">查询</el-button>
<el-button type="success" class="block" @click="exportFun">导出</el-button>
<el-button type="primary" style="" @click="query" class="block"
>查询</el-button
>
<el-button type="success" class="block" @click="exportFun"
>导出</el-button
>
</div>
<div>
<el-button type="success" class="block" @click="batchdel">批量删除</el-button>
<el-button type="success" class="block" @click="batchdel"
>批量删除</el-button
>
</div>
</el-col>
<div style="">
......@@ -77,46 +133,43 @@
stripe
border
v-loading="loading"
@selection-change="handleSelectionChange">
<el-table-column
type="selection"
align="center"
width="55">
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" align="center" width="55">
</el-table-column>
<el-table-column
prop="driver_face_upbody_text"
align="center"
label="上身颜色">
label="上身颜色"
>
</el-table-column>
<el-table-column
prop="driver_face_lobody_text"
align="center"
label="下身颜色">
label="下身颜色"
>
</el-table-column>
<el-table-column
prop="driver_face_sex"
align="center"
label="性别">
<el-table-column prop="driver_face_sex" align="center" label="性别">
</el-table-column>
<el-table-column
prop="shoot_date"
align="center"
label="抓拍时间">
<el-table-column prop="shoot_date" align="center" label="抓拍时间">
<template slot-scope="scope">
<span>{{scope.row.shoot_date}} {{scope.row.shoot_time}}</span>
<span>{{ scope.row.shoot_date }} {{ scope.row.shoot_time }}</span>
</template>
</el-table-column>
<el-table-column
prop="location_name"
align="center"
label="抓拍地点">
<el-table-column prop="location_name" align="center" label="抓拍地点">
</el-table-column>
<el-table-column
align="center"
label="操作">
<el-table-column align="center" label="操作">
<template slot-scope="scope">
<el-tooltip content="详情" placement="bottom" effect="light" :visible-arrow=false>
<span class="el-icon-info editIcon" @click="detailFun(scope.$index, scope.row)"></span>
<el-tooltip
content="详情"
placement="bottom"
effect="light"
:visible-arrow="false"
>
<span
class="el-icon-info editIcon"
@click="detailFun(scope.$index, scope.row)"
></span>
</el-tooltip>
</template>
</el-table-column>
......@@ -132,7 +185,8 @@
:current-page="page"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:total="total">
:total="total"
>
</el-pagination>
<div style="clear: both;"></div>
</div>
......@@ -141,22 +195,33 @@
title="详情"
top="12vh"
:visible.sync="detailVisible"
width="700px">
width="700px"
>
<div style="position: relative;padding: 10px 20px;">
<div class="leftArrow" @click="leftFun"><i class="el-icon-d-arrow-left"></i></div>
<div class="leftArrow" @click="leftFun">
<i class="el-icon-d-arrow-left"></i>
</div>
<div class="detaiCon">
<el-image style="width: 100%;" :src="this.detailImg">
<div slot="error" class="image-slot">
<img :src="carImg" alt="" style="width: 40%;display: block;margin: 0 auto;">
<img
:src="carImg"
alt=""
style="width: 40%;display: block;margin: 0 auto;"
/>
</div>
</el-image>
<el-form label-width="120px" inline>
<div>
<el-form-item label="经过日期:">
<span>{{ detailObj.shoot_date ? detailObj.shoot_date : '' }}</span>
<span>{{
detailObj.shoot_date ? detailObj.shoot_date : ""
}}</span>
</el-form-item>
<el-form-item label="经过时间:">
<span>{{ detailObj.shoot_time ? detailObj.shoot_time : '' }}</span>
<span>{{
detailObj.shoot_time ? detailObj.shoot_time : ""
}}</span>
</el-form-item>
</div>
<div>
......@@ -193,261 +258,291 @@
</div>
</el-form>
</div>
<div class="rightArrow" @click="rightFun"><i class="el-icon-d-arrow-right"></i></div>
<div class="rightArrow" @click="rightFun">
<i class="el-icon-d-arrow-right"></i>
</div>
</div>
<span slot="footer" class="dialog-footer">
<!-- <el-button @click="detailDel">删 除</el-button> -->
<el-button type="primary" @click="detailVisible = false">关 闭</el-button>
<el-button type="primary" @click="detailVisible = false"
>关 闭</el-button
>
</span>
</el-dialog>
</div>
</template>
<script>
export default {
data(){
let start_dt = this.$moment('2019-12-20').format('YYYY-MM-DD')+' 00:00:00';
let end_dt = this.$moment().format('YYYY-MM-DD')+' 23:59:59';
return{
loading:false,
detailObj:{},
carImg:require("@/assets/img/home/defaultImg.png"),
detailImg:'',
detailVisible:false,
dates:[ start_dt,end_dt ],
export default {
data() {
let start_dt =
this.$moment("2019-12-20").format("YYYY-MM-DD") + " 00:00:00";
let end_dt = this.$moment().format("YYYY-MM-DD") + " 23:59:59";
return {
loading: false,
detailObj: {},
carImg: require("@/assets/img/home/defaultImg.png"),
detailImg: "",
detailVisible: false,
dates: [start_dt, end_dt],
conditions: {
start_dt:start_dt,
end_dt:end_dt,
event_type: 'pedestrian',
location_name:'',
subtask_id:null,
task_id:null,
upbodyColor: '',
lobodyColor: '',
sex:''
start_dt: start_dt,
end_dt: end_dt,
event_type: "pedestrian",
location_name: "",
subtask_id: null,
task_id: null,
upbodyColor: "",
lobodyColor: "",
sex: ""
},
bodyColorList:this.$buildCode.getCodeList('车身颜色'),
tableData:[],
formatterData:[],
total:0,
page:1,
pageSize:30,
selectcheck:[],
currentIndex:0,
taskList:[],
subTaskList:[]
}
bodyColorList: this.$buildCode.getCodeList("车身颜色"),
tableData: [],
formatterData: [],
total: 0,
page: 1,
pageSize: 30,
selectcheck: [],
currentIndex: 0,
taskList: [],
subTaskList: []
};
},
watch:{
dates(val){
this.conditions.start_dt=val[0];
this.conditions.end_dt=val[1];
watch: {
dates(val) {
this.conditions.start_dt = val[0];
this.conditions.end_dt = val[1];
}
},
components:{},
mounted(){
this.getData()
components: {},
mounted() {
this.getData();
this.getTaskList();
},
methods:{
getTaskList(){
this.$api.task.getTask({
methods: {
getTaskList() {
this.$api.task
.getTask({
source_type: "pull_video_stream",
task_type: "normal"
}).then(res=>{
this.taskList=res.list_data;
})
.then(res => {
this.taskList = res.list_data;
});
},
getSubTask(){
this.conditions.subtask_id=null;
getSubTask() {
this.conditions.subtask_id = null;
this.$api.task.getSubTask(this.conditions.task_id).then(res => {
this.subTaskList = res.list_data;
if( this.subTaskList.length>0){
this.conditions.subtask_id=this.subTaskList[0].subtask_id
if (this.subTaskList.length > 0) {
this.conditions.subtask_id = this.subTaskList[0].subtask_id;
}
})
});
},
exportFun(){
exportFun() {
window.open(
encodeURI(
process.env.VUE_APP_URL+
"/api/v1/traffic/events/export?s=" + Math.random()+
'&event_type=pedestrian&event_dt__gte='+ this.$moment(this.conditions.start_dt).utc().format('YYYY-MM-DD HH:mm:ss') +
'&event_dt__lt='+this.$moment(this.conditions.end_dt).utc().format('YYYY-MM-DD HH:mm:ss') +
'&location_name='+this.conditions.location_name+
'&task_id='+this.conditions.task_id+
'&subtask_id='+this.conditions.subtask_id+
'&upbodyColor='+this.conditions.upbodyColor+
'&lobodyColor='+this.conditions.lobodyColor+
'&sex='+this.conditions.sex
process.env.VUE_APP_URL +
"/api/v1/traffic/events/export?s=" +
Math.random() +
"&event_type=pedestrian&event_dt__gte=" +
this.$moment(this.conditions.start_dt)
.utc()
.format("YYYY-MM-DD HH:mm:ss") +
"&event_dt__lt=" +
this.$moment(this.conditions.end_dt)
.utc()
.format("YYYY-MM-DD HH:mm:ss") +
"&location_name=" +
this.conditions.location_name +
"&task_id=" +
this.conditions.task_id +
"&subtask_id=" +
this.conditions.subtask_id +
"&upbodyColor=" +
this.conditions.upbodyColor +
"&lobodyColor=" +
this.conditions.lobodyColor +
"&sex=" +
this.conditions.sex
)
);
},
batchdel(){
if(this.selectcheck.length==0){
batchdel() {
if (this.selectcheck.length == 0) {
this.$message({
message: '请选择至少一条记录',
type: 'warning'
message: "请选择至少一条记录",
type: "warning"
});
return false
return false;
}
this.$confirm('此操作将永久删除选中记录, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
this.$confirm("此操作将永久删除选中记录, 是否继续?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$api.search.patchdel({
"event_unids":this.selectcheck
}).then(res=>{
if(res.ecode == '200'){
this.$api.search
.patchdel({
event_unids: this.selectcheck
})
.then(res => {
if (res.ecode == "200") {
this.$message({
type: 'success',
message: '删除成功!'
type: "success",
message: "删除成功!"
});
this.getData();
}else{
this.$message.error('删除失败!');
} else {
this.$message.error("删除失败!");
}
})
})
});
});
},
leftFun(){
if(this.currentIndex-1<0){
leftFun() {
if (this.currentIndex - 1 < 0) {
this.$message({
message: '目前为第一条',
type: 'warning'
message: "目前为第一条",
type: "warning"
});
return false;
}
this.detailObj=this.formatterData[this.currentIndex-1];
this.currentIndex-=1;
this.detailObj = this.formatterData[this.currentIndex - 1];
this.currentIndex -= 1;
this.getImg(this.detailObj.pics[0].pic_unid);
},
rightFun(){
if(this.currentIndex==this.formatterData.length-1){
rightFun() {
if (this.currentIndex == this.formatterData.length - 1) {
this.$message({
message: '目前为最后一条',
type: 'warning'
message: "目前为最后一条",
type: "warning"
});
return false;
}
this.detailObj=this.formatterData[this.currentIndex+1];
this.currentIndex+=1;
this.detailObj = this.formatterData[this.currentIndex + 1];
this.currentIndex += 1;
this.getImg(this.detailObj.pics[0].pic_unid);
},
handleSelectionChange(obj){
handleSelectionChange(obj) {
this.selectcheck = [];
obj.forEach(item => {
this.selectcheck.push(item.id)
this.selectcheck.push(item.id);
});
},
handleSizeChange(val) {
this.pageSize=val;
this.pageSize = val;
this.getData();
},
handleCurrentChange(val) {
this.page=val;
this.page = val;
this.getData();
},
query(){
query() {
this.getData();
},
getData(){
this.loading=true;
this.formatterData=[];
getData() {
this.loading = true;
this.formatterData = [];
let offset = (this.page - 1) * this.pageSize;
let search_params = {
limit: this.pageSize,
offset: offset,
event_type: "pedestrian",
event_dt__gte: this.$moment(this.conditions.start_dt).utc().format('YYYY-MM-DD HH:mm:ss'),
event_dt__lt:this.$moment(this.conditions.end_dt).utc().format('YYYY-MM-DD HH:mm:ss'),
event_dt__gte: this.$moment(this.conditions.start_dt)
.utc()
.format("YYYY-MM-DD HH:mm:ss"),
event_dt__lt: this.$moment(this.conditions.end_dt)
.utc()
.format("YYYY-MM-DD HH:mm:ss"),
upbodyColor: this.conditions.upbodyColor,
lobodyColor: this.conditions.lobodyColor,
sex: this.conditions.sex,
task_id: this.conditions.task_id,
subtask_id: this.conditions.subtask_id,
location_name: this.conditions.location_name
}
this.$api.search.tableList(search_params
).then((res)=>{
this.total=res.total_num;
res.list_data.forEach((item,index)=>{
};
this.$api.search
.tableList(search_params)
.then(res => {
this.total = res.total_num;
res.list_data.forEach((item, index) => {
this.formatterData.push(this.$buildCode.init(item));
});
this.loading = false;
})
this.loading=false;
}).catch((err)=>{
})
.catch(err => {});
},
getImg(unid){
this.$api.search.detailImg({
},unid).then(res=>{
this.detailImg=res.pic_url ? res.pic_url : carImg;
}).catch(e=>{
getImg(unid) {
this.$api.search
.detailImg({}, unid)
.then(res => {
this.detailImg = res.pic_url ? res.pic_url : carImg;
})
.catch(e => {});
},
detailFun(index,row){
this.currentIndex=index;
if(row.pics.length>0){
this.detailObj = Object.assign({},row);
detailFun(index, row) {
this.currentIndex = index;
if (row.pics.length > 0) {
this.detailObj = Object.assign({}, row);
this.getImg(row.pics[0].pic_unid);
}
this.detailVisible=true;
this.detailVisible = true;
},
delFun(index,row){
this.$confirm('此操作将永久删除该记录, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
delFun(index, row) {
this.$confirm("此操作将永久删除该记录, 是否继续?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$api.search.delVehicle({
},row.id).then(res=>{
if(res.ecode==200){
this.$api.search
.delVehicle({}, row.id)
.then(res => {
if (res.ecode == 200) {
this.formatterData.splice(index);
this.$message({
type: 'success',
message: '删除成功!'
type: "success",
message: "删除成功!"
});
}else{
this.$message.error('删除失败!');
} else {
this.$message.error("删除失败!");
}
}).catch(e=>{
this.$message.error('删除失败!');
})
})
.catch(e => {
this.$message.error("删除失败!");
});
});
},
detailDel(){
this.$confirm('此操作将永久删除该记录, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
detailDel() {
this.$confirm("此操作将永久删除该记录, 是否继续?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$api.search.delVehicle({},this.detailObj.id).then(res=>{
if(res.ecode==200){
this.formatterData.splice(this.currentIndex,1);
this.detailObj = Object.assign({},this.formatterData[this.currentIndex]);
this.getImg(this.formatterData[this.currentIndex].pics[0].pic_unid);
this.$api.search
.delVehicle({}, this.detailObj.id)
.then(res => {
if (res.ecode == 200) {
this.formatterData.splice(this.currentIndex, 1);
this.detailObj = Object.assign(
{},
this.formatterData[this.currentIndex]
);
this.getImg(
this.formatterData[this.currentIndex].pics[0].pic_unid
);
this.$message({
type: 'success',
message: '删除成功!'
type: "success",
message: "删除成功!"
});
}else{
this.$message.error('删除失败!');
} else {
this.$message.error("删除失败!");
}
}).catch(e=>{
this.$message.error('删除失败!');
})
})
.catch(e => {
this.$message.error("删除失败!");
});
});
}
},
}
};
</script>
<style lang="scss" scoped>
</style>
\ No newline at end of file
<style lang="scss" scoped></style>
......@@ -4,15 +4,36 @@
<el-form ref="form" label-width="80px" inline>
<el-form-item label="任务名称">
<span class="selectBox">
<el-select placeholder="请选择" :popper-append-to-body=false v-model="conditions.task_id" @change="getSubTask">
<el-option v-for='item in taskList' :value="item.task_id" :key="item.task_id" :label='item.task_name'></el-option>
<el-select
filterable
placeholder="请选择"
:popper-append-to-body="false"
v-model="conditions.task_id"
@change="getSubTask"
>
<el-option
v-for="item in taskList"
:value="item.task_id"
:key="item.task_id"
:label="item.task_name"
></el-option>
</el-select>
</span>
</el-form-item>
<el-form-item label="视频名称">
<span class="selectBox">
<el-select placeholder="请选择" :popper-append-to-body=false v-model="conditions.subtask_id">
<el-option v-for='item in subTaskList' :value="item.subtask_id" :key="item.subtask_id" :label='item.subtask_name'></el-option>
<el-select
filterable
placeholder="请选择"
:popper-append-to-body="false"
v-model="conditions.subtask_id"
>
<el-option
v-for="item in subTaskList"
:value="item.subtask_id"
:key="item.subtask_id"
:label="item.subtask_name"
></el-option>
</el-select>
</span>
</el-form-item>
......@@ -28,20 +49,30 @@
</el-form-item> -->
<el-form-item label="检测类型">
<span class="selectBox">
<el-select placeholder="请选择" :popper-append-to-body=false v-model="conditions.detection_type">
<el-option value="" label='全部'></el-option>
<el-option value="big_vehicle" label='大车'></el-option>
<el-option value="small_vehicle" label='小车'></el-option>
<el-option value="xcycle" label='非机动车'></el-option>
<el-option value="pedestrian" label='行人'></el-option>
<el-select
filterable
placeholder="请选择"
:popper-append-to-body="false"
v-model="conditions.detection_type"
>
<el-option value="" label="全部"></el-option>
<el-option value="big_vehicle" label="大车"></el-option>
<el-option value="small_vehicle" label="小车"></el-option>
<el-option value="xcycle" label="非机动车"></el-option>
<el-option value="pedestrian" label="行人"></el-option>
</el-select>
</span>
</el-form-item>
<el-form-item label="统计方式">
<span class="selectBox">
<el-select placeholder="请选择" :popper-append-to-body=false v-model="conditions.statistic_type">
<el-option value="road" label='按车道统计'></el-option>
<el-option value="device" label='按相机统计'></el-option>
<el-select
filterable
placeholder="请选择"
:popper-append-to-body="false"
v-model="conditions.statistic_type"
>
<el-option value="road" label="按车道统计"></el-option>
<el-option value="device" label="按相机统计"></el-option>
</el-select>
</span>
</el-form-item>
......@@ -54,7 +85,8 @@
type="datetimerange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期">
end-placeholder="结束日期"
>
</el-date-picker>
</span>
</el-form-item>
......@@ -62,8 +94,12 @@
</el-col>
<el-col :span="2">
<div style="margin-bottom: 6px;padding-top: 3px;">
<el-button type="primary" style="" @click="query" class="block">查询</el-button>
<el-button type="success" class="block compatibleBtn" @click="exportFun">导出</el-button>
<el-button type="primary" style="" @click="query" class="block"
>查询</el-button
>
<el-button type="success" class="block compatibleBtn" @click="exportFun"
>导出</el-button
>
</div>
</el-col>
<div style="">
......@@ -72,35 +108,33 @@
:height="tableHeight"
stripe
v-loading="loading"
border>
border
>
<el-table-column
prop="index"
align="center"
label="#"
:formatter="indexFormatter"
width="50">
width="50"
>
</el-table-column>
<el-table-column
align="center"
prop="event_dt"
label="时间">
<el-table-column align="center" prop="event_dt" label="时间">
</el-table-column>
<el-table-column
prop="location_name"
align="center"
label="地点名称">
<el-table-column prop="location_name" align="center" label="地点名称">
</el-table-column>
<el-table-column
prop="detection_type"
align="center"
:formatter="typeFormatter"
label="检测类型">
label="检测类型"
>
</el-table-column>
<el-table-column
v-if="conditions.statistic_type =='road'"
v-if="conditions.statistic_type == 'road'"
prop="road"
align="center"
label="车道">
label="车道"
>
</el-table-column>
<!-- <el-table-column
v-if="conditions.statistic_type =='device'"
......@@ -113,54 +147,37 @@
</div>
</template>
</el-table-column> -->
<el-table-column
align="center"
label="平均速度(km/h)">
<el-table-column align="center" label="平均速度(km/h)">
<template slot-scope="scope">
<div>
{{scope.row.velocity.toFixed(2)}}
{{ scope.row.velocity.toFixed(2) }}
</div>
</template>
</el-table-column>
<el-table-column
prop="occupy"
align="center"
label="空间占有率%">
<el-table-column prop="occupy" align="center" label="空间占有率%">
<template slot-scope="scope">
<div>
{{(scope.row.occupy*100).toFixed(2)}}
{{ (scope.row.occupy * 100).toFixed(2) }}
</div>
</template>
</el-table-column>
<el-table-column
prop="sample_dura"
align="center"
label="统计周期(秒)">
<el-table-column prop="sample_dura" align="center" label="统计周期(秒)">
</el-table-column>
<el-table-column
prop="distance"
align="center"
label="车头间距(m)">
<el-table-column prop="distance" align="center" label="车头间距(m)">
<template slot-scope="scope">
<div>
{{(scope.row.distance).toFixed(2)}}
{{ scope.row.distance.toFixed(2) }}
</div>
</template>
</el-table-column>
<el-table-column
prop="queue_length"
align="center"
label="排队长度(m)">
<el-table-column prop="queue_length" align="center" label="排队长度(m)">
<template slot-scope="scope">
<div>
{{parseInt(scope.row.queue_length)}}
{{ parseInt(scope.row.queue_length) }}
</div>
</template>
</el-table-column>
<el-table-column
prop="sample_num"
align="center"
label="车流量(辆)">
<el-table-column prop="sample_num" align="center" label="车流量(辆)">
</el-table-column>
</el-table>
<div style="margin-top: 28px;">
......@@ -174,7 +191,8 @@
:current-page="page"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:total="total">
:total="total"
>
</el-pagination>
<div style="clear: both;"></div>
</div>
......@@ -182,139 +200,158 @@
</div>
</template>
<script>
export default {
data(){
let start_dt = this.$moment('2019-12-20').format('YYYY-MM-DD')+' 00:00:00';
let end_dt = this.$moment().format('YYYY-MM-DD')+' 23:59:59';
return{
loading:false,
dates:[ start_dt,end_dt ],
export default {
data() {
let start_dt =
this.$moment("2019-12-20").format("YYYY-MM-DD") + " 00:00:00";
let end_dt = this.$moment().format("YYYY-MM-DD") + " 23:59:59";
return {
loading: false,
dates: [start_dt, end_dt],
conditions: {
start_dt:start_dt,
end_dt:end_dt,
task_id: '',
subtask_id: '',
detection_type: '',
statistic_type: 'road'
start_dt: start_dt,
end_dt: end_dt,
task_id: "",
subtask_id: "",
detection_type: "",
statistic_type: "road"
},
formatterData:[],
total:0,
page:1,
pageSize:30,
taskList:[],
subTaskList:[],
tableHeight:window.oneSearchTableHeight
}
formatterData: [],
total: 0,
page: 1,
pageSize: 30,
taskList: [],
subTaskList: [],
tableHeight: window.oneSearchTableHeight
};
},
watch:{
dates(val){
this.conditions.start_dt=val[0];
this.conditions.end_dt=val[1];
watch: {
dates(val) {
this.conditions.start_dt = val[0];
this.conditions.end_dt = val[1];
}
},
components:{},
mounted(){
components: {},
mounted() {
this.getData();
this.getTaskList();
},
methods:{
indexFormatter(row, column, cellValue, index){
return index+(this.page-1)*this.pageSize+1;
methods: {
indexFormatter(row, column, cellValue, index) {
return index + (this.page - 1) * this.pageSize + 1;
},
getTaskList(){
this.$api.task.getTask({
getTaskList() {
this.$api.task
.getTask({
source_type: "pull_video_stream",
task_type: "normal"
}).then(res=>{
this.taskList=res.list_data;
this.taskList.unshift({
task_id:'',
task_name:'全部'
})
})
.then(res => {
this.taskList = res.list_data;
this.taskList.unshift({
task_id: "",
task_name: "全部"
});
});
},
getSubTask(){
getSubTask() {
this.$api.task.getSubTask(this.conditions.task_id).then(res => {
if(res.list_data==null){
this.subTaskList=[];
}else{
if (res.list_data == null) {
this.subTaskList = [];
} else {
this.subTaskList = res.list_data;
}
this.subTaskList.unshift({
subtask_id:'',
subtask_name:'全部'
})
this.conditions.subtask_id='';
})
subtask_id: "",
subtask_name: "全部"
});
this.conditions.subtask_id = "";
});
},
typeFormatter(row, column, cellValue, index){
let codename = '';
switch(cellValue){
case 'big_vehicle':
codename = "大车"
typeFormatter(row, column, cellValue, index) {
let codename = "";
switch (cellValue) {
case "big_vehicle":
codename = "大车";
break;
case 'small_vehicle':
codename = "小车"
case "small_vehicle":
codename = "小车";
break;
case 'xcycle':
codename = "非机动车"
case 'pedestrian':
codename = "行人"
case "xcycle":
codename = "非机动车";
case "pedestrian":
codename = "行人";
break;
case null:
codename = "全部"
codename = "全部";
break;
}
return codename
return codename;
},
exportFun(){
window.open(encodeURI(
process.env.VUE_APP_URL + '/api/v1/traffic/flow/statistics/export?s=' + Math.random()+
'&event_type=&event_dt__gte='+this.$moment(this.conditions.start_dt).utc().format('YYYY-MM-DD HH:mm:ss')+
'&event_dt__lt='+this.$moment(this.conditions.end_dt).utc().format('YYYY-MM-DD HH:mm:ss')+
'&task_id='+this.conditions.task_id+
'&subtask_id='+this.conditions.subtask_id+
'&statistic_type='+this.conditions.statistic_type
))
exportFun() {
window.open(
encodeURI(
process.env.VUE_APP_URL +
"/api/v1/traffic/flow/statistics/export?s=" +
Math.random() +
"&event_type=&event_dt__gte=" +
this.$moment(this.conditions.start_dt)
.utc()
.format("YYYY-MM-DD HH:mm:ss") +
"&event_dt__lt=" +
this.$moment(this.conditions.end_dt)
.utc()
.format("YYYY-MM-DD HH:mm:ss") +
"&task_id=" +
this.conditions.task_id +
"&subtask_id=" +
this.conditions.subtask_id +
"&statistic_type=" +
this.conditions.statistic_type
)
);
},
handleSizeChange(val) {
this.pageSize=val;
this.pageSize = val;
this.getData();
},
handleCurrentChange(val) {
this.page=val;
this.page = val;
this.getData();
},
query(){
query() {
this.getData();
},
getData(){
this.loading=true;
this.formatterData=[];
getData() {
this.loading = true;
this.formatterData = [];
let offset = (this.page - 1) * this.pageSize;
let search_params = {
limit: this.pageSize,
offset: offset,
event_dt__gte: this.$moment(this.conditions.start_dt).utc().format('YYYY-MM-DD HH:mm:ss'),
event_dt__lt:this.$moment(this.conditions.end_dt).utc().format('YYYY-MM-DD HH:mm:ss'),
event_dt__gte: this.$moment(this.conditions.start_dt)
.utc()
.format("YYYY-MM-DD HH:mm:ss"),
event_dt__lt: this.$moment(this.conditions.end_dt)
.utc()
.format("YYYY-MM-DD HH:mm:ss"),
task_id: this.conditions.task_id,
subtask_id: this.conditions.subtask_id,
detection_type: this.conditions.detection_type,
statistic_type: this.conditions.statistic_type
}
this.$api.search.traficflow(search_params
).then((res)=>{
this.total=res.total_num;
res.list_data.forEach((item,index)=>{
};
this.$api.search
.traficflow(search_params)
.then(res => {
this.total = res.total_num;
res.list_data.forEach((item, index) => {
this.formatterData.push(this.$buildCode.init(item));
});
this.loading = false;
})
this.loading=false;
}).catch((err)=>{
})
}
.catch(err => {});
}
}
};
</script>
<style lang="scss" scoped>
</style>
\ No newline at end of file
<style lang="scss" scoped></style>
......@@ -4,7 +4,7 @@
<el-form ref="form" label-width="80px" inline>
<!-- <el-form-item label="资源类型">
<span class="selectBox">
<el-select placeholder="请选择" :popper-append-to-body=false v-model="conditions.source_type">
<el-select filterable placeholder="请选择" :popper-append-to-body=false v-model="conditions.source_type">
<el-option value="pull_video_stream" label='拉取视频'></el-option>
<el-option value="pull_pic_files" label='拉取图片'></el-option>
</el-select>
......@@ -12,51 +12,105 @@
</el-form-item> -->
<el-form-item label="任务名称">
<span class="selectBox">
<el-select placeholder="请选择" :popper-append-to-body=false v-model="conditions.task_id" @change="getSubTask">
<el-option v-for='item in taskList' :value="item.task_id" :key="item.task_id" :label='item.task_name'></el-option>
<el-select
filterable
placeholder="请选择"
:popper-append-to-body="false"
v-model="conditions.task_id"
@change="getSubTask"
>
<el-option
v-for="item in taskList"
:value="item.task_id"
:key="item.task_id"
:label="item.task_name"
></el-option>
</el-select>
</span>
</el-form-item>
<el-form-item label="视频名称">
<span class="selectBox">
<el-select placeholder="请选择" :popper-append-to-body=false v-model="conditions.subtask_id">
<el-option v-for='item in subTaskList' :value="item.subtask_id" :key="item.subtask_id" :label='item.subtask_name'></el-option>
<el-select
filterable
placeholder="请选择"
:popper-append-to-body="false"
v-model="conditions.subtask_id"
>
<el-option
v-for="item in subTaskList"
:value="item.subtask_id"
:key="item.subtask_id"
:label="item.subtask_name"
></el-option>
</el-select>
</span>
</el-form-item>
<el-form-item label="车牌号码">
<span class="inputBox">
<el-input placeholder="请输入车牌号码" v-model="conditions.plate"></el-input>
<el-input
placeholder="请输入车牌号码"
v-model="conditions.plate"
></el-input>
</span>
</el-form-item>
<el-form-item label="车牌颜色">
<span class="selectBox">
<el-select placeholder="请选择" :popper-append-to-body=false v-model="conditions.plate_color" >
<el-option value="" label='全部'></el-option>
<el-option v-for='item in plateColorList' :value="item.code" :key="item.code" :label='item.name'></el-option>
<el-select
filterable
placeholder="请选择"
:popper-append-to-body="false"
v-model="conditions.plate_color"
>
<el-option value="" label="全部"></el-option>
<el-option
v-for="item in plateColorList"
:value="item.code"
:key="item.code"
:label="item.name"
></el-option>
</el-select>
</span>
</el-form-item>
<el-form-item label="车辆类型">
<span class="selectBox">
<el-select placeholder="请选择" :popper-append-to-body=false v-model="conditions.car_type" >
<el-option value="" label='全部'></el-option>
<el-option v-for='item in vehicleTypeList' :value="item.code" :key="item.code" :label='item.name'></el-option>
<el-select
filterable
placeholder="请选择"
:popper-append-to-body="false"
v-model="conditions.car_type"
>
<el-option value="" label="全部"></el-option>
<el-option
v-for="item in vehicleTypeList"
:value="item.code"
:key="item.code"
:label="item.name"
></el-option>
</el-select>
</span>
</el-form-item>
<el-form-item label="车辆颜色">
<span class="selectBox">
<el-select placeholder="请选择" :popper-append-to-body=false v-model="conditions.car_color">
<el-option value="" label='全部'></el-option>
<el-option v-for='item in vehicleColorList' :value="item.code" :key="item.code" :label='item.name'></el-option>
<el-select
filterable
placeholder="请选择"
:popper-append-to-body="false"
v-model="conditions.car_color"
>
<el-option value="" label="全部"></el-option>
<el-option
v-for="item in vehicleColorList"
:value="item.code"
:key="item.code"
:label="item.name"
></el-option>
</el-select>
</span>
</el-form-item>
<!-- <el-form-item label="车辆品牌">
<span class="selectBox">
<el-select placeholder="请选择" :popper-append-to-body=false v-model="conditions.logo_type">
<el-select filterable placeholder="请选择" :popper-append-to-body=false v-model="conditions.logo_type">
<el-option value="" label='全部'></el-option>
<el-option v-for='item in brandList' :value="item.code" :key="item.code" :label='item.name'></el-option>
</el-select>
......@@ -64,7 +118,7 @@
</el-form-item> -->
<!-- <el-form-item label="标志物">
<span class="selectBox">
<el-select placeholder="请选择" :popper-append-to-body=false v-model="conditions.marker">
<el-select filterable placeholder="请选择" :popper-append-to-body=false v-model="conditions.marker">
<el-option value="" label='全部'></el-option>
<el-option value="0" label='年检标志'></el-option>
<el-option value="1" label='摆件'></el-option>
......@@ -75,12 +129,17 @@
</el-form-item> -->
<el-form-item label="特殊车辆">
<span class="selectBox">
<el-select placeholder="请选择" :popper-append-to-body=false v-model="conditions.special_type">
<el-option value="" label='全部'></el-option>
<el-option value="0" label='普通车辆'></el-option>
<el-option value="1" label='车辆运输车'></el-option>
<el-option value="2" label='危险品运输车'></el-option>
<el-option value="3" label='救护车'></el-option>
<el-select
filterable
placeholder="请选择"
:popper-append-to-body="false"
v-model="conditions.special_type"
>
<el-option value="" label="全部"></el-option>
<el-option value="0" label="普通车辆"></el-option>
<el-option value="1" label="车辆运输车"></el-option>
<el-option value="2" label="危险品运输车"></el-option>
<el-option value="3" label="救护车"></el-option>
</el-select>
</span>
</el-form-item>
......@@ -93,7 +152,8 @@
type="datetimerange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期">
end-placeholder="结束日期"
>
</el-date-picker>
</span>
</el-form-item>
......@@ -101,11 +161,17 @@
</el-col>
<el-col :span="2">
<div style="margin-bottom: 6px;padding-top: 3px;">
<el-button type="primary" style="" @click="query" class="block">查询</el-button>
<el-button type="success" class="block compatibleBtn" @click="exportFun">导出</el-button>
<el-button type="primary" style="" @click="query" class="block"
>查询</el-button
>
<el-button type="success" class="block compatibleBtn" @click="exportFun"
>导出</el-button
>
</div>
<div>
<el-button type="success" class="block" @click="batchdel">批量删除</el-button>
<el-button type="success" class="block" @click="batchdel"
>批量删除</el-button
>
</div>
</el-col>
<div style="">
......@@ -115,34 +181,35 @@
stripe
border
v-loading="loading"
@selection-change="handleSelectionChange">
<el-table-column
type="selection"
align="center"
width="55">
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" align="center" width="55">
</el-table-column>
<el-table-column
prop="index"
align="center"
label="#"
:formatter="indexFormatter"
width="50">
width="50"
>
</el-table-column>
<el-table-column
prop="vehicle_plate_text"
align="center"
label="车牌号码">
label="车牌号码"
>
</el-table-column>
<el-table-column
prop="plate_color_text"
align="center"
label="车牌颜色">
label="车牌颜色"
>
</el-table-column>
<el-table-column
prop="vehicle_body_type_text"
align="center"
label="车辆类型">
label="车辆类型"
>
</el-table-column>
<!-- <el-table-column
prop="vehicle_body_logo_text"
......@@ -152,41 +219,47 @@
<el-table-column
prop="vehicle_body_color_text"
align="center"
label="车辆颜色">
label="车辆颜色"
>
</el-table-column>
<!-- <el-table-column
prop="RefinedFeature_text"
align="center"
label="标识物">
</el-table-column> -->
<el-table-column
prop="special_text"
align="center"
label="特殊车辆">
<el-table-column prop="special_text" align="center" label="特殊车辆">
</el-table-column>
<el-table-column
prop="shoot_date"
align="center"
label="抓拍时间">
<el-table-column prop="shoot_date" align="center" label="抓拍时间">
<template slot-scope="scope">
<span>{{scope.row.shoot_date}} {{scope.row.shoot_time}}</span>
<span>{{ scope.row.shoot_date }} {{ scope.row.shoot_time }}</span>
</template>
</el-table-column>
<el-table-column
prop="location_name"
align="center"
label="抓拍地点">
<el-table-column prop="location_name" align="center" label="抓拍地点">
</el-table-column>
<el-table-column
align="center"
label="操作">
<el-table-column align="center" label="操作">
<template slot-scope="scope">
<el-tooltip content="详情" placement="bottom" effect="light" :visible-arrow=false>
<span class="el-icon-info editIcon" @click="detailFun(scope.$index, scope.row)"></span>
<el-tooltip
content="详情"
placement="bottom"
effect="light"
:visible-arrow="false"
>
<span
class="el-icon-info editIcon"
@click="detailFun(scope.$index, scope.row)"
></span>
</el-tooltip>
<span class="tableSpanBorder"></span>
<el-tooltip content="删除" placement="bottom" effect="light" :visible-arrow=false>
<span class="el-icon-delete delIcon" @click="delFun(scope.$index, scope.row)"></span>
<el-tooltip
content="删除"
placement="bottom"
effect="light"
:visible-arrow="false"
>
<span
class="el-icon-delete delIcon"
@click="delFun(scope.$index, scope.row)"
></span>
</el-tooltip>
</template>
</el-table-column>
......@@ -202,7 +275,8 @@
:current-page="page"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:total="total">
:total="total"
>
</el-pagination>
<div style="clear: both;"></div>
</div>
......@@ -212,13 +286,22 @@
top="12vh"
:visible.sync="detailVisible"
class="detailDialog"
width="1000px">
width="1000px"
>
<div style="position: relative;padding: 10px 20px;">
<!-- <div class="leftArrow" @click="leftFun"><i class="el-icon-d-arrow-left"></i></div> -->
<div class="detaiCon">
<el-image style="width: 100%;" :src="this.detailImg" :preview-src-list="srcList">
<el-image
style="width: 100%;"
:src="this.detailImg"
:preview-src-list="srcList"
>
<div slot="error" class="image-slot">
<img :src="carImg" alt="" style="width: 30%;display: block;margin: 0 auto;">
<img
:src="carImg"
alt=""
style="width: 30%;display: block;margin: 0 auto;"
/>
</div>
</el-image>
<el-form label-width="120px" inline>
......@@ -229,10 +312,14 @@
<span>{{ detailObj.plate_type_text }}</span>
</el-form-item> -->
<el-form-item label="经过日期:">
<span>{{ detailObj.shoot_date ? detailObj.shoot_date : '' }}</span>
<span>{{
detailObj.shoot_date ? detailObj.shoot_date : ""
}}</span>
</el-form-item>
<el-form-item label="经过时间:">
<span>{{ detailObj.shoot_time ? detailObj.shoot_time : '' }}</span>
<span>{{
detailObj.shoot_time ? detailObj.shoot_time : ""
}}</span>
</el-form-item>
<el-form-item label="经过地点:">
<span>{{ detailObj.location_name }}</span>
......@@ -260,7 +347,9 @@
<!-- <div class="rightArrow" @click="rightFun"><i class="el-icon-d-arrow-right"></i></div> -->
</div>
<span slot="footer" class="dialog-footer">
<el-button type="danger" @click="detailDel" class="leftButton">删 除</el-button>
<el-button type="danger" @click="detailDel" class="leftButton"
>删 除</el-button
>
<el-button type="primary" @click="leftFun">上一条</el-button>
<el-button type="primary" @click="rightFun">下一条</el-button>
<el-button @click="detailVisible = false">关 闭</el-button>
......@@ -269,185 +358,211 @@
</div>
</template>
<script>
export default {
data(){
let start_dt = this.$moment('2019-12-20').format('YYYY-MM-DD')+' 00:00:00';
let end_dt = this.$moment().format('YYYY-MM-DD')+' 23:59:59';
return{
detailObj:{},
carImg:require("@/assets/img/home/defaultImg.png"),
detailImg:'',
export default {
data() {
let start_dt =
this.$moment("2019-12-20").format("YYYY-MM-DD") + " 00:00:00";
let end_dt = this.$moment().format("YYYY-MM-DD") + " 23:59:59";
return {
detailObj: {},
carImg: require("@/assets/img/home/defaultImg.png"),
detailImg: "",
srcList: [],
detailVisible:false,
dates:[ start_dt,end_dt ],
detailVisible: false,
dates: [start_dt, end_dt],
conditions: {
start_dt:start_dt,
end_dt:end_dt,
source_type: 'pull_video_stream',
plate_color:'',
marker: '',
car_type: '',
car_color: '',
logo_type: '',
plate:'',
task_id:'',
curdelid:'',
special_type:'',
subtask_id:''
start_dt: start_dt,
end_dt: end_dt,
source_type: "pull_video_stream",
plate_color: "",
marker: "",
car_type: "",
car_color: "",
logo_type: "",
plate: "",
task_id: "",
curdelid: "",
special_type: "",
subtask_id: ""
},
loading:false,
brandList:this.$buildCode.getCodeList('车辆品牌'),
vehicleTypeList:this.$buildCode.getCodeList('车辆类型'),
vehicleColorList:this.$buildCode.getCodeList('车身颜色'),
plateColorList:this.$buildCode.getCodeList('号牌颜色'),
tableData:[],
formatterData:[],
total:0,
page:1,
pageSize:30,
selectcheck:[],
currentIndex:0,
taskList:[],
subTaskList:[],
tableHeight:window.twoSearchTableHeight,
}
loading: false,
brandList: this.$buildCode.getCodeList("车辆品牌") || [],
vehicleTypeList: this.$buildCode.getCodeList("车辆类型") || [],
vehicleColorList: this.$buildCode.getCodeList("车身颜色") || [],
plateColorList: this.$buildCode.getCodeList("号牌颜色") || [],
tableData: [],
formatterData: [],
total: 0,
page: 1,
pageSize: 30,
selectcheck: [],
currentIndex: 0,
taskList: [],
subTaskList: [],
tableHeight: window.twoSearchTableHeight
};
},
watch:{
dates(val){
this.conditions.start_dt=val[0];
this.conditions.end_dt=val[1];
watch: {
dates(val) {
this.conditions.start_dt = val[0];
this.conditions.end_dt = val[1];
}
},
components:{},
mounted(){
this.getData()
components: {},
mounted() {
this.getData();
this.getTaskList();
},
methods:{
indexFormatter(row, column, cellValue, index){
return index+(this.page-1)*this.pageSize+1;
methods: {
indexFormatter(row, column, cellValue, index) {
return index + (this.page - 1) * this.pageSize + 1;
},
getTaskList(){
this.$api.task.getTask({
getTaskList() {
this.$api.task
.getTask({
source_type: "pull_video_stream",
task_type: "normal"
}).then(res=>{
this.taskList=res.list_data;
this.taskList.unshift({
task_id:'',
task_name:'全部'
})
})
.then(res => {
this.taskList = res.list_data;
this.taskList.unshift({
task_id: "",
task_name: "全部"
});
});
},
getSubTask(){
getSubTask() {
this.$api.task.getSubTask(this.conditions.task_id).then(res => {
if(res.list_data==null){
this.subTaskList=[];
}else{
if (res.list_data == null) {
this.subTaskList = [];
} else {
this.subTaskList = res.list_data;
}
this.subTaskList.unshift({
subtask_id:'',
subtask_name:'全部'
})
this.conditions.subtask_id='';
})
subtask_id: "",
subtask_name: "全部"
});
this.conditions.subtask_id = "";
});
},
exportFun(){
window.open(encodeURI(process.env.VUE_APP_URL
+ '/api/v1/traffic/events/export?s=' + Math.random()
+'&event_type=&event_dt__gte='+this.$moment(this.conditions.start_dt).utc().format('YYYY-MM-DD HH:mm:ss')
+'&event_dt__lt='+this.$moment(this.conditions.end_dt).utc().format('YYYY-MM-DD HH:mm:ss')
+'&subtask_id='+this.conditions.subtask_id
+'&vehicle_type='+this.conditions.car_type
+'&body_color='+this.conditions.car_color
+'&logo_type='+this.conditions.logo_type
+'&plate_number__like='+this.conditions.plate
+'&plate_color='+this.conditions.plate_color
+'&task_id='+this.conditions.task_id
+'&special_type='+this.conditions.special_type))
exportFun() {
window.open(
encodeURI(
process.env.VUE_APP_URL +
"/api/v1/traffic/events/export?s=" +
Math.random() +
"&event_type=&event_dt__gte=" +
this.$moment(this.conditions.start_dt)
.utc()
.format("YYYY-MM-DD HH:mm:ss") +
"&event_dt__lt=" +
this.$moment(this.conditions.end_dt)
.utc()
.format("YYYY-MM-DD HH:mm:ss") +
"&subtask_id=" +
this.conditions.subtask_id +
"&vehicle_type=" +
this.conditions.car_type +
"&body_color=" +
this.conditions.car_color +
"&logo_type=" +
this.conditions.logo_type +
"&plate_number__like=" +
this.conditions.plate +
"&plate_color=" +
this.conditions.plate_color +
"&task_id=" +
this.conditions.task_id +
"&special_type=" +
this.conditions.special_type
)
);
},
batchdel(){
if(this.selectcheck.length==0){
batchdel() {
if (this.selectcheck.length == 0) {
this.$message({
message: '请选择至少一条记录',
type: 'warning'
message: "请选择至少一条记录",
type: "warning"
});
return false
return false;
}
this.$confirm('此操作将永久删除选中记录, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
this.$confirm("此操作将永久删除选中记录, 是否继续?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$api.search.patchdel({
"event_unids":this.selectcheck
}).then(res=>{
if(res.ecode == '200'){
this.$api.search
.patchdel({
event_unids: this.selectcheck
})
.then(res => {
if (res.ecode == "200") {
this.$message({
type: 'success',
message: '删除成功!'
type: "success",
message: "删除成功!"
});
this.getData();
}else{
this.$message.error('删除失败!');
} else {
this.$message.error("删除失败!");
}
})
})
});
});
},
leftFun(){
if(this.currentIndex-1<0){
leftFun() {
if (this.currentIndex - 1 < 0) {
this.$message({
message: '目前为第一条',
type: 'warning'
message: "目前为第一条",
type: "warning"
});
return false;
}
this.detailObj=this.formatterData[this.currentIndex-1];
this.currentIndex-=1;
this.detailObj = this.formatterData[this.currentIndex - 1];
this.currentIndex -= 1;
this.getImg(this.detailObj.pics[0].pic_unid);
},
rightFun(){
if(this.currentIndex==this.formatterData.length-1){
rightFun() {
if (this.currentIndex == this.formatterData.length - 1) {
this.$message({
message: '目前为最后一条',
type: 'warning'
message: "目前为最后一条",
type: "warning"
});
return false;
}
this.detailObj=this.formatterData[this.currentIndex+1];
this.currentIndex+=1;
this.detailObj = this.formatterData[this.currentIndex + 1];
this.currentIndex += 1;
this.getImg(this.detailObj.pics[0].pic_unid);
},
handleSelectionChange(obj){
handleSelectionChange(obj) {
this.selectcheck = [];
obj.forEach(item => {
this.selectcheck.push(item.id)
this.selectcheck.push(item.id);
});
},
handleSizeChange(val) {
this.pageSize=val;
this.pageSize = val;
this.getData();
},
handleCurrentChange(val) {
this.page=val;
this.page = val;
this.getData();
},
query(){
query() {
this.getData();
},
getData(){
this.loading=true;
this.formatterData=[];
getData() {
this.loading = true;
this.formatterData = [];
let offset = (this.page - 1) * this.pageSize;
let search_params = {
limit: this.pageSize,
offset: offset,
event_dt__gte: this.$moment(this.conditions.start_dt).utc().format('YYYY-MM-DD HH:mm:ss'),
event_dt__lt:this.$moment(this.conditions.end_dt).utc().format('YYYY-MM-DD HH:mm:ss'),
event_dt__gte: this.$moment(this.conditions.start_dt)
.utc()
.format("YYYY-MM-DD HH:mm:ss"),
event_dt__lt: this.$moment(this.conditions.end_dt)
.utc()
.format("YYYY-MM-DD HH:mm:ss"),
// source_type: this.conditions.source_type,
vehicle_type: this.conditions.car_type,
body_color: this.conditions.car_color,
......@@ -455,90 +570,97 @@
plate_number__like: this.conditions.plate,
// marker: this.conditions.marker,
plate_color: this.conditions.plate_color,
event_type: '',
special_type:this.conditions.special_type,
event_type: "",
special_type: this.conditions.special_type,
task_id: this.conditions.task_id,
subtask_id:this.conditions.subtask_id
}
this.$api.search.tableList(search_params
).then((res)=>{
this.total=res.total_num;
res.list_data.forEach((item,index)=>{
subtask_id: this.conditions.subtask_id
};
this.$api.search
.tableList(search_params)
.then(res => {
this.total = res.total_num;
res.list_data.forEach((item, index) => {
this.formatterData.push(this.$buildCode.init(item));
});
this.loading = false;
})
this.loading=false;
}).catch((err)=>{
})
.catch(err => {});
},
getImg(unid){
this.srcList=[];
this.$api.search.detailImg({
},unid).then(res=>{
this.detailImg=res.pic_url ? res.pic_url : carImg;
this.srcList.push(this.detailImg)
}).catch(e=>{
getImg(unid) {
this.srcList = [];
this.$api.search
.detailImg({}, unid)
.then(res => {
this.detailImg = res.pic_url ? res.pic_url : carImg;
this.srcList.push(this.detailImg);
})
.catch(e => {});
},
detailFun(index,row){
this.currentIndex=index;
if(row.pics.length>0){
this.detailObj = Object.assign({},row);
detailFun(index, row) {
this.currentIndex = index;
if (row.pics.length > 0) {
this.detailObj = Object.assign({}, row);
this.getImg(row.pics[0].pic_unid);
}
this.detailVisible=true;
this.detailVisible = true;
},
delFun(index,row){
this.$confirm('此操作将永久删除该记录, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
delFun(index, row) {
this.$confirm("此操作将永久删除该记录, 是否继续?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$api.search.delVehicle({
},row.id).then(res=>{
if(res.ecode==200){
this.$api.search
.delVehicle({}, row.id)
.then(res => {
if (res.ecode == 200) {
this.formatterData.splice(index);
this.$message({
type: 'success',
message: '删除成功!'
type: "success",
message: "删除成功!"
});
}else{
this.$message.error('删除失败!');
this.getData();
} else {
this.$message.error("删除失败!");
}
}).catch(e=>{
this.$message.error('删除失败!');
})
})
.catch(e => {
this.$message.error("删除失败!");
});
});
},
detailDel(){
this.$confirm('此操作将永久删除该记录, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
detailDel() {
this.$confirm("此操作将永久删除该记录, 是否继续?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$api.search.delVehicle({},this.detailObj.id).then(res=>{
if(res.ecode==200){
this.formatterData.splice(this.currentIndex,1);
this.detailObj = Object.assign({},this.formatterData[this.currentIndex]);
this.getImg(this.formatterData[this.currentIndex].pics[0].pic_unid);
this.$api.search
.delVehicle({}, this.detailObj.id)
.then(res => {
if (res.ecode == 200) {
this.formatterData.splice(this.currentIndex, 1);
this.detailObj = Object.assign(
{},
this.formatterData[this.currentIndex]
);
this.getImg(
this.formatterData[this.currentIndex].pics[0].pic_unid
);
this.$message({
type: 'success',
message: '删除成功!'
type: "success",
message: "删除成功!"
});
}else{
this.$message.error('删除失败!');
} else {
this.$message.error("删除失败!");
}
}).catch(e=>{
this.$message.error('删除失败!');
})
})
.catch(e => {
this.$message.error("删除失败!");
});
});
}
},
}
};
</script>
<style lang="scss" scoped>
</style>
\ No newline at end of file
<style lang="scss" scoped></style>
......@@ -4,15 +4,36 @@
<el-form ref="form" label-width="80px" inline>
<el-form-item label="任务名称">
<span class="selectBox">
<el-select placeholder="请选择" :popper-append-to-body=false v-model="conditions.task_id" @change="getSubTask">
<el-option v-for='item in taskList' :value="item.task_id" :key="item.task_id" :label='item.task_name'></el-option>
<el-select
filterable
placeholder="请选择"
:popper-append-to-body="false"
v-model="conditions.task_id"
@change="getSubTask"
>
<el-option
v-for="item in taskList"
:value="item.task_id"
:key="item.task_id"
:label="item.task_name"
></el-option>
</el-select>
</span>
</el-form-item>
<el-form-item label="视频名称">
<span class="selectBox">
<el-select placeholder="请选择" :popper-append-to-body=false v-model="conditions.subtask_id">
<el-option v-for='item in subTaskList' :value="item.subtask_id" :key="item.subtask_id" :label='item.subtask_name'></el-option>
<el-select
filterable
placeholder="请选择"
:popper-append-to-body="false"
v-model="conditions.subtask_id"
>
<el-option
v-for="item in subTaskList"
:value="item.subtask_id"
:key="item.subtask_id"
:label="item.subtask_name"
></el-option>
</el-select>
</span>
</el-form-item>
......@@ -23,86 +44,179 @@
</el-form-item> -->
<el-form-item label="检索对象">
<span class="selectBox">
<el-select placeholder="请选择" :popper-append-to-body=false v-model="conditions.event_type" @change="typeChange">
<el-select
filterable
placeholder="请选择"
:popper-append-to-body="false"
v-model="conditions.event_type"
@change="typeChange"
>
<el-option value="xcycle" label="非机动车"></el-option>
<el-option value="pedestrian" label="行人"></el-option>
</el-select>
</span>
</el-form-item>
<el-form-item label="对象类型" >
<el-form-item label="对象类型">
<span class="selectBox">
<el-select placeholder="请选择" :popper-append-to-body=false v-model="conditions.xcycle_type">
<el-option value="" label='全部'></el-option>
<el-option value="motorcycle" label="摩托车" v-show="conditions.event_type == 'xcycle'"></el-option>
<el-option value="bicycle" label="自行车" v-show="conditions.event_type == 'xcycle'"></el-option>
<el-option value="tricycle" label="三轮车" v-show="conditions.event_type == 'xcycle'"></el-option>
<el-option value="aaa" label="行人" v-show="conditions.event_type == 'pedestrian'"></el-option>
<el-select
filterable
placeholder="请选择"
:popper-append-to-body="false"
v-model="conditions.xcycle_type"
>
<el-option value="" label="全部"></el-option>
<el-option
value="motorcycle"
label="摩托车"
v-show="conditions.event_type == 'xcycle'"
></el-option>
<el-option
value="bicycle"
label="自行车"
v-show="conditions.event_type == 'xcycle'"
></el-option>
<el-option
value="tricycle"
label="三轮车"
v-show="conditions.event_type == 'xcycle'"
></el-option>
<el-option
value="aaa"
label="行人"
v-show="conditions.event_type == 'pedestrian'"
></el-option>
</el-select>
</span>
</el-form-item>
<el-form-item label="性别">
<span class="selectBox">
<el-select placeholder="请选择" :popper-append-to-body=false v-model="conditions.sex">
<el-select
filterable
placeholder="请选择"
:popper-append-to-body="false"
v-model="conditions.sex"
>
<el-option value="" label="全部"></el-option>
<el-option value="1" label="男"></el-option>
<el-option value="2" label="女"></el-option>
</el-select>
</span>
</el-form-item>
<el-form-item label="运营公司" v-show="conditions.event_type=='xcycle'">
<el-form-item
label="运营公司"
v-show="conditions.event_type == 'xcycle'"
>
<span class="inputBox">
<el-input placeholder="请输入公司名称" v-model="conditions.company"></el-input>
<el-input
placeholder="请输入公司名称"
v-model="conditions.company"
></el-input>
</span>
</el-form-item>
<el-form-item label="车牌号码" v-show="conditions.event_type=='xcycle'">
<el-form-item
label="车牌号码"
v-show="conditions.event_type == 'xcycle'"
>
<span class="inputBox">
<el-input placeholder="请输入车牌号码" v-model="conditions.plate"></el-input>
<el-input
placeholder="请输入车牌号码"
v-model="conditions.plate"
></el-input>
</span>
</el-form-item>
<el-form-item label="是否带盔" v-show="conditions.event_type=='xcycle'">
<el-form-item
label="是否带盔"
v-show="conditions.event_type == 'xcycle'"
>
<span class="selectBox">
<el-select placeholder="请选择" :popper-append-to-body=false v-model="conditions.with_hats">
<el-option value="" label='全部'></el-option>
<el-option :value="0" :key="0" label='不确定'></el-option>
<el-option :value="1" :key="1" label='带盔'></el-option>
<el-option :value="2" :key="2" label='未带盔'></el-option>
<el-select
filterable
placeholder="请选择"
:popper-append-to-body="false"
v-model="conditions.with_hats"
>
<el-option value="" label="全部"></el-option>
<el-option :value="0" :key="0" label="不确定"></el-option>
<el-option :value="1" :key="1" label="带盔"></el-option>
<el-option :value="2" :key="2" label="未带盔"></el-option>
</el-select>
</span>
</el-form-item>
<el-form-item label="是否带帽" v-show="conditions.event_type=='pedestrian'">
<el-form-item
label="是否带帽"
v-show="conditions.event_type == 'pedestrian'"
>
<span class="selectBox">
<el-select placeholder="请选择" :popper-append-to-body=false v-model="conditions.with_hats">
<el-option value="" label='全部'></el-option>
<el-option :value="0" :key="0" label='不确定'></el-option>
<el-option :value="1" :key="1" label='带帽'></el-option>
<el-option :value="2" :key="2" label='不带帽'></el-option>
<el-select
filterable
placeholder="请选择"
:popper-append-to-body="false"
v-model="conditions.with_hats"
>
<el-option value="" label="全部"></el-option>
<el-option :value="0" :key="0" label="不确定"></el-option>
<el-option :value="1" :key="1" label="带帽"></el-option>
<el-option :value="2" :key="2" label="不带帽"></el-option>
</el-select>
</span>
</el-form-item>
<el-form-item label="带口罩" v-show="conditions.event_type=='pedestrian'">
<el-form-item
label="带口罩"
v-show="conditions.event_type == 'pedestrian'"
>
<span class="selectBox">
<el-select placeholder="请选择" :popper-append-to-body=false v-model="conditions.with_hats">
<el-option value="" label='全部'></el-option>
<el-option :value="0" :key="0" label='不确定'></el-option>
<el-option :value="1" :key="1" label='带口罩'></el-option>
<el-option :value="2" :key="2" label='不带口罩'></el-option>
<el-select
filterable
placeholder="请选择"
:popper-append-to-body="false"
v-model="conditions.with_hats"
>
<el-option value="" label="全部"></el-option>
<el-option :value="0" :key="0" label="不确定"></el-option>
<el-option :value="1" :key="1" label="带口罩"></el-option>
<el-option :value="2" :key="2" label="不带口罩"></el-option>
</el-select>
</span>
</el-form-item>
<el-form-item label="上身颜色" v-show="conditions.event_type=='pedestrian'">
<el-form-item
label="上身颜色"
v-show="conditions.event_type == 'pedestrian'"
>
<span class="selectBox">
<el-select placeholder="请选择" :popper-append-to-body=false v-model="conditions.upbodyColor">
<el-option value="" label='全部'></el-option>
<el-option v-for='item in bodyColorList' :value="item.value" :key="item.value" :label='item.label'></el-option>
<el-select
filterable
placeholder="请选择"
:popper-append-to-body="false"
v-model="conditions.upbodyColor"
>
<el-option value="" label="全部"></el-option>
<el-option
v-for="item in bodyColorList"
:value="item.value"
:key="item.value"
:label="item.label"
></el-option>
</el-select>
</span>
</el-form-item>
<el-form-item label="下身颜色" v-show="conditions.event_type=='pedestrian'">
<el-form-item
label="下身颜色"
v-show="conditions.event_type == 'pedestrian'"
>
<span class="selectBox">
<el-select placeholder="请选择" :popper-append-to-body=false v-model="conditions.lobodyColor">
<el-option value="" label='全部'></el-option>
<el-option v-for='item in bodyColorList' :value="item.value" :key="item.value" :label='item.label'></el-option>
<el-select
filterable
placeholder="请选择"
:popper-append-to-body="false"
v-model="conditions.lobodyColor"
>
<el-option value="" label="全部"></el-option>
<el-option
v-for="item in bodyColorList"
:value="item.value"
:key="item.value"
:label="item.label"
></el-option>
</el-select>
</span>
</el-form-item>
......@@ -116,7 +230,8 @@
type="datetimerange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期">
end-placeholder="结束日期"
>
</el-date-picker>
</span>
</el-form-item>
......@@ -124,11 +239,17 @@
</el-col>
<el-col :span="2">
<div style="margin-bottom: 6px;padding-top: 3px;">
<el-button type="primary" style="" @click="query" class="block">查询</el-button>
<el-button type="success" class="block compatibleBtn" @click="exportFun">导出</el-button>
<el-button type="primary" style="" @click="query" class="block"
>查询</el-button
>
<el-button type="success" class="block compatibleBtn" @click="exportFun"
>导出</el-button
>
</div>
<div>
<el-button type="success" class="block" @click="batchdel">批量删除</el-button>
<el-button type="success" class="block" @click="batchdel"
>批量删除</el-button
>
</div>
</el-col>
<div style="">
......@@ -138,89 +259,99 @@
:height="tableHeight"
stripe
border
@selection-change="handleSelectionChange">
<el-table-column
type="selection"
align="center"
width="55">
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" align="center" width="55">
</el-table-column>
<el-table-column
prop="index"
align="center"
label="#"
:formatter="indexFormatter"
width="50">
width="50"
>
</el-table-column>
<el-table-column
prop="xcycle_type_text"
align="center"
label="检测类型">
label="检测类型"
>
</el-table-column>
<el-table-column
prop="driver_face_sex"
align="center"
label="性别">
<el-table-column prop="driver_face_sex" align="center" label="性别">
</el-table-column>
<el-table-column
v-if="conditions.event_type=='xcycle'"
v-if="conditions.event_type == 'xcycle'"
prop="driver_face_with_hats"
align="center"
label="是否带盔">
label="是否带盔"
>
</el-table-column>
<el-table-column
v-if="conditions.event_type=='pedestrian'"
v-if="conditions.event_type == 'pedestrian'"
prop="driver_face_with_hats"
align="center"
label="是否带帽">
label="是否带帽"
>
</el-table-column>
<el-table-column
v-if="conditions.event_type=='pedestrian'"
v-if="conditions.event_type == 'pedestrian'"
prop="driver_face_upbody_text"
align="center"
label="上身颜色">
label="上身颜色"
>
</el-table-column>
<el-table-column
v-if="conditions.event_type=='pedestrian'"
v-if="conditions.event_type == 'pedestrian'"
prop="driver_face_lobody_text"
align="center"
label="下身颜色">
label="下身颜色"
>
</el-table-column>
<el-table-column
v-if="conditions.event_type=='xcycle'"
v-if="conditions.event_type == 'xcycle'"
prop="xcycle_plate_text"
align="center"
label="车牌号码">
label="车牌号码"
>
</el-table-column>
<el-table-column
v-if="conditions.event_type=='xcycle'"
v-if="conditions.event_type == 'xcycle'"
prop="company"
align="center"
label="运营公司">
label="运营公司"
>
</el-table-column>
<el-table-column
prop="shoot_date"
align="center"
label="抓拍时间">
<el-table-column prop="shoot_date" align="center" label="抓拍时间">
<template slot-scope="scope">
<span>{{scope.row.shoot_date}} {{scope.row.shoot_time}}</span>
<span>{{ scope.row.shoot_date }} {{ scope.row.shoot_time }}</span>
</template>
</el-table-column>
<el-table-column
prop="location_name"
align="center"
label="抓拍地点">
<el-table-column prop="location_name" align="center" label="抓拍地点">
</el-table-column>
<el-table-column
align="center"
label="操作">
<el-table-column align="center" label="操作">
<template slot-scope="scope">
<el-tooltip content="详情" placement="bottom" effect="light" :visible-arrow=false>
<span class="el-icon-info editIcon" @click="detailFun(scope.$index, scope.row)"></span>
<el-tooltip
content="详情"
placement="bottom"
effect="light"
:visible-arrow="false"
>
<span
class="el-icon-info editIcon"
@click="detailFun(scope.$index, scope.row)"
></span>
</el-tooltip>
<span class="tableSpanBorder"></span>
<el-tooltip content="删除" placement="bottom" effect="light" :visible-arrow=false>
<span class="el-icon-delete delIcon" @click="delFun(scope.$index, scope.row)"></span>
<el-tooltip
content="删除"
placement="bottom"
effect="light"
:visible-arrow="false"
>
<span
class="el-icon-delete delIcon"
@click="delFun(scope.$index, scope.row)"
></span>
</el-tooltip>
</template>
</el-table-column>
......@@ -236,7 +367,8 @@
:current-page="page"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:total="total">
:total="total"
>
</el-pagination>
<div style="clear: both;"></div>
</div>
......@@ -246,13 +378,18 @@
top="12vh"
:visible.sync="detailVisible"
class="detailDialog"
width="1000px">
width="1000px"
>
<div style="position: relative;padding: 10px 20px;">
<!-- <div class="leftArrow" @click="leftFun"><i class="el-icon-d-arrow-left"></i></div> -->
<div class="detaiCon">
<el-image style="width: 100%;" :src="this.detailImg">
<div slot="error" class="image-slot">
<img :src="carImg" alt="" style="width: 36%;display: block;margin: 0 auto;">
<img
:src="carImg"
alt=""
style="width: 36%;display: block;margin: 0 auto;"
/>
</div>
</el-image>
<el-form label-width="80px" inline>
......@@ -263,10 +400,14 @@
<span>{{ detailObj.location_name }}</span>
</el-form-item>
<el-form-item label="经过日期:">
<span>{{ detailObj.shoot_date ? detailObj.shoot_date : '' }}</span>
<span>{{
detailObj.shoot_date ? detailObj.shoot_date : ""
}}</span>
</el-form-item>
<el-form-item label="经过时间:">
<span>{{ detailObj.shoot_time ? detailObj.shoot_time : '' }}</span>
<span>{{
detailObj.shoot_time ? detailObj.shoot_time : ""
}}</span>
</el-form-item>
<el-form-item label="身高:">
......@@ -298,7 +439,9 @@
<!-- <div class="rightArrow" @click="rightFun"><i class="el-icon-d-arrow-right"></i></div> -->
</div>
<span slot="footer" class="dialog-footer">
<el-button type="danger" @click="detailDel" class="leftButton">删 除</el-button>
<el-button type="danger" @click="detailDel" class="leftButton"
>删 除</el-button
>
<el-button type="primary" @click="leftFun">上一条</el-button>
<el-button type="primary" @click="rightFun">下一条</el-button>
<el-button @click="detailVisible = false">关 闭</el-button>
......@@ -307,103 +450,111 @@
</div>
</template>
<script>
export default {
data(){
let start_dt = this.$moment('2019-12-20').format('YYYY-MM-DD')+' 00:00:00';
let end_dt = this.$moment().format('YYYY-MM-DD')+' 23:59:59';
return{
detailObj:{},
carImg:require("@/assets/img/home/defaultImg.png"),
bodyColorList:this.$buildCode.getCodeList('车身颜色'),
detailImg:'',
detailVisible:false,
loading:false,
dates:[ start_dt,end_dt ],
export default {
data() {
let start_dt =
this.$moment("2019-12-20").format("YYYY-MM-DD") + " 00:00:00";
let end_dt = this.$moment().format("YYYY-MM-DD") + " 23:59:59";
return {
detailObj: {},
carImg: require("@/assets/img/home/defaultImg.png"),
bodyColorList: this.$buildCode.getCodeList("车身颜色"),
detailImg: "",
detailVisible: false,
loading: false,
dates: [start_dt, end_dt],
conditions: {
start_dt:start_dt,
end_dt:end_dt,
event_type: 'xcycle',
subtask_id:'',
task_id:'',
xcycle_type:'',
sex:'',
company:'',
with_hats:'',
plate:'',
upbodyColor:'',
lobodyColor:''
start_dt: start_dt,
end_dt: end_dt,
event_type: "xcycle",
subtask_id: "",
task_id: "",
xcycle_type: "",
sex: "",
company: "",
with_hats: "",
plate: "",
upbodyColor: "",
lobodyColor: ""
},
brandList:this.$buildCode.getCodeList('车辆品牌'),
vehicleTypeList:this.$buildCode.getCodeList('车辆类型'),
vehicleColorList:this.$buildCode.getCodeList('车身颜色'),
tableData:[],
formatterData:[],
total:0,
page:1,
pageSize:30,
selectcheck:[],
currentIndex:0,
taskList:[],
subTaskList:[],
tableHeight:window.twoSearchTableHeight,
}
brandList: this.$buildCode.getCodeList("车辆品牌"),
vehicleTypeList: this.$buildCode.getCodeList("车辆类型"),
vehicleColorList: this.$buildCode.getCodeList("车身颜色"),
tableData: [],
formatterData: [],
total: 0,
page: 1,
pageSize: 30,
selectcheck: [],
currentIndex: 0,
taskList: [],
subTaskList: [],
tableHeight: window.twoSearchTableHeight
};
},
watch:{
dates(val){
this.conditions.start_dt=val[0];
this.conditions.end_dt=val[1];
watch: {
dates(val) {
this.conditions.start_dt = val[0];
this.conditions.end_dt = val[1];
}
},
components:{},
mounted(){
components: {},
mounted() {
this.getTaskList();
this.getData()
this.getData();
},
methods:{
indexFormatter(row, column, cellValue, index){
return index+(this.page-1)*this.pageSize+1;
methods: {
indexFormatter(row, column, cellValue, index) {
return index + (this.page - 1) * this.pageSize + 1;
},
getTaskList(){
this.$api.task.getTask({
getTaskList() {
this.$api.task
.getTask({
source_type: "pull_video_stream",
task_type: "normal"
}).then(res=>{
this.taskList=res.list_data;
this.taskList.unshift({
task_id:'',
task_name:'全部'
})
})
.then(res => {
this.taskList = res.list_data;
this.taskList.unshift({
task_id: "",
task_name: "全部"
});
});
},
getSubTask(){
getSubTask() {
this.$api.task.getSubTask(this.conditions.task_id).then(res => {
if(res.list_data==null){
this.subTaskList=[];
}else{
if (res.list_data == null) {
this.subTaskList = [];
} else {
this.subTaskList = res.list_data;
}
this.subTaskList.unshift({
subtask_id:'',
subtask_name:'全部'
})
this.conditions.subtask_id='';
})
subtask_id: "",
subtask_name: "全部"
});
this.conditions.subtask_id = "";
});
},
typeChange(){
this.conditions.xcycle_type='';
typeChange() {
this.conditions.xcycle_type = "";
},
exportFun(){
let url='';
if(this.conditions.event_type=='xcycle'){
url = process.env.VUE_APP_URL+
exportFun() {
let url = "";
if (this.conditions.event_type == "xcycle") {
url =
process.env.VUE_APP_URL +
"/api/v1/traffic/events/export?s=" +
Math.random() +
"&event_type=" +
this.conditions.event_type +
"&event_dt__gte=" +
this.$moment(this.conditions.start_dt).utc().format('YYYY-MM-DD HH:mm:ss') +
this.$moment(this.conditions.start_dt)
.utc()
.format("YYYY-MM-DD HH:mm:ss") +
"&event_dt__lt=" +
this.$moment(this.conditions.end_dt).utc().format('YYYY-MM-DD HH:mm:ss') +
this.$moment(this.conditions.end_dt)
.utc()
.format("YYYY-MM-DD HH:mm:ss") +
"&xcycle_type=" +
this.conditions.xcycle_type +
"&sex=" +
......@@ -417,17 +568,22 @@
"&with_hats=" +
this.conditions.with_hats +
"&plate_number__like=" +
this.conditions.plate
}else{
url = process.env.VUE_APP_URL+
this.conditions.plate;
} else {
url =
process.env.VUE_APP_URL +
"/api/v1/traffic/events/export?s=" +
Math.random() +
"&event_type=" +
this.conditions.event_type +
"&event_dt__gte=" +
this.$moment(this.conditions.start_dt).utc().format('YYYY-MM-DD HH:mm:ss') +
this.$moment(this.conditions.start_dt)
.utc()
.format("YYYY-MM-DD HH:mm:ss") +
"&event_dt__lt=" +
this.$moment(this.conditions.end_dt).utc().format('YYYY-MM-DD HH:mm:ss') +
this.$moment(this.conditions.end_dt)
.utc()
.format("YYYY-MM-DD HH:mm:ss") +
"&sex=" +
this.conditions.sex +
"&task_id=" +
......@@ -436,186 +592,196 @@
this.conditions.subtask_id +
"&with_hats=" +
this.conditions.with_hats +
'&upbodyColor='+this.conditions.upbodyColor+
'&lobodyColor='+this.conditions.lobodyColor
"&upbodyColor=" +
this.conditions.upbodyColor +
"&lobodyColor=" +
this.conditions.lobodyColor;
}
window.open(
encodeURI(url)
);
window.open(encodeURI(url));
},
batchdel(){
if(this.selectcheck.length==0){
batchdel() {
if (this.selectcheck.length == 0) {
this.$message({
message: '请选择至少一条记录',
type: 'warning'
message: "请选择至少一条记录",
type: "warning"
});
return false
return false;
}
this.$confirm('此操作将永久删除选中记录, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
this.$confirm("此操作将永久删除选中记录, 是否继续?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$api.search.patchdel({
"event_unids":this.selectcheck
}).then(res=>{
if(res.ecode == '200'){
this.$api.search
.patchdel({
event_unids: this.selectcheck
})
.then(res => {
if (res.ecode == "200") {
this.$message({
type: 'success',
message: '删除成功!'
type: "success",
message: "删除成功!"
});
this.getData();
}else{
this.$message.error('删除失败!');
} else {
this.$message.error("删除失败!");
}
})
})
});
});
},
leftFun(){
if(this.currentIndex-1<0){
leftFun() {
if (this.currentIndex - 1 < 0) {
this.$message({
message: '目前为第一条',
type: 'warning'
message: "目前为第一条",
type: "warning"
});
return false;
}
this.detailObj=this.formatterData[this.currentIndex-1];
this.currentIndex-=1;
this.detailObj = this.formatterData[this.currentIndex - 1];
this.currentIndex -= 1;
this.getImg(this.detailObj.pics[0].pic_unid);
},
rightFun(){
if(this.currentIndex==this.formatterData.length-1){
rightFun() {
if (this.currentIndex == this.formatterData.length - 1) {
this.$message({
message: '目前为最后一条',
type: 'warning'
message: "目前为最后一条",
type: "warning"
});
return false;
}
this.detailObj=this.formatterData[this.currentIndex+1];
this.currentIndex+=1;
this.detailObj = this.formatterData[this.currentIndex + 1];
this.currentIndex += 1;
this.getImg(this.detailObj.pics[0].pic_unid);
},
handleSelectionChange(obj){
handleSelectionChange(obj) {
this.selectcheck = [];
obj.forEach(item => {
this.selectcheck.push(item.id)
this.selectcheck.push(item.id);
});
},
handleSizeChange(val) {
this.pageSize=val;
this.pageSize = val;
this.getData();
},
handleCurrentChange(val) {
this.page=val;
this.page = val;
this.getData();
},
query(){
query() {
this.getData();
},
getData(){
this.loading=true;
this.formatterData=[];
getData() {
this.loading = true;
this.formatterData = [];
let offset = (this.page - 1) * this.pageSize;
let search_params = {
limit: this.pageSize,
offset: offset,
event_dt__gte: this.$moment(this.conditions.start_dt).utc().format('YYYY-MM-DD HH:mm:ss'),
event_dt__lt:this.$moment(this.conditions.end_dt).utc().format('YYYY-MM-DD HH:mm:ss'),
event_dt__gte: this.$moment(this.conditions.start_dt)
.utc()
.format("YYYY-MM-DD HH:mm:ss"),
event_dt__lt: this.$moment(this.conditions.end_dt)
.utc()
.format("YYYY-MM-DD HH:mm:ss"),
task_id: this.conditions.task_id,
subtask_id: this.conditions.subtask_id,
event_type: this.conditions.event_type,
sex: this.conditions.sex,
with_hats: this.conditions.with_hats
};
if (this.conditions.event_type == "xcycle") {
search_params.xcycle_type = this.conditions.xcycle_type;
search_params.company_like = this.conditions.company;
search_params.plate_number__like = this.conditions.plate;
} else {
search_params.upbodyColor = this.conditions.upbodyColor;
search_params.lobodyColor = this.conditions.lobodyColor;
}
if( this.conditions.event_type=='xcycle'){
search_params.xcycle_type=this.conditions.xcycle_type;
search_params.company_like=this.conditions.company;
search_params.plate_number__like=this.conditions.plate;
}else{
search_params.upbodyColor=this.conditions.upbodyColor;
search_params.lobodyColor=this.conditions.lobodyColor;
}
this.$api.search.tableList(search_params
).then((res)=>{
this.total=res.total_num;
res.list_data.forEach((item,index)=>{
this.$api.search
.tableList(search_params)
.then(res => {
this.total = res.total_num;
res.list_data.forEach((item, index) => {
this.formatterData.push(this.$buildCode.init(item));
});
this.loading = false;
})
this.loading=false;
}).catch((err)=>{
})
.catch(err => {});
},
getImg(unid){
this.$api.search.detailImg({
},unid).then(res=>{
this.detailImg=res.pic_url ? res.pic_url : carImg;
}).catch(e=>{
getImg(unid) {
this.$api.search
.detailImg({}, unid)
.then(res => {
this.detailImg = res.pic_url ? res.pic_url : carImg;
})
.catch(e => {});
},
detailFun(index,row){
this.currentIndex=index;
if(row.pics.length>0){
this.detailObj = Object.assign({},row);
detailFun(index, row) {
this.currentIndex = index;
if (row.pics.length > 0) {
this.detailObj = Object.assign({}, row);
this.getImg(row.pics[0].pic_unid);
}
this.detailVisible=true;
this.detailVisible = true;
},
delFun(index,row){
this.$confirm('此操作将永久删除该记录, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
delFun(index, row) {
this.$confirm("此操作将永久删除该记录, 是否继续?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$api.search.delVehicle({
},row.id).then(res=>{
if(res.ecode==200){
this.$api.search
.delVehicle({}, row.id)
.then(res => {
if (res.ecode == 200) {
this.formatterData.splice(index);
this.$message({
type: 'success',
message: '删除成功!'
type: "success",
message: "删除成功!"
});
}else{
this.$message.error('删除失败!');
this.getData();
} else {
this.$message.error("删除失败!");
}
}).catch(e=>{
this.$message.error('删除失败!');
})
})
.catch(e => {
this.$message.error("删除失败!");
});
});
},
detailDel(){
this.$confirm('此操作将永久删除该记录, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
detailDel() {
this.$confirm("此操作将永久删除该记录, 是否继续?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$api.search.delVehicle({},this.detailObj.id).then(res=>{
if(res.ecode==200){
this.formatterData.splice(this.currentIndex,1);
this.detailObj = Object.assign({},this.formatterData[this.currentIndex]);
this.getImg(this.formatterData[this.currentIndex].pics[0].pic_unid);
this.$api.search
.delVehicle({}, this.detailObj.id)
.then(res => {
if (res.ecode == 200) {
this.formatterData.splice(this.currentIndex, 1);
this.detailObj = Object.assign(
{},
this.formatterData[this.currentIndex]
);
this.getImg(
this.formatterData[this.currentIndex].pics[0].pic_unid
);
this.$message({
type: 'success',
message: '删除成功!'
type: "success",
message: "删除成功!"
});
}else{
this.$message.error('删除失败!');
} else {
this.$message.error("删除失败!");
}
}).catch(e=>{
this.$message.error('删除失败!');
})
})
.catch(e => {
this.$message.error("删除失败!");
});
});
}
},
}
};
</script>
<style lang="scss" scoped>
</style>
\ No newline at end of file
<style lang="scss" scoped></style>
......@@ -2,20 +2,31 @@
<div class="innnerBox">
<el-col :span="22">
<el-form ref="form" label-width="80px" inline>
<el-form-item label="抓拍地点" >
<el-form-item label="抓拍地点">
<span class="inputBox">
<el-input placeholder="请输入抓拍地点" v-model="conditions.location_name"></el-input>
<el-input
placeholder="请输入抓拍地点"
v-model="conditions.location_name"
></el-input>
</span>
</el-form-item>
<el-form-item label="任务名称">
<span class="inputBox">
<el-input placeholder="请输入任务名称" v-model="conditions.task_name"></el-input>
<el-input
placeholder="请输入任务名称"
v-model="conditions.task_name"
></el-input>
</span>
</el-form-item>
<el-form-item label="非机动车类型" label-width="110px" >
<el-form-item label="非机动车类型" label-width="110px">
<span class="selectBox">
<el-select placeholder="请选择" :popper-append-to-body=false v-model="conditions.xcycle_type">
<el-option value="" label='全部'></el-option>
<el-select
filterable
placeholder="请选择"
:popper-append-to-body="false"
v-model="conditions.xcycle_type"
>
<el-option value="" label="全部"></el-option>
<el-option value="motorcycle" label="摩托车"></el-option>
<el-option value="bicycle" label="自行车"></el-option>
<el-option value="tricycle" label="三轮车"></el-option>
......@@ -31,7 +42,8 @@
type="datetimerange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期">
end-placeholder="结束日期"
>
</el-date-picker>
</span>
</el-form-item>
......@@ -39,11 +51,17 @@
</el-col>
<el-col :span="2">
<div style="margin-bottom: 6px;padding-top: 3px;">
<el-button type="primary" style="" @click="query" class="block">查询</el-button>
<el-button type="success" class="block" @click="exportFun">导出</el-button>
<el-button type="primary" style="" @click="query" class="block"
>查询</el-button
>
<el-button type="success" class="block" @click="exportFun"
>导出</el-button
>
</div>
<div>
<el-button type="success" class="block" @click="batchdel">批量删除</el-button>
<el-button type="success" class="block" @click="batchdel"
>批量删除</el-button
>
</div>
</el-col>
<div style="">
......@@ -52,50 +70,55 @@
height="574"
stripe
border
@selection-change="handleSelectionChange">
<el-table-column
type="selection"
align="center"
width="55">
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" align="center" width="55">
</el-table-column>
<el-table-column
prop="xcycle_type_text"
align="center"
label="非机动车类型 ">
label="非机动车类型 "
>
</el-table-column>
<el-table-column
prop="xcycle_plate_text"
align="center"
label="车牌号码 ">
label="车牌号码 "
>
</el-table-column>
<el-table-column
prop="shoot_date"
align="center"
label="抓拍时间">
<el-table-column prop="shoot_date" align="center" label="抓拍时间">
<template slot-scope="scope">
<span>{{scope.row.shoot_date}} {{scope.row.shoot_time}}</span>
<span>{{ scope.row.shoot_date }} {{ scope.row.shoot_time }}</span>
</template>
</el-table-column>
<el-table-column
prop="location_name"
align="center"
label="抓拍地点">
<el-table-column prop="location_name" align="center" label="抓拍地点">
</el-table-column>
<el-table-column
prop="company"
align="center"
label="运营公司 ">
<el-table-column prop="company" align="center" label="运营公司 ">
</el-table-column>
<el-table-column
align="center"
label="操作">
<el-table-column align="center" label="操作">
<template slot-scope="scope">
<el-tooltip content="详情" placement="bottom" effect="light" :visible-arrow=false>
<span class="el-icon-info editIcon" @click="detailFun(scope.$index, scope.row)"></span>
<el-tooltip
content="详情"
placement="bottom"
effect="light"
:visible-arrow="false"
>
<span
class="el-icon-info editIcon"
@click="detailFun(scope.$index, scope.row)"
></span>
</el-tooltip>
<span class="tableSpanBorder"></span>
<el-tooltip content="删除" placement="bottom" effect="light" :visible-arrow=false>
<span class="el-icon-delete delIcon" @click="delFun(scope.$index, scope.row)"></span>
<el-tooltip
content="删除"
placement="bottom"
effect="light"
:visible-arrow="false"
>
<span
class="el-icon-delete delIcon"
@click="delFun(scope.$index, scope.row)"
></span>
</el-tooltip>
</template>
</el-table-column>
......@@ -111,7 +134,8 @@
:current-page="page"
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:total="total">
:total="total"
>
</el-pagination>
<div style="clear: both;"></div>
</div>
......@@ -120,13 +144,20 @@
title="详情"
top="12vh"
:visible.sync="detailVisible"
width="700px">
width="700px"
>
<div style="position: relative;padding: 10px 20px;">
<div class="leftArrow" @click="leftFun"><i class="el-icon-d-arrow-left"></i></div>
<div class="leftArrow" @click="leftFun">
<i class="el-icon-d-arrow-left"></i>
</div>
<div class="detaiCon">
<el-image style="width: 100%;" :src="this.detailImg">
<div slot="error" class="image-slot">
<img :src="carImg" alt="" style="width: 40%;display: block;margin: 0 auto;">
<img
:src="carImg"
alt=""
style="width: 40%;display: block;margin: 0 auto;"
/>
</div>
</el-image>
<el-form label-width="120px" inline>
......@@ -140,10 +171,14 @@
</div>
<div>
<el-form-item label="经过日期:">
<span>{{ detailObj.shoot_date ? detailObj.shoot_date : '' }}</span>
<span>{{
detailObj.shoot_date ? detailObj.shoot_date : ""
}}</span>
</el-form-item>
<el-form-item label="经过时间:">
<span>{{ detailObj.shoot_time ? detailObj.shoot_time : '' }}</span>
<span>{{
detailObj.shoot_time ? detailObj.shoot_time : ""
}}</span>
</el-form-item>
</div>
<div>
......@@ -180,67 +215,76 @@
</div>
</el-form>
</div>
<div class="rightArrow" @click="rightFun"><i class="el-icon-d-arrow-right"></i></div>
<div class="rightArrow" @click="rightFun">
<i class="el-icon-d-arrow-right"></i>
</div>
</div>
<span slot="footer" class="dialog-footer">
<el-button @click="detailDel">删 除</el-button>
<el-button type="primary" @click="detailVisible = false">关 闭</el-button>
<el-button type="primary" @click="detailVisible = false"
>关 闭</el-button
>
</span>
</el-dialog>
</div>
</template>
<script>
export default {
data(){
let start_dt = this.$moment('2019-12-20').format('YYYY-MM-DD')+' 00:00:00';
let end_dt = this.$moment().format('YYYY-MM-DD')+' 23:59:59';
return{
detailObj:{},
carImg:require("@/assets/img/home/defaultImg.png"),
detailImg:'',
detailVisible:false,
dates:[ start_dt,end_dt ],
export default {
data() {
let start_dt =
this.$moment("2019-12-20").format("YYYY-MM-DD") + " 00:00:00";
let end_dt = this.$moment().format("YYYY-MM-DD") + " 23:59:59";
return {
detailObj: {},
carImg: require("@/assets/img/home/defaultImg.png"),
detailImg: "",
detailVisible: false,
dates: [start_dt, end_dt],
conditions: {
start_dt:start_dt,
end_dt:end_dt,
event_type: 'xcycle',
xcycle_type:'',
location_name:'',
task_name:''
start_dt: start_dt,
end_dt: end_dt,
event_type: "xcycle",
xcycle_type: "",
location_name: "",
task_name: ""
},
brandList:this.$buildCode.getCodeList('车辆品牌'),
vehicleTypeList:this.$buildCode.getCodeList('车辆类型'),
vehicleColorList:this.$buildCode.getCodeList('车身颜色'),
tableData:[],
formattterData:[],
total:0,
page:1,
pageSize:30,
selectcheck:[],
currentIndex:0
}
brandList: this.$buildCode.getCodeList("车辆品牌"),
vehicleTypeList: this.$buildCode.getCodeList("车辆类型"),
vehicleColorList: this.$buildCode.getCodeList("车身颜色"),
tableData: [],
formattterData: [],
total: 0,
page: 1,
pageSize: 30,
selectcheck: [],
currentIndex: 0
};
},
watch:{
dates(val){
this.conditions.start_dt=val[0];
this.conditions.end_dt=val[1];
watch: {
dates(val) {
this.conditions.start_dt = val[0];
this.conditions.end_dt = val[1];
}
},
components:{},
mounted(){
this.getData()
components: {},
mounted() {
this.getData();
},
methods:{
exportFun(){
methods: {
exportFun() {
window.open(
encodeURI(
process.env.VUE_APP_URL+
process.env.VUE_APP_URL +
"/api/v1/traffic/events/export?s=" +
Math.random() +
"&event_type=xcycle&event_dt__gte=" +
this.$moment(this.conditions.start_dt).utc().format('YYYY-MM-DD HH:mm:ss') +
this.$moment(this.conditions.start_dt)
.utc()
.format("YYYY-MM-DD HH:mm:ss") +
"&event_dt__lt=" +
this.$moment(this.conditions.end_dt).utc().format('YYYY-MM-DD HH:mm:ss') +
this.$moment(this.conditions.end_dt)
.utc()
.format("YYYY-MM-DD HH:mm:ss") +
"&xcycle_type=" +
this.conditions.xcycle_type +
"&location_name=" +
......@@ -250,168 +294,179 @@
)
);
},
batchdel(){
if(this.selectcheck.length==0){
batchdel() {
if (this.selectcheck.length == 0) {
this.$message({
message: '请选择至少一条记录',
type: 'warning'
message: "请选择至少一条记录",
type: "warning"
});
return false
return false;
}
this.$confirm('此操作将永久删除选中记录, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
this.$confirm("此操作将永久删除选中记录, 是否继续?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$api.search.patchdel({
"event_unids":this.selectcheck
}).then(res=>{
if(res.ecode == '200'){
this.$api.search
.patchdel({
event_unids: this.selectcheck
})
.then(res => {
if (res.ecode == "200") {
this.$message({
type: 'success',
message: '删除成功!'
type: "success",
message: "删除成功!"
});
this.getData();
}else{
this.$message.error('删除失败!');
} else {
this.$message.error("删除失败!");
}
})
})
});
});
},
leftFun(){
if(this.currentIndex-1<0){
leftFun() {
if (this.currentIndex - 1 < 0) {
this.$message({
message: '目前为第一条',
type: 'warning'
message: "目前为第一条",
type: "warning"
});
return false;
}
this.detailObj=this.formattterData[this.currentIndex-1];
this.currentIndex-=1;
this.detailObj = this.formattterData[this.currentIndex - 1];
this.currentIndex -= 1;
this.getImg(this.detailObj.pics[0].pic_unid);
},
rightFun(){
if(this.currentIndex==this.formattterData.length-1){
rightFun() {
if (this.currentIndex == this.formattterData.length - 1) {
this.$message({
message: '目前为最后一条',
type: 'warning'
message: "目前为最后一条",
type: "warning"
});
return false;
}
this.detailObj=this.formattterData[this.currentIndex+1];
this.currentIndex+=1;
this.detailObj = this.formattterData[this.currentIndex + 1];
this.currentIndex += 1;
this.getImg(this.detailObj.pics[0].pic_unid);
},
handleSelectionChange(obj){
handleSelectionChange(obj) {
this.selectcheck = [];
obj.forEach(item => {
this.selectcheck.push(item.id)
this.selectcheck.push(item.id);
});
},
handleSizeChange(val) {
this.pageSize=val;
this.pageSize = val;
this.getData();
},
handleCurrentChange(val) {
this.page=val;
this.page = val;
this.getData();
},
query(){
query() {
this.getData();
},
getData(){
this.formattterData=[];
getData() {
this.formattterData = [];
let offset = (this.page - 1) * this.pageSize;
let search_params = {
limit: this.pageSize,
offset: offset,
event_dt__gte: this.$moment(this.conditions.start_dt).utc().format('YYYY-MM-DD HH:mm:ss'),
event_dt__lt:this.$moment(this.conditions.end_dt).utc().format('YYYY-MM-DD HH:mm:ss'),
task_name: this.conditions.task_name ? this.conditions.task_name.replace(/\s\s*/g, '') : this.conditions.task_name,
event_dt__gte: this.$moment(this.conditions.start_dt)
.utc()
.format("YYYY-MM-DD HH:mm:ss"),
event_dt__lt: this.$moment(this.conditions.end_dt)
.utc()
.format("YYYY-MM-DD HH:mm:ss"),
task_name: this.conditions.task_name
? this.conditions.task_name.replace(/\s\s*/g, "")
: this.conditions.task_name,
event_type: "xcycle",
xcycle_type: this.conditions.xcycle_type,
location_name: this.conditions.location_name
}
this.$api.search.tableList(search_params
).then((res)=>{
this.total=res.total_num;
res.list_data.forEach((item,index)=>{
};
this.$api.search
.tableList(search_params)
.then(res => {
this.total = res.total_num;
res.list_data.forEach((item, index) => {
this.formattterData.push(this.$buildCode.init(item));
});
})
}).catch((err)=>{
})
.catch(err => {});
},
getImg(unid){
this.$api.search.detailImg({
},unid).then(res=>{
this.detailImg=res.pic_url ? res.pic_url : carImg;
}).catch(e=>{
getImg(unid) {
this.$api.search
.detailImg({}, unid)
.then(res => {
this.detailImg = res.pic_url ? res.pic_url : carImg;
})
.catch(e => {});
},
detailFun(index,row){
this.currentIndex=index;
if(row.pics.length>0){
this.detailObj = Object.assign({},row);
detailFun(index, row) {
this.currentIndex = index;
if (row.pics.length > 0) {
this.detailObj = Object.assign({}, row);
this.getImg(row.pics[0].pic_unid);
}
this.detailVisible=true;
this.detailVisible = true;
},
delFun(index,row){
this.$confirm('此操作将永久删除该记录, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
delFun(index, row) {
this.$confirm("此操作将永久删除该记录, 是否继续?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$api.search.delVehicle({
},row.id).then(res=>{
if(res.ecode==200){
this.$api.search
.delVehicle({}, row.id)
.then(res => {
if (res.ecode == 200) {
this.formattterData.splice(index);
this.$message({
type: 'success',
message: '删除成功!'
type: "success",
message: "删除成功!"
});
}else{
this.$message.error('删除失败!');
} else {
this.$message.error("删除失败!");
}
}).catch(e=>{
this.$message.error('删除失败!');
})
})
.catch(e => {
this.$message.error("删除失败!");
});
});
},
detailDel(){
this.$confirm('此操作将永久删除该记录, 是否继续?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
detailDel() {
this.$confirm("此操作将永久删除该记录, 是否继续?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$api.search.delVehicle({},this.detailObj.id).then(res=>{
if(res.ecode==200){
this.formattterData.splice(this.currentIndex,1);
this.detailObj = Object.assign({},this.formattterData[this.currentIndex]);
this.getImg(this.formattterData[this.currentIndex].pics[0].pic_unid);
this.$api.search
.delVehicle({}, this.detailObj.id)
.then(res => {
if (res.ecode == 200) {
this.formattterData.splice(this.currentIndex, 1);
this.detailObj = Object.assign(
{},
this.formattterData[this.currentIndex]
);
this.getImg(
this.formattterData[this.currentIndex].pics[0].pic_unid
);
this.$message({
type: 'success',
message: '删除成功!'
type: "success",
message: "删除成功!"
});
}else{
this.$message.error('删除失败!');
} else {
this.$message.error("删除失败!");
}
}).catch(e=>{
this.$message.error('删除失败!');
})
})
.catch(e => {
this.$message.error("删除失败!");
});
});
}
},
}
};
</script>
<style lang="scss" scoped>
</style>
\ No newline at end of file
<style lang="scss" scoped></style>
......@@ -12,20 +12,32 @@
label-width="80px"
:model="formData"
:rules="rules"
ref="taskForm"
>
<el-form-item
label="任务名称"
prop="task_name"
class="form-item"
:rules="[
{ required: true, message: '请输入任务名称', trigger: 'blur' }
]"
>
<el-form-item label="任务名称" prop="taskname" class="form-item">
<el-input
v-model="formData.task_name"
placeholder="请输入任务名称"
></el-input>
</el-form-item>
<el-form-item label="算法类型" prop="algotype" class="form-item">
<el-form-item
label="算法类型"
prop="task_algo_type"
class="form-item"
>
<el-select
v-model="formData.task_algo_type"
placeholder="请选择"
:popper-append-to-body="false"
>
<el-option value label="--"></el-option>
<el-option value="" label="--"></el-option>
<el-option value="0" label="交通"></el-option>
<el-option value="1" label="客流"></el-option>
<el-option value="2" label="行为分析"></el-option>
......@@ -33,13 +45,16 @@
<el-option value="5" label="交通行人"></el-option>
</el-select>
</el-form-item>
<el-form-item label="场景占用" class="form-item">
<el-input
<el-form-item label="场景占用" class="form-item" prop="resource_use">
<el-select
v-model="formData.resource_use"
placeholder="请选择"
:popper-append-to-body="false"
>
</el-input>
<el-option value="1" label="1 (200w-300w像素)"></el-option>
<el-option value="2" label="2 (400w-600w像素)"></el-option>
<el-option value="2.5" label="2.5 (700w-900w像素)"></el-option>
</el-select>
</el-form-item>
<el-form-item label="时间计划" class="form-item">
<el-select v-model="formData.period">
......@@ -47,16 +62,33 @@
<el-option :value="false" label="时间"></el-option>
</el-select>
</el-form-item>
<el-form-item label="时间" v-show="formData.plate_time != 'day'" prop="timer" class="form-item">
<el-date-picker
style="width:100%"
<el-form-item
label="时间"
v-show="formData.plate_time != 'day'"
prop="timer"
class="form-item"
>
<!-- <el-date-picker
v-model="formData.timer"
value-format="yyyy-MM-dd"
type="daterange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
></el-date-picker>
></el-date-picker> -->
<el-time-picker
is-range
style="width:100%"
value-format="HH:mm:ss"
v-model="timer"
range-separator="至"
start-placeholder="开始时间"
end-placeholder="结束时间"
placeholder="选择时间范围"
:disabled="pedittype != 'add'"
>
</el-time-picker>
</el-form-item>
<el-form-item label="存储配置" class="form-item">
<el-select
......@@ -73,13 +105,13 @@
</el-select>
</el-form-item>
<el-form-item label="设备类型" class="form-item">
<el-select v-model="formData.plate_type">
<el-select v-model="formData.plate_type" :disabled="pedittype != 'add'">
<el-option
v-for="(item, index) in freeList"
v-for="(item, index) in platT"
:key="index"
:value="item.device_id"
:value="item"
>
{{ item.device_id }}
{{ item }}
</el-option>
</el-select>
</el-form-item>
......@@ -109,26 +141,29 @@ export default {
data() {
return {
setvisible: false,
timer:["00:00:00", "23:59:59"],
formData: {
task_name: "",
task_algo_type: "",
timer: "",
store_conf: {
unid: ""
},
priority: "",
priority: "normal",
period: true
},
vchanAry: [],
platT: [],
sessionData: {},
store_confs: [],
rules: {
taskname: [{ required: true, message: "请输入任务名称", trigger: "blur" }],
algotype: [
{ required: true, message: "请选择算法类型", trigger: "blur" }
task_algo_type: [
{ required: true, message: "请选择算法类型", trigger: "change" }
],
stores: [
{ required: true, message: "存储配置不能为空!", trigger: "change" }
],
timer: [
{ required: true, message: "时间设置不能为空", trigger: "blur" }
resource_use:[
{ required: true, message: "场景占用不能为空!", trigger: "change" }
]
}
};
......@@ -140,33 +175,50 @@ export default {
},
freeList: {
type: Array,
// eslint-disable-next-line vue/require-valid-default-prop
default: []
}
},
watch: {},
mounted() {
console.log("mounted", this.formData);
},
mounted() {},
methods: {
getFress() {
if (this.freeList && this.freeList.length > 0) {
var freeArr = [];
this.freeList.forEach(ele => {
if (ele.license_info && ele.license_info.platType) {
this.platT.push(ele.license_info.platType);
}
});
this.platT = new Set(this.platT);
}
},
initData(type, pdata) {
debugger;
this.platT = [];
this.setvisible = true;
if (type == "add") {
//timer单独拿到form外层是因为element一个bug放到内层后不能修改时间
this.timer = ["00:00:00", "23:59:59"];
this.formData = {
task_name: "",
task_algo_type: "",
timer: "",
store_conf: {
unid: ""
},
priority: "",
priority: "normal",
plate_type: "",
plate_time: "",
period: true
};
}
if (type == "edit") {
pdata.timer = [pdata.start_dt, pdata.end_dt];
if (pdata.start_time) {
let startT = pdata.start_time;
let endT = pdata.end_time;
this.timer = [startT, endT];
} else {
this.timer = null;
}
this.formData = pdata;
this.$api.task.getSubTask(pdata.task_id).then(res => {
let ary = [];
......@@ -189,6 +241,7 @@ export default {
this.vchanAry = ary;
});
}
this.getFress();
},
handleClose() {
this.setvisible = false;
......@@ -201,20 +254,16 @@ export default {
},
save() {
this.sessionData = JSON.parse(JSON.stringify(this.formData));
this.setvisible = false;
//
let postData = {
task_name: this.formData.task_name,
task_algo_type: this.formData.task_algo_type,
source_type: "pull_video_stream",
dev_unid: this.dev_unid,
node_count: 0,
start_dt: this.formData.period
? "2020-03-27 00:00:00"
: this.setUtcTime(this.formData.timer[0]),
end_dt: this.formData.period
? "3020-03-27 00:00:00"
: this.setUtcTime(this.formData.timer[1]),
start_dt: "2020-03-27 00:00:00",
end_dt: "3020-03-27 00:00:00",
start_time: this.formData.period ? "00:00:00" : this.timer[0],
end_time: this.formData.period ? "23:59:59" : this.timer[1],
priority: this.formData.priority,
store_conf_unid: this.formData.store_conf.unid,
period: this.formData.period,
......@@ -236,17 +285,24 @@ export default {
}
},
addTask(data) {
this.$refs["taskForm"].validate(valid => {
if (valid) {
this.$api.task
.addTask(data, {
"content-type": "multipart/form-data"
})
.then(res => {
console.log(res);
this.setvisible = false;
this.$emit("refresh");
});
} else {
console.log("error submit!!");
}
});
},
editTask(data) {
this.$api.task.editTask(data, this.formData.task_id).then(res => {
this.setvisible = false;
this.$emit("refresh");
});
},
......@@ -271,4 +327,3 @@ export default {
margin-bottom 13px
}
</style>
......@@ -22,6 +22,7 @@
@node-click="vchanClick"
ref="tree"
@check="handleCheckChange"
:render-content="renderContent"
></el-tree>
</div>
</div>
......@@ -33,10 +34,9 @@
<el-table
height="286"
:data="tableData"
stripe
border
@current-change="rowclick"
style="width: 100%"
width="300"
>
<el-table-column
align="center"
......@@ -190,11 +190,11 @@ export default {
}
},
handleCheckChange(data, node) {
console.log(node);
console.log(data);
let staus = false;
if (this.tableData.length > 0) {
for (let i = 0; i < this.tableData.length; i++) {
if (this.tableData[i].vchan_id == data.vchan_id) {
if (this.tableData[i].vchan_refid == data.vchan_refid) {
this.delFun(i, this.tableData[i], "tree");
staus = true;
break;
......@@ -222,10 +222,14 @@ export default {
vchan_duid: vchan.duid || vchan.vchan_duid,
vdev_unid: this.dev_unid,
vchan_name: vchan.name
},
assign_to: {
id: this.taskData.plate_type,
flag: 1
}
};
this.$api.task.editSubTask(this.editData.task_id, data).then(res => {
if (res.ecode == 200) {
if (res && res.ecode != "500") {
this.$message({
message: "添加成功",
type: "success"
......@@ -240,6 +244,7 @@ export default {
console.log("b", data);
},
delFun(index, data, action = "tree") {
console.log("da",data);
this.$store.commit("setocxstate", 0);
this.$confirm("删除视频源, 是否继续?", "提示", {
confirmButtonText: "确定",
......@@ -286,16 +291,17 @@ export default {
this.tableData.forEach(ele => {
arr.push(ele.vchan_refid);
});
console.log(arr)
this.$refs.tree.setCheckedKeys(arr);
},
rowclick(row) {
console.log("row", row);
this.play_url = {
rtsp_url: row.play_url
};
setTimeout(() => {
this.$refs.video.videoPlay();
}, 100);
// console.log("row", row);
// this.play_url = {
// rtsp_url: row.play_url
// };
// setTimeout(() => {
// this.$refs.video.videoPlay();
// }, 100);
},
loadNode(node, resolve) {
if (node.level === 0) {
......@@ -351,11 +357,13 @@ export default {
if (vchan.leaf) {
vchan.childs = "";
}
vchan.vchan_refid = vchan.refid || vchan.vchan_refid
}
resolve(vchans);
setTimeout(() => {
this.checkvckan();
}, 0);
}, 200);
});
return;
}
......@@ -380,6 +388,19 @@ export default {
}
return resolve(node.data.childs);
},
renderContent(h, { node, data, store }){
return (
<span class="custom-tree-node">
<el-tooltip
class="item"
effect="dark"
content={node.label}
placement="top-start"
>
<span>{node.label}</span>
</el-tooltip>
</span>);
},
vchanClick(node) {
if (!node.refid && !node.vchan_refid) {
return;
......@@ -435,14 +456,14 @@ export default {
},
getSipSetting: function(refid) {
if (this.dev_unid) {
this.$api.device.setsip(this.dev_unid, this.user_unid).then(res => {
this.$api.device.sipSet(this.dev_unid, this.user_unid).then(res => {
if (!res.ecode) {
console.log("获取sip配置返回:", JSON.stringify(res.data));
this.playUrl = res.res;
this.playUrl.devId = refid;
console.log("获取sip配置返回:", JSON.stringify(res));
this.play_url = res;
this.play_url.devId = refid;
console.log("playUrl", JSON.stringify(res));
for (let attr of Object.keys(this.playUrl)) {
if (this.playUrl[attr] === "") {
for (let attr of Object.keys(this.play_url)) {
if (this.play_url[attr] === "") {
setTimeout(() => {
this.$message({
message: "获取播放地址失败,请前往配置sip服务!!请重试!",
......@@ -454,7 +475,7 @@ export default {
}
setTimeout(() => {
this.$refs.video.videoPlay();
}, 0);
}, 100);
} else {
this.$message({
message: "获取播放地址失败,请前往配置sip服务!!请重试!",
......@@ -480,19 +501,28 @@ export default {
console.log(data);
},
handleClose() {
let video_ocx = document.getElementById("VionVideo");
try {
let stopRes = video_ocx.StopPlaySip(0);
let stopRtspRes = video_ocx.StopPlay(0);
this.setvisible = false;
this.$store.commit("setocxstate", 0);
this.$refs.tree.setCheckedKeys([]);
} catch (error) {
this.setvisible = false;
console.log(error);
}
},
save() {
this.setvisible = false;
this.$emit("refresh");
},
moveFun(index, row) {
this.$refs.movetask.initMoveTask(row, this.taskData);
}
},
created() {
this.user_unid = window.localStorage.getItem("user_unid");
this.user_unid = window.sessionStorage.getItem("user_unid");
}
};
</script>
......@@ -536,6 +566,8 @@ export default {
}
.rightBox {
float: left;
width: 599px;
overflow: hidden;
}
.imgBox {
width: 587px;
......
......@@ -12,7 +12,7 @@
<div class="rightBox">
<img src="../../assets/img/taskmanage/pic1.png" alt="" />
<span class="textCon">
<div class="topText">80</div>
<div class="topText">{{ workers.video_free }}</div>
<div class="bottomText">可用分析资源</div>
</span>
</div>
......@@ -20,15 +20,23 @@
<div class="rightBox">
<img src="../../assets/img/taskmanage/pic2.png" alt="" />
<span class="textCon">
<div class="topText">80</div>
<div class="topText">{{ workers.video_busy }}</div>
<div class="bottomText">在用分析资源</div>
</span>
</div>
<span class="border"></span>
<div class="rightBox">
<img src="../../assets/img/taskmanage/run1.png" alt="" />
<span class="textCon">
<div class="topText">{{ taskstatus.running }}</div>
<div class="bottomText">运行任务数量</div>
</span>
</div>
<span class="border"></span>
<div class="rightBox">
<img src="../../assets/img/taskmanage/pic3.png" alt="" />
<span class="textCon">
<div class="topText">{{total}}</div>
<div class="topText">{{ taskstatus.total }}</div>
<div class="bottomText">任务数量</div>
</span>
</div>
......@@ -76,7 +84,7 @@
@expand-change="expandchange"
>
<el-table-column type="expand">
<template slot-scope="props" >
<template slot-scope="props">
<subTaskInfo
v-for="(item, index) in props.row.subTaskData"
:key="index"
......@@ -93,6 +101,7 @@
prop="num"
:formatter="numFormatter"
label="序号"
width="60"
>
</el-table-column>
<el-table-column prop="task_name" align="center" label="任务名称">
......@@ -100,8 +109,7 @@
<el-table-column align="center" label="状态">
>
<template slot-scope="scope">
<div v-html="statusFormatter(scope.row)">
</div>
<div v-html="statusFormatter(scope.row)"></div>
</template>
</el-table-column>
<el-table-column
......@@ -119,8 +127,6 @@
</el-table-column>
<el-table-column align="center" prop="resource_use" label="场景占用">
</el-table-column>
<el-table-column align="center" prop="workers_count" label="资源用量">
</el-table-column>
<el-table-column align="center" prop="plate_type" label="设备类型">
</el-table-column>
<el-table-column
......@@ -139,7 +145,7 @@
</el-table-column>
<el-table-column
align="center"
width="300"
width="240"
prop="operation"
label="操作"
>
......@@ -167,8 +173,12 @@
@click="editTask('edit', scope.$index, scope.row)"
></span>
</el-tooltip>
<span class="tableSpanBorder"></span>
<span
class="tableSpanBorder"
v-show="scope.row.status != 'Running'"
></span>
<el-tooltip
v-show="scope.row.status != 'Running'"
content="启动"
placement="bottom"
effect="light"
......@@ -179,8 +189,12 @@
@click="setTaskStatus(scope.row, 'start')"
></span>
</el-tooltip>
<span class="tableSpanBorder"></span>
<span
class="tableSpanBorder"
v-show="scope.row.status == 'Running'"
></span>
<el-tooltip
v-show="scope.row.status == 'Running'"
content="暂停"
placement="bottom"
effect="light"
......@@ -242,7 +256,9 @@
import editset from "./editSet";
import editvideo from "./editVideo";
import subTaskInfo from "./subtask.vue";
import mixin from "../../assets/js/mixin";
export default {
mixins: [mixin],
data() {
return {
task_name: "",
......@@ -257,7 +273,6 @@ export default {
editForm: {},
tableData: [],
subTaskData: [],
pedittype: "add",
currentRow: {},
assign_ip: ""
......@@ -268,10 +283,7 @@ export default {
editvideo,
subTaskInfo
},
mounted() {
this.getTaskList();
this.getFreelist();
},
methods: {
expandchange(row, prow) {
if (!row.isexpand) {
......@@ -285,15 +297,19 @@ export default {
data[i].vchan.subtask_id = data[i].subtask_id;
data[i].vchan.refid = data[i].vchan.vchan_refid;
data[i].vchan.name = data[i].vchan.vchan_name;
data[i].vchan.assign_id = data[i].assign_to ?data[i].assign_to.id : "";
} else {
data.vchan = {
subtask_id: data[i].subtask_id,
refid: "",
vchan_name: data[i].subtask_name,
name: data[i].subtask_name,
assign_id: data[i].assign_id ? data[i].assign_to.id : ""
};
data[i].vchan.assign_id = data[i].assign_to
? data[i].assign_to.id
: "";
data[i].vchan.device_ip = data[i].device_in_ip
? data[i].device_in_ip
: "";
data[i].vchan.video_busy = data[i].video_busy
? data[i].video_busy
: "";
data[i].vchan.video_total = data[i].video_total
? data[i].video_total
: "";
data[i].vchan.plate_type = row.plate_type ? row.plate_type : "";
}
ary.push(data[i].vchan);
}
......@@ -340,8 +356,8 @@ export default {
if (row.period) {
return "全天";
} else {
let startDate = cellValue ? cellValue.split(" ")[0] : "";
let endDate = row.end_dt ? row.end_dt.split(" ")[0] : "";
let startDate = row.start_time ? row.start_time.split(" ")[0] : "";
let endDate = row.end_time ? row.end_time.split(" ")[0] : "";
return startDate + " ~ " + endDate;
}
},
......@@ -457,7 +473,13 @@ export default {
}
});
});
}
},
},
mounted() {
this.getTaskList();
},
created() {
this.getFreelist();
}
};
</script>
......@@ -546,6 +568,16 @@ export default {
}
.rightBox:nth-of-type(3) {
img {
width: 40px;
height: 40px;
margin-left: 1vw;
}
.textCon {
margin-right: 114px;
}
}
.rightBox:nth-of-type(4) {
img {
width: 34px;
height: 35px;
margin-left: 1vw;
......@@ -581,7 +613,7 @@ export default {
}
.pauseIcon {
cursor: pointer;
color: #ffc62e;
color: #c4c4c4;
font-size: 14px;
}
.delIcon {
......
<template>
<div class="expande-table-row">
<span class="label">{{subindex + 1}}</span>
<span class="label">{{ subindex + 1 }}</span>
<span class="label">视频源文件</span>
<span class="subtask-info">{{ subTaskData.vchan_name }}</span>
<span class="label">任务ID</span>
<span class="subtask-info">{{subTaskData.subtask_id}}</span>
<span class="subtask-info">{{ subTaskData.subtask_id }}</span>
<span class="label">设备地址</span>
<span class="subtask-info">192.178.99.99</span>
<span class="subtask-info">{{ subTaskData.device_ip }}</span>
<span class="label">已用资源</span>
<span class="subtask-info">22</span>
<span class="subtask-info">{{ subTaskData.video_busy }}</span>
<span class="label">设备容量</span>
<span class="subtask-info">33</span>
<span class="subtask-info">{{ subTaskData.video_total }}</span>
<span class="label">指定设备下发</span>
<span class="subtask-info">
<el-select v-model="assign_id">
......@@ -18,8 +18,19 @@
v-for="(item, index) in freeList"
:key="index"
:value="item.device_id"
:label="item.in_ip"
v-if="subTaskData.plate_type && item.license_info.platType === subTaskData.plate_type"
>
{{ item.device_id }}
{{ item.in_ip }} {{ item.license_info.platType }}
</el-option>
<el-option
v-for="(item, index) in freeList"
:key="index"
:value="item.device_id"
:label="item.in_ip"
v-if="!subTaskData.plate_type"
>
{{ item.in_ip }} {{ item.license_info.platType }}
</el-option>
</el-select>
</span>
......@@ -66,12 +77,11 @@ export default {
});
}
},
created() {},
watch: {
created() {
console.log(this.subTaskData);
},
watch: {},
mounted() {
console.log("tasdata",this.subTaskData)
this.assign_id = this.subTaskData.assign_id
? this.subTaskData.assign_id
: "";
......
<template>
<div>
<div class="chart-header-box">
<el-col :span="12" class="header-title">事件类型分布</el-col>
<el-col :span="12" class="header-title">违法事件类型分布</el-col>
<el-col class="ev-box">
<el-select v-model="evtype" @change="getType">
<el-option label="违法" value="1"></el-option>
......
<template>
<div>
<div class="chart-header-box">
<el-col :span="5" class="header-title">违法事件趋势</el-col>
<el-col :span="6" class="header-title">违法事件发生趋势</el-col>
<div class="sel-box">
<span class="header-label">违法</span>
<div class="header-select">
......
......@@ -28,7 +28,7 @@
<div style="clear: both;"></div>
<el-row>
<div class="collect-box card-hover">
<div class="header-title">重点车辆分布</div>
<div class="header-title">今日数据统计</div>
<div class="collect-content">
<el-col :span="6" class="content-item">
<div class="zd-icon" style="color:#FF9630">
......
......@@ -10,7 +10,7 @@
></a>
<div class="" id="t-popup-content"></div>
</div>
<div id="videopopup" class="ol-popup">
<div id="videopopup" class="ol-popup video-popup">
<a
href="#"
id="popup-closer"
......@@ -20,11 +20,20 @@
<div class="mapvideo">
<videoPlay ref="mapvideo" :playurl="playurl"></videoPlay>
</div>
<div class="video-info">
<el-col class="info-item" :span="24">
视频源名称:{{ curtaskname }}
</el-col>
<el-col class="info-item" :span="24">坐标点:{{ pcoordinate }}</el-col>
<el-col class="info-item" :span="24">
算法类型:{{ setalgo(curSubtask.task_algo_type) }}
</el-col>
</div>
</div>
<div id="taskinfopopup" class="ol-popup info-popup">
<div>
<!-- <span>{{ infoData.vchan_name }}</span> -->
<span>鼠标点击显示视频</span>
<span>{{ curtaskname }}</span>
</div>
</div>
</div>
......@@ -120,7 +129,11 @@ export default {
return {
devList: [],
playurl: {},
infoData: {}
subtaskList: [],
infoData: {},
curtaskname: "",
pcoordinate: "",
curSubtask: {}
};
},
components: {
......@@ -223,16 +236,14 @@ export default {
map.on("click", e => {
var pixel = map.getEventPixel(e.originalEvent);
console.log("地图坐标", e.coordinate);
//点击相机标注点
map.forEachFeatureAtPixel(pixel, function(feature) {
// var coodinate = e.coordinate;
// _this.unid = feature.getProperties().unid;
// Overlay.setPosition(coodinate);
// map.addOverlay(Overlay);
//播放视频操作
let data = feature.getProperties().cameraInfo;
that.playvideo(data);
console.log("视频播放地址", data);
that.curtaskname = data.name;
that.getSubTaskInfo(data.refid);
that.pcoordinate = `${data.longitude},${data.latitude}`;
});
});
//鼠标移入标注点
......@@ -242,6 +253,7 @@ export default {
map.forEachFeatureAtPixel(pixel, function(feature) {
let data = feature.getProperties().cameraInfo;
that.infoData = data;
that.curtaskname = data.name;
that.showTaskInfo(data);
});
} else {
......@@ -249,6 +261,7 @@ export default {
}
});
},
movemap(data, point, type) {
let pos = point ? point : [120.324447, 36.074594];
Views.animate({
......@@ -380,19 +393,6 @@ export default {
}
});
map.addOverlay(overlay);
// if (data.vchan_name == "视频1") {
// obj.rtsp_url =
// "rtsp://192.168.9.133:8554//opt/data/vedio/1579253441478.264";
// } else if (data.vchan_name == "视频2") {
// obj.rtsp_url =
// "rtsp://192.168.9.133:8554//opt/data/vedio/1577516797543.264";
// }
// this.playurl = obj;
// // this.$store.commit('setocxstate', 1)
// setTimeout(() => {
// this.$refs.mapvideo.videoPlay();
// }, 100);
console.log(data);
let vrefid = data.vchan_refid ? data.vchan_refid : data.refid;
// 获取视频流
this.$api.device.getFxStream(this.dev_unid, vrefid).then(res => {
......@@ -405,7 +405,6 @@ export default {
break;
}
}
console.log('playurl', obj)
this.playurl = obj;
this.$refs.mapvideo.videoPlay();
} else {
......@@ -416,6 +415,36 @@ export default {
}
});
},
getSubTaskInfo(refid) {
if (this.subtaskList.length > 0) {
for (let i = 0; i < this.subtaskList.length; i++) {
if (refid == this.subtaskList[i].vchan.vchan_refid) {
this.curSubtask = this.subtaskList[i];
break;
}
}
}
},
setalgo(id) {
let algotype = "";
switch (id) {
case "0":
algotype = "交通";
break;
case "1":
algotype = "客流";
break;
case "2":
algotype = "客流";
break;
case "3":
algotype = "违停";
break;
default:
break;
}
return algotype;
},
getDevList() {
this.$api.show.getDevList(this.dev_unid).then(res => {
let devlist = [];
......@@ -451,6 +480,11 @@ export default {
// this.InitMap();
}
},
created() {
this.$api.task.getSubTask("").then(res => {
this.subtaskList = res;
});
},
mounted() {
setTimeout(() => {
this.getDevList();
......@@ -506,6 +540,9 @@ export default {
.img-popup {
height auto
}
.video-popup{
padding-bottom 75px
}
.ol-popup:after, .ol-popup:before {
top: 100%;
border: solid transparent;
......@@ -546,13 +583,15 @@ export default {
}
}
.info-popup {
width 125px;
width 150px;
text-align center
height 30px;
line-height 30px;
border-radius 5px
padding 0 0 0 10px;
padding 0 10px;
color #fff;
background #333;
ovflow hidden
}
.info-popup:after {
disply block
......@@ -582,4 +621,11 @@ export default {
height 100%;
width 100%;
}
.video-info {
height 100px;
}
.info-item{
margin-bottom 4px;
color #66676a
}
</style>
// const fs = require("fs");
// const readlineSync = require("readline-sync");
// const readline = require("readline");
// // 获取当前版本信息
// const vinfopath = "./public/js/version.json";
// var vinfo = fs.readFileSync(vinfopath, "utf8");
// console.log(vinfo);
// // 新版本设置
// var versionnum = readlineSync.question("new Vsersion:");
// var reg = /\d.\d.\d/;
// if (versionnum != "" && reg.test(versionnum)) {
// var varr = versionnum.split(".");
// var oldv = JSON.parse(vinfo).version.split(".");
// if (varr[0] >= oldv[0] && varr[1] >= oldv[1] && varr[2] > oldv[2]) {
// console.log(versionnum);
// } else {
// throw "新版本号必须大于旧版本号!";
// }
// } else {
// throw "版本号错误";
// }
// var info = readlineSync.question("EditInfo:", "utf8", {
// encoding:"UTF-8",
// hideEchoBack: true // The typed text on screen is hidden by `*` (default).
// });
// var buginfo = readlineSync.question("BugInfo:", "utf8", {
// encoding:"utf-8",
// hideEchoBack: true // The typed text on screen is hidden by `*` (default).
// });
// console.log(buginfo)
// var verinfo = fs.openSync(vinfopath, "w+");
// var obj = {
// version: versionnum,
// Info: info,
// Bug: buginfo,
// date: new Date()
// };
// var options = { encoding: 'UTF-8', mode: 438 /*=0666*/, flag: 'w' };
// fs.writeFileSync(verinfo, JSON.stringify(obj), options);
module.exports = {
lintOnSave: false,
publicPath: process.env.NODE_ENV === "production" ? "./" : "/",
......@@ -9,7 +51,10 @@ module.exports = {
}
}
},
devServer:{
pluginOptions: {
// 第三方插件配置
},
devServer: {
proxy: {
"/api": {
target: "http://vion-panda.51vip.biz:52510", // 要访问的接口域名
......@@ -21,5 +66,4 @@ module.exports = {
}
}
}
};
......@@ -6568,6 +6568,12 @@ rimraf@2.6.3:
dependencies:
glob "^7.1.3"
rimraf@^3.0.2:
version "3.0.2"
resolved "https://registry.npm.taobao.org/rimraf/download/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
dependencies:
glob "^7.1.3"
ripemd160@^2.0.0, ripemd160@^2.0.1:
version "2.0.2"
resolved "https://registry.npm.taobao.org/ripemd160/download/ripemd160-2.0.2.tgz#a1c1a6f624751577ba5d07914cbc92850585890c"
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!