Package io.leandev.appfuse.serial


package io.leandev.appfuse.serial

序號生成模組

提供業務序號(如訂單編號、客戶編號)的生成介面和上下文。

模組內容

設計原則

此模組遵循「介面定義契約」的設計原則:

  • 框架只定義生成介面,不提供具體實作
  • 應用層根據業務需求實作生成策略
  • 支援多租戶環境透過 SerialNumberContext 傳遞資訊

常見序號格式

  • 訂單編號:{租戶代碼}-{YYYYMMDD}-{序號} → T001-20250113-0001
  • 客戶編號:{租戶代碼}-CUST-{序號} → T001-CUST-0001
  • 產品編號:{前綴}{序號} → PRD-0001

使用範例

  1. 實作 SerialNumberGenerator:
@Component
public class OrderSerialNumberGenerator implements SerialNumberGenerator {

    private final OrderRepository orderRepository;

    @Override
    public String generate(SerialNumberContext context) {
        String prefix = context.fullPrefix();
        Integer maxSeq = orderRepository.findMaxSequence(prefix);
        int nextSeq = (maxSeq == null ? 0 : maxSeq) + 1;
        return String.format("%s%0" + context.sequenceLength() + "d", prefix, nextSeq);
    }
}
  1. 在 Service 中使用:
@Service
public class OrderService {

    private final SerialNumberGenerator orderSerialNumberGenerator;

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

        SerialNumberContext context = SerialNumberContext.builder()
            .tenantCode(tenant.getCode())
            .dateFormat("yyyyMMdd")
            .sequenceLength(4)
            .build();

        order.setOrderNumber(orderSerialNumberGenerator.generate(context));
        return orderRepository.save(order);
    }
}
See Also: