pilot_infusion_confirm.py 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. """中试输注应用确认 CRUD"""
  2. from datetime import datetime
  3. from typing import Any, Dict, List, Optional
  4. from sqlalchemy.orm import Session
  5. from app.core.utils import generate_uuid
  6. from app.models.models import BizPilotInfusionConfirm, BizPilotInfusionPlan, BizPilotInfusionSchedule
  7. # ────────────────────────────────────────────
  8. # Helpers
  9. # ────────────────────────────────────────────
  10. def _row_to_dict(row) -> Dict[str, Any]:
  11. return {
  12. "id": row.id,
  13. "infusionScheduleId": row.infusion_schedule_id or "",
  14. "confirmUserId": row.confirm_user_id or "",
  15. "confirmTime": row.confirm_time.strftime("%Y-%m-%d %H:%M:%S") if row.confirm_time else "",
  16. "confirmDesc": row.confirm_desc or "",
  17. "tenantNo": row.tenant_no or "",
  18. "remark": row.remark or "",
  19. "createBy": row.create_by or "",
  20. "createTime": row.create_time.strftime("%Y-%m-%d %H:%M:%S") if row.create_time else "",
  21. "updateTime": row.update_time.strftime("%Y-%m-%d %H:%M:%S") if row.update_time else "",
  22. }
  23. # ────────────────────────────────────────────
  24. # CRUD
  25. # ────────────────────────────────────────────
  26. def create_infusion_confirm(
  27. db: Session,
  28. *,
  29. schedule_id: str,
  30. tenant_no: str,
  31. user_id: str,
  32. create_dept_id: str = "",
  33. confirm_desc: str = "",
  34. remark: str = "",
  35. ) -> Dict[str, Any]:
  36. now = datetime.now()
  37. row = BizPilotInfusionConfirm(
  38. id=generate_uuid(),
  39. infusion_schedule_id=schedule_id,
  40. confirm_user_id="",
  41. confirm_time=None,
  42. confirm_desc=confirm_desc,
  43. tenant_no=tenant_no,
  44. order_num=0,
  45. remark=remark,
  46. create_by=user_id,
  47. create_dept_id=create_dept_id or "",
  48. create_time=now,
  49. update_by=user_id,
  50. update_time=now,
  51. del_flag=0,
  52. )
  53. db.add(row)
  54. db.flush()
  55. return _row_to_dict(row)
  56. def list_confirms_by_application(
  57. db: Session, application_id: str, tenant_no: str
  58. ) -> List[Dict[str, Any]]:
  59. plan_ids = [
  60. r[0]
  61. for r in db.query(BizPilotInfusionPlan.id)
  62. .filter(
  63. BizPilotInfusionPlan.pilot_application_id == application_id,
  64. BizPilotInfusionPlan.tenant_no == tenant_no,
  65. BizPilotInfusionPlan.del_flag == 0,
  66. )
  67. .all()
  68. ]
  69. if not plan_ids:
  70. return []
  71. schedule_ids = [
  72. r[0]
  73. for r in db.query(BizPilotInfusionSchedule.id)
  74. .filter(
  75. BizPilotInfusionSchedule.infusion_plan_id.in_(plan_ids),
  76. BizPilotInfusionSchedule.tenant_no == tenant_no,
  77. BizPilotInfusionSchedule.del_flag == 0,
  78. )
  79. .all()
  80. ]
  81. if not schedule_ids:
  82. return []
  83. rows = (
  84. db.query(BizPilotInfusionConfirm)
  85. .filter(
  86. BizPilotInfusionConfirm.infusion_schedule_id.in_(schedule_ids),
  87. BizPilotInfusionConfirm.tenant_no == tenant_no,
  88. BizPilotInfusionConfirm.del_flag == 0,
  89. )
  90. .order_by(BizPilotInfusionConfirm.create_time.desc())
  91. .all()
  92. )
  93. return [_row_to_dict(r) for r in rows]
  94. def get_confirm_by_schedule(
  95. db: Session, schedule_id: str, tenant_no: str
  96. ) -> Optional[Dict[str, Any]]:
  97. """按输注计划 ID 获取应用确认(含确认人姓名快照)。"""
  98. from app.models.models import SysUser
  99. row = (
  100. db.query(BizPilotInfusionConfirm)
  101. .filter(
  102. BizPilotInfusionConfirm.infusion_schedule_id == schedule_id,
  103. BizPilotInfusionConfirm.tenant_no == tenant_no,
  104. BizPilotInfusionConfirm.del_flag == 0,
  105. )
  106. .first()
  107. )
  108. if not row:
  109. return None
  110. data = _row_to_dict(row)
  111. uid = (row.confirm_user_id or "").strip()
  112. if uid:
  113. user = (
  114. db.query(SysUser)
  115. .filter(SysUser.id == uid, SysUser.del_flag == 0)
  116. .first()
  117. )
  118. data["confirmUserName"] = (user.nick_name or user.user_no or "") if user else ""
  119. else:
  120. data["confirmUserName"] = ""
  121. return data
  122. def get_confirm_by_id(
  123. db: Session, confirm_id: str, tenant_no: str
  124. ) -> Optional[Dict[str, Any]]:
  125. row = (
  126. db.query(BizPilotInfusionConfirm)
  127. .filter(
  128. BizPilotInfusionConfirm.id == confirm_id,
  129. BizPilotInfusionConfirm.tenant_no == tenant_no,
  130. BizPilotInfusionConfirm.del_flag == 0,
  131. )
  132. .first()
  133. )
  134. if not row:
  135. return None
  136. return _row_to_dict(row)
  137. def confirm_infusion(
  138. db: Session, confirm_id: str, tenant_no: str, user_id: str
  139. ) -> Dict[str, Any]:
  140. now = datetime.now()
  141. row = (
  142. db.query(BizPilotInfusionConfirm)
  143. .filter(
  144. BizPilotInfusionConfirm.id == confirm_id,
  145. BizPilotInfusionConfirm.tenant_no == tenant_no,
  146. BizPilotInfusionConfirm.del_flag == 0,
  147. )
  148. .first()
  149. )
  150. if not row:
  151. raise ValueError("应用确认记录不存在")
  152. if row.confirm_time is not None:
  153. raise ValueError("该记录已确认")
  154. row.confirm_user_id = user_id
  155. row.confirm_time = now
  156. row.update_by = user_id
  157. row.update_time = now
  158. db.commit()
  159. db.refresh(row)
  160. return _row_to_dict(row)
  161. def update_infusion_confirm(
  162. db: Session, confirm_id: str, tenant_no: str, user_id: str, **kwargs
  163. ) -> Dict[str, Any]:
  164. row = (
  165. db.query(BizPilotInfusionConfirm)
  166. .filter(
  167. BizPilotInfusionConfirm.id == confirm_id,
  168. BizPilotInfusionConfirm.tenant_no == tenant_no,
  169. BizPilotInfusionConfirm.del_flag == 0,
  170. )
  171. .first()
  172. )
  173. if not row:
  174. raise ValueError("应用确认记录不存在")
  175. field_map = {
  176. "confirmDesc": "confirm_desc",
  177. "remark": "remark",
  178. }
  179. for camel, snake in field_map.items():
  180. if camel in kwargs and kwargs[camel] is not None:
  181. setattr(row, snake, kwargs[camel])
  182. row.update_by = user_id
  183. row.update_time = datetime.now()
  184. db.commit()
  185. db.refresh(row)
  186. return _row_to_dict(row)
  187. def delete_infusion_confirm(
  188. db: Session, confirm_id: str, tenant_no: str, user_id: str
  189. ) -> None:
  190. row = (
  191. db.query(BizPilotInfusionConfirm)
  192. .filter(
  193. BizPilotInfusionConfirm.id == confirm_id,
  194. BizPilotInfusionConfirm.tenant_no == tenant_no,
  195. BizPilotInfusionConfirm.del_flag == 0,
  196. )
  197. .first()
  198. )
  199. if not row:
  200. raise ValueError("应用确认记录不存在")
  201. row.del_flag = 1
  202. row.update_by = user_id
  203. row.update_time = datetime.now()
  204. db.commit()