Browse Source

修改管理员积分模块代码位置

master
glx 3 months ago
parent
commit
048d3b1292
  1. 55
      src/main/java/com/youlai/boot/admin/controller/PointManageController.java
  2. 3
      src/main/java/com/youlai/boot/admin/model/form/AddPointRuleForm.java
  3. 4
      src/main/java/com/youlai/boot/admin/model/form/AdjustUserPointForm.java
  4. 2
      src/main/java/com/youlai/boot/admin/model/query/PointAccountQuery.java
  5. 2
      src/main/java/com/youlai/boot/admin/model/vo/PointAccountVO.java
  6. 2
      src/main/java/com/youlai/boot/admin/model/vo/PointRecordVO.java
  7. 3
      src/main/java/com/youlai/boot/admin/model/vo/RuleListVO.java
  8. 30
      src/main/java/com/youlai/boot/admin/service/PointManageService.java
  9. 192
      src/main/java/com/youlai/boot/admin/service/impl/PointManageServiceImpl.java
  10. 1
      src/main/java/com/youlai/boot/mini/controller/PointController.java
  11. 4
      src/main/java/com/youlai/boot/mini/converter/MiniPointAccountConverter.java
  12. 4
      src/main/java/com/youlai/boot/mini/converter/MiniPointRuleConverter.java
  13. 12
      src/main/java/com/youlai/boot/mini/listener/UserRegisterPointListener.java
  14. 6
      src/main/java/com/youlai/boot/mini/mapper/MiniPointAccountMapper.java
  15. 2
      src/main/java/com/youlai/boot/mini/mapper/MiniPointRecordMapper.java
  16. 5
      src/main/java/com/youlai/boot/mini/service/MiniPointAccountService.java
  17. 14
      src/main/java/com/youlai/boot/mini/service/MiniPointRecordService.java
  18. 29
      src/main/java/com/youlai/boot/mini/service/MiniPointRuleService.java
  19. 8
      src/main/java/com/youlai/boot/mini/service/MiniSignService.java
  20. 13
      src/main/java/com/youlai/boot/mini/service/impl/MiniPointAccountServiceImpl.java
  21. 87
      src/main/java/com/youlai/boot/mini/service/impl/MiniPointRecordServiceImpl.java
  22. 112
      src/main/java/com/youlai/boot/mini/service/impl/MiniPointRuleServiceImpl.java
  23. 12
      src/main/java/com/youlai/boot/mini/service/impl/MiniSignServiceImpl.java
  24. 2
      src/main/resources/mapper/mini/MiniPointAccountMapper.xml
  25. 2
      src/main/resources/mapper/mini/MiniPointRecordMapper.xml

55
src/main/java/com/youlai/boot/mini/controller/PointAdminController.java → src/main/java/com/youlai/boot/admin/controller/PointManageController.java

@ -1,99 +1,94 @@
package com.youlai.boot.mini.controller;
package com.youlai.boot.admin.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.youlai.boot.admin.service.PointManageService;
import com.youlai.boot.common.annotation.Log;
import com.youlai.boot.common.enums.ActionTypeEnum;
import com.youlai.boot.common.enums.LogModuleEnum;
import com.youlai.boot.common.result.PageResult;
import com.youlai.boot.common.result.Result;
import com.youlai.boot.mini.model.form.AddPointRuleForm;
import com.youlai.boot.mini.model.form.AdjustUserPointForm;
import com.youlai.boot.mini.model.query.PointAccountQuery;
import com.youlai.boot.admin.model.form.AddPointRuleForm;
import com.youlai.boot.admin.model.form.AdjustUserPointForm;
import com.youlai.boot.admin.model.query.PointAccountQuery;
import com.youlai.boot.mini.model.query.PointRecordQuery;
import com.youlai.boot.mini.model.query.RulePageQuery;
import com.youlai.boot.mini.model.vo.PointAccountVO;
import com.youlai.boot.mini.model.vo.PointRecordVO;
import com.youlai.boot.mini.model.vo.RuleListVO;
import com.youlai.boot.mini.service.MiniPointAccountService;
import com.youlai.boot.mini.service.MiniPointRecordService;
import com.youlai.boot.mini.service.MiniPointRuleService;
import com.youlai.boot.admin.model.vo.PointAccountVO;
import com.youlai.boot.admin.model.vo.PointRecordVO;
import com.youlai.boot.admin.model.vo.RuleListVO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springdoc.core.annotations.ParameterObject;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
@Tag(name = "管理端积分服务相关接口")
@RestController
@RequestMapping("/api/v1/mini/admin/point")
@RequestMapping("/api/v1/admin/point")
@RequiredArgsConstructor
public class PointAdminController {
public class PointManageController {
private final MiniPointAccountService pointAccountService;
private final MiniPointRuleService pointRuleService;
private final MiniPointRecordService pointRecordService;
private final PointManageService pointManageService;
@Operation(summary = "分页查询用户积分账户")
@GetMapping("/accounts")
// @PreAuthorize("@ss.hasPerm('mini:point:account:list')")
// @PreAuthorize("@ss.hasPerm('admin:point:account:list')")
@Log(module = LogModuleEnum.POINT_ACCOUNT, value = ActionTypeEnum.LIST)
public PageResult<PointAccountVO> pageAccount(PointAccountQuery query) {
return PageResult.success(pointAccountService.pageAccount(query));
return PageResult.success(pointManageService.pageAccount(query));
}
@Operation(summary = "查询积分规则列表")
@GetMapping
// @PreAuthorize("@ss.hasPerm('mini:point:rule:list')")
// @PreAuthorize("@ss.hasPerm('admin:point:rule:list')")
@Log(module = LogModuleEnum.POINT_RULE, value = ActionTypeEnum.LIST)
public PageResult<RuleListVO> page(@ParameterObject RulePageQuery queryParams) {
IPage<RuleListVO> result = pointRuleService.pageRule(queryParams);
IPage<RuleListVO> result = pointManageService.pageRule(queryParams);
return PageResult.success(result);
}
@Operation(summary = "新增积分规则")
@PostMapping("/add/rules")
// @PreAuthorize("@ss.hasPerm('mini:point:rule:add')")
// @PreAuthorize("@ss.hasPerm('admin:point:rule:add')")
@Log(module = LogModuleEnum.POINT_RULE, value = ActionTypeEnum.INSERT)
public Result<Void> addRule(@RequestBody AddPointRuleForm form) {
pointRuleService.addRule(form);
pointManageService.addRule(form);
return Result.success();
}
@Operation(summary = "逻辑删除积分规则")
@PostMapping("/delete/rules")
// @PreAuthorize("@ss.hasPerm('mini:point:rule:delete')")
// @PreAuthorize("@ss.hasPerm('admin:point:rule:delete')")
@Log(module = LogModuleEnum.POINT_RULE, value = ActionTypeEnum.DELETE)
public Result<Void> deleteRule(@RequestParam Long id) {
pointRuleService.deleteRule(id);
pointManageService.deleteRule(id);
return Result.success();
}
@Operation(summary = "启用/禁用积分规则")
@PatchMapping("/rules/{id}/status")
// @PreAuthorize("@ss.hasPerm('mini:point:rule:edit')")
// @PreAuthorize("@ss.hasPerm('admin:point:rule:edit')")
@Log(module = LogModuleEnum.POINT_RULE, value = ActionTypeEnum.ENABLE)
public Result<Void> changeRuleStatus(@PathVariable Long id, @RequestParam Boolean status) {
pointRuleService.changeStatus(id, status);
pointManageService.changeStatus(id, status);
return Result.success();
}
@Operation(summary = "手动调整用户积分")
@PutMapping("/adjustPoint")
// @PreAuthorize("@ss.hasPerm('mini:point:record:edit')")
// @PreAuthorize("@ss.hasPerm('admin:point:record:edit')")
@Log(module = LogModuleEnum.POINT_ACCOUNT, value = ActionTypeEnum.UPDATE)
public Result<Void> adjustPoint(@RequestBody AdjustUserPointForm adjustUserPointForm) {
pointRecordService.adjustPoint(adjustUserPointForm);
pointManageService.adjustPoint(adjustUserPointForm);
return Result.success();
}
@Operation(summary = "分页查询所有积分记录")
@GetMapping("/records")
// @PreAuthorize("@ss.hasPerm('mini:point:record:list')")
// @PreAuthorize("@ss.hasPerm('admin:point:record:list')")
@Log(module = LogModuleEnum.POINT_RECORD, value = ActionTypeEnum.LIST)
public PageResult<PointRecordVO> pageRecord(PointRecordQuery query) {
return PageResult.success(pointRecordService.pageAllRecord(query));
return PageResult.success(pointManageService.pageAllRecord(query));
}
}

3
src/main/java/com/youlai/boot/mini/model/form/AddPointRuleForm.java → src/main/java/com/youlai/boot/admin/model/form/AddPointRuleForm.java

@ -1,8 +1,7 @@
package com.youlai.boot.mini.model.form;
package com.youlai.boot.admin.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;

4
src/main/java/com/youlai/boot/mini/model/form/AdjustUserPointForm.java → src/main/java/com/youlai/boot/admin/model/form/AdjustUserPointForm.java

@ -1,7 +1,5 @@
package com.youlai.boot.mini.model.form;
package com.youlai.boot.admin.model.form;
import com.youlai.boot.common.annotation.EnumValid;
import com.youlai.boot.mini.model.enums.AdjustUserPointEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;

2
src/main/java/com/youlai/boot/mini/model/query/PointAccountQuery.java → src/main/java/com/youlai/boot/admin/model/query/PointAccountQuery.java

@ -1,4 +1,4 @@
package com.youlai.boot.mini.model.query;
package com.youlai.boot.admin.model.query;
import com.youlai.boot.common.base.BaseQuery;
import io.swagger.v3.oas.annotations.media.Schema;

2
src/main/java/com/youlai/boot/mini/model/vo/PointAccountVO.java → src/main/java/com/youlai/boot/admin/model/vo/PointAccountVO.java

@ -1,4 +1,4 @@
package com.youlai.boot.mini.model.vo;
package com.youlai.boot.admin.model.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;

2
src/main/java/com/youlai/boot/mini/model/vo/PointRecordVO.java → src/main/java/com/youlai/boot/admin/model/vo/PointRecordVO.java

@ -1,4 +1,4 @@
package com.youlai.boot.mini.model.vo;
package com.youlai.boot.admin.model.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;

3
src/main/java/com/youlai/boot/mini/model/vo/RuleListVO.java → src/main/java/com/youlai/boot/admin/model/vo/RuleListVO.java

@ -1,6 +1,5 @@
package com.youlai.boot.mini.model.vo;
package com.youlai.boot.admin.model.vo;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Builder;

30
src/main/java/com/youlai/boot/admin/service/PointManageService.java

@ -0,0 +1,30 @@
package com.youlai.boot.admin.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.admin.model.form.AddPointRuleForm;
import com.youlai.boot.admin.model.form.AdjustUserPointForm;
import com.youlai.boot.admin.model.query.PointAccountQuery;
import com.youlai.boot.mini.model.query.PointRecordQuery;
import com.youlai.boot.mini.model.query.RulePageQuery;
import com.youlai.boot.admin.model.vo.PointAccountVO;
import com.youlai.boot.admin.model.vo.PointRecordVO;
import com.youlai.boot.admin.model.vo.RuleListVO;
public interface PointManageService extends IService<MiniPointRule> {
IPage<PointAccountVO> pageAccount(PointAccountQuery queryParams);
IPage<RuleListVO> pageRule(RulePageQuery queryParams);
void addRule(AddPointRuleForm form);
void deleteRule(Long id);
void changeStatus(Long id, Boolean status);
void adjustPoint(AdjustUserPointForm form);
IPage<PointRecordVO> pageAllRecord(PointRecordQuery query);
}

192
src/main/java/com/youlai/boot/admin/service/impl/PointManageServiceImpl.java

@ -0,0 +1,192 @@
package com.youlai.boot.admin.service.impl;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
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.admin.service.PointManageService;
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.MiniPointRecord;
import com.youlai.boot.mini.model.entity.MiniPointRule;
import com.youlai.boot.admin.model.form.AddPointRuleForm;
import com.youlai.boot.admin.model.form.AdjustUserPointForm;
import com.youlai.boot.admin.model.query.PointAccountQuery;
import com.youlai.boot.mini.model.query.PointRecordQuery;
import com.youlai.boot.mini.model.query.RulePageQuery;
import com.youlai.boot.admin.model.vo.PointAccountVO;
import com.youlai.boot.admin.model.vo.PointRecordVO;
import com.youlai.boot.admin.model.vo.RuleListVO;
import com.youlai.boot.mini.service.MiniPointAccountService;
import jodd.util.StringUtil;
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 PointManageServiceImpl extends ServiceImpl<MiniPointRuleMapper, MiniPointRule> implements PointManageService {
private final MiniPointAccountMapper miniPointAccountMapper;
private final MiniPointRuleMapper miniPointRuleMapper;
private final MiniPointRuleConverter miniPointRuleConverter;
private final MiniPointAccountService miniPointAccountService;
private final MiniPointRecordMapper miniPointRecordMapper;
@Override
public IPage<PointAccountVO> pageAccount(PointAccountQuery queryParams) {
Page<MiniPointAccount> page = new Page<>(queryParams.getPageNum(), queryParams.getPageSize());
return miniPointAccountMapper.pageAccount(page, queryParams);
}
@Override
public IPage<RuleListVO> pageRule(RulePageQuery queryParams) {
Page<MiniPointRule> page = new Page<>(queryParams.getPageNum(), queryParams.getPageSize());
LambdaQueryWrapper<MiniPointRule> 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<MiniPointRule> pageList = this.page(page, queryWrapper);
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);
}
@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查询积分账户
MiniPointAccount account = miniPointAccountService.getOne(new LambdaQueryWrapper<MiniPointAccount>()
.eq(MiniPointAccount::getUserId, form.getUserId())
.eq(MiniPointAccount::getDeleted, false));
// 账户不存在自动创建,新用户第一次获得积分的时候自动初始化账户
if (account == null) {
account = new MiniPointAccount();
account.setUuid(IdUtil.fastSimpleUUID());
account.setUserId(form.getUserId());
account.setPoints(0);
account.setCreateBy(form.getUserId());
account.setCreateTime(new Date());
account.setCreateTimestamp(System.currentTimeMillis());
miniPointAccountService.save(account);
}
// 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(IdUtil.fastSimpleUUID());
record.setUserId(account.getUserId());
record.setChangeAmount(form.getChangeAmount());
record.setBalanceAfter(afterBalance);
record.setBizType(form.getBizType());
// 优先用传进来的业务唯一ID(比如AI任务ID),没有的话自动生成,保证幂等
record.setBizId(StrUtil.isNotBlank(form.getBizId()) ? form.getBizId() : UUID.randomUUID().toString().replace("-", ""));
record.setCreateBy(SecurityUtils.getUserId());
record.setCreateTime(new Date());
record.setCreateTimestamp(System.currentTimeMillis());
miniPointRecordMapper.insert(record);
}
@Override
public IPage<PointRecordVO> pageAllRecord(PointRecordQuery query) {
Page<MiniPointRecord> page = new Page<>(query.getPageNum(), query.getPageSize());
return miniPointRecordMapper.pageAllRecord(page, query);
}
}

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

@ -14,7 +14,6 @@ import com.youlai.boot.mini.model.vo.SignResultVO;
import com.youlai.boot.mini.model.vo.SignStatusVO;
import com.youlai.boot.mini.service.MiniPointAccountService;
import com.youlai.boot.mini.service.MiniPointRecordService;
import com.youlai.boot.mini.service.MiniPointRuleService;
import com.youlai.boot.mini.service.MiniSignService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;

4
src/main/java/com/youlai/boot/mini/converter/MiniPointAccountConverter.java

@ -2,9 +2,7 @@ package com.youlai.boot.mini.converter;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.youlai.boot.mini.model.entity.MiniPointAccount;
import com.youlai.boot.mini.model.entity.MiniPointRule;
import com.youlai.boot.mini.model.vo.RuleListVO;
import com.youlai.boot.mini.model.vo.PointAccountVO;
import com.youlai.boot.admin.model.vo.PointAccountVO;
import org.mapstruct.Mapper;
@Mapper(componentModel = "spring")

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

@ -2,8 +2,8 @@ package com.youlai.boot.mini.converter;
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 com.youlai.boot.admin.model.form.AddPointRuleForm;
import com.youlai.boot.admin.model.vo.RuleListVO;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Named;

12
src/main/java/com/youlai/boot/mini/listener/UserRegisterPointListener.java

@ -1,18 +1,16 @@
package com.youlai.boot.mini.listener;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.youlai.boot.admin.service.PointManageService;
import com.youlai.boot.common.event.UserRegisterEvent;
import com.youlai.boot.mini.model.entity.MiniPointRecord;
import com.youlai.boot.mini.model.entity.MiniPointRule;
import com.youlai.boot.mini.model.form.AdjustUserPointForm;
import com.youlai.boot.admin.model.form.AdjustUserPointForm;
import com.youlai.boot.mini.service.MiniPointRecordService;
import com.youlai.boot.mini.service.MiniPointRuleService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.event.TransactionPhase;
import org.springframework.transaction.event.TransactionalEventListener;
@ -26,7 +24,7 @@ import org.springframework.transaction.event.TransactionalEventListener;
public class UserRegisterPointListener {
private final MiniPointRecordService pointRecordService;
private final MiniPointRuleService pointRuleService;
private final PointManageService pointManageService;
/**
* 监听用户注册成功事件事务提交后再赠送积分
@ -54,7 +52,7 @@ public class UserRegisterPointListener {
}
//2. 查询注册积分规则,可配置无需改代码
MiniPointRule registerRule = pointRuleService.getOne(new LambdaQueryWrapper<MiniPointRule>()
MiniPointRule registerRule = pointManageService.getOne(new LambdaQueryWrapper<MiniPointRule>()
.eq(MiniPointRule::getRuleCode, "REGISTER_GIFT")
.eq(MiniPointRule::getStatus, false) // 0=启用状态
.last("LIMIT 1"));
@ -70,7 +68,7 @@ public class UserRegisterPointListener {
adjustForm.setBizType("REGISTER_GIFT");
adjustForm.setChangeAmount(giftPoint);
// 调用之前写的调整积分接口,自动创建积分账户、生成流水
pointRecordService.adjustPoint(adjustForm);
pointManageService.adjustPoint(adjustForm);
log.info("新用户{}注册赠送{}积分成功", userId, giftPoint);
} catch (Exception e) {

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

@ -4,15 +4,15 @@ 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 com.youlai.boot.admin.model.query.PointAccountQuery;
import com.youlai.boot.admin.model.vo.PointAccountVO;
import org.apache.ibatis.annotations.Param;
/**
* 用户积分表 Mapper 接口
*
* @author jwy
* @since
* @since
*/
public interface MiniPointAccountMapper extends BaseMapper<MiniPointAccount> {

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

@ -7,7 +7,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.youlai.boot.mini.model.query.MyPointRecordQuery;
import com.youlai.boot.mini.model.query.PointRecordQuery;
import com.youlai.boot.mini.model.vo.MyPointRecordVO;
import com.youlai.boot.mini.model.vo.PointRecordVO;
import com.youlai.boot.admin.model.vo.PointRecordVO;
import org.apache.ibatis.annotations.Param;
/**

5
src/main/java/com/youlai/boot/mini/service/MiniPointAccountService.java

@ -1,16 +1,11 @@
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.MiniPointAccount;
import com.youlai.boot.mini.model.query.PointAccountQuery;
import com.youlai.boot.mini.model.vo.MyPointVO;
import com.youlai.boot.mini.model.vo.PointAccountVO;
public interface MiniPointAccountService extends IService<MiniPointAccount> {
IPage<PointAccountVO> pageAccount(PointAccountQuery queryParams);
MyPointVO getUserPoint(Long userId);
}

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

@ -3,11 +3,8 @@ 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.MiniPointRecord;
import com.youlai.boot.mini.model.form.AdjustUserPointForm;
import com.youlai.boot.mini.model.query.MyPointRecordQuery;
import com.youlai.boot.mini.model.query.PointRecordQuery;
import com.youlai.boot.mini.model.vo.MyPointRecordVO;
import com.youlai.boot.mini.model.vo.PointRecordVO;
public interface MiniPointRecordService extends IService<MiniPointRecord> {
@ -15,14 +12,7 @@ public interface MiniPointRecordService extends IService<MiniPointRecord> {
* 后台手动调整用户积分
* @param form 调整参数
*/
void adjustPoint(AdjustUserPointForm form);
/**
* 分页查询所有积分记录后台管理端
* @param query 查询参数
* @return 分页结果
*/
IPage<PointRecordVO> pageAllRecord(PointRecordQuery query);
// void adjustPoint(AdjustUserPointForm form);
/**
* 分页查询当前用户的积分流水用户端专属
@ -54,6 +44,6 @@ public interface MiniPointRecordService extends IService<MiniPointRecord> {
* @return 扣除的积分值负数大于等于0表示扣除失败积分不足/已经扣过
*/
Integer deductAiGenerateImagePoint(Long userId, String taskId);
}

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

@ -1,29 +0,0 @@
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 extends IService<MiniPointRule> {
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/MiniSignService.java

@ -10,15 +10,7 @@ import com.youlai.boot.mini.model.vo.SignStatusVO;
*/
public interface MiniSignService extends IService<MiniSignRecord> {
/**
* 用户签到
* @return 签到结果
*/
SignResultVO sign();
/**
* 查询用户签到状态包括今日是否签到连续天数当月签到日历
* @return 签到状态
*/
SignStatusVO getSignStatus();
}

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

@ -1,16 +1,12 @@
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.mini.converter.MiniPointAccountConverter;
import com.youlai.boot.mini.mapper.*;
import com.youlai.boot.mini.model.entity.MiniPointAccount;
import com.youlai.boot.mini.model.query.PointAccountQuery;
import com.youlai.boot.mini.model.vo.MyPointVO;
import com.youlai.boot.mini.model.vo.PointAccountVO;
import com.youlai.boot.mini.service.MiniPointAccountService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@ -21,15 +17,6 @@ import org.springframework.stereotype.Service;
@Slf4j
public class MiniPointAccountServiceImpl extends ServiceImpl<MiniPointAccountMapper, MiniPointAccount> implements MiniPointAccountService {
private final MiniPointAccountMapper miniPointAccountMapper;
private final MiniPointRecordMapper miniPointRecordMapper;
private final MiniPointAccountConverter miniPointAccountConverter;
@Override
public IPage<PointAccountVO> pageAccount(PointAccountQuery queryParams) {
Page<MiniPointAccount> page = new Page<>(queryParams.getPageNum(), queryParams.getPageSize());
return miniPointAccountMapper.pageAccount(page, queryParams);
}
@Override
public MyPointVO getUserPoint(Long userId) {

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

@ -1,28 +1,21 @@
package com.youlai.boot.mini.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
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.constant.CommonConstants;
import com.youlai.boot.admin.service.PointManageService;
import com.youlai.boot.common.exception.MsgException;
import com.youlai.boot.framework.security.util.SecurityUtils;
import com.youlai.boot.mini.mapper.MiniPointAccountMapper;
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.MiniPointRule;
import com.youlai.boot.mini.model.form.AdjustUserPointForm;
import com.youlai.boot.admin.model.form.AdjustUserPointForm;
import com.youlai.boot.mini.model.query.MyPointRecordQuery;
import com.youlai.boot.mini.model.query.PointRecordQuery;
import com.youlai.boot.mini.model.vo.MyPointRecordVO;
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.MiniPointRuleService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.StringRedisTemplate;
@ -34,11 +27,7 @@ import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjusters;
import java.time.temporal.WeekFields;
import java.util.Date;
import java.util.Locale;
import java.util.Optional;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
@Service
@ -47,71 +36,9 @@ import java.util.concurrent.TimeUnit;
public class MiniPointRecordServiceImpl extends ServiceImpl<MiniPointRecordMapper, MiniPointRecord> implements MiniPointRecordService {
private final MiniPointAccountService miniPointAccountService;
private final MiniPointRuleService ruleService;
private final StringRedisTemplate redisTemplate;
private final MiniPointAccountMapper miniPointAccountMapper;
@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) {
account = new MiniPointAccount();
account.setUuid(IdUtil.fastSimpleUUID());
account.setUserId(form.getUserId());
account.setPoints(0);
account.setCreateBy(form.getUserId());
account.setCreateTime(new java.util.Date());
account.setCreateTimestamp(System.currentTimeMillis());
miniPointAccountService.save(account);
}
// 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.setRemark(form.getRemark());
// 优先用传进来的业务唯一ID(比如AI任务ID),没有的话自动生成,保证幂等
record.setBizId(StrUtil.isNotBlank(form.getBizId()) ? form.getBizId() : UUID.randomUUID().toString().replace("-", ""));
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());
return baseMapper.pageAllRecord(page, query);
}
private final PointManageService pointManageService;
@Override
public IPage<MyPointRecordVO> pageMyPointRecord(Long userId, MyPointRecordQuery query) {
@ -128,7 +55,7 @@ public class MiniPointRecordServiceImpl extends ServiceImpl<MiniPointRecordMappe
*/
private Object[] checkPeriodLimit(String ruleCode, Long userId, String bizPrefix) {
// 1. 查询规则
MiniPointRule rule = ruleService.getOne(new LambdaQueryWrapper<MiniPointRule>()
MiniPointRule rule = pointManageService.getOne(new LambdaQueryWrapper<MiniPointRule>()
.eq(MiniPointRule::getRuleCode, ruleCode)
.eq(MiniPointRule::getStatus, false)
.last("LIMIT 1"));
@ -283,7 +210,7 @@ public class MiniPointRecordServiceImpl extends ServiceImpl<MiniPointRecordMappe
adjustForm.setUserId(userId);
adjustForm.setBizType("SHARE_CONTENT");
adjustForm.setChangeAmount(rewardPoint);
adjustPoint(adjustForm);
pointManageService.adjustPoint(adjustForm);
// 有周期限制且Redis正常的情况下才更新缓存,Redis异常时跳过不报错
if (countKey != null && expireDays > 0 && redisNormal) {
@ -351,7 +278,7 @@ public class MiniPointRecordServiceImpl extends ServiceImpl<MiniPointRecordMappe
adjustForm.setChangeAmount(deductPoint);
adjustForm.setBizId(taskId);
// adjustForm.setRemark("AI生成图片扣费,任务ID:" + taskId);
adjustPoint(adjustForm);
pointManageService.adjustPoint(adjustForm);
// 5. 更新周期计数缓存
if (countKey != null && expireDays > 0 && redisNormal) {
@ -398,7 +325,7 @@ public class MiniPointRecordServiceImpl extends ServiceImpl<MiniPointRecordMappe
adjustForm.setUserId(userId);
adjustForm.setBizType("REGISTER_ANIMAL");
adjustForm.setChangeAmount(rewardPoint);
adjustPoint(adjustForm);
pointManageService.adjustPoint(adjustForm);
// 3. 更新周期计数缓存
if (countKey != null && expireDays > 0 && redisNormal) {

112
src/main/java/com/youlai/boot/mini/service/impl/MiniPointRuleServiceImpl.java

@ -1,112 +0,0 @@
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.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.MiniPointRuleMapper;
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;
import jodd.util.StringUtil;
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<MiniPointRuleMapper, MiniPointRule> implements MiniPointRuleService {
private final MiniPointRuleMapper miniPointRuleMapper;
private final MiniPointRuleConverter miniPointRuleConverter;
@Override
public IPage<RuleListVO> pageRule(RulePageQuery queryParams) {
Page<MiniPointRule> page = new Page<>(queryParams.getPageNum(), queryParams.getPageSize());
LambdaQueryWrapper<MiniPointRule> 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<MiniPointRule> pageList = this.page(page, queryWrapper);
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);
}
}

12
src/main/java/com/youlai/boot/mini/service/impl/MiniSignServiceImpl.java

@ -4,17 +4,16 @@ import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.youlai.boot.admin.service.PointManageService;
import com.youlai.boot.common.constant.CommonConstants;
import com.youlai.boot.common.exception.MsgException;
import com.youlai.boot.framework.security.util.SecurityUtils;
import com.youlai.boot.mini.mapper.MiniSignRecordMapper;
import com.youlai.boot.mini.model.entity.MiniPointRule;
import com.youlai.boot.mini.model.entity.MiniSignRecord;
import com.youlai.boot.mini.model.form.AdjustUserPointForm;
import com.youlai.boot.admin.model.form.AdjustUserPointForm;
import com.youlai.boot.mini.model.vo.SignResultVO;
import com.youlai.boot.mini.model.vo.SignStatusVO;
import com.youlai.boot.mini.service.MiniPointRecordService;
import com.youlai.boot.mini.service.MiniPointRuleService;
import com.youlai.boot.mini.service.MiniSignService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@ -41,8 +40,7 @@ import java.util.stream.Collectors;
public class MiniSignServiceImpl extends ServiceImpl<MiniSignRecordMapper, MiniSignRecord> implements MiniSignService {
private final StringRedisTemplate redisTemplate;
private final MiniPointRuleService ruleService;
private final MiniPointRecordService pointRecordService;
private final PointManageService pointManageService;
@Transactional(rollbackFor = Exception.class)
@Override
@ -82,7 +80,7 @@ public class MiniSignServiceImpl extends ServiceImpl<MiniSignRecordMapper, MiniS
}
// 3. 发放固定每日签到奖励
MiniPointRule baseRule = ruleService.getOne(new LambdaQueryWrapper<MiniPointRule>()
MiniPointRule baseRule = pointManageService.getOne(new LambdaQueryWrapper<MiniPointRule>()
.eq(MiniPointRule::getRuleCode, "SIGN_IN_BASE")
.eq(MiniPointRule::getStatus, false)
.last("LIMIT 1"));
@ -95,7 +93,7 @@ public class MiniSignServiceImpl extends ServiceImpl<MiniSignRecordMapper, MiniS
adjustForm.setUserId(userId);
adjustForm.setBizType("SIGN_IN");
adjustForm.setChangeAmount(totalPoint);
pointRecordService.adjustPoint(adjustForm);
pointManageService.adjustPoint(adjustForm);
}
//4. 保存签到记录

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

@ -6,7 +6,7 @@
<mapper namespace="com.youlai.boot.mini.mapper.MiniPointAccountMapper">
<!-- 积分账户VO映射 -->
<resultMap id="PointAccountVOMap" type="com.youlai.boot.mini.model.vo.PointAccountVO">
<resultMap id="PointAccountVOMap" type="com.youlai.boot.admin.model.vo.PointAccountVO">
<id property="id" column="id" />
<result property="uuid" column="uuid" />
<result property="userId" column="user_id" />

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

@ -6,7 +6,7 @@
<mapper namespace="com.youlai.boot.mini.mapper.MiniPointRecordMapper">
<!-- 积分记录VO映射(管理端用) -->
<resultMap id="PointRecordVOMap" type="com.youlai.boot.mini.model.vo.PointRecordVO">
<resultMap id="PointRecordVOMap" type="com.youlai.boot.admin.model.vo.PointRecordVO">
<id property="id" column="id"/>
<result property="uuid" column="uuid"/>
<result property="userId" column="user_id"/>

Loading…
Cancel
Save