site.py 6.2 KB

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