作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以基本上我正在参与为食堂创建自助服务终端应用程序的项目。
总的来说,这是我想要的自助服务终端应用程序的流程:
这是我当前的模型:
菜单项
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 字段,例如“保留”)。例如,工作流程是:
示例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/
我是一名优秀的程序员,十分优秀!