java实现会员充值功能

您所在的位置:网站首页 会员充值网页登录 java实现会员充值功能

java实现会员充值功能

2024-06-06 19:43| 来源: 网络整理| 查看: 265

近期负责的项目中有关于充值会员的功能,特做一个会员充值流程小结,这中间或许也存在着不足。希望可以得到大家的理解和建议。在调用第三方接口支付时修改表的状态(此处不做详细阐述)。

业务分析:

如下图,用户可以选择想要开通的会员等级(初级、中级、高级、超级),不同等级有不同的开通时长选择(一个月、一个季度、半年、一年),每个等级的会员对应的权限不一致,用户可以随意选择。

在这里插入图片描述

思路介绍: 在购买VIP成功后,要判断该用户当前是否为会员:

场景一:用户之前没有充值过会员,或者已经过期,就根据当前系统时间,增加对应充值时长。 场景二:用户目前是会员状态; 会员状态下还有三种场景: 1.充值比当前会员等级低的会员; 例如:当前用户已经是超级会员,但是又充值了初级会员 2.充值比当前会员等级高的会员;例如:当前用户已经是初级会员,但是又充值了超级会员 3.充值与当前会员等级一样的会员;例如:当前用户已经是中级会员,又充值了中级会员

算法思路:

模拟会员价格表: 单位为分比较好计算

等级月季半年全年价格单位初级会员6001500250015500分中级会员7001600260015600分高级会员8001700270015700分超级会员9001800280015800分

月标准都按31天计算

场景:

初级 升 超级:

1.先算出初级还剩多少天 :公式:到期时间-当前时间=相差时间 ,如果低于一天直接按一天算 2.算出初级每天多少钱: 公式:原来开通方式的价格/ 套餐天数=每天价格 3.初级剩余天数换算成钱还剩多少钱:公式:剩余天数*每天价格 =剩余金额 4.计算超级会员每天价格: 公式:开通方式价格/套餐时长=每天价格 5.初级换算的钱可以买几天超级:剩余金额/超级会员每天价格 =换n天 最终:超级会员套餐时长+换n天=超级会员到期时间

超级 升初级:

1.算出超级每天价格:公式: 开通方式价格/套餐时长=超级会员每天价格 2.算出初级会员的钱可以买几天超级会员:公式:初级会员开通方式价格/初级会员每天价格=换n天 最终:到期时间+换n天=超级会员到期时间

中间 升 中级:

到期时间+中间套餐时间=中级会员到期时间

代码实现

表结构:

会员规则表:

在这里插入图片描述

用户表:

在这里插入图片描述

请求实体:

@Data public class PayMember { // 充值对象 private Long userId; // 商户ID private Long dealerId; // 会员[1:初级;2:中级;3:高级;4:超级] private Byte memberType; // 购买的套餐[0:月;1:季度;2:半年;3:全年;] private Byte comboId; }

业务代码:

@Override public ResultUtils payMember(PayMember payMember) { // combosMap的SQL: // SELECT `month`, // season, // semester, // yearly, // type // FROM dealer_member_rule // WHERE dealer_id = #{dealerId} Map combosMap = dealerMemberRuleMapper.selectCombos(payMember.getDealerId()); // 查询当前用户会员情况 QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.eq("user_id", payMember.getUserId()) .select("member_type", "membership_due","member_pay"); User user = userMapper.selectOne(queryWrapper); UpdateWrapper wrapper = new UpdateWrapper(); // 判断会员情况 if (ObjectUtil.isEmpty(user.getMembershipDue()) || LocalDateTime.now().isAfter(user.getMembershipDue())) {//第一次开通会员|| 会员已经到期 // 非升级续费,第一次开通 || 到期后开通 wrapper.eq("user_id", payMember.getUserId()) .set("member_pay", payMember.getComboId()) .set("membership_due", LocalDateTime.now().plusMonths(combo(payMember.getComboId()))) .set("member_type", payMember.getMemberType()); } else { // 续费 || 升级 if (user.getMemberType() > payMember.getMemberType()) {// 购买了比当前低级的套餐 (当前超级升初级) // 获取当前使用的套餐 旧套餐 Map oldCombo = (Map) combosMap.get(user.getMemberType().intValue()); // 得出上传开通旧套餐的时长名字 String timeName = comboName(user.getMemberPay()); Integer oldPrice = (Integer) oldCombo.get(timeName);// 得出旧套餐的价格 // totalDays=这个套餐有多少天 int totalDays = combo(user.getMemberPay()) * 31;// 套餐总天数=n月*标准天数(31) // 每天价格=套餐价格/总天数 int oldEveryDayThePrice = oldPrice / totalDays; // 算出新套餐可以买几天旧套餐 // 即将要买的套餐 新套餐 Map newCombo = (Map) combosMap.get(payMember.getMemberType().intValue()); Integer newPrice = (Integer) newCombo.get(comboName(payMember.getComboId()));// 新套餐价格 // 可以买几天旧套餐=新套餐价格/旧套餐每天价格 int day = newPrice / oldEveryDayThePrice; if (day// 购买的比当前高级的套餐 // 算法和 高买低相反 // 初级还剩余几天 Duration duration = Duration.between(LocalDateTime.now(), user.getMembershipDue());//到期时间和当前时间的差 long hours = duration.toHours();//相差的小时数 long residueDay = hours / 24L;//旧套餐剩余天数 if (residueDay switch (type) { case 0: return "month"; // 取月字段的价格 case 1: return "season";// 取季字段的价格 case 2: return "semester";// 半年 case 3: return "yearly";// 一年 } return null; } /** * 套餐时间 * * @param type [0:月;1:季度;2:半年;3:全年;] * @return */ private Integer combo(Byte type) { switch (type) { case 0: return 1;// 一个月 1一个月 case 1: return 3;// 一个季度 三个月 case 2: return 6;// 半年 六个月 case 3: return 12;// 一年 十二个月 } return null; }


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3