统计接口完善
This commit is contained in:
parent
bb7c854203
commit
2e9fc9025a
@ -21,7 +21,7 @@ import org.springframework.web.bind.annotation.RestController;
|
||||
import javax.annotation.Resource;
|
||||
import java.util.List;
|
||||
|
||||
@Api(tags = "交易圈admin接口")
|
||||
@Api(tags = "交易圈admin统计接口")
|
||||
@RestController
|
||||
public class AdminGroupCollectController {
|
||||
|
||||
@ -44,7 +44,7 @@ public class AdminGroupCollectController {
|
||||
return CommonResult.success(vo);
|
||||
}
|
||||
|
||||
@ApiOperation("后台查询学院列表")
|
||||
@ApiOperation("后台查询学员列表")
|
||||
@PostMapping("/admin/group/college/listCustomer")
|
||||
public CommonResult<Pager<GroupCustomerVO>> listCustomer(@Validated @RequestBody @ApiParam(required = true) ListGroupCustomerQuery query,
|
||||
@RequestAttribute(value = "backendUser", required = false) BackendUserVO backendUserVO) {
|
||||
|
||||
@ -21,7 +21,7 @@ import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
|
||||
@Api(tags = "交易圈admin接口")
|
||||
@Api(tags = "交易圈admin信息接口")
|
||||
@RestController
|
||||
public class AdminGroupInfoController {
|
||||
|
||||
|
||||
@ -5,7 +5,7 @@ import com.syzb.common.result.AppPager;
|
||||
import com.syzb.common.result.CommonResult;
|
||||
import com.syzb.common.vo.FrontUserVO;
|
||||
import com.syzb.group.query.info.ListGroupAppQuery;
|
||||
import com.syzb.group.service.GroupInfoService;
|
||||
import com.syzb.group.service.app.AppGroupInfoService;
|
||||
import com.syzb.group.vo.GroupVO;
|
||||
import io.swagger.annotations.Api;
|
||||
import io.swagger.annotations.ApiOperation;
|
||||
@ -23,20 +23,20 @@ import javax.annotation.Resource;
|
||||
public class AppGroupInfoController {
|
||||
|
||||
@Resource
|
||||
private GroupInfoService groupInfoService;
|
||||
private AppGroupInfoService appGroupInfoService;
|
||||
|
||||
@ApiOperation("app查询交易圈详情")
|
||||
@PostMapping("/app/group/info/get")
|
||||
public CommonResult<GroupVO> get(@Validated @RequestBody @ApiParam(required = true) OnlyIdQuery query,
|
||||
@RequestAttribute(value = "frontUser", required = false) FrontUserVO frontUserVO) {
|
||||
GroupVO vo = groupInfoService.getForApp(query, frontUserVO);
|
||||
GroupVO vo = appGroupInfoService.getForApp(query, frontUserVO);
|
||||
return CommonResult.success(vo);
|
||||
}
|
||||
|
||||
@ApiOperation("app首页查询交易圈列表")
|
||||
@PostMapping("/app/group/info/list")
|
||||
public CommonResult<AppPager<GroupVO>> list(@Validated @RequestBody @ApiParam(required = true) ListGroupAppQuery query) {
|
||||
AppPager<GroupVO> page = groupInfoService.listForApp(query);
|
||||
AppPager<GroupVO> page = appGroupInfoService.listForApp(query);
|
||||
return CommonResult.success(page);
|
||||
}
|
||||
}
|
||||
@ -12,7 +12,7 @@ public class ListGroupCustomerQuery extends PageQuery {
|
||||
private String userId;
|
||||
|
||||
@ApiModelProperty("昵称")
|
||||
private Integer nickName;
|
||||
private String nickName;
|
||||
|
||||
@ApiModelProperty("在线状态 1:在线 2:不在线")
|
||||
private Integer isOnline;
|
||||
@ -39,11 +39,11 @@ public class ListGroupCustomerQuery extends PageQuery {
|
||||
this.userId = userId;
|
||||
}
|
||||
|
||||
public Integer getNickName() {
|
||||
public String getNickName() {
|
||||
return nickName;
|
||||
}
|
||||
|
||||
public void setNickName(Integer nickName) {
|
||||
public void setNickName(String nickName) {
|
||||
this.nickName = nickName;
|
||||
}
|
||||
|
||||
|
||||
@ -2,6 +2,9 @@ package com.syzb.group.schedule;
|
||||
|
||||
import com.syzb.common.config.cache.CacheKey;
|
||||
import com.syzb.common.service.CacheService;
|
||||
import com.syzb.group.mapper.GroupMessageMapper;
|
||||
import com.syzb.group.service.admin.AdminGroupCollectService;
|
||||
import com.syzb.group.service.admin.AdminGroupMessageService;
|
||||
import com.syzb.group.service.common.GroupCommonService;
|
||||
import org.springframework.scheduling.annotation.Scheduled;
|
||||
import org.springframework.stereotype.Component;
|
||||
@ -18,6 +21,12 @@ public class GroupTask {
|
||||
@Resource
|
||||
private GroupCommonService groupCommonService;
|
||||
|
||||
@Resource
|
||||
private AdminGroupCollectService adminGroupCollectService;
|
||||
|
||||
@Resource
|
||||
private AdminGroupMessageService adminGroupMessageService;
|
||||
|
||||
/**
|
||||
* 保存消息已读
|
||||
*/
|
||||
@ -26,7 +35,7 @@ public class GroupTask {
|
||||
cacheService.lock(CacheKey.LockKey.SAVE_MESSAGE_READ,
|
||||
0, TimeUnit.SECONDS,
|
||||
4, TimeUnit.MINUTES,
|
||||
groupCommonService::saveGroupMessageRead
|
||||
adminGroupMessageService::saveGroupMessageRead
|
||||
);
|
||||
}
|
||||
|
||||
@ -44,7 +53,7 @@ public class GroupTask {
|
||||
cacheService.lock(CacheKey.LockKey.COLLECT_GROUP_DATA,
|
||||
0, TimeUnit.SECONDS,
|
||||
4, TimeUnit.MINUTES,
|
||||
() -> groupCommonService.collectGroupData()
|
||||
() -> adminGroupCollectService.collectGroupData()
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@ -3,6 +3,7 @@ package com.syzb.group.service.admin;
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import com.hazelcast.map.IMap;
|
||||
import com.syzb.business.entity.ModuleUser;
|
||||
@ -14,9 +15,17 @@ import com.syzb.common.query.OnlyIdQuery;
|
||||
import com.syzb.common.result.Pager;
|
||||
import com.syzb.common.service.CommentBlackService;
|
||||
import com.syzb.common.vo.BackendUserVO;
|
||||
import com.syzb.common.vo.IdCountVO;
|
||||
import com.syzb.group.constant.GroupCustomerStatus;
|
||||
import com.syzb.group.constant.GroupInteractiveType;
|
||||
import com.syzb.group.constant.GroupMessageUserType;
|
||||
import com.syzb.group.entity.GroupCollect;
|
||||
import com.syzb.group.entity.GroupInfo;
|
||||
import com.syzb.group.entity.GroupMessage;
|
||||
import com.syzb.group.mapper.GroupCollectMapper;
|
||||
import com.syzb.group.mapper.GroupInfoMapper;
|
||||
import com.syzb.group.mapper.GroupMessageMapper;
|
||||
import com.syzb.group.mapper.GroupUserFlowMapper;
|
||||
import com.syzb.group.query.ListGroupCustomerQuery;
|
||||
import com.syzb.group.query.QueryGroupCollectQuery;
|
||||
import com.syzb.group.service.common.GroupCacheService;
|
||||
@ -25,7 +34,6 @@ import com.syzb.group.vo.GroupCollectVO;
|
||||
import com.syzb.group.vo.GroupCustomerVO;
|
||||
import com.syzb.rbac.entity.WxUser;
|
||||
import com.syzb.rbac.mapper.WxUserMapper;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
@ -58,9 +66,111 @@ public class AdminGroupCollectService {
|
||||
|
||||
@Resource
|
||||
private CommentBlackService commentBlackService;
|
||||
@Autowired
|
||||
|
||||
@Resource
|
||||
private GroupCacheService groupCacheService;
|
||||
|
||||
@Resource
|
||||
private GroupUserFlowMapper groupUserFlowMapper;
|
||||
|
||||
@Resource
|
||||
private GroupInfoMapper groupInfoMapper;
|
||||
|
||||
@Resource
|
||||
private GroupMessageMapper groupMessageMapper;
|
||||
|
||||
public void collectGroupData() {
|
||||
LocalDate today = LocalDate.now();
|
||||
LocalDate yesterday = today.minusDays(1);
|
||||
LambdaQueryWrapper<GroupInfo> groupWrapper = Wrappers.<GroupInfo>lambdaQuery()
|
||||
.select(GroupInfo::getId);
|
||||
List<GroupInfo> groups = groupInfoMapper.selectList(groupWrapper);
|
||||
if (CollUtil.isEmpty(groups)) {
|
||||
return;
|
||||
}
|
||||
List<Integer> groupIds = groups.stream().map(GroupInfo::getId).collect(Collectors.toList());
|
||||
// 获取昨日数据
|
||||
// 如果昨天数据还是昨天统计的,那需要重新计算;否则不需计算
|
||||
QueryWrapper<GroupCollect> collectWrapper = Wrappers.<GroupCollect>query()
|
||||
.select("max(create_time) as create_time")
|
||||
.eq("date", yesterday);
|
||||
GroupCollect yesterdayLatest = groupCollectMapper.selectOne(collectWrapper);
|
||||
if (yesterdayLatest != null && yesterdayLatest.getCreateTime().isBefore(today.atStartOfDay())) {
|
||||
collectGroupData(groupIds, yesterday);
|
||||
}
|
||||
collectGroupData(groupIds, today);
|
||||
}
|
||||
|
||||
public void collectGroupData(List<Integer> groupIds, LocalDate date) {
|
||||
LocalDateTime startTime = date.atStartOfDay();
|
||||
LocalDateTime endTime = date.plusDays(1).atStartOfDay();
|
||||
List<IdCountVO> visitMemberList = groupUserFlowMapper.selectGroupUserCount(startTime, endTime);
|
||||
Map<Integer, Integer> visitMemberMap = visitMemberList.stream().collect(Collectors.toMap(IdCountVO::getId, IdCountVO::getCount));
|
||||
|
||||
List<GroupMessage> messageMemberCollect = groupMessageMapper.collectMessageMember(startTime, endTime);
|
||||
Map<Integer, List<GroupMessage>> groupMessageMemberMap = messageMemberCollect.stream().collect(Collectors.groupingBy(GroupMessage::getGroupId));
|
||||
|
||||
List<GroupMessage> messageCollect = groupMessageMapper.collectMessage(startTime, endTime);
|
||||
Map<Integer, List<GroupMessage>> groupMessageMap = messageCollect.stream().collect(Collectors.groupingBy(GroupMessage::getGroupId));
|
||||
|
||||
LocalDateTime now = LocalDateTime.now();
|
||||
|
||||
List<GroupCollect> collectList = groupIds.stream().map(groupId -> {
|
||||
GroupCollect collect = new GroupCollect();
|
||||
collect.setGroupId(groupId);
|
||||
collect.setDate(date);
|
||||
collect.setTotalMembers(groupCommonService.getModuleMemberCount(groupId, false));
|
||||
collect.setVisitedMembers(visitMemberMap.getOrDefault(groupId, 0));
|
||||
collect.setNewMembers(groupCommonService.getModuleMemberCount(groupId, true));
|
||||
collect.setInteractionMembers(0);
|
||||
collect.setPrivateChatMembers(0);
|
||||
List<GroupMessage> messageMemberList = groupMessageMemberMap.get(groupId);
|
||||
if (CollUtil.isNotEmpty(messageMemberList)) {
|
||||
for (GroupMessage groupMessage : messageMemberList) {
|
||||
if (GroupInteractiveType.GROUP.value.equals(groupMessage.getInteractiveType())) {
|
||||
collect.setInteractionMembers(groupMessage.getId());
|
||||
} else if (GroupInteractiveType.PRIVATE.value.equals(groupMessage.getInteractiveType())) {
|
||||
collect.setPrivateChatMembers(groupMessage.getId());
|
||||
}
|
||||
}
|
||||
}
|
||||
collect.setAdvisorGroupContent(0);
|
||||
collect.setAssistantGroupContent(0);
|
||||
collect.setCustomerGroupContent(0);
|
||||
collect.setAdvisorPrivateContent(0);
|
||||
collect.setAssistantPrivateContent(0);
|
||||
collect.setCustomerPrivateContent(0);
|
||||
List<GroupMessage> messageList = groupMessageMap.get(groupId);
|
||||
if (CollUtil.isNotEmpty(messageList)) {
|
||||
for (GroupMessage groupMessage : messageList) {
|
||||
if (GroupInteractiveType.GROUP.value.equals(groupMessage.getInteractiveType())) {
|
||||
if (GroupMessageUserType.ADVISOR.value.equals(groupMessage.getUserType())) {
|
||||
collect.setAdvisorGroupContent(groupMessage.getId());
|
||||
} else if (GroupMessageUserType.ASSISTANT.value.equals(groupMessage.getUserType())) {
|
||||
collect.setAssistantGroupContent(groupMessage.getId());
|
||||
} else if (GroupMessageUserType.CUSTOMER.value.equals(groupMessage.getUserType())) {
|
||||
collect.setCustomerGroupContent(groupMessage.getId());
|
||||
}
|
||||
} else if (GroupInteractiveType.PRIVATE.value.equals(groupMessage.getInteractiveType())) {
|
||||
if (GroupMessageUserType.ADVISOR.value.equals(groupMessage.getUserType())) {
|
||||
collect.setAdvisorPrivateContent(groupMessage.getId());
|
||||
} else if (GroupMessageUserType.ASSISTANT.value.equals(groupMessage.getUserType())) {
|
||||
collect.setAssistantPrivateContent(groupMessage.getId());
|
||||
} else if (GroupMessageUserType.CUSTOMER.value.equals(groupMessage.getUserType())) {
|
||||
collect.setCustomerPrivateContent(groupMessage.getId());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
collect.setCreateTime(now);
|
||||
return collect;
|
||||
}).collect(Collectors.toList());
|
||||
if (CollUtil.isNotEmpty(collectList)) {
|
||||
groupCollectMapper.delete(Wrappers.<GroupCollect>lambdaQuery().eq(GroupCollect::getDate, date));
|
||||
groupCollectMapper.insertBatchSomeColumn(collectList);
|
||||
}
|
||||
}
|
||||
|
||||
public List<GroupCollectVO> queryCollect(QueryGroupCollectQuery query, BackendUserVO backendUserVO) {
|
||||
Integer groupId = query.getGroupId();
|
||||
LocalDate startDate = query.getStartDate();
|
||||
@ -89,7 +199,7 @@ public class AdminGroupCollectService {
|
||||
public Pager<GroupCustomerVO> listCustomer(ListGroupCustomerQuery query, BackendUserVO backendUserVO) {
|
||||
Integer groupId = query.getGroupId();
|
||||
String userId = query.getUserId();
|
||||
Integer nickName = query.getNickName();
|
||||
String nickName = query.getNickName();
|
||||
Integer isOnline = query.getIsOnline();
|
||||
Integer customerStatus = query.getCustomerStatus();
|
||||
Integer commentBlackStatus = query.getCommentBlackStatus();
|
||||
@ -106,9 +216,6 @@ public class AdminGroupCollectService {
|
||||
Set<String> userIdSet = moduleUserList.stream().map(ModuleUser::getUserId).collect(Collectors.toSet());
|
||||
List<WxUser> wxUserList = wxUserMapper.selectList(Wrappers.<WxUser>lambdaQuery()
|
||||
.in(WxUser::getId, userIdSet));
|
||||
if (CollUtil.isEmpty(wxUserList)) {
|
||||
return Pager.emptyPager();
|
||||
}
|
||||
Map<String, WxUser> wxUserMap = wxUserList.stream().collect(Collectors.toMap(WxUser::getId, Function.identity()));
|
||||
Set<String> blackUserIds = commentBlackService.getBlackUserIds(groupId, ProductType.GROUP.value);
|
||||
Set<String> onlineUserIds = groupCacheService.getOnlineUserIds(groupId);
|
||||
@ -119,7 +226,10 @@ public class AdminGroupCollectService {
|
||||
List<GroupCustomerVO> list = stream.map(moduleUser -> {
|
||||
GroupCustomerVO vo = new GroupCustomerVO(moduleUser);
|
||||
WxUser wxUser = wxUserMap.get(moduleUser.getUserId());
|
||||
vo.setNickName(wxUser == null ? null : wxUser.getNickName());
|
||||
if (wxUser != null) {
|
||||
vo.setNickName(wxUser.getNickName());
|
||||
vo.setHeadPicUrl(wxUser.getImgUrl());
|
||||
}
|
||||
vo.setIsOnline(onlineUserIds.contains(moduleUser.getUserId()) ? IsOrNot.IS.value : IsOrNot.NOT.value);
|
||||
vo.setCommentBlackStatus(blackUserIds.contains(moduleUser.getUserId()) ? IsOrNot.IS.value : IsOrNot.NOT.value);
|
||||
vo.setCustomerStatus(calCustomerStatus(moduleUser).value);
|
||||
@ -139,7 +249,7 @@ public class AdminGroupCollectService {
|
||||
voStream = voStream.filter(vo -> commentBlackStatus.equals(vo.getCommentBlackStatus()));
|
||||
}
|
||||
List<GroupCustomerVO> voList = voStream.collect(Collectors.toList());
|
||||
List<GroupCustomerVO> pageList = CollUtil.page(query.getCurrent(), query.getSize(), voList);
|
||||
List<GroupCustomerVO> pageList = CollUtil.page(query.getCurrent() - 1, query.getSize(), voList);
|
||||
return new Pager<>(pageList, voList.size());
|
||||
}
|
||||
|
||||
|
||||
@ -1,9 +1,12 @@
|
||||
package com.syzb.group.service.admin;
|
||||
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
||||
import com.hazelcast.core.HazelcastInstance;
|
||||
import com.hazelcast.map.IMap;
|
||||
import com.syzb.advisor.service.AdvisorInfoService;
|
||||
import com.syzb.advisor.vo.AdvisorBasicVO;
|
||||
@ -21,19 +24,21 @@ import com.syzb.common.vo.OnlyIdVO;
|
||||
import com.syzb.group.constant.*;
|
||||
import com.syzb.group.entity.GroupInfo;
|
||||
import com.syzb.group.entity.GroupMessage;
|
||||
import com.syzb.group.entity.GroupMessageRead;
|
||||
import com.syzb.group.mapper.GroupInfoMapper;
|
||||
import com.syzb.group.mapper.GroupMessageMapper;
|
||||
import com.syzb.group.mapper.GroupMessageReadMapper;
|
||||
import com.syzb.group.query.message.*;
|
||||
import com.syzb.group.service.common.GroupCacheService;
|
||||
import com.syzb.group.service.common.GroupMessageService;
|
||||
import com.syzb.group.vo.message.GroupMessageReadVO;
|
||||
import com.syzb.group.vo.message.GroupMessageVO;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Service
|
||||
@ -66,6 +71,12 @@ public class AdminGroupMessageService {
|
||||
@Resource
|
||||
private IMap<String, Object> groupCache;
|
||||
|
||||
@Resource
|
||||
private HazelcastInstance hazelcastInstance;
|
||||
|
||||
@Resource
|
||||
private GroupMessageReadMapper groupMessageReadMapper;
|
||||
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public OnlyIdVO sendAdvisorMessage(SendGroupMessageAdminQuery query, BackendUserVO backendUser) {
|
||||
GroupInfo group = groupInfoMapper.selectById(query.getGroupId());
|
||||
@ -287,6 +298,65 @@ public class AdminGroupMessageService {
|
||||
adminGroupInfoService.clearCache(groupId);
|
||||
}
|
||||
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void saveGroupMessageRead() {
|
||||
List<GroupMessageReadVO> cacheList = hazelcastInstance.getList(CacheKey.GroupKey.TEMP_READ_LIST);
|
||||
// 合并重复项
|
||||
Map<Integer, Set<String>> map = new HashMap<>(cacheList.size());
|
||||
for (GroupMessageReadVO read : cacheList) {
|
||||
if (read != null) {
|
||||
read.getMessageIds().forEach(m ->
|
||||
map.computeIfAbsent(m, k -> new HashSet<>()).add(read.getUserId()));
|
||||
}
|
||||
}
|
||||
|
||||
LocalDateTime now = LocalDateTime.now();
|
||||
|
||||
List<GroupMessageRead> list = map.entrySet().stream()
|
||||
.map(entry -> {
|
||||
Integer messageId = entry.getKey();
|
||||
GroupMessageVO message = groupCacheService.getMessage(messageId, null);
|
||||
if (message == null
|
||||
|| !GroupInteractiveType.GROUP.value.equals(message.getInteractiveType())
|
||||
|| (!GroupMessageUserType.ADVISOR.value.equals(message.getUserType()) &&
|
||||
!GroupMessageUserType.ASSISTANT.value.equals(message.getUserType()))) {
|
||||
return null;
|
||||
}
|
||||
return entry.getValue().stream().map(userId -> {
|
||||
GroupMessageRead read = new GroupMessageRead();
|
||||
read.setMessageId(messageId);
|
||||
read.setUserId(userId);
|
||||
read.setGroupId(message.getGroupId());
|
||||
read.setCreateTime(now);
|
||||
return read;
|
||||
}).collect(Collectors.toList());
|
||||
}).filter(Objects::nonNull).flatMap(List::stream).collect(Collectors.toList());
|
||||
if (CollUtil.isNotEmpty(list)) {
|
||||
groupMessageReadMapper.replaceBatch(list);
|
||||
}
|
||||
|
||||
// 更新消息里的已读统计
|
||||
if (CollUtil.isNotEmpty(map)) {
|
||||
saveGroupMessageCollect(map.keySet());
|
||||
}
|
||||
|
||||
cacheList.clear();
|
||||
}
|
||||
|
||||
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 void clearCache(Integer messageId) {
|
||||
groupCache.remove(CacheKey.GroupKey.GROUP_MESSAGE_DETAIL + messageId);
|
||||
}
|
||||
|
||||
@ -33,75 +33,18 @@ import java.util.stream.Collectors;
|
||||
@Service
|
||||
public class GroupCommonService {
|
||||
|
||||
@Resource
|
||||
private HazelcastInstance hazelcastInstance;
|
||||
|
||||
@Resource
|
||||
private GroupCacheService groupCacheService;
|
||||
|
||||
@Resource
|
||||
private GroupMessageMapper groupMessageMapper;
|
||||
|
||||
@Resource
|
||||
private GroupInfoMapper groupInfoMapper;
|
||||
|
||||
@Resource
|
||||
private GroupUserFlowMapper groupUserFlowMapper;
|
||||
|
||||
@Resource
|
||||
private GroupCollectMapper groupCollectMapper;
|
||||
|
||||
@Resource
|
||||
private GroupMessageReadMapper groupMessageReadMapper;
|
||||
|
||||
@Resource
|
||||
private ModuleUserMapper moduleUserMapper;
|
||||
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void saveGroupMessageRead() {
|
||||
List<GroupMessageReadVO> cacheList = hazelcastInstance.getList(CacheKey.GroupKey.TEMP_READ_LIST);
|
||||
// 合并重复项
|
||||
Map<Integer, Set<String>> map = new HashMap<>(cacheList.size());
|
||||
for (GroupMessageReadVO read : cacheList) {
|
||||
if (read != null) {
|
||||
read.getMessageIds().forEach(m ->
|
||||
map.computeIfAbsent(m, k -> new HashSet<>()).add(read.getUserId()));
|
||||
}
|
||||
}
|
||||
|
||||
LocalDateTime now = LocalDateTime.now();
|
||||
|
||||
List<GroupMessageRead> list = map.entrySet().stream()
|
||||
.map(entry -> {
|
||||
Integer messageId = entry.getKey();
|
||||
GroupMessageVO message = groupCacheService.getMessage(messageId, null);
|
||||
if (message == null
|
||||
|| !GroupInteractiveType.GROUP.value.equals(message.getInteractiveType())
|
||||
|| (!GroupMessageUserType.ADVISOR.value.equals(message.getUserType()) &&
|
||||
!GroupMessageUserType.ASSISTANT.value.equals(message.getUserType()))) {
|
||||
return null;
|
||||
}
|
||||
return entry.getValue().stream().map(userId -> {
|
||||
GroupMessageRead read = new GroupMessageRead();
|
||||
read.setMessageId(messageId);
|
||||
read.setUserId(userId);
|
||||
read.setGroupId(message.getGroupId());
|
||||
read.setCreateTime(now);
|
||||
return read;
|
||||
}).collect(Collectors.toList());
|
||||
}).filter(Objects::nonNull).flatMap(List::stream).collect(Collectors.toList());
|
||||
if (CollUtil.isNotEmpty(list)) {
|
||||
groupMessageReadMapper.replaceBatch(list);
|
||||
}
|
||||
|
||||
// 更新消息里的已读统计
|
||||
if (CollUtil.isNotEmpty(map)) {
|
||||
saveGroupMessageCollect(map.keySet());
|
||||
}
|
||||
|
||||
cacheList.clear();
|
||||
}
|
||||
|
||||
/**
|
||||
* 写入视频用户数据
|
||||
*/
|
||||
@ -135,112 +78,6 @@ public class GroupCommonService {
|
||||
}
|
||||
}
|
||||
|
||||
public void collectGroupData() {
|
||||
LocalDate today = LocalDate.now();
|
||||
LocalDate yesterday = today.minusDays(1);
|
||||
LambdaQueryWrapper<GroupInfo> groupWrapper = Wrappers.<GroupInfo>lambdaQuery()
|
||||
.select(GroupInfo::getId);
|
||||
List<GroupInfo> groups = groupInfoMapper.selectList(groupWrapper);
|
||||
if (CollUtil.isEmpty(groups)) {
|
||||
return;
|
||||
}
|
||||
List<Integer> groupIds = groups.stream().map(GroupInfo::getId).collect(Collectors.toList());
|
||||
// 获取昨日数据
|
||||
// 如果昨天数据还是昨天统计的,那需要重新计算;否则不需计算
|
||||
QueryWrapper<GroupCollect> collectWrapper = Wrappers.<GroupCollect>query()
|
||||
.select("max(create_time) as create_time")
|
||||
.eq("date", yesterday);
|
||||
GroupCollect yesterdayLatest = groupCollectMapper.selectOne(collectWrapper);
|
||||
if (yesterdayLatest != null && yesterdayLatest.getCreateTime().isBefore(today.atStartOfDay())) {
|
||||
collectGroupData(groupIds, yesterday);
|
||||
}
|
||||
collectGroupData(groupIds, today);
|
||||
}
|
||||
|
||||
public void collectGroupData(List<Integer> groupIds, LocalDate date) {
|
||||
LocalDateTime startTime = date.atStartOfDay();
|
||||
LocalDateTime endTime = date.plusDays(1).atStartOfDay();
|
||||
List<IdCountVO> visitMemberList = groupUserFlowMapper.selectGroupUserCount(startTime, endTime);
|
||||
Map<Integer, Integer> visitMemberMap = visitMemberList.stream().collect(Collectors.toMap(IdCountVO::getId, IdCountVO::getCount));
|
||||
|
||||
List<GroupMessage> messageMemberCollect = groupMessageMapper.collectMessageMember(startTime, endTime);
|
||||
Map<Integer, List<GroupMessage>> groupMessageMemberMap = messageMemberCollect.stream().collect(Collectors.groupingBy(GroupMessage::getGroupId));
|
||||
|
||||
List<GroupMessage> messageCollect = groupMessageMapper.collectMessage(startTime, endTime);
|
||||
Map<Integer, List<GroupMessage>> groupMessageMap = messageCollect.stream().collect(Collectors.groupingBy(GroupMessage::getGroupId));
|
||||
|
||||
LocalDateTime now = LocalDateTime.now();
|
||||
|
||||
List<GroupCollect> collectList = groupIds.stream().map(groupId -> {
|
||||
GroupCollect collect = new GroupCollect();
|
||||
collect.setGroupId(groupId);
|
||||
collect.setDate(date);
|
||||
collect.setTotalMembers(getModuleMemberCount(groupId, false));
|
||||
collect.setVisitedMembers(visitMemberMap.getOrDefault(groupId, 0));
|
||||
collect.setNewMembers(getModuleMemberCount(groupId, true));
|
||||
collect.setInteractionMembers(0);
|
||||
collect.setPrivateChatMembers(0);
|
||||
List<GroupMessage> messageMemberList = groupMessageMemberMap.get(groupId);
|
||||
if (CollUtil.isNotEmpty(messageMemberList)) {
|
||||
for (GroupMessage groupMessage : messageMemberList) {
|
||||
if (GroupInteractiveType.GROUP.value.equals(groupMessage.getInteractiveType())) {
|
||||
collect.setInteractionMembers(groupMessage.getId());
|
||||
} else if (GroupInteractiveType.PRIVATE.value.equals(groupMessage.getInteractiveType())) {
|
||||
collect.setPrivateChatMembers(groupMessage.getId());
|
||||
}
|
||||
}
|
||||
}
|
||||
collect.setAdvisorGroupContent(0);
|
||||
collect.setAssistantGroupContent(0);
|
||||
collect.setCustomerGroupContent(0);
|
||||
collect.setAdvisorPrivateContent(0);
|
||||
collect.setAssistantPrivateContent(0);
|
||||
collect.setCustomerPrivateContent(0);
|
||||
List<GroupMessage> messageList = groupMessageMap.get(groupId);
|
||||
if (CollUtil.isNotEmpty(messageList)) {
|
||||
for (GroupMessage groupMessage : messageList) {
|
||||
if (GroupInteractiveType.GROUP.value.equals(groupMessage.getInteractiveType())) {
|
||||
if (GroupMessageUserType.ADVISOR.value.equals(groupMessage.getUserType())) {
|
||||
collect.setAdvisorGroupContent(groupMessage.getId());
|
||||
} else if (GroupMessageUserType.ASSISTANT.value.equals(groupMessage.getUserType())) {
|
||||
collect.setAssistantGroupContent(groupMessage.getId());
|
||||
} else if (GroupMessageUserType.CUSTOMER.value.equals(groupMessage.getUserType())) {
|
||||
collect.setCustomerGroupContent(groupMessage.getId());
|
||||
}
|
||||
} else if (GroupInteractiveType.PRIVATE.value.equals(groupMessage.getInteractiveType())) {
|
||||
if (GroupMessageUserType.ADVISOR.value.equals(groupMessage.getUserType())) {
|
||||
collect.setAdvisorPrivateContent(groupMessage.getId());
|
||||
} else if (GroupMessageUserType.ASSISTANT.value.equals(groupMessage.getUserType())) {
|
||||
collect.setAssistantPrivateContent(groupMessage.getId());
|
||||
} else if (GroupMessageUserType.CUSTOMER.value.equals(groupMessage.getUserType())) {
|
||||
collect.setCustomerPrivateContent(groupMessage.getId());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
collect.setCreateTime(now);
|
||||
return collect;
|
||||
}).collect(Collectors.toList());
|
||||
if (CollUtil.isNotEmpty(collectList)) {
|
||||
groupCollectMapper.delete(Wrappers.<GroupCollect>lambdaQuery().eq(GroupCollect::getDate, date));
|
||||
groupCollectMapper.insertBatchSomeColumn(collectList);
|
||||
}
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
public Set<Integer> getModuleIds(Integer groupId) {
|
||||
Set<Integer> moduleIdSet = new HashSet<>();
|
||||
LambdaQueryWrapper<GroupInfo> wrapper = Wrappers.<GroupInfo>lambdaQuery()
|
||||
@ -261,7 +98,7 @@ public class GroupCommonService {
|
||||
return moduleIdSet;
|
||||
}
|
||||
|
||||
private Integer getModuleMemberCount(Integer groupId, boolean isNew) {
|
||||
public Integer getModuleMemberCount(Integer groupId, boolean isNew) {
|
||||
Set<Integer> moduleIds = getModuleIds(groupId);
|
||||
if (CollUtil.isEmpty(moduleIds)) {
|
||||
return 0;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user