From 862823b82f773281e7ba289bb29758f7b6a7177d Mon Sep 17 00:00:00 2001 From: seesaw Date: Mon, 21 Oct 2024 11:32:48 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E4=BB=98=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../yudao/module/member/api/card/CardApi.java | 13 ++ .../module/member/api/card/CardApiImpl.java | 13 +- .../member/job/BalanceDeductionJob.java | 118 ++---------------- .../service/amount/DeductionService.java | 4 +- .../service/amount/DeductionServiceImpl.java | 3 +- .../member/service/card/CardServiceImpl.java | 86 ++----------- .../pay/service/divide/DivideServiceImpl.java | 26 +--- .../controller/app/dishes/vo/AppSaveVO.java | 3 + 8 files changed, 52 insertions(+), 214 deletions(-) diff --git a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/card/CardApi.java b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/card/CardApi.java index 417e6851..dbe4e80f 100644 --- a/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/card/CardApi.java +++ b/yudao-module-member/yudao-module-member-api/src/main/java/cn/iocoder/yudao/module/member/api/card/CardApi.java @@ -9,5 +9,18 @@ import java.math.BigDecimal; */ public interface CardApi { + /** + * 微信充值 + * @param money + * @param userId + */ void recharge(BigDecimal money,Long userId); + + /** + * 微信提现 + * @param amount + * @param userId + */ + void wxDraw(Integer amount, Long userId); + } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/api/card/CardApiImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/api/card/CardApiImpl.java index d1243bab..0c229a38 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/api/card/CardApiImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/api/card/CardApiImpl.java @@ -3,6 +3,8 @@ package cn.iocoder.yudao.module.member.api.card; import cn.hutool.core.util.ObjectUtil; import cn.iocoder.yudao.module.member.dal.dataobject.card.CardDO; import cn.iocoder.yudao.module.member.dal.dataobject.rechargeamount.RechargeAmountDO; +import cn.iocoder.yudao.module.member.service.amount.DeductionService; +import cn.iocoder.yudao.module.member.service.amount.WxRechargeService; import cn.iocoder.yudao.module.member.service.card.CardService; import cn.iocoder.yudao.module.member.service.rechargeamount.RechargeAmountService; import org.springframework.stereotype.Service; @@ -21,7 +23,11 @@ public class CardApiImpl implements CardApi{ private CardService cardService; @Resource private RechargeAmountService rechargeAmountService; + @Resource + private DeductionService deductionService; + @Resource + private WxRechargeService wxRechargeService; @Override public void recharge(BigDecimal money,Long userId){ @@ -32,6 +38,11 @@ public class CardApiImpl implements CardApi{ giftMoney = giftMoney.add(recharge.getDonateMoney()); } - cardService.recharge(money, CardDO.ADD,giftMoney,userId); + wxRechargeService.wxRecharge(money, money.subtract(giftMoney),giftMoney,userId); + } + + @Override + public void wxDraw(Integer amount, Long userId) { + deductionService.wxDraw(amount,userId); } } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/job/BalanceDeductionJob.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/job/BalanceDeductionJob.java index 014c922f..1ce7f748 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/job/BalanceDeductionJob.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/job/BalanceDeductionJob.java @@ -9,6 +9,7 @@ import cn.iocoder.yudao.module.member.dal.dataobject.card.CardDO; import cn.iocoder.yudao.module.member.dal.dataobject.diningplates.DiningPlatesDO; import cn.iocoder.yudao.module.member.dal.dataobject.order.DishOrderDO; 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.card.CardService; import cn.iocoder.yudao.module.member.service.diningplates.DiningPlatesService; @@ -48,6 +49,10 @@ public class BalanceDeductionJob implements JobHandler { private MemberUserService userService; @Resource private BusinessService businessService; + + @Resource + private DeductionService deductionService; + /** * 30分钟之后自动解绑并扣款 */ @@ -69,120 +74,13 @@ public class BalanceDeductionJob implements JobHandler { //platesService.updatePayFlag(ids,DiningPlatesDO.PAY); //获取用户订单 List toPay = orderService.getToPayByOrder(orderIds); - //扣除余额 - List list = new ArrayList<>(); + toPay.forEach(dishOrderDO -> { - //新的总价 - String s = stringRedisTemplate.opsForValue().get(dishOrderDO.getDiningPlatesNum() + "-" + dishOrderDO.getStoreId()); - BigDecimal total = new BigDecimal(StrUtil.isBlank(s) ? "0" : s); - //BigDecimal total = new BigDecimal(0.01); - Long userId = dishOrderDO.getUserId(); - CardDO cardDO = new CardDO(); - cardDO.setType(TimePeriodEnum.getTimePeriod(dishOrderDO.getCreateTime())); - CardDO oldCardDO = cardService.getCardDoByUserId(userId); - - - BigDecimal money = oldCardDO.getMoney(); - //计算减免价格 - BigDecimal reductionAmount = BigDecimal.ZERO; - if (total.compareTo(BigDecimal.ZERO) > 0) { - reductionAmount = userService.getReductionAmount(userId, total, dishOrderDO.getCreateTime()); - } - if(dishOrderDO.getReductionAmount().compareTo(BigDecimal.ZERO) > 0){ - reductionAmount = reductionAmount.add(dishOrderDO.getReductionAmount()); - dishOrderDO.setReductionAmount(reductionAmount); - }else { - dishOrderDO.setReductionAmount(reductionAmount); - } - dishOrderDO.setReductionState(reductionAmount.compareTo(BigDecimal.ZERO) > 0 ? "1" : "0"); - - //计算减免后的总价 - if (total.compareTo(reductionAmount) < 0) { - total = BigDecimal.ZERO; - } else { - total = total.subtract(reductionAmount); - } - - BigDecimal wxAmount = oldCardDO.getWxAmount(); - BigDecimal giftAmount = oldCardDO.getGiftAmount(); - BigDecimal cashAmount = oldCardDO.getCashAmount(); - cardDO.setMoney(money.subtract(total).setScale(2, BigDecimal.ROUND_HALF_UP)); - //待支付金额 最大退款金额 - dishOrderDO.setRefundAmount(total); - if (money.compareTo(BigDecimal.ZERO) <= 0) { - dishOrderDO.setPayAmount(total); - dishOrderDO.setRefundAmount(BigDecimal.ZERO); - } else { - if (total.compareTo(money) > 0) { - dishOrderDO.setPayAmount(total.subtract(money).setScale(2, BigDecimal.ROUND_HALF_UP)); - dishOrderDO.setRefundAmount(money); - } - } - - if (total.compareTo(money) > 0) { - dishOrderDO.setOrderStatus(DishOrderDO.TOCOMPLETE); - dishOrderDO.setWxAmount(wxAmount); - dishOrderDO.setCashAmount(cashAmount); - dishOrderDO.setGiftAmount(giftAmount); - } else { - cardDO.setWxAmount(wxAmount); - cardDO.setCashAmount(cashAmount); - cardDO.setGiftAmount(giftAmount); - dishOrderDO.setOrderStatus(DishOrderDO.COMPLETE); - //计算金额 - if (total.compareTo(cashAmount) <= 0) { - cardDO.setCashAmount(cashAmount.subtract(total).setScale(2, BigDecimal.ROUND_HALF_UP)); - dishOrderDO.setCashAmount(total); - } else { - cardDO.setCashAmount(BigDecimal.ZERO); - dishOrderDO.setCashAmount(cashAmount); - BigDecimal total1 = total.subtract(cashAmount).setScale(2, BigDecimal.ROUND_HALF_UP); - if (total1.compareTo(giftAmount) <= 0) { - cardDO.setGiftAmount(giftAmount.subtract(total1).setScale(2, BigDecimal.ROUND_HALF_UP)); - dishOrderDO.setGiftAmount(total1); - } else { - cardDO.setGiftAmount(BigDecimal.ZERO); - dishOrderDO.setGiftAmount(giftAmount); - BigDecimal total2 = total1.subtract(giftAmount).setScale(2, BigDecimal.ROUND_HALF_UP); - - cardDO.setWxAmount(wxAmount.subtract(total2).setScale(2, BigDecimal.ROUND_HALF_UP)); - dishOrderDO.setWxAmount(total2); - } - } - } - - cardDO.setUserId(userId); - cardDO.setChangeMoney(total); - cardDO.setFlag(CardDO.MINUS); - cardService.insertOne(cardDO); - //String redisData = stringRedisTemplate.opsForValue().get("DATA-money"+ userId); - // - //if(StrUtil.isNotBlank(redisData)){ - // stringRedisTemplate.opsForValue().set("DATA-money"+userId, cardDO.getMoney().toString()); - // - //} - list.add(cardDO); - - dishOrderDO.setTotalMoney(total); - dishOrderDO.setUpdateTime(LocalDateTime.now()); - stringRedisTemplate.delete(dishOrderDO.getDiningPlatesNum() + "-" + dishOrderDO.getStoreId()); - - //更新营业数据 - if(dishOrderDO.getOrderStatus().equals(DishOrderDO.COMPLETE)){ - StatisticsVo statisticsVo = new StatisticsVo(); - statisticsVo.setCarteenId(dishOrderDO.getStoreId()); - statisticsVo.setTotalMoney(dishOrderDO.getTotalMoney()); - statisticsVo.setOrder_sum(1); - statisticsVo.setReduceMoney(dishOrderDO.getReductionAmount()); - statisticsVo.setTime(dishOrderDO.getCreateTime()); - statisticsVo.setOrderId(dishOrderDO.getId()); - businessService.updateStatistics(statisticsVo); - } - + deductionService.deduction(dishOrderDO); }); //取消批量,防止同一人订餐少扣款 //cardService.insertBatch(list); - size = list.size(); + size = toPay.size(); //餐盘解绑 platesService.updateBind(ids); //更新订单状态和总价 diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/amount/DeductionService.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/amount/DeductionService.java index 2783ba4f..74db7108 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/amount/DeductionService.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/amount/DeductionService.java @@ -10,7 +10,7 @@ public interface DeductionService { /** * 餐盘扣减余额 */ - DishOrderDO deduction(DishOrderDO dishOrderDO); + void deduction(DishOrderDO dishOrderDO); /** * 现金提现 @@ -18,7 +18,7 @@ public interface DeductionService { void cashDraw(Long userId, BigDecimal money); /** - * 微信提现 + * 微信提现 金额单位:分 */ void wxDraw(Integer amount, Long userId); 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 6c9a24d9..9bea3296 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 @@ -51,7 +51,7 @@ public class DeductionServiceImpl implements DeductionService { private BusinessService businessService; @Override - public DishOrderDO deduction(DishOrderDO dishOrderDO) { + public void deduction(DishOrderDO dishOrderDO) { Long userId = dishOrderDO.getUserId(); BigDecimal newMoney; @@ -175,7 +175,6 @@ public class DeductionServiceImpl implements DeductionService { statisticsVo.setOrderId(dishOrderDO.getId()); businessService.updateStatistics(statisticsVo); } - return dishOrderDO; } diff --git a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/card/CardServiceImpl.java b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/card/CardServiceImpl.java index 358284de..51c0a022 100644 --- a/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/card/CardServiceImpl.java +++ b/yudao-module-member/yudao-module-member-biz/src/main/java/cn/iocoder/yudao/module/member/service/card/CardServiceImpl.java @@ -26,6 +26,7 @@ import cn.iocoder.yudao.module.member.dal.mysql.refundlog.RefundLogMapper; import cn.iocoder.yudao.module.member.enums.CostTypeEnum; import cn.iocoder.yudao.module.member.service.amount.AmountService; import cn.iocoder.yudao.module.member.service.amount.CashRechargeService; +import cn.iocoder.yudao.module.member.service.amount.DeductionService; import cn.iocoder.yudao.module.member.service.amount.WxRechargeService; import cn.iocoder.yudao.module.member.util.MemberConstants; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -87,6 +88,9 @@ public class CardServiceImpl implements CardService { @Resource private CashRechargeService cashRechargeService; + @Resource + private DeductionService deductionService; + @Override public Long createCard(CardSaveReqVO createReqVO) { // 插入 @@ -201,62 +205,10 @@ public class CardServiceImpl implements CardService { @Override @Transactional(rollbackFor = Exception.class) public void refund(Long userId, BigDecimal money, Long orderId) { - //获取最新余额 - CardDO lastCardDO = cardMapper.selectOne(Wrappers.lambdaQuery().eq(CardDO::getUserId, userId) - .orderByDesc(CardDO::getCreateTime).orderByDesc(CardDO::getId).last(MemberConstants.LIMIT_ONE)); + DishOrderDO dishOrderDO = dishOrderMapper.selectById(orderId); - CardDO cardDO = new CardDO(); - cardDO.setUserId(userId); - 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 wxAmount = lastCardDO.getWxAmount(); - BigDecimal cashAmount = lastCardDO.getCashAmount(); - BigDecimal giftAmount = lastCardDO.getGiftAmount(); - - BigDecimal dishWxAmount = dishOrderDO.getWxAmount(); - BigDecimal dishCashAmount = dishOrderDO.getCashAmount(); - BigDecimal dishGiftAmount = dishOrderDO.getGiftAmount(); - - BigDecimal newMoney = money; - if(oldMoney.compareTo(BigDecimal.ZERO)<0){ - newMoney = cardDO.getMoney(); - } - - - if (cardDO.getMoney().compareTo(BigDecimal.ZERO) <= 0) { - cardDO.setWxAmount(BigDecimal.ZERO); - cardDO.setGiftAmount(BigDecimal.ZERO); - cardDO.setCashAmount(BigDecimal.ZERO); - } else { - if (newMoney.compareTo(dishGiftAmount) <= 0) { - cardDO.setGiftAmount(giftAmount.add(newMoney).setScale(2, BigDecimal.ROUND_HALF_UP)); - } else { - cardDO.setGiftAmount(giftAmount.add(dishGiftAmount).setScale(2, BigDecimal.ROUND_HALF_UP)); - BigDecimal money1 = newMoney.subtract(dishGiftAmount).setScale(2, BigDecimal.ROUND_HALF_UP); - - if (money1.compareTo(dishCashAmount) <= 0) { - cardDO.setCashAmount(cashAmount.add(money1).setScale(2, BigDecimal.ROUND_HALF_UP)); - } else { - cardDO.setCashAmount(cashAmount.add(dishCashAmount).setScale(2, BigDecimal.ROUND_HALF_UP)); - BigDecimal money2 = money1.subtract(dishCashAmount).setScale(2, BigDecimal.ROUND_HALF_UP); - if (money2.compareTo(dishWxAmount) <= 0) { - cardDO.setWxAmount(wxAmount.add(money2).setScale(2, BigDecimal.ROUND_HALF_UP)); - } else { - cardDO.setWxAmount(wxAmount.add(dishWxAmount).setScale(2, BigDecimal.ROUND_HALF_UP)); - } - - } - } - } + deductionService.refund(userId, money,dishOrderDO); //记录 refundLog(dishOrderDO,money); //订单处理 @@ -276,7 +228,6 @@ public class CardServiceImpl implements CardService { } } dishOrderMapper.updateById(dishOrderDO); - cardMapper.insert(cardDO); } public void handleOtherMoney(DishOrderDO dishOrderDO,BigDecimal money){ @@ -488,29 +439,8 @@ public class CardServiceImpl implements CardService { @Override public Boolean cashDraw(Long userId, BigDecimal money) { - CardDO lastCardDO = cardMapper.selectOne(Wrappers.lambdaQuery().eq(CardDO::getUserId, userId) - .orderByDesc(CardDO::getCreateTime).orderByDesc(CardDO::getId).last(MemberConstants.LIMIT_ONE)); - if (ObjectUtil.isEmpty(lastCardDO) || lastCardDO.getCashAmount().compareTo(BigDecimal.ZERO) < 1 - || money.compareTo(lastCardDO.getCashAmount()) > 0) { - throw exception(CASH_AMOUNT_NOT_ENOUGH); - } - CardDO cardDO = new CardDO(); - cardDO.setUserId(userId); - cardDO.setFlag(CardDO.MINUS); - cardDO.setChangeMoney(money); - cardDO.setType(CostTypeEnum.CASH_WITHDRAW.getCode()); - - BigDecimal oldMoney = lastCardDO.getMoney(); - BigDecimal oldWxAmount = lastCardDO.getWxAmount(); - BigDecimal oldCashAmount = lastCardDO.getCashAmount(); - BigDecimal oldGiftAmount = lastCardDO.getGiftAmount(); - - cardDO.setWxAmount(oldWxAmount); - cardDO.setGiftAmount(oldGiftAmount); - cardDO.setMoney(oldMoney.subtract(money)); - cardDO.setCashAmount(oldCashAmount.subtract(money)); - int insert = cardMapper.insert(cardDO); - return insert > 0; + deductionService.cashDraw(userId, money); + return true; } void updateOrderStatus(Long userId) { diff --git a/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/divide/DivideServiceImpl.java b/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/divide/DivideServiceImpl.java index 8e796373..ff22b5fd 100644 --- a/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/divide/DivideServiceImpl.java +++ b/yudao-module-pay/yudao-module-pay-biz/src/main/java/cn/iocoder/yudao/module/pay/service/divide/DivideServiceImpl.java @@ -15,6 +15,7 @@ import cn.iocoder.yudao.framework.pay.core.client.dto.refund.PayRefundRespDTO; import cn.iocoder.yudao.framework.pay.core.client.dto.refund.PayRefundUnifiedReqDTO; import cn.iocoder.yudao.framework.pay.core.enums.divide.PayDivideRefundStatusRespEnum; import cn.iocoder.yudao.framework.pay.core.enums.divide.PayDivideStatusRespEnum; +import cn.iocoder.yudao.module.member.api.card.CardApi; import cn.iocoder.yudao.module.pay.controller.admin.divide.vo.DividePageReqVO; import cn.iocoder.yudao.module.pay.controller.admin.divide.vo.DivideSaveReqVO; import cn.iocoder.yudao.module.pay.controller.app.divide.vo.DrawMoneyVO; @@ -93,6 +94,9 @@ public class DivideServiceImpl implements DivideService { @Resource private StringRedisTemplate divideRedisTemplate; + @Resource + private CardApi cardApi; + @Override public Long createDivide(DivideSaveReqVO createReqVO) { @@ -740,27 +744,7 @@ public class DivideServiceImpl implements DivideService { @Override public void subtractWx(Integer amount, Long userId) { - DivideCardDO lastCardDO = divideCardMapper.selectOne(Wrappers.lambdaQuery() - .eq(DivideCardDO::getUserId, userId) - .orderByDesc(DivideCardDO::getCreateTime) - .orderByDesc(DivideCardDO::getId) - .last("limit 1")); - - BigDecimal changeMoney = new BigDecimal(amount).divide(new BigDecimal("100")); - //获取最新余额 - DivideCardDO cardDO = new DivideCardDO(); - cardDO.setUserId(userId); - cardDO.setFlag(DivideCardDO.MINUS); - cardDO.setChangeMoney(changeMoney); - cardDO.setType("7"); - BigDecimal oldMoney = lastCardDO.getMoney(); - BigDecimal wxOldMoney = lastCardDO.getWxAmount(); - - cardDO.setMoney(oldMoney.subtract(changeMoney).setScale(2, BigDecimal.ROUND_HALF_UP)); - cardDO.setWxAmount(wxOldMoney.subtract(changeMoney).setScale(2, BigDecimal.ROUND_HALF_UP)); - cardDO.setGiftAmount(lastCardDO.getGiftAmount()); - cardDO.setCashAmount(lastCardDO.getCashAmount()); - divideCardMapper.insert(cardDO); + cardApi.wxDraw(amount, userId); } @Override diff --git a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/dishes/vo/AppSaveVO.java b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/dishes/vo/AppSaveVO.java index b21ed59a..e113a577 100644 --- a/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/dishes/vo/AppSaveVO.java +++ b/yudao-module-system/yudao-module-system-biz/src/main/java/cn/iocoder/yudao/module/system/controller/app/dishes/vo/AppSaveVO.java @@ -31,4 +31,7 @@ public class AppSaveVO { @Schema(description = "时段", example = "早") private String timeSlot; + + @Schema(description = "", example = "早") + private Long carteenId; }