From 1a6d62748212a64b598a2df6583956082052e71b Mon Sep 17 00:00:00 2001 From: dzq Date: Mon, 7 Jul 2025 09:19:15 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E7=94=A8=E6=88=B7=E4=BD=99=E9=A2=9D):=20?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E7=94=A8=E6=88=B7=E4=BD=99=E9=A2=9D=E4=BA=A4?= =?UTF-8?q?=E6=98=93=E8=AE=B0=E5=BD=95=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加用户余额交易记录相关功能,包括实体类、Mapper、Service、Controller等组件 实现交易记录的增删改查及状态管理功能 移除数据库表中transaction_time字段及相关索引 --- .../balance/UserBalanceRecordController.java | 67 +++++++++++++ .../UserBalanceRecordApplicationService.java | 68 +++++++++++++ .../command/AddUserBalanceRecordCommand.java | 11 +++ .../UpdateUserBalanceRecordCommand.java | 16 ++++ .../balance/db/UserBalanceRecordEntity.java | 72 ++++++++++++++ .../balance/db/UserBalanceRecordMapper.java | 48 ++++++++++ .../balance/db/UserBalanceRecordService.java | 28 ++++++ .../db/UserBalanceRecordServiceImpl.java | 48 ++++++++++ .../balance/dto/UserBalanceRecordDTO.java | 96 +++++++++++++++++++ .../balance/model/UserBalanceRecordModel.java | 41 ++++++++ .../model/UserBalanceRecordModelFactory.java | 27 ++++++ .../query/SearchUserBalanceRecordQuery.java | 41 ++++++++ .../mapper/ab98/UserBalanceRecordMapper.xml | 5 + .../mybatisplus/CodeGenerator.java | 2 +- sql/20250703.sql | 4 +- 15 files changed, 570 insertions(+), 4 deletions(-) create mode 100644 agileboot-admin/src/main/java/com/agileboot/admin/controller/ab98/balance/UserBalanceRecordController.java create mode 100644 agileboot-domain/src/main/java/com/agileboot/domain/ab98/balance/UserBalanceRecordApplicationService.java create mode 100644 agileboot-domain/src/main/java/com/agileboot/domain/ab98/balance/command/AddUserBalanceRecordCommand.java create mode 100644 agileboot-domain/src/main/java/com/agileboot/domain/ab98/balance/command/UpdateUserBalanceRecordCommand.java create mode 100644 agileboot-domain/src/main/java/com/agileboot/domain/ab98/balance/db/UserBalanceRecordEntity.java create mode 100644 agileboot-domain/src/main/java/com/agileboot/domain/ab98/balance/db/UserBalanceRecordMapper.java create mode 100644 agileboot-domain/src/main/java/com/agileboot/domain/ab98/balance/db/UserBalanceRecordService.java create mode 100644 agileboot-domain/src/main/java/com/agileboot/domain/ab98/balance/db/UserBalanceRecordServiceImpl.java create mode 100644 agileboot-domain/src/main/java/com/agileboot/domain/ab98/balance/dto/UserBalanceRecordDTO.java create mode 100644 agileboot-domain/src/main/java/com/agileboot/domain/ab98/balance/model/UserBalanceRecordModel.java create mode 100644 agileboot-domain/src/main/java/com/agileboot/domain/ab98/balance/model/UserBalanceRecordModelFactory.java create mode 100644 agileboot-domain/src/main/java/com/agileboot/domain/ab98/balance/query/SearchUserBalanceRecordQuery.java create mode 100644 agileboot-domain/src/main/resources/mapper/ab98/UserBalanceRecordMapper.xml diff --git a/agileboot-admin/src/main/java/com/agileboot/admin/controller/ab98/balance/UserBalanceRecordController.java b/agileboot-admin/src/main/java/com/agileboot/admin/controller/ab98/balance/UserBalanceRecordController.java new file mode 100644 index 0000000..e87d360 --- /dev/null +++ b/agileboot-admin/src/main/java/com/agileboot/admin/controller/ab98/balance/UserBalanceRecordController.java @@ -0,0 +1,67 @@ +package com.agileboot.admin.controller.ab98.balance; + +import com.agileboot.admin.customize.aop.accessLog.AccessLog; +import com.agileboot.common.core.base.BaseController; +import com.agileboot.common.core.dto.ResponseDTO; +import com.agileboot.common.core.page.PageDTO; +import com.agileboot.common.enums.common.BusinessTypeEnum; +import com.agileboot.domain.ab98.balance.UserBalanceRecordApplicationService; +import com.agileboot.domain.ab98.balance.command.AddUserBalanceRecordCommand; +import com.agileboot.domain.ab98.balance.command.UpdateUserBalanceRecordCommand; +import com.agileboot.domain.ab98.balance.db.UserBalanceRecordEntity; +import com.agileboot.domain.ab98.balance.query.SearchUserBalanceRecordQuery; +import com.agileboot.domain.common.command.BulkOperationCommand; +import io.swagger.v3.oas.annotations.Operation; +import java.util.List; +import javax.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/ab98/balance-records") +@RequiredArgsConstructor +@Validated +public class UserBalanceRecordController extends BaseController { + + private final UserBalanceRecordApplicationService userBalanceRecordApplicationService; + + @Operation(summary = "余额记录列表") + @GetMapping + public ResponseDTO> list(SearchUserBalanceRecordQuery query) { + PageDTO page = userBalanceRecordApplicationService.getUserBalanceRecordList(query); + return ResponseDTO.ok(page); + } + + @Operation(summary = "新增余额记录") + @AccessLog(title = "余额记录管理", businessType = BusinessTypeEnum.ADD) + @PostMapping + public ResponseDTO add(@Validated @RequestBody AddUserBalanceRecordCommand command) { + userBalanceRecordApplicationService.addUserBalanceRecord(command); + return ResponseDTO.ok(); + } + + @Operation(summary = "修改余额记录") + @AccessLog(title = "余额记录管理", businessType = BusinessTypeEnum.MODIFY) + @PutMapping("/{id}") + public ResponseDTO edit(@PathVariable Long id, @Validated @RequestBody UpdateUserBalanceRecordCommand command) { + command.setBalanceRecordId(id); + userBalanceRecordApplicationService.updateUserBalanceRecord(command); + return ResponseDTO.ok(); + } + + @Operation(summary = "删除余额记录") + @AccessLog(title = "余额记录管理", businessType = BusinessTypeEnum.DELETE) + @DeleteMapping("/{ids}") + public ResponseDTO remove(@PathVariable @NotNull List ids) { + userBalanceRecordApplicationService.deleteUserBalanceRecord(new BulkOperationCommand<>(ids)); + return ResponseDTO.ok(); + } +} \ No newline at end of file diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/ab98/balance/UserBalanceRecordApplicationService.java b/agileboot-domain/src/main/java/com/agileboot/domain/ab98/balance/UserBalanceRecordApplicationService.java new file mode 100644 index 0000000..4e398ab --- /dev/null +++ b/agileboot-domain/src/main/java/com/agileboot/domain/ab98/balance/UserBalanceRecordApplicationService.java @@ -0,0 +1,68 @@ +package com.agileboot.domain.ab98.balance; + +import com.agileboot.common.core.page.PageDTO; +import com.agileboot.common.core.page.AbstractPageQuery; +import com.agileboot.domain.ab98.balance.command.AddUserBalanceRecordCommand; +import com.agileboot.domain.ab98.balance.command.UpdateUserBalanceRecordCommand; +import com.agileboot.domain.ab98.balance.db.UserBalanceRecordEntity; +import com.agileboot.domain.ab98.balance.db.UserBalanceRecordService; +import com.agileboot.domain.ab98.balance.model.UserBalanceRecordModel; +import com.agileboot.domain.ab98.balance.model.UserBalanceRecordModelFactory; +import com.agileboot.domain.common.command.BulkOperationCommand; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.stream.Collectors; + +@Service +@Slf4j +@RequiredArgsConstructor +public class UserBalanceRecordApplicationService { + + private final UserBalanceRecordService userBalanceRecordService; + private final UserBalanceRecordModelFactory userBalanceRecordModelFactory; + + public PageDTO getUserBalanceRecordList(AbstractPageQuery query) { + Page page = userBalanceRecordService.getUserBalanceRecordList(query); + List records = page.getRecords(); + return new PageDTO<>(records, page.getTotal()); + } + + public void addUserBalanceRecord(AddUserBalanceRecordCommand command) { + UserBalanceRecordModel model = userBalanceRecordModelFactory.create(); + model.loadAddCommand(command); + model.insert(); + } + + public void updateUserBalanceRecord(UpdateUserBalanceRecordCommand command) { + UserBalanceRecordModel model = userBalanceRecordModelFactory.loadById(command.getBalanceRecordId()); + model.loadUpdateCommand(command); + model.updateById(); + } + + public void deleteUserBalanceRecord(BulkOperationCommand command) { + for (Long id : command.getIds()) { + UserBalanceRecordModel model = userBalanceRecordModelFactory.loadById(id); + model.deleteById(); + } + } + + public List selectAllSuccessRecords() { + return userBalanceRecordService.selectAllSuccessRecords(); + } + + public UserBalanceRecordEntity getFirstSuccessRecord() { + return userBalanceRecordService.getFirstSuccessRecord(); + } + + public UserBalanceRecordEntity getByAb98UserId(Long ab98UserId) { + return userBalanceRecordService.getByAb98UserId(ab98UserId); + } + + public UserBalanceRecordEntity getByTradeId(String tradeId) { + return userBalanceRecordService.getByTradeId(tradeId); + } +} \ No newline at end of file diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/ab98/balance/command/AddUserBalanceRecordCommand.java b/agileboot-domain/src/main/java/com/agileboot/domain/ab98/balance/command/AddUserBalanceRecordCommand.java new file mode 100644 index 0000000..82b660e --- /dev/null +++ b/agileboot-domain/src/main/java/com/agileboot/domain/ab98/balance/command/AddUserBalanceRecordCommand.java @@ -0,0 +1,11 @@ +package com.agileboot.domain.ab98.balance.command; + +import com.agileboot.domain.ab98.balance.db.UserBalanceRecordEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class AddUserBalanceRecordCommand extends UserBalanceRecordEntity { + +} \ No newline at end of file diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/ab98/balance/command/UpdateUserBalanceRecordCommand.java b/agileboot-domain/src/main/java/com/agileboot/domain/ab98/balance/command/UpdateUserBalanceRecordCommand.java new file mode 100644 index 0000000..a69ccd5 --- /dev/null +++ b/agileboot-domain/src/main/java/com/agileboot/domain/ab98/balance/command/UpdateUserBalanceRecordCommand.java @@ -0,0 +1,16 @@ +package com.agileboot.domain.ab98.balance.command; + +import javax.validation.constraints.NotNull; +import javax.validation.constraints.PositiveOrZero; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class UpdateUserBalanceRecordCommand extends AddUserBalanceRecordCommand { + + @NotNull + @PositiveOrZero + private Long balanceRecordId; + +} \ No newline at end of file diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/ab98/balance/db/UserBalanceRecordEntity.java b/agileboot-domain/src/main/java/com/agileboot/domain/ab98/balance/db/UserBalanceRecordEntity.java new file mode 100644 index 0000000..593f9fe --- /dev/null +++ b/agileboot-domain/src/main/java/com/agileboot/domain/ab98/balance/db/UserBalanceRecordEntity.java @@ -0,0 +1,72 @@ +package com.agileboot.domain.ab98.balance.db; + +import com.agileboot.common.core.base.BaseEntity; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +/** + *

+ * 用户余额交易记录表 + *

+ * + * @author valarchie + * @since 2025-07-07 + */ +@Getter +@Setter +@TableName("user_balance_record") +@ApiModel(value = "UserBalanceRecordEntity对象", description = "用户余额交易记录表") +public class UserBalanceRecordEntity extends BaseEntity { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("主键ID") + @TableId(value = "balance_record_id", type = IdType.AUTO) + private Long balanceRecordId; + + @ApiModelProperty("汇邦云用户唯一ID") + @TableField("ab98_user_id") + private Long ab98UserId; + + @ApiModelProperty("openid") + @TableField("openid") + private String openid; + + @ApiModelProperty("交易类型(1充值 2消费 3退款)") + @TableField("transaction_type") + private Integer transactionType; + + @ApiModelProperty("消费或退款时使用的充值id") + @TableField("use_record_id") + private Long useRecordId; + + @ApiModelProperty("交易金额,单位分") + @TableField("amount") + private Integer amount; + + @ApiModelProperty("交易状态(0未完成 1成功 2失败)") + @TableField("`status`") + private Integer status; + + @ApiModelProperty("支付网关交易id") + @TableField("trade_id") + private String tradeId; + + @ApiModelProperty("业务系统订单ID(对接外部系统)") + @TableField("biz_order_id") + private String bizOrderId; + + + @Override + public Serializable pkVal() { + return this.balanceRecordId; + } + +} diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/ab98/balance/db/UserBalanceRecordMapper.java b/agileboot-domain/src/main/java/com/agileboot/domain/ab98/balance/db/UserBalanceRecordMapper.java new file mode 100644 index 0000000..5811f89 --- /dev/null +++ b/agileboot-domain/src/main/java/com/agileboot/domain/ab98/balance/db/UserBalanceRecordMapper.java @@ -0,0 +1,48 @@ +package com.agileboot.domain.ab98.balance.db; + +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; +import java.util.List; + +/** + *

+ * 用户余额交易记录表 Mapper 接口 + *

+ * + * @author valarchie + * @since 2025-07-07 + */ +public interface UserBalanceRecordMapper extends BaseMapper { + + @Select("SELECT balance_record_id, ab98_user_id, openid, transaction_type, use_record_id, amount, status, trade_id, biz_order_id, create_time, update_time " + + "FROM user_balance_record " + + "${ew.customSqlSegment}") + Page getUserBalanceRecordList( + Page page, + @Param(Constants.WRAPPER) Wrapper queryWrapper + ); + + @Select("SELECT * " + + "FROM user_balance_record " + + "WHERE status = 1 " + + "ORDER BY create_time DESC " + + "LIMIT 1") + UserBalanceRecordEntity selectFirstSuccessRecord(); + + @Select("SELECT * " + + "FROM user_balance_record " + + "WHERE status = 1 " + + "ORDER BY create_time DESC") + List selectAllSuccessRecords(); + + @Select("SELECT * FROM user_balance_record WHERE ab98_user_id = #{ab98UserId} LIMIT 1") + UserBalanceRecordEntity selectByAb98UserId(Long ab98UserId); + + @Select("SELECT * FROM user_balance_record WHERE trade_id = #{tradeId} LIMIT 1") + UserBalanceRecordEntity selectByTradeId(String tradeId); + +} diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/ab98/balance/db/UserBalanceRecordService.java b/agileboot-domain/src/main/java/com/agileboot/domain/ab98/balance/db/UserBalanceRecordService.java new file mode 100644 index 0000000..dbc23be --- /dev/null +++ b/agileboot-domain/src/main/java/com/agileboot/domain/ab98/balance/db/UserBalanceRecordService.java @@ -0,0 +1,28 @@ +package com.agileboot.domain.ab98.balance.db; + +import com.agileboot.common.core.page.AbstractPageQuery; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.IService; +import java.util.List; + +/** + *

+ * 用户余额交易记录表 服务类 + *

+ * + * @author valarchie + * @since 2025-07-07 + */ +public interface UserBalanceRecordService extends IService { + + Page getUserBalanceRecordList(AbstractPageQuery query); + + List selectAllSuccessRecords(); + + UserBalanceRecordEntity getFirstSuccessRecord(); + + UserBalanceRecordEntity getByAb98UserId(Long ab98UserId); + + UserBalanceRecordEntity getByTradeId(String tradeId); + +} diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/ab98/balance/db/UserBalanceRecordServiceImpl.java b/agileboot-domain/src/main/java/com/agileboot/domain/ab98/balance/db/UserBalanceRecordServiceImpl.java new file mode 100644 index 0000000..899fdfd --- /dev/null +++ b/agileboot-domain/src/main/java/com/agileboot/domain/ab98/balance/db/UserBalanceRecordServiceImpl.java @@ -0,0 +1,48 @@ +package com.agileboot.domain.ab98.balance.db; + +import com.agileboot.common.core.page.AbstractPageQuery; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.stereotype.Service; +import java.util.List; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 用户余额交易记录表 服务实现类 + *

+ * + * @author valarchie + * @since 2025-07-07 + */ +@Service +public class UserBalanceRecordServiceImpl extends ServiceImpl implements UserBalanceRecordService { + + @Override + public Page getUserBalanceRecordList(AbstractPageQuery query) { + return baseMapper.getUserBalanceRecordList(query.toPage(), query.toQueryWrapper()); + } + + @Override + public List selectAllSuccessRecords() { + return baseMapper.selectAllSuccessRecords(); + } + + @Override + public UserBalanceRecordEntity getFirstSuccessRecord() { + return baseMapper.selectFirstSuccessRecord(); + } + + @Override + public UserBalanceRecordEntity getByAb98UserId(Long ab98UserId) { + return baseMapper.selectByAb98UserId(ab98UserId); + } + + @Override + public UserBalanceRecordEntity getByTradeId(String tradeId) { + return baseMapper.selectByTradeId(tradeId); + } + +} diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/ab98/balance/dto/UserBalanceRecordDTO.java b/agileboot-domain/src/main/java/com/agileboot/domain/ab98/balance/dto/UserBalanceRecordDTO.java new file mode 100644 index 0000000..1bd17c3 --- /dev/null +++ b/agileboot-domain/src/main/java/com/agileboot/domain/ab98/balance/dto/UserBalanceRecordDTO.java @@ -0,0 +1,96 @@ +package com.agileboot.domain.ab98.balance.dto; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.date.DateUtil; +import com.agileboot.common.annotation.ExcelColumn; +import com.agileboot.common.annotation.ExcelSheet; +import com.agileboot.domain.ab98.balance.db.UserBalanceRecordEntity; +import lombok.Data; + +import java.util.Date; + +@ExcelSheet(name = "用户余额交易记录") +@Data +public class UserBalanceRecordDTO { + + public UserBalanceRecordDTO(UserBalanceRecordEntity entity) { + if (entity != null) { + BeanUtil.copyProperties(entity, this); + + // 交易类型转换 + if (entity.getTransactionType() != null) { + switch (entity.getTransactionType()) { + case 1: + this.transactionTypeStr = "充值"; + break; + case 2: + this.transactionTypeStr = "消费"; + break; + case 3: + this.transactionTypeStr = "退款"; + break; + default: + this.transactionTypeStr = "未知"; + } + } + + // 交易状态转换 + if (entity.getStatus() != null) { + switch (entity.getStatus()) { + case 0: + this.statusStr = "未完成"; + break; + case 1: + this.statusStr = "成功"; + break; + case 2: + this.statusStr = "失败"; + break; + default: + this.statusStr = "未知"; + } + } + + // 格式化创建时间 + if (entity.getCreateTime() != null) { + this.createTimeStr = DateUtil.format(entity.getCreateTime(), "yyyy-MM-dd HH:mm:ss"); + } + } + } + + @ExcelColumn(name = "主键ID") + private Long balanceRecordId; + + @ExcelColumn(name = "汇邦云用户唯一ID") + private Long ab98UserId; + + @ExcelColumn(name = "openid") + private String openid; + + @ExcelColumn(name = "交易类型") + private String transactionTypeStr; + + private Integer transactionType; + + @ExcelColumn(name = "关联充值记录ID") + private Long useRecordId; + + @ExcelColumn(name = "交易金额(分)") + private Integer amount; + + @ExcelColumn(name = "交易状态") + private String statusStr; + + private Integer status; + + @ExcelColumn(name = "支付网关交易ID") + private String tradeId; + + @ExcelColumn(name = "业务系统订单ID") + private String bizOrderId; + + @ExcelColumn(name = "创建时间") + private String createTimeStr; + + private Date createTime; +} \ No newline at end of file diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/ab98/balance/model/UserBalanceRecordModel.java b/agileboot-domain/src/main/java/com/agileboot/domain/ab98/balance/model/UserBalanceRecordModel.java new file mode 100644 index 0000000..f64eab2 --- /dev/null +++ b/agileboot-domain/src/main/java/com/agileboot/domain/ab98/balance/model/UserBalanceRecordModel.java @@ -0,0 +1,41 @@ +package com.agileboot.domain.ab98.balance.model; + +import cn.hutool.core.bean.BeanUtil; +import com.agileboot.common.exception.ApiException; +import com.agileboot.common.exception.error.ErrorCode; +import com.agileboot.domain.ab98.balance.db.UserBalanceRecordEntity; +import com.agileboot.domain.ab98.balance.db.UserBalanceRecordService; +import com.agileboot.domain.ab98.balance.command.AddUserBalanceRecordCommand; +import com.agileboot.domain.ab98.balance.command.UpdateUserBalanceRecordCommand; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class UserBalanceRecordModel extends UserBalanceRecordEntity { + + private UserBalanceRecordService userBalanceRecordService; + + public UserBalanceRecordModel(UserBalanceRecordEntity entity, UserBalanceRecordService userBalanceRecordService) { + this(userBalanceRecordService); + if (entity != null) { + BeanUtil.copyProperties(entity, this); + } + } + + public UserBalanceRecordModel(UserBalanceRecordService userBalanceRecordService) { + this.userBalanceRecordService = userBalanceRecordService; + } + + public void loadAddCommand(AddUserBalanceRecordCommand command) { + if (command != null) { + BeanUtil.copyProperties(command, this, "balanceRecordId"); + } + } + + public void loadUpdateCommand(UpdateUserBalanceRecordCommand command) { + if (command != null) { + loadAddCommand(command); + } + } +} \ No newline at end of file diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/ab98/balance/model/UserBalanceRecordModelFactory.java b/agileboot-domain/src/main/java/com/agileboot/domain/ab98/balance/model/UserBalanceRecordModelFactory.java new file mode 100644 index 0000000..9fb2fdd --- /dev/null +++ b/agileboot-domain/src/main/java/com/agileboot/domain/ab98/balance/model/UserBalanceRecordModelFactory.java @@ -0,0 +1,27 @@ +package com.agileboot.domain.ab98.balance.model; + +import com.agileboot.common.exception.ApiException; +import com.agileboot.common.exception.error.ErrorCode; +import com.agileboot.domain.ab98.balance.db.UserBalanceRecordEntity; +import com.agileboot.domain.ab98.balance.db.UserBalanceRecordService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; + +@Component +@RequiredArgsConstructor +public class UserBalanceRecordModelFactory { + + private final UserBalanceRecordService userBalanceRecordService; + + public UserBalanceRecordModel loadById(Long balanceRecordId) { + UserBalanceRecordEntity entity = userBalanceRecordService.getById(balanceRecordId); + if (entity == null) { + throw new ApiException(ErrorCode.Business.COMMON_OBJECT_NOT_FOUND, balanceRecordId, "用户余额交易记录"); + } + return new UserBalanceRecordModel(entity, userBalanceRecordService); + } + + public UserBalanceRecordModel create() { + return new UserBalanceRecordModel(userBalanceRecordService); + } +} \ No newline at end of file diff --git a/agileboot-domain/src/main/java/com/agileboot/domain/ab98/balance/query/SearchUserBalanceRecordQuery.java b/agileboot-domain/src/main/java/com/agileboot/domain/ab98/balance/query/SearchUserBalanceRecordQuery.java new file mode 100644 index 0000000..fcc91e6 --- /dev/null +++ b/agileboot-domain/src/main/java/com/agileboot/domain/ab98/balance/query/SearchUserBalanceRecordQuery.java @@ -0,0 +1,41 @@ +package com.agileboot.domain.ab98.balance.query; + +import cn.hutool.core.util.StrUtil; +import com.agileboot.common.core.page.AbstractPageQuery; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.agileboot.domain.ab98.balance.db.UserBalanceRecordEntity; +import java.util.Date; +import lombok.Data; +import lombok.EqualsAndHashCode; + +@EqualsAndHashCode(callSuper = true) +@Data +public class SearchUserBalanceRecordQuery extends AbstractPageQuery { + + private Long ab98UserId; + private String openid; + private Integer transactionType; + private Integer status; + private String tradeId; + private String bizOrderId; + private Date startTime; + private Date endTime; + + @Override + public QueryWrapper addQueryCondition() { + QueryWrapper queryWrapper = new QueryWrapper<>(); + + queryWrapper + .eq(ab98UserId != null, "ab98_user_id", ab98UserId) + .like(StrUtil.isNotEmpty(openid), "openid", openid) + .eq(transactionType != null, "transaction_type", transactionType) + .eq(status != null, "status", status) + .like(StrUtil.isNotEmpty(tradeId), "trade_id", tradeId) + .like(StrUtil.isNotEmpty(bizOrderId), "biz_order_id", bizOrderId) + .between(startTime != null && endTime != null, "create_time", startTime, endTime); + + this.timeRangeColumn = "create_time"; + + return queryWrapper; + } +} \ No newline at end of file diff --git a/agileboot-domain/src/main/resources/mapper/ab98/UserBalanceRecordMapper.xml b/agileboot-domain/src/main/resources/mapper/ab98/UserBalanceRecordMapper.xml new file mode 100644 index 0000000..3c39395 --- /dev/null +++ b/agileboot-domain/src/main/resources/mapper/ab98/UserBalanceRecordMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/agileboot-infrastructure/src/main/java/com/agileboot/infrastructure/mybatisplus/CodeGenerator.java b/agileboot-infrastructure/src/main/java/com/agileboot/infrastructure/mybatisplus/CodeGenerator.java index 423c0a0..e9d02c0 100644 --- a/agileboot-infrastructure/src/main/java/com/agileboot/infrastructure/mybatisplus/CodeGenerator.java +++ b/agileboot-infrastructure/src/main/java/com/agileboot/infrastructure/mybatisplus/CodeGenerator.java @@ -61,7 +61,7 @@ public class CodeGenerator { //生成的类 放在orm子模块下的/target/generated-code目录底下 .module("/agileboot-orm/target/generated-code") .parentPackage("com.agileboot") - .tableName("approval_goods_cell") + .tableName("user_balance_record") // 决定是否继承基类 .isExtendsFromBaseEntity(true) .build(); diff --git a/sql/20250703.sql b/sql/20250703.sql index 982cb8b..e2f5888 100644 --- a/sql/20250703.sql +++ b/sql/20250703.sql @@ -8,13 +8,11 @@ CREATE TABLE `user_balance_record` ( `status` tinyint NOT NULL DEFAULT 0 COMMENT '交易状态(0未完成 1成功 2失败)', `trade_id` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '支付网关交易id', `biz_order_id` varchar(32) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '业务系统订单ID(对接外部系统)', - `transaction_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '交易时间', `creator_id` bigint DEFAULT 0 COMMENT '创建者ID', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `updater_id` bigint DEFAULT 0 COMMENT '更新者ID', `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `deleted` tinyint(1) NOT NULL DEFAULT '0' COMMENT '删除标志(0存在 1删除)', PRIMARY KEY (`balance_record_id`), - KEY `idx_ab98_user_id` (`ab98_user_id`), - KEY `idx_transaction_time` (`transaction_time`) + KEY `idx_ab98_user_id` (`ab98_user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户余额交易记录表'; \ No newline at end of file