yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/redis/MesCodeRedisDAO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,37 @@
package cn.iocoder.yudao.module.mes.dal.redis;
import cn.iocoder.yudao.framework.common.util.number.BizNoUtils;
import jakarta.annotation.Resource;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Repository;
/**
 * MES ä¸šåŠ¡ç¼–ç ç”Ÿæˆçš„ Redis DAO(实例码:袋码 / æ‰˜ç›˜ç  / ä¸´æ—¶ç ç­‰ï¼‰ã€‚
 *
 * <p>需求:所有业务编码统一为「16 ä½çº¯æ•°å­—」,且全系统唯一。
 * è¿™é‡Œå¤ç”¨å…¨ç³»ç»Ÿç»Ÿä¸€çš„ Redis è‡ªå¢ž KEY,保证与其它模块的编码也不重复。
 */
@Repository
public class MesCodeRedisDAO {
    @Resource
    private StringRedisTemplate stringRedisTemplate;
    /**
     * ç”Ÿæˆä¸€ä¸ª 16 ä½çº¯æ•°å­—业务编码(全系统唯一)
     *
     * @return 16 ä½çº¯æ•°å­—编码
     */
    public String generate() {
        // éšæœºç”Ÿæˆ 16 ä½çº¯æ•°å­—编码,并用 Redis é›†åˆæŸ¥é‡ï¼Œä¿è¯å…¨ç³»ç»Ÿå”¯ä¸€ï¼ˆä¸ä½¿ç”¨è‡ªå¢ž/顺序)
        for (int i = 0; i < BizNoUtils.MAX_RETRY; i++) {
            String code = BizNoUtils.randomCode();
            Long added = stringRedisTemplate.opsForSet().add(BizNoUtils.USED_SET_KEY, code);
            if (added != null && added > 0) {
                return code;
            }
        }
        throw new IllegalStateException("生成唯一业务编码失败,请重试");
    }
}