package com.webmanage.service.impl;
|
|
import com.webmanage.service.OrderNoService;
|
import com.webmanage.util.SnowflakeIdWorker;
|
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.stereotype.Service;
|
|
import javax.annotation.PostConstruct;
|
import java.time.LocalDateTime;
|
import java.time.format.DateTimeFormatter;
|
|
/**
|
* 订单编号服务实现
|
*/
|
@Service
|
public class OrderNoServiceImpl implements OrderNoService {
|
|
@Value("${snowflake.worker-id:1}")
|
private long workerId;
|
|
@Value("${snowflake.datacenter-id:1}")
|
private long datacenterId;
|
|
@Value("${snowflake.twepoch-ms:1577808000000}") // 2020-01-01 00:00:00
|
private long twepochMs;
|
|
private SnowflakeIdWorker idWorker;
|
|
private static final DateTimeFormatter ORDER_PREFIX_FMT = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
|
|
@PostConstruct
|
public void init() {
|
this.idWorker = new SnowflakeIdWorker(workerId, datacenterId, twepochMs);
|
}
|
|
@Override
|
public String generateOrderNo() {
|
long id = generateSnowflakeId();
|
String timePrefix = LocalDateTime.now().format(ORDER_PREFIX_FMT);
|
// 订单号格式:时间前缀 + 雪花ID后10位,保证长度与排序可读性
|
String idStr = String.valueOf(id);
|
String tail = idStr.length() > 10 ? idStr.substring(idStr.length() - 10) : String.format("%010d", id);
|
return timePrefix + tail;
|
}
|
|
@Override
|
public long generateSnowflakeId() {
|
return idWorker.nextId();
|
}
|
}
|