diff --git a/jsowell-admin/src/test/java/SpringBootTestController.java b/jsowell-admin/src/test/java/SpringBootTestController.java index b020923e7..05fcbc768 100644 --- a/jsowell-admin/src/test/java/SpringBootTestController.java +++ b/jsowell-admin/src/test/java/SpringBootTestController.java @@ -374,37 +374,37 @@ public class SpringBootTestController { */ @Test public void calculateUnfreezeAmountTest() { - BigDecimal orderAmount = new BigDecimal("28"); + BigDecimal orderAmount = new BigDecimal("0.99"); List payRecordList = Lists.newArrayList(); // 第一笔支付记录 JSONObject jsonObject = new JSONObject(); - jsonObject.put("paymentId", "1"); - jsonObject.put("amount", "10"); + jsonObject.put("paymentId", "002212023083114213410543206907226374144"); + jsonObject.put("amount", "0.98"); OrderPayRecord build = OrderPayRecord.builder() - .payAmount(new BigDecimal("10")) + .payAmount(new BigDecimal("0.98")) .deductionRecord(jsonObject.toJSONString()) .build(); payRecordList.add(build); // 第二笔支付记录 JSONObject jsonObject2 = new JSONObject(); - jsonObject2.put("paymentId", "2"); - jsonObject2.put("amount", "10"); + jsonObject2.put("paymentId", "002212023083114410510543211818773135360"); + jsonObject2.put("amount", "1.00"); OrderPayRecord build2 = OrderPayRecord.builder() - .payAmount(new BigDecimal("10")) + .payAmount(new BigDecimal("1.00")) .deductionRecord(jsonObject2.toJSONString()) .build(); payRecordList.add(build2); // 第三笔支付记录 - JSONObject jsonObject3 = new JSONObject(); - jsonObject3.put("paymentId", "3"); - jsonObject3.put("amount", "10"); - OrderPayRecord build3 = OrderPayRecord.builder() - .payAmount(new BigDecimal("10")) - .deductionRecord(jsonObject3.toJSONString()) - .build(); - payRecordList.add(build3); + // JSONObject jsonObject3 = new JSONObject(); + // jsonObject3.put("paymentId", "3"); + // jsonObject3.put("amount", "10"); + // OrderPayRecord build3 = OrderPayRecord.builder() + // .payAmount(new BigDecimal("10")) + // .deductionRecord(jsonObject3.toJSONString()) + // .build(); + // payRecordList.add(build3); List> maps = orderBasicInfoService.calculateUnfreezeAmount(orderAmount, payRecordList); System.out.println(maps); } 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 f4779d2fc..3985c9991 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 @@ -96,7 +96,22 @@ public class MemberAdapayRecordServiceImpl implements MemberAdapayRecordService @Override public void unfreezeAmount(String paymentId, BigDecimal unfreezeAmount) { log.info("解冻金额, paymentId:{}, 解冻金额:{}", paymentId, unfreezeAmount); - commonUpdateAmountMethod(paymentId, null, null, unfreezeAmount.negate()); + // commonUpdateAmountMethod(paymentId, null, null, unfreezeAmount.negate()); + MemberAdapayRecord record = selectByPaymentId(paymentId); + if (record == null) { + log.info("更新交易记录的消费金额和退款金额paymentId:{}, 查询为空", paymentId); + return; + } + // 此时数据库中的值 + BigDecimal spendAmt = record.getSpendAmt(); + BigDecimal refundAmt = record.getRefundAmt(); + BigDecimal freezeAmt = record.getFreezeAmt(); + BigDecimal balanceAmt = record.getBalanceAmt(); + // 更新解冻金额 = 目前冻结的金额 - 需要解冻的金额 + record.setFreezeAmt(record.getFreezeAmt().subtract(unfreezeAmount)); + // 更新此笔交易单的剩余金额 = 支付金额 - 累计退款金额 - 累计消费金额 - 累计冻结金额 + balanceAmt = record.getPayAmt().subtract(refundAmt).subtract(spendAmt).subtract(freezeAmt); + record.setBalanceAmt(balanceAmt); } /** 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 c2efcb3cd..06df5037c 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 @@ -65,7 +65,6 @@ import java.time.LocalDateTime; import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; -import java.util.function.Function; import java.util.stream.Collectors; /** @@ -1156,16 +1155,19 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService { // 查支付记录 List payRecordList = orderPayRecordService.getOrderPayRecordList(orderCode); - Map payRecordMap = payRecordList.stream() - .collect(Collectors.toMap(OrderPayRecord::getPayMode, Function.identity(), (k1, k2) -> k1)); - // 取出本金支付金额 - BigDecimal principalPay = null; - + // Map payRecordMap = payRecordList.stream() + // .collect(Collectors.toMap(OrderPayRecord::getPayMode, Function.identity(), (k1, k2) -> k1)); + Map> payRecordMap = payRecordList.stream().collect(Collectors.groupingBy(OrderPayRecord::getPayMode)); // 获取本金支付的记录 - OrderPayRecord principalPayRecord = payRecordMap.get(Constants.ONE); - if (principalPayRecord != null) { - principalPay = principalPayRecord.getPayAmount(); - } + List orderPayRecordList = payRecordMap.get(Constants.ONE); + BigDecimal principalPay = orderPayRecordList.stream().map(OrderPayRecord::getPayAmount).reduce(BigDecimal.ZERO, BigDecimal::add); + + // 取出本金支付金额 + // BigDecimal principalPay = null; + + // if (principalPayRecord != null) { + // principalPay = principalPayRecord.getPayAmount(); + // } // 计算需要退回的金额 Map returnAmountMap = calculateReturnAmount(principalPay, null, orderAmount); @@ -1194,6 +1196,43 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService { } } + // public List> calculateUnfreezeAmountOld(BigDecimal orderAmount, List payRecordList) { + // List> resultList = Lists.newArrayList(); + // + // BigDecimal tempAmount = new BigDecimal(orderAmount.toString()); // 临时金额 + // for (OrderPayRecord record : payRecordList) { + // JSONObject jsonObject = JSON.parseObject(record.getDeductionRecord()); + // String paymentId = jsonObject.getString("paymentId"); + // // BigDecimal amount = jsonObject.getBigDecimal("amount"); + // BigDecimal payAmount = record.getPayAmount(); // 此交易单支付的金额 + // // 该笔支付扣除金额 + // BigDecimal deductionAmount; + // // 该笔支付解冻金额 + // BigDecimal unfreezeAmount = null; + // // 临时消费金额 = 临时消费金额 - 该笔交易的剩余金额 + // tempAmount = tempAmount.subtract(payAmount); + // if (tempAmount.compareTo(BigDecimal.ZERO) >= 0) { + // // 计算以后,大于等于0,说明这笔支付剩余金额需要扣完,还要继续扣下一笔 + // deductionAmount = payAmount; + // unfreezeAmount = payAmount.subtract(deductionAmount); // 支付金额 - 扣除金额 = 需要退回的金额 + // Map map = Maps.newHashMap(); + // map.put("paymentId", paymentId); + // map.put("unfreezeAmount", unfreezeAmount); + // resultList.add(map); + // } else { + // // 如果小于0,则说明该笔交易的剩余金额用不完,扣除金额等于临时消费金额,并结束循环 + // deductionAmount = payAmount.add(tempAmount); // 该笔交易的剩余金额加上一个负数临时消费金额,就是该笔交易扣除金额 + // unfreezeAmount = payAmount.subtract(deductionAmount); // 支付金额 - 扣除金额 = 需要退回的金额 + // Map map = Maps.newHashMap(); + // map.put("paymentId", paymentId); + // map.put("unfreezeAmount", unfreezeAmount); + // resultList.add(map); + // // break; + // } + // } + // return resultList; + // } + /** * 计算解冻金额 * @param orderAmount 订单消费金额 @@ -1202,36 +1241,41 @@ public class OrderBasicInfoServiceImpl implements IOrderBasicInfoService { @Override public List> calculateUnfreezeAmount(BigDecimal orderAmount, List payRecordList) { List> resultList = Lists.newArrayList(); - BigDecimal tempAmount = new BigDecimal(orderAmount.toString()); // 临时金额 for (OrderPayRecord record : payRecordList) { JSONObject jsonObject = JSON.parseObject(record.getDeductionRecord()); - String paymentId = jsonObject.getString("paymentId"); - // BigDecimal amount = jsonObject.getBigDecimal("amount"); + String paymentId = jsonObject.getString("paymentId"); // 交易流水号 BigDecimal payAmount = record.getPayAmount(); // 此交易单支付的金额 - // 该笔支付扣除金额 - BigDecimal deductionAmount; - // 该笔支付解冻金额 - BigDecimal unfreezeAmount = null; - // 临时消费金额 = 临时消费金额 - 该笔交易的剩余金额 - tempAmount = tempAmount.subtract(payAmount); - if (tempAmount.compareTo(BigDecimal.ZERO) >= 0) { - // 计算以后,大于等于0,说明这笔支付剩余金额需要扣完,还要继续扣下一笔 - deductionAmount = payAmount; - unfreezeAmount = payAmount.subtract(deductionAmount); // 支付金额 - 扣除金额 = 需要退回的金额 + + if (BigDecimal.ZERO.compareTo(tempAmount) >= 0) { Map map = Maps.newHashMap(); map.put("paymentId", paymentId); - map.put("unfreezeAmount", unfreezeAmount); + map.put("unfreezeAmount", payAmount); resultList.add(map); } else { - // 如果小于0,则说明该笔交易的剩余金额用不完,扣除金额等于临时消费金额,并结束循环 - deductionAmount = payAmount.add(tempAmount); // 该笔交易的剩余金额加上一个负数临时消费金额,就是该笔交易扣除金额 - unfreezeAmount = payAmount.subtract(deductionAmount); // 支付金额 - 扣除金额 = 需要退回的金额 - Map map = Maps.newHashMap(); - map.put("paymentId", paymentId); - map.put("unfreezeAmount", unfreezeAmount); - resultList.add(map); - break; + // 该笔支付扣除金额 + BigDecimal deductionAmount; + // 该笔支付解冻金额 + BigDecimal unfreezeAmount = null; + // 临时消费金额 = 临时消费金额 - 该笔交易的剩余金额 + tempAmount = tempAmount.subtract(payAmount); + if (tempAmount.compareTo(BigDecimal.ZERO) >= 0) { + // 计算以后,大于等于0,说明这笔支付剩余金额需要扣完,还要继续扣下一笔 + deductionAmount = payAmount; + unfreezeAmount = payAmount.subtract(deductionAmount); // 支付金额 - 扣除金额 = 需要退回的金额 + Map map = Maps.newHashMap(); + map.put("paymentId", paymentId); + map.put("unfreezeAmount", unfreezeAmount); + resultList.add(map); + } else { + // 如果小于0,则说明该笔交易的剩余金额用不完,扣除金额等于临时消费金额,并结束循环 + deductionAmount = payAmount.add(tempAmount); // 该笔交易的剩余金额加上一个负数临时消费金额,就是该笔交易扣除金额 + unfreezeAmount = payAmount.subtract(deductionAmount); // 支付金额 - 扣除金额 = 需要退回的金额 + Map map = Maps.newHashMap(); + map.put("paymentId", paymentId); + map.put("unfreezeAmount", unfreezeAmount); + resultList.add(map); + } } } return resultList;