mirror of
https://codeup.aliyun.com/67c68d4e484ca2f0a13ac3c1/ydc/jsowell-charger-web.git
synced 2026-06-13 11:49:49 +08:00
交易分账 重构
This commit is contained in:
@@ -36,10 +36,10 @@ spring:
|
|||||||
druid:
|
druid:
|
||||||
# 主库数据源
|
# 主库数据源
|
||||||
master:
|
master:
|
||||||
#url: jdbc:mysql://192.168.2.2:3306/jsowell_dev?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
|
url: jdbc:mysql://192.168.2.2:3306/jsowell_dev?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
|
||||||
#username: jsowell_dev
|
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
|
#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
|
#username: jsowell_prd_copy
|
||||||
password: 123456
|
password: 123456
|
||||||
# 从库数据源
|
# 从库数据源
|
||||||
slave:
|
slave:
|
||||||
|
|||||||
@@ -288,9 +288,54 @@ public class SpringBootTestController {
|
|||||||
@Test
|
@Test
|
||||||
public void testCalculateTheBalanceDeductionAmount() {
|
public void testCalculateTheBalanceDeductionAmount() {
|
||||||
String memberId = "123456";
|
String memberId = "123456";
|
||||||
BigDecimal amount = new BigDecimal("99.9");
|
BigDecimal amount = new BigDecimal("20");
|
||||||
List<BalanceDeductionAmountVO> list = orderBasicInfoService.calculateTheBalanceDeductionAmount(memberId, amount);
|
|
||||||
System.out.println(JSON.toJSONString(list));
|
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
|
@Test
|
||||||
|
|||||||
@@ -38,9 +38,9 @@ public interface OrderPayRecordMapper {
|
|||||||
|
|
||||||
int insertOrUpdateSelective(OrderPayRecord record);
|
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);
|
List<OrderPayRecord> getOrderPayRecordList(@Param("orderCode") String orderCode);
|
||||||
}
|
}
|
||||||
@@ -20,6 +20,12 @@ public interface MemberAdapayRecordService{
|
|||||||
|
|
||||||
int insertOrUpdateSelective(MemberAdapayRecord record);
|
int insertOrUpdateSelective(MemberAdapayRecord record);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询会员的汇付支付记录
|
||||||
|
* @param memberId 会员id
|
||||||
|
* @param scenarioType 场景类型 订单/余额
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
List<MemberAdapayRecord> selectAdapayRecordList(String memberId, String scenarioType);
|
List<MemberAdapayRecord> selectAdapayRecordList(String memberId, String scenarioType);
|
||||||
|
|
||||||
MemberAdapayRecord selectByPaymentId(String paymentId);
|
MemberAdapayRecord selectByPaymentId(String paymentId);
|
||||||
|
|||||||
@@ -818,12 +818,22 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
|
|||||||
private void freezeAmount(OrderBasicInfo orderBasicInfo) {
|
private void freezeAmount(OrderBasicInfo orderBasicInfo) {
|
||||||
String orderCode = orderBasicInfo.getOrderCode();
|
String orderCode = orderBasicInfo.getOrderCode();
|
||||||
// 查询这笔订单的支付id/查询该笔订单的支付交易回调
|
// 查询这笔订单的支付id/查询该笔订单的支付交易回调
|
||||||
AdapayCallbackRecord adapayCallbackRecord = selectAdapayCallbackRecord(orderCode);
|
|
||||||
String paymentId = adapayCallbackRecord.getPaymentId();
|
// 根据订单编号,查询订单支付记录,一般在线支付只有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());
|
memberAdapayRecordService.updateFreezeAmount(paymentId, orderBasicInfo.getSettleAmount());
|
||||||
|
}
|
||||||
|
|
||||||
// 订单支付记录,保存一下消费记录 deduction_record
|
// 订单支付记录,保存一下消费记录 deduction_record
|
||||||
List<OrderPayRecord> orderPayRecordList = orderPayRecordService.getOrderPayRecordList(orderCode);
|
|
||||||
if (CollectionUtils.isNotEmpty(orderPayRecordList)) {
|
if (CollectionUtils.isNotEmpty(orderPayRecordList)) {
|
||||||
//
|
//
|
||||||
}
|
}
|
||||||
@@ -1335,33 +1345,25 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
|
|||||||
BigDecimal balanceAmt = memberAdapayRecord.getBalanceAmt();
|
BigDecimal balanceAmt = memberAdapayRecord.getBalanceAmt();
|
||||||
// 该笔支付扣除金额
|
// 该笔支付扣除金额
|
||||||
BigDecimal deductionAmount;
|
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);
|
tempAmount = tempAmount.subtract(balanceAmt);
|
||||||
if (tempAmount.compareTo(BigDecimal.ZERO) >= 0) {
|
if (tempAmount.compareTo(BigDecimal.ZERO) >= 0) {
|
||||||
// 计算以后,大于等于0,说明这笔支付剩余金额需要扣完
|
// 计算以后,大于等于0,说明这笔支付剩余金额需要扣完,还要继续扣下一笔
|
||||||
deductionAmount = balanceAmt;
|
deductionAmount = balanceAmt;
|
||||||
BalanceDeductionAmountVO build = BalanceDeductionAmountVO.builder()
|
BalanceDeductionAmountVO build = BalanceDeductionAmountVO.builder()
|
||||||
.memberId(memberId)
|
.memberId(memberId)
|
||||||
.paymentId(memberAdapayRecord.getPaymentId())
|
.paymentId(memberAdapayRecord.getPaymentId())
|
||||||
.deductionAmount(deductionAmount)
|
.deductionAmount(deductionAmount)
|
||||||
.delayMode(payMode)
|
|
||||||
.build();
|
.build();
|
||||||
resultList.add(build);
|
resultList.add(build);
|
||||||
} else {
|
} else {
|
||||||
// 如果小于0,则说明剩余的钱用不完,扣除金额等于消费金额,并结束循环
|
// 如果小于0,则说明该笔交易的剩余金额用不完,扣除金额等于临时消费金额,并结束循环
|
||||||
deductionAmount = balanceAmt.add(tempAmount);
|
deductionAmount = balanceAmt.add(tempAmount); // 该笔交易的剩余金额加上一个负数临时消费金额,就是该笔交易扣除金额
|
||||||
BalanceDeductionAmountVO build = BalanceDeductionAmountVO.builder()
|
BalanceDeductionAmountVO build = BalanceDeductionAmountVO.builder()
|
||||||
.memberId(memberId)
|
.memberId(memberId)
|
||||||
.paymentId(memberAdapayRecord.getPaymentId())
|
.paymentId(memberAdapayRecord.getPaymentId())
|
||||||
.deductionAmount(deductionAmount)
|
.deductionAmount(deductionAmount)
|
||||||
.delayMode(payMode)
|
|
||||||
.build();
|
.build();
|
||||||
resultList.add(build);
|
resultList.add(build);
|
||||||
break;
|
break;
|
||||||
@@ -3036,6 +3038,11 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
|
|||||||
.build();
|
.build();
|
||||||
memberBasicInfoService.updateMemberBalance(updateMemberBalanceDTO);
|
memberBasicInfoService.updateMemberBalance(updateMemberBalanceDTO);
|
||||||
|
|
||||||
|
// 查询余额充值有剩余的记录
|
||||||
|
List<BalanceDeductionAmountVO> list = calculateTheBalanceDeductionAmount(dto.getMemberId(), chargeAmount);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// 记录流水
|
// 记录流水
|
||||||
if (principalPay != null) {
|
if (principalPay != null) {
|
||||||
payRecordList.add(OrderPayRecord.builder()
|
payRecordList.add(OrderPayRecord.builder()
|
||||||
|
|||||||
@@ -24,10 +24,4 @@ public class BalanceDeductionAmountVO {
|
|||||||
* 扣除金额
|
* 扣除金额
|
||||||
*/
|
*/
|
||||||
private BigDecimal deductionAmount;
|
private BigDecimal deductionAmount;
|
||||||
|
|
||||||
/**
|
|
||||||
* 该笔支付单的分账方式
|
|
||||||
* delay表示延时分账,其他情况表示实时分账
|
|
||||||
*/
|
|
||||||
private String delayMode;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -396,18 +396,6 @@
|
|||||||
</trim>
|
</trim>
|
||||||
</insert>
|
</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 id="getOrderPayRecordList" resultMap="BaseResultMap">
|
||||||
select
|
select
|
||||||
<include refid="Base_Column_List" />
|
<include refid="Base_Column_List" />
|
||||||
|
|||||||
Reference in New Issue
Block a user