From 71473ade253026d3e840110673c38c788848c24a Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Thu, 4 Dec 2025 17:45:10 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E9=BB=91=E5=90=8D=E5=8D=95=E6=90=9C?= =?UTF-8?q?=E7=B4=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/enums/MemberRecentOperateEnum.java | 2 +- .../admin/recent/vo/RecentPageReqVO.java | 6 ++ .../service/recent/OperationService.java | 5 ++ .../service/recent/OperationServiceImpl.java | 21 +++++++ .../service/recent/RecentServiceImpl.java | 59 +++++++++++-------- .../main/resources/mapper/RecentMapper.xml | 30 +++++++--- 6 files changed, 88 insertions(+), 35 deletions(-) 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 d2c3e1b..13f3ec5 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 @@ -33,7 +33,7 @@ public enum MemberRecentOperateEnum { /** * 用户-屏蔽 */ - MEMBER_SHIELD("5", "屏蔽"), + MEMBER_SHIELD("5", "屏蔽/拉黑"), /** * 用户-举报 */ diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/recent/vo/RecentPageReqVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/recent/vo/RecentPageReqVO.java index 78ca60d..52a2cfe 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/recent/vo/RecentPageReqVO.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/recent/vo/RecentPageReqVO.java @@ -21,6 +21,9 @@ public class RecentPageReqVO extends PageParam { @Schema(description = "用户编号") private Long memberId; + @Schema(description = "排除用户编号") + private List excludeUserIdList; + @Schema(description = "性别") private Integer memberSex; @@ -64,6 +67,9 @@ public class RecentPageReqVO extends PageParam { @Schema(description = "场景") private String sceneBizType; + @Schema(description = "距离不为空") + private Boolean distanceIsNotNull; + /** * 用户tag相关 */ 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 940b8ca..b962f3b 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 @@ -54,4 +54,9 @@ public interface OperationService { List getRecentOperationStatus(Long operateUserId, List recentIdList); OperationStatusVo getRecentOperationStatus(Long operateUserId, Long recentIdList); + + /** + * 获取黑名单列表 + */ + List getBlackUserIdList(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 ea26acd..40cdcb4 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 @@ -1,6 +1,7 @@ package cn.iocoder.yudao.module.member.service.recent; import cn.hutool.core.util.ObjectUtil; +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX; import cn.iocoder.yudao.module.member.controller.admin.recent.vo.OperationPageReqVO; import cn.iocoder.yudao.module.member.controller.admin.recent.vo.OperationRespVO; import cn.iocoder.yudao.module.member.controller.admin.recent.vo.OperationSaveReqVO; @@ -8,6 +9,7 @@ import cn.iocoder.yudao.module.member.controller.admin.recent.vo.OperationStatus import cn.iocoder.yudao.module.member.dal.dataobject.recent.OperationDO; import cn.iocoder.yudao.module.member.dal.mysql.recent.OperationMapper; import cn.iocoder.yudao.module.member.enums.MemberErrorCode; +import cn.iocoder.yudao.module.member.enums.MemberRecentOperateEnum; import org.springframework.stereotype.Service; import javax.annotation.Resource; @@ -21,6 +23,7 @@ import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import java.util.Arrays; import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; @@ -111,4 +114,22 @@ public class OperationServiceImpl implements OperationService { } return new OperationStatusVo(); } + + /** + * 获取黑名单列表 + */ + @Override + public List getBlackUserIdList(Long memberId) { + List list = operationMapper.selectList(new LambdaQueryWrapperX() + .select(OperationDO::getMemberId) + .eq(OperationDO::getOperatorMemberId, memberId) + .eq(OperationDO::getBizType, MemberRecentOperateEnum.MEMBER_SHIELD.getType()) + .isNull(OperationDO::getCancelTime) + .orderByDesc(OperationDO::getTapTime) + .orderByDesc(OperationDO::getId) + ); + if (ObjectUtil.isEmpty(list)) return Collections.emptyList(); + return list.stream().map(OperationDO::getMemberId).collect(Collectors.toList()); + } + } \ 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 a0a0ece..2925b6f 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 @@ -52,10 +52,7 @@ import cn.iocoder.yudao.module.member.dal.mysql.recent.RecentMapper; import java.math.BigDecimal; import java.math.RoundingMode; import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; @@ -221,7 +218,12 @@ public class RecentServiceImpl implements RecentService { if (MemberRecentOperateEnum.recentOperateList.contains(dto.getAction())) { operationDO.setMemberRecentId(dto.getMemberRecentId()); } - + // 屏蔽/拉黑 + if (ObjectUtil.equals(dto.getAction(), MemberRecentOperateEnum.MEMBER_SHIELD)) { + if (ObjectUtil.isNotEmpty(operationDO)) { + throw exception(MemberErrorCode.EMPTY, "已屏蔽,无需重复操作"); + } + } // 举报 List reportList = new ArrayList() {{ add(MemberRecentOperateEnum.RECENT_REPORT); @@ -282,16 +284,7 @@ public class RecentServiceImpl implements RecentService { RecentPageReqVO resultQuery = BeanUtil.toBean(bean, RecentPageReqVO.class); resultQuery.setSceneBizType(bean.getScene().getType()); - // 只查询异性 - if (ObjectUtil.isNotEmpty(operationUser.getSex())) { - SexEnum sexEnum = SexEnum.valueOfSex(operationUser.getSex()); - SexEnum targetSex = SexEnum.negation(sexEnum.getSex()); - resultQuery.setMemberSex(targetSex.getSex()); - } - // 查询用户最新的位置 - LocationDO locationDO = locationService.getCurrentUserLastLocation(); - resultQuery.setCurrentLat(locationDO.getLat()); - resultQuery.setCurrentLng(locationDO.getLon()); + quickBeforeQuery(operationUser, resultQuery); IPage recentPageList = recentMapper.pageJoin(new Page(bean.getPageNo(), bean.getPageSize()), resultQuery); List resultList = BeanUtils.toBean(recentPageList.getRecords(), RecentPageResVo.class); @@ -316,18 +309,11 @@ public class RecentServiceImpl implements RecentService { RecentPageReqVO resultQuery = BeanUtil.toBean(bean, RecentPageReqVO.class); resultQuery.setSceneBizType(bean.getScene().getType()); - resultQuery.setIssueProvince(bean.getProvince()); - resultQuery.setIssueCity(bean.getCity()); - // 只查询异性 - if (ObjectUtil.isNotEmpty(operationUser.getSex())) { - SexEnum sexEnum = SexEnum.valueOfSex(operationUser.getSex()); - SexEnum targetSex = SexEnum.negation(sexEnum.getSex()); - resultQuery.setMemberSex(targetSex.getSex()); + quickBeforeQuery(operationUser, resultQuery); + // 广场-最近 + if (ObjectUtil.equals(bean.getScene(), MemberRecentSceneEnum.SQUARE_NEW_TIME)) { + resultQuery.setDistanceIsNotNull(true); } - // 查询用户最新的位置 - LocationDO locationDO = locationService.getCurrentUserLastLocation(); - resultQuery.setCurrentLat(locationDO.getLat()); - resultQuery.setCurrentLng(locationDO.getLon()); // 广场-新人 if (ObjectUtil.equals(MemberRecentSceneEnum.SQUARE_NEW_PERSON, bean.getScene())) { resultQuery.setMemberRecentTagList(new ArrayList() {{ @@ -670,4 +656,25 @@ public class RecentServiceImpl implements RecentService { } } + private void quickBeforeQuery(MemberUserDO operationUser, RecentPageReqVO resultQuery) { + if (ObjectUtil.isEmpty(resultQuery)) resultQuery = new RecentPageReqVO(); + HashSet excludeUserIdList = new HashSet<>(); + // 只查询异性 + if (ObjectUtil.isNotEmpty(operationUser.getSex())) { + SexEnum sexEnum = SexEnum.valueOfSex(operationUser.getSex()); + SexEnum targetSex = SexEnum.negation(sexEnum.getSex()); + resultQuery.setMemberSex(targetSex.getSex()); + } + // 查询用户最新的位置(根据位置的查询) + LocationDO locationDO = locationService.getCurrentUserLastLocation(); + resultQuery.setCurrentLat(locationDO.getLat()); + resultQuery.setCurrentLng(locationDO.getLon()); + // 排除黑名单 + List blackUserIdList = operationService.getBlackUserIdList(operationUser.getId()); + if (ObjectUtil.isNotEmpty(blackUserIdList)) { + excludeUserIdList.addAll(blackUserIdList); + } + resultQuery.setExcludeUserIdList(excludeUserIdList.stream().collect(Collectors.toList())); + } + } \ No newline at end of file diff --git a/yudao-module-member/yudao-module-member-biz/src/main/resources/mapper/RecentMapper.xml b/yudao-module-member/yudao-module-member-biz/src/main/resources/mapper/RecentMapper.xml index c3f9dde..e7bfbae 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/resources/mapper/RecentMapper.xml +++ b/yudao-module-member/yudao-module-member-biz/src/main/resources/mapper/RecentMapper.xml @@ -44,6 +44,12 @@ and a.createTime between #{dto.createTime[0]} and #{dto.createTime[1]} + + and a.member_id not in + + #{v} + + -