validateOrderPayable(Long id, Long payOrderId) {
// 校验订单是否存在
- TradeOrderDO order = tradeOrderMapper.selectById(id);
- if (order == null) {
- throw exception(ORDER_NOT_FOUND);
- }
+ TradeOrderDO order = validateOrderExists(id);
// 校验订单未支付
if (!TradeOrderStatusEnum.isUnpaid(order.getStatus()) || order.getPayStatus()) {
log.error("[validateOrderPaid][order({}) 不处于待支付状态,请进行处理!order 数据是:{}]",
@@ -391,14 +410,16 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
@Override
@Transactional(rollbackFor = Exception.class)
- public void deliveryOrder(Long userId, TradeOrderDeliveryReqVO deliveryReqVO) {
+ public void deliveryOrder(TradeOrderDeliveryReqVO deliveryReqVO) {
// TODO @puhui999:只有选择快递的,才可以发货
// 1.1 校验并获得交易订单(可发货)
TradeOrderDO order = validateOrderDeliverable(deliveryReqVO.getId());
- TradeOrderDO updateOrderObj = new TradeOrderDO();
+
+ // TODO @puhui999:下面不修改 deliveryType,直接校验 deliveryType 是否为快递,是快递才可以发货;先做严格的方式哈。
// 判断发货类型
+ TradeOrderDO updateOrderObj = new TradeOrderDO();
// 2.1 快递发货
- if (Objects.equals(deliveryReqVO.getType(), DeliveryTypeEnum.EXPRESS.getMode())) {
+ if (ObjectUtil.notEqual(deliveryReqVO.getLogisticsId(), 0L)) {
// 校验快递公司
DeliveryExpressDO deliveryExpress = deliveryExpressService.getDeliveryExpress(deliveryReqVO.getLogisticsId());
if (deliveryExpress == null) {
@@ -408,27 +429,24 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
throw exception(EXPRESS_STATUS_NOT_ENABLE);
}
updateOrderObj.setLogisticsId(deliveryReqVO.getLogisticsId()).setLogisticsNo(deliveryReqVO.getLogisticsNo()).setDeliveryType(DeliveryTypeEnum.EXPRESS.getMode());
+ } else {
+ // 2.2 无需发货
+ updateOrderObj.setLogisticsId(0L).setLogisticsNo("").setDeliveryType(DeliveryTypeEnum.NULL.getMode());
}
- // TODO @puhui999:无需发货时,更新 logisticsId 为 0;
- // 2.2 无需发货
- if (Objects.equals(deliveryReqVO.getType(), DeliveryTypeEnum.NULL.getMode())) {
- updateOrderObj.setLogisticsId(null).setLogisticsNo("").setDeliveryType(DeliveryTypeEnum.NULL.getMode());
- }
-
// 更新 TradeOrderDO 状态为已发货,等待收货
updateOrderObj.setStatus(TradeOrderStatusEnum.DELIVERED.getStatus()).setDeliveryTime(LocalDateTime.now());
int updateCount = tradeOrderMapper.updateByIdAndStatus(order.getId(), order.getStatus(), updateOrderObj);
if (updateCount == 0) {
throw exception(ORDER_DELIVERY_FAIL_STATUS_NOT_UNDELIVERED);
}
+
// TODO 芋艿:发送订单变化的消息
// 发送站内信
tradeMessageService.sendMessageWhenDeliveryOrder(new TradeOrderMessageWhenDeliveryOrderReqBO().setOrderId(order.getId())
- .setUserId(userId).setMessage(null));
+ .setUserId(order.getUserId()).setMessage(null));
// TODO 芋艿:OrderLog
- // TODO 设计:lili:是不是发货后,才支持售后?
}
/**
@@ -440,12 +458,9 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
* @return 交易订单
*/
private TradeOrderDO validateOrderDeliverable(Long id) {
- // 校验订单是否存在
- TradeOrderDO order = tradeOrderMapper.selectById(id);
- if (order == null) {
- throw exception(ORDER_NOT_FOUND);
- }
+ TradeOrderDO order = validateOrderExists(id);
// 校验订单是否是待发货状态
+ // TODO @puhui999:已经发货,可以重新发货,修改信息;
if (!TradeOrderStatusEnum.isUndelivered(order.getStatus())) {
throw exception(ORDER_DELIVERY_FAIL_STATUS_NOT_UNDELIVERED);
}
@@ -456,6 +471,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
// 订单类型:拼团
if (Objects.equals(TradeOrderTypeEnum.COMBINATION.getType(), order.getType())) {
// 校验订单拼团是否成功
+ // TODO @puhui999:是不是取反?
if (combinationRecordApi.isCombinationRecordSuccess(order.getUserId(), order.getId())) {
throw exception(ORDER_DELIVERY_FAIL_COMBINATION_RECORD_STATUS_NOT_SUCCESS);
}
@@ -463,6 +479,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
// 订单类类型:砍价
if (Objects.equals(TradeOrderTypeEnum.BARGAIN.getType(), order.getType())) {
// 校验订单砍价是否成功
+ // TODO @puhui999:是不是取反?
if (bargainRecordApi.isBargainRecordSuccess(order.getUserId(), order.getId())) {
throw exception(ORDER_DELIVERY_FAIL_BARGAIN_RECORD_STATUS_NOT_SUCCESS);
}
@@ -470,6 +487,16 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
return order;
}
+ @NotNull
+ private TradeOrderDO validateOrderExists(Long id) {
+ // 校验订单是否存在
+ TradeOrderDO order = tradeOrderMapper.selectById(id);
+ if (order == null) {
+ throw exception(ORDER_NOT_FOUND);
+ }
+ return order;
+ }
+
@Override
@Transactional(rollbackFor = Exception.class)
public void receiveOrder(Long userId, Long id) {
@@ -489,6 +516,43 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
// TODO 芋艿:lili 发送商品被购买完成的数据
}
+ @Override
+ public void updateOrderRemark(TradeOrderRemarkReqVO reqVO) {
+ // 校验并获得交易订单
+ validateOrderExists(reqVO.getId());
+
+ // 更新
+ TradeOrderDO order = TradeOrderConvert.INSTANCE.convert(reqVO);
+ tradeOrderMapper.updateById(order);
+ }
+
+ @Override
+ public void updateOrderPrice(TradeOrderUpdatePriceReqVO reqVO) {
+ // 校验交易订单
+ TradeOrderDO order = validateOrderExists(reqVO.getId());
+ if (order.getPayStatus()) {
+ throw exception(ORDER_UPDATE_PRICE_FAIL_PAID);
+ }
+
+ // 更新
+ // TODO @puhui999:TradeOrderItemDO 需要做 adjustPrice 的分摊;另外,支付订单那的价格,需要 update 下;
+ TradeOrderDO update = TradeOrderConvert.INSTANCE.convert(reqVO);
+ update.setPayPrice(update.getPayPrice() + update.getAdjustPrice());
+ tradeOrderMapper.updateById(update);
+ }
+
+ @Override
+ public void updateOrderAddress(TradeOrderUpdateAddressReqVO reqVO) {
+ // 校验交易订单
+ validateOrderExists(reqVO.getId());
+ // TODO 是否需要校验订单是否发货
+ // TODO 发货后是否支持修改收货地址
+
+ // 更新
+ TradeOrderDO update = TradeOrderConvert.INSTANCE.convert(reqVO);
+ tradeOrderMapper.updateById(update);
+ }
+
/**
* 校验交易订单满足可售货的条件
*
@@ -555,6 +619,11 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
}
// TODO 芋艿:未来如果有分佣,需要更新相关分佣订单为已失效
+
+ // 扣减用户积分
+ getSelf().reduceUserPointAsync(order.getUserId(), orderRefundPrice, afterSaleId);
+ // 扣减用户经验
+ getSelf().reduceUserExperienceAsync(order.getUserId(), orderRefundPrice, afterSaleId);
}
@Override
@@ -602,4 +671,37 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
TradeOrderItemAfterSaleStatusEnum.SUCCESS.getStatus()));
}
+ @Async
+ protected void addUserExperienceAsync(Long userId, Integer payPrice, Long orderId) {
+ int bizType = MemberExperienceBizTypeEnum.ORDER.getType();
+ memberLevelApi.addExperience(userId, payPrice, bizType, String.valueOf(orderId));
+ }
+
+ @Async
+ protected void reduceUserExperienceAsync(Long userId, Integer refundPrice, Long afterSaleId) {
+ int bizType = MemberExperienceBizTypeEnum.REFUND.getType();
+ memberLevelApi.addExperience(userId, -refundPrice, bizType, String.valueOf(afterSaleId));
+ }
+
+ @Async
+ protected void addUserPointAsync(Long userId, Integer payPrice, Long orderId) {
+ int bizType = MemberPointBizTypeEnum.ORDER_BUY.getType();
+ memberPointApi.addPoint(userId, payPrice, bizType, String.valueOf(orderId));
+ }
+
+ @Async
+ protected void reduceUserPointAsync(Long userId, Integer refundPrice, Long afterSaleId) {
+ int bizType = MemberPointBizTypeEnum.ORDER_CANCEL.getType();
+ memberPointApi.addPoint(userId, -refundPrice, bizType, String.valueOf(afterSaleId));
+ }
+
+ /**
+ * 获得自身的代理对象,解决 AOP 生效问题
+ *
+ * @return 自己
+ */
+ private TradeOrderUpdateServiceImpl getSelf() {
+ return SpringUtil.getBean(getClass());
+ }
+
}
diff --git a/yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/service/aftersale/TradeAfterSaleServiceTest.java b/yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/service/aftersale/TradeAfterSaleServiceTest.java
index c719e0b8d..7c3c6055c 100644
--- a/yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/service/aftersale/TradeAfterSaleServiceTest.java
+++ b/yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/service/aftersale/TradeAfterSaleServiceTest.java
@@ -56,6 +56,7 @@ public class TradeAfterSaleServiceTest extends BaseDbUnitTest {
private TradeOrderUpdateService tradeOrderUpdateService;
@Resource
private TradeOrderQueryService tradeOrderQueryService;
+
@MockBean
private PayRefundApi payRefundApi;
diff --git a/yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceTest.java b/yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceTest.java
index 313d1874e..284ab7ccf 100644
--- a/yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceTest.java
+++ b/yudao-module-mall/yudao-module-trade-biz/src/test/java/cn/iocoder/yudao/module/trade/service/order/TradeOrderUpdateServiceTest.java
@@ -23,7 +23,10 @@ import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderDO;
import cn.iocoder.yudao.module.trade.dal.dataobject.order.TradeOrderItemDO;
import cn.iocoder.yudao.module.trade.dal.mysql.order.TradeOrderItemMapper;
import cn.iocoder.yudao.module.trade.dal.mysql.order.TradeOrderMapper;
-import cn.iocoder.yudao.module.trade.enums.order.*;
+import cn.iocoder.yudao.module.trade.enums.order.TradeOrderItemAfterSaleStatusEnum;
+import cn.iocoder.yudao.module.trade.enums.order.TradeOrderRefundStatusEnum;
+import cn.iocoder.yudao.module.trade.enums.order.TradeOrderStatusEnum;
+import cn.iocoder.yudao.module.trade.enums.order.TradeOrderTypeEnum;
import cn.iocoder.yudao.module.trade.framework.order.config.TradeOrderConfig;
import cn.iocoder.yudao.module.trade.framework.order.config.TradeOrderProperties;
import org.junit.jupiter.api.BeforeEach;
@@ -38,7 +41,6 @@ import java.util.List;
import static cn.iocoder.yudao.framework.common.util.collection.SetUtils.asSet;
import static cn.iocoder.yudao.framework.test.core.util.AssertUtils.assertPojoEquals;
-import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomLongId;
import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
import static java.util.Collections.singletonList;
import static org.junit.jupiter.api.Assertions.*;
@@ -282,7 +284,7 @@ public class TradeOrderUpdateServiceTest extends BaseDbUnitTest {
// mock 方法(支付单)
// 调用
- tradeOrderUpdateService.deliveryOrder(randomLongId(), deliveryReqVO);
+ tradeOrderUpdateService.deliveryOrder(deliveryReqVO);
// 断言
TradeOrderDO dbOrder = tradeOrderMapper.selectById(1L);
assertEquals(dbOrder.getStatus(), TradeOrderStatusEnum.DELIVERED.getStatus());
diff --git a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/level/MemberLevelApi.java b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/level/MemberLevelApi.java
new file mode 100644
index 000000000..2091189a2
--- /dev/null
+++ b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/level/MemberLevelApi.java
@@ -0,0 +1,22 @@
+package cn.iocoder.yudao.module.member.api.level;
+
+import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum;
+
+/**
+ * 会员等级 API 接口
+ *
+ * @author owen
+ */
+public interface MemberLevelApi {
+
+ /**
+ * 增加会员经验
+ *
+ * @param userId 会员ID
+ * @param experience 经验
+ * @param bizType 业务类型 {@link MemberExperienceBizTypeEnum}
+ * @param bizId 业务编号
+ */
+ void addExperience(Long userId, Integer experience, Integer bizType, String bizId);
+
+}
diff --git a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/point/MemberPointApi.java b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/point/MemberPointApi.java
new file mode 100644
index 000000000..5181211f2
--- /dev/null
+++ b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/point/MemberPointApi.java
@@ -0,0 +1,22 @@
+package cn.iocoder.yudao.module.member.api.point;
+
+import cn.iocoder.yudao.module.member.enums.point.MemberPointBizTypeEnum;
+
+/**
+ * 用户积分的 API 接口
+ *
+ * @author owen
+ */
+public interface MemberPointApi {
+
+ /**
+ * 增加用户积分
+ *
+ * @param userId 用户编号
+ * @param point 积分
+ * @param bizType 业务类型 {@link MemberPointBizTypeEnum}
+ * @param bizId 业务编号
+ */
+ void addPoint(Long userId, Integer point, Integer bizType, String bizId);
+
+}
diff --git a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/MemberUserApi.java b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/MemberUserApi.java
index 5743493e3..3d2130e18 100644
--- a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/MemberUserApi.java
+++ b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/user/MemberUserApi.java
@@ -56,5 +56,4 @@ public interface MemberUserApi {
* @return 用户信息
*/
MemberUserRespDTO getUserByMobile(String mobile);
-
}
diff --git a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/DictTypeConstants.java b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/DictTypeConstants.java
new file mode 100644
index 000000000..c87cbb901
--- /dev/null
+++ b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/DictTypeConstants.java
@@ -0,0 +1,15 @@
+package cn.iocoder.yudao.module.member.enums;
+
+/**
+ * Member 字典类型的枚举类
+ *
+ * @author owen
+ */
+public interface DictTypeConstants {
+
+ /**
+ * 会员经验记录 - 业务类型
+ */
+ String MEMBER_EXPERIENCE_BIZ_TYPE = "member_experience_biz_type";
+
+}
diff --git a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/ErrorCodeConstants.java b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/ErrorCodeConstants.java
index 522c4f7c7..ba283ab0c 100644
--- a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/ErrorCodeConstants.java
+++ b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/ErrorCodeConstants.java
@@ -4,7 +4,7 @@ import cn.iocoder.yudao.framework.common.exception.ErrorCode;
/**
* Member 错误码枚举类
- *
+ *
* member 系统,使用 1-004-000-000 段
*/
public interface ErrorCodeConstants {
@@ -24,13 +24,15 @@ public interface ErrorCodeConstants {
// ========== 用户收件地址 1004004000 ==========
ErrorCode ADDRESS_NOT_EXISTS = new ErrorCode(1004004000, "用户收件地址不存在");
- //========== 会员标签 1004006000 ==========
- ErrorCode TAG_NOT_EXISTS = new ErrorCode(1004006000, "会员标签不存在");
- ErrorCode TAG_NAME_EXISTS = new ErrorCode(1004006001, "会员标签已经存在");
+ //========== 用户标签 1004006000 ==========
+ ErrorCode TAG_NOT_EXISTS = new ErrorCode(1004006000, "用户标签不存在");
+ ErrorCode TAG_NAME_EXISTS = new ErrorCode(1004006001, "用户标签已经存在");
+ ErrorCode TAG_HAS_USER = new ErrorCode(1004006002, "用户标签下存在用户,无法删除");
//========== 积分配置 1004007000 ==========
//========== 积分记录 1004008000 ==========
+ ErrorCode POINT_RECORD_BIZ_NOT_SUPPORT = new ErrorCode(1004008000, "用户积分记录业务类型不支持");
//========== 签到配置 1004009000 ==========
ErrorCode SIGN_IN_CONFIG_NOT_EXISTS = new ErrorCode(1004009000, "签到天数规则不存在");
@@ -38,4 +40,19 @@ public interface ErrorCodeConstants {
//========== 签到配置 1004010000 ==========
+
+ //========== 用户等级 1004011000 ==========
+ ErrorCode LEVEL_NOT_EXISTS = new ErrorCode(1004011000, "用户等级不存在");
+ ErrorCode LEVEL_NAME_EXISTS = new ErrorCode(1004011001, "用户等级名称[{}]已被使用");
+ ErrorCode LEVEL_VALUE_EXISTS = new ErrorCode(1004011002, "用户等级值[{}]已被[{}]使用");
+ ErrorCode LEVEL_EXPERIENCE_MIN = new ErrorCode(1004011003, "升级经验必须大于上一个等级[{}]设置的升级经验[{}]");
+ ErrorCode LEVEL_EXPERIENCE_MAX = new ErrorCode(1004011004, "升级经验必须小于下一个等级[{}]设置的升级经验[{}]");
+ ErrorCode LEVEL_HAS_USER = new ErrorCode(1004011005, "用户等级下存在用户,无法删除");
+
+ ErrorCode EXPERIENCE_BIZ_NOT_SUPPORT = new ErrorCode(1004011201, "用户经验业务类型不支持");
+
+ //========== 用户分组 1004012000 ==========
+ ErrorCode GROUP_NOT_EXISTS = new ErrorCode(1004012000, "用户分组不存在");
+ ErrorCode GROUP_HAS_USER = new ErrorCode(1004012001, "用户分组下存在用户,无法删除");
+
}
diff --git a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/MemberExperienceBizTypeEnum.java b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/MemberExperienceBizTypeEnum.java
new file mode 100644
index 000000000..c719ab79f
--- /dev/null
+++ b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/MemberExperienceBizTypeEnum.java
@@ -0,0 +1,50 @@
+package cn.iocoder.yudao.module.member.enums;
+
+import cn.hutool.core.util.EnumUtil;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+import java.util.Objects;
+
+/**
+ * 会员经验 - 业务类型
+ *
+ * @author owen
+ */
+@Getter
+@AllArgsConstructor
+public enum MemberExperienceBizTypeEnum {
+
+ /**
+ * 管理员调整、邀请新用户、下单、退单、签到、抽奖
+ */
+ ADMIN(0, "管理员调整", "管理员调整获得 {} 经验", true),
+ INVITE_REGISTER(1, "邀新奖励", "邀请好友获得 {} 经验", true),
+ ORDER(2, "下单奖励", "下单获得 {} 经验", true),
+ REFUND(3, "退单扣除", "退单获得 {} 经验", false),
+ SIGN_IN(4, "签到奖励", "签到获得 {} 经验", true),
+ LOTTERY(5, "抽奖奖励", "抽奖获得 {} 经验", true),
+ ;
+
+ /**
+ * 业务类型
+ */
+ private final int type;
+ /**
+ * 标题
+ */
+ private final String title;
+ /**
+ * 描述
+ */
+ private final String description;
+ /**
+ * 是否为扣减积分
+ */
+ private final boolean add;
+
+ public static MemberExperienceBizTypeEnum getByType(Integer type) {
+ return EnumUtil.getBy(MemberExperienceBizTypeEnum.class,
+ e -> Objects.equals(type, e.getType()));
+ }
+}
diff --git a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/point/MemberPointBizTypeEnum.java b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/point/MemberPointBizTypeEnum.java
index 65e4c6c34..3d314a4a2 100644
--- a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/point/MemberPointBizTypeEnum.java
+++ b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/enums/point/MemberPointBizTypeEnum.java
@@ -1,9 +1,12 @@
package cn.iocoder.yudao.module.member.enums.point;
+import cn.hutool.core.util.EnumUtil;
import cn.iocoder.yudao.framework.common.core.IntArrayValuable;
import lombok.AllArgsConstructor;
import lombok.Getter;
+import java.util.Objects;
+
/**
* 会员积分的业务类型枚举
*
@@ -13,9 +16,9 @@ import lombok.Getter;
@Getter
public enum MemberPointBizTypeEnum implements IntArrayValuable {
- SIGN(1, "签到"),
- ORDER_BUY(10, "订单消费"),
- ORDER_CANCEL(11, "订单取消"); // 退回积分
+ SIGN(1, "签到", "签到获得 {} 积分", true),
+ ORDER_BUY(10, "订单消费", "下单获得 {} 积分", true),
+ ORDER_CANCEL(11, "订单取消", "退单获得 {} 积分", false); // 退回积分
/**
* 类型
@@ -25,10 +28,23 @@ public enum MemberPointBizTypeEnum implements IntArrayValuable {
* 名字
*/
private final String name;
+ /**
+ * 描述
+ */
+ private final String description;
+ /**
+ * 是否为扣减积分
+ */
+ private final boolean add;
@Override
public int[] array() {
return new int[0];
}
+ public static MemberPointBizTypeEnum getByType(Integer type) {
+ return EnumUtil.getBy(MemberPointBizTypeEnum.class,
+ e -> Objects.equals(type, e.getType()));
+ }
+
}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/api/level/MemberLevelApiImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/api/level/MemberLevelApiImpl.java
new file mode 100644
index 000000000..3cd2cad65
--- /dev/null
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/api/level/MemberLevelApiImpl.java
@@ -0,0 +1,34 @@
+package cn.iocoder.yudao.module.member.api.level;
+
+import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum;
+import cn.iocoder.yudao.module.member.service.level.MemberLevelService;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import javax.annotation.Resource;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.EXPERIENCE_BIZ_NOT_SUPPORT;
+
+/**
+ * 会员等级 API 实现类
+ *
+ * @author owen
+ */
+@Service
+@Validated
+public class MemberLevelApiImpl implements MemberLevelApi {
+
+ @Resource
+ private MemberLevelService memberLevelService;
+
+ @Override
+ public void addExperience(Long userId, Integer experience, Integer bizType, String bizId) {
+ MemberExperienceBizTypeEnum bizTypeEnum = MemberExperienceBizTypeEnum.getByType(bizType);
+ if (bizTypeEnum == null) {
+ throw exception(EXPERIENCE_BIZ_NOT_SUPPORT);
+ }
+ memberLevelService.addExperience(userId, experience, bizTypeEnum, bizId);
+ }
+
+}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/api/point/MemberPointApiImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/api/point/MemberPointApiImpl.java
new file mode 100644
index 000000000..81eec0782
--- /dev/null
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/api/point/MemberPointApiImpl.java
@@ -0,0 +1,34 @@
+package cn.iocoder.yudao.module.member.api.point;
+
+import cn.iocoder.yudao.module.member.enums.point.MemberPointBizTypeEnum;
+import cn.iocoder.yudao.module.member.service.point.MemberPointRecordService;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import javax.annotation.Resource;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.POINT_RECORD_BIZ_NOT_SUPPORT;
+
+/**
+ * 用户积分的 API 实现类
+ *
+ * @author owen
+ */
+@Service
+@Validated
+public class MemberPointApiImpl implements MemberPointApi {
+
+ @Resource
+ private MemberPointRecordService memberPointRecordService;
+
+ @Override
+ public void addPoint(Long userId, Integer point, Integer bizType, String bizId) {
+ MemberPointBizTypeEnum bizTypeEnum = MemberPointBizTypeEnum.getByType(bizType);
+ if (bizTypeEnum == null) {
+ throw exception(POINT_RECORD_BIZ_NOT_SUPPORT);
+ }
+ memberPointRecordService.createPointRecord(userId, point, bizTypeEnum, bizId);
+ }
+
+}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/address/AddressController.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/address/AddressController.java
index 3e6919e83..0363634c5 100644
--- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/address/AddressController.java
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/address/AddressController.java
@@ -1,32 +1,24 @@
package cn.iocoder.yudao.module.member.controller.admin.address;
-import cn.iocoder.yudao.module.member.dal.dataobject.address.MemberAddressDO;
-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 io.swagger.v3.oas.annotations.Operation;
-
-import javax.validation.constraints.*;
-import javax.validation.*;
-import javax.servlet.http.*;
-import java.util.*;
-import java.io.IOException;
-
-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.framework.excel.core.util.ExcelUtils;
-
-import cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog;
-import static cn.iocoder.yudao.framework.operatelog.core.enums.OperateTypeEnum.*;
-
-import cn.iocoder.yudao.module.member.controller.admin.address.vo.*;
+import cn.iocoder.yudao.module.member.controller.admin.address.vo.AddressRespVO;
import cn.iocoder.yudao.module.member.convert.address.AddressConvert;
+import cn.iocoder.yudao.module.member.dal.dataobject.address.MemberAddressDO;
import cn.iocoder.yudao.module.member.service.address.AddressService;
+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.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - 用户收件地址")
@RestController
@@ -37,66 +29,13 @@ public class AddressController {
@Resource
private AddressService addressService;
- @PostMapping("/create")
- @Operation(summary = "创建用户收件地址")
- @PreAuthorize("@ss.hasPermission('member:address:create')")
- public CommonResult createAddress(@Valid @RequestBody AddressCreateReqVO createReqVO) {
- return success(addressService.createAddress(createReqVO));
- }
-
- @PutMapping("/update")
- @Operation(summary = "更新用户收件地址")
- @PreAuthorize("@ss.hasPermission('member:address:update')")
- public CommonResult updateAddress(@Valid @RequestBody AddressUpdateReqVO updateReqVO) {
- addressService.updateAddress(updateReqVO);
- return success(true);
- }
-
- @DeleteMapping("/delete")
- @Operation(summary = "删除用户收件地址")
- @Parameter(name = "id", description = "编号", required = true)
- @PreAuthorize("@ss.hasPermission('member:address:delete')")
- public CommonResult deleteAddress(@RequestParam("id") Long id) {
- addressService.deleteAddress(id);
- return success(true);
- }
-
- @GetMapping("/get")
- @Operation(summary = "获得用户收件地址")
- @Parameter(name = "id", description = "编号", required = true, example = "1024")
- @PreAuthorize("@ss.hasPermission('member:address:query')")
- public CommonResult getAddress(@RequestParam("id") Long id) {
- MemberAddressDO address = addressService.getAddress(id);
- return success(AddressConvert.INSTANCE.convert2(address));
- }
-
@GetMapping("/list")
@Operation(summary = "获得用户收件地址列表")
- @Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048")
- @PreAuthorize("@ss.hasPermission('member:address:query')")
- public CommonResult> getAddressList(@RequestParam("ids") Collection ids) {
- List list = addressService.getAddressList(ids);
+ @Parameter(name = "userId", description = "用户编号", required = true)
+ @PreAuthorize("@ss.hasPermission('member:user:query')")
+ public CommonResult> getAddressList(@RequestParam("userId") Long userId) {
+ List list = addressService.getAddressList(userId);
return success(AddressConvert.INSTANCE.convertList2(list));
}
- @GetMapping("/page")
- @Operation(summary = "获得用户收件地址分页")
- @PreAuthorize("@ss.hasPermission('member:address:query')")
- public CommonResult> getAddressPage(@Valid AddressPageReqVO pageVO) {
- PageResult pageResult = addressService.getAddressPage(pageVO);
- return success(AddressConvert.INSTANCE.convertPage(pageResult));
- }
-
- @GetMapping("/export-excel")
- @Operation(summary = "导出用户收件地址 Excel")
- @PreAuthorize("@ss.hasPermission('member:address:export')")
- @OperateLog(type = EXPORT)
- public void exportAddressExcel(@Valid AddressExportReqVO exportReqVO,
- HttpServletResponse response) throws IOException {
- List list = addressService.getAddressList(exportReqVO);
- // 导出 Excel
- List datas = AddressConvert.INSTANCE.convertList02(list);
- ExcelUtils.write(response, "用户收件地址.xls", "数据", AddressExcelVO.class, datas);
- }
-
}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/address/vo/AddressCreateReqVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/address/vo/AddressCreateReqVO.java
deleted file mode 100644
index ac0833ba7..000000000
--- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/address/vo/AddressCreateReqVO.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package cn.iocoder.yudao.module.member.controller.admin.address.vo;
-
-import lombok.*;
-import java.util.*;
-import io.swagger.v3.oas.annotations.media.Schema;
-import javax.validation.constraints.*;
-
-@Schema(description = "管理后台 - 用户收件地址创建 Request VO")
-@Data
-@EqualsAndHashCode(callSuper = true)
-@ToString(callSuper = true)
-public class AddressCreateReqVO extends AddressBaseVO {
-
-}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/address/vo/AddressExcelVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/address/vo/AddressExcelVO.java
deleted file mode 100644
index 8a0543247..000000000
--- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/address/vo/AddressExcelVO.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package cn.iocoder.yudao.module.member.controller.admin.address.vo;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.*;
-import java.util.*;
-import java.time.LocalDateTime;
-import java.time.LocalDateTime;
-
-import com.alibaba.excel.annotation.ExcelProperty;
-
-/**
- * 用户收件地址 Excel VO
- *
- * @author 绮梦
- */
-@Data
-public class AddressExcelVO {
-
- @ExcelProperty("收件地址编号")
- private Long id;
-
- @ExcelProperty("收件人名称")
- private String name;
-
- @ExcelProperty("手机号")
- private String mobile;
-
- @ExcelProperty("地区编码")
- private Long areaId;
-
- @ExcelProperty("收件详细地址")
- private String detailAddress;
-
- @ExcelProperty("是否默认")
- private Boolean defaultStatus;
-
- @ExcelProperty("创建时间")
- private LocalDateTime createTime;
-
-}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/address/vo/AddressExportReqVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/address/vo/AddressExportReqVO.java
deleted file mode 100644
index 214bf952b..000000000
--- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/address/vo/AddressExportReqVO.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package cn.iocoder.yudao.module.member.controller.admin.address.vo;
-
-import lombok.*;
-import java.util.*;
-import io.swagger.v3.oas.annotations.media.Schema;
-import cn.iocoder.yudao.framework.common.pojo.PageParam;
-import java.time.LocalDateTime;
-import org.springframework.format.annotation.DateTimeFormat;
-
-import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
-
-@Schema(description = "管理后台 - 用户收件地址 Excel 导出 Request VO,参数和 AddressPageReqVO 是一致的")
-@Data
-public class AddressExportReqVO {
-
- @Schema(description = "用户编号", example = "20369")
- private Long userId;
-
- @Schema(description = "收件人名称", example = "张三")
- private String name;
-
- @Schema(description = "手机号")
- private String mobile;
-
- @Schema(description = "地区编码", example = "15716")
- private Long areaId;
-
- @Schema(description = "收件详细地址")
- private String detailAddress;
-
- @Schema(description = "是否默认", example = "2")
- private Boolean defaultStatus;
-
- @Schema(description = "创建时间")
- @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
- private LocalDateTime[] createTime;
-
-}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/address/vo/AddressPageReqVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/address/vo/AddressPageReqVO.java
deleted file mode 100644
index 32b059448..000000000
--- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/address/vo/AddressPageReqVO.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package cn.iocoder.yudao.module.member.controller.admin.address.vo;
-
-import lombok.*;
-import java.util.*;
-import io.swagger.v3.oas.annotations.media.Schema;
-import cn.iocoder.yudao.framework.common.pojo.PageParam;
-import org.springframework.format.annotation.DateTimeFormat;
-import java.time.LocalDateTime;
-
-import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
-
-@Schema(description = "管理后台 - 用户收件地址分页 Request VO")
-@Data
-@EqualsAndHashCode(callSuper = true)
-@ToString(callSuper = true)
-public class AddressPageReqVO extends PageParam {
-
- @Schema(description = "用户编号", example = "20369")
- private Long userId;
-
- @Schema(description = "收件人名称", example = "张三")
- private String name;
-
- @Schema(description = "手机号")
- private String mobile;
-
- @Schema(description = "地区编码", example = "15716")
- private Long areaId;
-
- @Schema(description = "收件详细地址")
- private String detailAddress;
-
- @Schema(description = "是否默认", example = "2")
- private Boolean defaultStatus;
-
- @Schema(description = "创建时间")
- @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
- private LocalDateTime[] createTime;
-
-}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/address/vo/AddressUpdateReqVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/address/vo/AddressUpdateReqVO.java
deleted file mode 100644
index 4e91579e4..000000000
--- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/address/vo/AddressUpdateReqVO.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package cn.iocoder.yudao.module.member.controller.admin.address.vo;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.*;
-import java.util.*;
-import javax.validation.constraints.*;
-
-@Schema(description = "管理后台 - 用户收件地址更新 Request VO")
-@Data
-@EqualsAndHashCode(callSuper = true)
-@ToString(callSuper = true)
-public class AddressUpdateReqVO extends AddressBaseVO {
-
- @Schema(description = "收件地址编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "7380")
- @NotNull(message = "收件地址编号不能为空")
- private Long id;
-
-}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/group/MemberGroupController.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/group/MemberGroupController.java
new file mode 100644
index 000000000..566e516a1
--- /dev/null
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/group/MemberGroupController.java
@@ -0,0 +1,81 @@
+package cn.iocoder.yudao.module.member.controller.admin.group;
+
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.member.controller.admin.group.vo.*;
+import cn.iocoder.yudao.module.member.convert.group.MemberGroupConvert;
+import cn.iocoder.yudao.module.member.dal.dataobject.group.MemberGroupDO;
+import cn.iocoder.yudao.module.member.service.group.MemberGroupService;
+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.annotation.Resource;
+import javax.validation.Valid;
+import java.util.List;
+
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+
+@Tag(name = "管理后台 - 用户分组")
+@RestController
+@RequestMapping("/member/group")
+@Validated
+public class MemberGroupController {
+
+ @Resource
+ private MemberGroupService groupService;
+
+ @PostMapping("/create")
+ @Operation(summary = "创建用户分组")
+ @PreAuthorize("@ss.hasPermission('member:group:create')")
+ public CommonResult createGroup(@Valid @RequestBody MemberGroupCreateReqVO createReqVO) {
+ return success(groupService.createGroup(createReqVO));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "更新用户分组")
+ @PreAuthorize("@ss.hasPermission('member:group:update')")
+ public CommonResult updateGroup(@Valid @RequestBody MemberGroupUpdateReqVO updateReqVO) {
+ groupService.updateGroup(updateReqVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "删除用户分组")
+ @Parameter(name = "id", description = "编号", required = true)
+ @PreAuthorize("@ss.hasPermission('member:group:delete')")
+ public CommonResult deleteGroup(@RequestParam("id") Long id) {
+ groupService.deleteGroup(id);
+ return success(true);
+ }
+
+ @GetMapping("/get")
+ @Operation(summary = "获得用户分组")
+ @Parameter(name = "id", description = "编号", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('member:group:query')")
+ public CommonResult getGroup(@RequestParam("id") Long id) {
+ MemberGroupDO group = groupService.getGroup(id);
+ return success(MemberGroupConvert.INSTANCE.convert(group));
+ }
+
+ @GetMapping("/list-all-simple")
+ @Operation(summary = "获取会员分组精简信息列表", description = "只包含被开启的会员分组,主要用于前端的下拉选项")
+ public CommonResult> getSimpleGroupList() {
+ // 获用户列表,只要开启状态的
+ List list = groupService.getEnableGroupList();
+ return success(MemberGroupConvert.INSTANCE.convertSimpleList(list));
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "获得用户分组分页")
+ @PreAuthorize("@ss.hasPermission('member:group:query')")
+ public CommonResult> getGroupPage(@Valid MemberGroupPageReqVO pageVO) {
+ PageResult pageResult = groupService.getGroupPage(pageVO);
+ return success(MemberGroupConvert.INSTANCE.convertPage(pageResult));
+ }
+
+}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/group/vo/MemberGroupBaseVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/group/vo/MemberGroupBaseVO.java
new file mode 100644
index 000000000..0519bd968
--- /dev/null
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/group/vo/MemberGroupBaseVO.java
@@ -0,0 +1,29 @@
+package cn.iocoder.yudao.module.member.controller.admin.group.vo;
+
+import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
+import cn.iocoder.yudao.framework.common.validation.InEnum;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 用户分组 Base VO,提供给添加、修改、详细的子 VO 使用
+ * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
+ */
+@Data
+public class MemberGroupBaseVO {
+
+ @Schema(description = "名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "购物达人")
+ @NotNull(message = "名称不能为空")
+ private String name;
+
+ @Schema(description = "备注", requiredMode = Schema.RequiredMode.REQUIRED, example = "你猜")
+ private String remark;
+
+ @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+ @NotNull(message = "状态不能为空")
+ @InEnum(CommonStatusEnum.class)
+ private Integer status;
+
+}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/group/vo/MemberGroupCreateReqVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/group/vo/MemberGroupCreateReqVO.java
new file mode 100644
index 000000000..ef3f83343
--- /dev/null
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/group/vo/MemberGroupCreateReqVO.java
@@ -0,0 +1,14 @@
+package cn.iocoder.yudao.module.member.controller.admin.group.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+@Schema(description = "管理后台 - 用户分组创建 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class MemberGroupCreateReqVO extends MemberGroupBaseVO {
+
+}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/group/vo/MemberGroupPageReqVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/group/vo/MemberGroupPageReqVO.java
new file mode 100644
index 000000000..ae67d5f6c
--- /dev/null
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/group/vo/MemberGroupPageReqVO.java
@@ -0,0 +1,30 @@
+package cn.iocoder.yudao.module.member.controller.admin.group.vo;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 用户分组分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class MemberGroupPageReqVO extends PageParam {
+
+ @Schema(description = "名称", example = "购物达人")
+ private String name;
+
+ @Schema(description = "状态", example = "1")
+ private Integer status;
+
+ @Schema(description = "创建时间")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime[] createTime;
+
+}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/group/vo/MemberGroupRespVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/group/vo/MemberGroupRespVO.java
new file mode 100644
index 000000000..97365382a
--- /dev/null
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/group/vo/MemberGroupRespVO.java
@@ -0,0 +1,22 @@
+package cn.iocoder.yudao.module.member.controller.admin.group.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 用户分组 Response VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class MemberGroupRespVO extends MemberGroupBaseVO {
+
+ @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "20357")
+ private Long id;
+
+ @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+ private LocalDateTime createTime;
+
+}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/group/vo/MemberGroupSimpleRespVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/group/vo/MemberGroupSimpleRespVO.java
new file mode 100644
index 000000000..ee7d905d0
--- /dev/null
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/group/vo/MemberGroupSimpleRespVO.java
@@ -0,0 +1,18 @@
+package cn.iocoder.yudao.module.member.controller.admin.group.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.ToString;
+
+@Schema(description = "管理后台 - 用户分组 Response VO")
+@Data
+@ToString(callSuper = true)
+public class MemberGroupSimpleRespVO {
+
+ @Schema(description = "编号", example = "6103")
+ private Long id;
+
+ @Schema(description = "等级名称", example = "芋艿")
+ private String name;
+
+}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/group/vo/MemberGroupUpdateReqVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/group/vo/MemberGroupUpdateReqVO.java
new file mode 100644
index 000000000..75910883b
--- /dev/null
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/group/vo/MemberGroupUpdateReqVO.java
@@ -0,0 +1,20 @@
+package cn.iocoder.yudao.module.member.controller.admin.group.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+import javax.validation.constraints.NotNull;
+
+@Schema(description = "管理后台 - 用户分组更新 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class MemberGroupUpdateReqVO extends MemberGroupBaseVO {
+
+ @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "20357")
+ @NotNull(message = "编号不能为空")
+ private Long id;
+
+}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/MemberExperienceRecordController.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/MemberExperienceRecordController.java
new file mode 100644
index 000000000..cdbd76046
--- /dev/null
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/MemberExperienceRecordController.java
@@ -0,0 +1,52 @@
+package cn.iocoder.yudao.module.member.controller.admin.level;
+
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.member.controller.admin.level.vo.experience.MemberExperienceRecordPageReqVO;
+import cn.iocoder.yudao.module.member.controller.admin.level.vo.experience.MemberExperienceRecordRespVO;
+import cn.iocoder.yudao.module.member.convert.level.MemberExperienceRecordConvert;
+import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberExperienceRecordDO;
+import cn.iocoder.yudao.module.member.service.level.MemberExperienceRecordService;
+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.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "管理后台 - 会员经验记录")
+@RestController
+@RequestMapping("/member/experience-record")
+@Validated
+public class MemberExperienceRecordController {
+
+ @Resource
+ private MemberExperienceRecordService experienceLogService;
+
+ @GetMapping("/get")
+ @Operation(summary = "获得会员经验记录")
+ @Parameter(name = "id", description = "编号", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('member:experience-record:query')")
+ public CommonResult getExperienceRecord(@RequestParam("id") Long id) {
+ MemberExperienceRecordDO experienceLog = experienceLogService.getExperienceRecord(id);
+ return success(MemberExperienceRecordConvert.INSTANCE.convert(experienceLog));
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "获得会员经验记录分页")
+ @PreAuthorize("@ss.hasPermission('member:experience-record:query')")
+ public CommonResult> getExperienceRecordPage(
+ @Valid MemberExperienceRecordPageReqVO pageVO) {
+ PageResult pageResult = experienceLogService.getExperienceRecordPage(pageVO);
+ return success(MemberExperienceRecordConvert.INSTANCE.convertPage(pageResult));
+ }
+
+}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/MemberLevelController.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/MemberLevelController.java
new file mode 100644
index 000000000..5a031321f
--- /dev/null
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/MemberLevelController.java
@@ -0,0 +1,80 @@
+package cn.iocoder.yudao.module.member.controller.admin.level;
+
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.*;
+import cn.iocoder.yudao.module.member.convert.level.MemberLevelConvert;
+import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelDO;
+import cn.iocoder.yudao.module.member.service.level.MemberLevelService;
+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.annotation.Resource;
+import javax.validation.Valid;
+import java.util.List;
+
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "管理后台 - 会员等级")
+@RestController
+@RequestMapping("/member/level")
+@Validated
+public class MemberLevelController {
+
+ @Resource
+ private MemberLevelService levelService;
+
+ @PostMapping("/create")
+ @Operation(summary = "创建会员等级")
+ @PreAuthorize("@ss.hasPermission('member:level:create')")
+ public CommonResult createLevel(@Valid @RequestBody MemberLevelCreateReqVO createReqVO) {
+ return success(levelService.createLevel(createReqVO));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "更新会员等级")
+ @PreAuthorize("@ss.hasPermission('member:level:update')")
+ public CommonResult updateLevel(@Valid @RequestBody MemberLevelUpdateReqVO updateReqVO) {
+ levelService.updateLevel(updateReqVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "删除会员等级")
+ @Parameter(name = "id", description = "编号", required = true)
+ @PreAuthorize("@ss.hasPermission('member:level:delete')")
+ public CommonResult deleteLevel(@RequestParam("id") Long id) {
+ levelService.deleteLevel(id);
+ return success(true);
+ }
+
+ @GetMapping("/get")
+ @Operation(summary = "获得会员等级")
+ @Parameter(name = "id", description = "编号", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('member:level:query')")
+ public CommonResult getLevel(@RequestParam("id") Long id) {
+ MemberLevelDO level = levelService.getLevel(id);
+ return success(MemberLevelConvert.INSTANCE.convert(level));
+ }
+
+ @GetMapping("/list-all-simple")
+ @Operation(summary = "获取会员等级精简信息列表", description = "只包含被开启的会员等级,主要用于前端的下拉选项")
+ public CommonResult> getSimpleLevelList() {
+ // 获用户列表,只要开启状态的
+ List list = levelService.getEnableLevelList();
+ // 排序后,返回给前端
+ return success(MemberLevelConvert.INSTANCE.convertSimpleList(list));
+ }
+
+ @GetMapping("/list")
+ @Operation(summary = "获得会员等级列表")
+ @PreAuthorize("@ss.hasPermission('member:level:query')")
+ public CommonResult> getLevelList(@Valid MemberLevelListReqVO pageVO) {
+ List result = levelService.getLevelList(pageVO);
+ return success(MemberLevelConvert.INSTANCE.convertList(result));
+ }
+
+}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/MemberLevelRecordController.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/MemberLevelRecordController.java
new file mode 100644
index 000000000..05d133cbd
--- /dev/null
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/MemberLevelRecordController.java
@@ -0,0 +1,52 @@
+package cn.iocoder.yudao.module.member.controller.admin.level;
+
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.member.controller.admin.level.vo.log.MemberLevelRecordPageReqVO;
+import cn.iocoder.yudao.module.member.controller.admin.level.vo.log.MemberLevelRecordRespVO;
+import cn.iocoder.yudao.module.member.convert.level.MemberLevelRecordConvert;
+import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelRecordDO;
+import cn.iocoder.yudao.module.member.service.level.MemberLevelRecordService;
+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.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "管理后台 - 会员等级记录")
+@RestController
+@RequestMapping("/member/level-record")
+@Validated
+public class MemberLevelRecordController {
+
+ @Resource
+ private MemberLevelRecordService levelLogService;
+
+ @GetMapping("/get")
+ @Operation(summary = "获得会员等级记录")
+ @Parameter(name = "id", description = "编号", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('member:level-record:query')")
+ public CommonResult getLevelRecord(@RequestParam("id") Long id) {
+ MemberLevelRecordDO levelLog = levelLogService.getLevelRecord(id);
+ return success(MemberLevelRecordConvert.INSTANCE.convert(levelLog));
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "获得会员等级记录分页")
+ @PreAuthorize("@ss.hasPermission('member:level-record:query')")
+ public CommonResult> getLevelRecordPage(
+ @Valid MemberLevelRecordPageReqVO pageVO) {
+ PageResult pageResult = levelLogService.getLevelRecordPage(pageVO);
+ return success(MemberLevelRecordConvert.INSTANCE.convertPage(pageResult));
+ }
+
+}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/experience/MemberExperienceRecordBaseVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/experience/MemberExperienceRecordBaseVO.java
new file mode 100644
index 000000000..7c71f8270
--- /dev/null
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/experience/MemberExperienceRecordBaseVO.java
@@ -0,0 +1,43 @@
+package cn.iocoder.yudao.module.member.controller.admin.level.vo.experience;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 会员经验记录 Base VO,提供给添加、修改、详细的子 VO 使用
+ * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
+ */
+@Data
+public class MemberExperienceRecordBaseVO {
+
+ @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "3638")
+ @NotNull(message = "用户编号不能为空")
+ private Long userId;
+
+ @Schema(description = "业务编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "12164")
+ @NotNull(message = "业务编号不能为空")
+ private String bizId;
+
+ @Schema(description = "业务类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+ @NotNull(message = "业务类型不能为空")
+ private Integer bizType;
+
+ @Schema(description = "标题", requiredMode = Schema.RequiredMode.REQUIRED, example = "增加经验")
+ @NotNull(message = "标题不能为空")
+ private String title;
+
+ @Schema(description = "经验", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
+ @NotNull(message = "经验不能为空")
+ private Integer experience;
+
+ @Schema(description = "变更后的经验", requiredMode = Schema.RequiredMode.REQUIRED, example = "200")
+ @NotNull(message = "变更后的经验不能为空")
+ private Integer totalExperience;
+
+ @Schema(description = "描述", requiredMode = Schema.RequiredMode.REQUIRED, example = "下单增加 100 经验")
+ @NotNull(message = "描述不能为空")
+ private String description;
+
+}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/experience/MemberExperienceRecordPageReqVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/experience/MemberExperienceRecordPageReqVO.java
new file mode 100644
index 000000000..d18201d7c
--- /dev/null
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/experience/MemberExperienceRecordPageReqVO.java
@@ -0,0 +1,36 @@
+package cn.iocoder.yudao.module.member.controller.admin.level.vo.experience;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 会员经验记录分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class MemberExperienceRecordPageReqVO extends PageParam {
+
+ @Schema(description = "用户编号", example = "3638")
+ private Long userId;
+
+ @Schema(description = "业务编号", example = "12164")
+ private String bizId;
+
+ @Schema(description = "业务类型", example = "1")
+ private Integer bizType;
+
+ @Schema(description = "标题", example = "增加经验")
+ private String title;
+
+ @Schema(description = "创建时间")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime[] createTime;
+
+}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/experience/MemberExperienceRecordRespVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/experience/MemberExperienceRecordRespVO.java
new file mode 100644
index 000000000..5e652fcf0
--- /dev/null
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/experience/MemberExperienceRecordRespVO.java
@@ -0,0 +1,22 @@
+package cn.iocoder.yudao.module.member.controller.admin.level.vo.experience;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 会员经验记录 Response VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class MemberExperienceRecordRespVO extends MemberExperienceRecordBaseVO {
+
+ @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "19610")
+ private Long id;
+
+ @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+ private LocalDateTime createTime;
+
+}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/level/MemberLevelBaseVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/level/MemberLevelBaseVO.java
new file mode 100644
index 000000000..9580647f8
--- /dev/null
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/level/MemberLevelBaseVO.java
@@ -0,0 +1,53 @@
+package cn.iocoder.yudao.module.member.controller.admin.level.vo.level;
+
+import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
+import cn.iocoder.yudao.framework.common.validation.InEnum;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import org.hibernate.validator.constraints.Range;
+import org.hibernate.validator.constraints.URL;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Positive;
+
+/**
+ * 会员等级 Base VO,提供给添加、修改、详细的子 VO 使用
+ * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
+ */
+@Data
+public class MemberLevelBaseVO {
+
+ @Schema(description = "等级名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")
+ @NotBlank(message = "等级名称不能为空")
+ private String name;
+
+ @Schema(description = "升级经验", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
+ @NotNull(message = "升级经验不能为空")
+ @Positive(message = "升级经验必须大于 0")
+ private Integer experience;
+
+ @Schema(description = "等级", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+ @NotNull(message = "等级不能为空")
+ @Positive(message = "等级必须大于 0")
+ private Integer level;
+
+ @Schema(description = "享受折扣", requiredMode = Schema.RequiredMode.REQUIRED, example = "98")
+ @NotNull(message = "享受折扣不能为空")
+ @Range(min = 0, max = 100, message = "享受折扣的范围为 0-100")
+ private Integer discountPercent;
+
+ @Schema(description = "等级图标", example = "https://www.iocoder.cn/yudao.jpg")
+ @URL(message = "等级图标必须是 URL 格式")
+ private String icon;
+
+ @Schema(description = "等级背景图", example = "https://www.iocoder.cn/yudao.jpg")
+ @URL(message = "等级背景图必须是 URL 格式")
+ private String backgroundUrl;
+
+ @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+ @NotNull(message = "状态不能为空")
+ @InEnum(CommonStatusEnum.class)
+ private Integer status;
+
+}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/level/MemberLevelCreateReqVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/level/MemberLevelCreateReqVO.java
new file mode 100644
index 000000000..f51a7d967
--- /dev/null
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/level/MemberLevelCreateReqVO.java
@@ -0,0 +1,14 @@
+package cn.iocoder.yudao.module.member.controller.admin.level.vo.level;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+@Schema(description = "管理后台 - 会员等级创建 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class MemberLevelCreateReqVO extends MemberLevelBaseVO {
+
+}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/level/MemberLevelListReqVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/level/MemberLevelListReqVO.java
new file mode 100644
index 000000000..348e78e8e
--- /dev/null
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/level/MemberLevelListReqVO.java
@@ -0,0 +1,18 @@
+package cn.iocoder.yudao.module.member.controller.admin.level.vo.level;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.ToString;
+
+@Schema(description = "管理后台 - 会员等级列表筛选 Request VO")
+@Data
+@ToString(callSuper = true)
+public class MemberLevelListReqVO {
+
+ @Schema(description = "等级名称", example = "芋艿")
+ private String name;
+
+ @Schema(description = "状态", example = "1")
+ private Integer status;
+
+}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/level/MemberLevelRespVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/level/MemberLevelRespVO.java
new file mode 100644
index 000000000..df91a814f
--- /dev/null
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/level/MemberLevelRespVO.java
@@ -0,0 +1,22 @@
+package cn.iocoder.yudao.module.member.controller.admin.level.vo.level;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 会员等级 Response VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class MemberLevelRespVO extends MemberLevelBaseVO {
+
+ @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "6103")
+ private Long id;
+
+ @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+ private LocalDateTime createTime;
+
+}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/level/MemberLevelSimpleRespVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/level/MemberLevelSimpleRespVO.java
new file mode 100644
index 000000000..96c515c8b
--- /dev/null
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/level/MemberLevelSimpleRespVO.java
@@ -0,0 +1,21 @@
+package cn.iocoder.yudao.module.member.controller.admin.level.vo.level;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.ToString;
+
+@Schema(description = "管理后台 - 会员等级 Response VO")
+@Data
+@ToString(callSuper = true)
+public class MemberLevelSimpleRespVO {
+
+ @Schema(description = "编号", example = "6103")
+ private Long id;
+
+ @Schema(description = "等级名称", example = "芋艿")
+ private String name;
+
+ @Schema(description = "等级图标", example = "https://www.iocoder.cn/yudao.jpg")
+ private String icon;
+
+}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/level/MemberLevelUpdateReqVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/level/MemberLevelUpdateReqVO.java
new file mode 100644
index 000000000..83ad768de
--- /dev/null
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/level/MemberLevelUpdateReqVO.java
@@ -0,0 +1,20 @@
+package cn.iocoder.yudao.module.member.controller.admin.level.vo.level;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+import javax.validation.constraints.NotNull;
+
+@Schema(description = "管理后台 - 会员等级更新 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class MemberLevelUpdateReqVO extends MemberLevelBaseVO {
+
+ @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "6103")
+ @NotNull(message = "编号不能为空")
+ private Long id;
+
+}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/log/MemberLevelRecordBaseVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/log/MemberLevelRecordBaseVO.java
new file mode 100644
index 000000000..0fdbf7b6b
--- /dev/null
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/log/MemberLevelRecordBaseVO.java
@@ -0,0 +1,47 @@
+package cn.iocoder.yudao.module.member.controller.admin.level.vo.log;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * 会员等级记录 Base VO,提供给添加、修改、详细的子 VO 使用
+ * 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
+ */
+@Data
+public class MemberLevelRecordBaseVO {
+
+ @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "25923")
+ @NotNull(message = "用户编号不能为空")
+ private Long userId;
+
+ @Schema(description = "等级编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "25985")
+ @NotNull(message = "等级编号不能为空")
+ private Long levelId;
+
+ @Schema(description = "会员等级", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotNull(message = "会员等级不能为空")
+ private Integer level;
+
+ @Schema(description = "享受折扣", requiredMode = Schema.RequiredMode.REQUIRED, example = "13319")
+ @NotNull(message = "享受折扣不能为空")
+ private Integer discountPercent;
+
+ @Schema(description = "升级经验", requiredMode = Schema.RequiredMode.REQUIRED, example = "13319")
+ @NotNull(message = "升级经验不能为空")
+ private Integer experience;
+
+ @Schema(description = "会员此时的经验", requiredMode = Schema.RequiredMode.REQUIRED, example = "13319")
+ @NotNull(message = "会员此时的经验不能为空")
+ private Integer userExperience;
+
+ @Schema(description = "备注", requiredMode = Schema.RequiredMode.REQUIRED, example = "推广需要")
+ @NotNull(message = "备注不能为空")
+ private String remark;
+
+ @Schema(description = "描述", requiredMode = Schema.RequiredMode.REQUIRED, example = "升级为金牌会员")
+ @NotNull(message = "描述不能为空")
+ private String description;
+
+}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/log/MemberLevelRecordPageReqVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/log/MemberLevelRecordPageReqVO.java
new file mode 100644
index 000000000..2c7337b47
--- /dev/null
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/log/MemberLevelRecordPageReqVO.java
@@ -0,0 +1,30 @@
+package cn.iocoder.yudao.module.member.controller.admin.level.vo.log;
+
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 会员等级记录分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class MemberLevelRecordPageReqVO extends PageParam {
+
+ @Schema(description = "用户编号", example = "25923")
+ private Long userId;
+
+ @Schema(description = "等级编号", example = "25985")
+ private Long levelId;
+
+ @Schema(description = "创建时间")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime[] createTime;
+
+}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/log/MemberLevelRecordRespVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/log/MemberLevelRecordRespVO.java
new file mode 100644
index 000000000..290340a8e
--- /dev/null
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/level/vo/log/MemberLevelRecordRespVO.java
@@ -0,0 +1,22 @@
+package cn.iocoder.yudao.module.member.controller.admin.level.vo.log;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 会员等级记录 Response VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class MemberLevelRecordRespVO extends MemberLevelRecordBaseVO {
+
+ @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "8741")
+ private Long id;
+
+ @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+ private LocalDateTime createTime;
+
+}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/point/MemberPointConfigController.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/point/MemberPointConfigController.java
index 3d68aa88f..1e55cee0b 100644
--- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/point/MemberPointConfigController.java
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/point/MemberPointConfigController.java
@@ -29,16 +29,16 @@ public class MemberPointConfigController {
@PutMapping("/save")
@Operation(summary = "保存会员积分配置")
@PreAuthorize("@ss.hasPermission('point:config:save')")
- public CommonResult updateConfig(@Valid @RequestBody MemberPointConfigSaveReqVO saveReqVO) {
- memberPointConfigService.saveConfig(saveReqVO);
+ public CommonResult savePointConfig(@Valid @RequestBody MemberPointConfigSaveReqVO saveReqVO) {
+ memberPointConfigService.savePointConfig(saveReqVO);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得会员积分配置")
@PreAuthorize("@ss.hasPermission('point:config:query')")
- public CommonResult getConfig() {
- MemberPointConfigDO config = memberPointConfigService.getConfig();
+ public CommonResult getPointConfig() {
+ MemberPointConfigDO config = memberPointConfigService.getPointConfig();
return success(MemberPointConfigConvert.INSTANCE.convert(config));
}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/point/MemberPointRecordController.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/point/MemberPointRecordController.java
index c73d1b2d0..4d6ec352b 100644
--- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/point/MemberPointRecordController.java
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/point/MemberPointRecordController.java
@@ -25,6 +25,7 @@ import java.util.List;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
+@Tag(name = "管理后台 - 签到记录")
@RestController
@RequestMapping("/member/point/record")
@Validated
@@ -39,9 +40,9 @@ public class MemberPointRecordController {
@GetMapping("/page")
@Operation(summary = "获得用户积分记录分页")
@PreAuthorize("@ss.hasPermission('point:record:query')")
- public CommonResult> getRecordPage(@Valid MemberPointRecordPageReqVO pageVO) {
+ public CommonResult> getPointRecordPage(@Valid MemberPointRecordPageReqVO pageVO) {
// 执行分页查询
- PageResult pageResult = pointRecordService.getRecordPage(pageVO);
+ PageResult pageResult = pointRecordService.getPointRecordPage(pageVO);
if (CollectionUtils.isEmpty(pageResult.getList())) {
return success(PageResult.empty(pageResult.getTotal()));
}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/point/vo/recrod/MemberPointRecordPageReqVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/point/vo/recrod/MemberPointRecordPageReqVO.java
index bed2cc5ee..63cc80006 100644
--- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/point/vo/recrod/MemberPointRecordPageReqVO.java
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/point/vo/recrod/MemberPointRecordPageReqVO.java
@@ -15,7 +15,7 @@ public class MemberPointRecordPageReqVO extends PageParam {
@Schema(description = "用户昵称", example = "张三")
private String nickname;
- @Schema(description = "用户ID", example = "123")
+ @Schema(description = "用户编号", example = "123")
private Long userId;
@Schema(description = "业务类型", example = "1")
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/signin/MemberSignInConfigController.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/signin/MemberSignInConfigController.java
index ccb279e90..65bfe44c2 100644
--- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/signin/MemberSignInConfigController.java
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/signin/MemberSignInConfigController.java
@@ -20,9 +20,10 @@ import java.util.List;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+// TODO 芋艿:url
@Tag(name = "管理后台 - 签到规则")
@RestController
-@RequestMapping("/member/point/sign-in-config")
+@RequestMapping("/member/sign-in/config")
@Validated
public class MemberSignInConfigController {
@@ -66,8 +67,8 @@ public class MemberSignInConfigController {
@Operation(summary = "获得签到规则列表")
@PreAuthorize("@ss.hasPermission('point:sign-in-config:query')")
public CommonResult> getSignInConfigList() {
- List pageResult = signInConfigService.getSignInConfigList();
- return success(MemberSignInConfigConvert.INSTANCE.convertList(pageResult));
+ List list = signInConfigService.getSignInConfigList();
+ return success(MemberSignInConfigConvert.INSTANCE.convertList(list));
}
}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/signin/MemberSignInRecordController.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/signin/MemberSignInRecordController.java
index fe30a4ab2..83b8f9b3f 100644
--- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/signin/MemberSignInRecordController.java
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/signin/MemberSignInRecordController.java
@@ -27,7 +27,7 @@ import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.
@Tag(name = "管理后台 - 签到记录")
@RestController
-@RequestMapping("/member/point/sign-in-record")
+@RequestMapping("/member/sign-in/record")
@Validated
public class MemberSignInRecordController {
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/signin/vo/record/MemberSignInRecordPageReqVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/signin/vo/record/MemberSignInRecordPageReqVO.java
index 116c8f600..b46712b6e 100644
--- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/signin/vo/record/MemberSignInRecordPageReqVO.java
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/signin/vo/record/MemberSignInRecordPageReqVO.java
@@ -23,7 +23,7 @@ public class MemberSignInRecordPageReqVO extends PageParam {
@Schema(description = "第几天签到", example = "10")
private Integer day;
- @Schema(description = "用户ID", example = "123")
+ @Schema(description = "用户编号", example = "123")
private Long userId;
@Schema(description = "签到时间")
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/tag/MemberTagController.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/tag/MemberTagController.java
index 28110015c..34f3c20cc 100644
--- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/tag/MemberTagController.java
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/tag/MemberTagController.java
@@ -65,6 +65,15 @@ public class MemberTagController {
return success(MemberTagConvert.INSTANCE.convert(tag));
}
+ @GetMapping("/list-all-simple")
+ @Operation(summary = "获取会员标签精简信息列表", description = "只包含被开启的会员标签,主要用于前端的下拉选项")
+ public CommonResult> getSimpleTagList() {
+ // 获用户列表,只要开启状态的
+ List list = tagService.getTagList();
+ // 排序后,返回给前端
+ return success(MemberTagConvert.INSTANCE.convertList(list));
+ }
+
@GetMapping("/list")
@Operation(summary = "获得会员标签列表")
@Parameter(name = "ids", description = "编号列表", required = true, example = "1024,2048")
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/user/MemberUserController.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/user/MemberUserController.java
index 56b563dd2..e93aa0fde 100644
--- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/user/MemberUserController.java
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/user/MemberUserController.java
@@ -5,10 +5,15 @@ 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.MemberUserUpdateLevelReqVO;
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.group.MemberGroupDO;
+import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelDO;
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.group.MemberGroupService;
+import cn.iocoder.yudao.module.member.service.level.MemberLevelService;
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;
@@ -27,6 +32,7 @@ import java.util.Set;
import java.util.stream.Collectors;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
@Tag(name = "管理后台 - 会员用户")
@RestController
@@ -38,6 +44,10 @@ public class MemberUserController {
private MemberUserService memberUserService;
@Resource
private MemberTagService memberTagService;
+ @Resource
+ private MemberLevelService memberLevelService;
+ @Resource
+ private MemberGroupService memberGroupService;
@PutMapping("/update")
@Operation(summary = "更新会员用户")
@@ -47,6 +57,14 @@ public class MemberUserController {
return success(true);
}
+ @PutMapping("/update-level")
+ @Operation(summary = "更新会员用户等级")
+ @PreAuthorize("@ss.hasPermission('member:user:update-level')")
+ public CommonResult updateUserLevel(@Valid @RequestBody MemberUserUpdateLevelReqVO updateReqVO) {
+ memberLevelService.updateUserLevel(updateReqVO);
+ return success(true);
+ }
+
@GetMapping("/get")
@Operation(summary = "获得会员用户")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@@ -65,14 +83,20 @@ public class MemberUserController {
return success(PageResult.empty());
}
- // 处理会员标签返显
+ // 处理用户标签返显
Set tagIds = pageResult.getList().stream()
.map(MemberUserDO::getTagIds)
.filter(Objects::nonNull)
.flatMap(Collection::stream)
.collect(Collectors.toSet());
List tags = memberTagService.getTagList(tagIds);
- return success(MemberUserConvert.INSTANCE.convertPage(pageResult, tags));
+ // 处理用户级别返显
+ List levels = memberLevelService.getLevelList(
+ convertSet(pageResult.getList(), MemberUserDO::getLevelId));
+ // 处理用户分组返显
+ List groups = memberGroupService.getGroupList(
+ convertSet(pageResult.getList(), MemberUserDO::getGroupId));
+ return success(MemberUserConvert.INSTANCE.convertPage(pageResult, tags, levels, groups));
}
}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/user/vo/MemberUserBaseVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/user/vo/MemberUserBaseVO.java
index 90743042c..e20963e5e 100644
--- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/user/vo/MemberUserBaseVO.java
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/user/vo/MemberUserBaseVO.java
@@ -40,10 +40,10 @@ public class MemberUserBaseVO {
@Schema(description = "用户性别", example = "1")
private Byte sex;
- @Schema(description = "所在地", example = "4371")
+ @Schema(description = "所在地编号", example = "4371")
private Long areaId;
- @Schema(description = "所在地可视化显示", example = "4371")
+ @Schema(description = "所在地全程", example = "上海上海市普陀区")
private String areaName;
@Schema(description = "出生日期", example = "2023-03-12")
@@ -56,4 +56,10 @@ public class MemberUserBaseVO {
@Schema(description = "会员标签", example = "[1, 2]")
private List tagIds;
+ @Schema(description = "会员等级编号", example = "1")
+ private Long levelId;
+
+ @Schema(description = "用户分组编号", example = "1")
+ private Long groupId;
+
}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/user/vo/MemberUserPageReqVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/user/vo/MemberUserPageReqVO.java
index c4c9ae3dc..80573030b 100644
--- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/user/vo/MemberUserPageReqVO.java
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/user/vo/MemberUserPageReqVO.java
@@ -32,7 +32,13 @@ public class MemberUserPageReqVO extends PageParam {
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
- @Schema(description = "会员标签", example = "[1, 2]")
+ @Schema(description = "会员标签编号列表", example = "[1, 2]")
private List tagIds;
+ @Schema(description = "会员等级编号", example = "1")
+ private Long levelId;
+
+ @Schema(description = "用户分组编号", example = "1")
+ private Long groupId;
+
}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/user/vo/MemberUserRespVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/user/vo/MemberUserRespVO.java
index 7b47cd5fb..1cd228335 100644
--- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/user/vo/MemberUserRespVO.java
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/user/vo/MemberUserRespVO.java
@@ -29,10 +29,24 @@ public class MemberUserRespVO extends MemberUserBaseVO {
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
private LocalDateTime createTime;
-
// ========== 其它信息 ==========
+ @Schema(description = "积分", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
+ private Integer point;
+
+ @Schema(description = "总积分", requiredMode = Schema.RequiredMode.REQUIRED, example = "2000")
+ private Integer totalPoint;
+
@Schema(description = "会员标签", example = "[红色, 快乐]")
private List tagNames;
+ @Schema(description = "会员等级", example = "黄金会员")
+ private String levelName;
+
+ @Schema(description = "用户分组", example = "购物达人")
+ private String groupName;
+
+ @Schema(description = "用户经验值", requiredMode = Schema.RequiredMode.REQUIRED, example = "200")
+ private Integer experience;
+
}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/user/vo/MemberUserUpdateLevelReqVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/user/vo/MemberUserUpdateLevelReqVO.java
new file mode 100644
index 000000000..a2ca91135
--- /dev/null
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/admin/user/vo/MemberUserUpdateLevelReqVO.java
@@ -0,0 +1,31 @@
+package cn.iocoder.yudao.module.member.controller.admin.user.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+@Schema(description = "管理后台 - 会员用户 修改等级 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class MemberUserUpdateLevelReqVO extends MemberUserBaseVO {
+
+ @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "23788")
+ @NotNull(message = "用户编号不能为空")
+ private Long id;
+
+ /**
+ * 取消用户等级时,值为空
+ */
+ @Schema(description = "用户等级编号", example = "1")
+ private Long levelId;
+
+ @Schema(description = "修改原因", requiredMode = Schema.RequiredMode.REQUIRED, example = "推广需要")
+ @NotBlank(message = "修改原因不能为空")
+ private String reason;
+
+}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/point/AppMemberPointRecordController.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/point/AppMemberPointRecordController.java
new file mode 100644
index 000000000..1d8bd75a2
--- /dev/null
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/point/AppMemberPointRecordController.java
@@ -0,0 +1,39 @@
+package cn.iocoder.yudao.module.member.controller.app.point;
+
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.member.controller.app.point.vo.AppMemberPointRecordRespVO;
+import cn.iocoder.yudao.module.member.convert.point.MemberPointRecordConvert;
+import cn.iocoder.yudao.module.member.dal.dataobject.point.MemberPointRecordDO;
+import cn.iocoder.yudao.module.member.service.point.MemberPointRecordService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import javax.validation.Valid;
+
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
+
+@Tag(name = "用户 App - 签到记录")
+@RestController
+@RequestMapping("/member/point/record")
+@Validated
+public class AppMemberPointRecordController {
+
+ @Resource
+ private MemberPointRecordService pointRecordService;
+
+ @GetMapping("/page")
+ @Operation(summary = "获得用户积分记录分页")
+ public CommonResult> getPointRecordPage(@Valid PageParam pageVO) {
+ PageResult pageResult = pointRecordService.getPointRecordPage(getLoginUserId(), pageVO);
+ return success(MemberPointRecordConvert.INSTANCE.convertPage02(pageResult));
+ }
+
+}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/point/vo/AppMemberPointRecordRespVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/point/vo/AppMemberPointRecordRespVO.java
new file mode 100644
index 000000000..ec95b2e02
--- /dev/null
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/point/vo/AppMemberPointRecordRespVO.java
@@ -0,0 +1,27 @@
+package cn.iocoder.yudao.module.member.controller.app.point.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "用户 App - 用户积分记录 Response VO")
+@Data
+public class AppMemberPointRecordRespVO {
+
+ @Schema(description = "自增主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "31457")
+ private Long id;;
+
+ @Schema(description = "积分标题", requiredMode = Schema.RequiredMode.REQUIRED, example = "你猜")
+ private String title;
+
+ @Schema(description = "积分描述", example = "你猜")
+ private String description;
+
+ @Schema(description = "积分", requiredMode = Schema.RequiredMode.REQUIRED, example = "100")
+ private Integer point;
+
+ @Schema(description = "发生时间", requiredMode = Schema.RequiredMode.REQUIRED)
+ private LocalDateTime createTime;
+
+}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/signin/AppMemberSignInConfigController.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/signin/AppMemberSignInConfigController.java
new file mode 100644
index 000000000..62a52e3d8
--- /dev/null
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/signin/AppMemberSignInConfigController.java
@@ -0,0 +1,37 @@
+package cn.iocoder.yudao.module.member.controller.app.signin;
+
+import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.module.member.controller.app.signin.vo.config.AppMemberSignInConfigRespVO;
+import cn.iocoder.yudao.module.member.convert.signin.MemberSignInConfigConvert;
+import cn.iocoder.yudao.module.member.dal.dataobject.signin.MemberSignInConfigDO;
+import cn.iocoder.yudao.module.member.service.signin.MemberSignInConfigService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+
+@Tag(name = "用户 App - 签到规则")
+@RestController
+@RequestMapping("/member/sign-in/config")
+@Validated
+public class AppMemberSignInConfigController {
+
+ @Resource
+ private MemberSignInConfigService signInConfigService;
+
+ @GetMapping("/list")
+ @Operation(summary = "获得签到规则列表")
+ public CommonResult> getSignInConfigList() {
+ List pageResult = signInConfigService.getSignInConfigList(CommonStatusEnum.ENABLE.getStatus());
+ return success(MemberSignInConfigConvert.INSTANCE.convertList02(pageResult));
+ }
+
+}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/signin/AppMemberSignInRecordController.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/signin/AppMemberSignInRecordController.java
new file mode 100644
index 000000000..bcc2227c1
--- /dev/null
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/signin/AppMemberSignInRecordController.java
@@ -0,0 +1,69 @@
+package cn.iocoder.yudao.module.member.controller.app.signin;
+
+import cn.iocoder.yudao.framework.common.pojo.CommonResult;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.member.controller.app.signin.vo.record.AppMemberSignInRecordRespVO;
+import cn.iocoder.yudao.module.member.controller.app.signin.vo.record.AppMemberSignInRecordSummaryRespVO;
+import cn.iocoder.yudao.module.member.convert.signin.MemberSignInRecordConvert;
+import cn.iocoder.yudao.module.member.dal.dataobject.signin.MemberSignInRecordDO;
+import cn.iocoder.yudao.module.member.service.signin.MemberSignInRecordService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.time.LocalDateTime;
+
+import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
+import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
+
+@Tag(name = "管理后台 - 签到记录")
+@RestController
+@RequestMapping("/member/sign-in/record")
+@Validated
+public class AppMemberSignInRecordController {
+
+ @Resource
+ private MemberSignInRecordService signInRecordService;
+
+ // TODO 芋艿:临时 mock => UserSignController.getUserInfo
+ @GetMapping("/get-summary")
+ @Operation(summary = "获得个人签到统计")
+ public CommonResult getSignInRecordSummary() {
+ AppMemberSignInRecordSummaryRespVO respVO = new AppMemberSignInRecordSummaryRespVO();
+ if (false) {
+ respVO.setTotalDay(100);
+ respVO.setContinuousDay(5);
+ respVO.setTodaySignIn(true);
+ } else {
+ respVO.setTotalDay(100);
+ respVO.setContinuousDay(10);
+ respVO.setTodaySignIn(false);
+ }
+ return success(respVO);
+ }
+
+ // TODO 芋艿:临时 mock => UserSignController.info
+ @PostMapping("/create")
+ @Operation(summary = "签到")
+ public CommonResult createSignInRecord() {
+ AppMemberSignInRecordRespVO respVO = new AppMemberSignInRecordRespVO()
+ .setPoint(10)
+ .setDay(10)
+ .setCreateTime(LocalDateTime.now());
+ return success(respVO);
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "获得签到记录分页")
+ public CommonResult> getSignRecordPage(PageParam pageParam) {
+ PageResult pageResult = signInRecordService.getSignRecordPage(getLoginUserId(), pageParam);
+ return success(MemberSignInRecordConvert.INSTANCE.convertPage02(pageResult));
+ }
+
+}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/signin/vo/config/AppMemberSignInConfigRespVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/signin/vo/config/AppMemberSignInConfigRespVO.java
new file mode 100644
index 000000000..a18d3a28e
--- /dev/null
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/signin/vo/config/AppMemberSignInConfigRespVO.java
@@ -0,0 +1,16 @@
+package cn.iocoder.yudao.module.member.controller.app.signin.vo.config;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Schema(description = "用户 App - 签到规则 Response VO")
+@Data
+public class AppMemberSignInConfigRespVO {
+
+ @Schema(description = "签到第 x 天", requiredMode = Schema.RequiredMode.REQUIRED, example = "7")
+ private Integer day;
+
+ @Schema(description = "奖励积分", requiredMode = Schema.RequiredMode.REQUIRED, example = "10")
+ private Integer point;
+
+}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/signin/vo/record/AppMemberSignInRecordRespVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/signin/vo/record/AppMemberSignInRecordRespVO.java
new file mode 100644
index 000000000..287408ce6
--- /dev/null
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/signin/vo/record/AppMemberSignInRecordRespVO.java
@@ -0,0 +1,21 @@
+package cn.iocoder.yudao.module.member.controller.app.signin.vo.record;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "用户 App - 签到记录 Response VO")
+@Data
+public class AppMemberSignInRecordRespVO {
+
+ @Schema(description = "第几天签到", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+ private Integer day;
+
+ @Schema(description = "签到的分数", requiredMode = Schema.RequiredMode.REQUIRED, example = "10")
+ private Integer point;
+
+ @Schema(description = "签到时间", requiredMode = Schema.RequiredMode.REQUIRED)
+ private LocalDateTime createTime;
+
+}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/signin/vo/record/AppMemberSignInRecordSummaryRespVO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/signin/vo/record/AppMemberSignInRecordSummaryRespVO.java
new file mode 100644
index 000000000..30fb66a15
--- /dev/null
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/controller/app/signin/vo/record/AppMemberSignInRecordSummaryRespVO.java
@@ -0,0 +1,19 @@
+package cn.iocoder.yudao.module.member.controller.app.signin.vo.record;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Schema(description = "用户 App - 个人签到统计 Response VO")
+@Data
+public class AppMemberSignInRecordSummaryRespVO {
+
+ @Schema(description = "总签到天数", requiredMode = Schema.RequiredMode.REQUIRED, example = "10")
+ private Integer totalDay;
+
+ @Schema(description = "连续签到第 x 天", requiredMode = Schema.RequiredMode.REQUIRED, example = "3")
+ private Integer continuousDay;
+
+ @Schema(description = "今天是否已签到", requiredMode = Schema.RequiredMode.REQUIRED, example = "true")
+ private Boolean todaySignIn;
+
+}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/convert/address/AddressConvert.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/convert/address/AddressConvert.java
index e6f56a022..fd5198e14 100644
--- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/convert/address/AddressConvert.java
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/convert/address/AddressConvert.java
@@ -1,12 +1,8 @@
package cn.iocoder.yudao.module.member.convert.address;
-import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.ip.core.utils.AreaUtils;
import cn.iocoder.yudao.module.member.api.address.dto.AddressRespDTO;
-import cn.iocoder.yudao.module.member.controller.admin.address.vo.AddressCreateReqVO;
-import cn.iocoder.yudao.module.member.controller.admin.address.vo.AddressExcelVO;
import cn.iocoder.yudao.module.member.controller.admin.address.vo.AddressRespVO;
-import cn.iocoder.yudao.module.member.controller.admin.address.vo.AddressUpdateReqVO;
import cn.iocoder.yudao.module.member.controller.app.address.vo.AppAddressCreateReqVO;
import cn.iocoder.yudao.module.member.controller.app.address.vo.AppAddressRespVO;
import cn.iocoder.yudao.module.member.controller.app.address.vo.AppAddressUpdateReqVO;
@@ -44,15 +40,6 @@ public interface AddressConvert {
return AreaUtils.format(areaId);
}
- MemberAddressDO convert(AddressCreateReqVO bean);
-
- MemberAddressDO convert(AddressUpdateReqVO bean);
-
- AddressRespVO convert2(MemberAddressDO bean);
-
List convertList2(List list);
- PageResult convertPage(PageResult page);
-
- List convertList02(List list);
}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/convert/group/MemberGroupConvert.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/convert/group/MemberGroupConvert.java
new file mode 100644
index 000000000..06f49d60c
--- /dev/null
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/convert/group/MemberGroupConvert.java
@@ -0,0 +1,35 @@
+package cn.iocoder.yudao.module.member.convert.group;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.member.controller.admin.group.vo.MemberGroupCreateReqVO;
+import cn.iocoder.yudao.module.member.controller.admin.group.vo.MemberGroupRespVO;
+import cn.iocoder.yudao.module.member.controller.admin.group.vo.MemberGroupSimpleRespVO;
+import cn.iocoder.yudao.module.member.controller.admin.group.vo.MemberGroupUpdateReqVO;
+import cn.iocoder.yudao.module.member.dal.dataobject.group.MemberGroupDO;
+import org.mapstruct.Mapper;
+import org.mapstruct.factory.Mappers;
+
+import java.util.List;
+
+/**
+ * 用户分组 Convert
+ *
+ * @author owen
+ */
+@Mapper
+public interface MemberGroupConvert {
+
+ MemberGroupConvert INSTANCE = Mappers.getMapper(MemberGroupConvert.class);
+
+ MemberGroupDO convert(MemberGroupCreateReqVO bean);
+
+ MemberGroupDO convert(MemberGroupUpdateReqVO bean);
+
+ MemberGroupRespVO convert(MemberGroupDO bean);
+
+ List convertList(List list);
+
+ PageResult convertPage(PageResult page);
+
+ List convertSimpleList(List list);
+}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/convert/level/MemberExperienceRecordConvert.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/convert/level/MemberExperienceRecordConvert.java
new file mode 100644
index 000000000..cd51ba50e
--- /dev/null
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/convert/level/MemberExperienceRecordConvert.java
@@ -0,0 +1,30 @@
+package cn.iocoder.yudao.module.member.convert.level;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.member.controller.admin.level.vo.experience.MemberExperienceRecordRespVO;
+import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberExperienceRecordDO;
+import org.mapstruct.Mapper;
+import org.mapstruct.factory.Mappers;
+
+import java.util.List;
+
+/**
+ * 会员经验记录 Convert
+ *
+ * @author owen
+ */
+@Mapper
+public interface MemberExperienceRecordConvert {
+
+ MemberExperienceRecordConvert INSTANCE = Mappers.getMapper(MemberExperienceRecordConvert.class);
+
+ MemberExperienceRecordRespVO convert(MemberExperienceRecordDO bean);
+
+ List convertList(List list);
+
+ PageResult convertPage(PageResult page);
+
+ MemberExperienceRecordDO convert(Long userId, Integer experience, Integer totalExperience,
+ String bizId, Integer bizType,
+ String title, String description);
+}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/convert/level/MemberLevelConvert.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/convert/level/MemberLevelConvert.java
new file mode 100644
index 000000000..4788bf365
--- /dev/null
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/convert/level/MemberLevelConvert.java
@@ -0,0 +1,32 @@
+package cn.iocoder.yudao.module.member.convert.level;
+
+import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelCreateReqVO;
+import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelRespVO;
+import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelSimpleRespVO;
+import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelUpdateReqVO;
+import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelDO;
+import org.mapstruct.Mapper;
+import org.mapstruct.factory.Mappers;
+
+import java.util.List;
+
+/**
+ * 会员等级 Convert
+ *
+ * @author owen
+ */
+@Mapper
+public interface MemberLevelConvert {
+
+ MemberLevelConvert INSTANCE = Mappers.getMapper(MemberLevelConvert.class);
+
+ MemberLevelDO convert(MemberLevelCreateReqVO bean);
+
+ MemberLevelDO convert(MemberLevelUpdateReqVO bean);
+
+ MemberLevelRespVO convert(MemberLevelDO bean);
+
+ List convertList(List list);
+
+ List convertSimpleList(List list);
+}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/convert/level/MemberLevelRecordConvert.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/convert/level/MemberLevelRecordConvert.java
new file mode 100644
index 000000000..9c167930c
--- /dev/null
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/convert/level/MemberLevelRecordConvert.java
@@ -0,0 +1,37 @@
+package cn.iocoder.yudao.module.member.convert.level;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.member.controller.admin.level.vo.log.MemberLevelRecordRespVO;
+import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelDO;
+import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelRecordDO;
+import org.mapstruct.Mapper;
+import org.mapstruct.factory.Mappers;
+
+import java.util.List;
+
+/**
+ * 会员等级记录 Convert
+ *
+ * @author owen
+ */
+@Mapper
+public interface MemberLevelRecordConvert {
+
+ MemberLevelRecordConvert INSTANCE = Mappers.getMapper(MemberLevelRecordConvert.class);
+
+ MemberLevelRecordRespVO convert(MemberLevelRecordDO bean);
+
+ List convertList(List list);
+
+ PageResult convertPage(PageResult page);
+
+ default MemberLevelRecordDO copyTo(MemberLevelDO from, MemberLevelRecordDO to) {
+ if (from != null) {
+ to.setLevelId(from.getId());
+ to.setLevel(from.getLevel());
+ to.setDiscountPercent(from.getDiscountPercent());
+ to.setExperience(from.getExperience());
+ }
+ return to;
+ }
+}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/convert/point/MemberPointRecordConvert.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/convert/point/MemberPointRecordConvert.java
index 5f6d03503..1d2c146d2 100644
--- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/convert/point/MemberPointRecordConvert.java
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/convert/point/MemberPointRecordConvert.java
@@ -4,6 +4,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
import cn.iocoder.yudao.module.member.controller.admin.point.vo.recrod.MemberPointRecordRespVO;
+import cn.iocoder.yudao.module.member.controller.app.point.vo.AppMemberPointRecordRespVO;
import cn.iocoder.yudao.module.member.dal.dataobject.point.MemberPointRecordDO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
@@ -33,4 +34,6 @@ public interface MemberPointRecordConvert {
}
PageResult convertPage(PageResult pageResult);
+ PageResult convertPage02(PageResult pageResult);
+
}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/convert/signin/MemberSignInConfigConvert.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/convert/signin/MemberSignInConfigConvert.java
index 23a3f7c57..5acd87151 100644
--- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/convert/signin/MemberSignInConfigConvert.java
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/convert/signin/MemberSignInConfigConvert.java
@@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.member.convert.signin;
import cn.iocoder.yudao.module.member.controller.admin.signin.vo.config.MemberSignInConfigCreateReqVO;
import cn.iocoder.yudao.module.member.controller.admin.signin.vo.config.MemberSignInConfigRespVO;
import cn.iocoder.yudao.module.member.controller.admin.signin.vo.config.MemberSignInConfigUpdateReqVO;
+import cn.iocoder.yudao.module.member.controller.app.signin.vo.config.AppMemberSignInConfigRespVO;
import cn.iocoder.yudao.module.member.dal.dataobject.signin.MemberSignInConfigDO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
@@ -27,4 +28,6 @@ public interface MemberSignInConfigConvert {
List convertList(List list);
+ List convertList02(List list);
+
}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/convert/signin/MemberSignInRecordConvert.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/convert/signin/MemberSignInRecordConvert.java
index 73280d641..c5022b854 100644
--- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/convert/signin/MemberSignInRecordConvert.java
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/convert/signin/MemberSignInRecordConvert.java
@@ -4,6 +4,7 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
import cn.iocoder.yudao.module.member.api.user.dto.MemberUserRespDTO;
import cn.iocoder.yudao.module.member.controller.admin.signin.vo.record.MemberSignInRecordRespVO;
+import cn.iocoder.yudao.module.member.controller.app.signin.vo.record.AppMemberSignInRecordRespVO;
import cn.iocoder.yudao.module.member.dal.dataobject.signin.MemberSignInRecordDO;
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
@@ -33,4 +34,6 @@ public interface MemberSignInRecordConvert {
}
PageResult convertPage(PageResult pageResult);
+ PageResult convertPage02(PageResult pageResult);
+
}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/convert/user/MemberUserConvert.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/convert/user/MemberUserConvert.java
index b95557dcf..5b963be69 100644
--- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/convert/user/MemberUserConvert.java
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/convert/user/MemberUserConvert.java
@@ -6,6 +6,8 @@ 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.controller.app.user.vo.AppMemberUserInfoRespVO;
import cn.iocoder.yudao.module.member.convert.address.AddressConvert;
+import cn.iocoder.yudao.module.member.dal.dataobject.group.MemberGroupDO;
+import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelDO;
import cn.iocoder.yudao.module.member.dal.dataobject.tag.MemberTagDO;
import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
import org.mapstruct.Mapper;
@@ -33,16 +35,25 @@ public interface MemberUserConvert {
PageResult convertPage(PageResult page);
- @Mapping(source = "areaId", target = "areaName", qualifiedByName = "convertAreaIdToAreaName")
+ @Mapping(source = "areaId", target = "areaName", qualifiedByName = "convertAreaIdToAreaName")
MemberUserRespVO convert03(MemberUserDO bean);
default PageResult convertPage(PageResult pageResult,
- List tags) {
+ List tags,
+ List levels,
+ List groups) {
PageResult result = convertPage(pageResult);
+ // 处理关联数据
Map tagMap = convertMap(tags, MemberTagDO::getId, MemberTagDO::getName);
- for (MemberUserRespVO vo : result.getList()) {
- vo.setTagNames(convertList(vo.getTagIds(), tagMap::get));
- }
+ Map levelMap = convertMap(levels, MemberLevelDO::getId, MemberLevelDO::getName);
+ Map groupMap = convertMap(groups, MemberGroupDO::getId, MemberGroupDO::getName);
+ // 填充关联数据
+ result.getList().forEach(user -> {
+ user.setTagNames(convertList(user.getTagIds(), tagMap::get));
+ user.setLevelName(levelMap.get(user.getLevelId()));
+ user.setGroupName(groupMap.get(user.getGroupId()));
+ });
return result;
}
+
}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/group/MemberGroupDO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/group/MemberGroupDO.java
new file mode 100644
index 000000000..c9a82ab5d
--- /dev/null
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/group/MemberGroupDO.java
@@ -0,0 +1,45 @@
+package cn.iocoder.yudao.module.member.dal.dataobject.group;
+
+import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+/**
+ * 用户分组 DO
+ *
+ * @author owen
+ */
+@TableName("member_group")
+@KeySequence("member_group_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class MemberGroupDO extends BaseDO {
+
+ /**
+ * 编号
+ */
+ @TableId
+ private Long id;
+ /**
+ * 名称
+ */
+ private String name;
+ /**
+ * 备注
+ */
+ private String remark;
+ /**
+ * 状态
+ *
+ * 枚举 {@link CommonStatusEnum}
+ */
+ private Integer status;
+
+}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/level/MemberExperienceRecordDO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/level/MemberExperienceRecordDO.java
new file mode 100644
index 000000000..d7c06d4ba
--- /dev/null
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/level/MemberExperienceRecordDO.java
@@ -0,0 +1,64 @@
+package cn.iocoder.yudao.module.member.dal.dataobject.level;
+
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
+import cn.iocoder.yudao.module.member.enums.MemberExperienceBizTypeEnum;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+/**
+ * 会员经验记录 DO
+ *
+ * @author owen
+ */
+@TableName("member_experience_record")
+@KeySequence("member_experience_record_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class MemberExperienceRecordDO extends BaseDO {
+
+ /**
+ * 编号
+ */
+ @TableId
+ private Long id;
+ /**
+ * 用户编号
+ *
+ * 关联 {@link MemberUserDO#getId()} 字段
+ */
+ private Long userId;
+ /**
+ * 业务类型
+ *
+ * 枚举 {@link MemberExperienceBizTypeEnum}
+ */
+ private Integer bizType;
+ /**
+ * 业务编号
+ */
+ private String bizId;
+ /**
+ * 标题
+ */
+ private String title;
+ /**
+ * 描述
+ */
+ private String description;
+ /**
+ * 经验
+ */
+ private Integer experience;
+ /**
+ * 变更后的经验
+ */
+ private Integer totalExperience;
+
+}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/level/MemberLevelDO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/level/MemberLevelDO.java
new file mode 100644
index 000000000..05035ffe5
--- /dev/null
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/level/MemberLevelDO.java
@@ -0,0 +1,64 @@
+package cn.iocoder.yudao.module.member.dal.dataobject.level;
+
+import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+/**
+ * 会员等级 DO
+ *
+ * 配置每个等级需要的积分
+ *
+ * @author owen
+ */
+@TableName("member_level")
+@KeySequence("member_level_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class MemberLevelDO extends BaseDO {
+
+ /**
+ * 编号
+ */
+ @TableId
+ private Long id;
+ /**
+ * 等级名称
+ */
+ private String name;
+ /**
+ * 等级
+ */
+ private Integer level;
+ /**
+ * 升级经验
+ */
+ private Integer experience;
+ /**
+ * 享受折扣
+ */
+ private Integer discountPercent;
+
+ /**
+ * 等级图标
+ */
+ private String icon;
+ /**
+ * 等级背景图
+ */
+ private String backgroundUrl;
+ /**
+ * 状态
+ *
+ * 枚举 {@link CommonStatusEnum}
+ */
+ private Integer status;
+
+}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/level/MemberLevelRecordDO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/level/MemberLevelRecordDO.java
new file mode 100644
index 000000000..8b5451d45
--- /dev/null
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/level/MemberLevelRecordDO.java
@@ -0,0 +1,71 @@
+package cn.iocoder.yudao.module.member.dal.dataobject.level;
+
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.*;
+
+/**
+ * 会员等级记录 DO
+ *
+ * 用户每次等级发生变更时,记录一条日志
+ *
+ * @author owen
+ */
+@TableName("member_level_record")
+@KeySequence("member_level_record_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class MemberLevelRecordDO extends BaseDO {
+
+ /**
+ * 编号
+ */
+ @TableId
+ private Long id;
+ /**
+ * 用户编号
+ *
+ * 关联 {@link MemberUserDO#getId()} 字段
+ */
+ private Long userId;
+ /**
+ * 等级编号
+ *
+ * 关联 {@link MemberLevelDO#getId()} 字段
+ */
+ private Long levelId;
+ /**
+ * 会员等级
+ *
+ * 冗余 {@link MemberLevelDO#getLevel()} 字段
+ */
+ private Integer level;
+ /**
+ * 享受折扣
+ */
+ private Integer discountPercent;
+ /**
+ * 升级经验
+ */
+ private Integer experience;
+ /**
+ * 会员此时的经验
+ */
+ private Integer userExperience;
+ /**
+ * 备注
+ */
+ private String remark;
+ /**
+ * 描述
+ */
+ private String description;
+
+}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/signin/MemberSignInRecordDO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/signin/MemberSignInRecordDO.java
index 0734e7517..906fe6ca0 100644
--- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/signin/MemberSignInRecordDO.java
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/signin/MemberSignInRecordDO.java
@@ -22,7 +22,7 @@ import lombok.*;
public class MemberSignInRecordDO extends BaseDO {
/**
- * 签到自增id
+ * 编号
*/
@TableId
private Long id;
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/user/MemberUserDO.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/user/MemberUserDO.java
index 4cc1a7196..520d5a7d1 100644
--- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/user/MemberUserDO.java
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/dataobject/user/MemberUserDO.java
@@ -4,6 +4,8 @@ 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.member.dal.dataobject.group.MemberGroupDO;
+import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelDO;
import cn.iocoder.yudao.module.system.enums.common.SexEnum;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableField;
@@ -109,6 +111,7 @@ public class MemberUserDO extends TenantBaseDO {
* 积分
*/
private Integer point;
+ // TODO 芋艿:增加一个 totalPoint;个人信息接口要返回
/**
* 会员标签列表,以逗号分隔
@@ -116,5 +119,21 @@ public class MemberUserDO extends TenantBaseDO {
@TableField(typeHandler = LongListTypeHandler.class)
private List tagIds;
- // TODO 成长值、会员等级等等
+ /**
+ * 会员级别编号
+ *
+ * 关联 {@link MemberLevelDO#getId()} 字段
+ */
+ private Long levelId;
+ /**
+ * 会员经验
+ */
+ private Integer experience;
+ /**
+ * 用户分组编号
+ *
+ * 关联 {@link MemberGroupDO#getId()} 字段
+ */
+ private Long groupId;
+
}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/address/AddressMapper.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/address/AddressMapper.java
index 9beb025c0..db824f6f5 100644
--- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/address/AddressMapper.java
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/address/AddressMapper.java
@@ -1,10 +1,7 @@
package cn.iocoder.yudao.module.member.dal.mysql.address;
-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;
-import cn.iocoder.yudao.module.member.controller.admin.address.vo.AddressExportReqVO;
-import cn.iocoder.yudao.module.member.controller.admin.address.vo.AddressPageReqVO;
import cn.iocoder.yudao.module.member.dal.dataobject.address.MemberAddressDO;
import org.apache.ibatis.annotations.Mapper;
@@ -21,28 +18,5 @@ public interface AddressMapper extends BaseMapperX {
return selectList(new LambdaQueryWrapperX().eq(MemberAddressDO::getUserId, userId)
.eqIfPresent(MemberAddressDO::getDefaultStatus, defaulted));
}
- default PageResult selectPage(AddressPageReqVO reqVO) {
- return selectPage(reqVO, new LambdaQueryWrapperX()
- .eqIfPresent(MemberAddressDO::getUserId, reqVO.getUserId())
- .likeIfPresent(MemberAddressDO::getName, reqVO.getName())
- .eqIfPresent(MemberAddressDO::getMobile, reqVO.getMobile())
- .eqIfPresent(MemberAddressDO::getAreaId, reqVO.getAreaId())
- .eqIfPresent(MemberAddressDO::getDetailAddress, reqVO.getDetailAddress())
- .eqIfPresent(MemberAddressDO::getDefaultStatus, reqVO.getDefaultStatus())
- .betweenIfPresent(MemberAddressDO::getCreateTime, reqVO.getCreateTime())
- .orderByDesc(MemberAddressDO::getId));
- }
-
- default List selectList(AddressExportReqVO reqVO) {
- return selectList(new LambdaQueryWrapperX()
- .eqIfPresent(MemberAddressDO::getUserId, reqVO.getUserId())
- .likeIfPresent(MemberAddressDO::getName, reqVO.getName())
- .eqIfPresent(MemberAddressDO::getMobile, reqVO.getMobile())
- .eqIfPresent(MemberAddressDO::getAreaId, reqVO.getAreaId())
- .eqIfPresent(MemberAddressDO::getDetailAddress, reqVO.getDetailAddress())
- .eqIfPresent(MemberAddressDO::getDefaultStatus, reqVO.getDefaultStatus())
- .betweenIfPresent(MemberAddressDO::getCreateTime, reqVO.getCreateTime())
- .orderByDesc(MemberAddressDO::getId));
- }
}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/group/MemberGroupMapper.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/group/MemberGroupMapper.java
new file mode 100644
index 000000000..da4f7b7a8
--- /dev/null
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/group/MemberGroupMapper.java
@@ -0,0 +1,31 @@
+package cn.iocoder.yudao.module.member.dal.mysql.group;
+
+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;
+import cn.iocoder.yudao.module.member.controller.admin.group.vo.MemberGroupPageReqVO;
+import cn.iocoder.yudao.module.member.dal.dataobject.group.MemberGroupDO;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+/**
+ * 用户分组 Mapper
+ *
+ * @author owen
+ */
+@Mapper
+public interface MemberGroupMapper extends BaseMapperX {
+
+ default PageResult selectPage(MemberGroupPageReqVO reqVO) {
+ return selectPage(reqVO, new LambdaQueryWrapperX()
+ .likeIfPresent(MemberGroupDO::getName, reqVO.getName())
+ .eqIfPresent(MemberGroupDO::getStatus, reqVO.getStatus())
+ .betweenIfPresent(MemberGroupDO::getCreateTime, reqVO.getCreateTime())
+ .orderByDesc(MemberGroupDO::getId));
+ }
+
+ default List selectListByStatus(Integer status) {
+ return selectList(MemberGroupDO::getStatus, status);
+ }
+}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/level/MemberExperienceRecordMapper.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/level/MemberExperienceRecordMapper.java
new file mode 100644
index 000000000..8e5065472
--- /dev/null
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/level/MemberExperienceRecordMapper.java
@@ -0,0 +1,28 @@
+package cn.iocoder.yudao.module.member.dal.mysql.level;
+
+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;
+import cn.iocoder.yudao.module.member.controller.admin.level.vo.experience.MemberExperienceRecordPageReqVO;
+import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberExperienceRecordDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 会员经验记录 Mapper
+ *
+ * @author owen
+ */
+@Mapper
+public interface MemberExperienceRecordMapper extends BaseMapperX {
+
+ default PageResult selectPage(MemberExperienceRecordPageReqVO reqVO) {
+ return selectPage(reqVO, new LambdaQueryWrapperX()
+ .eqIfPresent(MemberExperienceRecordDO::getUserId, reqVO.getUserId())
+ .eqIfPresent(MemberExperienceRecordDO::getBizId, reqVO.getBizId())
+ .eqIfPresent(MemberExperienceRecordDO::getBizType, reqVO.getBizType())
+ .eqIfPresent(MemberExperienceRecordDO::getTitle, reqVO.getTitle())
+ .betweenIfPresent(MemberExperienceRecordDO::getCreateTime, reqVO.getCreateTime())
+ .orderByDesc(MemberExperienceRecordDO::getId));
+ }
+
+}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/level/MemberLevelMapper.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/level/MemberLevelMapper.java
new file mode 100644
index 000000000..a7be2fd64
--- /dev/null
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/level/MemberLevelMapper.java
@@ -0,0 +1,32 @@
+package cn.iocoder.yudao.module.member.dal.mysql.level;
+
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.module.member.controller.admin.level.vo.level.MemberLevelListReqVO;
+import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelDO;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+/**
+ * 会员等级 Mapper
+ *
+ * @author owen
+ */
+@Mapper
+public interface MemberLevelMapper extends BaseMapperX {
+
+ default List selectList(MemberLevelListReqVO reqVO) {
+ return selectList(new LambdaQueryWrapperX()
+ .likeIfPresent(MemberLevelDO::getName, reqVO.getName())
+ .eqIfPresent(MemberLevelDO::getStatus, reqVO.getStatus())
+ .orderByAsc(MemberLevelDO::getLevel));
+ }
+
+
+ default List selectListByStatus(Integer status) {
+ return selectList(new LambdaQueryWrapperX()
+ .eq(MemberLevelDO::getStatus, status)
+ .orderByAsc(MemberLevelDO::getLevel));
+ }
+}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/level/MemberLevelRecordMapper.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/level/MemberLevelRecordMapper.java
new file mode 100644
index 000000000..d10b1690b
--- /dev/null
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/level/MemberLevelRecordMapper.java
@@ -0,0 +1,26 @@
+package cn.iocoder.yudao.module.member.dal.mysql.level;
+
+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;
+import cn.iocoder.yudao.module.member.controller.admin.level.vo.log.MemberLevelRecordPageReqVO;
+import cn.iocoder.yudao.module.member.dal.dataobject.level.MemberLevelRecordDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 会员等级记录 Mapper
+ *
+ * @author owen
+ */
+@Mapper
+public interface MemberLevelRecordMapper extends BaseMapperX {
+
+ default PageResult selectPage(MemberLevelRecordPageReqVO reqVO) {
+ return selectPage(reqVO, new LambdaQueryWrapperX()
+ .eqIfPresent(MemberLevelRecordDO::getUserId, reqVO.getUserId())
+ .eqIfPresent(MemberLevelRecordDO::getLevelId, reqVO.getLevelId())
+ .betweenIfPresent(MemberLevelRecordDO::getCreateTime, reqVO.getCreateTime())
+ .orderByDesc(MemberLevelRecordDO::getId));
+ }
+
+}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/point/MemberPointRecordMapper.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/point/MemberPointRecordMapper.java
index aaaad2563..5c3370929 100644
--- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/point/MemberPointRecordMapper.java
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/point/MemberPointRecordMapper.java
@@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.member.dal.mysql.point;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
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;
@@ -20,9 +21,16 @@ public interface MemberPointRecordMapper extends BaseMapperX selectPage(MemberPointRecordPageReqVO reqVO, Set userIds) {
return selectPage(reqVO, new LambdaQueryWrapperX()
.inIfPresent(MemberPointRecordDO::getUserId, userIds)
+ .eqIfPresent(MemberPointRecordDO::getUserId, reqVO.getUserId())
.eqIfPresent(MemberPointRecordDO::getBizType, reqVO.getBizType())
.likeIfPresent(MemberPointRecordDO::getTitle, reqVO.getTitle())
.orderByDesc(MemberPointRecordDO::getId));
}
+ default PageResult selectPage(Long userId, PageParam pageVO) {
+ return selectPage(pageVO, new LambdaQueryWrapperX()
+ .eq(MemberPointRecordDO::getUserId, userId)
+ .orderByDesc(MemberPointRecordDO::getId));
+ }
+
}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/signin/MemberSignInConfigMapper.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/signin/MemberSignInConfigMapper.java
index 0dcabdd64..b63b8167c 100644
--- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/signin/MemberSignInConfigMapper.java
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/signin/MemberSignInConfigMapper.java
@@ -4,6 +4,8 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.module.member.dal.dataobject.signin.MemberSignInConfigDO;
import org.apache.ibatis.annotations.Mapper;
+import java.util.List;
+
/**
* 签到规则 Mapper
*
@@ -16,4 +18,7 @@ public interface MemberSignInConfigMapper extends BaseMapperX selectListByStatus(Integer status) {
+ return selectList(MemberSignInConfigDO::getStatus, status);
+ }
}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/signin/MemberSignInRecordMapper.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/signin/MemberSignInRecordMapper.java
index 03b99707a..840eeb328 100644
--- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/signin/MemberSignInRecordMapper.java
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/signin/MemberSignInRecordMapper.java
@@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.member.dal.mysql.signin;
+import cn.iocoder.yudao.framework.common.pojo.PageParam;
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;
@@ -20,9 +21,16 @@ public interface MemberSignInRecordMapper extends BaseMapperX selectPage(MemberSignInRecordPageReqVO reqVO, Set userIds) {
return selectPage(reqVO, new LambdaQueryWrapperX()
.inIfPresent(MemberSignInRecordDO::getUserId, userIds)
+ .eqIfPresent(MemberSignInRecordDO::getUserId, reqVO.getUserId())
.eqIfPresent(MemberSignInRecordDO::getDay, reqVO.getDay())
.betweenIfPresent(MemberSignInRecordDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(MemberSignInRecordDO::getId));
}
+ default PageResult selectPage(Long userId, PageParam pageParam) {
+ return selectPage(pageParam, new LambdaQueryWrapperX()
+ .eq(MemberSignInRecordDO::getUserId, userId)
+ .orderByDesc(MemberSignInRecordDO::getId));
+ }
+
}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/tag/MemberTagMapper.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/tag/MemberTagMapper.java
index 457fcaf23..f4723e282 100644
--- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/tag/MemberTagMapper.java
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/tag/MemberTagMapper.java
@@ -22,9 +22,7 @@ public interface MemberTagMapper extends BaseMapperX {
.orderByDesc(MemberTagDO::getId));
}
- default boolean exists(Long id, String name) {
- return exists(new LambdaQueryWrapperX()
- .neIfPresent(MemberTagDO::getId, id)
- .eq(MemberTagDO::getName, name));
+ default MemberTagDO selelctByName(String name) {
+ return selectOne(MemberTagDO::getName, name);
}
}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/user/MemberUserMapper.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/user/MemberUserMapper.java
index 428458f3f..902057272 100644
--- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/user/MemberUserMapper.java
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/dal/mysql/user/MemberUserMapper.java
@@ -43,8 +43,23 @@ public interface MemberUserMapper extends BaseMapperX {
.betweenIfPresent(MemberUserDO::getLoginDate, reqVO.getLoginDate())
.likeIfPresent(MemberUserDO::getNickname, reqVO.getNickname())
.betweenIfPresent(MemberUserDO::getCreateTime, reqVO.getCreateTime())
+ .eqIfPresent(MemberUserDO::getLevelId, reqVO.getLevelId())
+ .eqIfPresent(MemberUserDO::getGroupId, reqVO.getGroupId())
.apply(StrUtil.isNotEmpty(tagIdSql), tagIdSql)
.orderByDesc(MemberUserDO::getId));
}
+ default Long selectCountByGroupId(Long groupId) {
+ return selectCount(MemberUserDO::getGroupId, groupId);
+ }
+
+ default Long selectCountByLevelId(Long levelId) {
+ return selectCount(MemberUserDO::getLevelId, levelId);
+ }
+
+ default Long selectCountByTagId(Long tagId) {
+ return selectCount(new LambdaQueryWrapperX()
+ .apply("FIND_IN_SET({0}, tag_ids)", tagId));
+ }
+
}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/address/AddressService.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/address/AddressService.java
index 260ab7987..099c49c42 100644
--- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/address/AddressService.java
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/address/AddressService.java
@@ -1,16 +1,10 @@
package cn.iocoder.yudao.module.member.service.address;
-import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.module.member.controller.admin.address.vo.AddressCreateReqVO;
-import cn.iocoder.yudao.module.member.controller.admin.address.vo.AddressExportReqVO;
-import cn.iocoder.yudao.module.member.controller.admin.address.vo.AddressPageReqVO;
-import cn.iocoder.yudao.module.member.controller.admin.address.vo.AddressUpdateReqVO;
import cn.iocoder.yudao.module.member.controller.app.address.vo.AppAddressCreateReqVO;
import cn.iocoder.yudao.module.member.controller.app.address.vo.AppAddressUpdateReqVO;
import cn.iocoder.yudao.module.member.dal.dataobject.address.MemberAddressDO;
import javax.validation.Valid;
-import java.util.Collection;
import java.util.List;
/**
@@ -70,57 +64,4 @@ public interface AddressService {
*/
MemberAddressDO getDefaultUserAddress(Long userId);
- /**
- * 创建用户收件地址
- *
- * @param createReqVO 创建信息
- * @return 编号
- */
- Long createAddress(@Valid AddressCreateReqVO createReqVO);
-
- /**
- * 更新用户收件地址
- *
- * @param updateReqVO 更新信息
- */
- void updateAddress(@Valid AddressUpdateReqVO updateReqVO);
-
- /**
- * 删除用户收件地址
- *
- * @param id 编号
- */
- void deleteAddress(Long id);
-
- /**
- * 获得用户收件地址
- *
- * @param id 编号
- * @return 用户收件地址
- */
- MemberAddressDO getAddress(Long id);
-
- /**
- * 获得用户收件地址列表
- *
- * @param ids 编号
- * @return 用户收件地址列表
- */
- List getAddressList(Collection ids);
-
- /**
- * 获得用户收件地址分页
- *
- * @param pageReqVO 分页查询
- * @return 用户收件地址分页
- */
- PageResult getAddressPage(AddressPageReqVO pageReqVO);
-
- /**
- * 获得用户收件地址列表, 用于 Excel 导出
- *
- * @param exportReqVO 查询条件
- * @return 用户收件地址列表
- */
- List getAddressList(AddressExportReqVO exportReqVO);
}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/address/AddressServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/address/AddressServiceImpl.java
index 79f129b75..2689177ea 100644
--- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/address/AddressServiceImpl.java
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/address/AddressServiceImpl.java
@@ -1,11 +1,6 @@
package cn.iocoder.yudao.module.member.service.address;
import cn.hutool.core.collection.CollUtil;
-import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.module.member.controller.admin.address.vo.AddressCreateReqVO;
-import cn.iocoder.yudao.module.member.controller.admin.address.vo.AddressExportReqVO;
-import cn.iocoder.yudao.module.member.controller.admin.address.vo.AddressPageReqVO;
-import cn.iocoder.yudao.module.member.controller.admin.address.vo.AddressUpdateReqVO;
import cn.iocoder.yudao.module.member.controller.app.address.vo.AppAddressCreateReqVO;
import cn.iocoder.yudao.module.member.controller.app.address.vo.AppAddressUpdateReqVO;
import cn.iocoder.yudao.module.member.convert.address.AddressConvert;
@@ -16,7 +11,6 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
-import java.util.Collection;
import java.util.List;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
@@ -100,56 +94,4 @@ public class AddressServiceImpl implements AddressService {
return CollUtil.getFirst(addresses);
}
- @Override
- public Long createAddress(AddressCreateReqVO createReqVO) {
- // 插入
- MemberAddressDO address = AddressConvert.INSTANCE.convert(createReqVO);
- addressMapper.insert(address);
- // 返回
- return address.getId();
- }
-
- @Override
- public void updateAddress(AddressUpdateReqVO updateReqVO) {
- // 校验存在
- validateAddressExists(updateReqVO.getId());
- // 更新
- MemberAddressDO updateObj = AddressConvert.INSTANCE.convert(updateReqVO);
- addressMapper.updateById(updateObj);
- }
-
- @Override
- public void deleteAddress(Long id) {
- // 校验存在
- validateAddressExists(id);
- // 删除
- addressMapper.deleteById(id);
- }
-
- private void validateAddressExists(Long id) {
- if (addressMapper.selectById(id) == null) {
- throw exception(ADDRESS_NOT_EXISTS);
- }
- }
-
- @Override
- public MemberAddressDO getAddress(Long id) {
- return addressMapper.selectById(id);
- }
-
- @Override
- public List getAddressList(Collection ids) {
- return addressMapper.selectBatchIds(ids);
- }
-
- @Override
- public PageResult getAddressPage(AddressPageReqVO pageReqVO) {
- return addressMapper.selectPage(pageReqVO);
- }
-
- @Override
- public List getAddressList(AddressExportReqVO exportReqVO) {
- return addressMapper.selectList(exportReqVO);
- }
-
}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/group/MemberGroupService.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/group/MemberGroupService.java
new file mode 100644
index 000000000..54c7882e0
--- /dev/null
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/group/MemberGroupService.java
@@ -0,0 +1,86 @@
+package cn.iocoder.yudao.module.member.service.group;
+
+import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.member.controller.admin.group.vo.MemberGroupCreateReqVO;
+import cn.iocoder.yudao.module.member.controller.admin.group.vo.MemberGroupPageReqVO;
+import cn.iocoder.yudao.module.member.controller.admin.group.vo.MemberGroupUpdateReqVO;
+import cn.iocoder.yudao.module.member.dal.dataobject.group.MemberGroupDO;
+
+import javax.validation.Valid;
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 用户分组 Service 接口
+ *
+ * @author owen
+ */
+public interface MemberGroupService {
+
+ /**
+ * 创建用户分组
+ *
+ * @param createReqVO 创建信息
+ * @return 编号
+ */
+ Long createGroup(@Valid MemberGroupCreateReqVO createReqVO);
+
+ /**
+ * 更新用户分组
+ *
+ * @param updateReqVO 更新信息
+ */
+ void updateGroup(@Valid MemberGroupUpdateReqVO updateReqVO);
+
+ /**
+ * 删除用户分组
+ *
+ * @param id 编号
+ */
+ void deleteGroup(Long id);
+
+ /**
+ * 获得用户分组
+ *
+ * @param id 编号
+ * @return 用户分组
+ */
+ MemberGroupDO getGroup(Long id);
+
+ /**
+ * 获得用户分组列表
+ *
+ * @param ids 编号
+ * @return 用户分组列表
+ */
+ List getGroupList(Collection ids);
+
+ /**
+ * 获得用户分组分页
+ *
+ * @param pageReqVO 分页查询
+ * @return 用户分组分页
+ */
+ PageResult getGroupPage(MemberGroupPageReqVO pageReqVO);
+
+
+ /**
+ * 获得指定状态的用户分组列表
+ *
+ * @param status 状态
+ * @return 用户分组列表
+ */
+ List getGroupListByStatus(Integer status);
+
+
+ /**
+ * 获得开启状态的用户分组列表
+ *
+ * @return 用户分组列表
+ */
+ default List getEnableGroupList() {
+ return getGroupListByStatus(CommonStatusEnum.ENABLE.getStatus());
+ }
+
+}
diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/group/MemberGroupServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/group/MemberGroupServiceImpl.java
new file mode 100644
index 000000000..98ec3cc85
--- /dev/null
+++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/group/MemberGroupServiceImpl.java
@@ -0,0 +1,102 @@
+package cn.iocoder.yudao.module.member.service.group;
+
+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.group.vo.MemberGroupCreateReqVO;
+import cn.iocoder.yudao.module.member.controller.admin.group.vo.MemberGroupPageReqVO;
+import cn.iocoder.yudao.module.member.controller.admin.group.vo.MemberGroupUpdateReqVO;
+import cn.iocoder.yudao.module.member.convert.group.MemberGroupConvert;
+import cn.iocoder.yudao.module.member.dal.dataobject.group.MemberGroupDO;
+import cn.iocoder.yudao.module.member.dal.mysql.group.MemberGroupMapper;
+import cn.iocoder.yudao.module.member.service.user.MemberUserService;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import javax.annotation.Resource;
+import java.util.Collection;
+import java.util.List;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.GROUP_HAS_USER;
+import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.GROUP_NOT_EXISTS;
+
+/**
+ * 用户分组 Service 实现类
+ *
+ * @author owen
+ */
+@Service
+@Validated
+public class MemberGroupServiceImpl implements MemberGroupService {
+
+ @Resource
+ private MemberGroupMapper groupMapper;
+ @Resource
+ private MemberUserService memberUserService;
+
+ @Override
+ public Long createGroup(MemberGroupCreateReqVO createReqVO) {
+ // 插入
+ MemberGroupDO group = MemberGroupConvert.INSTANCE.convert(createReqVO);
+ groupMapper.insert(group);
+ // 返回
+ return group.getId();
+ }
+
+ @Override
+ public void updateGroup(MemberGroupUpdateReqVO updateReqVO) {
+ // 校验存在
+ validateGroupExists(updateReqVO.getId());
+ // 更新
+ MemberGroupDO updateObj = MemberGroupConvert.INSTANCE.convert(updateReqVO);
+ groupMapper.updateById(updateObj);
+ }
+
+ @Override
+ public void deleteGroup(Long id) {
+ // 校验存在
+ validateGroupExists(id);
+ // 校验分组下是否有用户
+ validateGroupHasUser(id);
+ // 删除
+ groupMapper.deleteById(id);
+ }
+
+ void validateGroupExists(Long id) {
+ if (groupMapper.selectById(id) == null) {
+ throw exception(GROUP_NOT_EXISTS);
+ }
+ }
+
+ void validateGroupHasUser(Long id) {
+ Long count = memberUserService.getUserCountByGroupId(id);
+ if (count > 0) {
+ throw exception(GROUP_HAS_USER);
+ }
+ }
+
+ @Override
+ public MemberGroupDO getGroup(Long id) {
+ return groupMapper.selectById(id);
+ }
+
+ @Override
+ public List getGroupList(Collection ids) {
+ if (CollUtil.isEmpty(ids)) {
+ return ListUtil.empty();
+ }
+ return groupMapper.selectBatchIds(ids);
+ }
+
+ @Override
+ public PageResult