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

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

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

@ -4,8 +4,8 @@ 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.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.admin.model.query.PointAccountQuery;
import com.youlai.boot.mini.model.vo.PointAccountVO; import com.youlai.boot.admin.model.vo.PointAccountVO;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
/** /**

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.MyPointRecordQuery;
import com.youlai.boot.mini.model.query.PointRecordQuery; import com.youlai.boot.mini.model.query.PointRecordQuery;
import com.youlai.boot.mini.model.vo.MyPointRecordVO; 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; 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; package com.youlai.boot.mini.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
import com.youlai.boot.mini.model.entity.MiniPointAccount; 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.MyPointVO;
import com.youlai.boot.mini.model.vo.PointAccountVO;
public interface MiniPointAccountService extends IService<MiniPointAccount> { public interface MiniPointAccountService extends IService<MiniPointAccount> {
IPage<PointAccountVO> pageAccount(PointAccountQuery queryParams);
MyPointVO getUserPoint(Long userId); MyPointVO getUserPoint(Long userId);
} }

12
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.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService; import com.baomidou.mybatisplus.extension.service.IService;
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.MyPointRecordQuery; 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.MyPointRecordVO;
import com.youlai.boot.mini.model.vo.PointRecordVO;
public interface MiniPointRecordService extends IService<MiniPointRecord> { public interface MiniPointRecordService extends IService<MiniPointRecord> {
@ -15,14 +12,7 @@ public interface MiniPointRecordService extends IService<MiniPointRecord> {
* 后台手动调整用户积分 * 后台手动调整用户积分
* @param form 调整参数 * @param form 调整参数
*/ */
void adjustPoint(AdjustUserPointForm form); // void adjustPoint(AdjustUserPointForm form);
/**
* 分页查询所有积分记录后台管理端
* @param query 查询参数
* @return 分页结果
*/
IPage<PointRecordVO> pageAllRecord(PointRecordQuery query);
/** /**
* 分页查询当前用户的积分流水用户端专属 * 分页查询当前用户的积分流水用户端专属

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> { public interface MiniSignService extends IService<MiniSignRecord> {
/**
* 用户签到
* @return 签到结果
*/
SignResultVO sign(); SignResultVO sign();
/**
* 查询用户签到状态包括今日是否签到连续天数当月签到日历
* @return 签到状态
*/
SignStatusVO getSignStatus(); 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; package com.youlai.boot.mini.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 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.common.exception.MsgException;
import com.youlai.boot.mini.converter.MiniPointAccountConverter; import com.youlai.boot.mini.converter.MiniPointAccountConverter;
import com.youlai.boot.mini.mapper.*; import com.youlai.boot.mini.mapper.*;
import com.youlai.boot.mini.model.entity.MiniPointAccount; 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.MyPointVO;
import com.youlai.boot.mini.model.vo.PointAccountVO;
import com.youlai.boot.mini.service.MiniPointAccountService; import com.youlai.boot.mini.service.MiniPointAccountService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -21,15 +17,6 @@ import org.springframework.stereotype.Service;
@Slf4j @Slf4j
public class MiniPointAccountServiceImpl extends ServiceImpl<MiniPointAccountMapper, MiniPointAccount> implements MiniPointAccountService { 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 @Override
public MyPointVO getUserPoint(Long userId) { 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; 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.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.common.constant.CommonConstants; import com.youlai.boot.admin.service.PointManageService;
import com.youlai.boot.common.exception.MsgException; 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.MiniPointAccountMapper;
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.MiniPointAccount;
import com.youlai.boot.mini.model.entity.MiniPointRecord; import com.youlai.boot.mini.model.entity.MiniPointRecord;
import com.youlai.boot.mini.model.entity.MiniPointRule; 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.MyPointRecordQuery;
import com.youlai.boot.mini.model.query.PointRecordQuery;
import com.youlai.boot.mini.model.vo.MyPointRecordVO; 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.MiniPointAccountService;
import com.youlai.boot.mini.service.MiniPointRecordService; import com.youlai.boot.mini.service.MiniPointRecordService;
import com.youlai.boot.mini.service.MiniPointRuleService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate;
@ -34,11 +27,7 @@ import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.time.temporal.TemporalAdjusters; 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.Optional;
import java.util.UUID;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
@Service @Service
@ -47,71 +36,9 @@ import java.util.concurrent.TimeUnit;
public class MiniPointRecordServiceImpl extends ServiceImpl<MiniPointRecordMapper, MiniPointRecord> implements MiniPointRecordService { public class MiniPointRecordServiceImpl extends ServiceImpl<MiniPointRecordMapper, MiniPointRecord> implements MiniPointRecordService {
private final MiniPointAccountService miniPointAccountService; private final MiniPointAccountService miniPointAccountService;
private final MiniPointRuleService ruleService;
private final StringRedisTemplate redisTemplate; private final StringRedisTemplate redisTemplate;
private final MiniPointAccountMapper miniPointAccountMapper; private final MiniPointAccountMapper miniPointAccountMapper;
private final PointManageService pointManageService;
@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);
}
@Override @Override
public IPage<MyPointRecordVO> pageMyPointRecord(Long userId, MyPointRecordQuery query) { 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) { private Object[] checkPeriodLimit(String ruleCode, Long userId, String bizPrefix) {
// 1. 查询规则 // 1. 查询规则
MiniPointRule rule = ruleService.getOne(new LambdaQueryWrapper<MiniPointRule>() MiniPointRule rule = pointManageService.getOne(new LambdaQueryWrapper<MiniPointRule>()
.eq(MiniPointRule::getRuleCode, ruleCode) .eq(MiniPointRule::getRuleCode, ruleCode)
.eq(MiniPointRule::getStatus, false) .eq(MiniPointRule::getStatus, false)
.last("LIMIT 1")); .last("LIMIT 1"));
@ -283,7 +210,7 @@ public class MiniPointRecordServiceImpl extends ServiceImpl<MiniPointRecordMappe
adjustForm.setUserId(userId); adjustForm.setUserId(userId);
adjustForm.setBizType("SHARE_CONTENT"); adjustForm.setBizType("SHARE_CONTENT");
adjustForm.setChangeAmount(rewardPoint); adjustForm.setChangeAmount(rewardPoint);
adjustPoint(adjustForm); pointManageService.adjustPoint(adjustForm);
// 有周期限制且Redis正常的情况下才更新缓存,Redis异常时跳过不报错 // 有周期限制且Redis正常的情况下才更新缓存,Redis异常时跳过不报错
if (countKey != null && expireDays > 0 && redisNormal) { if (countKey != null && expireDays > 0 && redisNormal) {
@ -351,7 +278,7 @@ public class MiniPointRecordServiceImpl extends ServiceImpl<MiniPointRecordMappe
adjustForm.setChangeAmount(deductPoint); adjustForm.setChangeAmount(deductPoint);
adjustForm.setBizId(taskId); adjustForm.setBizId(taskId);
// adjustForm.setRemark("AI生成图片扣费,任务ID:" + taskId); // adjustForm.setRemark("AI生成图片扣费,任务ID:" + taskId);
adjustPoint(adjustForm); pointManageService.adjustPoint(adjustForm);
// 5. 更新周期计数缓存 // 5. 更新周期计数缓存
if (countKey != null && expireDays > 0 && redisNormal) { if (countKey != null && expireDays > 0 && redisNormal) {
@ -398,7 +325,7 @@ public class MiniPointRecordServiceImpl extends ServiceImpl<MiniPointRecordMappe
adjustForm.setUserId(userId); adjustForm.setUserId(userId);
adjustForm.setBizType("REGISTER_ANIMAL"); adjustForm.setBizType("REGISTER_ANIMAL");
adjustForm.setChangeAmount(rewardPoint); adjustForm.setChangeAmount(rewardPoint);
adjustPoint(adjustForm); pointManageService.adjustPoint(adjustForm);
// 3. 更新周期计数缓存 // 3. 更新周期计数缓存
if (countKey != null && expireDays > 0 && redisNormal) { 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 cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 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.constant.CommonConstants;
import com.youlai.boot.common.exception.MsgException; import com.youlai.boot.common.exception.MsgException;
import com.youlai.boot.framework.security.util.SecurityUtils; import com.youlai.boot.framework.security.util.SecurityUtils;
import com.youlai.boot.mini.mapper.MiniSignRecordMapper; import com.youlai.boot.mini.mapper.MiniSignRecordMapper;
import com.youlai.boot.mini.model.entity.MiniPointRule; import com.youlai.boot.mini.model.entity.MiniPointRule;
import com.youlai.boot.mini.model.entity.MiniSignRecord; 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.SignResultVO;
import com.youlai.boot.mini.model.vo.SignStatusVO; 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 com.youlai.boot.mini.service.MiniSignService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
@ -41,8 +40,7 @@ import java.util.stream.Collectors;
public class MiniSignServiceImpl extends ServiceImpl<MiniSignRecordMapper, MiniSignRecord> implements MiniSignService { public class MiniSignServiceImpl extends ServiceImpl<MiniSignRecordMapper, MiniSignRecord> implements MiniSignService {
private final StringRedisTemplate redisTemplate; private final StringRedisTemplate redisTemplate;
private final MiniPointRuleService ruleService; private final PointManageService pointManageService;
private final MiniPointRecordService pointRecordService;
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@Override @Override
@ -82,7 +80,7 @@ public class MiniSignServiceImpl extends ServiceImpl<MiniSignRecordMapper, MiniS
} }
// 3. 发放固定每日签到奖励 // 3. 发放固定每日签到奖励
MiniPointRule baseRule = ruleService.getOne(new LambdaQueryWrapper<MiniPointRule>() MiniPointRule baseRule = pointManageService.getOne(new LambdaQueryWrapper<MiniPointRule>()
.eq(MiniPointRule::getRuleCode, "SIGN_IN_BASE") .eq(MiniPointRule::getRuleCode, "SIGN_IN_BASE")
.eq(MiniPointRule::getStatus, false) .eq(MiniPointRule::getStatus, false)
.last("LIMIT 1")); .last("LIMIT 1"));
@ -95,7 +93,7 @@ public class MiniSignServiceImpl extends ServiceImpl<MiniSignRecordMapper, MiniS
adjustForm.setUserId(userId); adjustForm.setUserId(userId);
adjustForm.setBizType("SIGN_IN"); adjustForm.setBizType("SIGN_IN");
adjustForm.setChangeAmount(totalPoint); adjustForm.setChangeAmount(totalPoint);
pointRecordService.adjustPoint(adjustForm); pointManageService.adjustPoint(adjustForm);
} }
//4. 保存签到记录 //4. 保存签到记录

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

@ -6,7 +6,7 @@
<mapper namespace="com.youlai.boot.mini.mapper.MiniPointAccountMapper"> <mapper namespace="com.youlai.boot.mini.mapper.MiniPointAccountMapper">
<!-- 积分账户VO映射 --> <!-- 积分账户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" /> <id property="id" column="id" />
<result property="uuid" column="uuid" /> <result property="uuid" column="uuid" />
<result property="userId" column="user_id" /> <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"> <mapper namespace="com.youlai.boot.mini.mapper.MiniPointRecordMapper">
<!-- 积分记录VO映射(管理端用) --> <!-- 积分记录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"/> <id property="id" column="id"/>
<result property="uuid" column="uuid"/> <result property="uuid" column="uuid"/>
<result property="userId" column="user_id"/> <result property="userId" column="user_id"/>

Loading…
Cancel
Save