diff --git a/.gitignore b/.gitignore index e2e56360..3f03624c 100644 --- a/.gitignore +++ b/.gitignore @@ -33,3 +33,4 @@ build/ .vscode/ logs *.log +*.log diff --git a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/TicketController.java b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/TicketController.java index f6c40be4..17ea9cf5 100644 --- a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/TicketController.java +++ b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/TicketController.java @@ -24,6 +24,7 @@ import com.nflg.mobilebroken.repository.service.*; import com.nflg.mobilebroken.starter.annotation.MethodInfoMark; import com.nflg.mobilebroken.starter.service.impl.APPSSEManagerService; import lombok.extern.slf4j.Slf4j; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; @@ -96,6 +97,9 @@ public class TicketController extends ControllerBase { @Resource private TicketEventPublisher ticketEventPublisher; + @Resource + private RedisTemplate redisTemplate; + /** * 获取问题类型 * @return 问题类型列表 @@ -501,8 +505,33 @@ public class TicketController extends ControllerBase { **/ @GetMapping("getChatMessages") @ApiMark(moduleName = "工单管理", apiName = "获取工单聊天记录") - public ApiResult> getChatMessages(@Valid @RequestParam @NotNull Integer ticketId) { - return ApiResult.success(ticketChatService.getMessages(ticketId)); + public ApiResult getChatMessages(@Valid @RequestParam @NotNull Integer ticketId) { + MessageVO vo=new MessageVO(); + List messageVOS=ticketChatService.getMessages(ticketId); + vo.setMessages(messageVOS); + String key="chatMessage:readed:"+ticketId+":admin:"+AdminUserUtil.getUserId(); + Set readeds=redisTemplate.opsForSet().members(key); + Set notReadeds=new HashSet<>(); + if (CollectionUtil.isEmpty(readeds)){ + notReadeds=messageVOS.stream() + .filter(m->!Objects.equals(m.getSenderId(),AdminUserUtil.getUserId())) + .map(ChatMessageVO::getId) + .collect(Collectors.toSet()); + }else { + for (ChatMessageVO messageVO:messageVOS) { + if (Objects.equals(messageVO.getSenderId(),AdminUserUtil.getUserId()) || readeds.contains(messageVO.getId())){ + messageVO.setReaded(true); + }else { + notReadeds.add(messageVO.getId()); + } + } + } + if (CollectionUtil.isNotEmpty(notReadeds)) { + redisTemplate.opsForSet().add(key, notReadeds.toArray(String[]::new)); + vo.setNotReadCount(notReadeds.size()); + vo.setFirstMessageId(notReadeds.stream().findFirst().get()); + } + return ApiResult.success(vo); } /** diff --git a/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/controller/TiketController.java b/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/controller/TiketController.java index 13363390..710b226d 100644 --- a/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/controller/TiketController.java +++ b/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/controller/TiketController.java @@ -23,6 +23,7 @@ import com.nflg.mobilebroken.repository.entity.*; import com.nflg.mobilebroken.repository.service.*; import com.nflg.mobilebroken.starter.service.impl.AdminSSEManagerService; import lombok.extern.slf4j.Slf4j; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; @@ -88,6 +89,9 @@ public class TiketController extends ControllerBase { @Resource private TicketEventPublisher ticketEventPublisher; + @Resource + private RedisTemplate redisTemplate; + /** * 搜索设备 * @param request 搜索条件 @@ -276,8 +280,33 @@ public class TiketController extends ControllerBase { * @return 聊天记录 **/ @GetMapping("getChatMessages") - public ApiResult> getChatMessages(@Valid @RequestParam @NotNull Integer ticketId) { - return ApiResult.success(ticketChatService.getMessages(ticketId)); + public ApiResult getChatMessages(@Valid @RequestParam @NotNull Integer ticketId) { + MessageVO vo=new MessageVO(); + List messageVOS=ticketChatService.getMessages(ticketId); + vo.setMessages(messageVOS); + String key="chatMessage:readed:"+ticketId+":app:"+AppUserUtil.getUserId(); + Set readeds=redisTemplate.opsForSet().members(key); + Set notReadeds=new HashSet<>(); + if (CollectionUtil.isEmpty(readeds)){ + notReadeds=messageVOS.stream() + .filter(m->!Objects.equals(m.getSenderId(),AppUserUtil.getUserId())) + .map(ChatMessageVO::getId) + .collect(Collectors.toSet()); + }else { + for (ChatMessageVO messageVO:messageVOS) { + if (Objects.equals(messageVO.getSenderId(),AppUserUtil.getUserId()) || readeds.contains(messageVO.getId())){ + messageVO.setReaded(true); + }else { + notReadeds.add(messageVO.getId()); + } + } + } + if (CollectionUtil.isNotEmpty(notReadeds)) { + redisTemplate.opsForSet().add(key, notReadeds.toArray(String[]::new)); + vo.setNotReadCount(notReadeds.size()); + vo.setFirstMessageId(notReadeds.stream().findFirst().get()); + } + return ApiResult.success(vo); } /** diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/ChatMessageVO.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/ChatMessageVO.java index dceddfc1..6e051321 100644 --- a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/ChatMessageVO.java +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/ChatMessageVO.java @@ -40,4 +40,7 @@ public class ChatMessageVO { // 引用的消息 private ChatMessageVO quote; + + // 是否已读 + private Boolean readed=false; } diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/MessageVO.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/MessageVO.java new file mode 100644 index 00000000..2bacdc43 --- /dev/null +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/MessageVO.java @@ -0,0 +1,18 @@ +package com.nflg.mobilebroken.common.pojo.vo; + +import lombok.Data; + +import java.util.List; + +@Data +public class MessageVO { + + // 未读消息数量 + private Integer notReadCount; + + // 第一条消息id + private String firstMessageId; + + // 消息列表 + private List messages; +}