Browse Source

选择监听问题模块细项

dev
wenlele 2 years ago
parent
commit
c84f57cb82
  1. 18
      api/app/lib/controllers/alarm/data.js
  2. 16
      api/app/lib/controllers/alarm/video.js
  3. 4
      api/app/lib/controllers/push/config.js
  4. 9
      api/app/lib/models/alarm_push_config.js
  5. 26
      api/app/lib/schedule/alarms_push.js
  6. 8
      script/0.10/schema/1.alter_alarm_push_config.sql
  7. 24
      web/client/src/sections/problem/actions/problem.jsx
  8. 379
      web/client/src/sections/service/components/pushModal.jsx
  9. 1402
      web/client/src/sections/service/containers/emPush.jsx

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

@ -8,17 +8,23 @@ async function groupList (ctx) {
const { clickHouse } = ctx.app.fs
const { database: dataAlarm } = clickHouse.dataAlarm.opts.config
const { showAll } = ctx.query
const groupRes = await clickHouse.anxinyun.query(`
SELECT * FROM t_alarm_group
`).toPromise();
let whereOption = []
if (!showAll) {
whereOption.push(` INNER JOIN ${dataAlarm}.alarms
ON t_alarm_group_unit.id = ${dataAlarm}.alarms.AlarmGroupUnit`)
}
for (let g of groupRes) {
g.unit = await await clickHouse.anxinyun.query(`
SELECT DISTINCT
t_alarm_group_unit.id AS id,t_alarm_group_unit.name AS name,t_alarm_group_unit.group_id AS groupId
FROM t_alarm_group_unit
INNER JOIN ${dataAlarm}.alarms
ON t_alarm_group_unit.id = ${dataAlarm}.alarms.AlarmGroupUnit
${whereOption}
WHERE group_id = ${g.id}
`).toPromise();
}
@ -90,7 +96,7 @@ async function list (ctx) {
whereOption.push(`DeviceStatus.Status = ${0}`)
}
}
let alarmQueryOptionStr = `
FROM
alarms
@ -218,7 +224,7 @@ async function list (ctx) {
}
}
async function getAlarmGroups(ctx) {
async function getAlarmGroups (ctx) {
try {
const { clickHouse } = ctx.app.fs
const groupRes = await clickHouse.anxinyun.query(`
@ -239,7 +245,7 @@ async function getAlarmGroups(ctx) {
}
}
}
async function exportDataAlarms(ctx, alarmList, groupId) {
async function exportDataAlarms (ctx, alarmList, groupId) {
try {
const { utils: { simpleExcelDown, getExportAlarmHeader } } = ctx.app.fs;
let header = await getExportAlarmHeader(groupId);
@ -303,7 +309,7 @@ async function exportDataAlarms(ctx, alarmList, groupId) {
}
}
}
async function detail(ctx) {
async function detail (ctx) {
try {
const { models } = ctx.fs.dc;
const { clickHouse } = ctx.app.fs

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

@ -8,11 +8,18 @@ async function deviceType (ctx) {
const { clickHouse } = ctx.app.fs
const { database: anxinyun } = clickHouse.anxinyun.opts.config
const { utils: { judgeSuper, anxinStrucIdRange } } = ctx.app.fs
const { showAll } = ctx.query
let anxinStruc = await anxinStrucIdRange({
ctx,
})
const anxinStrucIds = anxinStruc.map(a => a.strucId)
let whereOption = []
if (!showAll) {
whereOption.push(`INNER JOIN ${anxinyun}.t_video_ipc
ON toString(${anxinyun}.t_video_ipc.channel_no) = camera_status_alarm.channel_no
AND ${anxinyun}.t_video_ipc.serial_no = camera_status_alarm.serial_no
${`WHERE ${anxinyun}.t_video_ipc.structure IN (${anxinStrucIds.join(',')})`}`)
}
const kindRes = await clickHouse.vcmp.query(`
SELECT DISTINCT
camera_kind.id AS id,camera_kind.kind AS kind
@ -22,10 +29,7 @@ async function deviceType (ctx) {
INNER JOIN camera_status_alarm
ON camera.channel_no = camera_status_alarm.channel_no
AND camera.serial_no = camera_status_alarm.serial_no
INNER JOIN ${anxinyun}.t_video_ipc
ON toString(${anxinyun}.t_video_ipc.channel_no) = camera_status_alarm.channel_no
AND ${anxinyun}.t_video_ipc.serial_no = camera_status_alarm.serial_no
${`WHERE ${anxinyun}.t_video_ipc.structure IN (${anxinStrucIds.join(',')})`}
${whereOption}
`).toPromise()
ctx.status = 200;
ctx.body = kindRes
@ -38,7 +42,7 @@ async function deviceType (ctx) {
}
}
async function exceptionType(ctx) {
async function exceptionType (ctx) {
try {
const { models } = ctx.fs.dc;
const { clickHouse } = ctx.app.fs

4
api/app/lib/controllers/push/config.js

@ -165,11 +165,11 @@ async function edit (ctx) {
const models = ctx.fs.dc.models;
const { userId, pepUserId } = ctx.fs.api
const { pushId, name, pomsProjectId, alarmType = [], receiverPepUserId = [], timeType = [], disable,
strucId = [], tactics, tacticsParams } = ctx.request.body
strucId = [], tactics, tacticsParams, alarmSubType = {} } = ctx.request.body
let storageData = {
name, pomsProjectId, alarmType, receiverPepUserId, timeType, disable,
strucId, tactics, tacticsParams
strucId, tactics, tacticsParams,alarmSubType
}
let repeatOption = {

9
api/app/lib/models/alarm_push_config.js

@ -42,6 +42,15 @@ module.exports = dc => {
field: "alarm_type",
autoIncrement: false
},
alarmSubType: {
type: DataTypes.JSONB,
allowNull: true,
defaultValue: null,
comment: "监听的告警类型",
primaryKey: false,
field: "alarm_sub_type",
autoIncrement: false
},
receiverPepUserId: {
type: DataTypes.ARRAY(DataTypes.INTEGER),
allowNull: true,

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

@ -135,6 +135,7 @@ module.exports = function (app, opts) {
let dataAlarmOption = []
let dataAlarmGroupOption = []
let dataAlarmSubType = []
let dataAlarms = []
let videoAlarmWhereOption = []
@ -211,15 +212,21 @@ module.exports = function (app, opts) {
// 判断告警数据范围
if (c.alarmType.includes('data_outages')) {
dataAlarmGroupOption.push(1)
if (c.alarmSubType) dataAlarmSubType = dataAlarmSubType.concat(c.alarmSubType['data_outages'])
}
if (c.alarmType.includes('data_exception')) {
dataAlarmGroupOption.push(2)
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')) {
videoAlarms = searchStrucIds.length ? await clickHouse.vcmp.query(
let videoAlarmSubType = c.alarmSubType ? c.alarmSubType['data_exception'] : []
if (videoAlarmSubType.length == 1) videoAlarmSubType.push(-1)
videoAlarms = searchStrucIds.length && videoAlarmSubType.length ? await clickHouse.vcmp.query(
`
SELECT
cameraAlarm.cameraId AS cameraId,
@ -263,6 +270,7 @@ module.exports = function (app, opts) {
AND camera.channel_no = camera_status_alarm.channel_no
AND camera.delete = false
AND camera.recycle_time is null
${!c.alarmSubType ? `AND camera.kind_id in (${videoAlarmSubType.join(',')})` : ""}
WHERE
camera_status_alarm.confirm_time IS null
${videoAlarmWhereOption.length ? ` AND ${videoAlarmWhereOption.join(' AND ')}` : ''}
@ -353,7 +361,10 @@ module.exports = function (app, opts) {
videoAlarms = returnD
}
if (c.alarmType.includes('app_exception')) {
appAlarms = await models.AppAlarm.findAll({
if (c.alarmSubType) {
appAlarmWhereOption.type = { $in: c.alarmSubType['app_exception'] || [] }
}
appAlarms = c.alarmSubType && c.alarmSubType['app_exception'].length ? await models.AppAlarm.findAll({
where: appAlarmWhereOption,
order: [['createTime', 'DESC']],
include: [{
@ -367,25 +378,30 @@ module.exports = function (app, opts) {
required: true,
}]
}]
})
}) : []
}
if (c.alarmType.includes('device_exception')) {
dataAlarmGroupOption.push(4)
dataAlarmGroupOption.push(5)
if (c.alarmSubType) dataAlarmSubType = dataAlarmSubType.concat(c.alarmSubType['device_exception'])
}
// 查数据告警 三警合一
if (dataAlarmGroupOption.length && searchStrucIds.length) {
dataAlarmGroupOption.push(-1)
dataAlarmOption.push(`AlarmGroup IN (${dataAlarmGroupOption.join(',')})`)
dataAlarms = await clickHouse.dataAlarm.query(`
if (c.alarmSubType && dataAlarmSubType.length) {
dataAlarmSubType.push(-1)
dataAlarmOption.push(`AlarmGroupUnit IN (${dataAlarmSubType.join(',')})`)
}
dataAlarms = (!c.alarmSubType || dataAlarmSubType.length) ? await clickHouse.dataAlarm.query(`
SELECT * FROM alarms
WHERE
${`State NOT IN (3, 4) AND `}
StructureId IN (${searchStrucIds.join(',')})
${dataAlarmOption.length ? ' AND ' + dataAlarmOption.join(' AND ') : ''}
ORDER BY StartTime DESC
`).toPromise()
`).toPromise() : []
console.log(dataAlarms);
}

8
script/0.10/schema/1.alter_alarm_push_config.sql

@ -0,0 +1,8 @@
alter table alarm_push_config
add alarm_sub_type jsonb
comment on column alarm_push_config.alarm_sub_type is '存对应监听模块(alarm_type)的子类(
alarms.AlarmGroupUnit,
camera.kind_id,
app_alarm.errType
)';

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

@ -64,10 +64,11 @@ export function postApiConfirm (data) { //确认应用接口/元素错误信
});
}
export function getAlarmDataGroup () { //
export function getAlarmDataGroup (query) { //
return dispatch => basicAction({
type: 'get',
dispatch: dispatch,
query,
actionType: 'GET_ALARM_DATA_GROUP',
url: `${ApiTable.getAlarmDataGroup}`,
msg: { option: '获取数据告警分类' },
@ -138,10 +139,11 @@ export function getAlarmVideoList (query) { //查询视频告警列表
export function getAlarmVideoDeviceKind () { //
export function getAlarmVideoDeviceKind (query) { //
return dispatch => basicAction({
type: 'get',
dispatch: dispatch,
query,
actionType: 'GET_ALARM_VIDEO_DEVICE_KIND',
url: `${ApiTable.getAlarmVideoDeviceKind}`,
msg: { option: '查询视频设备类型' },
@ -150,15 +152,15 @@ export function getAlarmVideoDeviceKind () { //查询视频设备类型
}
export function getAlarmVideoExceptionType () { //
return dispatch => basicAction({
type: 'get',
dispatch: dispatch,
actionType: 'GET_ALARM_VIDEO_EXCEPTION_TYPE',
url: `${ApiTable.getAlarmVideoExceptionType}`,
msg: { option: '查询视频异常类型' },
reducer: { name: '' }
});
}
return dispatch => basicAction({
type: 'get',
dispatch: dispatch,
actionType: 'GET_ALARM_VIDEO_EXCEPTION_TYPE',
url: `${ApiTable.getAlarmVideoExceptionType}`,
msg: { option: '查询视频异常类型' },
reducer: { name: '' }
});
}
export function putAlarmVideoConfirm (data) { //
return dispatch => basicAction({

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

@ -15,9 +15,10 @@ function pushModal (props) {
actions,
pushEdit,//
editObj,
user
user,
subTypeData
} = props;
const { service } = actions;
const { service, problem } = actions;
const form = useRef();//
const [abnormal, setAbnormal] = useState(false); //disable
const [usersList, setUsersList] = useState([]); //
@ -32,20 +33,19 @@ function pushModal (props) {
const [interval2, setInterval2] = useState(undefined); //
const [interval3, setInterval3] = useState(undefined); //
const [deviceProportion, setDeviceProportion] = useState(undefined); //
const [subType, setSubType] = useState([]); //
//
useEffect(() => {
if (editObj?.alarmType) setSubType(editObj?.alarmType)
getOrganizationUsersList()//
getProjectPomsList()//
if (editObj.id) {
getProjectStructureList(editObj.pomsProjectId)
if (editObj.pomsProject?.pepProjectId) {
getProjectStatusList()//
}
else {
} else {
setProjectStatus([{ construction_status: 'POMS', id: 'POMS' }])
timeTypePOMS.current = ['POMS']
}
@ -58,7 +58,7 @@ function pushModal (props) {
setDeviceProportion(editObj.tacticsParams?.deviceProportion)
}
}
}, []);
}, [])
function getOrganizationUsersList () {//
dispatch(service.getOrganizationUsers()).then((res) => {
if (res.success) {
@ -101,278 +101,58 @@ function pushModal (props) {
}
})
}
function caution (tactics, interval, deviceProportion) {
let regu = /^[0-9]*[1-9][0-9]*$/;
let title = tactics == 'immediately' ? '即时' : tactics == 'continue' ? '持续时长' : '异常率'
if (!regu.test(interval) || (tactics == 'abnormal_rate' && interval > 720) || interval > 1440) {
console.log(interval);
Notification.error({
content: title + (interval ? `推送时间不能大于${tactics == 'abnormal_rate' ? 720 : 1440}分钟` : '推送时间应为正整数'),
duration: 2,
})
return false
}
if (!deviceProportion || deviceProportion > 100) {
Notification.error({
content: '异常率推送异常率应为正整数且不超过100%',
duration: 2,
})
return false
}
return true
}
function handleOk () {
//
form.current
.validate()
.then((values) => {
if (pushEdit) {
let obj = JSON.parse(JSON.stringify(values))
if (obj.timeType[0] == 'POMS') {
obj.timeType = []
}
let regu = /^[0-9]*[1-9][0-9]*$/;
if (obj.tactics == 'immediately') {
if (obj.interval1) {
if (regu.test(obj.interval1)) {
if (obj.interval1 <= 1440) {
obj.tacticsParams = {
interval: obj.interval1
}
delete obj.interval1
delete obj.interval2
delete obj.interval3
delete obj.deviceProportion
dispatch(service.postPush({ pushId: editObj.id, ...obj, msg: '编辑推送配置' })).then((res) => {//(PEP)
if (res.success) {
close();
}
})
} else {
Notification.error({
content: '即时推送时间不能大于1440分钟',
duration: 2,
})
}
} else {
Notification.error({
content: '即时推送时间应为正整数',
duration: 2,
})
}
} else {
Notification.error({
content: '即时推送时间应为正整数',
duration: 2,
})
}
}
else if (obj.tactics == 'continue') {
if (obj.interval2) {
if (regu.test(obj.interval2)) {
if (obj.interval2 <= 1440) {
obj.tacticsParams = {
interval: obj.interval2
}
delete obj.interval1
delete obj.interval2
delete obj.interval3
delete obj.deviceProportion
dispatch(service.postPush({ pushId: editObj.id, ...obj, msg: '编辑推送配置' })).then((res) => {//(PEP)
if (res.success) {
close();
}
})
} else {
Notification.error({
content: '持续时长推送时间不能大于1440分钟',
duration: 2,
})
}
} else {
Notification.error({
content: '持续时长推送时间应为正整数',
duration: 2,
})
}
} else {
Notification.error({
content: '持续时长推送时间应为正整数',
duration: 2,
})
}
}
else {
if (regu.test(obj.interval3) && regu.test(obj.deviceProportion)) {
if (obj.interval3 <= 720 && obj.deviceProportion <= 100) {
obj.tacticsParams = {
interval: obj.interval3,
deviceProportion: obj.deviceProportion
}
delete obj.interval1
delete obj.interval2
delete obj.interval3
delete obj.deviceProportion
dispatch(service.postPush({ pushId: editObj.id, ...obj, msg: '编辑推送配置' })).then((res) => {//(PEP)
if (res.success) {
close();
}
})
} else if (obj.interval3 <= 720 && obj.deviceProportion > 100) {
Notification.error({
content: '异常率推送异常率不能超过100%',
duration: 2,
})
} else if (obj.interval3 > 720 && obj.deviceProportion <= 100) {
Notification.error({
content: '异常率推送时间不能超过720小时',
duration: 2,
})
} else {
Notification.error({
content: '异常率推送时间不能超过720小时',
duration: 2,
})
Notification.error({
content: '异常率推送异常率不能超过100%',
duration: 2,
})
}
} else if (regu.test(obj.interval3) && !regu.test(obj.deviceProportion)) {
Notification.error({
content: '异常率推送异常率应为正整数',
duration: 2,
})
} else if (!regu.test(obj.interval3) && regu.test(obj.deviceProportion)) {
Notification.error({
content: '异常率推送时间应为正整数',
duration: 2,
})
} else {
Notification.error({
content: '异常率推送异常率应为正整数',
duration: 2,
})
Notification.error({
content: '异常率推送时间应为正整数',
duration: 2,
})
}
}
.then((v) => {
let data = {
name: v.name,
pomsProjectId: v.pomsProjectId,
strucId: v.strucId || [],
tactics: v.tactics,
tacticsParams: {
interval: v.tactics == 'immediately' ? v.interval1 : (v.tactics == 'continue' ? v.interval2 : v.interval3),
deviceProportion: v.deviceProportion
},
alarmType: v.alarmType,
timeType: v.timeType[0] == 'POMS' ? [] : v.timeType,
receiverPepUserId: v.receiverPepUserId || [],
disable: v.disable,
alarmSubType: {}
}
else {
let obj = JSON.parse(JSON.stringify(values))
if (obj.timeType[0] == 'POMS') {
obj.timeType = []
for (let key in v) {
if (['app_exception', 'data_exception', 'data_outages', 'device_exception', 'video_exception', 'strategy_hit'].includes(key)) {
data.alarmSubType = { ...data.alarmSubType, [key]: v[key] }
}
let regu = /^[0-9]*[1-9][0-9]*$/;
if (obj.tactics == 'immediately') {
if (obj.interval1) {
if (regu.test(obj.interval1)) {
if (obj.interval1 <= 1440) {
obj.tacticsParams = {
interval: obj.interval1
}
delete obj.interval1
delete obj.interval2
delete obj.interval3
delete obj.deviceProportion
dispatch(service.postPush({ ...obj, msg: '新增推送配置' })).then((res) => {//(PEP)
if (res.success) {
close();
}
})
} else {
Notification.error({
content: '即时推送时间不能大于1440分钟',
duration: 2,
})
}
} else {
Notification.error({
content: '即时推送时间应为正整数',
duration: 2,
})
}
} else {
Notification.error({
content: '即时推送时间应为正整数',
duration: 2,
})
}
}
else if (obj.tactics == 'continue') {
if (obj.interval2) {
if (regu.test(obj.interval2)) {
if (obj.interval2 <= 1440) {
obj.tacticsParams = {
interval: obj.interval2
}
delete obj.interval1
delete obj.interval2
delete obj.interval3
delete obj.deviceProportion
dispatch(service.postPush({ ...obj, msg: '新增推送配置' })).then((res) => {//(PEP)
if (res.success) {
close();
}
})
} else {
Notification.error({
content: '持续时长推送时间不能大于1440分钟',
duration: 2,
})
}
} else {
Notification.error({
content: '持续时长推送时间应为正整数',
duration: 2,
})
}
} else {
Notification.error({
content: '持续时长推送时间应为正整数',
duration: 2,
})
}
}
else {
if (regu.test(obj.interval3) && regu.test(obj.deviceProportion)) {
if (obj.interval3 <= 720 && obj.deviceProportion <= 100) {
obj.tacticsParams = {
interval: obj.interval3,
deviceProportion: obj.deviceProportion
}
delete obj.interval1
delete obj.interval2
delete obj.interval3
delete obj.deviceProportion
dispatch(service.postPush({ ...obj, msg: '新增推送配置' })).then((res) => {//(PEP)
if (res.success) {
close();
}
})
} else if (obj.interval3 <= 720 && obj.deviceProportion > 100) {
Notification.error({
content: '异常率推送异常率不能超过100%',
duration: 2,
})
} else if (obj.interval3 > 720 && obj.deviceProportion <= 100) {
Notification.error({
content: '异常率推送时间不能超过720小时',
duration: 2,
})
} else {
Notification.error({
content: '异常率推送时间不能超过720小时',
duration: 2,
})
Notification.error({
content: '异常率推送异常率不能超过100%',
duration: 2,
})
}
} else if (regu.test(obj.interval3) && !regu.test(obj.deviceProportion)) {
Notification.error({
content: '异常率推送异常率应为正整数',
duration: 2,
})
} else if (!regu.test(obj.interval3) && regu.test(obj.deviceProportion)) {
Notification.error({
content: '异常率推送时间应为正整数',
duration: 2,
})
} else {
Notification.error({
content: '异常率推送异常率应为正整数',
duration: 2,
})
Notification.error({
content: '异常率推送时间应为正整数',
duration: 2,
})
}
if (caution(data.tactics, data.tacticsParams.interval, data.tacticsParams.deviceProportion)) {
dispatch(service.postPush({ pushId: editObj.id, ...data, msg: pushEdit ? '编辑推送配置' : "新增推送策略" })).then((res) => {//(PEP)
if (res.success) {
close();
}
}
})
}
})
}
@ -403,8 +183,7 @@ function pushModal (props) {
if (values.tactics == 'abnormal_rate') {
form.current.setValue('alarmType', undefined)
setAbnormal(true)
}
else {
} else {
setAbnormal(false)
}
}
@ -423,6 +202,9 @@ function pushModal (props) {
}
}
}
if (key == 'alarmType') {
setSubType(field['alarmType'])
}
}
}}
getFormApi={(formApi) => (form.current = formApi)}
@ -496,9 +278,10 @@ function pushModal (props) {
direction='horizontal'
initValue={editObj?.tactics || ''}
rules={[{ required: true, message: '请选择推送策略' }]}>
<div style={{display: 'flex',alignItems: 'flex-start'}}>
<div style={{ display: 'flex', alignItems: 'flex-start' }}>
<Form.Radio
value='immediately'
extra={
<span style={{ fontSize: 13 }}>
中台每分钟查询若有告警源新增则每
@ -512,7 +295,7 @@ function pushModal (props) {
分钟通过信鸽服务发送一条通知信息
</span>
}
style={{ width: 198 }}>
style={{ width: 217 }}>
即时推送机制
</Form.Radio>
<Form.Radio
@ -573,13 +356,45 @@ function pushModal (props) {
direction='horizontal'
showClear
>
<Form.Checkbox value="data_outages">数据中断</Form.Checkbox>
<Form.Checkbox value="data_exception">数据异常</Form.Checkbox>
<Form.Checkbox value="strategy_hit" disabled={abnormal}>策略命中</Form.Checkbox>
<Form.Checkbox value="video_exception">视频异常</Form.Checkbox>
<Form.Checkbox value="app_exception" disabled={abnormal}>应用异常</Form.Checkbox>
<Form.Checkbox value="device_exception">设备异常</Form.Checkbox>
{
[
{ name: '数据中断', value: "data_outages" },
{ name: '数据异常', value: "data_exception" },
{ name: '策略命中', value: "strategy_hit" },
{ name: '视频异常', value: "video_exception" },
{ name: '应用异常', value: "app_exception" },
{ name: '设备异常', value: "device_exception" },
].map((v, index) =>
<Form.Checkbox value={v.value}
key={v.value}
disabled={index == 2 || index == 4 ? abnormal : false}>
{v.name}</Form.Checkbox>)
}
</Form.CheckboxGroup>
{[
{ name: '数据中断', value: "data_outages", data: subTypeData['data_outages'][0] },
{ name: '数据异常', value: "data_exception", data: subTypeData['data_exception'][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: "app_exception", data: subTypeData['app_exception'][0] },
{ name: '设备异常', value: "device_exception", data: [...subTypeData['device_exception'][0], ...subTypeData['device_exception'][1]] },
].filter(v => subType?.includes(v.value))?.map((u, index) => {
return <Form.CheckboxGroup
label={u.name + ':'}
key={u.name + u.index}
field={u.value}
style={{ width: 695 }}
initValue={(editObj?.id && (editObj?.alarmSubType && editObj?.alarmSubType[u.value]) || u.data.map(v => v.id)) || []}
direction='horizontal'
showClear
>
{
u.data?.map((v, index) =>
<Form.Checkbox value={v.id} key={v.id} style={{ width: 150 }}>{v.name}</Form.Checkbox>)
}
</Form.CheckboxGroup>
})
}
</div>
<div style={{ color: '#4A4A4A', fontSize: 14, fontWeight: 600, marginLeft: 6 }}>
接收信息配置

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

File diff suppressed because it is too large
Loading…
Cancel
Save