bytesystems / number-sequence-generator
用于生成人类可读数字序列的生成器
Requires
- php: ^8.1
- doctrine/migrations: ^3.1
- doctrine/orm: ^2.6
- symfony/config: ^6.0|^7.0
- symfony/dependency-injection: ^6.0|^7.0
- symfony/property-access: ^6.0|^7.0
Requires (Dev)
- doctrine/annotations: ^2.0
- doctrine/doctrine-bundle: ^2.3
- doctrine/doctrine-fixtures-bundle: ^3.4
- liip/test-fixtures-bundle: ^2.6.0
- rector/rector: ^1.2
- symfony/framework-bundle: ^6.0|^7.0
- symfony/http-kernel: ^6.0|^7.0
- symfony/phpunit-bridge: ^6.0|^7.0
- symfony/yaml: ^6.0|^7.0
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语句。
待办事项
- 包括生成序列的控制台命令
- 扩展分段以针对多个属性