src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java
@@ -105,8 +105,15 @@ if (CollectionUtils.isEmpty(sysUsers)) throw new RuntimeException("审核用户不存在"); if (sysDept == null) throw new RuntimeException("部门不存在"); if (sysUser == null) throw new RuntimeException("申请人不存在"); String today = LocalDate.now().format(DATE_FORMAT); Long approveId = dailyRedisCounter.incrementAndGetByDb(); LocalDate targetDate = LocalDate.now(); if (!StringUtils.isEmpty(approveProcessVO.getApproveTime())) { try { targetDate = LocalDate.parse(approveProcessVO.getApproveTime(), DateTimeFormatter.ofPattern("yyyy-MM-dd")); } catch (Exception e) { } } String today = targetDate.format(DATE_FORMAT); Long approveId = dailyRedisCounter.incrementAndGetByDb(targetDate); String formattedCount = String.format("%03d", approveId); //流程 ID String approveID = today + formattedCount; @@ -129,7 +136,15 @@ approveProcess.setApproveStatus(0); approveProcess.setApproveDelete(0); approveProcess.setApproveType(approveProcessVO.getApproveType()); approveProcess.setCreateTime(LocalDateTime.now()); LocalDateTime createDateTime = LocalDateTime.now(); if (!StringUtils.isEmpty(approveProcessVO.getApproveTime())) { try { createDateTime = LocalDate.parse(approveProcessVO.getApproveTime(), DateTimeFormatter.ofPattern("yyyy-MM-dd")).atStartOfDay(); } catch (Exception e) { // ignore } } approveProcess.setCreateTime(createDateTime); approveProcess.setTenantId(approveProcessVO.getApproveDeptId()); approveProcess.setApproveUserIds(approveProcessVO.getApproveUserIds()); approveProcess.setApproveUserCurrentId(longList.get(0)); src/main/java/com/ruoyi/approve/utils/DailyRedisCounter.java
@@ -114,6 +114,49 @@ return redisTemplate.opsForValue().increment(key); } /**查数据库 * 获取指定日期在今日的数值,并自增1 * @return 目标日期自增后的计数值 */ public long incrementAndGetByDb(LocalDate targetDate) { if (targetDate == null) { targetDate = LocalDate.now(); } String dateStr = targetDate.format(DATE_FORMAT); String key = approvalNumberPrefix + ":approveNum:" + dateStr; 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))) { LambdaQueryWrapper<ApproveProcess> approveProcessLambdaQueryWrapper = new LambdaQueryWrapper<>(); approveProcessLambdaQueryWrapper .eq(ApproveProcess::getApproveDelete, 0) .likeRight(ApproveProcess::getApproveId, dateStr); 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(targetDate); // 递归重试 } } return redisTemplate.opsForValue().increment(key); } /** * 获取指定计数器在今日的当前数值 * @param counterName 计数器名称