package cc.mrbird.febs.mall.service.impl;
|
|
import cc.mrbird.febs.common.enumerates.FlowTypeEnum;
|
import cc.mrbird.febs.common.enumerates.MoneyFlowTypeEnum;
|
import cc.mrbird.febs.common.exception.FebsException;
|
import cc.mrbird.febs.common.utils.LoginUserUtil;
|
import cc.mrbird.febs.mall.dto.CommissionChangeDto;
|
import cc.mrbird.febs.mall.entity.MallMember;
|
import cc.mrbird.febs.mall.entity.MallMemberWallet;
|
import cc.mrbird.febs.mall.mapper.MallMemberWalletMapper;
|
import cc.mrbird.febs.mall.service.IApiMallMemberService;
|
import cc.mrbird.febs.mall.service.IApiMallMemberWalletService;
|
import cc.mrbird.febs.mall.service.IMallMoneyFlowService;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import lombok.RequiredArgsConstructor;
|
import lombok.extern.slf4j.Slf4j;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
|
import java.lang.reflect.Field;
|
import java.math.BigDecimal;
|
|
/**
|
* @author wzy
|
* @date 2021-09-22
|
**/
|
@Slf4j
|
@Service
|
@RequiredArgsConstructor
|
public class ApiMallMemberWalletServiceImpl extends ServiceImpl<MallMemberWalletMapper, MallMemberWallet> implements IApiMallMemberWalletService {
|
|
private final IMallMoneyFlowService moneyFlowService;
|
|
@Override
|
public void addBalance(BigDecimal amount, Long memberId) {
|
int i = 0;
|
boolean flag = true;
|
|
while (flag) {
|
i++;
|
MallMemberWallet wallet = this.baseMapper.selectWalletByMemberId(memberId);
|
wallet.setBalance(wallet.getBalance().add(amount));
|
|
int result = this.baseMapper.updateBalanceWithVersion(wallet);
|
if (result > 0) {
|
flag = false;
|
} else {
|
if (i > 2) {
|
throw new FebsException("余额增加失败");
|
}
|
}
|
}
|
}
|
|
@Override
|
public void reduceBalance(BigDecimal amount, Long memberId) {
|
int i = 0;
|
boolean flag = true;
|
|
while (flag) {
|
i++;
|
MallMemberWallet wallet = this.baseMapper.selectWalletByMemberId(memberId);
|
if (amount.compareTo(wallet.getBalance()) > 0) {
|
throw new FebsException("余额不足");
|
}
|
|
wallet.setBalance(wallet.getBalance().subtract(amount));
|
|
int result = this.baseMapper.updateBalanceWithVersion(wallet);
|
if (result > 0) {
|
flag = false;
|
} else {
|
if (i > 2) {
|
throw new FebsException("余额支付失败");
|
}
|
}
|
}
|
}
|
|
@Override
|
public void addCommission(BigDecimal amount, Long memberId) {
|
int i = 0;
|
boolean flag = true;
|
|
while (flag) {
|
i++;
|
MallMemberWallet wallet = this.baseMapper.selectWalletByMemberId(memberId);
|
wallet.setCommission(wallet.getCommission().add(amount));
|
|
int result = this.baseMapper.updateCommissionWithVersion(wallet);
|
if (result > 0) {
|
flag = false;
|
} else {
|
if (i > 2) {
|
throw new FebsException("余额增加失败");
|
}
|
}
|
}
|
}
|
|
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
|
Field commission = MallMemberWallet.class.getDeclaredField("commission");
|
MallMemberWallet wallet = new MallMemberWallet();
|
commission.setAccessible(true);
|
commission.set(wallet, BigDecimal.valueOf(12.34d));
|
|
System.out.println(1);
|
}
|
|
@Override
|
public void reduceCommission(BigDecimal amount, Long memberId) {
|
int i = 0;
|
boolean flag = true;
|
|
while (flag) {
|
i++;
|
MallMemberWallet wallet = this.baseMapper.selectWalletByMemberId(memberId);
|
if (amount.compareTo(wallet.getCommission()) > 0) {
|
throw new FebsException("佣金不足");
|
}
|
|
wallet.setCommission(wallet.getCommission().subtract(amount));
|
|
int result = this.baseMapper.updateCommissionWithVersion(wallet);
|
if (result > 0) {
|
flag = false;
|
} else {
|
if (i > 2) {
|
throw new FebsException("佣金支付失败");
|
}
|
}
|
}
|
}
|
|
@Override
|
public void add(BigDecimal amount, Long memberId, String field) {
|
int i = 0;
|
boolean flag = true;
|
|
while (flag) {
|
i++;
|
MallMemberWallet wallet = this.baseMapper.selectWalletByMemberId(memberId);
|
|
MallMemberWallet update = new MallMemberWallet();
|
update.setId(wallet.getId());
|
update.setRevision(wallet.getRevision());
|
|
Field declaredField = null;
|
try {
|
declaredField = MallMemberWallet.class.getDeclaredField(field);
|
declaredField.setAccessible(true);
|
|
BigDecimal balance = (BigDecimal) declaredField.get(wallet);
|
declaredField.set(update, balance.add(amount));
|
} catch (NoSuchFieldException | IllegalAccessException e) {
|
e.printStackTrace();
|
throw new FebsException("金额新增失败");
|
}
|
|
int result = this.baseMapper.updateAmountWithVersion(update);
|
if (result > 0) {
|
flag = false;
|
} else {
|
if (i > 2) {
|
throw new FebsException("金额新增失败");
|
}
|
}
|
}
|
}
|
|
@Override
|
public void add(BigDecimal amount, Long memberId, String... field) {
|
String[] fields = field.clone();
|
for (String s : fields) {
|
add(amount, memberId, s);
|
}
|
}
|
|
@Override
|
public void reduce(BigDecimal amount, Long memberId, String field) {
|
int i = 0;
|
boolean flag = true;
|
|
while (flag) {
|
i++;
|
MallMemberWallet wallet = this.baseMapper.selectWalletByMemberId(memberId);
|
|
MallMemberWallet update = new MallMemberWallet();
|
update.setId(wallet.getId());
|
update.setRevision(wallet.getRevision());
|
|
try {
|
Field declaredField = MallMemberWallet.class.getDeclaredField(field);
|
declaredField.setAccessible(true);
|
BigDecimal balance = (BigDecimal) declaredField.get(wallet);
|
|
if (amount.compareTo(balance) > 0) {
|
throw new FebsException("余额不足");
|
}
|
declaredField.set(update, balance.subtract(amount));
|
|
} catch (NoSuchFieldException | IllegalAccessException e) {
|
e.printStackTrace();
|
}
|
|
int result = this.baseMapper.updateAmountWithVersion(update);
|
if (result > 0) {
|
flag = false;
|
} else {
|
if (i > 2) {
|
throw new FebsException("余额修改失败");
|
}
|
}
|
}
|
}
|
|
@Override
|
@Transactional(rollbackFor = Exception.class)
|
public void commissionChange(CommissionChangeDto commissionChange) {
|
MallMember member = LoginUserUtil.getLoginUser();
|
|
// TODO 判断是否开启了划转
|
|
int type;
|
int flowType;
|
this.reduce(commissionChange.getAmount(), member.getId(), "commission");
|
|
// 佣金转余额
|
if (commissionChange.getType() == 1) {
|
type = MoneyFlowTypeEnum.COMMISSION_TO_BALANCE.getValue();
|
flowType = FlowTypeEnum.BALANCE.getValue();
|
this.add(commissionChange.getAmount(), member.getId(), "balance");
|
|
// 佣金转竞猜积分
|
} else if (commissionChange.getType() == 2){
|
type = MoneyFlowTypeEnum.COMMISSION_TO_PRIZESCORE.getValue();
|
flowType = FlowTypeEnum.PRIZE_SCORE.getValue();
|
this.add(commissionChange.getAmount(), member.getId(), "prizeScore");
|
} else {
|
throw new FebsException("参数错误");
|
}
|
|
moneyFlowService.addMoneyFlow(member.getId(), commissionChange.getAmount().negate(), type, null, FlowTypeEnum.COMMISSION.getValue());
|
moneyFlowService.addMoneyFlow(member.getId(), commissionChange.getAmount(), type, null, flowType);
|
}
|
}
|