Przeglądaj źródła

Merge branch 'fu-dev' of uskycloud/usky-modules into master

fuyuchuan 1 dzień temu
rodzic
commit
e7dbd1b9d8

+ 147 - 55
service-alarm/service-alarm-biz/src/main/java/com/usky/alarm/service/impl/BaseAlarmNoticeResultServiceImpl.java

@@ -19,14 +19,16 @@ import com.usky.alarm.service.BaseAlarmNoticeResultService;
 import com.usky.alarm.service.config.voice.VoiceNotice;
 import com.usky.common.core.bean.CommonPage;
 import com.usky.common.mybatis.core.AbstractCrudService;
-import com.usky.common.security.utils.SecurityUtils;
+import com.usky.system.domain.MceRequestVO;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
+import com.usky.system.RemoteMceService;
 
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
+import java.util.Collections;
 import java.util.List;
 
 /**
@@ -44,77 +46,167 @@ public class BaseAlarmNoticeResultServiceImpl extends AbstractCrudService<BaseAl
     private VoiceNotice voiceNotice;
     @Autowired
     private SysUserMapper sysUserMapper;
+    @Autowired
+    private RemoteMceService remoteMceService;
+
+    private static final String SMS_SIGN_NAME = "上海永天科技股份有限公司";
+    private static final String SMS_TEMPLATE_CODE = "SMS_463791105";
+    private static final String REGION_ID = "cn-beijing";
+    private static final String ACCESS_KEY_ID = "LTAI5tH3VvRL5BUkovCokHJX";
+    private static final String ACCESS_KEY_SECRET = "SaaWUouNqvcA0C746gcNOH9m6SRYN4";
+
+    private static final String INFO_TYPE = "4";
+    private static final String INFO_TITLE = "设备告警";
+    private static final String ALARM_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
+    private static final String REMARK_TEMPLATE = "设备名称:%s,请及时处理!";
+
 
     @Override
     public CommonPage<BaseAlarmNoticeResult> resultInfo(String receiver, Integer alarmId, Integer current, Integer size) {
         IPage<BaseAlarmNoticeResult> page = new Page<>(current, size);
         LambdaQueryWrapper<BaseAlarmNoticeResult> queryWrapper1 = Wrappers.lambdaQuery();
-        queryWrapper1.like(StringUtils.isNotBlank(receiver),BaseAlarmNoticeResult::getReceiver, receiver)
+        queryWrapper1.like(StringUtils.isNotBlank(receiver), BaseAlarmNoticeResult::getReceiver, receiver)
                 .eq(BaseAlarmNoticeResult::getAlarmId, alarmId);
 //                .eq(BaseAlarmNoticeResult::getTenantId, SecurityUtils.getTenantId());
-        page = this.page(page,queryWrapper1);
-        return new CommonPage<>(page.getRecords(),page.getTotal(),page.getCurrent(),page.getSize());
+        page = this.page(page, queryWrapper1);
+        return new CommonPage<>(page.getRecords(), page.getTotal(), page.getCurrent(), page.getSize());
     }
 
-    //异步多线程调用
+    // 异步多线程调用
     @Async("asyncServiceExecutor")
     public Integer send(BaseAlarm baseAlarm, List<BaseAlarmNotice> records3, Integer alarmId, List<DmpProduct> records,
                         BaseAlarmType baseAlarmType, List<DmpDevice> records2) throws ClientException {
-        log.info("start asyncServiceExecutor--------------------");
+        log.info("Start asyncServiceExecutor--------------------");
         Integer saveAlarmResult = 0;
-        try{
-            String[] array = records3.get(0).getReceiver1().split(",");
-            for (String s : array) {
-                LambdaQueryWrapper<SysUser> lambdaQuery4 = Wrappers.lambdaQuery();
-                lambdaQuery4.eq(SysUser::getUserId,s)
-                        .eq(SysUser::getDelFlag,0);
-                SysUser sysUser = sysUserMapper.selectOne(lambdaQuery4);
-                BaseAlarmNoticeResult baseAlarmNoticeResult = new BaseAlarmNoticeResult();
-                baseAlarmNoticeResult.setReceiver(sysUser.getNickName());
-                baseAlarmNoticeResult.setReceiverPhone(sysUser.getPhonenumber());
-                baseAlarmNoticeResult.setAlarmId(alarmId);
-                baseAlarmNoticeResult.setNoticeTime(LocalDateTime.now());
-                baseAlarmNoticeResult.setNoticeContent(records.get(0).getProductName()+","+baseAlarmType.getTypeName()+","+baseAlarm.getAlarmTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd " +
-                        "HH:mm:ss")));
-                baseAlarmNoticeResult.setTenantId(records.get(0).getTenantId());
-                if (records3.get(0).getNoticeMethod().contains("电话")){
-                    SingleCallByTtsResponse code = voiceNotice.sendCVoice(sysUser.getPhonenumber(),
-                            records.get(0).getProductName(),baseAlarmType.getTypeName(),
-                            baseAlarm.getAlarmTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd " +
-                                    "HH:mm:ss")));
-                    baseAlarmNoticeResult.setNoticeType(3);
-                    if(code.getCode() != null && code.getCode().equals("OK")) {
-                        //请求成功
-                        baseAlarmNoticeResult.setNoticeResult(1);
-                    }else {
-                        baseAlarmNoticeResult.setNoticeResult(2);
-                    }
-                    saveAlarmResult = baseMapper.insert(baseAlarmNoticeResult);
+        String templateParam = createTemplateParam(baseAlarm, baseAlarmType, records2.get(0));
+
+        try {
+            String[] receivers = records3.get(0).getReceiver1().split(",");
+            for (String receiver : receivers) {
+                SysUser sysUser = getSysUser(receiver);
+                if (sysUser == null) {
+                    log.warn("查询不到告警接收用户: {}", receiver);
+                    continue;
                 }
-                if (records3.get(0).getNoticeMethod().contains("短信")){
-                    DefaultProfile profile = DefaultProfile.getProfile("cn-beijing", "LTAI5tH3VvRL5BUkovCokHJX", "SaaWUouNqvcA0C746gcNOH9m6SRYN4");
-                    IAcsClient client = new DefaultAcsClient(profile);
-                    SendSmsRequest request = new SendSmsRequest();
-                    request.setPhoneNumbers(sysUser.getPhonenumber());//接收短信的手机号码
-                    request.setSignName("上海永天科技股份有限公司");//短信签名名称
-                    request.setTemplateCode("SMS_463791105");//短信模板CODE
-                    request.setTemplateParam("{\"deviceName\":\""+records2.get(0).getDeviceName()+"\","+"\"time\":\""+baseAlarm.getAlarmTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd " +
-                            "HH:mm:ss"))+"\","+
-                            "\"alarmType\":\""+baseAlarmType.getTypeName()+"\","+"\"alarmContent\":\""+baseAlarm.getAlarmContent()+"\"}");
-                    SendSmsResponse code = client.getAcsResponse(request);
-                    baseAlarmNoticeResult.setNoticeType(4);
-                    if(code.getCode() != null && code.getCode().equals("OK")) {
-                        //请求成功
-                        baseAlarmNoticeResult.setNoticeResult(1);
-                    }else {
-                        baseAlarmNoticeResult.setNoticeResult(2);
-                    }
-                    saveAlarmResult = baseMapper.insert(baseAlarmNoticeResult);
+
+                BaseAlarmNoticeResult baseAlarmNoticeResult = createBaseAlarmNoticeResult(sysUser, baseAlarm, baseAlarmType, records.get(0), alarmId);
+
+                if (records3.get(0).getNoticeMethod().contains("电话")) {
+                    handleVoiceNotice(sysUser, baseAlarmNoticeResult, records.get(0), baseAlarmType, baseAlarm);
                 }
+
+                if (records3.get(0).getNoticeMethod().contains("短信")) {
+                    handleSmsNotice(sysUser, baseAlarmNoticeResult, templateParam);
+                }
+
+                if (records3.get(0).getNoticeMethod().contains("APP")) {
+                    handleMceNotice(sysUser, baseAlarmNoticeResult, baseAlarm, baseAlarmType, records2.get(0), "1");
+                }
+
+                if (records3.get(0).getNoticeMethod().contains("微信")) {
+                    handleMceNotice(sysUser, baseAlarmNoticeResult, baseAlarm, baseAlarmType, records2.get(0), "2");
+                }
+
+                saveAlarmResult = baseMapper.insert(baseAlarmNoticeResult);
             }
-        }catch (Exception e){
-            e.printStackTrace();
+        } catch (Exception e) {
+            log.error("Error in sending alarm notice", e);
         }
         return saveAlarmResult;
     }
+
+    private String createTemplateParam(BaseAlarm baseAlarm, BaseAlarmType baseAlarmType, DmpDevice device) {
+        return "{\"deviceName\":\"" + device.getDeviceName() + "\"," +
+                "\"time\":\"" + formatAlarmTime(baseAlarm.getAlarmTime()) + "\"," +
+                "\"alarmType\":\"" + baseAlarmType.getTypeName() + "\"," +
+                "\"alarmContent\":\"" + baseAlarm.getAlarmContent() + "\"}";
+    }
+
+    private SysUser getSysUser(String userId) {
+        LambdaQueryWrapper<SysUser> queryWrapper = Wrappers.lambdaQuery();
+        queryWrapper.eq(SysUser::getUserId, userId)
+                .eq(SysUser::getDelFlag, 0);
+        return sysUserMapper.selectOne(queryWrapper);
+    }
+
+    private BaseAlarmNoticeResult createBaseAlarmNoticeResult(SysUser sysUser, BaseAlarm baseAlarm, BaseAlarmType baseAlarmType, DmpProduct product, Integer alarmId) {
+        BaseAlarmNoticeResult result = new BaseAlarmNoticeResult();
+        result.setReceiver(sysUser.getNickName());
+        result.setReceiverPhone(sysUser.getPhonenumber());
+        result.setAlarmId(alarmId);
+        result.setNoticeTime(LocalDateTime.now());
+        result.setNoticeContent(product.getProductName() + "," + baseAlarmType.getTypeName() + "," + formatAlarmTime(baseAlarm.getAlarmTime()));
+        result.setTenantId(product.getTenantId());
+        return result;
+    }
+
+    private void handleVoiceNotice(SysUser sysUser, BaseAlarmNoticeResult baseAlarmNoticeResult, DmpProduct product, BaseAlarmType baseAlarmType, BaseAlarm baseAlarm) {
+        baseAlarmNoticeResult.setNoticeType(3);
+        try {
+            SingleCallByTtsResponse response = voiceNotice.sendCVoice(sysUser.getPhonenumber(),
+                    product.getProductName(), baseAlarmType.getTypeName(),
+                    formatAlarmTime(baseAlarm.getAlarmTime()));
+            baseAlarmNoticeResult.setNoticeResult(response.getCode() != null && "OK".equals(response.getCode()) ? 1 : 2);
+        } catch (Exception e) {
+            log.error("用户:{},告警消息电话拨打失败", sysUser.getUserId(), e);
+            baseAlarmNoticeResult.setNoticeResult(2);
+        }
+    }
+
+    private void handleSmsNotice(SysUser sysUser, BaseAlarmNoticeResult baseAlarmNoticeResult, String templateParam) {
+        baseAlarmNoticeResult.setNoticeType(4);
+        try {
+            IAcsClient client = createAcsClient();
+            SendSmsRequest request = new SendSmsRequest();
+            request.setPhoneNumbers(sysUser.getPhonenumber());
+            request.setSignName(SMS_SIGN_NAME);
+            request.setTemplateCode(SMS_TEMPLATE_CODE);
+            request.setTemplateParam(templateParam);
+            SendSmsResponse response = client.getAcsResponse(request);
+            baseAlarmNoticeResult.setNoticeResult(response.getCode() != null && response.getCode().equals("OK") ? 1 : 2);
+        } catch (Exception e) {
+            log.error("用户:{},告警消息短信发送失败", sysUser.getUserId(), e);
+            baseAlarmNoticeResult.setNoticeResult(2);
+        }
+    }
+
+    private IAcsClient createAcsClient() {
+        DefaultProfile profile = DefaultProfile.getProfile(REGION_ID, ACCESS_KEY_ID, ACCESS_KEY_SECRET);
+        return new DefaultAcsClient(profile);
+    }
+
+    // 发送消息中心
+    private void handleMceNotice(SysUser sysUser, BaseAlarmNoticeResult baseAlarmNoticeResult, BaseAlarm baseAlarm, BaseAlarmType baseAlarmType, DmpDevice device, String sendType) {
+        MceRequestVO mceRequestVO = createMceRequestVO(sysUser, baseAlarm, baseAlarmType, device, sendType);
+
+        try {
+            remoteMceService.addMceReceive(mceRequestVO);
+            baseAlarmNoticeResult.setNoticeResult(1);
+        } catch (Exception e) {
+            String noticeType = "1".equals(sendType) ? "APP" : "微信";
+            log.error("用户:{},告警消息{}推送失败:", sysUser.getUserId(), noticeType, e);
+            baseAlarmNoticeResult.setNoticeResult(2);
+        }
+
+        // 设置通知类型
+        baseAlarmNoticeResult.setNoticeType("1".equals(sendType) ? 1 : 2);
+    }
+
+    // 创建消息请求参数
+    private MceRequestVO createMceRequestVO(SysUser sysUser, BaseAlarm baseAlarm, BaseAlarmType baseAlarmType, DmpDevice device, String sendType) {
+        MceRequestVO mceRequestVO = new MceRequestVO();
+        mceRequestVO.setInfoType(INFO_TYPE);
+        mceRequestVO.setInfoTitle(INFO_TITLE);
+        mceRequestVO.setDeviceId(device.getDeviceId());
+        mceRequestVO.setInfoContent(baseAlarmType.getTypeName());
+        mceRequestVO.setAlarmTime(formatAlarmTime(baseAlarm.getAlarmTime()));
+        mceRequestVO.setAlarmSendType(sendType);
+        mceRequestVO.setRemark(String.format(REMARK_TEMPLATE, device.getDeviceName()));
+        mceRequestVO.setUserIds(Collections.singletonList(sysUser.getUserId()));
+        return mceRequestVO;
+    }
+
+    private String formatAlarmTime(LocalDateTime alarmTime) {
+        return alarmTime.format(DateTimeFormatter.ofPattern(ALARM_TIME_FORMAT));
+    }
 }