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進行業務處理。java
具體沒法注入緣由我也不是很肯定,若是有疑問或者指教請在下方評論,謝謝~redis