dict_data.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. """字典数据 CRUD(sys_dict_data)"""
  2. from __future__ import annotations
  3. import math
  4. from datetime import datetime
  5. from typing import Any, Dict, List, Optional, Tuple
  6. from sqlalchemy import and_, func, or_
  7. from sqlalchemy.orm import Session
  8. from app.core.utils import generate_uuid
  9. from app.models.models import SysDictData
  10. def _row_to_dict(d: SysDictData) -> Dict[str, Any]:
  11. return {
  12. "id": d.id,
  13. "dictLabel": d.dict_label,
  14. "dictValue": d.dict_value,
  15. "tagType": d.tag_type or "",
  16. "dictType": d.dict_type,
  17. "tenantNo": d.tenant_no,
  18. "orderNum": d.order_num if d.order_num is not None else 0,
  19. "remark": d.remark or "",
  20. "createTime": d.create_time.strftime("%Y-%m-%d %H:%M:%S") if d.create_time else "",
  21. "updateTime": d.update_time.strftime("%Y-%m-%d %H:%M:%S") if d.update_time else "",
  22. }
  23. def list_dict_data(
  24. db: Session,
  25. *,
  26. page: int = 1,
  27. page_size: int = 10,
  28. dict_type_code: Optional[str] = None,
  29. keyword: Optional[str] = None,
  30. tenant_no: Optional[str] = None,
  31. user_info=None,
  32. ) -> Tuple[List[Dict[str, Any]], int]:
  33. def _filtered():
  34. q0 = db.query(SysDictData).filter(SysDictData.del_flag == 0)
  35. if tenant_no:
  36. q0 = q0.filter(SysDictData.tenant_no == tenant_no)
  37. if dict_type_code:
  38. q0 = q0.filter(SysDictData.dict_type == dict_type_code)
  39. kw = (keyword or "").strip()
  40. if kw:
  41. like = f"%{kw}%"
  42. q0 = q0.filter(SysDictData.dict_label.like(like))
  43. if user_info:
  44. from app.core.data_scope import apply_data_scope
  45. q0 = apply_data_scope(q0, SysDictData, user_info, db, tenant_no)
  46. return q0
  47. total = _filtered().order_by(None).with_entities(func.count(SysDictData.id)).scalar() or 0
  48. page = max(1, page)
  49. page_size = min(max(1, page_size), 100)
  50. rows = (
  51. _filtered()
  52. .order_by(SysDictData.create_time.desc())
  53. .offset((page - 1) * page_size)
  54. .limit(page_size)
  55. .all()
  56. )
  57. return [_row_to_dict(x) for x in rows], int(total)
  58. def get_dict_data(db: Session, data_id: str) -> Optional[SysDictData]:
  59. return (
  60. db.query(SysDictData)
  61. .filter(and_(SysDictData.id == data_id, SysDictData.del_flag == 0))
  62. .first()
  63. )
  64. def create_dict_data(
  65. db: Session,
  66. *,
  67. dict_label: str,
  68. dict_value: str,
  69. dict_type: str,
  70. tenant_no: str,
  71. order_num: Optional[int] = None,
  72. remark: Optional[str] = None,
  73. user_id: Optional[str] = None,
  74. tag_type: Optional[str] = None,
  75. ) -> SysDictData:
  76. obj = SysDictData(
  77. id=generate_uuid(),
  78. dict_label=(dict_label or "").strip(),
  79. dict_value=(dict_value or "").strip(),
  80. dict_type=(dict_type or "").strip(),
  81. tag_type=(tag_type or "").strip(),
  82. tenant_no=tenant_no,
  83. order_num=order_num if order_num is not None else 0,
  84. remark=(remark or "").strip() or None,
  85. create_by=user_id,
  86. create_dept_id="",
  87. create_time=datetime.now(),
  88. update_by=user_id,
  89. update_time=datetime.now(),
  90. del_flag=0,
  91. )
  92. db.add(obj)
  93. db.commit()
  94. db.refresh(obj)
  95. return obj
  96. def update_dict_data(
  97. db: Session,
  98. data_id: str,
  99. *,
  100. dict_label: Optional[str] = None,
  101. dict_value: Optional[str] = None,
  102. order_num: Optional[int] = None,
  103. remark: Optional[str] = None,
  104. user_id: Optional[str] = None,
  105. tag_type: Optional[str] = None,
  106. ) -> SysDictData:
  107. obj = get_dict_data(db, data_id)
  108. if not obj:
  109. raise ValueError("字典数据不存在")
  110. if dict_label is not None:
  111. obj.dict_label = (dict_label or "").strip()
  112. if dict_value is not None:
  113. obj.dict_value = (dict_value or "").strip()
  114. if tag_type is not None:
  115. obj.tag_type = (tag_type or "").strip()
  116. if order_num is not None:
  117. obj.order_num = order_num
  118. if remark is not None:
  119. obj.remark = (remark or "").strip() or None
  120. obj.update_by = user_id
  121. obj.update_time = datetime.now()
  122. db.add(obj)
  123. db.commit()
  124. db.refresh(obj)
  125. return obj
  126. def soft_delete_dict_data(db: Session, data_id: str) -> None:
  127. obj = get_dict_data(db, data_id)
  128. if not obj:
  129. raise ValueError("字典数据不存在")
  130. obj.del_flag = 1
  131. obj.update_time = datetime.now()
  132. db.add(obj)
  133. db.commit()
  134. def list_dict_data_options(
  135. db: Session, *, dict_type_code: str, tenant_no: Optional[str] = None
  136. ) -> List[Dict[str, str]]:
  137. q = db.query(SysDictData).filter(
  138. and_(SysDictData.dict_type == dict_type_code, SysDictData.del_flag == 0)
  139. )
  140. if tenant_no:
  141. q = q.filter(SysDictData.tenant_no == tenant_no)
  142. rows = q.order_by(SysDictData.create_time.desc()).all()
  143. return [{"label": r.dict_label, "value": r.dict_value, "tagType": r.tag_type or ""} for r in rows]
  144. def total_pages(total: int, page_size: int) -> int:
  145. if total <= 0:
  146. return 0
  147. return int(math.ceil(total / float(page_size)))