"""中试输注应用确认 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) .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()