1440 APP端,客户端工单,移动破工单,工服工单中需要增加未读聊天消息的角标提示
This commit is contained in:
parent
a48076491c
commit
3d3e429cf9
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
@ -231,4 +231,9 @@ public class AdminTicketVO {
|
|||
* 产量
|
||||
*/
|
||||
private String throughput;
|
||||
|
||||
/**
|
||||
* 未读聊天消息数量
|
||||
*/
|
||||
private Integer chatMessageNotReadedCount;
|
||||
}
|
||||
|
|
@ -80,4 +80,9 @@ public class TicketVO {
|
|||
* 产量
|
||||
*/
|
||||
private String throughput;
|
||||
|
||||
/**
|
||||
* 未读聊天消息数量
|
||||
*/
|
||||
private Integer chatMessageNotReadedCount;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -0,0 +1,7 @@
|
|||
package com.nflg.mobilebroken.repository.service;
|
||||
|
||||
public interface IRedisMessageService {
|
||||
|
||||
Integer getChatMessageNotReadedCount(Long ticketId, String platform, Integer adminUserId);
|
||||
|
||||
}
|
||||
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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"));
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue