site.py 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. """站点 CRUD(sys_site)"""
  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 SysSite
  10. def _row_to_dict(s: SysSite) -> Dict[str, Any]:
  11. return {
  12. "id": s.id,
  13. "siteName": s.site_name,
  14. "siteCode": s.site_code,
  15. "siteType": s.site_type or "",
  16. "status": s.status,
  17. "address": s.address or "",
  18. "contactName": s.contact_name or "",
  19. "contactPhone": s.contact_phone or "",
  20. "businessScope": s.business_scope or "",
  21. "siteImage": s.site_image or "",
  22. "tenantNo": s.tenant_no,
  23. "orderNum": s.order_num if s.order_num is not None else 0,
  24. "remark": s.remark or "",
  25. "createTime": s.create_time.strftime("%Y-%m-%d %H:%M:%S") if s.create_time else "",
  26. "updateTime": s.update_time.strftime("%Y-%m-%d %H:%M:%S") if s.update_time else "",
  27. }
  28. def list_sites(
  29. db: Session,
  30. *,
  31. page: int = 1,
  32. page_size: int = 10,
  33. keyword: Optional[str] = None,
  34. tenant_no: Optional[str] = None,
  35. user_info=None,
  36. ) -> Tuple[List[Dict[str, Any]], int]:
  37. def _filtered():
  38. q0 = db.query(SysSite).filter(SysSite.del_flag == 0)
  39. if tenant_no:
  40. q0 = q0.filter(SysSite.tenant_no == tenant_no)
  41. kw = (keyword or "").strip()
  42. if kw:
  43. like = f"%{kw}%"
  44. q0 = q0.filter(or_(SysSite.site_name.like(like), SysSite.site_code.like(like)))
  45. if user_info:
  46. from app.core.data_scope import apply_data_scope
  47. q0 = apply_data_scope(q0, SysSite, user_info, db, tenant_no)
  48. return q0
  49. total = _filtered().order_by(None).with_entities(func.count(SysSite.id)).scalar() or 0
  50. page = max(1, page)
  51. page_size = min(max(1, page_size), 100)
  52. rows = (
  53. _filtered()
  54. .order_by(SysSite.create_time.desc())
  55. .offset((page - 1) * page_size)
  56. .limit(page_size)
  57. .all()
  58. )
  59. return [_row_to_dict(x) for x in rows], int(total)
  60. def get_site(db: Session, site_id: str) -> Optional[SysSite]:
  61. return (
  62. db.query(SysSite)
  63. .filter(and_(SysSite.id == site_id, SysSite.del_flag == 0))
  64. .first()
  65. )
  66. def site_code_exists(db: Session, code: str, tenant_no: str, exclude_id: Optional[str] = None) -> bool:
  67. q = db.query(SysSite).filter(and_(SysSite.site_code == code.strip(), SysSite.tenant_no == tenant_no, SysSite.del_flag == 0))
  68. if exclude_id:
  69. q = q.filter(SysSite.id != exclude_id)
  70. return q.first() is not None
  71. def create_site(
  72. db: Session,
  73. *,
  74. site_name: str,
  75. site_code: str,
  76. site_type: Optional[str] = None,
  77. status: str = "1",
  78. address: Optional[str] = None,
  79. contact_name: Optional[str] = None,
  80. contact_phone: Optional[str] = None,
  81. business_scope: Optional[str] = None,
  82. site_image: Optional[str] = None,
  83. tenant_no: str = "zkxw",
  84. order_num: Optional[int] = None,
  85. remark: Optional[str] = None,
  86. user_id: Optional[str] = None,
  87. ) -> SysSite:
  88. sc = (site_code or "").strip()
  89. if not sc:
  90. raise ValueError("站点编码不能为空")
  91. if site_code_exists(db, sc, tenant_no):
  92. raise ValueError("站点编码已存在")
  93. obj = SysSite(
  94. id=generate_uuid(),
  95. site_name=(site_name or "").strip() or sc,
  96. site_code=sc,
  97. site_type=(site_type or "").strip() or None,
  98. status=status or "1",
  99. address=(address or "").strip() or None,
  100. contact_name=(contact_name or "").strip() or None,
  101. contact_phone=(contact_phone or "").strip() or None,
  102. business_scope=(business_scope or "").strip() or None,
  103. site_image=(site_image or "").strip() or None,
  104. tenant_no=tenant_no,
  105. order_num=order_num if order_num is not None else 0,
  106. remark=(remark or "").strip() or None,
  107. create_by=user_id,
  108. create_dept_id="",
  109. create_time=datetime.now(),
  110. update_by=user_id,
  111. update_time=datetime.now(),
  112. del_flag=0,
  113. )
  114. db.add(obj)
  115. db.commit()
  116. db.refresh(obj)
  117. return obj
  118. def update_site(
  119. db: Session,
  120. site_id: str,
  121. *,
  122. site_name: Optional[str] = None,
  123. site_code: Optional[str] = None,
  124. site_type: Optional[str] = None,
  125. status: Optional[str] = None,
  126. address: Optional[str] = None,
  127. contact_name: Optional[str] = None,
  128. contact_phone: Optional[str] = None,
  129. business_scope: Optional[str] = None,
  130. site_image: Optional[str] = None,
  131. order_num: Optional[int] = None,
  132. remark: Optional[str] = None,
  133. user_id: Optional[str] = None,
  134. ) -> SysSite:
  135. obj = get_site(db, site_id)
  136. if not obj:
  137. raise ValueError("站点不存在")
  138. if site_code is not None:
  139. new_code = site_code.strip()
  140. if not new_code:
  141. raise ValueError("站点编码不能为空")
  142. if new_code != obj.site_code and site_code_exists(db, new_code, obj.tenant_no, exclude_id=site_id):
  143. raise ValueError("站点编码已存在")
  144. obj.site_code = new_code
  145. if site_name is not None:
  146. obj.site_name = (site_name or "").strip() or obj.site_name
  147. if site_type is not None:
  148. obj.site_type = (site_type or "").strip() or None
  149. if status is not None:
  150. obj.status = status
  151. if address is not None:
  152. obj.address = (address or "").strip() or None
  153. if contact_name is not None:
  154. obj.contact_name = (contact_name or "").strip() or None
  155. if contact_phone is not None:
  156. obj.contact_phone = (contact_phone or "").strip() or None
  157. if business_scope is not None:
  158. obj.business_scope = (business_scope or "").strip() or None
  159. if site_image is not None:
  160. obj.site_image = (site_image or "").strip() or None
  161. if order_num is not None:
  162. obj.order_num = order_num
  163. if remark is not None:
  164. obj.remark = (remark or "").strip() or None
  165. obj.update_by = user_id
  166. obj.update_time = datetime.now()
  167. db.add(obj)
  168. db.commit()
  169. db.refresh(obj)
  170. return obj
  171. def soft_delete_site(db: Session, site_id: str) -> None:
  172. obj = get_site(db, site_id)
  173. if not obj:
  174. raise ValueError("站点不存在")
  175. obj.del_flag = 1
  176. obj.update_time = datetime.now()
  177. db.add(obj)
  178. db.commit()
  179. def total_pages(total: int, page_size: int) -> int:
  180. if total <= 0:
  181. return 0
  182. return int(math.ceil(total / float(page_size)))