diff --git a/jsowell-admin/src/test/java/SpringBootTestController.java b/jsowell-admin/src/test/java/SpringBootTestController.java index 72e33308f..a01296cb1 100644 --- a/jsowell-admin/src/test/java/SpringBootTestController.java +++ b/jsowell-admin/src/test/java/SpringBootTestController.java @@ -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 list = orderBasicInfoService.calculateTheBalanceDeductionAmount(memberId, amount); + System.out.println(JSON.toJSONString(list)); + } + @Test public void testGenerateOccupyPileOrder() { String memberId = "67569684"; diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/mapper/MemberAdapayRecordMapper.java b/jsowell-pile/src/main/java/com/jsowell/pile/mapper/MemberAdapayRecordMapper.java index 4494b634a..521509407 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/mapper/MemberAdapayRecordMapper.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/mapper/MemberAdapayRecordMapper.java @@ -41,4 +41,6 @@ public interface MemberAdapayRecordMapper { List selectAdapayRecordList(@Param("memberId") String memberId, @Param("scenarioType") String scenarioType); MemberAdapayRecord selectByPaymentId(@Param("paymentId") String paymentId); + + List selectAvailableBalance(@Param("memberId") String memberId); } \ No newline at end of file diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/IOrderBasicInfoService.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/IOrderBasicInfoService.java index ad3ffab0c..d1fe5ba39 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/IOrderBasicInfoService.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/IOrderBasicInfoService.java @@ -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 calculateTheBalanceDeductionAmount(String memberId, BigDecimal amount); + + /** * 执行订单分账 * @param orderBasicInfo * @param adapayMemberAccount diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/MemberAdapayRecordService.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/MemberAdapayRecordService.java index e2c2a4803..041852170 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/MemberAdapayRecordService.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/MemberAdapayRecordService.java @@ -22,4 +22,10 @@ public interface MemberAdapayRecordService{ List selectAdapayRecordList(String memberId, String scenarioType); MemberAdapayRecord selectByPaymentId(String paymentId); + + /** + * 查询会员可用余额充值记录 + * @param memberId 会员id + */ + List selectAvailableBalance(String memberId); } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/MemberAdapayRecordServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/MemberAdapayRecordServiceImpl.java index bab5b97c9..92c09ff83 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/MemberAdapayRecordServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/MemberAdapayRecordServiceImpl.java @@ -64,4 +64,14 @@ public class MemberAdapayRecordServiceImpl implements MemberAdapayRecordService{ return memberAdapayRecordMapper.selectByPaymentId(paymentId); } + /** + * 查询会员可用余额充值记录 + * @param memberId 会员id + * @return + */ + @Override + public List selectAvailableBalance(String memberId) { + return memberAdapayRecordMapper.selectAvailableBalance(memberId); + } + } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java index ac037b273..f65ac4177 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderBasicInfoServiceImpl.java @@ -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 calculateTheBalanceDeductionAmount(String memberId, BigDecimal amount) { + @Override + public List calculateTheBalanceDeductionAmount(String memberId, BigDecimal amount) { List resultList = Lists.newArrayList(); // 查询会员的余额充值记录 按照充值时间正序 - List memberAdapayRecords = memberAdapayRecordService.selectAdapayRecordList(memberId, ScenarioEnum.BALANCE.getValue()); + List 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 resultMap = JSONObject.parseObject(pay_info.toJSONString(), new TypeReference>() {}); + Map resultMap = JSONObject.parseObject(pay_info.toJSONString(), new TypeReference>() { + }); 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()) diff --git a/jsowell-pile/src/main/resources/mapper/pile/MemberAdapayRecordMapper.xml b/jsowell-pile/src/main/resources/mapper/pile/MemberAdapayRecordMapper.xml index c623d647c..0a6b444a9 100644 --- a/jsowell-pile/src/main/resources/mapper/pile/MemberAdapayRecordMapper.xml +++ b/jsowell-pile/src/main/resources/mapper/pile/MemberAdapayRecordMapper.xml @@ -470,4 +470,14 @@ where del_flag = '0' and payment_id = #{paymentId,jdbcType=VARCHAR} + + \ No newline at end of file