From 3c770192fab4b870fbefa7a17010157f8f2ef2d5 Mon Sep 17 00:00:00 2001 From: wangqx Date: Tue, 23 Sep 2025 16:55:04 +0800 Subject: [PATCH] =?UTF-8?q?[fix]=E4=BF=AE=E6=94=B9=E7=BA=A2=E5=8C=85?= =?UTF-8?q?=E5=92=8C=E6=8F=90=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/dromara/app/AppMemberController.java | 15 ++- .../org/dromara/app/AppTenantController.java | 2 +- .../common/core/constant/ResultCode.java | 6 ++ .../common/mq/enums/MessageActionEnum.java | 4 + .../service/impl/CommentServiceImpl.java | 43 +++++++-- .../service/impl/MemberServiceImpl.java | 8 ++ .../order/business/IAfterSaleBusiness.java | 4 + .../business/impl/AfterSaleBusiness.java | 10 ++ .../order/convert/AftersaleConvert.java | 10 +- .../soopin/order/domain/bo/AftersaleBo.java | 6 +- .../service/impl/AftersaleServiceImpl.java | 21 +++- .../transaction/service/IWithdrawService.java | 3 +- .../service/impl/WithdrawServiceImpl.java | 95 +++++++++---------- .../service/impl/WxPayService.java | 85 ++++++++--------- 14 files changed, 190 insertions(+), 122 deletions(-) create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/business/IAfterSaleBusiness.java create mode 100644 ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/business/impl/AfterSaleBusiness.java diff --git a/ruoyi-admin/src/main/java/org/dromara/app/AppMemberController.java b/ruoyi-admin/src/main/java/org/dromara/app/AppMemberController.java index 3d2ec076a..f12531d57 100644 --- a/ruoyi-admin/src/main/java/org/dromara/app/AppMemberController.java +++ b/ruoyi-admin/src/main/java/org/dromara/app/AppMemberController.java @@ -24,6 +24,7 @@ import com.wzj.soopin.transaction.convert.ChargeConvert; import com.wzj.soopin.transaction.convert.WithdrawConvert; import com.wzj.soopin.transaction.domain.bo.ChargeBO; import com.wzj.soopin.transaction.domain.bo.WithdrawBO; +import com.wzj.soopin.transaction.domain.po.Withdraw; import com.wzj.soopin.transaction.enums.WithdrawType; import com.wzj.soopin.transaction.service.IAccountBillService; import com.wzj.soopin.transaction.service.IChargeService; @@ -47,6 +48,8 @@ import org.dromara.common.social.config.properties.SocialProperties; import org.dromara.common.social.utils.SocialUtils; import org.springframework.web.bind.annotation.*; +import java.math.BigDecimal; + @RestController @RequestMapping("/app/member") @Tag(name = "会员管理") @@ -200,7 +203,15 @@ public class AppMemberController { Long memberId = loginUser.getUserId(); bo.setMemberId(memberId); bo.setType(WithdrawType.WALLET.getCode()); - return R.ok(withdrawService.withdrawWallet(withdrawConvert.toPo(bo))); + Withdraw withdraw=withdrawConvert.toPo(bo); + withdrawService.withdraw(withdraw); + //检查提现金额是否小于1元 一元以下自动审批 + if(withdraw.getMoney().compareTo(BigDecimal.ONE)<0){ + //自动审批 + bo.setId(withdraw.getId()); + withdrawService.audit(bo); + } + return R.ok(); } @@ -223,6 +234,4 @@ public class AppMemberController { return R.ok(); } - - } diff --git a/ruoyi-admin/src/main/java/org/dromara/app/AppTenantController.java b/ruoyi-admin/src/main/java/org/dromara/app/AppTenantController.java index 646d6cd9f..75073d631 100644 --- a/ruoyi-admin/src/main/java/org/dromara/app/AppTenantController.java +++ b/ruoyi-admin/src/main/java/org/dromara/app/AppTenantController.java @@ -38,7 +38,7 @@ public class AppTenantController { Long memberId = loginUser.getUserId(); bo.setMemberId(memberId); bo.setType(WithdrawType.REVENUE.getCode()); - return R.ok(withdrawService.withdrawRevenue(withdrawConvert.toPo(bo))); + return R.ok(withdrawService.withdraw(withdrawConvert.toPo(bo))); } diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/ResultCode.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/ResultCode.java index eef30e94c..7cd0aca0c 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/ResultCode.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/constant/ResultCode.java @@ -232,6 +232,12 @@ public enum ResultCode { CAN_NOT_RECHARGE_WALLET(32012, "不能使用余额进行充值"), RECHARGE_PRICE_ERROR(32013, "充值金额错误"), + + WITHDRAW_ERROR(33000, "提现失败"), + WITHDRAW_AUDIT_ERROR(33001, "提现审核失败"), + WITHDRAW_WALLET_ERROR(33002, "提现到钱包失败"), + + /** * 售后 */ diff --git a/ruoyi-common/ruoyi-common-mq/src/main/java/org/dromara/common/mq/enums/MessageActionEnum.java b/ruoyi-common/ruoyi-common-mq/src/main/java/org/dromara/common/mq/enums/MessageActionEnum.java index 677cf4056..73bbfe6fa 100644 --- a/ruoyi-common/ruoyi-common-mq/src/main/java/org/dromara/common/mq/enums/MessageActionEnum.java +++ b/ruoyi-common/ruoyi-common-mq/src/main/java/org/dromara/common/mq/enums/MessageActionEnum.java @@ -15,6 +15,8 @@ public enum MessageActionEnum { ORDER_RECHARGE(30, "order"), //订单->充值 online ORDER_PAY(31, "order"), //订单->订单交易成功通知 online ORDER_REFUND(32, "order"), //订单->退款结果通知 + ORDER_WITHDRAW_AUDIT(33, "order"), //订单->提现审核结果通知 + ORDER_WITHDRAW_REFUSE(34, "order"), //订单->提现审核结果通知(拒绝) GROUP_NOTIFY_CHECK(43, "groupNotify"), //群通知->进群申请 online GROUP_NOTIFY_ACCEPT(44, "groupNotify"), // 群通知->进群审核审核通过 online GROUP_NOTIFY_FAIL(45, "groupNotify"), // 群通知->进群审核审核拒绝 online @@ -52,4 +54,6 @@ public enum MessageActionEnum { } return null; } + + } diff --git a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/CommentServiceImpl.java b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/CommentServiceImpl.java index b8b22c3c5..0e6c63deb 100644 --- a/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/CommentServiceImpl.java +++ b/ruoyi-modules/ruoyi-content/src/main/java/com/wzj/soopin/content/service/impl/CommentServiceImpl.java @@ -349,6 +349,32 @@ public class CommentServiceImpl extends ServiceImpl impl childComment.setUpdateBy(username); commentMapper.updateById(childComment); } + + + List notifyList = new ArrayList<>(); + notifyList.add(comment); + notifyList.addAll(childComments); + notifyList.forEach(c -> { + //给评论发送通知 + MqUtil.sendIMMessage(buildOfflineMessage(c)); + + }); + + + } + + private MQMessage buildOfflineMessage(Comment comment) { + Map params = new HashMap<>(); + params.put("userId", MessageActionEnum.SYSTEM_REPORT.getCode()); + params.put("nickName", MessageActionEnum.SYSTEM_REPORT.getAccount()); + params.put("toUserId", comment.getId()); + params.put("commentId", comment.getId()); + params.put("commentContent", comment.getContent()); + params.put("action", MessageActionEnum.SYSTEM_REPORT.getAccount()); + MQMessage mqMessage = new MQMessage(); + mqMessage.setTag(MessageActionEnum.SYSTEM_REPORT.getAccount()); + mqMessage.setData(params); + return mqMessage; } @Override @@ -375,13 +401,16 @@ public class CommentServiceImpl extends ServiceImpl impl // 3) 发送站内消息:根评论 -> 通知视频作者;回复评论 -> 通知被回复用户 - // 关注消息 - MqUtil.sendIMMessage(buildMessage(bo)); + // 给评论或者作者发送通知 + MqUtil.sendIMMessage(buildCommentMessage(bo)); + + //检查是否有@ + } - private MQMessage buildMessage(CommentBO bo){ - Map params=new HashMap<>(); - LoginUser loginUser=LoginHelper.getLoginUser(); + private MQMessage buildCommentMessage(CommentBO bo) { + Map params = new HashMap<>(); + LoginUser loginUser = LoginHelper.getLoginUser(); if ("0".equals(bo.getFatherCommentId())) { // 评论视频,通知视频作者 if (bo.getVlogerId() != null && !bo.getVlogerId().isEmpty() @@ -402,8 +431,8 @@ public class CommentServiceImpl extends ServiceImpl impl params.put("nickName", loginUser.getNickname()); params.put("toUserId", father.getCommentUserId()); params.put("vlogId", bo.getVlogId()); - params.put("commentId",father.getId()); - params.put("commentContent",father.getContent()); + params.put("commentId", father.getId()); + params.put("commentContent", father.getContent()); params.put("action", MessageActionEnum.INTERACTION_REPLY.getAccount()); } diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/MemberServiceImpl.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/MemberServiceImpl.java index e9fc8ef3f..79d4e6a04 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/MemberServiceImpl.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/MemberServiceImpl.java @@ -408,4 +408,12 @@ public class MemberServiceImpl extends ServiceImpl implemen Assert.isTrue(StrUtil.equals(smsCode, code), () -> new ServiceException("短信验证码错误")); memberMapper.updateById(Member.builder().id(loginUser.getUserId()).status(Constants.MEMBER_ACCOUNT_STATUS.FORBIDDEN).build()); } + + @Override + @CacheEvict(value = GlobalConstants.MEMBER_KEY, key = "#id") + + + public boolean updateById(Member entity) { + return super.updateById(entity); + } } diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/business/IAfterSaleBusiness.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/business/IAfterSaleBusiness.java new file mode 100644 index 000000000..b6b895251 --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/business/IAfterSaleBusiness.java @@ -0,0 +1,4 @@ +package com.wzj.soopin.order.business; + +public interface IAfterSaleBusiness { +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/business/impl/AfterSaleBusiness.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/business/impl/AfterSaleBusiness.java new file mode 100644 index 000000000..b1c8660bd --- /dev/null +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/business/impl/AfterSaleBusiness.java @@ -0,0 +1,10 @@ +package com.wzj.soopin.order.business.impl; + +import com.wzj.soopin.order.convert.AftersaleConvert; +import com.wzj.soopin.order.domain.entity.Aftersale; +import com.wzj.soopin.order.domain.vo.AftersaleVO; +import com.wzj.soopin.order.service.AftersaleService; +import org.dromara.common.web.core.BusinessImpl; + +public class AfterSaleBusiness { +} diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/convert/AftersaleConvert.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/convert/AftersaleConvert.java index 62c4f0fa8..e2c9091e4 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/convert/AftersaleConvert.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/convert/AftersaleConvert.java @@ -1,24 +1,16 @@ package com.wzj.soopin.order.convert; -import com.wzj.soopin.member.domain.bo.MemberAddressBO; -import com.wzj.soopin.member.domain.po.MemberAddress; -import com.wzj.soopin.member.domain.vo.MemberAddressVO; import com.wzj.soopin.order.domain.bo.AftersaleBo; import com.wzj.soopin.order.domain.entity.Aftersale; -import com.wzj.soopin.order.domain.form.ManagerAftersaleOrderForm; import com.wzj.soopin.order.domain.vo.AftersaleVO; -import com.wzj.soopin.order.domain.vo.ManagerRefundOrderVO; import org.dromara.common.web.core.BaseConverter; import org.mapstruct.Mapper; - -import java.util.List; /** * 订单售后 DO <=> DTO <=> VO / BO / Query * * @author zcc */ @Mapper(componentModel = "spring") -public interface AftersaleConvert extends BaseConverter { +public interface AftersaleConvert extends BaseConverter { -// List dos2vos(List list); } diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/bo/AftersaleBo.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/bo/AftersaleBo.java index 7e3c47ef3..0a4b44c64 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/bo/AftersaleBo.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/domain/bo/AftersaleBo.java @@ -1,11 +1,11 @@ package com.wzj.soopin.order.domain.bo; -import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.fasterxml.jackson.annotation.JsonFormat; import com.wzj.soopin.order.domain.entity.Aftersale; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Data; +import org.dromara.common.core.domain.BaseBO; import org.springframework.format.annotation.DateTimeFormat; import java.math.BigDecimal; @@ -13,7 +13,7 @@ import java.time.LocalDateTime; @Data @Schema(description = "订单售后 查询 对象") -public class AftersaleBo { +public class AftersaleBo extends BaseBO { @Schema(description = "MEMBER_ID 精确匹配") private Long memberId; @@ -64,7 +64,7 @@ public class AftersaleBo { @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime endTime; - public Wrapper toWrapper() { + public LambdaQueryWrapper toWrapper() { return new LambdaQueryWrapper() .eq(memberId != null, Aftersale::getMemberId, memberId) .eq(orderId != null, Aftersale::getOrderId, orderId) diff --git a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/impl/AftersaleServiceImpl.java b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/impl/AftersaleServiceImpl.java index 911978bc5..d55e9f5b4 100644 --- a/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/impl/AftersaleServiceImpl.java +++ b/ruoyi-modules/ruoyi-order/src/main/java/com/wzj/soopin/order/service/impl/AftersaleServiceImpl.java @@ -31,6 +31,9 @@ import org.dromara.common.core.domain.R; import org.dromara.common.core.domain.event.Constants; import org.dromara.common.core.enums.AftersaleStatus; import org.dromara.common.core.enums.OrderRefundStatus; +import org.dromara.common.mq.domain.MQMessage; +import org.dromara.common.mq.enums.MessageActionEnum; +import org.dromara.common.mq.utils.MqUtil; import org.dromara.common.satoken.utils.LoginHelper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -232,8 +235,24 @@ public class AftersaleServiceImpl extends ServiceImpl params = new HashMap<>(); + Member sender=new Member(); + sender.setUserId(Long.valueOf(actionEnum.getCode())); + params.put("sender", sender); + +// params.put("receiver", memberService.getMemberInfo(o.getMemberId())); + params.put("object", o); + params.put("action", actionEnum.getAccount()); + MQMessage mqMessage = new MQMessage(); + mqMessage.setTag(actionEnum.getAccount()); + mqMessage.setData(params); + return mqMessage; + } public void tradeRefund(Aftersale returnApply, Order order, LocalDateTime optDate, Long userId) { //查一下微信订单 QueryWrapper qw = new QueryWrapper<>(); diff --git a/ruoyi-modules/ruoyi-transaction/src/main/java/com/wzj/soopin/transaction/service/IWithdrawService.java b/ruoyi-modules/ruoyi-transaction/src/main/java/com/wzj/soopin/transaction/service/IWithdrawService.java index 21620bb4d..d91d6c981 100644 --- a/ruoyi-modules/ruoyi-transaction/src/main/java/com/wzj/soopin/transaction/service/IWithdrawService.java +++ b/ruoyi-modules/ruoyi-transaction/src/main/java/com/wzj/soopin/transaction/service/IWithdrawService.java @@ -9,7 +9,6 @@ public interface IWithdrawService extends IService { boolean withdrawCallback(WithdrawBO withdraw); - boolean withdrawWallet(Withdraw withdraw); + boolean withdraw (Withdraw withdraw); - boolean withdrawRevenue (Withdraw withdraw); } diff --git a/ruoyi-modules/ruoyi-transaction/src/main/java/com/wzj/soopin/transaction/service/impl/WithdrawServiceImpl.java b/ruoyi-modules/ruoyi-transaction/src/main/java/com/wzj/soopin/transaction/service/impl/WithdrawServiceImpl.java index a2d95d463..66bd3d100 100644 --- a/ruoyi-modules/ruoyi-transaction/src/main/java/com/wzj/soopin/transaction/service/impl/WithdrawServiceImpl.java +++ b/ruoyi-modules/ruoyi-transaction/src/main/java/com/wzj/soopin/transaction/service/impl/WithdrawServiceImpl.java @@ -1,6 +1,7 @@ package com.wzj.soopin.transaction.service.impl; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.wzj.soopin.content.domain.po.Comment; import com.wzj.soopin.member.domain.po.Member; import com.wzj.soopin.transaction.domain.bo.WithdrawBO; import com.wzj.soopin.member.domain.po.MemberAccount; @@ -19,10 +20,15 @@ import com.wzj.soopin.transaction.domain.vo.EasypayAccountVO; import com.wzj.soopin.transaction.service.IAccountBillService; import com.wzj.soopin.transaction.service.IWithdrawService; import com.wzj.soopin.transaction.service.IEasypayService; +import com.wzj.soopin.transaction.util.SnowFlake; import com.wzj.soopin.transaction.wechat.WechatPayConfig; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.constant.ResultCode; import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.mq.domain.MQMessage; +import org.dromara.common.mq.enums.MessageActionEnum; +import org.dromara.common.mq.utils.MqUtil; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.system.domain.SysTenantAccount; import org.dromara.system.service.ISysTenantAccountService; @@ -30,9 +36,7 @@ import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; +import java.util.*; /** * 会员封禁 @@ -60,22 +64,25 @@ public class WithdrawServiceImpl extends ServiceImpl i private final IMemberService memberService; + private final WechatPayConfig wechatPayConfig; @Override public boolean audit(WithdrawBO bo) { Withdraw withdraw = getById(bo.getId()); if (withdraw == null) { throw new RuntimeException("提现申请不存在"); } - if (!Objects.equals(WithdrawAuditStatus.PENDING.getCode(), withdraw.getAuditStatus())) { + if (!Objects.equals(WithdrawAuditStatus.PENDING.getCode(), withdraw.getStatus())) { throw new RuntimeException("提现申请已处理"); } //发起提现 try{ - wxPayService.initiateBatchTransferNew(buildWechatPayParam(bo)); + wxPayService.initiateBatchTransferNew(buildWechatPayParam(withdraw)); }catch (ServiceException e){ - log.error("提现申请失败",e); - throw new RuntimeException("提现申请失败"); + //提现失败 + //发送通知 + MqUtil.sendIMMessage(buildMessage(withdraw,MessageActionEnum.ORDER_WITHDRAW_AUDIT)); + throw new ServiceException(ResultCode.WITHDRAW_AUDIT_ERROR); } withdraw = Withdraw.builder().id(bo.getId()) .auditReason(bo.getAuditReason()) @@ -84,14 +91,36 @@ public class WithdrawServiceImpl extends ServiceImpl i .auditBy(LoginHelper.getUserId()) .build(); this.updateById(withdraw); + + //发送成功通知 + MqUtil.sendIMMessage(buildMessage(withdraw, MessageActionEnum.ORDER_WITHDRAW_AUDIT)); return true; } + private MQMessage buildMessage(Withdraw o, MessageActionEnum actionEnum) { + Map params = new HashMap<>(); + Member sender=new Member(); + sender.setUserId(Long.valueOf(actionEnum.getCode())); + params.put("sender", sender); + params.put("receiver", memberService.getMemberInfo(o.getMemberId())); + params.put("object", o); + params.put("action", actionEnum.getAccount()); + MQMessage mqMessage = new MQMessage(); + mqMessage.setTag(actionEnum.getAccount()); + mqMessage.setData(params); + return mqMessage; + } + - private InitiateBatchTransferRequestNew buildWechatPayParam(WithdrawBO withdraw) { + //sender + //receiver + //object + //action + + + private InitiateBatchTransferRequestNew buildWechatPayParam(Withdraw withdraw) { InitiateBatchTransferRequestNew request = new InitiateBatchTransferRequestNew(); - WechatPayConfig wechatPayConfig = new WechatPayConfig(); //商户AppID request.setAppid(wechatPayConfig.getAppId()); //商户单号 @@ -104,7 +133,9 @@ public class WithdrawServiceImpl extends ServiceImpl i Member member=memberService.getById(withdraw.getMemberId()); request.setOpenid(member.getOpenId()); //收款用户姓名 - request.setUserName(member.getNickname()); + if (request.getTransferAmount() > 30) { + request.setUserName(member.getNickname()); + } //转账备注 request.setTransferRemark("提现"); //转账场景报备信息 佣金的固定类型 @@ -155,47 +186,8 @@ public class WithdrawServiceImpl extends ServiceImpl i } - public boolean withdrawRevenue(Withdraw withdraw) { - //调用三方支付平台获取用户余额 - // TODO: 2025/9/10 这个地方不能用null ,但是现在商户提现的业务不对,暂时没有提现业务 - SysTenantAccount tenantAccount = sysTenantAccountService.getByTenantId(null); - if (tenantAccount == null) { - throw new RuntimeException("用户不存在"); - } - BigDecimal balance = tenantAccount.getRevenue(); - EasypayAccountVO easypayAccountVO = easypayService.getEasypayAccount(withdraw.getMemberId()); - if (easypayAccountVO == null) { - throw new RuntimeException("账户余额获取失败"); - } - //生成费用 - BigDecimal fee = withdraw.getMoney().multiply(new BigDecimal("0.01")); - withdraw.setFee(fee); - withdraw.setActualMoney(withdraw.getMoney().subtract(fee)); - - - save(withdraw); - BigDecimal newBalance = balance.subtract(withdraw.getMoney()); - - tenantAccount.setRevenue(newBalance); - //锁定用户余额 - sysTenantAccountService.updateById(tenantAccount); - - //生成账单 - AccountBill memberAccountChangeRecord = AccountBill.builder() - .accountId(withdraw.getMemberId()) - .moneyBalance(balance.subtract(withdraw.getMoney())) - .beforeBalance(balance) - .afterBalance(newBalance) - .changeType(AccountBillChangeTypeEnum.OUT.getCode()) - .changeDesc("提现锁定") - .source(AccountBillSourceEnum.WITHDRAW.getCode()) - .build(); - accountBillService.save(memberAccountChangeRecord); - return true; - } - - public boolean withdrawWallet(Withdraw withdraw) { + public boolean withdraw (Withdraw withdraw) { MemberAccount memberAccount = memberAccountService.getMemberAccount(withdraw.getMemberId()); if (memberAccount == null) { throw new RuntimeException("用户不存在"); @@ -206,9 +198,10 @@ public class WithdrawServiceImpl extends ServiceImpl i throw new RuntimeException("用户余额不足"); } //生成费用 - BigDecimal fee = withdraw.getMoney().multiply(new BigDecimal("0.01")); + BigDecimal fee = withdraw.getMoney().multiply(new BigDecimal("0.00")); withdraw.setFee(fee); withdraw.setActualMoney(withdraw.getMoney().subtract(fee)); + withdraw.setCode(SnowFlake.createStr("TX")); save(withdraw); BigDecimal newBalance = balance.subtract(withdraw.getMoney()); diff --git a/ruoyi-modules/ruoyi-transaction/src/main/java/com/wzj/soopin/transaction/service/impl/WxPayService.java b/ruoyi-modules/ruoyi-transaction/src/main/java/com/wzj/soopin/transaction/service/impl/WxPayService.java index 694a35603..85ac0dc8b 100644 --- a/ruoyi-modules/ruoyi-transaction/src/main/java/com/wzj/soopin/transaction/service/impl/WxPayService.java +++ b/ruoyi-modules/ruoyi-transaction/src/main/java/com/wzj/soopin/transaction/service/impl/WxPayService.java @@ -17,6 +17,7 @@ import com.wzj.soopin.transaction.domain.entity.TransferBillEntity; import com.wzj.soopin.transaction.domain.entity.TransferDetailEntityNew; import com.wzj.soopin.transaction.wechat.WechatPayConfig; import jakarta.servlet.http.HttpServletRequest; +import org.dromara.common.core.constant.ResultCode; import org.dromara.common.core.exception.ServiceException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -53,32 +54,27 @@ public class WxPayService { */ public InitiateBatchTransferResponseNew initiateBatchTransferNew(InitiateBatchTransferRequestNew request) { logger.info("WxPayService.initiateBatchTransferNew request:{}", request.toString()); - try{ - + if(request.getUserName()!=null){ String encryptName = wxPayConfig.createEncryptor().encrypt(request.getUserName()); request.setUserName(encryptName); - String requestPath = "https://api.mch.weixin.qq.com/v3/fund-app/mch-transfer/transfer-bills"; - HttpHeaders headers = new HttpHeaders(); - headers.addHeader("Accept", MediaType.APPLICATION_JSON.getValue()); - headers.addHeader("Content-Type", MediaType.APPLICATION_JSON.getValue()); - headers.addHeader("Wechatpay-Serial", wxPayConfig.createEncryptor().getWechatpaySerial()); - HttpRequest httpRequest = - new HttpRequest.Builder() - .httpMethod(HttpMethod.POST) - .url(requestPath) - .headers(headers) - .body(createRequestBody(request)) - .build(); - HttpClient httpClient = new DefaultHttpClientBuilder().config(wxPayConfig).build(); - HttpResponse httpResponse = httpClient.execute(httpRequest, InitiateBatchTransferResponseNew.class); - logger.info("WxPayService.initiateBatchTransferNew response:{}", httpResponse.getServiceResponse()); - return httpResponse.getServiceResponse(); - - }catch (Exception e){ - logger.error("WxPayService.initiateBatchTransferNew error:{}", e); } - return null; + String requestPath = "https://api.mch.weixin.qq.com/v3/fund-app/mch-transfer/transfer-bills"; + HttpHeaders headers = new HttpHeaders(); + headers.addHeader("Accept", MediaType.APPLICATION_JSON.getValue()); + headers.addHeader("Content-Type", MediaType.APPLICATION_JSON.getValue()); + headers.addHeader("Wechatpay-Serial", wxPayConfig.createEncryptor().getWechatpaySerial()); + HttpRequest httpRequest = + new HttpRequest.Builder() + .httpMethod(HttpMethod.POST) + .url(requestPath) + .headers(headers) + .body(createRequestBody(request)) + .build(); + HttpClient httpClient = new DefaultHttpClientBuilder().config(wxPayConfig).build(); + HttpResponse httpResponse = httpClient.execute(httpRequest, InitiateBatchTransferResponseNew.class); + logger.info("WxPayService.initiateBatchTransferNew response:{}", httpResponse.getServiceResponse()); + return httpResponse.getServiceResponse(); } /** @@ -91,22 +87,22 @@ public class WxPayService { logger.info("WxPayService.getTransferDetailByOutNoNew request:{}", outBillNo); Config config = new RSAAutoCertificateConfig.Builder() - .merchantId(WechatPayConfig.getMchId()) - .privateKeyFromPath(WechatPayConfig.getPrivateKeyPath()) - .merchantSerialNumber(WechatPayConfig.getMchSerialNo()) - .apiV3Key(WechatPayConfig.getApiV3Key()) - .build(); + .merchantId(WechatPayConfig.getMchId()) + .privateKeyFromPath(WechatPayConfig.getPrivateKeyPath()) + .merchantSerialNumber(WechatPayConfig.getMchSerialNo()) + .apiV3Key(WechatPayConfig.getApiV3Key()) + .build(); String requestPath = "https://api.mch.weixin.qq.com/v3/fund-app/mch-transfer/transfer-bills/out-bill-no/{out_bill_no}"; requestPath = requestPath.replace("{out_bill_no}", UrlEncoder.urlEncode(outBillNo)); HttpHeaders headers = new HttpHeaders(); headers.addHeader("Accept", MediaType.APPLICATION_JSON.getValue()); headers.addHeader("Content-Type", MediaType.APPLICATION_JSON.getValue()); HttpRequest httpRequest = - new HttpRequest.Builder() - .httpMethod(HttpMethod.GET) - .url(requestPath) - .headers(headers) - .build(); + new HttpRequest.Builder() + .httpMethod(HttpMethod.GET) + .url(requestPath) + .headers(headers) + .build(); PrivacyDecryptor decryptor = config.createDecryptor(); HttpClient httpClient = new DefaultHttpClientBuilder().config(config).build(); HttpResponse httpResponse = httpClient.execute(httpRequest, TransferDetailEntityNew.class); @@ -142,20 +138,20 @@ public class WxPayService { String wechatpayNonce = request.getHeader("Wechatpay-Nonce"); // 1. 构造 RequestParam RequestParam requestParam = new RequestParam.Builder() - .serialNumber(wechatPaySerial) - .nonce(wechatpayNonce) - .signature(wechatSignature) - .timestamp(wechatTimestamp) - .body(requestBody) - .build(); + .serialNumber(wechatPaySerial) + .nonce(wechatpayNonce) + .signature(wechatSignature) + .timestamp(wechatTimestamp) + .body(requestBody) + .build(); // 2. 构建Config RSAAutoCertificateConfig Config config = new RSAAutoCertificateConfig.Builder() - .merchantId(WechatPayConfig.getMchId()) - .privateKeyFromPath(WechatPayConfig.getPrivateKeyPath()) - .merchantSerialNumber(WechatPayConfig.getMchSerialNo()) - .apiV3Key(WechatPayConfig.getApiV3Key()) - .build(); - logger.info("WxPayService.wxPaySuccessCallback request : wechatPaySerial is [{}] , wechatSignature is [{}] , wechatTimestamp is [{}] , wechatpayNonce is [{}] , requestBody is [{}]",wechatPaySerial,wechatSignature,wechatTimestamp,wechatpayNonce,requestBody); + .merchantId(WechatPayConfig.getMchId()) + .privateKeyFromPath(WechatPayConfig.getPrivateKeyPath()) + .merchantSerialNumber(WechatPayConfig.getMchSerialNo()) + .apiV3Key(WechatPayConfig.getApiV3Key()) + .build(); + logger.info("WxPayService.wxPaySuccessCallback request : wechatPaySerial is [{}] , wechatSignature is [{}] , wechatTimestamp is [{}] , wechatpayNonce is [{}] , requestBody is [{}]", wechatPaySerial, wechatSignature, wechatTimestamp, wechatpayNonce, requestBody); // 3. 初始化 NotificationParser NotificationParser parser = new NotificationParser((NotificationConfig) config); try { @@ -244,6 +240,5 @@ public class WxPayService { } - }