计算余额扣除金额

This commit is contained in:
2023-08-11 11:04:28 +08:00
parent 174c1a7ce8
commit 6a2ea94ba4
7 changed files with 102 additions and 15 deletions

View File

@@ -43,6 +43,7 @@ import com.jsowell.pile.mapper.PileBillingTemplateMapper;
import com.jsowell.pile.service.*;
import com.jsowell.pile.vo.base.PileInfoVO;
import com.jsowell.pile.vo.uniapp.MemberVO;
import com.jsowell.pile.vo.web.BalanceDeductionAmountVO;
import com.jsowell.pile.vo.web.BillingTemplateVO;
import com.jsowell.pile.vo.web.OrderListVO;
import com.jsowell.pile.vo.web.PileDetailVO;
@@ -192,6 +193,14 @@ public class SpringBootTestController {
@Autowired
private OrderPileOccupyService orderPileOccupyService;
@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));
}
@Test
public void testGenerateOccupyPileOrder() {
String memberId = "67569684";

View File

@@ -41,4 +41,6 @@ public interface MemberAdapayRecordMapper {
List<MemberAdapayRecord> selectAdapayRecordList(@Param("memberId") String memberId, @Param("scenarioType") String scenarioType);
MemberAdapayRecord selectByPaymentId(@Param("paymentId") String paymentId);
List<MemberAdapayRecord> selectAvailableBalance(@Param("memberId") String memberId);
}

View File

@@ -16,11 +16,13 @@ import com.jsowell.pile.vo.lianlian.AccumulativeInfoVO;
import com.jsowell.pile.vo.uniapp.OrderVO;
import com.jsowell.pile.vo.uniapp.PersonPileConnectorSumInfoVO;
import com.jsowell.pile.vo.uniapp.SendMessageVO;
import com.jsowell.pile.vo.web.BalanceDeductionAmountVO;
import com.jsowell.pile.vo.web.IndexOrderInfoVO;
import com.jsowell.pile.vo.web.OrderListVO;
import com.jsowell.pile.vo.web.OrderTotalDataVO;
import com.jsowell.wxpay.response.WechatPayRefundResponse;
import java.math.BigDecimal;
import java.text.ParseException;
import java.time.LocalDateTime;
import java.util.List;
@@ -150,7 +152,9 @@ public interface IOrderBasicInfoService {
void tempOrderSplittingOperations(String merchantId, String tradeDate);
/**
List<BalanceDeductionAmountVO> calculateTheBalanceDeductionAmount(String memberId, BigDecimal amount);
/**
* 执行订单分账
* @param orderBasicInfo
* @param adapayMemberAccount

View File

@@ -22,4 +22,10 @@ public interface MemberAdapayRecordService{
List<MemberAdapayRecord> selectAdapayRecordList(String memberId, String scenarioType);
MemberAdapayRecord selectByPaymentId(String paymentId);
/**
* 查询会员可用余额充值记录
* @param memberId 会员id
*/
List<MemberAdapayRecord> selectAvailableBalance(String memberId);
}

View File

@@ -64,4 +64,14 @@ public class MemberAdapayRecordServiceImpl implements MemberAdapayRecordService{
return memberAdapayRecordMapper.selectByPaymentId(paymentId);
}
/**
* 查询会员可用余额充值记录
* @param memberId 会员id
* @return
*/
@Override
public List<MemberAdapayRecord> selectAvailableBalance(String memberId) {
return memberAdapayRecordMapper.selectAvailableBalance(memberId);
}
}

View File

@@ -187,6 +187,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
/**
* 查询订单列表
* 带权限过滤
*
* @param dto 订单
* @return 订单
*/
@@ -206,6 +207,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
/**
* 查询订单列表
* 无权限过滤
*
* @param dto 订单
* @return 订单
*/
@@ -430,6 +432,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
/**
* 关闭启动失败订单
*
* @param startTime
* @param endTime
*/
@@ -572,6 +575,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
/**
* 通过交易流水号查询订单信息
*
* @param transactionCode 交易流水号
* @return 订单信息
*/
@@ -801,6 +805,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
/**
* 解锁vin状态
*
* @param vinCode
*/
private void vinStatusUnlocked(String vinCode) {
@@ -817,8 +822,9 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
/**
* 订单退款逻辑
*
* @param orderBasicInfo 订单信息
* @param residue 需退款金额
* @param residue 需退款金额
*/
private void refundOrder(OrderBasicInfo orderBasicInfo, BigDecimal residue) {
String orderCode = orderBasicInfo.getOrderCode();
@@ -1086,6 +1092,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
/**
* 余额支付订单,使用余额支付转账
*
* @param orderBasicInfo
* @param adapayMemberAccount
* @return
@@ -1118,6 +1125,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
/**
* 余额支付订单,使用余额支付转账
*
* @param orderBasicInfo
* @param adapayMemberAccount
* @return
@@ -1144,11 +1152,13 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
status = paymentConfirmResponse.getStatus();
description = paymentConfirmResponse.getDescription();
}
// 更新这笔交易的剩余金额
MemberAdapayRecord record = memberAdapayRecordService.selectByPaymentId(paymentId);
// 更新此笔交易单的消费金额 = 历史消费金额 + 本次消费金额
record.setSpendAmt(record.getSpendAmt().add(deductionAmount));
// 更新此笔交易单的剩余金额 = 历史剩余金额 - 本次消费金额
record.setBalanceAmt(record.getBalanceAmt().subtract(deductionAmount));
// 更新此笔交易单的剩余金额 = 支付金额 - 累计退款金额 - 累计消费金额
record.setBalanceAmt(record.getPayAmt().subtract(record.getRefundAmt()).subtract(record.getSpendAmt()));
memberAdapayRecordService.updateByPrimaryKeySelective(record);
}
@@ -1163,25 +1173,54 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
/**
* 计算余额扣除金额
*
* @param memberId 会员id
* @param amount 消费金额
* @param amount 消费金额
*/
private List<BalanceDeductionAmountVO> calculateTheBalanceDeductionAmount(String memberId, BigDecimal amount) {
@Override
public List<BalanceDeductionAmountVO> calculateTheBalanceDeductionAmount(String memberId, BigDecimal amount) {
List<BalanceDeductionAmountVO> resultList = Lists.newArrayList();
// 查询会员的余额充值记录 按照充值时间正序
List<MemberAdapayRecord> memberAdapayRecords = memberAdapayRecordService.selectAdapayRecordList(memberId, ScenarioEnum.BALANCE.getValue());
List<MemberAdapayRecord> memberAdapayRecords = memberAdapayRecordService.selectAvailableBalance(memberId);
// 定义一个临时金额等于消费金额
BigDecimal tempAmount = new BigDecimal(amount.toString());
for (MemberAdapayRecord memberAdapayRecord : memberAdapayRecords) {
// 取出一笔判断是否剩余金额够支付订单消费吗
}
// 该笔支付剩余金额 取出一笔判断是否剩余金额够支付订单消费吗
BigDecimal balanceAmt = memberAdapayRecord.getBalanceAmt();
// 该笔支付扣除金额
BigDecimal deductionAmount;
// 消费金额 - 剩余金额
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;
}
}
return resultList;
}
/**
* 延迟交易订单 交易确认
* @param orderBasicInfo 订单
*
* @param orderBasicInfo 订单
* @param adapayMemberAccount 结算账户
* @throws BaseAdaPayException
*/
@@ -1243,6 +1282,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
/**
* 批量查询订单
*
* @param orderCodeList
* @return
*/
@@ -1418,6 +1458,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
/**
* 生成订单编号
*
* @return
*/
private String generateNewOrderCode() {
@@ -1433,6 +1474,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
/**
* 保存异常订单到订单主表
*
* @param data 交易记录数据
*/
@Override
@@ -2019,12 +2061,12 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
PileBasicInfo pileBasicInfo = pileBasicInfoService.selectPileBasicInfoBySN(dto.getPileSn());
PileStationWhitelist pileStationWhitelist = pileStationWhitelistService.queryWhitelistByMemberId(String.valueOf(pileBasicInfo.getStationId()), dto.getMemberId());
if(platformTesterVO != null && StringUtils.equals(Constants.ONE, platformTesterVO.getStatus())) {
if (platformTesterVO != null && StringUtils.equals(Constants.ONE, platformTesterVO.getStatus())) {
// 是平台测试员
accountBalance = new BigDecimal("500");
payMode = OrderPayModeEnum.PAYMENT_OF_WHITELIST.getValue();
}else if(pileStationWhitelist != null) {
} else if (pileStationWhitelist != null) {
// 站点白名单
accountBalance = new BigDecimal("500");
payMode = OrderPayModeEnum.PAYMENT_OF_WHITELIST.getValue();
@@ -2268,6 +2310,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
/**
* 汇付支付-订单退款处理逻辑
*
* @param dto
*/
@Override
@@ -2345,6 +2388,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
/**
* 计算站点订单报表
*
* @param stationId 站点id
* @param tradeDate 交易日期
*/
@@ -2463,6 +2507,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
/**
* 通过结算金额,计算客户到账金额和手续费
*
* @param settleAmount 需要拆分的结算金额
* @return
*/
@@ -2709,7 +2754,8 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
if (response != null && !response.isEmpty()) {
JSONObject expend = JSONObject.parseObject(response.get("expend").toString());
JSONObject pay_info = expend.getJSONObject("pay_info");
Map<String, Object> resultMap = JSONObject.parseObject(pay_info.toJSONString(), new TypeReference<Map<String, Object>>() {});
Map<String, Object> resultMap = JSONObject.parseObject(pay_info.toJSONString(), new TypeReference<Map<String, Object>>() {
});
if (resultMap != null) {
// 表示已经获取到支付参数了,后续再有支付请求就拒绝
redisCache.setCacheObject(redisKey, resultMap, 15, TimeUnit.MINUTES);
@@ -2836,7 +2882,7 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService {
// 如果是鉴权卡或者vin启动不判断枪口状态
if (!(StringUtils.equals(dto.getStartMode(), StartModeEnum.AUTH_CARD.getValue())
|| StringUtils.equals(dto.getStartMode(), StartModeEnum.VIN_CODE.getValue()))) {
|| StringUtils.equals(dto.getStartMode(), StartModeEnum.VIN_CODE.getValue()))) {
// 判断枪口状态
if (!(StringUtils.equals(pileConnector.getConnectorStatus(), PileConnectorDataBaseStatusEnum.FREE.getValue())

View File

@@ -470,4 +470,14 @@
where del_flag = '0'
and payment_id = #{paymentId,jdbcType=VARCHAR}
</select>
<select id="selectAvailableBalance" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from member_adapay_record
where del_flag = '0'
and scenario_type = 'balance'
and balance_amt > '0.00'
and member_id = #{memberId,jdbcType=VARCHAR}
</select>
</mapper>