From c01f7e2a906c736a11317aa2fda3b78e7a22fb32 Mon Sep 17 00:00:00 2001 From: Helius <wangdoubleone@gmail.com> Date: Fri, 24 Sep 2021 20:00:22 +0800 Subject: [PATCH] add transfer and withdrawal --- src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberWalletServiceImpl.java | 16 +++++ src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeEnum.java | 6 + src/main/java/cc/mrbird/febs/mall/dto/TransferDto.java | 32 ++++++++++ src/main/java/cc/mrbird/febs/common/utils/MallUtils.java | 11 +++ src/main/java/cc/mrbird/febs/mall/dto/WithdrawalDto.java | 28 +++++++++ src/main/java/cc/mrbird/febs/mall/controller/ApiMallMemberController.java | 22 ++++++- src/main/resources/mapper/modules/MallMemberMapper.xml | 2 src/main/java/cc/mrbird/febs/mall/service/IApiMallMemberService.java | 4 + src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java | 47 ++++++++++++++- 9 files changed, 157 insertions(+), 11 deletions(-) diff --git a/src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeEnum.java b/src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeEnum.java index efad520..af147ee 100644 --- a/src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeEnum.java +++ b/src/main/java/cc/mrbird/febs/common/enumerates/MoneyFlowTypeEnum.java @@ -28,7 +28,11 @@ /** * 转账 */ - TRANSFER(5); + TRANSFER(5), + /** + * 提现 + */ + WITHDRAWAL(6); private final int value; diff --git a/src/main/java/cc/mrbird/febs/common/utils/MallUtils.java b/src/main/java/cc/mrbird/febs/common/utils/MallUtils.java index fb61d3f..2f28b00 100644 --- a/src/main/java/cc/mrbird/febs/common/utils/MallUtils.java +++ b/src/main/java/cc/mrbird/febs/common/utils/MallUtils.java @@ -1,5 +1,7 @@ package cc.mrbird.febs.common.utils; +import cn.hutool.core.util.StrUtil; + import java.text.SimpleDateFormat; import java.util.Date; import java.util.Random; @@ -22,9 +24,16 @@ return sb.toString(); } - public static String getOrderNum() { + public static String getOrderNum(String prefix) { SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHHmmss"); String dd=df.format(new Date()); + if (StrUtil.isNotBlank(prefix)) { + return prefix+dd+getRandomNum(5); + } return dd+getRandomNum(5); } + + public static String getOrderNum() { + return getOrderNum(null); + } } diff --git a/src/main/java/cc/mrbird/febs/mall/controller/ApiMallMemberController.java b/src/main/java/cc/mrbird/febs/mall/controller/ApiMallMemberController.java index 775c46a..9a6ff62 100644 --- a/src/main/java/cc/mrbird/febs/mall/controller/ApiMallMemberController.java +++ b/src/main/java/cc/mrbird/febs/mall/controller/ApiMallMemberController.java @@ -1,10 +1,7 @@ package cc.mrbird.febs.mall.controller; import cc.mrbird.febs.common.entity.FebsResponse; -import cc.mrbird.febs.mall.dto.ForgetPwdDto; -import cc.mrbird.febs.mall.dto.ModifyMemberInfoDto; -import cc.mrbird.febs.mall.dto.MoneyFlowDto; -import cc.mrbird.febs.mall.dto.TeamListDto; +import cc.mrbird.febs.mall.dto.*; import cc.mrbird.febs.mall.service.IApiMallMemberService; import cc.mrbird.febs.mall.vo.MallMemberVo; import cc.mrbird.febs.mall.vo.MoneyFlowVo; @@ -15,7 +12,10 @@ import io.swagger.annotations.ApiResponses; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; /** * @author wzy @@ -80,4 +80,18 @@ public FebsResponse moneyFlow(@RequestBody MoneyFlowDto moneyFlowDto) { return memberService.moneyFlows(moneyFlowDto); } + + @ApiOperation(value = "转账") + @PostMapping(value = "/transfer") + public FebsResponse transfer(@RequestBody @Validated TransferDto transferDto) { + memberService.transfer(transferDto); + return new FebsResponse().success().message("转账成功"); + } + + @ApiOperation(value = "提现") + @PostMapping(value = "/withdrawal") + public FebsResponse withdrawal(@RequestBody @Validated WithdrawalDto withdrawalDto) { + memberService.withdrawal(withdrawalDto); + return new FebsResponse().success().message("提交成功"); + } } diff --git a/src/main/java/cc/mrbird/febs/mall/dto/TransferDto.java b/src/main/java/cc/mrbird/febs/mall/dto/TransferDto.java new file mode 100644 index 0000000..91428c2 --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/dto/TransferDto.java @@ -0,0 +1,32 @@ +package cc.mrbird.febs.mall.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.Min; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; + +/** + * @author wzy + * @date 2021-09-24 + **/ +@Data +@ApiModel(value = "TransferDto", description = "转账接收参数类") +public class TransferDto { + + @NotBlank(message = "参数不能为空") + @ApiModelProperty(value = "联系电话或邀请码", example = "123") + private String account; + + @NotNull(message = "参数不能为空") + @Min(0) + @ApiModelProperty(value = "金额", example = "1") + private BigDecimal amount; + + @NotBlank(message = "参数不能为空") + @ApiModelProperty(value = "交易密码", example = "123456") + private String tradePwd; +} diff --git a/src/main/java/cc/mrbird/febs/mall/dto/WithdrawalDto.java b/src/main/java/cc/mrbird/febs/mall/dto/WithdrawalDto.java new file mode 100644 index 0000000..c3524b0 --- /dev/null +++ b/src/main/java/cc/mrbird/febs/mall/dto/WithdrawalDto.java @@ -0,0 +1,28 @@ +package cc.mrbird.febs.mall.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.Min; +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; + +/** + * @author wzy + * @date 2021-09-24 + **/ +@Data +@ApiModel(value = "WithdrawalDto", description = "提现接收参数类") +public class WithdrawalDto { + + @Min(0) + @NotNull(message = "参数不能为空") + @ApiModelProperty(value = "金额") + private BigDecimal amount; + + @NotBlank(message = "参数不能为空") + @ApiModelProperty(value = "交易密码") + private String tradePwd; +} diff --git a/src/main/java/cc/mrbird/febs/mall/service/IApiMallMemberService.java b/src/main/java/cc/mrbird/febs/mall/service/IApiMallMemberService.java index 03db35f..75e5838 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/IApiMallMemberService.java +++ b/src/main/java/cc/mrbird/febs/mall/service/IApiMallMemberService.java @@ -29,4 +29,8 @@ FebsResponse moneyFlows(MoneyFlowDto moneyFlowDto); void addMoneyFlow(Long memberId, BigDecimal amount, Integer type, String orderNo, String description, String remark, Long rtMemberId, Integer status); + + void transfer(TransferDto transferDto); + + void withdrawal(WithdrawalDto withdrawalDto); } diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java index 979c1f7..0db78a7 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberServiceImpl.java @@ -1,11 +1,9 @@ package cc.mrbird.febs.mall.service.impl; import cc.mrbird.febs.common.entity.FebsResponse; +import cc.mrbird.febs.common.enumerates.MoneyFlowTypeEnum; import cc.mrbird.febs.common.exception.FebsException; -import cc.mrbird.febs.common.utils.AppContants; -import cc.mrbird.febs.common.utils.LoginUserUtil; -import cc.mrbird.febs.common.utils.RedisUtils; -import cc.mrbird.febs.common.utils.ShareCodeUtil; +import cc.mrbird.febs.common.utils.*; import cc.mrbird.febs.mall.conversion.MallMemberConversion; import cc.mrbird.febs.mall.dto.*; import cc.mrbird.febs.mall.entity.MallMember; @@ -14,6 +12,7 @@ import cc.mrbird.febs.mall.entity.MallShoppingCart; import cc.mrbird.febs.mall.mapper.*; import cc.mrbird.febs.mall.service.IApiMallMemberService; +import cc.mrbird.febs.mall.service.IApiMallMemberWalletService; import cc.mrbird.febs.mall.service.ICommonService; import cc.mrbird.febs.mall.vo.MallMemberVo; import cc.mrbird.febs.mall.vo.MoneyFlowVo; @@ -55,6 +54,7 @@ private final MallOrderInfoMapper mallOrderInfoMapper; private final MallShoppingCartMapper mallShoppingCartMapper; private final MallMoneyFlowMapper mallMoneyFlowMapper; + private final IApiMallMemberWalletService walletService; @Value("${spring.profiles.active}") private String active; @@ -320,4 +320,43 @@ flow.setStatus(status); mallMoneyFlowMapper.insert(flow); } + + @Override + @Transactional(rollbackFor = Exception.class) + public void transfer(TransferDto transferDto) { + MallMember mallMember = this.baseMapper.selectInfoByAccount(transferDto.getAccount()); + if (mallMember == null) { + throw new FebsException("用户不存在"); + } + + Long memberId = LoginUserUtil.getLoginUser().getId(); + MallMember loginMember = this.baseMapper.selectById(memberId); + if (!loginMember.getTradePassword().equals(SecureUtil.md5(transferDto.getTradePwd()))) { + throw new FebsException("支付密码错误"); + } + + walletService.reduceBalance(transferDto.getAmount(), memberId); + String orderNo = MallUtils.getOrderNum("T"); + this.addMoneyFlow(memberId, transferDto.getAmount().negate(), MoneyFlowTypeEnum.TRANSFER.getValue(), orderNo, null, null, mallMember.getId(), null); + + walletService.addBalance(transferDto.getAmount(), mallMember.getId()); + this.addMoneyFlow(mallMember.getId(), transferDto.getAmount(), MoneyFlowTypeEnum.TRANSFER.getValue(), orderNo, null, null, memberId, null); + } + + @Override + public void withdrawal(WithdrawalDto withdrawalDto) { + Long memberId = LoginUserUtil.getLoginUser().getId(); + MallMember mallMember = this.baseMapper.selectById(memberId); + if (!mallMember.getTradePassword().equals(SecureUtil.md5(withdrawalDto.getTradePwd()))) { + throw new FebsException("支付密码错误"); + } + + if (withdrawalDto.getAmount().compareTo(BigDecimal.valueOf(100)) < 0) { + throw new FebsException("最小提现金额为100"); + } + + walletService.reduceBalance(withdrawalDto.getAmount(), memberId); + String orderNo = MallUtils.getOrderNum("W"); + this.addMoneyFlow(memberId, withdrawalDto.getAmount().negate(), MoneyFlowTypeEnum.WITHDRAWAL.getValue(), orderNo, null, null, null, 1); + } } diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberWalletServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberWalletServiceImpl.java index 8066dfb..e2c2815 100644 --- a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberWalletServiceImpl.java +++ b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallMemberWalletServiceImpl.java @@ -23,7 +23,23 @@ @Override public void addBalance(BigDecimal amount, Long memberId) { + int i = 0; + boolean flag = true; + while (flag) { + i++; + MallMemberWallet wallet = this.baseMapper.selectWalletByMemberId(memberId); + wallet.setBalance(wallet.getBalance().add(amount)); + + int result = this.baseMapper.updateBalanceWithVersion(wallet); + if (result > 0) { + flag = false; + } else { + if (i > 2) { + throw new FebsException("余额增加失败"); + } + } + } } @Override diff --git a/src/main/resources/mapper/modules/MallMemberMapper.xml b/src/main/resources/mapper/modules/MallMemberMapper.xml index 0d8527d..0d4b86e 100644 --- a/src/main/resources/mapper/modules/MallMemberMapper.xml +++ b/src/main/resources/mapper/modules/MallMemberMapper.xml @@ -45,7 +45,7 @@ </select> <select id="selectInfoByAccount" resultType="cc.mrbird.febs.mall.entity.MallMember"> - select * from mall_member where phone=#{account} or email=#{account} + select * from mall_member where phone=#{account} or email=#{account} or invite_id=#{account} </select> <select id="selectInfoByInviteId" resultType="cc.mrbird.febs.mall.entity.MallMember"> -- Gitblit v1.9.1