| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233 |
- """中试输注应用确认 CRUD"""
- from datetime import datetime
- from typing import Any, Dict, List, Optional
- from sqlalchemy.orm import Session
- from app.core.utils import generate_uuid
- from app.models.models import BizPilotInfusionConfirm, BizPilotInfusionPlan, BizPilotInfusionSchedule
- # ────────────────────────────────────────────
- # Helpers
- # ────────────────────────────────────────────
- def _row_to_dict(row) -> Dict[str, Any]:
- return {
- "id": row.id,
- "infusionScheduleId": row.infusion_schedule_id or "",
- "confirmUserId": row.confirm_user_id or "",
- "confirmTime": row.confirm_time.strftime("%Y-%m-%d %H:%M:%S") if row.confirm_time else "",
- "confirmDesc": row.confirm_desc or "",
- "tenantNo": row.tenant_no or "",
- "remark": row.remark or "",
- "createBy": row.create_by or "",
- "createTime": row.create_time.strftime("%Y-%m-%d %H:%M:%S") if row.create_time else "",
- "updateTime": row.update_time.strftime("%Y-%m-%d %H:%M:%S") if row.update_time else "",
- }
- # ────────────────────────────────────────────
- # CRUD
- # ────────────────────────────────────────────
- def create_infusion_confirm(
- db: Session,
- *,
- schedule_id: str,
- tenant_no: str,
- user_id: str,
- create_dept_id: str = "",
- confirm_desc: str = "",
- remark: str = "",
- ) -> Dict[str, Any]:
- now = datetime.now()
- row = BizPilotInfusionConfirm(
- id=generate_uuid(),
- infusion_schedule_id=schedule_id,
- confirm_user_id="",
- confirm_time=None,
- confirm_desc=confirm_desc,
- tenant_no=tenant_no,
- order_num=0,
- remark=remark,
- create_by=user_id,
- create_dept_id=create_dept_id or "",
- create_time=now,
- update_by=user_id,
- update_time=now,
- del_flag=0,
- )
- db.add(row)
- db.flush()
- return _row_to_dict(row)
- def list_confirms_by_application(
- db: Session, application_id: str, tenant_no: str
- ) -> List[Dict[str, Any]]:
- plan_ids = [
- r[0]
- for r in db.query(BizPilotInfusionPlan.id)
- .filter(
- BizPilotInfusionPlan.pilot_application_id == application_id,
- BizPilotInfusionPlan.tenant_no == tenant_no,
- BizPilotInfusionPlan.del_flag == 0,
- )
- .all()
- ]
- if not plan_ids:
- return []
- schedule_ids = [
- r[0]
- for r in db.query(BizPilotInfusionSchedule.id)
- .filter(
- BizPilotInfusionSchedule.infusion_plan_id.in_(plan_ids),
- BizPilotInfusionSchedule.tenant_no == tenant_no,
- BizPilotInfusionSchedule.del_flag == 0,
- )
- .all()
- ]
- if not schedule_ids:
- return []
- rows = (
- db.query(BizPilotInfusionConfirm)
- .filter(
- BizPilotInfusionConfirm.infusion_schedule_id.in_(schedule_ids),
- BizPilotInfusionConfirm.tenant_no == tenant_no,
- BizPilotInfusionConfirm.del_flag == 0,
- )
- .order_by(BizPilotInfusionConfirm.create_time.desc())
- .all()
- )
- return [_row_to_dict(r) for r in rows]
- def get_confirm_by_schedule(
- db: Session, schedule_id: str, tenant_no: str
- ) -> Optional[Dict[str, Any]]:
- """按输注计划 ID 获取应用确认(含确认人姓名快照)。"""
- from app.models.models import SysUser
- row = (
- db.query(BizPilotInfusionConfirm)
- .filter(
- BizPilotInfusionConfirm.infusion_schedule_id == schedule_id,
- BizPilotInfusionConfirm.tenant_no == tenant_no,
- BizPilotInfusionConfirm.del_flag == 0,
- )
- .first()
- )
- if not row:
- return None
- data = _row_to_dict(row)
- uid = (row.confirm_user_id or "").strip()
- if uid:
- user = (
- db.query(SysUser)
- .filter(SysUser.id == uid, SysUser.del_flag == 0)
- .first()
- )
- data["confirmUserName"] = (user.nick_name or user.user_no or "") if user else ""
- else:
- data["confirmUserName"] = ""
- return data
- def get_confirm_by_id(
- db: Session, confirm_id: str, tenant_no: str
- ) -> Optional[Dict[str, Any]]:
- row = (
- db.query(BizPilotInfusionConfirm)
- .filter(
- BizPilotInfusionConfirm.id == confirm_id,
- BizPilotInfusionConfirm.tenant_no == tenant_no,
- BizPilotInfusionConfirm.del_flag == 0,
- )
- .first()
- )
- if not row:
- return None
- return _row_to_dict(row)
- def confirm_infusion(
- db: Session, confirm_id: str, tenant_no: str, user_id: str
- ) -> Dict[str, Any]:
- now = datetime.now()
- row = (
- db.query(BizPilotInfusionConfirm)
- .filter(
- BizPilotInfusionConfirm.id == confirm_id,
- BizPilotInfusionConfirm.tenant_no == tenant_no,
- BizPilotInfusionConfirm.del_flag == 0,
- )
- .first()
- )
- if not row:
- raise ValueError("应用确认记录不存在")
- if row.confirm_time is not None:
- raise ValueError("该记录已确认")
- row.confirm_user_id = user_id
- row.confirm_time = now
- row.update_by = user_id
- row.update_time = now
- db.commit()
- db.refresh(row)
- return _row_to_dict(row)
- def update_infusion_confirm(
- db: Session, confirm_id: str, tenant_no: str, user_id: str, **kwargs
- ) -> Dict[str, Any]:
- row = (
- db.query(BizPilotInfusionConfirm)
- .filter(
- BizPilotInfusionConfirm.id == confirm_id,
- BizPilotInfusionConfirm.tenant_no == tenant_no,
- BizPilotInfusionConfirm.del_flag == 0,
- )
- .first()
- )
- if not row:
- raise ValueError("应用确认记录不存在")
- field_map = {
- "confirmDesc": "confirm_desc",
- "remark": "remark",
- }
- for camel, snake in field_map.items():
- if camel in kwargs and kwargs[camel] is not None:
- setattr(row, snake, kwargs[camel])
- row.update_by = user_id
- row.update_time = datetime.now()
- db.commit()
- db.refresh(row)
- return _row_to_dict(row)
- def delete_infusion_confirm(
- db: Session, confirm_id: str, tenant_no: str, user_id: str
- ) -> None:
- row = (
- db.query(BizPilotInfusionConfirm)
- .filter(
- BizPilotInfusionConfirm.id == confirm_id,
- BizPilotInfusionConfirm.tenant_no == tenant_no,
- BizPilotInfusionConfirm.del_flag == 0,
- )
- .first()
- )
- if not row:
- raise ValueError("应用确认记录不存在")
- row.del_flag = 1
- row.update_by = user_id
- row.update_time = datetime.now()
- db.commit()
|