env_detect_item.py 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. """环境检测项 CRUD"""
  2. from __future__ import annotations
  3. from datetime import datetime
  4. from typing import Any, Dict, List, Optional, Tuple
  5. from sqlalchemy import and_, func, or_
  6. from sqlalchemy.orm import Session
  7. from app.core.utils import generate_uuid
  8. from app.models.models import BizEnvDetectItem
  9. def _row_to_dict(r: BizEnvDetectItem) -> Dict[str, Any]:
  10. return {
  11. "id": r.id,
  12. "itemCode": r.item_code,
  13. "itemName": r.item_name,
  14. "status": r.status or "1",
  15. "tenantNo": r.tenant_no,
  16. "orderNum": r.order_num if r.order_num is not None else 0,
  17. "remark": r.remark or "",
  18. "createTime": r.create_time.strftime("%Y-%m-%d %H:%M:%S") if r.create_time else "",
  19. "updateTime": r.update_time.strftime("%Y-%m-%d %H:%M:%S") if r.update_time else "",
  20. }
  21. def item_code_exists(
  22. db: Session, code: str, tenant_no: str, exclude_id: Optional[str] = None
  23. ) -> bool:
  24. c = (code or "").strip()
  25. if not c:
  26. return False
  27. q = db.query(BizEnvDetectItem).filter(
  28. and_(
  29. BizEnvDetectItem.item_code == c,
  30. BizEnvDetectItem.tenant_no == tenant_no,
  31. BizEnvDetectItem.del_flag == 0,
  32. )
  33. )
  34. if exclude_id:
  35. q = q.filter(BizEnvDetectItem.id != exclude_id)
  36. return q.first() is not None
  37. def _order_query(q):
  38. return q.order_by(
  39. BizEnvDetectItem.order_num.asc(),
  40. BizEnvDetectItem.create_time.desc(),
  41. )
  42. def list_env_detect_items(
  43. db: Session,
  44. *,
  45. page: int = 1,
  46. page_size: int = 10,
  47. keyword: Optional[str] = None,
  48. status: Optional[str] = None,
  49. tenant_no: Optional[str] = None,
  50. ) -> Tuple[List[Dict[str, Any]], int]:
  51. def _filtered():
  52. q0 = db.query(BizEnvDetectItem).filter(BizEnvDetectItem.del_flag == 0)
  53. if tenant_no:
  54. q0 = q0.filter(BizEnvDetectItem.tenant_no == tenant_no)
  55. kw = (keyword or "").strip()
  56. if kw:
  57. like = f"%{kw}%"
  58. q0 = q0.filter(
  59. or_(
  60. BizEnvDetectItem.item_code.like(like),
  61. BizEnvDetectItem.item_name.like(like),
  62. )
  63. )
  64. st = (status or "").strip()
  65. if st in ("0", "1"):
  66. q0 = q0.filter(BizEnvDetectItem.status == st)
  67. return q0
  68. total = (
  69. _filtered()
  70. .order_by(None)
  71. .with_entities(func.count(BizEnvDetectItem.id))
  72. .scalar()
  73. or 0
  74. )
  75. page = max(1, page)
  76. page_size = min(max(1, page_size), 100)
  77. rows = _order_query(_filtered()).offset((page - 1) * page_size).limit(page_size).all()
  78. return [_row_to_dict(x) for x in rows], int(total)
  79. def list_active_env_detect_items(db: Session, tenant_no: str) -> List[Dict[str, Any]]:
  80. rows = (
  81. _order_query(
  82. db.query(BizEnvDetectItem).filter(
  83. BizEnvDetectItem.tenant_no == tenant_no,
  84. BizEnvDetectItem.del_flag == 0,
  85. BizEnvDetectItem.status == "1",
  86. )
  87. )
  88. .all()
  89. )
  90. return [_row_to_dict(x) for x in rows]
  91. def get_env_detect_item(
  92. db: Session, row_id: str, tenant_no: Optional[str] = None
  93. ) -> Optional[BizEnvDetectItem]:
  94. q = db.query(BizEnvDetectItem).filter(
  95. and_(BizEnvDetectItem.id == row_id, BizEnvDetectItem.del_flag == 0)
  96. )
  97. if tenant_no:
  98. q = q.filter(BizEnvDetectItem.tenant_no == tenant_no)
  99. return q.first()
  100. def create_env_detect_item(
  101. db: Session,
  102. *,
  103. item_code: str,
  104. item_name: str,
  105. status: str = "1",
  106. tenant_no: str,
  107. order_num: Optional[int] = None,
  108. remark: Optional[str] = None,
  109. user_id: Optional[str] = None,
  110. create_dept_id: str = "",
  111. ) -> BizEnvDetectItem:
  112. code = (item_code or "").strip()
  113. if not code:
  114. raise ValueError("项目编码不能为空")
  115. if item_code_exists(db, code, tenant_no):
  116. raise ValueError("项目编码已存在")
  117. name = (item_name or "").strip()
  118. if not name:
  119. raise ValueError("项目名称不能为空")
  120. st = (status or "1").strip()
  121. if st not in ("0", "1"):
  122. raise ValueError("状态无效")
  123. obj = BizEnvDetectItem(
  124. id=generate_uuid(),
  125. item_code=code,
  126. item_name=name,
  127. status=st,
  128. tenant_no=tenant_no,
  129. order_num=order_num if order_num is not None else 0,
  130. remark=(remark or "").strip() or None,
  131. create_by=user_id,
  132. create_dept_id=create_dept_id or "",
  133. create_time=datetime.now(),
  134. update_by=user_id,
  135. update_time=datetime.now(),
  136. del_flag=0,
  137. )
  138. db.add(obj)
  139. db.commit()
  140. db.refresh(obj)
  141. return obj
  142. def update_env_detect_item(
  143. db: Session,
  144. row_id: str,
  145. *,
  146. item_code: Optional[str] = None,
  147. item_name: Optional[str] = None,
  148. status: Optional[str] = None,
  149. order_num: Optional[int] = None,
  150. remark: Optional[str] = None,
  151. user_id: Optional[str] = None,
  152. tenant_no: Optional[str] = None,
  153. ) -> BizEnvDetectItem:
  154. obj = get_env_detect_item(db, row_id, tenant_no=tenant_no)
  155. if not obj:
  156. raise ValueError("检测项不存在")
  157. if item_code is not None:
  158. code = item_code.strip()
  159. if not code:
  160. raise ValueError("项目编码不能为空")
  161. if code != obj.item_code and item_code_exists(db, code, obj.tenant_no, exclude_id=row_id):
  162. raise ValueError("项目编码已存在")
  163. obj.item_code = code
  164. if item_name is not None:
  165. name = (item_name or "").strip()
  166. if not name:
  167. raise ValueError("项目名称不能为空")
  168. obj.item_name = name
  169. if status is not None:
  170. st = status.strip()
  171. if st not in ("0", "1"):
  172. raise ValueError("状态无效")
  173. obj.status = st
  174. if order_num is not None:
  175. obj.order_num = order_num
  176. if remark is not None:
  177. obj.remark = remark.strip() or None
  178. obj.update_by = user_id
  179. obj.update_time = datetime.now()
  180. db.add(obj)
  181. db.commit()
  182. db.refresh(obj)
  183. return obj
  184. def soft_delete_env_detect_item(
  185. db: Session, row_id: str, tenant_no: Optional[str] = None
  186. ) -> None:
  187. obj = get_env_detect_item(db, row_id, tenant_no=tenant_no)
  188. if not obj:
  189. raise ValueError("检测项不存在")
  190. obj.del_flag = 1
  191. obj.update_time = datetime.now()
  192. db.add(obj)
  193. db.commit()