package cn.iocoder.yudao.module.bpm.dal.redis; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.module.bpm.controller.admin.definition.vo.model.BpmModelMetaInfoVO; import jakarta.annotation.Resource; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Repository; import java.time.Duration; import java.time.LocalDateTime; import static cn.hutool.core.date.DatePattern.*; /** * BPM 流程 Id 编码的 Redis DAO * * @author Lesan */ @Repository public class BpmProcessIdRedisDAO { @Resource private StringRedisTemplate stringRedisTemplate; /** * 生成序号,使用定义的 processIdRule 规则生成 * * @param processIdRule 规则 * @return 序号 */ public String generate(BpmModelMetaInfoVO.ProcessIdRule processIdRule) { // 生成日期前缀 String infix = ""; switch (processIdRule.getInfix()) { case "DAY": infix = DateUtil.format(LocalDateTime.now(), PURE_DATE_PATTERN); break; case "HOUR": infix = DateUtil.format(LocalDateTime.now(), PURE_DATE_PATTERN + "HH"); break; case "MINUTE": infix = DateUtil.format(LocalDateTime.now(), PURE_DATE_PATTERN + "HHmm"); break; case "SECOND": infix = DateUtil.format(LocalDateTime.now(), PURE_DATETIME_PATTERN); break; } // 生成序号 String noPrefix = processIdRule.getPrefix() + infix + processIdRule.getPostfix(); String key = RedisKeyConstants.BPM_PROCESS_ID + noPrefix; Long no = stringRedisTemplate.opsForValue().increment(key); if (StrUtil.isEmpty(infix)) { // 特殊:没有前缀,则不能过期,不能每次都是从 0 开始。可见 https://t.zsxq.com/MU1E2 讨论 stringRedisTemplate.expire(key, Duration.ofDays(1L)); } return noPrefix + String.format("%0" + processIdRule.getLength() + "d", no); } }