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.
355 lines
12 KiB
355 lines
12 KiB
1 year ago
|
'use strict';
|
||
|
|
||
|
const moment = require("moment");
|
||
|
|
||
|
|
||
|
async function findPatrolRecords(ctx, next) {
|
||
|
const sequelize = ctx.fs.dc.orm;
|
||
|
try {
|
||
|
let rslt = { planCount: 0, done: 0 }
|
||
|
const models = ctx.fs.dc.models
|
||
|
const { projectId, startTime, endTime } = ctx.query
|
||
|
|
||
|
|
||
|
const plan = await models.PatrolPlan.findAll({
|
||
|
where: {
|
||
|
structureId: { $in: projectId.split(',') },
|
||
|
$or: [{
|
||
|
startTime: { $lte: startTime },
|
||
|
endTime: { $gte: endTime }
|
||
|
},
|
||
|
{
|
||
|
startTime: { $gt: startTime },
|
||
|
endTime: { $lt: endTime }
|
||
|
},
|
||
|
{
|
||
|
startTime: { $between: [startTime, endTime] },
|
||
|
},
|
||
|
{
|
||
|
endTime: { $between: [startTime, endTime] }
|
||
|
},
|
||
|
|
||
|
]
|
||
|
}
|
||
|
})
|
||
|
if (plan && plan.length) {
|
||
|
for (let { dataValues: c } of plan) {
|
||
|
let frequency = Number(c.frequency.split('次')[0]) || 0
|
||
|
let points = c.points.length || 0
|
||
|
let done = 0
|
||
|
//
|
||
|
if (moment(c.startTime).isSameOrBefore(moment(startTime)) && moment(c.endTime).isSameOrAfter(moment(endTime))) {
|
||
|
done = await models.PatrolRecord.count({
|
||
|
where: {
|
||
|
inspectionTime: { $between: [c.startTime, endTime] },
|
||
|
patrolPlanId: c.id
|
||
|
}
|
||
|
})
|
||
|
|
||
|
} else if (moment(c.startTime).isSameOrAfter(moment(startTime)) && moment(c.startTime).isSameOrBefore(moment(endTime))) {
|
||
|
done = await models.PatrolRecord.count({
|
||
|
where: {
|
||
|
inspectionTime: { $between: [c.startTime, endTime] },
|
||
|
patrolPlanId: c.id
|
||
|
}
|
||
|
})
|
||
|
} else if (moment(c.endTime).isSameOrAfter(moment(startTime)) && moment(c.endTime).isSameOrBefore(moment(endTime))) {
|
||
|
done = await models.PatrolRecord.count({
|
||
|
where: {
|
||
|
inspectionTime: { $between: [c.startTime, c.endTime] },
|
||
|
patrolPlanId: c.id
|
||
|
}
|
||
|
})
|
||
|
} else if (moment(c.startTime).isAfter(moment(startTime)) && moment(c.endTime).isBefore(moment(endTime))) {
|
||
|
done = await models.PatrolRecord.count({
|
||
|
where: {
|
||
|
inspectionTime: { $between: [c.startTime, c.endTime] },
|
||
|
patrolPlanId: c.id
|
||
|
}
|
||
|
})
|
||
|
}
|
||
|
let dones = await models.PatrolRecord.count({
|
||
|
where: {
|
||
|
inspectionTime: { $between: [startTime, endTime] },
|
||
|
patrolPlanId: c.id
|
||
|
}
|
||
|
})
|
||
|
rslt.planCount += frequency * points - done
|
||
|
rslt.done += dones
|
||
|
}
|
||
|
|
||
|
}
|
||
|
ctx.status = 200
|
||
|
ctx.body = rslt
|
||
|
|
||
|
} catch (error) {
|
||
|
ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`);
|
||
|
ctx.status = 400;
|
||
|
ctx.body = { message: '查询巡检记录失败' }
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
async function findPatrolRate(ctx) {
|
||
|
try {
|
||
|
const models = ctx.fs.dc.models
|
||
|
const sequelize = ctx.fs.dc.orm;
|
||
|
const { projectId, startTime, endTime } = ctx.query
|
||
|
const res = await models.PatrolRecord.findAll({
|
||
|
attributes: ['id'],
|
||
|
where: {
|
||
|
projectId: { $in: projectId.split(',') },
|
||
|
},
|
||
|
include: [
|
||
|
{
|
||
|
model: models.PatrolRecordIssueHandle,
|
||
|
required: true,
|
||
|
where: {
|
||
|
createTime: { $between: [startTime, endTime] },
|
||
|
},
|
||
|
attributes: ['createTime', 'state'],
|
||
|
},
|
||
|
],
|
||
|
|
||
|
});
|
||
|
ctx.body = res
|
||
|
ctx.status = 200
|
||
|
} catch (error) {
|
||
|
ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`);
|
||
|
ctx.status = 400;
|
||
|
ctx.body = { message: '查询巡检完成率失败' }
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
async function countByProject(ctx) {
|
||
|
try {
|
||
|
const models = ctx.fs.dc.models
|
||
|
const sequelize = ctx.fs.dc.orm;
|
||
|
const { projectId, } = ctx.query
|
||
|
const res = await models.Project.findAll({
|
||
|
attributes: [
|
||
|
'id',
|
||
|
'name',
|
||
|
[sequelize.fn('COUNT', sequelize.literal('"PatrolRecords"."id"')), 'patrolRecordCount'],
|
||
|
[sequelize.fn('COUNT', sequelize.literal('"PatrolRecords->patrolRecordIssueHandles"."id"')), 'issueHandleCount'],
|
||
|
],
|
||
|
include: [
|
||
|
{
|
||
|
model: models.PatrolRecord,
|
||
|
// as: 'PatrolRecords',
|
||
|
attributes: [],
|
||
|
include: [
|
||
|
{
|
||
|
model: models.PatrolRecordIssueHandle,
|
||
|
attributes: [],
|
||
|
// as: 'PatrolRecordIssueHandles',
|
||
|
},
|
||
|
],
|
||
|
},
|
||
|
],
|
||
|
where: {
|
||
|
id: { $in: projectId.split(',') },
|
||
|
},
|
||
|
group: ['project.id', 'project.name'],
|
||
|
order: [
|
||
|
[sequelize.fn('COUNT', sequelize.literal('"PatrolRecords"."id"')), 'DESC'],
|
||
|
],
|
||
|
});
|
||
|
ctx.body = res
|
||
|
ctx.status = 200
|
||
|
} catch (error) {
|
||
|
ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`);
|
||
|
ctx.status = 400;
|
||
|
ctx.body = { message: '根据结构物汇集失败' }
|
||
|
}
|
||
|
}
|
||
|
|
||
|
async function devicesGuarantee(ctx) {
|
||
|
try {
|
||
|
let rslt = {}
|
||
|
const models = ctx.fs.dc.models
|
||
|
const sequelize = ctx.fs.dc.orm;
|
||
|
const { projectId, } = ctx.query
|
||
|
let option = {
|
||
|
// where: searchWhere,
|
||
|
order: [["id", "desc"]],
|
||
|
include: [{
|
||
|
model: models.PointDevice,
|
||
|
include: {
|
||
|
model: models.Point,
|
||
|
where: { projectId: { $in: projectId.split(',') } }
|
||
|
}
|
||
|
}]
|
||
|
}
|
||
|
const res = await models.Device.findAll(option);
|
||
|
rslt.count = res.length
|
||
|
let underGuarantee = 0
|
||
|
for (let { dataValues: c } of res) {
|
||
|
if (moment(c.dateGuarantee).isAfter(moment())) {
|
||
|
underGuarantee += 1
|
||
|
}
|
||
|
}
|
||
|
rslt.underGuarantee = underGuarantee
|
||
|
const rs = await sequelize.query(`
|
||
|
SELECT d.type, COUNT(d.id) as count
|
||
|
FROM device d
|
||
|
LEFT JOIN point_device pd
|
||
|
ON d.id = pd.device_id
|
||
|
LEFT JOIN point p
|
||
|
ON pd.point_id = p.id
|
||
|
WHERE p.project_id IN (${projectId})
|
||
|
GROUP by d.type`)
|
||
|
rslt.rs = rs[0]
|
||
|
ctx.body = rslt
|
||
|
ctx.status = 200
|
||
|
} catch (error) {
|
||
|
ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`);
|
||
|
ctx.status = 400;
|
||
|
ctx.body = { message: '查询设备失败' }
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
async function getHistoricalFaults(ctx) {
|
||
|
try {
|
||
|
const models = ctx.fs.dc.models
|
||
|
const sequelize = ctx.fs.dc.orm;
|
||
|
const { projectId, startTime, endTime } = ctx.query
|
||
|
const rslt = await sequelize.query(`
|
||
|
select p.name,
|
||
|
count(1) as count,
|
||
|
count(case when prih.state=6 then 1 end) as bCount
|
||
|
from project p
|
||
|
left join patrol_record pr
|
||
|
on p.id = pr.project_id
|
||
|
left join patrol_record_issue_handle prih
|
||
|
on pr.id = prih.patrol_record_id
|
||
|
and prih.create_time
|
||
|
between '${startTime}'
|
||
|
and '${endTime}'
|
||
|
where p.id in (${projectId})
|
||
|
group by p.name
|
||
|
|
||
|
`)
|
||
|
ctx.body = rslt[0]
|
||
|
ctx.status = 200
|
||
|
} catch (error) {
|
||
|
ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`);
|
||
|
ctx.status = 400;
|
||
|
ctx.body = { message: '查询历史故障失败' }
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
async function getFaultsRank(ctx) {
|
||
|
try {
|
||
|
let rslt = []
|
||
|
const models = ctx.fs.dc.models
|
||
|
const sequelize = ctx.fs.dc.orm;
|
||
|
const { projectId, } = ctx.query
|
||
|
const rs = await models.PatrolRecord.findAll(
|
||
|
{
|
||
|
where:
|
||
|
{ projectId: { $in: projectId.split(',') } }
|
||
|
}
|
||
|
)
|
||
|
for (let { dataValues: c } of rs) {
|
||
|
if (c.points.inspectContent && c.points.inspectContent.length) {
|
||
|
for (let p of c.points.inspectContent) {
|
||
|
if (p.deviceId) {
|
||
|
if(p.alarm){
|
||
|
const isExist = rslt.find(item => item.id === p.deviceId)
|
||
|
if (!isExist) {
|
||
|
rslt.push({ id: p.deviceId, name: p.deviceName, count: 1 })
|
||
|
} else {
|
||
|
isExist.count += 1
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
}
|
||
|
rslt.sort((a, b) => b.count - a.count)
|
||
|
ctx.body = rslt
|
||
|
ctx.status = 200
|
||
|
} catch (error) {
|
||
|
ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`);
|
||
|
ctx.status = 400;
|
||
|
ctx.body = { message: '查询故障排名失败' }
|
||
|
}
|
||
|
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
async function getCenterData(ctx) {
|
||
|
try{
|
||
|
let rslt = {}
|
||
|
const models = ctx.fs.dc.models
|
||
|
const sequelize = ctx.fs.dc.orm;
|
||
|
const { projectId, } = ctx.query
|
||
|
let option = {
|
||
|
// where: searchWhere,
|
||
|
order: [["id", "desc"]],
|
||
|
include: [{
|
||
|
model: models.PointDevice,
|
||
|
include: {
|
||
|
model: models.Point,
|
||
|
where: { projectId: { $in: projectId.split(',') } }
|
||
|
}
|
||
|
}]
|
||
|
}
|
||
|
const res = await models.Device.findAll(option)
|
||
|
const rs = await sequelize.query(`
|
||
|
select
|
||
|
count(1) as count,
|
||
|
count(case when prih.state=6 then 1 end) as bCount
|
||
|
from project p
|
||
|
left join patrol_record pr
|
||
|
on p.id = pr.project_id
|
||
|
left join patrol_record_issue_handle prih
|
||
|
on pr.id = prih.patrol_record_id
|
||
|
where p.id in (${projectId})
|
||
|
`)
|
||
|
const record=await models.PatrolRecord.count({where:{projectId:{$in:projectId.split(',')}}})
|
||
|
const reportCount=await models.ReportInfo.count({
|
||
|
where:{
|
||
|
$or:[ {projectId:{$in:projectId.split(',') }},
|
||
|
|
||
|
{
|
||
|
structureIds:{$contains:projectId.split(',').map(item=>parseInt(item))}
|
||
|
}
|
||
|
|
||
|
]
|
||
|
|
||
|
}
|
||
|
})
|
||
|
|
||
|
rslt.deviceCount=res.length
|
||
|
rslt.questions=rs[0][0]?Number(rs[0][0].count):0
|
||
|
rslt.handleCount=rs[0][0]?Number(rs[0][0].count):0
|
||
|
rslt.records=record
|
||
|
rslt.reportCount=reportCount
|
||
|
ctx.body = rslt
|
||
|
ctx.status = 200
|
||
|
}catch(error){
|
||
|
ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`);
|
||
|
ctx.status = 400;
|
||
|
ctx.body = { message: '领导驾驶舱中间数据查询失败' }
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
module.exports = {
|
||
|
findPatrolRecords,
|
||
|
findPatrolRate,
|
||
|
countByProject,
|
||
|
devicesGuarantee,
|
||
|
getHistoricalFaults,
|
||
|
getFaultsRank,
|
||
|
getCenterData
|
||
|
}
|