From 886c982dd5c468fdcd2de2374e23e4de57c5aa41 Mon Sep 17 00:00:00 2001 From: Derran Date: Sat, 11 May 2024 14:22:03 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9F=BA=E7=A1=80=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../constant/WithdrawAuditStatus.java | 42 +++++++++++++++++++ .../withdrawaudit/entity/WithdrawAudit.java | 11 ++++- .../WithdrawAuditUserCommandController.java | 9 ++-- .../UserApplyWalletAccountWithdrawDto.java | 9 +++- .../WalletAccountApplicationService.java | 7 ---- .../WithdrawAuditApplicationService.java | 32 ++++++++++++++ .../withdrawaudit/WithdrawAuditAggregate.java | 20 +++++++++ .../repository/WithdrawAuditRepository.java | 7 ++++ .../ApplyWithdrawAuditDomainService.java | 25 +++++++++++ .../dao/domain/WithdrawAuditDao.java | 7 ++++ .../impl/WithdrawAuditRepositoryImpl.java | 31 ++++++++++++++ 11 files changed, 188 insertions(+), 12 deletions(-) create mode 100644 dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/withdrawaudit/constant/WithdrawAuditStatus.java delete mode 100644 dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/walletaccount/WalletAccountApplicationService.java create mode 100644 dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/withdrawaudit/WithdrawAuditApplicationService.java create mode 100644 dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/withdrawaudit/WithdrawAuditAggregate.java create mode 100644 dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/withdrawaudit/repository/WithdrawAuditRepository.java create mode 100644 dating-agency-mall-server/src/main/java/com/qniao/dam/domain/service/withdrawaudit/ApplyWithdrawAuditDomainService.java create mode 100644 dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/dao/domain/WithdrawAuditDao.java create mode 100644 dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/repository/impl/WithdrawAuditRepositoryImpl.java diff --git a/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/withdrawaudit/constant/WithdrawAuditStatus.java b/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/withdrawaudit/constant/WithdrawAuditStatus.java new file mode 100644 index 0000000..77d46a5 --- /dev/null +++ b/dating-agency-mall-constant/src/main/java/com/qniao/dam/domian/aggregate/withdrawaudit/constant/WithdrawAuditStatus.java @@ -0,0 +1,42 @@ +package com.qniao.dam.domian.aggregate.withdrawaudit.constant; + +import com.baomidou.mybatisplus.annotation.EnumValue; +import com.fasterxml.jackson.annotation.JsonCreator; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.annotation.JsonValue; +import lombok.Getter; + +@Getter +@JsonFormat(shape = JsonFormat.Shape.OBJECT) +public enum WithdrawAuditStatus { + + TO_BE_REVIEWED(1,"待审核"), + + PASS_VERIFICATION(2,"审核通过"), + + AUDIT_FAILURE(3,"审核失败"); + + + + @EnumValue + @JsonValue + private final Integer value; + + private final String desc; + + WithdrawAuditStatus(Integer value, String desc) { + this.value = value; + this.desc = desc; + } + + @JsonCreator + public static WithdrawAuditStatus get(Integer v) { + + for (WithdrawAuditStatus e : WithdrawAuditStatus.values()) { + if (e.getValue().equals(v)) { + return e; + } + } + return null; + } +} diff --git a/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/withdrawaudit/entity/WithdrawAudit.java b/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/withdrawaudit/entity/WithdrawAudit.java index 10de4de..b25a7c2 100644 --- a/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/withdrawaudit/entity/WithdrawAudit.java +++ b/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/withdrawaudit/entity/WithdrawAudit.java @@ -2,19 +2,28 @@ package com.qniao.dam.domain.aggregate.withdrawaudit.entity; import com.baomidou.mybatisplus.annotation.TableName; +import com.qniao.dam.domian.aggregate.withdrawaudit.constant.WithdrawAuditStatus; import com.qniao.domain.Entity; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; +import java.math.BigDecimal; + @Data @EqualsAndHashCode(callSuper = true) @TableName("da_withdraw_audit") public class WithdrawAudit extends Entity { @ApiModelProperty("用户唯一标识") - private Long userId; + private Long walletAccountUserId; + @ApiModelProperty("钱包账号标识") + private Long walletAccountId; + @ApiModelProperty("提现金额") + private BigDecimal withdrawAmount; + @ApiModelProperty("提现状态") + private WithdrawAuditStatus status; } diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/withdrawaudit/user/WithdrawAuditUserCommandController.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/withdrawaudit/user/WithdrawAuditUserCommandController.java index 262ce1c..8e9e146 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/withdrawaudit/user/WithdrawAuditUserCommandController.java +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/withdrawaudit/user/WithdrawAuditUserCommandController.java @@ -1,7 +1,8 @@ package com.qniao.dam.api.command.withdrawaudit.user; import com.qniao.dam.api.command.withdrawaudit.user.request.UserApplyWalletAccountWithdrawDto; -import com.qniao.dam.application.service.walletaccount.WalletAccountApplicationService; +import com.qniao.dam.application.service.withdrawaudit.WithdrawAuditApplicationService; +import com.qniao.dam.domain.aggregate.withdrawaudit.entity.WithdrawAudit; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.web.bind.annotation.*; @@ -15,13 +16,15 @@ import javax.validation.Valid; public class WithdrawAuditUserCommandController { @Resource - private WalletAccountApplicationService walletAccountApplicationService; + private WithdrawAuditApplicationService withdrawAuditApplicationService; @ApiOperation("用户发起提现申请") @PostMapping("apply/wallet-account/withdraw") public void userApplyWalletAccountWithdraw(@RequestBody @Valid UserApplyWalletAccountWithdrawDto dto, @RequestParam("userId") Long userId) { - //return walletAccountApplicationService.applyWithdraw(dto); + WithdrawAudit withdrawAudit = dto.trans2Domain(); + withdrawAudit.setWalletAccountUserId(userId); + withdrawAuditApplicationService.applyWithdraw(withdrawAudit); } } diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/withdrawaudit/user/request/UserApplyWalletAccountWithdrawDto.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/withdrawaudit/user/request/UserApplyWalletAccountWithdrawDto.java index c9b911d..5bb4fb0 100644 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/withdrawaudit/user/request/UserApplyWalletAccountWithdrawDto.java +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/withdrawaudit/user/request/UserApplyWalletAccountWithdrawDto.java @@ -1,5 +1,8 @@ package com.qniao.dam.api.command.withdrawaudit.user.request; +import com.qniao.dam.domain.aggregate.withdrawaudit.entity.WithdrawAudit; +import com.qniao.domain.Trans2DomainAssembler; +import com.qniao.framework.utils.TypeConvertUtils; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -8,11 +11,15 @@ import javax.validation.constraints.NotNull; import java.math.BigDecimal; @Data -public class UserApplyWalletAccountWithdrawDto { +public class UserApplyWalletAccountWithdrawDto implements Trans2DomainAssembler { @ApiModelProperty("提现金额") @NotNull(message = "提现金额不能为空") @DecimalMin(value = "0.01", message = "提现金额不等低于0.01") private BigDecimal withdrawAmount; + @Override + public WithdrawAudit trans2Domain() { + return TypeConvertUtils.convert(this, WithdrawAudit.class); + } } diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/walletaccount/WalletAccountApplicationService.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/walletaccount/WalletAccountApplicationService.java deleted file mode 100644 index 774bd57..0000000 --- a/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/walletaccount/WalletAccountApplicationService.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.qniao.dam.application.service.walletaccount; - -import org.springframework.stereotype.Service; - -@Service -public class WalletAccountApplicationService { -} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/withdrawaudit/WithdrawAuditApplicationService.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/withdrawaudit/WithdrawAuditApplicationService.java new file mode 100644 index 0000000..87949c1 --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/withdrawaudit/WithdrawAuditApplicationService.java @@ -0,0 +1,32 @@ +package com.qniao.dam.application.service.withdrawaudit; + +import com.qniao.dam.domain.aggregate.walletaccount.entity.WalletAccount; +import com.qniao.dam.domain.aggregate.withdrawaudit.entity.WithdrawAudit; +import com.qniao.dam.domain.service.withdrawaudit.ApplyWithdrawAuditDomainService; +import com.qniao.dam.query.walletaccount.WalletAccountQueryService; +import com.qniao.framework.exception.BizException; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Objects; + +@Service +public class WithdrawAuditApplicationService { + @Resource + private WalletAccountQueryService walletAccountQueryService; + @Resource + private ApplyWithdrawAuditDomainService applyWithdrawAuditDomainService; + + public void applyWithdraw(WithdrawAudit withdrawAudit) { + synchronized (withdrawAudit.getWalletAccountUserId().toString().intern()) { + WalletAccount walletAccount = walletAccountQueryService.queryByUserId(withdrawAudit.getWalletAccountUserId()); + if (Objects.isNull(walletAccount) || withdrawAudit.getWithdrawAmount().compareTo(walletAccount.getAvailableBalance()) > 0) { + throw new BizException("超出可提现金额"); + } + withdrawAudit.setWalletAccountId(walletAccount.getId()); + walletAccount.setAvailableBalance(walletAccount.getAvailableBalance().subtract(withdrawAudit.getWithdrawAmount())); + walletAccount.setFrozenBalance(walletAccount.getFrozenBalance().add(withdrawAudit.getWithdrawAmount())); + applyWithdrawAuditDomainService.handle(withdrawAudit,walletAccount); + } + } +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/withdrawaudit/WithdrawAuditAggregate.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/withdrawaudit/WithdrawAuditAggregate.java new file mode 100644 index 0000000..287def4 --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/withdrawaudit/WithdrawAuditAggregate.java @@ -0,0 +1,20 @@ +package com.qniao.dam.domain.aggregate.withdrawaudit; + +import com.qniao.dam.domain.aggregate.withdrawaudit.entity.WithdrawAudit; +import com.qniao.dam.domain.aggregate.withdrawaudit.repository.WithdrawAuditRepository; +import com.qniao.dam.domian.aggregate.withdrawaudit.constant.WithdrawAuditStatus; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +@Service +public class WithdrawAuditAggregate { + + @Resource + private WithdrawAuditRepository withdrawAuditRepository; + + public void apply(WithdrawAudit withdrawAudit) { + withdrawAudit.setStatus(WithdrawAuditStatus.TO_BE_REVIEWED); + withdrawAuditRepository.save(withdrawAudit); + } +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/withdrawaudit/repository/WithdrawAuditRepository.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/withdrawaudit/repository/WithdrawAuditRepository.java new file mode 100644 index 0000000..0312fa8 --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/withdrawaudit/repository/WithdrawAuditRepository.java @@ -0,0 +1,7 @@ +package com.qniao.dam.domain.aggregate.withdrawaudit.repository; + +import com.qniao.dam.domain.aggregate.withdrawaudit.entity.WithdrawAudit; +import com.qniao.domain.Repository; + +public interface WithdrawAuditRepository extends Repository { +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/service/withdrawaudit/ApplyWithdrawAuditDomainService.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/service/withdrawaudit/ApplyWithdrawAuditDomainService.java new file mode 100644 index 0000000..9917bc8 --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/service/withdrawaudit/ApplyWithdrawAuditDomainService.java @@ -0,0 +1,25 @@ +package com.qniao.dam.domain.service.withdrawaudit; + +import com.qniao.dam.domain.aggregate.walletaccount.WalletAccountAggregate; +import com.qniao.dam.domain.aggregate.walletaccount.entity.WalletAccount; +import com.qniao.dam.domain.aggregate.withdrawaudit.WithdrawAuditAggregate; +import com.qniao.dam.domain.aggregate.withdrawaudit.entity.WithdrawAudit; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; + +@Service +public class ApplyWithdrawAuditDomainService { + + @Resource + private WithdrawAuditAggregate withdrawAuditAggregate; + @Resource + private WalletAccountAggregate walletAccountAggregate; + + @Transactional(rollbackFor = Exception.class) + public void handle(WithdrawAudit withdrawAudit, WalletAccount walletAccount) { + withdrawAuditAggregate.apply(withdrawAudit); + walletAccountAggregate.save(walletAccount); + } +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/dao/domain/WithdrawAuditDao.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/dao/domain/WithdrawAuditDao.java new file mode 100644 index 0000000..de82012 --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/dao/domain/WithdrawAuditDao.java @@ -0,0 +1,7 @@ +package com.qniao.dam.infrastructure.persistent.dao.domain; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qniao.dam.domain.aggregate.withdrawaudit.entity.WithdrawAudit; + +public interface WithdrawAuditDao extends BaseMapper { +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/repository/impl/WithdrawAuditRepositoryImpl.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/repository/impl/WithdrawAuditRepositoryImpl.java new file mode 100644 index 0000000..7b2da32 --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/repository/impl/WithdrawAuditRepositoryImpl.java @@ -0,0 +1,31 @@ +package com.qniao.dam.infrastructure.persistent.repository.impl; + +import com.qniao.dam.domain.aggregate.withdrawaudit.entity.WithdrawAudit; +import com.qniao.dam.domain.aggregate.withdrawaudit.repository.WithdrawAuditRepository; +import com.qniao.dam.infrastructure.persistent.dao.domain.WithdrawAuditDao; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Objects; + +@Service +public class WithdrawAuditRepositoryImpl implements WithdrawAuditRepository { + + @Resource + private WithdrawAuditDao withdrawAuditDao; + + @Override + public WithdrawAudit load(Long id) { + return withdrawAuditDao.selectById(id); + } + + @Override + public Long save(WithdrawAudit entity) { + if (Objects.isNull(entity.getId()) || Objects.isNull(withdrawAuditDao.selectById(entity.getId()))) { + withdrawAuditDao.insert(entity); + } else { + withdrawAuditDao.updateById(entity); + } + return entity.getId(); + } +}