gongchunyi
2026-06-23 bb7f1da14d43246731dc7a5037a243f8a14a3567
fix: 审批节点流程编号修改
已修改2个文件
64 ■■■■■ 文件已修改
src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/utils/DailyRedisCounter.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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 计数器名称