|
|
@@ -3098,7 +3098,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
|
|
|
|
|
|
//银河币使用记录
|
|
|
//扣除下单银河币
|
|
|
- userGalaxyCoinService.handleUserGalaxyCoinOrderNotify(orderDon.getId(), orderDon.getUserId(), orderDon.getOrderNo(), Boolean.FALSE);
|
|
|
+ userGalaxyCoinService.handleUserGalaxyCoinOrderNotify(orderDon.getId(), orderDon.getUserId(), orderDon.getOrderNo(), OrderDonGalaxyCoinRecord.Source.ordinary);
|
|
|
//银河币返回
|
|
|
returnGalaxyCoin(orderDon);
|
|
|
}
|
|
|
@@ -4014,7 +4014,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
|
|
|
upgradeOrderDon.setType(UpgradeOrderDon.Type.ALI_PAY);
|
|
|
upgradeOrderDonMapper.insert(upgradeOrderDon);
|
|
|
|
|
|
- deductUpgradeBalancePayOrderMoney(upgradeOrderDon, payRequest.getBalance(),user);
|
|
|
+ deductUpgradeBalancePayOrderMoney(upgradeOrderDon, payRequest,user);
|
|
|
Long orderId = upgradeOrderDon.getId();
|
|
|
if (upgradeOrderDon.getMoney().compareTo(BigDecimal.ZERO) == 0) {
|
|
|
upgradeOrderDon = upgradeOrderDonMapper.selectById(orderId);
|
|
|
@@ -4030,7 +4030,12 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
|
|
|
return null;
|
|
|
}
|
|
|
|
|
|
- public void deductUpgradeBalancePayOrderMoney(UpgradeOrderDon orderDon, BigDecimal balance, User user) {
|
|
|
+ public void deductUpgradeBalancePayOrderMoney(UpgradeOrderDon orderDon, OrderPayRequest payRequest, User user) {
|
|
|
+ BigDecimal galaxyCoin = payRequest.getGalaxyCoin();
|
|
|
+ //存在银河币
|
|
|
+ deductGalaxyCoinPayUpgradeOrderMoney(orderDon, orderDon.getMoney(), galaxyCoin, user);
|
|
|
+
|
|
|
+ BigDecimal balance = payRequest.getBalance();
|
|
|
//存在余额
|
|
|
if (balance != null && balance.compareTo(BigDecimal.ZERO) > 0) {
|
|
|
BigDecimal money = orderDon.getMoney();
|
|
|
@@ -4214,6 +4219,37 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ //银河币使用记录
|
|
|
+ //扣除下单银河币
|
|
|
+ userGalaxyCoinService.handleUserGalaxyCoinOrderNotify(orderDon.getId(), orderDon.getUserId(), orderDon.getOrderNo(), OrderDonGalaxyCoinRecord.Source.upgrade);
|
|
|
+ //银河币返回
|
|
|
+ returnUpgradeGalaxyCoin(orderDon);
|
|
|
+ }
|
|
|
+
|
|
|
+ private void returnUpgradeGalaxyCoin(UpgradeOrderDon orderDon) {
|
|
|
+ if (orderDon.getMoney().compareTo(BigDecimal.ZERO) > 0) {
|
|
|
+ Long userId = orderDon.getUserId();
|
|
|
+ BigDecimal money = orderDon.getMoney();
|
|
|
+ SysConfig galaxyCoinConsumeReturnRateConfig = sysConfigService.getOne(Wrappers.lambdaQuery(SysConfig.class)
|
|
|
+ .eq(SysConfig::getSysKey, Constant.GALAXY_COIN_CONSUME_RETURN_RATE_KEY)
|
|
|
+ .last("limit 1"));
|
|
|
+ BigDecimal retrunGalaxyCoin = BigDecimal.ZERO;
|
|
|
+ if (galaxyCoinConsumeReturnRateConfig != null && StrUtil.isNotEmpty(galaxyCoinConsumeReturnRateConfig.getSysValue())) {
|
|
|
+ try {
|
|
|
+ GalaxyCoinConsumeRateDto galaxyCoinConsumeRateDto = Jsons.parseObject(galaxyCoinConsumeReturnRateConfig.getSysValue(), GalaxyCoinConsumeRateDto.class);
|
|
|
+ BigDecimal moneyAvg = galaxyCoinConsumeRateDto.getMoney();
|
|
|
+ //返回银河币倍数
|
|
|
+ BigDecimal number = money.divide(moneyAvg, 0);
|
|
|
+ retrunGalaxyCoin = number.multiply(galaxyCoinConsumeRateDto.getGalaxyCoin());
|
|
|
+ //发送银河币并记录
|
|
|
+ userGalaxyCoinService.sendOrderCashback(orderDon.getId(), userId, retrunGalaxyCoin.intValue(), PointsRecordConst.ORDER_CASHBACK, OrderDonGalaxyCoinRecord.Source.upgrade);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("发送用户:{}银河币points:{}套餐升级错误:{}", userId, retrunGalaxyCoin, StringUtil.getErrorText(e));
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -4973,7 +5009,7 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
|
|
|
BigDecimal number = money.divide(moneyAvg, 0);
|
|
|
retrunGalaxyCoin = number.multiply(galaxyCoinConsumeRateDto.getGalaxyCoin());
|
|
|
//发送银河币并记录
|
|
|
- userGalaxyCoinService.sendOrderCashback(orderDon.getId(), userId, retrunGalaxyCoin.intValue(), PointsRecordConst.ORDER_CASHBACK);
|
|
|
+ userGalaxyCoinService.sendOrderCashback(orderDon.getId(), userId, retrunGalaxyCoin.intValue(), PointsRecordConst.ORDER_CASHBACK, OrderDonGalaxyCoinRecord.Source.ordinary);
|
|
|
} catch (Exception e) {
|
|
|
log.error("发送用户:{}银河币points:{}错误:{}", userId, retrunGalaxyCoin, StringUtil.getErrorText(e));
|
|
|
}
|
|
|
@@ -4981,4 +5017,94 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ public void deductGalaxyCoinPayUpgradeOrderMoney(UpgradeOrderDon orderDon, BigDecimal discountPrice, BigDecimal toUseGalaxyCoin, User user) {
|
|
|
+ //存在银河币
|
|
|
+ if (toUseGalaxyCoin != null && toUseGalaxyCoin.compareTo(BigDecimal.ZERO) > 0) {
|
|
|
+ BigDecimal userGalaxyCoin = user.getGalaxyCoin();
|
|
|
+ if (userGalaxyCoin.compareTo(toUseGalaxyCoin) < 0) {
|
|
|
+ throw BusinessRuntimeException.getInstance("您的银河币不足!");
|
|
|
+ }
|
|
|
+ BigDecimal orderMoney = orderDon.getMoney();
|
|
|
+ //订单金额不大于0
|
|
|
+ if (orderMoney.compareTo(BigDecimal.ZERO) == 0) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ //去掉余额 多出的部分
|
|
|
+ BigDecimal subGalxyCoin;
|
|
|
+ SysConfig galaxyCoinPayConfig = sysConfigService.getOne(Wrappers.lambdaQuery(SysConfig.class)
|
|
|
+ .eq(SysConfig::getSysKey, Constant.GALAXY_COIN_PAY_DEDUCT_KEY).last("limit 1"));
|
|
|
+ GalaxyCoinPayConfigDto galaxyCoinPayConfigDto = null;
|
|
|
+ if (galaxyCoinPayConfig != null && StrUtil.isNotEmpty(galaxyCoinPayConfig.getSysValue())) {
|
|
|
+ try {
|
|
|
+ galaxyCoinPayConfigDto = Jsons.parseObject(galaxyCoinPayConfig.getSysValue(), GalaxyCoinPayConfigDto.class);
|
|
|
+ } catch (Exception e) {
|
|
|
+ }
|
|
|
+ if (galaxyCoinPayConfigDto == null) {
|
|
|
+ throw BusinessRuntimeException.getInstance("银河币抵扣系统错误,请联系客服");
|
|
|
+ }
|
|
|
+ //每个银河币可抵扣金额
|
|
|
+ BigDecimal deductMoneyEachCoin = galaxyCoinPayConfigDto.getMoney().divide(galaxyCoinPayConfigDto.getGalaxyCoin());
|
|
|
+ //此次使用抵扣金额
|
|
|
+ BigDecimal thisDeductMoney = toUseGalaxyCoin.multiply(deductMoneyEachCoin);
|
|
|
+ //该笔平台最高可抵扣金额
|
|
|
+ BigDecimal maxDeductMoney = discountPrice.multiply(galaxyCoinPayConfigDto.getMaxRate());
|
|
|
+ if (thisDeductMoney.compareTo(maxDeductMoney) > 0) {
|
|
|
+ thisDeductMoney = maxDeductMoney;
|
|
|
+ }
|
|
|
+ //此次使用的银河币超过订单金额
|
|
|
+ if (thisDeductMoney.compareTo(orderMoney) > 0) {
|
|
|
+ thisDeductMoney = orderMoney;
|
|
|
+ }
|
|
|
+ //此时需要扣除的银河币
|
|
|
+ subGalxyCoin = thisDeductMoney.divide(deductMoneyEachCoin);
|
|
|
+ //银河币抵扣
|
|
|
+ List<UserGalaxyCoinRecord> availableGalaxyCoinList = userGalaxyCoinRecordMapper.selectList(Wrappers.lambdaQuery(UserGalaxyCoinRecord.class)
|
|
|
+ .eq(UserGalaxyCoinRecord::getUserId, orderDon.getUserId())
|
|
|
+ .eq(UserGalaxyCoinRecord::getIsUsed, Boolean.FALSE)
|
|
|
+ .gt(UserGalaxyCoinRecord::getExpiryTime, DateTime.now())
|
|
|
+ .gt(UserGalaxyCoinRecord::getRemainGalaxyCoin, 0));
|
|
|
+ //需要使用的银河币
|
|
|
+ BigDecimal userFinalUseGalaxyCoin = subGalxyCoin;
|
|
|
+ for (UserGalaxyCoinRecord galaxyCoinRecord : availableGalaxyCoinList) {
|
|
|
+ if (userFinalUseGalaxyCoin.compareTo(BigDecimal.ZERO) <= 0) {
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ BigDecimal remainGalaxyCoin = galaxyCoinRecord.getRemainGalaxyCoin();
|
|
|
+ Long galaxyCoinRecordId = galaxyCoinRecord.getId();
|
|
|
+ //扣完
|
|
|
+ if (remainGalaxyCoin.compareTo(userFinalUseGalaxyCoin) == 0) {
|
|
|
+ //完全抵扣
|
|
|
+ deductUserGalaxyCoin(galaxyCoinRecordId, remainGalaxyCoin, remainGalaxyCoin, true);
|
|
|
+ userFinalUseGalaxyCoin = BigDecimal.ZERO;
|
|
|
+ } else if (remainGalaxyCoin.compareTo(userFinalUseGalaxyCoin) < 0) {
|
|
|
+ //不足以抵扣
|
|
|
+ deductUserGalaxyCoin(galaxyCoinRecordId, remainGalaxyCoin, remainGalaxyCoin, true);
|
|
|
+ userFinalUseGalaxyCoin = userFinalUseGalaxyCoin.subtract(remainGalaxyCoin);
|
|
|
+ } else if (remainGalaxyCoin.compareTo(userFinalUseGalaxyCoin) > 0) {
|
|
|
+ //足以抵扣
|
|
|
+ deductUserGalaxyCoin(galaxyCoinRecordId, userFinalUseGalaxyCoin, remainGalaxyCoin, false);
|
|
|
+ userFinalUseGalaxyCoin = BigDecimal.ZERO;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //最终消耗的银河币需要为0 大于0则说明抵扣失败
|
|
|
+ if (userFinalUseGalaxyCoin.compareTo(BigDecimal.ZERO) > 0) {
|
|
|
+ throw BusinessRuntimeException.getInstance("您的银河币不足!");
|
|
|
+ }
|
|
|
+ //扣除银河币 是否成功
|
|
|
+ Integer success = userMapper.subUserGalaxyCoin(user.getId(), subGalxyCoin, userGalaxyCoin);
|
|
|
+ if (success != 1) throw BusinessRuntimeException.getInstance("您的银河币不足!");
|
|
|
+ //记录使用详情
|
|
|
+ OrderDonGalaxyCoinRecord orderDonGalaxyCoinRecord = new OrderDonGalaxyCoinRecord();
|
|
|
+ orderDonGalaxyCoinRecord.setUserId(user.getId());
|
|
|
+ orderDonGalaxyCoinRecord.setOrderNo(orderDon.getOrderNo());
|
|
|
+ orderDonGalaxyCoinRecord.setGalaxyCoin(subGalxyCoin);
|
|
|
+ orderDonGalaxyCoinRecord.setDeductMoney(thisDeductMoney);
|
|
|
+ //套餐升级来源
|
|
|
+ orderDonGalaxyCoinRecord.setSource(OrderDonGalaxyCoinRecord.Source.upgrade.ordinal());
|
|
|
+ orderDonGalaxyCoinRecordMapper.insert(orderDonGalaxyCoinRecord);
|
|
|
+ orderDon.setMoney(orderMoney.subtract(thisDeductMoney));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|