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; } }