Przeglądaj źródła

add 24小时未评提醒

18339543638 3 lat temu
rodzic
commit
fae6becbc4

+ 4 - 0
nb-im/pom.xml

@@ -12,6 +12,10 @@
     <artifactId>nb-im</artifactId>
 
     <dependencies>
+        <dependency>
+            <groupId>com.tuoren</groupId>
+            <artifactId>delay-queue-common</artifactId>
+        </dependency>
         <dependency>
             <groupId>com.tuoren</groupId>
             <artifactId>web-service-api</artifactId>

+ 15 - 0
nb-im/src/main/java/com/nb/im/constant/ImRoomConstant.java

@@ -0,0 +1,15 @@
+package com.nb.im.constant;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName ImRoomConstant.java
+ * @Description TODO
+ * @createTime 2022年09月08日 17:20:00
+ */
+public class ImRoomConstant {
+    /**
+     * 聊天室自动结束
+     */
+    public static final String AUTO_FINISH_DELAY="auto_finish";
+}

+ 2 - 2
nb-im/src/main/java/com/nb/im/controller/ImRoomController.java

@@ -58,7 +58,7 @@ public class ImRoomController implements BaseSaveController<ImRoomEntity,String>
 
     @ApiOperation(value = "查询并自动创建与病人看护人的聊天室",notes = "若存在,则返回聊天室信息,若不存在,则返回空")
     @PostMapping("/look")
-    public R getChatRoom(@RequestBody@Validated ImRoomDto source){
+    public R<ImRoomEntity> getChatRoom(@RequestBody@Validated ImRoomDto source){
         if(Boolean.TRUE.equals(source.isAutoCreate())&&StrUtil.isEmpty(source.getDoctorNickname())){
             throw new CustomException("医生昵称不可为空");
         }
@@ -75,7 +75,7 @@ public class ImRoomController implements BaseSaveController<ImRoomEntity,String>
             source.setTotalCount(0);
             source.setSponsorType(SponsorEnum.doctor);
             source.setStatus(ImStatusEnum.SUCCESS);
-            imRoomService.createChatRoom(source);
+            chatRoom=imRoomService.createChatRoom(source);
         }else if(chatRoom!=null&&ImStatusEnum.WAITING.equals(chatRoom.getStatus())&&source.isAutoCreate()){
             imRoomService.successChatRoom(chatRoom.getId(),source.getDoctorId());
         }

+ 79 - 0
nb-im/src/main/java/com/nb/im/delay/ImRoomAutoFinishDelayHandler.java

@@ -0,0 +1,79 @@
+package com.nb.im.delay;
+
+import cn.hutool.core.date.DateUnit;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.json.JSONUtil;
+import com.nb.app.msg.enums.MsgEnum;
+import com.nb.common.queue.delay.handler.DelayMessageHandler;
+import com.nb.common.queue.delay.message.DelayMessage;
+import com.nb.im.entity.ImRoomEntity;
+import com.nb.im.enums.ImMsgType;
+import com.nb.im.enums.ImStatusEnum;
+import com.nb.im.room.ImRoomOperator;
+import com.nb.im.room.ImRoomOperatorManager;
+import com.nb.im.service.LocalImRoomService;
+import com.nb.im.utils.ImUtils;
+import com.nb.im.ws.PubMsgInfo;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+
+import static com.nb.im.constant.ImRoomConstant.AUTO_FINISH_DELAY;
+
+/**
+ * @author lifang
+ * @version 1.0.0
+ * @ClassName ImRoomAutoFinishDelayHandler.java
+ * @Description TODO
+ * @createTime 2022年09月08日 17:21:00
+ */
+@Component
+@AllArgsConstructor
+@Slf4j
+public class ImRoomAutoFinishDelayHandler implements DelayMessageHandler {
+    private final LocalImRoomService roomService;
+    private final ImRoomOperatorManager roomOperatorManager;
+    private final ImUtils imUtils;
+    @Override
+    public String getId() {
+        return AUTO_FINISH_DELAY;
+    }
+
+    @Override
+    public String description() {
+        return "聊天室超过24小时自动结束";
+    }
+
+    @Override
+    public void handle(DelayMessage message) {
+        log.info("尝试处理聊天室超过24小时自动关闭,{}", JSONUtil.toJsonStr(message));
+        String roomId = message.getBody().asString();
+        ImRoomEntity room = roomService.getById(roomId);
+        if(ImStatusEnum.SUCCESS.equals(room.getStatus())){
+            Date successTime = room.getSuccessTime();
+            if(successTime!=null){
+                if (DateUtil.between(successTime,new Date(), DateUnit.SECOND)>=60*24) {
+                    room.setStatus(ImStatusEnum.AUTO_LIST);
+                    if (roomService.updateById(room)) {
+                        ImRoomOperator roomOperator = roomOperatorManager.getRoomOperator(roomId);
+                        imUtils.send(room.getId(), PubMsgInfo.builder()
+                                .senderId("1")
+                                .msgType(ImMsgType.hyperlinks)
+                                .roomId(room.getId())
+                                .operationType(MsgEnum.AUTO_FINISHED)
+                                .build()
+                        );
+                        roomOperator.close();
+                        log.info("聊天室{}24小时自动关闭",roomId);
+                    }
+                }
+            }else {
+                log.error("聊天室{}成功建立但是缺少successTime,无法24小时自动关闭");
+            }
+        }else {
+            log.info("聊天室未处于成功建立状态,处理聊天室超过24小时自动关闭失败,{}", roomId);
+        }
+    }
+}

+ 2 - 1
nb-im/src/main/java/com/nb/im/enums/ImStatusEnum.java

@@ -18,7 +18,8 @@ import lombok.Getter;
 public enum  ImStatusEnum  implements IEnum<Integer> {
     WAITING(0,"等待医生确认"),
     SUCCESS(1,"成功建立聊天室"),
-    DOCTOR_LIFT(2,"医生关闭聊天室");
+    DOCTOR_LIFT(2,"医生关闭聊天室"),
+    AUTO_LIST(3,"24小时自动关闭聊天室");
 
     private Integer value;
     private String text;

+ 31 - 5
nb-im/src/main/java/com/nb/im/service/LocalImRoomService.java

@@ -4,9 +4,11 @@ import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.nb.app.msg.enums.MsgEnum;
-import com.nb.auth.bean.LoginUser;
-import com.nb.auth.utils.SecurityUtil;
 import com.nb.common.crud.BaseService;
+import com.nb.common.queue.delay.manager.DelayMessageManager;
+import com.nb.common.queue.delay.message.DelayMessage;
+import com.nb.common.queue.delay.message.DelayMessageProperties;
+import com.nb.core.Value;
 import com.nb.im.entity.ImRoomEntity;
 import com.nb.im.enums.ImMsgType;
 import com.nb.im.enums.ImStatusEnum;
@@ -26,6 +28,9 @@ import org.springframework.transaction.annotation.Transactional;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+import static com.nb.im.constant.ImRoomConstant.AUTO_FINISH_DELAY;
 
 /**
  * @author lifang
@@ -52,6 +57,10 @@ public class LocalImRoomService extends BaseService<ImRoomMapper, ImRoomEntity,S
     @Lazy
     private ImRoomOperatorManager roomOperatorManager;
 
+    @Autowired
+    @Lazy
+    private DelayMessageManager delayMessageManager;
+
     @Override
     public void validateBeforeSave(ImRoomEntity entity) {
         if(entity.getManageType()==null&& StrUtil.isNotEmpty(entity.getPatientId())){
@@ -72,6 +81,17 @@ public class LocalImRoomService extends BaseService<ImRoomMapper, ImRoomEntity,S
 
     }
 
+    @Override
+    public void postUpdate(ImRoomEntity entity) {
+        if(ImStatusEnum.SUCCESS.equals(entity.getStatus())){
+            autoFinishRoom(entity.getId());        }
+    }
+
+    @Override
+    public void postSave(ImRoomEntity entity) {
+        if(ImStatusEnum.SUCCESS.equals(entity.getStatus())){
+            autoFinishRoom(entity.getId());        }
+    }
 
     /**
      * 描述: 创建聊天室
@@ -111,12 +131,13 @@ public class LocalImRoomService extends BaseService<ImRoomMapper, ImRoomEntity,S
      */
     @Transactional(rollbackFor = Exception.class)
     public void successChatRoom(String chatRoomId,String doctorId) {
-        this.update(new UpdateWrapper<ImRoomEntity>()
+        if (this.update(new UpdateWrapper<ImRoomEntity>()
                 .lambda()
                 .eq(ImRoomEntity::getId,chatRoomId)
                 .set(ImRoomEntity::getSuccessTime,new Date())
-                .set(ImRoomEntity::getStatus,ImStatusEnum.SUCCESS)
-        );
+                .set(ImRoomEntity::getStatus, ImStatusEnum.SUCCESS))) {
+            autoFinishRoom(chatRoomId);
+        }
     }
 
     /**
@@ -153,4 +174,9 @@ public class LocalImRoomService extends BaseService<ImRoomMapper, ImRoomEntity,S
         }
         return result;
     }
+
+
+    private void autoFinishRoom(String roomId){
+        delayMessageManager.add(new DelayMessage(Value.simple(roomId),AUTO_FINISH_DELAY, DelayMessageProperties.of(TimeUnit.MINUTES,1)));
+    }
 }

+ 26 - 16
nb-im/src/main/java/com/nb/im/utils/ImUtils.java

@@ -83,24 +83,32 @@ public class ImUtils {
         imRoomMsgService.save(roomMsg);
 
 
-        //更新聊天室信息
-        roomService.update(new UpdateWrapper<ImRoomEntity>()
-                .lambda()
-                .eq(ImRoomEntity::getId,pubMsgInfo.getRoomId())
-                .set(ImRoomEntity::getLastMsgId,roomMsg.getId())
-                .set(ImRoomEntity::getLastMsgTime,roomMsg.getCreateTime())
-                .set(ImRoomEntity::getLastSenderId,roomMsg.getSenderId())
-                .setSql("total_count=total_count+1"));
-
-        roomUserService.update(new UpdateWrapper<ImRoomUserEntity>()
-                .lambda()
-                .eq(ImRoomUserEntity::getImRoomId,pubMsgInfo.getRoomId())
-                .eq(ImRoomUserEntity::getUserId,pubMsgInfo.getSenderId())
-                .setSql("send_count = send_count+1 "));
+        if(pubMsgInfo.isTmp()){
+            //更新聊天室信息
+            roomService.update(new UpdateWrapper<ImRoomEntity>()
+                    .lambda()
+                    .eq(ImRoomEntity::getId,pubMsgInfo.getRoomId())
+                    .set(ImRoomEntity::getLastMsgId,roomMsg.getId())
+                    .set(ImRoomEntity::getLastMsgTime,roomMsg.getCreateTime())
+                    .set(ImRoomEntity::getLastSenderId,roomMsg.getSenderId())
+                    .setSql("total_count=total_count+1"));
+
+            roomUserService.update(new UpdateWrapper<ImRoomUserEntity>()
+                    .lambda()
+                    .eq(ImRoomUserEntity::getImRoomId,pubMsgInfo.getRoomId())
+                    .eq(ImRoomUserEntity::getUserId,pubMsgInfo.getSenderId())
+                    .setSql("send_count = send_count+1 "));
+        }
+
 
         pubTopicMap.computeIfAbsent(topic, k->redissonClient.getTopic(k))
                 .publishAsync( TopicMessage.of(roomMsg,param,pubMsgInfo.getKey()))
                 .whenComplete((r,e)->{
+                    if(e==null){
+                        log.info("发送聊天室消息{}成功",JSONUtil.toJsonStr(roomMsg));
+                    }else{
+                        log.error("发送聊天室消息{}失败,",JSONUtil.toJsonStr(roomMsg),e);
+                    }
                     if(channelContext!=null){
                         Tio.send(channelContext, WsResponse.fromText(JSONUtil.toJsonStr(
                                 MessageResponse.of("im","im-result",
@@ -112,7 +120,9 @@ public class ImUtils {
                     }
                 });
 
-        String senderId = pubMsgInfo.getSenderId();
-        roomOperator.addUnreadMsg(senderId.equals(roomOperator.getAssitId())?roomOperator.getDoctorId():roomOperator.getAssitId(),Arrays.asList(pubMsgInfo.getKey()));
+        if(pubMsgInfo.isTmp()){
+            String senderId = pubMsgInfo.getSenderId();
+            roomOperator.addUnreadMsg(senderId.equals(roomOperator.getAssitId())?roomOperator.getDoctorId():roomOperator.getAssitId(),Arrays.asList(pubMsgInfo.getKey()));
+        }
     }
 }

+ 3 - 0
nb-im/src/main/java/com/nb/im/ws/PubMsgInfo.java

@@ -61,6 +61,9 @@ public class PubMsgInfo implements Serializable {
     @ApiModelProperty("操作类型")
     private MsgEnum operationType;
 
+    @ApiModelProperty("消息是否为临时消息,即不需要持久化")
+    private boolean tmp;
+
     @JsonIgnoreProperties(allowGetters = true)
     private Long sort;
 

+ 2 - 1
nb-service-api/app-msg-api/src/main/java/com/nb/app/msg/enums/MsgEnum.java

@@ -28,7 +28,8 @@ public enum  MsgEnum  implements IEnum<Integer> {
     REGISTER(6,"新用户注册"),
     ASSIST_EVAL(7,"疼痛评估"),
     NORMAL(8,"正常消息"),
-    FINISHED(9,"医生断开聊天")
+    FINISHED(9,"医生断开聊天"),
+    AUTO_FINISHED(10,"超过24小时自动断开聊天")
     ;
     @Getter
     @ApiModelProperty("枚举编码")

+ 1 - 1
nb-service/app-assistant/src/main/java/com/nb/app/assistant/delay/UnEvalNotifyDelayMessageHandler.java

@@ -67,7 +67,7 @@ public class UnEvalNotifyDelayMessageHandler implements DelayMessageHandler {
                 sendUnEvalMsg(unEvalNotify.getAssistId(),unEvalNotify.getPatientId());
             }else {
                 Date now = new Date();
-                if (DateUtil.between(lastEval.getEvaluateTime(),now, DateUnit.HOUR)>=24) {
+                if (DateUtil.between(lastEval.getEvaluateTime(),now, DateUnit.MINUTE)>=24*60) {
                     //发送消息
                     log.info("据上次临床评价时间{}已超过24小时,发送24小时未评消息",lastEval.getEvaluateTime());
                     sendUnEvalMsg(unEvalNotify.getAssistId(),unEvalNotify.getPatientId());