From 8d72e13c7351368ca29b83959ac5b0a8f88605e6 Mon Sep 17 00:00:00 2001 From: zk Date: Fri, 15 May 2026 16:13:49 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8A=BD=E8=B1=A1=20=E5=B0=81=E8=A3=85=20?= =?UTF-8?q?=E4=BC=9A=E5=91=98=E6=9D=83=E7=9B=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jiayunet/service/MemberGrantService.java | 91 +++++++++++++++++++ .../service/MemberProductService.java | 60 ++---------- .../java/org/jiayunet/pojo/po/UserInvite.java | 5 + 3 files changed, 102 insertions(+), 54 deletions(-) create mode 100644 client-api/src/main/java/org/jiayunet/service/MemberGrantService.java 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; + /** * 邀请时间 */