This commit is contained in:
PQZ 2025-04-28 18:04:48 +08:00
parent 975050e5d6
commit d9958a0c53
10 changed files with 157 additions and 6 deletions

View File

@ -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();
}
/**
* 修改博主积分变动明细
*/

View File

@ -47,6 +47,10 @@ public class MemberPoints extends DlBaseEntity
/** 积分 */
@Excel(name = "积分")
private double points;
/** 订单编号 */
private String orderNo;
/** 状态(有效/无效)*/
private String status;
/** 剩余 */
@Excel(name = "剩余")

View File

@ -83,6 +83,6 @@ public interface IMemberCardService extends IService<MemberCard> {
* @param userType 身份类型
* @return java.lang.String
**/
String getUserCardEndDate(Long userId,String userType);
MemberCard getUserCardEndDate(Long userId,String userType);
}

View File

@ -44,4 +44,21 @@ public interface IMemberPointsService extends IService<MemberPoints> {
* @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);
}

View File

@ -330,12 +330,13 @@ public class MemberCardServiceImpl extends ServiceImpl<MemberCardMapper, MemberC
* @date 14:10 2025/4/25
**/
@Override
public String getUserCardEndDate(Long userId, String userType) {
public MemberCard getUserCardEndDate(Long userId, String userType) {
List<MemberCard> 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);
}
/**

View File

@ -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<MemberPointsMapper, Mem
LambdaQueryWrapper<MemberPoints> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(DlBaseEntity::getDelFlag,0)
.eq(MemberPoints::getUserId,memberPoints.getUserId())
.eq(MemberPoints::getStatus,"01")
.orderByDesc(DlBaseEntity::getCreateTime);
List<MemberPoints> list = list(lambdaQueryWrapper);
//如果没有记录则为初始新增
@ -96,6 +99,7 @@ public class MemberPointsServiceImpl extends ServiceImpl<MemberPointsMapper, Mem
LambdaQueryWrapper<MemberPoints> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper
.eq(MemberPoints::getUserId,userId)
.eq(MemberPoints::getStatus,"01")
.eq(DlBaseEntity::getDelFlag,0)
.orderByDesc(DlBaseEntity::getCreateTime);
List<MemberPoints> list = list(lambdaQueryWrapper);
@ -105,4 +109,100 @@ public class MemberPointsServiceImpl extends ServiceImpl<MemberPointsMapper, Mem
return list.get(0).getBalance();
}
}
/**
* 积分提现
*
* @param memberPoints {@link MemberPoints}
* @author PQZ
* @date 17:14 2025/4/28
**/
@Override
public void payout(MemberPoints memberPoints) throws Exception {
if (memberPoints.getPoints()<= 0){
throw new Exception("无效提现额度");
}
Long userId = SecurityUtils.getUserId();
List<MemberPoints> 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<MemberPoints> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper
.eq(MemberPoints::getOrderNo,orderNo)
.eq(DlBaseEntity::getDelFlag,0)
.eq(MemberPoints::getStatus,"02");
List<MemberPoints> 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<com.ruoyi.member.domain.MemberPoints>
**/
private List<MemberPoints> getOnWayOrder(Long userId){
LambdaQueryWrapper<MemberPoints> 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);
}
}

View File

@ -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<MemberUserMapper, MemberU
//博主通告主基本信息
MemberUserVO result = memberUserMapper.queryByUserId(userId, userType);
//查是否开通的会员以及会员到期的时间
result.setMemberEndDate(memberCardService.getUserCardEndDate(userId,userType));
MemberCard card = memberCardService.getUserCardEndDate(userId,userType);
if (null != card) {
result.setMemberEndDate(DateUtil.formatDate(card.getEndDate()));
result.setCardName(card.getCardName());
}
if ("02".equals(userType)) {
//积分
result.setPointsBalance(pointsService.getBloggerBalance(userId));

View File

@ -48,4 +48,7 @@ public class MemberUserVO extends MemberUser {
String identityName;
/**会员到期日期*/
String memberEndDate;
/**会员名称*/
String cardName;
}

View File

@ -6,8 +6,8 @@ spring:
druid:
# 主库数据源
master:
url: jdbc:mysql://124.222.105.7:3306/dl_notice?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
# url: jdbc:mysql://82.156.161.160:3306/dl_notice?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
# url: jdbc:mysql://124.222.105.7:3306/dl_notice?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
url: jdbc:mysql://82.156.161.160:3306/dl_notice?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: dl_notice
password: 123456
# 从库数据源

View File

@ -27,6 +27,7 @@
<select id="queryListPage" parameterType="MemberPoints" resultMap="MemberPointsResult">
<include refid="selectMemberPointsVo"/>
<where>
del_flag = 0 and status = '01'
<if test="userId != null"> and user_id = #{userId}</if>
</where>
order by create_time desc