Interface SerialNumberGenerator

Functional Interface:
This is a functional interface and can therefore be used as the assignment target for a lambda expression or method reference.

@FunctionalInterface public interface SerialNumberGenerator

序號生成器介面

定義業務序號(如訂單編號、客戶編號)的生成策略。 框架只提供介面定義,具體的生成邏輯由應用層實作。

設計原則

  • 介面定義序號生成契約
  • 應用層實作具體的生成策略(如序號、UUID、日期格式等)
  • 支援多租戶環境(透過 SerialNumberContext 傳遞租戶資訊)

實作範例 - 序號式編碼

@Component
public class OrderSerialNumberGenerator implements SerialNumberGenerator {

    private final OrderRepository orderRepository;

    @Override
    public String generate(SerialNumberContext context) {
        // 格式:{租戶代碼}-{日期}-{序號}
        // 例如:T001-20250113-0001

        String prefix = context.tenantCode() + "-" + context.datePart() + "-";

        // 查詢當前最大序號
        Integer maxSeq = orderRepository.findMaxOrderNumberSequence(prefix);
        int nextSeq = (maxSeq == null ? 0 : maxSeq) + 1;

        return String.format("%s%0" + context.sequenceLength() + "d", prefix, nextSeq);
    }
}

實作範例 - UUID 式編碼

@Component
public class UuidSerialNumberGenerator implements SerialNumberGenerator {

    @Override
    public String generate(SerialNumberContext context) {
        // 格式:{前綴}-{UUID}
        // 例如:ORD-550e8400-e29b-41d4-a716-446655440000

        return context.prefix() + UUID.randomUUID().toString();
    }
}

Service 層使用範例

@Service
@RequiredArgsConstructor
public class OrderService {

    private final SerialNumberGenerator orderSerialNumberGenerator;  // 注入實作

    public Order create(CreateOrderRequest request) {
        Order order = new Order();

        // 生成訂單編號
        SerialNumberContext context = SerialNumberContext.builder()
            .tenantCode(tenant.getCode())
            .entityType("Order")
            .prefix("ORD-")
            .dateFormat("yyyyMMdd")
            .sequenceLength(4)
            .build();

        order.setOrderNumber(orderSerialNumberGenerator.generate(context));

        return orderRepository.save(order);
    }
}
See Also:
  • Method Details

    • generate

      String generate(SerialNumberContext context)
      生成業務序號
      Parameters:
      context - 序號生成上下文,包含租戶、前綴、格式等資訊
      Returns:
      生成的業務序號
    • withPrefix

      static SerialNumberGenerator withPrefix(Supplier<Integer> sequenceSupplier)

      建立簡單的前綴式生成器

      格式:{prefix}{sequence}

      Parameters:
      sequenceSupplier - 序號提供者
      Returns:
      SerialNumberGenerator 實例
    • withDate

      static SerialNumberGenerator withDate(Function<String,Integer> sequenceSupplier)

      建立帶日期的生成器

      格式:{tenantCode}-{datePart}-{sequence}

      Parameters:
      sequenceSupplier - 序號提供者(接收前綴,返回下一序號)
      Returns:
      SerialNumberGenerator 實例