diff --git a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/MemberRecentOperateEnum.java b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/MemberRecentOperateEnum.java index 13f3ec5..ee00521 100644 --- a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/MemberRecentOperateEnum.java +++ b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/MemberRecentOperateEnum.java @@ -42,6 +42,10 @@ public enum MemberRecentOperateEnum { * 用户-评价 */ MEMBER_RATING("7", "评价"), + /** + * 用户-查看微信 + */ + MEMBER_LOOK_WECHAT("100", "用户-查看微信"), ; private final String type; private final String description; diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/config/vo/MemberConfigBaseVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/config/vo/MemberConfigBaseVO.java index 2e1f0e1..deb73bb 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/config/vo/MemberConfigBaseVO.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/config/vo/MemberConfigBaseVO.java @@ -37,6 +37,18 @@ public class MemberConfigBaseVO { @Schema(description = "普通用户每天可以和人发几次消息") private Integer defaultChatUserMsgCout; + @NotNull(message = "vip用户每天可以和几个人聊天不能为空") + @Schema(description = "vip用户每天可以和几个人聊天") + private Integer vipChatUserCout; + + @NotNull(message = "vip用户每天可以和人发几次消息不能为空") + @Schema(description = "vip用户每天可以和人发几次消息") + private Integer vipChatUserMsgCout; + + @NotNull(message = "vip查看微信次数不能为空") + @Schema(description = "vip查看微信次数") + private Integer vipLookWechtCout; + @Schema(description = "举报类型") private List reportTypeList; diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/recent/AppRecentController.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/recent/AppRecentController.java index b9e6d75..69145e3 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/recent/AppRecentController.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/recent/AppRecentController.java @@ -11,6 +11,7 @@ import cn.iocoder.yudao.module.member.controller.app.recent.vo.*; import cn.iocoder.yudao.module.member.enums.MemberRecentSceneEnum; import cn.iocoder.yudao.module.member.service.recent.RecentService; import cn.iocoder.yudao.module.member.service.recent.ViewRecordService; +import cn.iocoder.yudao.module.member.service.user.BO.MemberWechatBO; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import org.apache.ibatis.annotations.Delete; @@ -69,6 +70,12 @@ public class AppRecentController { return success(recentService.operate(dto)); } + @GetMapping("/look-wechat") + @Operation(summary = "查看微信") + public CommonResult lookWechat(@RequestParam("memberId") Long memberId) { + return success(recentService.lookWechat(getLoginUserId(), memberId)); + } + @PostMapping("/create/view-record") @Operation(summary = "添加用户预览记录") public CommonResult createViewRecord(@Valid @RequestBody AppRecentViewRecordReqVo dto) { diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/config/MemberConfigDO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/config/MemberConfigDO.java index cb85cdc..3608bf4 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/config/MemberConfigDO.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/config/MemberConfigDO.java @@ -63,6 +63,21 @@ public class MemberConfigDO extends BaseDO { */ private Integer defaultChatUserMsgCout; + /** + * vip用户每天可以和几个人聊天 + */ + private Integer vipChatUserCout; + + /** + * vip用户每天可以和人发几次消息 + */ + private Integer vipChatUserMsgCout; + + /** + * vip查看微信次数 + */ + private Integer vipLookWechtCout; + /** * 举报类型 */ diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/opentype/OpenTypeServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/opentype/OpenTypeServiceImpl.java index a4b0c87..4f7382f 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/opentype/OpenTypeServiceImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/opentype/OpenTypeServiceImpl.java @@ -187,16 +187,16 @@ public class OpenTypeServiceImpl implements OpenTypeService { */ @Override public boolean isUserCanSendMessage(Long sendId, Long receiveId) { - // 判断是否是会员 - if (isUserOpenType(sendId)) return true; // 获取配置 MemberConfigDO config = memberConfigService.getConfig(); - // 普通用户每天可以和几个人聊天 - Integer defaultChatUserCout = config.getDefaultChatUserCout(); - if (ObjectUtil.isEmpty(defaultChatUserCout)) defaultChatUserCout = 3; - // 普通用户每天可以和人发几次消息 - Integer defaultChatUserMsgCout = config.getDefaultChatUserMsgCout(); - if (ObjectUtil.isEmpty(defaultChatUserMsgCout)) defaultChatUserMsgCout = 3; + // 判断是否是会员 + boolean isVip = isUserOpenType(sendId); + // 用户每天可以和几个人聊天 + Integer chatUserCout = isVip ? config.getVipChatUserCout() : config.getDefaultChatUserCout(); + if (ObjectUtil.isEmpty(chatUserCout)) chatUserCout = 3; + // 用户每天可以和人发几次消息 + Integer chatUserMsgCout = isVip ? config.getVipChatUserMsgCout() : config.getDefaultChatUserMsgCout(); + if (ObjectUtil.isEmpty(chatUserMsgCout)) chatUserMsgCout = 3; LocalDateTime now = LocalDateTime.now(); LocalDateTime startDate = now.withHour(0).withMinute(0).withSecond(0); @@ -212,13 +212,13 @@ public class OpenTypeServiceImpl implements OpenTypeService { List msgList = chatApi.privateTotal(dto); if (ObjectUtil.isEmpty(msgList)) return true; // 普通用户聊天人数是否超过上限 - if (msgList.size() > defaultChatUserCout) { + if (msgList.size() > chatUserCout && ObjectUtil.notEqual(chatUserCout, -1)) { throw exception(MemberErrorCode.CHAT_USER_COUNT_EXCEED); } // 聊天人数已经超过限制 ChatPrivateTotalMessageTotalResVO targetCount = msgList.stream().filter(item -> ObjectUtil.equals(item.getSendId(), sendId) && ObjectUtil.equals(item.getReceiveId(), receiveId)).findFirst().orElse(null); if (ObjectUtil.isEmpty(targetCount)) return true; - if (targetCount.getMessageTotal() > defaultChatUserMsgCout) { + if (targetCount.getMessageTotal() > chatUserMsgCout && ObjectUtil.notEqual(chatUserMsgCout, -1)) { throw exception(MemberErrorCode.CHAT_MSG_COUNT_EXCEED); } return true; diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/recent/OperationService.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/recent/OperationService.java index b962f3b..7b09cfc 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/recent/OperationService.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/recent/OperationService.java @@ -59,4 +59,9 @@ public interface OperationService { * 获取黑名单列表 */ List getBlackUserIdList(Long memberId); + + /** + * 获取微信今日查看次数 + */ + Integer lookWechatTodayCount(Long operateMemberId, Long memberId); } \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/recent/OperationServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/recent/OperationServiceImpl.java index 40cdcb4..63fe52e 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/recent/OperationServiceImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/recent/OperationServiceImpl.java @@ -20,6 +20,8 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; +import java.time.LocalDateTime; +import java.time.LocalTime; import java.util.Arrays; import java.util.Collections; import java.util.List; @@ -132,4 +134,18 @@ public class OperationServiceImpl implements OperationService { return list.stream().map(OperationDO::getMemberId).collect(Collectors.toList()); } + /** + * 获取微信今日查看次数 + */ + @Override + public Integer lookWechatTodayCount(Long operateMemberId, Long memberId) { + LocalDateTime now = LocalDateTime.now(); + Long count = operationMapper.selectCount(new LambdaQueryWrapperX() + .eq(OperationDO::getOperatorMemberId, operateMemberId) + .eqIfPresent(OperationDO::getMemberId, memberId) + .eq(OperationDO::getBizType, MemberRecentOperateEnum.MEMBER_LOOK_WECHAT.getType()) + .between(OperationDO::getCancelTime, now.with(LocalTime.MIN), now.with(LocalTime.MAX)) + ); + return Math.toIntExact(count); + } } \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/recent/RecentService.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/recent/RecentService.java index 446ed77..a4f398a 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/recent/RecentService.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/recent/RecentService.java @@ -6,6 +6,7 @@ import cn.iocoder.yudao.module.member.controller.admin.recent.vo.*; import cn.iocoder.yudao.module.member.controller.app.recent.vo.*; import cn.iocoder.yudao.module.member.dal.dataobject.recent.RecentDO; import cn.iocoder.yudao.framework.common.pojo.PageResult; +import cn.iocoder.yudao.module.member.service.user.BO.MemberWechatBO; /** * 朋友圈 Service 接口 @@ -37,6 +38,11 @@ public interface RecentService { */ Long operate(@Valid AppRecentOperateReqVo dto); + /** + * 查看微信 + */ + MemberWechatBO lookWechat(Long operateMemberId, Long memberId); + /** * 获得朋友圈 */ @@ -101,4 +107,5 @@ public interface RecentService { * 朋友圈我喜欢的、喜欢我的等总数统计 */ OperationTotalGroupRecentRespVO total(Long userId); + } \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/recent/RecentServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/recent/RecentServiceImpl.java index 4dbbdea..14d6b82 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/recent/RecentServiceImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/recent/RecentServiceImpl.java @@ -3,7 +3,6 @@ package cn.iocoder.yudao.module.member.service.recent; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.IterUtil; import cn.hutool.core.util.ObjectUtil; -import cn.iocoder.yudao.framework.common.exception.ErrorCode; import cn.iocoder.yudao.framework.common.util.number.NumberUtils; import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.module.member.api.thirdauth.ThirdAuthVo; @@ -11,6 +10,7 @@ import cn.iocoder.yudao.module.member.controller.app.recent.vo.AppEvaluateDetail import cn.iocoder.yudao.module.member.controller.app.recent.vo.AppRecentLikeReqVo; import cn.iocoder.yudao.module.member.controller.app.recent.vo.AppRecentOperateReqVo; import cn.iocoder.yudao.module.member.controller.app.recent.vo.AppRecentQuickPageVO; +import cn.iocoder.yudao.module.member.dal.dataobject.config.MemberConfigDO; import cn.iocoder.yudao.module.member.dal.dataobject.location.LocationDO; import cn.iocoder.yudao.module.member.dal.dataobject.photo.PhotoDO; import cn.iocoder.yudao.module.member.dal.dataobject.recent.OperationDO; @@ -18,16 +18,18 @@ import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberRecentCfgDO; import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; import cn.iocoder.yudao.module.member.dal.mysql.recent.OperationMapper; import cn.iocoder.yudao.module.member.dal.mysql.user.MemberRecentTagMapper; -import cn.iocoder.yudao.module.member.enums.ErrorCodeConstants; import cn.iocoder.yudao.module.member.enums.MemberErrorCode; import cn.iocoder.yudao.module.member.enums.MemberRecentOperateEnum; import cn.iocoder.yudao.module.member.enums.MemberRecentSceneEnum; import cn.iocoder.yudao.module.member.enums.tag.MemberRecentTagEnum; +import cn.iocoder.yudao.module.member.service.config.MemberConfigService; import cn.iocoder.yudao.module.member.service.location.LocationService; import cn.iocoder.yudao.module.member.client.service.ThirdAuthService; +import cn.iocoder.yudao.module.member.service.opentype.OpenTypeService; import cn.iocoder.yudao.module.member.service.photo.PhotoService; import cn.iocoder.yudao.module.member.service.user.BO.MemberExtBO; import cn.iocoder.yudao.module.member.service.user.BO.MemberTagExtBO; +import cn.iocoder.yudao.module.member.service.user.BO.MemberWechatBO; import cn.iocoder.yudao.module.member.service.user.MemberRecentCfgService; import cn.iocoder.yudao.module.member.service.user.MemberRecentTagService; import cn.iocoder.yudao.module.member.service.user.MemberUserService; @@ -37,7 +39,6 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; -import org.springframework.security.core.parameters.P; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -79,6 +80,8 @@ public class RecentServiceImpl implements RecentService { @Resource private MemberUserService memberUserService; @Resource + private MemberConfigService memberConfigService; + @Resource private LocationService locationService; @Resource private ThirdAuthService thirdAuthService; @@ -90,6 +93,8 @@ public class RecentServiceImpl implements RecentService { private MemberRecentTagService memberRecentTagService; @Resource private MemberRecentCfgService memberRecentCfgService; + @Resource + private OpenTypeService openTypeService; /** * 创建朋友圈 @@ -262,6 +267,42 @@ public class RecentServiceImpl implements RecentService { return operationDO.getId(); } + /** + * 查看微信 + */ + @Override + public MemberWechatBO lookWechat(Long operateMemberId, Long memberId) { + if (ObjectUtil.equals(operateMemberId, memberId)) { + throw exception(MemberErrorCode.EMPTY, "不能查看自己微信"); + } + // 查询用户是不是vip + if (!openTypeService.isUserOpenType(operateMemberId)) { + throw exception(MemberErrorCode.EMPTY, "请先开通会员"); + } + MemberWechatBO memberWechat = memberUserService.getMemberWechat(memberId); + if (ObjectUtil.isEmpty(memberWechat)) { + throw exception(MemberErrorCode.EMPTY, "用户没有绑定微信"); + } + MemberConfigDO config = memberConfigService.getConfig(); + Integer vipLookWechtCout = config.getVipLookWechtCout(); + // 判断今天有没有查看过 + if (operationService.lookWechatTodayCount(operateMemberId, memberId) > 0) { + return memberWechat; + } + // 查询用户今天有没有查看次数 + Integer userLookWechtCout = operationService.lookWechatTodayCount(operateMemberId, null); + if (userLookWechtCout > vipLookWechtCout) { + throw exception(MemberErrorCode.EMPTY, "今日查看微信次数已用完"); + } + OperationDO operationObj = new OperationDO(); + operationObj.setOperatorMemberId(operateMemberId); + operationObj.setMemberId(memberId); + operationObj.setBizType(MemberRecentOperateEnum.MEMBER_LOOK_WECHAT.getType()); + operationObj.setTapTime(LocalDateTime.now()); + operationMapper.insert(operationObj); + return memberWechat; + } + @Override public RecentDO getRecent(Long id) { return recentMapper.selectById(id); diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/BO/MemberWechatBO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/BO/MemberWechatBO.java new file mode 100644 index 0000000..1048ab4 --- /dev/null +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/BO/MemberWechatBO.java @@ -0,0 +1,18 @@ +package cn.iocoder.yudao.module.member.service.user.BO; + +import lombok.Data; + +@Data +public class MemberWechatBO { + + /** + * 微信号 + */ + private String wechatNum; + + /** + * 微信二维码 + */ + private String wechatQrCode; + +} diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserService.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserService.java index 00a3397..84f1b26 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserService.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserService.java @@ -8,6 +8,7 @@ import cn.iocoder.yudao.module.member.controller.admin.user.vo.MemberUserUpdateR import cn.iocoder.yudao.module.member.controller.app.user.vo.*; import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; import cn.iocoder.yudao.module.member.service.user.BO.MemberExtBO; +import cn.iocoder.yudao.module.member.service.user.BO.MemberWechatBO; import javax.validation.Valid; import java.util.Collection; @@ -198,4 +199,9 @@ public interface MemberUserService { * 同步聊天的用户体系 */ boolean syncChatUser(Long id); + + /** + * 获取用户的微信信息 + */ + MemberWechatBO getMemberWechat(Long memberId); } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImpl.java index fd7fe33..4983eb9 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/user/MemberUserServiceImpl.java @@ -26,6 +26,7 @@ import cn.iocoder.yudao.module.member.enums.photo.PhotoBizTypeEnum; import cn.iocoder.yudao.module.member.enums.tag.MemberRecentTagEnum; import cn.iocoder.yudao.module.member.mq.producer.user.MemberUserProducer; import cn.iocoder.yudao.module.member.service.user.BO.MemberExtBO; +import cn.iocoder.yudao.module.member.service.user.BO.MemberWechatBO; import cn.iocoder.yudao.module.system.api.sms.SmsCodeApi; import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeUseReqDTO; import cn.iocoder.yudao.module.system.api.social.SocialClientApi; @@ -428,4 +429,20 @@ public class MemberUserServiceImpl implements MemberUserService { chatUser.setAvatar(memberUser.getAvatar()); return chatApi.createOrUpdate(chatUser); } + + /** + * 获取用户的微信信息 + */ + @Override + public MemberWechatBO getMemberWechat(Long memberId) { + MemberUserDO detail = memberUserMapper.selectById(memberId); + if (ObjectUtil.isEmpty(detail)) return null; + if (ObjectUtil.isEmpty(detail.getWechatNum()) || ObjectUtil.isEmpty(detail.getWechatQrCode())) { + return null; + } + MemberWechatBO result = new MemberWechatBO(); + result.setWechatNum(detail.getWechatNum()); + result.setWechatQrCode(detail.getWechatQrCode()); + return result; + } }