diff --git a/ghy-order/src/main/java/com/ghy/order/service/impl/OrderDetailServiceImpl.java b/ghy-order/src/main/java/com/ghy/order/service/impl/OrderDetailServiceImpl.java index 4f39547c..112d039b 100644 --- a/ghy-order/src/main/java/com/ghy/order/service/impl/OrderDetailServiceImpl.java +++ b/ghy-order/src/main/java/com/ghy/order/service/impl/OrderDetailServiceImpl.java @@ -408,6 +408,7 @@ public class OrderDetailServiceImpl implements OrderDetailService { if (orderDetail == null) { throw new BaseException("找不到对应的子订单"); } + OrderMaster orderMaster = orderMasterService.selectById(orderDetail.getOrderMasterId()); String odCode = orderDetail.getCode(); Assert.isTrue(!orderDetail.getOrderStatus().equals(OrderStatus.FINISH.code()), "订单已经是完成状态"); FinancialMaster financialMaster = financialMasterService.selectByOrderMasterId(orderDetail.getOrderMasterId()); @@ -463,7 +464,7 @@ public class OrderDetailServiceImpl implements OrderDetailService { addPrice = fcRecord.getChangeMoney(); BigDecimal fineMoney = BigDecimal.ZERO; // 查询师傅的超时扣款记录 - List fineRecords = orderFineRecordMapper.selectUnFine(orderDetail.getWorkerId(), orderDetail.getDeptId()); + List fineRecords = orderFineRecordMapper.selectUnFine(orderDetail.getWorkerId(), orderMaster.getDeptId()); ArrayList fineIds = new ArrayList<>(); for (OrderTimeoutRecord fineRecord : fineRecords) { // 抵扣超时罚金 这里的罚金是按创建时间升序排列的 优先抵扣最早的罚金 @@ -567,7 +568,7 @@ public class OrderDetailServiceImpl implements OrderDetailService { logger.info("子财务单[{}] 应支付金额={} 不需要分账", financialDetail.getId(), payMoney); } else { // 查询师傅的超时扣款记录 - List fineRecords = orderFineRecordMapper.selectUnFine(orderDetail.getWorkerId(), orderDetail.getDeptId()); + List fineRecords = orderFineRecordMapper.selectUnFine(orderDetail.getWorkerId(), orderMaster.getDeptId()); // 超时罚金 BigDecimal fineMoney = BigDecimal.ZERO; ArrayList fineIds = new ArrayList<>(); diff --git a/ghy-order/src/main/java/com/ghy/order/service/impl/OrderMasterServiceImpl.java b/ghy-order/src/main/java/com/ghy/order/service/impl/OrderMasterServiceImpl.java index cdcb066e..099074a8 100644 --- a/ghy-order/src/main/java/com/ghy/order/service/impl/OrderMasterServiceImpl.java +++ b/ghy-order/src/main/java/com/ghy/order/service/impl/OrderMasterServiceImpl.java @@ -23,6 +23,8 @@ import com.ghy.order.service.OrderMasterService; import com.ghy.payment.domain.FinancialChangeRecord; import com.ghy.payment.domain.FinancialDetail; import com.ghy.payment.domain.FinancialMaster; +import com.ghy.payment.domain.OrderTimeoutRecord; +import com.ghy.payment.mapper.OrderFineRecordMapper; import com.ghy.payment.service.AdapayService; import com.ghy.payment.service.FinancialChangeRecordService; import com.ghy.payment.service.FinancialDetailService; @@ -69,6 +71,8 @@ public class OrderMasterServiceImpl implements OrderMasterService { private FinancialDetailService financialDetailService; @Resource private FinancialChangeRecordService financialChangeRecordService; + @Resource + private OrderFineRecordMapper orderFineRecordMapper; private static final AtomicLong INDEX = new AtomicLong(1L); @@ -230,7 +234,29 @@ public class OrderMasterServiceImpl implements OrderMasterService { } } - memberMap.put(AdapayUtils.getWorkerMemberId(orderMaster.getWorkerId(), orderMaster.getDeptId()), bigWorkerAmt); + // 超时罚金 + BigDecimal fineMoney = BigDecimal.ZERO; + // 查询师傅的超时扣款记录 + List fineRecords = orderFineRecordMapper.selectUnFine(orderMaster.getWorkerId(), orderMaster.getDeptId()); + ArrayList fineIds = new ArrayList<>(); + for (OrderTimeoutRecord fineRecord : fineRecords) { + // 抵扣超时罚金 这里的罚金是按创建时间升序排列的 优先抵扣最早的罚金 + if (fineMoney.add(fineRecord.getPayMoney()).compareTo(bigWorkerAmt) > 0) { + // 加价单金额不足以抵扣罚金 + logger.info("主订单[{}]的服务金额[{}]不足以抵扣罚金{}元", orderMasterId, bigWorkerAmt, fineRecord.getPayMoney()); + break; + } else { + // 抵扣罚金 + logger.info("主订单[{}]的服务金额抵扣罚金{}元", orderMasterId, fineRecord.getPayMoney()); + fineMoney = fineMoney.add(fineRecord.getPayMoney()); + // 被抵扣的罚金记录ID先存下来,分账成功后修改状态 + fineIds.add(fineRecord.getId()); + } + } + + // 罚金分给平台账户 + memberMap.merge("0", fineMoney, BigDecimal::add); + memberMap.put(AdapayUtils.getWorkerMemberId(orderMaster.getWorkerId(), orderMaster.getDeptId()), bigWorkerAmt.subtract(fineMoney)); confirmAmt = confirmAmt.add(bigWorkerAmt); // 分账账户 @@ -264,6 +290,8 @@ public class OrderMasterServiceImpl implements OrderMasterService { throw new BaseAdaPayException(response.getString("code"), response.getString("message")); } } + // 分账成功 把罚金状态改为已扣除 + fineIds.forEach(fineRecordId -> orderFineRecordMapper.updateFineStatus(fineRecordId, 1)); // 走到这里确认支付和分账都成功了 异步进入自动提现流程 logger.info("订单[code={}]开始自动提现", orderMaster.getCode());