Procházet zdrojové kódy

Merge branch 'master' into master-果昔项目

lijin před 1 měsícem
rodič
revize
b1c6fa5dd0

+ 4 - 0
device-api-service-merc-mini/src/main/java/com/xy/controller/MercMiniDeviceController.java

@@ -5,6 +5,7 @@ import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.util.BooleanUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
+import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.yitter.idgen.YitIdHelper;
@@ -35,6 +36,7 @@ import com.xy.vo.DeviceDetailVO;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -58,6 +60,7 @@ import static com.xy.utils.Beans.copy;
 @RestMappingController("merc-mini/device")
 @AllArgsConstructor
 @Api(tags = "小程序-设备")
+@Slf4j
 public class MercMiniDeviceController {
 
     /**
@@ -517,6 +520,7 @@ public class MercMiniDeviceController {
     @PostMapping("verificationCode")
     @ApiOperation("蓝牙开门-校验并使用授权码")
     public R<Boolean> verificationCode(@RequestBody @Validated DeviceBluetoothAuthDto.VerificationCode dto) {
+        log.info("蓝牙开门-校验并使用授权码:" + JSONUtil.toJsonPrettyStr(dto));
         String deviceSn = dto.getDeviceSn();
         List<DeviceSysinfo> list = deviceSysinfoService.list(Wrappers.<DeviceSysinfo>lambdaQuery().eq(DeviceSysinfo::getDeviceSn, deviceSn).orderByDesc(DeviceSysinfo::getCreateTime));
         if (CollUtil.isEmpty(list)) {

+ 17 - 4
device-api-service-merc-mini/src/main/java/com/xy/controller/MercPcDeviceController.java

@@ -28,10 +28,7 @@ import com.xy.service.common.MercPlaceService;
 import com.xy.service.factory.device.DeviceFactory;
 import com.xy.utils.*;
 import com.xy.utils.Enum.AlgorithmTypeEnum;
-import com.xy.utils.enums.DeviceActiveStateEnum;
-import com.xy.utils.enums.DeviceAuthCodeUseStatus;
-import com.xy.utils.enums.DeviceLockState;
-import com.xy.utils.enums.DeviceNetSateType;
+import com.xy.utils.enums.*;
 import com.xy.vo.DeviceDetailVO;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -60,6 +57,7 @@ public class MercPcDeviceController {
     private final DeviceInfoServiceImpl deviceService;
     private final MercService mercService;
     private final DeviceStatusServiceImpl deviceStatusService;
+    private final DeviceEventMsgService deviceEventMsgService;
 
     @ApiOperation("设备分页-商户")
     @PostMapping("page")
@@ -110,4 +108,19 @@ public class MercPcDeviceController {
         return deviceIds;
     }
 
+
+    @ApiOperation("设备温度异常事件测试")
+    @PostMapping("testDeviceTempAlarm")
+    public R<?> testDeviceTempAlarm(@RequestBody DeviceInfoDto.Vo vo) {
+        //添加事件
+        String msg = "温度异常-温度阈值%d - %d,当前温度%d";
+        DeviceEventMsgDto.Save deviceEventMsg = new DeviceEventMsgDto.Save()
+                .setDeviceId(vo.getDeviceId());
+        deviceEventMsg.setCode(DeviceErrorRecordTypesEnum.T.getCode());
+        deviceEventMsg.setMsg(String.format(msg, -30, 30, 40));
+        deviceEventMsgService.save(deviceEventMsg);
+        return R.ok();
+    }
+
+
 }

+ 19 - 2
device-api-service/src/main/java/com/xy/service/DeviceInfoServiceImpl.java

@@ -20,6 +20,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.github.yitter.idgen.YitIdHelper;
+import com.xy.annotation.LogOperate;
 import com.xy.collections.list.JArrayList;
 import com.xy.collections.list.JList;
 import com.xy.collections.map.JHashMap;
@@ -37,6 +38,7 @@ import com.xy.dto.mini.MiniDeviceInfoDto;
 import com.xy.dto.nfc.ActiveDeviceDTO;
 import com.xy.entity.*;
 import com.xy.enums.FileExportType;
+import com.xy.enums.LogEnum;
 import com.xy.error.CommRuntimeException;
 import com.xy.mapper.DeviceInfoMapper;
 import com.xy.mapper.entity.DeviceInfoQueryPage;
@@ -834,6 +836,7 @@ public class DeviceInfoServiceImpl extends ServiceImpl<DeviceInfoMapper, DeviceI
         return R.ok(queryPage(page));
     }
 
+    @LogOperate(logType = LogEnum.LogType.V2, optType = LogEnum.OptType.V2, logContent = "商户设备授权")
     @ApiOperation(value = "商户设备授权", hidden = true)
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -1008,7 +1011,8 @@ public class DeviceInfoServiceImpl extends ServiceImpl<DeviceInfoMapper, DeviceI
             deviceStatusService.updateBatchById(deviceStatuses);
         }
         deviceAnnualFee.run(deviceInfos);
-        return R.ok(Boolean.TRUE);
+        String log = String.format("商户设备授权:授权商户:%s,授权设备:%s", auth.getMercId() + "," + auth.getMercName(), deviceIds.size() == 0 ? "取消所有设备授权" : CollUtil.join(deviceIds, ","));
+        return R.ok(Boolean.TRUE).setLogMsg(log);
     }
 
     /**
@@ -1018,9 +1022,22 @@ public class DeviceInfoServiceImpl extends ServiceImpl<DeviceInfoMapper, DeviceI
      * @return
      */
     @Override
+    @LogOperate(logType = LogEnum.LogType.V2, optType = LogEnum.OptType.V2, logContent = "解绑商户")
     public R<Boolean> unBindMercDevice(DeviceInfoDto.MercDeviceUnBindDto dto) {
         List<DeviceInfo> deviceInfos = this.listByIds(dto.getDeviceIds());
-        return R.ok(removeMerRefDevicesToTopMerc(deviceInfos));
+        List<MercDto.Vo> mercs = mercService.list(new MercDto.SelectList()
+                .setMercIds(new JArrayList<>(deviceInfos).getProperty(DeviceInfo::getMercId).comparing())
+        ).getData();
+        StringJoiner mercIds = new StringJoiner(",");
+        StringJoiner mercNames = new StringJoiner(",");
+        JMap<Long, MercDto.Vo> mercMaps = new JArrayList<>(mercs).toMap(MercDto.Vo::getId).cover();
+        for (DeviceInfo deviceInfo : deviceInfos) {
+            MercDto.Vo vo = mercMaps.get(deviceInfo.getMercId());
+            mercIds.add(String.valueOf(deviceInfo.getMercId()));
+            mercNames.add(vo.getName());
+        }
+        String log = String.format("解绑商户:被解绑商户:%s,解绑设备:%s", mercIds + "," + mercNames, CollUtil.isEmpty(dto.getDeviceIds()) ? "" : CollUtil.join(dto.getDeviceIds(), ","));
+        return R.ok(removeMerRefDevicesToTopMerc(deviceInfos)).setLogMsg(log);
     }
 
     /**

+ 92 - 2
device-api-service/src/main/java/com/xy/service/DeviceMqttConsumerImpl.java

@@ -4,6 +4,7 @@ import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.date.DatePattern;
 import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.date.LocalDateTimeUtil;
 import cn.hutool.core.map.MapUtil;
 import cn.hutool.core.util.BooleanUtil;
 import cn.hutool.core.util.ObjectUtil;
@@ -12,6 +13,7 @@ import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.xy.config.DeviceThreadPoolConfig;
+import com.xy.consts.MercConstant;
 import com.xy.device.EnumDeviceOnlineStatus;
 import com.xy.dto.*;
 import com.xy.dto.be.MercDto;
@@ -20,9 +22,11 @@ import com.xy.entity.*;
 import com.xy.enums.ChannelType;
 import com.xy.enums.MsgConfigId;
 import com.xy.enums.MsgType;
+import com.xy.enums.SmsSceneEnum;
 import com.xy.event.DeviceEvent;
 import com.xy.service.be.MercFeignService;
 import com.xy.utils.*;
+import com.xy.utils.enums.DeviceErrorRecordTypesEnum;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
@@ -39,6 +43,7 @@ import java.util.stream.Collectors;
 @AllArgsConstructor
 @Api(tags = "设备消费者")
 public class DeviceMqttConsumerImpl implements DeviceMqttConsumer {
+    private AliSmsService aliSmsService;
 
     private MsgSendApiService msgSendApiService;
 
@@ -53,6 +58,8 @@ public class DeviceMqttConsumerImpl implements DeviceMqttConsumer {
     private DeviceFaultLogServiceImpl deviceFaultLogService;
 
     private DeviceFaultInfoServiceImpl deviceFaultInfoService;
+    private MercSmsSubscriptionService mercSmsSubscriptionService;
+    private MercSmsPackageService mercSmsService;
 
     @Override
     @ApiOperation("设备在线")
@@ -73,6 +80,7 @@ public class DeviceMqttConsumerImpl implements DeviceMqttConsumer {
     @Override
     @ApiOperation("设备消息推送")
     public void devicePushMsg(DeviceMqttDto.RequestParams requestParams) {
+        log.info("设备消息推送MQTT:{}", JSONUtil.toJsonPrettyStr(requestParams));
         DeviceEventMsg deviceEventMsg = JSONUtil.toBean(requestParams.getData(), DeviceEventMsg.class);
         if (deviceEventMsg != null) {
             Long deviceId = deviceEventMsg.getDeviceId();
@@ -102,6 +110,7 @@ public class DeviceMqttConsumerImpl implements DeviceMqttConsumer {
             if (MercAuthUtils.sendMsgToCM(mercCode)) {
                 configId = MsgConfigId.CM_DEVICE_EXCEPTION.getId();
             }
+            DeviceInfo deviceInfo = deviceInfoService.getById(deviceId);
             MsgConfigDto.Vo msgConfig = R.feignCheckData(msgSendApiService.getMsgConfig(new MsgConfigDto.Vo().setId(configId)));
             List<MsgConfigTestDto.BizParam> bizParams = R.feignCheckData(msgSendApiService.getBizParamByMsgConfig(new MsgConfigTestDto.MsgConfig().setConfigId(configId)));
             if (CollUtil.isNotEmpty(bizParams) && msgConfig != null) {
@@ -115,7 +124,7 @@ public class DeviceMqttConsumerImpl implements DeviceMqttConsumer {
                  * {{remark.DATA}}
                  *
                  */
-                DeviceInfo deviceInfo = deviceInfoService.getById(deviceId);
+
                 String deviceName = deviceInfo.getDeviceName();
                 if (StrUtil.isEmpty(deviceName)) {
                     deviceName = deviceId + "";
@@ -130,7 +139,7 @@ public class DeviceMqttConsumerImpl implements DeviceMqttConsumer {
                 if (CollUtil.isNotEmpty(mercUserDevices)) {
                     mercUserDevices.forEach(mud -> {
                         Long deviceIdUser = mud.getDeviceId();
-                        if (deviceId == deviceIdUser) {
+                        if (Objects.equals(deviceId, deviceIdUser)) {
                             userInfoIdList.add(mud.getUserId());
                         }
                     });
@@ -208,7 +217,88 @@ public class DeviceMqttConsumerImpl implements DeviceMqttConsumer {
                     msgSendApiService.sendByMsgConfig(new MsgConfigTestDto.SendByMsgConfig().setConfigId(configId).setBizDataList(sendList));
                 }
             }
+
+
+            //短信通知
+            log.info("设备告警,短信通知处理开始。。。");
+            deviceSmsPushMsg(merc,deviceInfo,createTime,code);
+        }
+    }
+
+    /**
+     * 商户设备异常短信通知
+     * @param merc
+     * @param deviceInfo
+     * @param createTime
+     * @param eventCode
+     */
+    public void deviceSmsPushMsg(MercDto.Vo merc,DeviceInfo deviceInfo,LocalDateTime createTime,String eventCode) {
+
+        Long deviceId = deviceInfo.getDeviceId();
+//        String deviceName = deviceInfo.getDeviceName();
+//        if (StrUtil.isEmpty(deviceName)) {
+//            deviceName = deviceId + "";
+//        } else {
+//            deviceName = deviceName + "(" + deviceId + ")";
+//        }
+        String exceptionType="";
+        //商家是否订阅
+        if(DeviceErrorRecordTypesEnum.T.getCode().equals(eventCode)) {
+            exceptionType = "温度";
+        }else if(DeviceErrorRecordTypesEnum.NET.getCode().equals(eventCode)){
+            exceptionType="网络";
+        }else if(DeviceErrorRecordTypesEnum.DOOR_LOCK.getCode().equals(eventCode)){
+            exceptionType="门锁";
+        }else if(DeviceErrorRecordTypesEnum.LIGHT.getCode().equals(eventCode)){
+            exceptionType="灯光";
+        }else if(DeviceErrorRecordTypesEnum.CAMERA.getCode().equals(eventCode)){
+            exceptionType="摄像头";
+        }else if(DeviceErrorRecordTypesEnum.COMPRESSOR.getCode().equals(eventCode)){
+            exceptionType="压缩机";
+        }else{
+            log.info("设备告警短信通知:异常类型未配置,eventCode{}",eventCode);
+        }
+        //温度异常
+        Boolean b = R.feignCheckData(mercSmsSubscriptionService.isSubscribedByCode(new MercSmsSubscriptionDto.Vo().setMercId(merc.getId()).setEventCode(eventCode)));
+        log.info("设备告警,商户是否订阅短信通知:{},eventCode:{}",b,eventCode);
+        boolean isSubscribed = BooleanUtil.isTrue(b);
+        //商户是否订阅短信通知
+        if(isSubscribed&&StrUtil.isNotEmpty(exceptionType)){
+            MercSmsSubscriptionDto.SelectList selectList = new MercSmsSubscriptionDto.SelectList();
+            selectList.setEventCode(eventCode).setMercId(merc.getId());
+            List<MercSmsSubscriptionDto.Vo> mercSmsSubList = R.feignCheckData(mercSmsSubscriptionService.list(selectList));
+            if(CollUtil.isNotEmpty(mercSmsSubList)){
+                MercSmsSubscriptionDto.Vo mss = mercSmsSubList.get(0);
+                String phones = mss.getPhones();
+                if(StrUtil.isNotEmpty(phones)){
+                    List<String> telList = StrUtil.split(phones, ",");
+                    //短信推送 设备告警:设备${device_id}于${time}发生${exception_type}异常。请登录后台查看详情并及时处理。
+                    Long configId = MsgConfigId.SMS_NOTIFY_DEVICE.getId();
+                    String formatDate = LocalDateTimeUtil.format(createTime, DatePattern.NORM_DATETIME_PATTERN);
+                    Map<String, Object> templateParams = MapUtil.newHashMap();
+                    templateParams.put("device_id", String.valueOf(deviceId));
+                    templateParams.put("time", formatDate);
+                    templateParams.put("exception_type", exceptionType);
+                    log.info("商户设备告警短信通知:{}", JSONUtil.toJsonPrettyStr(templateParams));
+                    for (String tel : telList) {
+                        // 扣除商户短信资源包
+                        R deduct = mercSmsService.deduct(new MercSmsPackageDto.Deduct()
+                                .setMercId(merc.getId())
+                                .setMsg("设备告警短信通知,设备号:" + deviceId)
+                        );
+                        if (deduct.getCode() == R.Enum.SUCCESS.getCode()) {
+                            log.info("设备告警短信通知#商户{}:,短信资源包扣除成功,手机号:{}",merc.getId(),tel);
+                            R.feignCheck(aliSmsService.sendMsgCommon(new SmsSendCommonDTO().setSignName("").setMsgConfigId(configId).setMobile(tel).setTemplateParams(templateParams).setScene(SmsSceneEnum.B_DEVICE_ALARM_NOTIFY.getScene())));
+                        }else{
+                            log.info("设备告警短信通知#商户{}短信资源包不足,无法发送短信通知:{},手机号:{}",merc.getId(),tel);
+                        }
+                    }
+
+                }
+            }
+
         }
+
     }
 
     /**