¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.approve.utils; |
| | | |
| | | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
| | | import com.ruoyi.approve.mapper.ApproveProcessMapper; |
| | | import com.ruoyi.approve.pojo.ApproveProcess; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.data.redis.core.StringRedisTemplate; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.text.SimpleDateFormat; |
| | | import java.time.LocalDate; |
| | | import java.time.format.DateTimeFormatter; |
| | | import java.util.Calendar; |
| | | import java.util.Date; |
| | | import java.util.concurrent.TimeUnit; |
| | | |
| | | |
| | | //åºäºredisçä¸ä¸ªæ¯æ¥è®¡æ°å¨ |
| | | @Component |
| | | public class DailyRedisCounter { |
| | | private static final String KEY_PREFIX = "daily_counter:"; |
| | | private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("yyyyMMdd"); |
| | | private final StringRedisTemplate redisTemplate; |
| | | |
| | | public DailyRedisCounter(StringRedisTemplate redisTemplate) { |
| | | this.redisTemplate = redisTemplate; |
| | | } |
| | | |
| | | /**æ¥ç¼å |
| | | * è·åæå®è®¡æ°å¨å¨ä»æ¥çæ°å¼ï¼å¹¶èªå¢1 |
| | | * @param counterName 计æ°å¨åç§°ï¼ä¾å¦ï¼login_countãorder_countï¼ |
| | | * @return 仿¥èªå¢åç计æ°å¼ |
| | | */ |
| | | public long incrementAndGet(String counterName) { |
| | | String key = getKey(counterName); |
| | | long count = redisTemplate.opsForValue().increment(key, 1); |
| | | |
| | | // ä»
å¨ç¬¬ä¸æ¬¡è®¾ç½®æ¶è®¾ç½®è¿ææ¶é´ï¼é¿å
éå¤è®¾ç½®ï¼ |
| | | if (count == 1) { |
| | | long secondsUntilMidnight = calculateSecondsUntilMidnight(); |
| | | redisTemplate.expire(key, secondsUntilMidnight, TimeUnit.SECONDS); |
| | | } |
| | | |
| | | return count; |
| | | } |
| | | |
| | | @Autowired |
| | | private ApproveProcessMapper approveProcessMapper; |
| | | |
| | | /** |
| | | * è·åå½åæ¶é´ç å¼å§æ¥æ ï¼ç»ææ¥æ |
| | | * @return |
| | | */ |
| | | public static StartAndEndDateDto getDateTime(){ |
| | | SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); |
| | | Date date = new Date(); |
| | | Calendar cal = Calendar.getInstance(); |
| | | cal.setTime(date); |
| | | cal.add(Calendar.DATE,1); |
| | | String startDateTime = simpleDateFormat.format(date); |
| | | String endDateTime = simpleDateFormat.format(cal.getTime()); |
| | | StartAndEndDateDto startAndEndDateDto = new StartAndEndDateDto(); |
| | | startAndEndDateDto.setStartDate(startDateTime); |
| | | startAndEndDateDto.setEndDate(endDateTime); |
| | | return startAndEndDateDto; |
| | | } |
| | | |
| | | /**æ¥æ°æ®åº |
| | | * è·åæå®è®¡æ°å¨å¨ä»æ¥çæ°å¼ï¼å¹¶èªå¢1 |
| | | * @return 仿¥èªå¢åç计æ°å¼ |
| | | */ |
| | | public long incrementAndGetByDb() { |
| | | String approveId = redisTemplate.opsForValue().get("approveNum"); |
| | | if(approveId == null){ |
| | | StartAndEndDateDto dateTime = getDateTime(); |
| | | LambdaQueryWrapper<ApproveProcess> approveProcessLambdaQueryWrapper = new LambdaQueryWrapper<>(); |
| | | approveProcessLambdaQueryWrapper |
| | | .eq(ApproveProcess::getApproveDelete,0) |
| | | .gt(ApproveProcess::getCreateTime,dateTime.getStartDate()) |
| | | .lt(ApproveProcess::getCreateTime,dateTime.getEndDate()); |
| | | Long aLong = approveProcessMapper.selectCount(approveProcessLambdaQueryWrapper); |
| | | if(aLong == null){ |
| | | redisTemplate.opsForValue().set("approveNum","1",1L, TimeUnit.HOURS); |
| | | return 1; |
| | | }else{ |
| | | aLong += 1; |
| | | redisTemplate.opsForValue().set("approveNum",aLong.toString(),1L, TimeUnit.HOURS); |
| | | return aLong; |
| | | } |
| | | }else{ |
| | | Long num = Long.parseLong(approveId) + 1; |
| | | redisTemplate.opsForValue().set("approveNum",num.toString(),1L, TimeUnit.HOURS); |
| | | return Long.parseLong(approveId); |
| | | } |
| | | |
| | | } |
| | | |
| | | /** |
| | | * è·åæå®è®¡æ°å¨å¨ä»æ¥çå½åæ°å¼ |
| | | * @param counterName 计æ°å¨åç§° |
| | | * @return 仿¥å½å计æ°å¼ï¼è¥ä¸åå¨åè¿å0 |
| | | */ |
| | | public long getCurrentCount(String counterName) { |
| | | String key = getKey(counterName); |
| | | String value = redisTemplate.opsForValue().get(key); |
| | | return value != null ? Long.parseLong(value) : 0; |
| | | } |
| | | |
| | | /** |
| | | * 计ç®è·ç¦»æ¬¡æ¥åæ¨çç§æ° |
| | | */ |
| | | private long calculateSecondsUntilMidnight() { |
| | | LocalDate tomorrow = LocalDate.now().plusDays(1); |
| | | LocalDate midnight = tomorrow.atStartOfDay().toLocalDate(); |
| | | return java.time.Duration.between( |
| | | LocalDate.now().atTime(23, 59, 59), |
| | | midnight.atTime(0, 0, 0) |
| | | ).getSeconds() + 1; |
| | | } |
| | | |
| | | /** |
| | | * çæRedisé® |
| | | */ |
| | | private String getKey(String counterName) { |
| | | String today = LocalDate.now().format(DATE_FORMAT); |
| | | return KEY_PREFIX + counterName + ":" + today; |
| | | } |
| | | } |