diff --git a/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/pojo/dto/DevDetailDTO.java b/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/pojo/dto/DevDetailDTO.java index 1061065..96d1786 100644 --- a/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/pojo/dto/DevDetailDTO.java +++ b/cs-device/cs-device-api/src/main/java/com/njcn/csdevice/pojo/dto/DevDetailDTO.java @@ -40,6 +40,9 @@ public class DevDetailDTO { @ApiModelProperty(value = "设备MAC地址") private String devMac; + @ApiModelProperty(value = "nDid") + private String nDid; + @ApiModelProperty(value = "监测点id集合") private List lineList; } diff --git a/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/service/impl/CsLedgerServiceImpl.java b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/service/impl/CsLedgerServiceImpl.java index 3f4fe27..6f2d4fb 100644 --- a/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/service/impl/CsLedgerServiceImpl.java +++ b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/service/impl/CsLedgerServiceImpl.java @@ -846,6 +846,7 @@ public class CsLedgerServiceImpl extends ServiceImpl i device.setEquipmentName(dev.getName()); device.setEquipmentId(devId); device.setDevMac(po.getMac()); + device.setNDid(po.getNdid()); device.setProjectId("/"); device.setProjectName("/"); device.setEngineeringid("/"); @@ -854,6 +855,7 @@ public class CsLedgerServiceImpl extends ServiceImpl i device.setEquipmentName(dev.getName()); device.setEquipmentId(devId); device.setDevMac(po.getMac()); + device.setNDid(po.getNdid()); CsLedger project = this.findDataById(dev.getPid()); if (ObjectUtil.isNotNull(project)) { device.setProjectId(project.getId()); diff --git a/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/service/impl/PortableOfflLogServiceImpl.java b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/service/impl/PortableOfflLogServiceImpl.java index e9d15db..0d93963 100644 --- a/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/service/impl/PortableOfflLogServiceImpl.java +++ b/cs-device/cs-device-boot/src/main/java/com/njcn/csdevice/service/impl/PortableOfflLogServiceImpl.java @@ -681,7 +681,7 @@ public class PortableOfflLogServiceImpl extends ServiceImpl ,d.NAME lineName diff --git a/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/service/AppNotificationService.java b/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/service/AppNotificationService.java deleted file mode 100644 index 3a64c5d..0000000 --- a/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/service/AppNotificationService.java +++ /dev/null @@ -1,113 +0,0 @@ -package com.njcn.csharmonic.service; - -import cn.hutool.core.collection.CollectionUtil; -import cn.hutool.core.date.DatePattern; -import com.njcn.access.pojo.dto.NoticeUserDto; -import com.njcn.access.utils.SendMessageUtil; -import com.njcn.csdevice.api.DeviceMessageFeignClient; -import com.njcn.csdevice.param.DeviceMessageParam; -import com.njcn.csdevice.pojo.dto.DevDetailDTO; -import com.njcn.csharmonic.pojo.po.CsEventUserPO; -import com.njcn.system.api.EpdFeignClient; -import com.njcn.user.pojo.po.User; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.scheduling.annotation.Async; -import org.springframework.stereotype.Service; - -import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; -import java.util.stream.Collectors; - -/** - * @author xy - */ -@Service -@Slf4j -@RequiredArgsConstructor -public class AppNotificationService { - - private final EpdFeignClient epdFeignClient; - private final SendMessageUtil sendMessageUtil; - private final DeviceMessageFeignClient deviceMessageClient; - private final CsEventUserPOService csEventUserPOService; - - @Async("eventNotificationExecutor") - public void asyncSaveEventUserAndNotify(String eventId - , List eventUser - , DevDetailDTO devDetailDto - , LocalDateTime time - , Integer eventType - , Double amplitude - , Double persistTime) { - NoticeUserDto noticeUserDto = new NoticeUserDto(); - NoticeUserDto.Payload payload = new NoticeUserDto.Payload(); - List result = new ArrayList<>(); - - eventUser.forEach(item -> { - CsEventUserPO csEventUser = new CsEventUserPO(); - csEventUser.setUserId(item); - csEventUser.setStatus(0); - csEventUser.setEventId(eventId); - result.add(csEventUser); - }); - - DeviceMessageParam param = new DeviceMessageParam(); - param.setUserList(eventUser); - param.setEventType(0); - List users = deviceMessageClient.getSendUserByType(param).getData(); - if (CollectionUtil.isNotEmpty(users)) { - List devCodeList = users.stream().map(User::getDevCode).distinct().collect(Collectors.toList()); - noticeUserDto.setPushClientId(devCodeList); - noticeUserDto.setTitle("暂态事件"); - } - - String eventName = epdFeignClient.findByName(getTag(eventType)).getData().getShowName(); - String content = devDetailDto.getEngineeringName() + "-" + devDetailDto.getProjectName() + "-" + devDetailDto.getEquipmentName() - + "于" + time.format(DatePattern.NORM_DATETIME_MS_FORMATTER) + "发生暂态事件,事件类型:" - + eventName - + ",特征幅值:" + amplitude + "%" - + ",持续时间:" + persistTime + "s"; - noticeUserDto.setContent(content); - payload.setType(0); - payload.setPath("/pages/index/message1?type=" + payload.getType()); - noticeUserDto.setPayload(payload); - - if (CollectionUtil.isNotEmpty(noticeUserDto.getPushClientId())) { - List filteredList = noticeUserDto.getPushClientId().stream() - .filter(s -> s != null && !s.isEmpty()) - .distinct() - .collect(Collectors.toList()); - if (CollectionUtil.isNotEmpty(filteredList)) { - noticeUserDto.setPushClientId(filteredList); - sendMessageUtil.sendEventToUser(noticeUserDto); - } - } - if (CollectionUtil.isNotEmpty(result)) { - csEventUserPOService.saveBatch(result); - } - } - - public String getTag(Integer type) { - String tag; - switch (type) { - case 1: - tag = "Evt_Sys_DipStr"; - break; - case 2: - tag = "Evt_Sys_SwlStr"; - break; - case 3: - tag = "Evt_Sys_IntrStr"; - break; - case 4: - tag = "Transient"; - break; - default: - tag = "Un_Know"; - break; - } - return tag; - } -} diff --git a/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/service/SmsNotificationService.java b/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/service/SmsNotificationService.java deleted file mode 100644 index f633999..0000000 --- a/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/service/SmsNotificationService.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.njcn.csharmonic.service; - -import cn.hutool.core.collection.CollectionUtil; -import cn.hutool.core.date.DatePattern; -import cn.hutool.core.util.StrUtil; -import com.njcn.csdevice.api.SmsSendFeignClient; -import com.njcn.csdevice.pojo.dto.DevDetailDTO; -import com.njcn.cssystem.api.AppMsgSetFeignClient; -import com.njcn.user.api.UserFeignClient; -import com.njcn.user.pojo.po.User; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.scheduling.annotation.Async; -import org.springframework.stereotype.Service; - -import java.time.LocalDateTime; -import java.util.List; -import java.util.Objects; -import java.util.stream.Collectors; - -/** - * @author xy - */ -@Service -@Slf4j -@RequiredArgsConstructor -public class SmsNotificationService { - private final AppMsgSetFeignClient appMsgSetFeignClient; - private final UserFeignClient userFeignClient; - private final SmsSendFeignClient smsSendFeignClient; - @Value("${msg.msg_sign:南京灿能电力}") - private String msgSign; - - @Async("smsNotificationExecutor") - public void asyncSendSmsNotification(String deviceId - , DevDetailDTO devDetailDto - , LocalDateTime eventTime - , Double amplitude - , Double persistTime) { - List userIdList = appMsgSetFeignClient.queryUserIdsByDeviceId(deviceId).getData(); - if (CollectionUtil.isNotEmpty(userIdList)) { - List userList = userFeignClient.getUserListByIds(userIdList).getData(); - if (CollectionUtil.isNotEmpty(userList)) { - List userList1 = userList.stream() - .filter(item -> StrUtil.isNotBlank(item.getPhone()) && Objects.equals(item.getSmsNotice(), 1)) - .collect(Collectors.toList()); - if (CollectionUtil.isNotEmpty(userList1)) { - String msgContent = "【" + msgSign + "】" + devDetailDto.getEngineeringName() + "-" + devDetailDto.getProjectName() + "-" + devDetailDto.getEquipmentName() - + "于" + eventTime.format(DatePattern.NORM_DATETIME_MS_FORMATTER) + "发生暂降事件" - + ",特征幅值:" + amplitude + "%" - + ",持续时间:" + persistTime + "s"; - userList1.forEach(item -> { - smsSendFeignClient.sendSmsSimple(item.getPhone(), msgContent, "verify_code"); - }); - } - } - } - } -} diff --git a/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/service/impl/CsEventPOServiceImpl.java b/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/service/impl/CsEventPOServiceImpl.java index 68bd7ef..c9b53b5 100644 --- a/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/service/impl/CsEventPOServiceImpl.java +++ b/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/service/impl/CsEventPOServiceImpl.java @@ -13,10 +13,11 @@ import com.baomidou.dynamic.datasource.annotation.DSTransactional; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.njcn.advance.api.EventCauseFeignClient; +import com.njcn.advance.pojo.dto.EventAnalysisDTO; import com.njcn.common.pojo.exception.BusinessException; import com.njcn.csdevice.api.CsLedgerFeignClient; import com.njcn.csdevice.api.CsLineFeignClient; -import com.njcn.csdevice.api.DeviceMessageFeignClient; import com.njcn.csdevice.enums.AlgorithmResponseEnum; import com.njcn.csdevice.pojo.dto.DevDetailDTO; import com.njcn.csdevice.pojo.po.CsLinePO; @@ -33,11 +34,12 @@ import com.njcn.csharmonic.pojo.po.CsEventPO; import com.njcn.csharmonic.pojo.vo.CsEventVO; import com.njcn.csharmonic.pojo.vo.CsWarnDescVO; import com.njcn.csharmonic.pojo.vo.EventDetailVO; -import com.njcn.csharmonic.service.AppNotificationService; import com.njcn.csharmonic.service.CsEventPOService; import com.njcn.csharmonic.service.CsEventUserPOService; -import com.njcn.csharmonic.service.SmsNotificationService; +import com.njcn.cssystem.api.MsgSendFeignClient; +import com.njcn.cssystem.pojo.param.MsgSendParam; import com.njcn.event.common.mapper.WlRmpEventDetailMapper; +import com.njcn.event.common.service.EventAnalysisService; import com.njcn.event.file.component.WaveFileComponent; import com.njcn.event.file.component.WavePicComponent; import com.njcn.event.file.pojo.bo.WaveDataDetail; @@ -57,6 +59,7 @@ import com.njcn.system.api.DicDataFeignClient; import com.njcn.system.api.EleEvtFeignClient; import com.njcn.system.api.EpdFeignClient; import com.njcn.system.enums.DicDataEnum; +import com.njcn.system.enums.DicDataTypeEnum; import com.njcn.system.pojo.po.DictData; import com.njcn.system.pojo.po.EleEpdPqd; import com.njcn.system.pojo.po.EleEvtParm; @@ -71,7 +74,6 @@ import org.influxdb.InfluxDB; import org.influxdb.dto.BatchPoints; import org.influxdb.dto.Point; import org.springframework.beans.BeanUtils; -import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; @@ -120,13 +122,9 @@ public class CsEventPOServiceImpl extends ServiceImpl queryEventList(CsEventUserQueryParam csEventUserQueryParam) { @@ -393,6 +391,8 @@ public class CsEventPOServiceImpl extends ServiceImpl records = new ArrayList(); @@ -412,8 +412,6 @@ public class CsEventPOServiceImpl extends ServiceImpl eventUser = deviceMessageClient.getEventUserByDeviceId(po.getDeviceId(),true).getData(); //获取台账信息 DevDetailDTO devDetailDto = csLedgerFeignclient.queryDevDetail(po.getDeviceId()).getData(); LocalDateTime eventTime = LocalDateTime.parse(param.getStartTime(), DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_MS_PATTERN)); @@ -423,7 +421,18 @@ public class CsEventPOServiceImpl extends ServiceImpl list1 = dicDataFeignClient.getDicDataByTypeCode(DicDataTypeEnum.EVENT_REASON.getCode()).getData(); + String id1 = list1.stream() + .filter(item -> Objects.equals(item.getAlgoDescribe(), dto.getCause())) + .map(DictData::getId) + .findFirst() + .orElse(null); + List list2 = dicDataFeignClient.getDicDataByTypeCode(DicDataTypeEnum.EVENT_TYPE.getCode()).getData(); + String id2 = list2.stream() + .filter(item -> Objects.equals(item.getAlgoDescribe(), dto.getType())) + .map(DictData::getId) + .findFirst() + .orElse(null); //更新文件信息 //先校验两份文件的名称是否一致 this.lambdaUpdate() .eq(CsEventPO::getLineId,param.getMonitorId()) .eq(CsEventPO::getStartTime,param.getStartTime()) .set(CsEventPO::getWavePath,param.getWavePath()) + .set(CsEventPO::getAdvanceReason,id1) + .set(CsEventPO::getAdvanceType,id2) .update(); //更新文件信息 - updateEvent(param); + updateEvent(param,id1,id2); } } } @@ -486,11 +518,13 @@ public class CsEventPOServiceImpl extends ServiceImpl wrapper = new LambdaQueryWrapper<>(); wrapper.eq(RmpEventDetailPO::getMeasurementPointId,param.getMonitorId()).eq(RmpEventDetailPO::getStartTime,param.getStartTime()); RmpEventDetailPO po = wlRmpEventDetailMapper.selectOne(wrapper); po.setWavePath(param.getWavePath()); + po.setAdvanceReason(advanceReason); + po.setAdvanceType(advanceType); po.setFileFlag(1); wlRmpEventDetailMapper.updateById(po); } diff --git a/cs-system/cs-system-api/src/main/java/com/njcn/cssystem/api/MsgSendFeignClient.java b/cs-system/cs-system-api/src/main/java/com/njcn/cssystem/api/MsgSendFeignClient.java new file mode 100644 index 0000000..161044f --- /dev/null +++ b/cs-system/cs-system-api/src/main/java/com/njcn/cssystem/api/MsgSendFeignClient.java @@ -0,0 +1,26 @@ +package com.njcn.cssystem.api; + +import com.njcn.common.pojo.constant.ServerInfo; +import com.njcn.common.pojo.response.HttpResult; +import com.njcn.cssystem.api.fallback.MsgSendFeignClientFallbackFactory; +import com.njcn.cssystem.pojo.param.MsgSendParam; +import io.swagger.annotations.ApiOperation; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; + +/** + * @author xy + */ +@FeignClient(value = ServerInfo.CS_SYSTEM_BOOT, path = "/send", fallbackFactory = MsgSendFeignClientFallbackFactory.class,contextId = "send") +public interface MsgSendFeignClient { + + @PostMapping("/appMsgSend") + @ApiOperation("app消息推送") + HttpResult appMsgSend(@RequestBody MsgSendParam param); + + @PostMapping("/smsMsgSend") + @ApiOperation("短信消息推送") + HttpResult smsMsgSend(@RequestBody MsgSendParam param); + +} diff --git a/cs-system/cs-system-api/src/main/java/com/njcn/cssystem/api/fallback/MsgSendFeignClientFallbackFactory.java b/cs-system/cs-system-api/src/main/java/com/njcn/cssystem/api/fallback/MsgSendFeignClientFallbackFactory.java new file mode 100644 index 0000000..0ce8e94 --- /dev/null +++ b/cs-system/cs-system-api/src/main/java/com/njcn/cssystem/api/fallback/MsgSendFeignClientFallbackFactory.java @@ -0,0 +1,41 @@ +package com.njcn.cssystem.api.fallback; + +import com.njcn.common.pojo.enums.response.CommonResponseEnum; +import com.njcn.common.pojo.exception.BusinessException; +import com.njcn.common.pojo.response.HttpResult; +import com.njcn.cssystem.api.MsgSendFeignClient; +import com.njcn.cssystem.pojo.param.MsgSendParam; +import feign.hystrix.FallbackFactory; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +/** + * @author xy + */ +@Slf4j +@Component +public class MsgSendFeignClientFallbackFactory implements FallbackFactory { + @Override + public MsgSendFeignClient create(Throwable cause) { + //判断抛出异常是否为解码器抛出的业务异常 + Enum exceptionEnum = CommonResponseEnum.SERVICE_FALLBACK; + if (cause.getCause() instanceof BusinessException) { + BusinessException businessException = (BusinessException) cause.getCause(); + } + Enum finalExceptionEnum = exceptionEnum; + return new MsgSendFeignClient() { + + @Override + public HttpResult appMsgSend(MsgSendParam param) { + log.error("{}异常,降级处理,异常为:{}","app消息推送异常",cause.toString()); + throw new BusinessException(finalExceptionEnum); + } + + @Override + public HttpResult smsMsgSend(MsgSendParam param) { + log.error("{}异常,降级处理,异常为:{}","短信消息推送异常",cause.toString()); + throw new BusinessException(finalExceptionEnum); + } + }; + } +} diff --git a/cs-system/cs-system-api/src/main/java/com/njcn/cssystem/pojo/param/MsgSendParam.java b/cs-system/cs-system-api/src/main/java/com/njcn/cssystem/pojo/param/MsgSendParam.java new file mode 100644 index 0000000..60fd696 --- /dev/null +++ b/cs-system/cs-system-api/src/main/java/com/njcn/cssystem/pojo/param/MsgSendParam.java @@ -0,0 +1,45 @@ +package com.njcn.cssystem.pojo.param; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; + +/** + * @author xy + */ +@Data +public class MsgSendParam implements Serializable { + + @ApiModelProperty("事件类型") + private Integer eventType; + + @ApiModelProperty("类型") + private String type; + + @ApiModelProperty("设备id") + private String devId; + + @ApiModelProperty("事件名称") + private String eventName; + + @ApiModelProperty("事件时间") + private LocalDateTime eventTime; + + @ApiModelProperty("事件id") + private String id; + + @ApiModelProperty("nDid") + private String nDid; + + @ApiModelProperty("暂态幅值") + private Double amplitude; + + @ApiModelProperty("持续时间") + private Double persistTime; + + @ApiModelProperty("落点位置") + private String dropZone; +} diff --git a/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/config/AsyncConfig.java b/cs-system/cs-system-boot/src/main/java/com/njcn/cssystem/config/AsyncConfig.java similarity index 97% rename from cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/config/AsyncConfig.java rename to cs-system/cs-system-boot/src/main/java/com/njcn/cssystem/config/AsyncConfig.java index e071d4c..3b8240b 100644 --- a/cs-harmonic/cs-harmonic-boot/src/main/java/com/njcn/csharmonic/config/AsyncConfig.java +++ b/cs-system/cs-system-boot/src/main/java/com/njcn/cssystem/config/AsyncConfig.java @@ -1,4 +1,4 @@ -package com.njcn.csharmonic.config; +package com.njcn.cssystem.config; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Bean; diff --git a/cs-system/cs-system-boot/src/main/java/com/njcn/cssystem/controller/sendmsg/MsgSendController.java b/cs-system/cs-system-boot/src/main/java/com/njcn/cssystem/controller/sendmsg/MsgSendController.java new file mode 100644 index 0000000..ae77338 --- /dev/null +++ b/cs-system/cs-system-boot/src/main/java/com/njcn/cssystem/controller/sendmsg/MsgSendController.java @@ -0,0 +1,50 @@ +package com.njcn.cssystem.controller.sendmsg; + + +import com.njcn.common.pojo.annotation.OperateInfo; +import com.njcn.common.pojo.enums.common.LogEnum; +import com.njcn.common.pojo.enums.response.CommonResponseEnum; +import com.njcn.common.pojo.response.HttpResult; +import com.njcn.common.utils.HttpResultUtil; +import com.njcn.cssystem.pojo.param.MsgSendParam; +import com.njcn.cssystem.service.IMsgSendService; +import com.njcn.web.controller.BaseController; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +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; + +/** + * @author xy + */ +@Slf4j +@RestController +@RequestMapping("/send") +@Api(tags = "消息推送") +@AllArgsConstructor +public class MsgSendController extends BaseController { + + private final IMsgSendService msgSendService; + @OperateInfo(info = LogEnum.BUSINESS_COMMON) + @PostMapping("/appMsgSend") + @ApiOperation("app消息推送") + public HttpResult appMsgSend(@RequestBody MsgSendParam param){ + String methodDescribe = getMethodDescribe("appMsgSend"); + msgSendService.sendAppNotification(param); + return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, null, methodDescribe); + } + + @OperateInfo(info = LogEnum.BUSINESS_COMMON) + @PostMapping("/smsMsgSend") + @ApiOperation("短信消息推送") + public HttpResult smsMsgSend(@RequestBody MsgSendParam param){ + String methodDescribe = getMethodDescribe("smsMsgSend"); + msgSendService.sendSmsForDipEvent(param); + return HttpResultUtil.assembleCommonResponseResult(CommonResponseEnum.SUCCESS, null, methodDescribe); + } + +} diff --git a/cs-system/cs-system-boot/src/main/java/com/njcn/cssystem/mapper/CsEventUserMapper.java b/cs-system/cs-system-boot/src/main/java/com/njcn/cssystem/mapper/CsEventUserMapper.java new file mode 100644 index 0000000..f391db5 --- /dev/null +++ b/cs-system/cs-system-boot/src/main/java/com/njcn/cssystem/mapper/CsEventUserMapper.java @@ -0,0 +1,16 @@ +package com.njcn.cssystem.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.njcn.csharmonic.pojo.po.CsEventUserPO; + +/** + *

+ * 暂态事件表 Mapper 接口 + *

+ * + * @author xuyang + * @since 2023-08-23 + */ +public interface CsEventUserMapper extends BaseMapper { + +} diff --git a/cs-system/cs-system-boot/src/main/java/com/njcn/cssystem/service/ICsEventUserService.java b/cs-system/cs-system-boot/src/main/java/com/njcn/cssystem/service/ICsEventUserService.java new file mode 100644 index 0000000..98f79f2 --- /dev/null +++ b/cs-system/cs-system-boot/src/main/java/com/njcn/cssystem/service/ICsEventUserService.java @@ -0,0 +1,16 @@ +package com.njcn.cssystem.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.njcn.csharmonic.pojo.po.CsEventUserPO; + +/** + *

+ * 暂态事件表 服务类 + *

+ * + * @author xuyang + * @since 2023-08-23 + */ +public interface ICsEventUserService extends IService { + +} diff --git a/cs-system/cs-system-boot/src/main/java/com/njcn/cssystem/service/IMsgSendService.java b/cs-system/cs-system-boot/src/main/java/com/njcn/cssystem/service/IMsgSendService.java new file mode 100644 index 0000000..1474d10 --- /dev/null +++ b/cs-system/cs-system-boot/src/main/java/com/njcn/cssystem/service/IMsgSendService.java @@ -0,0 +1,15 @@ +package com.njcn.cssystem.service; + + +import com.njcn.cssystem.pojo.param.MsgSendParam; + +/** + * @author xy + */ +public interface IMsgSendService { + + void sendAppNotification(MsgSendParam param); + + void sendSmsForDipEvent(MsgSendParam param); + +} diff --git a/cs-system/cs-system-boot/src/main/java/com/njcn/cssystem/service/impl/CsEventUserServiceImpl.java b/cs-system/cs-system-boot/src/main/java/com/njcn/cssystem/service/impl/CsEventUserServiceImpl.java new file mode 100644 index 0000000..19dce66 --- /dev/null +++ b/cs-system/cs-system-boot/src/main/java/com/njcn/cssystem/service/impl/CsEventUserServiceImpl.java @@ -0,0 +1,20 @@ +package com.njcn.cssystem.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.njcn.csharmonic.pojo.po.CsEventUserPO; +import com.njcn.cssystem.mapper.CsEventUserMapper; +import com.njcn.cssystem.service.ICsEventUserService; +import org.springframework.stereotype.Service; + +/** + *

+ * 暂态事件表 服务实现类 + *

+ * + * @author xuyang + * @since 2023-08-23 + */ +@Service +public class CsEventUserServiceImpl extends ServiceImpl implements ICsEventUserService { + +} diff --git a/cs-system/cs-system-boot/src/main/java/com/njcn/cssystem/service/impl/IMsgSendServiceImpl.java b/cs-system/cs-system-boot/src/main/java/com/njcn/cssystem/service/impl/IMsgSendServiceImpl.java new file mode 100644 index 0000000..da07ab1 --- /dev/null +++ b/cs-system/cs-system-boot/src/main/java/com/njcn/cssystem/service/impl/IMsgSendServiceImpl.java @@ -0,0 +1,286 @@ +package com.njcn.cssystem.service.impl; + +import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.util.StrUtil; +import com.njcn.access.pojo.dto.NoticeUserDto; +import com.njcn.access.utils.SendMessageUtil; +import com.njcn.csdevice.api.*; +import com.njcn.csdevice.param.DeviceMessageParam; +import com.njcn.csdevice.pojo.dto.DevDetailDTO; +import com.njcn.csdevice.pojo.po.CsEventSendMsg; +import com.njcn.csharmonic.pojo.po.CsEventUserPO; +import com.njcn.cssystem.api.AppMsgSetFeignClient; +import com.njcn.cssystem.pojo.param.MsgSendParam; +import com.njcn.cssystem.service.ICsEventUserService; +import com.njcn.cssystem.service.IMsgSendService; +import com.njcn.system.api.EpdFeignClient; +import com.njcn.user.api.UserFeignClient; +import com.njcn.user.pojo.po.User; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * @author 徐扬 + */ +@Service +@RequiredArgsConstructor +@Slf4j +public class IMsgSendServiceImpl implements IMsgSendService { + + private final DeviceMessageFeignClient deviceMessageFeignClient; + private final EquipmentFeignClient equipmentFeignClient; + private final EpdFeignClient epdFeignClient; + private final ICsEventUserService csEventUserService; + private final SendMessageUtil sendMessageUtil; + private final EventLogsFeignClient eventLogsFeignClient; + private final CsLedgerFeignClient csLedgerFeignClient; + private final AppMsgSetFeignClient appMsgSetFeignClient; + private final UserFeignClient userFeignClient; + private final SmsSendFeignClient smsSendFeignClient; + private final CsLedgerFeignClient csLedgerFeignclient; + @Value("${msg.msg_sign:南京灿能电力}") + private String msgSign; + + @Override + @Async("eventNotificationExecutor") + public void sendAppNotification(MsgSendParam param) { + int code; + List users = new ArrayList<>(); + List eventUser; + List devCodeList; + List userList = new ArrayList<>(); + List csEventSendMsgList = new ArrayList<>(); + NoticeUserDto noticeUserDto = new NoticeUserDto(); + NoticeUserDto.Payload payload = new NoticeUserDto.Payload(); + String content = null; + List result = new ArrayList<>(); + //获取设备类型 true:治理设备 false:其他类型的设备 + boolean devModel = equipmentFeignClient.judgeDevModel(param.getNDid()).getData(); + if (devModel) { + DevDetailDTO devDetailDto = csLedgerFeignClient.queryDevDetail(param.getDevId()).getData(); + //事件处理 + if (param.getEventType() == 1){ + param.setEventName(epdFeignClient.findByName(param.getEventName()).getData().getShowName()); + switch (param.getType()) { + case "1": + code = 3; + //设备自身事件 不推送给用户,推送给业务管理 + eventUser = deviceMessageFeignClient.getEventUserByDeviceId(param.getDevId(),false).getData(); + if (CollectionUtil.isNotEmpty(eventUser)) { + eventUser.forEach(item->{ + CsEventUserPO csEventUser = new CsEventUserPO(); + csEventUser.setUserId(item); + csEventUser.setStatus(0); + csEventUser.setEventId(param.getId()); + result.add(csEventUser); + }); + + DeviceMessageParam param1 = new DeviceMessageParam(); + param1.setUserList(eventUser); + param1.setEventType(2); + users = deviceMessageFeignClient.getSendUserByType(param1).getData(); + if (CollectionUtil.isNotEmpty(users)){ + for (User user : users){ + userList.add(user.getDevCode()); + } + noticeUserDto.setPushClientId(userList); + noticeUserDto.setTitle("运行事件"); + } + } + break; + case "2": + code = 0; + //暂态事件 + eventUser = deviceMessageFeignClient.getEventUserByDeviceId(param.getDevId(),true).getData(); + if (CollectionUtil.isNotEmpty(eventUser)) { + eventUser.forEach(item->{ + CsEventUserPO csEventUser = new CsEventUserPO(); + csEventUser.setUserId(item); + csEventUser.setStatus(0); + csEventUser.setEventId(param.getId()); + result.add(csEventUser); + }); + DeviceMessageParam param1 = new DeviceMessageParam(); + param1.setUserList(eventUser); + param1.setEventType(0); + users = deviceMessageFeignClient.getSendUserByType(param1).getData(); + if (CollectionUtil.isNotEmpty(users)){ + devCodeList = users.stream().map(User::getDevCode).distinct().collect(Collectors.toList()); + noticeUserDto.setPushClientId(devCodeList); + noticeUserDto.setTitle("暂态事件"); + content = devDetailDto.getEngineeringName() + "-" + devDetailDto.getProjectName() + "-" + devDetailDto.getEquipmentName() + + "于" + param.getEventTime().format(DatePattern.NORM_DATETIME_MS_FORMATTER) + "发生暂态事件,事件类型:" + + param.getEventName() + + ",特征幅值:" + param.getAmplitude() + "%" + + ",持续时间:" + param.getPersistTime() + "s" + + ",落点区域:" + (Objects.isNull(param.getDropZone())?"未知":param.getDropZone()); + } + } + break; +// case "3": +// code = 1; +// //稳态事件 +// eventUser = getEventUser(devId,true); +// if (CollectionUtil.isNotEmpty(eventUser)) { +// eventUser.forEach(item->{ +// CsEventUserPO csEventUser = new CsEventUserPO(); +// csEventUser.setUserId(item); +// csEventUser.setStatus(0); +// csEventUser.setEventId(id); +// result.add(csEventUser); +// }); +// users = getSendUser(eventUser,1); +// if (CollectionUtil.isNotEmpty(users)){ +// devCodeList = users.stream().map(User::getDevCode).distinct().collect(Collectors.toList()); +// noticeUserDto.setPushClientId(devCodeList); +// noticeUserDto.setTitle("稳态事件"); +// } +// } +// break; + default: + code = 0; + break; + } + //获取台账信息 + if (Objects.isNull(content)) { + content = devDetailDto.getEngineeringName() + + "-" + devDetailDto.getProjectName() + + "-" + devDetailDto.getEquipmentName() + + "于" + param.getEventTime().format(DatePattern.NORM_DATETIME_MS_FORMATTER) + + "发生" + param.getEventName(); + } + noticeUserDto.setContent(content); + payload.setType(code); + payload.setPath("/pages/index/message1?type="+payload.getType()); + noticeUserDto.setPayload(payload); + } +// //告警处理 +// else if (eventType == 2){ +// switch (type) { +// case "1": +// //Ⅰ级告警 不推送给用户,推送给业务管理 +// eventUser = getEventUser(devId,false); +// if (CollectionUtil.isNotEmpty(eventUser)) { +// eventUser.forEach(item->{ +// CsEventUserPO csEventUser = new CsEventUserPO(); +// csEventUser.setUserId(item); +// csEventUser.setStatus(0); +// csEventUser.setEventId(id); +// result.add(csEventUser); +// }); +// users = getSendUser(eventUser,3); +// if (CollectionUtil.isNotEmpty(users)){ +// eventName = epdFeignClient.findByName(eventName).getData().getShowName(); +// devCodeList = users.stream().map(User::getDevCode).distinct().collect(Collectors.toList()); +// noticeUserDto.setPushClientId(devCodeList); +// } +// } +// break; +// case "2": +// eventName = epdFeignClient.findByName(eventName).getData().getShowName(); +// case "3": +// //Ⅱ、Ⅲ级告警推送相关用户及业务管理员 +// eventUser = getEventUser(devId,true); +// if (CollectionUtil.isNotEmpty(eventUser)) { +// eventUser.forEach(item->{ +// CsEventUserPO csEventUser = new CsEventUserPO(); +// csEventUser.setUserId(item); +// csEventUser.setStatus(0); +// csEventUser.setEventId(id); +// result.add(csEventUser); +// }); +// users = getSendUser(eventUser,3); +// if (CollectionUtil.isNotEmpty(users)){ +// devCodeList = users.stream().map(User::getDevCode).distinct().collect(Collectors.toList()); +// noticeUserDto.setPushClientId(devCodeList); +// } +// } +// break; +// default: +// break; +// } +// noticeUserDto.setTitle("告警事件"); +// DevDetailDTO devDetailDto = csLedgerFeignclient.queryDevDetail(devId).getData(); +// content = devDetailDto.getEngineeringName() + "-" + devDetailDto.getProjectName() + "-" + devDetailDto.getEquipmentName() + "于" + eventTime.format(DatePattern.NORM_DATETIME_MS_FORMATTER) + "发生告警,告警信息:" + eventName; +// noticeUserDto.setContent(content); +// payload.setType(3); +// payload.setPath("/pages/message/message?type="+payload.getType()); +// noticeUserDto.setPayload(payload); +// } + if (CollectionUtil.isNotEmpty(noticeUserDto.getPushClientId())) { + List filteredList = noticeUserDto.getPushClientId().stream() + .filter(Objects::nonNull) + .distinct() + .collect(Collectors.toList()); + if (CollectionUtil.isNotEmpty(filteredList)) { + noticeUserDto.setPushClientId(filteredList); + sendMessageUtil.sendEventToUser(noticeUserDto); + } + } + //记录推送日志 + for (User item : users) { + CsEventSendMsg csEventSendMsg = new CsEventSendMsg(); + csEventSendMsg.setUserId(item.getId()); + csEventSendMsg.setEventId(param.getId()); + csEventSendMsg.setSendTime(LocalDateTime.now()); + if (Objects.isNull(item.getDevCode())){ + csEventSendMsg.setStatus(0); + csEventSendMsg.setRemark("用户设备识别码为空"); + } else { + csEventSendMsg.setDevCode(item.getDevCode()); + csEventSendMsg.setStatus(1); + } + csEventSendMsgList.add(csEventSendMsg); + } + eventLogsFeignClient.addLogs(csEventSendMsgList); + //事件用户关系入库 + if (CollectionUtil.isNotEmpty(result)){ + csEventUserService.saveBatch(result); + } + } + } + + @Override + @Async("smsNotificationExecutor") + public void sendSmsForDipEvent(MsgSendParam param) { + try { + List userIdList = appMsgSetFeignClient.queryUserIdsByDeviceId(param.getDevId()).getData(); + if (CollectionUtil.isNotEmpty(userIdList)) { + List userList = userFeignClient.getUserListByIds(userIdList).getData(); + if (CollectionUtil.isNotEmpty(userList)) { + List userList1 = userList.stream() + .filter(item -> StrUtil.isNotBlank(item.getPhone()) && Objects.equals(item.getSmsNotice(), 1)) + .collect(Collectors.toList()); + if (CollectionUtil.isNotEmpty(userList1)) { + DevDetailDTO devDetailDto = csLedgerFeignclient.queryDevDetail(param.getDevId()).getData(); + String msgContent = "【" + msgSign + "】" + devDetailDto.getEngineeringName() + + "-" + devDetailDto.getProjectName() + "-" + devDetailDto.getEquipmentName() + + "于" + param.getEventTime().format(DatePattern.NORM_DATETIME_MS_FORMATTER) + "发生暂降事件" + + ",特征幅值:" + param.getAmplitude() + "%" + + ",持续时间:" + param.getPersistTime() + "s" + + ",落点区域:" + (Objects.isNull(param.getDropZone())?"未知":param.getDropZone()); + userList1.forEach(item -> { + try { + smsSendFeignClient.sendSmsSimple(item.getPhone(), msgContent, "verify_code"); + } catch (Exception e) { + log.error("发送短信失败,手机号: {}", item.getPhone(), e); + } + }); + } + } + } + } catch (Exception e) { + log.error("异步发送暂降事件短信失败,设备ID: {}", param.getDevId(), e); + } + } +}