|
|
@@ -27,13 +27,17 @@ public class OrderCloseEventHandler implements AwoaraEventHandler<OrderInfoObjec
|
|
|
private final StationAccountService stationAccountService;
|
|
|
private final SplitRecordService splitRecordService;
|
|
|
|
|
|
+ private final StationAccountRecordService stationAccountRecordService;
|
|
|
+
|
|
|
public OrderCloseEventHandler(WashOrderService washOrderService, WalletDetailService walletDetailService,
|
|
|
- AccountService accountService, StationAccountService stationAccountService, SplitRecordService splitRecordService) {
|
|
|
+ AccountService accountService, StationAccountService stationAccountService,
|
|
|
+ SplitRecordService splitRecordService, StationAccountRecordService stationAccountRecordService) {
|
|
|
this.washOrderService = washOrderService;
|
|
|
this.walletDetailService = walletDetailService;
|
|
|
this.accountService = accountService;
|
|
|
this.stationAccountService = stationAccountService;
|
|
|
this.splitRecordService = splitRecordService;
|
|
|
+ this.stationAccountRecordService = stationAccountRecordService;
|
|
|
}
|
|
|
|
|
|
|
|
|
@@ -87,7 +91,7 @@ public class OrderCloseEventHandler implements AwoaraEventHandler<OrderInfoObjec
|
|
|
// todo t_account减(上面已完成),t_station_account冻结户减,t_station_account商户加,t_split_record记录
|
|
|
// todo 需要判断是否跨网点,分开处理;跨网点结算比例是消费站点分订单额的30%,充值站点分70%
|
|
|
if (washOrder.getIsCross()) {
|
|
|
- // 跨网点订单结算比例是消费站点分订单额的30%,充值站点分70%
|
|
|
+ // 跨网点订单结算比例是消费站点分订单额的30%,消费站点分70%
|
|
|
doCrossSplit(washOrder, KymCache.INSTANCE.getUserStationId(washOrder.getUserId()));
|
|
|
} else {
|
|
|
// 不跨网点订单结算比例是消费站点分订单额的100%,消费金额*商家消费分润比例30%-消费金额*平台分润10%=消费金额*(商家消费分润比例-平台分润)
|
|
|
@@ -163,29 +167,55 @@ public class OrderCloseEventHandler implements AwoaraEventHandler<OrderInfoObjec
|
|
|
|
|
|
splitRecordService.saveBatch(List.of(splitRecord0, splitRecord1, splitRecord2));
|
|
|
|
|
|
+ // t_station_account_record 0.平台服务费收入 1.归属站点收入 2.归属站点解冻
|
|
|
+ var platformStationAccount = stationAccountService.getStationAccount(StationAccount.PLATFORM_STATION_ID);
|
|
|
+ var userStationAccount = stationAccountService.getStationAccount(washOrder.getStationId());
|
|
|
+
|
|
|
+ var stationAccountRecord0 = new StationAccountRecord()
|
|
|
+ .setStationId(StationAccount.PLATFORM_STATION_ID)
|
|
|
+ .setTradeNo(washOrder.getOrderId())
|
|
|
+ .setAmount(platformAmount)
|
|
|
+ .setType(StationAccountRecord.TYPE_收入)
|
|
|
+ .setBeforeBalance(platformStationAccount.getBalance())
|
|
|
+ .setAfterBalance(platformStationAccount.getBalance() + platformAmount);
|
|
|
+
|
|
|
+ var stationAccountRecord1 = new StationAccountRecord()
|
|
|
+ .setStationId(washOrder.getStationId())
|
|
|
+ .setTradeNo(washOrder.getOrderId())
|
|
|
+ .setAmount(unfreezeAmount)
|
|
|
+ .setType(StationAccountRecord.TYPE_收入)
|
|
|
+ .setBeforeBalance(userStationAccount.getBalance())
|
|
|
+ .setAfterBalance(userStationAccount.getBalance() + unfreezeAmount);
|
|
|
+
|
|
|
+ stationAccountRecordService.saveBatch(List.of(stationAccountRecord0, stationAccountRecord1));
|
|
|
+
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
* 执行跨店分账操作
|
|
|
+ * 跨店结算比例是消费站点分订单额的70%,充值站点分30%
|
|
|
+ * 具体步骤:
|
|
|
+ * 1.归属站点解冻消费金额(扣除平台手续费)
|
|
|
+ * 2.归属站点支出(订单金额的70%)
|
|
|
+ * 3.消费站点收入(订单金额的70%)
|
|
|
*
|
|
|
* @param washOrder
|
|
|
- * @param stationId 用户归属的站点Id
|
|
|
+ * @param userStationId 用户归属的站点Id
|
|
|
*/
|
|
|
- private void doCrossSplit(WashOrder washOrder, String stationId) {
|
|
|
+ private void doCrossSplit(WashOrder washOrder, String userStationId) {
|
|
|
log.info("订单:{},执行(跨店)分账", washOrder.getOrderId());
|
|
|
|
|
|
// 平台技术服务费10%
|
|
|
var platformAmount = (int) (washOrder.getAmount() * 0.1);
|
|
|
- // 解冻金额
|
|
|
- var unfreezeAmount = (int) (washOrder.getAmount() * 0.3);
|
|
|
|
|
|
- // 扣除平台技术服务费后总共用于分账的金额
|
|
|
- var splitAmount = unfreezeAmount - platformAmount;
|
|
|
+ // 解冻金额 = 订单金额
|
|
|
+ var unfreezeAmount = washOrder.getAmount();
|
|
|
+
|
|
|
+ // 归属站点账户解冻扣除平台技术服务费后总共用于分账的金额
|
|
|
+ var localAmount = (int)(unfreezeAmount * 0.3) - platformAmount;
|
|
|
|
|
|
- // 用户归属站点分账收入
|
|
|
- var localAmount = (int) (splitAmount * 0.7);
|
|
|
- // 当前消费站点分账收入
|
|
|
- var crossAmount = splitAmount - localAmount;
|
|
|
+ // 当前消费站点分账收入(订单金额的70%,不承担平台手续费)
|
|
|
+ var crossAmount = washOrder.getAmount() - (int)(unfreezeAmount * 0.3);
|
|
|
|
|
|
// 当前消费站点收入(跨店消费,原充值站点要分订单的70%)
|
|
|
stationAccountService.lambdaUpdate()
|
|
|
@@ -193,43 +223,91 @@ public class OrderCloseEventHandler implements AwoaraEventHandler<OrderInfoObjec
|
|
|
.eq(StationAccount::getStationId, washOrder.getStationId())
|
|
|
.update();
|
|
|
|
|
|
- // 用户归属站点收入
|
|
|
+ // 用户归属站点解冻和收入,用户归属站点支出(支付给消费站点)
|
|
|
stationAccountService.lambdaUpdate()
|
|
|
- .setSql("balance = balance + {0}, frozen_amount = frozen_amount - {1}", localAmount, unfreezeAmount)
|
|
|
- .eq(StationAccount::getStationId, stationId)
|
|
|
+ .setSql("balance = balance + {0}, frozen_amount = frozen_amount - {1}", localAmount - crossAmount, unfreezeAmount)
|
|
|
+ .eq(StationAccount::getStationId, userStationId)
|
|
|
.update();
|
|
|
|
|
|
-
|
|
|
- // t_split_record 0.平台服务费收入 1.消费站点收入 2.归属站点收入 3.归属站点解冻
|
|
|
+ // t_split_record 0.平台服务费收入 1.消费站点收入 2.归属站点收入 3.归属站点解冻 4.归属站点支出(给消费站点结算)
|
|
|
var splitRecord0 = new SplitRecord()
|
|
|
- .setFromStationId(stationId)
|
|
|
+ .setFromStationId(userStationId)
|
|
|
.setToStationId(StationAccount.PLATFORM_STATION_ID)
|
|
|
.setTradeNo(washOrder.getOrderId())
|
|
|
.setAmount(platformAmount)
|
|
|
.setType(SplitRecord.TYPE_PLATFORM);
|
|
|
|
|
|
var splitRecord1 = new SplitRecord()
|
|
|
- .setFromStationId(stationId)
|
|
|
+ .setFromStationId(userStationId)
|
|
|
.setToStationId(washOrder.getStationId())
|
|
|
.setTradeNo(washOrder.getOrderId())
|
|
|
.setAmount(crossAmount)
|
|
|
.setType(SplitRecord.TYPE_CONSUME);
|
|
|
|
|
|
var splitRecord2 = new SplitRecord()
|
|
|
- .setFromStationId(stationId)
|
|
|
- .setToStationId(stationId)
|
|
|
+ .setFromStationId(userStationId)
|
|
|
+ .setToStationId(userStationId)
|
|
|
.setTradeNo(washOrder.getOrderId())
|
|
|
.setAmount(localAmount)
|
|
|
.setType(SplitRecord.TYPE_CONSUME);
|
|
|
|
|
|
var splitRecord3 = new SplitRecord()
|
|
|
- .setFromStationId(stationId)
|
|
|
+ .setFromStationId(userStationId)
|
|
|
.setToStationId(washOrder.getStationId())
|
|
|
.setTradeNo(washOrder.getOrderId())
|
|
|
.setAmount(unfreezeAmount)
|
|
|
.setType(SplitRecord.TYPE_UNFREEZE);
|
|
|
|
|
|
- splitRecordService.saveBatch(List.of(splitRecord0, splitRecord1, splitRecord2, splitRecord3));
|
|
|
+ var splitRecord4 = new SplitRecord()
|
|
|
+ .setFromStationId(userStationId)
|
|
|
+ .setToStationId(washOrder.getStationId())
|
|
|
+ .setTradeNo(washOrder.getOrderId())
|
|
|
+ .setAmount(crossAmount)
|
|
|
+ .setType(SplitRecord.TYPE_CROSS_EXPEND);
|
|
|
+
|
|
|
+ splitRecordService.saveBatch(List.of(splitRecord0, splitRecord1, splitRecord2, splitRecord3, splitRecord4));
|
|
|
+
|
|
|
+ // t_station_account_record 0.平台服务费收入 1.消费站点收入 2.归属站点收入 3.归属站点解冻 4.归属站点支出(给消费站点结算)
|
|
|
+ var platformStationAccount = stationAccountService.getStationAccount(StationAccount.PLATFORM_STATION_ID);
|
|
|
+ var consumeStationAccount = stationAccountService.getStationAccount(washOrder.getStationId());
|
|
|
+ var userStationAccount = stationAccountService.getStationAccount(userStationId);
|
|
|
+
|
|
|
+ var stationAccountRecord0 = new StationAccountRecord()
|
|
|
+ .setStationId(StationAccount.PLATFORM_STATION_ID)
|
|
|
+ .setTradeNo(washOrder.getOrderId())
|
|
|
+ .setAmount(platformAmount)
|
|
|
+ .setType(StationAccountRecord.TYPE_收入)
|
|
|
+ .setBeforeBalance(platformStationAccount.getBalance())
|
|
|
+ .setAfterBalance(platformStationAccount.getBalance() + platformAmount);
|
|
|
+
|
|
|
+ var stationAccountRecord1 = new StationAccountRecord()
|
|
|
+ .setStationId(washOrder.getStationId())
|
|
|
+ .setTradeNo(washOrder.getOrderId())
|
|
|
+ .setAmount(crossAmount)
|
|
|
+ .setType(StationAccountRecord.TYPE_收入)
|
|
|
+ .setBeforeBalance(consumeStationAccount.getBalance())
|
|
|
+ .setAfterBalance(consumeStationAccount.getBalance() + crossAmount);
|
|
|
+
|
|
|
+ // 归属站点收入和归属站点解冻合并成一条数据
|
|
|
+ var stationAccountRecord2 = new StationAccountRecord()
|
|
|
+ .setStationId(userStationId)
|
|
|
+ .setTradeNo(washOrder.getOrderId())
|
|
|
+ .setAmount(localAmount)
|
|
|
+ .setType(StationAccountRecord.TYPE_收入)
|
|
|
+ .setBeforeBalance(userStationAccount.getBalance())
|
|
|
+ .setAfterBalance(userStationAccount.getBalance() + localAmount)
|
|
|
+ .setBeforeFrozenAmount(userStationAccount.getFrozenAmount())
|
|
|
+ .setAfterFrozenAmount(userStationAccount.getFrozenAmount() - unfreezeAmount);
|
|
|
+
|
|
|
+ // 归属站点支出(结算给消费站点)
|
|
|
+ var stationAccountRecord3 = new StationAccountRecord()
|
|
|
+ .setStationId(userStationId)
|
|
|
+ .setTradeNo(washOrder.getOrderId())
|
|
|
+ .setAmount(crossAmount)
|
|
|
+ .setType(StationAccountRecord.TYPE_支出)
|
|
|
+ .setBeforeBalance(stationAccountRecord2.getAfterBalance())
|
|
|
+ .setAfterBalance(stationAccountRecord2.getAfterBalance() - unfreezeAmount);
|
|
|
|
|
|
+ stationAccountRecordService.saveBatch(List.of(stationAccountRecord0, stationAccountRecord1, stationAccountRecord2, stationAccountRecord3));
|
|
|
}
|
|
|
}
|