gpt4 book ai didi

python - Django:如何构建食堂菜单预订系统以避免同现预订?

转载 作者:行者123 更新时间:2023-12-01 07:52:37 25 4
gpt4 key购买 nike

所以基本上我正在参与为食堂创建自助服务终端应用程序的项目。

总的来说,这是我想要的自助服务终端应用程序的流程:

  1. 用户选择食物/饮料。
  2. 用户输入他的 table 号。
  3. 自助服务终端会检查用户的食品/饮料库存。如果可用,则继续,否则取消。
  4. 自助服务终端预订商品,以防止其他自助服务终端应用程序订购该商品,因为商品数量有限(例如只有 50 个单位)。预订将在某个时间到期。 (例如,用户忘记携带借记卡,因此他将离开自助服务终端)。
  5. 用户付款。
  6. 自助服务终端将订单发布到网络服务器。付款成功之前订单不会发布到网络服务器(有可能会失败)。
  7. 订单已完成。自助服务终端打印收据。

这是我当前的模型:

菜单项

class Menu(models.Model):
image = models.ImageField(upload_to=path_and_rename)
name = models.CharField(max_length=100)
price = models.IntegerField()
category = models.IntegerField() //Food or Drink
availability = models.BooleanField(default=False)
qty = models.IntegerField(default=100) //It will reach 0 when sold out.
sellerID = models.ForeignKey(Seller, on_delete=models.PROTECT)

订单

class Order(models.Model):
cardID = models.IntegerField()
amount = models.IntegerField()
time = models.DateTimeField(auto_now_add=True)

订单详情

class OrderDetail(models.Model):
orderID = models.ForeignKey(Order, on_delete=models.PROTECT)
menuID = models.ForeignKey(Menu, on_delete=models.PROTECT)
price = models.IntegerField()
qty = models.IntegerField()
tableNumber = models.IntegerField()
done = models.BooleanField(default=False)
finishTime = models.DateTimeField(null=True, blank=True)
sellerID = models.ForeignKey(Seller, on_delete=models.PROTECT)

完整的网络服务器代码位于我的 github:here.

为什么我需要预订系统?因为在付款之前,用户必须确定自己会收到订单(不是缺货)。食堂里,有不止一台自助终端机。不要让某人的食物/饮料库存被另一台机器上的另一个人拿走。

因此,我不知道构建 Booking 部分。我不知道如何使预订在某个时间到期。如果没有,是否有其他方法可以防止我在上一段中提到的问题?

我认为它类似于机票预订系统。例如,只剩下一张票了。约翰预订了该航类,然后约翰将有一定的时间来付款。当约翰付款后,约翰就会收到票。但是当有另一个人时,我们就说亚历克斯。亚历克斯尝试预订该航类,但由于该航类已被约翰预订,因此亚历克斯无法预订。 (在亚历克斯的屏幕上,该票已售出)。

最佳答案

您可以通过在创建并订购包含该项目后将菜单项的“可用性” bool 字段设置为 false 来解决此问题(或者为此添加一个新的 bool 字段,例如“保留”)。例如,工作流程是:

  • 创建订单;
  • 将商品可用性设置为 false;
  • 运行一个单独的线程来监视订单是否已完成;
  • 完成订单(或不完成);
  • 当预订线程时间到期且订单尚未完成时,将菜单项的可用性值设置为 true,以便可以再次订购;

示例views.py:

import threading
import time

def order_check(order_detail):
time.sleep(1000) # waiting time before checking the order;
if not order_detail.done:
order_detail.menu.availability = True
order_detail.menu.save()

def reserve_order_view(request, order_detail_pk):
order_detail = OrderDetail.objects.get(pk=order_detail_pk)
order_detail.menu.availability = False
order_detail.menu.save()
process_order_thread = threading.Thread(target=order_check, args=(order_detail, ))
process_order_thread.start() # start your monitoring thread and continue;

def complete_order_view(request, order_detail_pk):
order_detail = OrderDetail.objects.get(pk=order_detail_pk)
order_detail.done = True
order_detail.save()
# ... etc...

编辑:根据数量预订

在这种情况下,您可以根据菜单项的数量来预订菜单项,并在方法上稍加调整:

def order_check(order_detail, item_qty_ordered):
time.sleep(1000) # waiting time before checking the order;
if not order_detail.done:
order_detail.menu.qty += item_qty_ordered # the order wasn't completed, so add back the menu item quantity;
order_detail.menu.save()

def reserve_order_view(request, order_detail_pk, item_qty_ordered=1):
order_detail = OrderDetail.objects.get(pk=order_detail_pk)
order_detail.menu.qty -= item_qty_ordered # the user is ordering some quantity of the menu item;
order_detail.menu.save()
process_order_thread = threading.Thread(target=order_check, kwargs={'order_detail_pk': order_detail_pk, 'item_qty_ordered': item_qty_ordered})
process_order_thread.start() # start your monitoring thread and continue;

这只是为了说明工作流程。在您的方法中,您还应该检查并阻止不可用的菜单项的订单 (qty=0)。

关于python - Django:如何构建食堂菜单预订系统以避免同现预订?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56128229/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com