feat: 用户累计充值可得免费播放全集权限

This commit is contained in:
张松
2024-12-18 17:07:13 +08:00
parent 4184193ee6
commit 5a10f03a4a
7 changed files with 114 additions and 1 deletions

View File

@@ -1,11 +1,15 @@
package com.sqx.common.utils;
import cn.hutool.core.date.DateUtil;
/**
* Redis所有Keys
*
*/
public class RedisKeys {
public static final String PAY_FREE_WATCH_KEY = "pay:free:watch:";
public static String getSysConfigKey(String key){
return "sys:config:" + key;
}
@@ -13,4 +17,12 @@ public class RedisKeys {
public static String getDateKey(String key){
return "date:" + key;
}
public static String getPayFreeWatchKey(Long userId) {
return PAY_FREE_WATCH_KEY + DateUtil.today() + ":" + userId;
}
public static void main(String[] args) {
System.out.println(DateUtil.today());
}
}

View File

@@ -98,6 +98,20 @@ public class RedisUtils {
if(expire != NOT_EXPIRE){
redisTemplate.expire(key, expire, TimeUnit.SECONDS);
}
}
public boolean setIfAbsent(String key, Object value, long expire){
Boolean absent = valueOperations.setIfAbsent(key, toJson(value));
if (Boolean.FALSE.equals(absent)) {
return false;
}
if(expire != NOT_EXPIRE){
redisTemplate.expire(key, expire, TimeUnit.SECONDS);
}
return true;
}
public void set(String key, Object value){

View File

@@ -1,6 +1,8 @@
package com.sqx.modules.course.service.impl;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
@@ -12,6 +14,8 @@ import com.sqx.common.utils.Result;
import com.sqx.modules.app.entity.UserEntity;
import com.sqx.modules.app.service.UserService;
import com.sqx.modules.app.utils.JwtUtils;
import com.sqx.modules.common.dao.CommonInfoDao;
import com.sqx.modules.common.entity.CommonInfo;
import com.sqx.modules.course.dao.CourseCollectDao;
import com.sqx.modules.course.dao.CourseDao;
import com.sqx.modules.course.dao.CourseDetailsDao;
@@ -22,11 +26,15 @@ import com.sqx.modules.course.entity.CourseDetails;
import com.sqx.modules.course.entity.CourseUser;
import com.sqx.modules.course.service.CourseDetailsService;
import com.sqx.modules.course.vo.CourseDetailsIn;
import com.sqx.modules.orders.dao.OrdersDao;
import com.sqx.modules.orders.entity.Orders;
import com.sqx.modules.orders.service.OrdersService;
import com.sqx.modules.redisService.impl.RedisServiceImpl;
import com.sqx.modules.utils.EasyPoi.ExcelUtils;
import com.sqx.modules.utils.HttpClientUtil;
import com.sqx.modules.utils.SenInfoCheckUtil;
import io.jsonwebtoken.Claims;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
@@ -39,6 +47,7 @@ import java.util.Date;
import java.util.List;
@Service
@Slf4j
public class CourseDetailsServiceImpl extends ServiceImpl<CourseDetailsDao, CourseDetails> implements CourseDetailsService {
@Autowired
@@ -53,6 +62,12 @@ public class CourseDetailsServiceImpl extends ServiceImpl<CourseDetailsDao, Cour
private OrdersService ordersService;
@Autowired
private UserService userService;
@Autowired
private OrdersDao ordersDao;
@Autowired
private CommonInfoDao commonInfoDao;
@Autowired
private RedisServiceImpl redisServiceImpl;
@Override
@@ -77,6 +92,37 @@ public class CourseDetailsServiceImpl extends ServiceImpl<CourseDetailsDao, Cour
return Result.success();
}
/**
* 校验用户是否达到免费播放购买次数
* @param userId 用户id
* @return true 可观看
*/
private boolean checkFreeWatchPayCount(Long userId) {
Boolean isExpire = redisServiceImpl.getPayFreeWatchTimeIsExpire(userId);
if (isExpire == null) {
Integer count = ordersDao.countPayOrderByDay(userId);
CommonInfo needCountCommonInfo = commonInfoDao.selectOne(new LambdaQueryWrapper<CommonInfo>()
.eq(CommonInfo::getType, 916));
CommonInfo freeTimeCommonInfo = commonInfoDao.selectOne(new LambdaQueryWrapper<CommonInfo>()
.eq(CommonInfo::getType, 917));
if (needCountCommonInfo == null || freeTimeCommonInfo == null
|| StrUtil.isBlank(needCountCommonInfo.getValue()) || StrUtil.isBlank(freeTimeCommonInfo.getValue())) {
log.warn("系统未配置全免次数或时间");
return false;
}
// 购买次数超过设置redis标识
if (count >= Integer.parseInt(needCountCommonInfo.getValue())) {
redisServiceImpl.setPayFreeWatchTime(userId, Integer.parseInt(freeTimeCommonInfo.getValue()));
isExpire = false;
}else {
isExpire = true;
}
}
return !isExpire;
}
@Override
public Result selectCourseDetailsById(Long id, String token, String courseDetailsId) {
Course bean = courseDao.selectById(id);
@@ -99,7 +145,9 @@ public class CourseDetailsServiceImpl extends ServiceImpl<CourseDetailsDao, Cour
UserEntity userEntity = userService.selectUserById(userId);
//查询用户是否购买了整集
CourseUser courseUser = courseUserDao.selectCourseUser(id, userId);
if (courseUser != null || (userEntity != null && userEntity.getMember() != null && userEntity.getMember() == 2)) {
// 每天购买超过上限,获得免费时间段资格
boolean freeWatch = checkFreeWatchPayCount(userId);
if (freeWatch || courseUser != null || (userEntity != null && userEntity.getMember() != null && userEntity.getMember() == 2)) {
bean.setListsDetail(baseMapper.findByCourseId(id, userId));
} else {
bean.setListsDetail(baseMapper.findByCourseIdNotUrl(id, userId));

View File

@@ -39,6 +39,8 @@ public interface OrdersDao extends BaseMapper<Orders> {
Integer selectOrdersCountStatisticsByDay(Long userId);
Orders selectOrdersByDay(Long userId);
Integer countPayOrderByDay(Long userId);
Integer countOrderNum(Long userId, String time);

View File

@@ -8,4 +8,8 @@ public interface RedisService {
void setDiscSpinningAmounts(String key);
void setPayFreeWatchTime(Long userId, Integer time);
Boolean getPayFreeWatchTimeIsExpire(Long userId);
}

View File

@@ -1,6 +1,10 @@
package com.sqx.modules.redisService.impl;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.sqx.common.utils.RedisKeys;
import com.sqx.common.utils.RedisUtils;
import com.sqx.modules.discSpinning.entity.DiscSpinningAmount;
import com.sqx.modules.discSpinning.service.DiscSpinningAmountService;
@@ -9,6 +13,8 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
@Service
public class RedisServiceImpl implements RedisService {
@@ -23,4 +29,23 @@ public class RedisServiceImpl implements RedisService {
List<DiscSpinningAmount> amounts = amountService.list(new QueryWrapper<DiscSpinningAmount>().eq("status", 1).orderByAsc("max_amount"));
redisUtils.set(key, amounts);
}
@Override
public void setPayFreeWatchTime(Long userId, Integer minute) {
Date now = DateUtil.date();
Date tomorrow = DateUtil.beginOfDay(DateUtil.offsetDay(now, 1));
long seconds = DateUtil.between(now, tomorrow, DateUnit.SECOND);
redisUtils.setIfAbsent(RedisKeys.getPayFreeWatchKey(userId), DateUtil.offsetMinute(now, minute).getTime(), seconds + 300);
}
@Override
public Boolean getPayFreeWatchTimeIsExpire(Long userId) {
String data = redisUtils.get(RedisKeys.getPayFreeWatchKey(userId));
if (data == null) {
return null;
}
long expireTime = Long.parseLong(data);
return DateUtil.current() > expireTime;
}
}

View File

@@ -319,4 +319,12 @@
and create_time > #{time}
</if>
</select>
<select id="countPayOrderByDay" resultType="java.lang.Integer">
SELECT count(*)
FROM orders
WHERE orders.user_id = #{userId}
AND orders.`status` = 1
AND orders.`pay_way` = 9
AND orders.create_time > DATE_FORMAT(CURDATE(), '%Y-%m-%d 00:00:00')
</select>
</mapper>