order_processing.py 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. import db
  2. import slicer_utils
  3. import preview_utils
  4. import config
  5. import os
  6. from typing import List
  7. def process_order_slicing(order_id: int):
  8. """
  9. Background task to compute accurate print time and filament usage for all files in an order.
  10. """
  11. files = db.execute_query("SELECT id, file_path FROM order_files WHERE order_id = %s", (order_id,))
  12. if not files:
  13. return
  14. for f in files:
  15. file_path = f['file_path']
  16. if not os.path.exists(file_path):
  17. continue
  18. file_ext = os.path.splitext(file_path)[1].lower()
  19. if file_ext == '.stl':
  20. result = slicer_utils.slice_model(file_path)
  21. if result and result.get('success'):
  22. db.execute_commit(
  23. "UPDATE order_files SET print_time = %s, filament_g = %s WHERE id = %s",
  24. (result.get('print_time_str'), result.get('filament_g'), f['id'])
  25. )
  26. def process_single_file_async(file_id: int):
  27. """
  28. Background task to generate preview and slice a single file.
  29. (Updated to force module reload)
  30. """
  31. f = db.execute_query("SELECT id, order_id, file_path, filename FROM order_files WHERE id = %s", (file_id,))
  32. if not f:
  33. return
  34. f = f[0]
  35. file_path = os.path.join(config.BASE_DIR, f['file_path'])
  36. if not os.path.exists(file_path):
  37. return
  38. file_ext = os.path.splitext(file_path)[1].lower()
  39. if file_ext == '.stl':
  40. # 1. Generate Preview
  41. import uuid
  42. preview_filename = f"{uuid.uuid4()}.png"
  43. preview_path = os.path.join(config.PREVIEW_DIR, preview_filename)
  44. db_preview_path = f"uploads/previews/{preview_filename}"
  45. if preview_utils.generate_stl_preview(file_path, preview_path):
  46. db.execute_commit("UPDATE order_files SET preview_path = %s WHERE id = %s", (db_preview_path, file_id))
  47. # 2. Slice for print data
  48. result = slicer_utils.slice_model(file_path)
  49. if result and result.get('success'):
  50. db.execute_commit(
  51. "UPDATE order_files SET print_time = %s, filament_g = %s WHERE id = %s",
  52. (result.get('print_time_str'), result.get('filament_g'), file_id)
  53. )
  54. # Notify user/admin via WS if possible?
  55. # (Optional: global_manager.notify_order_update could be called here)