计算余额扣除金额

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

View File

@@ -41,4 +41,6 @@ public interface MemberAdapayRecordMapper {
List<MemberAdapayRecord> selectAdapayRecordList(@Param("memberId") String memberId, @Param("scenarioType") String scenarioType); List<MemberAdapayRecord> selectAdapayRecordList(@Param("memberId") String memberId, @Param("scenarioType") String scenarioType);
MemberAdapayRecord selectByPaymentId(@Param("paymentId") String paymentId); 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.OrderVO;
import com.jsowell.pile.vo.uniapp.PersonPileConnectorSumInfoVO; import com.jsowell.pile.vo.uniapp.PersonPileConnectorSumInfoVO;
import com.jsowell.pile.vo.uniapp.SendMessageVO; 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.IndexOrderInfoVO;
import com.jsowell.pile.vo.web.OrderListVO; import com.jsowell.pile.vo.web.OrderListVO;
import com.jsowell.pile.vo.web.OrderTotalDataVO; import com.jsowell.pile.vo.web.OrderTotalDataVO;
import com.jsowell.wxpay.response.WechatPayRefundResponse; import com.jsowell.wxpay.response.WechatPayRefundResponse;
import java.math.BigDecimal;
import java.text.ParseException; import java.text.ParseException;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.List; import java.util.List;
@@ -150,7 +152,9 @@ public interface IOrderBasicInfoService {
void tempOrderSplittingOperations(String merchantId, String tradeDate); void tempOrderSplittingOperations(String merchantId, String tradeDate);
/** List<BalanceDeductionAmountVO> calculateTheBalanceDeductionAmount(String memberId, BigDecimal amount);
/**
* 执行订单分账 * 执行订单分账
* @param orderBasicInfo * @param orderBasicInfo
* @param adapayMemberAccount * @param adapayMemberAccount

View File

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

View File

@@ -470,4 +470,14 @@
where del_flag = '0' where del_flag = '0'
and payment_id = #{paymentId,jdbcType=VARCHAR} and payment_id = #{paymentId,jdbcType=VARCHAR}
</select> </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> </mapper>