0

2週間ごとの請求書を作成したい。請求書には、 1 ~ 15 と 16 ~ 31 の間の 1 つ以上の注文を含めることができますorder_date。それを行う方法は何ですか?

テーブルの設計が次のとおりであるとします。

order table
- order_id (PK)
- user_id (FK)
- total
- status
- order_date
- invoice_id (FK, default is 0)

invoice table
- invoice_id (PK)
- invoice_date
- total (total of all orders that is linked to order.invoice_id)
- status (Paid, Unpaid, etc)

//order.invoice_id can have multiple same invoice id

最初の解決策:

2 週間ごとに Crob Job を介して実行します。注文テーブルをスキャンし (1 ~ 15 または 16 ~ 31 の order_date と status = 1 を検索)、invoice テーブルに追加して、order.invoice_id を更新します。

今日の日付が 2010 年 6 月 11 日である場合、invoice テーブルに行が挿入され、invoice_date は 2010 年 6 月 1 日になります。

2 番目の解決策:

order.status をバックエンドから手動で 1 に変更すると、「最初のソリューション」と同様の機能が実行されます (Cron ジョブを除く)。

擬似コード:

NowDate = Date();

//Invoice Date can be 01 or 16 date current month
InvoiceDate = InvoiceDate(NowDate)

if (there is invoice for InvoiceDate) {
  invoiceNumber = getNumber(invoice)
} else {
  invoiceNumber = new Invoice(InvoiceDate)
}
new Order(invoiceNumber, orderitems)

どちらが良いですか、それとも他のより良い解決策がありますか?

4

1 に答える 1

2

スケジューリングにはcronが本当に好きです。それは1つのことを行い、それをうまく行います。

スケジュールされたタスクに非常に望ましいもう 1 つの設計上の側面は、冪等であることです。これは、ダメージを与えずに再実行できることを意味します。

あなたの場合、これは、更新/挿入がその期間すでに実行されていることを処理する必要があることを意味します。これが必要な理由は、まず防御的(誤って再実行された場合)と堅牢(再実行する必要がある場合)です。

于 2011-06-11T12:28:25.683 に答える