diff --git a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/MessageController.java b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/MessageController.java index 68e52ce6..d0537838 100644 --- a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/MessageController.java +++ b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/MessageController.java @@ -2,6 +2,7 @@ package com.nflg.mobilebroken.admin.controller; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.nflg.mobilebroken.admin.annotation.ApiMark; import com.nflg.mobilebroken.common.constant.Constant; import com.nflg.mobilebroken.common.constant.MessageSubType; @@ -12,6 +13,7 @@ import com.nflg.mobilebroken.common.pojo.request.AdminMessageSearchRequest; import com.nflg.mobilebroken.common.pojo.request.MessageConfigRequest; import com.nflg.mobilebroken.common.pojo.vo.*; import com.nflg.mobilebroken.common.util.AdminUserUtil; +import com.nflg.mobilebroken.common.util.AppUserUtil; import com.nflg.mobilebroken.common.util.MultilingualUtil; import com.nflg.mobilebroken.common.util.PageUtil; import com.nflg.mobilebroken.repository.entity.*; @@ -26,6 +28,7 @@ import javax.annotation.Resource; import javax.validation.Valid; import javax.validation.constraints.NotEmpty; import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; /** @@ -260,4 +263,10 @@ public class MessageController extends ControllerBase { operations.putAll("message:config:admin:" + AdminUserUtil.getUserId(), maps); return ApiResult.success(); } + + @GetMapping("getAllTicketNotReadMessageCount") + public ApiResult getAllTicketNotReadMessageCount() { + Integer count = adminMessageService.getAllTicketNotReadMessageCount(0); + return ApiResult.success(count); + } } 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 2628ab74..22029d12 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 @@ -159,6 +159,9 @@ public class TicketController extends ControllerBase { @Resource private AliYunTranslate aliYunTranslate; + @Resource + private IRedisMessageService redisMessageService; + /** * 获取问题类型 * @return 问题类型列表 @@ -337,6 +340,7 @@ public class TicketController extends ControllerBase { d.setTitleTranslate(titleTranslate); } } + d.setChatMessageNotReadedCount(redisMessageService.getChatMessageNotReadedCount(d.getId(), Constant.FROM_ADMIN, AdminUserUtil.getUserId())); return d; })); } diff --git a/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/controller/MessageController.java b/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/controller/MessageController.java index 71c279dd..b1d0123e 100644 --- a/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/controller/MessageController.java +++ b/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/controller/MessageController.java @@ -3,6 +3,7 @@ package com.nflg.mobilebroken.cfs.controller; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.nflg.mobilebroken.common.constant.Constant; import com.nflg.mobilebroken.common.constant.MessageSubType; import com.nflg.mobilebroken.common.pojo.ApiResult; @@ -16,6 +17,7 @@ import com.nflg.mobilebroken.repository.entity.AppMessage; import com.nflg.mobilebroken.repository.service.IAppMessageService; import com.nflg.mobilebroken.repository.service.IDictionaryItemService; import com.nflg.mobilebroken.repository.service.IDictionaryItemTranslateService; +import com.nflg.mobilebroken.repository.service.IRedisMessageService; import org.springframework.data.redis.core.HashOperations; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate; @@ -24,10 +26,9 @@ import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.validation.Valid; import javax.validation.constraints.NotEmpty; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; +import java.util.*; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Collectors; /** @@ -51,6 +52,9 @@ public class MessageController extends ControllerBase { @Resource private IDictionaryItemTranslateService dictionaryItemTranslateService; + @Resource + private IRedisMessageService redisMessageService; + /** * 搜索消息 * @param request 请求参数 @@ -191,4 +195,23 @@ public class MessageController extends ControllerBase { operations.putAll("message:config:app:" + AppUserUtil.getUserId(), maps); return ApiResult.success(); } + + @GetMapping("getAllTicketNotReadMessageCount") + public ApiResult getAllTicketNotReadMessageCount() { + List ticketIdObjs = appMessageService.listObjs(Wrappers.lambdaQuery() + .select(AppMessage::getTicketId) + .eq(AppMessage::getIsRead, false) + .eq(AppMessage::getUserId, AppUserUtil.getUserId()) + .eq(AppMessage::getUserPlatform, AppUserUtil.getFrom()) + .groupBy(AppMessage::getTicketId)); + Set ticketIdSet = ticketIdObjs.stream() + .map(obj -> (Long) obj) + .collect(Collectors.toSet()); + + AtomicInteger count = new AtomicInteger(0); + ticketIdSet.forEach(ticketId -> { + count.addAndGet(redisMessageService.getChatMessageNotReadedCount(ticketId, AppUserUtil.getFrom(), AppUserUtil.getUserId())); + }); + return ApiResult.success(count.intValue()); + } } diff --git a/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/controller/TicketController.java b/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/controller/TicketController.java index 9ba3d507..d3b6363e 100644 --- a/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/controller/TicketController.java +++ b/nflg-mobilebroken-cfs-app/src/main/java/com/nflg/mobilebroken/cfs/controller/TicketController.java @@ -1,8 +1,11 @@ package com.nflg.mobilebroken.cfs.controller; import cn.hutool.core.collection.CollectionUtil; +import cn.hutool.core.lang.Validator; import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import com.beust.jcommander.internal.Lists; import com.nflg.mobilebroken.cfs.publisher.GongFuTicketEventPublisher; import com.nflg.mobilebroken.cfs.publisher.TicketEventPublisher; import com.nflg.mobilebroken.cfs.service.ShengWangService; @@ -16,10 +19,7 @@ import com.nflg.mobilebroken.common.pojo.PageData; import com.nflg.mobilebroken.common.pojo.dto.*; import com.nflg.mobilebroken.common.pojo.request.*; import com.nflg.mobilebroken.common.pojo.vo.*; -import com.nflg.mobilebroken.common.util.AppUserUtil; -import com.nflg.mobilebroken.common.util.MultilingualUtil; -import com.nflg.mobilebroken.common.util.ShengWangUtil; -import com.nflg.mobilebroken.common.util.VUtils; +import com.nflg.mobilebroken.common.util.*; import com.nflg.mobilebroken.repository.entity.*; import com.nflg.mobilebroken.repository.service.*; import com.nflg.mobilebroken.starter.service.UniPushService; @@ -127,6 +127,9 @@ public class TicketController extends ControllerBase { @Resource private AliYunTranslate aliYunTranslate; + @Resource + private IRedisMessageService redisMessageService; + /** * 搜索设备 * @param request 搜索条件 @@ -242,7 +245,10 @@ public class TicketController extends ControllerBase { // } // return d; // })); - return ApiResult.success(ticketService.search(request, AppUserUtil.getUser(), MultilingualUtil.getLanguage())); + return ApiResult.success(PageUtil.convert(ticketService.search(request, AppUserUtil.getUser(), MultilingualUtil.getLanguage()), d -> { + d.setChatMessageNotReadedCount(redisMessageService.getChatMessageNotReadedCount(d.getId(), AppUserUtil.getFrom(), AppUserUtil.getUserId())); + return d; + })); } /** @@ -346,8 +352,8 @@ public class TicketController extends ControllerBase { && Objects.equals(ticket.getState(), TicketState.ProcessingCompleted.getState()) && !ticketEvaluateService.lambdaQuery().eq(TicketEvaluate::getTicketId, ticket.getId()).exists() ); - appMessageService.setReaded(AppUserUtil.getUserId(), AppUserUtil.getFrom(), MessageSubType.TicketNewMessage.getState()); - appMessageService.setReaded(AppUserUtil.getUserId(), AppUserUtil.getFrom(), MessageSubType.TicketClosed.getState()); + appMessageService.setReaded(AppUserUtil.getUserId(), AppUserUtil.getFrom(), MessageSubType.TicketNewMessage.getState(), Lists.newArrayList(id)); + appMessageService.setReaded(AppUserUtil.getUserId(), AppUserUtil.getFrom(), MessageSubType.TicketClosed.getState(), Lists.newArrayList(id)); return ApiResult.success(vo); } diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/constant/RedisKey.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/constant/RedisKey.java new file mode 100644 index 00000000..f4d21e63 --- /dev/null +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/constant/RedisKey.java @@ -0,0 +1,11 @@ +package com.nflg.mobilebroken.common.constant; + +import com.nflg.mobilebroken.common.util.AppUserUtil; + +public interface RedisKey { + + static String getChatMessageNotReadedKey(Long ticketId, String platform, Integer userId) { + return "chatMessage:notreaded:" + ticketId + ":" + platform + ":" + userId; + } + +} diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/AdminTicketVO.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/AdminTicketVO.java index 0a3d2460..178a2ec3 100644 --- a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/AdminTicketVO.java +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/AdminTicketVO.java @@ -231,4 +231,9 @@ public class AdminTicketVO { * 产量 */ private String throughput; + + /** + * 未读聊天消息数量 + */ + private Integer chatMessageNotReadedCount; } \ No newline at end of file diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/TicketVO.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/TicketVO.java index dc58d8d5..562a9f1f 100644 --- a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/TicketVO.java +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/vo/TicketVO.java @@ -80,4 +80,9 @@ public class TicketVO { * 产量 */ private String throughput; + + /** + * 未读聊天消息数量 + */ + private Integer chatMessageNotReadedCount; } diff --git a/nflg-mobilebroken-gongfu/src/main/java/com/nflg/mobilebroken/gongfu/controller/MessageController.java b/nflg-mobilebroken-gongfu/src/main/java/com/nflg/mobilebroken/gongfu/controller/MessageController.java new file mode 100644 index 00000000..4a09ef88 --- /dev/null +++ b/nflg-mobilebroken-gongfu/src/main/java/com/nflg/mobilebroken/gongfu/controller/MessageController.java @@ -0,0 +1,23 @@ +package com.nflg.mobilebroken.gongfu.controller; + +import com.nflg.mobilebroken.common.pojo.ApiResult; +import com.nflg.mobilebroken.repository.service.IAdminMessageService; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; + +@RestController +@RequestMapping("/message") +public class MessageController extends ControllerBase { + + @Resource + private IAdminMessageService adminMessageService; + + @GetMapping("getAllTicketNotReadMessageCount") + public ApiResult getAllTicketNotReadMessageCount() { + Integer count = adminMessageService.getAllTicketNotReadMessageCount(3); + return ApiResult.success(count); + } +} diff --git a/nflg-mobilebroken-gongfu/src/main/java/com/nflg/mobilebroken/gongfu/controller/TicketController.java b/nflg-mobilebroken-gongfu/src/main/java/com/nflg/mobilebroken/gongfu/controller/TicketController.java index a50b4ad4..223816c9 100644 --- a/nflg-mobilebroken-gongfu/src/main/java/com/nflg/mobilebroken/gongfu/controller/TicketController.java +++ b/nflg-mobilebroken-gongfu/src/main/java/com/nflg/mobilebroken/gongfu/controller/TicketController.java @@ -152,6 +152,9 @@ public class TicketController extends ControllerBase { @Resource private AliYunTranslate aliYunTranslate; + @Resource + private IRedisMessageService redisMessageService; + /** * 获取问题类型 * @return 问题类型列表 @@ -331,6 +334,7 @@ public class TicketController extends ControllerBase { d.setTitleTranslate(titleTranslate); } } + d.setChatMessageNotReadedCount(redisMessageService.getChatMessageNotReadedCount(d.getId(), Constant.FROM_ADMIN, AdminUserUtil.getUserId())); return d; })); } diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IAdminMessageService.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IAdminMessageService.java index f0b91006..6bdf4b4f 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IAdminMessageService.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IAdminMessageService.java @@ -40,4 +40,6 @@ public interface IAdminMessageService extends IService { void remove(Integer source, List sourceIds); AdminNotReadMessageCountVO getNotReadMessageCount1(Integer userId); + + Integer getAllTicketNotReadMessageCount(Integer source); } diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IAppMessageService.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IAppMessageService.java index 01e04aed..be774a15 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IAppMessageService.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IAppMessageService.java @@ -27,6 +27,8 @@ public interface IAppMessageService extends IService { void setReaded(Integer userId, String from, Integer type); + void setReaded(Integer userId, String from, Integer type, List ticketIds); + void setNotRead(Integer userId,String from,List ids); void add(AppMessage message); diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IRedisMessageService.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IRedisMessageService.java new file mode 100644 index 00000000..c9212fb4 --- /dev/null +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/IRedisMessageService.java @@ -0,0 +1,7 @@ +package com.nflg.mobilebroken.repository.service; + +public interface IRedisMessageService { + + Integer getChatMessageNotReadedCount(Long ticketId, String platform, Integer adminUserId); + +} diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AdminMessageServiceImpl.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AdminMessageServiceImpl.java index 4ab8cb0f..bb1a5077 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AdminMessageServiceImpl.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AdminMessageServiceImpl.java @@ -2,22 +2,29 @@ package com.nflg.mobilebroken.repository.service.impl; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.nflg.mobilebroken.common.constant.Constant; +import com.nflg.mobilebroken.common.pojo.ApiResult; import com.nflg.mobilebroken.common.pojo.request.AdminMessageSearchRequest; import com.nflg.mobilebroken.common.pojo.vo.AdminMessageVO; import com.nflg.mobilebroken.common.pojo.vo.AdminNotReadMessageCountVO; import com.nflg.mobilebroken.common.pojo.vo.AdminNotReadTicketMessageCountVO; +import com.nflg.mobilebroken.common.util.AdminUserUtil; +import com.nflg.mobilebroken.common.util.AppUserUtil; import com.nflg.mobilebroken.repository.entity.AdminMessage; import com.nflg.mobilebroken.repository.mapper.AdminMessageMapper; import com.nflg.mobilebroken.repository.service.IAdminMessageService; +import com.nflg.mobilebroken.repository.service.IRedisMessageService; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.List; +import java.util.Set; +import java.util.concurrent.atomic.AtomicInteger; import java.util.stream.Collectors; /** @@ -33,6 +40,9 @@ public class AdminMessageServiceImpl extends ServiceImpl search(Integer userId, AdminMessageSearchRequest request) { return baseMapper.search(userId, request, new Page<>(request.getPage(), request.getPageSize())); @@ -151,4 +161,23 @@ public class AdminMessageServiceImpl extends ServiceImpl ticketIdObjs = listObjs(Wrappers.lambdaQuery() + .select(AdminMessage::getSourceId) + .eq(AdminMessage::getIsRead, false) + .eq(AdminMessage::getUserId, AdminUserUtil.getUserId()) + .eq(AdminMessage::getSource, source) + .groupBy(AdminMessage::getSourceId)); + Set ticketIdSet = ticketIdObjs.stream() + .map(obj -> (Long) obj) + .collect(Collectors.toSet()); + + AtomicInteger count = new AtomicInteger(0); + ticketIdSet.forEach(ticketId -> { + count.addAndGet(redisMessageService.getChatMessageNotReadedCount(ticketId, Constant.FROM_ADMIN, AdminUserUtil.getUserId())); + }); + return count.intValue(); + } } diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AppMessageServiceImpl.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AppMessageServiceImpl.java index 1bf5e8f7..10b8c378 100644 --- a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AppMessageServiceImpl.java +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/AppMessageServiceImpl.java @@ -1,5 +1,6 @@ package com.nflg.mobilebroken.repository.service.impl; +import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -87,6 +88,21 @@ public class AppMessageServiceImpl extends ServiceImpl ticketIds) { + if (CollectionUtil.isEmpty(ticketIds)) { + return; + } + lambdaUpdate() + .set(AppMessage::getIsRead, true) + .eq(AppMessage::getUserId, userId) + .eq(AppMessage::getUserPlatform, from) + .eq(AppMessage::getSubType, type) + .in(AppMessage::getTicketId, ticketIds) + .update(); + setUnreadMessageCount(userId, from); + } + @Override public void setNotRead(Integer userId, String from, List ids) { lambdaUpdate() diff --git a/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/RedisMessageServiceImpl.java b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/RedisMessageServiceImpl.java new file mode 100644 index 00000000..1f43c01c --- /dev/null +++ b/nflg-mobilebroken-repository/src/main/java/com/nflg/mobilebroken/repository/service/impl/RedisMessageServiceImpl.java @@ -0,0 +1,22 @@ +package com.nflg.mobilebroken.repository.service.impl; + +import com.nflg.mobilebroken.common.constant.RedisKey; +import com.nflg.mobilebroken.repository.service.IRedisMessageService; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Optional; + +@Service +public class RedisMessageServiceImpl implements IRedisMessageService { + + @Resource + private StringRedisTemplate stringRedisTemplate; + + @Override + public Integer getChatMessageNotReadedCount(Long ticketId, String platform, Integer adminUserId) { + String key = RedisKey.getChatMessageNotReadedKey(ticketId, platform, adminUserId); + return Integer.parseInt((String) Optional.ofNullable(stringRedisTemplate.opsForHash().get(key, "count")).orElse("0")); + } +}