Browse Source

会员:
1.会员设置标签

owen 1 year ago
parent
commit
4f589cad53

+ 1 - 0
sql/mysql/member_tag.sql

@@ -12,6 +12,7 @@ create table member_tag
 )
     comment '会员标签';
 
+alter table member_user add column tag_ids varchar(255) null comment '用户标签编号列表,以逗号分隔';
 
 -- 菜单 SQL
 INSERT INTO system_menu(

+ 33 - 15
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/user/MemberUserController.java

@@ -1,23 +1,29 @@
 package cn.iocoder.yudao.module.member.controller.admin.user;
 
-import org.springframework.web.bind.annotation.*;
-import javax.annotation.Resource;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.security.access.prepost.PreAuthorize;
-import io.swagger.v3.oas.annotations.tags.Tag;
-import io.swagger.v3.oas.annotations.Parameter;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.member.controller.admin.user.vo.MemberUserPageReqVO;
+import cn.iocoder.yudao.module.member.controller.admin.user.vo.MemberUserRespVO;
+import cn.iocoder.yudao.module.member.controller.admin.user.vo.MemberUserUpdateReqVO;
+import cn.iocoder.yudao.module.member.convert.user.MemberUserConvert;
+import cn.iocoder.yudao.module.member.dal.dataobject.tag.MemberTagDO;
+import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
+import cn.iocoder.yudao.module.member.service.tag.MemberTagService;
+import cn.iocoder.yudao.module.member.service.user.MemberUserService;
 import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
 
-import javax.validation.*;
+import javax.annotation.Resource;
+import javax.validation.Valid;
+import java.util.*;
+import java.util.stream.Collectors;
 
-import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.framework.common.pojo.CommonResult;
 import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
-
-import cn.iocoder.yudao.module.member.controller.admin.user.vo.*;
-import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
-import cn.iocoder.yudao.module.member.convert.user.MemberUserConvert;
-import cn.iocoder.yudao.module.member.service.user.MemberUserService;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertMap;
 
 @Tag(name = "管理后台 - 会员用户")
 @RestController
@@ -27,6 +33,8 @@ public class MemberUserController {
 
     @Resource
     private MemberUserService memberUserService;
+    @Resource
+    private MemberTagService memberTagService;
 
     @PutMapping("/update")
     @Operation(summary = "更新会员用户")
@@ -50,7 +58,17 @@ public class MemberUserController {
     @PreAuthorize("@ss.hasPermission('member:user:query')")
     public CommonResult<PageResult<MemberUserRespVO>> getUserPage(@Valid MemberUserPageReqVO pageVO) {
         PageResult<MemberUserDO> pageResult = memberUserService.getUserPage(pageVO);
-        return success(MemberUserConvert.INSTANCE.convertPage(pageResult));
+
+        // 处理会员标签返显
+        Set<Long> tagIds = pageResult.getList().stream()
+                .map(MemberUserDO::getTagIds)
+                .filter(Objects::nonNull)
+                .flatMap(Collection::stream)
+                .collect(Collectors.toSet());
+        List<MemberTagDO> tags = memberTagService.getTagList(tagIds);
+        Map<Long, String> tagNameMap = convertMap(tags, MemberTagDO::getId, MemberTagDO::getName);
+
+        return success(MemberUserConvert.INSTANCE.convertPage(pageResult, tagNameMap));
     }
 
 }

+ 4 - 0
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/user/vo/MemberUserBaseVO.java

@@ -7,6 +7,7 @@ import org.springframework.format.annotation.DateTimeFormat;
 
 import javax.validation.constraints.NotNull;
 import java.time.LocalDateTime;
+import java.util.List;
 
 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY;
 
@@ -49,4 +50,7 @@ public class MemberUserBaseVO {
     @Schema(description = "会员备注", example = "我是小备注")
     private String mark;
 
+    @Schema(description = "会员标签")
+    private List<Long> tagIds;
+
 }

+ 4 - 0
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/user/vo/MemberUserPageReqVO.java

@@ -8,6 +8,7 @@ import lombok.ToString;
 import org.springframework.format.annotation.DateTimeFormat;
 
 import java.time.LocalDateTime;
+import java.util.List;
 
 import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
 
@@ -31,4 +32,7 @@ public class MemberUserPageReqVO extends PageParam {
     @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
     private LocalDateTime[] createTime;
 
+    @Schema(description = "会员标签")
+    private List<Long> tagIds;
+
 }

+ 6 - 0
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/user/vo/MemberUserRespVO.java

@@ -6,6 +6,7 @@ import lombok.EqualsAndHashCode;
 import lombok.ToString;
 
 import java.time.LocalDateTime;
+import java.util.List;
 
 @Schema(description = "管理后台 - 会员用户 Response VO")
 @Data
@@ -28,4 +29,9 @@ public class MemberUserRespVO extends MemberUserBaseVO {
     @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
     private LocalDateTime createTime;
 
+
+    // ========== 其它信息 ==========
+
+    @Schema(description = "会员标签")
+    private List<String> tagNames;
 }

+ 11 - 0
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/convert/user/MemberUserConvert.java

@@ -10,6 +10,9 @@ import org.mapstruct.Mapper;
 import org.mapstruct.factory.Mappers;
 
 import java.util.List;
+import java.util.Map;
+
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
 
 @Mapper
 public interface MemberUserConvert {
@@ -28,4 +31,12 @@ public interface MemberUserConvert {
 
     MemberUserRespVO convert03(MemberUserDO bean);
 
+    default PageResult<MemberUserRespVO> convertPage(PageResult<MemberUserDO> pageResult,
+                                                     Map<Long, String> tagMap) {
+        PageResult<MemberUserRespVO> result = convertPage(pageResult);
+        for (MemberUserRespVO vo : result.getList()) {
+            vo.setTagNames(convertList(vo.getTagIds(), tagMap::get));
+        }
+        return result;
+    }
 }

+ 9 - 1
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/user/MemberUserDO.java

@@ -2,15 +2,18 @@ package cn.iocoder.yudao.module.member.dal.dataobject.user;
 
 import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
 import cn.iocoder.yudao.framework.ip.core.Area;
+import cn.iocoder.yudao.framework.mybatis.core.type.LongListTypeHandler;
 import cn.iocoder.yudao.framework.tenant.core.db.TenantBaseDO;
 import cn.iocoder.yudao.module.system.enums.common.SexEnum;
 import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.*;
 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
 
 import java.time.LocalDateTime;
+import java.util.List;
 
 /**
  * 会员用户 DO
@@ -102,6 +105,11 @@ public class MemberUserDO extends TenantBaseDO {
 
     // ========== 其它信息 ==========
 
-    // TODO 积分、成长值、会员等级等等
+    /**
+     * 会员标签列表,以逗号分隔
+     */
+    @TableField(typeHandler = LongListTypeHandler.class)
+    private List<Long> tagIds;
 
+    // TODO 积分、成长值、会员等级等等
 }

+ 11 - 0
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/user/MemberUserMapper.java

@@ -1,5 +1,7 @@
 package cn.iocoder.yudao.module.member.dal.mysql.user;
 
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
 import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
@@ -8,6 +10,7 @@ import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
 import org.apache.ibatis.annotations.Mapper;
 
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * 会员 User Mapper
@@ -27,11 +30,19 @@ public interface MemberUserMapper extends BaseMapperX<MemberUserDO> {
     }
 
     default PageResult<MemberUserDO> selectPage(MemberUserPageReqVO reqVO) {
+        String tagIdSql = "";
+        if (CollUtil.isNotEmpty(reqVO.getTagIds())) {
+            tagIdSql = reqVO.getTagIds().stream()
+                    .map(tagId -> "FIND_IN_SET(" + tagId + ", tag_ids)")
+                    .collect(Collectors.joining(" OR "));
+        }
+
         return selectPage(reqVO, new LambdaQueryWrapperX<MemberUserDO>()
                 .likeIfPresent(MemberUserDO::getMobile, reqVO.getMobile())
                 .betweenIfPresent(MemberUserDO::getLoginDate, reqVO.getLoginDate())
                 .likeIfPresent(MemberUserDO::getNickname, reqVO.getNickname())
                 .betweenIfPresent(MemberUserDO::getCreateTime, reqVO.getCreateTime())
+                .apply(StrUtil.isNotEmpty(tagIdSql), tagIdSql)
                 .orderByDesc(MemberUserDO::getId));
     }
 

+ 5 - 0
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/tag/MemberTagServiceImpl.java

@@ -1,5 +1,7 @@
 package cn.iocoder.yudao.module.member.service.tag;
 
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.collection.ListUtil;
 import cn.iocoder.yudao.framework.common.pojo.PageResult;
 import cn.iocoder.yudao.module.member.controller.admin.tag.vo.MemberTagCreateReqVO;
 import cn.iocoder.yudao.module.member.controller.admin.tag.vo.MemberTagExportReqVO;
@@ -81,6 +83,9 @@ public class MemberTagServiceImpl implements MemberTagService {
 
     @Override
     public List<MemberTagDO> getTagList(Collection<Long> ids) {
+        if (CollUtil.isEmpty(ids)) {
+            return ListUtil.empty();
+        }
         return tagMapper.selectBatchIds(ids);
     }