item_service.py 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. """Item service for business logic operations."""
  2. from app import db
  3. from app.models.item import Item
  4. from app.utils.validators import is_valid_name, is_positive_number
  5. class ItemService:
  6. """Service class for Item CRUD operations."""
  7. @staticmethod
  8. def create(name, unit_price):
  9. """Create a new item.
  10. Args:
  11. name: Item's name
  12. unit_price: Price per unit
  13. Returns:
  14. Tuple of (item_dict, error_message)
  15. On success: (item_dict, None)
  16. On failure: (None, error_message)
  17. """
  18. if not is_valid_name(name):
  19. return None, "物品名称不能为空"
  20. if not is_positive_number(unit_price):
  21. return None, "单价必须为正数"
  22. item = Item(name=name.strip(), unit_price=float(unit_price))
  23. db.session.add(item)
  24. db.session.commit()
  25. return item.to_dict(), None
  26. @staticmethod
  27. def get_all():
  28. """Get all items.
  29. Returns:
  30. List of item dictionaries
  31. """
  32. items = Item.query.order_by(Item.id).all()
  33. return [i.to_dict() for i in items]
  34. @staticmethod
  35. def get_by_id(item_id):
  36. """Get an item by ID.
  37. Args:
  38. item_id: Item's ID
  39. Returns:
  40. Tuple of (item_dict, error_message)
  41. On success: (item_dict, None)
  42. On failure: (None, error_message)
  43. """
  44. item = db.session.get(Item, item_id)
  45. if not item:
  46. return None, f"未找到ID为 {item_id} 的物品"
  47. return item.to_dict(), None
  48. @staticmethod
  49. def update(item_id, name=None, unit_price=None):
  50. """Update an item's name and/or unit_price.
  51. Args:
  52. item_id: Item's ID
  53. name: New name (optional)
  54. unit_price: New unit price (optional)
  55. Returns:
  56. Tuple of (item_dict, error_message)
  57. On success: (item_dict, None)
  58. On failure: (None, error_message)
  59. """
  60. item = db.session.get(Item, item_id)
  61. if not item:
  62. return None, f"未找到ID为 {item_id} 的物品"
  63. if name is not None:
  64. if not is_valid_name(name):
  65. return None, "物品名称不能为空"
  66. item.name = name.strip()
  67. if unit_price is not None:
  68. if not is_positive_number(unit_price):
  69. return None, "单价必须为正数"
  70. item.unit_price = float(unit_price)
  71. db.session.commit()
  72. return item.to_dict(), None
  73. @staticmethod
  74. def delete(item_id):
  75. """Delete an item.
  76. Args:
  77. item_id: Item's ID
  78. Returns:
  79. Tuple of (success, error_message)
  80. On success: (True, None)
  81. On failure: (False, error_message)
  82. """
  83. item = db.session.get(Item, item_id)
  84. if not item:
  85. return False, f"未找到ID为 {item_id} 的物品"
  86. # Check if item has associated work records
  87. if item.work_records.count() > 0:
  88. return False, "无法删除已有工作记录的物品"
  89. db.session.delete(item)
  90. db.session.commit()
  91. return True, None