From f3db2c289f4ceb91a738cfb4e64567a24bc1d904 Mon Sep 17 00:00:00 2001 From: "autumn.g@foxmail.com" Date: Wed, 22 Nov 2023 16:38:17 +0800 Subject: [PATCH] =?UTF-8?q?update=20=E4=BF=AE=E6=94=B9=E4=BD=99=E9=A2=9D?= =?UTF-8?q?=E6=94=AF=E4=BB=98=E8=AE=A2=E5=8D=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/jsowell/common/util/JWTUtils.java | 4 + .../util/file/AliyunOssUploadUtils.java | 12 +- .../orderlogic/AbstractOrderLogic.java | 3 + .../orderlogic/DelayMerchantOrderLogic.java | 107 +++++++++++++++++- 4 files changed, 123 insertions(+), 3 deletions(-) diff --git a/jsowell-common/src/main/java/com/jsowell/common/util/JWTUtils.java b/jsowell-common/src/main/java/com/jsowell/common/util/JWTUtils.java index ea6e49b37..9f8899d9a 100644 --- a/jsowell-common/src/main/java/com/jsowell/common/util/JWTUtils.java +++ b/jsowell-common/src/main/java/com/jsowell/common/util/JWTUtils.java @@ -4,6 +4,8 @@ import com.jsowell.common.constant.Constants; import com.jsowell.common.enums.ykc.ReturnCodeEnum; import com.jsowell.common.exception.BusinessException; import io.jsonwebtoken.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @@ -14,6 +16,7 @@ import java.util.Date; @Component public class JWTUtils { + private static final Logger logger = LoggerFactory.getLogger(JWTUtils.class); // 令牌自定义标识 private static String header; @@ -94,6 +97,7 @@ public class JWTUtils { .parseClaimsJws(token) .getBody(); } catch (ExpiredJwtException e) { + logger.error("parseToken error", e); throw new BusinessException(ReturnCodeEnum.CODE_TOKEN_ERROR); } return claims; diff --git a/jsowell-common/src/main/java/com/jsowell/common/util/file/AliyunOssUploadUtils.java b/jsowell-common/src/main/java/com/jsowell/common/util/file/AliyunOssUploadUtils.java index a25474a3a..d7464b8fb 100644 --- a/jsowell-common/src/main/java/com/jsowell/common/util/file/AliyunOssUploadUtils.java +++ b/jsowell-common/src/main/java/com/jsowell/common/util/file/AliyunOssUploadUtils.java @@ -3,11 +3,13 @@ package com.jsowell.common.util.file; import com.aliyun.oss.OSS; import com.aliyun.oss.OSSClientBuilder; import com.jsowell.common.config.AliyunOssConfig; +import com.jsowell.common.util.RandomUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; import java.io.IOException; +import java.time.LocalDateTime; @Component public class AliyunOssUploadUtils { @@ -39,8 +41,16 @@ public class AliyunOssUploadUtils { // 编码文件名 String filePathName = FileUploadUtils.extractFilename(file); + + //获取当前时间 + LocalDateTime currentDate = LocalDateTime.now(); + String dir_name = currentDate.getYear() + "/" + currentDate.getMonthValue() + "/"; + + // 随机数 + String randomNumber = RandomUtil.getRandomNumber(5) + "-"; + // 文件路径名称 - filePathName = aliyunOssConfig.getFilehost() + "/" + filePathName; + filePathName = aliyunOssConfig.getFilehost() + "/" + dir_name + randomNumber + filePathName; try { ossClient.putObject(aliyunOssConfig.getBucketName(), filePathName, file.getInputStream()); } catch (IOException e) { diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/orderlogic/AbstractOrderLogic.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/orderlogic/AbstractOrderLogic.java index 51b3e9c32..a1df6e2ce 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/orderlogic/AbstractOrderLogic.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/orderlogic/AbstractOrderLogic.java @@ -99,6 +99,9 @@ public abstract class AbstractOrderLogic implements InitializingBean { @Autowired protected OrderMonitorDataService orderMonitorDataService; + @Autowired + protected MemberWalletInfoService memberWalletInfoService; + @Autowired protected RedisCache redisCache; diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/orderlogic/DelayMerchantOrderLogic.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/orderlogic/DelayMerchantOrderLogic.java index ea6d09ecb..c1785a4b2 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/orderlogic/DelayMerchantOrderLogic.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/orderlogic/DelayMerchantOrderLogic.java @@ -195,7 +195,7 @@ public class DelayMerchantOrderLogic extends AbstractOrderLogic { Map resultMap = Maps.newHashMap(); if (StringUtils.equals(dto.getPayMode(), OrderPayModeEnum.PAYMENT_OF_BALANCE.getValue())) { // 余额支付 - balancePayOrder(dto); + balancePayOrderV2(dto); } else if (StringUtils.equals(dto.getPayMode(), OrderPayModeEnum.PAYMENT_OF_WECHATPAY.getValue())) { // 2023-07-11 全部改为汇付支付 dto.setGoodsTitle("充电费用"); @@ -265,7 +265,6 @@ public class DelayMerchantOrderLogic extends AbstractOrderLogic { .payMode(OrderPayRecordEnum.PRINCIPAL_BALANCE_PAYMENT.getValue()) .payAmount(payAmt) .acquirer(AcquirerEnum.LOCAL.getValue()) - // .deductionRecord(jsonArray.toJSONString()) .deductionRecord(JSON.toJSONString(paymentInfos)) .createBy(dto.getMemberId()) .delFlag(DelFlagEnum.NORMAL.getValue()) @@ -310,6 +309,110 @@ public class DelayMerchantOrderLogic extends AbstractOrderLogic { memberTransactionRecordService.insertSelective(record); } + /** + * 余额支付订单 + */ + @Transactional(rollbackFor = Exception.class) + public void balancePayOrderV2(PayOrderDTO dto) { + logger.info("【{}】-余额支付订单V2start, param:{}", this.getClass().getSimpleName(), JSON.toJSONString(dto)); + // 订单编号 + String orderCode = dto.getOrderCode(); + // 查订单详情 + OrderBasicInfo orderBasicInfo = orderBasicInfoService.getOrderInfoByOrderCode(orderCode); + // 订单所属运营商id + String merchantId = orderBasicInfo.getMerchantId(); + // 支付金额 + BigDecimal chargeAmount = dto.getPayAmount(); + // 会员id + String memberId = dto.getMemberId(); + // 查询该会员的余额 在所属运营商的余额 + // MemberVO memberVO = memberBasicInfoService.queryMemberInfoByMemberId(dto.getMemberId()); + MemberWalletInfo memberWalletInfo = memberWalletInfoService.selectByMemberId(memberId, merchantId); + BigDecimal totalAccountAmount = memberWalletInfo.getPrincipalBalance(); // 总余额 + + if (totalAccountAmount.compareTo(chargeAmount) < 0) { + // 总余额小于充电金额 + throw new BusinessException(ReturnCodeEnum.CODE_BALANCE_IS_INSUFFICIENT); + } + BigDecimal principalPay = chargeAmount; + + // 更新会员钱包 + UpdateMemberBalanceDTO updateMemberBalanceDTO = UpdateMemberBalanceDTO.builder() + .memberId(memberId) + .targetMerchantId(merchantId) + .type(MemberWalletEnum.TYPE_OUT.getValue()) + .subType(MemberWalletEnum.SUBTYPE_PAYMENT_FOR_ORDER.getValue()) + .updatePrincipalBalance(principalPay) // 使用本金支付的金额 + .relatedOrderCode(orderCode) + .build(); + memberBasicInfoService.updateMemberBalance(updateMemberBalanceDTO); + + // 查询余额充值有剩余的记录 + // List list = calculateTheBalanceDeductionAmount(memberId, chargeAmount); + + // 记录订单支付流水 + BigDecimal payAmt = BigDecimal.ZERO; + List paymentInfos = Lists.newArrayList(); + // for (BalanceDeductionAmountVO balanceDeductionAmountVO : list) { + // String paymentId = balanceDeductionAmountVO.getPaymentId(); + // // 此交易单扣除金额 + // BigDecimal deductionAmount = balanceDeductionAmountVO.getDeductionAmount(); + // payAmt = payAmt.add(deductionAmount); + // + // PaymentInfo paymentInfo = new PaymentInfo(); + // paymentInfo.setPaymentId(paymentId); + // paymentInfo.setAmount(deductionAmount.toString()); + // paymentInfos.add(paymentInfo); + // } + OrderPayRecord build = OrderPayRecord.builder() + .orderCode(orderCode) + .payMode(OrderPayRecordEnum.PRINCIPAL_BALANCE_PAYMENT.getValue()) + .payAmount(principalPay) + .acquirer(AcquirerEnum.LOCAL.getValue()) + .deductionRecord(JSON.toJSONString(paymentInfos)) + .createBy(memberId) + .delFlag(DelFlagEnum.NORMAL.getValue()) + .build(); + + // 记录支订单付流水 + List payRecordList = Lists.newArrayList(build); + orderPayRecordService.batchInsert(payRecordList); + + // 把消费金额冻结 + // for (OrderPayRecord record : payRecordList) { + // List paymentInfoList = parseDeductionRecord(record.getDeductionRecord()); + // // 循环冻结金额 + // for (PaymentInfo paymentInfo : paymentInfoList) { + // String paymentId = paymentInfo.getPaymentId(); + // BigDecimal amount = new BigDecimal(paymentInfo.getAmount()); + // // 余额支付 临时冻结金额 + // memberAdapayRecordService.updateFreezeAmount(paymentId, amount); + // } + // } + + // 余额支付可以直接调支付回调方法 + PayOrderSuccessCallbackDTO callbackDTO = PayOrderSuccessCallbackDTO.builder() + .orderCode(orderCode) + .payAmount(chargeAmount) + .payMode(dto.getPayMode()) + .startMode(dto.getStartMode()) + .acquirer(AcquirerEnum.LOCAL.getValue()) + .build(); + payOrderSuccessCallback(callbackDTO); + + // 余额支付订单 记录会员交易流水 + MemberTransactionRecord record = MemberTransactionRecord.builder() + .orderCode(orderCode) + .scenarioType(ScenarioEnum.ORDER.getValue()) + .memberId(memberId) + .actionType(ActionTypeEnum.FORWARD.getValue()) + .payMode(PayModeEnum.PAYMENT_OF_BALANCE.getValue()) + .paymentInstitutions(PaymentInstitutionsEnum.LOCAL_ACCOUNTS.getValue()) + .amount(dto.getPayAmount()) // 单位元 + .build(); + memberTransactionRecordService.insertSelective(record); + } + /** * 在线支付订单 */