主订单结算 提交测试
This commit is contained in:
parent
4d42753847
commit
0dbeb14265
|
|
@ -1,6 +1,5 @@
|
|||
package com.ghy.order.service.impl;
|
||||
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.ghy.common.adapay.AdapayErrorCode;
|
||||
import com.ghy.common.adapay.model.AdapayStatusEnum;
|
||||
|
|
@ -362,7 +361,7 @@ public class OrderDetailServiceImpl implements OrderDetailService {
|
|||
FinancialDetail platformFeeFD = details.get(0);
|
||||
FinancialDetail update = new FinancialDetail();
|
||||
update.setId(platformFeeFD.getId());
|
||||
|
||||
update.setPayMoney(platformFeeFD.getPayMoney());
|
||||
logger.debug("子订单[code={}]的完单流程开始", odCode);
|
||||
|
||||
// 更新订单状态
|
||||
|
|
@ -393,18 +392,19 @@ public class OrderDetailServiceImpl implements OrderDetailService {
|
|||
DivMember divMember = new DivMember(memberId, AdapayUtils.bigDecimalToString(fcRecord.getChangeMoney()), true);
|
||||
divMembers.add(divMember);
|
||||
//调用分账
|
||||
logger.info("子订单[code={}]的[改价单]的分账信息: {}", odCode, JSON.toJSONString(divMembers));
|
||||
logger.info("子订单[code={}]的[改价单]发起分账", odCode);
|
||||
JSONObject response = adapayService.paymentConfirm(financialDetail.getDeptId(), fcRecord.getRemark(),
|
||||
payment.getOrderNo() + "_" + System.currentTimeMillis(),
|
||||
AdapayUtils.bigDecimalToString(fcRecord.getChangeMoney()), divMembers, null, null);
|
||||
if (AdapayStatusEnum.succeeded.code.equals(response.getString("status"))) { // 分账成功
|
||||
logger.info("子订单[code={}]的[改价单]分账成功", odCode);
|
||||
// 这是被扣掉的手续费
|
||||
// 这是被扣掉的手续费 按理说这里肯定大于0
|
||||
String fee_amt = response.getString("fee_amt");
|
||||
feeAmt = new BigDecimal(fee_amt);
|
||||
if (feeAmt.compareTo(platformFeeFD.getPayMoney()) < 0 && !"0.00".equals(fee_amt)) {
|
||||
// 当 0.00<改价单的手续费<=平台抽成金额 时
|
||||
// 用平台抽成来补偿改价单的手续费 修改平台抽成子财务单金额
|
||||
update.setPayMoney(platformFeeFD.getPayMoney().subtract(feeAmt));
|
||||
update.setPayMoney(update.getPayMoney().subtract(feeAmt));
|
||||
int i = financialDetailService.updateFinancialDetail(update);
|
||||
compensate = i > 0;
|
||||
} else {
|
||||
|
|
@ -461,17 +461,16 @@ public class OrderDetailServiceImpl implements OrderDetailService {
|
|||
DivMember feeDivMember = new DivMember("0", fee.toString(), true);
|
||||
divMembers.add(feeDivMember);
|
||||
|
||||
logger.info("子订单[code={}]分账信息: {}", odCode, JSON.toJSONString(divMembers));
|
||||
logger.info("子订单[code={}]发起分账", odCode);
|
||||
JSONObject response = adapayService.paymentConfirm(financialDetail.getDeptId(), payment.getId(), payment.getOrderNo() + "_" + System.currentTimeMillis(),
|
||||
fee.add(payMoney).toString(), divMembers, null, null);
|
||||
logger.info("子订单[code={}]分账结果: {}", odCode, response.toJSONString());
|
||||
boolean status = AdapayStatusEnum.succeeded.code.equals(response.getString("status"));
|
||||
// 如果确认支付失败 这里抛出异常 回滚订单状态
|
||||
Assert.isTrue(status, response.getString("error_msg"));
|
||||
// 待提现金额里加入子财务单金额
|
||||
dtx = dtx.add(fdPayMoney);
|
||||
// 修改平台抽成子财务单金额
|
||||
update.setPayMoney(platformFeeFD.getPayMoney().subtract(fee));
|
||||
update.setPayMoney(update.getPayMoney().subtract(fee));
|
||||
financialDetailService.updateFinancialDetail(update);
|
||||
}
|
||||
// --------------------- 子财务单分账部分 end ---------------------
|
||||
|
|
@ -482,10 +481,10 @@ public class OrderDetailServiceImpl implements OrderDetailService {
|
|||
if (BigDecimal.ZERO.compareTo(dtx) > -1) {
|
||||
logger.info("子订单[code={}] 待提现金额={} 无需提现", odCode, dtx);
|
||||
}
|
||||
// 待提现金额
|
||||
String cashAmt = AdapayUtils.bigDecimalToString(dtx);
|
||||
String orderNo = AdapayUtils.createOrderNo(AdapayOrderType.DRAW_CASH);
|
||||
try {
|
||||
String orderNo = AdapayUtils.createOrderNo(AdapayOrderType.DRAW_CASH);
|
||||
// 待提现金额
|
||||
String cashAmt = AdapayUtils.bigDecimalToString(dtx);
|
||||
JSONObject drawCashResponse = adapayService.drawCash(financialDetail.getDeptId(), orderNo, "T1",
|
||||
cashAmt, memberId, "订单结算", null);
|
||||
boolean drawCashStatus = AdapayStatusEnum.pending.code.equals(drawCashResponse.getString("status")) ||
|
||||
|
|
@ -495,11 +494,10 @@ public class OrderDetailServiceImpl implements OrderDetailService {
|
|||
logger.info("子订单[code={}]自动提现成功", odCode);
|
||||
} else {
|
||||
// 提现失败 把信息记录到error日志里
|
||||
logger.error("自动发起提现失败: 子订单code={}, deptId={}, memberId={}, amount={}, 失败信息: {}", odCode,
|
||||
financialDetail.getDeptId(), memberId, cashAmt, drawCashResponse.toJSONString());
|
||||
logger.error("自动发起提现失败: 子订单code={}, deptId={} 失败信息: {}", odCode, cashAmt, drawCashResponse.toJSONString());
|
||||
}
|
||||
} catch (Exception e) {
|
||||
logger.error("自动发起提现失败: 子订单code={}, deptId={}, memberId={}", odCode, financialDetail.getDeptId(), memberId, e);
|
||||
logger.error("自动发起提现失败: 子订单code={}, deptId={}, memberId={}, amount={}", odCode, financialDetail.getDeptId(), memberId, cashAmt, e);
|
||||
}
|
||||
// --------------------- 自动提现流程 end ---------------------
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,5 @@
|
|||
package com.ghy.order.service.impl;
|
||||
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.ghy.common.adapay.model.AdapayStatusEnum;
|
||||
import com.ghy.common.adapay.model.DivMember;
|
||||
|
|
@ -159,6 +158,7 @@ public class OrderMasterServiceImpl implements OrderMasterService {
|
|||
PaymentDTO payment = financialMasterService.selectPaymentById(financialMaster.getPaymentId());
|
||||
Assert.notNull(payment, String.format("主订单[id=%d]找不到支付记录", orderMasterId));
|
||||
|
||||
// 修改主订单状态
|
||||
updateStatus(orderMasterId, OrderStatus.FINISH_CHECK.code());
|
||||
|
||||
if (BigDecimal.ZERO.compareTo(financialMaster.getPayMoney()) > -1) {
|
||||
|
|
@ -169,31 +169,30 @@ public class OrderMasterServiceImpl implements OrderMasterService {
|
|||
|
||||
// 用子财务单组成分账信息
|
||||
List<FinancialDetail> financialDetails = financialDetailService.selectByFinancialMasterId(financialMaster.getId());
|
||||
// 校验金额 主财务单的金额减去所有子财务单的金额是否=0
|
||||
BigDecimal checkMoney = financialMaster.getPayMoney();
|
||||
// 确认支付金额 = 主财务单付款金额 - 退款金额 - 已确认金额
|
||||
BigDecimal confirmAmt = financialMaster.getPayMoney();
|
||||
// 确认支付总金额
|
||||
BigDecimal confirmAmt = BigDecimal.ZERO;
|
||||
|
||||
// key:memberId(分账账户ID) value:分账金额
|
||||
HashMap<String, BigDecimal> memberMap = new HashMap<>();
|
||||
|
||||
for (FinancialDetail financialDetail : financialDetails) {
|
||||
checkMoney = checkMoney.subtract(financialDetail.getPayMoney());
|
||||
String memberId;
|
||||
switch (financialDetail.getFinancialDetailType()) {
|
||||
case 0:
|
||||
// 上门师傅的财务单单独确认分账了 不在这里分
|
||||
// 减掉已确认金额
|
||||
confirmAmt = confirmAmt.subtract(financialDetail.getPayMoney());
|
||||
break;
|
||||
case 1:
|
||||
// 大师傅/店铺提成
|
||||
memberId = AdapayUtils.getWorkerMemberId(financialDetail.getPayeeId(), orderMaster.getDeptId());
|
||||
memberMap.merge(memberId, financialDetail.getPayMoney(), BigDecimal::add);
|
||||
confirmAmt = confirmAmt.add(financialDetail.getPayMoney());
|
||||
break;
|
||||
case 2:
|
||||
// 平台提成 并且是手续费承担方
|
||||
case 5:
|
||||
// 订单超时罚金 归平台所有
|
||||
memberMap.merge("0", financialDetail.getPayMoney(), BigDecimal::add);
|
||||
confirmAmt = confirmAmt.add(financialDetail.getPayMoney());
|
||||
break;
|
||||
case 3:
|
||||
// 分销
|
||||
|
|
@ -206,44 +205,33 @@ public class OrderMasterServiceImpl implements OrderMasterService {
|
|||
// 如果没有分销人 那这笔钱就分到平台账户
|
||||
memberMap.merge("0", financialDetail.getPayMoney(), BigDecimal::add);
|
||||
}
|
||||
confirmAmt = confirmAmt.add(financialDetail.getPayMoney());
|
||||
break;
|
||||
case 4:
|
||||
// 减掉退款金额
|
||||
confirmAmt = confirmAmt.subtract(financialDetail.getPayMoney());
|
||||
case 5:
|
||||
// 订单超时罚金 归平台所有
|
||||
memberMap.merge("0", financialDetail.getPayMoney(), BigDecimal::add);
|
||||
// 退款金额
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// 这里校验一次主财务单的金额减去所有子财务单的金额是否=0
|
||||
Assert.isTrue(BigDecimal.ZERO.compareTo(checkMoney) == 0, "订单金额异常,请稍后再试");
|
||||
|
||||
// 分账账户
|
||||
ArrayList<DivMember> divMembers = new ArrayList<>();
|
||||
// 需要自动提现的账户
|
||||
ArrayList<DivMember> autoDrawCashMembers = new ArrayList<>();
|
||||
for (Map.Entry<String, BigDecimal> entry : memberMap.entrySet()) {
|
||||
String memberId = entry.getKey();
|
||||
BigDecimal money = entry.getValue();
|
||||
String amount = AdapayUtils.bigDecimalToString(money);
|
||||
if ("0".equals(memberId)) {
|
||||
// 0是平台账户 只参与分账 不自动提现
|
||||
// 0是平台账户 承担手续费
|
||||
divMembers.add(new DivMember("0", amount, true));
|
||||
} else {
|
||||
DivMember member = new DivMember(memberId, amount, false);
|
||||
divMembers.add(member);
|
||||
autoDrawCashMembers.add(member);
|
||||
divMembers.add(new DivMember(memberId, amount, false));
|
||||
}
|
||||
}
|
||||
|
||||
logger.info("订单[code={}]分账信息: {}", orderMaster.getCode(), JSON.toJSONString(divMembers));
|
||||
logger.info("订单[code={}]发起分账", orderMaster.getCode());
|
||||
JSONObject response = adapayService.paymentConfirm(orderMaster.getDeptId(), payment.getId(), payment.getOrderNo(),
|
||||
AdapayUtils.bigDecimalToString(confirmAmt), divMembers, null, null);
|
||||
logger.info("订单[code={}]分账结果: {}", orderMaster.getCode(), response.toJSONString());
|
||||
|
||||
boolean status = AdapayStatusEnum.pending.code.equals(response.getString("status")) ||
|
||||
AdapayStatusEnum.succeeded.code.equals(response.getString("status"));
|
||||
|
|
@ -252,8 +240,12 @@ public class OrderMasterServiceImpl implements OrderMasterService {
|
|||
|
||||
// 走到这里确认支付和分账都成功了 异步进入自动提现流程
|
||||
logger.info("订单[code={}]开始自动提现", orderMaster.getCode());
|
||||
autoDrawCashMembers.forEach(member -> executor.execute(() -> {
|
||||
divMembers.forEach(member -> executor.execute(() -> {
|
||||
String memberId = member.getMemberId();
|
||||
if ("0".equals(member.getMemberId())) {
|
||||
// 平台的钱不用自动提现
|
||||
return;
|
||||
}
|
||||
String amount = member.getAmount();
|
||||
try {
|
||||
drawCash(orderMaster.getDeptId(), memberId, amount);
|
||||
|
|
|
|||
|
|
@ -100,7 +100,10 @@ public class AdapayService {
|
|||
confirmParams.put("div_members", divMembers);
|
||||
confirmParams.put("fee_mode", feeMode);
|
||||
confirmParams.put("description", description);
|
||||
return (JSONObject) PaymentConfirm.create(confirmParams, deptId.toString());
|
||||
logger.info("发起支付确认 dept[{}] param:{}", deptId, confirmParams.toJSONString());
|
||||
JSONObject response = (JSONObject) PaymentConfirm.create(confirmParams, deptId.toString());
|
||||
logger.info("支付确认结果 dept[{}] response:{}", deptId, response.toJSONString());
|
||||
return response;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -255,7 +258,9 @@ public class AdapayService {
|
|||
cashParam.put("notify_url", adapayProperties.getNotifyUrl());
|
||||
cashParam.put("remark", remark);
|
||||
cashParam.put("fee_mode", feeMode);
|
||||
logger.info("发起提现 dept[{}] param:{}", deptId, cashParam.toJSONString());
|
||||
JSONObject response = (JSONObject) Drawcash.create(cashParam, deptId.toString());
|
||||
logger.info("提现结果 dept[{}] response:{}", deptId, response.toJSONString());
|
||||
drawCashCallbackService.onResponse(response);
|
||||
return response;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,6 +6,6 @@ public interface OrderService {
|
|||
void overTimeOrder(String orderStatus);
|
||||
|
||||
// 自动完成和分账
|
||||
void finishOrder();
|
||||
void autoFinishOrder();
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -134,25 +134,27 @@ public class OrderServiceImpl implements OrderService {
|
|||
|
||||
|
||||
@Override
|
||||
public void finishOrder() {
|
||||
public void autoFinishOrder() {
|
||||
// 子订单自动完单
|
||||
// 查询出"待确认"状态的子订单
|
||||
List<OrderDetail> orderDetails = orderDetailService.selectByStatus(Collections.singletonList(OrderStatus.FINISH_CHECK.code()));
|
||||
long now = System.currentTimeMillis();
|
||||
// long day14ago = now - (60 * 60 * 1000L);
|
||||
long day14ago = now - 10000L;
|
||||
for (OrderDetail orderDetail : orderDetails) {
|
||||
// 查询符合自动确认的订单
|
||||
// 筛选符合自动确认的订单
|
||||
if (day14ago > orderDetail.getUpdateTime().getTime()) {
|
||||
logger.info("订单自动完成[id={}, code={}]", orderDetail.getId(), orderDetail.getCode());
|
||||
logger.info("子订单自动完成[id={}, code={}]", orderDetail.getId(), orderDetail.getCode());
|
||||
try {
|
||||
// 完单流程(分账与提现)
|
||||
// 子订单完单流程(分账与提现)
|
||||
orderDetailService.finish(orderDetail.getId());
|
||||
} 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 om : orderMasters) {
|
||||
try {
|
||||
|
|
@ -167,7 +169,7 @@ public class OrderServiceImpl implements OrderService {
|
|||
}
|
||||
// 如果已经不存在"已完成"和"已取消"以外的子订单 就把主订单也改为完成
|
||||
if (allFinish) {
|
||||
logger.info("主订单可以完成了[id={} code={}]", om.getId(), om.getCode());
|
||||
logger.info("主订单自动完成[id={} code={}]", om.getId(), om.getCode());
|
||||
orderMasterService.finish(om.getId());
|
||||
}
|
||||
} catch (Exception e) {
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@ public class OrderTask {
|
|||
* */
|
||||
public void finishOrder(){
|
||||
try {
|
||||
orderService.finishOrder();
|
||||
orderService.autoFinishOrder();
|
||||
}catch (Exception e){
|
||||
log.error("auto finish order task error is {}", ExceptionUtil.getExceptionMessage(e));
|
||||
e.printStackTrace();
|
||||
|
|
|
|||
Loading…
Reference in New Issue