mirror of
https://codeup.aliyun.com/67c68d4e484ca2f0a13ac3c1/ydc/jsowell-charger-web.git
synced 2026-07-09 00:18:07 +08:00
update 重新计算分账扣除金额
This commit is contained in:
@@ -42,5 +42,19 @@ public interface MemberAdapayRecordMapper {
|
|||||||
|
|
||||||
MemberAdapayRecord selectByPaymentId(@Param("paymentId") String paymentId);
|
MemberAdapayRecord selectByPaymentId(@Param("paymentId") String paymentId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询可用余额的充值记录
|
||||||
|
* 用于支付订单/余额退款场景
|
||||||
|
* @param memberId 会员id
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
List<MemberAdapayRecord> selectAvailableBalance(@Param("memberId") String memberId);
|
List<MemberAdapayRecord> selectAvailableBalance(@Param("memberId") String memberId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查询存在冻结金额的充值记录
|
||||||
|
* 用于订单分账的场景
|
||||||
|
* @param memberId 会员id
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
List<MemberAdapayRecord> selectAvailableFreeze(@Param("memberId") String memberId);
|
||||||
}
|
}
|
||||||
@@ -49,4 +49,6 @@ public interface MemberAdapayRecordService{
|
|||||||
void updateFreezeAmount(String paymentId, BigDecimal amount);
|
void updateFreezeAmount(String paymentId, BigDecimal amount);
|
||||||
|
|
||||||
void commonUpdateAmountMethod(String paymentId, BigDecimal SpendAmount, BigDecimal RefundAmount, BigDecimal freezeAmount);
|
void commonUpdateAmountMethod(String paymentId, BigDecimal SpendAmount, BigDecimal RefundAmount, BigDecimal freezeAmount);
|
||||||
|
|
||||||
|
List<MemberAdapayRecord> selectAvailableFreeze(String memberId);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -201,4 +201,9 @@ public class MemberAdapayRecordServiceImpl implements MemberAdapayRecordService
|
|||||||
log.error("更新MemberAdapayRecord金额error", e);
|
log.error("更新MemberAdapayRecord金额error", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<MemberAdapayRecord> selectAvailableFreeze(String memberId) {
|
||||||
|
return memberAdapayRecordMapper.selectAvailableFreeze(memberId);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1382,7 +1382,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
|
|||||||
String status = null; // 状态
|
String status = null; // 状态
|
||||||
|
|
||||||
// 获取余额支付扣除金额 也许存在一笔不够扣,需要扣多笔的情况
|
// 获取余额支付扣除金额 也许存在一笔不够扣,需要扣多笔的情况
|
||||||
List<BalanceDeductionAmountVO> list = calculateTheBalanceDeductionAmount(orderBasicInfo.getMemberId(), settleAmount);
|
List<BalanceDeductionAmountVO> list = calculateSplitTheBillAmount(orderBasicInfo.getMemberId(), settleAmount);
|
||||||
for (BalanceDeductionAmountVO vo : list) {
|
for (BalanceDeductionAmountVO vo : list) {
|
||||||
String paymentId = vo.getPaymentId();
|
String paymentId = vo.getPaymentId();
|
||||||
BigDecimal deductionAmount = vo.getDeductionAmount();
|
BigDecimal deductionAmount = vo.getDeductionAmount();
|
||||||
@@ -1415,6 +1415,47 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 计算分账扣除金额
|
||||||
|
*/
|
||||||
|
public List<BalanceDeductionAmountVO> calculateSplitTheBillAmount(String memberId, BigDecimal amount) {
|
||||||
|
List<BalanceDeductionAmountVO> resultList = Lists.newArrayList();
|
||||||
|
// 查询会员的余额充值记录 按照充值时间正序
|
||||||
|
// List<MemberAdapayRecord> memberAdapayRecords = memberAdapayRecordService.selectAvailableBalance(memberId);
|
||||||
|
List<MemberAdapayRecord> memberAdapayRecords = memberAdapayRecordService.selectAvailableFreeze(memberId);
|
||||||
|
// 定义一个临时金额等于消费金额
|
||||||
|
BigDecimal tempAmount = new BigDecimal(amount.toString());
|
||||||
|
for (MemberAdapayRecord memberAdapayRecord : memberAdapayRecords) {
|
||||||
|
// 该笔支付冻结金额 取出一笔判断是否冻结金额够分账
|
||||||
|
BigDecimal freezeAmt = memberAdapayRecord.getFreezeAmt();
|
||||||
|
// 该笔支付扣除金额
|
||||||
|
BigDecimal deductionAmount;
|
||||||
|
|
||||||
|
// 临时消费金额 = 临时消费金额 - 该笔交易的剩余金额
|
||||||
|
tempAmount = tempAmount.subtract(freezeAmt);
|
||||||
|
if (tempAmount.compareTo(BigDecimal.ZERO) >= 0) {
|
||||||
|
// 计算以后,大于等于0,说明这笔支付剩余金额需要扣完,还要继续扣下一笔
|
||||||
|
deductionAmount = freezeAmt;
|
||||||
|
BalanceDeductionAmountVO build = BalanceDeductionAmountVO.builder()
|
||||||
|
.memberId(memberId)
|
||||||
|
.paymentId(memberAdapayRecord.getPaymentId())
|
||||||
|
.deductionAmount(deductionAmount)
|
||||||
|
.build();
|
||||||
|
resultList.add(build);
|
||||||
|
} else {
|
||||||
|
// 如果小于0,则说明该笔交易的剩余金额用不完,扣除金额等于临时消费金额,并结束循环
|
||||||
|
deductionAmount = freezeAmt.add(tempAmount); // 该笔交易的剩余金额加上一个负数临时消费金额,就是该笔交易扣除金额
|
||||||
|
BalanceDeductionAmountVO build = BalanceDeductionAmountVO.builder()
|
||||||
|
.memberId(memberId)
|
||||||
|
.paymentId(memberAdapayRecord.getPaymentId())
|
||||||
|
.deductionAmount(deductionAmount)
|
||||||
|
.build();
|
||||||
|
resultList.add(build);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return resultList;
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* 计算余额扣除金额
|
* 计算余额扣除金额
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -509,4 +509,14 @@
|
|||||||
and balance_amt > '0.00'
|
and balance_amt > '0.00'
|
||||||
and member_id = #{memberId,jdbcType=VARCHAR}
|
and member_id = #{memberId,jdbcType=VARCHAR}
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
|
<select id="selectAvailableFreeze" resultMap="BaseResultMap">
|
||||||
|
select
|
||||||
|
<include refid="Base_Column_List" />
|
||||||
|
from member_adapay_record
|
||||||
|
where del_flag = '0'
|
||||||
|
and scenario_type = 'balance'
|
||||||
|
and freeze_amt > '0.00'
|
||||||
|
and member_id = #{memberId,jdbcType=VARCHAR}
|
||||||
|
</select>
|
||||||
</mapper>
|
</mapper>
|
||||||
Reference in New Issue
Block a user