订单加价扣除平台抽成和团队抽成
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.AdapayUtils;
|
||||||
import com.ghy.common.utils.MoneyUtil;
|
import com.ghy.common.utils.MoneyUtil;
|
||||||
import com.ghy.common.utils.ObjectUtils;
|
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.domain.*;
|
||||||
import com.ghy.order.mapper.OrderAddSubtractMapper;
|
import com.ghy.order.mapper.OrderAddSubtractMapper;
|
||||||
import com.ghy.order.mapper.OrderDetailMapper;
|
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.FinancialChangeRecordService;
|
||||||
import com.ghy.payment.service.FinancialDetailService;
|
import com.ghy.payment.service.FinancialDetailService;
|
||||||
import com.ghy.payment.service.FinancialMasterService;
|
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 com.huifu.adapay.core.exception.BaseAdaPayException;
|
||||||
import org.apache.commons.collections4.CollectionUtils;
|
import org.apache.commons.collections4.CollectionUtils;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
|
|
@ -87,6 +93,12 @@ public class OrderDetailServiceImpl implements OrderDetailService {
|
||||||
private OrderFineRecordMapper orderFineRecordMapper;
|
private OrderFineRecordMapper orderFineRecordMapper;
|
||||||
@Resource
|
@Resource
|
||||||
private OrderAddSubtractMapper orderAddSubtractMapper;
|
private OrderAddSubtractMapper orderAddSubtractMapper;
|
||||||
|
@Resource
|
||||||
|
private WorkerService workerService;
|
||||||
|
@Resource
|
||||||
|
private GoodsStandardService goodsStandardService;
|
||||||
|
@Resource
|
||||||
|
private DeptGoodsCategoryService deptGoodsCategoryService;
|
||||||
|
|
||||||
// Adapay 手续费率 默认0.008
|
// Adapay 手续费率 默认0.008
|
||||||
@Value("${adapay.fee_rate:0.008}")
|
@Value("${adapay.fee_rate:0.008}")
|
||||||
|
|
@ -420,8 +432,14 @@ public class OrderDetailServiceImpl implements OrderDetailService {
|
||||||
if (financialMaster == null) {
|
if (financialMaster == null) {
|
||||||
throw new BaseException("找不到主财务单");
|
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("找不到支付记录");
|
throw new BaseException("找不到支付记录");
|
||||||
}
|
}
|
||||||
// 子订单对应的子财务单只有一条 直接取出
|
// 子订单对应的子财务单只有一条 直接取出
|
||||||
|
|
@ -432,7 +450,7 @@ public class OrderDetailServiceImpl implements OrderDetailService {
|
||||||
if (financialDetail.getPayStatus() != 1) {
|
if (financialDetail.getPayStatus() != 1) {
|
||||||
throw new BaseException("订单不是“已支付”状态");
|
throw new BaseException("订单不是“已支付”状态");
|
||||||
}
|
}
|
||||||
|
final Long deptId = orderMaster.getDeptId();
|
||||||
Long financialMasterId = financialDetail.getFinancialMasterId();
|
Long financialMasterId = financialDetail.getFinancialMasterId();
|
||||||
// 找到 type=平台抽成 的子财务单 用来承担手续费
|
// 找到 type=平台抽成 的子财务单 用来承担手续费
|
||||||
List<FinancialDetail> details = financialDetailService.selectByFinancialMasterIdAndType(financialMasterId, FinancialDetailType.PLATFORM_FEE.getCode());
|
List<FinancialDetail> details = financialDetailService.selectByFinancialMasterIdAndType(financialMasterId, FinancialDetailType.PLATFORM_FEE.getCode());
|
||||||
|
|
@ -441,6 +459,15 @@ public class OrderDetailServiceImpl implements OrderDetailService {
|
||||||
return;
|
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());
|
updateStatus(orderDetailId, OrderStatus.FINISH.code());
|
||||||
|
|
||||||
|
|
@ -451,34 +478,105 @@ public class OrderDetailServiceImpl implements OrderDetailService {
|
||||||
fdUpdate.setPayMoney(platformFeeFD.getPayMoney());
|
fdUpdate.setPayMoney(platformFeeFD.getPayMoney());
|
||||||
logger.debug("子订单[{}]的完单流程开始", orderDetailId);
|
logger.debug("子订单[{}]的完单流程开始", orderDetailId);
|
||||||
|
|
||||||
// 加价单手续费补偿成功与否
|
|
||||||
boolean compensate = false;
|
|
||||||
// 加价单手续费
|
|
||||||
BigDecimal feeAmt = null;
|
|
||||||
// 待提现金额
|
|
||||||
BigDecimal dtx = BigDecimal.ZERO;
|
|
||||||
// 加价金额
|
|
||||||
BigDecimal addPrice = BigDecimal.ZERO;
|
|
||||||
// 子单收款人的memberId
|
// 子单收款人的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()));
|
BigDecimal teamRete = new BigDecimal(workerMaster.getLeaderTeamRate());
|
||||||
// --------------------- 追加分账部分 start ---------------------
|
teamRete = MoneyUtil.lt0(teamRete) ? BigDecimal.ZERO : teamRete;
|
||||||
List<OrderAddSubtract> adds = oasList.stream().filter(oas -> MoneyUtil.gt0(oas.getMoney())).collect(Collectors.toList());
|
BigDecimal teamMoney = new BigDecimal(workerSub.getLeaderTeamMoney());
|
||||||
for (OrderAddSubtract oas : adds) {
|
teamMoney = MoneyUtil.lt0(teamMoney) ? BigDecimal.ZERO : teamMoney;
|
||||||
String orderNo = payment.getOrderNo() + "_" + oas.getPaymentId() + "_" + System.currentTimeMillis();
|
|
||||||
|
// 平台加价抽成
|
||||||
|
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());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 分账账户信息
|
||||||
ArrayList<DivMember> divMembers = new ArrayList<>();
|
ArrayList<DivMember> divMembers = new ArrayList<>();
|
||||||
divMembers.add(new DivMember(memberId, MoneyUtil.toS(oas.getMoney()), true));
|
// 是否有罚金
|
||||||
//调用分账
|
boolean haveFine = MoneyUtil.gt0(fineMoney);
|
||||||
logger.info("子订单[{}]的追加单[{}]发起分账: {}", orderDetailId, oas.getId(), JSON.toJSONString(divMembers));
|
BigDecimal workerMoney = odMoney.subtract(fineMoney);
|
||||||
JSONObject response = adapayService.paymentConfirm(financialDetail.getDeptId(), oas.getPaymentId(),
|
if (haveFine) { // 有罚金 从罚金里扣除手续费
|
||||||
orderNo, MoneyUtil.toS(oas.getMoney()), divMembers, null, null);
|
// 平台的分账信息 用来承担罚金
|
||||||
logger.info("子订单[{}]的追加单[{}]分账结果: {}", orderDetailId, oas.getId(), response.toString());
|
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 ---------------------
|
// --------------------- 子财务单分账部分 end ---------------------
|
||||||
|
|
||||||
// --------------------- 改价单分账部分 start ---------------------
|
// 分账后自动提现去掉了 改用定时提现 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));
|
List<FinancialChangeRecord> financialChangeRecords = financialChangeRecordService.selectByDetailIds(String.valueOf(orderDetailId));
|
||||||
if (CollectionUtils.isNotEmpty(financialChangeRecords)) {
|
if (CollectionUtils.isNotEmpty(financialChangeRecords)) {
|
||||||
|
|
@ -487,15 +585,25 @@ public class OrderDetailServiceImpl implements OrderDetailService {
|
||||||
boolean paid = PayStatus.PAID.getCode().equals(fcRecord.getPayStatus());
|
boolean paid = PayStatus.PAID.getCode().equals(fcRecord.getPayStatus());
|
||||||
boolean payedAdd = PayStatus.PAYED_ADD.getCode().equals(fcRecord.getPayStatus());
|
boolean payedAdd = PayStatus.PAYED_ADD.getCode().equals(fcRecord.getPayStatus());
|
||||||
if (paid || payedAdd) {
|
if (paid || payedAdd) {
|
||||||
ArrayList<DivMember> divMembers = new ArrayList<>();
|
changeMoney = fcRecord.getChangeMoney();
|
||||||
addPrice = 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;
|
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<>();
|
ArrayList<Long> fineIds = new ArrayList<>();
|
||||||
for (OrderTimeoutRecord fineRecord : fineRecords) {
|
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());
|
logger.info("子订单[{}]的加价单[{}]不足以抵扣罚金{}元", orderDetailId, fcRecord.getId(), fineRecord.getPayMoney());
|
||||||
break;
|
break;
|
||||||
|
|
@ -507,156 +615,104 @@ public class OrderDetailServiceImpl implements OrderDetailService {
|
||||||
fineIds.add(fineRecord.getId());
|
fineIds.add(fineRecord.getId());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// 扣除罚金后的上门师傅报酬
|
||||||
// 是否有罚金
|
workerFee = workerFee.subtract(fineMoney);
|
||||||
boolean haveFine = BigDecimal.ZERO.compareTo(fineMoney) < 0;
|
// 平台抽成 + 超时罚金
|
||||||
if (haveFine) { // 有罚金
|
platformFee = platformFee.add(fineMoney);
|
||||||
// 扣除罚金后的加价金额
|
ArrayList<DivMember> divMembers = new ArrayList<>();
|
||||||
BigDecimal workerAddMoney = fcRecord.getChangeMoney().subtract(fineMoney);
|
// 承担手续费的标志 如果平台抽成为0则大师傅承担手续费 如果大师傅抽成也为0 则由上门师傅自己承担手续费
|
||||||
// 待提现金额里加入加价金额
|
boolean feeFlag = false;
|
||||||
dtx = dtx.add(workerAddMoney);
|
if (MoneyUtil.gt0(platformFee)) {
|
||||||
// 这里由平台承担手续费
|
divMembers.add(new DivMember("0", MoneyUtil.toS(platformFee), true));
|
||||||
DivMember divMember = new DivMember(memberId, AdapayUtils.bigDecimalToString(workerAddMoney), false);
|
feeFlag = true;
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
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);
|
logger.info("子订单[{}]的[改价单]发起分账", orderDetailId);
|
||||||
JSONObject response = adapayService.paymentConfirm(financialDetail.getDeptId(), fcRecord.getRemark(),
|
JSONObject response = adapayService.paymentConfirm(deptId, fcRecord.getPaymentId(), orderNo, MoneyUtil.toS(fcRecord.getChangeMoney()), divMembers, null, null);
|
||||||
payment.getOrderNo() + "_" + System.currentTimeMillis(),
|
logger.info("子订单[{}]的[改价单]分账结果: {}", orderDetailId, response.toString());
|
||||||
AdapayUtils.bigDecimalToString(fcRecord.getChangeMoney()), divMembers, null, null);
|
|
||||||
if (AdapayStatusEnum.succeeded.code.equals(response.getString("status"))) { // 分账成功
|
if (AdapayStatusEnum.succeeded.code.equals(response.getString("status"))) { // 分账成功
|
||||||
logger.info("子订单[code={}]的[改价单]分账成功", odCode);
|
logger.info("子订单[{}]的[改价单]分账成功", orderDetailId);
|
||||||
// 分账成功 把罚金状态改为已扣除
|
// 分账成功 把罚金状态改为已扣除
|
||||||
fineIds.forEach(fineRecordId -> orderFineRecordMapper.updateFineStatus(fineRecordId, 1));
|
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 { // 分账失败
|
} else { // 分账失败
|
||||||
if (AdapayErrorCode.CONFIRM_AMT_OVER_LIMIT.equals(response.getString("error_code"))) {
|
if (AdapayErrorCode.CONFIRM_AMT_OVER_LIMIT.equals(response.getString("error_code"))) {
|
||||||
// 当前确认金额 > 支付金额 - 已支付确认金额 - 已支付撤销金额
|
// 当前确认金额 > 支付金额 - 已支付确认金额 - 已支付撤销金额
|
||||||
// 这里有两种可能 1.可能是之前算错了手续费的旧订单
|
// 这里有两种可能 1.可能是之前算错了手续费的旧订单
|
||||||
// 2.可能是之前执行过完单流程 改价单分账成功了 但是子财务单分账失败了
|
// 2.可能是之前执行过完单流程 改价单分账成功了 但是子财务单分账失败了
|
||||||
// 所以直接跳过
|
// 所以直接跳过
|
||||||
logger.info("子订单[code={}] 跳过[改价单]分账", odCode);
|
logger.info("子订单[{}] 跳过[改价单]分账 : CONFIRM_AMT_OVER_LIMIT", orderDetailId);
|
||||||
} else {
|
} 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"));
|
throw new IllegalArgumentException(response.getString("error_msg"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// --------------------- 改价单分账部分 end ---------------------
|
return changeMoney;
|
||||||
|
}
|
||||||
|
|
||||||
// --------------------- 子财务单分账部分 start ---------------------
|
/**
|
||||||
// 分账账户信息
|
* 订单追加分账
|
||||||
|
*
|
||||||
ArrayList<DivMember> divMembers = new ArrayList<>();
|
* @param orderDetailId 子订单ID
|
||||||
// 子单的实际金额
|
* @param deptId 企业ID
|
||||||
BigDecimal fdPayMoney = financialDetail.getPayMoney().subtract(addPrice);
|
* @param memberId 子师傅ID
|
||||||
// 实际要分账的金额(子单的实际金额 + 平台补偿改价单手续费)
|
* @param masterMemberId 主师傅ID
|
||||||
BigDecimal payMoney;
|
* @param teamRete 团队抽成比例
|
||||||
if (compensate) {
|
* @param teamMoney 团队抽成金额
|
||||||
// 平台补偿改价单手续费
|
* @param pcDeptRate 平台抽成比例
|
||||||
payMoney = fdPayMoney.add(feeAmt);
|
* @param pcDeptMoney 平台抽成金额
|
||||||
} else {
|
* @throws BaseAdaPayException AdaPay分账接口可能抛出的异常
|
||||||
// 平台不补偿改价单手续费
|
*/
|
||||||
payMoney = fdPayMoney;
|
private void addPaymentConfirm(Long orderDetailId, Long deptId, String memberId, String masterMemberId,
|
||||||
}
|
BigDecimal teamRete, BigDecimal teamMoney, BigDecimal pcDeptRate, BigDecimal pcDeptMoney) throws BaseAdaPayException {
|
||||||
if (MoneyUtil.lte0(payMoney)) {
|
List<OrderAddSubtract> oasList = orderAddSubtractMapper.select(new OrderAddSubtract()
|
||||||
logger.info("子财务单[{}] 应支付金额={} 不需要分账", financialDetail.getId(), payMoney);
|
.setOrderDetailId(orderDetailId).setPayStatus(PayStatus.PAID.getCode()));
|
||||||
} else {
|
List<OrderAddSubtract> adds = oasList.stream().filter(oas -> MoneyUtil.gt0(oas.getMoney())).collect(Collectors.toList());
|
||||||
// 查询师傅的超时扣款记录
|
for (OrderAddSubtract oas : adds) {
|
||||||
List<OrderTimeoutRecord> fineRecords = orderFineRecordMapper.selectUnFine(orderDetail.getWorkerId(), orderMaster.getDeptId());
|
BigDecimal oasMoney = oas.getMoney();
|
||||||
// 超时罚金
|
// 平台抽成
|
||||||
BigDecimal fineMoney = BigDecimal.ZERO;
|
BigDecimal platformFee = oasMoney.multiply(pcDeptRate).add(pcDeptMoney).setScale(2, RoundingMode.UP);
|
||||||
ArrayList<Long> fineIds = new ArrayList<>();
|
// 大师傅抽成
|
||||||
for (OrderTimeoutRecord fineRecord : fineRecords) {
|
BigDecimal masterFee = oasMoney.multiply(teamRete).add(teamMoney).setScale(2, RoundingMode.UP);
|
||||||
// 抵扣超时罚金 这里的罚金是按创建时间升序排列的 优先抵扣最早的罚金
|
// 如果提成>追加金额 则去掉固定提成 只计算比例提成
|
||||||
if (fineMoney.add(fineRecord.getPayMoney()).compareTo(fdPayMoney) > 0) {
|
if (MoneyUtil.lt(masterFee.add(platformFee), oasMoney)) {
|
||||||
// 加价单金额不足以抵扣罚金
|
platformFee = oasMoney.multiply(pcDeptRate).setScale(2, RoundingMode.UP);
|
||||||
logger.info("子订单[{}]的派单金额[{}元]不足以抵扣罚金{}元", orderDetailId, fdPayMoney, fineRecord.getPayMoney());
|
masterFee = oasMoney.multiply(teamRete).setScale(2, RoundingMode.UP);
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
// 抵扣罚金
|
|
||||||
logger.info("子订单[{}]的加价单[{}]抵扣罚金{}元", orderDetailId, fdPayMoney, fineRecord.getPayMoney());
|
|
||||||
fineMoney = fineMoney.add(fineRecord.getPayMoney());
|
|
||||||
// 被抵扣的罚金记录ID先存下来,分账成功后修改状态
|
|
||||||
fineIds.add(fineRecord.getId());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// 总分账金额
|
// 上门师傅的报酬
|
||||||
BigDecimal fee = BigDecimal.ZERO;
|
BigDecimal workerFee = oasMoney.subtract(platformFee).subtract(masterFee);
|
||||||
// 接单师傅的分账信息
|
// 分账信息
|
||||||
String payMoneyS = AdapayUtils.bigDecimalToString(payMoney.subtract(fineMoney));
|
ArrayList<DivMember> divMembers = new ArrayList<>();
|
||||||
DivMember divMember = new DivMember(memberId, payMoneyS, false);
|
// 承担手续费的标志 如果平台抽成为0则大师傅承担手续费 如果大师傅抽成也为0 则由上门师傅自己承担手续费
|
||||||
divMembers.add(divMember);
|
boolean feeFlag = false;
|
||||||
// 是否有罚金
|
if (MoneyUtil.gt0(platformFee)) {
|
||||||
boolean haveFine = MoneyUtil.gt0(fineMoney);
|
divMembers.add(new DivMember("0", MoneyUtil.toS(platformFee), true));
|
||||||
if (haveFine) { // 有罚金 从罚金里扣除手续费
|
feeFlag = true;
|
||||||
// 平台的分账信息 用来承担罚金
|
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
logger.info("子订单[code={}]发起分账", odCode);
|
if (MoneyUtil.gt0(masterFee)) {
|
||||||
JSONObject response = adapayService.paymentConfirm(financialDetail.getDeptId(), payment.getId(),
|
divMembers.add(new DivMember(masterMemberId, MoneyUtil.toS(masterFee), !feeFlag));
|
||||||
payment.getOrderNo() + "_" + System.currentTimeMillis(),
|
feeFlag = true;
|
||||||
AdapayUtils.bigDecimalToString(fee.add(payMoney)), divMembers, null, null);
|
}
|
||||||
boolean status = AdapayStatusEnum.succeeded.code.equals(response.getString("status"));
|
if (MoneyUtil.gt0(workerFee)) {
|
||||||
// 如果确认支付失败 这里抛出异常 回滚订单状态
|
divMembers.add(new DivMember(memberId, MoneyUtil.toS(workerFee), !feeFlag));
|
||||||
Assert.isTrue(status, response.toString());
|
}
|
||||||
// 分账成功 把罚金状态改为已扣除
|
String orderNo = "OAS_" + oas.getId() + "_" + System.currentTimeMillis();
|
||||||
fineIds.forEach(fineRecordId -> orderFineRecordMapper.updateFineStatus(fineRecordId, 1));
|
//调用分账
|
||||||
// 待提现金额里加入子财务单金额
|
logger.info("子订单[{}]的追加单[{}]发起分账: {}", orderDetailId, oas.getId(), JSON.toJSONString(divMembers));
|
||||||
dtx = dtx.add(fdPayMoney.subtract(fineMoney));
|
JSONObject response = adapayService.paymentConfirm(deptId, oas.getPaymentId(),
|
||||||
|
orderNo, MoneyUtil.toS(oasMoney), divMembers, null, null);
|
||||||
// 修改平台抽成子财务单金额 减去手续费
|
logger.info("子订单[{}]的追加单[{}]分账结果: {}", orderDetailId, oas.getId(), response.toString());
|
||||||
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