优化支付
This commit is contained in:
		| @ -9,5 +9,5 @@ public interface AmountService { | |||||||
|  |  | ||||||
|     BigDecimal getAmount(Long userId); |     BigDecimal getAmount(Long userId); | ||||||
|  |  | ||||||
|  |     BigDecimal getCashAmount(Long userId); | ||||||
| } | } | ||||||
|  | |||||||
| @ -27,6 +27,9 @@ import java.util.Arrays; | |||||||
| import java.util.List; | import java.util.List; | ||||||
| import java.util.stream.Collectors; | import java.util.stream.Collectors; | ||||||
|  |  | ||||||
|  | import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception; | ||||||
|  | import static cn.iocoder.yudao.module.member.enums.ErrorCodeConstants.USER_NOT_EXISTS; | ||||||
|  |  | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * 金额操作 Service 实现类 |  * 金额操作 Service 实现类 | ||||||
| @ -66,7 +69,18 @@ public class AmountServiceImpl implements AmountService { | |||||||
|     @Override |     @Override | ||||||
|     public BigDecimal getAmount(Long userId) { |     public BigDecimal getAmount(Long userId) { | ||||||
|         MemberUserDO memberUserDO = userMapper.selectById(userId); |         MemberUserDO memberUserDO = userMapper.selectById(userId); | ||||||
|  |         if (memberUserDO == null) { | ||||||
|  |             throw exception(USER_NOT_EXISTS); | ||||||
|  |         } | ||||||
|         return memberUserDO.getMoney(); |         return memberUserDO.getMoney(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public BigDecimal getCashAmount(Long userId) { | ||||||
|  |         MemberUserDO memberUserDO = userMapper.selectById(userId); | ||||||
|  |         if (memberUserDO == null) { | ||||||
|  |             throw exception(USER_NOT_EXISTS); | ||||||
|  |         } | ||||||
|  |         return memberUserDO.getCashAmount(); | ||||||
|  |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -21,4 +21,9 @@ public interface DeductionService { | |||||||
|      * 微信提现 |      * 微信提现 | ||||||
|      */ |      */ | ||||||
|     void wxDraw(Integer amount, Long userId); |     void wxDraw(Integer amount, Long userId); | ||||||
|  |  | ||||||
|  |     /** | ||||||
|  |      * 退款 | ||||||
|  |      */ | ||||||
|  |     void refund(Long userId,BigDecimal money,DishOrderDO dishOrderDO); | ||||||
| } | } | ||||||
|  | |||||||
| @ -7,6 +7,7 @@ import cn.iocoder.yudao.module.member.controller.admin.business.vo.StatisticsVo; | |||||||
| import cn.iocoder.yudao.module.member.dal.dataobject.card.CardDO; | import cn.iocoder.yudao.module.member.dal.dataobject.card.CardDO; | ||||||
| import cn.iocoder.yudao.module.member.dal.dataobject.order.DishOrderDO; | import cn.iocoder.yudao.module.member.dal.dataobject.order.DishOrderDO; | ||||||
| import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; | import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO; | ||||||
|  | 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; | ||||||
| @ -247,5 +248,79 @@ public class DeductionServiceImpl implements DeductionService { | |||||||
|         cardDO.setCashAmount(cashNewAmount); |         cardDO.setCashAmount(cashNewAmount); | ||||||
|         cardService.insertOne(cardDO); |         cardService.insertOne(cardDO); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     @Override | ||||||
|  |     public void refund(Long userId, BigDecimal money, DishOrderDO dishOrderDO) { | ||||||
|  |         //获取最新余额 | ||||||
|  |         BigDecimal newMoney2; | ||||||
|  |         BigDecimal wxNewMoney; | ||||||
|  |         BigDecimal giftNewMoney; | ||||||
|  |         BigDecimal cashNewAmount; | ||||||
|  |  | ||||||
|  |         synchronized (userId){ | ||||||
|  |             MemberUserDO user = userService.getUser(userId); | ||||||
|  |             BigDecimal oldMoney = user.getMoney(); | ||||||
|  |  | ||||||
|  |             user.setMoney(oldMoney.add(money)); | ||||||
|  |  | ||||||
|  |             BigDecimal wxAmount = user.getWxAmount(); | ||||||
|  |             BigDecimal cashAmount = user.getCashAmount(); | ||||||
|  |             BigDecimal giftAmount = user.getGiftAmount(); | ||||||
|  |  | ||||||
|  |             BigDecimal dishWxAmount = dishOrderDO.getWxAmount(); | ||||||
|  |             BigDecimal dishCashAmount = dishOrderDO.getCashAmount(); | ||||||
|  |             BigDecimal dishGiftAmount = dishOrderDO.getGiftAmount(); | ||||||
|  |  | ||||||
|  |             BigDecimal newMoney = money; | ||||||
|  |             if(oldMoney.compareTo(BigDecimal.ZERO)<0){ | ||||||
|  |                 newMoney = user.getMoney(); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |  | ||||||
|  |             if (user.getMoney().compareTo(BigDecimal.ZERO) <= 0) { | ||||||
|  |                 user.setWxAmount(BigDecimal.ZERO); | ||||||
|  |                 user.setGiftAmount(BigDecimal.ZERO); | ||||||
|  |                 user.setCashAmount(BigDecimal.ZERO); | ||||||
|  |             } else { | ||||||
|  |                 if (newMoney.compareTo(dishGiftAmount) <= 0) { | ||||||
|  |                     user.setGiftAmount(giftAmount.add(newMoney)); | ||||||
|  |                 } else { | ||||||
|  |                     user.setGiftAmount(giftAmount.add(dishGiftAmount)); | ||||||
|  |                     BigDecimal money1 = newMoney.subtract(dishGiftAmount); | ||||||
|  |  | ||||||
|  |                     if (money1.compareTo(dishCashAmount) <= 0) { | ||||||
|  |                         user.setCashAmount(cashAmount.add(money1)); | ||||||
|  |                     } else { | ||||||
|  |                         user.setCashAmount(cashAmount.add(dishCashAmount)); | ||||||
|  |                         BigDecimal money2 = money1.subtract(dishCashAmount); | ||||||
|  |                         if (money2.compareTo(dishWxAmount) <= 0) { | ||||||
|  |                             user.setWxAmount(wxAmount.add(money2)); | ||||||
|  |                         } else { | ||||||
|  |                             user.setWxAmount(wxAmount.add(dishWxAmount)); | ||||||
|  |                         } | ||||||
|  |  | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             userService.updateById(user); | ||||||
|  |             newMoney2 = user.getMoney(); | ||||||
|  |             wxNewMoney = user.getWxAmount(); | ||||||
|  |             giftNewMoney = 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.setWxAmount(wxNewMoney); | ||||||
|  |         cardDO.setGiftAmount(giftNewMoney); | ||||||
|  |         cardDO.setMoney(newMoney2); | ||||||
|  |         cardDO.setCashAmount(cashNewAmount); | ||||||
|  |  | ||||||
|  |         cardService.insertOne(cardDO); | ||||||
|  |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user
	 seesaw
					seesaw