支付优化

This commit is contained in:
seesaw
2024-10-21 17:42:58 +08:00
parent 2a97de0389
commit be4886585c
3 changed files with 50 additions and 33 deletions

View File

@ -26,4 +26,9 @@ public interface DeductionService {
* 退款 * 退款
*/ */
void refund(Long userId,BigDecimal money,DishOrderDO dishOrderDO); void refund(Long userId,BigDecimal money,DishOrderDO dishOrderDO);
/**
* 减免
*/
void reduction(Long userId, BigDecimal money, BigDecimal giftAmount, BigDecimal cashAmount, BigDecimal wxAmount);
} }

View File

@ -51,7 +51,7 @@ public class DeductionServiceImpl implements DeductionService {
private BusinessService businessService; private BusinessService businessService;
@Override @Override
public void deduction(DishOrderDO dishOrderDO) { public void deduction(DishOrderDO dishOrderDO) {
Long userId = dishOrderDO.getUserId(); Long userId = dishOrderDO.getUserId();
BigDecimal newMoney; BigDecimal newMoney;
@ -73,10 +73,10 @@ public class DeductionServiceImpl implements DeductionService {
if (total.compareTo(BigDecimal.ZERO) > 0) { if (total.compareTo(BigDecimal.ZERO) > 0) {
reductionAmount = userService.getReductionAmount(userId, total, dishOrderDO.getCreateTime()); reductionAmount = userService.getReductionAmount(userId, total, dishOrderDO.getCreateTime());
} }
if(dishOrderDO.getReductionAmount().compareTo(BigDecimal.ZERO) > 0){ if (dishOrderDO.getReductionAmount().compareTo(BigDecimal.ZERO) > 0) {
reductionAmount = reductionAmount.add(dishOrderDO.getReductionAmount()); reductionAmount = reductionAmount.add(dishOrderDO.getReductionAmount());
dishOrderDO.setReductionAmount(reductionAmount); dishOrderDO.setReductionAmount(reductionAmount);
}else { } else {
dishOrderDO.setReductionAmount(reductionAmount); dishOrderDO.setReductionAmount(reductionAmount);
} }
dishOrderDO.setReductionState(reductionAmount.compareTo(BigDecimal.ZERO) > 0 ? "1" : "0"); dishOrderDO.setReductionState(reductionAmount.compareTo(BigDecimal.ZERO) > 0 ? "1" : "0");
@ -165,7 +165,7 @@ public class DeductionServiceImpl implements DeductionService {
deductionRedisTemplate.delete(dishOrderDO.getDiningPlatesNum() + "-" + dishOrderDO.getStoreId()); deductionRedisTemplate.delete(dishOrderDO.getDiningPlatesNum() + "-" + dishOrderDO.getStoreId());
//更新营业数据 //更新营业数据
if(dishOrderDO.getOrderStatus().equals(DishOrderDO.COMPLETE)){ if (dishOrderDO.getOrderStatus().equals(DishOrderDO.COMPLETE)) {
StatisticsVo statisticsVo = new StatisticsVo(); StatisticsVo statisticsVo = new StatisticsVo();
statisticsVo.setCarteenId(dishOrderDO.getStoreId()); statisticsVo.setCarteenId(dishOrderDO.getStoreId());
statisticsVo.setTotalMoney(dishOrderDO.getTotalMoney()); statisticsVo.setTotalMoney(dishOrderDO.getTotalMoney());
@ -186,7 +186,7 @@ public class DeductionServiceImpl implements DeductionService {
BigDecimal giftNewMoney; BigDecimal giftNewMoney;
BigDecimal cashNewAmount; BigDecimal cashNewAmount;
synchronized (userId){ synchronized (userId) {
MemberUserDO user = userService.getUser(userId); MemberUserDO user = userService.getUser(userId);
if (ObjectUtil.isEmpty(user) || user.getCashAmount().compareTo(BigDecimal.ZERO) < 1 if (ObjectUtil.isEmpty(user) || user.getCashAmount().compareTo(BigDecimal.ZERO) < 1
|| money.compareTo(user.getCashAmount()) > 0) { || money.compareTo(user.getCashAmount()) > 0) {
@ -222,7 +222,7 @@ public class DeductionServiceImpl implements DeductionService {
BigDecimal cashNewAmount; BigDecimal cashNewAmount;
BigDecimal changeMoney = new BigDecimal(amount).divide(new BigDecimal("100")); BigDecimal changeMoney = new BigDecimal(amount).divide(new BigDecimal("100"));
synchronized (userId){ synchronized (userId) {
MemberUserDO user = userService.getUser(userId); MemberUserDO user = userService.getUser(userId);
user.setWxAmount(user.getWxAmount().subtract(changeMoney)); user.setWxAmount(user.getWxAmount().subtract(changeMoney));
user.setMoney(user.getMoney().subtract(changeMoney)); user.setMoney(user.getMoney().subtract(changeMoney));
@ -256,7 +256,7 @@ public class DeductionServiceImpl implements DeductionService {
BigDecimal giftNewMoney; BigDecimal giftNewMoney;
BigDecimal cashNewAmount; BigDecimal cashNewAmount;
synchronized (userId){ synchronized (userId) {
MemberUserDO user = userService.getUser(userId); MemberUserDO user = userService.getUser(userId);
BigDecimal oldMoney = user.getMoney(); BigDecimal oldMoney = user.getMoney();
@ -271,7 +271,7 @@ public class DeductionServiceImpl implements DeductionService {
BigDecimal dishGiftAmount = dishOrderDO.getGiftAmount(); BigDecimal dishGiftAmount = dishOrderDO.getGiftAmount();
BigDecimal newMoney = money; BigDecimal newMoney = money;
if(oldMoney.compareTo(BigDecimal.ZERO)<0){ if (oldMoney.compareTo(BigDecimal.ZERO) < 0) {
newMoney = user.getMoney(); newMoney = user.getMoney();
} }
@ -321,5 +321,38 @@ public class DeductionServiceImpl implements DeductionService {
cardService.insertOne(cardDO); cardService.insertOne(cardDO);
} }
@Override
public void reduction(Long userId, BigDecimal money, BigDecimal giftAmount, BigDecimal cashAmount, BigDecimal wxAmount) {
BigDecimal NewMoney;
BigDecimal giftNewAmount;
BigDecimal cashNewAmount;
BigDecimal wxNewAmount;
synchronized (userId) {
MemberUserDO user = userService.getUser(userId);
user.setMoney(user.getMoney().add(money));
user.setCashAmount(user.getCashAmount().add(cashAmount));
user.setGiftAmount(user.getGiftAmount().add(giftAmount));
user.setWxAmount(user.getWxAmount().add(wxAmount));
userService.updateById(user);
NewMoney = user.getMoney();
wxNewAmount = user.getWxAmount();
giftNewAmount = user.getGiftAmount();
cashNewAmount = user.getCashAmount();
}
CardDO cardDO = new CardDO();
cardDO.setUserId(userId);
cardDO.setFlag(CardDO.ADD);
cardDO.setChangeMoney(money);
cardDO.setType(CostTypeEnum.REFUND.getCode());
cardDO.setMoney(NewMoney);
cardDO.setWxAmount(wxNewAmount);
cardDO.setCashAmount(cashNewAmount);
cardDO.setGiftAmount(giftNewAmount);
cardService.insertOne(cardDO);
}
} }

View File

@ -28,6 +28,7 @@ import cn.iocoder.yudao.module.member.dal.mysql.order.DishOrderMapper;
import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper; import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper;
import cn.iocoder.yudao.module.member.enums.CostTypeEnum; import cn.iocoder.yudao.module.member.enums.CostTypeEnum;
import cn.iocoder.yudao.module.member.enums.TimePeriodEnum; import cn.iocoder.yudao.module.member.enums.TimePeriodEnum;
import cn.iocoder.yudao.module.member.service.amount.DeductionService;
import cn.iocoder.yudao.module.member.service.business.BusinessService; import cn.iocoder.yudao.module.member.service.business.BusinessService;
import cn.iocoder.yudao.module.member.service.orderdetail.OrderDetailService; import cn.iocoder.yudao.module.member.service.orderdetail.OrderDetailService;
import cn.iocoder.yudao.module.member.service.refund.RefundService; import cn.iocoder.yudao.module.member.service.refund.RefundService;
@ -85,6 +86,8 @@ public class OrderServiceImpl implements OrderService {
private RefundService refundService; private RefundService refundService;
@Resource @Resource
private BusinessService businessService; private BusinessService businessService;
@Resource
private DeductionService deductionService;
@Override @Override
public Long createOrder(AppOrderSaveReqVO createReqVO) { public Long createOrder(AppOrderSaveReqVO createReqVO) {
@ -456,31 +459,7 @@ public class OrderServiceImpl implements OrderService {
} }
//退款 //退款
CardDO lastCardDO = cardMapper.selectOne(Wrappers.<CardDO>lambdaQuery() deductionService.reduction(dishOrderDO.getUserId(),money,giftAmount,cashAmount,wxAmount);
.eq(CardDO::getUserId, dishOrderDO.getUserId())
.orderByDesc(CardDO::getCreateTime)
.orderByDesc(CardDO::getId)
.last(MemberConstants.LIMIT_ONE));
CardDO cardDO = new CardDO();
cardDO.setUserId(dishOrderDO.getUserId());
cardDO.setFlag(CardDO.ADD);
cardDO.setChangeMoney(money);
cardDO.setType(CostTypeEnum.REFUND.getCode());
BigDecimal oldMoney = BigDecimal.ZERO;
if (ObjectUtil.isNotEmpty(lastCardDO) && lastCardDO.getMoney() != null) {
oldMoney = lastCardDO.getMoney();
}
cardDO.setMoney(oldMoney.add(money).setScale(2, BigDecimal.ROUND_HALF_UP));
BigDecimal oldWxAmount = lastCardDO.getWxAmount();
BigDecimal oldCashAmount = lastCardDO.getCashAmount();
BigDecimal oldGiftAmount = lastCardDO.getGiftAmount();
cardDO.setWxAmount(oldWxAmount.add(wxAmount));
cardDO.setCashAmount(oldCashAmount.add(cashAmount));
cardDO.setGiftAmount(oldGiftAmount.add(giftAmount));
cardMapper.insert(cardDO);
//更新营业数据 //更新营业数据
if(dishOrderDO.getOrderStatus().equals(DishOrderDO.COMPLETE)){ if(dishOrderDO.getOrderStatus().equals(DishOrderDO.COMPLETE)){