交易分账 重构

This commit is contained in:
2023-08-28 16:49:48 +08:00
parent e4d3d481da
commit 2f1900e65b
7 changed files with 84 additions and 44 deletions

View File

@@ -36,10 +36,10 @@ spring:
druid:
# 主库数据源
master:
#url: jdbc:mysql://192.168.2.2:3306/jsowell_dev?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
#username: jsowell_dev
url: jdbc:mysql://192.168.2.2:3306/jsowell_prd_copy?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: jsowell_prd_copy
url: jdbc:mysql://192.168.2.2:3306/jsowell_dev?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: jsowell_dev
#url: jdbc:mysql://192.168.2.2:3306/jsowell_prd_copy?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
#username: jsowell_prd_copy
password: 123456
# 从库数据源
slave:

View File

@@ -288,9 +288,54 @@ public class SpringBootTestController {
@Test
public void testCalculateTheBalanceDeductionAmount() {
String memberId = "123456";
BigDecimal amount = new BigDecimal("99.9");
List<BalanceDeductionAmountVO> list = orderBasicInfoService.calculateTheBalanceDeductionAmount(memberId, amount);
System.out.println(JSON.toJSONString(list));
BigDecimal amount = new BigDecimal("20");
List<BalanceDeductionAmountVO> resultList = Lists.newArrayList();
// 查询会员的余额充值记录 按照充值时间正序
List<MemberAdapayRecord> memberAdapayRecords = Lists.newArrayList();
memberAdapayRecords.add(MemberAdapayRecord.builder().paymentId("1").balanceAmt(new BigDecimal("50")).build());
memberAdapayRecords.add(MemberAdapayRecord.builder().paymentId("2").balanceAmt(new BigDecimal("60")).build());
memberAdapayRecords.add(MemberAdapayRecord.builder().paymentId("3").balanceAmt(new BigDecimal("10")).build());
// 定义一个临时金额等于消费金额
BigDecimal tempAmount = new BigDecimal(amount.toString());
for (MemberAdapayRecord memberAdapayRecord : memberAdapayRecords) {
// 该笔支付剩余金额 取出一笔判断是否剩余金额够支付订单消费吗
BigDecimal balanceAmt = memberAdapayRecord.getBalanceAmt();
// 该笔支付扣除金额
BigDecimal deductionAmount;
// 获取延时分账模式 延时分账的使用撤销方法退款,实时分账的使用退款方法
// AdapayCallbackRecord callbackRecord = adapayCallbackRecordService.selectByPaymentId(memberAdapayRecord.getPaymentId());
// String payMode = null;
// if (callbackRecord != null) {
// JSONObject expendJsonObject = JSON.parseObject(callbackRecord.getExpend());
// payMode = expendJsonObject.getString("payMode");
// }
// 消费金额 - 剩余金额
tempAmount = tempAmount.subtract(balanceAmt);
if (tempAmount.compareTo(BigDecimal.ZERO) >= 0) {
// 计算以后大于等于0说明这笔支付剩余金额需要扣完
deductionAmount = balanceAmt;
BalanceDeductionAmountVO build = BalanceDeductionAmountVO.builder()
.memberId(memberId)
.paymentId(memberAdapayRecord.getPaymentId())
.deductionAmount(deductionAmount)
.build();
resultList.add(build);
} else {
// 如果小于0则说明剩余的钱用不完扣除金额等于消费金额并结束循环
deductionAmount = balanceAmt.add(tempAmount);
BalanceDeductionAmountVO build = BalanceDeductionAmountVO.builder()
.memberId(memberId)
.paymentId(memberAdapayRecord.getPaymentId())
.deductionAmount(deductionAmount)
.build();
resultList.add(build);
break;
}
}
System.out.println(JSON.toJSONString(resultList));
}
@Test

View File

@@ -38,9 +38,9 @@ public interface OrderPayRecordMapper {
int insertOrUpdateSelective(OrderPayRecord record);
int deleteByPrimaryKey(Integer id);
// int deleteByPrimaryKey(Integer id);
int updateByPrimaryKey(OrderPayRecord record);
// int updateByPrimaryKey(OrderPayRecord record);
List<OrderPayRecord> getOrderPayRecordList(@Param("orderCode") String orderCode);
}

View File

@@ -20,6 +20,12 @@ public interface MemberAdapayRecordService{
int insertOrUpdateSelective(MemberAdapayRecord record);
/**
* 查询会员的汇付支付记录
* @param memberId 会员id
* @param scenarioType 场景类型 订单/余额
* @return
*/
List<MemberAdapayRecord> selectAdapayRecordList(String memberId, String scenarioType);
MemberAdapayRecord selectByPaymentId(String paymentId);

View File

@@ -818,12 +818,22 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
private void freezeAmount(OrderBasicInfo orderBasicInfo) {
String orderCode = orderBasicInfo.getOrderCode();
// 查询这笔订单的支付id/查询该笔订单的支付交易回调
AdapayCallbackRecord adapayCallbackRecord = selectAdapayCallbackRecord(orderCode);
String paymentId = adapayCallbackRecord.getPaymentId();
memberAdapayRecordService.updateFreezeAmount(paymentId, orderBasicInfo.getSettleAmount());
// 根据订单编号查询订单支付记录一般在线支付只有1条余额支付可能有多条
List<OrderPayRecord> orderPayRecordList = orderPayRecordService.getOrderPayRecordList(orderCode);
// 需要根据订单消费的金额计算一下每个paymentId需要冻结多少钱
for (OrderPayRecord record : orderPayRecordList) {
// 支付的信息json字符串包含paymentId和支付金额
String deductionRecord = record.getDeductionRecord();
JSONObject jsonObject = JSON.parseObject(deductionRecord);
String paymentId = jsonObject.getString("paymentId");
// 更新member_adapay_record 中的冻结金额
memberAdapayRecordService.updateFreezeAmount(paymentId, orderBasicInfo.getSettleAmount());
}
// 订单支付记录,保存一下消费记录 deduction_record
List<OrderPayRecord> orderPayRecordList = orderPayRecordService.getOrderPayRecordList(orderCode);
if (CollectionUtils.isNotEmpty(orderPayRecordList)) {
//
}
@@ -1335,33 +1345,25 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
BigDecimal balanceAmt = memberAdapayRecord.getBalanceAmt();
// 该笔支付扣除金额
BigDecimal deductionAmount;
// 获取延时分账模式 延时分账的使用撤销方法退款,实时分账的使用退款方法
AdapayCallbackRecord callbackRecord = adapayCallbackRecordService.selectByPaymentId(memberAdapayRecord.getPaymentId());
String payMode = null;
if (callbackRecord != null) {
JSONObject expendJsonObject = JSON.parseObject(callbackRecord.getExpend());
payMode = expendJsonObject.getString("payMode");
}
// 消费金额 - 剩余金额
// 临时消费金额 = 临时消费金额 - 该笔交易的剩余金额
tempAmount = tempAmount.subtract(balanceAmt);
if (tempAmount.compareTo(BigDecimal.ZERO) >= 0) {
// 计算以后大于等于0说明这笔支付剩余金额需要扣完
// 计算以后大于等于0说明这笔支付剩余金额需要扣完,还要继续扣下一笔
deductionAmount = balanceAmt;
BalanceDeductionAmountVO build = BalanceDeductionAmountVO.builder()
.memberId(memberId)
.paymentId(memberAdapayRecord.getPaymentId())
.deductionAmount(deductionAmount)
.delayMode(payMode)
.build();
resultList.add(build);
} else {
// 如果小于0则说明剩余的钱用不完,扣除金额等于消费金额,并结束循环
deductionAmount = balanceAmt.add(tempAmount);
// 如果小于0则说明该笔交易的剩余金额用不完,扣除金额等于临时消费金额,并结束循环
deductionAmount = balanceAmt.add(tempAmount); // 该笔交易的剩余金额加上一个负数临时消费金额,就是该笔交易扣除金额
BalanceDeductionAmountVO build = BalanceDeductionAmountVO.builder()
.memberId(memberId)
.paymentId(memberAdapayRecord.getPaymentId())
.deductionAmount(deductionAmount)
.delayMode(payMode)
.build();
resultList.add(build);
break;
@@ -3036,6 +3038,11 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
.build();
memberBasicInfoService.updateMemberBalance(updateMemberBalanceDTO);
// 查询余额充值有剩余的记录
List<BalanceDeductionAmountVO> list = calculateTheBalanceDeductionAmount(dto.getMemberId(), chargeAmount);
// 记录流水
if (principalPay != null) {
payRecordList.add(OrderPayRecord.builder()

View File

@@ -24,10 +24,4 @@ public class BalanceDeductionAmountVO {
* 扣除金额
*/
private BigDecimal deductionAmount;
/**
* 该笔支付单的分账方式
* delay表示延时分账其他情况表示实时分账
*/
private String delayMode;
}

View File

@@ -396,18 +396,6 @@
</trim>
</insert>
<insert id="batchInsert">
insert into order_pay_record
(order_code, pay_mode, pay_amount, acquirer, create_by)
values
<foreach collection="payRecordList" item="item" separator=",">
(
#{item.orderCode,jdbcType=VARCHAR}, #{item.payMode,jdbcType=VARCHAR}, #{item.payAmount,jdbcType=DECIMAL},
#{item.acquirer,jdbcType=VARCHAR}, #{item.createBy,jdbcType=VARCHAR}
)
</foreach>
</insert>
<select id="getOrderPayRecordList" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />