inbound_sample_special.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. """入库样本(采集协议 / 科研捐赠)· 特殊标记维护。"""
  2. from __future__ import annotations
  3. from typing import Any, Dict, Optional
  4. from sqlalchemy.orm import Session
  5. from app.models.models import BizProtocolSample
  6. from app.models.research_donation import BizResearchDonationSample
  7. from app.utils.sample_special import (
  8. apply_inbound_sample_special_mark_fields,
  9. sample_special_to_dict,
  10. validate_sample_special_raw,
  11. )
  12. def update_inbound_sample_special_mark(
  13. db: Session,
  14. *,
  15. tenant_no: str,
  16. reception_source: str,
  17. protocol_sample_id: str,
  18. is_special: bool,
  19. special_remark: Optional[str],
  20. user_id: str,
  21. ) -> Dict[str, Any]:
  22. sample_id = (protocol_sample_id or "").strip()
  23. if not sample_id:
  24. raise ValueError("缺少样本 ID")
  25. source = (reception_source or "cell_storage").strip()
  26. raw = {"is_special": is_special, "special_remark": special_remark or ""}
  27. validate_sample_special_raw(raw)
  28. if source == "research_donation":
  29. sample = (
  30. db.query(BizResearchDonationSample)
  31. .filter(
  32. BizResearchDonationSample.id == sample_id,
  33. BizResearchDonationSample.tenant_no == tenant_no,
  34. BizResearchDonationSample.del_flag == 0,
  35. )
  36. .first()
  37. )
  38. if not sample:
  39. raise ValueError("捐赠样本不存在")
  40. else:
  41. sample = (
  42. db.query(BizProtocolSample)
  43. .filter(
  44. BizProtocolSample.id == sample_id,
  45. BizProtocolSample.tenant_no == tenant_no,
  46. BizProtocolSample.del_flag == 0,
  47. )
  48. .first()
  49. )
  50. if not sample:
  51. raise ValueError("协议样本不存在")
  52. apply_inbound_sample_special_mark_fields(sample, raw)
  53. sample.update_by = user_id
  54. db.flush()
  55. return sample_special_to_dict(sample)