Sfoglia il codice sorgente

feat:"上传报警使用MQTT,第三方接口增加报警记录查询"

soobin 1 mese fa
parent
commit
d3a1c3b953

+ 7 - 0
src/main/java/com/szwl/constant/ConfigConsts.java

@@ -4,6 +4,7 @@ package com.szwl.constant;
  * 系统配置相关常量
  */
 public class ConfigConsts {
+
     public static final String TEST = "TEST";
     /**
      * token
@@ -101,4 +102,10 @@ public class ConfigConsts {
      */
     public static final String OFF = "OFF";
 
+
+    /**
+     * 七牛云APPID
+     */
+    public static final String QINIU_APP_ID = "07784f5fedb508046c841b391005b7de";
+
 }

+ 3 - 2
src/main/java/com/szwl/constant/OperationType.java

@@ -17,10 +17,11 @@ public enum OperationType implements IEnum<String> {
     UPLOAD_ORDER("uploadOrder","上传线下订单"),
     BAN_PAPER_MONEY("banPaperMoney","纸币器禁能"),
     UPDATE_GOODS_NAME("updateGoodsName","修改商品名称"),
-    ELIMINATE("eliminate","消除屏幕报警"),
     VOLUME("volume","修改音量"),
     OPEN_PAY_INFO("openPayInfo", "东南亚支付配置"),
-    UPDATE_APK("updateApk", "推送APP自动更新");
+    UPDATE_APK("updateApk", "推送APP自动更新"),
+    ALARM_RECORD("alarmRecord", "上传报警记录"),
+    ELIMINATE("eliminate","消除屏幕报警");
 
     private String code;
 

+ 52 - 9
src/main/java/com/szwl/controller/ApiInterfaceController.java

@@ -10,20 +10,16 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.szwl.constant.ResponseCodesEnum;
 import com.szwl.model.bo.R;
 import com.szwl.model.bo.ResponseModel;
-import com.szwl.model.entity.TAdmin;
-import com.szwl.model.entity.TEquipment;
-import com.szwl.model.entity.TProduct;
-import com.szwl.model.entity.TSugarDo;
+import com.szwl.model.entity.*;
 import com.szwl.model.param.InterfaceParam;
 import com.szwl.model.utils.PushUtils;
+import com.szwl.model.vo.AlarmRecordVo;
 import com.szwl.model.vo.MachineVo;
-import com.szwl.service.TAdminService;
-import com.szwl.service.TEquipmentService;
-import com.szwl.service.TProductService;
-import com.szwl.service.TSugarDoService;
+import com.szwl.service.*;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
@@ -47,6 +43,9 @@ public class ApiInterfaceController {
     @Resource
     TSugarDoService sugarDoService;
 
+    @Autowired
+    TAlarmRecordService alarmRecordService;
+
     @ApiOperation("查询设备信息列表")
     @PostMapping("/getMachineList")
     public ResponseModel<?> getMachineList(@RequestHeader(value = "x-api-key") String apiKey, @RequestBody InterfaceParam interfaceParam) {
@@ -130,7 +129,51 @@ public class ApiInterfaceController {
         return R.fail(ResponseCodesEnum.A0001, "operationField or operationDesc is null");
     }
 
-
+    @ApiOperation("查询报警记录")
+    @PostMapping("/getAlarmRecord")
+    public ResponseModel<?> getAlarmRecord(@RequestHeader("x-api-key") String apiKey, @RequestBody InterfaceParam interfaceParam) {
+        // 校验apiKey是否为空
+        if (StringUtils.isEmpty(apiKey)) {
+            return R.fail(ResponseCodesEnum.A0001, "apiKey is null");
+        }
+        // 校验参数是否为空
+        String username = interfaceParam.getUsername();
+        String clientId = interfaceParam.getClientId();
+        if (StringUtils.isEmpty(username)) {
+            return R.fail(ResponseCodesEnum.A0001, "username is null");
+        }
+        // 校验apiKey是否正确
+        LambdaQueryWrapper<TAdmin> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(TAdmin::getUsername, username);
+        wrapper.eq(TAdmin::getApiKey, apiKey);
+        TAdmin admin = adminService.getOne(wrapper);
+        if (admin == null) {
+            return R.fail(ResponseCodesEnum.A0001, "Invalid apiKey or username is not exist");
+        }
+        Long size = interfaceParam.getSize();
+        Long current = interfaceParam.getCurrent();
+        if (size == null || current == null) {
+            return R.fail(ResponseCodesEnum.A0001, "size or current is null");
+        }
+        if (size > 15) {
+            return R.fail(ResponseCodesEnum.A0001, "size is too large");
+        }
+        List<AlarmRecordVo> alarmRecordVos = new ArrayList<>();
+        LambdaQueryWrapper<TAlarmRecord> query = Wrappers.lambdaQuery();
+        query.eq(TAlarmRecord::getAdminId, admin.getId());
+        if (StringUtils.isNotEmpty(clientId)) {
+            query.eq(TAlarmRecord::getClientId, clientId);
+        }
+        query.orderByDesc(TAlarmRecord::getCreateDate);
+        Page<TAlarmRecord> page = new Page<>(interfaceParam.getCurrent(), interfaceParam.getSize(), true);
+        IPage<TAlarmRecord> iPage = alarmRecordService.page(page, query);
+        iPage.getRecords().forEach(alarmRecord -> {
+            AlarmRecordVo alarmRecordVo = new AlarmRecordVo();
+            BeanUtils.copyPropertiesIgnoreNull(alarmRecord, alarmRecordVo, true);
+            alarmRecordVos.add(alarmRecordVo);
+        });
+        return R.ok(alarmRecordVos);
+    }
 
     @ApiOperation("远程制作")
     @PostMapping("/remoteProduction")

+ 35 - 0
src/main/java/com/szwl/handle/response/AlarmRecordProcessor.java

@@ -0,0 +1,35 @@
+package com.szwl.handle.response;
+
+import com.alibaba.fastjson.JSON;
+import com.szwl.constant.OperationType;
+import com.szwl.model.dto.AlarmRecordVo;
+import com.szwl.model.entity.MessageLog;
+import com.szwl.service.TAlarmRecordService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component
+public class AlarmRecordProcessor implements ResponseProcessor{
+
+    @Autowired
+    private TAlarmRecordService alarmRecordService;
+
+    @Override
+    public void process(MessageLog messageLog) {
+        Integer statusCode = messageLog.getStatusCode();
+        if (statusCode == 200) {
+            Integer direction = messageLog.getDirection();
+            String clientId = messageLog.getClientId();
+            String responseContent = messageLog.getResponseContent();
+            // 转换为对象
+            AlarmRecordVo alarmRecordVo = JSON.parseObject(responseContent, AlarmRecordVo.class);
+            // 上传报警
+            alarmRecordService.addAlarmRecord(alarmRecordVo);
+        }
+    }
+
+    @Override
+    public String getSupportedOperationType() {
+        return OperationType.ALARM_RECORD.getCode();
+    }
+}

+ 10 - 0
src/main/java/com/szwl/model/utils/YunPianSms.java

@@ -184,6 +184,16 @@ public final class YunPianSms {
         return responseText;
     }
 
+    public static String getMessage(String content, String name, String clientId) {
+        String message = "【申泽智能】您好,机器" + content + ",机器名:" + name + ",设备号:" + clientId;
+        return message;
+    }
+
+    public static String getSCMessage(String content, String name, String clientId) {
+        String message = "【七云科技】您好,机器报警:" + content + ",机器名:" + name + ",设备编号:" + clientId + "。";
+        return message;
+    }
+
     public static void main(String[] args) {
 
         try {

+ 25 - 0
src/main/java/com/szwl/model/vo/AlarmRecordVo.java

@@ -0,0 +1,25 @@
+package com.szwl.model.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class AlarmRecordVo {
+
+    @ApiModelProperty(value = "设备编号;")
+    private String clientId;
+
+    @ApiModelProperty(value = "名称;")
+    private String name;
+
+    @ApiModelProperty(value = "报警内容;")
+    private String alarmContent;
+
+    @ApiModelProperty(value = "发生时间;")
+    private Date occurrenceTime;
+
+    @ApiModelProperty(value = "报警是否消除;0:没有,1:已消除")
+    private Integer isEliminate;
+}

+ 7 - 0
src/main/java/com/szwl/service/TAlarmRecordService.java

@@ -1,5 +1,6 @@
 package com.szwl.service;
 
+import com.szwl.model.dto.AlarmRecordVo;
 import com.szwl.model.entity.TAlarmRecord;
 import com.szwl.service.base.MyIService;
 
@@ -18,4 +19,10 @@ public interface TAlarmRecordService extends MyIService<TAlarmRecord> {
     public List<TAlarmRecord> getAlarmList(Long adminId);
 
     List<TAlarmRecord> getLastAlarmRecord(Long id);
+
+    /**
+     * 添加报警记录
+     * @param alarmRecordVo
+     */
+    void addAlarmRecord(AlarmRecordVo alarmRecordVo);
 }

+ 158 - 3
src/main/java/com/szwl/service/impl/TAlarmRecordServiceImpl.java

@@ -1,12 +1,22 @@
 package com.szwl.service.impl;
 
-import com.szwl.model.entity.TAlarmRecord;
-import com.szwl.mapper.TAlarmRecordMapper;
-import com.szwl.service.TAlarmRecordService;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.szwl.constant.ConfigConsts;
+import com.szwl.mapper.TAlarmRecordMapper;
+import com.szwl.model.dto.AlarmRecordVo;
+import com.szwl.model.entity.*;
+import com.szwl.model.utils.YunPianSms;
+import com.szwl.service.*;
+import com.szwl.util.TimezoneFmtUtil;
+import com.szwl.util.WechatSendUtil;
+import org.apache.commons.lang.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -19,9 +29,22 @@ import java.util.List;
  */
 @Service
 public class TAlarmRecordServiceImpl extends ServiceImpl<TAlarmRecordMapper, TAlarmRecord> implements TAlarmRecordService {
+
     @Autowired
     private TAlarmRecordMapper tAlarmRecordMapper;
 
+    @Autowired
+    private TEquipmentService equipmentService;
+
+    @Autowired
+    private TAdminService adminService;
+
+    @Autowired
+    private TWechatService wechatService;
+
+    @Autowired
+    private TAdminEquipmentService adminEquipmentService;
+
     @Override
     public List<TAlarmRecord> getAlarmList(Long adminId) {
         return tAlarmRecordMapper.getAlarmList(adminId);
@@ -31,4 +54,136 @@ public class TAlarmRecordServiceImpl extends ServiceImpl<TAlarmRecordMapper, TAl
     public List<TAlarmRecord> getLastAlarmRecord(Long id) {
         return tAlarmRecordMapper.getLastAlarmRecord(id);
     }
+
+    @Override
+    public void addAlarmRecord(AlarmRecordVo alarmRecordVo) {
+        TAlarmRecord alarmRecord = new TAlarmRecord();
+
+        String clientId = alarmRecordVo.getClientId();
+        LambdaQueryWrapper<TEquipment> query = Wrappers.lambdaQuery();
+        query.eq(TEquipment::getClientId, clientId);
+        TEquipment equipment = equipmentService.getOne(query);
+        if (equipment != null) {
+            Integer type = equipment.getType();
+            Long adminId = equipment.getAdminId();
+            Long equipmentId = equipment.getId();
+            String name = equipment.getName();
+
+            if (StringUtils.isEmpty(name)) {
+                name = clientId.substring(clientId.length() - 6);
+            }
+
+            // 更新设备状态为报警
+            equipment.setIsAlarm(true);
+            equipmentService.updateById(equipment);
+            String adminUserName = equipment.getAdminUserName();
+            alarmRecord.setEquipmentId(equipmentId);
+            alarmRecord.setName(name);
+            alarmRecord.setAdminLevel(equipment.getAdminLevel());
+            alarmRecord.setClientId(clientId);
+            alarmRecord.setType(type);
+            alarmRecord.setAdminId(adminId);
+            alarmRecord.setCreateDate(new Date());
+            alarmRecord.setModifyDate(new Date());
+            alarmRecord.setAdminUserName(adminUserName);
+            String alarmContent = alarmRecordVo.getAlarmContent();
+            alarmRecord.setAlarmContent(alarmContent);
+            alarmRecord.setRemark(alarmRecordVo.getRemark());
+            alarmRecord.setOccurrenceTime(alarmRecordVo.getOccurrenceTime());
+            alarmRecord.setIsEliminate(0);
+            if (alarmRecordVo.getLevel() != null) {
+                alarmRecord.setLevel(alarmRecordVo.getLevel());
+            }
+            this.save(alarmRecord);
+            TAdmin admin = adminService.getById(adminId);
+            String email = admin.getEmail();
+            String ifForeign = admin.getIfForeign();
+            String companyType = admin.getCompanyType();
+            String messageReceiver = equipment.getMessageReceiver();
+            String timeZone = admin.getTimeZone();
+            timeZone = StringUtils.isEmpty(timeZone) ? "Asia/Shanghai" : timeZone;
+            // 根据时区获取时间
+            String localTime = TimezoneFmtUtil.getTimeByZoneID(timeZone);
+            // 查询是否绑定微信
+            LambdaQueryWrapper<TWechat> wechatQuery = Wrappers.lambdaQuery();
+            wechatQuery.eq(TWechat::getAdminId, admin.getId());
+            TWechat wechat = wechatService.getOne(wechatQuery);
+            ArrayList<String> openIds = new ArrayList<>();
+            if (wechat != null) {
+                openIds.add(wechat.getOpenId());
+            }
+            // 查询子账号
+            LambdaQueryWrapper<TAdmin> queryWrapper = Wrappers.lambdaQuery();
+            queryWrapper.eq(TAdmin::getParentId, admin.getId());
+            List<TAdmin> adminList = adminService.list(queryWrapper);
+            if (!adminList.isEmpty()) {
+                for (TAdmin adminChild : adminList) {
+                    // 查找子账号是否管理该机器
+                    TAdminEquipment adminEquipment = adminEquipmentService.getById(adminChild.getId());
+                    if (adminEquipment != null) {
+                        String equipmentIds = adminEquipment.getEquipmentIds();
+                        if (equipmentIds.contains(equipmentId.toString()) || "0".equals(adminEquipment.getType())) {
+                            // 查询子账号是否绑定微信
+                            LambdaQueryWrapper<TWechat> wechatLambdaQueryWrapper = Wrappers.lambdaQuery();
+                            wechatLambdaQueryWrapper.eq(TWechat::getAdminId, adminChild.getId());
+                            TWechat childWechat = wechatService.getOne(wechatLambdaQueryWrapper);
+                            if (childWechat != null) {
+                                openIds.add(childWechat.getOpenId());
+                            }
+                        }
+                    }
+                }
+            }
+
+            // 微信公众号推送
+            if(!openIds.isEmpty()) {
+                String sendContent = alarmContent;
+                if (sendContent.length() > 20) {
+                    // 如果超过20个字符
+                    sendContent =  sendContent.substring(0, 16) + "...";
+                }
+                for (String openId : openIds) {
+                    wechatService.sendAlarmMessage(openId, clientId, name, companyType, sendContent, alarmRecordVo.getOccurrenceTime());
+                }
+            }
+            if (ifForeign.equals("1")) {
+                String machineType = equipment.getMachineType();
+                if (StringUtils.isEmpty(machineType)) {
+                    machineType = "0";
+                }
+                if (StringUtils.isNotEmpty(messageReceiver)) {
+                    String[] split = messageReceiver.split(",");
+                    for (String s : split) {
+                        WechatSendUtil.sentEmail(s, name, timeZone, machineType, alarmContent);
+                    }
+                } else {
+                    if (email != null) {
+                        WechatSendUtil.sentEmail(admin.getEmail(), name, timeZone, machineType, alarmContent);
+                    }
+                }
+            }
+
+            // 发送短信
+            try {
+                if (!"二次曲棍".equals(alarmContent)) {
+                    if (StringUtils.isNotEmpty(messageReceiver)) {
+                        String[] split = messageReceiver.split(",");
+                        for (int i = 0; i < split.length; i++) {
+                            if (StringUtils.isNotEmpty(split[i])) {
+                                if (StringUtils.isNotEmpty(companyType) && companyType.equals("1")) {
+                                    // 如果是七云科技的用户
+                                    YunPianSms.sendSms(ConfigConsts.QINIU_APP_ID, YunPianSms.getSCMessage(alarmContent, name, clientId.substring(clientId.length() - 6)), split[i]);
+                                } else {
+                                    // 如果是申泽智能的用户
+                                    YunPianSms.sendSms(ConfigConsts.QINIU_APP_ID, YunPianSms.getMessage(alarmContent, name, clientId.substring(clientId.length() - 6)), split[i]);
+                                }
+                            }
+                        }
+                    }
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+    }
 }