Преглед на файлове

add
苹果手机报警推送

18339543638 преди 1 година
родител
ревизия
6f914b9cd7

+ 9 - 0
nb-service-api/web-service-api/src/main/java/com/nb/web/api/feign/IDeviceAlarmClient.java

@@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.nb.web.api.entity.BusDeviceAlarmEntity;
 import com.nb.web.api.feign.query.AlarmQuery;
 
+import java.util.Date;
+
 /**
  * @author lifang
  * @version 1.0.0
@@ -21,4 +23,11 @@ public interface IDeviceAlarmClient {
      * @return IPage
      */
     IPage<BusDeviceAlarmEntity> pageQuery(AlarmQuery query);
+
+    /**
+     * 查询从某一时间段开始后的报警数量
+     * @param startTime
+     * @return
+     */
+    Long count(String tenantId, Date startTime);
 }

+ 9 - 0
nb-service/app-assistant/src/main/java/com/nb/app/assistant/controller/AppIphoneController.java

@@ -1,8 +1,11 @@
 package com.nb.app.assistant.controller;
 
+import cn.hutool.core.util.ObjectUtil;
 import com.nb.app.assistant.dto.IphoneDeviceDTO;
 import com.nb.app.assistant.service.LocalAppIphoneService;
 import com.nb.app.doctor.api.feign.IAppDoctorUserClient;
+import com.nb.auth.bean.LoginUser;
+import com.nb.auth.utils.SecurityUtil;
 import com.nb.core.result.R;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -30,6 +33,12 @@ public class AppIphoneController {
     @PostMapping("/deviceToken/add")
     @ApiOperation("新增推送设备token")
     public R<Boolean> add(@RequestBody@Validated IphoneDeviceDTO source){
+        LoginUser loginUser = SecurityUtil.getLoginUser();
+        if(ObjectUtil.isNull(loginUser)){
+            log.warn("deviceToken:{}未找到当前用户",source.getDeviceToken());
+            return R.success(true);
+        }
+        source.setUserId(String.valueOf(loginUser.getId()));
         appIphoneService.addDeviceToken(source);
         return R.success(true);
     }

+ 3 - 0
nb-service/app-assistant/src/main/java/com/nb/app/assistant/dto/IphoneDeviceDTO.java

@@ -20,4 +20,7 @@ public class IphoneDeviceDTO {
     @ApiModelProperty(value = "deviceToken",required = true)
     @NotBlank(message = "deviceToken不能为空")
     private String deviceToken;
+
+    @ApiModelProperty(value = "当前用户id",hidden = true)
+    private String userId;
 }

+ 27 - 8
nb-service/app-assistant/src/main/java/com/nb/app/assistant/service/LocalAppIphoneService.java

@@ -1,15 +1,20 @@
 package com.nb.app.assistant.service;
 
 import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.util.StrUtil;
 import com.nb.app.assistant.api.bean.DeviceAlarmBean;
 import com.nb.app.assistant.api.feign.IAppIphoneClient;
 import com.nb.app.assistant.dto.IphoneDeviceDTO;
+import com.nb.app.assistant.service.dto.IphoneDeviceTokenUserDTO;
 import com.nb.app.assistant.utils.ApnsUtils;
 import org.redisson.api.RSet;
 import org.redisson.api.RedissonClient;
+import com.nb.web.api.feign.IDeviceAlarmClient;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
+import java.util.Date;
+import java.util.HashSet;
 import java.util.Set;
 
 /**
@@ -23,18 +28,31 @@ public class LocalAppIphoneService implements IAppIphoneClient {
     @Autowired
     private  RedissonClient redissonClient;
 
+    @Autowired
+    @Lazy
+    private IDeviceAlarmClient deviceAlarmClient;
+
     @Autowired
     @Lazy
     private LocalAppIphoneService self;
 
     public void addDeviceToken(IphoneDeviceDTO source){
-        RSet<String> tenantSet = redissonClient.getSet("ios:"+source.getTenantId());
-        tenantSet.add(source.getDeviceToken());
+        RSet<IphoneDeviceTokenUserDTO> tenantSet = redissonClient.getSet("ios:"+source.getTenantId());
+        tenantSet.add(IphoneDeviceTokenUserDTO.of(source.getDeviceToken(),source.getUserId(),new Date()));
     }
 
     public void removeDeviceToken(IphoneDeviceDTO source){
-        RSet<String> tenantSet = redissonClient.getSet("ios:"+source.getTenantId());
-        tenantSet.remove(source.getDeviceToken());
+        RSet<IphoneDeviceTokenUserDTO> tenantSet = redissonClient.getSet("ios:"+source.getTenantId());
+        Set<IphoneDeviceTokenUserDTO> iphoneDeviceTokenUserDTOS = tenantSet.readAll();
+        HashSet<IphoneDeviceTokenUserDTO> removeAll = new HashSet<IphoneDeviceTokenUserDTO>();
+        for (IphoneDeviceTokenUserDTO deviceTokenUser : iphoneDeviceTokenUserDTOS) {
+            if(StrUtil.equals(source.getDeviceToken(),deviceTokenUser.getDeviceToken())){
+                removeAll.add(deviceTokenUser);
+            }
+        }
+        if(CollectionUtil.isNotEmpty(removeAll)){
+            tenantSet.removeAll(removeAll);
+        }
     }
 
     @Override
@@ -43,13 +61,14 @@ public class LocalAppIphoneService implements IAppIphoneClient {
     }
 
     public void sendMsg(String tenantId, DeviceAlarmBean source){
-        RSet<String> tenantSet = redissonClient.getSet("ios:"+tenantId);
-        Set<String> deviceTokenSet = tenantSet.readAll();
+        RSet<IphoneDeviceTokenUserDTO> tenantSet = redissonClient.getSet("ios:"+tenantId);
+        Set<IphoneDeviceTokenUserDTO> deviceTokenSet = tenantSet.readAll();
         if (CollectionUtil.isNotEmpty(deviceTokenSet)) {
             deviceTokenSet.parallelStream()
-                    .forEach(deviceToken->{
+                    .forEach(deviceTokenUser->{
                         try {
-                            ApnsUtils.sendMsg(deviceToken,source);
+                            Long alarmCount = deviceAlarmClient.count(tenantId, deviceTokenUser.getOfflineTime());
+                            ApnsUtils.sendMsg(deviceTokenUser.getDeviceToken(),source,alarmCount>99?99:alarmCount);
                         } catch (Exception e) {
                             e.printStackTrace();
                         }

+ 26 - 0
nb-service/app-assistant/src/main/java/com/nb/app/assistant/service/dto/IphoneDeviceTokenUserDTO.java

@@ -0,0 +1,26 @@
+package com.nb.app.assistant.service.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @ClassName : IphoneDeviceTokenUserDTO
+ * @Description :
+ * @Author : LF
+ * @Date: 2024年10月15日
+ */
+@Data
+@AllArgsConstructor(staticName = "of")
+@NoArgsConstructor
+public class IphoneDeviceTokenUserDTO  implements Serializable {
+    private static final long serialVersionUID = 1L;
+    private String deviceToken;
+
+    private String userId;
+
+    private Date offlineTime;
+}

+ 3 - 2
nb-service/app-assistant/src/main/java/com/nb/app/assistant/utils/ApnsUtils.java

@@ -28,7 +28,7 @@ import static com.turo.pushy.apns.PushType.ALERT;
 @Slf4j
 public class ApnsUtils {
     private static ApnsClient apnsClient = null;
-    public static void sendMsg(String deviceToken, DeviceAlarmBean source) throws Exception {
+    public static void sendMsg(String deviceToken, DeviceAlarmBean source,Long alarmCount) throws Exception {
         //IOS等终端设备注册后返回的DeviceToken
         /**
          * Use the voip push type for notifications that provide information about an incoming Voice-over-IP (VoIP)
@@ -44,6 +44,7 @@ public class ApnsUtils {
         String topic = "tuoren.PumpIOS";
 
         ApsEntity aps = ApsEntity.createDefault(ApsEntity.AlertEntity.of("驼人镇痛泵报警", String.format("设备号:%s,住院号:%s", source.getDeviceId(), source.getPatientCode()), source.getAlarmState().getText()));
+        aps.setBadge(alarmCount.intValue());
         String payload = JSONUtil.toJsonStr( MapUtil.of("aps",aps));
         //有效时间
         Date invalidationTime= new Date(System.currentTimeMillis() + 60 * 60 * 1000L );
@@ -75,7 +76,7 @@ public class ApnsUtils {
         deviceAlarmBean.setDeviceId("123");
         deviceAlarmBean.setPatientCode("34556");
         deviceAlarmBean.setUploadTime(new Date());
-        sendMsg("d515d98839e2e630c58feae45ab1b6e60d54c288d6f46640e6b68e0466424ea7",deviceAlarmBean);
+        sendMsg("d515d98839e2e630c58feae45ab1b6e60d54c288d6f46640e6b68e0466424ea7",deviceAlarmBean,2L);
     }
 
     public static ApnsClient getAPNSConnect() {

+ 11 - 4
nb-service/web-service/src/main/java/com/nb/web/service/bus/service/LocalBusDeviceAlarmService.java

@@ -4,6 +4,7 @@ import cn.hutool.core.bean.BeanUtil;
 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.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
@@ -26,10 +27,7 @@ import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 /**
  * @author lifang
@@ -126,6 +124,15 @@ public class LocalBusDeviceAlarmService extends BaseService<BusDeviceAlarmMapper
     public IPage<BusDeviceAlarmEntity> pageQuery(AlarmQuery query){
         return this.baseMapper.pageQuery(query.getPage(),query);
     }
+
+    @Override
+    public Long count(String tenantId, Date startTime) {
+        return this.baseMapper.selectCount(new LambdaQueryWrapper<BusDeviceAlarmEntity>()
+        .eq(BusDeviceAlarmEntity::getTenantId,tenantId)
+        .eq(BusDeviceAlarmEntity::getAlarm,Boolean.TRUE)
+        .ge(BusDeviceAlarmEntity::getUploadTime,startTime));
+    }
+
     /**
      * 添加报警原因
      * @param id