From a5fc5201aa25582ad6ac467187b0d8ed82d1dfce Mon Sep 17 00:00:00 2001 From: dzq Date: Mon, 8 Dec 2025 16:34:09 +0800 Subject: [PATCH] =?UTF-8?q?refactor(membership):=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E6=A0=87=E7=AD=BE=E6=88=90=E5=91=98=E5=88=A0=E9=99=A4=E9=80=BB?= =?UTF-8?q?=E8=BE=91=E5=B9=B6=E4=BC=98=E5=8C=96=E6=9F=A5=E8=AF=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将deleteById方法重命名为removeById以更准确表达物理删除操作 - 为MembershipTagMemberEntity添加deleted字段支持逻辑删除 - 优化用户查询SQL,移除不必要的标签关联查询 - 修改标签查询逻辑,使用EXISTS代替IN提升查询性能 --- .../domain/ab98/user/db/Ab98UserMapper.java | 10 ++--- .../user/query/SearchAb98UserWithWxQuery.java | 39 ++++++++++++++----- ...MembershipTagMemberApplicationService.java | 2 +- .../db/MembershipTagMemberEntity.java | 8 ++++ .../model/MembershipTagMemberModel.java | 16 +++----- 5 files changed, 48 insertions(+), 27 deletions(-) diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/ab98/user/db/Ab98UserMapper.java b/agileboot-domain/src/main/java/com/agileboot/domain/ab98/user/db/Ab98UserMapper.java index 5943b7c..3f75b10 100644 --- a/agileboot-domain/src/main/java/com/agileboot/domain/ab98/user/db/Ab98UserMapper.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/ab98/user/db/Ab98UserMapper.java @@ -61,15 +61,13 @@ public interface Ab98UserMapper extends BaseMapper { ); @Select("SELECT * FROM (" + - "SELECT DISTINCT u.ab98_user_id, u.openid, u.userid, u.qy_user_id, u.name, u.tel, u.idnum, u.sex, u.face_img, u.idcard_front, u.idcard_back, u.address, u.registered, u.creator_id, u.create_time, u.updater_id, u.update_time, u.deleted, u.ab98_balance, ub.balance, ub.use_balance, ub.balance_limit, w.wx_user_id, w.openid as wx_user_openid, w.nick_name as wx_nick_name, w.avatar as wx_avatar, mtm.tag_id " + + "SELECT DISTINCT u.ab98_user_id, u.openid, u.userid, u.qy_user_id, u.name, u.tel, u.idnum, u.sex, u.face_img, u.idcard_front, u.idcard_back, u.address, u.registered, u.creator_id, u.create_time, u.updater_id, u.update_time, u.deleted, u.ab98_balance, ub.balance, ub.use_balance, ub.balance_limit, w.wx_user_id, w.openid as wx_user_openid, w.nick_name as wx_nick_name, w.avatar as wx_avatar " + "FROM ab98_user u " + - "LEFT JOIN membership_tag_member mtm ON u.ab98_user_id = mtm.ab98_user_id " + - "LEFT JOIN user_balance ub ON u.ab98_user_id = ub.ab98_user_id " + - "LEFT JOIN wx_user w ON u.ab98_user_id = w.ab98_user_id " + + "LEFT JOIN user_balance ub ON u.ab98_user_id = ub.ab98_user_id and ub.deleted = 0 " + + "LEFT JOIN wx_user w ON u.ab98_user_id = w.ab98_user_id and w.deleted = 0 " + " UNION ALL " + - "SELECT NULL as ab98_user_id, NULL as openid, NULL as userid, NULL as qy_user_id, NULL as name, NULL as tel, NULL as idnum, NULL as sex, NULL as face_img, NULL as idcard_front, NULL as idcard_back, NULL as address, NULL as registered, NULL as creator_id, w.create_time as create_time, NULL as updater_id, w.update_time as update_time, NULL as deleted, NULL as ab98_balance, NULL as balance, NULL as use_balance, NULL as balance_limit, w.wx_user_id, w.openid as wx_user_openid, w.nick_name as wx_nick_name, w.avatar as wx_avatar, mtm.tag_id " + + "SELECT NULL as ab98_user_id, NULL as openid, NULL as userid, NULL as qy_user_id, NULL as name, NULL as tel, NULL as idnum, NULL as sex, NULL as face_img, NULL as idcard_front, NULL as idcard_back, NULL as address, NULL as registered, NULL as creator_id, w.create_time as create_time, NULL as updater_id, w.update_time as update_time, NULL as deleted, NULL as ab98_balance, NULL as balance, NULL as use_balance, NULL as balance_limit, w.wx_user_id, w.openid as wx_user_openid, w.nick_name as wx_nick_name, w.avatar as wx_avatar " + "FROM wx_user w " + - "LEFT JOIN membership_tag_member mtm ON w.wx_user_id = mtm.wx_user_id " + "WHERE w.ab98_user_id IS NULL" + ") t ${ew.customSqlSegment} ORDER BY create_time DESC") Page getUserListWithWx( diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/ab98/user/query/SearchAb98UserWithWxQuery.java b/agileboot-domain/src/main/java/com/agileboot/domain/ab98/user/query/SearchAb98UserWithWxQuery.java index 1f3dd3d..7895ff2 100644 --- a/agileboot-domain/src/main/java/com/agileboot/domain/ab98/user/query/SearchAb98UserWithWxQuery.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/ab98/user/query/SearchAb98UserWithWxQuery.java @@ -3,7 +3,12 @@ package com.agileboot.domain.ab98.user.query; import cn.hutool.core.util.StrUtil; import com.agileboot.common.core.page.AbstractPageQuery; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; + +import java.util.Collections; import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + import lombok.Data; import lombok.EqualsAndHashCode; @@ -21,7 +26,7 @@ public class SearchAb98UserWithWxQuery extends AbstractPageQuery { private Boolean registered; private Date startTime; private Date endTime; - private Long tagId; + private String tagIds; private String corpid; private String wxUserOpenid; private Boolean hasAb98UserId; @@ -32,17 +37,33 @@ public class SearchAb98UserWithWxQuery extends AbstractPageQuery { queryWrapper .eq(ab98UserId != null, "ab98_user_id", ab98UserId) - .eq(StrUtil.isNotEmpty(openid), "openid", openid) - .eq(StrUtil.isNotEmpty(userid), "userid", userid) - .like(StrUtil.isNotEmpty(name), "name", name) - .like(StrUtil.isNotEmpty(tel), "tel", tel) - .like(StrUtil.isNotEmpty(idnum), "idnum", idnum) - .eq(StrUtil.isNotEmpty(sex), "sex", sex) + .eq(StrUtil.isNotBlank(openid), "openid", openid) + .eq(StrUtil.isNotBlank(userid), "userid", userid) + .like(StrUtil.isNotBlank(name), "name", name) + .like(StrUtil.isNotBlank(tel), "tel", tel) + .like(StrUtil.isNotBlank(idnum), "idnum", idnum) + .eq(StrUtil.isNotBlank(sex), "sex", sex) .eq(registered != null, "registered", registered) - .eq(StrUtil.isNotEmpty(wxUserOpenid), "wx_user_openid", wxUserOpenid) - .eq(tagId != null, "tag_id", tagId) + .eq(StrUtil.isNotBlank(wxUserOpenid), "wx_user_openid", wxUserOpenid) + /* .in(StrUtil.isNotBlank(tagIds), "tag_id", StrUtil.split(tagIds, ",") + .stream().map(Long::valueOf).collect(Collectors.toList())) */ .between(startTime != null && endTime != null, "create_time", startTime, endTime); + // 修改标签查询逻辑,使用EXISTS代替IN + if (StrUtil.isNotBlank(tagIds)) { + + // 构建EXISTS子查询 + String existsSql = "EXISTS (SELECT 1 FROM membership_tag_member mtm " + + "WHERE (mtm.ab98_user_id = t.ab98_user_id " + + "OR mtm.wx_user_id = t.wx_user_id) " + + "AND mtm.deleted = 0 " + + "AND mtm.tag_id IN (" + + tagIds + + "))"; + + queryWrapper.apply(existsSql); + } + // 添加是否绑定ab98UserId的条件 if (hasAb98UserId != null) { if (hasAb98UserId) { diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/membership/tagmember/MembershipTagMemberApplicationService.java b/agileboot-domain/src/main/java/com/agileboot/domain/membership/tagmember/MembershipTagMemberApplicationService.java index f8e0405..5397e2e 100644 --- a/agileboot-domain/src/main/java/com/agileboot/domain/membership/tagmember/MembershipTagMemberApplicationService.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/membership/tagmember/MembershipTagMemberApplicationService.java @@ -53,7 +53,7 @@ public class MembershipTagMemberApplicationService { public void deleteTagMember(BulkOperationCommand command) { for (Long tagMemberId : command.getIds()) { MembershipTagMemberModel model = tagMemberModelFactory.loadById(tagMemberId); - model.deleteById(); + model.removeById(); } } diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/membership/tagmember/db/MembershipTagMemberEntity.java b/agileboot-domain/src/main/java/com/agileboot/domain/membership/tagmember/db/MembershipTagMemberEntity.java index 52a13f3..cc5e44a 100644 --- a/agileboot-domain/src/main/java/com/agileboot/domain/membership/tagmember/db/MembershipTagMemberEntity.java +++ b/agileboot-domain/src/main/java/com/agileboot/domain/membership/tagmember/db/MembershipTagMemberEntity.java @@ -4,6 +4,7 @@ import com.agileboot.common.core.base.BaseEntity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; import com.baomidou.mybatisplus.annotation.TableName; import java.io.Serializable; import io.swagger.annotations.ApiModel; @@ -31,6 +32,13 @@ public class MembershipTagMemberEntity extends BaseEntity