1440 APP端,客户端工单,移动破工单,工服工单中需要增加未读聊天消息的角标提示

This commit is contained in:
10002617 2026-04-21 17:25:58 +08:00
parent a48076491c
commit 3d3e429cf9
15 changed files with 179 additions and 11 deletions

View File

@ -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<Integer> getAllTicketNotReadMessageCount() {
Integer count = adminMessageService.getAllTicketNotReadMessageCount(0);
return ApiResult.success(count);
}
}

View File

@ -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;
}));
}

View File

@ -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<Integer> getAllTicketNotReadMessageCount() {
List<Object> ticketIdObjs = appMessageService.listObjs(Wrappers.<AppMessage>lambdaQuery()
.select(AppMessage::getTicketId)
.eq(AppMessage::getIsRead, false)
.eq(AppMessage::getUserId, AppUserUtil.getUserId())
.eq(AppMessage::getUserPlatform, AppUserUtil.getFrom())
.groupBy(AppMessage::getTicketId));
Set<Long> 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());
}
}

View File

@ -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);
}

View File

@ -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;
}
}

View File

@ -231,4 +231,9 @@ public class AdminTicketVO {
* 产量
*/
private String throughput;
/**
* 未读聊天消息数量
*/
private Integer chatMessageNotReadedCount;
}

View File

@ -80,4 +80,9 @@ public class TicketVO {
* 产量
*/
private String throughput;
/**
* 未读聊天消息数量
*/
private Integer chatMessageNotReadedCount;
}

View File

@ -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<Integer> getAllTicketNotReadMessageCount() {
Integer count = adminMessageService.getAllTicketNotReadMessageCount(3);
return ApiResult.success(count);
}
}

View File

@ -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;
}));
}

View File

@ -40,4 +40,6 @@ public interface IAdminMessageService extends IService<AdminMessage> {
void remove(Integer source, List<Long> sourceIds);
AdminNotReadMessageCountVO getNotReadMessageCount1(Integer userId);
Integer getAllTicketNotReadMessageCount(Integer source);
}

View File

@ -27,6 +27,8 @@ public interface IAppMessageService extends IService<AppMessage> {
void setReaded(Integer userId, String from, Integer type);
void setReaded(Integer userId, String from, Integer type, List<Long> ticketIds);
void setNotRead(Integer userId,String from,List<Integer> ids);
void add(AppMessage message);

View File

@ -0,0 +1,7 @@
package com.nflg.mobilebroken.repository.service;
public interface IRedisMessageService {
Integer getChatMessageNotReadedCount(Long ticketId, String platform, Integer adminUserId);
}

View File

@ -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<AdminMessageMapper, Adm
@Resource
private StringRedisTemplate stringRedisTemplate;
@Resource
private IRedisMessageService redisMessageService;
@Override
public IPage<AdminMessageVO> 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<AdminMessageMapper, Adm
.collect(Collectors.toList())
);
}
@Override
public Integer getAllTicketNotReadMessageCount(Integer source) {
List<Object> ticketIdObjs = listObjs(Wrappers.<AdminMessage>lambdaQuery()
.select(AdminMessage::getSourceId)
.eq(AdminMessage::getIsRead, false)
.eq(AdminMessage::getUserId, AdminUserUtil.getUserId())
.eq(AdminMessage::getSource, source)
.groupBy(AdminMessage::getSourceId));
Set<Long> 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();
}
}

View File

@ -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<AppMessageMapper, AppMess
setUnreadMessageCount(userId, from);
}
@Override
public void setReaded(Integer userId, String from, Integer type, List<Long> 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<Integer> ids) {
lambdaUpdate()

View File

@ -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"));
}
}