|
|
@@ -10,6 +10,7 @@ import lombok.extern.slf4j.Slf4j;
|
|
|
import org.springframework.stereotype.Component;
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
|
+import java.math.BigDecimal;
|
|
|
import java.time.Duration;
|
|
|
import java.time.LocalDateTime;
|
|
|
import java.util.List;
|
|
|
@@ -53,79 +54,85 @@ public class OrderCloseEventHandler implements AwoaraEventHandler<OrderInfoObjec
|
|
|
|
|
|
// 订单状态、支付状态
|
|
|
var washOrder = washOrderService.lambdaQuery().eq(WashOrder::getOrderId, orderInfo.getOrder_id()).one();
|
|
|
- if (washOrder != null) {
|
|
|
- int rechargePayment;
|
|
|
- int grantsPayment = 0;
|
|
|
- // 扣款更新余额(优先扣减充值款,不够则扣除赠款),新增资金流水
|
|
|
- var account = accountService.getAccountByUserId(washOrder.getUserId());
|
|
|
- if (account.getRechargeBalance() >= orderInfo.getAmount()) {
|
|
|
- rechargePayment = orderInfo.getAmount();
|
|
|
- accountService.lambdaUpdate().setSql("balance = balance - {0}, recharge_balance = recharge_balance - {1}",
|
|
|
- orderInfo.getAmount(), rechargePayment)
|
|
|
- .eq(Account::getUserId, washOrder.getUserId()).update();
|
|
|
- } else {
|
|
|
- // 充值款余额不足以支付订单,则扣赠款
|
|
|
- rechargePayment = account.getRechargeBalance();
|
|
|
- grantsPayment = orderInfo.getAmount() - account.getRechargeBalance();
|
|
|
- accountService.lambdaUpdate()
|
|
|
- .setSql("balance = balance - {0}, recharge_balance = 0, grants_balance = grants_balance - {1}",
|
|
|
- orderInfo.getAmount(), grantsPayment)
|
|
|
- .eq(Account::getUserId, washOrder.getUserId()).update();
|
|
|
- }
|
|
|
-
|
|
|
- washOrder
|
|
|
- .setCloseType(orderInfo.getClose_type())
|
|
|
- .setAmount(orderInfo.getAmount())
|
|
|
- .setAmountReceivable(orderInfo.getAmount_receivable())
|
|
|
- .setAmountReceived(orderInfo.getAmount_received())
|
|
|
- .setDiscountMoney(orderInfo.getDiscount_money())
|
|
|
- .setDetail(orderInfo.getDetail())
|
|
|
- .setEndTime(LocalDateTime.now())
|
|
|
- .setTotalSeconds(Duration.between(washOrder.getStartTime(), LocalDateTime.now()).toSecondsPart())
|
|
|
- .setRechargePayment(rechargePayment)
|
|
|
- .setGrantsPayment(grantsPayment)
|
|
|
- .setOrderStatus(WashOrder.ORDER_STATUS_成功)
|
|
|
- .setPayStatus(WashOrder.PAY_STATUS_已支付);
|
|
|
- washOrderService.updateById(washOrder);
|
|
|
-
|
|
|
-
|
|
|
- // t_account减(上面已完成),t_station_account冻结户减,t_station_account商户加,t_split_record记录
|
|
|
- // 需要判断是否跨网点,分开处理;跨网点结算比例是消费站点分订单额的30%,充值站点分70%
|
|
|
- if (washOrder.getIsCross()) {
|
|
|
- // 跨网点订单结算比例是消费站点分订单额的30%,消费站点分70%
|
|
|
- doCrossSplit(washOrder, KymCache.INSTANCE.getUserStationId(washOrder.getUserId()));
|
|
|
- } else {
|
|
|
- // 不跨网点订单结算比例是消费站点分订单额的100%,消费金额*商家消费分润比例30%-消费金额*平台分润10%=消费金额*(商家消费分润比例-平台分润)
|
|
|
- doLocalSplit(washOrder);
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- var walletDetail = new WalletDetail();
|
|
|
- walletDetail.setUserId(washOrder.getUserId());
|
|
|
- walletDetail.setType(WalletDetail.TYPE_消费);
|
|
|
- walletDetail.setOrderNo(washOrder.getOrderId());
|
|
|
- walletDetail.setAmount(orderInfo.getAmount());
|
|
|
- walletDetail.setBeforeBalance(account.getBalance());
|
|
|
- walletDetail.setAfterBalance(account.getBalance() - orderInfo.getAmount());
|
|
|
- walletDetail.setTransactionId(washOrder.getId().toString());
|
|
|
- walletDetail.setTransactionTime(LocalDateTime.now());
|
|
|
- walletDetail.setStatus(WalletDetail.STATUS_已确认);
|
|
|
- walletDetailService.save(walletDetail);
|
|
|
-
|
|
|
- // 处理充值权益优惠逻辑/优惠券优惠逻辑/账户优惠金额记录处理逻辑(涉及退款扣减优惠,在NoDiscountHandle中处理)
|
|
|
- DiscountStrategyFactory.getDiscountStrategy(washOrder.getDiscountType()).computeDiscount(washOrder, account);
|
|
|
-
|
|
|
- // 更新订单优惠金额
|
|
|
- washOrderService.updateById(washOrder);
|
|
|
-
|
|
|
- // 扣费等资金操作
|
|
|
- deductions(washOrder, account);
|
|
|
+ if (washOrder == null) {
|
|
|
+ log.error("订单不存在,订单号:{}", orderInfo.getOrder_id());
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ int rechargePayment;
|
|
|
+ int grantsPayment = 0;
|
|
|
+ // 扣款更新余额(优先扣减充值款,不够则扣除赠款),新增资金流水
|
|
|
+ var account = accountService.getAccountByUserId(washOrder.getUserId());
|
|
|
+ int amount = orderInfo.getAmount();
|
|
|
+ if (account.getRechargeBalance() >= amount) {
|
|
|
+ rechargePayment = amount;
|
|
|
+ accountService.lambdaUpdate()
|
|
|
+ .setSql("balance = balance - {0}, recharge_balance = recharge_balance - {1}",
|
|
|
+ amount, rechargePayment)
|
|
|
+ .eq(Account::getUserId, washOrder.getUserId())
|
|
|
+ .update();
|
|
|
+ } else {
|
|
|
+ // 充值款余额不足以支付订单,则扣赠款
|
|
|
+ rechargePayment = account.getRechargeBalance();
|
|
|
+ grantsPayment = amount - account.getRechargeBalance();
|
|
|
+ accountService.lambdaUpdate()
|
|
|
+ .setSql("balance = balance - {0}, recharge_balance = 0, grants_balance = grants_balance - {1}",
|
|
|
+ amount, grantsPayment)
|
|
|
+ .eq(Account::getUserId, washOrder.getUserId())
|
|
|
+ .update();
|
|
|
+ }
|
|
|
+
|
|
|
+ washOrder
|
|
|
+ .setCloseType(orderInfo.getClose_type())
|
|
|
+ .setAmount(amount)
|
|
|
+ .setAmountReceivable(orderInfo.getAmount_receivable())
|
|
|
+ .setAmountReceived(orderInfo.getAmount_received())
|
|
|
+ .setDiscountMoney(orderInfo.getDiscount_money())
|
|
|
+ .setDetail(orderInfo.getDetail())
|
|
|
+ .setEndTime(LocalDateTime.now())
|
|
|
+ .setTotalSeconds(Duration.between(washOrder.getStartTime(), LocalDateTime.now()).toSecondsPart())
|
|
|
+ .setRechargePayment(rechargePayment)
|
|
|
+ .setGrantsPayment(grantsPayment)
|
|
|
+ .setOrderStatus(WashOrder.ORDER_STATUS_成功)
|
|
|
+ .setPayStatus(WashOrder.PAY_STATUS_已支付)
|
|
|
+ .setOrderStatus(WashOrder.ORDER_STATUS_成功);
|
|
|
+
|
|
|
+ washOrderService.updateById(washOrder);
|
|
|
|
|
|
|
|
|
+ // t_account减(上面已完成),t_station_account冻结户减,t_station_account商户加,t_split_record记录
|
|
|
+ // 需要判断是否跨网点,分开处理;跨网点结算比例是消费站点分订单额的30%,充值站点分70%
|
|
|
+ if (washOrder.getIsCross()) {
|
|
|
+ // 跨网点订单结算比例是消费站点分订单额的30%,消费站点分70%
|
|
|
+ doCrossSplit(washOrder, KymCache.INSTANCE.getUserStationId(washOrder.getUserId()));
|
|
|
} else {
|
|
|
- log.error("订单不存在,订单号:{}", orderInfo.getOrder_id());
|
|
|
+ // 不跨网点订单结算比例是消费站点分订单额的100%,消费金额*商家消费分润比例30%-消费金额*平台分润10%=消费金额*(商家消费分润比例-平台分润)
|
|
|
+ doLocalSplit(washOrder);
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+ var walletDetail = new WalletDetail();
|
|
|
+ walletDetail.setUserId(washOrder.getUserId());
|
|
|
+ walletDetail.setType(WalletDetail.TYPE_消费);
|
|
|
+ walletDetail.setOrderNo(washOrder.getOrderId());
|
|
|
+ walletDetail.setAmount(orderInfo.getAmount());
|
|
|
+ walletDetail.setBeforeBalance(account.getBalance());
|
|
|
+ walletDetail.setAfterBalance(account.getBalance() - orderInfo.getAmount());
|
|
|
+ walletDetail.setTransactionId(washOrder.getId().toString());
|
|
|
+ walletDetail.setTransactionTime(LocalDateTime.now());
|
|
|
+ walletDetail.setStatus(WalletDetail.STATUS_已确认);
|
|
|
+ walletDetailService.save(walletDetail);
|
|
|
+
|
|
|
+ // 处理充值权益优惠逻辑/优惠券优惠逻辑/账户优惠金额记录处理逻辑(涉及退款扣减优惠,在NoDiscountHandle中处理)
|
|
|
+ DiscountStrategyFactory.getDiscountStrategy(washOrder.getDiscountType()).computeDiscount(washOrder, account);
|
|
|
+
|
|
|
+ // 更新订单优惠金额
|
|
|
+ washOrderService.updateById(washOrder);
|
|
|
+
|
|
|
+ // 扣费等资金操作
|
|
|
+ deductions(washOrder, account);
|
|
|
+
|
|
|
+
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -134,13 +141,7 @@ public class OrderCloseEventHandler implements AwoaraEventHandler<OrderInfoObjec
|
|
|
* @param washOrder
|
|
|
* @param account
|
|
|
*/
|
|
|
- private void deductions(WashOrder washOrder, Account account) {
|
|
|
- // 订单成功
|
|
|
- washOrder.setOrderStatus(WashOrder.ORDER_STATUS_成功);
|
|
|
- // 充电结束
|
|
|
- washOrder.setOrderStatus(WashOrder.PAY_STATUS_已支付);
|
|
|
- washOrderService.updateById(washOrder);
|
|
|
-
|
|
|
+ protected void deductions(WashOrder washOrder, Account account) {
|
|
|
// 账户扣费
|
|
|
account.setBalance(account.getBalance() - washOrder.getAmountReceived());
|
|
|
accountService.updateById(account);
|
|
|
@@ -156,7 +157,6 @@ public class OrderCloseEventHandler implements AwoaraEventHandler<OrderInfoObjec
|
|
|
// 已确认
|
|
|
walletDetail.setStatus(WalletDetail.STATUS_已确认);
|
|
|
walletDetailService.save(walletDetail);
|
|
|
-
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
@@ -166,10 +166,16 @@ public class OrderCloseEventHandler implements AwoaraEventHandler<OrderInfoObjec
|
|
|
*/
|
|
|
private void doLocalSplit(WashOrder washOrder) {
|
|
|
log.info("订单:{},执行(本店)分账", washOrder.getOrderId());
|
|
|
+ int amount = washOrder.getAmount();
|
|
|
+ BigDecimal platformRate = BigDecimal.valueOf(0.1);
|
|
|
+ BigDecimal consumeRate = BigDecimal.valueOf(0.3);
|
|
|
+
|
|
|
// 平台技术服务费10%
|
|
|
- var platformAmount = (int) (washOrder.getAmount() * 0.1);
|
|
|
+ var platformAmount = amount * platformRate.intValueExact();
|
|
|
// 解冻金额
|
|
|
- var unfreezeAmount = (int) (washOrder.getAmount() * 0.3);
|
|
|
+ var unfreezeAmount = amount * consumeRate.intValueExact();
|
|
|
+
|
|
|
+ int localAmount = unfreezeAmount - platformAmount;
|
|
|
|
|
|
// 技术服务费
|
|
|
var splitRecord0 = new SplitRecord()
|
|
|
@@ -184,7 +190,7 @@ public class OrderCloseEventHandler implements AwoaraEventHandler<OrderInfoObjec
|
|
|
.setFromStationId(washOrder.getStationId())
|
|
|
.setToStationId(washOrder.getStationId())
|
|
|
.setTradeNo(washOrder.getOrderId())
|
|
|
- .setAmount((int) (washOrder.getAmount() * 0.3))
|
|
|
+ .setAmount(unfreezeAmount)
|
|
|
.setType(SplitRecord.TYPE_UNFREEZE);
|
|
|
|
|
|
// 基本户入账
|
|
|
@@ -192,7 +198,7 @@ public class OrderCloseEventHandler implements AwoaraEventHandler<OrderInfoObjec
|
|
|
.setFromStationId(washOrder.getStationId())
|
|
|
.setToStationId(washOrder.getStationId())
|
|
|
.setTradeNo(washOrder.getOrderId())
|
|
|
- .setAmount(unfreezeAmount - platformAmount)
|
|
|
+ .setAmount(localAmount)
|
|
|
.setType(SplitRecord.TYPE_CONSUME);
|
|
|
|
|
|
splitRecordService.saveBatch(List.of(splitRecord0, splitRecord1, splitRecord2));
|
|
|
@@ -250,18 +256,21 @@ public class OrderCloseEventHandler implements AwoaraEventHandler<OrderInfoObjec
|
|
|
*/
|
|
|
private void doCrossSplit(WashOrder washOrder, String userStationId) {
|
|
|
log.info("订单:{},执行(跨店)分账", washOrder.getOrderId());
|
|
|
+ int amount = washOrder.getAmount();
|
|
|
+ BigDecimal platformRate = BigDecimal.valueOf(0.1);
|
|
|
+ BigDecimal crossRate = BigDecimal.valueOf(0.7);
|
|
|
|
|
|
// 平台技术服务费10%
|
|
|
- var platformAmount = (int) (washOrder.getAmount() * 0.1);
|
|
|
+ var platformAmount = amount * platformRate.intValueExact();;
|
|
|
|
|
|
// 解冻金额 = 订单金额
|
|
|
- var unfreezeAmount = washOrder.getAmount();
|
|
|
+ var unfreezeAmount = amount;
|
|
|
|
|
|
// 归属站点账户解冻扣除平台技术服务费后总共用于分账的金额
|
|
|
var localAmount = (int) (unfreezeAmount * 0.3) - platformAmount;
|
|
|
|
|
|
// 当前消费站点分账收入(订单金额的70%,不承担平台手续费)
|
|
|
- var crossAmount = washOrder.getAmount() - (int) (unfreezeAmount * 0.3);
|
|
|
+ var crossAmount = amount * crossRate.intValueExact();
|
|
|
|
|
|
// t_split_record 0.平台服务费收入 1.消费站点收入 2.归属站点解冻 3.归属站点收入 4.归属站点支出(给消费站点结算)
|
|
|
var splitRecord0 = new SplitRecord()
|