抽象 封装 会员权益
This commit is contained in:
@@ -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;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 会员权益发放服务
|
||||||
|
* <p>主要功能:统一按天数发放会员权益(续费+功能权限+菜单权限)</p>
|
||||||
|
* <p>依赖:FuncPermissionService(功能权限发放)、RouteMenuService(菜单权限发放)</p>
|
||||||
|
* <p>使用表:bg_member_user(会员状态)、bg_member_func_item(会员功能配置)、bg_member_route_item(会员菜单配置)</p>
|
||||||
|
*
|
||||||
|
* @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;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发放会员权益(按天数)
|
||||||
|
* <p>1. 续费会员(不存在则创建,存在则延期) 2. 发放功能权限 3. 发放菜单权限</p>
|
||||||
|
*
|
||||||
|
* @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<MemberUser>().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<MemberUser>()
|
||||||
|
.eq(MemberUser::getId, memberUser.getId())
|
||||||
|
.set(MemberUser::getExpireTime, baseTime.plus(days, ChronoUnit.DAYS)));
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. 发放功能权限
|
||||||
|
List<MemberFuncItem> 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<MemberRouteItem> routeItems = memberRouteItemMapper.selectList(null);
|
||||||
|
for (MemberRouteItem item : routeItems) {
|
||||||
|
routeMenuService.addTimeStock(userId, item.getRouteId(), 1, expireTime);
|
||||||
|
}
|
||||||
|
|
||||||
|
log.info("会员权益发放完成 userId:{} days:{}", userId, days);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -21,13 +21,12 @@ import org.springframework.transaction.annotation.Transactional;
|
|||||||
import org.springframework.util.Assert;
|
import org.springframework.util.Assert;
|
||||||
|
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.time.temporal.ChronoUnit;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 会员商品服务
|
* 会员商品服务
|
||||||
* <p>依赖:WxNativePayAbility(微信Native支付下单)、FuncPermissionService(功能权限发放)、RouteMenuService(菜单权限发放)</p>
|
* <p>依赖:WxNativePayAbility(微信Native支付下单)、MemberGrantService(会员权益发放)</p>
|
||||||
* <p>使用表:bg_member_product(查询商品)、bg_member_order(创建/查询订单)、bg_pay_wechat_flow(支付流水)、bg_member_user(会员状态)、bg_member_func_item(会员功能配置)、bg_member_route_item(会员菜单配置)</p>
|
* <p>使用表:bg_member_product(查询商品)、bg_member_order(创建/查询订单)、bg_pay_wechat_flow(支付流水)、bg_pay_alipay_flow(支付宝流水)</p>
|
||||||
*
|
*
|
||||||
* @author zk
|
* @author zk
|
||||||
*/
|
*/
|
||||||
@@ -45,19 +44,7 @@ public class MemberProductService {
|
|||||||
private PayWechatFlowMapper payWechatFlowMapper;
|
private PayWechatFlowMapper payWechatFlowMapper;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private MemberUserMapper memberUserMapper;
|
private MemberGrantService memberGrantService;
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private MemberFuncItemMapper memberFuncItemMapper;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private MemberRouteItemMapper memberRouteItemMapper;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private FuncPermissionService funcPermissionService;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private RouteMenuService routeMenuService;
|
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private WxNativePayAbility wxNativePayAbility;
|
private WxNativePayAbility wxNativePayAbility;
|
||||||
@@ -159,46 +146,11 @@ public class MemberProductService {
|
|||||||
.set(MemberOrder::getStatus, 1)
|
.set(MemberOrder::getStatus, 1)
|
||||||
.set(MemberOrder::getPayTime, Instant.now()));
|
.set(MemberOrder::getPayTime, Instant.now()));
|
||||||
|
|
||||||
// 查商品拿 durationDays
|
// 查商品拿 durationDays,发放会员权益
|
||||||
MemberProduct product = memberProductMapper.selectById(order.getProductId());
|
MemberProduct product = memberProductMapper.selectById(order.getProductId());
|
||||||
int durationDays = product.getDurationDays();
|
memberGrantService.grant(order.getUserId(), product.getDurationDays());
|
||||||
Long userId = order.getUserId();
|
|
||||||
Instant expireTime = Instant.now().plus(durationDays, ChronoUnit.DAYS);
|
|
||||||
|
|
||||||
// 续费会员
|
log.info("会员支付成功处理完成 orderNo:{} userId:{} durationDays:{}", orderNo, order.getUserId(), product.getDurationDays());
|
||||||
MemberUser memberUser = memberUserMapper.selectOne(
|
|
||||||
new LambdaQueryWrapper<MemberUser>().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<MemberUser>()
|
|
||||||
.eq(MemberUser::getId, memberUser.getId())
|
|
||||||
.set(MemberUser::getExpireTime, baseTime.plus(durationDays, ChronoUnit.DAYS)));
|
|
||||||
}
|
|
||||||
|
|
||||||
// 发放功能权限
|
|
||||||
List<MemberFuncItem> 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<MemberRouteItem> routeItems = memberRouteItemMapper.selectList(null);
|
|
||||||
for (MemberRouteItem item : routeItems) {
|
|
||||||
routeMenuService.addTimeStock(userId, item.getRouteId(), 1, expireTime);
|
|
||||||
}
|
|
||||||
|
|
||||||
log.info("会员支付成功处理完成 orderNo:{} userId:{} durationDays:{}", orderNo, userId, durationDays);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -34,6 +34,11 @@ public class UserInvite {
|
|||||||
*/
|
*/
|
||||||
private String inviteCode;
|
private String inviteCode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 本次邀请奖励的会员天数
|
||||||
|
*/
|
||||||
|
private Integer rewardDays;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 邀请时间
|
* 邀请时间
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user