金额修改

This commit is contained in:
zt
2025-02-07 15:14:11 +08:00
parent d86dc8c145
commit 2dc8731571

View File

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