自动分账,当单在待确认状态满1个小时触发分账
This commit is contained in:
parent
6482cad16e
commit
b45f2dace5
|
|
@ -50,7 +50,7 @@ public class AdapayUtils {
|
||||||
* @return 保留两位小数的String
|
* @return 保留两位小数的String
|
||||||
*/
|
*/
|
||||||
public static String bigDecimalToString(BigDecimal b) {
|
public static String bigDecimalToString(BigDecimal b) {
|
||||||
return b.setScale(2, RoundingMode.UNNECESSARY).toString();
|
return b.setScale(2, RoundingMode.HALF_UP).toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
public synchronized static String createOrderNo(AdapayOrderType type) {
|
public synchronized static String createOrderNo(AdapayOrderType type) {
|
||||||
|
|
|
||||||
|
|
@ -301,60 +301,78 @@ public class OrderDetailServiceImpl implements OrderDetailService {
|
||||||
Assert.notNull(financialMaster, "找不到主财务单");
|
Assert.notNull(financialMaster, "找不到主财务单");
|
||||||
PaymentDTO payment = financialMasterService.selectPaymentById(financialMaster.getPaymentId());
|
PaymentDTO payment = financialMasterService.selectPaymentById(financialMaster.getPaymentId());
|
||||||
Assert.notNull(payment, "找不到支付记录");
|
Assert.notNull(payment, "找不到支付记录");
|
||||||
FinancialDetail financialDetail = financialDetailService.selectByOrderDetailId(orderDetailId);
|
List<FinancialDetail> financialDetail = financialDetailService.selectListByOrderDetailId(orderDetailId);
|
||||||
Assert.notNull(financialDetail, "找不到子财务单");
|
Assert.notNull(financialDetail, "找不到子财务单");
|
||||||
Assert.isTrue(financialDetail.getPayStatus() == 1, "订单不是“已支付”状态");
|
Assert.isTrue(financialDetail.get(0).getPayStatus() == 1, "订单不是“已支付”状态");
|
||||||
// 更新订单状态
|
// 更新订单状态
|
||||||
orderDetailMapper.updateStatus(orderDetailId, OrderStatus.FINISH.code());
|
orderDetailMapper.updateStatus(orderDetailId, OrderStatus.FINISH.code());
|
||||||
if (BigDecimal.ZERO.compareTo(financialDetail.getPayMoney()) > -1) {
|
|
||||||
logger.info("子财务单[code={}]支付金额<=0,不需要分账", financialDetail.getCode());
|
|
||||||
// 支付金额<=0的话 不需要走下面的流程了
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 上门师傅结单 要判断一下这个单是否已退款
|
|
||||||
if (financialDetail.getPayStatus() > 1) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
// 分账账户ID
|
|
||||||
String memberId;
|
|
||||||
// 分账账户信息
|
// 分账账户信息
|
||||||
|
Map<String, DivMember> divMemberMap = new HashMap<>();
|
||||||
ArrayList<DivMember> divMembers = new ArrayList<>();
|
ArrayList<DivMember> divMembers = new ArrayList<>();
|
||||||
String amount = AdapayUtils.bigDecimalToString(financialDetail.getPayMoney());
|
BigDecimal feeAmount = BigDecimal.ZERO;
|
||||||
memberId = AdapayUtils.getWorkerMemberId(financialDetail.getPayeeId(), orderDetail.getDeptId());
|
for (FinancialDetail detail : financialDetail) {
|
||||||
DivMember divMember = new DivMember(memberId, amount, false);
|
if (BigDecimal.ZERO.compareTo(detail.getPayMoney()) > -1) {
|
||||||
divMembers.add(divMember);
|
logger.info("子财务单[code={}]支付金额<=0,不需要分账", detail.getCode());
|
||||||
|
// 支付金额<=0的话 不需要走下面的流程了
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// 重复的数据一次提现
|
||||||
|
String memberId = AdapayUtils.getWorkerMemberId(detail.getPayeeId(), detail.getDeptId());
|
||||||
|
DivMember divMember;
|
||||||
|
if(divMemberMap.containsKey(memberId)){
|
||||||
|
divMember = divMemberMap.get(memberId);
|
||||||
|
divMember.setAmount(AdapayUtils.bigDecimalToString(new BigDecimal(divMember.getAmount()).add(detail.getPayMoney())));
|
||||||
|
}else {
|
||||||
|
divMember = new DivMember(memberId, AdapayUtils.bigDecimalToString(detail.getPayMoney()), false);
|
||||||
|
divMemberMap.put(memberId, divMember);
|
||||||
|
}
|
||||||
|
feeAmount = feeAmount.add(detail.getPayMoney());
|
||||||
|
}
|
||||||
|
for (Map.Entry<String, DivMember> entry : divMemberMap.entrySet()) {
|
||||||
|
divMembers.add(entry.getValue());
|
||||||
|
}
|
||||||
|
BigDecimal fee = BigDecimal.ZERO;
|
||||||
|
if(feeAmount.multiply(BigDecimal.valueOf(0.004)).compareTo(BigDecimal.valueOf(0.01)) < 1){
|
||||||
|
fee = fee.add(BigDecimal.valueOf(0.01));
|
||||||
|
}else {
|
||||||
|
fee = feeAmount.multiply(BigDecimal.valueOf(0.004));
|
||||||
|
}
|
||||||
|
DivMember feeDivMember = new DivMember("0", AdapayUtils.bigDecimalToString(fee), true);
|
||||||
|
divMembers.add(feeDivMember);
|
||||||
|
|
||||||
|
BigDecimal totalMoney = feeAmount.add(fee);
|
||||||
|
// 扣除交易费用
|
||||||
|
String sureMoney = AdapayUtils.bigDecimalToString(totalMoney);
|
||||||
|
|
||||||
logger.info("子订单[code={}]分账信息: {}", orderDetail.getCode(), JSON.toJSONString(divMembers));
|
logger.info("子订单[code={}]分账信息: {}", orderDetail.getCode(), JSON.toJSONString(divMembers));
|
||||||
JSONObject response = adapayService.paymentConfirm(orderDetail.getDeptId(), payment.getId(), payment.getOrderNo(),
|
JSONObject response = adapayService.paymentConfirm(financialDetail.get(0).getDeptId(), payment.getId(), payment.getOrderNo() + "_" + System.currentTimeMillis(),
|
||||||
amount, divMembers, null, null);
|
sureMoney, divMembers, null, null);
|
||||||
logger.info("子订单[code={}]分账结果: {}", orderDetail.getCode(), response.toJSONString());
|
logger.info("子订单[code={}]分账结果: {}", orderDetail.getCode(), response.toJSONString());
|
||||||
|
|
||||||
boolean status = AdapayStatusEnum.pending.code.equals(response.getString("status")) ||
|
boolean status = AdapayStatusEnum.pending.code.equals(response.getString("status")) ||
|
||||||
AdapayStatusEnum.succeeded.code.equals(response.getString("status"));
|
AdapayStatusEnum.succeeded.code.equals(response.getString("status"));
|
||||||
// 如果确认支付失败 这里抛出异常 回滚订单状态
|
// 如果确认支付失败 这里抛出异常 回滚订单状态
|
||||||
Assert.isTrue(status, response.getString("error_msg"));
|
Assert.isTrue(status, response.getString("error_msg"));
|
||||||
|
|
||||||
// 走到这里确认分账成功了 异步进入自动提现流程
|
// 走到这里确认分账成功了 异步进入自动提现流程
|
||||||
logger.info("子订单[code={}]开始自动提现", orderDetail.getCode());
|
logger.info("子订单[code={}]开始自动提现", orderDetail.getCode());
|
||||||
divMembers.forEach(member -> executor.execute(() -> {
|
divMembers.forEach(member -> {
|
||||||
try {
|
try {
|
||||||
String orderNo = AdapayUtils.createOrderNo(AdapayOrderType.DRAW_CASH);
|
String orderNo = AdapayUtils.createOrderNo(AdapayOrderType.DRAW_CASH);
|
||||||
JSONObject drawCashResponse = adapayService.drawCash(orderDetail.getDeptId(), orderNo, "T1",
|
JSONObject drawCashResponse = adapayService.drawCash(financialDetail.get(0).getDeptId(), orderNo, "T1",
|
||||||
amount, memberId, "订单结算", null);
|
member.getAmount(), member.getMemberId(), "订单结算", null);
|
||||||
|
|
||||||
boolean drawCashStatus = AdapayStatusEnum.pending.code.equals(drawCashResponse.getString("status")) ||
|
boolean drawCashStatus = AdapayStatusEnum.pending.code.equals(drawCashResponse.getString("status")) ||
|
||||||
AdapayStatusEnum.succeeded.code.equals(drawCashResponse.getString("status"));
|
AdapayStatusEnum.succeeded.code.equals(drawCashResponse.getString("status"));
|
||||||
|
|
||||||
if (!drawCashStatus) {
|
if (!drawCashStatus) {
|
||||||
//如果提现失败 把信息记录到error日志里
|
//如果提现失败 把信息记录到error日志里
|
||||||
logger.error("自动发起提现失败: deptId={}, memberId={}, amount={}, 失败原因:{}", orderDetail.getDeptId(),
|
logger.error("自动发起提现失败: deptId={}, memberId={}, amount={}, 失败原因:{}", financialDetail.get(0).getDeptId(),
|
||||||
memberId, amount, drawCashResponse.getString("error_msg"));
|
member.getMemberId(), member.getAmount(), drawCashResponse.getString("error_msg"));
|
||||||
}
|
}
|
||||||
} catch (BaseAdaPayException e) {
|
} catch (BaseAdaPayException e) {
|
||||||
logger.error("自动发起提现失败: orderDetailId={}, memberId={}, cashAmt={}", orderDetailId, memberId, amount, e);
|
logger.error("自动发起提现失败: orderDetailId={}, memberId={}, cashAmt={}", orderDetailId, member.getMemberId(), member.getAmount(), e);
|
||||||
}
|
}
|
||||||
}));
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,8 @@ public interface FinancialDetailService {
|
||||||
*/
|
*/
|
||||||
FinancialDetail selectByOrderDetailId(Long orderDetailId);
|
FinancialDetail selectByOrderDetailId(Long orderDetailId);
|
||||||
|
|
||||||
|
List<FinancialDetail> selectListByOrderDetailId(Long orderDetailId);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param financialDetail 财务细单属性
|
* @param financialDetail 财务细单属性
|
||||||
* @return 成功条数
|
* @return 成功条数
|
||||||
|
|
|
||||||
|
|
@ -70,6 +70,13 @@ public class FinancialDetailServiceImpl implements FinancialDetailService {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<FinancialDetail> selectListByOrderDetailId(Long orderDetailId) {
|
||||||
|
FinancialDetail financialDetail = new FinancialDetail();
|
||||||
|
financialDetail.setOrderDetailId(orderDetailId);
|
||||||
|
return financialDetailMapper.selectFinancialDetailList(financialDetail);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int insertFinancialDetail(FinancialDetail financialDetail) {
|
public int insertFinancialDetail(FinancialDetail financialDetail) {
|
||||||
return financialDetailMapper.insertFinancialDetail(financialDetail);
|
return financialDetailMapper.insertFinancialDetail(financialDetail);
|
||||||
|
|
|
||||||
|
|
@ -137,7 +137,7 @@ public class OrderServiceImpl implements OrderService {
|
||||||
// 查询出"待确认"状态的子订单
|
// 查询出"待确认"状态的子订单
|
||||||
List<OrderDetail> orderDetails = orderDetailService.selectByStatus(Collections.singletonList(OrderStatus.FINISH_CHECK.code()));
|
List<OrderDetail> orderDetails = orderDetailService.selectByStatus(Collections.singletonList(OrderStatus.FINISH_CHECK.code()));
|
||||||
long now = System.currentTimeMillis();
|
long now = System.currentTimeMillis();
|
||||||
long day14ago = now - (14 * 24 * 60 * 60 * 1000L);
|
long day14ago = now - (60 * 60 * 1000L);
|
||||||
for (OrderDetail orderDetail : orderDetails) {
|
for (OrderDetail orderDetail : orderDetails) {
|
||||||
// 查询符合自动确认的订单
|
// 查询符合自动确认的订单
|
||||||
if (day14ago > orderDetail.getUpdateTime().getTime()) {
|
if (day14ago > orderDetail.getUpdateTime().getTime()) {
|
||||||
|
|
@ -145,22 +145,10 @@ public class OrderServiceImpl implements OrderService {
|
||||||
try {
|
try {
|
||||||
// 完单流程(分账与提现)
|
// 完单流程(分账与提现)
|
||||||
orderDetailService.finish(orderDetail.getId());
|
orderDetailService.finish(orderDetail.getId());
|
||||||
} catch (BaseAdaPayException e) {
|
} catch (Exception e) {
|
||||||
logger.error("订单自动完成[id={}, code={}]出错", orderDetail.getId(), orderDetail.getCode(), e);
|
logger.error("订单自动完成[id={}, code={}]出错", orderDetail.getId(), orderDetail.getCode(), e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 当所有的子订单完成后 自动把主订单完成
|
|
||||||
List<OrderMaster> orderMasters = orderMasterService.selectUnfinished();
|
|
||||||
for (OrderMaster orderMaster : orderMasters) {
|
|
||||||
executor.execute(() -> {
|
|
||||||
try {
|
|
||||||
orderMasterService.finish(orderMaster.getId());
|
|
||||||
} catch (Exception e) {
|
|
||||||
logger.error("主订单 Finish 失败", e);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue