我想每两周创建一张发票。发票可以包含1到15和16到31 order_date
之间的1个或多个订单。这样做的方式是什么?
假设表格设计为:
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,状态= 1),然后添加到发票表中,然后更新订单.invoice_id
如果今天日期是2010年6月11日,那么它将在发票表中插入一行,invoice_date将在2010年6月1日.PHP将在添加行之前检查invoice_date,如果它已经存在则会更新order.invoice_id代替。
第二个解决方案:
从后端手动将order.status更改为1,然后它将执行与“First Solution”类似的功能(除了Cron Job)
伪代码:
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)
哪个会更好,还是有其他更好的解决方案?
答案 0 :(得分:2)
我真的很喜欢cron的日程安排。它做了一件事,它做得很好。
计划任务非常理想的另一个设计方面是idempotent,这意味着您可以再次运行它而不会造成任何损害。
在您的情况下,这意味着您的更新/插入必须处理已经运行了一段时间。你想要这个的原因首先是防御(如果它意外重新运行)和健壮(如果你需要重新运行它)