Commit e2032e7e97f01f0085580f0d084017440e48037b

Authored by owen
1 parent 9eca965d

会员:增加会员等级增删改查

Showing 42 changed files with 1924 additions and 3 deletions
sql/mysql/member_level.sql 0 → 100644
  1 +-- 会员表增加字段
  2 +alter table member_user add column experience int not null default 0 comment '经验';
  3 +alter table member_user add column level_id bigint comment '等级编号';
  4 +
  5 +-- 增加3张表
  6 +create table member_level
  7 +(
  8 + id bigint auto_increment comment '编号' primary key,
  9 + name varchar(30) default '' not null comment '等级名称',
  10 + experience int default 0 not null comment '升级经验',
  11 + level int default 0 not null comment '等级',
  12 + discount int(4) default 100 not null comment '享受折扣',
  13 + icon varchar(255) default '' not null comment '等级图标',
  14 + background_url varchar(255) default '' not null comment '等级背景图',
  15 + status tinyint default 0 not null comment '状态',
  16 + creator varchar(64) default '' null comment '创建者',
  17 + create_time datetime default CURRENT_TIMESTAMP not null comment '创建时间',
  18 + updater varchar(64) default '' null comment '更新者',
  19 + update_time datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间',
  20 + deleted bit default b'0' not null comment '是否删除',
  21 + tenant_id bigint default 0 not null comment '租户编号'
  22 +)
  23 + comment '会员等级';
  24 +
  25 +create table member_level_log
  26 +(
  27 + id bigint auto_increment comment '编号' primary key,
  28 + user_id bigint default 0 not null comment '用户编号',
  29 + level_id bigint default 0 not null comment '等级编号',
  30 + level int default 0 not null comment '会员等级',
  31 + discount int(4) default 100 not null comment '享受折扣',
  32 + experience int(4) default 100 not null comment '升级经验',
  33 + user_experience int(4) default 100 not null comment '会员此时的经验',
  34 + remark varchar(255) default '' not null comment '备注',
  35 + description varchar(255) default '' not null comment '描述',
  36 + creator varchar(64) default '' null comment '创建者',
  37 + create_time datetime default CURRENT_TIMESTAMP not null comment '创建时间',
  38 + updater varchar(64) default '' null comment '更新者',
  39 + update_time datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间',
  40 + deleted bit default b'0' not null comment '是否删除',
  41 + tenant_id bigint default 0 not null comment '租户编号'
  42 +)
  43 + comment '会员等级记录';
  44 +
  45 +create index idx_user_id on member_level_log (user_id) comment '会员等级记录-用户编号';
  46 +
  47 +create table member_experience_log
  48 +(
  49 + id bigint auto_increment comment '编号' primary key,
  50 + user_id bigint default 0 not null comment '用户编号',
  51 + biz_id varchar(64) default '' not null comment '业务编号',
  52 + biz_type tinyint default 0 not null comment '业务类型',
  53 + title varchar(30) default '' not null comment '标题',
  54 + experience int default 0 not null comment '经验',
  55 + total_experience int default 0 not null comment '变更后的经验',
  56 + description varchar(512) default '' not null comment '描述',
  57 + creator varchar(64) default '' null comment '创建者',
  58 + create_time datetime default CURRENT_TIMESTAMP not null comment '创建时间',
  59 + updater varchar(64) default '' null comment '更新者',
  60 + update_time datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间',
  61 + deleted bit default b'0' not null comment '是否删除',
  62 + tenant_id bigint default 0 not null comment '租户编号'
  63 +)
  64 + comment '会员经验记录';
  65 +
  66 +create index idx_user_id on member_experience_log (user_id) comment '会员经验记录-用户编号';
  67 +create index idx_user_biz_type on member_experience_log (user_id, biz_type) comment '会员经验记录-用户业务类型';
  68 +
  69 +-- 增加字典
  70 +insert system_dict_type(name, type) values ('会员经验业务类型', 'member_experience_biz_type');
  71 +insert system_dict_data(dict_type, label, value, sort) values ('member_experience_biz_type', '系统', '0', 0);
  72 +insert system_dict_data(dict_type, label, value, sort) values ('member_experience_biz_type', '订单', '1', 1);
  73 +insert system_dict_data(dict_type, label, value, sort) values ('member_experience_biz_type', '签到', '2', 2);
  74 +
  75 +-- 菜单 SQL
  76 +INSERT INTO system_menu(
  77 + name, permission, type, sort, parent_id,
  78 + path, icon, component, status, component_name
  79 +)
  80 +VALUES (
  81 + '会员等级', '', 2, 3, 2262,
  82 + 'level', '', 'member/level/index', 0, 'MemberLevel'
  83 +);
  84 +
  85 +-- 按钮父菜单ID
  86 +-- 暂时只支持 MySQL。如果你是 Oracle、PostgreSQL、SQLServer 的话,需要手动修改 @parentId 的部分的代码
  87 +SELECT @parentId := LAST_INSERT_ID();
  88 +
  89 +-- 按钮 SQL
  90 +INSERT INTO system_menu(
  91 + name, permission, type, sort, parent_id,
  92 + path, icon, component, status
  93 +)
  94 +VALUES (
  95 + '会员等级查询', 'member:level:query', 3, 1, @parentId,
  96 + '', '', '', 0
  97 +);
  98 +INSERT INTO system_menu(
  99 + name, permission, type, sort, parent_id,
  100 + path, icon, component, status
  101 +)
  102 +VALUES (
  103 + '会员等级创建', 'member:level:create', 3, 2, @parentId,
  104 + '', '', '', 0
  105 +);
  106 +INSERT INTO system_menu(
  107 + name, permission, type, sort, parent_id,
  108 + path, icon, component, status
  109 +)
  110 +VALUES (
  111 + '会员等级更新', 'member:level:update', 3, 3, @parentId,
  112 + '', '', '', 0
  113 +);
  114 +INSERT INTO system_menu(
  115 + name, permission, type, sort, parent_id,
  116 + path, icon, component, status
  117 +)
  118 +VALUES (
  119 + '会员等级删除', 'member:level:delete', 3, 4, @parentId,
  120 + '', '', '', 0
  121 +);
... ...
yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/DictTypeConstants.java 0 → 100644
  1 +package cn.iocoder.yudao.module.member.enums;
  2 +
  3 +/**
  4 + * Member 字典类型的枚举类
  5 + *
  6 + * @author owen
  7 + */
  8 +public interface DictTypeConstants {
  9 +
  10 + /**
  11 + * 会员经验记录 - 业务类型
  12 + */
  13 + String MEMBER_EXPERIENCE_BIZ_TYPE = "member_experience_biz_type";
  14 +
  15 +}
... ...
yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/ErrorCodeConstants.java
... ... @@ -41,4 +41,9 @@ public interface ErrorCodeConstants {
41 41 ErrorCode TAG_NOT_EXISTS = new ErrorCode(1004006000, "会员标签不存在");
42 42 ErrorCode TAG_NAME_EXISTS = new ErrorCode(1004006001, "会员标签已经存在");
43 43  
  44 +
  45 + //========== 会员等级 1004007000 ==========
  46 + ErrorCode LEVEL_NOT_EXISTS = new ErrorCode(1004007000, "会员等级不存在");
  47 + ErrorCode LEVEL_LOG_NOT_EXISTS = new ErrorCode(1004007100, "会员等级记录不存在");
  48 + ErrorCode EXPERIENCE_LOG_NOT_EXISTS = new ErrorCode(1004007200, "会员经验记录不存在");
44 49 }
... ...
yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/MemberExperienceBizTypeEnum.java 0 → 100644
  1 +package cn.iocoder.yudao.module.member.enums;
  2 +
  3 +import lombok.AllArgsConstructor;
  4 +import lombok.Getter;
  5 +
  6 +/**
  7 + * 会员经验 - 业务类型
  8 + *
  9 + * @author owen
  10 + */
  11 +@Getter
  12 +@AllArgsConstructor
  13 +public enum MemberExperienceBizTypeEnum {
  14 + /**
  15 + *
  16 + */
  17 + SYSTEM(0, "系统"),
  18 + ORDER(1, "订单"),
  19 + SIGN_IN(2, "签到"),
  20 + ;
  21 +
  22 + private final int value;
  23 + private final String name;
  24 +}
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/MemberExperienceLogController.java 0 → 100644
  1 +package cn.iocoder.yudao.module.member.controller.admin.level;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  4 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  5 +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
  6 +import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
  7 +import cn.iocoder.yudao.module.member.controller.admin.level.vo.experience.MemberExperienceLogExcelVO;
  8 +import cn.iocoder.yudao.module.member.controller.admin.level.vo.experience.MemberExperienceLogExportReqVO;
  9 +import cn.iocoder.yudao.module.member.controller.admin.level.vo.experience.MemberExperienceLogPageReqVO;
  10 +import cn.iocoder.yudao.module.member.controller.admin.level.vo.experience.MemberExperienceLogRespVO;
  11 +import cn.iocoder.yudao.module.member.convert.level.MemberExperienceLogConvert;
  12 +import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberExperienceLogDO;
  13 +import cn.iocoder.yudao.module.member.service.level.MemberExperienceLogService;
  14 +import io.swagger.v3.oas.annotations.Operation;
  15 +import io.swagger.v3.oas.annotations.Parameter;
  16 +import io.swagger.v3.oas.annotations.tags.Tag;
  17 +import org.springframework.security.access.prepost.PreAuthorize;
  18 +import org.springframework.validation.annotation.Validated;
  19 +import org.springframework.web.bind.annotation.*;
  20 +
  21 +import javax.annotation.Resource;
  22 +import javax.servlet.http.HttpServletResponse;
  23 +import javax.validation.Valid;
  24 +import java.io.IOException;
  25 +import java.util.Collection;
  26 +import java.util.List;
  27 +
  28 +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  29 +import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
  30 +
  31 +/**
  32 + * @author owen
  33 + */
  34 +@Tag(name = "管理后台 - 会员经验记录")
  35 +@RestController
  36 +@RequestMapping("/member/experience-log")
  37 +@Validated
  38 +public class MemberExperienceLogController {
  39 +
  40 + @Resource
  41 + private MemberExperienceLogService experienceLogService;
  42 +
  43 + @DeleteMapping("/delete")
  44 + @Operation(summary = "删除会员经验记录")
  45 + @Parameter(name = "id", description = "编号", required = true)
  46 + @PreAuthorize("@ss.hasPermission('member:experience-log:delete')")
  47 + public CommonResult<Boolean> deleteExperienceLog(@RequestParam("id") Long id) {
  48 + experienceLogService.deleteExperienceLog(id);
  49 + return success(true);
  50 + }
  51 +
  52 + @GetMapping("/get")
  53 + @Operation(summary = "获得会员经验记录")
  54 + @Parameter(name = "id", description = "编号", required = true, example = "1024")
  55 + @PreAuthorize("@ss.hasPermission('member:experience-log:query')")
  56 + public CommonResult<MemberExperienceLogRespVO> getExperienceLog(@RequestParam("id") Long id) {
  57 + MemberExperienceLogDO experienceLog = experienceLogService.getExperienceLog(id);
  58 + return success(MemberExperienceLogConvert.INSTANCE.convert(experienceLog));
  59 + }
  60 +
  61 + @GetMapping("/list")
  62 + @Operation(summary = "获得会员经验记录列表")
  63 + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048")
  64 + @PreAuthorize("@ss.hasPermission('member:experience-log:query')")
  65 + public CommonResult<List<MemberExperienceLogRespVO>> getExperienceLogList(@RequestParam("ids") Collection<Long> ids) {
  66 + List<MemberExperienceLogDO> list = experienceLogService.getExperienceLogList(ids);
  67 + return success(MemberExperienceLogConvert.INSTANCE.convertList(list));
  68 + }
  69 +
  70 + @GetMapping("/page")
  71 + @Operation(summary = "获得会员经验记录分页")
  72 + @PreAuthorize("@ss.hasPermission('member:experience-log:query')")
  73 + public CommonResult<PageResult<MemberExperienceLogRespVO>> getExperienceLogPage(@Valid MemberExperienceLogPageReqVO pageVO) {
  74 + PageResult<MemberExperienceLogDO> pageResult = experienceLogService.getExperienceLogPage(pageVO);
  75 + return success(MemberExperienceLogConvert.INSTANCE.convertPage(pageResult));
  76 + }
  77 +
  78 + @GetMapping("/export-excel")
  79 + @Operation(summary = "导出会员经验记录 Excel")
  80 + @PreAuthorize("@ss.hasPermission('member:experience-log:export')")
  81 + @OperateLog(type = EXPORT)
  82 + public void exportExperienceLogExcel(@Valid MemberExperienceLogExportReqVO exportReqVO,
  83 + HttpServletResponse response) throws IOException {
  84 + List<MemberExperienceLogDO> list = experienceLogService.getExperienceLogList(exportReqVO);
  85 + // 导出 Excel
  86 + List<MemberExperienceLogExcelVO> datas = MemberExperienceLogConvert.INSTANCE.convertList02(list);
  87 + ExcelUtils.write(response, "会员经验记录.xls", "数据", MemberExperienceLogExcelVO.class, datas);
  88 + }
  89 +
  90 +}
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/MemberLevelController.java 0 → 100644
  1 +package cn.iocoder.yudao.module.member.controller.admin.level;
  2 +
  3 +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
  4 +import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  5 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  6 +import cn.iocoder.yudao.module.member.controller.admin.level.vo.*;
  7 +import cn.iocoder.yudao.module.member.convert.level.MemberLevelConvert;
  8 +import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelDO;
  9 +import cn.iocoder.yudao.module.member.service.level.MemberLevelService;
  10 +import io.swagger.v3.oas.annotations.Operation;
  11 +import io.swagger.v3.oas.annotations.Parameter;
  12 +import io.swagger.v3.oas.annotations.tags.Tag;
  13 +import org.springframework.security.access.prepost.PreAuthorize;
  14 +import org.springframework.validation.annotation.Validated;
  15 +import org.springframework.web.bind.annotation.*;
  16 +
  17 +import javax.annotation.Resource;
  18 +import javax.validation.Valid;
  19 +import java.util.Collection;
  20 +import java.util.List;
  21 +
  22 +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  23 +
  24 +/**
  25 + * @author owen
  26 + */
  27 +@Tag(name = "管理后台 - 会员等级")
  28 +@RestController
  29 +@RequestMapping("/member/level")
  30 +@Validated
  31 +public class MemberLevelController {
  32 +
  33 + @Resource
  34 + private MemberLevelService levelService;
  35 +
  36 + @PostMapping("/create")
  37 + @Operation(summary = "创建会员等级")
  38 + @PreAuthorize("@ss.hasPermission('member:level:create')")
  39 + public CommonResult<Long> createLevel(@Valid @RequestBody MemberLevelCreateReqVO createReqVO) {
  40 + return success(levelService.createLevel(createReqVO));
  41 + }
  42 +
  43 + @PutMapping("/update")
  44 + @Operation(summary = "更新会员等级")
  45 + @PreAuthorize("@ss.hasPermission('member:level:update')")
  46 + public CommonResult<Boolean> updateLevel(@Valid @RequestBody MemberLevelUpdateReqVO updateReqVO) {
  47 + levelService.updateLevel(updateReqVO);
  48 + return success(true);
  49 + }
  50 +
  51 + @DeleteMapping("/delete")
  52 + @Operation(summary = "删除会员等级")
  53 + @Parameter(name = "id", description = "编号", required = true)
  54 + @PreAuthorize("@ss.hasPermission('member:level:delete')")
  55 + public CommonResult<Boolean> deleteLevel(@RequestParam("id") Long id) {
  56 + levelService.deleteLevel(id);
  57 + return success(true);
  58 + }
  59 +
  60 + @GetMapping("/get")
  61 + @Operation(summary = "获得会员等级")
  62 + @Parameter(name = "id", description = "编号", required = true, example = "1024")
  63 + @PreAuthorize("@ss.hasPermission('member:level:query')")
  64 + public CommonResult<MemberLevelRespVO> getLevel(@RequestParam("id") Long id) {
  65 + MemberLevelDO level = levelService.getLevel(id);
  66 + return success(MemberLevelConvert.INSTANCE.convert(level));
  67 + }
  68 +
  69 + @GetMapping("/list")
  70 + @Operation(summary = "获得会员等级列表")
  71 + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048")
  72 + @PreAuthorize("@ss.hasPermission('member:level:query')")
  73 + public CommonResult<List<MemberLevelRespVO>> getLevelList(@RequestParam("ids") Collection<Long> ids) {
  74 + List<MemberLevelDO> list = levelService.getLevelList(ids);
  75 + return success(MemberLevelConvert.INSTANCE.convertList(list));
  76 + }
  77 +
  78 + @GetMapping("/list-all-simple")
  79 + @Operation(summary = "获取会员等级精简信息列表", description = "只包含被开启的会员等级,主要用于前端的下拉选项")
  80 + public CommonResult<List<MemberLevelSimpleRespVO>> getSimpleUserList() {
  81 + // 获用户列表,只要开启状态的
  82 + List<MemberLevelDO> list = levelService.getLevelListByStatus(CommonStatusEnum.ENABLE.getStatus());
  83 + // 排序后,返回给前端
  84 + return success(MemberLevelConvert.INSTANCE.convertSimpleList(list));
  85 + }
  86 +
  87 + @GetMapping("/page")
  88 + @Operation(summary = "获得会员等级分页")
  89 + @PreAuthorize("@ss.hasPermission('member:level:query')")
  90 + public CommonResult<PageResult<MemberLevelRespVO>> getLevelPage(@Valid MemberLevelPageReqVO pageVO) {
  91 + PageResult<MemberLevelDO> pageResult = levelService.getLevelPage(pageVO);
  92 + return success(MemberLevelConvert.INSTANCE.convertPage(pageResult));
  93 + }
  94 +
  95 +}
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/MemberLevelLogController.java 0 → 100644
  1 +package cn.iocoder.yudao.module.member.controller.admin.level;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.CommonResult;
  4 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  5 +import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
  6 +import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
  7 +import cn.iocoder.yudao.module.member.controller.admin.level.vo.log.MemberLevelLogExcelVO;
  8 +import cn.iocoder.yudao.module.member.controller.admin.level.vo.log.MemberLevelLogExportReqVO;
  9 +import cn.iocoder.yudao.module.member.controller.admin.level.vo.log.MemberLevelLogPageReqVO;
  10 +import cn.iocoder.yudao.module.member.controller.admin.level.vo.log.MemberLevelLogRespVO;
  11 +import cn.iocoder.yudao.module.member.convert.level.MemberLevelLogConvert;
  12 +import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelLogDO;
  13 +import cn.iocoder.yudao.module.member.service.level.MemberLevelLogService;
  14 +import io.swagger.v3.oas.annotations.Operation;
  15 +import io.swagger.v3.oas.annotations.Parameter;
  16 +import io.swagger.v3.oas.annotations.tags.Tag;
  17 +import org.springframework.security.access.prepost.PreAuthorize;
  18 +import org.springframework.validation.annotation.Validated;
  19 +import org.springframework.web.bind.annotation.*;
  20 +
  21 +import javax.annotation.Resource;
  22 +import javax.servlet.http.HttpServletResponse;
  23 +import javax.validation.Valid;
  24 +import java.io.IOException;
  25 +import java.util.Collection;
  26 +import java.util.List;
  27 +
  28 +import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
  29 +import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
  30 +
  31 +/**
  32 + * @author owen
  33 + */
  34 +@Tag(name = "管理后台 - 会员等级记录")
  35 +@RestController
  36 +@RequestMapping("/member/level-log")
  37 +@Validated
  38 +public class MemberLevelLogController {
  39 +
  40 + @Resource
  41 + private MemberLevelLogService levelLogService;
  42 +
  43 + @DeleteMapping("/delete")
  44 + @Operation(summary = "删除会员等级记录")
  45 + @Parameter(name = "id", description = "编号", required = true)
  46 + @PreAuthorize("@ss.hasPermission('member:level-log:delete')")
  47 + public CommonResult<Boolean> deleteLevelLog(@RequestParam("id") Long id) {
  48 + levelLogService.deleteLevelLog(id);
  49 + return success(true);
  50 + }
  51 +
  52 + @GetMapping("/get")
  53 + @Operation(summary = "获得会员等级记录")
  54 + @Parameter(name = "id", description = "编号", required = true, example = "1024")
  55 + @PreAuthorize("@ss.hasPermission('member:level-log:query')")
  56 + public CommonResult<MemberLevelLogRespVO> getLevelLog(@RequestParam("id") Long id) {
  57 + MemberLevelLogDO levelLog = levelLogService.getLevelLog(id);
  58 + return success(MemberLevelLogConvert.INSTANCE.convert(levelLog));
  59 + }
  60 +
  61 + @GetMapping("/list")
  62 + @Operation(summary = "获得会员等级记录列表")
  63 + @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048")
  64 + @PreAuthorize("@ss.hasPermission('member:level-log:query')")
  65 + public CommonResult<List<MemberLevelLogRespVO>> getLevelLogList(@RequestParam("ids") Collection<Long> ids) {
  66 + List<MemberLevelLogDO> list = levelLogService.getLevelLogList(ids);
  67 + return success(MemberLevelLogConvert.INSTANCE.convertList(list));
  68 + }
  69 +
  70 + @GetMapping("/page")
  71 + @Operation(summary = "获得会员等级记录分页")
  72 + @PreAuthorize("@ss.hasPermission('member:level-log:query')")
  73 + public CommonResult<PageResult<MemberLevelLogRespVO>> getLevelLogPage(@Valid MemberLevelLogPageReqVO pageVO) {
  74 + PageResult<MemberLevelLogDO> pageResult = levelLogService.getLevelLogPage(pageVO);
  75 + return success(MemberLevelLogConvert.INSTANCE.convertPage(pageResult));
  76 + }
  77 +
  78 + @GetMapping("/export-excel")
  79 + @Operation(summary = "导出会员等级记录 Excel")
  80 + @PreAuthorize("@ss.hasPermission('member:level-log:export')")
  81 + @OperateLog(type = EXPORT)
  82 + public void exportLevelLogExcel(@Valid MemberLevelLogExportReqVO exportReqVO,
  83 + HttpServletResponse response) throws IOException {
  84 + List<MemberLevelLogDO> list = levelLogService.getLevelLogList(exportReqVO);
  85 + // 导出 Excel
  86 + List<MemberLevelLogExcelVO> datas = MemberLevelLogConvert.INSTANCE.convertList02(list);
  87 + ExcelUtils.write(response, "会员等级记录.xls", "数据", MemberLevelLogExcelVO.class, datas);
  88 + }
  89 +
  90 +}
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/MemberLevelBaseVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.member.controller.admin.level.vo;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import lombok.Data;
  5 +import org.hibernate.validator.constraints.Range;
  6 +import org.hibernate.validator.constraints.URL;
  7 +
  8 +import javax.validation.constraints.NotBlank;
  9 +import javax.validation.constraints.NotNull;
  10 +import javax.validation.constraints.Positive;
  11 +
  12 +/**
  13 + * 会员等级 Base VO,提供给添加、修改、详细的子 VO 使用
  14 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
  15 + *
  16 + * @author owen
  17 + */
  18 +@Data
  19 +public class MemberLevelBaseVO {
  20 +
  21 + @Schema(description = "等级名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")
  22 + @NotBlank(message = "等级名称不能为空")
  23 + private String name;
  24 +
  25 + @Schema(description = "升级经验", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
  26 + @NotNull(message = "升级经验不能为空")
  27 + @Positive(message = "升级经验必须大于0")
  28 + private Integer experience;
  29 +
  30 + @Schema(description = "等级", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  31 + @NotNull(message = "等级不能为空")
  32 + private Integer level;
  33 +
  34 + @Schema(description = "享受折扣", requiredMode = Schema.RequiredMode.REQUIRED, example = "98")
  35 + @NotNull(message = "享受折扣不能为空")
  36 + @Range(min = 0, max = 100, message = "享受折扣的范围为0-100")
  37 + private Integer discount;
  38 +
  39 + @Schema(description = "等级图标", example = "https://www.iocoder.cn/yudao.jpg")
  40 + @URL(message = "等级图标 必须是 URL 格式")
  41 + private String icon;
  42 +
  43 + @Schema(description = "等级背景图", example = "https://www.iocoder.cn/yudao.jpg")
  44 + @URL(message = "等级背景图 必须是 URL 格式")
  45 + private String backgroundUrl;
  46 +
  47 + @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  48 + @NotNull(message = "状态不能为空")
  49 + private Integer status;
  50 +
  51 +}
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/MemberLevelCreateReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.member.controller.admin.level.vo;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import lombok.Data;
  5 +import lombok.EqualsAndHashCode;
  6 +import lombok.ToString;
  7 +
  8 +/**
  9 + * @author owen
  10 + */
  11 +@Schema(description = "管理后台 - 会员等级创建 Request VO")
  12 +@Data
  13 +@EqualsAndHashCode(callSuper = true)
  14 +@ToString(callSuper = true)
  15 +public class MemberLevelCreateReqVO extends MemberLevelBaseVO {
  16 +
  17 +}
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/MemberLevelPageReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.member.controller.admin.level.vo;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageParam;
  4 +import io.swagger.v3.oas.annotations.media.Schema;
  5 +import lombok.Data;
  6 +import lombok.EqualsAndHashCode;
  7 +import lombok.ToString;
  8 +
  9 +/**
  10 + * @author owen
  11 + */
  12 +@Schema(description = "管理后台 - 会员等级分页 Request VO")
  13 +@Data
  14 +@EqualsAndHashCode(callSuper = true)
  15 +@ToString(callSuper = true)
  16 +public class MemberLevelPageReqVO extends PageParam {
  17 +
  18 + @Schema(description = "等级名称", example = "芋艿")
  19 + private String name;
  20 +
  21 + @Schema(description = "状态", example = "1")
  22 + private Integer status;
  23 +
  24 +}
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/MemberLevelRespVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.member.controller.admin.level.vo;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import lombok.Data;
  5 +import lombok.EqualsAndHashCode;
  6 +import lombok.ToString;
  7 +
  8 +import java.time.LocalDateTime;
  9 +
  10 +/**
  11 + * @author owen
  12 + */
  13 +@Schema(description = "管理后台 - 会员等级 Response VO")
  14 +@Data
  15 +@EqualsAndHashCode(callSuper = true)
  16 +@ToString(callSuper = true)
  17 +public class MemberLevelRespVO extends MemberLevelBaseVO {
  18 +
  19 + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "6103")
  20 + private Long id;
  21 +
  22 + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
  23 + private LocalDateTime createTime;
  24 +
  25 +}
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/MemberLevelSimpleRespVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.member.controller.admin.level.vo;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import lombok.Data;
  5 +import lombok.EqualsAndHashCode;
  6 +import lombok.ToString;
  7 +
  8 +/**
  9 + * @author owen
  10 + */
  11 +@Schema(description = "管理后台 - 会员等级 Response VO")
  12 +@Data
  13 +@EqualsAndHashCode(callSuper = true)
  14 +@ToString(callSuper = true)
  15 +public class MemberLevelSimpleRespVO extends MemberLevelBaseVO {
  16 +
  17 + @Schema(description = "编号", example = "6103")
  18 + private Long id;
  19 +
  20 + @Schema(description = "等级名称", example = "芋艿")
  21 + private String name;
  22 +
  23 + @Schema(description = "等级图标", example = "https://www.iocoder.cn/yudao.jpg")
  24 + private String icon;
  25 +
  26 +}
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/MemberLevelUpdateReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.member.controller.admin.level.vo;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import lombok.Data;
  5 +import lombok.EqualsAndHashCode;
  6 +import lombok.ToString;
  7 +
  8 +import javax.validation.constraints.NotNull;
  9 +
  10 +/**
  11 + * @author owen
  12 + */
  13 +@Schema(description = "管理后台 - 会员等级更新 Request VO")
  14 +@Data
  15 +@EqualsAndHashCode(callSuper = true)
  16 +@ToString(callSuper = true)
  17 +public class MemberLevelUpdateReqVO extends MemberLevelBaseVO {
  18 +
  19 + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "6103")
  20 + @NotNull(message = "编号不能为空")
  21 + private Long id;
  22 +
  23 +}
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/experience/MemberExperienceLogBaseVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.member.controller.admin.level.vo.experience;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import lombok.Data;
  5 +
  6 +import javax.validation.constraints.NotNull;
  7 +
  8 +/**
  9 + * 会员经验记录 Base VO,提供给添加、修改、详细的子 VO 使用
  10 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
  11 + *
  12 + * @author owen
  13 + */
  14 +@Data
  15 +public class MemberExperienceLogBaseVO {
  16 +
  17 + @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "3638")
  18 + @NotNull(message = "用户编号不能为空")
  19 + private Long userId;
  20 +
  21 + @Schema(description = "业务编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "12164")
  22 + @NotNull(message = "业务编号不能为空")
  23 + private String bizId;
  24 +
  25 + @Schema(description = "业务类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
  26 + @NotNull(message = "业务类型不能为空")
  27 + private Integer bizType;
  28 +
  29 + @Schema(description = "标题", requiredMode = Schema.RequiredMode.REQUIRED, example = "增加经验")
  30 + @NotNull(message = "标题不能为空")
  31 + private String title;
  32 +
  33 + @Schema(description = "经验", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
  34 + @NotNull(message = "经验不能为空")
  35 + private Integer experience;
  36 +
  37 + @Schema(description = "变更后的经验", requiredMode = Schema.RequiredMode.REQUIRED, example = "200")
  38 + @NotNull(message = "变更后的经验不能为空")
  39 + private Integer totalExperience;
  40 +
  41 + @Schema(description = "描述", requiredMode = Schema.RequiredMode.REQUIRED, example = "下单增加100经验")
  42 + @NotNull(message = "描述不能为空")
  43 + private String description;
  44 +
  45 +}
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/experience/MemberExperienceLogExcelVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.member.controller.admin.level.vo.experience;
  2 +
  3 +import cn.iocoder.yudao.framework.excel.core.annotations.DictFormat;
  4 +import cn.iocoder.yudao.framework.excel.core.convert.DictConvert;
  5 +import cn.iocoder.yudao.module.member.enums.DictTypeConstants;
  6 +import com.alibaba.excel.annotation.ExcelProperty;
  7 +import lombok.Data;
  8 +
  9 +import java.time.LocalDateTime;
  10 +
  11 +
  12 +/**
  13 + * 会员经验记录 Excel VO
  14 + *
  15 + * @author owen
  16 + */
  17 +@Data
  18 +public class MemberExperienceLogExcelVO {
  19 +
  20 + @ExcelProperty("编号")
  21 + private Long id;
  22 +
  23 + @ExcelProperty("用户编号")
  24 + private Long userId;
  25 +
  26 + @ExcelProperty(value = "业务类型", converter = DictConvert.class)
  27 + @DictFormat(DictTypeConstants.MEMBER_EXPERIENCE_BIZ_TYPE)
  28 + private Integer bizType;
  29 +
  30 + @ExcelProperty("业务编号")
  31 + private String bizId;
  32 +
  33 + @ExcelProperty("标题")
  34 + private String title;
  35 +
  36 + @ExcelProperty("经验")
  37 + private Integer experience;
  38 +
  39 + @ExcelProperty("变更后的经验")
  40 + private Integer totalExperience;
  41 +
  42 + @ExcelProperty("描述")
  43 + private String description;
  44 +
  45 + @ExcelProperty("创建时间")
  46 + private LocalDateTime createTime;
  47 +
  48 +}
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/experience/MemberExperienceLogExportReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.member.controller.admin.level.vo.experience;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import lombok.Data;
  5 +import org.springframework.format.annotation.DateTimeFormat;
  6 +
  7 +import java.time.LocalDateTime;
  8 +
  9 +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
  10 +
  11 +/**
  12 + * @author owen
  13 + */
  14 +@Schema(description = "管理后台 - 会员经验记录 Excel 导出 Request VO,参数和 MemberExperienceLogPageReqVO 是一致的")
  15 +@Data
  16 +public class MemberExperienceLogExportReqVO {
  17 +
  18 + @Schema(description = "用户编号", example = "3638")
  19 + private Long userId;
  20 +
  21 + @Schema(description = "业务类型", example = "1")
  22 + private Integer bizType;
  23 +
  24 + @Schema(description = "业务编号", example = "12164")
  25 + private String bizId;
  26 +
  27 + @Schema(description = "标题", example = "增加经验")
  28 + private String title;
  29 +
  30 + @Schema(description = "创建时间")
  31 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  32 + private LocalDateTime[] createTime;
  33 +
  34 +}
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/experience/MemberExperienceLogPageReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.member.controller.admin.level.vo.experience;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageParam;
  4 +import io.swagger.v3.oas.annotations.media.Schema;
  5 +import lombok.Data;
  6 +import lombok.EqualsAndHashCode;
  7 +import lombok.ToString;
  8 +import org.springframework.format.annotation.DateTimeFormat;
  9 +
  10 +import java.time.LocalDateTime;
  11 +
  12 +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
  13 +
  14 +/**
  15 + * @author owen
  16 + */
  17 +@Schema(description = "管理后台 - 会员经验记录分页 Request VO")
  18 +@Data
  19 +@EqualsAndHashCode(callSuper = true)
  20 +@ToString(callSuper = true)
  21 +public class MemberExperienceLogPageReqVO extends PageParam {
  22 +
  23 + @Schema(description = "用户编号", example = "3638")
  24 + private Long userId;
  25 +
  26 + @Schema(description = "业务编号", example = "12164")
  27 + private String bizId;
  28 +
  29 + @Schema(description = "业务类型", example = "1")
  30 + private Integer bizType;
  31 +
  32 + @Schema(description = "标题", example = "增加经验")
  33 + private String title;
  34 +
  35 + @Schema(description = "创建时间")
  36 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  37 + private LocalDateTime[] createTime;
  38 +
  39 +}
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/experience/MemberExperienceLogRespVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.member.controller.admin.level.vo.experience;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import lombok.Data;
  5 +import lombok.EqualsAndHashCode;
  6 +import lombok.ToString;
  7 +
  8 +import java.time.LocalDateTime;
  9 +
  10 +/**
  11 + * @author owen
  12 + */
  13 +@Schema(description = "管理后台 - 会员经验记录 Response VO")
  14 +@Data
  15 +@EqualsAndHashCode(callSuper = true)
  16 +@ToString(callSuper = true)
  17 +public class MemberExperienceLogRespVO extends MemberExperienceLogBaseVO {
  18 +
  19 + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "19610")
  20 + private Long id;
  21 +
  22 + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
  23 + private LocalDateTime createTime;
  24 +
  25 +}
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/log/MemberLevelLogBaseVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.member.controller.admin.level.vo.log;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import lombok.Data;
  5 +
  6 +import javax.validation.constraints.NotNull;
  7 +
  8 +/**
  9 + * 会员等级记录 Base VO,提供给添加、修改、详细的子 VO 使用
  10 + * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
  11 + *
  12 + * @author owen
  13 + */
  14 +@Data
  15 +public class MemberLevelLogBaseVO {
  16 +
  17 + @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "25923")
  18 + @NotNull(message = "用户编号不能为空")
  19 + private Long userId;
  20 +
  21 + @Schema(description = "等级编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "25985")
  22 + @NotNull(message = "等级编号不能为空")
  23 + private Long levelId;
  24 +
  25 + @Schema(description = "会员等级", requiredMode = Schema.RequiredMode.REQUIRED)
  26 + @NotNull(message = "会员等级不能为空")
  27 + private Integer level;
  28 +
  29 + @Schema(description = "享受折扣", requiredMode = Schema.RequiredMode.REQUIRED, example = "13319")
  30 + @NotNull(message = "享受折扣不能为空")
  31 + private Integer discount;
  32 +
  33 + @Schema(description = "升级经验", requiredMode = Schema.RequiredMode.REQUIRED, example = "13319")
  34 + @NotNull(message = "升级经验不能为空")
  35 + private Integer experience;
  36 +
  37 + @Schema(description = "会员此时的经验", requiredMode = Schema.RequiredMode.REQUIRED, example = "13319")
  38 + @NotNull(message = "会员此时的经验不能为空")
  39 + private Integer userExperience;
  40 +
  41 + @Schema(description = "备注", requiredMode = Schema.RequiredMode.REQUIRED, example = "推广需要")
  42 + @NotNull(message = "备注不能为空")
  43 + private String remark;
  44 +
  45 + @Schema(description = "描述", requiredMode = Schema.RequiredMode.REQUIRED, example = "升级为金牌会员")
  46 + @NotNull(message = "描述不能为空")
  47 + private String description;
  48 +
  49 +}
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/log/MemberLevelLogExcelVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.member.controller.admin.level.vo.log;
  2 +
  3 +import com.alibaba.excel.annotation.ExcelProperty;
  4 +import lombok.Data;
  5 +
  6 +import java.time.LocalDateTime;
  7 +
  8 +/**
  9 + * 会员等级记录 Excel VO
  10 + *
  11 + * @author owen
  12 + */
  13 +@Data
  14 +public class MemberLevelLogExcelVO {
  15 +
  16 + @ExcelProperty("编号")
  17 + private Long id;
  18 +
  19 + @ExcelProperty("用户编号")
  20 + private Long userId;
  21 +
  22 + @ExcelProperty("等级编号")
  23 + private Long levelId;
  24 +
  25 + @ExcelProperty("会员等级")
  26 + private Integer level;
  27 +
  28 + @ExcelProperty("享受折扣")
  29 + private Integer discount;
  30 +
  31 + @ExcelProperty("升级经验")
  32 + private Integer experience;
  33 +
  34 + @ExcelProperty("会员此时的经验")
  35 + private Integer userExperience;
  36 +
  37 + @ExcelProperty("备注")
  38 + private String remark;
  39 +
  40 + @ExcelProperty("描述")
  41 + private String description;
  42 +
  43 + @ExcelProperty("创建时间")
  44 + private LocalDateTime createTime;
  45 +
  46 +}
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/log/MemberLevelLogExportReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.member.controller.admin.level.vo.log;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import lombok.Data;
  5 +import org.springframework.format.annotation.DateTimeFormat;
  6 +
  7 +import java.time.LocalDateTime;
  8 +
  9 +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
  10 +
  11 +/**
  12 + * @author owen
  13 + */
  14 +@Schema(description = "管理后台 - 会员等级记录 Excel 导出 Request VO,参数和 MemberLevelLogPageReqVO 是一致的")
  15 +@Data
  16 +public class MemberLevelLogExportReqVO {
  17 +
  18 + @Schema(description = "用户编号", example = "25923")
  19 + private Long userId;
  20 +
  21 + @Schema(description = "等级编号", example = "25985")
  22 + private Long levelId;
  23 +
  24 + @Schema(description = "创建时间")
  25 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  26 + private LocalDateTime[] createTime;
  27 +
  28 +}
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/log/MemberLevelLogPageReqVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.member.controller.admin.level.vo.log;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageParam;
  4 +import io.swagger.v3.oas.annotations.media.Schema;
  5 +import lombok.Data;
  6 +import lombok.EqualsAndHashCode;
  7 +import lombok.ToString;
  8 +import org.springframework.format.annotation.DateTimeFormat;
  9 +
  10 +import java.time.LocalDateTime;
  11 +
  12 +import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
  13 +
  14 +/**
  15 + * @author owen
  16 + */
  17 +@Schema(description = "管理后台 - 会员等级记录分页 Request VO")
  18 +@Data
  19 +@EqualsAndHashCode(callSuper = true)
  20 +@ToString(callSuper = true)
  21 +public class MemberLevelLogPageReqVO extends PageParam {
  22 +
  23 + @Schema(description = "用户编号", example = "25923")
  24 + private Long userId;
  25 +
  26 + @Schema(description = "等级编号", example = "25985")
  27 + private Long levelId;
  28 +
  29 + @Schema(description = "创建时间")
  30 + @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
  31 + private LocalDateTime[] createTime;
  32 +
  33 +}
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/log/MemberLevelLogRespVO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.member.controller.admin.level.vo.log;
  2 +
  3 +import io.swagger.v3.oas.annotations.media.Schema;
  4 +import lombok.Data;
  5 +import lombok.EqualsAndHashCode;
  6 +import lombok.ToString;
  7 +
  8 +import java.time.LocalDateTime;
  9 +
  10 +/**
  11 + * @author owen
  12 + */
  13 +@Schema(description = "管理后台 - 会员等级记录 Response VO")
  14 +@Data
  15 +@EqualsAndHashCode(callSuper = true)
  16 +@ToString(callSuper = true)
  17 +public class MemberLevelLogRespVO extends MemberLevelLogBaseVO {
  18 +
  19 + @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "8741")
  20 + private Long id;
  21 +
  22 + @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
  23 + private LocalDateTime createTime;
  24 +
  25 +}
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/convert/level/MemberExperienceLogConvert.java 0 → 100644
  1 +package cn.iocoder.yudao.module.member.convert.level;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.member.controller.admin.level.vo.experience.MemberExperienceLogExcelVO;
  5 +import cn.iocoder.yudao.module.member.controller.admin.level.vo.experience.MemberExperienceLogRespVO;
  6 +import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberExperienceLogDO;
  7 +import org.mapstruct.Mapper;
  8 +import org.mapstruct.factory.Mappers;
  9 +
  10 +import java.util.List;
  11 +
  12 +/**
  13 + * 会员经验记录 Convert
  14 + *
  15 + * @author owen
  16 + */
  17 +@Mapper
  18 +public interface MemberExperienceLogConvert {
  19 +
  20 + MemberExperienceLogConvert INSTANCE = Mappers.getMapper(MemberExperienceLogConvert.class);
  21 +
  22 + MemberExperienceLogRespVO convert(MemberExperienceLogDO bean);
  23 +
  24 + List<MemberExperienceLogRespVO> convertList(List<MemberExperienceLogDO> list);
  25 +
  26 + PageResult<MemberExperienceLogRespVO> convertPage(PageResult<MemberExperienceLogDO> page);
  27 +
  28 + List<MemberExperienceLogExcelVO> convertList02(List<MemberExperienceLogDO> list);
  29 +
  30 +}
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/convert/level/MemberLevelConvert.java 0 → 100644
  1 +package cn.iocoder.yudao.module.member.convert.level;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.member.controller.admin.level.vo.MemberLevelCreateReqVO;
  5 +import cn.iocoder.yudao.module.member.controller.admin.level.vo.MemberLevelRespVO;
  6 +import cn.iocoder.yudao.module.member.controller.admin.level.vo.MemberLevelSimpleRespVO;
  7 +import cn.iocoder.yudao.module.member.controller.admin.level.vo.MemberLevelUpdateReqVO;
  8 +import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelDO;
  9 +import org.mapstruct.Mapper;
  10 +import org.mapstruct.factory.Mappers;
  11 +
  12 +import java.util.List;
  13 +
  14 +/**
  15 + * 会员等级 Convert
  16 + *
  17 + * @author owen
  18 + */
  19 +@Mapper
  20 +public interface MemberLevelConvert {
  21 +
  22 + MemberLevelConvert INSTANCE = Mappers.getMapper(MemberLevelConvert.class);
  23 +
  24 + MemberLevelDO convert(MemberLevelCreateReqVO bean);
  25 +
  26 + MemberLevelDO convert(MemberLevelUpdateReqVO bean);
  27 +
  28 + MemberLevelRespVO convert(MemberLevelDO bean);
  29 +
  30 + List<MemberLevelRespVO> convertList(List<MemberLevelDO> list);
  31 +
  32 + PageResult<MemberLevelRespVO> convertPage(PageResult<MemberLevelDO> page);
  33 +
  34 + List<MemberLevelSimpleRespVO> convertSimpleList(List<MemberLevelDO> list);
  35 +}
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/convert/level/MemberLevelLogConvert.java 0 → 100644
  1 +package cn.iocoder.yudao.module.member.convert.level;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.member.controller.admin.level.vo.log.MemberLevelLogExcelVO;
  5 +import cn.iocoder.yudao.module.member.controller.admin.level.vo.log.MemberLevelLogRespVO;
  6 +import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelLogDO;
  7 +import org.mapstruct.Mapper;
  8 +import org.mapstruct.factory.Mappers;
  9 +
  10 +import java.util.List;
  11 +
  12 +/**
  13 + * 会员等级记录 Convert
  14 + *
  15 + * @author owen
  16 + */
  17 +@Mapper
  18 +public interface MemberLevelLogConvert {
  19 +
  20 + MemberLevelLogConvert INSTANCE = Mappers.getMapper(MemberLevelLogConvert.class);
  21 +
  22 + MemberLevelLogRespVO convert(MemberLevelLogDO bean);
  23 +
  24 + List<MemberLevelLogRespVO> convertList(List<MemberLevelLogDO> list);
  25 +
  26 + PageResult<MemberLevelLogRespVO> convertPage(PageResult<MemberLevelLogDO> page);
  27 +
  28 + List<MemberLevelLogExcelVO> convertList02(List<MemberLevelLogDO> list);
  29 +
  30 +}
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/level/MemberExperienceLogDO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.member.dal.dataobject.level;
  2 +
  3 +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
  4 +import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum;
  5 +import com.baomidou.mybatisplus.annotation.KeySequence;
  6 +import com.baomidou.mybatisplus.annotation.TableId;
  7 +import com.baomidou.mybatisplus.annotation.TableName;
  8 +import lombok.*;
  9 +
  10 +/**
  11 + * 会员经验记录 DO
  12 + *
  13 + * @author owen
  14 + */
  15 +@TableName("member_experience_log")
  16 +@KeySequence("member_experience_log_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
  17 +@Data
  18 +@EqualsAndHashCode(callSuper = true)
  19 +@ToString(callSuper = true)
  20 +@Builder
  21 +@NoArgsConstructor
  22 +@AllArgsConstructor
  23 +public class MemberExperienceLogDO extends BaseDO {
  24 +
  25 + /**
  26 + * 编号
  27 + */
  28 + @TableId
  29 + private Long id;
  30 + /**
  31 + * 用户编号
  32 + */
  33 + private Long userId;
  34 + /**
  35 + * 业务类型
  36 + * <p>
  37 + * 枚举 {@link MemberExperienceBizTypeEnum}
  38 + */
  39 + private Integer bizType;
  40 + /**
  41 + * 业务编号
  42 + */
  43 + private String bizId;
  44 + /**
  45 + * 标题
  46 + */
  47 + private String title;
  48 + /**
  49 + * 经验
  50 + */
  51 + private Integer experience;
  52 + /**
  53 + * 变更后的经验
  54 + */
  55 + private Integer totalExperience;
  56 + /**
  57 + * 描述
  58 + */
  59 + private String description;
  60 +
  61 +}
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/level/MemberLevelDO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.member.dal.dataobject.level;
  2 +
  3 +import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
  4 +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
  5 +import com.baomidou.mybatisplus.annotation.KeySequence;
  6 +import com.baomidou.mybatisplus.annotation.TableId;
  7 +import com.baomidou.mybatisplus.annotation.TableName;
  8 +import lombok.*;
  9 +
  10 +/**
  11 + * 会员等级 DO
  12 + *
  13 + * @author owen
  14 + */
  15 +@TableName("member_level")
  16 +@KeySequence("member_level_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
  17 +@Data
  18 +@EqualsAndHashCode(callSuper = true)
  19 +@ToString(callSuper = true)
  20 +@Builder
  21 +@NoArgsConstructor
  22 +@AllArgsConstructor
  23 +public class MemberLevelDO extends BaseDO {
  24 +
  25 + /**
  26 + * 编号
  27 + */
  28 + @TableId
  29 + private Long id;
  30 + /**
  31 + * 等级名称
  32 + */
  33 + private String name;
  34 + /**
  35 + * 升级经验
  36 + */
  37 + private Integer experience;
  38 + /**
  39 + * 等级
  40 + */
  41 + private Integer level;
  42 + /**
  43 + * 享受折扣
  44 + */
  45 + private Integer discount;
  46 + /**
  47 + * 等级图标
  48 + */
  49 + private String icon;
  50 + /**
  51 + * 等级背景图
  52 + */
  53 + private String backgroundUrl;
  54 + /**
  55 + * 状态
  56 + * <p>
  57 + * 枚举 {@link CommonStatusEnum}
  58 + */
  59 + private Integer status;
  60 +
  61 +}
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/level/MemberLevelLogDO.java 0 → 100644
  1 +package cn.iocoder.yudao.module.member.dal.dataobject.level;
  2 +
  3 +import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
  4 +import com.baomidou.mybatisplus.annotation.KeySequence;
  5 +import com.baomidou.mybatisplus.annotation.TableId;
  6 +import com.baomidou.mybatisplus.annotation.TableName;
  7 +import lombok.*;
  8 +
  9 +/**
  10 + * 会员等级记录 DO
  11 + *
  12 + * @author owen
  13 + */
  14 +@TableName("member_level_log")
  15 +@KeySequence("member_level_log_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
  16 +@Data
  17 +@EqualsAndHashCode(callSuper = true)
  18 +@ToString(callSuper = true)
  19 +@Builder
  20 +@NoArgsConstructor
  21 +@AllArgsConstructor
  22 +public class MemberLevelLogDO extends BaseDO {
  23 +
  24 + /**
  25 + * 编号
  26 + */
  27 + @TableId
  28 + private Long id;
  29 + /**
  30 + * 用户编号
  31 + */
  32 + private Long userId;
  33 + /**
  34 + * 等级编号
  35 + */
  36 + private Long levelId;
  37 + /**
  38 + * 会员等级
  39 + */
  40 + private Integer level;
  41 + /**
  42 + * 享受折扣
  43 + */
  44 + private Integer discount;
  45 + /**
  46 + * 升级经验
  47 + */
  48 + private Integer experience;
  49 + /**
  50 + * 会员此时的经验
  51 + */
  52 + private Integer userExperience;
  53 + /**
  54 + * 备注
  55 + */
  56 + private String remark;
  57 + /**
  58 + * 描述
  59 + */
  60 + private String description;
  61 +
  62 +}
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/user/MemberUserDO.java
... ... @@ -116,5 +116,14 @@ public class MemberUserDO extends TenantBaseDO {
116 116 @TableField(typeHandler = LongListTypeHandler.class)
117 117 private List<Long> tagIds;
118 118  
119   - // TODO 成长值、会员等级等等
  119 + /**
  120 + * 会员级别编号
  121 + */
  122 + private Long levelId;
  123 + /**
  124 + * 会员经验
  125 + */
  126 + private Integer experience;
  127 +
  128 + // TODO 积分等等
120 129 }
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/level/MemberExperienceLogMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.module.member.dal.mysql.level;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  5 +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
  6 +import cn.iocoder.yudao.module.member.controller.admin.level.vo.experience.MemberExperienceLogExportReqVO;
  7 +import cn.iocoder.yudao.module.member.controller.admin.level.vo.experience.MemberExperienceLogPageReqVO;
  8 +import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberExperienceLogDO;
  9 +import org.apache.ibatis.annotations.Mapper;
  10 +
  11 +import java.util.List;
  12 +
  13 +/**
  14 + * 会员经验记录 Mapper
  15 + *
  16 + * @author owen
  17 + */
  18 +@Mapper
  19 +public interface MemberExperienceLogMapper extends BaseMapperX<MemberExperienceLogDO> {
  20 +
  21 + default PageResult<MemberExperienceLogDO> selectPage(MemberExperienceLogPageReqVO reqVO) {
  22 + return selectPage(reqVO, new LambdaQueryWrapperX<MemberExperienceLogDO>()
  23 + .eqIfPresent(MemberExperienceLogDO::getUserId, reqVO.getUserId())
  24 + .eqIfPresent(MemberExperienceLogDO::getBizId, reqVO.getBizId())
  25 + .eqIfPresent(MemberExperienceLogDO::getBizType, reqVO.getBizType())
  26 + .eqIfPresent(MemberExperienceLogDO::getTitle, reqVO.getTitle())
  27 + .betweenIfPresent(MemberExperienceLogDO::getCreateTime, reqVO.getCreateTime())
  28 + .orderByDesc(MemberExperienceLogDO::getId));
  29 + }
  30 +
  31 + default List<MemberExperienceLogDO> selectList(MemberExperienceLogExportReqVO reqVO) {
  32 + return selectList(new LambdaQueryWrapperX<MemberExperienceLogDO>()
  33 + .eqIfPresent(MemberExperienceLogDO::getUserId, reqVO.getUserId())
  34 + .eqIfPresent(MemberExperienceLogDO::getBizId, reqVO.getBizId())
  35 + .eqIfPresent(MemberExperienceLogDO::getBizType, reqVO.getBizType())
  36 + .eqIfPresent(MemberExperienceLogDO::getTitle, reqVO.getTitle())
  37 + .betweenIfPresent(MemberExperienceLogDO::getCreateTime, reqVO.getCreateTime())
  38 + .orderByDesc(MemberExperienceLogDO::getId));
  39 + }
  40 +
  41 +}
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/level/MemberLevelLogMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.module.member.dal.mysql.level;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  5 +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
  6 +import cn.iocoder.yudao.module.member.controller.admin.level.vo.log.MemberLevelLogExportReqVO;
  7 +import cn.iocoder.yudao.module.member.controller.admin.level.vo.log.MemberLevelLogPageReqVO;
  8 +import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelLogDO;
  9 +import org.apache.ibatis.annotations.Mapper;
  10 +
  11 +import java.util.List;
  12 +
  13 +/**
  14 + * 会员等级记录 Mapper
  15 + *
  16 + * @author owen
  17 + */
  18 +@Mapper
  19 +public interface MemberLevelLogMapper extends BaseMapperX<MemberLevelLogDO> {
  20 +
  21 + default PageResult<MemberLevelLogDO> selectPage(MemberLevelLogPageReqVO reqVO) {
  22 + return selectPage(reqVO, new LambdaQueryWrapperX<MemberLevelLogDO>()
  23 + .eqIfPresent(MemberLevelLogDO::getUserId, reqVO.getUserId())
  24 + .eqIfPresent(MemberLevelLogDO::getLevelId, reqVO.getLevelId())
  25 + .betweenIfPresent(MemberLevelLogDO::getCreateTime, reqVO.getCreateTime())
  26 + .orderByDesc(MemberLevelLogDO::getId));
  27 + }
  28 +
  29 + default List<MemberLevelLogDO> selectList(MemberLevelLogExportReqVO reqVO) {
  30 + return selectList(new LambdaQueryWrapperX<MemberLevelLogDO>()
  31 + .eqIfPresent(MemberLevelLogDO::getUserId, reqVO.getUserId())
  32 + .eqIfPresent(MemberLevelLogDO::getLevelId, reqVO.getLevelId())
  33 + .betweenIfPresent(MemberLevelLogDO::getCreateTime, reqVO.getCreateTime())
  34 + .orderByDesc(MemberLevelLogDO::getId));
  35 + }
  36 +
  37 +}
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/level/MemberLevelMapper.java 0 → 100644
  1 +package cn.iocoder.yudao.module.member.dal.mysql.level;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
  5 +import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
  6 +import cn.iocoder.yudao.module.member.controller.admin.level.vo.MemberLevelPageReqVO;
  7 +import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelDO;
  8 +import org.apache.ibatis.annotations.Mapper;
  9 +
  10 +import java.util.List;
  11 +
  12 +/**
  13 + * 会员等级 Mapper
  14 + *
  15 + * @author owen
  16 + */
  17 +@Mapper
  18 +public interface MemberLevelMapper extends BaseMapperX<MemberLevelDO> {
  19 +
  20 + default PageResult<MemberLevelDO> selectPage(MemberLevelPageReqVO reqVO) {
  21 + return selectPage(reqVO, new LambdaQueryWrapperX<MemberLevelDO>()
  22 + .likeIfPresent(MemberLevelDO::getName, reqVO.getName())
  23 + .eqIfPresent(MemberLevelDO::getStatus, reqVO.getStatus())
  24 + .orderByAsc(MemberLevelDO::getLevel));
  25 + }
  26 +
  27 +
  28 + default List<MemberLevelDO> selectListByStatus(Integer status) {
  29 + return selectList(MemberLevelDO::getStatus, status);
  30 + }
  31 +}
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/level/MemberExperienceLogService.java 0 → 100644
  1 +package cn.iocoder.yudao.module.member.service.level;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.member.controller.admin.level.vo.experience.MemberExperienceLogExportReqVO;
  5 +import cn.iocoder.yudao.module.member.controller.admin.level.vo.experience.MemberExperienceLogPageReqVO;
  6 +import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberExperienceLogDO;
  7 +
  8 +import java.util.Collection;
  9 +import java.util.List;
  10 +
  11 +/**
  12 + * 会员经验记录 Service 接口
  13 + *
  14 + * @author owen
  15 + */
  16 +public interface MemberExperienceLogService {
  17 +
  18 + /**
  19 + * 删除会员经验记录
  20 + *
  21 + * @param id 编号
  22 + */
  23 + void deleteExperienceLog(Long id);
  24 +
  25 + /**
  26 + * 获得会员经验记录
  27 + *
  28 + * @param id 编号
  29 + * @return 会员经验记录
  30 + */
  31 + MemberExperienceLogDO getExperienceLog(Long id);
  32 +
  33 + /**
  34 + * 获得会员经验记录列表
  35 + *
  36 + * @param ids 编号
  37 + * @return 会员经验记录列表
  38 + */
  39 + List<MemberExperienceLogDO> getExperienceLogList(Collection<Long> ids);
  40 +
  41 + /**
  42 + * 获得会员经验记录分页
  43 + *
  44 + * @param pageReqVO 分页查询
  45 + * @return 会员经验记录分页
  46 + */
  47 + PageResult<MemberExperienceLogDO> getExperienceLogPage(MemberExperienceLogPageReqVO pageReqVO);
  48 +
  49 + /**
  50 + * 获得会员经验记录列表, 用于 Excel 导出
  51 + *
  52 + * @param exportReqVO 查询条件
  53 + * @return 会员经验记录列表
  54 + */
  55 + List<MemberExperienceLogDO> getExperienceLogList(MemberExperienceLogExportReqVO exportReqVO);
  56 +
  57 +}
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/level/MemberExperienceLogServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.module.member.service.level;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.member.controller.admin.level.vo.experience.MemberExperienceLogExportReqVO;
  5 +import cn.iocoder.yudao.module.member.controller.admin.level.vo.experience.MemberExperienceLogPageReqVO;
  6 +import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberExperienceLogDO;
  7 +import cn.iocoder.yudao.module.member.dal.mysql.level.MemberExperienceLogMapper;
  8 +import org.springframework.stereotype.Service;
  9 +import org.springframework.validation.annotation.Validated;
  10 +
  11 +import javax.annotation.Resource;
  12 +import java.util.Collection;
  13 +import java.util.List;
  14 +
  15 +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
  16 +import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.EXPERIENCE_LOG_NOT_EXISTS;
  17 +
  18 +/**
  19 + * 会员经验记录 Service 实现类
  20 + *
  21 + * @author owen
  22 + */
  23 +@Service
  24 +@Validated
  25 +public class MemberExperienceLogServiceImpl implements MemberExperienceLogService {
  26 +
  27 + @Resource
  28 + private MemberExperienceLogMapper experienceLogMapper;
  29 +
  30 + @Override
  31 + public void deleteExperienceLog(Long id) {
  32 + // 校验存在
  33 + validateExperienceLogExists(id);
  34 + // 删除
  35 + experienceLogMapper.deleteById(id);
  36 + }
  37 +
  38 + private void validateExperienceLogExists(Long id) {
  39 + if (experienceLogMapper.selectById(id) == null) {
  40 + throw exception(EXPERIENCE_LOG_NOT_EXISTS);
  41 + }
  42 + }
  43 +
  44 + @Override
  45 + public MemberExperienceLogDO getExperienceLog(Long id) {
  46 + return experienceLogMapper.selectById(id);
  47 + }
  48 +
  49 + @Override
  50 + public List<MemberExperienceLogDO> getExperienceLogList(Collection<Long> ids) {
  51 + return experienceLogMapper.selectBatchIds(ids);
  52 + }
  53 +
  54 + @Override
  55 + public PageResult<MemberExperienceLogDO> getExperienceLogPage(MemberExperienceLogPageReqVO pageReqVO) {
  56 + return experienceLogMapper.selectPage(pageReqVO);
  57 + }
  58 +
  59 + @Override
  60 + public List<MemberExperienceLogDO> getExperienceLogList(MemberExperienceLogExportReqVO exportReqVO) {
  61 + return experienceLogMapper.selectList(exportReqVO);
  62 + }
  63 +
  64 +}
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/level/MemberLevelLogService.java 0 → 100644
  1 +package cn.iocoder.yudao.module.member.service.level;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.member.controller.admin.level.vo.log.MemberLevelLogExportReqVO;
  5 +import cn.iocoder.yudao.module.member.controller.admin.level.vo.log.MemberLevelLogPageReqVO;
  6 +import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelLogDO;
  7 +
  8 +import java.util.Collection;
  9 +import java.util.List;
  10 +
  11 +/**
  12 + * 会员等级记录 Service 接口
  13 + *
  14 + * @author owen
  15 + */
  16 +public interface MemberLevelLogService {
  17 +
  18 + /**
  19 + * 删除会员等级记录
  20 + *
  21 + * @param id 编号
  22 + */
  23 + void deleteLevelLog(Long id);
  24 +
  25 + /**
  26 + * 获得会员等级记录
  27 + *
  28 + * @param id 编号
  29 + * @return 会员等级记录
  30 + */
  31 + MemberLevelLogDO getLevelLog(Long id);
  32 +
  33 + /**
  34 + * 获得会员等级记录列表
  35 + *
  36 + * @param ids 编号
  37 + * @return 会员等级记录列表
  38 + */
  39 + List<MemberLevelLogDO> getLevelLogList(Collection<Long> ids);
  40 +
  41 + /**
  42 + * 获得会员等级记录分页
  43 + *
  44 + * @param pageReqVO 分页查询
  45 + * @return 会员等级记录分页
  46 + */
  47 + PageResult<MemberLevelLogDO> getLevelLogPage(MemberLevelLogPageReqVO pageReqVO);
  48 +
  49 + /**
  50 + * 获得会员等级记录列表, 用于 Excel 导出
  51 + *
  52 + * @param exportReqVO 查询条件
  53 + * @return 会员等级记录列表
  54 + */
  55 + List<MemberLevelLogDO> getLevelLogList(MemberLevelLogExportReqVO exportReqVO);
  56 +
  57 +}
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/level/MemberLevelLogServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.module.member.service.level;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.member.controller.admin.level.vo.log.MemberLevelLogExportReqVO;
  5 +import cn.iocoder.yudao.module.member.controller.admin.level.vo.log.MemberLevelLogPageReqVO;
  6 +import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelLogDO;
  7 +import cn.iocoder.yudao.module.member.dal.mysql.level.MemberLevelLogMapper;
  8 +import org.springframework.stereotype.Service;
  9 +import org.springframework.validation.annotation.Validated;
  10 +
  11 +import javax.annotation.Resource;
  12 +import java.util.Collection;
  13 +import java.util.List;
  14 +
  15 +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
  16 +import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.LEVEL_LOG_NOT_EXISTS;
  17 +
  18 +/**
  19 + * 会员等级记录 Service 实现类
  20 + *
  21 + * @author owen
  22 + */
  23 +@Service
  24 +@Validated
  25 +public class MemberLevelLogServiceImpl implements MemberLevelLogService {
  26 +
  27 + @Resource
  28 + private MemberLevelLogMapper levelLogMapper;
  29 +
  30 + @Override
  31 + public void deleteLevelLog(Long id) {
  32 + // 校验存在
  33 + validateLevelLogExists(id);
  34 + // 删除
  35 + levelLogMapper.deleteById(id);
  36 + }
  37 +
  38 + private void validateLevelLogExists(Long id) {
  39 + if (levelLogMapper.selectById(id) == null) {
  40 + throw exception(LEVEL_LOG_NOT_EXISTS);
  41 + }
  42 + }
  43 +
  44 + @Override
  45 + public MemberLevelLogDO getLevelLog(Long id) {
  46 + return levelLogMapper.selectById(id);
  47 + }
  48 +
  49 + @Override
  50 + public List<MemberLevelLogDO> getLevelLogList(Collection<Long> ids) {
  51 + return levelLogMapper.selectBatchIds(ids);
  52 + }
  53 +
  54 + @Override
  55 + public PageResult<MemberLevelLogDO> getLevelLogPage(MemberLevelLogPageReqVO pageReqVO) {
  56 + return levelLogMapper.selectPage(pageReqVO);
  57 + }
  58 +
  59 + @Override
  60 + public List<MemberLevelLogDO> getLevelLogList(MemberLevelLogExportReqVO exportReqVO) {
  61 + return levelLogMapper.selectList(exportReqVO);
  62 + }
  63 +
  64 +}
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/level/MemberLevelService.java 0 → 100644
  1 +package cn.iocoder.yudao.module.member.service.level;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.member.controller.admin.level.vo.MemberLevelCreateReqVO;
  5 +import cn.iocoder.yudao.module.member.controller.admin.level.vo.MemberLevelPageReqVO;
  6 +import cn.iocoder.yudao.module.member.controller.admin.level.vo.MemberLevelUpdateReqVO;
  7 +import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelDO;
  8 +
  9 +import javax.validation.Valid;
  10 +import java.util.Collection;
  11 +import java.util.List;
  12 +
  13 +/**
  14 + * 会员等级 Service 接口
  15 + *
  16 + * @author owen
  17 + */
  18 +public interface MemberLevelService {
  19 +
  20 + /**
  21 + * 创建会员等级
  22 + *
  23 + * @param createReqVO 创建信息
  24 + * @return 编号
  25 + */
  26 + Long createLevel(@Valid MemberLevelCreateReqVO createReqVO);
  27 +
  28 + /**
  29 + * 更新会员等级
  30 + *
  31 + * @param updateReqVO 更新信息
  32 + */
  33 + void updateLevel(@Valid MemberLevelUpdateReqVO updateReqVO);
  34 +
  35 + /**
  36 + * 删除会员等级
  37 + *
  38 + * @param id 编号
  39 + */
  40 + void deleteLevel(Long id);
  41 +
  42 + /**
  43 + * 获得会员等级
  44 + *
  45 + * @param id 编号
  46 + * @return 会员等级
  47 + */
  48 + MemberLevelDO getLevel(Long id);
  49 +
  50 + /**
  51 + * 获得会员等级列表
  52 + *
  53 + * @param ids 编号
  54 + * @return 会员等级列表
  55 + */
  56 + List<MemberLevelDO> getLevelList(Collection<Long> ids);
  57 +
  58 + /**
  59 + * 获得会员等级分页
  60 + *
  61 + * @param pageReqVO 分页查询
  62 + * @return 会员等级分页
  63 + */
  64 + PageResult<MemberLevelDO> getLevelPage(MemberLevelPageReqVO pageReqVO);
  65 +
  66 +
  67 + /**
  68 + * 获得指定状态的会员等级列表
  69 + *
  70 + * @param status 状态
  71 + * @return 会员等级列表
  72 + */
  73 + List<MemberLevelDO> getLevelListByStatus(Integer status);
  74 +}
... ...
yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/level/MemberLevelServiceImpl.java 0 → 100644
  1 +package cn.iocoder.yudao.module.member.service.level;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.module.member.controller.admin.level.vo.MemberLevelCreateReqVO;
  5 +import cn.iocoder.yudao.module.member.controller.admin.level.vo.MemberLevelPageReqVO;
  6 +import cn.iocoder.yudao.module.member.controller.admin.level.vo.MemberLevelUpdateReqVO;
  7 +import cn.iocoder.yudao.module.member.convert.level.MemberLevelConvert;
  8 +import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelDO;
  9 +import cn.iocoder.yudao.module.member.dal.mysql.level.MemberLevelMapper;
  10 +import lombok.extern.slf4j.Slf4j;
  11 +import org.springframework.stereotype.Service;
  12 +import org.springframework.validation.annotation.Validated;
  13 +
  14 +import javax.annotation.Resource;
  15 +import java.util.Collection;
  16 +import java.util.List;
  17 +
  18 +import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
  19 +import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.LEVEL_NOT_EXISTS;
  20 +
  21 +/**
  22 + * 会员等级 Service 实现类
  23 + *
  24 + * @author owen
  25 + */
  26 +@Slf4j
  27 +@Service
  28 +@Validated
  29 +public class MemberLevelServiceImpl implements MemberLevelService {
  30 +
  31 + @Resource
  32 + private MemberLevelMapper levelMapper;
  33 +
  34 + @Override
  35 + public Long createLevel(MemberLevelCreateReqVO createReqVO) {
  36 + // 插入
  37 + MemberLevelDO level = MemberLevelConvert.INSTANCE.convert(createReqVO);
  38 + levelMapper.insert(level);
  39 + // 返回
  40 + return level.getId();
  41 + }
  42 +
  43 + @Override
  44 + public void updateLevel(MemberLevelUpdateReqVO updateReqVO) {
  45 + // 校验存在
  46 + validateLevelExists(updateReqVO.getId());
  47 + // 更新
  48 + MemberLevelDO updateObj = MemberLevelConvert.INSTANCE.convert(updateReqVO);
  49 + levelMapper.updateById(updateObj);
  50 + }
  51 +
  52 + @Override
  53 + public void deleteLevel(Long id) {
  54 + // 校验存在
  55 + validateLevelExists(id);
  56 + // 删除
  57 + levelMapper.deleteById(id);
  58 + }
  59 +
  60 + private void validateLevelExists(Long id) {
  61 + if (levelMapper.selectById(id) == null) {
  62 + throw exception(LEVEL_NOT_EXISTS);
  63 + }
  64 + }
  65 +
  66 + @Override
  67 + public MemberLevelDO getLevel(Long id) {
  68 + return levelMapper.selectById(id);
  69 + }
  70 +
  71 + @Override
  72 + public List<MemberLevelDO> getLevelList(Collection<Long> ids) {
  73 + return levelMapper.selectBatchIds(ids);
  74 + }
  75 +
  76 + @Override
  77 + public PageResult<MemberLevelDO> getLevelPage(MemberLevelPageReqVO pageReqVO) {
  78 + return levelMapper.selectPage(pageReqVO);
  79 + }
  80 +
  81 + @Override
  82 + public List<MemberLevelDO> getLevelListByStatus(Integer status) {
  83 + return levelMapper.selectListByStatus(status);
  84 + }
  85 +}
... ...
yudao-module-member/yudao-module-member-biz/src/test/java/cn/iocoder/yudao/module/member/service/level/MemberLevelServiceImplTest.java 0 → 100644
  1 +package cn.iocoder.yudao.module.member.service.level;
  2 +
  3 +import cn.iocoder.yudao.framework.common.pojo.PageResult;
  4 +import cn.iocoder.yudao.framework.test.core.ut.BaseDbUnitTest;
  5 +import cn.iocoder.yudao.module.member.controller.admin.level.vo.MemberLevelCreateReqVO;
  6 +import cn.iocoder.yudao.module.member.controller.admin.level.vo.MemberLevelPageReqVO;
  7 +import cn.iocoder.yudao.module.member.controller.admin.level.vo.MemberLevelUpdateReqVO;
  8 +import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelDO;
  9 +import cn.iocoder.yudao.module.member.dal.mysql.level.MemberLevelMapper;
  10 +import org.junit.jupiter.api.Test;
  11 +import org.springframework.context.annotation.Import;
  12 +
  13 +import javax.annotation.Resource;
  14 +
  15 +import static cn.iocoder.yudao.framework.common.util.object.ObjectUtils.cloneIgnoreId;
  16 +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
  17 +import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertServiceException;
  18 +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId;
  19 +import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
  20 +import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.LEVEL_NOT_EXISTS;
  21 +import static org.junit.jupiter.api.Assertions.*;
  22 +
  23 +/**
  24 + * {@link MemberLevelServiceImpl} 的单元测试类
  25 + *
  26 + * @author owen
  27 + */
  28 +@Import(MemberLevelServiceImpl.class)
  29 +public class MemberLevelServiceImplTest extends BaseDbUnitTest {
  30 +
  31 + @Resource
  32 + private MemberLevelServiceImpl levelService;
  33 +
  34 + @Resource
  35 + private MemberLevelMapper levelMapper;
  36 +
  37 + @Test
  38 + public void testCreateLevel_success() {
  39 + // 准备参数
  40 + MemberLevelCreateReqVO reqVO = randomPojo(MemberLevelCreateReqVO.class);
  41 +
  42 + // 调用
  43 + Long levelId = levelService.createLevel(reqVO);
  44 + // 断言
  45 + assertNotNull(levelId);
  46 + // 校验记录的属性是否正确
  47 + MemberLevelDO level = levelMapper.selectById(levelId);
  48 + assertPojoEquals(reqVO, level);
  49 + }
  50 +
  51 + @Test
  52 + public void testUpdateLevel_success() {
  53 + // mock 数据
  54 + MemberLevelDO dbLevel = randomPojo(MemberLevelDO.class);
  55 + levelMapper.insert(dbLevel);// @Sql: 先插入出一条存在的数据
  56 + // 准备参数
  57 + MemberLevelUpdateReqVO reqVO = randomPojo(MemberLevelUpdateReqVO.class, o -> {
  58 + o.setId(dbLevel.getId()); // 设置更新的 ID
  59 + });
  60 +
  61 + // 调用
  62 + levelService.updateLevel(reqVO);
  63 + // 校验是否更新正确
  64 + MemberLevelDO level = levelMapper.selectById(reqVO.getId()); // 获取最新的
  65 + assertPojoEquals(reqVO, level);
  66 + }
  67 +
  68 + @Test
  69 + public void testUpdateLevel_notExists() {
  70 + // 准备参数
  71 + MemberLevelUpdateReqVO reqVO = randomPojo(MemberLevelUpdateReqVO.class);
  72 +
  73 + // 调用, 并断言异常
  74 + assertServiceException(() -> levelService.updateLevel(reqVO), LEVEL_NOT_EXISTS);
  75 + }
  76 +
  77 + @Test
  78 + public void testDeleteLevel_success() {
  79 + // mock 数据
  80 + MemberLevelDO dbLevel = randomPojo(MemberLevelDO.class);
  81 + levelMapper.insert(dbLevel);// @Sql: 先插入出一条存在的数据
  82 + // 准备参数
  83 + Long id = dbLevel.getId();
  84 +
  85 + // 调用
  86 + levelService.deleteLevel(id);
  87 + // 校验数据不存在了
  88 + assertNull(levelMapper.selectById(id));
  89 + }
  90 +
  91 + @Test
  92 + public void testDeleteLevel_notExists() {
  93 + // 准备参数
  94 + Long id = randomLongId();
  95 +
  96 + // 调用, 并断言异常
  97 + assertServiceException(() -> levelService.deleteLevel(id), LEVEL_NOT_EXISTS);
  98 + }
  99 +
  100 + @Test
  101 + public void testGetLevelPage() {
  102 + // mock 数据
  103 + MemberLevelDO dbLevel = randomPojo(MemberLevelDO.class, o -> { // 等会查询到
  104 + o.setName("黄金会员");
  105 + o.setStatus(1);
  106 + });
  107 + levelMapper.insert(dbLevel);
  108 + // 测试 name 不匹配
  109 + levelMapper.insert(cloneIgnoreId(dbLevel, o -> o.setName(null)));
  110 + // 测试 status 不匹配
  111 + levelMapper.insert(cloneIgnoreId(dbLevel, o -> o.setStatus(null)));
  112 + // 准备参数
  113 + MemberLevelPageReqVO reqVO = new MemberLevelPageReqVO();
  114 + reqVO.setName("黄金会员");
  115 + reqVO.setStatus(1);
  116 +
  117 + // 调用
  118 + PageResult<MemberLevelDO> pageResult = levelService.getLevelPage(reqVO);
  119 + // 断言
  120 + assertEquals(1, pageResult.getTotal());
  121 + assertEquals(1, pageResult.getList().size());
  122 + assertPojoEquals(dbLevel, pageResult.getList().get(0));
  123 + }
  124 +
  125 +}
... ...
yudao-module-member/yudao-module-member-biz/src/test/resources/sql/clean.sql
1 1 DELETE FROM "member_user";
2 2 DELETE FROM "member_address";
3   -DELETE FROM "member_tag";
4 3 \ No newline at end of file
  4 +DELETE FROM "member_tag";
  5 +DELETE FROM "member_level";
5 6 \ No newline at end of file
... ...
yudao-module-member/yudao-module-member-biz/src/test/resources/sql/create_tables.sql
... ... @@ -44,4 +44,23 @@ CREATE TABLE IF NOT EXISTS &quot;member_tag&quot;
44 44 "deleted" bit NOT NULL DEFAULT FALSE,
45 45 "tenant_id" bigint NOT NULL default '0',
46 46 PRIMARY KEY ("id")
47   -) COMMENT '会员标签';
48 47 \ No newline at end of file
  48 +) COMMENT '会员标签';
  49 +
  50 +CREATE TABLE IF NOT EXISTS "member_level"
  51 +(
  52 + "id" bigint NOT NULL GENERATED BY DEFAULT AS IDENTITY,
  53 + "name" varchar NOT NULL,
  54 + "experience" int NOT NULL,
  55 + "value" int NOT NULL,
  56 + "discount" int NOT NULL,
  57 + "icon" varchar NOT NULL,
  58 + "bg_url" varchar NOT NULL,
  59 + "creator" varchar DEFAULT '',
  60 + "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  61 + "updater" varchar DEFAULT '',
  62 + "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  63 + "deleted" bit NOT NULL DEFAULT FALSE,
  64 + "tenant_id" bigint not null default '0',
  65 + "status" int NOT NULL,
  66 + PRIMARY KEY ("id")
  67 +) COMMENT '会员等级';
49 68 \ No newline at end of file
... ...