13 changed files with 604 additions and 31 deletions
@ -0,0 +1,195 @@ |
|||
'use strict'; |
|||
const moment = require('moment'); |
|||
const { alarmList } = require('../alarm/video'); |
|||
//工作台
|
|||
async function getWorkbench(ctx) { |
|||
try { |
|||
const { models } = ctx.fs.dc; |
|||
const { clickHouse } = ctx.app.fs |
|||
const { alarmId, limit, page } = ctx.query |
|||
ctx.status = 200; |
|||
ctx.body = [] |
|||
} catch (error) { |
|||
ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`); |
|||
ctx.status = 400; |
|||
ctx.body = { |
|||
message: typeof error == 'string' ? error : undefined |
|||
} |
|||
} |
|||
} |
|||
|
|||
//项目概览
|
|||
async function getProjectsInfo(ctx) { |
|||
try { |
|||
const { models } = ctx.fs.dc; |
|||
const { clickHouse, utils: { judgeSuper, anxinStrucIdRange } } = ctx.app.fs |
|||
const { database: anxinyun } = clickHouse.anxinyun.opts.config |
|||
const { alarmId, limit, page, projectCorrelationId, pepProjectId, keywordTarget, keyword } = ctx.query; |
|||
const { userInfo } = ctx.fs.api; |
|||
// let where = {}
|
|||
// if (!userInfo.role.includes('SuperAdmin') && !userInfo.role.includes('admin')) {
|
|||
// where.projectCorrelationId = { $in: userInfo.correlationProject }
|
|||
// }
|
|||
// if (projectCorrelationId) {//查指定项目,控制台全局切换
|
|||
// where.projectCorrelationId = projectCorrelationId
|
|||
// }
|
|||
let anxinStruc = await anxinStrucIdRange({ |
|||
ctx, pepProjectId, keywordTarget, keyword |
|||
}) |
|||
const anxinStrucIds = anxinStruc.map(a => a.strucId); |
|||
//先查全部的摄像头
|
|||
const videoList = anxinStrucIds.length ? await clickHouse.vcmp.query( |
|||
`select camera.id,
|
|||
camera.name, |
|||
camera.serial_no from camera where camera.delete=false and camera.recycle_time is null |
|||
|
|||
LEFT JOIN ${anxinyun}.t_video_ipc AS anxinIpc |
|||
ON toString(anxinIpc.channel_no) = cameraAlarm.cameraChannelNo |
|||
AND anxinIpc.serial_no = cameraAlarm.cameraSerialNo |
|||
LEFT JOIN ${anxinyun}.t_structure AS anxinStruc |
|||
ON anxinStruc.id = anxinIpc.structure |
|||
AND anxinStruc.id IN (${anxinStrucIds.join(',')}) |
|||
LEFT JOIN ${anxinyun}.t_video_ipc_station AS anxinIpcStation |
|||
ON anxinIpcStation.ipc = anxinIpc.id |
|||
LEFT JOIN ${anxinyun}.t_sensor AS anxinStation |
|||
ON anxinStation.id = anxinIpcStation.station` |
|||
).toPromise() : [] |
|||
|
|||
|
|||
ctx.status = 200; |
|||
ctx.body = [] |
|||
} catch (error) { |
|||
ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`); |
|||
ctx.status = 400; |
|||
ctx.body = { |
|||
message: typeof error == 'string' ? error : undefined |
|||
} |
|||
} |
|||
} |
|||
|
|||
//BI分析
|
|||
async function getBiAnalysis(ctx) { |
|||
try { |
|||
const { models } = ctx.fs.dc; |
|||
const { clickHouse } = ctx.app.fs |
|||
const { alarmId, limit, page } = ctx.query; |
|||
let videoAlarms = await alarmList(ctx, 'day'); |
|||
let aggDayMap = []; |
|||
for (let a of videoAlarms) { |
|||
let exist = aggDayMap.find(ad => ad.day == moment(a.createTime).format('YYYY-MM-DD')) |
|||
if (exist) { |
|||
exist.number++ |
|||
} else { |
|||
aggDayMap.push({ day: moment(a.createTime).format('YYYY-MM-DD'), number: 1 }) |
|||
} |
|||
} |
|||
ctx.status = 200; |
|||
ctx.body = aggDayMap; |
|||
} catch (error) { |
|||
ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`); |
|||
ctx.status = 400; |
|||
ctx.body = { |
|||
message: typeof error == 'string' ? error : undefined |
|||
} |
|||
} |
|||
} |
|||
|
|||
//最新动态
|
|||
async function getLatestDynamic(ctx) { |
|||
try { |
|||
const { models } = ctx.fs.dc; |
|||
const { limit, page, projectCorrelationId, types } = ctx.query; |
|||
const { userInfo } = ctx.fs.api; |
|||
const { clickHouse } = ctx.app.fs; |
|||
|
|||
let where = { type: { $in: types.split(',') } }//传类型选择
|
|||
if (!userInfo.role.includes('SuperAdmin') && !userInfo.role.includes('admin')) { |
|||
where.projectCorrelationId = { $in: userInfo.correlationProject } |
|||
} |
|||
if (projectCorrelationId) {//查指定项目,控制台全局切换
|
|||
where.projectCorrelationId = projectCorrelationId |
|||
} |
|||
let news = await models.LatestDynamicList.findAll({//最新动态
|
|||
include: [{ |
|||
model: models.ProjectCorrelation, |
|||
where: { del: false }, |
|||
attributes: ['id', 'name', 'pepProjectId'], |
|||
}, { |
|||
model: models.AlarmAppearRecord |
|||
}, { |
|||
model: models.EmailSendLog |
|||
}, { |
|||
model: models.AlarmConfirmLog |
|||
}], |
|||
where: where, |
|||
offset: Number(page) * Number(limit), |
|||
limit: Number(limit), |
|||
order: [['time', 'desc']], |
|||
}); |
|||
|
|||
//查项目名称 查用户名
|
|||
let pepPojectIds = new Set(), notedUserIds = new Set(); |
|||
for (let p of news) { |
|||
pepPojectIds.add(p.projectCorrelation.pepProjectId); |
|||
|
|||
if (p.emailSendLog) { |
|||
notedUserIds.add(p.emailSendLog.toPepUserId);//通知 接收人
|
|||
} |
|||
if (p.alarmConfirmLog && p.alarmConfirmLog.pepUserId) { |
|||
notedUserIds.add(p.alarmConfirmLog.pepUserId);//确认 操作者
|
|||
} |
|||
} |
|||
let pepProjects = pepPojectIds.size ? await clickHouse.projectManage.query(` |
|||
SELECT id, project_name FROM t_pim_project WHERE id IN (${[...pepPojectIds]}) |
|||
`).toPromise() : [];
|
|||
|
|||
let userPepRes = notedUserIds.size ? await clickHouse.pepEmis.query( |
|||
`SELECT DISTINCT user.id AS id, "user"."name" AS name FROM user WHERE user.id IN (${[...notedUserIds].join(',')})
|
|||
`).toPromise() : []
|
|||
|
|||
|
|||
let appear = [], notice = [], confirm = []; |
|||
news.map(d => { |
|||
let projectName = d.projectCorrelation.name || pepProjects.find(pp => pp.id == d.projectCorrelation.pepProjectId).project_name; |
|||
if (d.alarmAppearId) { |
|||
appear.push({ |
|||
projectName, |
|||
...d.alarmAppearRecord |
|||
}); |
|||
} |
|||
if (d.emailSendId) { |
|||
notice.push({ |
|||
userName: userPepRes.find(u => u.id == d.emailSendLog.toPepUserId).name, |
|||
projectName, |
|||
...d.emailSendLog |
|||
}); |
|||
} |
|||
if (d.alarmConfirmId) { |
|||
confirm.push({ |
|||
userName: d.alarmConfirmLog.pepUserId ? userPepRes.find(u => u.id == d.alarmConfirmLog.pepUserId).name : '自动恢复', |
|||
projectName, |
|||
...d.alarmConfirmLog.dataValues |
|||
}); |
|||
} |
|||
}) |
|||
ctx.status = 200; |
|||
ctx.body = { |
|||
appear,//发现
|
|||
notice,//通知
|
|||
confirm//确认
|
|||
}; |
|||
} catch (error) { |
|||
ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`); |
|||
ctx.status = 400; |
|||
ctx.body = { |
|||
message: typeof error == 'string' ? error : undefined |
|||
} |
|||
} |
|||
} |
|||
|
|||
module.exports = { |
|||
getWorkbench, |
|||
getProjectsInfo, |
|||
getBiAnalysis, |
|||
getLatestDynamic |
|||
}; |
@ -0,0 +1,62 @@ |
|||
/* eslint-disable*/ |
|||
|
|||
'use strict'; |
|||
|
|||
module.exports = dc => { |
|||
const DataTypes = dc.ORM; |
|||
const sequelize = dc.orm; |
|||
const AlarmAppearRecord = sequelize.define("alarmAppearRecord", { |
|||
id: { |
|||
type: DataTypes.INTEGER, |
|||
allowNull: false, |
|||
defaultValue: null, |
|||
comment: null, |
|||
primaryKey: true, |
|||
field: "id", |
|||
autoIncrement: true, |
|||
unique: "alarm_appear_record_id_uindex" |
|||
}, |
|||
projectCorrelationId: { |
|||
type: DataTypes.INTEGER, |
|||
allowNull: false, |
|||
defaultValue: null, |
|||
comment: null, |
|||
primaryKey: false, |
|||
field: "project_correlation_id", |
|||
autoIncrement: false |
|||
}, |
|||
alarmInfo: { |
|||
type: DataTypes.JSON, |
|||
allowNull: false, |
|||
defaultValue: null, |
|||
comment: null, |
|||
primaryKey: false, |
|||
field: "alarm_info", |
|||
autoIncrement: false |
|||
}, |
|||
time: { |
|||
type: DataTypes.DATE, |
|||
allowNull: true, |
|||
defaultValue: null, |
|||
comment: null, |
|||
primaryKey: false, |
|||
field: "time", |
|||
autoIncrement: false |
|||
}, |
|||
type: { |
|||
type: DataTypes.STRING, |
|||
allowNull: true, |
|||
defaultValue: null, |
|||
comment: "数据告警:data,设备告警:device,应用告警:application", |
|||
primaryKey: false, |
|||
field: "type", |
|||
autoIncrement: false |
|||
} |
|||
}, { |
|||
tableName: "alarm_appear_record", |
|||
comment: "", |
|||
indexes: [] |
|||
}); |
|||
dc.models.AlarmAppearRecord = AlarmAppearRecord; |
|||
return AlarmAppearRecord; |
|||
}; |
@ -0,0 +1,71 @@ |
|||
/* eslint-disable*/ |
|||
|
|||
'use strict'; |
|||
|
|||
module.exports = dc => { |
|||
const DataTypes = dc.ORM; |
|||
const sequelize = dc.orm; |
|||
const AlarmConfirmLog = sequelize.define("alarmConfirmLog", { |
|||
id: { |
|||
type: DataTypes.INTEGER, |
|||
allowNull: false, |
|||
defaultValue: null, |
|||
comment: null, |
|||
primaryKey: true, |
|||
field: "id", |
|||
autoIncrement: true, |
|||
unique: "alarm_confirm_log_id_uindex" |
|||
}, |
|||
pepUserId: { |
|||
type: DataTypes.INTEGER, |
|||
allowNull: true, |
|||
defaultValue: null, |
|||
comment: null, |
|||
primaryKey: false, |
|||
field: "pep_user_id", |
|||
autoIncrement: false |
|||
}, |
|||
projectCorrelationId: { |
|||
type: DataTypes.INTEGER, |
|||
allowNull: false, |
|||
defaultValue: null, |
|||
comment: null, |
|||
primaryKey: false, |
|||
field: "project_correlation_id", |
|||
autoIncrement: false |
|||
}, |
|||
alarmInfo: { |
|||
type: DataTypes.JSON, |
|||
allowNull: false, |
|||
defaultValue: null, |
|||
comment: null, |
|||
primaryKey: false, |
|||
field: "alarm_info", |
|||
autoIncrement: false |
|||
}, |
|||
confirmTime: { |
|||
type: DataTypes.DATE, |
|||
allowNull: false, |
|||
defaultValue: null, |
|||
comment: null, |
|||
primaryKey: false, |
|||
field: "confirm_time", |
|||
autoIncrement: false |
|||
}, |
|||
confirmContent: { |
|||
type: DataTypes.STRING, |
|||
allowNull: false, |
|||
defaultValue: null, |
|||
comment: null, |
|||
primaryKey: false, |
|||
field: "confirm_content", |
|||
autoIncrement: false |
|||
} |
|||
}, { |
|||
tableName: "alarm_confirm_log", |
|||
comment: "", |
|||
indexes: [] |
|||
}); |
|||
dc.models.AlarmConfirmLog = AlarmConfirmLog; |
|||
return AlarmConfirmLog; |
|||
}; |
@ -0,0 +1,62 @@ |
|||
/* eslint-disable*/ |
|||
|
|||
'use strict'; |
|||
|
|||
module.exports = dc => { |
|||
const DataTypes = dc.ORM; |
|||
const sequelize = dc.orm; |
|||
const EmailSendLog = sequelize.define("emailSendLog", { |
|||
id: { |
|||
type: DataTypes.INTEGER, |
|||
allowNull: false, |
|||
defaultValue: null, |
|||
comment: null, |
|||
primaryKey: true, |
|||
field: "id", |
|||
autoIncrement: true, |
|||
unique: "email_send_log_id_uindex" |
|||
}, |
|||
projectCorrelationId: { |
|||
type: DataTypes.INTEGER, |
|||
allowNull: false, |
|||
defaultValue: null, |
|||
comment: null, |
|||
primaryKey: false, |
|||
field: "project_correlation_id", |
|||
autoIncrement: false |
|||
}, |
|||
toPepUserId: { |
|||
type: DataTypes.INTEGER, |
|||
allowNull: false, |
|||
defaultValue: null, |
|||
comment: null, |
|||
primaryKey: false, |
|||
field: "to_pep_user_id", |
|||
autoIncrement: false |
|||
}, |
|||
by: { |
|||
type: DataTypes.STRING, |
|||
allowNull: true, |
|||
defaultValue: null, |
|||
comment: null, |
|||
primaryKey: false, |
|||
field: "by", |
|||
autoIncrement: false |
|||
}, |
|||
time: { |
|||
type: DataTypes.DATE, |
|||
allowNull: false, |
|||
defaultValue: null, |
|||
comment: null, |
|||
primaryKey: false, |
|||
field: "time", |
|||
autoIncrement: false |
|||
} |
|||
}, { |
|||
tableName: "email_send_log", |
|||
comment: "", |
|||
indexes: [] |
|||
}); |
|||
dc.models.EmailSendLog = EmailSendLog; |
|||
return EmailSendLog; |
|||
}; |
@ -0,0 +1,80 @@ |
|||
/* eslint-disable*/ |
|||
|
|||
'use strict'; |
|||
|
|||
module.exports = dc => { |
|||
const DataTypes = dc.ORM; |
|||
const sequelize = dc.orm; |
|||
const LatestDynamicList = sequelize.define("latestDynamicList", { |
|||
id: { |
|||
type: DataTypes.INTEGER, |
|||
allowNull: false, |
|||
defaultValue: null, |
|||
comment: null, |
|||
primaryKey: true, |
|||
field: "id", |
|||
autoIncrement: true, |
|||
unique: "latest_dynamic_list_id_uindex" |
|||
}, |
|||
time: { |
|||
type: DataTypes.DATE, |
|||
allowNull: false, |
|||
defaultValue: null, |
|||
comment: null, |
|||
primaryKey: false, |
|||
field: "time", |
|||
autoIncrement: false |
|||
}, |
|||
alarmAppearId: { |
|||
type: DataTypes.INTEGER, |
|||
allowNull: true, |
|||
defaultValue: null, |
|||
comment: null, |
|||
primaryKey: false, |
|||
field: "alarm_appear_id", |
|||
autoIncrement: false |
|||
}, |
|||
emailSendId: { |
|||
type: DataTypes.INTEGER, |
|||
allowNull: true, |
|||
defaultValue: null, |
|||
comment: null, |
|||
primaryKey: false, |
|||
field: "email_send_id", |
|||
autoIncrement: false |
|||
}, |
|||
alarmConfirmId: { |
|||
type: DataTypes.INTEGER, |
|||
allowNull: true, |
|||
defaultValue: null, |
|||
comment: null, |
|||
primaryKey: false, |
|||
field: "alarm_confirm_id", |
|||
autoIncrement: false |
|||
}, |
|||
projectCorrelationId: { |
|||
type: DataTypes.INTEGER, |
|||
allowNull: false, |
|||
defaultValue: null, |
|||
comment: null, |
|||
primaryKey: false, |
|||
field: "project_correlation_id", |
|||
autoIncrement: false |
|||
}, |
|||
type: { |
|||
type: DataTypes.INTEGER, |
|||
allowNull: true, |
|||
defaultValue: null, |
|||
comment: '1:发现,2:通知,3:处置,4:确认', |
|||
primaryKey: false, |
|||
field: "type", |
|||
autoIncrement: false |
|||
} |
|||
}, { |
|||
tableName: "latest_dynamic_list", |
|||
comment: "", |
|||
indexes: [] |
|||
}); |
|||
dc.models.LatestDynamicList = LatestDynamicList; |
|||
return LatestDynamicList; |
|||
}; |
Loading…
Reference in new issue