package io.thanz.util;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.support.atomic.RedisAtomicLong;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
/**
* 生成订单号
* 定义订单号规则
* 下单渠道+业务类型+时间信息+自增
* 下单渠道:1(根据自己业务设置)
* 业务类型:1(根据自己业务设置)
* 时间信息:秒级时间戳,如java的 (System.currentTimeMillis()/1000 + "").substring(1)
* 自增:3位自增,可采用redis的incr,从redis取到值后对1000取余,如果值不存在初始可设为111
* 总位数:1位+1位+9位+3位=14位
*
* @author fzx
* @date 2018/11/2
*/
@Component
public class BookingOrderNoCreator {
@Resource
private StringRedisTemplate autowireRedisTemplate;
private static RedisTemplate redisTemplate;
private static final String CHANNEL = "1";
private static final String BUSINESSTYPE = "1";
@PostConstruct
public void init() {
redisTemplate = autowireRedisTemplate;
}
public static String createBookingOrderNo() {
StringBuilder bookingOrderNo = new StringBuilder();
RedisAtomicLong redisAtomicLong = new RedisAtomicLong("bookingOrderNo", redisTemplate.getConnectionFactory());
Long currentValue = redisAtomicLong.get();
if (currentValue == 0) {
redisAtomicLong.set(111L);
}
Long incrementValue = redisAtomicLong.incrementAndGet() % 1000;
bookingOrderNo.append(CHANNEL).append(BUSINESSTYPE).append((System.currentTimeMillis() / 1000 + "").substring(1)).append(incrementValue);
return bookingOrderNo.toString();
}
}
其原因是spring-boot启动时没有扫描到工具类,所以第一步在工具类的class级别加上注释@Component,其后在变量autowireRedisTemplate上加上@Resource自动注入,为了能让static方法能用,再建一个静态变量redisTemplate,用一个@PostConstruct注释的方法将autowireRedisTemplate赋值给redisTemplate(此方法会在项目启动时一同运行),最后,static方法中使用redisTemplate进行业务处理。
具体无法注入原因我也不是很确定,如果有疑问或者指教请在下方评论,谢谢~