소스 검색

add 输注历史排序

18339543638 3 년 전
부모
커밋
cc42cf40c7

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

@@ -92,7 +92,7 @@ public class ImRoomController implements BaseSaveController<ImRoomEntity,String>
 
 
     @PostMapping("/no_page/unread/{roomId}")
-    @ApiOperation(value = "获取所有未读消息")
+    @ApiOperation(value = "获取所有未读消息(需手动调用接口设置为已读)")
     public R<List<ImMsgEntity>> unReadMsg(@PathVariable("roomId") String roomId){
         String userId = String.valueOf(SecurityUtil.getId());
         ImRoomOperator roomOperator = roomOperatorManager.getRoomOperator(roomId);
@@ -102,16 +102,24 @@ public class ImRoomController implements BaseSaveController<ImRoomEntity,String>
         }
         List<ImMsgEntity> result = msgService.list(new QueryWrapper<ImMsgEntity>()
                 .lambda()
-                .eq(ImMsgEntity::getImRoomId,roomId)
+                .eq(ImMsgEntity::getRoomId,roomId)
                 .in(ImMsgEntity::getKey,keySet));
         return R.success(result);
     }
 
-    @PostMapping
-    @ApiOperation("标记已读信息")
-    public R<Boolean> remarkRead(@RequestBody RemarkReadVo vo){
+    @PostMapping("/read")
+    @ApiOperation("标记信息为已读信息")
+    public R<Boolean> readMsg(@RequestBody RemarkReadVo vo){
         roomOperatorManager.getRoomOperator(vo.getRoomId())
-                .remarkUnreadMsg(vo.getUerId(),vo.getKey());
+                .readUnreadMsg(vo.getUerId(),vo.getKey());
+        return R.success(true);
+    }
+
+    @PostMapping("/read/all")
+    @ApiOperation("标记所有信息为已读信息")
+    public R<Boolean> readAll(@RequestBody RemarkReadVo vo){
+        roomOperatorManager.getRoomOperator(vo.getRoomId())
+                .readUnreadMsgAll(vo.getUerId());
         return R.success(true);
     }
 

+ 1 - 1
nb-im/src/main/java/com/nb/im/controller/vo/RemarkReadVo.java

@@ -22,7 +22,7 @@ public class RemarkReadVo {
 
     @ApiModelProperty("已读消息key")
     @NotNull(message = "消息key不能为空")
-    private List<Long> key;
+    private List<String> key;
 
 
     @ApiModelProperty("用户id")

+ 6 - 7
nb-im/src/main/java/com/nb/im/entity/ImMsgEntity.java

@@ -2,6 +2,7 @@ package com.nb.im.entity;
 
 import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
 import com.nb.app.msg.bean.MsgBean;
 import com.nb.app.msg.enums.MsgEnum;
 import com.nb.core.entity.GenericEntity;
@@ -14,8 +15,6 @@ import lombok.EqualsAndHashCode;
 import lombok.NoArgsConstructor;
 import lombok.ToString;
 
-import java.util.UUID;
-
 /**
  * @author lifang
  * @version 1.0.0
@@ -32,12 +31,13 @@ import java.util.UUID;
 public class ImMsgEntity extends GenericEntity<String> {
 
     @ApiModelProperty(value = "聊天室id",required = true)
-    private String imRoomId;
+    private String roomId;
 
     @ApiModelProperty(value = "消息内容",required = true)
     private String payload;
 
     @ApiModelProperty(value = "由客户端生成的消息key,在同一聊天室中消息id唯一",required = true)
+    @TableField("_key")
     private String key;
 
     @ApiModelProperty(value = "消息在聊天室中的顺序")
@@ -73,9 +73,9 @@ public class ImMsgEntity extends GenericEntity<String> {
 
     public static ImMsgEntity createRoomMsg(MsgBean msg, ImRoomEntity source){
         ImMsgEntity result = new ImMsgEntity();
-        result.setImRoomId(source.getId());
+        result.setRoomId(source.getId());
         result.setPayload(msg.getPayload());
-        result.setKey(UUID.randomUUID().toString());
+        result.setKey(IdWorker.getIdStr());
         result.setMsgType(ImMsgType.hyperlinks);
         result.setSenderId(msg.getSenderId());
         result.setSenderAvatar(msg.getSenderAvatar());
@@ -85,8 +85,7 @@ public class ImMsgEntity extends GenericEntity<String> {
         }else if(MsgEnum.PAIN_CALL.equals(msg.getMsgType())){
             result.setExtend(false);
         }
-        result.setOperationType(msg.getMsgType());
-        result.setOperationType(MsgEnum.NORMAL);
+        result.setOperationType(msg.getMsgType()==null?MsgEnum.NORMAL:msg.getMsgType());
         return result;
     }
 }

+ 27 - 0
nb-im/src/main/java/com/nb/im/entity/ImRoomEntity.java

@@ -1,6 +1,7 @@
 package com.nb.im.entity;
 
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.nb.app.msg.bean.MsgBean;
 import com.nb.core.entity.GenericEntity;
 import com.nb.core.enums.SexEnum;
 import com.nb.im.enums.ImStatusEnum;
@@ -72,4 +73,30 @@ public class ImRoomEntity extends GenericEntity<String> {
 
     @ApiModelProperty("聊天室最后一条消息时间")
     private Date lastMsgTime;
+
+
+    /**
+     * 描述: 由看护人发起的咨询或一件疼痛呼叫
+     * @author lifang
+     * @date 2022/8/16 10:38
+     * @param source
+     * @return ImRoomEntity
+     */
+    public static ImRoomEntity createRoom(MsgBean source){
+        ImRoomEntity result = new ImRoomEntity();
+        result.setAssistId(source.getSenderId());
+        result.setPatientId(source.getPatientId());
+        result.setPatientCode(source.getPatientCode());
+        result.setPatientName(source.getPatientName());
+        result.setPatientSex(source.getPatientSex());
+        result.setPatientAge(source.getPatientAge());
+        result.setDoctorId(source.getReceiverId());
+        result.setSponsorType(SponsorEnum.assist);
+        result.setTotalCount(1);
+        //等待医生确认
+        result.setStatus(ImStatusEnum.WAITING);
+        //默认院内管理
+        result.setManageType(ClinicManageEnum.hospital);
+        return result;
+    }
 }

+ 39 - 28
nb-im/src/main/java/com/nb/im/listener/ConsultMsgListener.java

@@ -1,5 +1,6 @@
 package com.nb.im.listener;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.nb.app.msg.bean.MsgBean;
 import com.nb.app.msg.enums.MsgEnum;
 import com.nb.app.msg.event.SaveMsgEvent;
@@ -7,10 +8,13 @@ import com.nb.im.entity.ImRoomEntity;
 import com.nb.im.entity.ImMsgEntity;
 import com.nb.im.entity.ImRoomUserEntity;
 import com.nb.im.enums.ImStatusEnum;
-import com.nb.im.enums.SponsorEnum;
+import com.nb.im.room.ImRoomOperator;
+import com.nb.im.room.ImRoomOperatorManager;
 import com.nb.im.service.LocalImMsgService;
 import com.nb.im.service.LocalImRoomService;
 import com.nb.im.service.LocalImRoomUserService;
+import com.nb.im.utils.ImUtils;
+import com.nb.im.ws.PubMsgInfo;
 import lombok.AllArgsConstructor;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.event.EventListener;
@@ -31,6 +35,8 @@ public class ConsultMsgListener {
     private final LocalImMsgService chatRoomMsgService;
     private final LocalImRoomUserService roomUserService;
     private final LocalImRoomService chatRoomService;
+    private final ImRoomOperatorManager operatorManager;
+    private final ImUtils imUtils;
 
     @EventListener
     @Async
@@ -44,36 +50,41 @@ public class ConsultMsgListener {
         if (!MsgEnum.CONSUL.equals(msgType)&&!MsgEnum.PAIN_CALL.equals(msgType)) {
             return;
         }
-        ImRoomEntity room = createRoom(payload);
-        chatRoomService.save(room);
-        createRoomUser(payload, room);
+        ImRoomEntity room = ImRoomEntity.createRoom(payload);
+        ImRoomEntity existRoom = chatRoomService.getOne(new QueryWrapper<ImRoomEntity>()
+                .lambda()
+                .eq(ImRoomEntity::getAssistId, room.getAssistId())
+                .eq(ImRoomEntity::getDoctorId, room.getDoctorId())
+                .eq(ImRoomEntity::getStatus, ImStatusEnum.SUCCESS)
+                .last("limit 1"));
+        if(existRoom==null){
+            if (chatRoomService.save(room)) {
+                createRoomUser(payload, room);
+            }
+        }else {
+            room=existRoom;
+        }
+
         ImMsgEntity roomMsg = ImMsgEntity.createRoomMsg(payload, room);
-        chatRoomMsgService.save(roomMsg);
-        room.setLastMsgId(roomMsg.getId());
+        ImRoomOperator roomOperator = operatorManager.getRoomOperator(room.getId());
+        roomMsg.setSort(roomOperator.generateSortId());
+        roomMsg.setRoomId(room.getId());
 
-    }
+        imUtils.send(room.getId(), PubMsgInfo.builder()
+                .key(roomMsg.getKey())
+                .payload(roomMsg.getPayload())
+                .senderType(roomMsg.getSponsor())
+                .senderId(roomMsg.getSenderId())
+                .senderNickname(roomMsg.getSenderNickname())
+                .senderAvatar(roomMsg.getSenderAvatar())
+                .msgType(roomMsg.getMsgType())
+                .sort(roomMsg.getSort())
+                .roomId(room.getId())
+                .operationType(msgType)
+                .build()
+        );
+        room.setLastMsgId(roomMsg.getId());
 
-    /**
-     * 描述: 由看护人发起的咨询或一件疼痛呼叫
-     * @author lifang
-     * @date 2022/8/16 10:38
-     * @param source
-     * @return ImRoomEntity
-     */
-    private ImRoomEntity createRoom(MsgBean source){
-        ImRoomEntity result = new ImRoomEntity();
-        result.setAssistId(source.getSenderId());
-        result.setPatientId(source.getPatientId());
-        result.setPatientCode(source.getPatientCode());
-        result.setPatientName(source.getPatientName());
-        result.setPatientSex(source.getPatientSex());
-        result.setPatientAge(source.getPatientAge());
-        result.setDoctorId(source.getReceiverId());
-        result.setSponsorType(SponsorEnum.assist);
-        result.setTotalCount(1);
-        //等待医生确认
-        result.setStatus(ImStatusEnum.WAITING);
-        return result;
     }
 
 

+ 1 - 1
nb-im/src/main/java/com/nb/im/mapper/ImRoomMapper.java

@@ -38,6 +38,6 @@ public interface ImRoomMapper extends BaseMapper<ImRoomEntity> {
      */
     IPage<ImRoomResult> queryPageMsgBlurry(Page<ImRoomResult> page, @Param("query") ImRoomQuery query);
 
-    long maxSort(@Param("roomId") String roomId);
+    Long maxSort(@Param("roomId") String roomId);
 
 }

+ 26 - 10
nb-im/src/main/java/com/nb/im/room/ImRoomOperator.java

@@ -1,5 +1,7 @@
 package com.nb.im.room;
 
+import com.nb.im.entity.ImRoomEntity;
+import lombok.Getter;
 import org.redisson.api.*;
 import java.util.HashMap;
 import java.util.Map;
@@ -16,17 +18,24 @@ public class ImRoomOperator {
     private RAtomicLong atomicLong;
     private final String id;
     private final RedissonClient redissonClient;
+    @Getter
+    private final String assitId;
+    @Getter
+    private final String doctorId;
     /**
      * 根据userId+roomId记录未读消息数量,并对未读的key进行保存
      */
     private Map<String, RSet<String>> unReadMap=new HashMap<>();
 
 
-    public ImRoomOperator(String id, RedissonClient redissonClient, long maxSort,List<String> userIds) {
+    public ImRoomOperator(String id, RedissonClient redissonClient, ImRoomEntity room,long maxSort, List<String> userIds) {
         this.id=id;
         this.msgKeyFilter = redissonClient.getBloomFilter("im:msg-key."+id);
+        this.msgKeyFilter.tryInit(55000000L, 0.03);
         this.atomicLong = redissonClient.getAtomicLong("im:incr." + id);
         this.redissonClient=redissonClient;
+        this.assitId=room.getAssistId();
+        this.doctorId=room.getDoctorId();
         userIds
                 .forEach(userId-> unReadMap.computeIfAbsent(userId,k->redissonClient.getSet("im:unread:"+id+":"+userId)));
 
@@ -47,25 +56,32 @@ public class ImRoomOperator {
      * @param key
      * @return void
      */
-    public void remarkUnreadMsg(String userId,List<Long> key){
-        unReadMap.get(userId)
-                .removeAll(key);
+    public void addUnreadMsg(String userId, List<String> key){
+        unReadMap.computeIfAbsent(userId,k->redissonClient.getSet("im:unread:"+id+":"+userId)).addAll(key);
     }
 
 
     /**
-     * 描述: 用户发送了消息,对该房间其他人进行未读消息设置
+     * 描述: 消息设置为已读
      * @author lifang
      * @date 2022/8/18 20:41
      * @param userId
      * @return void
      */
-    public void remarkUnreadMsgAll(String userId){
-        unReadMap.get(userId)
-                .unlink();
+    public void readUnreadMsg(String userId, List<String> key){
+        unReadMap.computeIfAbsent(userId,k->redissonClient.getSet("im:unread:"+id+":"+userId)).removeAll(key);
     }
 
-
+    /**
+     * 描述: 所有消息设置为已读
+     * @author lifang
+     * @date 2022/8/18 20:41
+     * @param userId
+     * @return void
+     */
+    public void readUnreadMsgAll(String userId){
+        unReadMap.computeIfAbsent(userId,k->redissonClient.getSet("im:unread:"+id+":"+userId)).delete();
+    }
     /**
      * 描述: 获取用户未读消息数量
      * @author lifang
@@ -73,7 +89,7 @@ public class ImRoomOperator {
      * @param userId
      * @return long
      */
-    public long unReadCount(String userId){
+    public Integer unReadCount(String userId){
         return  unReadMap.computeIfAbsent(userId,k->redissonClient.getSet("im:unread:"+id+":"+userId))
                 .size();
     }

+ 9 - 5
nb-im/src/main/java/com/nb/im/room/ImRoomOperatorManager.java

@@ -8,7 +8,12 @@ import org.redisson.api.RedissonClient;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import java.lang.ref.Reference;
+import java.lang.ref.WeakReference;
+import java.util.HashMap;
+import java.util.Iterator;
 import java.util.Map;
+import java.util.WeakHashMap;
 import java.util.stream.Collectors;
 
 /**
@@ -21,7 +26,7 @@ import java.util.stream.Collectors;
 @Component
 public class ImRoomOperatorManager {
 
-    private Map<String,ImRoomOperator> imRoomOperatorMap;
+    private final Map<String,ImRoomOperator> imRoomOperatorMap=new HashMap<>();
 
     @Autowired
     private RedissonClient redissonClient;
@@ -32,9 +37,10 @@ public class ImRoomOperatorManager {
     @Autowired
     private LocalImRoomUserService roomUserService;
     public ImRoomOperator getRoomOperator(String roomId){
-        return imRoomOperatorMap.computeIfAbsent(roomId,k->
+        return imRoomOperatorMap.computeIfAbsent(new String(roomId),k->
                 new ImRoomOperator(roomId,
                         redissonClient,
+                        roomService.getById(roomId),
                         roomService.getMasSort(roomId),
                         roomUserService.list(new QueryWrapper<ImRoomUserEntity>()
                                 .lambda()
@@ -44,9 +50,7 @@ public class ImRoomOperatorManager {
                                 .collect(Collectors.toList())
 
                 )
-
-
-
         );
     }
+
 }

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

@@ -12,6 +12,9 @@ import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.HashMap;
+import java.util.Map;
+
 /**
  * @author lifang
  * @version 1.0.0
@@ -79,7 +82,6 @@ public class LocalImRoomService extends BaseService<ImRoomMapper, ImRoomEntity,S
      */
     @Transactional(rollbackFor = Exception.class)
     public void successChatRoom(String chatRoomId,String doctorId) {
-        chatRoomUserService.createRoomUser(chatRoomId,doctorId,SponsorEnum.doctor);
         this.update(new UpdateWrapper<ImRoomEntity>()
                 .lambda()
                 .eq(ImRoomEntity::getId,chatRoomId)
@@ -95,6 +97,7 @@ public class LocalImRoomService extends BaseService<ImRoomMapper, ImRoomEntity,S
      * @return long
      */
     public long getMasSort(String roomId) {
-        return this.baseMapper.maxSort(roomId);
+        Long result = this.baseMapper.maxSort(roomId);
+        return result==null?0L:result;
     }
 }

+ 1 - 1
nb-im/src/main/java/com/nb/im/service/dto/ImRoomResult.java

@@ -62,5 +62,5 @@ public class ImRoomResult implements Serializable {
     private ImMsgType msgType;
 
     @ApiModelProperty("消息未读数量")
-    private Long unreadCount;
+    private Integer unreadCount;
 }

+ 6 - 1
nb-im/src/main/java/com/nb/im/utils/ImUtils.java

@@ -26,6 +26,7 @@ import org.tio.core.Tio;
 import org.tio.websocket.common.WsPacket;
 import org.tio.websocket.common.WsResponse;
 
+import java.util.Arrays;
 import java.util.Map;
 import java.util.UUID;
 import java.util.concurrent.ConcurrentHashMap;
@@ -75,11 +76,12 @@ public class ImUtils {
             log.debug("消息{}重复发送",JSONUtil.toJsonStr(pubMsgInfo));
             return;
         }
-        pubMsgInfo.setSortId(roomOperator.generateSortId());
+        pubMsgInfo.setSort(roomOperator.generateSortId());
 
         ImMsgEntity roomMsg = BeanUtil.toBean(pubMsgInfo, ImMsgEntity.class);
         imRoomMsgService.save(roomMsg);
 
+
         //更新聊天室信息
         roomService.update(new UpdateWrapper<ImRoomEntity>()
                 .lambda()
@@ -101,5 +103,8 @@ public class ImUtils {
                         Tio.send(channelContext, WsResponse.fromText(JSONUtil.toJsonStr(PubResponse.success(pubMsgInfo.getKey())), WsPacket.CHARSET_NAME));
                     }
                 });
+
+        String senderId = pubMsgInfo.getSenderId();
+        roomOperator.addUnreadMsg(senderId.equals(roomOperator.getAssitId())?roomOperator.getDoctorId():roomOperator.getAssitId(),Arrays.asList(pubMsgInfo.getKey()));
     }
 }

+ 5 - 1
nb-im/src/main/java/com/nb/im/ws/PubMsgInfo.java

@@ -3,6 +3,7 @@ package com.nb.im.ws;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
 import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.nb.app.msg.enums.MsgEnum;
 import com.nb.im.enums.ImMsgType;
 import com.nb.im.enums.SponsorEnum;
 import io.swagger.annotations.ApiModelProperty;
@@ -50,8 +51,11 @@ public class PubMsgInfo implements Serializable {
     @ApiModelProperty("扩展字段")
     private String extend;
 
+    @ApiModelProperty("操作类型")
+    private MsgEnum operationType;
+
     @JsonIgnoreProperties(allowGetters = true)
-    private Long sortId;
+    private Long sort;
 
 
     public void validate(){

+ 2 - 34
nb-im/src/main/java/com/nb/im/ws/PubMsgRequestHandler.java

@@ -5,6 +5,7 @@ import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.json.JSONUtil;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.fasterxml.jackson.databind.ObjectMapper;
+import com.nb.app.msg.enums.MsgEnum;
 import com.nb.common.websocket.PubResponse;
 import com.nb.common.websocket.TopicMessage;
 import com.nb.common.websocket.filter.PubMsgFilter;
@@ -57,47 +58,14 @@ public class PubMsgRequestHandler implements IMsgRequestHandler {
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void handler(MessagingRequest message, ChannelContext channelContext, TopicWrapper topicWrapper) {
-//        String topic = topicWrapper.getTopic();
         String param = topicWrapper.getParam();
         if(CollectionUtil.isNotEmpty(msgFilters)){
             boolean result = msgFilters.stream()
                     .allMatch(filter -> filter.doFilter(channelContext, message));
             if(result){
                 PubMsgInfo pubMsgInfo = JSONUtil.toBean(JSONUtil.toJsonStr(message.getPayload()), PubMsgInfo.class);
+                pubMsgInfo.setOperationType(MsgEnum.NORMAL);
                 imUtils.send(param,topicWrapper,pubMsgInfo,channelContext,false);
-//                //消息不可重复发送
-//                String roomId = pubMsgInfo.getRoomId();
-//                ImRoomOperator roomOperator = roomOperatorManager.getRoomOperator(roomId);
-//                //判断消息是否重复发送
-//                if (roomOperator.existMsg(pubMsgInfo.getKey())) {
-//                    log.debug("消息{}重复发送",JSONUtil.toJsonStr(message.getPayload()));
-//                    return;
-//                }
-//                pubMsgInfo.setSortId(roomOperator.generateSortId());
-//
-//                ImMsgEntity roomMsg = BeanUtil.toBean(pubMsgInfo, ImMsgEntity.class);
-//                imRoomMsgService.save(roomMsg);
-//
-//                //更新聊天室信息
-//                roomService.update(new UpdateWrapper<ImRoomEntity>()
-//                        .lambda()
-//                        .eq(ImRoomEntity::getId,pubMsgInfo.getRoomId())
-//                        .set(ImRoomEntity::getLastMsgId,roomMsg.getId())
-//                        .set(ImRoomEntity::getLastMsgTime,roomMsg.getCreateTime())
-//                        .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,message.getKey()))
-//                        .whenComplete((r,e)->{
-//                            Tio.send(channelContext, WsResponse.fromText(JSONUtil.toJsonStr(PubResponse.success(message.getKey())), WsPacket.CHARSET_NAME));
-//                        });
-
             }
         }
     }

+ 3 - 3
nb-im/src/main/resources/mapper/im/ImRoomMapper.xml

@@ -60,14 +60,14 @@
     </select>
 
 
-    <select id="maxSort" resultType="long">
+    <select id="maxSort" resultType="Long">
                 SELECT
         MAX( sort )
         FROM
             im_msg
         GROUP BY
-            im_room_id
+            room_id
         HAVING
-            im_room_id = #{roomId};
+            room_id = #{roomId};
     </select>
 </mapper>

+ 4 - 3
nb-service/app-doctor/src/main/java/com/nb/app/doctor/service/LocalAppDoctorUserService.java

@@ -198,7 +198,7 @@ public class LocalAppDoctorUserService extends BaseService<AppDoctorUserMapper,
             return;
         }
         //判断是否处于勿扰模式
-        String imRoomId = entity.getImRoomId();
+        String imRoomId = entity.getRoomId();
         ImRoomEntity room = roomService.getById(imRoomId);
         if(!ImStatusEnum.SUCCESS.equals(room.getStatus())){
             return;
@@ -231,15 +231,16 @@ public class LocalAppDoctorUserService extends BaseService<AppDoctorUserMapper,
         if(StrUtil.isNotEmpty(payload)){
             PubMsgInfo pubMsgInfo = PubMsgInfo
                     .builder()
-                    .roomId(entity.getImRoomId())
+                    .roomId(entity.getRoomId())
                     .payload(payload)
                     .senderType(entity.getSponsor())
                     .senderId(entity.getSenderId())
                     .senderNickname(entity.getSenderNickname())
                     .senderAvatar(entity.getSenderAvatar())
                     .msgType(ImMsgType.txt)
+                    .operationType(MsgEnum.NORMAL)
                     .build();
-            imUtils.send(entity.getImRoomId(),pubMsgInfo);
+            imUtils.send(entity.getRoomId(),pubMsgInfo);
         }
     }
 }