ImRoomController.java 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. package com.nb.im.controller;
  2. import cn.dev33.satoken.stp.StpLogic;
  3. import cn.hutool.core.bean.BeanUtil;
  4. import cn.hutool.core.collection.CollectionUtil;
  5. import cn.hutool.core.util.StrUtil;
  6. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  7. import com.baomidou.mybatisplus.core.mapper.Mapper;
  8. import java.util.*;
  9. import java.util.concurrent.atomic.AtomicLong;
  10. import com.nb.auth.utils.SecurityUtil;
  11. import com.nb.common.crud.BaseService;
  12. import com.nb.common.crud.controller.BaseSaveController;
  13. import com.nb.core.exception.CustomException;
  14. import com.nb.core.result.R;
  15. import com.nb.im.controller.vo.RemarkReadVo;
  16. import com.nb.im.controller.vo.UnreadVo;
  17. import com.nb.im.entity.ImMsgEntity;
  18. import com.nb.im.entity.ImRoomEntity;
  19. import com.nb.im.room.ImRoomOperator;
  20. import com.nb.im.room.ImRoomOperatorManager;
  21. import com.nb.im.service.LocalImMsgService;
  22. import com.nb.im.service.dto.ImRoomDetailDto;
  23. import com.nb.im.service.dto.ImRoomDto;
  24. import com.nb.im.enums.ImStatusEnum;
  25. import com.nb.im.enums.SponsorEnum;
  26. import com.nb.im.service.LocalImRoomService;
  27. import com.nb.im.service.dto.ImRoomQuery;
  28. import com.nb.im.service.dto.ImRoomResult;
  29. import io.swagger.annotations.Api;
  30. import io.swagger.annotations.ApiOperation;
  31. import lombok.AllArgsConstructor;
  32. import org.springframework.context.annotation.Bean;
  33. import org.springframework.validation.annotation.Validated;
  34. import org.springframework.web.bind.annotation.*;
  35. /**
  36. * @author lifang
  37. * @version 1.0.0
  38. * @ClassName ChatRoomController.java
  39. * @Description
  40. * @createTime 2022年08月16日 09:42:00
  41. */
  42. @RestController
  43. @AllArgsConstructor
  44. @RequestMapping("/im/room")
  45. @Api(tags = "聊天室")
  46. public class ImRoomController implements BaseSaveController<ImRoomEntity,String> {
  47. private final LocalImRoomService imRoomService;
  48. private final ImRoomOperatorManager roomOperatorManager;
  49. private final LocalImMsgService msgService;
  50. @Override
  51. public BaseService<? extends Mapper<ImRoomEntity>, ImRoomEntity, String> getService() {
  52. return imRoomService;
  53. }
  54. @ApiOperation(value = "查询并自动创建与病人看护人的聊天室",notes = "若存在,则返回聊天室信息,若不存在,则返回空")
  55. @PostMapping("/look")
  56. public R getChatRoom(@RequestBody@Validated ImRoomDto source){
  57. if(Boolean.TRUE.equals(source.isAutoCreate())&&StrUtil.isEmpty(source.getDoctorNickname())){
  58. throw new CustomException("医生昵称不可为空");
  59. }
  60. ImRoomEntity chatRoom = imRoomService.getOne(new QueryWrapper<ImRoomEntity>()
  61. .lambda()
  62. .eq(ImRoomEntity::getAssistId, source.getAssistId())
  63. .eq(ImRoomEntity::getDoctorId, source.getDoctorId())
  64. .eq(ImRoomEntity::getPatientId, source.getPatientId())
  65. .nested(i->i.eq(ImRoomEntity::getStatus, ImStatusEnum.WAITING)
  66. .or()
  67. .eq(ImRoomEntity::getStatus,ImStatusEnum.SUCCESS))
  68. .last("limit 1"));
  69. if(chatRoom==null&&source.isAutoCreate()){
  70. source.setTotalCount(0);
  71. source.setSponsorType(SponsorEnum.doctor);
  72. source.setStatus(ImStatusEnum.SUCCESS);
  73. imRoomService.createChatRoom(source);
  74. }else if(chatRoom!=null&&ImStatusEnum.WAITING.equals(chatRoom.getStatus())&&source.isAutoCreate()){
  75. imRoomService.successChatRoom(chatRoom.getId(),source.getDoctorId());
  76. }
  77. return R.success(chatRoom);
  78. }
  79. @PostMapping("/finished/{roomId}")
  80. @ApiOperation(value = "结束咨询")
  81. public R<Boolean> finished(@PathVariable String roomId){
  82. return R.success(imRoomService.finished(roomId));
  83. }
  84. @PostMapping("/no_page")
  85. @ApiOperation(value = "聊天室列表查询",notes = "走非条件查询,条件查询请于安卓端自行实现")
  86. public R<List<ImRoomResult>> list(@RequestBody @Validated ImRoomQuery query){
  87. List<ImRoomResult> result= imRoomService.getBaseMapper().queryPageNoneMsgBlurry(query);
  88. String userId = String.valueOf(SecurityUtil.getId());
  89. result.forEach(room->
  90. room.setUnreadCount( roomOperatorManager.getRoomOperator(room.getId())
  91. .unReadCount(userId))
  92. );
  93. return R.success(result);
  94. }
  95. @GetMapping("/view/{id}")
  96. @ApiOperation(value = "根据id查询聊天室")
  97. public R<ImRoomDetailDto> getById(@PathVariable("id") String id){
  98. ImRoomDetailDto result= BeanUtil.toBean(imRoomService.getById(id),ImRoomDetailDto.class);
  99. if(result!=null){
  100. result.setUnreadCount( roomOperatorManager.getRoomOperator(result.getId())
  101. .unReadCount( String.valueOf(SecurityUtil.getId())));
  102. }
  103. return R.success(result);
  104. }
  105. @PostMapping("/no_page/unread/{roomId}")
  106. @ApiOperation(value = "获取所有未读消息(需手动调用接口设置为已读)")
  107. public R<List<ImMsgEntity>> unReadMsg(@PathVariable("roomId") String roomId){
  108. String userId = String.valueOf(SecurityUtil.getId());
  109. ImRoomOperator roomOperator = roomOperatorManager.getRoomOperator(roomId);
  110. Set<String> keySet = roomOperator.allUnreadMsgKey(userId);
  111. if(CollectionUtil.isEmpty(keySet)){
  112. return R.success(new ArrayList<>());
  113. }
  114. List<ImMsgEntity> result = msgService.list(new QueryWrapper<ImMsgEntity>()
  115. .lambda()
  116. .eq(ImMsgEntity::getRoomId,roomId)
  117. .in(ImMsgEntity::getKey,keySet));
  118. return R.success(result);
  119. }
  120. @PostMapping("/read")
  121. @ApiOperation("标记信息为已读信息")
  122. public R<Boolean> readMsg(@RequestBody RemarkReadVo vo){
  123. roomOperatorManager.getRoomOperator(vo.getRoomId())
  124. .readUnreadMsg(vo.getUerId(),vo.getKey());
  125. return R.success(true);
  126. }
  127. @PostMapping("/read/all")
  128. @ApiOperation("标记所有信息为已读信息")
  129. public R<Boolean> readAll(@RequestBody RemarkReadVo vo){
  130. roomOperatorManager.getRoomOperator(vo.getRoomId())
  131. .readUnreadMsgAll(vo.getUerId());
  132. return R.success(true);
  133. }
  134. @PostMapping("/read/unread")
  135. @ApiOperation("获取未读消息总数量")
  136. public R<Long> unReadCount(@RequestBody UnreadVo vo){
  137. if (StrUtil.isEmpty(vo.getAssistId()) && StrUtil.isEmpty(vo.getDoctorId())) {
  138. throw new CustomException("看护人id和医生id不能同时为空");
  139. }
  140. String userId=StrUtil.isEmpty(vo.getAssistId())?vo.getDoctorId():vo.getAssistId();
  141. AtomicLong result=new AtomicLong(0);
  142. List<ImRoomEntity> rooms = imRoomService.list(new QueryWrapper<ImRoomEntity>()
  143. .lambda()
  144. .select(ImRoomEntity::getId)
  145. .eq(StrUtil.isNotEmpty(vo.getAssistId()), ImRoomEntity::getAssistId, vo.getAssistId())
  146. .eq(StrUtil.isNotEmpty(vo.getDoctorId()), ImRoomEntity::getDoctorId, vo.getDoctorId())
  147. .eq(ImRoomEntity::getStatus,ImStatusEnum.SUCCESS)
  148. );
  149. if(CollectionUtil.isNotEmpty(rooms)){
  150. rooms.stream()
  151. .map(ImRoomEntity::getId).map(roomOperatorManager::getRoomOperator)
  152. .forEach(operator->{
  153. result.addAndGet(operator.unReadCount(userId));
  154. });
  155. }
  156. return R.success(result.get());
  157. }
  158. @Override
  159. public boolean isAuth() {
  160. return false;
  161. }
  162. @Override
  163. public String getPermissionPrefix() {
  164. return null;
  165. }
  166. @Override
  167. public StpLogic getStpLogin() {
  168. return SecurityUtil.getStpLogic();
  169. }
  170. }