diff --git a/ruoyi-admin/src/main/java/com/ruoyi/member/controller/MemberPointsController.java b/ruoyi-admin/src/main/java/com/ruoyi/member/controller/MemberPointsController.java index a6cc1dd..2b8176a 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/member/controller/MemberPointsController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/member/controller/MemberPointsController.java @@ -62,6 +62,25 @@ public class MemberPointsController extends BaseController { return success(); } + /** + * 积分提现 + * + * @param memberPoints {@link MemberPoints} + * @return com.ruoyi.common.core.domain.AjaxResult + * @author PQZ + * @date 17:14 2025/4/28 + **/ + @Log(title = "积分提现", businessType = BusinessType.INSERT) + @PostMapping("/payout") + public AjaxResult payout(@RequestBody MemberPoints memberPoints) { + try { + memberPointsService.payout(memberPoints); + }catch (Exception e) { + return error(e.getMessage()); + } + return success(); + } + /** * 修改博主积分变动明细 */ diff --git a/ruoyi-admin/src/main/java/com/ruoyi/member/domain/MemberPoints.java b/ruoyi-admin/src/main/java/com/ruoyi/member/domain/MemberPoints.java index 40a0045..d974f82 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/member/domain/MemberPoints.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/member/domain/MemberPoints.java @@ -47,6 +47,10 @@ public class MemberPoints extends DlBaseEntity /** 积分 */ @Excel(name = "积分") private double points; + /** 订单编号 */ + private String orderNo; + /** 状态(有效/无效)*/ + private String status; /** 剩余 */ @Excel(name = "剩余") diff --git a/ruoyi-admin/src/main/java/com/ruoyi/member/service/IMemberCardService.java b/ruoyi-admin/src/main/java/com/ruoyi/member/service/IMemberCardService.java index 60fca6f..10ab463 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/member/service/IMemberCardService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/member/service/IMemberCardService.java @@ -83,6 +83,6 @@ public interface IMemberCardService extends IService { * @param userType 身份类型 * @return java.lang.String **/ - String getUserCardEndDate(Long userId,String userType); + MemberCard getUserCardEndDate(Long userId,String userType); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/member/service/IMemberPointsService.java b/ruoyi-admin/src/main/java/com/ruoyi/member/service/IMemberPointsService.java index d17b5c6..6dcfdfd 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/member/service/IMemberPointsService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/member/service/IMemberPointsService.java @@ -44,4 +44,21 @@ public interface IMemberPointsService extends IService { * @date 16:11 2025/3/31 **/ double getBloggerBalance(Long userId); + + /** + * 积分提现 + * @author PQZ + * @date 17:14 2025/4/28 + * @param memberPoints {@link MemberPoints} + **/ + void payout(MemberPoints memberPoints) throws Exception; + + /** + * 支付成功回调 + * @author PQZ + * @date 17:29 2025/4/28 + * @param orderNo 订单编号 + * @type type 回调状态(success:成功,其他为失败) + **/ + void payoutCallback(String orderNo,String type); } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/member/service/impl/MemberCardServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/member/service/impl/MemberCardServiceImpl.java index 339248d..6bdea80 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/member/service/impl/MemberCardServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/member/service/impl/MemberCardServiceImpl.java @@ -330,12 +330,13 @@ public class MemberCardServiceImpl extends ServiceImpl memberCardList = memberCardMapper.selectMemberCardList(userId,userType,DateUtil.formatDateTime(new Date())); if(memberCardList.isEmpty()){ return null; } - return DateUtil.formatDate(memberCardList.get(0).getEndDate()); +// return DateUtil.formatDate(memberCardList.get(0).getEndDate()); + return memberCardList.get(0); } /** diff --git a/ruoyi-admin/src/main/java/com/ruoyi/member/service/impl/MemberPointsServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/member/service/impl/MemberPointsServiceImpl.java index 85913fd..2176ca2 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/member/service/impl/MemberPointsServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/member/service/impl/MemberPointsServiceImpl.java @@ -8,6 +8,7 @@ import com.ruoyi.base.domain.BaseCategory; import com.ruoyi.base.service.IBaseCategoryService; import com.ruoyi.common.config.DlRightsConfig; import com.ruoyi.common.core.domain.DlBaseEntity; +import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.member.domain.MemberPoints; import com.ruoyi.member.mapper.MemberPointsMapper; import com.ruoyi.member.service.IMemberPointsService; @@ -16,6 +17,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; +import java.util.Random; /** * 博主积分变动明细Service业务层处理 @@ -64,6 +66,7 @@ public class MemberPointsServiceImpl extends ServiceImpl lambdaQueryWrapper = new LambdaQueryWrapper<>(); lambdaQueryWrapper.eq(DlBaseEntity::getDelFlag,0) .eq(MemberPoints::getUserId,memberPoints.getUserId()) + .eq(MemberPoints::getStatus,"01") .orderByDesc(DlBaseEntity::getCreateTime); List list = list(lambdaQueryWrapper); //如果没有记录则为初始新增 @@ -96,6 +99,7 @@ public class MemberPointsServiceImpl extends ServiceImpl lambdaQueryWrapper = new LambdaQueryWrapper<>(); lambdaQueryWrapper .eq(MemberPoints::getUserId,userId) + .eq(MemberPoints::getStatus,"01") .eq(DlBaseEntity::getDelFlag,0) .orderByDesc(DlBaseEntity::getCreateTime); List list = list(lambdaQueryWrapper); @@ -105,4 +109,100 @@ public class MemberPointsServiceImpl extends ServiceImpl wayList = getOnWayOrder(userId); + if (!wayList.isEmpty()){ + throw new Exception("存在未处理完成的提现订单"); + } + + double nowBalance = getBloggerBalance(userId); + if (memberPoints.getPoints()>nowBalance){ + throw new Exception("当前用户积分余额为"+nowBalance+"您已超出提现额度"); + } + + if (memberPoints.getPoints()> 200){ + throw new Exception("单次最高提现200元"); + } + memberPoints.setOrderNo(generateOrderId()); + memberPoints.setStatus("02"); + memberPoints.setUserId(userId); + memberPoints.setTitle("积分提现-"+memberPoints.getPoints()); + memberPoints.setType("2"); + save(memberPoints); + } + + /** + * 支付成功回调 + * + * @param orderNo 订单编号 + * @author PQZ + * @date 17:29 2025/4/28 + **/ + @Override + public void payoutCallback(String orderNo,String type) { + /*防重复处理*/ + Long userId = SecurityUtils.getUserId(); + double nowBalance = getBloggerBalance(userId); + //通过订单编号查询积分记录 + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper + .eq(MemberPoints::getOrderNo,orderNo) + .eq(DlBaseEntity::getDelFlag,0) + .eq(MemberPoints::getStatus,"02"); + List memberPoints = list(lambdaQueryWrapper); + /*区分微信调用成功和失败*/ + if (!memberPoints.isEmpty()) { + MemberPoints points = memberPoints.get(0); + if ("success".equals(type)) { + points.setBalance(nowBalance - points.getPoints()); + points.setStatus("01"); + updateById(points); + } else { + removeById(points); + } + } + } + + /** + * 查询当前登录用户状态为未体现成功的记录 + * @author PQZ + * @date 17:52 2025/4/28 + * @param userId 用户id + * @return java.util.List + **/ + private List getOnWayOrder(Long userId){ + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper + .eq(MemberPoints::getUserId,userId) + .eq(MemberPoints::getStatus,"02") + .eq(DlBaseEntity::getDelFlag,0) + .orderByDesc(DlBaseEntity::getCreateTime); + return list(lambdaQueryWrapper); + } + + + private String generateOrderId() { + // 获取当前时间戳(以秒为单位) + long timestamp = System.currentTimeMillis() / 1000; + // 生成3位随机数 + Random random = new Random(); + // 生成范围在100到999之间的随机数 + int randomNum = random.nextInt(900) + 100; + // 组合成订单编号 + return "JFTX-" + timestamp + String.format("%03d", randomNum); + } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/member/service/impl/MemberUserServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/member/service/impl/MemberUserServiceImpl.java index 47f1248..603cd38 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/member/service/impl/MemberUserServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/member/service/impl/MemberUserServiceImpl.java @@ -1,5 +1,6 @@ package com.ruoyi.member.service.impl; +import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; @@ -19,6 +20,7 @@ import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.constant.DictConstants; import com.ruoyi.framework.web.service.TokenService; +import com.ruoyi.member.domain.MemberCard; import com.ruoyi.member.domain.MemberUser; import com.ruoyi.member.mapper.MemberUserMapper; import com.ruoyi.member.service.*; @@ -141,7 +143,11 @@ public class MemberUserServiceImpl extends ServiceImpl + del_flag = 0 and status = '01' and user_id = #{userId} order by create_time desc