主订单分账时扣除罚金

This commit is contained in:
Hawking 2023-05-10 21:02:04 +08:00
parent 6436dffee0
commit e7cdfe188d
2 changed files with 32 additions and 3 deletions

View File

@ -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<OrderTimeoutRecord> fineRecords = orderFineRecordMapper.selectUnFine(orderDetail.getWorkerId(), orderDetail.getDeptId());
List<OrderTimeoutRecord> fineRecords = orderFineRecordMapper.selectUnFine(orderDetail.getWorkerId(), orderMaster.getDeptId());
ArrayList<Long> fineIds = new ArrayList<>();
for (OrderTimeoutRecord fineRecord : fineRecords) {
// 抵扣超时罚金 这里的罚金是按创建时间升序排列的 优先抵扣最早的罚金
@ -567,7 +568,7 @@ public class OrderDetailServiceImpl implements OrderDetailService {
logger.info("子财务单[{}] 应支付金额={} 不需要分账", financialDetail.getId(), payMoney);
} else {
// 查询师傅的超时扣款记录
List<OrderTimeoutRecord> fineRecords = orderFineRecordMapper.selectUnFine(orderDetail.getWorkerId(), orderDetail.getDeptId());
List<OrderTimeoutRecord> fineRecords = orderFineRecordMapper.selectUnFine(orderDetail.getWorkerId(), orderMaster.getDeptId());
// 超时罚金
BigDecimal fineMoney = BigDecimal.ZERO;
ArrayList<Long> fineIds = new ArrayList<>();

View File

@ -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<OrderTimeoutRecord> fineRecords = orderFineRecordMapper.selectUnFine(orderMaster.getWorkerId(), orderMaster.getDeptId());
ArrayList<Long> 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());