diff --git a/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/virtualaccount/entity/VirtualAccount.java b/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/virtualaccount/entity/VirtualAccount.java new file mode 100644 index 0000000..bf0386b --- /dev/null +++ b/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/virtualaccount/entity/VirtualAccount.java @@ -0,0 +1,30 @@ +package com.qniao.dam.domain.aggregate.virtualaccount.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.qniao.dam.domain.aggregate.virtualaccount.valobj.VirtualAccountRecord; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import com.qniao.domain.Entity; + +import java.util.List; + +/** + * 虚拟账号 + * + * @date 2025/11/09 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("da_virtual_account") +public class VirtualAccount extends Entity { + + @ApiModelProperty("用户唯一标识") + private Long userId; + + @ApiModelProperty("数量") + private Integer balance; + + private transient List recordList; + +} diff --git a/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/virtualaccount/valobj/VirtualAccountRecord.java b/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/virtualaccount/valobj/VirtualAccountRecord.java new file mode 100644 index 0000000..18e3967 --- /dev/null +++ b/dating-agency-mall-entity/src/main/java/com/qniao/dam/domain/aggregate/virtualaccount/valobj/VirtualAccountRecord.java @@ -0,0 +1,36 @@ +package com.qniao.dam.domain.aggregate.virtualaccount.valobj; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.qniao.domain.ValueObject; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * @author Zpj + * @date 2025/11/9 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("da_virtual_account_record") +public class VirtualAccountRecord extends ValueObject { + + @ApiModelProperty("用户钱包账号标识") + private Long virtualAccountId; + + @ApiModelProperty("交易类型") + private Integer tradeType; + + @ApiModelProperty("交易数量") + private Integer tradeBalance; + + @ApiModelProperty("原始数量") + private Integer originalBalance; + + @ApiModelProperty("当前数量") + private Integer currentBalance; + + @ApiModelProperty("备注") + private String remark; + +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/virtualaccount/user/VirtualAccountUserCommandController.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/virtualaccount/user/VirtualAccountUserCommandController.java new file mode 100644 index 0000000..4dda8b5 --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/virtualaccount/user/VirtualAccountUserCommandController.java @@ -0,0 +1,40 @@ +package com.qniao.dam.api.command.virtualaccount.user; + +import com.qniao.dam.api.command.virtualaccount.user.request.*; +import com.qniao.dam.application.service.virtualaccount.VirtualAccountApplicationService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.validation.Valid; + +@Api(tags = "虚拟账号") +@RestController +@RequestMapping("user") +public class VirtualAccountUserCommandController { + + @Resource + private VirtualAccountApplicationService virtualAccountApplicationService; + + @ApiOperation("用户创建虚拟账号") + @PostMapping("create/virtual-account") + public void userCreateVirtualAccount(@RequestBody @Valid UserCreateVirtualAccountDto dto, + @RequestParam("userId") Long userId) { + virtualAccountApplicationService.create(dto.trans2Domain()); + } + + @ApiOperation("用户编辑虚拟账号") + @PostMapping("edit/virtual-account") + public void userEditVirtualAccount(@RequestBody @Valid UserEditVirtualAccountDto dto, + @RequestParam("userId") Long userId) { + virtualAccountApplicationService.edit(dto.trans2Domain()); + } + + @ApiOperation("用户删除虚拟账号") + @PostMapping("delete/virtual-account") + public void userDeleteVirtualAccount(@RequestBody @Valid UserDeleteVirtualAccountDto dto, + @RequestParam("userId") Long userId) { + virtualAccountApplicationService.delete(dto.getId()); + } +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/virtualaccount/user/request/UserCreateVirtualAccountDto.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/virtualaccount/user/request/UserCreateVirtualAccountDto.java new file mode 100644 index 0000000..590080c --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/virtualaccount/user/request/UserCreateVirtualAccountDto.java @@ -0,0 +1,23 @@ +package com.qniao.dam.api.command.virtualaccount.user.request; + +import com.qniao.dam.domain.aggregate.virtualaccount.entity.VirtualAccount; +import com.qniao.domain.Trans2DomainAssembler; +import io.swagger.annotations.ApiModelProperty; +import com.qniao.framework.utils.TypeConvertUtils; +import lombok.Data; + +@Data +public class UserCreateVirtualAccountDto implements Trans2DomainAssembler { + + + @ApiModelProperty("用户唯一标识") + private Long userId; + + @ApiModelProperty("数量") + private Integer balance; + + @Override + public VirtualAccount trans2Domain() { + return TypeConvertUtils.convert(this, VirtualAccount.class); + } +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/virtualaccount/user/request/UserDeleteVirtualAccountDto.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/virtualaccount/user/request/UserDeleteVirtualAccountDto.java new file mode 100644 index 0000000..a46fdaa --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/virtualaccount/user/request/UserDeleteVirtualAccountDto.java @@ -0,0 +1,12 @@ +package com.qniao.dam.api.command.virtualaccount.user.request; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class UserDeleteVirtualAccountDto { + + @ApiModelProperty("唯一标识") + private Long id; + +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/virtualaccount/user/request/UserEditVirtualAccountDto.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/virtualaccount/user/request/UserEditVirtualAccountDto.java new file mode 100644 index 0000000..26286c8 --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/api/command/virtualaccount/user/request/UserEditVirtualAccountDto.java @@ -0,0 +1,26 @@ +package com.qniao.dam.api.command.virtualaccount.user.request; + +import com.qniao.dam.domain.aggregate.virtualaccount.entity.VirtualAccount; +import com.qniao.domain.Trans2DomainAssembler; +import io.swagger.annotations.ApiModelProperty; +import com.qniao.framework.utils.TypeConvertUtils; +import lombok.Data; + +@Data +public class UserEditVirtualAccountDto implements Trans2DomainAssembler { + + + @ApiModelProperty("唯一标识") + private Long id; + + @ApiModelProperty("用户唯一标识") + private Long userId; + + @ApiModelProperty("数量") + private Integer balance; + + @Override + public VirtualAccount trans2Domain() { + return TypeConvertUtils.convert(this, VirtualAccount.class); + } +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/virtualaccount/VirtualAccountApplicationService.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/virtualaccount/VirtualAccountApplicationService.java new file mode 100644 index 0000000..2e1eaeb --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/application/service/virtualaccount/VirtualAccountApplicationService.java @@ -0,0 +1,26 @@ +package com.qniao.dam.application.service.virtualaccount; + +import com.qniao.dam.domain.aggregate.virtualaccount.VirtualAccountAggregate; +import com.qniao.dam.domain.aggregate.virtualaccount.entity.VirtualAccount; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +@Service +public class VirtualAccountApplicationService { + + @Resource + private VirtualAccountAggregate virtualAccountAggregate; + + public void create(VirtualAccount virtualAccount) { + virtualAccountAggregate.create(virtualAccount); + } + + public void edit(VirtualAccount virtualAccount) { + virtualAccountAggregate.edit(virtualAccount); + } + + public void delete(Long id) { + virtualAccountAggregate.delete(id); + } +} \ No newline at end of file diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/virtualaccount/VirtualAccountAggregate.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/virtualaccount/VirtualAccountAggregate.java new file mode 100644 index 0000000..9f7e145 --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/virtualaccount/VirtualAccountAggregate.java @@ -0,0 +1,31 @@ +package com.qniao.dam.domain.aggregate.virtualaccount; + +import com.qniao.dam.domain.aggregate.virtualaccount.entity.VirtualAccount; +import com.qniao.dam.domain.aggregate.virtualaccount.repository.VirtualAccountRepository; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +/** + * 虚拟账号 + * + * @date 2025/11/09 + */ +@Service +public class VirtualAccountAggregate { + + @Resource + private VirtualAccountRepository repository; + + public void create(VirtualAccount entity) { + repository.save(entity); + } + + public void edit(VirtualAccount entity) { + repository.save(entity); + } + + public void delete(Long id) { + repository.delete(id); + } +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/virtualaccount/repository/VirtualAccountRepository.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/virtualaccount/repository/VirtualAccountRepository.java new file mode 100644 index 0000000..fd8c43f --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/domain/aggregate/virtualaccount/repository/VirtualAccountRepository.java @@ -0,0 +1,12 @@ +package com.qniao.dam.domain.aggregate.virtualaccount.repository; + +import com.qniao.dam.domain.aggregate.virtualaccount.entity.VirtualAccount; +import com.qniao.domain.Repository; + +/** + * 虚拟账号 + * + * @date 2025/11/09 + */ +public interface VirtualAccountRepository extends Repository { +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/dao/virtualaccount/VirtualAccountDao.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/dao/virtualaccount/VirtualAccountDao.java new file mode 100644 index 0000000..9f0ee86 --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/dao/virtualaccount/VirtualAccountDao.java @@ -0,0 +1,12 @@ +package com.qniao.dam.infrastructure.persistent.dao.virtualaccount; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qniao.dam.domain.aggregate.virtualaccount.entity.VirtualAccount; + +/** + * 虚拟账号 + * + * @date 2025/11/09 + */ +public interface VirtualAccountDao extends BaseMapper { +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/dao/virtualaccount/VirtualAccountRecordDao.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/dao/virtualaccount/VirtualAccountRecordDao.java new file mode 100644 index 0000000..ea575e6 --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/dao/virtualaccount/VirtualAccountRecordDao.java @@ -0,0 +1,11 @@ +package com.qniao.dam.infrastructure.persistent.dao.virtualaccount; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.qniao.dam.domain.aggregate.virtualaccount.valobj.VirtualAccountRecord; + +/** + * @author Zpj + * @date 2025/11/9 + */ +public interface VirtualAccountRecordDao extends BaseMapper { +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/repository/impl/VirtualAccountRepositoryImpl.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/repository/impl/VirtualAccountRepositoryImpl.java new file mode 100644 index 0000000..e508041 --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/infrastructure/persistent/repository/impl/VirtualAccountRepositoryImpl.java @@ -0,0 +1,51 @@ +package com.qniao.dam.infrastructure.persistent.repository.impl; + +import cn.hutool.core.collection.CollUtil; +import com.qniao.dam.domain.aggregate.virtualaccount.entity.VirtualAccount; +import com.qniao.dam.domain.aggregate.virtualaccount.repository.VirtualAccountRepository; +import com.qniao.dam.infrastructure.persistent.dao.virtualaccount.VirtualAccountDao; +import com.qniao.dam.infrastructure.persistent.dao.virtualaccount.VirtualAccountRecordDao; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Objects; + +/** + * 虚拟账号 + * + * @date 2025/11/09 + */ +@Service +public class VirtualAccountRepositoryImpl implements VirtualAccountRepository { + + @Resource + private VirtualAccountDao dao; + @Resource + private VirtualAccountRecordDao recordDao; + + @Override + public VirtualAccount load(Long id) { + return dao.selectById(id); + } + + @Override + public Long save(VirtualAccount entity) { + if (Objects.isNull(entity) || Objects.isNull(dao.selectById(entity.getId()))) { + dao.insert(entity); + } else { + dao.updateById(entity); + } + if (CollUtil.isNotEmpty(entity.getRecordList())) { + entity.getRecordList().forEach(record -> { + record.setVirtualAccountId(entity.getId()); + recordDao.insert(record); + }); + } + return entity.getId(); + } + + @Override + public void delete(Long id) { + dao.deleteById(id); + } +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/query/virtualaccount/VirtualAccountQueryService.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/query/virtualaccount/VirtualAccountQueryService.java new file mode 100644 index 0000000..650bdf0 --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/query/virtualaccount/VirtualAccountQueryService.java @@ -0,0 +1,5 @@ +package com.qniao.dam.query.virtualaccount; + +public interface VirtualAccountQueryService { + +} diff --git a/dating-agency-mall-server/src/main/java/com/qniao/dam/query/virtualaccount/impl/VirtualAccountQueryServiceImpl.java b/dating-agency-mall-server/src/main/java/com/qniao/dam/query/virtualaccount/impl/VirtualAccountQueryServiceImpl.java new file mode 100644 index 0000000..1725f25 --- /dev/null +++ b/dating-agency-mall-server/src/main/java/com/qniao/dam/query/virtualaccount/impl/VirtualAccountQueryServiceImpl.java @@ -0,0 +1,9 @@ +package com.qniao.dam.query.virtualaccount.impl; + +import com.qniao.dam.query.virtualaccount.VirtualAccountQueryService; +import org.springframework.stereotype.Service; + +@Service +public class VirtualAccountQueryServiceImpl implements VirtualAccountQueryService { + +} \ No newline at end of file