採番モジュール
1. 目的
SequencesModule は、DynamoDB を主要なデータベースとして使用してシステム内で動的なシーケンスを管理するためのサービスです。
このサービスは次の目的で設計されています:
- シーケンスタイプ、テナント、日付などのパラメータに基づいて一意なシーケンス番号を生成します。
- 次のようなサイクルに基づいてシーケンスを自動的にリセットします:
- 毎日。
- 毎月。
- 毎年。
- 会計年度単位。
システムの特定の要件に従ってシーケンス番号をフォーマットします(例: TODO-PERSONAL-72-001)。 マルチテナントシステムでのデータの整合性と完全性を確保します。
動作の仕組み
2. 使用方法
SequencesModule の動作をカスタマイズするには、静的な register() メソッドでオプションの object を渡します。オプションオブジェクトには、1 つのプロパティのみが含まれています。
enableController: デフォルトのシーケンスコントローラーを有効または無効にします。
シーケンスモジュールの使用方法とシーケンスコントローラーの認証を カスタマイズする方法を示す簡単な例を作成します。
// seq.controller.ts
import { SequencesController } from "@mbc-cqrs-serverless/sequence";
import { Controller } from "@nestjs/common";
import { ApiTags } from "@nestjs/swagger";
import { Auth } from "src/auth/auth.decorator";
import { ROLE } from "src/auth/role.enum";
@Controller("api/sequence")
@ApiTags("sequence")
@Auth(ROLE.ADMIN)
export class SeqController extends SequencesController {}
// seq.module.ts
import { SequencesModule } from "@mbc-cqrs-serverless/sequence";
import { Module } from "@nestjs/common";
import { SeqController } from "./seq.controller";
@Module({
imports: [SequencesModule.register({ enableController: false })],
controllers: [SeqController],
exports: [SequencesModule],
})
export class SeqModule {}
コントローラーの ほかに、SequencesService を直接注入して使用することでシーケンスを生成できます。
SequencesServiceには4つのパブリックメソッドがあります(現行2つ、非推奨1つ、v1.1.0で削除1つ):
async generateSequenceItem(dto: GenerateFormattedSequenceDto, options?: {invokeContext: IInvoke}): Promise<SequenceEntity>
GenerateFormattedSequenceDto オブジェクトで提供されたパラメータに基づいて新しいシーケンスを生成します。
パラメータ
dto: GenerateFormattedSequenceDto(生成設定DTO)
シーケンス生成の動作をカスタマイズするデータ転送オブジェクトです。そのプロパティには以下が含まれます:
-
date?: Date(基準日、省略時は現在日時)- デフォルト: 現在の日付。
- 説明: シーケンスが生成される日付を指定します。
-
rotateBy?: RotateByEnum-
デフォルト: NONE。
-
オプション
- FISCAL_YEARLY(会計年度) (
'fiscal_yearly') - YEARLY(年次) (
'yearly') - MONTHLY(月次) (
'monthly') - DAILY(日次) (
'daily') - NONE(採番なし) (
'none')
- FISCAL_YEARLY(会計年度) (
-
説明: シーケンスカウンターが1にリセットされるタイミングを決定します。
-
ローテーション戦略の一覧:
戦略 カウンターがリセットされる条件 例 NONEなし — カウンターは無限にインクリメント 1, 2, 3, … 9999DAILY日付が変わったとき 毎日深夜にリセット MONTHLY月が変わったとき 毎月1日にリセット YEARLY年が変わったとき 毎年1月1日にリセット FISCAL_YEARLY会計年度が変わったとき(開始月は startMonthで制御)会計年度開始時にリセット;デフォルトは4月(日本の慣例)
-
-
tenantCode: string- 必須: はい。
- 説明: テナントと用途のタイプコードを識別します。
-
typeCode: string(シーケンス種別コード)- 必須: はい。
- 説明: シーケンスのタイプコードを識別します。
-
params?: SequenceParamsDto(追加パラメーター)- 必須: いいえ
- 説明: シーケンスを識別するためのパラメータを定義します。
import { IsString, IsOptional } from 'class-validator';export class SequenceParamsDto {@IsString()code1: string@IsString()@IsOptional()code2?: string@IsOptional()@IsString()code3?: string@IsOptional()@IsString()code4?: string@IsOptional()@IsString()code5?: stringconstructor(partial: Partial<SequenceParamsDto>) {Object.assign(this, partial)}}
-
prefix?: string- 必須: いいえ
- 説明: フォーマットされたシーケンスの先頭に追加するオプションのプレフィックス。プレフィックスはフォーマットされたパターンの前に追加されます。
- 例: prefixが
'INV-'でフォーマットが'2024-001'を生成する場合、結果は'INV-2024-001'になります。
-
postfix?: string- 必須: いいえ
- 説明: フォーマットされたシーケンスの末尾に追加するオプションのポストフィックス。ポストフィックスはフォーマットされたパターンの後に追加されます。
- 例: postfixが
'-DRAFT'でフォーマットが'2024-001'を生成する場合、結果は'2024-001-DRAFT'になります。
レスポンス
この関数の戻り値は次のような SequenceEntity 型になります。
export class SequenceEntity {
id: string
no: number
formattedNo: string
issuedAt: Date
constructor(partial: Partial<SequenceEntity>) {
Object.assign(this, partial)
}
}
カスタマイズ方法
デフォルトでは、返されるデータには、「%%no%%」形式の formattedNo フィールドが含まれます。「no」はシーケンス番号を表します。独自のカスタム形式を定義したい場合は、次のパラメータを使用して DynamoDB のマスター データを更新できます。
- PK:
MASTER${KEY_SEPARATOR}${tenantCode} - SK:
MASTER_DATA${KEY_SEPARATOR}${typeCode}
データ構造は以下のとおりです:
{
"format": "string",
"startMonth": "number",
"registerDate": "string"
}
例
たとえば、「code1」から「code5」、「year」、「month」、「day」、「date」、「no」、および「fiscal_year」をフォーマットに追加する場合、フォーマットは次のようになります。
{
"format": "%%code2#:0>7%%-%%fiscal_year#:0>2%%-%%code3%%%%no#:0>3%%"
}
このフォーマットでは:
- 変数は
%% <param> %%内に記述されます。 #:0>Nサフィックスは値をN文字幅に左ゼロ埋めします(例:#:0>3は5を005にします)。サフィックスを省略すると値はそのまま使用 されます。
フォーマット指定子の一覧:
| サフィックス | 意味 | 入力 5 の場合 | 結果 |
|---|---|---|---|
| (なし) | パディングなし — そのままの値 | 5 | 5 |
#:0>3 | 左ゼロ埋めで3文字幅にする | 5 | 005 |
#:0>7 | 左ゼロ埋めで7文字幅にする | 5 | 0000005 |
例えば:
%%code2#:0>7%%は、code2 が 7 文字の長さにフォーマットされ、必要に応じて先頭にゼロが埋め込まれます。%%fiscal_year#:0>2%%は、fiscal_year を 2 文字の長さにフォーマットします。%%code3%%は code3 の値をそのまま表します。%%no#:0>3%%は、シーケンス番号 (no) が 3 桁の長さにフォーマットされ、必要に応じて先頭にゼロが埋め込まれることを保証します。
特定の月から始まる会計年度を計算したい場合は、「startMonth」フィールドを追加できます。たとえば、会計年度を 3 月から開始する場合、形式は次のようになります。
{
"format": "%%code2#:0>7%%-%%fiscal_year#:0>2%%-%%code3%%%%no#:0>3%%",
"startMonth": 3
}
この場合:
- startMonth: 会計年度を開始する月を定義します (例: 3 月の場合は 3)。デフォルトは 4 (4月)で、日本の会計年度慣習(4月〜3月)に従います。
特定の日付 (例: 2005-01-01) から始まる会計年度を計算したい場合は、次のように registerDate フィールドを追加できます。
{
"format": "%%code2#:0>7%%-%%fiscal_year#:0>2%%-%%code3%%%%no#:0>3%%",
"registerDate": "2005-01-01"
}
この場合:
- registerDate: 会計年度の正確な開始日を定義します (例: "2005-01-01")。
これにより、特定のビジネス ニーズに応じて会計年度の計算をカスタマイズできます。
async generateSequenceItemWithProvideSetting(dto: GenerateFormattedSequenceWithProvidedSettingDto, options?: {invokeContext: IInvoke}): Promise<SequenceEntity>
このメソッドを使用すると、DynamoDBでのマスターデータ設定なしで、DTOで直接提供されたカスタム設定でシーケンスを生成できます。