#php #database #e-commerce #shopping-cart #billing
#php #База данных #электронная коммерция #корзина покупок #выставление счетов
Вопрос:
Я хочу создавать счет-фактуру каждые 2 недели. Счет-фактура может содержать 1 или более заказов в диапазоне от 1 до 15 и от 16 до 31 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
Первое Решение:
Запускайте задание через Crob каждые 2 недели. Он сканирует таблицу заказов (находит order_date от 1 до 15 или от 16 до 31 и status = 1), а затем добавляет в таблицу invoice, а затем обновляет order.invoice_id
Если сегодняшняя дата — 11 июня 2010 года, то в таблицу счетов-фактур будет вставлена строка, а invoice_date будет 01 июня 2010 года. PHP проверит invoice_date перед добавлением строки, если она уже существует, то вместо этого он обновит order.invoice_id.
Второе решение:
Измените 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)
Что будет лучше или у вас есть другое лучшее решение?
Ответ №1:
Мне действительно нравится cron для планирования. Он выполняет одну вещь, и делает это хорошо.
Другой аспект дизайна, который очень желателен для запланированных задач, — быть идемпотентным, что означает, что вы можете запустить его снова без нанесения какого-либо ущерба.
В вашем случае это означает, что ваши обновления / вставки должны обрабатывать то, что они уже были запущены за указанный период времени. Причина, по которой вы хотите это, в первую очередь, защитная (на случай случайного повторного запуска) и надежная (на случай, если вам понадобится его повторно запустить)
Комментарии:
1. Я не понял вашего последнего предложения, не могли бы вы привести пример того, что вы имели в виду? Допустим, я получил несколько заказов в апреле, и сервер не будет работать в течение месяца. Сервер запущен в мае.. Это означает, что я получил недостающие счета в апреле. Чтобы снова запустить cron job для запуска PHP-скрипта — он должен проверять все месяцы, а не текущий месяц?
2. Если сервер вышел из строя, cron не будет запускаться.
3. @hakre — Я знаю, прочитай мой пост еще раз. «Допустим, я получил несколько заказов в апреле, и сервер не будет работать в течение месяца. Сервер запущен в мае ..»
4. Затем вам нужно позаботиться о запуске тех заданий, которые не были запущены cron. Но разве это не очевидно?
5. Действительно, очевидно 😉 Если я повторно запущу скрипт, он должен отсканировать все заказы, а не текущий месяц даты заказа.. это будет медленно? Как бы вы это сделали ..? Разве второе решение, которое я опубликовал, не лучше первого?