主订单结算 提交测试

This commit is contained in:
HH 2023-01-30 20:41:50 +08:00
parent 4d42753847
commit 0dbeb14265
6 changed files with 45 additions and 48 deletions

View File

@ -1,6 +1,5 @@
package com.ghy.order.service.impl; package com.ghy.order.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.ghy.common.adapay.AdapayErrorCode; import com.ghy.common.adapay.AdapayErrorCode;
import com.ghy.common.adapay.model.AdapayStatusEnum; import com.ghy.common.adapay.model.AdapayStatusEnum;
@ -362,7 +361,7 @@ public class OrderDetailServiceImpl implements OrderDetailService {
FinancialDetail platformFeeFD = details.get(0); FinancialDetail platformFeeFD = details.get(0);
FinancialDetail update = new FinancialDetail(); FinancialDetail update = new FinancialDetail();
update.setId(platformFeeFD.getId()); update.setId(platformFeeFD.getId());
update.setPayMoney(platformFeeFD.getPayMoney());
logger.debug("子订单[code={}]的完单流程开始", odCode); logger.debug("子订单[code={}]的完单流程开始", odCode);
// 更新订单状态 // 更新订单状态
@ -393,18 +392,19 @@ public class OrderDetailServiceImpl implements OrderDetailService {
DivMember divMember = new DivMember(memberId, AdapayUtils.bigDecimalToString(fcRecord.getChangeMoney()), true); DivMember divMember = new DivMember(memberId, AdapayUtils.bigDecimalToString(fcRecord.getChangeMoney()), true);
divMembers.add(divMember); divMembers.add(divMember);
//调用分账 //调用分账
logger.info("子订单[code={}]的[改价单]的分账信息: {}", odCode, JSON.toJSONString(divMembers)); logger.info("子订单[code={}]的[改价单]发起分账", odCode);
JSONObject response = adapayService.paymentConfirm(financialDetail.getDeptId(), fcRecord.getRemark(), JSONObject response = adapayService.paymentConfirm(financialDetail.getDeptId(), fcRecord.getRemark(),
payment.getOrderNo() + "_" + System.currentTimeMillis(), payment.getOrderNo() + "_" + System.currentTimeMillis(),
AdapayUtils.bigDecimalToString(fcRecord.getChangeMoney()), divMembers, null, null); 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("子订单[code={}]的[改价单]分账成功", odCode);
// 这是被扣掉的手续费 // 这是被扣掉的手续费 按理说这里肯定大于0
String fee_amt = response.getString("fee_amt"); String fee_amt = response.getString("fee_amt");
feeAmt = new BigDecimal(fee_amt); feeAmt = new BigDecimal(fee_amt);
if (feeAmt.compareTo(platformFeeFD.getPayMoney()) < 0 && !"0.00".equals(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); int i = financialDetailService.updateFinancialDetail(update);
compensate = i > 0; compensate = i > 0;
} else { } else {
@ -461,17 +461,16 @@ public class OrderDetailServiceImpl implements OrderDetailService {
DivMember feeDivMember = new DivMember("0", fee.toString(), true); DivMember feeDivMember = new DivMember("0", fee.toString(), true);
divMembers.add(feeDivMember); 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(), JSONObject response = adapayService.paymentConfirm(financialDetail.getDeptId(), payment.getId(), payment.getOrderNo() + "_" + System.currentTimeMillis(),
fee.add(payMoney).toString(), divMembers, null, null); fee.add(payMoney).toString(), divMembers, null, null);
logger.info("子订单[code={}]分账结果: {}", odCode, response.toJSONString());
boolean status = AdapayStatusEnum.succeeded.code.equals(response.getString("status")); boolean status = AdapayStatusEnum.succeeded.code.equals(response.getString("status"));
// 如果确认支付失败 这里抛出异常 回滚订单状态 // 如果确认支付失败 这里抛出异常 回滚订单状态
Assert.isTrue(status, response.getString("error_msg")); Assert.isTrue(status, response.getString("error_msg"));
// 待提现金额里加入子财务单金额 // 待提现金额里加入子财务单金额
dtx = dtx.add(fdPayMoney); dtx = dtx.add(fdPayMoney);
// 修改平台抽成子财务单金额 // 修改平台抽成子财务单金额
update.setPayMoney(platformFeeFD.getPayMoney().subtract(fee)); update.setPayMoney(update.getPayMoney().subtract(fee));
financialDetailService.updateFinancialDetail(update); financialDetailService.updateFinancialDetail(update);
} }
// --------------------- 子财务单分账部分 end --------------------- // --------------------- 子财务单分账部分 end ---------------------
@ -482,10 +481,10 @@ public class OrderDetailServiceImpl implements OrderDetailService {
if (BigDecimal.ZERO.compareTo(dtx) > -1) { if (BigDecimal.ZERO.compareTo(dtx) > -1) {
logger.info("子订单[code={}] 待提现金额={} 无需提现", odCode, dtx); logger.info("子订单[code={}] 待提现金额={} 无需提现", odCode, dtx);
} }
// 待提现金额
String cashAmt = AdapayUtils.bigDecimalToString(dtx);
String orderNo = AdapayUtils.createOrderNo(AdapayOrderType.DRAW_CASH);
try { try {
String orderNo = AdapayUtils.createOrderNo(AdapayOrderType.DRAW_CASH);
// 待提现金额
String cashAmt = AdapayUtils.bigDecimalToString(dtx);
JSONObject drawCashResponse = adapayService.drawCash(financialDetail.getDeptId(), orderNo, "T1", JSONObject drawCashResponse = adapayService.drawCash(financialDetail.getDeptId(), orderNo, "T1",
cashAmt, memberId, "订单结算", null); cashAmt, memberId, "订单结算", null);
boolean drawCashStatus = AdapayStatusEnum.pending.code.equals(drawCashResponse.getString("status")) || boolean drawCashStatus = AdapayStatusEnum.pending.code.equals(drawCashResponse.getString("status")) ||
@ -495,11 +494,10 @@ public class OrderDetailServiceImpl implements OrderDetailService {
logger.info("子订单[code={}]自动提现成功", odCode); logger.info("子订单[code={}]自动提现成功", odCode);
} else { } else {
// 提现失败 把信息记录到error日志里 // 提现失败 把信息记录到error日志里
logger.error("自动发起提现失败: 子订单code={}, deptId={}, memberId={}, amount={}, 失败信息: {}", odCode, logger.error("自动发起提现失败: 子订单code={}, deptId={} 失败信息: {}", odCode, cashAmt, drawCashResponse.toJSONString());
financialDetail.getDeptId(), memberId, cashAmt, drawCashResponse.toJSONString());
} }
} catch (Exception e) { } 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 --------------------- // --------------------- 自动提现流程 end ---------------------
} }

View File

@ -1,6 +1,5 @@
package com.ghy.order.service.impl; package com.ghy.order.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.ghy.common.adapay.model.AdapayStatusEnum; import com.ghy.common.adapay.model.AdapayStatusEnum;
import com.ghy.common.adapay.model.DivMember; import com.ghy.common.adapay.model.DivMember;
@ -159,6 +158,7 @@ public class OrderMasterServiceImpl implements OrderMasterService {
PaymentDTO payment = financialMasterService.selectPaymentById(financialMaster.getPaymentId()); PaymentDTO payment = financialMasterService.selectPaymentById(financialMaster.getPaymentId());
Assert.notNull(payment, String.format("主订单[id=%d]找不到支付记录", orderMasterId)); Assert.notNull(payment, String.format("主订单[id=%d]找不到支付记录", orderMasterId));
// 修改主订单状态
updateStatus(orderMasterId, OrderStatus.FINISH_CHECK.code()); updateStatus(orderMasterId, OrderStatus.FINISH_CHECK.code());
if (BigDecimal.ZERO.compareTo(financialMaster.getPayMoney()) > -1) { if (BigDecimal.ZERO.compareTo(financialMaster.getPayMoney()) > -1) {
@ -169,31 +169,30 @@ public class OrderMasterServiceImpl implements OrderMasterService {
// 用子财务单组成分账信息 // 用子财务单组成分账信息
List<FinancialDetail> financialDetails = financialDetailService.selectByFinancialMasterId(financialMaster.getId()); List<FinancialDetail> financialDetails = financialDetailService.selectByFinancialMasterId(financialMaster.getId());
// 校验金额 主财务单的金额减去所有子财务单的金额是否=0 // 确认支付总金额
BigDecimal checkMoney = financialMaster.getPayMoney(); BigDecimal confirmAmt = BigDecimal.ZERO;
// 确认支付金额 = 主财务单付款金额 - 退款金额 - 已确认金额
BigDecimal confirmAmt = financialMaster.getPayMoney();
// key:memberId(分账账户ID) value:分账金额 // key:memberId(分账账户ID) value:分账金额
HashMap<String, BigDecimal> memberMap = new HashMap<>(); HashMap<String, BigDecimal> memberMap = new HashMap<>();
for (FinancialDetail financialDetail : financialDetails) { for (FinancialDetail financialDetail : financialDetails) {
checkMoney = checkMoney.subtract(financialDetail.getPayMoney());
String memberId; String memberId;
switch (financialDetail.getFinancialDetailType()) { switch (financialDetail.getFinancialDetailType()) {
case 0: case 0:
// 上门师傅的财务单单独确认分账了 不在这里分 // 上门师傅的财务单单独确认分账了 不在这里分
// 减掉已确认金额
confirmAmt = confirmAmt.subtract(financialDetail.getPayMoney());
break; break;
case 1: case 1:
// 大师傅/店铺提成 // 大师傅/店铺提成
memberId = AdapayUtils.getWorkerMemberId(financialDetail.getPayeeId(), orderMaster.getDeptId()); memberId = AdapayUtils.getWorkerMemberId(financialDetail.getPayeeId(), orderMaster.getDeptId());
memberMap.merge(memberId, financialDetail.getPayMoney(), BigDecimal::add); memberMap.merge(memberId, financialDetail.getPayMoney(), BigDecimal::add);
confirmAmt = confirmAmt.add(financialDetail.getPayMoney());
break; break;
case 2: case 2:
// 平台提成 并且是手续费承担方 // 平台提成 并且是手续费承担方
case 5:
// 订单超时罚金 归平台所有
memberMap.merge("0", financialDetail.getPayMoney(), BigDecimal::add); memberMap.merge("0", financialDetail.getPayMoney(), BigDecimal::add);
confirmAmt = confirmAmt.add(financialDetail.getPayMoney());
break; break;
case 3: case 3:
// 分销 // 分销
@ -206,44 +205,33 @@ public class OrderMasterServiceImpl implements OrderMasterService {
// 如果没有分销人 那这笔钱就分到平台账户 // 如果没有分销人 那这笔钱就分到平台账户
memberMap.merge("0", financialDetail.getPayMoney(), BigDecimal::add); memberMap.merge("0", financialDetail.getPayMoney(), BigDecimal::add);
} }
confirmAmt = confirmAmt.add(financialDetail.getPayMoney());
break; break;
case 4: case 4:
// 减掉退款金额 // 退款金额
confirmAmt = confirmAmt.subtract(financialDetail.getPayMoney());
case 5:
// 订单超时罚金 归平台所有
memberMap.merge("0", financialDetail.getPayMoney(), BigDecimal::add);
break; break;
default: default:
break; break;
} }
} }
// 这里校验一次主财务单的金额减去所有子财务单的金额是否=0
Assert.isTrue(BigDecimal.ZERO.compareTo(checkMoney) == 0, "订单金额异常,请稍后再试");
// 分账账户 // 分账账户
ArrayList<DivMember> divMembers = new ArrayList<>(); ArrayList<DivMember> divMembers = new ArrayList<>();
// 需要自动提现的账户
ArrayList<DivMember> autoDrawCashMembers = new ArrayList<>();
for (Map.Entry<String, BigDecimal> entry : memberMap.entrySet()) { for (Map.Entry<String, BigDecimal> entry : memberMap.entrySet()) {
String memberId = entry.getKey(); String memberId = entry.getKey();
BigDecimal money = entry.getValue(); BigDecimal money = entry.getValue();
String amount = AdapayUtils.bigDecimalToString(money); String amount = AdapayUtils.bigDecimalToString(money);
if ("0".equals(memberId)) { if ("0".equals(memberId)) {
// 0是平台账户 只参与分账 不自动提现 // 0是平台账户 承担手续费
divMembers.add(new DivMember("0", amount, true)); divMembers.add(new DivMember("0", amount, true));
} else { } else {
DivMember member = new DivMember(memberId, amount, false); divMembers.add(new DivMember(memberId, amount, false));
divMembers.add(member);
autoDrawCashMembers.add(member);
} }
} }
logger.info("订单[code={}]分账信息: {}", orderMaster.getCode(), JSON.toJSONString(divMembers)); logger.info("订单[code={}]发起分账", orderMaster.getCode());
JSONObject response = adapayService.paymentConfirm(orderMaster.getDeptId(), payment.getId(), payment.getOrderNo(), JSONObject response = adapayService.paymentConfirm(orderMaster.getDeptId(), payment.getId(), payment.getOrderNo(),
AdapayUtils.bigDecimalToString(confirmAmt), divMembers, null, null); AdapayUtils.bigDecimalToString(confirmAmt), divMembers, null, null);
logger.info("订单[code={}]分账结果: {}", orderMaster.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"));
@ -252,8 +240,12 @@ public class OrderMasterServiceImpl implements OrderMasterService {
// 走到这里确认支付和分账都成功了 异步进入自动提现流程 // 走到这里确认支付和分账都成功了 异步进入自动提现流程
logger.info("订单[code={}]开始自动提现", orderMaster.getCode()); logger.info("订单[code={}]开始自动提现", orderMaster.getCode());
autoDrawCashMembers.forEach(member -> executor.execute(() -> { divMembers.forEach(member -> executor.execute(() -> {
String memberId = member.getMemberId(); String memberId = member.getMemberId();
if ("0".equals(member.getMemberId())) {
// 平台的钱不用自动提现
return;
}
String amount = member.getAmount(); String amount = member.getAmount();
try { try {
drawCash(orderMaster.getDeptId(), memberId, amount); drawCash(orderMaster.getDeptId(), memberId, amount);

View File

@ -100,7 +100,10 @@ public class AdapayService {
confirmParams.put("div_members", divMembers); confirmParams.put("div_members", divMembers);
confirmParams.put("fee_mode", feeMode); confirmParams.put("fee_mode", feeMode);
confirmParams.put("description", description); 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("notify_url", adapayProperties.getNotifyUrl());
cashParam.put("remark", remark); cashParam.put("remark", remark);
cashParam.put("fee_mode", feeMode); cashParam.put("fee_mode", feeMode);
logger.info("发起提现 dept[{}] param:{}", deptId, cashParam.toJSONString());
JSONObject response = (JSONObject) Drawcash.create(cashParam, deptId.toString()); JSONObject response = (JSONObject) Drawcash.create(cashParam, deptId.toString());
logger.info("提现结果 dept[{}] response:{}", deptId, response.toJSONString());
drawCashCallbackService.onResponse(response); drawCashCallbackService.onResponse(response);
return response; return response;
} }

View File

@ -6,6 +6,6 @@ public interface OrderService {
void overTimeOrder(String orderStatus); void overTimeOrder(String orderStatus);
// 自动完成和分账 // 自动完成和分账
void finishOrder(); void autoFinishOrder();
} }

View File

@ -134,25 +134,27 @@ public class OrderServiceImpl implements OrderService {
@Override @Override
public void finishOrder() { public void autoFinishOrder() {
// 子订单自动完单
// 查询出"待确认"状态的子订单 // 查询出"待确认"状态的子订单
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 - (60 * 60 * 1000L); // long day14ago = now - (60 * 60 * 1000L);
long day14ago = now - 10000L; long day14ago = now - 10000L;
for (OrderDetail orderDetail : orderDetails) { for (OrderDetail orderDetail : orderDetails) {
// 查询符合自动确认的订单 // 筛选符合自动确认的订单
if (day14ago > orderDetail.getUpdateTime().getTime()) { if (day14ago > orderDetail.getUpdateTime().getTime()) {
logger.info("订单自动完成[id={}, code={}]", orderDetail.getId(), orderDetail.getCode()); logger.info("订单自动完成[id={}, code={}]", orderDetail.getId(), orderDetail.getCode());
try { try {
// 完单流程(分账与提现) // 子订单完单流程(分账与提现)
orderDetailService.finish(orderDetail.getId()); orderDetailService.finish(orderDetail.getId());
} catch (Exception 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(); List<OrderMaster> orderMasters = orderMasterService.selectUnfinished();
for (OrderMaster om : orderMasters) { for (OrderMaster om : orderMasters) {
try { try {
@ -167,7 +169,7 @@ public class OrderServiceImpl implements OrderService {
} }
// 如果已经不存在"已完成""已取消"以外的子订单 就把主订单也改为完成 // 如果已经不存在"已完成""已取消"以外的子订单 就把主订单也改为完成
if (allFinish) { if (allFinish) {
logger.info("主订单可以完成了[id={} code={}]", om.getId(), om.getCode()); logger.info("主订单自动完成[id={} code={}]", om.getId(), om.getCode());
orderMasterService.finish(om.getId()); orderMasterService.finish(om.getId());
} }
} catch (Exception e) { } catch (Exception e) {

View File

@ -30,7 +30,7 @@ public class OrderTask {
* */ * */
public void finishOrder(){ public void finishOrder(){
try { try {
orderService.finishOrder(); orderService.autoFinishOrder();
}catch (Exception e){ }catch (Exception e){
log.error("auto finish order task error is {}", ExceptionUtil.getExceptionMessage(e)); log.error("auto finish order task error is {}", ExceptionUtil.getExceptionMessage(e));
e.printStackTrace(); e.printStackTrace();