feat(pin): 重构置顶逻辑并抽离PkPinService

- 将UserController中置顶/取消置顶逻辑下沉到PkPinService,统一事务与异常处理
- UserDao新增原子增减积分方法,避免并发扣减问题
- VVTools抽取SECONDS_PER_HOUR常量并修复向上取整计算
- 新增EpochSecondProvider等接口与实现,为后续测试提供时钟桩
- 补充PkPinServiceImplTests单元测试,覆盖置顶成功、积分不足、重复取消等场景
This commit is contained in:
2026-02-26 21:53:06 +08:00
parent c985d14181
commit 994d71a10c
10 changed files with 353 additions and 71 deletions

View File

@@ -8,6 +8,21 @@ import vvpkassistant.User.model.UserModel;
@Mapper
public interface UserDao extends BaseMapper<UserModel> {
// 原子扣减积分:当 points >= cost 时扣减,返回受影响行数(1=成功0=积分不足/用户不存在)
default int decreasePointsIfEnough(Integer userId, int cost) {
return update(null, Wrappers.<UserModel>lambdaUpdate()
.eq(UserModel::getId, userId)
.ge(UserModel::getPoints, cost)
.setSql("points = points - " + cost));
}
// 原子增加积分:返回受影响行数(1=成功0=用户不存在)
default int increasePoints(Integer userId, int amount) {
return update(null, Wrappers.<UserModel>lambdaUpdate()
.eq(UserModel::getId, userId)
.setSql("points = points + " + amount));
}
// 根据用户的手机号查询用户
default UserModel queryWithPhoneNumber(String phoneNumber) {
return selectOne(Wrappers.<UserModel>lambdaQuery()