schema.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. from fastapi import Query
  2. from pydantic import BaseModel, ConfigDict, Field, field_validator
  3. from app.common.enums import QueueEnum
  4. from app.core.base_schema import BaseSchema
  5. from app.core.validator import DateTimeStr, validate_required_code
  6. class DeptCreateSchema(BaseModel):
  7. """部门创建模型"""
  8. name: str = Field(..., max_length=64, description="部门名称")
  9. order: int = Field(default=1, ge=0, description="显示顺序")
  10. code: str = Field(..., max_length=16, description="部门编码")
  11. leader: str | None = Field(default=None, max_length=32, description="部门负责人")
  12. phone: str | None = Field(default=None, max_length=11, description="手机")
  13. email: str | None = Field(default=None, max_length=64, description="邮箱")
  14. parent_id: int | None = Field(default=None, ge=0, description="父部门ID")
  15. status: str = Field(default="0", description="是否启用(0:启用 1:禁用)")
  16. description: str | None = Field(default=None, max_length=255, description="备注说明")
  17. @field_validator("name")
  18. @classmethod
  19. def validate_name(cls, value: str):
  20. """
  21. 校验并规范化部门名称(去空格、非空)。
  22. 参数:
  23. - value (str): 部门名称。
  24. 返回:
  25. - str: 规范化后的部门名称。
  26. 异常:
  27. - ValueError: 部门名称为空时抛出。
  28. """
  29. if not value or len(value.strip()) == 0:
  30. raise ValueError("部门名称不能为空")
  31. value = value.replace(" ", "")
  32. return value
  33. @field_validator("code")
  34. @classmethod
  35. def validate_code(cls, value: str):
  36. """
  37. 校验部门编码(与角色编码规则一致,见 `validate_required_code`)。
  38. 参数:
  39. - value (str): 部门编码。
  40. 返回:
  41. - str: 规范化后的部门编码。
  42. 异常:
  43. - ValueError: 编码不满足格式要求时抛出。
  44. """
  45. return validate_required_code(value)
  46. class DeptUpdateSchema(DeptCreateSchema):
  47. """部门更新模型"""
  48. class DeptOutSchema(DeptCreateSchema, BaseSchema):
  49. """部门响应模型"""
  50. model_config = ConfigDict(from_attributes=True)
  51. parent_name: str | None = Field(default=None, max_length=64, description="父部门名称")
  52. class DeptQueryParam:
  53. """部门管理查询参数"""
  54. def __init__(
  55. self,
  56. name: str | None = Query(None, description="部门名称"),
  57. status: str | None = Query(None, description="部门状态(True正常 False停用)"),
  58. created_time: list[DateTimeStr] | None = Query(
  59. None,
  60. description="创建时间范围",
  61. examples=["2025-01-01 00:00:00", "2025-12-31 23:59:59"],
  62. ),
  63. updated_time: list[DateTimeStr] | None = Query(
  64. None,
  65. description="更新时间范围",
  66. examples=["2025-01-01 00:00:00", "2025-12-31 23:59:59"],
  67. ),
  68. ) -> None:
  69. # 模糊查询字段
  70. self.name = (QueueEnum.like.value, name)
  71. # 精确查询字段
  72. self.status = (QueueEnum.eq.value, status)
  73. # 时间范围查询
  74. if created_time and len(created_time) == 2:
  75. self.created_time = (QueueEnum.between.value, (created_time[0], created_time[1]))
  76. if updated_time and len(updated_time) == 2:
  77. self.updated_time = (QueueEnum.between.value, (updated_time[0], updated_time[1]))