diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/AccountDetailController.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/AccountDetailController.java new file mode 100644 index 000000000..4f6a74462 --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/controller/AccountDetailController.java @@ -0,0 +1,48 @@ +package com.wzj.soopin.member.controller; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.wzj.soopin.member.domain.bo.AccountDetailQueryBO; +import com.wzj.soopin.member.domain.vo.AccountDetailVO; +import com.wzj.soopin.member.service.IAccountDetailService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.dromara.common.core.domain.R; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import org.springframework.validation.annotation.Validated; + +/** + * 账户明细查询控制器 + */ +@Tag(name = "账户明细查询") +@RestController +@RequestMapping("/account/detail") +@RequiredArgsConstructor +public class AccountDetailController { + + private final IAccountDetailService accountDetailService; + + /** + * 分页查询账户明细 + */ + @Operation(summary = "分页查询账户明细") + @PostMapping("/page") + public R> queryAccountDetailPage(@Validated @RequestBody AccountDetailQueryBO queryBO) { + IPage result = accountDetailService.queryAccountDetailPage(queryBO); + return R.ok(result); + } + + /** + * 查询当前登录用户的账户明细 + */ + @Operation(summary = "查询当前登录用户的账户明细") + @PostMapping("/current") + public R> queryCurrentUserAccountDetailPage(@Validated @RequestBody AccountDetailQueryBO queryBO) { + IPage result = accountDetailService.queryCurrentUserAccountDetailPage(queryBO); + return R.ok(result); + } +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/bo/AccountDetailQueryBO.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/bo/AccountDetailQueryBO.java new file mode 100644 index 000000000..d84f4eb32 --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/bo/AccountDetailQueryBO.java @@ -0,0 +1,38 @@ +package com.wzj.soopin.member.domain.bo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; + +/** + * 账户明细查询对象 + */ +@Schema(description = "账户明细查询对象") +@Data +public class AccountDetailQueryBO { + + @Schema(description = "会员ID") + private Long memberId; + + @Schema(description = "账户ID") + private Long accountId; + + @Schema(description = "变动类型") + private Integer changeType; + + @Schema(description = "变动来源") + private Integer source; + + @Schema(description = "开始时间") + private LocalDateTime startTime; + + @Schema(description = "结束时间") + private LocalDateTime endTime; + + @Schema(description = "页码", defaultValue = "1") + private Long pageNum = 1L; + + @Schema(description = "每页大小", defaultValue = "10") + private Long pageSize = 10L; +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/vo/AccountDetailVO.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/vo/AccountDetailVO.java new file mode 100644 index 000000000..14d144683 --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/domain/vo/AccountDetailVO.java @@ -0,0 +1,66 @@ +package com.wzj.soopin.member.domain.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 账户明细返回对象 + */ +@Schema(description = "账户明细返回对象") +@Data +public class AccountDetailVO { + + @Schema(description = "记录ID") + private Long id; + + @Schema(description = "会员ID") + private Long memberId; + + @Schema(description = "账户ID") + private Long accountId; + + @Schema(description = "账户类型 1-用户 2-商家 3-代理 4-平台") + private Integer accountType; + + @Schema(description = "账户类型描述") + private String accountTypeDesc; + + @Schema(description = "用户类型 1-租户 2-会员") + private Integer userType; + + @Schema(description = "用户类型描述") + private String userTypeDesc; + + @Schema(description = "余额") + private BigDecimal moneyBalance; + + @Schema(description = "变动前余额") + private BigDecimal beforeBalance; + + @Schema(description = "变动后余额") + private BigDecimal afterBalance; + + @Schema(description = "变动金额") + private BigDecimal changeAmount; + + @Schema(description = "变动类型") + private Integer changeType; + + @Schema(description = "变动类型描述") + private String changeTypeDesc; + + @Schema(description = "变动描述") + private String changeDesc; + + @Schema(description = "变动来源") + private Integer source; + + @Schema(description = "变动来源描述") + private String sourceDesc; + + @Schema(description = "创建时间") + private LocalDateTime createTime; +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/enums/AccountTypeEnum.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/enums/AccountTypeEnum.java new file mode 100644 index 000000000..225b38833 --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/enums/AccountTypeEnum.java @@ -0,0 +1,32 @@ +package com.wzj.soopin.member.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 账户类型枚举 + */ +@Getter +@AllArgsConstructor +public enum AccountTypeEnum { + + USER(1, "用户"), + MERCHANT(2, "商家"), + AGENT(3, "代理"), + PLATFORM(4, "平台"); + + private final Integer code; + private final String desc; + + public static String getDesc(Integer code) { + if (code == null) { + return ""; + } + for (AccountTypeEnum type : values()) { + if (type.getCode().equals(code)) { + return type.getDesc(); + } + } + return ""; + } +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/enums/UserTypeEnum.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/enums/UserTypeEnum.java new file mode 100644 index 000000000..362244e54 --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/enums/UserTypeEnum.java @@ -0,0 +1,42 @@ +package com.wzj.soopin.member.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 用户类型枚举 + */ +@Getter +@AllArgsConstructor +public enum UserTypeEnum { + + TENANT(1, "租户"), + MEMBER(2, "会员"); + + private final Integer code; + private final String desc; + + public static String getDesc(Integer code) { + if (code == null) { + return ""; + } + for (UserTypeEnum type : values()) { + if (type.getCode().equals(code)) { + return type.getDesc(); + } + } + return ""; + } + + /** + * 根据账户类型判断用户类型 + * 1-用户 -> 会员, 2-商家 -> 租户, 3-代理 -> 租户, 4-平台 -> 租户 + */ + public static Integer getUserTypeByAccountType(Integer accountType) { + if (accountType == null) { + return MEMBER.getCode(); + } + // 1-用户是会员,其他都是租户 + return accountType == 1 ? MEMBER.getCode() : TENANT.getCode(); + } +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/mapper/MemberAccountChangeRecordMapper.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/mapper/MemberAccountChangeRecordMapper.java index 897009190..0a623bb2b 100644 --- a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/mapper/MemberAccountChangeRecordMapper.java +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/mapper/MemberAccountChangeRecordMapper.java @@ -1,18 +1,23 @@ package com.wzj.soopin.member.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.wzj.soopin.member.domain.po.MemberAccount; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.wzj.soopin.member.domain.po.MemberAccountChangeRecord; +import com.wzj.soopin.member.domain.vo.AccountDetailVO; import org.apache.ibatis.annotations.Param; - -import java.math.BigDecimal; -import java.util.List; +import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; /** - * 会员账户表Mapper接口 - * - * @author zcc + * 会员账户变动记录Mapper接口 */ -public interface MemberAccountChangeRecordMapper extends BaseMapper { +public interface MemberAccountChangeRecordMapper extends BaseMapperPlus { + /** + * 分页查询账户明细(关联账户表获取账户类型) + */ + IPage selectAccountDetailPage(Page page, @Param("memberId") Long memberId, + @Param("accountId") Long accountId, @Param("changeType") Integer changeType, + @Param("source") Integer source, @Param("startTime") String startTime, + @Param("endTime") String endTime); } diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/IAccountDetailService.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/IAccountDetailService.java new file mode 100644 index 000000000..94a2c5b7d --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/IAccountDetailService.java @@ -0,0 +1,27 @@ +package com.wzj.soopin.member.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.wzj.soopin.member.domain.bo.AccountDetailQueryBO; +import com.wzj.soopin.member.domain.vo.AccountDetailVO; + +/** + * 账户明细查询服务接口 + */ +public interface IAccountDetailService { + + /** + * 分页查询账户明细 + */ + IPage queryAccountDetailPage(AccountDetailQueryBO queryBO); + + /** + * 根据账户类型判断用户类型 + */ + Integer getUserTypeByAccountType(Integer accountType); + + /** + * 查询当前登录用户的账户明细 + */ + IPage queryCurrentUserAccountDetailPage(AccountDetailQueryBO queryBO); +} diff --git a/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/AccountDetailServiceImpl.java b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/AccountDetailServiceImpl.java new file mode 100644 index 000000000..0bbc0909f --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/java/com/wzj/soopin/member/service/impl/AccountDetailServiceImpl.java @@ -0,0 +1,86 @@ +package com.wzj.soopin.member.service.impl; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.wzj.soopin.member.domain.bo.AccountDetailQueryBO; +import com.wzj.soopin.member.domain.vo.AccountDetailVO; +import com.wzj.soopin.member.enums.AccountTypeEnum; +import com.wzj.soopin.member.enums.UserTypeEnum; +import com.wzj.soopin.member.mapper.MemberAccountChangeRecordMapper; +import com.wzj.soopin.member.service.IAccountDetailService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.dromara.common.core.utils.StringUtils; +import org.dromara.common.satoken.utils.LoginHelper; +import org.dromara.common.core.domain.model.LoginUser; +import org.springframework.stereotype.Service; + +import java.time.format.DateTimeFormatter; +import java.util.List; + +/** + * 账户明细查询服务实现类 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class AccountDetailServiceImpl implements IAccountDetailService { + + private final MemberAccountChangeRecordMapper accountChangeRecordMapper; + + @Override + public IPage queryAccountDetailPage(AccountDetailQueryBO queryBO) { + // 构建分页对象 + Page page = new Page<>(queryBO.getPageNum(), queryBO.getPageSize()); + + // 处理时间格式 + String startTime = null; + String endTime = null; + if (queryBO.getStartTime() != null) { + startTime = queryBO.getStartTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + } + if (queryBO.getEndTime() != null) { + endTime = queryBO.getEndTime().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + } + + // 查询数据 + IPage result = accountChangeRecordMapper.selectAccountDetailPage( + page, queryBO.getMemberId(), queryBO.getAccountId(), + queryBO.getChangeType(), queryBO.getSource(), startTime, endTime + ); + + // 补充账户类型和用户类型描述 + List records = result.getRecords(); + for (AccountDetailVO record : records) { + // 设置账户类型描述 + record.setAccountTypeDesc(AccountTypeEnum.getDesc(record.getAccountType())); + + // 根据账户类型判断用户类型 + Integer userType = getUserTypeByAccountType(record.getAccountType()); + record.setUserType(userType); + record.setUserTypeDesc(UserTypeEnum.getDesc(userType)); + } + + return result; + } + + @Override + public Integer getUserTypeByAccountType(Integer accountType) { + return UserTypeEnum.getUserTypeByAccountType(accountType); + } + + @Override + public IPage queryCurrentUserAccountDetailPage(AccountDetailQueryBO queryBO) { + // 获取当前登录用户信息 + LoginUser loginUser = LoginHelper.getLoginUser(); + if (loginUser == null) { + throw new RuntimeException("用户未登录"); + } + + // 设置当前登录用户的会员ID + queryBO.setMemberId(loginUser.getUserId()); + + // 调用原有的分页查询方法 + return queryAccountDetailPage(queryBO); + } +} diff --git a/ruoyi-modules/ruoyi-member/src/main/resources/mapper/member/MemberAccountChangeRecordMapper.xml b/ruoyi-modules/ruoyi-member/src/main/resources/mapper/member/MemberAccountChangeRecordMapper.xml new file mode 100644 index 000000000..059f34b85 --- /dev/null +++ b/ruoyi-modules/ruoyi-member/src/main/resources/mapper/member/MemberAccountChangeRecordMapper.xml @@ -0,0 +1,45 @@ + + + + + + + +