diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/amount/DeductionServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/amount/DeductionServiceImpl.java index 5b4d3d96..1346194b 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/amount/DeductionServiceImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/amount/DeductionServiceImpl.java @@ -69,19 +69,12 @@ public class DeductionServiceImpl implements DeductionService { BigDecimal changeMoney; BigDecimal wxNewMoney; - BigDecimal giftNewMoney; BigDecimal cashNewMoney; + BigDecimal newMoney; String name; - synchronized (getUserLock(userId)) { MemberUserDO user = userService.getUser(userId); - //获取所有现金 - List allDebt = moneyService.getAllDebt(userId); - BigDecimal cashAmount = allDebt.stream().map(MoneyDO::getCashAmount).filter(Objects::nonNull).reduce(BigDecimal.ZERO, BigDecimal::add); - //获取当前门店的数据 - MoneyDO moneyDO =getStoreMoney(allDebt,dishOrderDO.getStoreId(),user.getId()); - //新的总价 String s = deductionRedisTemplate.opsForValue().get(dishOrderDO.getDiningPlatesNum() + "-" + dishOrderDO.getStoreId()); BigDecimal total = new BigDecimal(StrUtil.isBlank(s) ? "0" : s); @@ -108,11 +101,13 @@ public class DeductionServiceImpl implements DeductionService { } else { total = total.subtract(reductionAmount); } - //当前金额 - BigDecimal wxAmount = user.getWxAmount(); - BigDecimal giftAmount = user.getGiftAmount(); - BigDecimal money = wxAmount.add(giftAmount).add(cashAmount); + //微信 + BigDecimal wxAmount = user.getWxAmount(); + //现金 + BigDecimal cashAmount = user.getCashAmount(); + //当前金额 + BigDecimal money = user.getMoney(); //待支付金额 最大退款金额 dishOrderDO.setRefundAmount(total); @@ -125,48 +120,51 @@ public class DeductionServiceImpl implements DeductionService { dishOrderDO.setRefundAmount(money); } } - + //扣除金额 + user.setMoney(money.subtract(total)); if (total.compareTo(money) > 0) { dishOrderDO.setOrderStatus(DishOrderDO.TOCOMPLETE); dishOrderDO.setWxAmount(wxAmount); dishOrderDO.setCashAmount(cashAmount); - dishOrderDO.setGiftAmount(giftAmount); user.setWxAmount(BigDecimal.ZERO); - moneyDO.setCashAmount(BigDecimal.ZERO); - user.setGiftAmount(BigDecimal.ZERO); - moneyDO.setDebtAmount(money.subtract(total).add(moneyDO.getDebtAmount())); + user.setCashAmount(BigDecimal.ZERO); } else { dishOrderDO.setOrderStatus(DishOrderDO.COMPLETE); - //计算金额 现金->赠送->微信 - if (total.compareTo(cashAmount) <= 0) { - moneyDO.setCashAmount(cashAmount.subtract(total)); - dishOrderDO.setCashAmount(total); - } else { - moneyDO.setCashAmount(BigDecimal.ZERO); - dishOrderDO.setCashAmount(cashAmount); - BigDecimal total1 = total.subtract(cashAmount); - if (total1.compareTo(giftAmount) <= 0) { - user.setGiftAmount(giftAmount.subtract(total1)); - dishOrderDO.setGiftAmount(total1); + //扣除具体金额 + if (judge(userId)) { //微信->现金 + if (total.compareTo(wxAmount) <= 0) { + user.setWxAmount(wxAmount.subtract(total)); + dishOrderDO.setWxAmount(total); } else { - user.setGiftAmount(BigDecimal.ZERO); - dishOrderDO.setGiftAmount(giftAmount); - BigDecimal total2 = total1.subtract(giftAmount); + user.setWxAmount(BigDecimal.ZERO); + dishOrderDO.setWxAmount(wxAmount); + BigDecimal total1 = total.subtract(wxAmount); + user.setCashAmount(cashAmount.subtract(total1)); + dishOrderDO.setCashAmount(total1); + } - user.setWxAmount(wxAmount.subtract(total2)); - dishOrderDO.setWxAmount(total2); + } else { //现金->微信 + if (total.compareTo(cashAmount) <= 0) { + user.setCashAmount(cashAmount.subtract(total)); + dishOrderDO.setCashAmount(total); + } else { + user.setCashAmount(BigDecimal.ZERO); + dishOrderDO.setCashAmount(cashAmount); + BigDecimal total1 = total.subtract(cashAmount); + user.setWxAmount(wxAmount.subtract(total1)); + dishOrderDO.setWxAmount(total1); } } } + //修改 userService.updateById(user); - moneyService.updateById(moneyDO); wxNewMoney = user.getWxAmount(); - giftNewMoney = user.getGiftAmount(); - cashNewMoney = moneyDO.getCashAmount(); + cashNewMoney = user.getCashAmount(); changeMoney = total; + newMoney = user.getMoney(); name = user.getNickname(); } @@ -178,7 +176,6 @@ public class DeductionServiceImpl implements DeductionService { cardDO.setFlag(CardDO.MINUS); cardDO.setCashAmount(cashNewMoney); cardDO.setWxAmount(wxNewMoney); - cardDO.setGiftAmount(giftNewMoney); cardDO.setCarteenId(dishOrderDO.getStoreId()); cardService.insertOne(cardDO); @@ -201,7 +198,7 @@ public class DeductionServiceImpl implements DeductionService { } //更新redis - updateRedis(userId, name, wxNewMoney); + updateRedis(userId, name, newMoney); } @@ -209,23 +206,23 @@ public class DeductionServiceImpl implements DeductionService { public void cashDraw(Long userId, BigDecimal money, String type, Long storeId) { BigDecimal wxNewMoney; - BigDecimal giftNewMoney; BigDecimal cashNewMoney; + BigDecimal newMoney; String name; synchronized (getUserLock(userId)) { MemberUserDO user = userService.getUser(userId); - MoneyDO moneyDO = moneyService.getMoney(userId, storeId); - if (ObjectUtil.isEmpty(moneyDO) || moneyDO.getCashAmount().compareTo(BigDecimal.ZERO) < 1 - || money.compareTo(moneyDO.getCashAmount()) > 0) { + if (user.getCashAmount().compareTo(BigDecimal.ZERO) < 1 + || money.compareTo(user.getCashAmount()) > 0) { throw exception(CASH_AMOUNT_NOT_ENOUGH); } - moneyDO.setCashAmount(moneyDO.getCashAmount().subtract(money)); - moneyService.updateById(moneyDO); + user.setCashAmount(user.getCashAmount().subtract(money)); + user.setMoney(user.getMoney().subtract(money)); + userService.updateById(user); wxNewMoney = user.getWxAmount(); - giftNewMoney = user.getGiftAmount(); - cashNewMoney = moneyDO.getCashAmount(); + cashNewMoney = user.getCashAmount(); + newMoney = user.getMoney(); name = user.getNickname(); } @@ -235,13 +232,12 @@ public class DeductionServiceImpl implements DeductionService { cardDO.setChangeMoney(money); cardDO.setType(type); cardDO.setWxAmount(wxNewMoney); - cardDO.setGiftAmount(giftNewMoney); cardDO.setCashAmount(cashNewMoney); cardDO.setCarteenId(storeId); cardService.insertOne(cardDO); //更新redis - updateRedis(userId, name, wxNewMoney); + updateRedis(userId, name, newMoney); } @@ -249,17 +245,18 @@ public class DeductionServiceImpl implements DeductionService { public void wxDraw(Integer amount, Long userId) { BigDecimal wxNewMoney; - BigDecimal giftNewMoney; BigDecimal cashNewMoney; + BigDecimal newMoney; String name; BigDecimal changeMoney = new BigDecimal(amount).divide(new BigDecimal("100")); synchronized (getUserLock(userId)) { MemberUserDO user = userService.getUser(userId); user.setWxAmount(user.getWxAmount().subtract(changeMoney)); + user.setMoney(user.getMoney().subtract(changeMoney)); userService.updateById(user); wxNewMoney = user.getWxAmount(); - giftNewMoney = user.getGiftAmount(); + newMoney = user.getMoney(); cashNewMoney = user.getCashAmount(); name = user.getNickname(); } @@ -272,74 +269,62 @@ public class DeductionServiceImpl implements DeductionService { cardDO.setChangeMoney(changeMoney); cardDO.setType("7"); cardDO.setWxAmount(wxNewMoney); - cardDO.setGiftAmount(giftNewMoney); cardDO.setCashAmount(cashNewMoney); cardService.insertOne(cardDO); //更新redis - updateRedis(userId, name, wxNewMoney); + updateRedis(userId, name, newMoney); } @Override public void refund(Long userId, BigDecimal money, DishOrderDO dishOrderDO) { //获取最新余额 BigDecimal wxNewMoney; - BigDecimal giftNewMoney; + BigDecimal newTotalMoney; BigDecimal cashNewMoney; String name; synchronized (getUserLock(userId)) { MemberUserDO user = userService.getUser(userId); - MoneyDO moneyDO = moneyService.getMoney(userId, dishOrderDO.getStoreId()); //用户当前金额 + BigDecimal userMoney = user.getMoney(); BigDecimal wxAmount = user.getWxAmount(); - BigDecimal giftAmount = user.getGiftAmount(); - BigDecimal cashAmount = moneyDO.getCashAmount(); - BigDecimal debtAmount = moneyDO.getDebtAmount(); - + BigDecimal cashAmount = user.getCashAmount(); //订单消费金额 BigDecimal dishWxAmount = dishOrderDO.getWxAmount(); BigDecimal dishCashAmount = dishOrderDO.getCashAmount(); - BigDecimal dishGiftAmount = dishOrderDO.getGiftAmount(); BigDecimal newMoney = money; - if (debtAmount.compareTo(BigDecimal.ZERO) > 0) { - newMoney = debtAmount.add(newMoney); + if (userMoney.compareTo(BigDecimal.ZERO) < 0) { + newMoney = userMoney.add(newMoney); } if (newMoney.compareTo(BigDecimal.ZERO) < 0) { user.setWxAmount(BigDecimal.ZERO); - user.setGiftAmount(BigDecimal.ZERO); user.setCashAmount(BigDecimal.ZERO); + user.setMoney(newMoney); } else { - if (newMoney.compareTo(dishGiftAmount) <= 0) { - user.setGiftAmount(giftAmount.add(newMoney)); + if (newMoney.compareTo(dishCashAmount) <= 0) { + user.setCashAmount(cashAmount.add(newMoney)); } else { - user.setGiftAmount(giftAmount.add(dishGiftAmount)); - BigDecimal money1 = newMoney.subtract(dishGiftAmount); - - if (money1.compareTo(dishCashAmount) <= 0) { - moneyDO.setCashAmount(cashAmount.add(money1)); + user.setCashAmount(cashAmount.add(dishCashAmount)); + BigDecimal money2 = newMoney.subtract(dishCashAmount); + if (money2.compareTo(dishWxAmount) <= 0) { + user.setWxAmount(wxAmount.add(money2)); } else { - moneyDO.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)); - } - + user.setWxAmount(wxAmount.add(dishWxAmount)); } + } + } userService.updateById(user); - moneyService.updateById(moneyDO); wxNewMoney = user.getWxAmount(); - giftNewMoney = user.getGiftAmount(); - cashNewMoney = moneyDO.getCashAmount(); + newTotalMoney = user.getMoney(); + cashNewMoney = user.getCashAmount(); name = user.getNickname(); } @@ -349,36 +334,33 @@ public class DeductionServiceImpl implements DeductionService { cardDO.setChangeMoney(money); cardDO.setType(CostTypeEnum.REFUND.getCode()); cardDO.setWxAmount(wxNewMoney); - cardDO.setGiftAmount(giftNewMoney); cardDO.setCashAmount(cashNewMoney); cardDO.setCarteenId(dishOrderDO.getStoreId()); cardService.insertOne(cardDO); //更新redis - updateRedis(userId, name, wxNewMoney); + updateRedis(userId, name, newTotalMoney); } @Override public void reduction(Long userId, BigDecimal money, BigDecimal giftAmount, BigDecimal cashAmount, BigDecimal wxAmount, Long storeId) { - BigDecimal giftNewAmount; + BigDecimal newAmount; BigDecimal cashNewAmount; BigDecimal wxNewAmount; String name; synchronized (getUserLock(userId)) { MemberUserDO user = userService.getUser(userId); - MoneyDO moneyDO = moneyService.getMoney(userId, storeId); - moneyDO.setCashAmount(moneyDO.getCashAmount().add(cashAmount)); - user.setGiftAmount(user.getGiftAmount().add(giftAmount)); + user.setCashAmount(user.getCashAmount().add(cashAmount)); user.setWxAmount(user.getWxAmount().add(wxAmount)); + user.setMoney(user.getMoney().add(money)); userService.updateById(user); - moneyService.updateById(moneyDO); wxNewAmount = user.getWxAmount(); - giftNewAmount = user.getGiftAmount(); - cashNewAmount = moneyDO.getCashAmount(); + newAmount = user.getMoney(); + cashNewAmount = user.getCashAmount(); name = user.getNickname(); } CardDO cardDO = new CardDO(); @@ -388,30 +370,27 @@ public class DeductionServiceImpl implements DeductionService { cardDO.setType(CostTypeEnum.REFUND.getCode()); cardDO.setWxAmount(wxNewAmount); cardDO.setCashAmount(cashNewAmount); - cardDO.setGiftAmount(giftNewAmount); cardDO.setCarteenId(storeId); cardService.insertOne(cardDO); //更新redis - updateRedis(userId, name, wxNewAmount); + updateRedis(userId, name, newAmount); } @Override public BigDecimal storeDeduction(BigDecimal total, @NotNull Long userId, Long storeId) { BigDecimal wxNewMoney; - BigDecimal giftNewMoney; + BigDecimal newMoney; BigDecimal cashNewMoney; String name; synchronized (getUserLock(userId)) { MemberUserDO user = userService.getUser(userId); - MoneyDO moneyDO = moneyService.getMoney(userId, storeId); BigDecimal wxAmount = user.getWxAmount(); - BigDecimal giftAmount = user.getGiftAmount(); - BigDecimal cashAmount = moneyDO.getCashAmount(); + BigDecimal cashAmount = user.getCashAmount(); - BigDecimal money = wxAmount.add(giftAmount).add(cashAmount); + BigDecimal money = user.getMoney(); if (total.compareTo(money) > 0) { return money.subtract(total); @@ -419,9 +398,9 @@ public class DeductionServiceImpl implements DeductionService { //计算金额 if (total.compareTo(cashAmount) <= 0) { - moneyDO.setCashAmount(cashAmount.subtract(total)); + user.setCashAmount(cashAmount.subtract(total)); } else { - moneyDO.setCashAmount(BigDecimal.ZERO); + user.setCashAmount(BigDecimal.ZERO); BigDecimal total1 = total.subtract(cashAmount); if (total1.compareTo(giftAmount) <= 0) { user.setGiftAmount(giftAmount.subtract(total1)); @@ -469,7 +448,7 @@ public class DeductionServiceImpl implements DeductionService { } @Override - public void deduct(Long userId, BigDecimal money, String type,Long storeId) { + public void deduct(Long userId, BigDecimal money, String type, Long storeId) { BigDecimal wxNewMoney; BigDecimal giftNewMoney; @@ -557,9 +536,9 @@ public class DeductionServiceImpl implements DeductionService { user.setGiftAmount(BigDecimal.ZERO); BigDecimal total2 = total1.subtract(giftAmount); - if(total2.compareTo(wxAmount) <= 0) { + if (total2.compareTo(wxAmount) <= 0) { user.setWxAmount(wxAmount.subtract(total2)); - }else { + } else { user.setWxAmount(BigDecimal.ZERO); moneyDO.setDebtAmount(wxAmount.subtract(total2).add(moneyDO.getDebtAmount())); } @@ -592,7 +571,7 @@ public class DeductionServiceImpl implements DeductionService { } //判断先扣那个金额 - public boolean checkWay(Long userId){ + public boolean checkWay(Long userId) { //获取用户所在组分类 Integer type = memberGroupService.getGroupTypeByUserId(userId); List typeList = Arrays.asList(GroupTypeEnum.ADMINISTRATIVE.getCode(), GroupTypeEnum.DISTRICT.getCode()); @@ -602,7 +581,7 @@ public class DeductionServiceImpl implements DeductionService { } //获取门店的金额数据 - public MoneyDO getStoreMoney(List list,Long storeId,Long userId){ + public MoneyDO getStoreMoney(List list, Long storeId, Long userId) { Optional optionalDebt = list.stream() .filter(debt -> storeId.equals(debt.getCarteenId())) .findFirst(); @@ -615,23 +594,14 @@ public class DeductionServiceImpl implements DeductionService { return add; }); } - //清零所有门店的金额数据,并把欠款放在当前门店数据上 - public void cleanCashAmount(List list,Long storeId,BigDecimal debtAmount,MoneyDO moneyDO){ - boolean isNotContain = true; - for (MoneyDO money : list) { - if (storeId.equals(money.getCarteenId())) { - money.setDebtAmount(debtAmount.add(money.getDebtAmount())); - isNotContain = false; - } - money.setCashAmount(BigDecimal.ZERO); - } - if (isNotContain) { - moneyDO.setDebtAmount(debtAmount.add(moneyDO.getDebtAmount())); - moneyDO.setCashAmount(BigDecimal.ZERO); - list.add(moneyDO); - } - moneyService.updateList(list); - } + //判断扣款顺序 + public boolean judge(Long userId) { + Integer type = memberGroupService.getGroupTypeByUserId(userId); + List typeList = Arrays.asList(GroupTypeEnum.ADMINISTRATIVE.getCode(), GroupTypeEnum.DISTRICT.getCode()); + //查询今天是否假期 + Boolean isHoliday = holidayService.checkHoliday(); + return isHoliday && typeList.contains(type); + } }