From 3281c30526b4a2034c04a0ece2b76e714c5351ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=AE=B5=E9=A3=9E=E5=AE=87?= <2684146481@qq.com> Date: Wed, 13 Sep 2023 11:36:28 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E6=93=8D=E4=BD=9C=E7=A5=A8=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/OperationTicketServiceImpl.java | 44 ++++++++++++++++++--- .../service/impl/TicketProcessServiceImpl.java | 4 +- .../main/resources/template/电气操作票.docx | Bin 48540 -> 48878 bytes 3 files changed, 40 insertions(+), 8 deletions(-) diff --git a/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/standardTicket/service/impl/OperationTicketServiceImpl.java b/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/standardTicket/service/impl/OperationTicketServiceImpl.java index 7940416..3b46de4 100644 --- a/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/standardTicket/service/impl/OperationTicketServiceImpl.java +++ b/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/standardTicket/service/impl/OperationTicketServiceImpl.java @@ -118,10 +118,10 @@ public class OperationTicketServiceImpl implements OperationTicketService { //获取站点编号 String signage = station.getSignage(); - if (StringUtils.isBlank(signage) || signage.length() < 2) { + if (StringUtils.isBlank(signage)) { throw new ServiceException("票据抬头未配置,请您到站点管理配置"); } - signage = signage.length() == 2 ? station.getSignage() : station.getSignage().substring(0, 2); + //signage = signage.length() == 2 ? station.getSignage() : station.getSignage().substring(0, 2); standardTicketInfoVo.setSignage(signage); standardTicketInfoVo.setSignageCode(station.getCode()); @@ -168,8 +168,9 @@ public class OperationTicketServiceImpl implements OperationTicketService { try { JSONObject jsonObject = JSONObject.parseObject(formData); // standardTicketInfoVo = JSONObject.toJavaObject(jsonObject, StandardTicketInfoVo.class); - standardTicketInfoVo = JSONObject.parseObject(jsonObject.getString("standardTicketInfoVo"), - new TypeReference(){}); + standardTicketInfoVo = JSONObject.parseObject(jsonObject.getString("standardTicketInfoVo"), + new TypeReference() { + }); } catch (Exception e) { log.error("获取表单出现异常了~~~~"); e.printStackTrace(); @@ -401,10 +402,10 @@ public class OperationTicketServiceImpl implements OperationTicketService { result = "DZ"; break; case "4": - result = type; + result = "KJ"; break; case "5": - result = type; + result = "TJ"; break; default: result = "DZ"; @@ -433,6 +434,11 @@ public class OperationTicketServiceImpl implements OperationTicketService { Map workTicketInfoMap = this.convertMap(standardTicketInfoVo); //导入下在word Map resultMap = OperationWordHelper.resultMap(workTicketInfoMap); + + + String name = getBuilder(standardTicketInfoVo.getTicketType()); + resultMap.put("headTitle", name); + String workTicketStatus = OperationWordHelper.getWorkTicketStatus(status); String os = TicketConstant.OS_NAME; //Windows操作系统 @@ -453,6 +459,32 @@ public class OperationTicketServiceImpl implements OperationTicketService { /** + * 获取操作票的名称 + * + * @param ticketType + * @return + */ + private String getBuilder(String ticketType) { + String result = null; + switch (ticketType) { + case "3": + result = "倒闸"; + break; + case "4": + result = "开机"; + break; + case "5": + result = "停机"; + break; + default: + result = "倒闸"; + break; + } + return result; + } + + + /** * 将查询的数据转换为map * * @param standardTicketInfoVo diff --git a/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/twoTicket/service/impl/TicketProcessServiceImpl.java b/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/twoTicket/service/impl/TicketProcessServiceImpl.java index 1d8c7fa..eee0811 100644 --- a/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/twoTicket/service/impl/TicketProcessServiceImpl.java +++ b/hzims-service/ticket/src/main/java/com/hnac/hzims/ticket/twoTicket/service/impl/TicketProcessServiceImpl.java @@ -188,10 +188,10 @@ public class TicketProcessServiceImpl implements TicketProcessService { //获取站点编号 String signage = station.getSignage(); - if (StringUtils.isBlank(signage) || signage.length() < 2) { + if (StringUtils.isBlank(signage)) { throw new ServiceException("票据抬头未配置,请您到站点管理配置"); } - signage = signage.length() == 2 ? station.getSignage() : station.getSignage().substring(0, 2); + //signage = signage.length() == 2 ? station.getSignage() : station.getSignage().substring(0, 2); workTicketVo.getWorkTicket().setSignage(station.getSignage()); workTicketVo.getWorkTicket().setSignageCode(station.getCode()); diff --git a/hzims-service/ticket/src/main/resources/template/电气操作票.docx b/hzims-service/ticket/src/main/resources/template/电气操作票.docx index 18d85af09dfdeadd8282d2aee8bee2fad358bb2b..3272f23f1b8f4126ab26787318a5316962fef872 100644 GIT binary patch delta 19582 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 z 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 delta 19331 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 Date: Wed, 13 Sep 2023 14:44:03 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E6=97=A5=E5=B8=B8=E7=BB=B4=E6=8A=A4?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E7=AB=99=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../entity/OperMaintenancePlanEntity.java | 6 ++ .../dto/OperMaintenanceMonitorReportMonthDTO.java | 5 + .../impl/OperMaintenanceMonitorServiceImpl.java | 107 +++++++++++---------- .../operational/src/main/resources/db/1.0.1.sql | 1 + 4 files changed, 66 insertions(+), 53 deletions(-) create mode 100644 hzims-service/operational/src/main/resources/db/1.0.1.sql diff --git a/hzims-service-api/hzims-operational-api/src/main/java/com/hnac/hzims/operational/maintenance/entity/OperMaintenancePlanEntity.java b/hzims-service-api/hzims-operational-api/src/main/java/com/hnac/hzims/operational/maintenance/entity/OperMaintenancePlanEntity.java index 968d033..82364f4 100644 --- a/hzims-service-api/hzims-operational-api/src/main/java/com/hnac/hzims/operational/maintenance/entity/OperMaintenancePlanEntity.java +++ b/hzims-service-api/hzims-operational-api/src/main/java/com/hnac/hzims/operational/maintenance/entity/OperMaintenancePlanEntity.java @@ -108,4 +108,10 @@ public class OperMaintenancePlanEntity extends TenantEntity { @JsonSerialize(nullsUsing = NullSerializer.class) private Long messageTemplateId; + + /** + * 站点code + */ + private String stationCode; + } diff --git a/hzims-service/operational/src/main/java/com/hnac/hzims/operational/maintenance/dto/OperMaintenanceMonitorReportMonthDTO.java b/hzims-service/operational/src/main/java/com/hnac/hzims/operational/maintenance/dto/OperMaintenanceMonitorReportMonthDTO.java index 53147cb..5e5405b 100644 --- a/hzims-service/operational/src/main/java/com/hnac/hzims/operational/maintenance/dto/OperMaintenanceMonitorReportMonthDTO.java +++ b/hzims-service/operational/src/main/java/com/hnac/hzims/operational/maintenance/dto/OperMaintenanceMonitorReportMonthDTO.java @@ -24,4 +24,9 @@ public class OperMaintenanceMonitorReportMonthDTO implements Serializable { @ApiModelProperty(value = "月", required = true) private Integer month; + + /** + * 站点code + */ + private String stationCode; } diff --git a/hzims-service/operational/src/main/java/com/hnac/hzims/operational/maintenance/service/impl/OperMaintenanceMonitorServiceImpl.java b/hzims-service/operational/src/main/java/com/hnac/hzims/operational/maintenance/service/impl/OperMaintenanceMonitorServiceImpl.java index 6c21a91..cc007e1 100644 --- a/hzims-service/operational/src/main/java/com/hnac/hzims/operational/maintenance/service/impl/OperMaintenanceMonitorServiceImpl.java +++ b/hzims-service/operational/src/main/java/com/hnac/hzims/operational/maintenance/service/impl/OperMaintenanceMonitorServiceImpl.java @@ -12,6 +12,7 @@ import com.hnac.hzims.operational.maintenance.mapper.OperMaintenanceTaskMapper; import com.hnac.hzims.operational.maintenance.service.IOperMaintenanceMonitorService; import com.hnac.hzims.operational.maintenance.vo.OperMaintenancePlanVO; import com.hnac.hzims.operational.maintenance.wrapper.OperMaintenancePlanWrapper; +import org.apache.commons.lang3.StringUtils; import org.springblade.core.tool.api.R; import org.springblade.core.tool.utils.*; import org.springblade.system.user.cache.UserCache; @@ -32,61 +33,61 @@ import java.util.stream.Collectors; **/ @Service public class OperMaintenanceMonitorServiceImpl implements IOperMaintenanceMonitorService { - @Autowired - private OperMaintenanceParameterMapper parameterMapper; - @Autowired - private OperMaintenanceTaskMapper taskMapper; - @Autowired - private OperMaintenancePlanMapper planMapper; - @Autowired - private IImsDutyClassService imsDutyClassService; + @Autowired + private OperMaintenanceParameterMapper parameterMapper; + @Autowired + private OperMaintenanceTaskMapper taskMapper; + @Autowired + private OperMaintenancePlanMapper planMapper; + @Autowired + private IImsDutyClassService imsDutyClassService; - @Override - public R>> reportMonth(OperMaintenanceMonitorReportMonthDTO req) { - List planEntities = planMapper.selectList(new LambdaQueryWrapper() {{ - LocalDate startDate = LocalDate.of(req.getYear(), req.getMonth(),1); - // Date startTime = DateUtil.parse(DateUtil.format(DateUtil.now(), "yyyy-MM") + "-01", DateUtil.PATTERN_DATE); - eq(OperMaintenancePlanEntity::getIsDeleted, 0L); - ge(OperMaintenancePlanEntity::getDisposeTime, startDate); - lt(OperMaintenancePlanEntity::getDisposeTime, startDate.with(TemporalAdjusters.lastDayOfMonth())); - }}); + @Override + public R>> reportMonth(OperMaintenanceMonitorReportMonthDTO req) { + List planEntities = planMapper.selectList(new LambdaQueryWrapper() {{ + LocalDate startDate = LocalDate.of(req.getYear(), req.getMonth(), 1); + // Date startTime = DateUtil.parse(DateUtil.format(DateUtil.now(), "yyyy-MM") + "-01", DateUtil.PATTERN_DATE); + eq(OperMaintenancePlanEntity::getIsDeleted, 0L); + ge(OperMaintenancePlanEntity::getDisposeTime, startDate); + lt(OperMaintenancePlanEntity::getDisposeTime, startDate.with(TemporalAdjusters.lastDayOfMonth())) + .eq(StringUtils.isNoneBlank(req.getStationCode()), OperMaintenancePlanEntity::getStationCode, req.getStationCode()); + }}); - //获取列表班次ID集合 - List classIdList = planEntities.stream().filter(planEntity -> ObjectUtil.isNotEmpty(planEntity.getImsDutyClassId())) - .map(OperMaintenancePlanEntity::getImsDutyClassId).collect(Collectors.toList()); - IImsDutyClassService imsDutyClassService = SpringUtil.getBean(IImsDutyClassService.class); - Map> classMap = null; - if(CollectionUtil.isNotEmpty(classIdList)) { - List classEntityList = imsDutyClassService.list(new LambdaQueryWrapper(){{ - in(ImsDutyClassEntity::getId,classIdList); - }}); - if(CollectionUtil.isNotEmpty(classEntityList)) { - classMap = classEntityList.stream().collect(Collectors.groupingBy(ImsDutyClassEntity::getId)); - } - } + //获取列表班次ID集合 + List classIdList = planEntities.stream().filter(planEntity -> ObjectUtil.isNotEmpty(planEntity.getImsDutyClassId())) + .map(OperMaintenancePlanEntity::getImsDutyClassId).collect(Collectors.toList()); + IImsDutyClassService imsDutyClassService = SpringUtil.getBean(IImsDutyClassService.class); + Map> classMap = null; + if (CollectionUtil.isNotEmpty(classIdList)) { + List classEntityList = imsDutyClassService.list(new LambdaQueryWrapper() {{ + in(ImsDutyClassEntity::getId, classIdList); + }}); + if (CollectionUtil.isNotEmpty(classEntityList)) { + classMap = classEntityList.stream().collect(Collectors.groupingBy(ImsDutyClassEntity::getId)); + } + } - //完善班次与执行人 - List operMaintenancePlanVOS = new ArrayList<>(); - Map> finalClassMap = classMap; - planEntities.forEach(planEntity -> { - OperMaintenancePlanVO planVO = BeanUtil.copy(planEntity,OperMaintenancePlanVO.class); - if(ObjectUtil.isNotEmpty(planEntity.getImsDutyClassId())) { - //类型为班次时 获取班次名称 - planVO.setDutyClassName(finalClassMap.get(planEntity.getImsDutyClassId()).get(0).getClassName()); - } - else if(ObjectUtil.isNotEmpty(planEntity.getDisposer())) { - //类型为人员类型时 获取执行人名称 - planVO.setDisposerName(Optional.ofNullable(UserCache.getUser(planEntity.getDisposer())).map(User::getName).orElse(null)); - } - //当月是否生成任务 默认是false - LocalDateTime createTaskTime = com.hnac.hzims.common.utils.DateUtil.DateToLocalDateTime(planEntity.getCreateTaskTime()); - if(ObjectUtil.isNotEmpty(createTaskTime) && com.hnac.hzims.common.utils.DateUtil.judgeSameDay(createTaskTime, LocalDate.now())) { - planVO.setGenerateSign(true); - } - operMaintenancePlanVOS.add(planVO); - }); + //完善班次与执行人 + List operMaintenancePlanVOS = new ArrayList<>(); + Map> finalClassMap = classMap; + planEntities.forEach(planEntity -> { + OperMaintenancePlanVO planVO = BeanUtil.copy(planEntity, OperMaintenancePlanVO.class); + if (ObjectUtil.isNotEmpty(planEntity.getImsDutyClassId())) { + //类型为班次时 获取班次名称 + planVO.setDutyClassName(finalClassMap.get(planEntity.getImsDutyClassId()).get(0).getClassName()); + } else if (ObjectUtil.isNotEmpty(planEntity.getDisposer())) { + //类型为人员类型时 获取执行人名称 + planVO.setDisposerName(Optional.ofNullable(UserCache.getUser(planEntity.getDisposer())).map(User::getName).orElse(null)); + } + //当月是否生成任务 默认是false + LocalDateTime createTaskTime = com.hnac.hzims.common.utils.DateUtil.DateToLocalDateTime(planEntity.getCreateTaskTime()); + if (ObjectUtil.isNotEmpty(createTaskTime) && com.hnac.hzims.common.utils.DateUtil.judgeSameDay(createTaskTime, LocalDate.now())) { + planVO.setGenerateSign(true); + } + operMaintenancePlanVOS.add(planVO); + }); - Map> data = operMaintenancePlanVOS.stream().collect(Collectors.groupingBy(o -> DateUtil.formatDate(o.getDisposeTime()))); - return R.data(new TreeMap<>(data)); - } + Map> data = operMaintenancePlanVOS.stream().collect(Collectors.groupingBy(o -> DateUtil.formatDate(o.getDisposeTime()))); + return R.data(new TreeMap<>(data)); + } } diff --git a/hzims-service/operational/src/main/resources/db/1.0.1.sql b/hzims-service/operational/src/main/resources/db/1.0.1.sql new file mode 100644 index 0000000..657046f --- /dev/null +++ b/hzims-service/operational/src/main/resources/db/1.0.1.sql @@ -0,0 +1 @@ +alter table hzims_oper_maintenance_plan add station_code varchar(60) comment '站点编码' \ No newline at end of file From b12808ec5fbcecde7f0d0faef52f062bb2f03d7f Mon Sep 17 00:00:00 2001 From: yang_shj <1069818635@QQ.com> Date: Wed, 13 Sep 2023 15:35:02 +0800 Subject: [PATCH 3/3] =?UTF-8?q?#=E5=91=8A=E8=AD=A6=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hnac/hzims/alarm/constants/AlarmConstants.java | 52 +++++- .../java/com/hnac/hzims/alarm/vo/AlarmCountVo.java | 14 +- .../com/hnac/hzims/alarm/vo/ChildAlarmCountVo.java | 21 +++ .../config/mapper/AlarmConfigDetailMapper.java | 3 +- .../alarm/config/mapper/AlarmConfigMapper.java | 7 +- .../config/service/AlarmConfigDetailService.java | 2 + .../alarm/config/service/AlarmConfigService.java | 4 + .../service/impl/AlarmConfigDetailServiceImpl.java | 11 ++ .../service/impl/AlarmConfigServiceImpl.java | 176 ++++++++++++++++++++- .../alarm/show/controller/AlarmController.java | 12 +- .../hzims/alarm/show/service/AlarmService.java | 2 +- .../alarm/show/service/impl/AlarmServiceImpl.java | 111 ++++++++++++- .../resources/mapper/AlarmConfigDetatilMapper.xml | 11 ++ .../main/resources/mapper/AlarmConfigMapper.xml | 18 +++ 14 files changed, 419 insertions(+), 25 deletions(-) create mode 100644 hzims-service-api/alarm-api/src/main/java/com/hnac/hzims/alarm/vo/ChildAlarmCountVo.java diff --git a/hzims-service-api/alarm-api/src/main/java/com/hnac/hzims/alarm/constants/AlarmConstants.java b/hzims-service-api/alarm-api/src/main/java/com/hnac/hzims/alarm/constants/AlarmConstants.java index 190e1d0..209a88d 100644 --- a/hzims-service-api/alarm-api/src/main/java/com/hnac/hzims/alarm/constants/AlarmConstants.java +++ b/hzims-service-api/alarm-api/src/main/java/com/hnac/hzims/alarm/constants/AlarmConstants.java @@ -1,9 +1,59 @@ package com.hnac.hzims.alarm.constants; +import com.sun.org.apache.bcel.internal.generic.NEW; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + /** * @author ysj */ public interface AlarmConstants { - public final static String APP_NAME = "hzims-alarm"; + String APP_NAME = "hzims-alarm"; + + // 1-集中监控右侧列表 + Integer IS_RIGHT_TABULATION = 1; + // 2-集中监控弹窗 + Integer IS_SHOW_ALERT = 2; + // 3-集中监控铃铛 + Integer IS_SMALL_BELL = 3; + // 4-集中监控遮罩 + Integer IS_MASK = 4; + // 5-语音播报 + Integer IS_BROADCAST = 5; + // 6-WEB/APP消息推送 + Integer IS_PLATFORM_MESSAGE = 6; + // 7-短信推送 + Integer IS_SHORT_MESSAGE = 7; + // 8-微信公众号消息推送 + Integer IS_WX_MESSAGE = 8; + + + // 告警来源 : 0- HZ3000告警 1 -等级告警 2 -条件告警 3-FDP智能预警 + Integer HZ3000_ALARM = 0; + Integer LEVEL_ALARM = 1; + Integer CONDITION_ALARM = 2; + Integer EARLY_WARNING = 3; + List ALARAM_SOURCES = Arrays.asList(HZ3000_ALARM,LEVEL_ALARM,CONDITION_ALARM,EARLY_WARNING); + + // 子类告警 + // HZ3000告警 : 2-告警 3-故障 5-遥测越限 13-通讯中断 14-数据异常 + // 等级告警 : 21-一级告警 22-二级告警 23-三级告警 + // 智能预警 : 30-智能预警 + // 条件告警 : 40-条件告警 + Integer WARNING = 2; + Integer FAULT = 3; + Integer OFFSIDE = 5; + Integer INTERRUPT = 13; + Integer ABNORMAL = 14; + List HZ3000_ALARAM = Arrays.asList(WARNING,FAULT,OFFSIDE,INTERRUPT,ABNORMAL); + Integer ONE_LEVEL = 21; + Integer TWO_LEVEL = 22; + Integer THREE_LEVEL = 23; + List LEVEL_ALARAM = Arrays.asList(ONE_LEVEL,TWO_LEVEL,THREE_LEVEL); + Integer EARLY = 30; + Integer CONDITION = 40; + } diff --git a/hzims-service-api/alarm-api/src/main/java/com/hnac/hzims/alarm/vo/AlarmCountVo.java b/hzims-service-api/alarm-api/src/main/java/com/hnac/hzims/alarm/vo/AlarmCountVo.java index 2645d1d..20cd0e6 100644 --- a/hzims-service-api/alarm-api/src/main/java/com/hnac/hzims/alarm/vo/AlarmCountVo.java +++ b/hzims-service-api/alarm-api/src/main/java/com/hnac/hzims/alarm/vo/AlarmCountVo.java @@ -5,17 +5,23 @@ import com.fasterxml.jackson.databind.ser.std.NullSerializer; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import java.util.List; + /** * @author ysj */ @Data public class AlarmCountVo { - @ApiModelProperty(value = "告警子类") + @ApiModelProperty(value = "告警类型") + @JsonSerialize(nullsUsing = NullSerializer.class) + private Integer type; + + @ApiModelProperty(value = "告警条目数量") @JsonSerialize(nullsUsing = NullSerializer.class) - private Long type; + private Long count; - @ApiModelProperty(value = "告警条码数量") + @ApiModelProperty(value = "子类告警数量集合") @JsonSerialize(nullsUsing = NullSerializer.class) - private Integer count; + private List childs; } \ No newline at end of file diff --git a/hzims-service-api/alarm-api/src/main/java/com/hnac/hzims/alarm/vo/ChildAlarmCountVo.java b/hzims-service-api/alarm-api/src/main/java/com/hnac/hzims/alarm/vo/ChildAlarmCountVo.java new file mode 100644 index 0000000..b97e89c --- /dev/null +++ b/hzims-service-api/alarm-api/src/main/java/com/hnac/hzims/alarm/vo/ChildAlarmCountVo.java @@ -0,0 +1,21 @@ +package com.hnac.hzims.alarm.vo; + +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.fasterxml.jackson.databind.ser.std.NullSerializer; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author ysj + */ +@Data +public class ChildAlarmCountVo { + + @ApiModelProperty(value = "告警子类") + @JsonSerialize(nullsUsing = NullSerializer.class) + private Integer type; + + @ApiModelProperty(value = "告警条目数量") + @JsonSerialize(nullsUsing = NullSerializer.class) + private Long count; +} \ No newline at end of file diff --git a/hzims-service/hzims-alarm/src/main/java/com/hnac/hzims/alarm/config/mapper/AlarmConfigDetailMapper.java b/hzims-service/hzims-alarm/src/main/java/com/hnac/hzims/alarm/config/mapper/AlarmConfigDetailMapper.java index adc3877..1759832 100644 --- a/hzims-service/hzims-alarm/src/main/java/com/hnac/hzims/alarm/config/mapper/AlarmConfigDetailMapper.java +++ b/hzims-service/hzims-alarm/src/main/java/com/hnac/hzims/alarm/config/mapper/AlarmConfigDetailMapper.java @@ -2,11 +2,12 @@ package com.hnac.hzims.alarm.config.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.hnac.hzims.alarm.entity.AlarmConfigDetailEntity; +import org.apache.ibatis.annotations.Param; /** * @author ysj */ public interface AlarmConfigDetailMapper extends BaseMapper { - + AlarmConfigDetailEntity isSupport(@Param(value = "code") String code, @Param(value = "source") Integer source, @Param(value = "type") Integer type); } diff --git a/hzims-service/hzims-alarm/src/main/java/com/hnac/hzims/alarm/config/mapper/AlarmConfigMapper.java b/hzims-service/hzims-alarm/src/main/java/com/hnac/hzims/alarm/config/mapper/AlarmConfigMapper.java index 104bbd6..5742381 100644 --- a/hzims-service/hzims-alarm/src/main/java/com/hnac/hzims/alarm/config/mapper/AlarmConfigMapper.java +++ b/hzims-service/hzims-alarm/src/main/java/com/hnac/hzims/alarm/config/mapper/AlarmConfigMapper.java @@ -2,11 +2,14 @@ package com.hnac.hzims.alarm.config.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.hnac.hzims.alarm.entity.AlarmConfigEntity; +import org.apache.ibatis.annotations.Param; + +import java.util.List; /** * @author ysj */ public interface AlarmConfigMapper extends BaseMapper { - -} + List exclude(@Param(value = "operate") Integer operate); +} \ No newline at end of file diff --git a/hzims-service/hzims-alarm/src/main/java/com/hnac/hzims/alarm/config/service/AlarmConfigDetailService.java b/hzims-service/hzims-alarm/src/main/java/com/hnac/hzims/alarm/config/service/AlarmConfigDetailService.java index f97d9d6..daf7fb2 100644 --- a/hzims-service/hzims-alarm/src/main/java/com/hnac/hzims/alarm/config/service/AlarmConfigDetailService.java +++ b/hzims-service/hzims-alarm/src/main/java/com/hnac/hzims/alarm/config/service/AlarmConfigDetailService.java @@ -1,6 +1,7 @@ package com.hnac.hzims.alarm.config.service; import com.hnac.hzims.alarm.entity.AlarmConfigDetailEntity; +import com.hnac.hzims.alarm.entity.AlarmConfigEntity; import org.springblade.core.mp.base.BaseService; /** @@ -8,4 +9,5 @@ import org.springblade.core.mp.base.BaseService; */ public interface AlarmConfigDetailService extends BaseService { + AlarmConfigDetailEntity isSupport(String code, Integer source, Integer type); } \ No newline at end of file diff --git a/hzims-service/hzims-alarm/src/main/java/com/hnac/hzims/alarm/config/service/AlarmConfigService.java b/hzims-service/hzims-alarm/src/main/java/com/hnac/hzims/alarm/config/service/AlarmConfigService.java index bee58ab..17ef3eb 100644 --- a/hzims-service/hzims-alarm/src/main/java/com/hnac/hzims/alarm/config/service/AlarmConfigService.java +++ b/hzims-service/hzims-alarm/src/main/java/com/hnac/hzims/alarm/config/service/AlarmConfigService.java @@ -3,10 +3,14 @@ package com.hnac.hzims.alarm.config.service; import com.hnac.hzims.alarm.entity.AlarmConfigEntity; import org.springblade.core.mp.base.BaseService; +import java.util.List; + /** * @author ysj */ public interface AlarmConfigService extends BaseService { + List exclude(Integer operate); + boolean isSupport(String code,Integer source,Integer type,Integer operate); } \ No newline at end of file diff --git a/hzims-service/hzims-alarm/src/main/java/com/hnac/hzims/alarm/config/service/impl/AlarmConfigDetailServiceImpl.java b/hzims-service/hzims-alarm/src/main/java/com/hnac/hzims/alarm/config/service/impl/AlarmConfigDetailServiceImpl.java index 944a7e5..0edcd3f 100644 --- a/hzims-service/hzims-alarm/src/main/java/com/hnac/hzims/alarm/config/service/impl/AlarmConfigDetailServiceImpl.java +++ b/hzims-service/hzims-alarm/src/main/java/com/hnac/hzims/alarm/config/service/impl/AlarmConfigDetailServiceImpl.java @@ -16,4 +16,15 @@ import org.springframework.stereotype.Service; @Slf4j public class AlarmConfigDetailServiceImpl extends BaseServiceImpl implements AlarmConfigDetailService { + /** + * 查询告警配置对象 + * @param code : 站点编码 + * @param source : 告警来源 + * @param type : 告警子类 + * @return + */ + @Override + public AlarmConfigDetailEntity isSupport(String code, Integer source, Integer type) { + return this.baseMapper.isSupport(code,source,type); + } } \ No newline at end of file diff --git a/hzims-service/hzims-alarm/src/main/java/com/hnac/hzims/alarm/config/service/impl/AlarmConfigServiceImpl.java b/hzims-service/hzims-alarm/src/main/java/com/hnac/hzims/alarm/config/service/impl/AlarmConfigServiceImpl.java index d1ed03f..cb5aac1 100644 --- a/hzims-service/hzims-alarm/src/main/java/com/hnac/hzims/alarm/config/service/impl/AlarmConfigServiceImpl.java +++ b/hzims-service/hzims-alarm/src/main/java/com/hnac/hzims/alarm/config/service/impl/AlarmConfigServiceImpl.java @@ -1,13 +1,21 @@ package com.hnac.hzims.alarm.config.service.impl; import com.hnac.hzims.alarm.config.mapper.AlarmConfigMapper; +import com.hnac.hzims.alarm.config.service.AlarmConfigDetailService; import com.hnac.hzims.alarm.config.service.AlarmConfigService; +import com.hnac.hzims.alarm.constants.AlarmConstants; +import com.hnac.hzims.alarm.entity.AlarmConfigDetailEntity; import com.hnac.hzims.alarm.entity.AlarmConfigEntity; +import io.swagger.models.auth.In; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springblade.core.mp.base.BaseServiceImpl; +import org.springblade.core.tool.utils.ObjectUtil; +import org.springblade.core.tool.utils.StringUtil; import org.springframework.stereotype.Service; +import java.util.List; + /** * @author ysj */ @@ -16,6 +24,18 @@ import org.springframework.stereotype.Service; @Slf4j public class AlarmConfigServiceImpl extends BaseServiceImpl implements AlarmConfigService { + private final AlarmConfigDetailService detailService; + + /** + * 排除站点 + * @param operate : 操作类型 + * @return + */ + @Override + public List exclude(Integer operate) { + return this.baseMapper.exclude(operate); + } + /** * 是否支持操作 * @param code : 站点编码 @@ -26,10 +46,45 @@ public class AlarmConfigServiceImpl extends BaseServiceImpl> counts(@RequestParam Integer type) { - return R.data(alarmService.counts(type)); + @ApiOperation(value = "告警分类数量", notes = "不需要传入参数") + public R> counts() { + return R.data(alarmService.counts()); } } \ No newline at end of file diff --git a/hzims-service/hzims-alarm/src/main/java/com/hnac/hzims/alarm/show/service/AlarmService.java b/hzims-service/hzims-alarm/src/main/java/com/hnac/hzims/alarm/show/service/AlarmService.java index ae4e5dc..2f2ed5e 100644 --- a/hzims-service/hzims-alarm/src/main/java/com/hnac/hzims/alarm/show/service/AlarmService.java +++ b/hzims-service/hzims-alarm/src/main/java/com/hnac/hzims/alarm/show/service/AlarmService.java @@ -14,5 +14,5 @@ public interface AlarmService extends BaseService { IPage alarms(AlarmEntity alarm, IPage page); - List counts(Integer type); + List counts(); } \ No newline at end of file diff --git a/hzims-service/hzims-alarm/src/main/java/com/hnac/hzims/alarm/show/service/impl/AlarmServiceImpl.java b/hzims-service/hzims-alarm/src/main/java/com/hnac/hzims/alarm/show/service/impl/AlarmServiceImpl.java index 791b43a..69ff394 100644 --- a/hzims-service/hzims-alarm/src/main/java/com/hnac/hzims/alarm/show/service/impl/AlarmServiceImpl.java +++ b/hzims-service/hzims-alarm/src/main/java/com/hnac/hzims/alarm/show/service/impl/AlarmServiceImpl.java @@ -1,16 +1,25 @@ package com.hnac.hzims.alarm.show.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.hnac.hzims.alarm.config.service.AlarmConfigService; +import com.hnac.hzims.alarm.constants.AlarmConstants; import com.hnac.hzims.alarm.entity.AlarmEntity; import com.hnac.hzims.alarm.show.mapper.AlarmMapper; import com.hnac.hzims.alarm.show.service.AlarmService; import com.hnac.hzims.alarm.vo.AlarmCountVo; +import com.hnac.hzims.alarm.vo.ChildAlarmCountVo; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springblade.core.mp.base.BaseServiceImpl; +import org.springblade.core.tool.utils.CollectionUtil; +import org.springblade.core.tool.utils.StringUtil; import org.springframework.stereotype.Service; +import java.util.ArrayList; +import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; /** * @author ysj @@ -20,6 +29,8 @@ import java.util.List; @Slf4j public class AlarmServiceImpl extends BaseServiceImpl implements AlarmService { + private final AlarmConfigService configService; + /** * 查询告警列表 * @param alarm @@ -28,26 +39,110 @@ public class AlarmServiceImpl extends BaseServiceImpl */ @Override public IPage alarms(AlarmEntity alarm, IPage page) { - // 参数过滤 :站点、时间、告警来源、告警子类 - // 排除站点 + List codes = configService.exclude(AlarmConstants.IS_RIGHT_TABULATION); + // 参数过滤 :站点、告警来源、告警子类 + QueryWrapper wrapper = new QueryWrapper<>(); + if(!StringUtil.isEmpty(alarm.getStationId())){ + wrapper.eq("STATION_ID",alarm.getStationId()); + } + if(!StringUtil.isEmpty(alarm.getAlarmSource())){ + wrapper.eq("ALARM_SOURCE",alarm.getAlarmSource()); + } + if(!StringUtil.isEmpty(alarm.getAlarmType())){ + wrapper.eq("ALARM_TYPE",alarm.getAlarmType()); + } + if(!CollectionUtil.isEmpty(codes)){ + wrapper.notIn("STATION_ID",codes); + } // 查询数据 - return null; + return this.page(page,wrapper); } /** * 查询告警数量 - * @param type * @return */ @Override - public List counts(Integer type) { - // 参数过滤 :站点、时间、告警来源、告警子类 - + public List counts() { // 排除站点 + List codes = configService.exclude(AlarmConstants.IS_RIGHT_TABULATION); + + // 查询告警数据 + QueryWrapper wrapper = new QueryWrapper<>(); + if(CollectionUtil.isNotEmpty(codes)){ + wrapper.notIn("STATION_ID",codes); + } + List alarms = this.list(wrapper); // 查询数量 - return null; + return AlarmConstants.ALARAM_SOURCES.stream().map(source->{ + AlarmCountVo count = new AlarmCountVo(); + count.setType(source); + if(CollectionUtil.isNotEmpty(alarms)){ + count.setCount(0L); + }else{ + count.setCount(alarms.stream().filter(o->o.getAlarmSource().equals(source)).count()); + } + count.setChilds(this.childs(source,alarms.stream().filter(o->o.getAlarmSource().equals(source)).collect(Collectors.toList()))); + return count; + }).collect(Collectors.toList()); + } + + + /** + * 子类型数量集合 + * @param source : 源类型 + * @param collect : 源类型告警数据 + * @return + */ + private List childs(Integer source, List collect) { + // HZ3000告警 + if(AlarmConstants.HZ3000_ALARM.equals(source)){ + return AlarmConstants.HZ3000_ALARAM.stream().map(type->{ + ChildAlarmCountVo count = new ChildAlarmCountVo(); + count.setType(type); + if(CollectionUtil.isEmpty(collect)){ + count.setCount(0L); + }else{ + count.setCount(collect.stream().filter(o->o.getAlarmType().equals(type)).count()); + } + return count; + }).collect(Collectors.toList()); + // 等级告警 + }else if(AlarmConstants.LEVEL_ALARM.equals(source)){ + return AlarmConstants.LEVEL_ALARAM.stream().map(type->{ + ChildAlarmCountVo count = new ChildAlarmCountVo(); + count.setType(type); + if(CollectionUtil.isEmpty(collect)){ + count.setCount(0L); + }else{ + count.setCount(collect.stream().filter(o->o.getAlarmType().equals(type)).count()); + } + return count; + }).collect(Collectors.toList()); + // 条件告警 + }else if(AlarmConstants.CONDITION_ALARM.equals(source)){ + ChildAlarmCountVo count = new ChildAlarmCountVo(); + count.setType(AlarmConstants.CONDITION); + if(CollectionUtil.isEmpty(collect)){ + count.setCount(0L); + }else{ + count.setCount((long) collect.size()); + } + return Collections.singletonList(count); + // 智能预警 + }else if(AlarmConstants.EARLY_WARNING.equals(source)){ + ChildAlarmCountVo count = new ChildAlarmCountVo(); + count.setType(AlarmConstants.EARLY); + if(CollectionUtil.isEmpty(collect)){ + count.setCount(0L); + }else{ + count.setCount((long) collect.size()); + } + return Collections.singletonList(count); + } + return new ArrayList<>(); } } \ No newline at end of file diff --git a/hzims-service/hzims-alarm/src/main/resources/mapper/AlarmConfigDetatilMapper.xml b/hzims-service/hzims-alarm/src/main/resources/mapper/AlarmConfigDetatilMapper.xml index 7604d5f..d29dafa 100644 --- a/hzims-service/hzims-alarm/src/main/resources/mapper/AlarmConfigDetatilMapper.xml +++ b/hzims-service/hzims-alarm/src/main/resources/mapper/AlarmConfigDetatilMapper.xml @@ -2,4 +2,15 @@ + diff --git a/hzims-service/hzims-alarm/src/main/resources/mapper/AlarmConfigMapper.xml b/hzims-service/hzims-alarm/src/main/resources/mapper/AlarmConfigMapper.xml index 93ea6b4..7692ae7 100644 --- a/hzims-service/hzims-alarm/src/main/resources/mapper/AlarmConfigMapper.xml +++ b/hzims-service/hzims-alarm/src/main/resources/mapper/AlarmConfigMapper.xml @@ -2,4 +2,22 @@ +