category_parameter.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. """CRUD - 分类参数关联"""
  2. from typing import List
  3. from sqlalchemy.orm import Session
  4. from sqlalchemy import and_
  5. from app.crud.base import CRUDBase, HistoryCRUD
  6. from app.models.category_parameter import BasCategoryParameter, BasCategoryParameterHis
  7. from app.schemas.category_parameter import CategoryParameterBase
  8. class CategoryParameterCRUD(CRUDBase[BasCategoryParameter]):
  9. """分类参数关联CRUD操作"""
  10. def get_by_category(self, db: Session, category_id: str) -> List[BasCategoryParameter]:
  11. """获取分类的所有关联参数"""
  12. return db.query(self.model).filter(
  13. self.model.category_id == category_id,
  14. self.model.is_del == 0
  15. ).order_by(self.model.sort_order.asc()).all()
  16. def get_by_category_with_detail(self, db: Session, category_id: str) -> List[dict]:
  17. """获取分类的所有关联参数(带参数详情)"""
  18. from app.models.product_parameter import BasProductParameter
  19. results = db.query(
  20. BasCategoryParameter,
  21. BasProductParameter
  22. ).join(
  23. BasProductParameter,
  24. and_(
  25. BasCategoryParameter.parameter_id == BasProductParameter.id,
  26. BasProductParameter.is_del == 0
  27. )
  28. ).filter(
  29. BasCategoryParameter.category_id == category_id,
  30. BasCategoryParameter.is_del == 0
  31. ).order_by(
  32. BasCategoryParameter.sort_order.asc()
  33. ).all()
  34. return [
  35. {
  36. "id": cp.id,
  37. "parameterId": cp.parameter_id,
  38. "parameterName": pp.name,
  39. "parameterCode": pp.code,
  40. "paramType": pp.param_type,
  41. "options": pp.options,
  42. "placeholder": pp.placeholder,
  43. "isRequired": cp.is_required,
  44. "defaultValue": cp.default_value,
  45. "sortOrder": cp.sort_order,
  46. }
  47. for cp, pp in results
  48. ]
  49. def batch_save(
  50. self,
  51. db: Session,
  52. category_id: str,
  53. items: List[dict],
  54. creator: dict = None
  55. ) -> List[BasCategoryParameter]:
  56. """批量保存分类参数关联"""
  57. # 先获取要删除的记录ID
  58. old_records = db.query(self.model).filter(
  59. self.model.category_id == category_id,
  60. self.model.is_del == 0
  61. ).all()
  62. # 物理删除旧记录(释放唯一索引约束)
  63. for record in old_records:
  64. db.delete(record)
  65. db.commit()
  66. # 创建新的关联
  67. saved_items = []
  68. for idx, item in enumerate(items):
  69. item_data = {
  70. "category_id": category_id,
  71. "parameter_id": item.get("parameter_id"),
  72. "is_required": item.get("is_required", 0),
  73. "default_value": item.get("default_value"),
  74. "sort_order": item.get("sort_order", idx),
  75. }
  76. cp = self.create(db, item_data, creator)
  77. saved_items.append(cp)
  78. db.commit()
  79. return saved_items
  80. def delete_by_category(self, db: Session, category_id: str) -> int:
  81. """删除分类的所有关联"""
  82. count = db.query(self.model).filter(
  83. self.model.category_id == category_id,
  84. self.model.is_del == 0
  85. ).update({"is_del": 1})
  86. db.commit()
  87. return count
  88. def exists_link(self, db: Session, category_id: str, parameter_id: str) -> bool:
  89. """检查是否已有关联"""
  90. return db.query(self.model).filter(
  91. self.model.category_id == category_id,
  92. self.model.parameter_id == parameter_id,
  93. self.model.is_del == 0
  94. ).first() is not None
  95. class CategoryParameterHisCRUD(HistoryCRUD[BasCategoryParameterHis]):
  96. """分类参数关联历史CRUD操作"""
  97. pass
  98. category_parameter = CategoryParameterCRUD(BasCategoryParameter)
  99. category_parameter_his = CategoryParameterHisCRUD(BasCategoryParameterHis)