bytesystems/number-sequence-generator

用于生成人类可读数字序列的生成器

1.2.0551 2024-09-17 12:29 UTC

This package is auto-updated.

Last update: 2024-09-17 12:31:11 UTC


README

此包提供了一种基于注解的方法来为各种用例生成数字序列,例如发票、报价、订单等。 目前它依赖于 doctrine\orm 来存储序列和 doctrine\migrations 来准备您的数据库。

安装

$ composer require bytesystems/number-sequence-generator
准备您的数据库
$ symfony console doctrine:migrations:diff
$ symfony console doctrine:migrations:migrate

如果您不想添加

对于此包不需要进一步的配置。
要配置您的序列,请使用 注解

使用方法

要为实体创建一个数字序列,注解应设置为生成数字的属性。

注解

将以下使用语句添加到您的实体中
use Bytesystems\NumberGeneratorBundle\Annotation as NG;
然后注解属性为
@NG\Sequence(key="key",segment="segment",init=1000,pattern="IV{Y}-{#|6|y})

生成的数字将遵循该模式,例如,生成的数字可能如下所示: IV2021-004121

string key

必需
将自动为设置的键生成并持久化序列。

string segment

可选
提供将序列分成段的可能性。段使用相同的键、模式和初始化值,但有自己的计数器。段可以是静态字符串,也可以是实体中另一个属性的引用。要定义引用,请使用 segment="{property}"

string pattern

可选,默认为 {#}
必须的 {#} 令牌,如果省略模式,将假定此令牌。以下是一些可用的令牌,日期组件遵循 PHP 的 datetime.format。

  • {#|L|C} 序列的当前编号。如果提供了 L,则数字将用零填充到长度 L。
    如果提供了 C - 日期上下文 - 则在上下文更改时将重置数字。
    上下文的允许值是 (y = 年,m = 月,d = 日,w = 周,h = 时)。
  • {D} 日期时间部分,允许的 D 值几乎全部是生成固定长度的值,例如,d(月份中的日,两位数,带前导零)是允许的,而 j(月份中的日,不带前导零)则不是。允许的值
    • d,月份中的日,两位数,带前导零
    • D,月份中的日,文本 3 个字母
    • m,月份,两位数,带前导零
    • M,月份,文本 3 个字母
    • y,年,两位数
    • Y,年,四位数字
    • H,小时,24 小时制,两位数,带前导零
    • w,年中的周,两位数,带前导零(改为小写以保持一致性

array segments

可选
定义一个具有 "value" 和 "pattern" 属性的段注解数组。它允许为序列的段定义模式。

int init

可选,默认为 0
定义序列的初始编号,第一个生成的编号是初始编号 + 1。

关于分段

您可以根据自己的需要定义分段序列并持久化它们。这为您提供了定义依赖于实体中另一个属性的动态序列的灵活性。
除非您明确手动定义序列,否则将回退到默认序列。

假设您的应用程序中有名为 Product 的实体。您希望所有产品都有以下编号
ACME-5123141-P
但Olymp供应商的产品应有自己的文章编号,例如
ZEUS-41313-P
实现您目标所需的注释看起来像
Sequence(key="product",segment="{supplierId}",init=1000,pattern="ACME-{#|7}-P")\

这允许构建一个管理序列和段落的接口。

生成的实体

/** 
* @ORM\Table()
* @ORM\Entity()
*/
class Product
{
  /**
  * @ORM\Column(type="integer")
  * @ORM\Id()
  * @ORM\GeneratedValue(strategy="AUTO")
  *
  * @var integer
  */
  private $id;

  /**
   * @ORM\Column(type="int")
   * @var int
   */
  private supplierId;

  /**
   * @ORM\Column(type="string", nullable=true)
   * @NG\Sequence(
   * key="product",
   * segment="{supplierId}",
   * init=1000,
   * pattern="ACME-{#|7}-P"
   * )
   * @var string
   */
  private productNo;
  
  ...
}

所有产品都将有如下编号 ACME-5123141-P
假设Olymp的供应商ID为42,可以使用以下SQL语句启用Olymp序列
insert into bytesystems_number_sequence (sequence, segment, pattern, current_number, updated_at) values ('product','42', 'ZEUS-{#|5}-P',0,now());

如果您在开发期间有关于分段的信息,可以扩展注释。

/** 
* @ORM\Table()
* @ORM\Entity()
*/
class Document
{
  /**
  * @ORM\Column(type="integer")
  * @ORM\Id()
  * @ORM\GeneratedValue(strategy="AUTO")
  *
  * @var integer
  */
  private $id;

  /**
   * @ORM\Column(type="string")
   * @var string
   */
  private type; // 'OFFER','ORDER','DELIVERYNOTE'

  /**
   * @ORM\Column(type="string", nullable=true)
   * @NG\Sequence(
   * key="order",
   * segment="{type}",
   * init=1000,
   * pattern="PO-{#|7}"
   * segments={
   *   @NG\Segment(value="OFFER",pattern="O-{#|7}"),
   *   @NG\Segment(value="DELIVERYNOTE",pattern="DN-{#|7}"),
   * }
   * )
   * @var string
   */
  private orderNo;
  
  ...
}

分段序列仍然可以通过SQL或接口进行修改,但无需创建创建段落的SQL语句。

待办事项

  • 包括生成序列的控制台命令
  • 扩展分段以针对多个属性

许可证

MIT许可证(MIT)