diff --git a/client-api/src/main/java/org/jiayunet/service/MemberGrantService.java b/client-api/src/main/java/org/jiayunet/service/MemberGrantService.java
new file mode 100644
index 0000000..2f3952f
--- /dev/null
+++ b/client-api/src/main/java/org/jiayunet/service/MemberGrantService.java
@@ -0,0 +1,91 @@
+package org.jiayunet.service;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import lombok.extern.slf4j.Slf4j;
+import org.jiayunet.mapper.MemberFuncItemMapper;
+import org.jiayunet.mapper.MemberRouteItemMapper;
+import org.jiayunet.mapper.MemberUserMapper;
+import org.jiayunet.pojo.po.MemberFuncItem;
+import org.jiayunet.pojo.po.MemberRouteItem;
+import org.jiayunet.pojo.po.MemberUser;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.time.Instant;
+import java.time.temporal.ChronoUnit;
+import java.util.List;
+
+/**
+ * 会员权益发放服务
+ *
主要功能:统一按天数发放会员权益(续费+功能权限+菜单权限)
+ * 依赖:FuncPermissionService(功能权限发放)、RouteMenuService(菜单权限发放)
+ * 使用表:bg_member_user(会员状态)、bg_member_func_item(会员功能配置)、bg_member_route_item(会员菜单配置)
+ *
+ * @author zk
+ */
+@Slf4j
+@Service
+public class MemberGrantService {
+
+ @Autowired
+ private MemberUserMapper memberUserMapper;
+
+ @Autowired
+ private MemberFuncItemMapper memberFuncItemMapper;
+
+ @Autowired
+ private MemberRouteItemMapper memberRouteItemMapper;
+
+ @Autowired
+ private FuncPermissionService funcPermissionService;
+
+ @Autowired
+ private RouteMenuService routeMenuService;
+
+ /**
+ * 发放会员权益(按天数)
+ * 1. 续费会员(不存在则创建,存在则延期) 2. 发放功能权限 3. 发放菜单权限
+ *
+ * @param userId 用户ID
+ * @param days 会员天数
+ */
+ @Transactional(rollbackFor = Exception.class)
+ public void grant(Long userId, int days) {
+ Instant expireTime = Instant.now().plus(days, ChronoUnit.DAYS);
+
+ // 1. 续费会员
+ MemberUser memberUser = memberUserMapper.selectOne(new LambdaQueryWrapper().eq(MemberUser::getUserId, userId));
+ if (memberUser == null) {
+ MemberUser newMember = new MemberUser();
+ newMember.setUserId(userId);
+ newMember.setExpireTime(expireTime);
+ memberUserMapper.insert(newMember);
+ } else {
+ Instant baseTime = memberUser.getExpireTime().isAfter(Instant.now()) ? memberUser.getExpireTime() : Instant.now();
+ memberUserMapper.update(null, new LambdaUpdateWrapper()
+ .eq(MemberUser::getId, memberUser.getId())
+ .set(MemberUser::getExpireTime, baseTime.plus(days, ChronoUnit.DAYS)));
+ }
+
+ // 2. 发放功能权限
+ List funcItems = memberFuncItemMapper.selectList(null);
+ for (MemberFuncItem item : funcItems) {
+ funcPermissionService.addTimeStock(userId, item.getFuncCode(), 1, expireTime);
+ if (item.getCountLimit() != null && item.getCountLimit() == 1) {
+ funcPermissionService.addCountStock(userId, item.getFuncCode(), 1, item.getAddCount());
+ } else {
+ funcPermissionService.addCountStock(userId, item.getFuncCode(), 0, null);
+ }
+ }
+
+ // 3. 发放菜单权限
+ List routeItems = memberRouteItemMapper.selectList(null);
+ for (MemberRouteItem item : routeItems) {
+ routeMenuService.addTimeStock(userId, item.getRouteId(), 1, expireTime);
+ }
+
+ log.info("会员权益发放完成 userId:{} days:{}", userId, days);
+ }
+}
diff --git a/client-api/src/main/java/org/jiayunet/service/MemberProductService.java b/client-api/src/main/java/org/jiayunet/service/MemberProductService.java
index 229cba1..df2bb6f 100644
--- a/client-api/src/main/java/org/jiayunet/service/MemberProductService.java
+++ b/client-api/src/main/java/org/jiayunet/service/MemberProductService.java
@@ -21,13 +21,12 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import java.time.Instant;
-import java.time.temporal.ChronoUnit;
import java.util.List;
/**
* 会员商品服务
- * 依赖:WxNativePayAbility(微信Native支付下单)、FuncPermissionService(功能权限发放)、RouteMenuService(菜单权限发放)
- * 使用表:bg_member_product(查询商品)、bg_member_order(创建/查询订单)、bg_pay_wechat_flow(支付流水)、bg_member_user(会员状态)、bg_member_func_item(会员功能配置)、bg_member_route_item(会员菜单配置)
+ * 依赖:WxNativePayAbility(微信Native支付下单)、MemberGrantService(会员权益发放)
+ * 使用表:bg_member_product(查询商品)、bg_member_order(创建/查询订单)、bg_pay_wechat_flow(支付流水)、bg_pay_alipay_flow(支付宝流水)
*
* @author zk
*/
@@ -45,19 +44,7 @@ public class MemberProductService {
private PayWechatFlowMapper payWechatFlowMapper;
@Autowired
- private MemberUserMapper memberUserMapper;
-
- @Autowired
- private MemberFuncItemMapper memberFuncItemMapper;
-
- @Autowired
- private MemberRouteItemMapper memberRouteItemMapper;
-
- @Autowired
- private FuncPermissionService funcPermissionService;
-
- @Autowired
- private RouteMenuService routeMenuService;
+ private MemberGrantService memberGrantService;
@Autowired
private WxNativePayAbility wxNativePayAbility;
@@ -159,46 +146,11 @@ public class MemberProductService {
.set(MemberOrder::getStatus, 1)
.set(MemberOrder::getPayTime, Instant.now()));
- // 查商品拿 durationDays
+ // 查商品拿 durationDays,发放会员权益
MemberProduct product = memberProductMapper.selectById(order.getProductId());
- int durationDays = product.getDurationDays();
- Long userId = order.getUserId();
- Instant expireTime = Instant.now().plus(durationDays, ChronoUnit.DAYS);
+ memberGrantService.grant(order.getUserId(), product.getDurationDays());
- // 续费会员
- MemberUser memberUser = memberUserMapper.selectOne(
- new LambdaQueryWrapper().eq(MemberUser::getUserId, userId)
- );
- if (memberUser == null) {
- MemberUser newMember = new MemberUser();
- newMember.setUserId(userId);
- newMember.setExpireTime(expireTime);
- memberUserMapper.insert(newMember);
- } else {
- Instant baseTime = memberUser.getExpireTime().isAfter(Instant.now()) ? memberUser.getExpireTime() : Instant.now();
- memberUserMapper.update(null, new LambdaUpdateWrapper()
- .eq(MemberUser::getId, memberUser.getId())
- .set(MemberUser::getExpireTime, baseTime.plus(durationDays, ChronoUnit.DAYS)));
- }
-
- // 发放功能权限
- List funcItems = memberFuncItemMapper.selectList(null);
- for (MemberFuncItem item : funcItems) {
- funcPermissionService.addTimeStock(userId, item.getFuncCode(), 1, expireTime);
- if (item.getCountLimit() != null && item.getCountLimit() == 1) {
- funcPermissionService.addCountStock(userId, item.getFuncCode(), 1, item.getAddCount());
- } else {
- funcPermissionService.addCountStock(userId, item.getFuncCode(), 0, null);
- }
- }
-
- // 发放菜单权限
- List routeItems = memberRouteItemMapper.selectList(null);
- for (MemberRouteItem item : routeItems) {
- routeMenuService.addTimeStock(userId, item.getRouteId(), 1, expireTime);
- }
-
- log.info("会员支付成功处理完成 orderNo:{} userId:{} durationDays:{}", orderNo, userId, durationDays);
+ log.info("会员支付成功处理完成 orderNo:{} userId:{} durationDays:{}", orderNo, order.getUserId(), product.getDurationDays());
}
/**
diff --git a/manager/src/main/java/org/jiayunet/pojo/po/UserInvite.java b/manager/src/main/java/org/jiayunet/pojo/po/UserInvite.java
index 99f7e12..ef1b1d5 100644
--- a/manager/src/main/java/org/jiayunet/pojo/po/UserInvite.java
+++ b/manager/src/main/java/org/jiayunet/pojo/po/UserInvite.java
@@ -34,6 +34,11 @@ public class UserInvite {
*/
private String inviteCode;
+ /**
+ * 本次邀请奖励的会员天数
+ */
+ private Integer rewardDays;
+
/**
* 邀请时间
*/