From e71ddfb2c81f2d60b9016f89e27d128ab2a2ac3e Mon Sep 17 00:00:00 2001 From: "autumn.g@foxmail.com" Date: Thu, 11 Jan 2024 16:14:35 +0800 Subject: [PATCH] =?UTF-8?q?update=20=E8=AE=A1=E7=AE=97=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=E4=BC=9A=E5=91=98=E6=8A=98=E6=89=A3=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/pile/PileRemoteController.java | 5 +- .../test/java/SpringBootTestController.java | 2 +- .../jsowell/common/constant/Constants.java | 13 ++++ .../impl/OrderBasicInfoServiceImpl.java | 22 ++++--- .../impl/OrderPayRecordServiceImpl.java | 6 ++ .../programlogic/AbstractProgramLogic.java | 50 +++++++++------- .../DelayMerchantProgramLogic.java | 60 ++++++++++++------- .../NotDelayMerchantProgramLogic.java | 2 +- 8 files changed, 104 insertions(+), 56 deletions(-) diff --git a/jsowell-admin/src/main/java/com/jsowell/web/controller/pile/PileRemoteController.java b/jsowell-admin/src/main/java/com/jsowell/web/controller/pile/PileRemoteController.java index e43c7cf64..96de8eae6 100644 --- a/jsowell-admin/src/main/java/com/jsowell/web/controller/pile/PileRemoteController.java +++ b/jsowell-admin/src/main/java/com/jsowell/web/controller/pile/PileRemoteController.java @@ -2,6 +2,7 @@ package com.jsowell.web.controller.pile; import com.alibaba.fastjson2.JSON; import com.google.common.collect.ImmutableMap; +import com.jsowell.common.constant.Constants; import com.jsowell.common.core.controller.BaseController; import com.jsowell.common.core.domain.AjaxResult; import com.jsowell.common.enums.ykc.ReturnCodeEnum; @@ -20,8 +21,6 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import java.math.BigDecimal; - /** * 远程控制controller */ @@ -67,7 +66,7 @@ public class PileRemoteController extends BaseController { String transactionCode = null; try { transactionCode = IdUtils.generateTransactionCode(dto.getPileSn(), dto.getConnectorCode()); - pileRemoteService.remoteStartCharging(dto.getPileSn(), dto.getConnectorCode(), transactionCode, new BigDecimal("500")); + pileRemoteService.remoteStartCharging(dto.getPileSn(), dto.getConnectorCode(), transactionCode, Constants.whitelistDefaultAmount); // // 生成订单 // orderCode = orderService.generateOrder(dto); // // 支付订单 diff --git a/jsowell-admin/src/test/java/SpringBootTestController.java b/jsowell-admin/src/test/java/SpringBootTestController.java index b209ac2f7..602b8eeb3 100644 --- a/jsowell-admin/src/test/java/SpringBootTestController.java +++ b/jsowell-admin/src/test/java/SpringBootTestController.java @@ -2636,7 +2636,7 @@ public class SpringBootTestController { List recordList = Lists.newArrayList(); // recordList.add(RefundableWxPayOrderData.builder().outTradeNo("1").transactionId("1").payerAmount(new BigDecimal("1000")).refundableAmount(new BigDecimal("0")).build()); // recordList.add(RefundableWxPayOrderData.builder().outTradeNo("2").transactionId("2").payerAmount(new BigDecimal("1000")).refundableAmount(new BigDecimal("0")).build()); - recordList.add(RefundableWxPayOrderData.builder().outTradeNo("3").transactionId("3").payerAmount(new BigDecimal("500")).refundableAmount(new BigDecimal("300")).build()); + recordList.add(RefundableWxPayOrderData.builder().outTradeNo("3").transactionId("3").payerAmount(Constants.whitelistDefaultAmount).refundableAmount(new BigDecimal("300")).build()); // 也许需要多笔支付订单才够退款 List requestList = com.google.common.collect.Lists.newArrayList(); diff --git a/jsowell-common/src/main/java/com/jsowell/common/constant/Constants.java b/jsowell-common/src/main/java/com/jsowell/common/constant/Constants.java index 1b4c10cc6..e8628b792 100644 --- a/jsowell-common/src/main/java/com/jsowell/common/constant/Constants.java +++ b/jsowell-common/src/main/java/com/jsowell/common/constant/Constants.java @@ -2,6 +2,8 @@ package com.jsowell.common.constant; import io.jsonwebtoken.Claims; +import java.math.BigDecimal; + /** * 通用常量信息 * @@ -9,6 +11,12 @@ import io.jsonwebtoken.Claims; */ public class Constants { + // 白名单默认金额 + public static final BigDecimal whitelistDefaultAmount = new BigDecimal(Constants.FIVE_HUNDRED); + + // 余额支付默认最大金额 + public static final BigDecimal balancePayMaxAmount = new BigDecimal(Constants.TWO_HUNDRED); + // 默认分隔符 public static final String DEFAULT_DELIMITER = ","; @@ -72,6 +80,10 @@ public class Constants { public static final String THREE = "3"; + public static final String TWO_HUNDRED = "200"; + + public static final String FIVE_HUNDRED = "500"; + public static final int zero = 0; public static final int one = 1; @@ -243,4 +255,5 @@ public class Constants { // 汇付延时分账支付模式 public static final String ADAPAY_PAY_MODE_DELAY = "delay"; + } 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 2857423d4..1206fcced 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 @@ -499,9 +499,13 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService { // settleOrder(data, orderInfo); // 新逻辑 - String mode = pileMerchantInfoService.getDelayModeByMerchantId(orderInfo.getMerchantId()); - AbstractProgramLogic orderLogic = ProgramLogicFactory.getProgramLogic(mode); - orderLogic.settleOrder(data, orderInfo); + try { + String mode = pileMerchantInfoService.getDelayModeByMerchantId(orderInfo.getMerchantId()); + AbstractProgramLogic orderLogic = ProgramLogicFactory.getProgramLogic(mode); + orderLogic.settleOrder(data, orderInfo); + } catch (Exception e) { + logger.error("充电桩启动失败,执行退款逻辑发生异常", e); + } } /** @@ -2369,12 +2373,12 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService { if (platformTesterVO != null && StringUtils.equals(Constants.ONE, platformTesterVO.getStatus())) { // 是平台测试员 - accountBalance = new BigDecimal("500"); + accountBalance = Constants.whitelistDefaultAmount; payMode = OrderPayModeEnum.PAYMENT_OF_WHITELIST.getValue(); } else if (pileStationWhitelist != null) { // 站点白名单 - accountBalance = new BigDecimal("500"); + accountBalance = Constants.whitelistDefaultAmount; payMode = OrderPayModeEnum.PAYMENT_OF_WHITELIST.getValue(); } else { // 通过memberId获取账户余额 @@ -2384,9 +2388,13 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService { } accountBalance = memberVO.getTotalAccountAmount(); if (accountBalance.compareTo(BigDecimal.ZERO) <= 0) { - logger.info("充电桩主动申请启动充电生成订单 余额不足", JSON.toJSONString(dto)); + logger.info("充电桩主动申请启动充电生成订单 余额不足, memberId:{}, MemberVO:{}", dto.getMemberId(), JSON.toJSONString(memberVO)); throw new BusinessException(ReturnCodeEnum.CODE_BALANCE_IS_INSUFFICIENT); } + BigDecimal defaultAmount = Constants.balancePayMaxAmount; + if (accountBalance.compareTo(defaultAmount) > 0) { + accountBalance = defaultAmount; + } payMode = OrderPayModeEnum.PAYMENT_OF_BALANCE.getValue(); // accountBalance = memberVO.getTotalAccountAmount(); // dto.setChargeAmount(totalAccountAmount); // 充电金额 @@ -2961,7 +2969,7 @@ public class OrderBasicInfoServiceImpl implements OrderBasicInfoService { resultMap.put("weixinMap", weixinMap); } else if (StringUtils.equals(dto.getPayMode(), OrderPayModeEnum.PAYMENT_OF_WHITELIST.getValue())) { // 白名单支付 // 白名单支付可以直接调支付回调方法 - dto.setPayAmount(new BigDecimal("500")); + dto.setPayAmount(Constants.whitelistDefaultAmount); whiteListPayOrder(dto); } return resultMap; diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderPayRecordServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderPayRecordServiceImpl.java index 677433ec3..14b56817b 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderPayRecordServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/OrderPayRecordServiceImpl.java @@ -19,6 +19,8 @@ import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; @Service public class OrderPayRecordServiceImpl implements OrderPayRecordService { @@ -50,6 +52,10 @@ public class OrderPayRecordServiceImpl implements OrderPayRecordService { @Override public int batchInsert(List payRecordList) { + if (CollectionUtils.isEmpty(payRecordList)) { + return 0; + } + payRecordList = payRecordList.stream().filter(Objects::nonNull).collect(Collectors.toList()); return orderPayRecordMapper.batchInsert(payRecordList); } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/AbstractProgramLogic.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/AbstractProgramLogic.java index b9685c55c..774b83da6 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/AbstractProgramLogic.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/AbstractProgramLogic.java @@ -22,6 +22,7 @@ import com.jsowell.pile.dto.*; import com.jsowell.pile.service.*; import com.jsowell.pile.transaction.dto.OrderTransactionDTO; import com.jsowell.pile.transaction.service.TransactionService; +import com.jsowell.pile.vo.uniapp.MemberVO; import com.jsowell.pile.vo.uniapp.PileConnectorDetailVO; import com.jsowell.pile.vo.web.*; import com.jsowell.wxpay.service.WxAppletRemoteService; @@ -481,27 +482,6 @@ public abstract class AbstractProgramLogic implements InitializingBean { return resultMap; } - public static void main(String[] args) { - // BigDecimal orderAmount= new BigDecimal("0.06"); - // List payRecordList = Lists.newArrayList(); - String deductionRecord = "[{\"paymentId\":\"002212023091416010010548305359259512832\",\"amount\":0.97},{\"paymentId\":\"002212023091416110010548307874223849472\",\"amount\":1.00}]"; - // payRecordList.add(OrderPayRecord.builder().deductionRecord(deductionRecord).build()); - - Object object = JSON.parse(deductionRecord); - - // 都放入list里 - List resultList = Lists.newArrayList(); - String s = JSON.toJSONString(object); - if (object instanceof JSONArray) { - List paymentInfos = JSON.parseArray(s, PaymentInfo.class); - resultList.addAll(paymentInfos); - } else { - PaymentInfo paymentInfo = JSON.parseObject(s, PaymentInfo.class); - resultList.add(paymentInfo); - } - System.out.println(JSON.toJSONString(resultList)); - } - /** * 计算解冻金额 * @param orderAmount 订单消费金额 @@ -789,8 +769,34 @@ public abstract class AbstractProgramLogic implements InitializingBean { BigDecimal discountAmount = discountServiceAmount.add(discountElectricityAmount); orderBasicInfo.setDiscountAmount(discountAmount); // 更新退款金额 = 退款金额 - 折扣金额 - orderBasicInfo.setRefundAmount(orderBasicInfo.getRefundAmount().subtract(discountAmount)); + BigDecimal refundAmount = orderBasicInfo.getRefundAmount().subtract(discountAmount); + orderBasicInfo.setRefundAmount(refundAmount); orderDetail.setDiscountElectricityAmount(discountElectricityAmount); orderDetail.setDiscountServiceAmount(discountServiceAmount); + logger.info("计算订单折扣, orderCode:{}, memberId:{}, discountAmount:{}, discountElectricityAmount:{}, discountServiceAmount:{}", + orderBasicInfo.getOrderCode(), memberId, discountAmount, discountElectricityAmount, discountServiceAmount); } + + /** + * 计算余额支付下发金额 + */ + protected Map calculateTheAmount(MemberVO memberVO) { + BigDecimal principalBalancePay; + BigDecimal giftBalancePay; + BigDecimal totalAccountAmount = memberVO.getTotalAccountAmount(); + // 余额支付最大下发200 + BigDecimal defaultAmount = Constants.balancePayMaxAmount; + if (totalAccountAmount.compareTo(defaultAmount) < 0) { + principalBalancePay = memberVO.getPrincipalBalance(); + giftBalancePay = memberVO.getGiftBalance(); + } else { + principalBalancePay = defaultAmount.min(memberVO.getPrincipalBalance()); + giftBalancePay = defaultAmount.subtract(principalBalancePay); + } + Map resultMap = Maps.newHashMap(); + resultMap.put("principalBalancePay", principalBalancePay); + resultMap.put("giftBalancePay", giftBalancePay); + return resultMap; + } + } diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/DelayMerchantProgramLogic.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/DelayMerchantProgramLogic.java index ee62f2b93..42c851cad 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/DelayMerchantProgramLogic.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/DelayMerchantProgramLogic.java @@ -103,7 +103,7 @@ public class DelayMerchantProgramLogic extends AbstractProgramLogic { resultMap.put("weixinMap", weixinMap); } else if (StringUtils.equals(dto.getPayMode(), OrderPayModeEnum.PAYMENT_OF_WHITELIST.getValue())) { // 白名单支付 // 白名单支付可以直接调支付回调方法 - dto.setPayAmount(new BigDecimal("500")); + dto.setPayAmount(Constants.whitelistDefaultAmount); whitelistPaymentOrder(dto); } return resultMap; @@ -232,7 +232,17 @@ public class DelayMerchantProgramLogic extends AbstractProgramLogic { // 总余额小于充电金额 throw new BusinessException(ReturnCodeEnum.CODE_BALANCE_IS_INSUFFICIENT); } - BigDecimal principalPay = chargeAmount; + + // 本金支付金额 + BigDecimal principalBalancePay = BigDecimal.ZERO; + // 赠送金支付金额 + BigDecimal giftBalancePay = BigDecimal.ZERO; + // 计算下发金额 + Map stringBigDecimalMap = calculateTheAmount(memberVO); + if (stringBigDecimalMap != null) { + principalBalancePay = stringBigDecimalMap.get("principalBalancePay"); + giftBalancePay = stringBigDecimalMap.get("giftBalancePay"); + } // 更新会员钱包 全部金额都用于支付订单 UpdateMemberBalanceDTO updateMemberBalanceDTO = UpdateMemberBalanceDTO.builder() @@ -240,33 +250,39 @@ public class DelayMerchantProgramLogic extends AbstractProgramLogic { .targetMerchantId(merchantId) .type(MemberWalletEnum.TYPE_OUT.getValue()) .subType(MemberWalletEnum.SUBTYPE_PAYMENT_FOR_ORDER.getValue()) - .updatePrincipalBalance(memberVO.getPrincipalBalance()) // 使用本金支付的金额 - .updateGiftBalance(memberVO.getGiftBalance()) // 赠送金额支付 + .updatePrincipalBalance(principalBalancePay) // 使用本金支付的金额 + .updateGiftBalance(giftBalancePay) // 赠送金额支付 .relatedOrderCode(orderCode) .build(); memberBasicInfoService.updateMemberBalance(updateMemberBalanceDTO); // 本金支付 - OrderPayRecord principalPayRecord = OrderPayRecord.builder() - .orderCode(orderCode) - .payMode(OrderPayRecordEnum.PRINCIPAL_BALANCE_PAYMENT.getValue()) - .payAmount(memberVO.getPrincipalBalance()) - .acquirer(AcquirerEnum.LOCAL.getValue()) - .createBy(memberId) - .createTime(DateUtils.getNowDate()) - .delFlag(DelFlagEnum.NORMAL.getValue()) - .build(); + OrderPayRecord principalPayRecord = null; + if (principalBalancePay.compareTo(BigDecimal.ZERO) > 0) { + principalPayRecord = OrderPayRecord.builder() + .orderCode(orderCode) + .payMode(OrderPayRecordEnum.PRINCIPAL_BALANCE_PAYMENT.getValue()) + .payAmount(principalBalancePay) + .acquirer(AcquirerEnum.LOCAL.getValue()) + .createBy(memberId) + .createTime(DateUtils.getNowDate()) + .delFlag(DelFlagEnum.NORMAL.getValue()) + .build(); + } // 赠送金支付 - OrderPayRecord giftPayRecord = OrderPayRecord.builder() - .orderCode(orderCode) - .payMode(OrderPayRecordEnum.GIFT_BALANCE_PAYMENT.getValue()) - .payAmount(memberVO.getGiftBalance()) - .acquirer(AcquirerEnum.LOCAL.getValue()) - .createBy(memberId) - .createTime(DateUtils.getNowDate()) - .delFlag(DelFlagEnum.NORMAL.getValue()) - .build(); + OrderPayRecord giftPayRecord = null; + if (giftBalancePay.compareTo(BigDecimal.ZERO) > 0) { + giftPayRecord = OrderPayRecord.builder() + .orderCode(orderCode) + .payMode(OrderPayRecordEnum.GIFT_BALANCE_PAYMENT.getValue()) + .payAmount(giftBalancePay) + .acquirer(AcquirerEnum.LOCAL.getValue()) + .createBy(memberId) + .createTime(DateUtils.getNowDate()) + .delFlag(DelFlagEnum.NORMAL.getValue()) + .build(); + } // 记录支订单付流水 记录两条支付 List payRecordList = Lists.newArrayList(principalPayRecord, giftPayRecord); diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/NotDelayMerchantProgramLogic.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/NotDelayMerchantProgramLogic.java index 7ea3fb3de..0e6bcbb74 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/NotDelayMerchantProgramLogic.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/programlogic/NotDelayMerchantProgramLogic.java @@ -216,7 +216,7 @@ public class NotDelayMerchantProgramLogic extends AbstractProgramLogic { resultMap.put("weixinMap", weixinMap); } else if (StringUtils.equals(dto.getPayMode(), OrderPayModeEnum.PAYMENT_OF_WHITELIST.getValue())) { // 白名单支付 // 白名单支付可以直接调支付回调方法 - dto.setPayAmount(new BigDecimal("500")); + dto.setPayAmount(Constants.whitelistDefaultAmount); whitelistPaymentOrder(dto); } return resultMap;