From 010ac374034343bd1b5cdf08453a727654d4e01f Mon Sep 17 00:00:00 2001 From: glx <783262171@qq.com> Date: Mon, 20 Apr 2026 15:42:38 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E7=AE=A1=E7=90=86=E5=91=98?= =?UTF-8?q?=E7=A7=AF=E5=88=86=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mini/controller/PointAdminController.java | 6 +- .../boot/mini/controller/PointController.java | 16 ++-- .../converter/MiniPointRuleConverter.java | 19 +++- .../mini/mapper/MiniPointAccountMapper.java | 10 +++ .../mini/mapper/MiniPointRecordMapper.java | 13 +++ .../mini/model/form/AddPointRuleForm.java | 7 +- .../mini/model/form/AdjustUserPointForm.java | 13 ++- .../mini/model/query/PointAccountQuery.java | 7 +- .../mini/model/query/PointRecordQuery.java | 14 +++ .../boot/mini/model/vo/PointAccountVO.java | 28 +++++- .../boot/mini/model/vo/PointRecordVO.java | 44 ++++++++- .../mini/service/MiniPointAccountService.java | 4 +- .../mini/service/MiniPointRecordService.java | 23 ++++- .../mini/service/MiniPointRuleService.java | 22 ++++- .../impl/MiniPointAccountServiceImpl.java | 8 +- .../impl/MiniPointRecordServiceImpl.java | 69 ++++++++++++++ .../impl/MiniPointRuleServiceImpl.java | 89 ++++++++++++++++--- .../mapper/mini/MiniPointAccountMapper.xml | 40 +++++++++ .../mapper/mini/MiniPointRecordMapper.xml | 51 +++++++++++ 19 files changed, 436 insertions(+), 47 deletions(-) diff --git a/src/main/java/com/youlai/boot/mini/controller/PointAdminController.java b/src/main/java/com/youlai/boot/mini/controller/PointAdminController.java index 3f42d9b..3052c57 100644 --- a/src/main/java/com/youlai/boot/mini/controller/PointAdminController.java +++ b/src/main/java/com/youlai/boot/mini/controller/PointAdminController.java @@ -59,7 +59,7 @@ public class PointAdminController { return Result.success(); } - @Operation(summary = "删除积分规则") + @Operation(summary = "逻辑删除积分规则") @PostMapping("/delete/rules") @PreAuthorize("@ss.hasPerm('mini:point:rule:delete')") public Result deleteRule(@RequestParam Long id) { @@ -70,14 +70,14 @@ public class PointAdminController { @Operation(summary = "启用/禁用积分规则") @PatchMapping("/rules/{id}/status") @PreAuthorize("@ss.hasPerm('mini:point:rule:edit')") - public Result changeRuleStatus(@PathVariable Long id, @RequestParam Integer status) { + public Result changeRuleStatus(@PathVariable Long id, @RequestParam Boolean status) { pointRuleService.changeStatus(id, status); return Result.success(); } @Operation(summary = "手动调整用户积分") @PutMapping("/adjustPoint") - @PreAuthorize("@ss.hasPerm('mini:point:account:edit')") + @PreAuthorize("@ss.hasPerm('mini:point:record:edit')") public Result adjustPoint(@RequestBody AdjustUserPointForm adjustUserPointForm) { pointRecordService.adjustPoint(adjustUserPointForm); return Result.success(); diff --git a/src/main/java/com/youlai/boot/mini/controller/PointController.java b/src/main/java/com/youlai/boot/mini/controller/PointController.java index 1ebf9c4..2169ba7 100644 --- a/src/main/java/com/youlai/boot/mini/controller/PointController.java +++ b/src/main/java/com/youlai/boot/mini/controller/PointController.java @@ -27,14 +27,14 @@ public class PointController { private final MiniPointRuleService pointRuleService; private final MiniPointRecordService recordService; - @Operation(summary = "查询用户积分") - @GetMapping(value = "/getListPage") - @PreAuthorize("@ss.hasPerm('mini:point:account:list')") - @Log(module = LogModuleEnum.POINT_ACCOUNT, value = ActionTypeEnum.LIST) - public PageResult page(@ParameterObject PointAccountQuery queryParams) { - IPage result = pointAccountService.page(queryParams); - return PageResult.success(result); - } +// @Operation(summary = "查询用户积分") +// @GetMapping(value = "/getListPage") +// @PreAuthorize("@ss.hasPerm('mini:point:account:list')") +// @Log(module = LogModuleEnum.POINT_ACCOUNT, value = ActionTypeEnum.LIST) +// public PageResult page(@ParameterObject PointAccountQuery queryParams) { +// IPage result = pointAccountService.page(queryParams); +// return PageResult.success(result); +// } //查询用户积分 //查询积分明细 diff --git a/src/main/java/com/youlai/boot/mini/converter/MiniPointRuleConverter.java b/src/main/java/com/youlai/boot/mini/converter/MiniPointRuleConverter.java index 4d5fd28..7f7005f 100644 --- a/src/main/java/com/youlai/boot/mini/converter/MiniPointRuleConverter.java +++ b/src/main/java/com/youlai/boot/mini/converter/MiniPointRuleConverter.java @@ -1,16 +1,31 @@ package com.youlai.boot.mini.converter; -import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.youlai.boot.mini.model.entity.MiniPointRule; +import com.youlai.boot.mini.model.form.AddPointRuleForm; import com.youlai.boot.mini.model.vo.RuleListVO; import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +/** + * 积分规则对象转换器 + */ @Mapper(componentModel = "spring") public interface MiniPointRuleConverter { - IPage toRulePageVo(Page pageList); + /** + * 分页对象转换 + */ + Page toRulePageVo(Page pageList); + /** + * 单个对象转换 + */ RuleListVO toRuleVo(MiniPointRule entity); + /** + * 新增表单转实体 + */ + MiniPointRule toEntity(AddPointRuleForm form); + } diff --git a/src/main/java/com/youlai/boot/mini/mapper/MiniPointAccountMapper.java b/src/main/java/com/youlai/boot/mini/mapper/MiniPointAccountMapper.java index befe439..75d8367 100644 --- a/src/main/java/com/youlai/boot/mini/mapper/MiniPointAccountMapper.java +++ b/src/main/java/com/youlai/boot/mini/mapper/MiniPointAccountMapper.java @@ -1,7 +1,12 @@ package com.youlai.boot.mini.mapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.youlai.boot.mini.model.entity.MiniPointAccount; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.youlai.boot.mini.model.query.PointAccountQuery; +import com.youlai.boot.mini.model.vo.PointAccountVO; +import org.apache.ibatis.annotations.Param; /** * 用户积分表 Mapper 接口 @@ -11,4 +16,9 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; */ public interface MiniPointAccountMapper extends BaseMapper { + /** + * 分页查询用户积分账户(关联用户表) + */ + IPage pageAccount(Page page, @Param("query") PointAccountQuery queryParams); + } diff --git a/src/main/java/com/youlai/boot/mini/mapper/MiniPointRecordMapper.java b/src/main/java/com/youlai/boot/mini/mapper/MiniPointRecordMapper.java index 318cf66..13311db 100644 --- a/src/main/java/com/youlai/boot/mini/mapper/MiniPointRecordMapper.java +++ b/src/main/java/com/youlai/boot/mini/mapper/MiniPointRecordMapper.java @@ -1,7 +1,12 @@ package com.youlai.boot.mini.mapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.youlai.boot.mini.model.entity.MiniPointRecord; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.youlai.boot.mini.model.query.PointRecordQuery; +import com.youlai.boot.mini.model.vo.PointRecordVO; +import org.apache.ibatis.annotations.Param; /** * 用户积分流水表 Mapper 接口 @@ -11,4 +16,12 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; */ public interface MiniPointRecordMapper extends BaseMapper { + /** + * 分页查询所有积分记录(关联用户信息) + * @param page 分页参数 + * @param query 查询条件 + * @return 分页结果 + */ + IPage pageAllRecord(Page page, @Param("query") PointRecordQuery query); + } diff --git a/src/main/java/com/youlai/boot/mini/model/form/AddPointRuleForm.java b/src/main/java/com/youlai/boot/mini/model/form/AddPointRuleForm.java index 6f1dc06..c170272 100644 --- a/src/main/java/com/youlai/boot/mini/model/form/AddPointRuleForm.java +++ b/src/main/java/com/youlai/boot/mini/model/form/AddPointRuleForm.java @@ -3,6 +3,7 @@ package com.youlai.boot.mini.model.form; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; import lombok.Getter; import lombok.Setter; @@ -19,14 +20,14 @@ public class AddPointRuleForm { @Schema(description = "规则名称", requiredMode = Schema.RequiredMode.REQUIRED) private String ruleName; - @NotEmpty(message = "积分不能为空") + @NotNull(message = "积分不能为空") @Schema(description = "积分", example = "100", requiredMode = Schema.RequiredMode.REQUIRED) - private Integer point; + private Integer points; @Schema(description = "限制周期:DAY/WEEK/MONTH/YEAR/ALL(NULL表示无限制)", requiredMode = Schema.RequiredMode.NOT_REQUIRED) private String limitPeriod; - @NotEmpty(message = "周期内限制次数不能为空") + @NotNull(message = "周期内限制次数不能为空") @Schema(description = "周期内限制次数", requiredMode = Schema.RequiredMode.REQUIRED) private Integer limitCount; diff --git a/src/main/java/com/youlai/boot/mini/model/form/AdjustUserPointForm.java b/src/main/java/com/youlai/boot/mini/model/form/AdjustUserPointForm.java index 0b52076..bf7cde1 100644 --- a/src/main/java/com/youlai/boot/mini/model/form/AdjustUserPointForm.java +++ b/src/main/java/com/youlai/boot/mini/model/form/AdjustUserPointForm.java @@ -2,10 +2,9 @@ package com.youlai.boot.mini.model.form; import com.youlai.boot.common.annotation.EnumValid; import com.youlai.boot.mini.model.enums.AdjustUserPointEnum; -import com.youlai.boot.mini.model.enums.AnimalStatusEnum; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; import lombok.Getter; import lombok.Setter; @@ -14,16 +13,16 @@ import lombok.Setter; @Setter public class AdjustUserPointForm { - @NotBlank(message = "用户id不能为空") - @Schema(description = "用户uuid", example = "abc123", requiredMode = Schema.RequiredMode.REQUIRED) - private String uuid; + @NotNull(message = "用户id不能为空") + @Schema(description = "用户id", example = "1001", requiredMode = Schema.RequiredMode.REQUIRED) + private Long userId; - @NotEmpty(message = "业务类型不能为空") + @NotBlank(message = "业务类型不能为空") @EnumValid(enumClass = AdjustUserPointEnum.class, message = "业务类型不合法") @Schema(description = "业务类型 system_increase system_reduce", requiredMode = Schema.RequiredMode.REQUIRED) private String bizType; - @NotEmpty(message = "积分不能为空") + @NotNull(message = "积分不能为空") @Schema(description = "变化值(+增加,-扣减)", requiredMode = Schema.RequiredMode.REQUIRED) private Integer changeAmount; diff --git a/src/main/java/com/youlai/boot/mini/model/query/PointAccountQuery.java b/src/main/java/com/youlai/boot/mini/model/query/PointAccountQuery.java index c0ae58e..e54901d 100644 --- a/src/main/java/com/youlai/boot/mini/model/query/PointAccountQuery.java +++ b/src/main/java/com/youlai/boot/mini/model/query/PointAccountQuery.java @@ -10,7 +10,10 @@ import lombok.Setter; @Schema(description = "用户积分查询") public class PointAccountQuery extends BaseQuery { -// @Schema(description="用户id") -// private String uuid; + @Schema(description = "用户ID") + private Long userId; + + @Schema(description = "用户昵称/手机号模糊查询") + private String keyword; } diff --git a/src/main/java/com/youlai/boot/mini/model/query/PointRecordQuery.java b/src/main/java/com/youlai/boot/mini/model/query/PointRecordQuery.java index 166ee08..ee286a6 100644 --- a/src/main/java/com/youlai/boot/mini/model/query/PointRecordQuery.java +++ b/src/main/java/com/youlai/boot/mini/model/query/PointRecordQuery.java @@ -4,9 +4,23 @@ import com.youlai.boot.common.base.BaseQuery; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Getter; import lombok.Setter; +import java.time.LocalDateTime; @Getter @Setter @Schema(description = "用户积分流水查询") public class PointRecordQuery extends BaseQuery { + + @Schema(description = "用户ID,查询指定用户的积分记录") + private Long userId; + + @Schema(description = "业务类型,system_increase/system_reduce/sign_in等") + private String bizType; + + @Schema(description = "开始时间,查询该时间之后的记录") + private LocalDateTime startTime; + + @Schema(description = "结束时间,查询该时间之前的记录") + private LocalDateTime endTime; + } diff --git a/src/main/java/com/youlai/boot/mini/model/vo/PointAccountVO.java b/src/main/java/com/youlai/boot/mini/model/vo/PointAccountVO.java index 42d4536..aee55e7 100644 --- a/src/main/java/com/youlai/boot/mini/model/vo/PointAccountVO.java +++ b/src/main/java/com/youlai/boot/mini/model/vo/PointAccountVO.java @@ -1,20 +1,46 @@ package com.youlai.boot.mini.model.vo; +import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Builder; import lombok.Data; import lombok.EqualsAndHashCode; +import java.util.Date; + @Data @Builder @EqualsAndHashCode(callSuper = false) @Schema(description = "用户积分信息VO") public class PointAccountVO { - @Schema(description = "uuid") + @Schema(description = "积分账户ID") + private Long id; + + @Schema(description = "uuid唯一标识") private String uuid; + @Schema(description = "用户ID") + private Long userId; + + @Schema(description = "用户昵称") + private String nickname; + + @Schema(description = "用户手机号") + private String mobile; + + @Schema(description = "用户头像") + private String avatar; + @Schema(description = "用户积分") private Integer points; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @Schema(description = "创建时间") + private Date createTime; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @Schema(description = "更新时间") + private Date updateTime; + } diff --git a/src/main/java/com/youlai/boot/mini/model/vo/PointRecordVO.java b/src/main/java/com/youlai/boot/mini/model/vo/PointRecordVO.java index 21d742f..26f0b5e 100644 --- a/src/main/java/com/youlai/boot/mini/model/vo/PointRecordVO.java +++ b/src/main/java/com/youlai/boot/mini/model/vo/PointRecordVO.java @@ -1,13 +1,53 @@ package com.youlai.boot.mini.model.vo; +import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; -import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; @Data @Builder -@EqualsAndHashCode(callSuper = false) +@NoArgsConstructor +@AllArgsConstructor @Schema(description = "积分流水列表VO") public class PointRecordVO { + + @Schema(description = "积分记录ID") + private Long id; + + @Schema(description = "唯一标识uuid") + private String uuid; + + @Schema(description = "用户ID") + private Long userId; + + @Schema(description = "用户昵称") + private String userNickname; + + @Schema(description = "用户手机号") + private String userMobile; + + @Schema(description = "积分变化值,正数增加,负数扣减") + private Integer changeAmount; + + @Schema(description = "变更后积分余额") + private Integer balanceAfter; + + @Schema(description = "业务类型,sign_in签到/system_increase后台增加等") + private String bizType; + + @Schema(description = "备注说明") + private String remark; + + @Schema(description = "操作人ID") + private Long createBy; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + @Schema(description = "创建时间/操作时间") + private LocalDateTime createTime; + } diff --git a/src/main/java/com/youlai/boot/mini/service/MiniPointAccountService.java b/src/main/java/com/youlai/boot/mini/service/MiniPointAccountService.java index 84f9add..1ad35d1 100644 --- a/src/main/java/com/youlai/boot/mini/service/MiniPointAccountService.java +++ b/src/main/java/com/youlai/boot/mini/service/MiniPointAccountService.java @@ -7,5 +7,7 @@ import com.youlai.boot.mini.model.query.PointAccountQuery; import com.youlai.boot.mini.model.vo.PointAccountVO; public interface MiniPointAccountService extends IService { - IPage page(PointAccountQuery queryParams); + + IPage pageAccount(PointAccountQuery queryParams); + } diff --git a/src/main/java/com/youlai/boot/mini/service/MiniPointRecordService.java b/src/main/java/com/youlai/boot/mini/service/MiniPointRecordService.java index 5375df6..82b29b8 100644 --- a/src/main/java/com/youlai/boot/mini/service/MiniPointRecordService.java +++ b/src/main/java/com/youlai/boot/mini/service/MiniPointRecordService.java @@ -1,4 +1,25 @@ package com.youlai.boot.mini.service; -public interface MiniPointRecordService { +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.youlai.boot.mini.model.entity.MiniPointRecord; +import com.youlai.boot.mini.model.form.AdjustUserPointForm; +import com.youlai.boot.mini.model.query.PointRecordQuery; +import com.youlai.boot.mini.model.vo.PointRecordVO; + +public interface MiniPointRecordService extends IService { + + /** + * 后台手动调整用户积分 + * @param form 调整参数 + */ + void adjustPoint(AdjustUserPointForm form); + + /** + * 分页查询所有积分记录(后台管理端) + * @param query 查询参数 + * @return 分页结果 + */ + IPage pageAllRecord(PointRecordQuery query); + } diff --git a/src/main/java/com/youlai/boot/mini/service/MiniPointRuleService.java b/src/main/java/com/youlai/boot/mini/service/MiniPointRuleService.java index fa0025f..68ec6bb 100644 --- a/src/main/java/com/youlai/boot/mini/service/MiniPointRuleService.java +++ b/src/main/java/com/youlai/boot/mini/service/MiniPointRuleService.java @@ -1,9 +1,29 @@ package com.youlai.boot.mini.service; import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.youlai.boot.mini.model.entity.MiniPointRule; +import com.youlai.boot.mini.model.form.AddPointRuleForm; import com.youlai.boot.mini.model.query.RulePageQuery; import com.youlai.boot.mini.model.vo.RuleListVO; -public interface MiniPointRuleService { +public interface MiniPointRuleService extends IService { IPage pageRule(RulePageQuery queryParams); + + /** + * 新增积分规则 + */ + void addRule(AddPointRuleForm form); + + /** + * 逻辑删除积分规则 + */ + void deleteRule(Long id); + + /** + * 启用/禁用积分规则 + * @param id 规则ID + * @param status 状态:false-启用,true-禁用 + */ + void changeStatus(Long id, Boolean status); } diff --git a/src/main/java/com/youlai/boot/mini/service/impl/MiniPointAccountServiceImpl.java b/src/main/java/com/youlai/boot/mini/service/impl/MiniPointAccountServiceImpl.java index d0ac87e..a7674ff 100644 --- a/src/main/java/com/youlai/boot/mini/service/impl/MiniPointAccountServiceImpl.java +++ b/src/main/java/com/youlai/boot/mini/service/impl/MiniPointAccountServiceImpl.java @@ -25,13 +25,9 @@ public class MiniPointAccountServiceImpl extends ServiceImpl page(PointAccountQuery queryParams) { - Long userId = SecurityUtils.getUserId(); + public IPage pageAccount(PointAccountQuery queryParams) { Page page = new Page<>(queryParams.getPageNum(), queryParams.getPageSize()); - LambdaQueryWrapper query = new LambdaQueryWrapper(); - query.eq(MiniPointAccount::getUserId, userId); - Page pageList = this.page(page, query); - return miniPointAccountConverter.toPageVo(pageList); + return miniPointAccountMapper.pageAccount(page, queryParams); } } diff --git a/src/main/java/com/youlai/boot/mini/service/impl/MiniPointRecordServiceImpl.java b/src/main/java/com/youlai/boot/mini/service/impl/MiniPointRecordServiceImpl.java index 575fb02..697805c 100644 --- a/src/main/java/com/youlai/boot/mini/service/impl/MiniPointRecordServiceImpl.java +++ b/src/main/java/com/youlai/boot/mini/service/impl/MiniPointRecordServiceImpl.java @@ -1,15 +1,84 @@ package com.youlai.boot.mini.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.youlai.boot.common.exception.MsgException; +import com.youlai.boot.framework.security.util.SecurityUtils; import com.youlai.boot.mini.mapper.MiniPointRecordMapper; +import com.youlai.boot.mini.model.entity.MiniPointAccount; import com.youlai.boot.mini.model.entity.MiniPointRecord; +import com.youlai.boot.mini.model.form.AdjustUserPointForm; +import com.youlai.boot.mini.model.query.PointRecordQuery; +import com.youlai.boot.mini.model.vo.PointRecordVO; +import com.youlai.boot.mini.service.MiniPointAccountService; import com.youlai.boot.mini.service.MiniPointRecordService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Date; +import java.util.UUID; @Service @RequiredArgsConstructor @Slf4j public class MiniPointRecordServiceImpl extends ServiceImpl implements MiniPointRecordService { + + private final MiniPointAccountService miniPointAccountService; + + + @Override + @Transactional(rollbackFor = Exception.class) + public void adjustPoint(AdjustUserPointForm form) { + // 1. 参数校验:调整值不能为0 + if (form.getChangeAmount() == null || form.getChangeAmount() == 0) { + throw new MsgException("积分调整值不能为0"); + } + + // 2. 直接根据前端传的用户主键userId查询积分账户(后台操作接口,不需要转uuid,直接用主键更高效) + MiniPointAccount account = miniPointAccountService.getOne(new LambdaQueryWrapper() + .eq(MiniPointAccount::getUserId, form.getUserId()) + .eq(MiniPointAccount::getDeleted, false)); + if (account == null) { + throw new MsgException("用户积分账户不存在"); + } + + // 4. 计算变更后余额,校验扣减后不能为负数 + Integer afterBalance = account.getPoints() + form.getChangeAmount(); + if (afterBalance < 0) { + throw new MsgException("积分不足,扣减后余额不能为负数"); + } + + // 5. 更新用户积分账户余额 + MiniPointAccount updateAccount = new MiniPointAccount(); + updateAccount.setId(account.getId()); + updateAccount.setPoints(afterBalance); + updateAccount.setUpdateBy(SecurityUtils.getUserId()); + updateAccount.setUpdateTime(new Date()); + updateAccount.setUpdateTimestamp(System.currentTimeMillis()); + miniPointAccountService.updateById(updateAccount); + + // 6. 插入积分流水记录 + MiniPointRecord record = new MiniPointRecord(); + record.setUuid(UUID.randomUUID().toString().replace("-", "")); + record.setUserId(account.getUserId()); + record.setChangeAmount(form.getChangeAmount()); + record.setBalanceAfter(afterBalance); + record.setBizType(form.getBizType()); + record.setBizId(UUID.randomUUID().toString().replace("-", "")); // 业务唯一ID,保证幂等 + record.setCreateBy(SecurityUtils.getUserId()); + record.setCreateTime(new Date()); + record.setCreateTimestamp(System.currentTimeMillis()); + this.save(record); + } + + @Override + public IPage pageAllRecord(PointRecordQuery query) { + Page page = new Page<>(query.getPageNum(), query.getPageSize()); + // 调用mapper关联查询,直接返回VO分页结果 + return baseMapper.pageAllRecord(page, query); + } } diff --git a/src/main/java/com/youlai/boot/mini/service/impl/MiniPointRuleServiceImpl.java b/src/main/java/com/youlai/boot/mini/service/impl/MiniPointRuleServiceImpl.java index c30adc1..afc242b 100644 --- a/src/main/java/com/youlai/boot/mini/service/impl/MiniPointRuleServiceImpl.java +++ b/src/main/java/com/youlai/boot/mini/service/impl/MiniPointRuleServiceImpl.java @@ -4,13 +4,13 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.youlai.boot.mini.converter.MiniPointAccountConverter; +import com.youlai.boot.common.exception.BusinessException; +import com.youlai.boot.common.exception.MsgException; +import com.youlai.boot.framework.security.util.SecurityUtils; import com.youlai.boot.mini.converter.MiniPointRuleConverter; -import com.youlai.boot.mini.mapper.MiniPointAccountMapper; -import com.youlai.boot.mini.mapper.MiniPointRecordMapper; import com.youlai.boot.mini.mapper.MiniPointRuleMapper; -import com.youlai.boot.mini.model.entity.MiniPointAccount; import com.youlai.boot.mini.model.entity.MiniPointRule; +import com.youlai.boot.mini.model.form.AddPointRuleForm; import com.youlai.boot.mini.model.query.RulePageQuery; import com.youlai.boot.mini.model.vo.RuleListVO; import com.youlai.boot.mini.service.MiniPointRuleService; @@ -19,25 +19,94 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import java.util.Date; +import java.util.UUID; + @Service @RequiredArgsConstructor @Slf4j public class MiniPointRuleServiceImpl extends ServiceImpl implements MiniPointRuleService { - private final MiniPointAccountMapper miniPointAccountMapper; - private final MiniPointRecordMapper miniPointRecordMapper; private final MiniPointRuleMapper miniPointRuleMapper; private final MiniPointRuleConverter miniPointRuleConverter; @Override public IPage pageRule(RulePageQuery queryParams) { Page page = new Page<>(queryParams.getPageNum(), queryParams.getPageSize()); - LambdaQueryWrapper query = new LambdaQueryWrapper(); - query.eq(StringUtil.isNotBlank(queryParams.getRuleCode()),MiniPointRule::getRuleCode, queryParams.getRuleCode()); - query.like(StringUtil.isNotBlank(queryParams.getRuleName()),MiniPointRule::getRuleCode, queryParams.getRuleCode()); - Page pageList = this.page(page, query); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(StringUtil.isNotBlank(queryParams.getRuleCode()),MiniPointRule::getRuleCode, queryParams.getRuleCode()); + queryWrapper.like(StringUtil.isNotBlank(queryParams.getRuleName()),MiniPointRule::getRuleName, queryParams.getRuleName()); + queryWrapper.orderByAsc(MiniPointRule::getCreateTime); + Page pageList = this.page(page, queryWrapper); return miniPointRuleConverter.toRulePageVo(pageList); } + @Override + public void addRule(AddPointRuleForm form) { + // 校验规则编码是否唯一 + long count = this.count(new LambdaQueryWrapper() + .eq(MiniPointRule::getRuleCode, form.getRuleCode()) + .eq(MiniPointRule::getDeleted, false)); + if (count > 0) { + throw new MsgException("规则编码已存在,请修改后重试"); + } + + // 表单转实体 + MiniPointRule rule = miniPointRuleConverter.toEntity(form); + + // 设置默认值 + rule.setUuid(UUID.randomUUID().toString().replace("-", "")); + rule.setStatus(false); // 默认启用 + rule.setCreateBy(SecurityUtils.getUserId()); + rule.setCreateTime(new Date()); + rule.setCreateTimestamp(System.currentTimeMillis()); + + // 保存 + this.save(rule); + } + + @Override + public void deleteRule(Long id) { + // 校验规则是否存在 + MiniPointRule rule = this.getById(id); + if (rule == null || rule.getDeleted()) { + throw new MsgException("积分规则不存在或已删除"); + } + + // 逻辑删除,设置删除标记和更新信息 + MiniPointRule updateRule = new MiniPointRule(); + updateRule.setId(id); + updateRule.setDeleted(true); + updateRule.setUpdateBy(SecurityUtils.getUserId()); + updateRule.setUpdateTime(new Date()); + updateRule.setUpdateTimestamp(System.currentTimeMillis()); + + this.updateById(updateRule); + } + + @Override + public void changeStatus(Long id, Boolean status) { + // 1. 非空校验 + if (status == null) { + throw new MsgException("状态参数不能为空"); + } + + // 2. 校验规则是否存在且未删除 + MiniPointRule rule = this.getById(id); + if (rule == null || rule.getDeleted()) { + throw new MsgException("积分规则不存在或已删除"); + } + + // 3. 构造更新对象,直接赋值Boolean类型状态 + MiniPointRule updateRule = new MiniPointRule(); + updateRule.setId(id); + updateRule.setStatus(status); // false=启用,true=禁用,自动映射数据库0/1 + updateRule.setUpdateBy(SecurityUtils.getUserId()); + updateRule.setUpdateTime(new Date()); + updateRule.setUpdateTimestamp(System.currentTimeMillis()); + + // 4. 执行更新 + this.updateById(updateRule); + } } diff --git a/src/main/resources/mapper/mini/MiniPointAccountMapper.xml b/src/main/resources/mapper/mini/MiniPointAccountMapper.xml index 6a11ec8..7f4b7f4 100644 --- a/src/main/resources/mapper/mini/MiniPointAccountMapper.xml +++ b/src/main/resources/mapper/mini/MiniPointAccountMapper.xml @@ -5,5 +5,45 @@ + + + + + + + + + + + + + + + diff --git a/src/main/resources/mapper/mini/MiniPointRecordMapper.xml b/src/main/resources/mapper/mini/MiniPointRecordMapper.xml index 7f90ff6..79d44dd 100644 --- a/src/main/resources/mapper/mini/MiniPointRecordMapper.xml +++ b/src/main/resources/mapper/mini/MiniPointRecordMapper.xml @@ -5,5 +5,56 @@ + + + + + + + + + + + + + + + +