zhaobing 1 year ago
parent
commit
0b6078f942
  1. 11
      api/app/lib/controllers/alarm/data.js
  2. 41
      api/app/lib/controllers/alarm/service.js
  3. 2
      api/app/lib/controllers/alarm/video.js
  4. 14
      api/app/lib/controllers/control/toolLink.js
  5. 3
      api/app/lib/controllers/firmwareUpgrade/index.js
  6. 43
      api/app/lib/controllers/project/index.js
  7. 44
      api/app/lib/models/exception_typ_check.js
  8. 8
      api/app/lib/routes/alarm/index.js
  9. 146
      api/app/lib/schedule/alarms_push.js
  10. 14
      script/4.2/schema/1.exception_typ_check.sql
  11. 2
      web/client/src/layout/components/header/index.jsx
  12. 148
      web/client/src/sections/control/components/alarm-chart.jsx
  13. 19
      web/client/src/sections/control/containers/control.jsx
  14. 2
      web/client/src/sections/firmwareUpgrade/containers/firmwareLibrary.jsx
  15. 24
      web/client/src/sections/problem/actions/problem.jsx
  16. 2
      web/client/src/sections/problem/components/inspection.jsx
  17. 177
      web/client/src/sections/problem/components/tableData.jsx
  18. 93
      web/client/src/sections/problem/containers/dataAlarm.jsx
  19. 18
      web/client/src/sections/problem/nav-item.jsx
  20. 46
      web/client/src/sections/problem/routes.js
  21. 2
      web/client/src/sections/service/components/automatic-Modal.jsx
  22. 40
      web/client/src/sections/service/components/pushModal.jsx
  23. 31
      web/client/src/sections/service/containers/emPush.jsx
  24. 1
      web/client/src/utils/webapi.js

11
api/app/lib/controllers/alarm/data.js

@ -46,7 +46,8 @@ async function list (ctx) {
const { utils: { judgeSuper, anxinStrucIdRange } } = ctx.app.fs const { utils: { judgeSuper, anxinStrucIdRange } } = ctx.app.fs
const { database: anxinyun } = clickHouse.anxinyun.opts.config const { database: anxinyun } = clickHouse.anxinyun.opts.config
const { timestamps,pepProjectId, keywordTarget, keyword, groupId, groupUnitId, sustainTimeStart, sustainTimeEnd, limit, page, state, onlineState, toExport } = ctx.query const { timestamps, pepProjectId, keywordTarget, keyword, groupId, groupUnitId, sustainTimeStart, sustainTimeEnd,
limit, page, state, onlineState, toExport } = ctx.query
let anxinStruc = await anxinStrucIdRange({ let anxinStruc = await anxinStrucIdRange({
ctx, pepProjectId, keywordTarget, keyword ctx, pepProjectId, keywordTarget, keyword
@ -60,7 +61,7 @@ async function list (ctx) {
whereOption.push(`alarms.AlarmGroup IN (${groupId})`) whereOption.push(`alarms.AlarmGroup IN (${groupId})`)
} }
if (groupUnitId) { if (groupUnitId) {
whereOption.push(`alarms.AlarmGroupUnit=${groupUnitId}`) whereOption.push(`alarms.AlarmGroupUnit IN (${groupUnitId})`)
} }
if (sustainTimeStart && sustainTimeEnd) { if (sustainTimeStart && sustainTimeEnd) {
let momentStart = moment(sustainTimeStart).format('YYYY-MM-DD HH:mm:ss') let momentStart = moment(sustainTimeStart).format('YYYY-MM-DD HH:mm:ss')
@ -100,10 +101,10 @@ async function list (ctx) {
let alarmQueryOptionStr = ` let alarmQueryOptionStr = `
FROM FROM
alarms alarms
${timestamps?`LEFT JOIN ( ${timestamps ? `LEFT JOIN (
SELECT DeviceId, any(Status) AS Status,max(Time) FROM DeviceStatus GROUP BY DeviceId SELECT DeviceId, any(Status) AS Status,max(Time) FROM DeviceStatus GROUP BY DeviceId
) AS DeviceStatus ) AS DeviceStatus
ON DeviceStatus.DeviceId = alarms.SourceId`:''} ON DeviceStatus.DeviceId = alarms.SourceId`: ''}
LEFT JOIN ${anxinyun}.t_structure LEFT JOIN ${anxinyun}.t_structure
ON ${anxinyun}.t_structure.id = alarms.StructureId ON ${anxinyun}.t_structure.id = alarms.StructureId
LEFT JOIN ${anxinyun}.t_alarm_code LEFT JOIN ${anxinyun}.t_alarm_code
@ -121,7 +122,7 @@ async function list (ctx) {
SourceTypeId, SourceTypeId,
AlarmAdviceProblem, AlarmGroup, AlarmGroupUnit, AlarmAdviceProblem, AlarmAdviceProblem, AlarmGroup, AlarmGroupUnit, AlarmAdviceProblem,
alarms.StructureId AS StructureId, alarms.StructureId AS StructureId,
${timestamps?`DeviceStatus.Status AS DeviceStatus,`:''} ${timestamps ? `DeviceStatus.Status AS DeviceStatus,` : ''}
${anxinyun}.t_structure.name AS StructureName, ${anxinyun}.t_structure.name AS StructureName,
${anxinyun}.t_structure.longitude AS StructureLongitude, ${anxinyun}.t_structure.longitude AS StructureLongitude,
${anxinyun}.t_structure.latitude AS StructureLatitude, ${anxinyun}.t_structure.latitude AS StructureLatitude,

41
api/app/lib/controllers/alarm/service.js

@ -157,10 +157,51 @@ async function serviceErrorList (ctx) {
} }
} }
async function getExceptionTypeCheck (ctx) {
try {
const models = ctx.fs.dc.models;
const { userId } = ctx.query
const res = await models.ExceptionTypeCheck.findOne({ where: { userId } })
ctx.status = 200;
ctx.body = res
} catch (error) {
ctx.fs.logger.error(`path: ${ctx.path}, error: ${error}`);
ctx.status = 400;
ctx.body = {
message: typeof error == 'string' ? error : undefined
}
}
}
async function postExceptionTypeCheck (ctx) {
try {
const models = ctx.fs.dc.models;
const { userId, typeId } = ctx.request.body
const findOne = await models.ExceptionTypeCheck.findOne({ where: { userId } })
if (findOne) {
await models.ExceptionTypeCheck.update({ typeId }, { where: { userId } })
} else {
await models.ExceptionTypeCheck.create({ typeId, userId })
}
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
}
}
}
module.exports = { module.exports = {
serviceError, serviceError,
serviceErrorList, serviceErrorList,
getExceptionTypeCheck,
postExceptionTypeCheck,
}; };

2
api/app/lib/controllers/alarm/video.js

@ -227,7 +227,7 @@ async function alarmList (ctx) {
const alarmRes = anxinStrucIds.length ? await clickHouse.vcmp.query( const alarmRes = anxinStrucIds.length ? await clickHouse.vcmp.query(
queryStr queryStr
).toPromise() : [] ).toPromise() : []
console.log(queryStr);
let returnD = [] let returnD = []
let positionD = {} let positionD = {}
// 每个设备一个告警 // 每个设备一个告警

14
api/app/lib/controllers/control/toolLink.js

@ -307,7 +307,7 @@ async function count (ctx) {
WHERE WHERE
camera.delete = '0' camera.delete = '0'
AND camera.recycle_time is null AND camera.recycle_time is null
AND camera_status_alarm.create_time >= '${moment().startOf("day").format('YYYY-MM-DD HH:mm:ss')}' -- AND camera_status_alarm.create_time >= '${moment().startOf("day").format('YYYY-MM-DD HH:mm:ss')}'
AND alarmId IN ( AND alarmId IN (
SELECT camera_status_alarm.id AS alarmId SELECT camera_status_alarm.id AS alarmId
FROM camera_status_alarm FROM camera_status_alarm
@ -487,14 +487,14 @@ async function count (ctx) {
ctx.status = 200; ctx.status = 200;
ctx.body = { ctx.body = {
dataSurplus: dataSurplus + videoSurplus, dataSurplus: dataSurplus + toolSurplus,
dataNewAdd: dataNewAdd + videoNewAdd, dataNewAdd: dataNewAdd + toolNewAdd,
dataConfirme: videoConfirme + dataConfirmeToday, dataConfirme: dataConfirmeToday + toolConfirmeToday,
toolSurplus: toolSurplus, videoSurplus: videoSurplus,
toolNewAdd: toolNewAdd, videoNewAdd: videoNewAdd,
toolConfirme: toolConfirmeToday, videoConfirme: videoConfirme,
appSurplus: appSurplus, appSurplus: appSurplus,

3
api/app/lib/controllers/firmwareUpgrade/index.js

@ -113,7 +113,8 @@ async function getFirmwares (ctx) {
uploader:item.userid, uploader:item.userid,
comment:item.comment, comment:item.comment,
uploadTime:moment(item.UpdatedTime).format('YYYY-MM-DD'), uploadTime:moment(item.UpdatedTime).format('YYYY-MM-DD'),
fileObj:item.Bin fileObj:item.Bin,
md5Value:item.md5
}) })
}):[] }):[]
} }

43
api/app/lib/controllers/project/index.js

@ -282,6 +282,7 @@ async function strucWithPomsProject (ctx) {
SELECT SELECT
t_structure.id AS strucId, t_structure.id AS strucId,
t_structure.name AS strucName, t_structure.name AS strucName,
t_structure.external_platform AS externalPlatform,
t_factor.id AS factorId, t_factor.id AS factorId,
t_factor.name AS factorName, t_factor.name AS factorName,
t_factor.proto AS factorProto, t_factor.proto AS factorProto,
@ -323,8 +324,46 @@ async function strucWithPomsProject (ctx) {
` `
).toPromise() : ).toPromise() :
[] []
for (let s of undelStrucRes) { for await (let s of undelStrucRes) {
let corStrut = undelStruc.find(us => us.id == s.strucId) let corStrut = undelStruc.find(us => us.id == s.strucId)
if (s.externalPlatform) {
if (!corStrut) {
const factorList = await clickHouse.dataAlarm
.query(`select SafetyFactorTypeId, SafetyFactorTypeName from sensors where PlatformStructureId = ${s.strucId}`)
.toPromise()
const project = await clickHouse.dataAlarm
.query(`select Project from sensors where PlatformStructureId =${s.strucId} limit 1 `)
.toPromise()
let fList = factorList.map(m => m.SafetyFactorTypeId)
let list = await clickHouse.dataAlarm
.query(
`select distinct FactorID, Name,Items,ItemNames from factors
where FactorID in (${[...fList, -1].join(',')})
and Project = '${[...project, 0][0].Project}'
`
)
.toPromise() || []
let nextFacor = []
list.map(d => {
if (d.Name) {
nextFacor.push({
id: d.FactorID,
name: d.Name,
// proto: s.factorProto,
item: d.ItemNames && d.ItemNames.split(',').map(item => ({ id: item, name: item })) || [],
})
}
})
undelStruc.push({
id: s.strucId,
name: s.strucName,
factor: nextFacor
})
}
} else {
if (!corStrut) { if (!corStrut) {
let nextFacor = [] let nextFacor = []
if (s.factorId) { if (s.factorId) {
@ -375,6 +414,8 @@ async function strucWithPomsProject (ctx) {
} }
} }
} }
}
} }
ctx.status = 200; ctx.status = 200;

44
api/app/lib/models/exception_typ_check.js

@ -0,0 +1,44 @@
/* eslint-disable*/
'use strict';
module.exports = dc => {
const DataTypes = dc.ORM;
const sequelize = dc.orm;
const ExceptionTypeCheck = sequelize.define("exceptionTypeCheck", {
id: {
type: DataTypes.INTEGER,
allowNull: false,
defaultValue: null,
comment: null,
primaryKey: true,
field: "id",
autoIncrement: true,
unique: "exception_type_check_id_uindex"
},
userId: {
type: DataTypes.INTEGER,
allowNull: false,
defaultValue: null,
comment: "",
primaryKey: false,
field: "user_id",
autoIncrement: false
},
typeId: {
type: DataTypes.ARRAY(DataTypes.INTEGER),
allowNull: true,
defaultValue: null,
comment: "",
primaryKey: false,
field: "type_id",
autoIncrement: false
},
}, {
tableName: "exception_type_check",
comment: "",
indexes: []
});
dc.models.ExceptionTypeCheck = ExceptionTypeCheck;
return ExceptionTypeCheck;
};

8
api/app/lib/routes/alarm/index.js

@ -93,4 +93,12 @@ module.exports = function (app, router, opts) {
app.fs.api.logAttr['GET/data/continuity/:continuityId/detail'] = { content: '获取数据连续性监控信息详细', visible: true } app.fs.api.logAttr['GET/data/continuity/:continuityId/detail'] = { content: '获取数据连续性监控信息详细', visible: true }
router.get('/data/continuity/:continuityId/detail', dataContinuity.dataContinuityDetail); router.get('/data/continuity/:continuityId/detail', dataContinuity.dataContinuityDetail);
app.fs.api.logAttr['GET/exception/type/check'] = { content: '获取用户的数据异常勾选信息', visible: true };
router.get('/exception/type/check', service.getExceptionTypeCheck);
app.fs.api.logAttr['POST/exception/type/check'] = { content: '存储用户的数据异常勾选信息', visible: true };
router.post('/exception/type/check', service.postExceptionTypeCheck);
}; };

146
api/app/lib/schedule/alarms_push.js

@ -10,7 +10,7 @@ module.exports = function (app, opts) {
const alarmsPush = app.fs.scheduleInit( const alarmsPush = app.fs.scheduleInit(
{ {
interval: isDev ? interval: isDev ?
'24 0 */1 * * *' : // 延长运行时间 好debug '24 */1 * * *' : // 延长运行时间 好debug
'12 */1 * * * *', '12 */1 * * * *',
// interval: '12 0 0 0 */1 *', // interval: '12 0 0 0 */1 *',
immediate: isDev, immediate: isDev,
@ -247,6 +247,7 @@ module.exports = function (app, opts) {
let emailSubTitle = '' let emailSubTitle = ''
let dataAlarmOption = [] let dataAlarmOption = []
let dataAlarmOptionLocal=[]
let dataAlarmGroupOption = [] let dataAlarmGroupOption = []
let dataAlarmSubType = [] let dataAlarmSubType = []
let dataAlarms = [] let dataAlarms = []
@ -287,6 +288,7 @@ module.exports = function (app, opts) {
} else if (c.tactics == 'continue' || c.tactics == 'abnormal_rate') { } else if (c.tactics == 'continue' || c.tactics == 'abnormal_rate') {
// 新增的应该是上一个时间节点到上上个节点之间 // 新增的应该是上一个时间节点到上上个节点之间
dataAlarmOption.push(`StartTime <= '${pointTime}'`); dataAlarmOption.push(`StartTime <= '${pointTime}'`);
dataAlarmOptionLocal.push(`StartTime <= '${pointTime}'`);
appAlarmWhereOption.createTime = { $lte: pointTime } appAlarmWhereOption.createTime = { $lte: pointTime }
videoAlarmWhereOption.push(`camera_status_alarm.create_time <= '${pointTime}'`) videoAlarmWhereOption.push(`camera_status_alarm.create_time <= '${pointTime}'`)
// 新增的应该是上一个时间节点到上上个节点之间 // 新增的应该是上一个时间节点到上上个节点之间
@ -327,16 +329,19 @@ module.exports = function (app, opts) {
// 判断告警数据范围 // 判断告警数据范围
if (c.alarmType.includes('data_outages')) { if (c.alarmType.includes('data_outages')) {
dataAlarmGroupOption.push(1) dataAlarmGroupOption.push(1)
dataAlarmGroupOption.push(4)
dataAlarmGroupOption.push(5)
if (c.alarmSubType) dataAlarmSubType = dataAlarmSubType.concat(c.alarmSubType['data_outages'] || []) if (c.alarmSubType) dataAlarmSubType = dataAlarmSubType.concat(c.alarmSubType['data_outages'] || [])
} }
if (c.alarmType.includes('data_exception')) { if (c.alarmType.includes('data_exception')) {
dataAlarmGroupOption.push(2) dataAlarmGroupOption.push(2)
if (c.alarmSubType) dataAlarmSubType = dataAlarmSubType.concat(c.alarmSubType['data_exception'] || [])
}
if (c.alarmType.includes('strategy_hit')) {
dataAlarmGroupOption.push(3) dataAlarmGroupOption.push(3)
if (c.alarmSubType) dataAlarmSubType = dataAlarmSubType.concat(c.alarmSubType['strategy_hit'] || []) if (c.alarmSubType) dataAlarmSubType = dataAlarmSubType.concat(c.alarmSubType['data_exception'] || [])
} }
// if (c.alarmType.includes('strategy_hit')) {
// dataAlarmGroupOption.push(3)
// if (c.alarmSubType) dataAlarmSubType = dataAlarmSubType.concat(c.alarmSubType['strategy_hit'] || [])
// }
if (c.alarmType.includes('video_exception')) { if (c.alarmType.includes('video_exception')) {
let videoAlarmSubType = c.alarmSubType ? let videoAlarmSubType = c.alarmSubType ?
( (
@ -524,11 +529,11 @@ module.exports = function (app, opts) {
}] }]
}) : [] }) : []
} }
if (c.alarmType.includes('device_exception')) { // if (c.alarmType.includes('device_exception')) {
dataAlarmGroupOption.push(4) // dataAlarmGroupOption.push(4)
dataAlarmGroupOption.push(5) // dataAlarmGroupOption.push(5)
if (c.alarmSubType) dataAlarmSubType = dataAlarmSubType.concat(c.alarmSubType['device_exception']) // if (c.alarmSubType) dataAlarmSubType = dataAlarmSubType.concat(c.alarmSubType['device_exception'])
} // }
// 查数据告警 三警合一 // 查数据告警 三警合一
if (dataAlarmGroupOption.length && searchStrucIds.length) { if (dataAlarmGroupOption.length && searchStrucIds.length) {
@ -538,6 +543,7 @@ module.exports = function (app, opts) {
if (c.alarmSubType && dataAlarmSubType_.length) { if (c.alarmSubType && dataAlarmSubType_.length) {
dataAlarmSubType_.push(-1) dataAlarmSubType_.push(-1)
dataAlarmOption.push(`AlarmGroupUnit IN (${dataAlarmSubType_.join(',')})`) dataAlarmOption.push(`AlarmGroupUnit IN (${dataAlarmSubType_.join(',')})`)
dataAlarmOptionLocal.push(`AlarmGroupUnit IN (${dataAlarmSubType_.join(',')})`)
} }
//安心云 //安心云
dataAlarms = dataAlarms =
@ -564,6 +570,7 @@ module.exports = function (app, opts) {
AND alarms.SourceTypeId = 2 AND alarms.SourceTypeId = 2
WHERE WHERE
${`State NOT IN (3, 4) AND `} ${`State NOT IN (3, 4) AND `}
PlatformStructureId IN (${searchStrucIds.join(',')}) PlatformStructureId IN (${searchStrucIds.join(',')})
${dataAlarmOption.length ? ' AND ' + dataAlarmOption.join(' AND ') : ''} ${dataAlarmOption.length ? ' AND ' + dataAlarmOption.join(' AND ') : ''}
AND Project IS NOT null AND Project IS NOT null
@ -1125,9 +1132,9 @@ module.exports = function (app, opts) {
} }
} }
} }
dataAlarmG3.push(d) dataAlarmG2.push(d)
} else if (d.AlarmGroup == 4 || d.AlarmGroup == 5) { } else if (d.AlarmGroup == 4 || d.AlarmGroup == 5) {
dataAlarmG45.push(d) // dataAlarmG45.push(d)
} }
deviceStatistic.add(d.SourceId) deviceStatistic.add(d.SourceId)
@ -1181,8 +1188,8 @@ module.exports = function (app, opts) {
let dataAlarmG145Data = dataAlarms.filter(a => { let dataAlarmG145Data = dataAlarms.filter(a => {
return a.AlarmGroup == 1 return a.AlarmGroup == 1
// || a.AlarmGroup == 4 || a.AlarmGroup == 4
// || a.AlarmGroup == 5 || a.AlarmGroup == 5
}) })
pLog('数据中断', dataAlarmG145Data.length) pLog('数据中断', dataAlarmG145Data.length)
if (dataAlarmG145Data.length) { if (dataAlarmG145Data.length) {
@ -1291,13 +1298,15 @@ module.exports = function (app, opts) {
FROM FROM
alarms alarms
WHERE WHERE
AlarmGroup IN (1,4,5)
AND
alarms.StructureId In (${[...dataAlarmG1StructureId, ...dataAlarmStructureId, -1].join(',') alarms.StructureId In (${[...dataAlarmG1StructureId, ...dataAlarmStructureId, -1].join(',')
// 3025 // 3025
}) })
AND
alarms.AlarmGroup IN (1,4,5)
AND AND
alarms.State < 3 alarms.State < 3
${dataAlarmOptionLocal.length ? ' AND ' + dataAlarmOptionLocal.join(' AND ') : ''}
` `
).toPromise() || [] ).toPromise() || []
@ -1310,6 +1319,7 @@ module.exports = function (app, opts) {
...alarms, ...alarms,
alarmId: SubDevice, alarmId: SubDevice,
sourceId: SubDevice, sourceId: SubDevice,
below: true
}) })
} }
} else { } else {
@ -1386,51 +1396,71 @@ module.exports = function (app, opts) {
// 处理那些没有被匹配到的告警信息 // 处理那些没有被匹配到的告警信息
// 将设备没有绑定到测点的告警也推出去 // 将设备没有绑定到测点的告警也推出去
let unmatchSourceId = []
alarmDatas.forEach(d => {
if (!matchedAlarmIds.includes(d.alarmId)) {
unmatchSourceId.push(d.sourceId)
}
})
const alarmDaRes = await clickHouse.iot.query(
`
SELECT
Device.id AS id,
Device.name AS name
FROM
Device
WHERE
Device.id IN (${[...unmatchSourceId, -1].map(d => `'${d}'`).join(',')}) `
).toPromise() || []
for (let a of alarmDatas) { for (let a of alarmDatas) {
if (!matchedAlarmIds.includes(a.alarmId)) { if (!matchedAlarmIds.includes(a.alarmId)) {
let deviceName = (alarmDaRes.find(d => d.id == a.sourceId) || {}).name
pLog('未匹配到的告警 ' + a.alarmId) pLog('未匹配到的告警 ' + a.alarmId)
// let curStruc = strucMap[a.StructureId] let curStruc = strucMap[a.StructureId]
// if (curStruc) { if (curStruc) {
// // curStruc 可以推出 告警属于哪个 project -> pomsProject // curStruc 可以推出 告警属于哪个 project -> pomsProject
// let curProject = pepProject_name.filter(p => p.anxinProjectId && p.anxinProjectId.includes(curStruc.projectId)); let curProject = pepProject_name.filter(p => p.anxinProjectId && p.anxinProjectId.includes(curStruc.projectId));
// for (let cp of curProject) { for (let cp of curProject) {
// // cp.projects 是结构物信息 // cp.projects 是结构物信息
// let curStruc = cp.projects.find(cpp => cpp.id == a.StructureId) let curStruc = cp.projects.find(cpp => cpp.id == a.StructureId)
// if (!curStruc) { if (!curStruc) {
// console.error(`没有查到结构物信息:${a.StructureId}?!不应该不应该!`); console.error(`没有查到结构物信息:${a.StructureId}?!不应该不应该!`);
// } else { } else {
// // let emptyFactor = { id: -1 } // let emptyFactor = { id: -1 }
// let emptyFactor = curStruc.factor.find(f => f.id == -1) let emptyFactor = curStruc.factor.find(f => f.id == -1)
// if (!emptyFactor) { if (!emptyFactor) {
// curStruc.factor.push({ curStruc.factor.push({
// id: -1, id: -1,
// devices: [{ devices: [{
// alarmDatas: [ alarmDatas: [
// { ...a } { ...a, SourceName: a.SourceName + (a.below ? ("(" + deviceName + ")") : "") }
// ], ],
// iotaDeviceId: a.sourceId, iotaDeviceId: a.sourceId,
// name: a.SourceName, name: a.SourceName,
// structureId: a.StructureId, structureId: a.StructureId,
// }] }]
// }) })
// } else { } else {
// let curDevice = emptyFactor.devices.find(d => d.iotaDeviceId == a.sourceId) let curDevice = emptyFactor.devices.find(d => d.iotaDeviceId == a.sourceId)
// if (!curDevice) { if (!curDevice) {
// emptyFactor.devices.push({ emptyFactor.devices.push({
// alarmDatas: [ alarmDatas: [
// { ...a } { ...a, SourceName: a.SourceName + (a.below ? ("(" + deviceName + ")") : "") }
// ], ],
// iotaDeviceId: a.sourceId, iotaDeviceId: a.sourceId,
// name: a.SourceName, name: a.SourceName,
// structureId: a.StructureId, structureId: a.StructureId,
// }) })
// } else { } else {
// curDevice.alarmDatas.push({ ...a }) curDevice.alarmDatas.push({ ...a })
// } }
// } }
// } }
// } }
// } }
} }
} }

14
script/4.2/schema/1.exception_typ_check.sql

@ -0,0 +1,14 @@
create table exception_type_check
(
id serial not null,
user_id int not null,
type_id integer[]
);
create unique index exception_type_check_id_uindex
on exception_type_check (id);
alter table exception_type_check
add constraint exception_type_check_pk
primary key (id);

2
web/client/src/layout/components/header/index.jsx

@ -63,7 +63,7 @@ const Header = (props) => {
setCount(res.payload.data?.count) setCount(res.payload.data?.count)
} }
}) })
dispatch(problem.getAlarmDataGroup()) dispatch(problem.getAlarmDataGroup({showAll:true}))
} }
}, []) }, [])

148
web/client/src/sections/control/components/alarm-chart.jsx

@ -239,31 +239,37 @@ const AlarmChart = ({ dispatch, actions, user, history, projectPoms, loading, so
const behindHandle = (key) => { const behindHandle = (key) => {
let show = [] let show = []
switch (key) { switch (key) {
case '数据中断': // case '':
dispatch(problem.getAlarmDataGroup()).then((res) => { // dispatch(problem.getAlarmDataGroup()).then((res) => {
if (res.success) { // if (res.success) {
let data = res.payload.data?.find(v => v.desc == '数据中断')?.unit || [] // let data = res.payload.data?.find(v => v.desc == '')?.unit || []
let sumData = datumData?.filter(s => s.AlarmGroup == 1) || [] // let sumData = datumData?.filter(s => s.AlarmGroup == 1) || []
data?.forEach(v => { // data?.forEach(v => {
let dataList = sumData?.filter(s => s.AlarmGroupUnit == v.id) || [] // let dataList = sumData?.filter(s => s.AlarmGroupUnit == v.id) || []
let untreated = dataList?.filter(s => s.State < 3)?.length || 0 // let untreated = dataList?.filter(s => s.State < 3)?.length || 0
show.push({ // show.push({
name: v.name, // name: v.name,
untreated: untreated, // untreated: untreated,
processed: dataList?.length - untreated, // processed: dataList?.length - untreated,
num: dataList?.length // num: dataList?.length
}) // })
}) // })
setBehindShow(show.sort((a, b) => b.num - a.num)?.slice(0, 5) || []) // setBehindShow(show.sort((a, b) => b.num - a.num)?.slice(0, 5) || [])
} // }
}) // })
break; // break;
case '数据异常': case '数据异常':
dispatch(problem.getAlarmDataGroup()).then((res) => { dispatch(problem.getAlarmDataGroup()).then(async (res) => {
if (res.success) {
let data2 = res.payload.data?.find(v => v.id == 2)?.unit || []
let data3 = res.payload.data?.find(v => v.id == 3)?.unit || []
let sumData = datumData?.filter(s => s.AlarmGroup == 2 || s.AlarmGroup == 3) || []
console.log(111, datumData,);
await dispatch(problem.getExceptionTypeCheck({ userId: user?.id, })).then(res => {
if (res.success) { if (res.success) {
let data = res.payload.data?.find(v => v.desc == '数据异常')?.unit || []
let sumData = datumData?.filter(s => s.AlarmGroup == 2) || [] [...data2, ...data3]?.filter(d => (res.payload.data?.typeId || [8, 40, 41, 48, 49]).includes(d.id))?.forEach(v => {
data?.forEach(v => {
let dataList = sumData?.filter(s => s.AlarmGroupUnit == v.id) || [] let dataList = sumData?.filter(s => s.AlarmGroupUnit == v.id) || []
let untreated = dataList?.filter(s => s.State < 3)?.length || 0 let untreated = dataList?.filter(s => s.State < 3)?.length || 0
show.push({ show.push({
@ -276,26 +282,28 @@ const AlarmChart = ({ dispatch, actions, user, history, projectPoms, loading, so
setBehindShow(show.sort((a, b) => b.num - a.num)?.slice(0, 5) || []) setBehindShow(show.sort((a, b) => b.num - a.num)?.slice(0, 5) || [])
} }
}) })
break;
case '策略命中':
dispatch(problem.getAlarmDataGroup()).then((res) => {
if (res.success) {
let data = res.payload.data?.find(v => v.desc == '策略命中')?.unit || []
let sumData = datumData?.filter(s => s.AlarmGroup == 3) || []
data?.forEach(v => {
let dataList = sumData?.filter(s => s.AlarmGroupUnit == v.id) || []
let untreated = dataList?.filter(s => s.State < 3)?.length || 0
show.push({
name: v.name,
untreated: untreated,
processed: dataList?.length - untreated,
num: dataList?.length
})
})
setBehindShow(show.sort((a, b) => b.num - a.num)?.slice(0, 5) || [])
} }
}) })
break; break;
// case '':
// dispatch(problem.getAlarmDataGroup()).then((res) => {
// if (res.success) {
// let data = res.payload.data?.find(v => v.desc == '')?.unit || []
// let sumData = datumData?.filter(s => s.AlarmGroup == 3) || []
// data?.forEach(v => {
// let dataList = sumData?.filter(s => s.AlarmGroupUnit == v.id) || []
// let untreated = dataList?.filter(s => s.State < 3)?.length || 0
// show.push({
// name: v.name,
// untreated: untreated,
// processed: dataList?.length - untreated,
// num: dataList?.length
// })
// })
// setBehindShow(show.sort((a, b) => b.num - a.num)?.slice(0, 5) || [])
// }
// })
// break;
case '视频异常': case '视频异常':
dispatch(problem.getAlarmVideoExceptionType()).then((res) => { dispatch(problem.getAlarmVideoExceptionType()).then((res) => {
if (res.success) { if (res.success) {
@ -331,25 +339,25 @@ const AlarmChart = ({ dispatch, actions, user, history, projectPoms, loading, so
}) })
setBehindShow(show.sort((a, b) => b.num - a.num)?.slice(0, 5) || []) setBehindShow(show.sort((a, b) => b.num - a.num)?.slice(0, 5) || [])
break; break;
case '设备异常': // case '':
dispatch(problem.getAlarmDataGroup()).then((res) => { // dispatch(problem.getAlarmDataGroup()).then((res) => {
if (res.success) { // if (res.success) {
let data = res.payload.data?.find(v => v.desc == '掉线' || v.desc == '不活跃')?.unit || [] // let data = res.payload.data?.find(v => v.desc == '线' || v.desc == '')?.unit || []
let sumData = datumData?.filter(s => s.AlarmGroup == 4 || s.AlarmGroup == 5) || [] // let sumData = datumData?.filter(s => s.AlarmGroup == 4 || s.AlarmGroup == 5) || []
data?.forEach(v => { // data?.forEach(v => {
let dataList = sumData?.filter(s => s.AlarmGroupUnit == v.id) || [] // let dataList = sumData?.filter(s => s.AlarmGroupUnit == v.id) || []
let untreated = dataList?.filter(s => s.State < 3)?.length || 0 // let untreated = dataList?.filter(s => s.State < 3)?.length || 0
show.push({ // show.push({
name: v.name, // name: v.name,
untreated: untreated, // untreated: untreated,
processed: dataList?.length - untreated, // processed: dataList?.length - untreated,
num: dataList?.length // num: dataList?.length
}) // })
}) // })
setBehindShow(show.sort((a, b) => b.num - a.num)?.slice(0, 5) || []) // setBehindShow(show.sort((a, b) => b.num - a.num)?.slice(0, 5) || [])
} // }
}) // })
break; // break;
} }
setBehind(false) setBehind(false)
} }
@ -405,28 +413,30 @@ const AlarmChart = ({ dispatch, actions, user, history, projectPoms, loading, so
</div> </div>
</div> </div>
<div style={{ display: 'flex', padding: 16, }}> <div style={{ display: 'flex', padding: 16, }}>
<div style={{ display: "flex", flexDirection: "column", justifyContent: "space-evenly", width: 180, height: 226 }}> <div style={{ display: "flex", flexDirection: "column", justifyContent: "space-evenly", width: 234, height: 226 }}>
<div style={{ display: 'flex', justifyContent: "space-between", cursor: 'pointer' }} onClick={() => behindHandle('数据中段')}> <div style={{ display: 'flex', justifyContent: "space-between", cursor: 'pointer' }}
// onClick={() => behindHandle('')}
>
<div>数据中断</div> <div>数据中断</div>
<div style={{ fontWeight: 500 }}> <div style={{ fontWeight: 500 }}>
<sapn style={{ color: "red" }}>{dataAlarm?.group1?.untreated || 0}</sapn> / <sapn style={{ color: "red" }}>{(dataAlarm?.group1?.untreated || 0) + (dataAlarm?.group4?.untreated || 0) + (dataAlarm?.group5?.untreated || 0)}</sapn> /
<span style={{ color: "rgb(48 47 138)" }}>{dataAlarm?.group1?.sum || 0}</span> <span style={{ color: "rgb(48 47 138)" }}>{(dataAlarm?.group1?.sum || 0) + (dataAlarm?.group4?.sum || 0) + (dataAlarm?.group5?.sum || 0)}</span>
</div> </div>
</div> </div>
<div style={{ display: 'flex', justifyContent: "space-between", cursor: 'pointer' }} onClick={() => behindHandle('数据异常')}> <div style={{ display: 'flex', justifyContent: "space-between", cursor: 'pointer' }} onClick={() => behindHandle('数据异常')}>
<div>数据异常</div> <div>数据异常</div>
<div style={{ fontWeight: 500 }}> <div style={{ fontWeight: 500 }}>
<sapn style={{ color: "red" }}>{dataAlarm?.group2?.untreated || 0}</sapn> / <sapn style={{ color: "red" }}>{(dataAlarm?.group2?.untreated || 0) + (dataAlarm?.group3?.untreated || 0)}</sapn> /
<span style={{ color: "rgb(48 47 138)" }}>{dataAlarm?.group2?.sum || 0}</span> <span style={{ color: "rgb(48 47 138)" }}>{(dataAlarm?.group2?.sum || 0) + (dataAlarm?.group3?.sum || 0)}</span>
</div> </div>
</div> </div>
<div style={{ display: 'flex', justifyContent: "space-between", cursor: 'pointer' }} onClick={() => behindHandle('策略命中')}> {/* <div style={{ display: 'flex', justifyContent: "space-between", cursor: 'pointer' }} onClick={() => behindHandle('')}>
<div>策略命中</div> <div>策略命中</div>
<div style={{ fontWeight: 500 }}> <div style={{ fontWeight: 500 }}>
<sapn style={{ color: "red" }}>{dataAlarm?.group3?.untreated || 0}</sapn> / <sapn style={{ color: "red" }}>{dataAlarm?.group3?.untreated || 0}</sapn> /
<span style={{ color: "rgb(48 47 138)" }}>{dataAlarm?.group3?.sum || 0}</span> <span style={{ color: "rgb(48 47 138)" }}>{dataAlarm?.group3?.sum || 0}</span>
</div> </div>
</div> </div> */}
<div style={{ display: 'flex', justifyContent: "space-between", cursor: 'pointer' }} onClick={() => behindHandle('视频异常')}> <div style={{ display: 'flex', justifyContent: "space-between", cursor: 'pointer' }} onClick={() => behindHandle('视频异常')}>
<div>视频异常</div> <div>视频异常</div>
@ -443,13 +453,13 @@ const AlarmChart = ({ dispatch, actions, user, history, projectPoms, loading, so
</div> </div>
</div> </div>
<div style={{ display: 'flex', justifyContent: "space-between", cursor: 'pointer' }} onClick={() => behindHandle('设备异常')}> {/* <div style={{ display: 'flex', justifyContent: "space-between", cursor: 'pointer' }} onClick={() => behindHandle('')}>
<div>设备异常</div> <div>设备异常</div>
<div style={{ fontWeight: 500 }}> <div style={{ fontWeight: 500 }}>
<sapn style={{ color: "red" }}>{(dataAlarm?.group4?.untreated || 0) + (dataAlarm?.group5?.untreated || 0)}</sapn> / <sapn style={{ color: "red" }}>{(dataAlarm?.group4?.untreated || 0) + (dataAlarm?.group5?.untreated || 0)}</sapn> /
<span style={{ color: "rgb(48 47 138)" }}>{(dataAlarm?.group4?.sum || 0) + (dataAlarm?.group5?.sum || 0)}</span> <span style={{ color: "rgb(48 47 138)" }}>{(dataAlarm?.group4?.sum || 0) + (dataAlarm?.group5?.sum || 0)}</span>
</div> </div>
</div> </div> */}
</div> </div>
<div style={{ width: 'calc(100% - 180px)', display: 'flex', flexDirection: "column", justifyContent: 'center', alignItems: 'center', fontSize: 46, fontWeight: 600 }}> <div style={{ width: 'calc(100% - 180px)', display: 'flex', flexDirection: "column", justifyContent: 'center', alignItems: 'center', fontSize: 46, fontWeight: 600 }}>

19
web/client/src/sections/control/containers/control.jsx

@ -161,7 +161,7 @@ const Control = ({ dispatch, actions, user, history, loading, socket, pepProject
} }
} }
workbench.appSurplus += (workbench.appNewAdd - workbench.appConfirme) workbench.appSurplus += (workbench.appNewAdd - workbench.appConfirme)
workbench.toolSurplus += (workbench.toolNewAdd - workbench.toolConfirme) workbench.videoSurplus += (workbench.videoNewAdd - workbench.videoConfirme)
workbench.dataSurplus += (workbench.dataNewAdd - workbench.dataConfirme) workbench.dataSurplus += (workbench.dataNewAdd - workbench.dataConfirme)
setWorkData({ ...workbench }) setWorkData({ ...workbench })
@ -203,7 +203,7 @@ const Control = ({ dispatch, actions, user, history, loading, socket, pepProject
// //
let data = ['overall_new', 'workbench', 'statistical', 'analyse', 'dynamic'] let data = ['overall_new', 'workbench', 'statistical', 'analyse', 'dynamic']
localStorage.getItem('overall')?localStorage.removeItem('overall'):"" localStorage.getItem('overall') ? localStorage.removeItem('overall') : ""
data.map(v => { data.map(v => {
localStorage.getItem(v) == null localStorage.getItem(v) == null
? localStorage.setItem(v, JSON.stringify(show[v])) ? localStorage.setItem(v, JSON.stringify(show[v]))
@ -598,7 +598,7 @@ const Control = ({ dispatch, actions, user, history, loading, socket, pepProject
{ name: '关注的项目', sort: 1, key: 'project', data: workData?.projects || 0, img: 'url(/assets/images/console/lan_1.png)' }, { name: '关注的项目', sort: 1, key: 'project', data: workData?.projects || 0, img: 'url(/assets/images/console/lan_1.png)' },
{ name: '数据告警', sort: 2, key: 'data', data: workData?.dataSurplus || 0, img: 'url(/assets/images/console/lv_1.png)', url: '/problem/dataAlarm/dataLnterrupt' }, { name: '数据告警', sort: 2, key: 'data', data: workData?.dataSurplus || 0, img: 'url(/assets/images/console/lv_1.png)', url: '/problem/dataAlarm/dataLnterrupt' },
{ name: '应用告警', sort: 2, key: 'app', data: workData?.appSurplus || 0, img: 'url(/assets/images/console/hong_1.png)', url: '/problem/useAlarm/useAbnormal' }, { name: '应用告警', sort: 2, key: 'app', data: workData?.appSurplus || 0, img: 'url(/assets/images/console/hong_1.png)', url: '/problem/useAlarm/useAbnormal' },
{ name: '设备告警', sort: 2, key: 'device', data: workData?.toolSurplus || 0, img: 'url(/assets/images/console/hong_1.png)', url: '/problem/deviceAlarm/deviceAbnormal' }, { name: '视频告警', sort: 2, key: 'device', data: workData?.videoSurplus || 0, img: 'url(/assets/images/console/hong_1.png)', url: '/problem/useAlarm/videoAbnormal' },
{ name: '项目里程碑', sort: 1, key: 'milestone', }, { name: '项目里程碑', sort: 1, key: 'milestone', },
{ name: '相关成员', sort: 2, key: 'personnel', }, { name: '相关成员', sort: 2, key: 'personnel', },
@ -700,7 +700,7 @@ const Control = ({ dispatch, actions, user, history, loading, socket, pepProject
剩余问题: 剩余问题:
</div> </div>
<div style={{ fontSize: 16, color: '#4A4A4A', width: 91 }}> <div style={{ fontSize: 16, color: '#4A4A4A', width: 91 }}>
{(workData?.appSurplus + workData?.dataSurplus + workData?.toolSurplus) || 0} {(workData?.appSurplus + workData?.dataSurplus + workData.videoSurplus) || 0}
</div> </div>
</div> </div>
<div style={{ display: 'flex', alignItems: 'center', marginTop: 26 }}> <div style={{ display: 'flex', alignItems: 'center', marginTop: 26 }}>
@ -709,7 +709,7 @@ const Control = ({ dispatch, actions, user, history, loading, socket, pepProject
</div> </div>
<div style={{ fontSize: 16, color: '#4A4A4A', width: 91, display: 'flex' }}> <div style={{ fontSize: 16, color: '#4A4A4A', width: 91, display: 'flex' }}>
<div> <div>
{(workData?.appNewAdd + workData?.dataNewAdd + workData?.toolNewAdd) || 0} {(workData?.appNewAdd + workData?.dataNewAdd + workData.dataNewAdd) || 0}
</div> </div>
<div style={{ display: 'flex', alignItems: 'center', marginLeft: 4 }}> <div style={{ display: 'flex', alignItems: 'center', marginLeft: 4 }}>
<img title='设置' src="/assets/images/console/icon_up.png" style={{ width: 18, height: 18 }} /> <img title='设置' src="/assets/images/console/icon_up.png" style={{ width: 18, height: 18 }} />
@ -721,28 +721,29 @@ const Control = ({ dispatch, actions, user, history, loading, socket, pepProject
今日处理: 今日处理:
</div> </div>
<div style={{ fontSize: 16, color: '#4A4A4A', width: 91 }}> <div style={{ fontSize: 16, color: '#4A4A4A', width: 91 }}>
{(workData?.appConfirme + workData?.dataConfirme + workData?.toolConfirme) || 0} {(workData?.appConfirme + workData?.dataConfirme + workData.dataConfirme) || 0}
</div> </div>
</div> </div>
</div> </div>
{/* 循环类型 */} {/* 循环类型 */}
<SimpleBar style={{ width: 'calc(100% - 240px)', whiteSpace: 'nowrap', }} forceVisible="x" > <SimpleBar style={{ width: 'calc(100% - 240px)', whiteSpace: 'nowrap', }} forceVisible="x" >
{exhibition.current['workbench']?.map((item, index) => { {exhibition.current['workbench']?.map((item, index) => {
return ( return item && (
pepProjectId && item.name == '关注的项目' ? '' : <div key={item.name} style={{ background: item.img, backgroundSize: "100% 100%", display: "inline-block", width: 270, height: 135, marginRight: 26 }}> pepProjectId && item.name == '关注的项目' ? '' : <div key={item.name} style={{ background: item.img, backgroundSize: "100% 100%", display: "inline-block", width: 270, height: 135, marginRight: 26 }}>
<div style={{ margin: '35px 0px 0px 134px' }}> <div style={{ margin: '35px 0px 0px 134px' }}>
<div> <div>
<span style={{ fontSize: 14, color: '#4A4A4A', fontWeight: 500, fontFamily: 'PingFangSC-Medium, PingFang SC' }}>{item.name}</span> <span style={{ fontSize: 14, color: '#4A4A4A', fontWeight: 500, fontFamily: 'PingFangSC-Medium, PingFang SC' }}>{item.name}</span>
<span style={{ fontSize: 12, color: '#4A4A4A' }}>{item.name == '关注的项目' ? ' ( 个 )' : ' ( 条 )'}</span> <span style={{ fontSize: 12, color: '#4A4A4A' }}>{item.name == '关注的项目' ? ' ( 个 )' : ' ( 条 )'}</span>
{item.name == '关注的项目' ? '' : <span style={{ fontSize: 12, color: '#969799', marginLeft: 4 }}>待处理</span>}
</div> </div>
<div style={{ marginTop: 15, display: 'flex', alignItems: 'center' }}> <div style={{ marginTop: 15, display: 'flex', alignItems: 'center' }}>
<div onClick={() => dispatch(push(item.url))} style={{ fontSize: 32, color: index == 0 ? '#0F7EFB' : index == 1 ? '#0091A1' : index == 2 ? '#FE9812' : '#FF7575', fontFamily: 'YouSheBiaoTiHei', cursor: 'pointer', }}>{item.data}</div> <div onClick={() => dispatch(push(item.url))} style={{ fontSize: 32, color: index == 0 ? '#0F7EFB' : index == 1 ? '#0091A1' : index == 2 ? '#FE9812' : '#FF7575', fontFamily: 'YouSheBiaoTiHei', cursor: 'pointer', }}>{item.data}</div>
{item.name == '关注的项目' ? '' : <div style={{ fontSize: 12, color: '#969799', marginLeft: 4 }}>待处理</div>}
</div> </div>
</div> </div>
</div> </div>
) )
}) }) || null
} }
</SimpleBar> </SimpleBar>
</div> </div>

2
web/client/src/sections/firmwareUpgrade/containers/firmwareLibrary.jsx

@ -71,7 +71,7 @@ let columns=[{
title:'MD5码值', title:'MD5码值',
dataIndex: 'md5Value', dataIndex: 'md5Value',
render:(_,record)=>{ render:(_,record)=>{
return <span>--</span> return record.md5Value?record.md5Value:<span>--</span>
} }
}, },
{ {

24
web/client/src/sections/problem/actions/problem.jsx

@ -184,3 +184,27 @@ export function getVcmpAuth () { //获取视频平台应用鉴权token
reducer: { name: '' } reducer: { name: '' }
}); });
} }
export function getExceptionTypeCheck (query = {}) {
return dispatch => basicAction({
type: 'get',
dispatch: dispatch,
query,
actionType: 'GET_VCMP_AUTH',
url: `${ApiTable.exceptionTypeCheck}`,
msg: { error: '获取用户的数据异常勾选信息' },
reducer: { name: '' }
});
}
export function postExceptionTypeCheck (data = {}) {
return dispatch => basicAction({
type: 'post',
dispatch: dispatch,
data,
actionType: 'POST_EXCEPTION_TYPE_CHECK',
url: `${ApiTable.exceptionTypeCheck}`,
msg: { option: '存储用户的数据异常勾选信息' },
reducer: { name: '' }
});
}

2
web/client/src/sections/problem/components/inspection.jsx

@ -105,7 +105,6 @@ const Inspection = ({ dispatch, actions, user, route, statistic, pepProjectId })
<div style={{ flex: 1, position: 'relative' }}> <div style={{ flex: 1, position: 'relative' }}>
<Form <Form
onSubmit={(v) => { onSubmit={(v) => {
console.log(v.time)
setCheckPatrol({ setCheckPatrol({
appId: v.appId, appId: v.appId,
noted: v.noted, noted: v.noted,
@ -122,6 +121,7 @@ const Inspection = ({ dispatch, actions, user, route, statistic, pepProjectId })
}} }}
getFormApi={(formApi) => (api.current = formApi)} getFormApi={(formApi) => (api.current = formApi)}
layout="horizontal" layout="horizontal"
style={{ position: "relative", width: "100%", flex: 1, display: 'flex' }}
> >
<Form.Select <Form.Select
labelPosition="left" labelPosition="left"

177
web/client/src/sections/problem/components/tableData.jsx

@ -1,10 +1,13 @@
import React, { useState, useEffect, useRef } from "react"; import React, { useState, useEffect, useRef } from "react";
import { connect } from "react-redux"; import { connect } from "react-redux";
import { Button, Form, Modal, Skeleton, Pagination, Table, Tooltip, Toast } from "@douyinfe/semi-ui"; import {
Button, Form, Modal, Skeleton, Pagination, Table, Tooltip, Toast,
CheckboxGroup, Checkbox,
} from "@douyinfe/semi-ui";
import { SkeletonScreen, } from "$components"; import { SkeletonScreen, } from "$components";
import moment from "moment"; import moment from "moment";
const TableData = ({alarmDataGroup, route, dispatch, actions, collectData, setSetup, exhibition, pepProjectId, const TableData = ({ alarmDataGroup, route, dispatch, actions, collectData, setSetup, exhibition, pepProjectId,
selected, setSelected, setIfBulk, setConfirm, genre, setGenre, query, setQuery, tableData, setTableData, location, user, statusId, setStatusId }) => { selected, setSelected, setIfBulk, setConfirm, genre, setGenre, query, setQuery, tableData, setTableData, location, user, statusId, setStatusId }) => {
const { problem } = actions const { problem } = actions
@ -19,6 +22,11 @@ const TableData = ({alarmDataGroup, route, dispatch, actions, collectData, setSe
const groupId = useRef() const groupId = useRef()
let title = { dataLnterrupt: "数据中断详情", dataAbnormal: "数据异常详情", strategyHit: "策略命中详情", videoAbnormal: "视频异常详情", useAbnormal: "应用异常详情", deviceAbnormal: "设备异常详情" } let title = { dataLnterrupt: "数据中断详情", dataAbnormal: "数据异常详情", strategyHit: "策略命中详情", videoAbnormal: "视频异常详情", useAbnormal: "应用异常详情", deviceAbnormal: "设备异常详情" }
const [exportUrl, setExportUrl] = useState('') const [exportUrl, setExportUrl] = useState('')
const [typeSet, setTypeSet] = useState(false)
const [typeId, setTypeId] = useState([])
const [check, setCheck] = useState([])
useEffect(() => { useEffect(() => {
switch (route) { switch (route) {
case 'useAbnormal': case 'useAbnormal':
@ -51,8 +59,8 @@ const TableData = ({alarmDataGroup, route, dispatch, actions, collectData, setSe
case 'videoAbnormal': case 'videoAbnormal':
dispatch(problem.getAlarmVideoList({ ...search.current, pepProjectId: pepProjectId })).then((res) => { dispatch(problem.getAlarmVideoList({ ...search.current, pepProjectId: pepProjectId })).then((res) => {
if (res.success) { if (res.success) {
let tableDatas = res.payload.data?.map(v => ({ let tableDatas = res.payload.data?.map((v, index) => ({
key: v.alarmId, key: v.AlarmId + index,
id: v.alarmId, id: v.alarmId,
StructureName: v.struc, StructureName: v.struc,
projectName: v.pomsProject?.map(r => (r.name ? { id: r.id, name: r.name, state: 'PMOS' } : { projectName: v.pomsProject?.map(r => (r.name ? { id: r.id, name: r.name, state: 'PMOS' } : {
@ -82,12 +90,16 @@ const TableData = ({alarmDataGroup, route, dispatch, actions, collectData, setSe
}) })
break; break;
default: default:
if (genre?.length > 0) { if (genre?.length > 0 && (route === 'dataAbnormal' ? typeId?.length > 0 : true)) {
dispatch(problem.getAlarmDataList({...(route === 'deviceAbnormal' ? { timestamps: moment().valueOf() } : {}), ...query, ...search.current, groupId: groupId.current.map(v => v.id).join(), pepProjectId: pepProjectId })).then((res) => { dispatch(problem.getAlarmDataList({
...(route === 'dataLnterrupt' ? { timestamps: true } : {}),
...query, ...(search.current || {}), groupId: groupId.current.map(v => v.id).join(), pepProjectId: pepProjectId,
...((route === 'dataAbnormal' && !search.current?.groupUnitId?.length) ? { groupUnitId: typeId?.length > 0 ? typeId?.join(',') : "", } : {}),
})).then((res) => {
if (res.success) { if (res.success) {
setCount(res.payload.data?.count || 0) setCount(res.payload.data?.count || 0)
let tableDatas = res.payload.data?.rows?.map(v => ({ let tableDatas = res.payload.data?.rows?.map((v, index) => ({
key: v.AlarmId, key: v.AlarmId + index,
id: v.AlarmId, id: v.AlarmId,
StructureName: v.StructureName, StructureName: v.StructureName,
projectName: v.pomsProject?.map(r => (r.name ? { id: r.id, name: r.name, state: 'PMOS' } : { projectName: v.pomsProject?.map(r => (r.name ? { id: r.id, name: r.name, state: 'PMOS' } : {
@ -99,7 +111,7 @@ const TableData = ({alarmDataGroup, route, dispatch, actions, collectData, setSe
SourceName: v.SourceName, SourceName: v.SourceName,
AlarmGroupUnit: v.AlarmGroupUnit ? genre?.find(r => r.value == v.AlarmGroupUnit)?.name : "无", AlarmGroupUnit: v.AlarmGroupUnit ? genre?.find(r => r.value == v.AlarmGroupUnit)?.name : "无",
Strategy: v.AlarmGroupUnit ? genre?.find(r => r.value == v.AlarmGroupUnit)?.name : "", Strategy: v.AlarmGroupUnit ? genre?.find(r => r.value == v.AlarmGroupUnit)?.name : "",
type: route == 'deviceAbnormal' ? v.DeviceStatus == 0 ? "离线" : '' : v.AlarmGroupUnit ? genre?.find(r => r.value == v.AlarmGroupUnit)?.name : "", type: (v.AlarmGroup == 4 || v.AlarmGroup == 5) ? v.DeviceStatus == 0 ? "离线" : '' : v.AlarmGroupUnit ? genre?.find(r => r.value == v.AlarmGroupUnit)?.name : "",
cameraKindId: v.AlarmGroupUnit ? genre?.find(r => r.value == v.AlarmGroupUnit)?.name : "", cameraKindId: v.AlarmGroupUnit ? genre?.find(r => r.value == v.AlarmGroupUnit)?.name : "",
AlarmCodeName: v.AlarmCodeName, AlarmCodeName: v.AlarmCodeName,
CurrentLevel: v.CurrentLevel, CurrentLevel: v.CurrentLevel,
@ -108,8 +120,9 @@ const TableData = ({alarmDataGroup, route, dispatch, actions, collectData, setSe
State: v.State, State: v.State,
alarmType: v.alarmType, alarmType: v.alarmType,
confirm: v.confirmedContent, confirm: v.confirmedContent,
station: v.StructureLongitude && v.StructureLatitude ? v.StructureLongitude + '. ' + v.StructureLatitude : "", station: v.StructureLongitude && v.StructureLatitude ? v.StructureLongitude + ',' + v.StructureLatitude : "",
projectLocal: v.Project, projectLocal: v.Project,
AlarmGroup: v.AlarmGroup,
})) }))
setTableData(tableDatas) setTableData(tableDatas)
} }
@ -117,22 +130,21 @@ const TableData = ({alarmDataGroup, route, dispatch, actions, collectData, setSe
} }
break; break;
} }
}, [query, genre, pepProjectId]) }, [query, genre, pepProjectId, typeId])
useEffect(() => { useEffect(() => {
if (alarmDataGroup?.length > 0) {
if (location) { if (location) {
search.current = { ...search.current, ...location, state: 'new' } search.current = { ...search.current, ...location, state: 'new' }
api.current?.setValues({ ...location, state: 'new' }) api.current?.setValues({ ...location, state: 'new' })
} }
if (route !== 'videoAbnormal' && route !== 'useAbnormal') { if (route !== 'videoAbnormal' && route !== 'useAbnormal') {
// dispatch(problem.getAlarmDataGroup()).then((res) => {
// if (res.success) {
let data let data
if (route == 'dataLnterrupt') data = alarmDataGroup?.filter(v => v.desc == '数据中断') if (route == 'dataLnterrupt') data = alarmDataGroup?.filter(v => (v.desc == '数据中断' || v.desc == '掉线' || v.desc == '不活跃'))
if (route == 'dataAbnormal') data = alarmDataGroup?.filter(v => v.desc == '数据异常') if (route == 'dataAbnormal') data = alarmDataGroup?.filter(v => (v.desc == '数据异常' || v.desc == '策略命中'))
if (route == 'strategyHit') data = alarmDataGroup?.filter(v => v.desc == '策略命中') // if (route == 'strategyHit') data = alarmDataGroup?.filter(v => v.desc == '')
if (route == 'deviceAbnormal') data = alarmDataGroup?.filter(v => v.desc == '掉线' || v.desc == '不活跃') // if (route == 'deviceAbnormal') data = alarmDataGroup?.filter(v => v.desc == '线' || v.desc == '')
groupId.current = data groupId.current = data
let genreData = [] let genreData = []
data?.map(v => { data?.map(v => {
@ -141,8 +153,13 @@ const TableData = ({alarmDataGroup, route, dispatch, actions, collectData, setSe
}) })
}) })
setGenre(genreData) setGenre(genreData)
// } if (route == 'dataAbnormal') {
// }) dispatch(problem.getExceptionTypeCheck({ userId: user?.id, })).then(res => {
if (res.success) {
setTypeId(res.payload.data?.typeId || [8, 40, 41, 48, 49])
}
})
}
} }
if (route == 'useAbnormal') { if (route == 'useAbnormal') {
setGenre({ element: "元素异常", apiError: "接口报错 ", timeout: "加载超时" }) setGenre({ element: "元素异常", apiError: "接口报错 ", timeout: "加载超时" })
@ -160,7 +177,14 @@ const TableData = ({alarmDataGroup, route, dispatch, actions, collectData, setSe
} }
}) })
} }
}, [route]) }
return () => {
}
}, [route, alarmDataGroup])
const handleExport = () => { const handleExport = () => {
let url = '' let url = ''
let { keywordTarget, keyword = '', errType = '', state = '', kindId = '', statusId = '', groupUnitId = '', confirmState = '', onlineState = '', sustainTimeStart = '', sustainTimeEnd = '' } = search.current let { keywordTarget, keyword = '', errType = '', state = '', kindId = '', statusId = '', groupUnitId = '', confirmState = '', onlineState = '', sustainTimeStart = '', sustainTimeEnd = '' } = search.current
@ -212,16 +236,16 @@ const TableData = ({alarmDataGroup, route, dispatch, actions, collectData, setSe
}) })
break; break;
default: default:
dispatch(problem.getAlarmDataList({...(route === 'deviceAbnormal' ? { timestamps: moment().valueOf() } : {}), ...query, ...search.current, limit: 1, sustainTimeStart, sustainTimeEnd, groupId: groupId.current.map(v => v.id).join(), pepProjectId: pepProjectId })).then((res) => { dispatch(problem.getAlarmDataList({ ...(route === 'dataLnterrupt' ? { timestamps: true } : {}), ...query, ...search.current, limit: 1, sustainTimeStart, sustainTimeEnd, groupId: groupId.current.map(v => v.id).join(), pepProjectId: pepProjectId })).then((res) => {
if (res.success) { if (res.success) {
if (res.payload.data.count) { if (res.payload.data.count) {
let groups = { let groups = {
"dataLnterrupt": "1", "dataLnterrupt": "1,4,5",
"dataAbnormal": "2", "dataAbnormal": "2,3",
"strategyHit": "3", // "strategyHit": "3",
"deviceAbnormal": "4,5" // "deviceAbnormal": "4,5"
} }
url = `alarm/data/list?token=${user.token}&toExport=1&timestamp=${moment().valueOf()}&state=${state}&keywordTarget=${keywordTarget}&keyword=${keyword}&kindId=${kindId}` url = `alarm/data/list?token=${user.token}&toExport=1&timestamp=${true}&state=${state}&keywordTarget=${keywordTarget}&keyword=${keyword}&kindId=${kindId}`
+ `&groupUnitId=${groupUnitId}&errType=${errType}&confirmState=${confirmState}&onlineState=${onlineState}&sustainTimeStart=${sustainTimeStart}` + `&groupUnitId=${groupUnitId}&errType=${errType}&confirmState=${confirmState}&onlineState=${onlineState}&sustainTimeStart=${sustainTimeStart}`
+ `&sustainTimeEnd=${sustainTimeEnd}&pepProjectId=${pepProjectId || ''}&groupId=${groups[route]}` + `&sustainTimeEnd=${sustainTimeEnd}&pepProjectId=${pepProjectId || ''}&groupId=${groups[route]}`
setExportUrl(url); setExportUrl(url);
@ -252,7 +276,8 @@ const TableData = ({alarmDataGroup, route, dispatch, actions, collectData, setSe
onSubmit={(values) => console.log(values)} onSubmit={(values) => console.log(values)}
getFormApi={(formApi) => (api.current = formApi)} getFormApi={(formApi) => (api.current = formApi)}
layout="horizontal" layout="horizontal"
style={{ position: "relative", width: "100%", flex: 1,display:'flex' }} allowEmpty={false}
style={{ position: "relative", width: "100%", flex: 1, display: 'flex' }}
> >
{(() => { {(() => {
let frame = [] let frame = []
@ -277,6 +302,36 @@ const TableData = ({alarmDataGroup, route, dispatch, actions, collectData, setSe
</Form.InputGroup>) </Form.InputGroup>)
} }
} else {
if (route == 'dataAbnormal' && v.special) {
frame.push(<div style={{ marginRight: 16, display: "flex" }}>
<Form.Select
label={v.name + ':'}
labelPosition="left"
field={v.field}
key={v.field}
maxLength="10"
initValue={v.field == 'state' ? 'new' : undefined}
style={{ width: 116, color: "#F9F9F9", }}
placeholder="全部"
filter
showClear
>
{v.data?.filter(d => typeId?.includes(d.value))?.map((item) => {
return (
<Form.Select.Option key={item.value} value={item.value}>
{item.name}
</Form.Select.Option>
);
})}
</Form.Select>
<img title='设置' src="/assets/images/problem/setup.png" style={{ width: 20, height: 20, marginTop: 6, cursor: 'pointer' }}
onClick={() => {
setCheck(typeId)
setTypeSet(true)
}} />
</div>
)
} else { } else {
frame.push(<Form.Select frame.push(<Form.Select
label={v.name + ':'} label={v.name + ':'}
@ -298,6 +353,9 @@ const TableData = ({alarmDataGroup, route, dispatch, actions, collectData, setSe
); );
})} })}
</Form.Select>) </Form.Select>)
}
} }
}) })
frame.push(<Form.DatePicker frame.push(<Form.DatePicker
@ -379,9 +437,6 @@ const TableData = ({alarmDataGroup, route, dispatch, actions, collectData, setSe
placeholder={SkeletonScreen()} placeholder={SkeletonScreen()}
> >
{(() => { {(() => {
console.log((route == 'useAbnormal' || route == 'videoAbnormal') ?
(tableData?.slice(query.page * query.limit, (query.page + 1) * query.limit) || [])
: tableData);
return <Table return <Table
columns={exhibition} columns={exhibition}
dataSource={ dataSource={
@ -405,7 +460,7 @@ const TableData = ({alarmDataGroup, route, dispatch, actions, collectData, setSe
rowSelection={{ rowSelection={{
selectedRowKeys: selected || [], selectedRowKeys: selected || [],
getCheckboxProps: record => ({ getCheckboxProps: record => ({
disabled: record.confirmTime ? true : false, disabled: (record.confirmTime || record.State > 2 || record.projectLocal) ? true : false,
// name: record.name, // name: record.name,
}), }),
onSelect: (record, selected) => { onSelect: (record, selected) => {
@ -442,7 +497,7 @@ const TableData = ({alarmDataGroup, route, dispatch, actions, collectData, setSe
return v.id return v.id
} }
} else { } else {
if (!(v.State > 2)) { if (!(v.State > 2) && !v.projectLocal) {
return v.id return v.id
} }
} }
@ -472,9 +527,61 @@ const TableData = ({alarmDataGroup, route, dispatch, actions, collectData, setSe
}} }}
/> />
</div> : ""} </div> : ""}
{
exportUrl ? <iframe src={`/_api/${exportUrl}`} style={{ display: 'none' }} /> : ''
}
</div> </div>
{/* 异常类型勾选 */}
{typeSet ? <Modal
title={'异常类型勾选'}
visible={typeSet}
// header={null}
// footer={null}
size={'large'}
// style={{ padding: 0 }}
// bodyStyle={{ padding: 0 }}
className=""
onCancel={() => setTypeSet(false)}
onOk={() => {
dispatch(problem.postExceptionTypeCheck({ userId: user?.id, typeId: check })).then(res => {
if (res.success) {
api.current?.setValue('groupUnitId',)
setTypeId(check)
setTypeSet(false)
}
})
}}
>
<CheckboxGroup
style={{ width: "100%", fontSize: 14, marginLeft: 32 }}
key="primary1"
direction="horizontal"
value={check}
// aria-label=""
onChange={(check) => {
setCheck(check);
}}
>
{genre?.map((itm) => {
return (
<Checkbox
key={itm.value}
value={itm.value}
disabled={[8, 40, 41, 48, 49].includes(itm.value) ? true : false}
style={{ width: "20%", height: 16, margin: "0 0 20px 0" }}
>
{itm.name}
</Checkbox>
);
})}
</CheckboxGroup>
</Modal> : ""}
</div> </div>
</> </>
) )
@ -482,7 +589,7 @@ const TableData = ({alarmDataGroup, route, dispatch, actions, collectData, setSe
function mapStateToProps (state) { function mapStateToProps (state) {
const { auth, global, members,alarmDataGroup } = state; const { auth, global, members, alarmDataGroup } = state;
// console.log(global); // console.log(global);
return { return {
user: auth.user, user: auth.user,
@ -490,7 +597,7 @@ function mapStateToProps (state) {
global: global, global: global,
pepProjectId: global.pepProjectId, pepProjectId: global.pepProjectId,
// members: members, // members: members,
alarmDataGroup:alarmDataGroup.data||[] alarmDataGroup: alarmDataGroup.data || []
}; };
} }
export default connect(mapStateToProps)(TableData); export default connect(mapStateToProps)(TableData);

93
web/client/src/sections/problem/containers/dataAlarm.jsx

@ -72,21 +72,27 @@ const DataAlarm = (props) => {
const collectData = { const collectData = {
dataLnterrupt: [ //(dataLnterrupt) dataLnterrupt: [ //(dataLnterrupt)
{ name: '搜索', field: '1' }, { name: '搜索', field: '1' },
{ // {
name: '中断类型', field: 'groupUnitId', // name: '', field: 'groupUnitId',
data: genre // data: genre
}, // },
{ {
name: '中断状态', field: 'state', name: '中断状态', field: 'state',
data: [ data: [
{ name: '当前', value: 'new' }, { name: '当前', value: 'new' },
{ name: '历史', value: 'histroy' }] { name: '历史', value: 'histroy' }]
}], },
// {
// name: '', field: 'onlineState',
// data: [
// { name: '线', value: 'offline' }]
// }
],
dataAbnormal: [ //(dataAbnormal) dataAbnormal: [ //(dataAbnormal)
{ name: '搜索', field: '1' }, { name: '搜索', field: '1' },
{ {
name: '异常类型', field: 'groupUnitId', name: '异常类型', field: 'groupUnitId',
data: genre data: genre, special: true
}, },
{ {
name: '异常状态', field: 'state', name: '异常状态', field: 'state',
@ -94,18 +100,18 @@ const DataAlarm = (props) => {
{ name: '当前', value: 'new' }, { name: '当前', value: 'new' },
{ name: '历史', value: 'histroy' }] { name: '历史', value: 'histroy' }]
}], }],
strategyHit: [ // (strategyHit) // strategyHit: [ // (strategyHit)
{ name: '搜索', field: '1' }, // { name: '', field: '1' },
{ // {
name: '策略类型', field: 'groupUnitId', // name: '', field: 'groupUnitId',
data: genre // data: genre
}, // },
{ // {
name: '命中状态', field: 'state', // name: '', field: 'state',
data: [ // data: [
{ name: '当前', value: 'new' }, // { name: '', value: 'new' },
{ name: '历史', value: 'histroy' }] // { name: '', value: 'histroy' }]
}], // }],
videoAbnormal: [ // (videoAbnormal) videoAbnormal: [ // (videoAbnormal)
{ name: '搜索', field: '1' }, { name: '搜索', field: '1' },
{ {
@ -137,24 +143,24 @@ const DataAlarm = (props) => {
{ name: '当前', value: 'new' }, { name: '当前', value: 'new' },
{ name: '历史', value: 'histroy' }] { name: '历史', value: 'histroy' }]
}], }],
deviceAbnormal: [ // (deviceAbnormal) // deviceAbnormal: [ // (deviceAbnormal)
{ name: '搜索', field: '1' }, // { name: '', field: '1' },
// { // {
// name: '', field: 'groupUnitId', // name: '', field: 'groupUnitId',
// data: genre // data: genre
// }, // },
{ // {
name: '异常状态', field: 'state', // name: '', field: 'state',
data: [ // data: [
{ name: '当前', value: 'new' }, // { name: '', value: 'new' },
{ name: '历史', value: 'histroy' }] // { name: '', value: 'histroy' }]
}, // },
{ // {
name: '异常类型', field: 'onlineState', // name: '', field: 'onlineState',
data: [ // data: [
{ name: '离线', value: 'offline' }] // { name: '线', value: 'offline' }]
} // }
], // ],
common: { common: {
name: '告警时间', name: '告警时间',
field: 'time' field: 'time'
@ -163,27 +169,30 @@ const DataAlarm = (props) => {
// //
const tableList = { const tableList = {
dataLnterrupt: ['index', 'projectName', 'StructureName', 'SourceName', 'AlarmGroupUnit', 'AlarmCodeName', 'sustainTime', 'createTime', 'AlarmContent', 'CurrentLevel', 'updateTime', 'detailCount', 'confirm', 'confirmTime',], dataLnterrupt: ['index', 'projectName', 'StructureName', 'SourceName', 'AlarmGroupUnit', 'AlarmCodeName', 'station', 'venderName', 'sustainTime', 'createTime', 'AlarmContent', 'CurrentLevel', 'updateTime', 'detailCount', 'confirm', 'confirmTime',],
dataAbnormal: ['index', 'projectName', 'StructureName', 'SourceName', 'type', 'createTime', 'sustainTime', 'AlarmContent', 'CurrentLevel', 'updateTime', 'detailCount', 'confirm', 'confirmTime'], dataAbnormal: ['index', 'projectName', 'StructureName', 'SourceName', 'type', 'createTime', 'sustainTime', 'State', 'AlarmContent', 'AlarmCodeName', 'CurrentLevel', 'updateTime', 'detailCount', 'confirm', 'confirmTime'],
strategyHit: ['index', 'projectName', 'StructureName', 'SourceName', 'Strategy', 'State', 'createTime', 'sustainTime', 'AlarmContent', 'CurrentLevel', 'updateTime', 'detailCount', 'confirm', 'confirmTime'], // strategyHit: ['index', 'projectName', 'StructureName', 'SourceName', 'Strategy', 'State', 'createTime', 'sustainTime', 'AlarmContent', 'CurrentLevel', 'updateTime', 'detailCount', 'confirm', 'confirmTime'],
videoAbnormal: ['index', 'projectName', 'StructureName', 'SourceName', 'station', 'cameraKindId', 'sustainTime', 'venderName', 'point', 'cameraSerialNo', 'cameraChannelNo', 'platform', 'AlarmContent', 'resolve', 'createTime', 'updateTime', 'confirm', 'confirmTime',], videoAbnormal: ['index', 'projectName', 'StructureName', 'SourceName', 'station', 'cameraKindId', 'sustainTime', 'venderName', 'point', 'cameraSerialNo', 'cameraChannelNo', 'platform', 'AlarmContent', 'resolve', 'createTime', 'updateTime', 'confirm', 'confirmTime',],
useAbnormal: ['index', 'projectName', 'appName', 'url', 'type', 'alarmContent', 'createTime', 'sustainTime', 'updateTime', 'confirm', 'confirmTime'], useAbnormal: ['index', 'projectName', 'appName', 'url', 'type', 'alarmContent', 'createTime', 'sustainTime', 'updateTime', 'confirm', 'confirmTime'],
deviceAbnormal: ['index', 'projectName', 'StructureName', 'SourceName', 'station', 'sustainTime', 'venderName', 'AlarmContent', 'AlarmCodeName', 'createTime', 'updateTime', 'confirm', 'confirmTime'], // deviceAbnormal: ['index', 'projectName', 'StructureName', 'SourceName', 'station', 'sustainTime', 'venderName', 'AlarmContent', 'AlarmCodeName', 'createTime', 'updateTime', 'confirm', 'confirmTime'],
} }
// //
const columns = { const columns = {
dataLnterrupt: ['projectName', 'StructureName', 'SourceName', 'AlarmGroupUnit', 'AlarmContent', 'AlarmCodeName', 'createTime', 'updateTime',], dataLnterrupt: ['projectName', 'StructureName', 'SourceName', 'AlarmGroupUnit', 'AlarmContent', 'AlarmCodeName', 'createTime', 'updateTime',],
dataAbnormal: ['projectName', 'StructureName', 'SourceName', 'AlarmContent', 'AlarmCodeName', 'createTime', 'updateTime'], dataAbnormal: ['projectName', 'StructureName', 'SourceName', 'AlarmContent', 'AlarmCodeName', 'createTime', 'updateTime'],
strategyHit: ['projectName', 'StructureName', 'SourceName', 'Strategy', 'AlarmContent', 'CurrentLevel', 'detailCount', 'updateTime'], // strategyHit: ['projectName', 'StructureName', 'SourceName', 'Strategy', 'AlarmContent', 'CurrentLevel', 'detailCount', 'updateTime'],
videoAbnormal: ['projectName', 'StructureName', 'SourceName', 'venderName', 'cameraKindId', 'AlarmContent', 'createTime', 'updateTime'], videoAbnormal: ['projectName', 'StructureName', 'SourceName', 'venderName', 'cameraKindId', 'AlarmContent', 'createTime', 'updateTime'],
useAbnormal: ['appName', 'projectName', 'url', 'type', 'alarmContent', 'createTime', 'updateTime'], useAbnormal: ['appName', 'projectName', 'url', 'type', 'alarmContent', 'createTime', 'updateTime'],
deviceAbnormal: ['projectName', 'StructureName', 'SourceName', 'station', 'AlarmContent', 'createTime', 'updateTime'], // deviceAbnormal: ['projectName', 'StructureName', 'SourceName', 'station', 'AlarmContent', 'createTime', 'updateTime'],
} }
// //
const columnAll = [ const columnAll = [
{
},
{ {
name: "序号", sort: 1, value: "index", render: (_, r, index) => { name: "序号", sort: 1, value: "index", render: (_, r, index) => {
return index + 1; return index + 1;
@ -275,14 +284,16 @@ const DataAlarm = (props) => {
{ name: '异常原因', sort: 8, value: 'alarmType' }, { name: '异常原因', sort: 8, value: 'alarmType' },
{ name: '策略类型', sort: 6, value: 'Strategy' }, { name: '策略类型', sort: 6, value: 'Strategy' },
{ {
name: '命中状态', sort: 15, value: 'State', render: (_, r, index) => { name: '异常状态', sort: 15, value: 'State', render: (_, r, index) => {
if (r.State == 3 || r.State == 4) { if (r.State == 3 || r.State == 4) {
return '历史' return '历史'
} }
return '当前' return '当前'
} }
}, },
{ name: '位置信息', sort: 11, value: 'station', render: (_, r, index) => route == 'deviceAbnormal' ? r.station : r.station?.length > 0 ? r.station?.map(v => <div key={v.resolve + v.id} style={{ lineHeight: "22px" }}>{v.position}</div>) : "无" }, {
name: '位置信息', sort: 11, value: 'station', render: (_, r, index) => [1, 4, 5].includes(r.AlarmGroup) ? r.station : r.station?.length > 0 ? r.station?.map(v => <div key={v.resolve + v.id} style={{ lineHeight: "22px" }}>{v.position}</div>) : "无"
},
{ {
name: '设备类型', sort: 6, value: 'cameraKindId', render: (_, r, index) => r.cameraKindId || '其他', name: '设备类型', sort: 6, value: 'cameraKindId', render: (_, r, index) => r.cameraKindId || '其他',
}, },
@ -321,7 +332,7 @@ const DataAlarm = (props) => {
{route && ['dataLnterrupt', 'dataAbnormal', 'strategyHit', 'deviceAbnormal'].includes(route) ? {route && ['dataLnterrupt', 'dataAbnormal', 'strategyHit', 'deviceAbnormal'].includes(route) ?
<> <>
{/* <Button theme='borderless' style={{ width: 65 }} disabled>已派单</Button> */} {/* <Button theme='borderless' style={{ width: 65 }} disabled>已派单</Button> */}
{route == 'deviceAbnormal' ? "" : <Button theme='borderless' style={{ width: 65 }} onClick={() => { {(r.AlarmGroup == 4 || r.AlarmGroup == 5) ? "" : <Button theme='borderless' style={{ width: 65 }} onClick={() => {
setCheckPop(true) setCheckPop(true)
setAlarmId(r.id) setAlarmId(r.id)
}}>查看</Button>} }}>查看</Button>}

18
web/client/src/sections/problem/nav-item.jsx

@ -13,22 +13,24 @@ export function getNavItem (user, dispatch) {
items: [ items: [
{ itemKey: 'dataLnterrupt', to: '/problem/dataAlarm/dataLnterrupt', text: '数据中断' }, { itemKey: 'dataLnterrupt', to: '/problem/dataAlarm/dataLnterrupt', text: '数据中断' },
{ itemKey: 'dataAbnormal', to: '/problem/dataAlarm/dataAbnormal', text: '数据异常' }, { itemKey: 'dataAbnormal', to: '/problem/dataAlarm/dataAbnormal', text: '数据异常' },
{ itemKey: 'strategyHit', to: '/problem/dataAlarm/strategyHit', text: '策略命中' }, // { itemKey: 'strategyHit', to: '/problem/dataAlarm/strategyHit', text: '' },
{ itemKey: 'videoAbnormal', to: '/problem/dataAlarm/videoAbnormal', text: '视频异常' },
] ]
}, { }, {
itemKey: 'useAlarm', text: '应用告警', to: '/problem/useAlarm/useAbnormal', itemKey: 'useAlarm', text: '应用告警', to: '/problem/useAlarm/useAbnormal',
icon: <iconpark-icon style={{ width: 20, height: 20 }} name="yy"></iconpark-icon>, icon: <iconpark-icon style={{ width: 20, height: 20 }} name="yy"></iconpark-icon>,
items: [ items: [
{ itemKey: 'useAbnormal', to: '/problem/useAlarm/useAbnormal', text: '应用异常' }, { itemKey: 'useAbnormal', to: '/problem/useAlarm/useAbnormal', text: '应用异常' },
] { itemKey: 'videoAbnormal', to: '/problem/useAlarm/videoAbnormal', text: '视频异常' },
}, {
itemKey: 'deviceAlarm', text: '设备告警', to: '/problem/deviceAlarm/deviceAbnormal',
icon: <iconpark-icon style={{ width: 20, height: 20 }} name="sb"></iconpark-icon>,
items: [
{ itemKey: 'deviceAbnormal', to: '/problem/deviceAlarm/deviceAbnormal', text: '设备异常' },
] ]
}, },
// {
// itemKey: 'deviceAlarm', text: '', to: '/problem/deviceAlarm/deviceAbnormal',
// icon: <iconpark-icon style={{ width: 20, height: 20 }} name="sb"></iconpark-icon>,
// items: [
// { itemKey: 'deviceAbnormal', to: '/problem/deviceAlarm/deviceAbnormal', text: '' },
// ]
// },
] ]
}, },

46
web/client/src/sections/problem/routes.js

@ -23,17 +23,14 @@ export default [{
key: 'dataAbnormal', key: 'dataAbnormal',
breadcrumb: '数据异常', breadcrumb: '数据异常',
component: DataAlarm, component: DataAlarm,
}, { },
path: '/strategyHit', // {
key: 'strategyHit', // path: '/strategyHit',
breadcrumb: '策略命中', // key: 'strategyHit',
component: DataAlarm, // breadcrumb: '策略命中',
}, { // component: DataAlarm,
path: '/videoAbnormal', // },
key: 'videoAbnormal', ]
breadcrumb: '视频异常',
component: DataAlarm,
}]
}, { }, {
path: '/useAlarm', path: '/useAlarm',
key: 'useAlarm', key: 'useAlarm',
@ -44,18 +41,25 @@ export default [{
key: 'useAbnormal', key: 'useAbnormal',
breadcrumb: '应用异常', breadcrumb: '应用异常',
component: DataAlarm, component: DataAlarm,
},]
}, { }, {
path: '/deviceAlarm', path: '/videoAbnormal',
key: 'deviceAlarm', key: 'videoAbnormal',
breadcrumb: '设备告警', breadcrumb: '视频异常',
// 不设置 component 则面包屑禁止跳转
childRoutes: [{
path: '/deviceAbnormal',
key: 'deviceAbnormal',
breadcrumb: '设备异常',
component: DataAlarm, component: DataAlarm,
},]
}] }]
},
// {
// path: '/deviceAlarm',
// key: 'deviceAlarm',
// breadcrumb: '设备告警',
// // 不设置 component 则面包屑禁止跳转
// childRoutes: [{
// path: '/deviceAbnormal',
// key: 'deviceAbnormal',
// breadcrumb: '设备异常',
// component: DataAlarm,
// },]
// }
]
} }
}]; }];

2
web/client/src/sections/service/components/automatic-Modal.jsx

@ -160,7 +160,7 @@ const AutomaticModal = ({ actions, dispatch, apiRoot, qiniuUrl, visible, eidtDat
</Form.Select> </Form.Select>
<Form.Input field="projectName" label='项目名称' style={{ width: 300 }} placeholder="请输入项目名称" showClear <Form.Input field="projectName" label='项目名称' style={{ width: 300 }} placeholder="请输入项目名称" showClear
initValue={eidtData?.projectName || ""} initValue={eidtData?.projectName || ""}
rules={[{ required: true, message: "请输入项目名称,15字以内", max: 15 }]} rules={[{ required: true, message: "请输入项目名称"}]}
/> />
<Form.Select label="报表类型" field="reportType" placeholder="请选择报表类型" showClear style={{ width: 300 }} <Form.Select label="报表类型" field="reportType" placeholder="请选择报表类型" showClear style={{ width: 300 }}
rules={[{ required: true, message: "请选择报表类型" }]} rules={[{ required: true, message: "请选择报表类型" }]}

40
web/client/src/sections/service/components/pushModal.jsx

@ -37,10 +37,11 @@ function pushModal (props) {
const [factorShow, setFactorShow] = useState([]); // const [factorShow, setFactorShow] = useState([]); //
const [firstPass, setFirstPass] = useState(true) const [firstPass, setFirstPass] = useState(true)
// //
useEffect(() => { useEffect(() => {
if (editObj?.alarmType) setSubType(editObj?.alarmType) // console.log(111, subTypeData);
if (editObj?.alarmType) setSubType(editObj?.alarmType?.filter(d => d != 'strategy_hit' && d != 'device_exception'))
getOrganizationUsersList()// getOrganizationUsersList()//
getProjectPomsList()// getProjectPomsList()//
if (editObj.id) { if (editObj.id) {
@ -122,8 +123,8 @@ function pushModal (props) {
mylist.push(res.payload?.data[i].id) mylist.push(res.payload?.data[i].id)
} }
} }
form.current.setValue('timeType', mylist) form.current?.setValue('timeType', mylist)
form.current.validate(['strucId', 'timeType']) form.current?.validate(['strucId', 'timeType'])
} }
}) })
} }
@ -185,7 +186,7 @@ function pushModal (props) {
interval: v.tactics == 'immediately' ? v.interval1 : (v.tactics == 'continue' ? v.interval2 : v.interval3), interval: v.tactics == 'immediately' ? v.interval1 : (v.tactics == 'continue' ? v.interval2 : v.interval3),
deviceProportion: v.deviceProportion deviceProportion: v.deviceProportion
}, },
alarmType: v.alarmType, alarmType: v.alarmType?.filter(d => d != 'strategy_hit' && d != 'device_exception'),
timeType: v.timeType[0] == 'POMS' ? [] : v.timeType, timeType: v.timeType[0] == 'POMS' ? [] : v.timeType,
receiverPepUserId: v.receiverPepUserId || [], receiverPepUserId: v.receiverPepUserId || [],
disable: v.disable, disable: v.disable,
@ -194,7 +195,7 @@ function pushModal (props) {
} }
for (let key in v) { for (let key in v) {
if (['app_exception', 'data_exception', 'data_outages', 'device_exception', 'video_exception', 'strategy_hit'].includes(key)) { if (['app_exception', 'data_exception', 'data_outages', 'device_exception', 'video_exception', 'strategy_hit'].includes(key)) {
data.alarmSubType = { ...data.alarmSubType, [key]: v[key] } data.alarmSubType = { ...data.alarmSubType, [key]: key == 'data_outages' ? subTypeData['data_outages']?.map(d => d.id) : v[key] }
} else if (key.indexOf('factor') == 0) { } else if (key.indexOf('factor') == 0) {
data.pomsStrucFactorId = { ...data.pomsStrucFactorId, [key.slice(6)]: v[key] } data.pomsStrucFactorId = { ...data.pomsStrucFactorId, [key.slice(6)]: v[key] }
} }
@ -264,7 +265,7 @@ function pushModal (props) {
} else if (key == 'strucId') { } else if (key == 'strucId') {
setFactorShow(values.strucId) setFactorShow(values.strucId)
} else if (key == 'alarmType') { } else if (key == 'alarmType') {
setSubType(field['alarmType']) setSubType(field['alarmType']?.filter(d => d != 'strategy_hit' && d != 'device_exception'))
} }
} }
}} }}
@ -345,7 +346,7 @@ function pushModal (props) {
key={u.name + index} key={u.name + index}
field={'factor' + u.id} field={'factor' + u.id}
style={{ width: 695 }} style={{ width: 695 }}
initValue={editObj?.pomsStrucFactorId ? editObj?.pomsStrucFactorId[u.id] : (factorItem || [])} initValue={editObj?.pomsStrucFactorId ? (editObj?.pomsStrucFactorId[u.id]?.filter(d => factorItem.includes(d)) || []) : (factorItem || [])}
direction='horizontal' direction='horizontal'
showClear showClear
> >
@ -437,7 +438,7 @@ function pushModal (props) {
field="alarmType" field="alarmType"
style={{ width: 695 }} style={{ width: 695 }}
rules={[{ required: true, message: "监听问题模块" }]} rules={[{ required: true, message: "监听问题模块" }]}
initValue={editObj?.alarmType || []} initValue={editObj?.alarmType?.filter(d => d != 'strategy_hit' && d != 'device_exception') || []}
direction='horizontal' direction='horizontal'
showClear showClear
> >
@ -445,10 +446,10 @@ function pushModal (props) {
[ [
{ name: '数据中断', value: "data_outages" }, { name: '数据中断', value: "data_outages" },
{ name: '数据异常', value: "data_exception" }, { name: '数据异常', value: "data_exception" },
{ name: '策略命中', value: "strategy_hit" }, // { name: '', value: "strategy_hit" },
{ name: '视频异常', value: "video_exception" }, { name: '视频异常', value: "video_exception" },
{ name: '应用异常', value: "app_exception" }, { name: '应用异常', value: "app_exception" },
{ name: '设备异常', value: "device_exception" }, // { name: '', value: "device_exception" },
].map((v, index) => ].map((v, index) =>
<Form.Checkbox value={v.value} <Form.Checkbox value={v.value}
key={v.value} key={v.value}
@ -457,12 +458,12 @@ function pushModal (props) {
} }
</Form.CheckboxGroup> </Form.CheckboxGroup>
{[ {[
{ name: '数据中断', value: "data_outages", data: subTypeData['data_outages'][0] }, { name: '数据中断', value: "data_outages", data: [{ id: 1, name: "全部" }] },
{ name: '数据异常', value: "data_exception", data: subTypeData['data_exception'][0] }, { name: '数据异常', value: "data_exception", data: subTypeData['data_exception'] },
{ name: '策略命中', value: "strategy_hit", data: subTypeData['strategy_hit'][0] }, // { name: '', value: "strategy_hit", data: subTypeData['strategy_hit'][0] },
{ name: '视频异常', value: "video_exception", data: subTypeData['video_exception'][0]?.map(v => ({ id: v.id, name: v.kind })) }, { name: '视频异常', value: "video_exception", data: subTypeData['video_exception']?.map(v => ({ id: v.id, name: v.kind })) },
{ name: '应用异常', value: "app_exception", data: subTypeData['app_exception'][0] }, { name: '应用异常', value: "app_exception", data: subTypeData['app_exception'] },
{ name: '设备异常', value: "device_exception", data: [...subTypeData['device_exception'][0], ...subTypeData['device_exception'][1]] }, // { name: '', value: "device_exception", data: [...subTypeData['device_exception'][0], ...subTypeData['device_exception'][1]] },
].filter(v => subType?.includes(v.value))?.map((u, index) => { ].filter(v => subType?.includes(v.value))?.map((u, index) => {
return <Form.CheckboxGroup return <Form.CheckboxGroup
label={u.name + ':'} label={u.name + ':'}
@ -472,7 +473,10 @@ function pushModal (props) {
initValue={ initValue={
editObj?.id ? editObj?.id ?
editObj?.alarmSubType ? editObj?.alarmSubType ?
editObj?.alarmSubType[u.value] : u.data.map(v => v.id) u.value == 'data_outages' ? (editObj?.alarmSubType[u.value]?.length ? [1] : [])
: (u.value == 'data_exception' ? editObj?.alarmSubType[u.value]?.filter(d => subTypeData['data_exception']?.map(f => f.id)?.includes(d))
: editObj?.alarmSubType[u.value])
: (u.value == 'data_outages' ? [1] : u.data.map(v => v.id))
: []} : []}
direction='horizontal' direction='horizontal'
showClear showClear

31
web/client/src/sections/service/containers/emPush.jsx

@ -26,10 +26,10 @@ const EmPush = (props) => {
const [subTypeData, setSubTypedata] = useState({ const [subTypeData, setSubTypedata] = useState({
data_outages: [], data_outages: [],
data_exception: [], data_exception: [],
strategy_hit: [], // strategy_hit: [],
video_exception: [], video_exception: [],
app_exception: [], app_exception: [],
device_exception: [], // device_exception: [],
}); // }); //
const page = useRef(query.page);// const page = useRef(query.page);//
const EMPUSH = "empush"; const EMPUSH = "empush";
@ -90,27 +90,28 @@ const EmPush = (props) => {
getPushList(query); getPushList(query);
// //
dispatch(problem.getAlarmDataGroup({ showAll: 'true' })).then((res) => { dispatch(problem.getAlarmDataGroup({ showAll: 'true' })).then(async (res) => {
if (res.success) { if (res.success) {
let data = { ...subTypeData } let data = { ...subTypeData }
res.payload.data?.map(v => { res.payload.data?.map(v => {
if (v.id === 1) { if ([1, 4, 5].includes(v.id)) {
data['data_outages'].push(v.unit) data['data_outages'] = data['data_outages'].concat(v.unit)
} else if (v.id === 2) { } else if (v.id === 2 || v.id == 3) {
data['data_exception'].push(v.unit) data['data_exception'] = data['data_exception'].concat(v.unit)
} else if (v.id == 3) {
data['strategy_hit'].push(v.unit)
} else {
data['device_exception'].push(v.unit)
} }
}) })
// //
dispatch(problem.getAlarmVideoDeviceKind({ showAll: true })).then((res) => { await dispatch(problem.getAlarmVideoDeviceKind({ showAll: true })).then((res) => {
if (res.success) {
data['video_exception'] = data['video_exception'].concat(res.payload.data)
}
})
await dispatch(problem.getExceptionTypeCheck({ userId: user?.id, })).then(res => {
if (res.success) { if (res.success) {
data['video_exception'].push(res.payload.data) data['data_exception'] = data['data_exception']?.filter(d => (res.payload.data?.typeId || [8, 40, 41, 48, 49]).includes(d.id))
} }
}) })
data['app_exception'].push([{ id: 'apiError', name: "接口报错", }, { id: 'element', name: "元素异常", }, { id: 'timeout', name: "加载超时", },]) data['app_exception'] = data['app_exception'].concat([{ id: 'apiError', name: "接口报错", }, { id: 'element', name: "元素异常", }, { id: 'timeout', name: "加载超时", },])
setSubTypedata(data) setSubTypedata(data)
} }
}) })
@ -577,7 +578,7 @@ const EmPush = (props) => {
onSubmit={(values) => console.log(values)} onSubmit={(values) => console.log(values)}
getFormApi={(formApi) => (form.current = formApi)} getFormApi={(formApi) => (form.current = formApi)}
layout="horizontal" layout="horizontal"
style={{ position: "relative", width: "100%", flex: 1,display:'flex' }} style={{ position: "relative", width: "100%", flex: 1, display: 'flex' }}
> >
<Form.Select <Form.Select
pure pure

1
web/client/src/utils/webapi.js

@ -64,6 +64,7 @@ export const ApiTable = {
putAlarmVideoConfirm: 'alarm/video/confirm', //确认视频告警信息 putAlarmVideoConfirm: 'alarm/video/confirm', //确认视频告警信息
getVcmpAuth: 'vcmp/auth', // 获取视频平台应用鉴权token getVcmpAuth: 'vcmp/auth', // 获取视频平台应用鉴权token
getAlarmVideoExceptionType: 'alarm/video/exceptionType', //查询视频设备类型 getAlarmVideoExceptionType: 'alarm/video/exceptionType', //查询视频设备类型
exceptionTypeCheck: 'exception/type/check',
// 监测报表 // 监测报表
getDataContinuityType: 'data/continuity/type_list', getDataContinuityType: 'data/continuity/type_list',

Loading…
Cancel
Save