Browse Source

提交报警记录相关代码

lixing 3 years ago
parent
commit
3f7e8f22ed
36 changed files with 1626 additions and 250 deletions
  1. 1 1
      pom.xml
  2. 37 1
      src/main/java/com/persagy/apm/alarmservice/alarmdic/controller/AlarmDicController.java
  3. 127 0
      src/main/java/com/persagy/apm/alarmservice/alarmdic/service/AlarmDicServiceImpl.java
  4. 204 26
      src/main/java/com/persagy/apm/alarmservice/alarmrecord/controller/AlarmRecordController.java
  5. 62 0
      src/main/java/com/persagy/apm/alarmservice/alarmrecord/enums/EnumAlarmCategory.java
  6. 51 0
      src/main/java/com/persagy/apm/alarmservice/alarmrecord/enums/EnumAlarmLevel.java
  7. 51 0
      src/main/java/com/persagy/apm/alarmservice/alarmrecord/enums/EnumAlarmNature.java
  8. 51 0
      src/main/java/com/persagy/apm/alarmservice/alarmrecord/enums/EnumAlarmState.java
  9. 51 0
      src/main/java/com/persagy/apm/alarmservice/alarmrecord/enums/EnumAlarmTreatMode.java
  10. 53 0
      src/main/java/com/persagy/apm/alarmservice/alarmrecord/enums/EnumAlarmTreatState.java
  11. 31 0
      src/main/java/com/persagy/apm/alarmservice/alarmrecord/model/ConvertAlarmRecordTool.java
  12. 4 0
      src/main/java/com/persagy/apm/alarmservice/alarmrecord/model/dto/PageQueryAlarmRecordDTO.java
  13. 1 1
      src/main/java/com/persagy/apm/alarmservice/alarmrecord/model/vo/AlarmRecordItem.java
  14. 1 1
      src/main/java/com/persagy/apm/alarmservice/alarmrecord/model/vo/AlarmRecordListItem.java
  15. 341 0
      src/main/java/com/persagy/apm/alarmservice/alarmrecord/service/AlarmRecordWrapper.java
  16. 10 0
      src/main/java/com/persagy/apm/alarmservice/calculatemethod/service/ICalculateMethodService.java
  17. 9 0
      src/main/java/com/persagy/apm/alarmservice/calculatemethod/service/impl/CalculateMethodServiceImpl.java
  18. 15 11
      src/main/java/com/persagy/apm/alarmservice/group/alarmrule/controller/GroupAlarmRuleController.java
  19. 2 29
      src/main/java/com/persagy/apm/alarmservice/group/management/controller/GroupManagementController.java
  20. 33 0
      src/main/java/com/persagy/apm/alarmservice/group/management/model/ConvertGroupTool.java
  21. 2 0
      src/main/java/com/persagy/apm/alarmservice/group/management/model/GroupManagement.java
  22. 1 1
      src/main/java/com/persagy/apm/alarmservice/group/management/model/vo/GroupTreeInfoVO.java
  23. 59 2
      src/main/java/com/persagy/apm/alarmservice/group/management/service/GroupManagementService.java
  24. 171 75
      src/main/java/com/persagy/apm/alarmservice/group/management/service/impl/GroupManagementServiceImpl.java
  25. 81 66
      src/main/java/com/persagy/apm/alarmservice/monitorindicator/service/impl/MonitorIndicatorServiceImpl.java
  26. 11 9
      src/main/java/com/persagy/apm/alarmservice/project/monitorindicatorconfig/controller/ProjectMonitorIndicatorConfigController.java
  27. 1 1
      src/main/java/com/persagy/apm/alarmservice/project/monitorindicatorconfig/model/ProjectMonitorIndicatorConfig.java
  28. 1 1
      src/main/java/com/persagy/apm/alarmservice/project/monitorindicatorconfig/model/dto/AddProjectMonitorIndicatorConfigDTO.java
  29. 4 4
      src/main/java/com/persagy/apm/alarmservice/project/monitorindicatorconfig/model/dto/PageQueryProjectMonitorIndicatorConfigDTO.java
  30. 1 1
      src/main/java/com/persagy/apm/alarmservice/project/monitorindicatorconfig/model/dto/QueryProjectMonitorIndicatorConfigDTO.java
  31. 3 2
      src/main/java/com/persagy/apm/alarmservice/project/monitorindicatorconfig/service/IProjectMonitorIndicatorConfigService.java
  32. 129 12
      src/main/java/com/persagy/apm/alarmservice/project/monitorindicatorconfig/service/impl/ProjectMonitorIndicatorConfigServiceImpl.java
  33. 3 2
      src/main/java/com/persagy/apm/common/aspect/AlarmDataAspect.java
  34. 22 3
      src/main/java/com/persagy/apm/common/enums/AlarmDicTypeEnum.java
  35. 1 0
      src/main/java/com/persagy/apm/model/dto/GroupManagementDTO.java
  36. 1 1
      src/main/resources/mapper/ProjectMonitorIndicatorConfigMapper.xml

+ 1 - 1
pom.xml

@@ -7,7 +7,7 @@
 <parent>
     <groupId>com.persagy</groupId>
     <artifactId>apm-package</artifactId>
-    <version>3.0.0</version>
+    <version>v1.0.0</version>
 </parent>
 
 <artifactId>energy-alarm-service</artifactId>

+ 37 - 1
src/main/java/com/persagy/apm/alarmservice/alarmdic/controller/AlarmDicController.java

@@ -2,6 +2,8 @@ package com.persagy.apm.alarmservice.alarmdic.controller;
 
 import com.persagy.apm.alarmservice.alarmcondition.model.dto.AddAlarmConditionDTO;
 import com.persagy.apm.alarmservice.alarmdic.model.dto.QueryAlarmDicDTO;
+import com.persagy.apm.alarmservice.alarmdic.service.AlarmDicServiceImpl;
+import com.persagy.apm.common.enums.AlarmDicTypeEnum;
 import com.persagy.apm.common.model.vo.EnumVO;
 import com.persagy.apm.common.response.ApmResponseUpsertVO;
 import com.persagy.apm.common.response.CommonResult;
@@ -9,6 +11,7 @@ import com.persagy.apm.common.response.PageList;
 import com.persagy.apm.common.utils.ResultHelper;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -28,11 +31,44 @@ import java.util.List;
 @RestController
 @RequestMapping("alarmDic")
 public class AlarmDicController {
+    @Autowired
+    AlarmDicServiceImpl alarmDicService;
+
     @ApiOperation(value = "查询报警字典数据")
     @PostMapping("/query")
     public CommonResult<PageList<EnumVO>> queryAlarmDic(
             @Valid @RequestBody QueryAlarmDicDTO queryAlarmDicDTO) {
-        List<EnumVO> resultList = new ArrayList<>();
+        String type = queryAlarmDicDTO.getType();
+        List<EnumVO> resultList;
+        // 如果未获取到需要查询的字典类型,返回空列表
+        AlarmDicTypeEnum dicTypeEnum = AlarmDicTypeEnum.getByType(type);
+        if (dicTypeEnum == null) {
+            resultList = new ArrayList<>();
+            return ResultHelper.multi(resultList);
+        }
+
+        switch (dicTypeEnum) {
+            case ALARM_CATEGORY:
+                resultList = alarmDicService.queryCategoryEnum();
+                break;
+            case ALARM_LEVEL:
+                resultList = alarmDicService.queryLevelEnum();
+                break;
+            case ALARM_NATURE:
+                resultList = alarmDicService.queryNatureEnum();
+                break;
+            case ALARM_STATE:
+                resultList = alarmDicService.queryStateEnum();
+                break;
+            case ALARM_TREAT_MODE:
+                resultList = alarmDicService.queryTreatModeEnum();
+                break;
+            case ALARM_TREAT_STATE:
+                resultList = alarmDicService.queryTreatStateEnum();
+                break;
+            default:
+                resultList = new ArrayList<>();
+        }
         return ResultHelper.multi(resultList);
     }
 }

+ 127 - 0
src/main/java/com/persagy/apm/alarmservice/alarmdic/service/AlarmDicServiceImpl.java

@@ -0,0 +1,127 @@
+package com.persagy.apm.alarmservice.alarmdic.service;
+
+import com.persagy.apm.alarmservice.alarmrecord.enums.*;
+import com.persagy.apm.common.model.vo.EnumVO;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 报警字典实现类
+ *
+ * @author lixing
+ * @version V1.0 2021/5/17 11:00 上午
+ **/
+@Service
+public class AlarmDicServiceImpl {
+    /**
+     * 查询报警系统
+     *
+     * @return 报警系统
+     * @author lixing
+     * @version V1.0 2021/9/20 11:18 上午
+     */
+    public List<EnumVO> queryCategoryEnum() {
+        List<EnumVO> resultList = new ArrayList<>(EnumAlarmCategory.values().length);
+        Arrays.asList(EnumAlarmCategory.values()).forEach(item -> {
+            EnumVO enumVO = new EnumVO();
+            enumVO.setKey(item.getType());
+            enumVO.setValue(item.getDesc());
+            resultList.add(enumVO);
+        });
+        return resultList;
+    }
+
+    /**
+     * 查询报警等级
+     *
+     * @return 报警系统
+     * @author lixing
+     * @version V1.0 2021/9/20 11:18 上午
+     */
+    public List<EnumVO> queryLevelEnum() {
+        List<EnumVO> resultList = new ArrayList<>(EnumAlarmLevel.values().length);
+        Arrays.asList(EnumAlarmLevel.values()).forEach(item -> {
+            EnumVO enumVO = new EnumVO();
+            enumVO.setKey(item.getType());
+            enumVO.setValue(item.getDesc());
+            resultList.add(enumVO);
+        });
+        return resultList;
+    }
+
+    /**
+     * 查询报警性质
+     *
+     * @return 报警性质
+     * @author lixing
+     * @version V1.0 2021/9/20 11:18 上午
+     */
+    public List<EnumVO> queryNatureEnum() {
+        List<EnumVO> resultList = new ArrayList<>(EnumAlarmNature.values().length);
+        Arrays.asList(EnumAlarmNature.values()).forEach(item -> {
+            EnumVO enumVO = new EnumVO();
+            enumVO.setKey(item.getType());
+            enumVO.setValue(item.getDesc());
+            resultList.add(enumVO);
+        });
+        return resultList;
+    }
+
+    /**
+     * 查询报警处理方式
+     *
+     * @return 报警处理方式
+     * @author lixing
+     * @version V1.0 2021/9/20 11:18 上午
+     */
+    public List<EnumVO> queryTreatModeEnum() {
+        List<EnumVO> resultList = new ArrayList<>(EnumAlarmTreatMode.values().length);
+        Arrays.asList(EnumAlarmTreatMode.values()).forEach(item -> {
+            EnumVO enumVO = new EnumVO();
+            enumVO.setKey(item.getType());
+            enumVO.setValue(item.getDesc());
+            resultList.add(enumVO);
+        });
+        return resultList;
+    }
+
+    /**
+     * 查询报警处理状态
+     *
+     * @return 报警处理方式
+     * @author lixing
+     * @version V1.0 2021/9/20 11:18 上午
+     */
+    public List<EnumVO> queryTreatStateEnum() {
+        List<EnumVO> resultList = new ArrayList<>(EnumAlarmTreatState.values().length);
+        Arrays.asList(EnumAlarmTreatState.values()).forEach(item -> {
+            EnumVO enumVO = new EnumVO();
+            enumVO.setKey(item.getType());
+            enumVO.setValue(item.getDesc());
+            resultList.add(enumVO);
+        });
+        return resultList;
+    }
+
+    /**
+     * 查询报警状态
+     *
+     * @return 报警状态
+     * @author lixing
+     * @version V1.0 2021/9/20 11:18 上午
+     */
+    public List<EnumVO> queryStateEnum() {
+        List<EnumVO> resultList = new ArrayList<>(EnumAlarmState.values().length);
+        Arrays.asList(EnumAlarmState.values()).forEach(item -> {
+            EnumVO enumVO = new EnumVO();
+            enumVO.setKey(item.getType());
+            enumVO.setValue(item.getDesc());
+            resultList.add(enumVO);
+        });
+        return resultList;
+    }
+
+}

+ 204 - 26
src/main/java/com/persagy/apm/alarmservice/alarmrecord/controller/AlarmRecordController.java

@@ -1,16 +1,37 @@
 package com.persagy.apm.alarmservice.alarmrecord.controller;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.persagy.apm.alarmservice.alarmrecord.enums.EnumAlarmTreatMode;
+import com.persagy.apm.alarmservice.alarmrecord.enums.EnumAlarmTreatState;
+import com.persagy.apm.alarmservice.alarmrecord.model.ConvertAlarmRecordTool;
 import com.persagy.apm.alarmservice.alarmrecord.model.dto.*;
 import com.persagy.apm.alarmservice.alarmrecord.model.vo.AlarmRecordIdsItem;
-import com.persagy.apm.alarmservice.alarmrecord.model.vo.AlarmRecordItem;
+import com.persagy.apm.alarmservice.alarmrecord.model.vo.AlarmRecordItemVO;
 import com.persagy.apm.alarmservice.alarmrecord.model.vo.AlarmRecordListItem;
+import com.persagy.apm.alarmservice.alarmrecord.service.AlarmRecordWrapper;
+import com.persagy.apm.alarmservice.group.management.model.vo.GroupTreeDetailVO;
+import com.persagy.apm.alarmservice.group.management.service.GroupManagementService;
+import com.persagy.apm.common.context.poems.PoemsContext;
+import com.persagy.apm.common.model.dto.Sort;
 import com.persagy.apm.common.response.CommonResult;
 import com.persagy.apm.common.response.PageList;
 import com.persagy.apm.common.utils.ResultHelper;
+import com.persagy.apm.energyalarmstarter.alarmdata.feign.DmpResult;
+import com.persagy.apm.energyalarmstarter.alarmdata.model.dto.alarmrecord.BatchUpdateAlarmRecordDTO;
+import com.persagy.apm.energyalarmstarter.alarmdata.model.dto.alarmrecord.QueryAlarmRecordDTO;
+import com.persagy.apm.energyalarmstarter.alarmdata.model.dto.alarmrecord.UpdateAlarmRecordDTO;
+import com.persagy.apm.energyalarmstarter.alarmdata.model.dto.common.QueryDTO;
+import com.persagy.apm.energyalarmstarter.alarmdata.model.vo.AlarmRecordItem;
+import com.persagy.apm.energyalarmstarter.alarmdata.service.AlarmItemServiceImpl;
 import com.persagy.apm.energyalarmstarter.alarmdata.service.AlarmRecordServiceImpl;
+import com.persagy.apm.model.dto.GroupManagementDTO;
+import com.persagy.apm.model.vo.GroupManagementVo;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+import org.assertj.core.util.Lists;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.CollectionUtils;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -20,74 +41,231 @@ import org.springframework.web.bind.annotation.RestController;
 import javax.validation.Valid;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * 报警记录控制层
+ *
  * @author lixing
  * @version V1.0 2021-09-08 22:30:38
  */
-@Api(tags = "报警记录") 
+@Api(tags = "报警记录")
 @Validated
 @RestController
 @RequestMapping("alarm_records")
 public class AlarmRecordController {
+    // alarm-data-starter中封装的服务
     @Autowired
     AlarmRecordServiceImpl alarmRecordService;
+    // alarm-data-starter中封装的服务
+    @Autowired
+    AlarmItemServiceImpl alarmItemService;
+    @Autowired
+    GroupManagementService groupManagementService;
+    @Autowired
+    AlarmRecordWrapper alarmRecordWrapper;
+
+    @ApiOperation(value = "当前报警列表")
+    @PostMapping("/current_list")
+    public CommonResult<PageList<AlarmRecordListItem>> queryCurrentAlarmRecord(
+            @Valid @RequestBody PageQueryAlarmRecordDTO pageQueryAlarmRecordDTO) throws Exception {
+        // 当前报警的默认查询条件为:报警处理状态为未处理和处理中
+        pageQueryAlarmRecordDTO.setAlarmTreatState(Lists.newArrayList(
+                EnumAlarmTreatState.UN_HANDLE.getType(),
+                EnumAlarmTreatState.HANDLING.getType()
+        ));
+        return queryAlarmRecord(pageQueryAlarmRecordDTO);
+    }
+
+    /**
+     * 查询报警记录
+     *
+     * @param pageQueryAlarmRecordDTO 查询条件
+     * @return 报警记录列表(分页)
+     * @author lixing
+     * @version V1.0 2021/9/20 6:32 下午
+     */
+    private CommonResult<PageList<AlarmRecordListItem>> queryAlarmRecord(
+            PageQueryAlarmRecordDTO pageQueryAlarmRecordDTO) throws Exception {
+        // 根据查询条件获取关联的设备
+        List<String> relatedObjIds = getRelatedObjIds(pageQueryAlarmRecordDTO);
+        // 从报警数据中台查询报警记录
+        QueryDTO<QueryAlarmRecordDTO> queryDTO = new QueryDTO<>();
+        queryDTO.setPage(pageQueryAlarmRecordDTO.getPage());
+        queryDTO.setSize(pageQueryAlarmRecordDTO.getSize());
+        QueryAlarmRecordDTO queryAlarmRecordDTO = ConvertAlarmRecordTool.INSTANCE.
+                convert2QueryAlarmRecordDTO(pageQueryAlarmRecordDTO);
+        queryDTO.setCriteria(queryAlarmRecordDTO);
+        queryAlarmRecordDTO.setObjId(relatedObjIds);
+        // 如果没有传排序字段,默认根据报警开始时间倒序排列
+        List<Sort> orders = pageQueryAlarmRecordDTO.getOrders();
+        if (CollectionUtils.isEmpty(orders)) {
+            Sort sort = new Sort();
+            sort.setColumn("triggerTime");
+            sort.setAsc(false);
+            orders = Lists.newArrayList(sort);
+            pageQueryAlarmRecordDTO.setOrders(orders);
+        }
+        DmpResult<List<AlarmRecordItem>> query = alarmRecordService.query(queryAlarmRecordDTO);
+        // 报警数据中台查询结果转换为报警业务中台报警记录
+        List<AlarmRecordListItem> resultList = alarmRecordWrapper.getAlarmRecordListItems(query);
+        // 封装分页结果
+        IPage<AlarmRecordListItem> result = new Page<>();
+        result.setTotal(query.getCount());
+        result.setRecords(resultList);
+        return ResultHelper.multi(result);
+    }
 
-	@ApiOperation(value = "当前报警列表")
-	@PostMapping("/current_list")
-	public CommonResult<PageList<AlarmRecordListItem>> queryCurrentAlarmRecord(
-	        @Valid @RequestBody PageQueryAlarmRecordDTO pageQueryAlarmRecordDTO) {
-        List<AlarmRecordListItem> resultList = new ArrayList<>();
-        return ResultHelper.multi(resultList);
-	}
+
+    /**
+     * 获取关联的报警对象
+     *
+     * @param pageQueryAlarmRecordDTO 报警查询条件
+     * @return 关联的报警对象id列表
+     * @author lixing
+     * @version V1.0 2021/9/18 7:12 下午
+     */
+    private List<String> getRelatedObjIds(PageQueryAlarmRecordDTO pageQueryAlarmRecordDTO) {
+        // 如果查询条件中存在分组,查询分组下的设备
+        List<String> groupIdList = pageQueryAlarmRecordDTO.getGroupId();
+        String objName = pageQueryAlarmRecordDTO.getObjName();
+        objName = objName == null ? null : objName.trim();
+        /* 如果查询条件中包含项目id列表,使用查询条件中的项目查询
+         * 如果查询条件中没有分组信息,获取所有分组下的设备
+         */
+        List<String> projectIdList = pageQueryAlarmRecordDTO.getProjectIds();
+        if (CollectionUtils.isEmpty(projectIdList) && PoemsContext.getContext().getProjectId() != null) {
+            projectIdList = Lists.newArrayList(PoemsContext.getContext().getProjectId());
+        }
+
+        if (!CollectionUtils.isEmpty(groupIdList)) {
+            List<GroupTreeDetailVO> groupTreeDetailVOS = groupManagementService.queryAllLeafGroups();
+            groupIdList = groupTreeDetailVOS.stream().map(GroupTreeDetailVO::getId).collect(Collectors.toList());
+        }
+
+        List<GroupManagementVo> equipList = new ArrayList<>();
+
+        for (String groupId : groupIdList) {
+            GroupTreeDetailVO group = groupManagementService.getGroup(groupId);
+            // 查询分组下的设备
+            GroupManagementDTO groupManagementDTO = new GroupManagementDTO();
+            groupManagementDTO.setLocalName(objName);
+            groupManagementDTO.setClassCode(group.getClassCode());
+            groupManagementDTO.setCondition(group.getCondition());
+            // 如果项目id列表为空,查询分组下的所有设备
+            if (CollectionUtils.isEmpty(projectIdList)) {
+                equipList.addAll(groupManagementService.getEquipList(groupManagementDTO));
+            } else {
+                for (String projectId : projectIdList) {
+                    groupManagementDTO.setProjectId(projectId);
+                    equipList.addAll(groupManagementService.getEquipList(groupManagementDTO));
+                }
+            }
+        }
+
+        return equipList.stream().map(GroupManagementVo::getId).collect(Collectors.toList());
+    }
 
     @ApiOperation(value = "历史报警列表")
     @PostMapping("/history_list")
     public CommonResult<PageList<AlarmRecordListItem>> queryHistoryAlarmRecord(
-            @Valid @RequestBody PageQueryAlarmRecordDTO pageQueryAlarmRecordDTO) {
-        List<AlarmRecordListItem> resultList = new ArrayList<>();
-        return ResultHelper.multi(resultList);
+            @Valid @RequestBody PageQueryAlarmRecordDTO pageQueryAlarmRecordDTO) throws Exception {
+        // 历史报警的默认查询条件为:报警处理状态为处理完成
+        pageQueryAlarmRecordDTO.setAlarmTreatState(Lists.newArrayList(
+                EnumAlarmTreatState.DONE.getType()
+        ));
+        return queryAlarmRecord(pageQueryAlarmRecordDTO);
     }
 
     @ApiOperation(value = "已忽略报警列表")
     @PostMapping("/ignored_list")
     public CommonResult<PageList<AlarmRecordListItem>> queryIgnoredAlarmRecord(
-            @Valid @RequestBody PageQueryAlarmRecordDTO pageQueryAlarmRecordDTO) {
-        List<AlarmRecordListItem> resultList = new ArrayList<>();
-        return ResultHelper.multi(resultList);
+            @Valid @RequestBody PageQueryAlarmRecordDTO pageQueryAlarmRecordDTO) throws Exception {
+        // 历史报警的默认查询条件为:报警处理状态为已忽略
+        pageQueryAlarmRecordDTO.setAlarmTreatState(Lists.newArrayList(
+                EnumAlarmTreatState.IGNORE.getType()
+        ));
+        return queryAlarmRecord(pageQueryAlarmRecordDTO);
     }
 
     @ApiOperation(value = "关闭报警")
     @PostMapping("/close")
     public CommonResult<AlarmRecordIdsItem> closeAlarmRecord(
-            @Valid @RequestBody CloseAlarmRecordDTO closeAlarmRecordDTO) {
+            @Valid @RequestBody CloseAlarmRecordDTO closeAlarmRecordDTO) throws Exception {
+        // 报警处理方式更新为关闭报警,报警状态更新为已完成
+        String treatMode = EnumAlarmTreatMode.CLOSE.getType();
+        String treatState = EnumAlarmTreatState.DONE.getType();
+        List<String> recordIds = closeAlarmRecordDTO.getIds();
+
+        return updateAlarmRecordTreatState(treatMode, treatState, recordIds);
+    }
+
+    /**
+     * 更新报警记录处理状态
+     *
+     * @param treatMode  处理方式
+     * @param treatState 处理状态
+     * @param recordIds  报警记录id列表
+     * @return 报警记录id列表
+     * @author lixing
+     * @version V1.0 2021/9/20 7:25 下午
+     */
+    private CommonResult<AlarmRecordIdsItem> updateAlarmRecordTreatState(
+            String treatMode, String treatState, List<String> recordIds) throws Exception {
         AlarmRecordIdsItem alarmRecordIdsItem = new AlarmRecordIdsItem();
+
+        if (CollectionUtils.isEmpty(recordIds)) {
+            return ResultHelper.single(alarmRecordIdsItem);
+        }
+
+        List<UpdateAlarmRecordDTO> updateAlarmRecordDTOList = new ArrayList<>();
+        for (String recordId : recordIds) {
+            UpdateAlarmRecordDTO updateAlarmRecordDTO = new UpdateAlarmRecordDTO();
+            updateAlarmRecordDTO.setId(recordId);
+            updateAlarmRecordDTO.setTreatMode(Integer.valueOf(treatMode));
+            updateAlarmRecordDTO.setTreatState(Integer.valueOf(treatState));
+            updateAlarmRecordDTOList.add(updateAlarmRecordDTO);
+            alarmRecordIdsItem.setIds(recordIds);
+        }
+        BatchUpdateAlarmRecordDTO batchUpdateAlarmRecordDTO = new BatchUpdateAlarmRecordDTO();
+        batchUpdateAlarmRecordDTO.setAlarmRecords(updateAlarmRecordDTOList);
+
+        alarmRecordService.batchUpdate(batchUpdateAlarmRecordDTO);
         return ResultHelper.single(alarmRecordIdsItem);
     }
 
     @ApiOperation(value = "转工单")
     @PostMapping("/convert_work_order")
     public CommonResult<AlarmRecordIdsItem> alarmRecordConvertWorkOrder(
-            @Valid @RequestBody AlarmRecordConvertWorkOrderDTO alarmRecordConvertWorkOrderDTO) {
-        AlarmRecordIdsItem alarmRecordIdsItem = new AlarmRecordIdsItem();
-        return ResultHelper.single(alarmRecordIdsItem);
+            @Valid @RequestBody AlarmRecordConvertWorkOrderDTO alarmRecordConvertWorkOrderDTO) throws Exception {
+        // 报警处理方式更新为转工单,报警状态更新为处理中
+        String treatMode = EnumAlarmTreatMode.ORDER.getType();
+        String treatState = EnumAlarmTreatState.HANDLING.getType();
+        List<String> recordIds = alarmRecordConvertWorkOrderDTO.getIds();
+
+        return updateAlarmRecordTreatState(treatMode, treatState, recordIds);
     }
 
     @ApiOperation(value = "忽略")
     @PostMapping("/ignore")
     public CommonResult<AlarmRecordIdsItem> ignoreAlarmRecord(
-            @Valid @RequestBody IgnoreAlarmRecordDTO ignoreAlarmRecordDTO) {
-        AlarmRecordIdsItem alarmRecordIdsItem = new AlarmRecordIdsItem();
-        return ResultHelper.single(alarmRecordIdsItem);
+            @Valid @RequestBody IgnoreAlarmRecordDTO ignoreAlarmRecordDTO) throws Exception {
+        // 报警处理方式更新为忽略,报警状态更新为已忽略
+        String treatMode = EnumAlarmTreatMode.IGNORE.getType();
+        String treatState = EnumAlarmTreatState.IGNORE.getType();
+        List<String> recordIds = ignoreAlarmRecordDTO.getIds();
+
+        return updateAlarmRecordTreatState(treatMode, treatState, recordIds);
     }
 
     @ApiOperation(value = "报警详情")
     @PostMapping("/get")
-    public CommonResult<AlarmRecordItem> getAlarmRecord(
-            @Valid @RequestBody GetAlarmRecordDTO getAlarmRecordDTO) {
-        AlarmRecordItem alarmRecordItem = new AlarmRecordItem();
-        return ResultHelper.single(alarmRecordItem);
+    public CommonResult<AlarmRecordItemVO> getAlarmRecord(
+            @Valid @RequestBody GetAlarmRecordDTO getAlarmRecordDTO) throws Exception {
+        AlarmRecordItem alarmRecord = alarmRecordWrapper.getAlarmRecord(getAlarmRecordDTO.getId());
+        AlarmRecordItemVO alarmRecordItemVO = alarmRecordWrapper.convert2AlarmRecordItemVO(alarmRecord);
+        // 报警触发条件
+        return ResultHelper.single(alarmRecordItemVO);
     }
 
     @ApiOperation(value = "下载")

+ 62 - 0
src/main/java/com/persagy/apm/alarmservice/alarmrecord/enums/EnumAlarmCategory.java

@@ -0,0 +1,62 @@
+package com.persagy.apm.alarmservice.alarmrecord.enums;
+
+import com.persagy.apm.common.enums.AlarmDicTypeEnum;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.Setter;
+import org.apache.commons.lang.StringUtils;
+
+/**
+ * 报警系统
+ *
+ * @author lixing
+ * @version V1.0 2021/9/20 11:08 上午
+ **/
+@AllArgsConstructor
+public enum EnumAlarmCategory {
+    /**
+     * 报警系统
+     */
+    EQ("Eq", "设备报警"),
+    SP("Sp", "空间报警"),
+    SY("Sy", "系统报警"),
+    SAFE("Safe", "安全报警"),
+    RUN("Run", "高效运行报警"),
+    ENV("Env", "环境报警"),
+    ENERGY("Energy", "能源报警"),
+    TENANT("Tenant", "租户报警"),
+    ELECTRIC("Electric", "配电报警"),
+    CS("CS", "冷站能效报警"),
+    IOT("iot", "数据质量报警"),
+    BIM("Bim", "BIM报警"),
+    EQDX("Eqdx", "设备运行诊断报警");
+
+    @Setter
+    @Getter
+    private String type;
+
+    @Setter
+    @Getter
+    private String desc;
+
+    /**
+     * 根据type获取到枚举对象
+     *
+     * @param type 枚举type值
+     * @return 枚举对象
+     * @author lixing
+     * @version V1.0 2021/5/31 4:06 下午
+     */
+    public static EnumAlarmCategory getByType(String type) {
+        if (StringUtils.isBlank(type)) {
+            return null;
+        }
+        EnumAlarmCategory[] enums = EnumAlarmCategory.values();
+        for (EnumAlarmCategory item : enums) {
+            if (type.equals(item.getType())) {
+                return item;
+            }
+        }
+        return null;
+    }
+}

+ 51 - 0
src/main/java/com/persagy/apm/alarmservice/alarmrecord/enums/EnumAlarmLevel.java

@@ -0,0 +1,51 @@
+package com.persagy.apm.alarmservice.alarmrecord.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.Setter;
+import org.apache.commons.lang.StringUtils;
+
+/**
+ * 报警等级
+ *
+ * @author lixing
+ * @version V1.0 2021/9/20 11:08 上午
+ **/
+@AllArgsConstructor
+public enum EnumAlarmLevel {
+    /**
+     * 报警等级
+     */
+    S("1", "高"),
+    A("2", "中"),
+    B("3", "低");
+
+    @Setter
+    @Getter
+    private String type;
+
+    @Setter
+    @Getter
+    private String desc;
+
+    /**
+     * 根据type获取到枚举对象
+     *
+     * @param type 枚举type值
+     * @return 枚举对象
+     * @author lixing
+     * @version V1.0 2021/5/31 4:06 下午
+     */
+    public static EnumAlarmLevel getByType(String type) {
+        if (StringUtils.isBlank(type)) {
+            return null;
+        }
+        EnumAlarmLevel[] enums = EnumAlarmLevel.values();
+        for (EnumAlarmLevel item : enums) {
+            if (type.equals(item.getType())) {
+                return item;
+            }
+        }
+        return null;
+    }
+}

+ 51 - 0
src/main/java/com/persagy/apm/alarmservice/alarmrecord/enums/EnumAlarmNature.java

@@ -0,0 +1,51 @@
+package com.persagy.apm.alarmservice.alarmrecord.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.Setter;
+import org.apache.commons.lang.StringUtils;
+
+/**
+ * 报警性质
+ *
+ * @author lixing
+ * @version V1.0 2021/9/20 11:08 上午
+ **/
+@AllArgsConstructor
+public enum EnumAlarmNature {
+    /**
+     * 报警性质
+     */
+    MISTAKE("1", "误报"),
+    TRUE("2", "真实报警"),
+    TEST("3", "测试报警");
+
+    @Setter
+    @Getter
+    private String type;
+
+    @Setter
+    @Getter
+    private String desc;
+
+    /**
+     * 根据type获取到枚举对象
+     *
+     * @param type 枚举type值
+     * @return 枚举对象
+     * @author lixing
+     * @version V1.0 2021/5/31 4:06 下午
+     */
+    public static EnumAlarmNature getByType(String type) {
+        if (StringUtils.isBlank(type)) {
+            return null;
+        }
+        EnumAlarmNature[] enums = EnumAlarmNature.values();
+        for (EnumAlarmNature item : enums) {
+            if (type.equals(item.getType())) {
+                return item;
+            }
+        }
+        return null;
+    }
+}

+ 51 - 0
src/main/java/com/persagy/apm/alarmservice/alarmrecord/enums/EnumAlarmState.java

@@ -0,0 +1,51 @@
+package com.persagy.apm.alarmservice.alarmrecord.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.Setter;
+import org.apache.commons.lang.StringUtils;
+
+/**
+ * 报警状态
+ *
+ * @author lixing
+ * @version V1.0 2021/9/20 11:08 上午
+ **/
+@AllArgsConstructor
+public enum EnumAlarmState {
+    /**
+     * 报警状态
+     */
+    UN_HANDLE("1", "未恢复"),
+    END("2", "已恢复"),
+    EXPIRE("3", "已过期");
+
+    @Setter
+    @Getter
+    private String type;
+
+    @Setter
+    @Getter
+    private String desc;
+
+    /**
+     * 根据type获取到枚举对象
+     *
+     * @param type 枚举type值
+     * @return 枚举对象
+     * @author lixing
+     * @version V1.0 2021/5/31 4:06 下午
+     */
+    public static EnumAlarmState getByType(String type) {
+        if (StringUtils.isBlank(type)) {
+            return null;
+        }
+        EnumAlarmState[] enums = EnumAlarmState.values();
+        for (EnumAlarmState item : enums) {
+            if (type.equals(item.getType())) {
+                return item;
+            }
+        }
+        return null;
+    }
+}

+ 51 - 0
src/main/java/com/persagy/apm/alarmservice/alarmrecord/enums/EnumAlarmTreatMode.java

@@ -0,0 +1,51 @@
+package com.persagy.apm.alarmservice.alarmrecord.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.Setter;
+import org.apache.commons.lang.StringUtils;
+
+/**
+ * 报警处理方式
+ *
+ * @author lixing
+ * @version V1.0 2021/9/20 11:08 上午
+ **/
+@AllArgsConstructor
+public enum EnumAlarmTreatMode {
+    /**
+     * 报警处理方式
+     */
+    IGNORE("1", "忽略"),
+    ORDER("2", "转工单"),
+    CLOSE("3", "关闭报警");
+
+    @Setter
+    @Getter
+    private String type;
+
+    @Setter
+    @Getter
+    private String desc;
+
+    /**
+     * 根据type获取到枚举对象
+     *
+     * @param type 枚举type值
+     * @return 枚举对象
+     * @author lixing
+     * @version V1.0 2021/5/31 4:06 下午
+     */
+    public static EnumAlarmTreatMode getByType(String type) {
+        if (StringUtils.isBlank(type)) {
+            return null;
+        }
+        EnumAlarmTreatMode[] enums = EnumAlarmTreatMode.values();
+        for (EnumAlarmTreatMode item : enums) {
+            if (type.equals(item.getType())) {
+                return item;
+            }
+        }
+        return null;
+    }
+}

+ 53 - 0
src/main/java/com/persagy/apm/alarmservice/alarmrecord/enums/EnumAlarmTreatState.java

@@ -0,0 +1,53 @@
+package com.persagy.apm.alarmservice.alarmrecord.enums;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.Setter;
+import org.apache.commons.lang.StringUtils;
+
+/**
+ * 报警处理状态
+ *
+ * @author lixing
+ * @version V1.0 2021/9/20 11:08 上午
+ **/
+@AllArgsConstructor
+public enum EnumAlarmTreatState {
+    /**
+     * 报警处理状态
+     */
+    UN_HANDLE("1", "未处理"),
+    HANDLING("2", "处理中"),
+    DONE("3", "处理完成"),
+    // 用于兼容子系统业务,后期会移除该状态
+    IGNORE("4", "已忽略");
+
+    @Setter
+    @Getter
+    private String type;
+
+    @Setter
+    @Getter
+    private String desc;
+
+    /**
+     * 根据type获取到枚举对象
+     *
+     * @param type 枚举type值
+     * @return 枚举对象
+     * @author lixing
+     * @version V1.0 2021/5/31 4:06 下午
+     */
+    public static EnumAlarmTreatState getByType(String type) {
+        if (StringUtils.isBlank(type)) {
+            return null;
+        }
+        EnumAlarmTreatState[] enums = EnumAlarmTreatState.values();
+        for (EnumAlarmTreatState item : enums) {
+            if (type.equals(item.getType())) {
+                return item;
+            }
+        }
+        return null;
+    }
+}

+ 31 - 0
src/main/java/com/persagy/apm/alarmservice/alarmrecord/model/ConvertAlarmRecordTool.java

@@ -0,0 +1,31 @@
+package com.persagy.apm.alarmservice.alarmrecord.model;
+
+import com.persagy.apm.alarmservice.alarmcondition.model.ConvertAlarmConditionTool;
+import com.persagy.apm.alarmservice.alarmrecord.model.dto.PageQueryAlarmRecordDTO;
+import com.persagy.apm.alarmservice.alarmrecord.model.vo.AlarmRecordListItem;
+import com.persagy.apm.energyalarmstarter.alarmdata.model.dto.alarmrecord.QueryAlarmRecordDTO;
+import com.persagy.apm.energyalarmstarter.alarmdata.model.vo.AlarmRecordItem;
+import org.mapstruct.*;
+import org.mapstruct.factory.Mappers;
+
+/**
+ * 报警记录(AlarmRecord) dto、vo、do转换工具类
+ * @author lixing
+ * @version V1.0 2021-09-08 22:30:38
+ */
+@Mapper(nullValueMappingStrategy = NullValueMappingStrategy.RETURN_DEFAULT,
+        nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)
+public interface ConvertAlarmRecordTool {
+    ConvertAlarmRecordTool INSTANCE = Mappers.getMapper(ConvertAlarmRecordTool.class);
+
+    @Mappings({
+            @Mapping(source = "alarmLevel", target = "level"),
+            @Mapping(source = "triggerStartTime", target = "triggerDurationStart"),
+            @Mapping(source = "triggerEndTime", target = "triggerDurationEnd"),
+            @Mapping(source = "alarmItemCode", target = "itemCode"),
+            @Mapping(source = "alarmState", target = "state"),
+            @Mapping(source = "alarmTreatState", target = "treatState"),
+            @Mapping(source = "alarmTreatMode", target = "treatMode"),
+    })
+    QueryAlarmRecordDTO convert2QueryAlarmRecordDTO(PageQueryAlarmRecordDTO pageQueryAlarmRecordDTO);
+}

+ 4 - 0
src/main/java/com/persagy/apm/alarmservice/alarmrecord/model/dto/PageQueryAlarmRecordDTO.java

@@ -35,4 +35,8 @@ public class PageQueryAlarmRecordDTO extends PageDTO {
     private List<String> alarmTreatState;
     @ApiModelProperty(value = "报警处理方式")
     private List<String> alarmTreatMode;
+    @ApiModelProperty(value = "报警系统")
+    private List<String> category;
+    @ApiModelProperty(value = "项目id")
+    private List<String> projectIds;
 }

+ 1 - 1
src/main/java/com/persagy/apm/alarmservice/alarmrecord/model/vo/AlarmRecordItem.java

@@ -19,7 +19,7 @@ import java.util.List;
 @Data
 @ApiModel
 @JsonInclude(JsonInclude.Include.NON_NULL)
-public class AlarmRecordItem {
+public class AlarmRecordItemVO {
     @ApiModelProperty(value = "id")
     private String id;
     @ApiModelProperty(value = "分组")

+ 1 - 1
src/main/java/com/persagy/apm/alarmservice/alarmrecord/model/vo/AlarmRecordListItem.java

@@ -29,7 +29,7 @@ public class AlarmRecordListItem {
     private SimpleObjVO alarmItem;
     @ApiModelProperty(value = "报警触发时间")
     private Date triggerTime;
-    @ApiModelProperty(value = "报警持续时长")
+    @ApiModelProperty(value = "报警持续时长(小时)")
     private String duration;
     @ApiModelProperty(value = "报警等级")
     private SimpleObjVO alarmLevel;

+ 341 - 0
src/main/java/com/persagy/apm/alarmservice/alarmrecord/service/AlarmRecordWrapper.java

@@ -0,0 +1,341 @@
+package com.persagy.apm.alarmservice.alarmrecord.service;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.persagy.apm.alarmservice.alarmcondition.model.vo.AlarmConditionStrItem;
+import com.persagy.apm.alarmservice.alarmrecord.enums.EnumAlarmLevel;
+import com.persagy.apm.alarmservice.alarmrecord.enums.EnumAlarmState;
+import com.persagy.apm.alarmservice.alarmrecord.enums.EnumAlarmTreatMode;
+import com.persagy.apm.alarmservice.alarmrecord.enums.EnumAlarmTreatState;
+import com.persagy.apm.alarmservice.alarmrecord.model.vo.AlarmRecordItemVO;
+import com.persagy.apm.alarmservice.alarmrecord.model.vo.AlarmRecordListItem;
+import com.persagy.apm.alarmservice.group.management.model.GroupManagement;
+import com.persagy.apm.alarmservice.group.management.service.GroupManagementService;
+import com.persagy.apm.common.model.vo.SimpleObjVO;
+import com.persagy.apm.energyalarmstarter.alarmdata.feign.DmpResult;
+import com.persagy.apm.energyalarmstarter.alarmdata.model.dto.alarmitem.QueryAlarmItemDTO;
+import com.persagy.apm.energyalarmstarter.alarmdata.model.dto.alarmrecord.QueryAlarmRecordDTO;
+import com.persagy.apm.energyalarmstarter.alarmdata.model.vo.AlarmItem;
+import com.persagy.apm.energyalarmstarter.alarmdata.model.vo.AlarmRecordItem;
+import com.persagy.apm.energyalarmstarter.alarmdata.service.AlarmItemServiceImpl;
+import com.persagy.apm.energyalarmstarter.alarmdata.service.AlarmRecordServiceImpl;
+import com.persagy.apm.energyalarmstarter.alarmdata.utils.DateUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.assertj.core.util.Lists;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 报警记录包装类,提供对报警相关字段的转换方法
+ *
+ * @author lixing
+ * @version V1.0 2021/9/20 4:29 下午
+ **/
+@Service
+public class AlarmRecordWrapper {
+    @Autowired
+    AlarmItemServiceImpl alarmItemService;
+    @Autowired
+    GroupManagementService groupManagementService;
+    @Autowired
+    AlarmRecordServiceImpl alarmRecordService;
+
+    /**
+     * 获取报警类型编码和名称的映射
+     *
+     * @param itemCodes 报警类型编码列表
+     * @return 报警类型编码 -> simpleObjVO(id, name)
+     * @throws
+     * @author lixing
+     * @version V1.0 2021/9/20 4:31 下午
+     */
+    public Map<String, SimpleObjVO> getAlarmItemMap(List<String> itemCodes) throws Exception {
+        Map<String, SimpleObjVO> alarmItemMap = new HashMap<>();
+        QueryAlarmItemDTO queryAlarmItemDTO = new QueryAlarmItemDTO();
+        queryAlarmItemDTO.setCode(itemCodes);
+        DmpResult<List<AlarmItem>> alarmItemsResult = alarmItemService.query(queryAlarmItemDTO);
+        List<AlarmItem> alarmItems = alarmItemsResult.getData();
+        if (CollectionUtils.isEmpty(alarmItems)) {
+
+        }
+        alarmItemMap.putAll(alarmItems.stream().collect(Collectors.toMap(
+                AlarmItem::getId,
+                alarmItem -> new SimpleObjVO(alarmItem.getId(), alarmItem.getName()),
+                (k1, k2) -> k1
+        )));
+        return alarmItemMap;
+    }
+
+    /**
+     * 获取两个时间的时间间隔(小时)
+     *
+     * @param triggerTime 触发时间
+     * @param endTime     结束时间
+     * @return 两个时间的时间间隔(小时)
+     * @author lixing
+     * @version V1.0 2021/9/20 4:45 下午
+     */
+    public static String getAlarmDuration(Date triggerTime, Date endTime) {
+        if (endTime == null) {
+            endTime = new Date();
+        }
+        if (triggerTime == null) {
+            return null;
+        }
+
+        long durationNs = endTime.getTime() - triggerTime.getTime();
+        // ns/1000=s s/60=min min/60=hour
+        long durationHour = durationNs / (1000 * 60 * 60);
+        // 保留两位小数
+        BigDecimal bd = new BigDecimal(durationHour);
+        bd = bd.setScale(2, RoundingMode.HALF_UP);
+        return bd.toString();
+    }
+
+    /**
+     * 将报警数据中台的查询结果转换为报警服务中台的报警记录列表
+     *
+     * @param dmpResult 报警数据中台的查询结果
+     * @return 报警服务中台的报警记录列表
+     * @author lixing
+     * @version V1.0 2021/9/20 6:16 下午
+     */
+    public List<AlarmRecordListItem> getAlarmRecordListItems(DmpResult<List<AlarmRecordItem>> dmpResult) throws Exception {
+        // 获取查询结果中的设备
+        List<String> objIds = dmpResult.getData().stream().map(AlarmRecordItem::getObjId).collect(Collectors.toList());
+        // 获取这些设备所在的分组信息
+        Map<String, SimpleObjVO> objGroupMap = groupManagementService.queryObjGroup(objIds);
+        // 获取这些设备的名称
+        Map<String, GroupManagement> objMap = groupManagementService.queryEquipsByIds(objIds);
+        if (CollectionUtils.isEmpty(dmpResult.getData())) {
+            return new ArrayList<>();
+        }
+        // 获取查询结果中的报警类型
+        List<String> itemCodes = dmpResult.getData().stream().map(AlarmRecordItem::getItemCode).
+                collect(Collectors.toList());
+        Map<String, SimpleObjVO> alarmItemMap = getAlarmItemMap(itemCodes);
+
+        return dmpResult.getData().stream().map(alarmRecordItem ->
+                getAlarmRecordListItem(objGroupMap, objMap, alarmItemMap, alarmRecordItem)).
+                collect(Collectors.toList());
+    }
+
+    /**
+     * 将报警数据中台返回的一条记录转换为报警服务中台报警记录列表中的一条数据
+     *
+     * @param objGroupMap     报警对象id和分组的映射关系
+     * @param objMap          报警对象id和报警对象的映射关系
+     * @param alarmItemMap    报警类型编码和报警类型的映射关系
+     * @param alarmRecordItem 报警数据中台返回的一条报警记录
+     * @return 报警服务中台报警记录列表中的一条数据
+     * @author lixing
+     * @version V1.0 2021/9/20 6:21 下午
+     */
+    private AlarmRecordListItem getAlarmRecordListItem(
+            Map<String, SimpleObjVO> objGroupMap,
+            Map<String, GroupManagement> objMap,
+            Map<String, SimpleObjVO> alarmItemMap,
+            AlarmRecordItem alarmRecordItem) {
+        AlarmRecordListItem alarmRecordListItem = new AlarmRecordListItem();
+        alarmRecordListItem.setId(alarmRecordItem.getId());
+        alarmRecordListItem.setGroup(objGroupMap.get(alarmRecordItem.getObjId()));
+        GroupManagement objInfo = objMap.get(alarmRecordItem.getObjId());
+        alarmRecordListItem.setObj(new SimpleObjVO(alarmRecordItem.getObjId(),
+                objInfo == null ? null : objInfo.getLocalName()));
+        alarmRecordListItem.setAlarmItem(alarmItemMap.get(alarmRecordItem.getItemCode()));
+        alarmRecordListItem.setTriggerTime(alarmRecordItem.getTriggerTime());
+        // 计算报警的持续时长
+        alarmRecordListItem.setDuration(
+                AlarmRecordWrapper.getAlarmDuration(
+                        alarmRecordItem.getTriggerTime(),
+                        alarmRecordItem.getEndTime()
+                )
+        );
+        EnumAlarmLevel alarmLevel = EnumAlarmLevel.getByType(alarmRecordItem.getLevel());
+        if (alarmLevel != null) {
+            alarmRecordListItem.setAlarmLevel(new SimpleObjVO(
+                    alarmLevel.getType(), alarmLevel.getDesc()
+            ));
+        }
+
+        EnumAlarmState alarmState = EnumAlarmState.getByType(
+                String.valueOf(alarmRecordItem.getState()));
+        if (alarmState != null) {
+            alarmRecordListItem.setAlarmState(new SimpleObjVO(
+                    alarmState.getType(), alarmState.getDesc()
+            ));
+        }
+
+        EnumAlarmTreatState alarmTreatState = EnumAlarmTreatState.getByType(
+                String.valueOf(alarmRecordItem.getTreatState()));
+        if (alarmTreatState != null) {
+            alarmRecordListItem.setAlarmTreatState(new SimpleObjVO(
+                    alarmTreatState.getType(), alarmTreatState.getDesc()
+            ));
+        }
+
+        EnumAlarmTreatMode alarmTreatMode = EnumAlarmTreatMode.getByType(
+                String.valueOf(alarmRecordItem.getTreatMode()));
+        if (alarmTreatMode != null) {
+            alarmRecordListItem.setAlarmTreatMode(new SimpleObjVO(
+                    alarmTreatMode.getType(), alarmTreatMode.getDesc()
+            ));
+        }
+
+        return alarmRecordListItem;
+    }
+
+    /**
+     * 查看报警记录详情
+     *
+     * @param recordId 报警记录id
+     * @return 报警记录详情
+     * @author lixing
+     * @version V1.0 2021/9/21 3:54 下午
+     */
+    public AlarmRecordItem getAlarmRecord(String recordId) throws Exception {
+        QueryAlarmRecordDTO queryAlarmRecordDTO = new QueryAlarmRecordDTO();
+        queryAlarmRecordDTO.setId(Lists.newArrayList(recordId));
+        DmpResult<List<AlarmRecordItem>> result = alarmRecordService.query(queryAlarmRecordDTO);
+        if (result == null) {
+            return null;
+        }
+        List<AlarmRecordItem> data = result.getData();
+        if (CollectionUtils.isEmpty(data)) {
+            return null;
+        }
+        return data.get(0);
+    }
+
+    /**
+     * 将报警数据中台的报警记录封装为业务中台的报警记录对象
+     *
+     * @param alarmRecordItem 数据中台的报警记录
+     * @return 业务中台的报警记录对象
+     * @author lixing
+     * @version V1.0 2021/9/21 5:44 下午
+     */
+    public AlarmRecordItemVO convert2AlarmRecordItemVO(AlarmRecordItem alarmRecordItem) throws Exception {
+        if (alarmRecordItem == null) {
+            return null;
+        }
+        AlarmRecordItemVO alarmRecordItemVO = new AlarmRecordItemVO();
+        /* 报警基本信息 */
+        copyBasicInfo(alarmRecordItem, alarmRecordItemVO);
+        /* 报警条件 */
+        JSONObject condition = alarmRecordItem.getCondition();
+        AlarmConditionStrItem alarmConditionStrItem = new AlarmConditionStrItem();
+        // 报警规则
+        String rules = condition.getString("rules");
+        List<String> rulesList = JSONArray.parseArray(rules, String.class);
+        alarmConditionStrItem.setRules(rulesList);
+        // 报警触发时间转换为分钟
+        Integer triggerUphold = condition.getInteger("triggerUphold");
+        if (triggerUphold != null) {
+            triggerUphold = triggerUphold / 60;
+        }
+        String lastTimeInfo = "持续%s分钟满足报警触发规则,则产生报警";
+        alarmConditionStrItem.setLastTimeInfo(
+                String.format(lastTimeInfo, triggerUphold == null ? "--" : triggerUphold));
+        EnumAlarmLevel alarmLevel = EnumAlarmLevel.getByType(alarmRecordItem.getLevel());
+        if (alarmLevel != null) {
+            alarmConditionStrItem.setAlarmLevel(new SimpleObjVO(
+                    alarmLevel.getType(), alarmLevel.getDesc()
+            ));
+        }
+        alarmRecordItemVO.setAlarmCondition(alarmConditionStrItem);
+        return alarmRecordItemVO;
+    }
+
+    /**
+     * 将报警数据中台报警对象的基本信息复制到报警业务中台报警对象
+     *
+     * @param alarmRecordItem   报警数据中台报警对象
+     * @param alarmRecordItemVO 报警业务中台报警对象
+     * @author lixing
+     * @version V1.0 2021/9/22 3:41 下午
+     */
+    public void copyBasicInfo(AlarmRecordItem alarmRecordItem, AlarmRecordItemVO alarmRecordItemVO) throws Exception {
+        alarmRecordItemVO.setId(alarmRecordItem.getId());
+        Map<String, SimpleObjVO> objGroupMap = groupManagementService.queryObjGroup(
+                Lists.newArrayList(alarmRecordItem.getObjId()));
+        alarmRecordItemVO.setGroup(objGroupMap.get(alarmRecordItem.getObjId()));
+        // 获取这些设备的名称
+        Map<String, GroupManagement> objMap = groupManagementService.queryEquipsByIds(
+                Lists.newArrayList(alarmRecordItem.getObjId())
+        );
+        GroupManagement objInfo = objMap.get(alarmRecordItem.getObjId());
+        alarmRecordItemVO.setObj(new SimpleObjVO(alarmRecordItem.getObjId(),
+                objInfo == null ? null : objInfo.getLocalName()));
+        // 报警类型
+        Map<String, SimpleObjVO> alarmItemMap = getAlarmItemMap(Lists.newArrayList(alarmRecordItem.getItemCode()));
+        SimpleObjVO simpleObjVO = alarmItemMap.get(alarmRecordItem.getItemCode());
+        alarmRecordItemVO.setAlarmItem(simpleObjVO);
+
+        alarmRecordItemVO.setTriggerTime(alarmRecordItem.getTriggerTime());
+        alarmRecordItemVO.setEndTime(alarmRecordItem.getEndTime());
+        alarmRecordItemVO.setDuration(getAlarmDuration(alarmRecordItem.getTriggerTime(), alarmRecordItem.getEndTime()));
+
+        EnumAlarmLevel alarmLevel = EnumAlarmLevel.getByType(alarmRecordItem.getLevel());
+        if (alarmLevel != null) {
+            alarmRecordItemVO.setAlarmLevel(new SimpleObjVO(
+                    alarmLevel.getType(), alarmLevel.getDesc()
+            ));
+        }
+
+        EnumAlarmState alarmState = EnumAlarmState.getByType(
+                String.valueOf(alarmRecordItem.getState()));
+        if (alarmState != null) {
+            alarmRecordItemVO.setAlarmState(new SimpleObjVO(
+                    alarmState.getType(), alarmState.getDesc()
+            ));
+        }
+
+        EnumAlarmTreatState alarmTreatState = EnumAlarmTreatState.getByType(
+                String.valueOf(alarmRecordItem.getTreatState()));
+        if (alarmTreatState != null) {
+            alarmRecordItemVO.setAlarmTreatState(new SimpleObjVO(
+                    alarmTreatState.getType(), alarmTreatState.getDesc()
+            ));
+        }
+
+        EnumAlarmTreatMode alarmTreatMode = EnumAlarmTreatMode.getByType(
+                String.valueOf(alarmRecordItem.getTreatMode()));
+        if (alarmTreatMode != null) {
+            alarmRecordItemVO.setAlarmTreatMode(new SimpleObjVO(
+                    alarmTreatMode.getType(), alarmTreatMode.getDesc()
+            ));
+        }
+        /* 近30天报警触发次数 */
+        Integer count = getAlarmCountInMonth(alarmRecordItem.getTriggerTime(), alarmRecordItem.getItemCode());
+        alarmRecordItemVO.setAlarmCountInMonth(count);
+    }
+
+    /**
+     * 指定报警类型在指定日期前一个月内发生报警的次数
+     *
+     * @param date     指定日期
+     * @param itemCode 指定报警类型
+     * @return 发生报警的次数
+     * @author lixing
+     * @version V1.0 2021/9/22 3:43 下午
+     */
+    public Integer getAlarmCountInMonth(Date date, String itemCode) throws Exception {
+        if (date == null || StringUtils.isBlank(itemCode)) {
+            return 0;
+        }
+        QueryAlarmRecordDTO queryAlarmRecordDTO = new QueryAlarmRecordDTO();
+        queryAlarmRecordDTO.setTriggerDurationStart(
+                DateUtils.getMonthOff(date, -1));
+        queryAlarmRecordDTO.setTriggerDurationEnd(date);
+        queryAlarmRecordDTO.setItemCode(Lists.newArrayList(itemCode));
+        return alarmRecordService.queryCount(queryAlarmRecordDTO);
+    }
+
+}

+ 10 - 0
src/main/java/com/persagy/apm/alarmservice/calculatemethod/service/ICalculateMethodService.java

@@ -72,4 +72,14 @@ public interface ICalculateMethodService  {
     * @version V1.0 2021-09-08 22:43:58
     */
     public IPage<CalculateMethod> pageQueryCalculateMethod(PageQueryCalculateMethodDTO pageQueryCalculateMethodDTO);
+
+    /**
+     * 获取计算方式名称
+     *
+     * @param calculateMethodId 计算方式id
+     * @return 计算方式名称
+     * @author lixing
+     * @version V1.0 2021/9/17 9:46 下午
+     */
+    String getMethodName(String calculateMethodId);
 }

+ 9 - 0
src/main/java/com/persagy/apm/alarmservice/calculatemethod/service/impl/CalculateMethodServiceImpl.java

@@ -206,4 +206,13 @@ public class CalculateMethodServiceImpl extends ServiceImpl<CalculateMethodMappe
                                     
         return getBaseMapper().selectPage(pageParam, queryWrapper);
     }
+
+    @Override
+    public String getMethodName(String calculateMethodId) {
+        if (StringUtils.isBlank(calculateMethodId)) {
+            return null;
+        }
+        CalculateMethod calculateMethod = queryCalculateMethodDetail(calculateMethodId);
+        return calculateMethod.getName();
+    }
 }

+ 15 - 11
src/main/java/com/persagy/apm/alarmservice/group/alarmrule/controller/GroupAlarmRuleController.java

@@ -1,26 +1,30 @@
 package com.persagy.apm.alarmservice.group.alarmrule.controller;
 
-import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.persagy.apm.alarmservice.alarmcondition.service.IAlarmConditionService;
 import com.persagy.apm.alarmservice.group.alarmrule.dao.GroupAlarmRuleMapper;
+import com.persagy.apm.alarmservice.group.alarmrule.model.ConvertGroupAlarmRuleTool;
+import com.persagy.apm.alarmservice.group.alarmrule.model.GroupAlarmRule;
+import com.persagy.apm.alarmservice.group.alarmrule.model.dto.*;
+import com.persagy.apm.alarmservice.group.alarmrule.model.vo.GroupAlarmRuleItemVO;
+import com.persagy.apm.alarmservice.group.alarmrule.model.vo.GroupAlarmRuleListItemVO;
 import com.persagy.apm.alarmservice.group.alarmrule.service.IGroupAlarmRuleService;
-
 import com.persagy.apm.alarmservice.project.alarmruleobjrel.service.IProjectAlarmRuleObjRelService;
+import com.persagy.apm.common.response.ApmResponseUpsertVO;
+import com.persagy.apm.common.response.CommonResult;
+import com.persagy.apm.common.response.PageList;
+import com.persagy.apm.common.utils.ResultHelper;
 import com.persagy.apm.energyalarmstarter.alarmdata.feign.DmpResult;
-import com.persagy.apm.energyalarmstarter.alarmdata.model.dto.common.QueryAlarmConfigDTO;
+import com.persagy.apm.energyalarmstarter.alarmdata.model.dto.alarmconfig.QueryAlarmConfigDTO;
 import com.persagy.apm.energyalarmstarter.alarmdata.model.vo.AlarmConfigItem;
 import com.persagy.apm.energyalarmstarter.alarmdata.service.AlarmConfigServiceImpl;
-import org.springframework.beans.factory.annotation.Autowired;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
-import io.swagger.annotations.ApiParam;
-import com.persagy.apm.alarmservice.group.alarmrule.model.*;
-import com.persagy.apm.alarmservice.group.alarmrule.model.vo.*;
-import com.persagy.apm.alarmservice.group.alarmrule.model.dto.*;
-import com.persagy.apm.common.response.*;
-import com.persagy.apm.common.utils.ResultHelper;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
 import springfox.documentation.annotations.ApiIgnore;
 
 import javax.validation.Valid;

+ 2 - 29
src/main/java/com/persagy/apm/alarmservice/group/management/controller/GroupManagementController.java

@@ -48,39 +48,12 @@ public class GroupManagementController {
         return ResultHelper.single(getGroupTree());
     }
 
-    
-    @ApiOperation(value = "获取分组名称")
+    @ApiOperation(value = "获取分组信息")
     @PostMapping("/eq_groups/get")
     public CommonResult<GroupTreeDetailVO> queryTreeById(@Valid @RequestBody EquipIdDTO equipIdDTO){
-        List<GroupTreeVO> groupTreeVOList = getGroupTree();
-        GroupTreeDetailVO groupTreeDetailVO = new GroupTreeDetailVO();
-        return ResultHelper.single(queryById(groupTreeVOList, groupTreeDetailVO, equipIdDTO.getId()));
+        return ResultHelper.single(managementService.getGroup(equipIdDTO.getId()));
     }
     
-    /**
-     * 递归匹配符合条件的分组对象
-     * @param groupTreeVOList
-     * @param id
-     * @author 易涛
-     * @date 2021/9/8 14:50 
-     * @return com.persagy.apm.alarmservice.group.management.model.vo.GroupTreeVO
-     */
-    private GroupTreeDetailVO queryById(List<GroupTreeVO> groupTreeVOList,GroupTreeDetailVO groupTreeDetailVO,String id){
-        for(GroupTreeVO groupTreeVO:groupTreeVOList){
-            if(StringUtils.isNotEmpty(groupTreeDetailVO.getId())){
-                return groupTreeDetailVO;
-            }
-            if(Objects.equals(groupTreeVO.getId(),id)){
-                BeanUtils.copyProperties(groupTreeVO,groupTreeDetailVO);
-                return groupTreeDetailVO;
-            }
-            if(CollectionUtils.isNotEmpty(groupTreeVO.getChildren())){
-                queryById(groupTreeVO.getChildren(),groupTreeDetailVO,id);
-            }
-        }
-        return groupTreeDetailVO;
-    }
-
     @ApiOperation(value = "分组条件(设备类+查询条件)+项目 获取设备  加上分页和根据设备名称查询")
     @PostMapping("/equips/query")
     public CommonResult<PageList<GroupManagementVo>> equipsQuery(@RequestBody GroupManagementDTO managementDTO){

+ 33 - 0
src/main/java/com/persagy/apm/alarmservice/group/management/model/ConvertGroupTool.java

@@ -0,0 +1,33 @@
+package com.persagy.apm.alarmservice.group.management.model;
+
+import com.persagy.apm.alarmservice.alarmcondition.model.AlarmCondition;
+import com.persagy.apm.alarmservice.alarmcondition.model.ConvertAlarmConditionTool;
+import com.persagy.apm.alarmservice.alarmcondition.model.vo.AlarmConditionItemVO;
+import com.persagy.apm.alarmservice.group.management.model.vo.GroupTreeDetailVO;
+import com.persagy.apm.alarmservice.group.management.model.vo.GroupTreeVO;
+import org.mapstruct.Mapper;
+import org.mapstruct.NullValueCheckStrategy;
+import org.mapstruct.NullValueMappingStrategy;
+import org.mapstruct.factory.Mappers;
+
+/**
+ * 分组转换工具类
+ *
+ * @author lixing
+ * @version V1.0 2021-09-08 22:30:38
+ */
+@Mapper(nullValueMappingStrategy = NullValueMappingStrategy.RETURN_DEFAULT,
+        nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)
+public interface ConvertGroupTool {
+    ConvertGroupTool INSTANCE = Mappers.getMapper(ConvertGroupTool.class);
+
+    /**
+     * 分组树节点对象转换为分组树节点详情对象
+     *
+     * @param groupTreeVO 分组树节点对象
+     * @return 分组树节点详情对象
+     * @author lixing
+     * @version V1.0 2021/9/19 1:25 下午
+     */
+    GroupTreeDetailVO convert2DetailDTO(GroupTreeVO groupTreeVO);
+}

+ 2 - 0
src/main/java/com/persagy/apm/alarmservice/group/management/model/GroupManagement.java

@@ -10,6 +10,8 @@ import org.springframework.data.elasticsearch.annotations.Setting;*/
 import java.time.LocalDateTime;
 
 /**
+ * 设备信息
+ *
  * @author 易涛
  * @version 1.0
  * @date 2021/9/7 18:11

+ 1 - 1
src/main/java/com/persagy/apm/alarmservice/group/management/model/vo/GroupTreeInfoVO.java

@@ -15,6 +15,6 @@ import lombok.EqualsAndHashCode;
 @EqualsAndHashCode(callSuper = true)
 public class GroupTreeInfoVO extends GroupTreeDetailVO{
 
-    @ApiModelProperty("分组id")
+    @ApiModelProperty("设备id")
     private String equipId;
 }

+ 59 - 2
src/main/java/com/persagy/apm/alarmservice/group/management/service/GroupManagementService.java

@@ -1,13 +1,15 @@
 package com.persagy.apm.alarmservice.group.management.service;
 
+import com.persagy.apm.alarmservice.group.management.model.GroupManagement;
 import com.persagy.apm.alarmservice.group.management.model.vo.GroupTreeDetailVO;
 import com.persagy.apm.alarmservice.group.management.model.vo.GroupTreeInfoVO;
+import com.persagy.apm.common.model.vo.SimpleObjVO;
 import com.persagy.apm.common.response.PageList;
 import com.persagy.apm.model.dto.GroupManagementDTO;
 import com.persagy.apm.model.vo.GroupManagementVo;
 
-import java.io.IOException;
 import java.util.List;
+import java.util.Map;
 
 /**
  * @author 易涛
@@ -25,7 +27,7 @@ public interface GroupManagementService{
     PageList<GroupManagementVo> equipsQuery(GroupManagementDTO managementDTO);
     
     /**
-     *
+     * 获取设备名称
      * @param id
      * @author 易涛
      * @date 2021/9/9 16:04 
@@ -34,6 +36,16 @@ public interface GroupManagementService{
     GroupManagementVo equipsGet(String id);
 
     /**
+     * 查询设备
+     *
+     * @param ids 设备id列表
+     * @return 设备id -> 设备信息 map
+     * @author lixing
+     * @version V1.0 2021/9/20 1:15 下午
+     */
+    Map<String, GroupManagement> queryEquipsByIds(List<String> ids);
+
+    /**
      * 根据设备id查询分组名称
      * @param ids
      * @author 易涛
@@ -43,10 +55,55 @@ public interface GroupManagementService{
     List<GroupTreeInfoVO> equipsGroupQuery(List<String> ids);
 
     /**
+     * 根据设备id查询分组名称
+     *
+     * @param objIds 设备id列表
+     * @return 设备id->分组名称映射
+     * @author lixing
+     * @version V1.0 2021/9/20 1:14 下午
+     */
+    Map<String, SimpleObjVO> queryObjGroup(List<String> objIds);
+
+    /**
      * 定时任务删除valid为0的数据
      * @author 易涛
      * @date 2021/9/14 15:55
      * @return void
      */
     void batchDelete();
+
+    /**
+     * 查询分组下的设备
+     * @param condition 分组查询条件
+     * @param classCode 设备类
+     * @return 分组下的设备
+     */
+    List<GroupManagementVo> getEquipList(String condition, String classCode);
+
+    /**
+     * 使用默认分页条件查询分组下的设备
+     *
+     * @param groupManagementDTO 查询条件
+     * @return 分组下的设备
+     */
+    List<GroupManagementVo> getEquipList(GroupManagementDTO groupManagementDTO);
+
+    /**
+     * 获取分组信息
+     *
+     * @param id 分组id
+     * @return 分组信息
+     * @author lixing
+     * @version V1.0 2021/9/18 7:03 下午
+     */
+    GroupTreeDetailVO getGroup(String id);
+
+    /**
+     * 查询所有叶子节点分组
+     *
+     * @return 所有可用分组的列表
+     * @author lixing
+     * @version V1.0 2021/9/19 1:02 下午
+     */
+    List<GroupTreeDetailVO> queryAllLeafGroups();
 }

+ 171 - 75
src/main/java/com/persagy/apm/alarmservice/group/management/service/impl/GroupManagementServiceImpl.java

@@ -4,11 +4,13 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.google.common.collect.Lists;
-import com.persagy.apm.alarmservice.group.alarmrule.model.dto.AddGroupAlarmRuleDTO;
+import com.persagy.apm.alarmservice.group.management.model.ConvertGroupTool;
 import com.persagy.apm.alarmservice.group.management.model.GroupManagement;
+import com.persagy.apm.alarmservice.group.management.model.vo.GroupTreeDetailVO;
 import com.persagy.apm.alarmservice.group.management.model.vo.GroupTreeInfoVO;
 import com.persagy.apm.alarmservice.group.management.model.vo.GroupTreeVO;
 import com.persagy.apm.alarmservice.group.management.service.GroupManagementService;
+import com.persagy.apm.common.model.vo.SimpleObjVO;
 import com.persagy.apm.common.response.PageList;
 import com.persagy.apm.model.dto.GroupManagementDTO;
 import com.persagy.apm.model.vo.GroupManagementVo;
@@ -40,10 +42,7 @@ import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.stream.Collectors;
 
 import static cn.hutool.core.util.StrUtil.*;
@@ -63,30 +62,26 @@ public class GroupManagementServiceImpl implements GroupManagementService {
     @Autowired
     private RestHighLevelClient client;
 
-
-    @Autowired
-    private GroupManagementServiceImpl groupManagementService;
-
     @Override
     public PageList<GroupManagementVo> equipsQuery(GroupManagementDTO managementDTO) {
         List<GroupManagementVo> groupManagementVoList = new ArrayList<>();
         BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
-        queryBuilder.must(QueryBuilders.matchQuery("class_code",managementDTO.getClassCode()));
-        queryBuilder.must(QueryBuilders.matchPhraseQuery("infos",managementDTO.getCondition()));
+        queryBuilder.must(QueryBuilders.matchQuery("class_code", managementDTO.getClassCode()));
+        queryBuilder.must(QueryBuilders.matchPhraseQuery("infos", managementDTO.getCondition()));
         //新增根据项目id查询设备
-        if(StringUtils.isNotEmpty(managementDTO.getProjectId())){
-            queryBuilder.must(QueryBuilders.termsQuery("project_id",managementDTO.getProjectId()));
+        if (StringUtils.isNotEmpty(managementDTO.getProjectId())) {
+            queryBuilder.must(QueryBuilders.termsQuery("project_id", managementDTO.getProjectId()));
         }
         //模糊查询使用
-        if(StringUtils.isNotEmpty(managementDTO.getLocalName())) {
+        if (StringUtils.isNotEmpty(managementDTO.getLocalName())) {
             queryBuilder.must(QueryBuilders.matchQuery("local_name", managementDTO.getLocalName())
                     .analyzer("keyword"));
         }
-        queryBuilder.must(QueryBuilders.termQuery("valid",INTEGER_ONE));
+        queryBuilder.must(QueryBuilders.termQuery("valid", INTEGER_ONE));
         SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
         sourceBuilder.query(queryBuilder);
-        sourceBuilder.from((Math.max(managementDTO.getCurrent(), INTEGER_ONE)-INTEGER_ONE)
-                *managementDTO.getSize());
+        sourceBuilder.from((Math.max(managementDTO.getCurrent(), INTEGER_ONE) - INTEGER_ONE)
+                * managementDTO.getSize());
         sourceBuilder.size(managementDTO.getSize());
         sourceBuilder.sort("create_time", SortOrder.DESC);
         SearchRequest rq = new SearchRequest(INDEX_NAME);
@@ -94,7 +89,7 @@ public class GroupManagementServiceImpl implements GroupManagementService {
         try {
             SearchResponse searchResponse = client.search(rq, RequestOptions.DEFAULT);
             // 根据状态和数据条数验证是否返回了数据
-            if (RestStatus.OK.equals(searchResponse.status())&&searchResponse.getHits().getTotalHits().value>0) {
+            if (RestStatus.OK.equals(searchResponse.status()) && searchResponse.getHits().getTotalHits().value > 0) {
                 SearchHits hits = searchResponse.getHits();
                 for (SearchHit hit : hits) {
                     // 将 JSON 转换成对象
@@ -102,59 +97,68 @@ public class GroupManagementServiceImpl implements GroupManagementService {
                     groupManagementVoList.add(managementVo);
                 }
             }
-            return new PageList<>(groupManagementVoList,searchResponse.getHits().getTotalHits().value);
-        }catch (IOException e){
-            throw new RuntimeException("es查询出错",e);
+            return new PageList<>(groupManagementVoList, searchResponse.getHits().getTotalHits().value);
+        } catch (IOException e) {
+            throw new RuntimeException("es查询出错", e);
         }
     }
 
     @Override
     public GroupManagementVo equipsGet(String id) {
         String equipStr = findEquipById(id);
-        if(StringUtils.isEmpty(equipStr)){
-            throw new RuntimeException("id为"+id+"的设备不存在");
+        if (StringUtils.isEmpty(equipStr)) {
+            throw new RuntimeException("id为" + id + "的设备不存在");
         }
-        return JSONObject.parseObject(equipStr,GroupManagementVo.class);
+        return JSONObject.parseObject(equipStr, GroupManagementVo.class);
     }
 
     /**
      * 根据id查询设备-常用方法
+     *
      * @param id
+     * @return java.lang.String
      * @author 易涛
      * @date 2021/9/10 10:05
-     * @return java.lang.String
      */
-    private String findEquipById(String id){
-        GetRequest getRequest = new GetRequest(INDEX_NAME,id);
+    private String findEquipById(String id) {
+        GetRequest getRequest = new GetRequest(INDEX_NAME, id);
         try {
-            GetResponse getResponse = client.get(getRequest,RequestOptions.DEFAULT);
-            if(getResponse.isExists()){
+            GetResponse getResponse = client.get(getRequest, RequestOptions.DEFAULT);
+            if (getResponse.isExists()) {
                 return getResponse.getSourceAsString();
             }
-        }catch (IOException e){
-            throw new RuntimeException("es查询出错",e);
+        } catch (IOException e) {
+            throw new RuntimeException("es查询出错", e);
         }
         return null;
     }
 
-    private List<GroupManagement> findEquipsByIds(List<String> ids){
-        if(CollectionUtils.isEmpty(ids)||ids.size()>100){
+    /**
+     * 查询设备
+     *
+     * @param ids 设备id列表
+     * @return 设备列表
+     * @author lixing
+     * @version V1.0 2021/9/20 1:15 下午
+     */
+    private List<GroupManagement> findEquipsByIds(List<String> ids) {
+        if (CollectionUtils.isEmpty(ids) || ids.size() > 100) {
             throw new RuntimeException("批量查询的数据过短或过长");
         }
         List<GroupManagement> managementList = new ArrayList<>();
         BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
-        queryBuilder.must(QueryBuilders.termsQuery("id.keyword",ids));
+        queryBuilder.must(QueryBuilders.termsQuery("id.keyword", ids));
         SearchSourceBuilder sourceBuilder = new SearchSourceBuilder();
         sourceBuilder.query(queryBuilder);
         sourceBuilder.from(INTEGER_ZERO);
         sourceBuilder.size(ids.size());
-        sourceBuilder.sort("create_time",SortOrder.DESC);
+        sourceBuilder.sort("create_time", SortOrder.DESC);
         SearchRequest rq = new SearchRequest(INDEX_NAME);
         rq.source(sourceBuilder);
         try {
             SearchResponse searchResponse = client.search(rq, RequestOptions.DEFAULT);
             // 根据状态和数据条数验证是否返回了数据
-            if (RestStatus.OK.equals(searchResponse.status())&&searchResponse.getHits().getTotalHits().value>0) {
+            if (RestStatus.OK.equals(searchResponse.status()) && searchResponse.getHits().getTotalHits().value > 0) {
                 SearchHits hits = searchResponse.getHits();
                 for (SearchHit hit : hits) {
                     // 将 JSON 转换成对象
@@ -162,59 +166,86 @@ public class GroupManagementServiceImpl implements GroupManagementService {
                     managementList.add(management);
                 }
             }
-        }catch (IOException e){
-            throw new RuntimeException("es查询出错",e);
+        } catch (IOException e) {
+            throw new RuntimeException("es查询出错", e);
         }
         return managementList;
     }
+
+    @Override
+    public Map<String, GroupManagement> queryEquipsByIds(List<String> ids) {
+        List<GroupManagement> equipsByIds = findEquipsByIds(ids);
+        if (CollectionUtils.isEmpty(equipsByIds)) {
+            return new HashMap<>();
+        }
+        return equipsByIds.stream().collect(Collectors.toMap(
+                GroupManagement::getId, equip -> equip, (k1,k2) -> k1
+        ));
+    }
+
     @Override
     public List<GroupTreeInfoVO> equipsGroupQuery(List<String> ids) {
         List<GroupTreeInfoVO> groupTreeInfoVOList = Lists.newArrayList();
         List<GroupManagement> groupManagementList = findEquipsByIds(ids);
-        for(GroupManagement management:groupManagementList) {
-            if(StringUtils.isEmpty(management.getInfos())){
+        for (GroupManagement management : groupManagementList) {
+            if (StringUtils.isEmpty(management.getInfos())) {
                 return null;
             }
-            String infos = management.getInfos().replace(DELIM_START,"")
-                    .replace(DELIM_END,"").replace("\"","")
-                    .replace(BACKSLASH,"").replace(" ","")
+            String infos = management.getInfos().replace(DELIM_START, "")
+                    .replace(DELIM_END, "").replace("\"", "")
+                    .replace(BACKSLASH, "").replace(" ", "")
                     .trim();
             if (StringUtils.isEmpty(infos)) {
                 return null;
             }
             Map<String, String> infoMap = Arrays.stream(infos.split(COMMA))
-                    .collect(Collectors.toMap(key-> key, value->value, (e1, e2) -> e1));
+                    .collect(Collectors.toMap(key -> key, value -> value, (e1, e2) -> e1));
             List<GroupTreeVO> groupTreeVOList = getGroupTree();
             GroupTreeInfoVO infoVO = new GroupTreeInfoVO();
-            groupTreeInfoVOList.add(queryGroupName(groupTreeVOList,infoVO,infoMap,management.getId()));
+            groupTreeInfoVOList.add(queryGroupName(groupTreeVOList, infoVO, infoMap, management.getId()));
         }
         return groupTreeInfoVOList;
     }
 
+    @Override
+    public Map<String, SimpleObjVO> queryObjGroup(List<String> objIds) {
+        List<GroupTreeInfoVO> groupTreeInfoVOS = equipsGroupQuery(objIds);
+        if (CollectionUtils.isEmpty(groupTreeInfoVOS)) {
+            return new HashMap<>();
+        }
+        return groupTreeInfoVOS.stream().collect(Collectors.toMap(
+                GroupTreeInfoVO::getEquipId,
+                groupTreeInfoVO -> new SimpleObjVO(groupTreeInfoVO.getId(), groupTreeInfoVO.getName()),
+                (k1,k2) -> k1
+        ));
+    }
+
     /**
      * 递归匹配condition
+     *
      * @param groupTreeVOList
      * @param infoVO
      * @param infoMap
      * @param equipId
+     * @return com.persagy.apm.alarmservice.group.management.model.vo.GroupTreeInfoVO
      * @author 易涛
      * @date 2021/9/10 11:24
-     * @return com.persagy.apm.alarmservice.group.management.model.vo.GroupTreeInfoVO
      */
-    private GroupTreeInfoVO queryGroupName(List<GroupTreeVO> groupTreeVOList,GroupTreeInfoVO infoVO,
-                                           Map<String, String> infoMap,String equipId){
-        for(GroupTreeVO groupTreeVO:groupTreeVOList){
-            if(StringUtils.isNotEmpty(infoVO.getId())){
+    private GroupTreeInfoVO queryGroupName(
+            List<GroupTreeVO> groupTreeVOList, GroupTreeInfoVO infoVO,
+            Map<String, String> infoMap, String equipId) {
+        for (GroupTreeVO groupTreeVO : groupTreeVOList) {
+            if (StringUtils.isNotEmpty(infoVO.getId())) {
                 return infoVO;
             }
             //排除掉配置的时候存在不小心放入空格的情况
-            if(infoMap.containsKey(groupTreeVO.getCondition().replace(" ",""))){
-                BeanUtils.copyProperties(groupTreeVO,infoVO);
+            if (infoMap.containsKey(groupTreeVO.getCondition().replace(" ", ""))) {
+                BeanUtils.copyProperties(groupTreeVO, infoVO);
                 infoVO.setEquipId(equipId);
                 return infoVO;
             }
-            if(CollectionUtils.isNotEmpty(groupTreeVO.getChildren())){
-                queryGroupName(groupTreeVO.getChildren(),infoVO,infoMap,equipId);
+            if (CollectionUtils.isNotEmpty(groupTreeVO.getChildren())) {
+                queryGroupName(groupTreeVO.getChildren(), infoVO, infoMap, equipId);
             }
         }
         return infoVO;
@@ -222,21 +253,22 @@ public class GroupManagementServiceImpl implements GroupManagementService {
 
     /**
      * 获取分组树
+     *
+     * @return java.util.List<com.persagy.apm.alarmservice.group.management.model.vo.GroupTreeVO>
      * @author 易涛
      * @date 2021/9/8 14:44
-     * @return java.util.List<com.persagy.apm.alarmservice.group.management.model.vo.GroupTreeVO>
      */
-    public static List<GroupTreeVO> getGroupTree(){
+    public static List<GroupTreeVO> getGroupTree() {
         InputStream inputStream = GroupManagementServiceImpl.class.getClassLoader()
-                .getResourceAsStream(File.separator+"json"+File.separator+"GroupTree.json");
-        if(inputStream==null){
+                .getResourceAsStream(File.separator + "json" + File.separator + "GroupTree.json");
+        if (inputStream == null) {
             return null;
         }
-        try{
+        try {
             String str = IOUtils.toString(inputStream, StandardCharsets.UTF_8);
-            return JSONArray.parseArray(str,GroupTreeVO.class);
-        }catch (IOException ioe){
-            throw new RuntimeException("json文件有误",ioe);
+            return JSONArray.parseArray(str, GroupTreeVO.class);
+        } catch (IOException ioe) {
+            throw new RuntimeException("json文件有误", ioe);
         }
     }
 
@@ -249,25 +281,89 @@ public class GroupManagementServiceImpl implements GroupManagementService {
         request.setMaxDocs(10000);
         try {
             BulkByScrollResponse resp = client.deleteByQuery(request, RequestOptions.DEFAULT);
-            log.info("删除返回的数据为---{}",resp.toString());
-        }catch (IOException e){
-            throw new RuntimeException("删除elasticSearch失败",e);
+            log.info("删除返回的数据为---{}", resp.toString());
+        } catch (IOException e) {
+            throw new RuntimeException("删除elasticSearch失败", e);
         }
     }
 
-    /**
-     * 查询分组下的设备
-     * @param condition
-     * @param classCode
-     * @return
-     */
-    public List<GroupManagementVo> getEquipList(String condition,String classCode){
+    @Override
+    public List<GroupManagementVo> getEquipList(String condition, String classCode) {
         GroupManagementDTO managementDTO = new GroupManagementDTO();
         managementDTO.setClassCode(classCode);
         managementDTO.setCondition(condition);
-        managementDTO.setCurrent(INTEGER_ONE);
-        managementDTO.setSize(5000);
-        PageList<GroupManagementVo> groupManagementVoPageList = this.equipsQuery(managementDTO);
+        return getEquipList(managementDTO);
+    }
+
+    @Override
+    public List<GroupManagementVo> getEquipList(GroupManagementDTO groupManagementDTO) {
+        groupManagementDTO.setCurrent(INTEGER_ONE);
+        groupManagementDTO.setSize(5000);
+        PageList<GroupManagementVo> groupManagementVoPageList = this.equipsQuery(groupManagementDTO);
         return groupManagementVoPageList.getRecords();
     }
+
+    @Override
+    public GroupTreeDetailVO getGroup(String id) {
+        return queryById(getGroupTree(), new GroupTreeDetailVO(), id);
+    }
+
+    /**
+     * 递归匹配符合条件的分组对象
+     *
+     * @param groupTreeVOList
+     * @param id
+     * @return com.persagy.apm.alarmservice.group.management.model.vo.GroupTreeVO
+     * @author 易涛
+     * @date 2021/9/8 14:50
+     */
+    private GroupTreeDetailVO queryById(List<GroupTreeVO> groupTreeVOList, GroupTreeDetailVO groupTreeDetailVO, String id) {
+        if (CollectionUtils.isEmpty(groupTreeVOList)) {
+            return null;
+        }
+        for (GroupTreeVO groupTreeVO : groupTreeVOList) {
+            if (StringUtils.isNotEmpty(groupTreeDetailVO.getId())) {
+                return groupTreeDetailVO;
+            }
+            if (Objects.equals(groupTreeVO.getId(), id)) {
+                BeanUtils.copyProperties(groupTreeVO, groupTreeDetailVO);
+                return groupTreeDetailVO;
+            }
+            if (CollectionUtils.isNotEmpty(groupTreeVO.getChildren())) {
+                queryById(groupTreeVO.getChildren(), groupTreeDetailVO, id);
+            }
+        }
+        return groupTreeDetailVO;
+    }
+
+    @Override
+    public List<GroupTreeDetailVO> queryAllLeafGroups() {
+        // 遍历分组树,获取最末级节点
+        List<GroupTreeVO> groupTree = getGroupTree();
+
+        List<GroupTreeDetailVO> result = new ArrayList<>();
+        cascadeGetLeafGroup(groupTree, result);
+        return result;
+    }
+
+    /**
+     * 递归查询分组树的叶子节点
+     *
+     * @param groupTree 分组树节点列表
+     * @param result 保存叶子节点的结果集
+     * @author lixing
+     * @version V1.0 2021/9/19 1:37 下午
+     */
+    private void cascadeGetLeafGroup(List<GroupTreeVO> groupTree, List<GroupTreeDetailVO> result) {
+        if (CollectionUtils.isEmpty(groupTree)) {
+            return;
+        }
+        for (GroupTreeVO groupTreeVO : groupTree) {
+            if (CollectionUtils.isEmpty(groupTreeVO.getChildren())) {
+                result.add(ConvertGroupTool.INSTANCE.convert2DetailDTO(groupTreeVO));
+            } else {
+                cascadeGetLeafGroup(groupTreeVO.getChildren(), result);
+            }
+        }
+    }
 }

+ 81 - 66
src/main/java/com/persagy/apm/alarmservice/monitorindicator/service/impl/MonitorIndicatorServiceImpl.java

@@ -1,27 +1,32 @@
 package com.persagy.apm.alarmservice.monitorindicator.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.google.common.base.CaseFormat;
 import com.persagy.apm.alarmservice.calculatemethod.model.CalculateMethod;
 import com.persagy.apm.alarmservice.calculatemethod.model.dto.QueryCalculateMethodDTO;
 import com.persagy.apm.alarmservice.calculatemethod.service.ICalculateMethodService;
-import com.persagy.apm.alarmservice.monitorindicator.model.vo.MonitorIndicatorListItemVO;
-import com.persagy.apm.common.context.AppContext;
 import com.persagy.apm.alarmservice.monitorindicator.dao.MonitorIndicatorMapper;
+import com.persagy.apm.alarmservice.monitorindicator.model.ConvertMonitorIndicatorTool;
+import com.persagy.apm.alarmservice.monitorindicator.model.MonitorIndicator;
+import com.persagy.apm.alarmservice.monitorindicator.model.dto.AddMonitorIndicatorDTO;
+import com.persagy.apm.alarmservice.monitorindicator.model.dto.PageQueryMonitorIndicatorDTO;
+import com.persagy.apm.alarmservice.monitorindicator.model.dto.QueryMonitorIndicatorDTO;
+import com.persagy.apm.alarmservice.monitorindicator.model.dto.UpdateMonitorIndicatorDTO;
+import com.persagy.apm.alarmservice.monitorindicator.model.vo.MonitorIndicatorListItemVO;
 import com.persagy.apm.alarmservice.monitorindicator.service.IMonitorIndicatorService;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-import org.apache.commons.lang.StringUtils;
 import com.persagy.apm.common.constant.enums.ValidEnum;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.persagy.apm.alarmservice.monitorindicator.model.*;
-import com.persagy.apm.alarmservice.monitorindicator.model.dto.*;
-import java.util.List;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.google.common.base.CaseFormat;
+import com.persagy.apm.common.context.AppContext;
 import com.persagy.apm.common.model.dto.Sort;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
+import java.util.List;
+
 /**
  * 监测指标(MonitorIndicator) service层
  *
@@ -29,17 +34,18 @@ import org.springframework.util.CollectionUtils;
  * @version V1.0 2021-09-08 22:44:37
  */
 @Service
-public class MonitorIndicatorServiceImpl extends ServiceImpl<MonitorIndicatorMapper, MonitorIndicator> 
-    implements IMonitorIndicatorService {
+public class MonitorIndicatorServiceImpl extends ServiceImpl<MonitorIndicatorMapper, MonitorIndicator>
+        implements IMonitorIndicatorService {
     @Autowired
     ICalculateMethodService calculateMethodService;
 
     /**
-    * 创建监测指标
-    * @return 监测指标主键
-    * @author lixing
-    * @version V1.0 2021-09-08 22:44:37
-    */
+     * 创建监测指标
+     *
+     * @return 监测指标主键
+     * @author lixing
+     * @version V1.0 2021-09-08 22:44:37
+     */
     @Override
     public String createMonitorIndicator(AddMonitorIndicatorDTO addMonitorIndicatorDTO) {
         MonitorIndicator monitorIndicator = ConvertMonitorIndicatorTool.INSTANCE.convertAddDto2Entity(addMonitorIndicatorDTO);
@@ -48,7 +54,7 @@ public class MonitorIndicatorServiceImpl extends ServiceImpl<MonitorIndicatorMap
         save(monitorIndicator);
         return monitorIndicator.getId();
     }
-    
+
     /**
      * 如果某些字段没有赋值,使用默认的值
      *
@@ -59,16 +65,17 @@ public class MonitorIndicatorServiceImpl extends ServiceImpl<MonitorIndicatorMap
     private void setDefaultValue(MonitorIndicator monitorIndicator) {
         monitorIndicator.setCreator(AppContext.getContext().getAccountId());
         // todo 其他默认的属性
-        
+
     }
-    
+
     /**
-    * 监测指标详情
-    * @param id 主键
-    * @return 部门do类
-    * @author lixing
-    * @version V1.0 2021-09-08 22:44:37
-    */
+     * 监测指标详情
+     *
+     * @param id 主键
+     * @return 部门do类
+     * @author lixing
+     * @version V1.0 2021-09-08 22:44:37
+     */
     @Override
     public MonitorIndicator queryMonitorIndicatorDetail(String id) {
         MonitorIndicator monitorIndicator = getById(id);
@@ -77,12 +84,13 @@ public class MonitorIndicatorServiceImpl extends ServiceImpl<MonitorIndicatorMap
         }
         return monitorIndicator;
     }
-    
+
     /**
-    * 更新监测指标
-    * @author lixing
-    * @version V1.0 2021-09-08 22:44:37
-    */
+     * 更新监测指标
+     *
+     * @author lixing
+     * @version V1.0 2021-09-08 22:44:37
+     */
     @Override
     public void updateMonitorIndicator(UpdateMonitorIndicatorDTO updateMonitorIndicatorDTO) {
         MonitorIndicator monitorIndicator = getById(updateMonitorIndicatorDTO.getId());
@@ -90,7 +98,7 @@ public class MonitorIndicatorServiceImpl extends ServiceImpl<MonitorIndicatorMap
         monitorIndicator.setModifier(AppContext.getContext().getAccountId());
         updateById(monitorIndicator);
     }
-    
+
     /**
      * 校验监测指标是否可删除
      *
@@ -112,13 +120,14 @@ public class MonitorIndicatorServiceImpl extends ServiceImpl<MonitorIndicatorMap
 
         return monitorIndicator;
     }
-    
+
     /**
-    * 删除监测指标
-    * @param id 主键
-    * @author lixing
-    * @version V1.0 2021-09-08 22:44:37
-    */
+     * 删除监测指标
+     *
+     * @param id 主键
+     * @author lixing
+     * @version V1.0 2021-09-08 22:44:37
+     */
     @Override
     public void deleteMonitorIndicator(String id) {
         // 校验是否可删除
@@ -127,70 +136,76 @@ public class MonitorIndicatorServiceImpl extends ServiceImpl<MonitorIndicatorMap
         monitorIndicator.setValid(ValidEnum.FALSE.getType());
         updateById(monitorIndicator);
     }
-    
+
     /**
-    * 查询监测指标
-    * @return List<MonitorIndicator>
-    * @author lixing
-    * @version V1.0 2021-09-08 22:44:37
-    */
+     * 查询监测指标
+     *
+     * @return List<MonitorIndicator>
+     * @author lixing
+     * @version V1.0 2021-09-08 22:44:37
+     */
     @Override
     public List<MonitorIndicator> queryMonitorIndicatorList(QueryMonitorIndicatorDTO queryMonitorIndicatorDTO) {
         QueryWrapper<MonitorIndicator> queryWrapper = new QueryWrapper<>();
         queryWrapper.eq(MonitorIndicator.PROP_VALID, ValidEnum.TRUE.getType());
         // 默认按创建时间倒序排序
         queryWrapper.orderBy(true, false, MonitorIndicator.PROP_CREATIONTIME);
-        
+
         if (queryMonitorIndicatorDTO != null) {
-                                
+
+            if (queryMonitorIndicatorDTO.getIds() != null) {
+                queryWrapper.in(MonitorIndicator.PROP_ID, queryMonitorIndicatorDTO.getIds());
+            }
+
             if (StringUtils.isNotEmpty(queryMonitorIndicatorDTO.getName())) {
                 queryWrapper.like(MonitorIndicator.PROP_NAME, queryMonitorIndicatorDTO.getName());
             }
-                                        
+
             if (StringUtils.isNotEmpty(queryMonitorIndicatorDTO.getClassCode())) {
                 queryWrapper.eq(MonitorIndicator.PROP_CLASS_CODE, queryMonitorIndicatorDTO.getClassCode());
             }
-                                            
+
         }
-        
+
         return list(queryWrapper);
     }
-    
+
     /**
-    * 分页查询监测指标
-    * @return IPage<MonitorIndicator>
-    * @author lixing
-    * @version V1.0 2021-09-08 22:44:37
-    */
+     * 分页查询监测指标
+     *
+     * @return IPage<MonitorIndicator>
+     * @author lixing
+     * @version V1.0 2021-09-08 22:44:37
+     */
     @Override
     public IPage<MonitorIndicator> pageQueryMonitorIndicator(PageQueryMonitorIndicatorDTO pageQueryMonitorIndicatorDTO) {
         QueryWrapper<MonitorIndicator> queryWrapper = new QueryWrapper<>();
         queryWrapper.eq(MonitorIndicator.PROP_VALID, ValidEnum.TRUE.getType());
         // 这里认为pageQueryDTO是经过校验的,肯定包含分页信息
-        IPage<MonitorIndicator> pageParam = new Page<>(pageQueryMonitorIndicatorDTO.getPage(), pageQueryMonitorIndicatorDTO.getSize(),true);
+        IPage<MonitorIndicator> pageParam = new Page<>(pageQueryMonitorIndicatorDTO.getPage(), pageQueryMonitorIndicatorDTO.getSize(), true);
         // 排序信息
-        if(CollectionUtils.isEmpty(pageQueryMonitorIndicatorDTO.getOrders())){
+        if (CollectionUtils.isEmpty(pageQueryMonitorIndicatorDTO.getOrders())) {
             // 默认按创建时间倒序排序
             queryWrapper.orderBy(true, false, MonitorIndicator.PROP_CREATIONTIME);
-        }else {
+        } else {
             List<Sort> orders = pageQueryMonitorIndicatorDTO.getOrders();
-            for(Sort sort: orders) {
+            for (Sort sort : orders) {
                 // 将驼峰转换为下划线格式
-                sort.setColumn(CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE,sort.getColumn()));
+                sort.setColumn(CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, sort.getColumn()));
                 queryWrapper.orderBy(true, sort.isAsc(), sort.getColumn());
             }
         }
-                
+
         // todo 需判断使用like还是eq
         if (StringUtils.isNotEmpty(pageQueryMonitorIndicatorDTO.getName())) {
             queryWrapper.like(MonitorIndicator.PROP_NAME, pageQueryMonitorIndicatorDTO.getName());
         }
-                            
+
         // todo 需判断使用like还是eq
         if (StringUtils.isNotEmpty(pageQueryMonitorIndicatorDTO.getClassCode())) {
             queryWrapper.like(MonitorIndicator.PROP_CLASS_CODE, pageQueryMonitorIndicatorDTO.getClassCode());
         }
-                                    
+
         return getBaseMapper().selectPage(pageParam, queryWrapper);
     }
 

+ 11 - 9
src/main/java/com/persagy/apm/alarmservice/project/monitorindicatorconfig/controller/ProjectMonitorIndicatorConfigController.java

@@ -1,8 +1,10 @@
 package com.persagy.apm.alarmservice.project.monitorindicatorconfig.controller;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.persagy.apm.alarmservice.calculatemethod.service.ICalculateMethodService;
 import com.persagy.apm.alarmservice.project.monitorindicatorconfig.service.IProjectMonitorIndicatorConfigService;
 
+import com.persagy.apm.common.model.vo.SimpleObjVO;
 import org.springframework.beans.factory.annotation.Autowired;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -31,6 +33,8 @@ import java.util.List;
 public class ProjectMonitorIndicatorConfigController {
     @Autowired
     private IProjectMonitorIndicatorConfigService projectMonitorIndicatorConfigService;
+    @Autowired
+    private ICalculateMethodService calculateMethodService;
 
 	@ApiOperation(value = "创建项目监测指标配置")
 	@PostMapping("/create")
@@ -51,6 +55,11 @@ public class ProjectMonitorIndicatorConfigController {
                         queryProjectMonitorIndicatorConfigDetailDTO.getMonitorIndicatorId());
         ProjectMonitorIndicatorConfigItemVO projectMonitorIndicatorConfigItemVO =
                 ConvertProjectMonitorIndicatorConfigTool.INSTANCE.convert2ResponseItemDTO(projectMonitorIndicatorConfig);
+        // 返回结果中添加计算方式信息
+        String calculateMethodId = projectMonitorIndicatorConfig.getCalculateMethodId();
+        String methodName = calculateMethodService.getMethodName(calculateMethodId);
+        projectMonitorIndicatorConfigItemVO.setCalculateMethod(
+                new SimpleObjVO(calculateMethodId, methodName));
         return ResultHelper.single(projectMonitorIndicatorConfigItemVO);
     }
 
@@ -88,16 +97,9 @@ public class ProjectMonitorIndicatorConfigController {
     @PostMapping("/query")
     public CommonResult<PageList<ProjectMonitorIndicatorConfigListItemVO>> queryProjectMonitorIndicatorConfig(
             @Valid @RequestBody PageQueryProjectMonitorIndicatorConfigDTO pageQueryProjectMonitorIndicatorConfigDTO) {
-        IPage<ProjectMonitorIndicatorConfig> pagedList = projectMonitorIndicatorConfigService.
+        IPage<ProjectMonitorIndicatorConfigListItemVO> pagedList = projectMonitorIndicatorConfigService.
                 pageQueryProjectMonitorIndicatorConfig(pageQueryProjectMonitorIndicatorConfigDTO);
-        IPage<ProjectMonitorIndicatorConfigListItemVO> pagedResultList = pagedList.convert(item -> {
-            try {
-               return ConvertProjectMonitorIndicatorConfigTool.INSTANCE.convert2ResponseListItemDTO(item);
-            } catch (Exception e) {
-                throw new IllegalArgumentException("分页查询,ProjectMonitorIndicatorConfig实体类转换为列表对象发生异常", e);
-            }
-        });
-        return ResultHelper.multi(pagedResultList);
+        return ResultHelper.multi(pagedList);
     }
 }
 

+ 1 - 1
src/main/java/com/persagy/apm/alarmservice/project/monitorindicatorconfig/model/ProjectMonitorIndicatorConfig.java

@@ -31,7 +31,7 @@ public class ProjectMonitorIndicatorConfig extends AuditableEntity<ProjectMonito
     private String monitorIndicatorId;
     
     @ApiModelProperty("计算方式id")
-    private String caculateMethodId;
+    private String calculateMethodId;
     
     @ApiModelProperty("项目id")
     private String projectId;

+ 1 - 1
src/main/java/com/persagy/apm/alarmservice/project/monitorindicatorconfig/model/dto/AddProjectMonitorIndicatorConfigDTO.java

@@ -23,7 +23,7 @@ public class AddProjectMonitorIndicatorConfigDTO {
     
     @ApiModelProperty(value = "计算方式id", required = true)
     @NotNull(message = "计算方式id不能为空") // todo 更新校验规则
-    private String caculateMethodId;
+    private String calculateMethodId;
     
     @ApiModelProperty(value = "项目id", required = true)
     @NotNull(message = "项目id不能为空") // todo 更新校验规则

+ 4 - 4
src/main/java/com/persagy/apm/alarmservice/project/monitorindicatorconfig/model/dto/PageQueryProjectMonitorIndicatorConfigDTO.java

@@ -25,11 +25,11 @@ public class PageQueryProjectMonitorIndicatorConfigDTO extends PageDTO {
     @ApiModelProperty(value = "监测指标id列表")
     private List<String> monitorIndicatorId;
     
-    @ApiModelProperty(value = "分组id", required = true)
-    @NotBlank(message = "查询条件缺少分组id")
-    private String groupId;
-
     @ApiModelProperty(value = "设备类编码", required = true)
     @NotBlank(message = "查询条件缺少设备类编码")
     private String classCode;
+
+    @ApiModelProperty(value = "分组条件", required = true)
+    @NotBlank(message = "查询条件缺少分组条件")
+    private String condition;
 }

+ 1 - 1
src/main/java/com/persagy/apm/alarmservice/project/monitorindicatorconfig/model/dto/QueryProjectMonitorIndicatorConfigDTO.java

@@ -19,7 +19,7 @@ public class QueryProjectMonitorIndicatorConfigDTO {
     private String monitorIndicatorId;
     
     @ApiModelProperty(value = "计算方式id", required = true)
-    private String caculateMethodId;
+    private String calculateMethodId;
     
     @ApiModelProperty(value = "项目id", required = true)
     private String projectId;

+ 3 - 2
src/main/java/com/persagy/apm/alarmservice/project/monitorindicatorconfig/service/IProjectMonitorIndicatorConfigService.java

@@ -4,6 +4,7 @@ import com.persagy.apm.alarmservice.project.monitorindicatorconfig.model.*;
 import com.persagy.apm.alarmservice.project.monitorindicatorconfig.model.dto.*;
 import java.util.List;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.persagy.apm.alarmservice.project.monitorindicatorconfig.model.vo.ProjectMonitorIndicatorConfigListItemVO;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 
@@ -67,11 +68,11 @@ public interface IProjectMonitorIndicatorConfigService  {
     * 分页查询项目监测指标配置
     * 
     * @param pageQueryProjectMonitorIndicatorConfigDTO pageQueryDTO
-    * @return IPage<ProjectMonitorIndicatorConfig>
+    * @return IPage<ProjectMonitorIndicatorConfigListItemVO>
     * @author lixing
     * @version V1.0 2021-09-08 22:46:56
     */
-    public IPage<ProjectMonitorIndicatorConfig> pageQueryProjectMonitorIndicatorConfig(PageQueryProjectMonitorIndicatorConfigDTO pageQueryProjectMonitorIndicatorConfigDTO);
+    public IPage<ProjectMonitorIndicatorConfigListItemVO> pageQueryProjectMonitorIndicatorConfig(PageQueryProjectMonitorIndicatorConfigDTO pageQueryProjectMonitorIndicatorConfigDTO);
 
     /**
      * 根据监测对象id和监测指标id,获取设备监测指标的配置信息

+ 129 - 12
src/main/java/com/persagy/apm/alarmservice/project/monitorindicatorconfig/service/impl/ProjectMonitorIndicatorConfigServiceImpl.java

@@ -2,6 +2,7 @@ package com.persagy.apm.alarmservice.project.monitorindicatorconfig.service.impl
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.persagy.apm.alarmservice.calculatemethod.model.CalculateMethod;
 import com.persagy.apm.alarmservice.calculatemethod.model.dto.QueryCalculateMethodDTO;
@@ -17,18 +18,26 @@ import com.persagy.apm.alarmservice.project.monitorindicatorconfig.model.dto.Add
 import com.persagy.apm.alarmservice.project.monitorindicatorconfig.model.dto.PageQueryProjectMonitorIndicatorConfigDTO;
 import com.persagy.apm.alarmservice.project.monitorindicatorconfig.model.dto.QueryProjectMonitorIndicatorConfigDTO;
 import com.persagy.apm.alarmservice.project.monitorindicatorconfig.model.dto.UpdateProjectMonitorIndicatorConfigDTO;
+import com.persagy.apm.alarmservice.project.monitorindicatorconfig.model.vo.ProjectMonitorIndicatorConfigListItemVO;
 import com.persagy.apm.alarmservice.project.monitorindicatorconfig.service.IProjectMonitorIndicatorConfigService;
 import com.persagy.apm.common.constant.enums.BoolEnum;
 import com.persagy.apm.common.constant.enums.ValidEnum;
 import com.persagy.apm.common.context.AppContext;
 import com.persagy.apm.common.context.poems.PoemsContext;
+import com.persagy.apm.common.model.vo.SimpleObjVO;
 import com.persagy.apm.model.dto.GroupManagementDTO;
+import com.persagy.apm.model.vo.GroupManagementVo;
 import org.apache.commons.lang.StringUtils;
+import org.assertj.core.util.Lists;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
 
+import java.text.Collator;
+import java.util.ArrayList;
+import java.util.Comparator;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * 项目监测指标配置(ProjectMonitorIndicatorConfig) service层
@@ -105,7 +114,7 @@ public class ProjectMonitorIndicatorConfigServiceImpl extends ServiceImpl<Projec
                 getConfigByObjAndIndicator(
                         updateProjectMonitorIndicatorConfigDTO.getObjId(),
                         updateProjectMonitorIndicatorConfigDTO.getMonitorIndicatorId());
-        projectMonitorIndicatorConfig.setCaculateMethodId(updateProjectMonitorIndicatorConfigDTO.getCalculateMethodId());
+        projectMonitorIndicatorConfig.setCalculateMethodId(updateProjectMonitorIndicatorConfigDTO.getCalculateMethodId());
         projectMonitorIndicatorConfig.setModifier(AppContext.getContext().getAccountId());
         updateById(projectMonitorIndicatorConfig);
         return projectMonitorIndicatorConfig.getId();
@@ -177,8 +186,8 @@ public class ProjectMonitorIndicatorConfigServiceImpl extends ServiceImpl<Projec
             }
 
             // todo 需判断使用like还是eq
-            if (StringUtils.isNotEmpty(queryProjectMonitorIndicatorConfigDTO.getCaculateMethodId())) {
-                queryWrapper.like(ProjectMonitorIndicatorConfig.PROP_CACULATE_METHOD_ID, queryProjectMonitorIndicatorConfigDTO.getCaculateMethodId());
+            if (StringUtils.isNotEmpty(queryProjectMonitorIndicatorConfigDTO.getCalculateMethodId())) {
+                queryWrapper.like(ProjectMonitorIndicatorConfig.PROP_CACULATE_METHOD_ID, queryProjectMonitorIndicatorConfigDTO.getCalculateMethodId());
             }
 
             // todo 需判断使用like还是eq
@@ -194,27 +203,135 @@ public class ProjectMonitorIndicatorConfigServiceImpl extends ServiceImpl<Projec
     /**
      * 分页查询项目监测指标配置
      *
-     * @return IPage<ProjectMonitorIndicatorConfig>
+     * @return IPage<ProjectMonitorIndicatorConfigListItemVO>
      * @author lixing
      * @version V1.0 2021-09-08 22:46:56
      */
     @Override
-    public IPage<ProjectMonitorIndicatorConfig> pageQueryProjectMonitorIndicatorConfig(
+    public IPage<ProjectMonitorIndicatorConfigListItemVO> pageQueryProjectMonitorIndicatorConfig(
             PageQueryProjectMonitorIndicatorConfigDTO pageQueryProjectMonitorIndicatorConfigDTO) {
-        // TODO: 2021/9/17
+        // 初始化返回值
+        IPage<ProjectMonitorIndicatorConfigListItemVO> result = new Page<>();
+        result.setRecords(Lists.newArrayList());
+        result.setTotal(0);
+
         // 获取分组下的监测指标,查询条件:设备类+监测指标id列表
         List<MonitorIndicator> monitorIndicators =  queryGroupIndicators(
                 pageQueryProjectMonitorIndicatorConfigDTO.getClassCode(),
                 pageQueryProjectMonitorIndicatorConfigDTO.getMonitorIndicatorId());
-        // 查询分组下的设备, 查询条件:分组id+项目id+设备名称(模糊)
-        String groupId = pageQueryProjectMonitorIndicatorConfigDTO.getGroupId();
-        if (StringUtils.isBlank(groupId)) {
-            throw new IllegalArgumentException("分组id不能为空");
+        if (CollectionUtils.isEmpty(monitorIndicators)) {
+            return result;
+        }
+        // 监测指标按名称排序
+        monitorIndicators = monitorIndicators.stream().sorted(Comparator.comparing(MonitorIndicator::getName,
+                Collator.getInstance(java.util.Locale.CHINA))).collect(Collectors.toList());
+
+        // 查询分组下的监测对象, 查询条件:设备类+分组条件+项目id+设备名称(模糊)
+        List<GroupManagementVo> objList = queryEquipList(pageQueryProjectMonitorIndicatorConfigDTO);
+        if (CollectionUtils.isEmpty(objList)) {
+            return result;
+        }
+
+        // 监测对象按名称排序
+        objList = objList.stream().sorted(Comparator.comparing(GroupManagementVo::getLocalName,
+                Collator.getInstance(java.util.Locale.CHINA))).collect(Collectors.toList());
+
+        // 监测对象+设备组合成返回结果。因为数据量太大,结果中不含计算方式,在分页后再添加计算方式
+        List<ProjectMonitorIndicatorConfigListItemVO> recordList = combineResult(monitorIndicators, objList);
+
+        // 返回结果分页
+        List<ProjectMonitorIndicatorConfigListItemVO> resultRecordList = subResultByPageInfo(
+                pageQueryProjectMonitorIndicatorConfigDTO, recordList);
+
+        // 项目监测指标初始化计算方式
+        resultRecordList.forEach(this::addCalculateMethodInfo);
+
+        result.setRecords(resultRecordList);
+        result.setTotal(recordList.size());
+        return result;
+    }
+
+    /**
+     * 给项目监测指标配置添加计算方式信息
+     *
+     * @param record 项目监测指标配置
+     * @author lixing
+     * @version V1.0 2021/9/17 9:49 下午
+     */
+    private void addCalculateMethodInfo(ProjectMonitorIndicatorConfigListItemVO record) {
+        if (record.getObj() == null || record.getMonitorIndicator() == null) {
+            return;
+        }
+        // 获取设备的监测指标配置信息
+        ProjectMonitorIndicatorConfig configByObjAndIndicator = getConfigByObjAndIndicator(
+                record.getObj().getId(), record.getMonitorIndicator().getId());
+        String calculateMethodId = configByObjAndIndicator.getCalculateMethodId();
+        // 获取计算方式名称
+        String methodName = calculateMethodService.getMethodName(calculateMethodId);
+        record.setCalculateMethod(new SimpleObjVO(calculateMethodId, methodName));
+    }
+
+    /**
+     * 根据分页信息截取项目监测指标配置列表
+     *
+     * @param pageQueryProjectMonitorIndicatorConfigDTO 分页查询条件
+     * @param recordList 全部项目监测指标配置列表
+     * @return 截取后的项目监测指标配置列表
+     * @author lixing
+     * @version V1.0 2021/9/17 9:29 下午
+     */
+    private List<ProjectMonitorIndicatorConfigListItemVO> subResultByPageInfo(
+            PageQueryProjectMonitorIndicatorConfigDTO pageQueryProjectMonitorIndicatorConfigDTO, List<ProjectMonitorIndicatorConfigListItemVO> recordList) {
+        Integer page = pageQueryProjectMonitorIndicatorConfigDTO.getPage();
+        Integer size = pageQueryProjectMonitorIndicatorConfigDTO.getSize();
+
+        if (page == null || size == null) {
+            throw new IllegalArgumentException("缺少分页条件");
+        }
+        return recordList.subList((page - 1) * size, page * size);
+    }
+
+    /**
+     * 监测对象+设备组合成成项目监测指标配置列表
+     *
+     * @param monitorIndicators 监测对象列表
+     * @param objList 设备列表
+     * @return 项目监测指标配置列表
+     * @author lixing
+     * @version V1.0 2021/9/17 9:27 下午
+     */
+    private List<ProjectMonitorIndicatorConfigListItemVO> combineResult(
+            List<MonitorIndicator> monitorIndicators, List<GroupManagementVo> objList) {
+        List<ProjectMonitorIndicatorConfigListItemVO> recordList = new ArrayList<>();
+        for (MonitorIndicator monitorIndicator : monitorIndicators) {
+            for (GroupManagementVo obj : objList) {
+                ProjectMonitorIndicatorConfigListItemVO projectMonitorIndicatorConfigListItemVO =
+                        new ProjectMonitorIndicatorConfigListItemVO();
+                projectMonitorIndicatorConfigListItemVO.setObj(new SimpleObjVO(obj.getId(), obj.getLocalName()));
+                projectMonitorIndicatorConfigListItemVO.setMonitorIndicator(
+                        new SimpleObjVO(monitorIndicator.getId(), monitorIndicator.getName()));
+                recordList.add(projectMonitorIndicatorConfigListItemVO);
+            }
         }
+        return recordList;
+    }
+
+    /**
+     * 根据项目监测指标配置查询条件获取应该加载的设备
+     *
+     * @param pageQueryProjectMonitorIndicatorConfigDTO 项目监测指标配置查询条件
+     * @return 设备列表
+     * @author lixing
+     * @version V1.0 2021/9/17 9:03 下午
+     */
+    private List<GroupManagementVo> queryEquipList(PageQueryProjectMonitorIndicatorConfigDTO pageQueryProjectMonitorIndicatorConfigDTO) {
         String projectId = PoemsContext.getContext().getProjectId();
         GroupManagementDTO groupManagementDTO = new GroupManagementDTO();
-        groupManagementService.equipsQuery(managementDTO);
-        return null;
+        groupManagementDTO.setClassCode(pageQueryProjectMonitorIndicatorConfigDTO.getClassCode());
+        groupManagementDTO.setCondition(pageQueryProjectMonitorIndicatorConfigDTO.getCondition());
+        groupManagementDTO.setProjectId(projectId);
+        groupManagementDTO.setLocalName(pageQueryProjectMonitorIndicatorConfigDTO.getObjName());
+        return groupManagementService.getEquipList(groupManagementDTO);
     }
 
     /**

+ 3 - 2
src/main/java/com/persagy/apm/common/aspect/AlarmDataAspect.java

@@ -2,6 +2,7 @@ package com.persagy.apm.common.aspect;
 
 import com.persagy.apm.common.context.poems.PoemsContext;
 import com.persagy.apm.energyalarmstarter.alarmdata.feign.AlarmUrlParam;
+import com.persagy.apm.energyalarmstarter.alarmdata.model.dto.common.UrlParamDTO;
 import org.apache.commons.lang.StringUtils;
 import org.aspectj.lang.JoinPoint;
 import org.aspectj.lang.annotation.Aspect;
@@ -33,11 +34,11 @@ public class AlarmDataAspect {
             return;
         }
         for (Object arg : args) {
-            if (!(arg instanceof AlarmUrlParam)) {
+            if (!(arg instanceof UrlParamDTO)) {
                 continue;
             }
             // 通用参数配置
-            AlarmUrlParam argParam = (AlarmUrlParam) arg;
+            UrlParamDTO argParam = (UrlParamDTO) arg;
             argParam.setProjectId(PoemsContext.getContext().getProjectId());
             argParam.setUserId(PoemsContext.getContext().getUserId());
             argParam.setGroupCode(PoemsContext.getContext().getGroupCode());

+ 22 - 3
src/main/java/com/persagy/apm/common/enums/AlarmDicTypeEnum.java

@@ -1,8 +1,10 @@
 package com.persagy.apm.common.enums;
 
 import com.persagy.apm.common.model.annotation.SwaggerDisplayEnum;
+import lombok.AllArgsConstructor;
 import lombok.Getter;
 import lombok.Setter;
+import org.apache.commons.lang.StringUtils;
 
 /**
  * 报警字典类型
@@ -11,6 +13,7 @@ import lombok.Setter;
  * @version V1.0 2021/9/13 10:01 上午
  **/
 @SwaggerDisplayEnum
+@AllArgsConstructor
 public enum AlarmDicTypeEnum {
     /**
      * 字典类型
@@ -30,9 +33,25 @@ public enum AlarmDicTypeEnum {
     @Getter
     private String desc;
 
-    AlarmDicTypeEnum(String type, String desc) {
-        this.type = type;
-        this.desc = desc;
+    /**
+     * 根据type获取到枚举对象
+     *
+     * @param type 报告状态编码
+     * @return 报告状态枚举对象
+     * @author lixing
+     * @version V1.0 2021/5/31 4:06 下午
+     */
+    public static AlarmDicTypeEnum getByType(String type) {
+        if (StringUtils.isBlank(type)) {
+            return null;
+        }
+        AlarmDicTypeEnum[] enums = AlarmDicTypeEnum.values();
+        for (AlarmDicTypeEnum item : enums) {
+            if (type.equals(item.getType())) {
+                return item;
+            }
+        }
+        return null;
     }
 }
 

+ 1 - 0
src/main/java/com/persagy/apm/model/dto/GroupManagementDTO.java

@@ -3,6 +3,7 @@ package com.persagy.apm.model.dto;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
+import lombok.NoArgsConstructor;
 
 import javax.validation.constraints.NotBlank;
 

+ 1 - 1
src/main/resources/mapper/ProjectMonitorIndicatorConfigMapper.xml

@@ -5,7 +5,7 @@
 		<result column="id" property="id" />
 		<result column="obj_id" property="objId" />
 		<result column="monitor_indicator_id" property="monitorIndicatorId" />
-		<result column="caculate_method_id" property="caculateMethodId" />
+		<result column="calculate_method_id" property="calculateMethodId" />
 		<result column="project_id" property="projectId" />
 		<result column="ts" property="ts" />
 		<result column="creator" property="creator" />