'use strict'; const moment = require('moment') //const db = require('../') async function getFailureTime (ctx) { const sequelize = ctx.fs.dc.orm try { const res = await sequelize.query( `SELECT substring(to_char(w.wmonth,'yyyy-mm'),1,7) wmonth,COALESCE(e.counts,0) count from ( SELECT COUNT(1) counts,to_char(maintenance_record.occurrence_time, 'yyyy-mm') months FROM maintenance_record GROUP BY months ) e RIGHT JOIN ( SELECT to_date(EXTRACT(YEAR FROM (current_date - INTERVAL '1 month' * (t - 1))) ||'-' || EXTRACT(MONTH FROM (current_date - INTERVAL '1 month' * (t - 1))),'yyyy-mm')as wmonth from generate_series(1, 12) as t ) w on e.months = substring(to_char(w.wmonth,'yyyy-mm'),1,7) GROUP BY w.wmonth,e.counts ORDER BY w.wmonth asc` ) let resList = [] if (res.length > 0) { res[0].forEach((item) => { resList.push(item) }) } ctx.status = 200 ctx.body = resList } catch (error) { ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`); ctx.status = 400; ctx.body = { message: '查询故障发生时间失败' } } } async function getSystemAvailability (ctx) { const sequelize = ctx.fs.dc.orm try { const res = await sequelize.query( `SELECT substring(to_char(w.wmonth,'yyyy-mm'),1,7) wmonth, COALESCE((w.seconds-e.counts)/w.seconds,1) ability from ( SELECT to_char(maintenance_record.occurrence_time, 'yyyy-MM') months, SUM(maintenance_record.interrupt_duration) counts FROM maintenance_record where maintenance_record.occurrence_time is not null GROUP BY months ) e RIGHT JOIN ( SELECT to_date(EXTRACT(YEAR FROM (current_date - INTERVAL '1 month' * (n - 1))) ||'-'|| EXTRACT(MONTH FROM (current_date - INTERVAL '1 month' * (n - 1))),'yyyy-mm') as wmonth, (EXTRACT(DAY FROM (DATE_TRUNC('MONTH', current_date - INTERVAL '1 month' * (n - 1) + INTERVAL '1 MONTH') - DATE_TRUNC('MONTH', current_date - INTERVAL '1 month' * (n - 1)) - INTERVAL '1 DAY'))+1)* 24 * 60 * 60 AS seconds from generate_series(1, 12) AS n ) w on e.months = substring(to_char(w.wmonth,'yyyy-mm'),1,7) GROUP BY w.wmonth,w.seconds,e.counts ORDER BY w.wmonth asc` ) let resList = [] if (res.length > 0) { res[0].forEach((item) => { resList.push(item) }) } ctx.status = 200 ctx.body = resList } catch (error) { ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`); ctx.status = 400; ctx.body = { message: '查询系统可用性失败' } } } async function getProblemType (ctx) { const sequelize = ctx.fs.dc.orm try { const res = await sequelize.query(` SELECT n.type,COALESCE(m.count,0) count FROM (SELECT t.type,count(1) FROM maintenance_record t GROUP BY t.type) m RIGHT JOIN (SELECT p.type FROM system_problem p) n ON m.type=n.type GROUP BY n.type,m.count `) let resList = [] if (res.length > 0) { res[0].forEach((item) => { resList.push(item) }) } ctx.status = 200 ctx.body = resList } catch (error) { ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`); ctx.status = 400; ctx.body = { message: '查询故障类型失败' } } } async function getOperationsPersonnel (ctx) { const sequelize = ctx.fs.dc.orm const { clickHouse } = ctx.app.fs try { //查询用户id const res = await sequelize.query(`SELECT t.pep_user_id userId,count(1) FROM maintenance_record_execute_user t GROUP BY pep_user_id`) let useList = new Set() if (res.length > 0) { res[0].forEach((item) => { useList.add(item.userid) }) } let users = useList ? await clickHouse.pepEmis.query(`SELECT DISTINCT user.id AS id, "user"."name" AS name FROM user WHERE user.id IN (${[...useList].join(',')}, -1)`).toPromise() : [] let resRecord = [] if (res.length > 0) { res[0].forEach((item) => { resRecord.push(item) }) } let mergedArray = [] if (users.length > 0 && resRecord.length > 0) { mergedArray = users.map(item1 => { const item2 = resRecord.find(item2 => item2.userid === item1.id); return { userid: item1.id, name: item1.name, count: parseInt(item2.count) } }) } ctx.status = 200 ctx.body = mergedArray } catch (error) { ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`); ctx.status = 400; ctx.body = { message: '查询运维人员失败' } } } module.exports = { getFailureTime, getSystemAvailability, getProblemType, getOperationsPersonnel }