diff --git a/src/main/java/com/syzb/business/entity/ModuleUser.java b/src/main/java/com/syzb/business/entity/ModuleUser.java index f3f6d22..ccdc64b 100644 --- a/src/main/java/com/syzb/business/entity/ModuleUser.java +++ b/src/main/java/com/syzb/business/entity/ModuleUser.java @@ -12,7 +12,7 @@ public class ModuleUser implements Serializable { private Integer id; @TableField("user_id") - private Integer userId; + private String userId; @TableField("module_id") private Integer moduleId; @@ -40,11 +40,11 @@ public class ModuleUser implements Serializable { this.id = id; } - public Integer getUserId() { + public String getUserId() { return userId; } - public void setUserId(Integer userId) { + public void setUserId(String userId) { this.userId = userId; } diff --git a/src/main/java/com/syzb/business/service/BusinessDataService.java b/src/main/java/com/syzb/business/service/BusinessDataService.java index dbe2409..3b79f3e 100644 --- a/src/main/java/com/syzb/business/service/BusinessDataService.java +++ b/src/main/java/com/syzb/business/service/BusinessDataService.java @@ -5,7 +5,6 @@ import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.LocalDateTimeUtil; 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.syzb.business.entity.AppOrder; @@ -15,9 +14,6 @@ import com.syzb.business.mapper.ModuleUserMapper; import com.syzb.business.vo.BusinessModuleUserVO; import com.syzb.business.vo.BusinessOrderVO; import com.syzb.common.constant.IsOrNot; -import com.syzb.common.util.logger.LoggerUtil; -import com.syzb.group.entity.GroupInfo; -import com.syzb.group.mapper.GroupInfoMapper; import com.syzb.group.service.common.GroupCommonService; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -25,7 +21,10 @@ import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.math.BigDecimal; import java.time.LocalDateTime; -import java.util.*; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import java.util.Set; import java.util.stream.Collectors; @Service @@ -151,7 +150,7 @@ public class BusinessDataService { private ModuleUser convertModuleUser(BusinessModuleUserVO moduleUserVO, boolean isNew) { ModuleUser moduleUser = new ModuleUser(); moduleUser.setId(moduleUserVO.getId()); - moduleUser.setUserId(moduleUserVO.getUserId()); + moduleUser.setUserId(String.valueOf(moduleUserVO.getUserId())); moduleUser.setModuleId(moduleUserVO.getModuleId()); moduleUser.setEndTime(LocalDateTimeUtil.parse(moduleUserVO.getEndTime(), DatePattern.NORM_DATETIME_FORMATTER)); moduleUser.setCreateTime(LocalDateTimeUtil.parse(moduleUserVO.getCreateTime(), DatePattern.NORM_DATETIME_FORMATTER)); diff --git a/src/main/java/com/syzb/common/service/CommentBlackService.java b/src/main/java/com/syzb/common/service/CommentBlackService.java index 5b43567..34f31dd 100644 --- a/src/main/java/com/syzb/common/service/CommentBlackService.java +++ b/src/main/java/com/syzb/common/service/CommentBlackService.java @@ -202,13 +202,6 @@ public class CommentBlackService { return new Pager<>(voList, page.getTotal()); } - private void clearCache(String... cacheKeys) { - IMap cacheMap = hazelcastInstance.getMap(COMMENT_BLACK); - for (String key : cacheKeys) { - cacheMap.remove(key); - } - } - /** * 校验是否禁言 */ @@ -258,4 +251,30 @@ public class CommentBlackService { }); } + public Set getBlackUserIds(Integer productId, Integer productType) { + Set blackUsers = new HashSet<>(); + List blackComments = getAllBlackComment(); + for (CommentBlack commentBlack : blackComments) { + if (CommentBlackScope.PRODUCT.value.equals(commentBlack.getScope())) { + if (commentBlack.getProductId().equals(productId) && commentBlack.getProductType().equals(productType)) { + blackUsers.add(commentBlack.getPhone()); + } + } else if (CommentBlackScope.PRODUCT_TYPE.value.equals(commentBlack.getScope())) { + if (commentBlack.getProductType().equals(productType)) { + blackUsers.add(commentBlack.getPhone()); + } + } else if (CommentBlackScope.GLOBAL.value.equals(commentBlack.getScope())) { + blackUsers.add(commentBlack.getPhone()); + } + } + return blackUsers; + } + + private void clearCache(String... cacheKeys) { + IMap cacheMap = hazelcastInstance.getMap(COMMENT_BLACK); + for (String key : cacheKeys) { + cacheMap.remove(key); + } + } + } diff --git a/src/main/java/com/syzb/group/constant/GroupCustomerStatus.java b/src/main/java/com/syzb/group/constant/GroupCustomerStatus.java new file mode 100644 index 0000000..51dbc28 --- /dev/null +++ b/src/main/java/com/syzb/group/constant/GroupCustomerStatus.java @@ -0,0 +1,19 @@ +package com.syzb.group.constant; + +// 客户状态 1:在期 2:已到期 3:即将到期 4:新学员 +public enum GroupCustomerStatus { + + IN_PERIOD(1, "在期"), + EXPIRED(2, "已到期"), + WILL_EXPIRED(3, "即将到期"), + NEW_STUDENT(4, "新学员"); + + public final Integer value; + public final String name; + + GroupCustomerStatus(Integer value, String name) { + this.value = value; + this.name = name; + } + +} diff --git a/src/main/java/com/syzb/group/controller/admin/AdminGroupCollectController.java b/src/main/java/com/syzb/group/controller/admin/AdminGroupCollectController.java new file mode 100644 index 0000000..91a1275 --- /dev/null +++ b/src/main/java/com/syzb/group/controller/admin/AdminGroupCollectController.java @@ -0,0 +1,54 @@ +package com.syzb.group.controller.admin; + +import com.syzb.common.query.OnlyIdQuery; +import com.syzb.common.result.CommonResult; +import com.syzb.common.result.Pager; +import com.syzb.common.vo.BackendUserVO; +import com.syzb.group.query.ListGroupCustomerQuery; +import com.syzb.group.query.QueryGroupCollectQuery; +import com.syzb.group.service.admin.AdminGroupCollectService; +import com.syzb.group.vo.GroupCollectVO; +import com.syzb.group.vo.GroupCustomerVO; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestAttribute; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.List; + +@Api(tags = "交易圈admin接口") +@RestController +public class AdminGroupCollectController { + + @Resource + private AdminGroupCollectService adminGroupCollectService; + + @ApiOperation("后台查询交易圈统计") + @PostMapping("/admin/group/collect/query") + public CommonResult> queryCollect(@Validated @RequestBody @ApiParam(required = true) QueryGroupCollectQuery query, + @RequestAttribute(value = "backendUser", required = false) BackendUserVO backendUserVO) { + List list = adminGroupCollectService.queryCollect(query, backendUserVO); + return CommonResult.success(list); + } + + @ApiOperation("后台查询交易圈当日统计") + @PostMapping("/admin/group/collect/queryToday") + public CommonResult queryTodayCollect(@Validated @RequestBody @ApiParam(required = true) OnlyIdQuery query, + @RequestAttribute(value = "backendUser", required = false) BackendUserVO backendUserVO) { + GroupCollectVO vo = adminGroupCollectService.queryTodayCollect(query, backendUserVO); + return CommonResult.success(vo); + } + + @ApiOperation("后台查询学院列表") + @PostMapping("/admin/group/college/listCustomer") + public CommonResult> listCustomer(@Validated @RequestBody @ApiParam(required = true) ListGroupCustomerQuery query, + @RequestAttribute(value = "backendUser", required = false) BackendUserVO backendUserVO) { + Pager page = adminGroupCollectService.listCustomer(query, backendUserVO); + return CommonResult.success(page); + } +} \ No newline at end of file diff --git a/src/main/java/com/syzb/group/controller/admin/AdminGroupInfoController.java b/src/main/java/com/syzb/group/controller/admin/AdminGroupInfoController.java index 0142b24..35ee81f 100644 --- a/src/main/java/com/syzb/group/controller/admin/AdminGroupInfoController.java +++ b/src/main/java/com/syzb/group/controller/admin/AdminGroupInfoController.java @@ -7,10 +7,8 @@ import com.syzb.common.result.CommonResult; import com.syzb.common.result.Pager; import com.syzb.common.vo.BackendUserVO; import com.syzb.common.vo.InsertIdVO; -import com.syzb.group.query.QueryGroupCollectQuery; import com.syzb.group.query.info.*; -import com.syzb.group.service.GroupInfoService; -import com.syzb.group.vo.GroupCollectVO; +import com.syzb.group.service.admin.AdminGroupInfoService; import com.syzb.group.vo.GroupVO; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -22,21 +20,20 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; -import java.util.List; @Api(tags = "交易圈admin接口") @RestController public class AdminGroupInfoController { @Resource - private GroupInfoService groupInfoService; + private AdminGroupInfoService adminGroupInfoService; @ApiOperation("后台保存交易圈") @PostMapping("/admin/group/info/save") @Operation(module = ProductType.GROUP) public CommonResult save(@Validated @RequestBody @ApiParam(required = true) SaveGroupQuery query, @RequestAttribute(value = "backendUser", required = false) BackendUserVO backendUserVO) { - InsertIdVO vo = groupInfoService.save(query, backendUserVO); + InsertIdVO vo = adminGroupInfoService.save(query, backendUserVO); return CommonResult.success(vo); } @@ -45,7 +42,7 @@ public class AdminGroupInfoController { @Operation(module = ProductType.GROUP, statusKey = "event") public CommonResult update(@Validated @RequestBody @ApiParam(required = true) UpdateGroupQuery query, @RequestAttribute(value = "backendUser", required = false) BackendUserVO backendUserVO) { - groupInfoService.update(query, backendUserVO); + adminGroupInfoService.update(query, backendUserVO); return CommonResult.success(); } @@ -54,7 +51,7 @@ public class AdminGroupInfoController { @Operation(module = ProductType.GROUP, statusKey = "event") public CommonResult updateStatus(@Validated @RequestBody @ApiParam(required = true) UpdateGroupStatusQuery query, @RequestAttribute(value = "backendUser", required = false) BackendUserVO backendUserVO) { - groupInfoService.updateStatus(query, backendUserVO); + adminGroupInfoService.updateStatus(query, backendUserVO); return CommonResult.success(); } @@ -62,7 +59,7 @@ public class AdminGroupInfoController { @PostMapping("/admin/group/info/list") public CommonResult> list(@Validated @RequestBody @ApiParam(required = true) ListGroupQuery query, @RequestAttribute(value = "backendUser", required = false) BackendUserVO backendUserVO) { - Pager page = groupInfoService.list(query, backendUserVO); + Pager page = adminGroupInfoService.list(query, backendUserVO); return CommonResult.success(page); } @@ -70,7 +67,7 @@ public class AdminGroupInfoController { @PostMapping("/admin/group/info/get") public CommonResult get(@Validated @RequestBody @ApiParam(required = true) OnlyIdQuery query, @RequestAttribute(value = "backendUser", required = false) BackendUserVO backendUserVO) { - GroupVO vo = groupInfoService.get(query, backendUserVO); + GroupVO vo = adminGroupInfoService.get(query, backendUserVO); return CommonResult.success(vo); } @@ -78,23 +75,8 @@ public class AdminGroupInfoController { @PostMapping("/admin/group/info/setNotice") public CommonResult setNotice(@Validated @RequestBody @ApiParam(required = true) SetNoticeQuery query, @RequestAttribute(value = "backendUser", required = false) BackendUserVO backendUserVO) { - groupInfoService.setNotice(query, backendUserVO); + adminGroupInfoService.setNotice(query, backendUserVO); return CommonResult.success(); } - @ApiOperation("后台查询交易圈统计") - @PostMapping("/admin/group/collect/query") - public CommonResult> queryCollect(@Validated @RequestBody @ApiParam(required = true) QueryGroupCollectQuery query, - @RequestAttribute(value = "backendUser", required = false) BackendUserVO backendUserVO) { - List list = groupInfoService.queryCollect(query, backendUserVO); - return CommonResult.success(list); - } - - @ApiOperation("后台查询交易圈当日统计") - @PostMapping("/admin/group/collect/queryToday") - public CommonResult queryTodayCollect(@Validated @RequestBody @ApiParam(required = true) OnlyIdQuery query, - @RequestAttribute(value = "backendUser", required = false) BackendUserVO backendUserVO) { - GroupCollectVO vo = groupInfoService.queryTodayCollect(query, backendUserVO); - return CommonResult.success(vo); - } } \ No newline at end of file diff --git a/src/main/java/com/syzb/group/query/ListGroupCustomerQuery.java b/src/main/java/com/syzb/group/query/ListGroupCustomerQuery.java new file mode 100644 index 0000000..e8fec6c --- /dev/null +++ b/src/main/java/com/syzb/group/query/ListGroupCustomerQuery.java @@ -0,0 +1,73 @@ +package com.syzb.group.query; + +import com.syzb.common.query.PageQuery; +import io.swagger.annotations.ApiModelProperty; + +public class ListGroupCustomerQuery extends PageQuery { + + @ApiModelProperty("交易圈ID") + private Integer groupId; + + @ApiModelProperty("用户ID") + private String userId; + + @ApiModelProperty("昵称") + private Integer nickName; + + @ApiModelProperty("在线状态 1:在线 2:不在线") + private Integer isOnline; + + @ApiModelProperty("客户状态 1:在期 2:已到期 3:即将到期 4:新学员") + private Integer customerStatus; + + @ApiModelProperty("禁言状态 1:已禁言 2:未禁言") + private Integer commentBlackStatus; + + public Integer getGroupId() { + return groupId; + } + + public void setGroupId(Integer groupId) { + this.groupId = groupId; + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public Integer getNickName() { + return nickName; + } + + public void setNickName(Integer nickName) { + this.nickName = nickName; + } + + public Integer getIsOnline() { + return isOnline; + } + + public void setIsOnline(Integer isOnline) { + this.isOnline = isOnline; + } + + public Integer getCustomerStatus() { + return customerStatus; + } + + public void setCustomerStatus(Integer customerStatus) { + this.customerStatus = customerStatus; + } + + public Integer getCommentBlackStatus() { + return commentBlackStatus; + } + + public void setCommentBlackStatus(Integer commentBlackStatus) { + this.commentBlackStatus = commentBlackStatus; + } +} diff --git a/src/main/java/com/syzb/group/service/admin/AdminGroupCollectService.java b/src/main/java/com/syzb/group/service/admin/AdminGroupCollectService.java new file mode 100644 index 0000000..aa27855 --- /dev/null +++ b/src/main/java/com/syzb/group/service/admin/AdminGroupCollectService.java @@ -0,0 +1,162 @@ +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.toolkit.Wrappers; +import com.hazelcast.map.IMap; +import com.syzb.business.entity.ModuleUser; +import com.syzb.business.mapper.ModuleUserMapper; +import com.syzb.common.config.cache.CacheKey; +import com.syzb.common.constant.IsOrNot; +import com.syzb.common.constant.ProductType; +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.group.constant.GroupCustomerStatus; +import com.syzb.group.entity.GroupCollect; +import com.syzb.group.mapper.GroupCollectMapper; +import com.syzb.group.query.ListGroupCustomerQuery; +import com.syzb.group.query.QueryGroupCollectQuery; +import com.syzb.group.service.common.GroupCacheService; +import com.syzb.group.service.common.GroupCommonService; +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; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +@Service +public class AdminGroupCollectService { + + @Resource + private IMap groupCache; + + @Resource + private GroupCollectMapper groupCollectMapper; + + @Resource + private GroupCommonService groupCommonService; + + @Resource + private ModuleUserMapper moduleUserMapper; + + @Resource + private WxUserMapper wxUserMapper; + + @Resource + private CommentBlackService commentBlackService; + @Autowired + private GroupCacheService groupCacheService; + + public List queryCollect(QueryGroupCollectQuery query, BackendUserVO backendUserVO) { + Integer groupId = query.getGroupId(); + LocalDate startDate = query.getStartDate(); + LocalDate endDate = query.getEndDate(); + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery() + .eq(groupId != null && groupId != 0, GroupCollect::getGroupId, groupId) + .ge(startDate != null, GroupCollect::getDate, startDate) + .le(endDate != null, GroupCollect::getDate, endDate); + List list = groupCollectMapper.selectList(wrapper); + return list.stream().map(GroupCollectVO::new).collect(Collectors.toList()); + } + + public void clearCache(Integer id) { + groupCache.delete(CacheKey.GroupKey.GROUP_INFO + id); + } + + public GroupCollectVO queryTodayCollect(OnlyIdQuery query, BackendUserVO backendUserVO) { + Integer groupId = query.getId(); + LocalDate date = LocalDate.now(); + GroupCollect groupCollect = groupCollectMapper.selectOne(Wrappers.lambdaQuery() + .eq(GroupCollect::getGroupId, groupId) + .eq(GroupCollect::getDate, date)); + return groupCollect == null ? new GroupCollectVO(groupId, date) : new GroupCollectVO(groupCollect); + } + + public Pager listCustomer(ListGroupCustomerQuery query, BackendUserVO backendUserVO) { + Integer groupId = query.getGroupId(); + String userId = query.getUserId(); + Integer nickName = query.getNickName(); + Integer isOnline = query.getIsOnline(); + Integer customerStatus = query.getCustomerStatus(); + Integer commentBlackStatus = query.getCommentBlackStatus(); + Set moduleIdSet = groupCommonService.getModuleIds(groupId); + if (CollUtil.isEmpty(moduleIdSet)) { + return Pager.emptyPager(); + } + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery() + .in(ModuleUser::getModuleId, moduleIdSet); + List moduleUserList = moduleUserMapper.selectList(wrapper); + if (CollUtil.isEmpty(moduleUserList)) { + return Pager.emptyPager(); + } + Set userIdSet = moduleUserList.stream().map(ModuleUser::getUserId).collect(Collectors.toSet()); + List wxUserList = wxUserMapper.selectList(Wrappers.lambdaQuery() + .in(WxUser::getId, userIdSet)); + if (CollUtil.isEmpty(wxUserList)) { + return Pager.emptyPager(); + } + Map wxUserMap = wxUserList.stream().collect(Collectors.toMap(WxUser::getId, Function.identity())); + Set blackUserIds = commentBlackService.getBlackUserIds(groupId, ProductType.GROUP.value); + Set onlineUserIds = groupCacheService.getOnlineUserIds(groupId); + Stream stream = moduleUserList.stream(); + if (StrUtil.isNotEmpty(userId)) { + stream = stream.filter(m -> userId.equals(m.getUserId())); + } + List list = stream.map(moduleUser -> { + GroupCustomerVO vo = new GroupCustomerVO(moduleUser); + WxUser wxUser = wxUserMap.get(moduleUser.getUserId()); + vo.setNickName(wxUser == null ? null : wxUser.getNickName()); + 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); + return vo; + }).collect(Collectors.toList()); + Stream voStream = list.stream(); + if (nickName != null) { + voStream = voStream.filter(vo -> nickName.equals(vo.getNickName())); + } + if (isOnline != null) { + voStream = voStream.filter(vo -> isOnline.equals(vo.getIsOnline())); + } + if (customerStatus != null) { + voStream = voStream.filter(vo -> customerStatus.equals(vo.getCustomerStatus())); + } + if (commentBlackStatus != null) { + voStream = voStream.filter(vo -> commentBlackStatus.equals(vo.getCommentBlackStatus())); + } + List voList = voStream.collect(Collectors.toList()); + List pageList = CollUtil.page(query.getCurrent(), query.getSize(), voList); + return new Pager<>(pageList, voList.size()); + } + + public GroupCustomerStatus calCustomerStatus(ModuleUser moduleUser) { + LocalDateTime endTime = moduleUser.getEndTime(); + LocalDateTime createTime = moduleUser.getCreateTime(); + LocalDateTime now = LocalDateTime.now(); + if (endTime.isBefore(now)) { + return GroupCustomerStatus.EXPIRED; + } + if (createTime.isBefore(now.minusDays(7))) { + return GroupCustomerStatus.NEW_STUDENT; + } + if (endTime.isBefore(now.plusDays(7))) { + return GroupCustomerStatus.WILL_EXPIRED; + } + return GroupCustomerStatus.IN_PERIOD; + } + +} diff --git a/src/main/java/com/syzb/group/service/GroupInfoService.java b/src/main/java/com/syzb/group/service/admin/AdminGroupInfoService.java similarity index 88% rename from src/main/java/com/syzb/group/service/GroupInfoService.java rename to src/main/java/com/syzb/group/service/admin/AdminGroupInfoService.java index 65f6074..936c5c1 100644 --- a/src/main/java/com/syzb/group/service/GroupInfoService.java +++ b/src/main/java/com/syzb/group/service/admin/AdminGroupInfoService.java @@ -1,4 +1,4 @@ -package com.syzb.group.service; +package com.syzb.group.service.admin; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -23,14 +23,10 @@ import com.syzb.common.vo.FrontUserVO; import com.syzb.common.vo.InsertIdVO; import com.syzb.course.service.PageService; import com.syzb.group.constant.GroupInfoStatus; -import com.syzb.group.entity.GroupCollect; import com.syzb.group.entity.GroupInfo; import com.syzb.group.entity.GroupSortEntity; -import com.syzb.group.mapper.GroupCollectMapper; import com.syzb.group.mapper.GroupInfoMapper; -import com.syzb.group.query.QueryGroupCollectQuery; import com.syzb.group.query.info.*; -import com.syzb.group.vo.GroupCollectVO; import com.syzb.group.vo.GroupVO; import com.syzb.rbac.entity.UserDept; import com.syzb.rbac.service.AuthService; @@ -40,13 +36,12 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; -import java.time.LocalDate; import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @Service -public class GroupInfoService { +public class AdminGroupInfoService { @Resource private GroupInfoMapper groupInfoMapper; @@ -78,9 +73,6 @@ public class GroupInfoService { @Resource private IMap groupCache; - @Resource - private GroupCollectMapper groupCollectMapper; - @Transactional(rollbackFor = Exception.class) public InsertIdVO save(SaveGroupQuery query, BackendUserVO backendUserVO) { sensitiveWordService.check(query.getName(), query.getRemark(), query.getDetail()); @@ -300,28 +292,8 @@ public class GroupInfoService { return advisorId; } - public List queryCollect(QueryGroupCollectQuery query, BackendUserVO backendUserVO) { - Integer groupId = query.getGroupId(); - LocalDate startDate = query.getStartDate(); - LocalDate endDate = query.getEndDate(); - LambdaQueryWrapper wrapper = Wrappers.lambdaQuery() - .eq(groupId != null && groupId != 0, GroupCollect::getGroupId, groupId) - .ge(startDate != null, GroupCollect::getDate, startDate) - .le(endDate != null, GroupCollect::getDate, endDate); - List list = groupCollectMapper.selectList(wrapper); - return list.stream().map(GroupCollectVO::new).collect(Collectors.toList()); - } - public void clearCache(Integer id) { groupCache.delete(CacheKey.GroupKey.GROUP_INFO + id); } - public GroupCollectVO queryTodayCollect(OnlyIdQuery query, BackendUserVO backendUserVO) { - Integer groupId = query.getId(); - LocalDate date = LocalDate.now(); - GroupCollect groupCollect = groupCollectMapper.selectOne(Wrappers.lambdaQuery() - .eq(GroupCollect::getGroupId, groupId) - .eq(GroupCollect::getDate, date)); - return groupCollect == null ? new GroupCollectVO(groupId, date) : new GroupCollectVO(groupCollect); - } -} \ No newline at end of file +} \ No newline at end of file diff --git a/src/main/java/com/syzb/group/service/admin/AdminGroupMessageService.java b/src/main/java/com/syzb/group/service/admin/AdminGroupMessageService.java index abd3945..636b665 100644 --- a/src/main/java/com/syzb/group/service/admin/AdminGroupMessageService.java +++ b/src/main/java/com/syzb/group/service/admin/AdminGroupMessageService.java @@ -24,7 +24,6 @@ import com.syzb.group.entity.GroupMessage; import com.syzb.group.mapper.GroupInfoMapper; import com.syzb.group.mapper.GroupMessageMapper; import com.syzb.group.query.message.*; -import com.syzb.group.service.GroupInfoService; import com.syzb.group.service.common.GroupCacheService; import com.syzb.group.service.common.GroupMessageService; import com.syzb.group.vo.message.GroupMessageVO; @@ -59,7 +58,7 @@ public class AdminGroupMessageService { private AdvisorInfoService advisorInfoService; @Resource - private GroupInfoService groupInfoService; + private AdminGroupInfoService adminGroupInfoService; @Resource private CommentBlackService commentBlackService; @@ -219,7 +218,7 @@ public class AdminGroupMessageService { groupMessageService.publishGroupMessage(GroupMessageChannel.ALL, GroupMessageType.OPEN_INTERACTIVE, groupId, query.getStatus()); - groupInfoService.clearCache(groupId); + adminGroupInfoService.clearCache(groupId); } /** @@ -237,7 +236,7 @@ public class AdminGroupMessageService { groupMessageService.publishGroupMessage(GroupMessageChannel.ALL, GroupMessageType.OPEN_PRIVATE_CHAT, groupId, query.getStatus()); - groupInfoService.clearCache(groupId); + adminGroupInfoService.clearCache(groupId); } /** @@ -255,7 +254,7 @@ public class AdminGroupMessageService { groupMessageService.publishGroupMessage(GroupMessageChannel.ALL, GroupMessageType.SHOW_GROUP_MEMBER_COUNT, groupId, query.getStatus()); - groupInfoService.clearCache(groupId); + adminGroupInfoService.clearCache(groupId); } public void setShowNickName(GroupMessageStatusQuery query, BackendUserVO backendUser) { @@ -270,7 +269,7 @@ public class AdminGroupMessageService { groupMessageService.publishGroupMessage(GroupMessageChannel.ALL, GroupMessageType.SHOW_FULL_NICKNAME, groupId, query.getStatus()); - groupInfoService.clearCache(groupId); + adminGroupInfoService.clearCache(groupId); } public void setFirstAudit(GroupMessageStatusQuery query, BackendUserVO backendUser) { @@ -285,7 +284,7 @@ public class AdminGroupMessageService { groupMessageService.publishGroupMessage(GroupMessageChannel.ALL, GroupMessageType.PRE_CHECK_SEND, groupId, query.getStatus()); - groupInfoService.clearCache(groupId); + adminGroupInfoService.clearCache(groupId); } private void clearCache(Integer messageId) { diff --git a/src/main/java/com/syzb/group/service/app/AppGroupInfoService.java b/src/main/java/com/syzb/group/service/app/AppGroupInfoService.java new file mode 100644 index 0000000..620147e --- /dev/null +++ b/src/main/java/com/syzb/group/service/app/AppGroupInfoService.java @@ -0,0 +1,107 @@ +package com.syzb.group.service.app; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.hazelcast.map.IMap; +import com.syzb.common.config.cache.CacheKey; +import com.syzb.common.query.OnlyIdQuery; +import com.syzb.common.result.AppPager; +import com.syzb.common.service.AppUserService; +import com.syzb.common.service.CacheService; +import com.syzb.common.vo.AuthResultVO; +import com.syzb.common.vo.FrontUserVO; +import com.syzb.course.service.PageService; +import com.syzb.group.constant.GroupInfoStatus; +import com.syzb.group.entity.GroupInfo; +import com.syzb.group.entity.GroupSortEntity; +import com.syzb.group.mapper.GroupInfoMapper; +import com.syzb.group.query.info.ListGroupAppQuery; +import com.syzb.group.service.admin.AdminGroupInfoService; +import com.syzb.group.vo.GroupVO; +import com.syzb.rbac.service.AuthService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.time.LocalDateTime; +import java.util.*; + +@Service +public class AppGroupInfoService { + + @Resource + private AdminGroupInfoService adminGroupInfoService; + + @Resource + private GroupInfoMapper groupInfoMapper; + + @Resource + private AuthService authService; + + @Resource + private PageService pageService; + + @Resource + private CacheService cacheService; + + @Resource + private AppUserService appUserService; + + @Resource + private IMap groupCache; + + /** + * APP端查询交易圈详情 + */ + public GroupVO getForApp(OnlyIdQuery query, FrontUserVO frontUserVO) { + GroupVO vo = cacheService.get(groupCache, CacheKey.GroupKey.GROUP_INFO + query.getId(), () -> adminGroupInfoService.get(query, null)); + if (vo == null) { + return null; + } + // 防止落地页修改后,未更新缓存 + if (vo.getPage() != null) { + vo.setPage(pageService.getForApp(vo.getPage().getId())); + } + if (frontUserVO != null) { + AuthResultVO authResultVo = appUserService.checkAuth(vo.getAuthorityId(), frontUserVO); + vo.setAuthResultVo(authResultVo); + } + return vo; + } + + /** + * APP端查询交易圈列表 + */ + public AppPager listForApp(ListGroupAppQuery query) { + Integer id = query.getId(); + Integer lastId = query.getLastId(); + LocalDateTime lastPublishTime = query.getLastPublishTime(); + Integer lastWeight = query.getLastWeight(); + Integer size = query.getSize(); + NavigableSet sortedSet = cacheService.get(groupCache, CacheKey.GroupKey.MAIN_GROUP_LIST + id, () -> { + LambdaQueryWrapper wrapper = Wrappers.lambdaQuery() + .eq(GroupInfo::getAdvisorId, id) + .eq(GroupInfo::getStatus, GroupInfoStatus.AUDITED.value) +// .eq(GroupInfo::getIsDisplay, IsDisplay.YES.value) + .orderByDesc(GroupInfo::getIsRecommend, GroupInfo::getAuditTime); + List list = groupInfoMapper.selectList(wrapper); + NavigableSet set = new TreeSet<>(); + list.stream().map(GroupSortEntity::new).forEach(set::add); + return set; + }); + GroupSortEntity lastEntity = lastId == null || lastWeight == null || lastPublishTime == null ? null : new GroupSortEntity(lastId, lastWeight, lastPublishTime); + if (lastEntity != null) { + sortedSet = sortedSet.tailSet(lastEntity, false); + } + List voList = new ArrayList<>(size); + Iterator iterator = sortedSet.iterator(); + while (iterator.hasNext() && voList.size() < size) { + GroupSortEntity entity = iterator.next(); + GroupVO vo = getForApp(new OnlyIdQuery(entity.getId()), null); + if (vo != null) { + voList.add(vo); + } + } + return new AppPager<>(voList, iterator.hasNext()); + } + +} \ No newline at end of file diff --git a/src/main/java/com/syzb/group/service/app/AppGroupMessageService.java b/src/main/java/com/syzb/group/service/app/AppGroupMessageService.java index 3fa6dd4..bb04e98 100644 --- a/src/main/java/com/syzb/group/service/app/AppGroupMessageService.java +++ b/src/main/java/com/syzb/group/service/app/AppGroupMessageService.java @@ -23,7 +23,6 @@ import com.syzb.group.query.message.ListGroupMessageAppQuery; import com.syzb.group.query.message.QueryUnreadCountAppQuery; import com.syzb.group.query.message.ReadGroupMessageAppQuery; import com.syzb.group.query.message.SendGroupMessageAppQuery; -import com.syzb.group.service.GroupInfoService; import com.syzb.group.service.common.GroupCacheService; import com.syzb.group.service.common.GroupMessageService; import com.syzb.group.vo.GroupVO; @@ -47,7 +46,7 @@ public class AppGroupMessageService { private GroupMessageService groupMessageService; @Resource - private GroupInfoService groupInfoService; + private AppGroupInfoService appGroupInfoService; @Resource private GroupCacheService groupCacheService; @@ -67,7 +66,7 @@ public class AppGroupMessageService { Integer type = query.getType(); Integer size = query.getSize(); LocalDate date = query.getDate(); - GroupVO groupVO = groupInfoService.getForApp(new OnlyIdQuery(groupId), null); + GroupVO groupVO = appGroupInfoService.getForApp(new OnlyIdQuery(groupId), null); if (groupVO == null) { throw new BizException(ResponseStatus.ID_NOT_EXIST_ERROR, "交易圈不存在"); } else if (QueryGroupMessageType.PRIVATE.value.equals(type) && !IsOrNot.IS.value.equals(groupVO.getPrivateChatStatus())) { @@ -113,7 +112,7 @@ public class AppGroupMessageService { sensitiveWordService.check(content); // 检查交易圈状态 - GroupVO groupVO = groupInfoService.getForApp(new OnlyIdQuery(groupId), null); + GroupVO groupVO = appGroupInfoService.getForApp(new OnlyIdQuery(groupId), null); if (groupVO == null) { throw new BizException(ResponseStatus.ID_NOT_EXIST_ERROR, "交易圈不存在"); } diff --git a/src/main/java/com/syzb/group/service/common/GroupCommonService.java b/src/main/java/com/syzb/group/service/common/GroupCommonService.java index 698f020..3f76b40 100644 --- a/src/main/java/com/syzb/group/service/common/GroupCommonService.java +++ b/src/main/java/com/syzb/group/service/common/GroupCommonService.java @@ -175,9 +175,9 @@ public class GroupCommonService { GroupCollect collect = new GroupCollect(); collect.setGroupId(groupId); collect.setDate(date); - collect.setTotalMembers(getModuleMembers(groupId, false)); + collect.setTotalMembers(getModuleMemberCount(groupId, false)); collect.setVisitedMembers(visitMemberMap.getOrDefault(groupId, 0)); - collect.setNewMembers(getModuleMembers(groupId, true)); + collect.setNewMembers(getModuleMemberCount(groupId, true)); collect.setInteractionMembers(0); collect.setPrivateChatMembers(0); List messageMemberList = groupMessageMemberMap.get(groupId); @@ -261,7 +261,7 @@ public class GroupCommonService { return moduleIdSet; } - private Integer getModuleMembers(Integer groupId, boolean isNew) { + private Integer getModuleMemberCount(Integer groupId, boolean isNew) { Set moduleIds = getModuleIds(groupId); if (CollUtil.isEmpty(moduleIds)) { return 0; diff --git a/src/main/java/com/syzb/group/vo/GroupCustomerVO.java b/src/main/java/com/syzb/group/vo/GroupCustomerVO.java new file mode 100644 index 0000000..ee09617 --- /dev/null +++ b/src/main/java/com/syzb/group/vo/GroupCustomerVO.java @@ -0,0 +1,125 @@ +package com.syzb.group.vo; + +import com.syzb.business.entity.ModuleUser; +import io.swagger.annotations.ApiModelProperty; + +import java.time.LocalDateTime; + +public class GroupCustomerVO { + + @ApiModelProperty("用户ID") + private String userId; + + @ApiModelProperty("昵称") + private String nickName; + + @ApiModelProperty("头像") + private String headPicUrl; + + @ApiModelProperty("加入时间") + private LocalDateTime joinTime; + + @ApiModelProperty("到期时间") + private LocalDateTime expireTime; + + @ApiModelProperty("在线状态 1:在线 2:不在线") + private Integer isOnline; + + @ApiModelProperty("客户状态 1:在期 2:已到期 3:即将到期 4:新学员") + private Integer customerStatus; + + @ApiModelProperty("禁言状态 0生效中 1已解除 2自然过期") + private Integer commentBlackStatus; + + @ApiModelProperty("最近一次访问时间") + private LocalDateTime lastVisitTime; + + @ApiModelProperty("最近一次发言时间") + private LocalDateTime lastChatTime; + + public GroupCustomerVO(ModuleUser moduleUser) { + this.userId = moduleUser.getUserId(); + this.joinTime = moduleUser.getCreateTime(); + this.expireTime = moduleUser.getEndTime(); + } + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public String getHeadPicUrl() { + return headPicUrl; + } + + public void setHeadPicUrl(String headPicUrl) { + this.headPicUrl = headPicUrl; + } + + public LocalDateTime getJoinTime() { + return joinTime; + } + + public void setJoinTime(LocalDateTime joinTime) { + this.joinTime = joinTime; + } + + public LocalDateTime getExpireTime() { + return expireTime; + } + + public void setExpireTime(LocalDateTime expireTime) { + this.expireTime = expireTime; + } + + public Integer getIsOnline() { + return isOnline; + } + + public void setIsOnline(Integer isOnline) { + this.isOnline = isOnline; + } + + public Integer getCustomerStatus() { + return customerStatus; + } + + public void setCustomerStatus(Integer customerStatus) { + this.customerStatus = customerStatus; + } + + public Integer getCommentBlackStatus() { + return commentBlackStatus; + } + + public void setCommentBlackStatus(Integer commentBlackStatus) { + this.commentBlackStatus = commentBlackStatus; + } + + public LocalDateTime getLastVisitTime() { + return lastVisitTime; + } + + public void setLastVisitTime(LocalDateTime lastVisitTime) { + this.lastVisitTime = lastVisitTime; + } + + public LocalDateTime getLastChatTime() { + return lastChatTime; + } + + public void setLastChatTime(LocalDateTime lastChatTime) { + this.lastChatTime = lastChatTime; + } +}