0

顧客テーブルを持つデータベースがあります。これらの顧客は企業であり、顧客が独自のカスタム請求書番号を設計できる、柔軟で信頼性の高い方法を設計しようとしています.

例えば:

  • 顧客 A 請求書シーケンス: A-1306-1234。'A-' は静的テキスト、1306 は YYMM、1234 は毎月リセットされるシーケンスです。
  • 顧客 B 請求書シーケンス: 123456 - これは永遠にカウントされるシーケンスです
  • 顧客 C 請求書シーケンス: 13-123456 - このシーケンスには YY- があり、シーケンスは 1 年間実行されてリセットされます。

私は、いくぶん恣意的なシーケンスがこの数の一部になることを許可する最も柔軟な方法を決定しようとしています. また、この番号をアトミックに生成し、個々の要素が課す固有の規則に基づいてシーケンスのリセットを処理する必要があります。たとえば、シーケンスの MM は純粋な増分が毎月再起動すると推測し、MMDD は純粋な増分要素が毎月再起動すると推測します。日。

カスタムタイプは正しい方法ですか? getter と setter のセットと statics、methods、validator のセット? このタイプの機能の設計パターンは既にありますか?

4

2 に答える 2

1

お客様 B の場合と同様の問題を解決する必要がありました。私の解決策: シーケンスを格納するコレクションを作成し、次のようなドキュメントを追加しました。

{
 "_id" : "PIN",
 "_class" : "com.alldata.genIII.bo.Sequence",
 "description" : "Sequence for PIN numbers. Used in all Account collections. ",
 "nextValue" : NumberLong(100001)

}

_id を使用して、シーケンスを使用する Account コレクション内のフィールドを指定します。ユーザー要件のために 100001 で開始しました。

アカウントを作成するとき、シーケンスの次の値をフェッチし、1 を追加してシーケンスを更新します。この操作は、findAndModifyを使用するため、アトミックです。

これは、シーケンスの次の値を取得するための私のコード(Java)です:

    public Long fetchNextValue(String sequenceId) {
        Update update = new Update();
        update.inc("nextValue", 1);
        Sequence seq = mongoTemplate.findAndModify(new Query(Criteria.where("code").is(sequenceId)), update, Sequence.class);
        if (seq == null)
            throw new NotFoundException("Sequence not found for sequenceId " + sequenceId);
        return seq.getNextValue();
    }

このコードを本番環境で実行していますが、これまでのところ問題はありません。ただし、念のため、アカウント コレクションの「ピン」フィールドに一意のインデックスを配置して、重複がある場合は例外をキャッチし、新しいピンで数回再試行します。

これを達成する方法の詳細については、この記事をご覧ください

他のケースでは、そのロジックをシーケンスに適用する mongoDB に格納されている JavaScript 関数を使用できます。この記事を見てください。現在、推奨されていないというメッセージが表示されていますが (そのメッセージは新しいものです...)、より多くのアイデアが得られる可能性があります。

お役に立てれば

于 2013-06-26T14:03:43.473 に答える
0

私が見つけようとしたよりもはるかに簡単な解決策で目標を達成しました。各代理店レコードで、 という文字列フィールドを作成しましたinvoice_format。このフィールドには、請求書番号を生成するために解析するフォーマット文字列を保存します。例えば:

invoice_format: "A-{YY}{seq-04.d}"

これを解析すると、{} の内側はすべてフォーマット ルールと見なされ、{} の外側はすべてリテラル テキストと見なされます。各書式設定ルールを検索し、ルールに基づいて値を返すそれほど魅力的ではないスイッチがあります。やるべきことはまだありますが、これがシーケンス ジェネレーターの基礎となります。各顧客のシーケンスは、invoice_sequence と呼ばれる個別のフィールドに保持されます。フィールドで {seq} に遭遇すると、このフィールドをインクリメントして結果を返します。

于 2013-06-27T15:34:05.860 に答える