package com.smcic.api.operate.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.smcic.api.operate.entity.KeysConst;
import com.smcic.api.operate.entity.Operate;
import com.smcic.api.operate.mapper.OperateMapper;
import com.smcic.api.operate.service.IOperateService;
import com.smcic.core.advice.APIException;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.util.TextUtils;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
/**
*
* 服务实现类
*
*
* @author syj
* @since 2022-12-10
*/
@Service
@Slf4j
public class OperateServiceImpl extends ServiceImpl implements IOperateService {
@Resource
private RedisTemplate redisTemplate;
@Resource
private ObjectMapper objectMapper;
public void verify(Integer operateId){
LocalDateTime now = LocalDateTime.now();
Operate ope = getFromCache(operateId);
if(null != ope.getStartTime() && ope.getStartTime().isAfter(now)){
throw new APIException(400, "活动尚未开始");
}
if(null != ope.getEndTime() && ope.getEndTime().isBefore(now)){
throw new APIException(400, "活动已经结束");
}
}
public Operate getFromCache(Integer operateId){
String ope = redisTemplate.opsForValue().get(KeysConst.OPERATE + operateId);
Operate operate = new Operate();
try {
if(TextUtils.isEmpty(ope)){
operate = getById(operateId);
redisTemplate.opsForValue().set(KeysConst.OPERATE + operateId, objectMapper.writeValueAsString(operate));
}else{
operate = objectMapper.readValue(ope, Operate.class);
}
} catch (JsonProcessingException e) {
log.error("获取operate失败", e);
}
return operate;
}
public Long getTTl(Integer operateId){
LocalDateTime now = LocalDateTime.now();
Operate ope = getById(operateId);
if(null == ope.getEndTime()) return 3600 * 24 * 365L;
return ope.getEndTime().isAfter(now) ? ope.getEndTime().toEpochSecond(ZoneOffset.of("+8")) - now.toEpochSecond(ZoneOffset.of("+8")) : 1L;
}
}