Browse Source

实现管理员积分接口

master
glx 1 month ago
parent
commit
010ac37403
  1. 6
      src/main/java/com/youlai/boot/mini/controller/PointAdminController.java
  2. 16
      src/main/java/com/youlai/boot/mini/controller/PointController.java
  3. 19
      src/main/java/com/youlai/boot/mini/converter/MiniPointRuleConverter.java
  4. 10
      src/main/java/com/youlai/boot/mini/mapper/MiniPointAccountMapper.java
  5. 13
      src/main/java/com/youlai/boot/mini/mapper/MiniPointRecordMapper.java
  6. 7
      src/main/java/com/youlai/boot/mini/model/form/AddPointRuleForm.java
  7. 13
      src/main/java/com/youlai/boot/mini/model/form/AdjustUserPointForm.java
  8. 7
      src/main/java/com/youlai/boot/mini/model/query/PointAccountQuery.java
  9. 14
      src/main/java/com/youlai/boot/mini/model/query/PointRecordQuery.java
  10. 28
      src/main/java/com/youlai/boot/mini/model/vo/PointAccountVO.java
  11. 44
      src/main/java/com/youlai/boot/mini/model/vo/PointRecordVO.java
  12. 4
      src/main/java/com/youlai/boot/mini/service/MiniPointAccountService.java
  13. 23
      src/main/java/com/youlai/boot/mini/service/MiniPointRecordService.java
  14. 22
      src/main/java/com/youlai/boot/mini/service/MiniPointRuleService.java
  15. 8
      src/main/java/com/youlai/boot/mini/service/impl/MiniPointAccountServiceImpl.java
  16. 69
      src/main/java/com/youlai/boot/mini/service/impl/MiniPointRecordServiceImpl.java
  17. 89
      src/main/java/com/youlai/boot/mini/service/impl/MiniPointRuleServiceImpl.java
  18. 40
      src/main/resources/mapper/mini/MiniPointAccountMapper.xml
  19. 51
      src/main/resources/mapper/mini/MiniPointRecordMapper.xml

6
src/main/java/com/youlai/boot/mini/controller/PointAdminController.java

@ -59,7 +59,7 @@ public class PointAdminController {
return Result.success(); return Result.success();
} }
@Operation(summary = "删除积分规则") @Operation(summary = "逻辑删除积分规则")
@PostMapping("/delete/rules") @PostMapping("/delete/rules")
@PreAuthorize("@ss.hasPerm('mini:point:rule:delete')") @PreAuthorize("@ss.hasPerm('mini:point:rule:delete')")
public Result<Void> deleteRule(@RequestParam Long id) { public Result<Void> deleteRule(@RequestParam Long id) {
@ -70,14 +70,14 @@ public class PointAdminController {
@Operation(summary = "启用/禁用积分规则") @Operation(summary = "启用/禁用积分规则")
@PatchMapping("/rules/{id}/status") @PatchMapping("/rules/{id}/status")
@PreAuthorize("@ss.hasPerm('mini:point:rule:edit')") @PreAuthorize("@ss.hasPerm('mini:point:rule:edit')")
public Result<Void> changeRuleStatus(@PathVariable Long id, @RequestParam Integer status) { public Result<Void> changeRuleStatus(@PathVariable Long id, @RequestParam Boolean status) {
pointRuleService.changeStatus(id, status); pointRuleService.changeStatus(id, status);
return Result.success(); return Result.success();
} }
@Operation(summary = "手动调整用户积分") @Operation(summary = "手动调整用户积分")
@PutMapping("/adjustPoint") @PutMapping("/adjustPoint")
@PreAuthorize("@ss.hasPerm('mini:point:account:edit')") @PreAuthorize("@ss.hasPerm('mini:point:record:edit')")
public Result<Void> adjustPoint(@RequestBody AdjustUserPointForm adjustUserPointForm) { public Result<Void> adjustPoint(@RequestBody AdjustUserPointForm adjustUserPointForm) {
pointRecordService.adjustPoint(adjustUserPointForm); pointRecordService.adjustPoint(adjustUserPointForm);
return Result.success(); return Result.success();

16
src/main/java/com/youlai/boot/mini/controller/PointController.java

@ -27,14 +27,14 @@ public class PointController {
private final MiniPointRuleService pointRuleService; private final MiniPointRuleService pointRuleService;
private final MiniPointRecordService recordService; private final MiniPointRecordService recordService;
@Operation(summary = "查询用户积分") // @Operation(summary = "查询用户积分")
@GetMapping(value = "/getListPage") // @GetMapping(value = "/getListPage")
@PreAuthorize("@ss.hasPerm('mini:point:account:list')") // @PreAuthorize("@ss.hasPerm('mini:point:account:list')")
@Log(module = LogModuleEnum.POINT_ACCOUNT, value = ActionTypeEnum.LIST) // @Log(module = LogModuleEnum.POINT_ACCOUNT, value = ActionTypeEnum.LIST)
public PageResult<PointAccountVO> page(@ParameterObject PointAccountQuery queryParams) { // public PageResult<PointAccountVO> page(@ParameterObject PointAccountQuery queryParams) {
IPage<PointAccountVO> result = pointAccountService.page(queryParams); // IPage<PointAccountVO> result = pointAccountService.page(queryParams);
return PageResult.success(result); // return PageResult.success(result);
} // }
//查询用户积分 //查询用户积分
//查询积分明细 //查询积分明细

19
src/main/java/com/youlai/boot/mini/converter/MiniPointRuleConverter.java

@ -1,16 +1,31 @@
package com.youlai.boot.mini.converter; package com.youlai.boot.mini.converter;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.youlai.boot.mini.model.entity.MiniPointRule; 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 com.youlai.boot.mini.model.vo.RuleListVO;
import org.mapstruct.Mapper; import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
/**
* 积分规则对象转换器
*/
@Mapper(componentModel = "spring") @Mapper(componentModel = "spring")
public interface MiniPointRuleConverter { public interface MiniPointRuleConverter {
IPage<RuleListVO> toRulePageVo(Page<MiniPointRule> pageList); /**
* 分页对象转换
*/
Page<RuleListVO> toRulePageVo(Page<MiniPointRule> pageList);
/**
* 单个对象转换
*/
RuleListVO toRuleVo(MiniPointRule entity); RuleListVO toRuleVo(MiniPointRule entity);
/**
* 新增表单转实体
*/
MiniPointRule toEntity(AddPointRuleForm form);
} }

10
src/main/java/com/youlai/boot/mini/mapper/MiniPointAccountMapper.java

@ -1,7 +1,12 @@
package com.youlai.boot.mini.mapper; 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.youlai.boot.mini.model.entity.MiniPointAccount;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; 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 接口 * 用户积分表 Mapper 接口
@ -11,4 +16,9 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
*/ */
public interface MiniPointAccountMapper extends BaseMapper<MiniPointAccount> { public interface MiniPointAccountMapper extends BaseMapper<MiniPointAccount> {
/**
* 分页查询用户积分账户关联用户表
*/
IPage<PointAccountVO> pageAccount(Page<MiniPointAccount> page, @Param("query") PointAccountQuery queryParams);
} }

13
src/main/java/com/youlai/boot/mini/mapper/MiniPointRecordMapper.java

@ -1,7 +1,12 @@
package com.youlai.boot.mini.mapper; 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.youlai.boot.mini.model.entity.MiniPointRecord;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; 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 接口 * 用户积分流水表 Mapper 接口
@ -11,4 +16,12 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
*/ */
public interface MiniPointRecordMapper extends BaseMapper<MiniPointRecord> { public interface MiniPointRecordMapper extends BaseMapper<MiniPointRecord> {
/**
* 分页查询所有积分记录关联用户信息
* @param page 分页参数
* @param query 查询条件
* @return 分页结果
*/
IPage<PointRecordVO> pageAllRecord(Page<MiniPointRecord> page, @Param("query") PointRecordQuery query);
} }

7
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 io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
@ -19,14 +20,14 @@ public class AddPointRuleForm {
@Schema(description = "规则名称", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "规则名称", requiredMode = Schema.RequiredMode.REQUIRED)
private String ruleName; private String ruleName;
@NotEmpty(message = "积分不能为空") @NotNull(message = "积分不能为空")
@Schema(description = "积分", example = "100", requiredMode = Schema.RequiredMode.REQUIRED) @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) @Schema(description = "限制周期:DAY/WEEK/MONTH/YEAR/ALL(NULL表示无限制)", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
private String limitPeriod; private String limitPeriod;
@NotEmpty(message = "周期内限制次数不能为空") @NotNull(message = "周期内限制次数不能为空")
@Schema(description = "周期内限制次数", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "周期内限制次数", requiredMode = Schema.RequiredMode.REQUIRED)
private Integer limitCount; private Integer limitCount;

13
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.common.annotation.EnumValid;
import com.youlai.boot.mini.model.enums.AdjustUserPointEnum; 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 io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
@ -14,16 +13,16 @@ import lombok.Setter;
@Setter @Setter
public class AdjustUserPointForm { public class AdjustUserPointForm {
@NotBlank(message = "用户id不能为空") @NotNull(message = "用户id不能为空")
@Schema(description = "用户uuid", example = "abc123", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "用户id", example = "1001", requiredMode = Schema.RequiredMode.REQUIRED)
private String uuid; private Long userId;
@NotEmpty(message = "业务类型不能为空") @NotBlank(message = "业务类型不能为空")
@EnumValid(enumClass = AdjustUserPointEnum.class, message = "业务类型不合法") @EnumValid(enumClass = AdjustUserPointEnum.class, message = "业务类型不合法")
@Schema(description = "业务类型 system_increase system_reduce", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "业务类型 system_increase system_reduce", requiredMode = Schema.RequiredMode.REQUIRED)
private String bizType; private String bizType;
@NotEmpty(message = "积分不能为空") @NotNull(message = "积分不能为空")
@Schema(description = "变化值(+增加,-扣减)", requiredMode = Schema.RequiredMode.REQUIRED) @Schema(description = "变化值(+增加,-扣减)", requiredMode = Schema.RequiredMode.REQUIRED)
private Integer changeAmount; private Integer changeAmount;

7
src/main/java/com/youlai/boot/mini/model/query/PointAccountQuery.java

@ -10,7 +10,10 @@ import lombok.Setter;
@Schema(description = "用户积分查询") @Schema(description = "用户积分查询")
public class PointAccountQuery extends BaseQuery { public class PointAccountQuery extends BaseQuery {
// @Schema(description="用户id") @Schema(description = "用户ID")
// private String uuid; private Long userId;
@Schema(description = "用户昵称/手机号模糊查询")
private String keyword;
} }

14
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 io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
import java.time.LocalDateTime;
@Getter @Getter
@Setter @Setter
@Schema(description = "用户积分流水查询") @Schema(description = "用户积分流水查询")
public class PointRecordQuery extends BaseQuery { 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;
} }

28
src/main/java/com/youlai/boot/mini/model/vo/PointAccountVO.java

@ -1,20 +1,46 @@
package com.youlai.boot.mini.model.vo; package com.youlai.boot.mini.model.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import java.util.Date;
@Data @Data
@Builder @Builder
@EqualsAndHashCode(callSuper = false) @EqualsAndHashCode(callSuper = false)
@Schema(description = "用户积分信息VO") @Schema(description = "用户积分信息VO")
public class PointAccountVO { public class PointAccountVO {
@Schema(description = "uuid") @Schema(description = "积分账户ID")
private Long id;
@Schema(description = "uuid唯一标识")
private String 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 = "用户积分") @Schema(description = "用户积分")
private Integer points; 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;
} }

44
src/main/java/com/youlai/boot/mini/model/vo/PointRecordVO.java

@ -1,13 +1,53 @@
package com.youlai.boot.mini.model.vo; package com.youlai.boot.mini.model.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
@Data @Data
@Builder @Builder
@EqualsAndHashCode(callSuper = false) @NoArgsConstructor
@AllArgsConstructor
@Schema(description = "积分流水列表VO") @Schema(description = "积分流水列表VO")
public class PointRecordVO { 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;
} }

4
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; import com.youlai.boot.mini.model.vo.PointAccountVO;
public interface MiniPointAccountService extends IService<MiniPointAccount> { public interface MiniPointAccountService extends IService<MiniPointAccount> {
IPage<PointAccountVO> page(PointAccountQuery queryParams);
IPage<PointAccountVO> pageAccount(PointAccountQuery queryParams);
} }

23
src/main/java/com/youlai/boot/mini/service/MiniPointRecordService.java

@ -1,4 +1,25 @@
package com.youlai.boot.mini.service; 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<MiniPointRecord> {
/**
* 后台手动调整用户积分
* @param form 调整参数
*/
void adjustPoint(AdjustUserPointForm form);
/**
* 分页查询所有积分记录后台管理端
* @param query 查询参数
* @return 分页结果
*/
IPage<PointRecordVO> pageAllRecord(PointRecordQuery query);
} }

22
src/main/java/com/youlai/boot/mini/service/MiniPointRuleService.java

@ -1,9 +1,29 @@
package com.youlai.boot.mini.service; package com.youlai.boot.mini.service;
import com.baomidou.mybatisplus.core.metadata.IPage; 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.query.RulePageQuery;
import com.youlai.boot.mini.model.vo.RuleListVO; import com.youlai.boot.mini.model.vo.RuleListVO;
public interface MiniPointRuleService { public interface MiniPointRuleService extends IService<MiniPointRule> {
IPage<RuleListVO> pageRule(RulePageQuery queryParams); IPage<RuleListVO> pageRule(RulePageQuery queryParams);
/**
* 新增积分规则
*/
void addRule(AddPointRuleForm form);
/**
* 逻辑删除积分规则
*/
void deleteRule(Long id);
/**
* 启用/禁用积分规则
* @param id 规则ID
* @param status 状态false-启用true-禁用
*/
void changeStatus(Long id, Boolean status);
} }

8
src/main/java/com/youlai/boot/mini/service/impl/MiniPointAccountServiceImpl.java

@ -25,13 +25,9 @@ public class MiniPointAccountServiceImpl extends ServiceImpl<MiniPointAccountMap
private final MiniPointAccountConverter miniPointAccountConverter; private final MiniPointAccountConverter miniPointAccountConverter;
@Override @Override
public IPage<PointAccountVO> page(PointAccountQuery queryParams) { public IPage<PointAccountVO> pageAccount(PointAccountQuery queryParams) {
Long userId = SecurityUtils.getUserId();
Page<MiniPointAccount> page = new Page<>(queryParams.getPageNum(), queryParams.getPageSize()); Page<MiniPointAccount> page = new Page<>(queryParams.getPageNum(), queryParams.getPageSize());
LambdaQueryWrapper<MiniPointAccount> query = new LambdaQueryWrapper<MiniPointAccount>(); return miniPointAccountMapper.pageAccount(page, queryParams);
query.eq(MiniPointAccount::getUserId, userId);
Page<MiniPointAccount> pageList = this.page(page, query);
return miniPointAccountConverter.toPageVo(pageList);
} }
} }

69
src/main/java/com/youlai/boot/mini/service/impl/MiniPointRecordServiceImpl.java

@ -1,15 +1,84 @@
package com.youlai.boot.mini.service.impl; 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.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.mapper.MiniPointRecordMapper;
import com.youlai.boot.mini.model.entity.MiniPointAccount;
import com.youlai.boot.mini.model.entity.MiniPointRecord; 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 com.youlai.boot.mini.service.MiniPointRecordService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.UUID;
@Service @Service
@RequiredArgsConstructor @RequiredArgsConstructor
@Slf4j @Slf4j
public class MiniPointRecordServiceImpl extends ServiceImpl<MiniPointRecordMapper, MiniPointRecord> implements MiniPointRecordService { public class MiniPointRecordServiceImpl extends ServiceImpl<MiniPointRecordMapper, MiniPointRecord> 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<MiniPointAccount>()
.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<PointRecordVO> pageAllRecord(PointRecordQuery query) {
Page<MiniPointRecord> page = new Page<>(query.getPageNum(), query.getPageSize());
// 调用mapper关联查询,直接返回VO分页结果
return baseMapper.pageAllRecord(page, query);
}
} }

89
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.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 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.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.mapper.MiniPointRuleMapper;
import com.youlai.boot.mini.model.entity.MiniPointAccount;
import com.youlai.boot.mini.model.entity.MiniPointRule; 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.query.RulePageQuery;
import com.youlai.boot.mini.model.vo.RuleListVO; import com.youlai.boot.mini.model.vo.RuleListVO;
import com.youlai.boot.mini.service.MiniPointRuleService; import com.youlai.boot.mini.service.MiniPointRuleService;
@ -19,25 +19,94 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.UUID;
@Service @Service
@RequiredArgsConstructor @RequiredArgsConstructor
@Slf4j @Slf4j
public class MiniPointRuleServiceImpl extends ServiceImpl<MiniPointRuleMapper, MiniPointRule> implements MiniPointRuleService { public class MiniPointRuleServiceImpl extends ServiceImpl<MiniPointRuleMapper, MiniPointRule> implements MiniPointRuleService {
private final MiniPointAccountMapper miniPointAccountMapper;
private final MiniPointRecordMapper miniPointRecordMapper;
private final MiniPointRuleMapper miniPointRuleMapper; private final MiniPointRuleMapper miniPointRuleMapper;
private final MiniPointRuleConverter miniPointRuleConverter; private final MiniPointRuleConverter miniPointRuleConverter;
@Override @Override
public IPage<RuleListVO> pageRule(RulePageQuery queryParams) { public IPage<RuleListVO> pageRule(RulePageQuery queryParams) {
Page<MiniPointRule> page = new Page<>(queryParams.getPageNum(), queryParams.getPageSize()); Page<MiniPointRule> page = new Page<>(queryParams.getPageNum(), queryParams.getPageSize());
LambdaQueryWrapper<MiniPointRule> query = new LambdaQueryWrapper<MiniPointRule>(); LambdaQueryWrapper<MiniPointRule> queryWrapper = new LambdaQueryWrapper<>();
query.eq(StringUtil.isNotBlank(queryParams.getRuleCode()),MiniPointRule::getRuleCode, queryParams.getRuleCode()); queryWrapper.eq(StringUtil.isNotBlank(queryParams.getRuleCode()),MiniPointRule::getRuleCode, queryParams.getRuleCode());
query.like(StringUtil.isNotBlank(queryParams.getRuleName()),MiniPointRule::getRuleCode, queryParams.getRuleCode()); queryWrapper.like(StringUtil.isNotBlank(queryParams.getRuleName()),MiniPointRule::getRuleName, queryParams.getRuleName());
Page<MiniPointRule> pageList = this.page(page, query); queryWrapper.orderByAsc(MiniPointRule::getCreateTime);
Page<MiniPointRule> pageList = this.page(page, queryWrapper);
return miniPointRuleConverter.toRulePageVo(pageList); return miniPointRuleConverter.toRulePageVo(pageList);
} }
@Override
public void addRule(AddPointRuleForm form) {
// 校验规则编码是否唯一
long count = this.count(new LambdaQueryWrapper<MiniPointRule>()
.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);
}
} }

40
src/main/resources/mapper/mini/MiniPointAccountMapper.xml

@ -5,5 +5,45 @@
<mapper namespace="com.youlai.boot.mini.mapper.MiniPointAccountMapper"> <mapper namespace="com.youlai.boot.mini.mapper.MiniPointAccountMapper">
<!-- 积分账户VO映射 -->
<resultMap id="PointAccountVOMap" type="com.youlai.boot.mini.model.vo.PointAccountVO">
<id property="id" column="id" />
<result property="uuid" column="uuid" />
<result property="userId" column="user_id" />
<result property="nickname" column="nickname" />
<result property="mobile" column="mobile" />
<result property="avatar" column="avatar" />
<result property="points" column="points" />
<result property="createTime" column="create_time" />
<result property="updateTime" column="update_time" />
</resultMap>
<!-- 分页查询用户积分账户(关联用户表) -->
<select id="pageAccount" resultMap="PointAccountVOMap">
SELECT
a.id,
a.uuid,
a.user_id,
u.nickname,
u.mobile,
u.avatar,
a.points,
a.create_time,
a.update_time
FROM
mini_point_account a
LEFT JOIN sys_user u ON a.user_id = u.id
WHERE
a.is_deleted = 0
AND u.is_deleted = 0
<if test="query.userId != null">
AND a.user_id = #{query.userId}
</if>
<if test="query.keyword != null and query.keyword != ''">
AND (u.nickname LIKE CONCAT('%', #{query.keyword}, '%') OR u.mobile LIKE CONCAT('%', #{query.keyword}, '%'))
</if>
ORDER BY
a.create_time DESC
</select>
</mapper> </mapper>

51
src/main/resources/mapper/mini/MiniPointRecordMapper.xml

@ -5,5 +5,56 @@
<mapper namespace="com.youlai.boot.mini.mapper.MiniPointRecordMapper"> <mapper namespace="com.youlai.boot.mini.mapper.MiniPointRecordMapper">
<!-- 积分记录VO映射 -->
<resultMap id="PointRecordVOMap" type="com.youlai.boot.mini.model.vo.PointRecordVO">
<id property="id" column="id"/>
<result property="uuid" column="uuid"/>
<result property="userId" column="user_id"/>
<result property="userNickname" column="nickname"/>
<result property="userMobile" column="mobile"/>
<result property="changeAmount" column="change_amount"/>
<result property="balanceAfter" column="balance_after"/>
<result property="bizType" column="biz_type"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
</resultMap>
<!-- 分页查询所有积分记录(关联用户信息) -->
<select id="pageAllRecord" resultMap="PointRecordVOMap">
SELECT
r.id,
r.uuid,
r.user_id,
u.nickname,
u.mobile,
r.change_amount,
r.balance_after,
r.biz_type,
r.create_by,
r.create_time
FROM
mini_point_record r
LEFT JOIN sys_user u ON r.user_id = u.id
WHERE
r.is_deleted = 0
AND u.is_deleted = 0
<!-- 按用户ID查询 -->
<if test="query.userId != null">
AND r.user_id = #{query.userId}
</if>
<!-- 按业务类型查询 -->
<if test="query.bizType != null and query.bizType != ''">
AND r.biz_type = #{query.bizType}
</if>
<!-- 按时间范围查询 -->
<if test="query.startTime != null">
AND r.create_time &gt;= #{query.startTime}
</if>
<if test="query.endTime != null">
AND r.create_time &lt;= #{query.endTime}
</if>
ORDER BY
r.create_time DESC
</select>
</mapper> </mapper>

Loading…
Cancel
Save