阅读数统计逻辑
This commit is contained in:
parent
2a518ff533
commit
e4dbf59dd1
@ -37,12 +37,6 @@ public class AuthFilter implements Filter {
|
||||
@Value("${jwt.secret}")
|
||||
private String jwtSecret;
|
||||
|
||||
@Value("${aes.key}")
|
||||
private String key;
|
||||
|
||||
@Value("${aes.iv}")
|
||||
private String iv;
|
||||
|
||||
@Resource
|
||||
private HazelcastInstance hazelcastInstance;
|
||||
|
||||
@ -52,9 +46,6 @@ public class AuthFilter implements Filter {
|
||||
// jwt有效期(毫秒)
|
||||
public static final long jwtExpire = 60 * 60 * 1000 * 24;
|
||||
|
||||
@Resource
|
||||
private AuthService authService;
|
||||
|
||||
@Override
|
||||
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
|
||||
RequestIdUtil.setValue();
|
||||
|
||||
@ -4,7 +4,7 @@ import com.upchina.common.query.OnlyIdQuery;
|
||||
import com.upchina.common.result.AppPager;
|
||||
import com.upchina.common.result.CommonResult;
|
||||
import com.upchina.common.vo.FrontUserVO;
|
||||
import com.upchina.group.query.ListGroupAppQuery;
|
||||
import com.upchina.group.query.info.ListGroupAppQuery;
|
||||
import com.upchina.group.service.GroupInfoService;
|
||||
import com.upchina.group.vo.GroupVO;
|
||||
import io.swagger.annotations.Api;
|
||||
|
||||
@ -6,6 +6,7 @@ import com.upchina.common.result.CommonResult;
|
||||
import com.upchina.common.result.ResponseStatus;
|
||||
import com.upchina.common.vo.FrontUserVO;
|
||||
import com.upchina.group.query.message.ListGroupMessageAppQuery;
|
||||
import com.upchina.group.query.message.QueryUnreadCountAppQuery;
|
||||
import com.upchina.group.query.message.ReadGroupMessageAppQuery;
|
||||
import com.upchina.group.query.message.SendGroupMessageAppQuery;
|
||||
import com.upchina.group.service.app.AppGroupMessageService;
|
||||
@ -58,4 +59,13 @@ public class AppGroupMessageController {
|
||||
return CommonResult.success();
|
||||
}
|
||||
|
||||
@ApiOperation("APP查询未读数量")
|
||||
@PostMapping("/app/group/message/unreadCount")
|
||||
public CommonResult<Integer> unreadCount(
|
||||
@Validated @RequestBody @ApiParam(required = true) QueryUnreadCountAppQuery query,
|
||||
@RequestAttribute(value = "frontUser", required = false) FrontUserVO frontUser) {
|
||||
Integer count = appGroupMessageService.queryUnreadCount(query, frontUser);
|
||||
return CommonResult.success(count);
|
||||
}
|
||||
|
||||
}
|
||||
@ -178,6 +178,18 @@ public class GroupMessage implements Serializable {
|
||||
@TableField("is_recommend")
|
||||
private Integer isRecommend;
|
||||
|
||||
/**
|
||||
* 阅读数
|
||||
*/
|
||||
@TableField("read_count")
|
||||
private Integer readCount;
|
||||
|
||||
/**
|
||||
* 用户数
|
||||
*/
|
||||
@TableField("total_count")
|
||||
private Integer totalCount;
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
@ -394,6 +406,22 @@ public class GroupMessage implements Serializable {
|
||||
this.isRecommend = isRecommend;
|
||||
}
|
||||
|
||||
public Integer getReadCount() {
|
||||
return readCount;
|
||||
}
|
||||
|
||||
public void setReadCount(Integer readCount) {
|
||||
this.readCount = readCount;
|
||||
}
|
||||
|
||||
public Integer getTotalCount() {
|
||||
return totalCount;
|
||||
}
|
||||
|
||||
public void setTotalCount(Integer totalCount) {
|
||||
this.totalCount = totalCount;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "GroupMessage{" +
|
||||
@ -424,6 +452,8 @@ public class GroupMessage implements Serializable {
|
||||
", auditTime=" + auditTime +
|
||||
", advisorId=" + advisorId +
|
||||
", isRecommend=" + isRecommend +
|
||||
", readCount=" + readCount +
|
||||
", totalCount=" + totalCount +
|
||||
'}';
|
||||
}
|
||||
}
|
||||
|
||||
@ -29,15 +29,6 @@ public interface GroupMessageMapper extends BaseMapper<GroupMessage> {
|
||||
"WHERE rn = 1")
|
||||
List<GroupMessage> selectPrivateChatList(@Param("groupId") Integer groupId);
|
||||
|
||||
@Update("<script>" +
|
||||
"INSERT INTO group_message_read (message_id, user_id, group_id) VALUES " +
|
||||
"<foreach collection='list' item='item' separator=','>" +
|
||||
"(#{item.messageId}, #{item.userId}, #{item.groupId})" +
|
||||
"</foreach>" +
|
||||
" ON DUPLICATE KEY UPDATE message_id = message_id" +
|
||||
"</script>")
|
||||
void replaceBatch(List<GroupMessageRead> list);
|
||||
|
||||
@Select("SELECT group_id, interactive_type, user_type, COUNT(0) AS id \n" +
|
||||
"FROM group_message \n" +
|
||||
"WHERE create_time >= #{startTime} AND create_time < #{endTime} \n" +
|
||||
|
||||
@ -2,6 +2,9 @@ package com.upchina.group.mapper;
|
||||
|
||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||
import com.upchina.group.entity.GroupMessageRead;
|
||||
import org.apache.ibatis.annotations.Update;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
@ -13,4 +16,13 @@ import com.upchina.group.entity.GroupMessageRead;
|
||||
*/
|
||||
public interface GroupMessageReadMapper extends BaseMapper<GroupMessageRead> {
|
||||
|
||||
@Update("<script>" +
|
||||
"INSERT INTO group_message_read (message_id, user_id, group_id) VALUES " +
|
||||
"<foreach collection='list' item='item' separator=','>" +
|
||||
"(#{item.messageId}, #{item.userId}, #{item.groupId})" +
|
||||
"</foreach>" +
|
||||
" ON DUPLICATE KEY UPDATE message_id = message_id" +
|
||||
"</script>")
|
||||
void replaceBatch(List<GroupMessageRead> list);
|
||||
|
||||
}
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
package com.upchina.group.query;
|
||||
package com.upchina.group.query.info;
|
||||
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
package com.upchina.group.query;
|
||||
package com.upchina.group.query.info;
|
||||
|
||||
import com.upchina.common.query.PageQuery;
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
@ -1,4 +1,4 @@
|
||||
package com.upchina.group.query;
|
||||
package com.upchina.group.query.info;
|
||||
|
||||
import com.upchina.common.vo.BackendUserVO;
|
||||
import com.upchina.group.constant.GroupInfoStatus;
|
||||
@ -1,4 +1,4 @@
|
||||
package com.upchina.group.query;
|
||||
package com.upchina.group.query.info;
|
||||
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
package com.upchina.group.query;
|
||||
package com.upchina.group.query.info;
|
||||
|
||||
import com.upchina.common.vo.BackendUserVO;
|
||||
import com.upchina.group.entity.GroupInfo;
|
||||
@ -1,4 +1,4 @@
|
||||
package com.upchina.group.query;
|
||||
package com.upchina.group.query.info;
|
||||
|
||||
import com.upchina.common.vo.BackendUserVO;
|
||||
import com.upchina.group.constant.GroupInfoStatus;
|
||||
@ -0,0 +1,47 @@
|
||||
package com.upchina.group.query.message;
|
||||
|
||||
import io.swagger.annotations.ApiModelProperty;
|
||||
|
||||
import javax.validation.constraints.Max;
|
||||
import javax.validation.constraints.Min;
|
||||
import javax.validation.constraints.NotNull;
|
||||
|
||||
public class QueryUnreadCountAppQuery {
|
||||
|
||||
@ApiModelProperty("交易圈ID")
|
||||
@NotNull
|
||||
private Integer groupId;
|
||||
|
||||
@ApiModelProperty("查询类型:1全部;2投顾;3用户;4精选;5私聊")
|
||||
@NotNull
|
||||
@Min(1)
|
||||
@Max(5)
|
||||
private Integer type;
|
||||
|
||||
@ApiModelProperty("已读最后ID")
|
||||
private Integer lastId;
|
||||
|
||||
public Integer getGroupId() {
|
||||
return groupId;
|
||||
}
|
||||
|
||||
public void setGroupId(Integer groupId) {
|
||||
this.groupId = groupId;
|
||||
}
|
||||
|
||||
public Integer getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public void setType(Integer type) {
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
public Integer getLastId() {
|
||||
return lastId;
|
||||
}
|
||||
|
||||
public void setLastId(Integer lastId) {
|
||||
this.lastId = lastId;
|
||||
}
|
||||
}
|
||||
@ -19,7 +19,7 @@ public class GroupTask {
|
||||
private GroupCommonService groupCommonService;
|
||||
|
||||
/**
|
||||
* 拉取云端视频转码状态
|
||||
* 保存消息已读
|
||||
*/
|
||||
@Scheduled(cron = "${cron.saveGroupMessageRead}")
|
||||
public void saveGroupMessageRead() {
|
||||
|
||||
@ -30,6 +30,7 @@ import com.upchina.group.mapper.GroupCollectMapper;
|
||||
import com.upchina.group.mapper.GroupInfoMapper;
|
||||
import com.upchina.group.query.*;
|
||||
import com.upchina.group.vo.GroupCollectVO;
|
||||
import com.upchina.group.query.info.*;
|
||||
import com.upchina.group.vo.GroupVO;
|
||||
import com.upchina.rbac.entity.UserDept;
|
||||
import com.upchina.rbac.service.AuthService;
|
||||
@ -314,4 +315,5 @@ public class GroupInfoService {
|
||||
public void clearCache(Integer id) {
|
||||
groupCache.delete(CacheKey.GroupKey.GROUP_INFO + id);
|
||||
}
|
||||
|
||||
}
|
||||
@ -101,9 +101,11 @@ public class AdminGroupMessageService {
|
||||
groupMessageMapper.updateById(groupMessage);
|
||||
|
||||
if (GroupMessageStatus.DELETED.equals(targetStatus)) {
|
||||
groupMessageInDB.setStatus(GroupMessageStatus.DELETED.value);
|
||||
groupCacheService.removeMessage(groupMessageInDB);
|
||||
} else if (GroupMessageStatus.AUDITED.equals(targetStatus)) {
|
||||
if (IsOrNot.IS.value.equals(group.getFirstAudit())) {
|
||||
groupMessageInDB.setStatus(GroupMessageStatus.AUDITED.value);
|
||||
groupMessageService.publishMessage(groupMessageInDB);
|
||||
}
|
||||
}
|
||||
@ -147,6 +149,10 @@ public class AdminGroupMessageService {
|
||||
if (GroupMessageUserType.CUSTOMER.value.equals(vo.getUserType())) {
|
||||
boolean isBlack = commentBlackService.checkIsBlack(vo.getUserId(), vo.getGroupId(), ProductType.GROUP.value);
|
||||
vo.setIsForbidden(isBlack ? IsOrNot.IS.value : IsOrNot.NOT.value);
|
||||
} else if (GroupMessageUserType.ADVISOR.value.equals(vo.getUserType()) || GroupMessageUserType.ASSISTANT.value.equals(vo.getUserType())) {
|
||||
if (GroupInteractiveType.GROUP.value.equals(vo.getInteractiveType())) {
|
||||
groupCacheService.queryMessageReadCount(vo);
|
||||
}
|
||||
}
|
||||
return vo;
|
||||
}).collect(Collectors.toList());
|
||||
|
||||
@ -18,6 +18,7 @@ import com.upchina.group.constant.QueryGroupMessageType;
|
||||
import com.upchina.group.entity.GroupMessage;
|
||||
import com.upchina.group.mapper.GroupMessageMapper;
|
||||
import com.upchina.group.query.message.ListGroupMessageAppQuery;
|
||||
import com.upchina.group.query.message.QueryUnreadCountAppQuery;
|
||||
import com.upchina.group.query.message.ReadGroupMessageAppQuery;
|
||||
import com.upchina.group.query.message.SendGroupMessageAppQuery;
|
||||
import com.upchina.group.service.GroupInfoService;
|
||||
@ -133,4 +134,17 @@ public class AppGroupMessageService {
|
||||
GroupMessageReadVO vo = new GroupMessageReadVO(frontUser.getUserId(), query.getMessageIds());
|
||||
groupCacheService.readMessage(vo);
|
||||
}
|
||||
|
||||
public Integer queryUnreadCount(QueryUnreadCountAppQuery query, FrontUserVO frontUser) {
|
||||
Integer groupId = query.getGroupId();
|
||||
Integer lastId = query.getLastId();
|
||||
Integer type = query.getType();
|
||||
String userId = frontUser.getUserId();
|
||||
QueryGroupMessageType msgType = QueryGroupMessageType.fromValue(type);
|
||||
NavigableSet<Integer> sortedSet = groupCacheService.getMessageIdSet(groupId, userId, msgType);
|
||||
if (lastId != null) {
|
||||
sortedSet = sortedSet.tailSet(lastId, false);
|
||||
}
|
||||
return sortedSet.size();
|
||||
}
|
||||
}
|
||||
@ -13,15 +13,18 @@ import com.upchina.group.constant.GroupInteractiveType;
|
||||
import com.upchina.group.constant.GroupMessageUserType;
|
||||
import com.upchina.group.constant.QueryGroupMessageType;
|
||||
import com.upchina.group.entity.GroupMessage;
|
||||
import com.upchina.group.entity.GroupMessageRead;
|
||||
import com.upchina.group.entity.GroupUserFlow;
|
||||
import com.upchina.group.mapper.GroupInfoMapper;
|
||||
import com.upchina.group.mapper.GroupMessageMapper;
|
||||
import com.upchina.group.mapper.GroupMessageReadMapper;
|
||||
import com.upchina.group.mapper.GroupUserFlowMapper;
|
||||
import com.upchina.group.vo.message.GroupMessageReadVO;
|
||||
import com.upchina.group.vo.message.GroupMessageVO;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.time.LocalDate;
|
||||
import java.util.*;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
@ -36,7 +39,7 @@ public class GroupCacheService {
|
||||
private CacheService cacheService;
|
||||
|
||||
@Resource
|
||||
private GroupInfoMapper groupInfoMapper;
|
||||
private GroupMessageReadMapper groupMessageReadMapper;
|
||||
|
||||
@Resource
|
||||
private GroupMessageMapper groupMessageMapper;
|
||||
@ -164,4 +167,13 @@ public class GroupCacheService {
|
||||
hazelcastInstance.getList(CacheKey.GroupKey.TEMP_READ_LIST).add(vo);
|
||||
}
|
||||
|
||||
public void queryMessageReadCount(GroupMessageVO vo) {
|
||||
// 当日消息查询明细表
|
||||
if (vo.getCreateTime().isAfter(LocalDate.now().atStartOfDay())) {
|
||||
LambdaQueryWrapper<GroupMessageRead> wrapper = Wrappers.<GroupMessageRead>lambdaQuery()
|
||||
.eq(GroupMessageRead::getGroupId, vo.getGroupId())
|
||||
.eq(GroupMessageRead::getMessageId, vo.getId());
|
||||
vo.setReadCount(groupMessageReadMapper.selectCount(wrapper).intValue());
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -14,10 +14,7 @@ import com.upchina.common.vo.IdCountVO;
|
||||
import com.upchina.group.constant.GroupInteractiveType;
|
||||
import com.upchina.group.constant.GroupMessageUserType;
|
||||
import com.upchina.group.entity.*;
|
||||
import com.upchina.group.mapper.GroupCollectMapper;
|
||||
import com.upchina.group.mapper.GroupInfoMapper;
|
||||
import com.upchina.group.mapper.GroupMessageMapper;
|
||||
import com.upchina.group.mapper.GroupUserFlowMapper;
|
||||
import com.upchina.group.mapper.*;
|
||||
import com.upchina.group.vo.GroupVO;
|
||||
import com.upchina.group.vo.message.GroupMessageReadVO;
|
||||
import com.upchina.group.vo.message.GroupMessageVO;
|
||||
@ -51,7 +48,9 @@ public class GroupCommonService {
|
||||
|
||||
@Resource
|
||||
private GroupCollectMapper groupCollectMapper;
|
||||
private CollectTask collectTask;
|
||||
|
||||
@Resource
|
||||
private GroupMessageReadMapper groupMessageReadMapper;
|
||||
|
||||
public boolean validateUserPermission(String userId, GroupVO groupVO) {
|
||||
return true;
|
||||
@ -87,8 +86,14 @@ public class GroupCommonService {
|
||||
}).collect(Collectors.toList());
|
||||
}).filter(Objects::nonNull).flatMap(List::stream).collect(Collectors.toList());
|
||||
if (CollUtil.isNotEmpty(list)) {
|
||||
groupMessageMapper.replaceBatch(list);
|
||||
groupMessageReadMapper.replaceBatch(list);
|
||||
}
|
||||
|
||||
// 更新消息里的已读统计
|
||||
if (CollUtil.isNotEmpty(map)) {
|
||||
saveGroupMessageCollect(map.keySet());
|
||||
}
|
||||
|
||||
cacheList.clear();
|
||||
}
|
||||
|
||||
@ -152,7 +157,6 @@ public class GroupCommonService {
|
||||
if (yesterdayLatest != null && yesterdayLatest.getCreateTime().isBefore(today.atStartOfDay())) {
|
||||
collectGroupData(groupIds, yesterday);
|
||||
}
|
||||
|
||||
collectGroupData(groupIds, today);
|
||||
}
|
||||
|
||||
@ -216,7 +220,6 @@ public class GroupCommonService {
|
||||
}
|
||||
}
|
||||
return collect;
|
||||
|
||||
}).collect(Collectors.toList());
|
||||
if (CollUtil.isNotEmpty(collectList)) {
|
||||
groupCollectMapper.delete(Wrappers.<GroupCollect>lambdaQuery().eq(GroupCollect::getDate, date));
|
||||
@ -224,6 +227,20 @@ public class GroupCommonService {
|
||||
}
|
||||
}
|
||||
|
||||
private void saveGroupMessageCollect(Set<Integer> messageIds) {
|
||||
QueryWrapper<GroupMessageRead> wrapper = Wrappers.<GroupMessageRead>query()
|
||||
.select("message_id", "count(0) as group_id")
|
||||
.in("message_id", messageIds)
|
||||
.groupBy("message_id");
|
||||
List<GroupMessageRead> list = groupMessageReadMapper.selectList(wrapper);
|
||||
for (GroupMessageRead read : list) {
|
||||
GroupMessage message = new GroupMessage();
|
||||
message.setId(read.getMessageId());
|
||||
message.setReadCount(read.getGroupId());
|
||||
groupMessageMapper.updateById(message);
|
||||
}
|
||||
}
|
||||
|
||||
private Integer getTotalMembers(Integer groupId) {
|
||||
// TODO
|
||||
return 0;
|
||||
|
||||
@ -78,6 +78,12 @@ public class GroupMessageVO implements Serializable {
|
||||
@ApiModelProperty("是否被禁言 1是 2否")
|
||||
private Integer isForbidden;
|
||||
|
||||
@ApiModelProperty("已读数量")
|
||||
private Integer readCount;
|
||||
|
||||
@ApiModelProperty("总数量")
|
||||
private Integer totalCount;
|
||||
|
||||
public GroupMessageVO() {
|
||||
}
|
||||
|
||||
@ -102,6 +108,8 @@ public class GroupMessageVO implements Serializable {
|
||||
this.advisorId = message.getAdvisorId();
|
||||
this.isRecommend = message.getIsRecommend();
|
||||
this.advisor = advisor;
|
||||
this.readCount = message.getReadCount();
|
||||
this.totalCount = message.getTotalCount();
|
||||
}
|
||||
|
||||
public Integer getId() {
|
||||
@ -287,4 +295,20 @@ public class GroupMessageVO implements Serializable {
|
||||
public void setIsForbidden(Integer isForbidden) {
|
||||
this.isForbidden = isForbidden;
|
||||
}
|
||||
|
||||
public Integer getReadCount() {
|
||||
return readCount;
|
||||
}
|
||||
|
||||
public void setReadCount(Integer readCount) {
|
||||
this.readCount = readCount;
|
||||
}
|
||||
|
||||
public Integer getTotalCount() {
|
||||
return totalCount;
|
||||
}
|
||||
|
||||
public void setTotalCount(Integer totalCount) {
|
||||
this.totalCount = totalCount;
|
||||
}
|
||||
}
|
||||
@ -16,7 +16,7 @@ hazelcast:
|
||||
scheduledEnable: true
|
||||
cron:
|
||||
collectLivingVideo: "30 0/5 * * * ?" #每分钟统计已开始但未结束的视频直播数据
|
||||
saveVideoCount: "30 1/2 * * * ?" #从cache刷新视频播放量到DB 每分钟的第10s执行
|
||||
saveVideoCount: "30 1/5 * * * ?" #从cache刷新视频播放量到DB 每分钟的第10s执行
|
||||
saveVideoUserDataToDB: "30 2/5 * * * ?"
|
||||
saveCustomerDataToDB: "30 3/5 * * * ?" #收集用户信息
|
||||
refreshTranscodeStatus: "30 4/5 * * * ?" #从腾讯云拉取录播上传视频信息更新到DB
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user