| | |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.text.SimpleDateFormat; |
| | | import java.time.Duration; |
| | | import java.time.LocalDate; |
| | | import java.time.LocalDateTime; |
| | | import java.time.format.DateTimeFormatter; |
| | | import java.util.Calendar; |
| | | import java.util.Date; |
| | |
| | | * @return 今日自增后的计数值 |
| | | */ |
| | | public long incrementAndGetByDb() { |
| | | String approveId = redisTemplate.opsForValue().get(approvalNumberPrefix + ":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(approvalNumberPrefix + ":approveNum","1",1L, TimeUnit.HOURS); |
| | | return 1; |
| | | }else{ |
| | | aLong += 1; |
| | | redisTemplate.opsForValue().set(approvalNumberPrefix + ":approveNum",aLong.toString(),1L, TimeUnit.HOURS); |
| | | return aLong; |
| | | String today = LocalDate.now().format(DATE_FORMAT); |
| | | String key = approvalNumberPrefix + ":approveNum:" + today; |
| | | String lockKey = "lock:" + key; |
| | | |
| | | if (Boolean.FALSE.equals(redisTemplate.hasKey(key))) { |
| | | Boolean acquired = redisTemplate.opsForValue().setIfAbsent(lockKey, "1", 10, TimeUnit.SECONDS); |
| | | if (Boolean.TRUE.equals(acquired)) { |
| | | try { |
| | | if (Boolean.FALSE.equals(redisTemplate.hasKey(key))) { |
| | | StartAndEndDateDto dateTime = getDateTime(); |
| | | LambdaQueryWrapper<ApproveProcess> approveProcessLambdaQueryWrapper = new LambdaQueryWrapper<>(); |
| | | approveProcessLambdaQueryWrapper |
| | | .eq(ApproveProcess::getApproveDelete, 0) |
| | | .gt(ApproveProcess::getCreateTime, dateTime.getStartDate()) |
| | | .lt(ApproveProcess::getCreateTime, dateTime.getEndDate()); |
| | | Long count = approveProcessMapper.selectCount(approveProcessLambdaQueryWrapper); |
| | | long initialCount = (count == null) ? 0 : count; |
| | | |
| | | redisTemplate.opsForValue().set(key, String.valueOf(initialCount), 24, TimeUnit.HOURS); |
| | | } |
| | | } finally { |
| | | // 释放锁 |
| | | redisTemplate.delete(lockKey); |
| | | } |
| | | } else { |
| | | try { |
| | | Thread.sleep(100); |
| | | } catch (InterruptedException e) { |
| | | Thread.currentThread().interrupt(); |
| | | } |
| | | return incrementAndGetByDb(); // 递归重试 |
| | | } |
| | | }else{ |
| | | Long num = Long.parseLong(approveId) + 1; |
| | | redisTemplate.opsForValue().set(approvalNumberPrefix + ":approveNum",num.toString(),1L, TimeUnit.HOURS); |
| | | return Long.parseLong(approveId); |
| | | } |
| | | |
| | | return redisTemplate.opsForValue().increment(key); |
| | | } |
| | | |
| | | /** |
| | |
| | | * 计算距离次日凌晨的秒数 |
| | | */ |
| | | 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; |
| | | LocalDateTime now = LocalDateTime.now(); |
| | | LocalDateTime midnight = now.toLocalDate().plusDays(1).atStartOfDay(); |
| | | return Duration.between(now, midnight).getSeconds(); |
| | | } |
| | | |
| | | /** |