运维服务中台
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

182 lines
5.3 KiB

'use strict';
async function groupList (ctx) {
try {
const { models } = ctx.fs.dc;
const { clickHouse } = ctx.app.fs
const groupRes = await clickHouse.anxinyun.query(`
SELECT * FROM t_alarm_group
`).toPromise();
for (let g of groupRes) {
g.unit = await await clickHouse.anxinyun.query(`
SELECT * FROM t_alarm_group_unit WHERE group_id = ${g.id}
`).toPromise();
}
ctx.status = 200;
ctx.body = groupRes
} catch (error) {
ctx.fs.logger.error(`path: ${ctx.path}, error: error`);
ctx.status = 400;
ctx.body = {
message: typeof error == 'string' ? error : undefined
}
}
}
async function list (ctx) {
try {
const { models } = ctx.fs.dc;
const { clickHouse } = ctx.app.fs
const { utils: { judgeSuper, anxinStrucIdRange } } = ctx.app.fs
const { database: anxinyun } = clickHouse.anxinyun.opts.config
const { pepProjectId, groupId, groupUnitId, sustainTimeStart, sustainTimeEnd, limit, page } = ctx.query
const isSuper = judgeSuper(ctx)
let anxinStrucIds = null
if (!isSuper || pepProjectId) {
anxinStrucIds = await anxinStrucIdRange({ ctx, pepProjectId })
}
let whereOption = []
if (anxinStrucIds) {
whereOption.push(`alarms.StructureId IN (${anxinStrucIds.join(",")})`)
}
if (groupId) {
whereOption.push(`alarms.AlarmGroup IN (${groupId})`)
}
if (groupUnitId) {
whereOption.push(`alarms.AlarmGroupUnit=${groupId}`)
}
if (sustainTimeStart && sustainTimeEnd) {
let momentStart = moment(sustainTimeStart).format()
let momentEnd = moment(sustainTimeEnd).format()
whereOption.push(`
(
alarms."StartTime"
BETWEEN '${momentStart}' AND '${momentEnd}'
OR
"alarms"."EndTime" BETWEEN '${momentStart}' AND '${momentEnd}'
OR (
"alarms"."StartTime" <= '${momentStart}'
AND
"alarms"."EndTime" >= '${momentEnd}'
)
)
`)
}
const alarmRes = await clickHouse.dataAlarm.query(`
SELECT
alarms.AlarmId AS AlarmId,
alarms.State AS State,
SourceName, StartTime, EndTime,
alarms.CurrentLevel AS CurrentLevel,
SourceTypeId,
AlarmAdviceProblem, AlarmGroup, AlarmGroupUnit, AlarmAdviceProblem,
${anxinyun}.t_structure.name AS StructureName,
StructureId,
${anxinyun}.t_alarm_code.name AS AlarmCodeName
FROM
alarms
LEFT JOIN ${anxinyun}.t_structure
ON ${anxinyun}.t_structure.id = alarms.StructureId
LEFT JOIN ${anxinyun}.t_alarm_code
ON ${anxinyun}.t_alarm_code.code = alarms.AlarmTypeCode
${whereOption.length ? 'WHERE ' + whereOption.join(' AND ') : ''}
ORDER BY alarms.StartTime DESC
${limit ? 'LIMIT ' + limit : ''}
${limit && page ? 'OFFSET ' + parseInt(limit) * parseInt(page) : ''}
`).toPromise();
// alarm_details.Time, alarm_details.Content
// LEFT JOIN alarm_details
// ON alarms.AlarmId = alarm_details.AlarmId
// AND alarm_details.Time = (
// SELECT MAX(alarm_details.Time) from alarm_details WHERE AlarmId = alarms.AlarmId
// )
ctx.status = 200;
ctx.body = alarmRes
} catch (error) {
ctx.fs.logger.error(`path: ${ctx.path}, error: error`);
ctx.status = 400;
ctx.body = {
message: typeof error == 'string' ? error : undefined
}
}
}
async function detail (ctx) {
try {
const { models } = ctx.fs.dc;
const { clickHouse } = ctx.app.fs
const { alarmId } = ctx.query
const detailRes = await clickHouse.dataAlarm.query(`
SELECT * FROM alarm_details WHERE AlarmId = '${alarmId}' ORDER BY Time ASC
`).toPromise()
ctx.status = 200;
ctx.body = detailRes
} catch (error) {
ctx.fs.logger.error(`path: ${ctx.path}, error: error`);
ctx.status = 400;
ctx.body = {
message: typeof error == 'string' ? error : undefined
}
}
}
async function confirm (ctx) {
try {
const { models } = ctx.fs.dc;
// 发送告警恢复通知
// Topic: alarm
/*
* {
* messageMode: "AlarmManElimination",
* sourceId: "",
* alarmTypeCode: "",
* sponsor: userId,
* content: "确认消息",
* time: "YYYY-MM-DDTHH:mm:ss.SSSZ"
* }
*/
ctx.status = 204;
} catch (error) {
ctx.fs.logger.error(`path: ${ctx.path}, error: error`);
ctx.status = 400;
ctx.body = {
message: typeof error == 'string' ? error : undefined
}
}
}
async function detailAggregation (ctx) {
try {
const { models } = ctx.fs.dc;
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
}
}
}
module.exports = {
list,
detail,
groupList,
confirm,
detailAggregation,
};