订单加价扣除平台抽成和团队抽成
This commit is contained in:
parent
9109c692a1
commit
44f780f15b
|
|
@ -13,6 +13,10 @@ import com.ghy.common.exception.base.BaseException;
|
|||
import com.ghy.common.utils.AdapayUtils;
|
||||
import com.ghy.common.utils.MoneyUtil;
|
||||
import com.ghy.common.utils.ObjectUtils;
|
||||
import com.ghy.goods.domain.DeptGoodsCategory;
|
||||
import com.ghy.goods.domain.GoodsStandard;
|
||||
import com.ghy.goods.service.DeptGoodsCategoryService;
|
||||
import com.ghy.goods.service.GoodsStandardService;
|
||||
import com.ghy.order.domain.*;
|
||||
import com.ghy.order.mapper.OrderAddSubtractMapper;
|
||||
import com.ghy.order.mapper.OrderDetailMapper;
|
||||
|
|
@ -29,6 +33,8 @@ import com.ghy.payment.service.AdapayService;
|
|||
import com.ghy.payment.service.FinancialChangeRecordService;
|
||||
import com.ghy.payment.service.FinancialDetailService;
|
||||
import com.ghy.payment.service.FinancialMasterService;
|
||||
import com.ghy.worker.domain.Worker;
|
||||
import com.ghy.worker.service.WorkerService;
|
||||
import com.huifu.adapay.core.exception.BaseAdaPayException;
|
||||
import org.apache.commons.collections4.CollectionUtils;
|
||||
import org.slf4j.Logger;
|
||||
|
|
@ -87,6 +93,12 @@ public class OrderDetailServiceImpl implements OrderDetailService {
|
|||
private OrderFineRecordMapper orderFineRecordMapper;
|
||||
@Resource
|
||||
private OrderAddSubtractMapper orderAddSubtractMapper;
|
||||
@Resource
|
||||
private WorkerService workerService;
|
||||
@Resource
|
||||
private GoodsStandardService goodsStandardService;
|
||||
@Resource
|
||||
private DeptGoodsCategoryService deptGoodsCategoryService;
|
||||
|
||||
// Adapay 手续费率 默认0.008
|
||||
@Value("${adapay.fee_rate:0.008}")
|
||||
|
|
@ -420,8 +432,14 @@ public class OrderDetailServiceImpl implements OrderDetailService {
|
|||
if (financialMaster == null) {
|
||||
throw new BaseException("找不到主财务单");
|
||||
}
|
||||
PaymentDTO payment = financialMasterService.selectPaymentById(financialMaster.getPaymentId());
|
||||
if (payment == null) {
|
||||
|
||||
// 大师傅
|
||||
Worker workerMaster = workerService.selectById(orderMaster.getWorkerId());
|
||||
// 小师傅
|
||||
Worker workerSub = workerService.selectById(orderDetail.getWorkerId());
|
||||
// 订单的支付信息
|
||||
PaymentDTO orderPayment = financialMasterService.selectPaymentById(financialMaster.getPaymentId());
|
||||
if (orderPayment == null) {
|
||||
throw new BaseException("找不到支付记录");
|
||||
}
|
||||
// 子订单对应的子财务单只有一条 直接取出
|
||||
|
|
@ -432,7 +450,7 @@ public class OrderDetailServiceImpl implements OrderDetailService {
|
|||
if (financialDetail.getPayStatus() != 1) {
|
||||
throw new BaseException("订单不是“已支付”状态");
|
||||
}
|
||||
|
||||
final Long deptId = orderMaster.getDeptId();
|
||||
Long financialMasterId = financialDetail.getFinancialMasterId();
|
||||
// 找到 type=平台抽成 的子财务单 用来承担手续费
|
||||
List<FinancialDetail> details = financialDetailService.selectByFinancialMasterIdAndType(financialMasterId, FinancialDetailType.PLATFORM_FEE.getCode());
|
||||
|
|
@ -441,6 +459,15 @@ public class OrderDetailServiceImpl implements OrderDetailService {
|
|||
return;
|
||||
}
|
||||
|
||||
List<OrderGoods> orderGoods = orderGoodsService.selectByOrderDetailId(orderDetailId);
|
||||
if (CollectionUtils.isEmpty(orderGoods)) {
|
||||
throw new BaseException("找不到子订单对应的商品");
|
||||
}
|
||||
|
||||
Long goodsStandardId = orderGoods.get(0).getGoodsStandardId();
|
||||
GoodsStandard goodsStandard = goodsStandardService.selectById(goodsStandardId);
|
||||
DeptGoodsCategory deptGoodsCategory = deptGoodsCategoryService.get(goodsStandard.getDeptGoodsCategoryId());
|
||||
|
||||
// 修改子订单状态为完成
|
||||
updateStatus(orderDetailId, OrderStatus.FINISH.code());
|
||||
|
||||
|
|
@ -451,34 +478,105 @@ public class OrderDetailServiceImpl implements OrderDetailService {
|
|||
fdUpdate.setPayMoney(platformFeeFD.getPayMoney());
|
||||
logger.debug("子订单[{}]的完单流程开始", orderDetailId);
|
||||
|
||||
// 加价单手续费补偿成功与否
|
||||
boolean compensate = false;
|
||||
// 加价单手续费
|
||||
BigDecimal feeAmt = null;
|
||||
// 待提现金额
|
||||
BigDecimal dtx = BigDecimal.ZERO;
|
||||
// 加价金额
|
||||
BigDecimal addPrice = BigDecimal.ZERO;
|
||||
// 子单收款人的memberId
|
||||
String memberId = AdapayUtils.getWorkerMemberId(financialDetail.getPayeeId(), financialDetail.getDeptId());
|
||||
String memberId = AdapayUtils.getWorkerMemberId(financialDetail.getPayeeId(), deptId);
|
||||
String masterMemberId = AdapayUtils.getWorkerMemberId(workerMaster.getWorkerId(), deptId);
|
||||
|
||||
List<OrderAddSubtract> oasList = orderAddSubtractMapper.select(new OrderAddSubtract()
|
||||
.setOrderDetailId(orderDetailId).setPayStatus(PayStatus.PAID.getCode()));
|
||||
// --------------------- 追加分账部分 start ---------------------
|
||||
List<OrderAddSubtract> adds = oasList.stream().filter(oas -> MoneyUtil.gt0(oas.getMoney())).collect(Collectors.toList());
|
||||
for (OrderAddSubtract oas : adds) {
|
||||
String orderNo = payment.getOrderNo() + "_" + oas.getPaymentId() + "_" + System.currentTimeMillis();
|
||||
ArrayList<DivMember> divMembers = new ArrayList<>();
|
||||
divMembers.add(new DivMember(memberId, MoneyUtil.toS(oas.getMoney()), true));
|
||||
//调用分账
|
||||
logger.info("子订单[{}]的追加单[{}]发起分账: {}", orderDetailId, oas.getId(), JSON.toJSONString(divMembers));
|
||||
JSONObject response = adapayService.paymentConfirm(financialDetail.getDeptId(), oas.getPaymentId(),
|
||||
orderNo, MoneyUtil.toS(oas.getMoney()), divMembers, null, null);
|
||||
logger.info("子订单[{}]的追加单[{}]分账结果: {}", orderDetailId, oas.getId(), response.toString());
|
||||
// 大师傅提成
|
||||
BigDecimal teamRete = new BigDecimal(workerMaster.getLeaderTeamRate());
|
||||
teamRete = MoneyUtil.lt0(teamRete) ? BigDecimal.ZERO : teamRete;
|
||||
BigDecimal teamMoney = new BigDecimal(workerSub.getLeaderTeamMoney());
|
||||
teamMoney = MoneyUtil.lt0(teamMoney) ? BigDecimal.ZERO : teamMoney;
|
||||
|
||||
// 平台加价抽成
|
||||
BigDecimal deptRate = new BigDecimal(deptGoodsCategory.getDeptRate());
|
||||
deptRate = MoneyUtil.lt0(deptRate) ? BigDecimal.ZERO : deptRate;
|
||||
BigDecimal deptMoney = MoneyUtil.lt0(deptGoodsCategory.getDeptMoney()) ? BigDecimal.ZERO : deptGoodsCategory.getDeptMoney();
|
||||
|
||||
// 平台追加抽成
|
||||
BigDecimal pcDeptRate = new BigDecimal(deptGoodsCategory.getPcDeptRate());
|
||||
pcDeptRate = MoneyUtil.lt0(pcDeptRate) ? BigDecimal.ZERO : pcDeptRate;
|
||||
BigDecimal pcDeptMoney = MoneyUtil.lt0(deptGoodsCategory.getPcDeptMoney()) ? BigDecimal.ZERO : deptGoodsCategory.getPcDeptMoney();
|
||||
|
||||
// 追加金额分账
|
||||
addPaymentConfirm(orderDetailId, deptId, memberId, masterMemberId, teamRete, teamMoney, pcDeptRate, pcDeptMoney);
|
||||
|
||||
// 改价单分账
|
||||
BigDecimal changeMoney = changePaymentConfirm(orderDetailId, orderDetail.getWorkerId(), deptId, memberId, masterMemberId, teamRete, teamMoney, deptRate, deptMoney);
|
||||
|
||||
// --------------------- 子财务单分账部分 start ---------------------
|
||||
// 子单的实际金额
|
||||
BigDecimal odMoney = financialDetail.getPayMoney().subtract(changeMoney);
|
||||
if (MoneyUtil.lte0(odMoney)) {
|
||||
logger.info("子财务单[{}] 应支付金额={} 不需要分账", financialDetail.getId(), odMoney);
|
||||
} else {
|
||||
// 查询师傅的超时扣款记录
|
||||
List<OrderTimeoutRecord> fineRecords = orderFineRecordMapper.selectUnFine(orderDetail.getWorkerId(), orderMaster.getDeptId());
|
||||
// 超时罚金
|
||||
BigDecimal fineMoney = BigDecimal.ZERO;
|
||||
ArrayList<Long> fineIds = new ArrayList<>();
|
||||
for (OrderTimeoutRecord fineRecord : fineRecords) {
|
||||
// 抵扣超时罚金 这里的罚金是按创建时间升序排列的 优先抵扣最早的罚金
|
||||
if (MoneyUtil.lt(fineMoney.add(fineRecord.getPayMoney()), odMoney)) {
|
||||
// 加价单金额不足以抵扣罚金
|
||||
break;
|
||||
} else {
|
||||
// 抵扣罚金
|
||||
logger.info("子订单[{}]的派单金额[{}]抵扣罚金{}元", orderDetailId, odMoney, fineRecord.getPayMoney());
|
||||
fineMoney = fineMoney.add(fineRecord.getPayMoney());
|
||||
// 被抵扣的罚金记录ID先存下来,分账成功后修改状态
|
||||
fineIds.add(fineRecord.getId());
|
||||
}
|
||||
}
|
||||
// --------------------- 追加分账部分 end ---------------------
|
||||
|
||||
// --------------------- 改价单分账部分 start ---------------------
|
||||
// 分账账户信息
|
||||
ArrayList<DivMember> divMembers = new ArrayList<>();
|
||||
// 是否有罚金
|
||||
boolean haveFine = MoneyUtil.gt0(fineMoney);
|
||||
BigDecimal workerMoney = odMoney.subtract(fineMoney);
|
||||
if (haveFine) { // 有罚金 从罚金里扣除手续费
|
||||
// 平台的分账信息 用来承担罚金
|
||||
divMembers.add(new DivMember("0", MoneyUtil.toS(fineMoney), true));
|
||||
if (MoneyUtil.gt0(workerMoney)) {
|
||||
divMembers.add(new DivMember(memberId, MoneyUtil.toS(workerMoney), false));
|
||||
}
|
||||
} else {
|
||||
// 没有罚金 自己承担手续费
|
||||
divMembers.add(new DivMember(memberId, MoneyUtil.toS(odMoney), true));
|
||||
}
|
||||
String orderNo = "OD_" + orderDetailId + "_" + System.currentTimeMillis();
|
||||
logger.info("子订单[{}]发起分账: {}", orderDetailId, JSON.toJSONString(divMembers));
|
||||
JSONObject response = adapayService.paymentConfirm(deptId, orderPayment.getId(), orderNo, MoneyUtil.toS(odMoney), divMembers, null, null);
|
||||
logger.info("子订单[{}]的分账结果: {}", orderDetailId, response.toString());
|
||||
boolean status = AdapayStatusEnum.succeeded.code.equals(response.getString("status"));
|
||||
// 如果确认支付失败 这里抛出异常 回滚订单状态
|
||||
Assert.isTrue(status, response.toString());
|
||||
// 分账成功 把罚金状态改为已扣除
|
||||
fineIds.forEach(fineRecordId -> orderFineRecordMapper.updateFineStatus(fineRecordId, 1));
|
||||
}
|
||||
// --------------------- 子财务单分账部分 end ---------------------
|
||||
|
||||
// 分账后自动提现去掉了 改用定时提现 2023-07-07
|
||||
}
|
||||
|
||||
/**
|
||||
* 订单改价分账
|
||||
*
|
||||
* @param orderDetailId 子订单ID
|
||||
* @param workerId 子师傅ID
|
||||
* @param deptId 企业ID
|
||||
* @param memberId 子师傅ID
|
||||
* @param masterMemberId 主师傅ID
|
||||
* @param teamRete 团队抽成比例
|
||||
* @param teamMoney 团队抽成金额
|
||||
* @param deptRate 平台抽成比例
|
||||
* @param deptMoney 平台抽成金额
|
||||
* @return 改价金额
|
||||
* @throws BaseAdaPayException AdaPay分账接口可能抛出的异常
|
||||
*/
|
||||
private BigDecimal changePaymentConfirm(Long orderDetailId, Long workerId, Long deptId, String memberId, String masterMemberId,
|
||||
BigDecimal teamRete, BigDecimal teamMoney, BigDecimal deptRate, BigDecimal deptMoney) throws BaseAdaPayException {
|
||||
BigDecimal changeMoney = BigDecimal.ZERO;
|
||||
// 查询子订单的加价记录
|
||||
List<FinancialChangeRecord> financialChangeRecords = financialChangeRecordService.selectByDetailIds(String.valueOf(orderDetailId));
|
||||
if (CollectionUtils.isNotEmpty(financialChangeRecords)) {
|
||||
|
|
@ -487,15 +585,25 @@ public class OrderDetailServiceImpl implements OrderDetailService {
|
|||
boolean paid = PayStatus.PAID.getCode().equals(fcRecord.getPayStatus());
|
||||
boolean payedAdd = PayStatus.PAYED_ADD.getCode().equals(fcRecord.getPayStatus());
|
||||
if (paid || payedAdd) {
|
||||
ArrayList<DivMember> divMembers = new ArrayList<>();
|
||||
addPrice = fcRecord.getChangeMoney();
|
||||
changeMoney = fcRecord.getChangeMoney();
|
||||
// 平台抽成
|
||||
BigDecimal platformFee = changeMoney.multiply(deptRate).add(deptMoney).setScale(2, RoundingMode.UP);
|
||||
// 大师傅抽成
|
||||
BigDecimal masterFee = changeMoney.multiply(teamRete).add(teamMoney).setScale(2, RoundingMode.UP);
|
||||
// 如果提成>追加金额 则去掉固定提成 只计算比例提成
|
||||
if (MoneyUtil.lt(masterFee.add(platformFee), changeMoney)) {
|
||||
platformFee = changeMoney.multiply(deptRate).setScale(2, RoundingMode.UP);
|
||||
masterFee = changeMoney.multiply(teamRete).setScale(2, RoundingMode.UP);
|
||||
}
|
||||
// 上门师傅的报酬
|
||||
BigDecimal workerFee = changeMoney.subtract(platformFee).subtract(masterFee);
|
||||
BigDecimal fineMoney = BigDecimal.ZERO;
|
||||
// 查询师傅的超时扣款记录
|
||||
List<OrderTimeoutRecord> fineRecords = orderFineRecordMapper.selectUnFine(orderDetail.getWorkerId(), orderMaster.getDeptId());
|
||||
List<OrderTimeoutRecord> fineRecords = orderFineRecordMapper.selectUnFine(workerId, deptId);
|
||||
ArrayList<Long> fineIds = new ArrayList<>();
|
||||
for (OrderTimeoutRecord fineRecord : fineRecords) {
|
||||
// 抵扣超时罚金 这里的罚金是按创建时间升序排列的 优先抵扣最早的罚金
|
||||
if (fineMoney.add(fineRecord.getPayMoney()).compareTo(fcRecord.getChangeMoney()) > 0) {
|
||||
if (MoneyUtil.lt(fineMoney.add(fineRecord.getPayMoney()), workerFee)) {
|
||||
// 加价单金额不足以抵扣罚金
|
||||
logger.info("子订单[{}]的加价单[{}]不足以抵扣罚金{}元", orderDetailId, fcRecord.getId(), fineRecord.getPayMoney());
|
||||
break;
|
||||
|
|
@ -507,156 +615,104 @@ public class OrderDetailServiceImpl implements OrderDetailService {
|
|||
fineIds.add(fineRecord.getId());
|
||||
}
|
||||
}
|
||||
|
||||
// 是否有罚金
|
||||
boolean haveFine = BigDecimal.ZERO.compareTo(fineMoney) < 0;
|
||||
if (haveFine) { // 有罚金
|
||||
// 扣除罚金后的加价金额
|
||||
BigDecimal workerAddMoney = fcRecord.getChangeMoney().subtract(fineMoney);
|
||||
// 待提现金额里加入加价金额
|
||||
dtx = dtx.add(workerAddMoney);
|
||||
// 这里由平台承担手续费
|
||||
DivMember divMember = new DivMember(memberId, AdapayUtils.bigDecimalToString(workerAddMoney), false);
|
||||
DivMember planDivMember = new DivMember("0", AdapayUtils.bigDecimalToString(fineMoney), true);
|
||||
divMembers.add(divMember);
|
||||
divMembers.add(planDivMember);
|
||||
} else { // 没有罚金
|
||||
// 待提现金额里加入加价金额
|
||||
dtx = dtx.add(fcRecord.getChangeMoney());
|
||||
// 这里先自己承担手续费 后面再用平台抽成来补偿
|
||||
DivMember divMember = new DivMember(memberId, AdapayUtils.bigDecimalToString(fcRecord.getChangeMoney()), true);
|
||||
divMembers.add(divMember);
|
||||
// 扣除罚金后的上门师傅报酬
|
||||
workerFee = workerFee.subtract(fineMoney);
|
||||
// 平台抽成 + 超时罚金
|
||||
platformFee = platformFee.add(fineMoney);
|
||||
ArrayList<DivMember> divMembers = new ArrayList<>();
|
||||
// 承担手续费的标志 如果平台抽成为0则大师傅承担手续费 如果大师傅抽成也为0 则由上门师傅自己承担手续费
|
||||
boolean feeFlag = false;
|
||||
if (MoneyUtil.gt0(platformFee)) {
|
||||
divMembers.add(new DivMember("0", MoneyUtil.toS(platformFee), true));
|
||||
feeFlag = true;
|
||||
}
|
||||
|
||||
if (MoneyUtil.gt0(masterFee)) {
|
||||
divMembers.add(new DivMember(masterMemberId, MoneyUtil.toS(masterFee), !feeFlag));
|
||||
feeFlag = true;
|
||||
}
|
||||
if (MoneyUtil.gt0(workerFee)) {
|
||||
divMembers.add(new DivMember(memberId, MoneyUtil.toS(workerFee), !feeFlag));
|
||||
}
|
||||
String orderNo = "FCR_" + fcRecord.getId() + "_" + System.currentTimeMillis();
|
||||
//调用分账
|
||||
logger.info("子订单[code={}]的[改价单]发起分账", odCode);
|
||||
JSONObject response = adapayService.paymentConfirm(financialDetail.getDeptId(), fcRecord.getRemark(),
|
||||
payment.getOrderNo() + "_" + System.currentTimeMillis(),
|
||||
AdapayUtils.bigDecimalToString(fcRecord.getChangeMoney()), divMembers, null, null);
|
||||
logger.info("子订单[{}]的[改价单]发起分账", orderDetailId);
|
||||
JSONObject response = adapayService.paymentConfirm(deptId, fcRecord.getPaymentId(), orderNo, MoneyUtil.toS(fcRecord.getChangeMoney()), divMembers, null, null);
|
||||
logger.info("子订单[{}]的[改价单]分账结果: {}", orderDetailId, response.toString());
|
||||
if (AdapayStatusEnum.succeeded.code.equals(response.getString("status"))) { // 分账成功
|
||||
logger.info("子订单[code={}]的[改价单]分账成功", odCode);
|
||||
logger.info("子订单[{}]的[改价单]分账成功", orderDetailId);
|
||||
// 分账成功 把罚金状态改为已扣除
|
||||
fineIds.forEach(fineRecordId -> orderFineRecordMapper.updateFineStatus(fineRecordId, 1));
|
||||
if (!haveFine) { // 没有罚金的情况才需要补偿手续费 有罚金的话直接在罚金里承担手续费
|
||||
// 这是被扣掉的手续费 按理说这里应该大于0
|
||||
String fee_amt = response.getString("fee_amt");
|
||||
feeAmt = new BigDecimal(fee_amt);
|
||||
// 当 0.00 < 改价单的手续费 < 平台抽成金额 时
|
||||
if (MoneyUtil.gt0(feeAmt) && MoneyUtil.gt(fdUpdate.getPayMoney(), feeAmt)) {
|
||||
// 用平台抽成来补偿改价单的手续费 修改平台抽成子财务单金额
|
||||
fdUpdate.setPayMoney(fdUpdate.getPayMoney().subtract(feeAmt));
|
||||
int i = financialDetailService.updateFinancialDetail(fdUpdate);
|
||||
compensate = i > 0;
|
||||
} else {
|
||||
logger.warn("主订单[code={}]的平台抽成金额不足以承担子订单[code={}]的[改价单]的手续费",
|
||||
orderDetail.getOrderMasterCode(), odCode);
|
||||
// 平台抽成不足以承担改价单手续费了 那没办法了只能自己承担
|
||||
// 待提现金额里减去改价单手续费
|
||||
dtx = dtx.subtract(feeAmt);
|
||||
}
|
||||
}
|
||||
} else { // 分账失败
|
||||
if (AdapayErrorCode.CONFIRM_AMT_OVER_LIMIT.equals(response.getString("error_code"))) {
|
||||
// 当前确认金额 > 支付金额 - 已支付确认金额 - 已支付撤销金额
|
||||
// 这里有两种可能 1.可能是之前算错了手续费的旧订单
|
||||
// 2.可能是之前执行过完单流程 改价单分账成功了 但是子财务单分账失败了
|
||||
// 所以直接跳过
|
||||
logger.info("子订单[code={}] 跳过[改价单]分账", odCode);
|
||||
logger.info("子订单[{}] 跳过[改价单]分账 : CONFIRM_AMT_OVER_LIMIT", orderDetailId);
|
||||
} else {
|
||||
logger.error("子订单[code={}]的[改价单 paymentId={}]分账失败: {}", odCode, fcRecord.getRemark(), response.toJSONString());
|
||||
logger.error("子订单[{}]的[改价单 paymentId={}]分账失败: {}", orderDetailId, fcRecord.getRemark(), response.toJSONString());
|
||||
// 其它错误抛异常
|
||||
throw new IllegalArgumentException(response.getString("error_msg"));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// --------------------- 改价单分账部分 end ---------------------
|
||||
|
||||
// --------------------- 子财务单分账部分 start ---------------------
|
||||
// 分账账户信息
|
||||
return changeMoney;
|
||||
}
|
||||
|
||||
/**
|
||||
* 订单追加分账
|
||||
*
|
||||
* @param orderDetailId 子订单ID
|
||||
* @param deptId 企业ID
|
||||
* @param memberId 子师傅ID
|
||||
* @param masterMemberId 主师傅ID
|
||||
* @param teamRete 团队抽成比例
|
||||
* @param teamMoney 团队抽成金额
|
||||
* @param pcDeptRate 平台抽成比例
|
||||
* @param pcDeptMoney 平台抽成金额
|
||||
* @throws BaseAdaPayException AdaPay分账接口可能抛出的异常
|
||||
*/
|
||||
private void addPaymentConfirm(Long orderDetailId, Long deptId, String memberId, String masterMemberId,
|
||||
BigDecimal teamRete, BigDecimal teamMoney, BigDecimal pcDeptRate, BigDecimal pcDeptMoney) throws BaseAdaPayException {
|
||||
List<OrderAddSubtract> oasList = orderAddSubtractMapper.select(new OrderAddSubtract()
|
||||
.setOrderDetailId(orderDetailId).setPayStatus(PayStatus.PAID.getCode()));
|
||||
List<OrderAddSubtract> adds = oasList.stream().filter(oas -> MoneyUtil.gt0(oas.getMoney())).collect(Collectors.toList());
|
||||
for (OrderAddSubtract oas : adds) {
|
||||
BigDecimal oasMoney = oas.getMoney();
|
||||
// 平台抽成
|
||||
BigDecimal platformFee = oasMoney.multiply(pcDeptRate).add(pcDeptMoney).setScale(2, RoundingMode.UP);
|
||||
// 大师傅抽成
|
||||
BigDecimal masterFee = oasMoney.multiply(teamRete).add(teamMoney).setScale(2, RoundingMode.UP);
|
||||
// 如果提成>追加金额 则去掉固定提成 只计算比例提成
|
||||
if (MoneyUtil.lt(masterFee.add(platformFee), oasMoney)) {
|
||||
platformFee = oasMoney.multiply(pcDeptRate).setScale(2, RoundingMode.UP);
|
||||
masterFee = oasMoney.multiply(teamRete).setScale(2, RoundingMode.UP);
|
||||
}
|
||||
// 上门师傅的报酬
|
||||
BigDecimal workerFee = oasMoney.subtract(platformFee).subtract(masterFee);
|
||||
// 分账信息
|
||||
ArrayList<DivMember> divMembers = new ArrayList<>();
|
||||
// 子单的实际金额
|
||||
BigDecimal fdPayMoney = financialDetail.getPayMoney().subtract(addPrice);
|
||||
// 实际要分账的金额(子单的实际金额 + 平台补偿改价单手续费)
|
||||
BigDecimal payMoney;
|
||||
if (compensate) {
|
||||
// 平台补偿改价单手续费
|
||||
payMoney = fdPayMoney.add(feeAmt);
|
||||
} else {
|
||||
// 平台不补偿改价单手续费
|
||||
payMoney = fdPayMoney;
|
||||
// 承担手续费的标志 如果平台抽成为0则大师傅承担手续费 如果大师傅抽成也为0 则由上门师傅自己承担手续费
|
||||
boolean feeFlag = false;
|
||||
if (MoneyUtil.gt0(platformFee)) {
|
||||
divMembers.add(new DivMember("0", MoneyUtil.toS(platformFee), true));
|
||||
feeFlag = true;
|
||||
}
|
||||
if (MoneyUtil.lte0(payMoney)) {
|
||||
logger.info("子财务单[{}] 应支付金额={} 不需要分账", financialDetail.getId(), payMoney);
|
||||
} else {
|
||||
// 查询师傅的超时扣款记录
|
||||
List<OrderTimeoutRecord> fineRecords = orderFineRecordMapper.selectUnFine(orderDetail.getWorkerId(), orderMaster.getDeptId());
|
||||
// 超时罚金
|
||||
BigDecimal fineMoney = BigDecimal.ZERO;
|
||||
ArrayList<Long> fineIds = new ArrayList<>();
|
||||
for (OrderTimeoutRecord fineRecord : fineRecords) {
|
||||
// 抵扣超时罚金 这里的罚金是按创建时间升序排列的 优先抵扣最早的罚金
|
||||
if (fineMoney.add(fineRecord.getPayMoney()).compareTo(fdPayMoney) > 0) {
|
||||
// 加价单金额不足以抵扣罚金
|
||||
logger.info("子订单[{}]的派单金额[{}元]不足以抵扣罚金{}元", orderDetailId, fdPayMoney, fineRecord.getPayMoney());
|
||||
break;
|
||||
} else {
|
||||
// 抵扣罚金
|
||||
logger.info("子订单[{}]的加价单[{}]抵扣罚金{}元", orderDetailId, fdPayMoney, fineRecord.getPayMoney());
|
||||
fineMoney = fineMoney.add(fineRecord.getPayMoney());
|
||||
// 被抵扣的罚金记录ID先存下来,分账成功后修改状态
|
||||
fineIds.add(fineRecord.getId());
|
||||
if (MoneyUtil.gt0(masterFee)) {
|
||||
divMembers.add(new DivMember(masterMemberId, MoneyUtil.toS(masterFee), !feeFlag));
|
||||
feeFlag = true;
|
||||
}
|
||||
if (MoneyUtil.gt0(workerFee)) {
|
||||
divMembers.add(new DivMember(memberId, MoneyUtil.toS(workerFee), !feeFlag));
|
||||
}
|
||||
// 总分账金额
|
||||
BigDecimal fee = BigDecimal.ZERO;
|
||||
// 接单师傅的分账信息
|
||||
String payMoneyS = AdapayUtils.bigDecimalToString(payMoney.subtract(fineMoney));
|
||||
DivMember divMember = new DivMember(memberId, payMoneyS, false);
|
||||
divMembers.add(divMember);
|
||||
// 是否有罚金
|
||||
boolean haveFine = MoneyUtil.gt0(fineMoney);
|
||||
if (haveFine) { // 有罚金 从罚金里扣除手续费
|
||||
// 平台的分账信息 用来承担罚金
|
||||
DivMember fineDivMember = new DivMember("0", AdapayUtils.bigDecimalToString(fineMoney), true);
|
||||
divMembers.add(fineDivMember);
|
||||
} else { // 没有罚金 需要扣除手续费
|
||||
// 计算本次分账的手续费 保留两位小数(向上取整)
|
||||
fee = payMoney.multiply(new BigDecimal(feeRate)).setScale(2, RoundingMode.UP);
|
||||
// 平台的分账信息 用来承担手续费
|
||||
DivMember feeDivMember = new DivMember("0", fee.toString(), true);
|
||||
divMembers.add(feeDivMember);
|
||||
String orderNo = "OAS_" + oas.getId() + "_" + System.currentTimeMillis();
|
||||
//调用分账
|
||||
logger.info("子订单[{}]的追加单[{}]发起分账: {}", orderDetailId, oas.getId(), JSON.toJSONString(divMembers));
|
||||
JSONObject response = adapayService.paymentConfirm(deptId, oas.getPaymentId(),
|
||||
orderNo, MoneyUtil.toS(oasMoney), divMembers, null, null);
|
||||
logger.info("子订单[{}]的追加单[{}]分账结果: {}", orderDetailId, oas.getId(), response.toString());
|
||||
}
|
||||
logger.info("子订单[code={}]发起分账", odCode);
|
||||
JSONObject response = adapayService.paymentConfirm(financialDetail.getDeptId(), payment.getId(),
|
||||
payment.getOrderNo() + "_" + System.currentTimeMillis(),
|
||||
AdapayUtils.bigDecimalToString(fee.add(payMoney)), divMembers, null, null);
|
||||
boolean status = AdapayStatusEnum.succeeded.code.equals(response.getString("status"));
|
||||
// 如果确认支付失败 这里抛出异常 回滚订单状态
|
||||
Assert.isTrue(status, response.toString());
|
||||
// 分账成功 把罚金状态改为已扣除
|
||||
fineIds.forEach(fineRecordId -> orderFineRecordMapper.updateFineStatus(fineRecordId, 1));
|
||||
// 待提现金额里加入子财务单金额
|
||||
dtx = dtx.add(fdPayMoney.subtract(fineMoney));
|
||||
|
||||
// 修改平台抽成子财务单金额 减去手续费
|
||||
fdUpdate.setPayMoney(fdUpdate.getPayMoney().subtract(fee));
|
||||
financialDetailService.updateFinancialDetail(fdUpdate);
|
||||
}
|
||||
// --------------------- 子财务单分账部分 end ---------------------
|
||||
|
||||
// --------------------- 自动提现流程 start ---------------------
|
||||
// 走到这里确认分账成功了 进入自动提现流程
|
||||
logger.info("子订单[code={}]开始自动提现", odCode);
|
||||
if (BigDecimal.ZERO.compareTo(dtx) > -1) {
|
||||
logger.info("子订单[code={}] 待提现金额={} 无需提现", odCode, dtx);
|
||||
} else {
|
||||
// 待提现金额
|
||||
String cashAmt = AdapayUtils.bigDecimalToString(dtx);
|
||||
executor.execute(() -> drawCash(orderDetailId, financialDetail.getDeptId(), memberId, cashAmt));
|
||||
}
|
||||
// --------------------- 自动提现流程 end ---------------------
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
Loading…
Reference in New Issue