Files
zkxw/backend/app/crud/pilot_infusion_confirm.py
T
zlwuandCursor 5e563a6669 fix: 子表保存改为就地同步,避免整批换 id 打断外键。
协议样本、生产产出和盘点明细按行更新并保留原 id;补齐存储证明质检预填、离职人员显示名,以及样本采集通知模板字段。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-28 10:51:53 +08:00

234 lines
6.8 KiB
Python

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