orders.py 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. from math import log
  2. import time
  3. from fastapi import HTTPException
  4. from fastapi.responses import JSONResponse
  5. from fudo import fudo
  6. from models.schemas import OrderWeb
  7. from services.fudo_service import add_product_to_fudo
  8. from services.email_service import send_email
  9. from services.logging_service import log_order
  10. from impresora.printer import PrinterUSB
  11. from impresora.order import Order, Item
  12. from logging import getLogger
  13. from threading import Thread
  14. logger = getLogger(__name__)
  15. printer_orders = []
  16. async def printer_order(order: OrderWeb):
  17. """Process printer order"""
  18. logger.info("Printer order received")
  19. logger.info(order)
  20. if not PrinterUSB.check_usb_port(0xfe6, 0x811e):
  21. logger.error("Printer is not connected.")
  22. email_thread = Thread(
  23. target=send_email, daemon=True)
  24. email_thread.start()
  25. logger.error("Email sent to admin about printer issue.")
  26. return JSONResponse(status_code=424, content={"message": "Printer is not connected."})
  27. items = order.items
  28. table = order.table
  29. if not items or not table:
  30. return JSONResponse(status_code=400, content={"message": "Items and table are required."})
  31. if not isinstance(table, int):
  32. return JSONResponse(status_code=400, content={"message": "Table must be an integer."})
  33. # Add products to Fudo
  34. product_errors = []
  35. for item in items:
  36. fudo.get_token()
  37. # product = add_product_to_fudo(item.id, item.quantity, table)
  38. # if not product:
  39. # product_errors.append(f"Error adding product {item.id} to table {table}.")
  40. if product_errors:
  41. return JSONResponse(
  42. status_code=424,
  43. content={"message": "Error adding products to table.", "errors": product_errors}
  44. )
  45. # Print order
  46. printer_orders.append(Order(
  47. order.customerName,
  48. [Item(item.name, item.price, item.quantity) for item in items]
  49. ))
  50. # Log order
  51. log_order(order, items)
  52. return JSONResponse({"message": "Order processed successfully"})
  53. def order_thread():
  54. """Thread to process orders"""
  55. logger.info("Starting order thread")
  56. while True:
  57. if printer_orders:
  58. order = printer_orders.pop(0)
  59. logger.info(f"Processing order: {order}")
  60. try:
  61. printer = PrinterUSB(0xfe6, 0x811e)
  62. if not printer.is_connected():
  63. logger.error("Printer is not connected.")
  64. continue
  65. # printer.print_order(order)
  66. logger.info(f"Order printed: {order}")
  67. except Exception as e:
  68. logger.error(f"Error printing order: {e}")
  69. time.sleep(1) # Sleep to avoid busy waiting