sample_info_quick_register.py 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. """样本信息列表快捷登记:去重与入库字段规范化。"""
  2. from __future__ import annotations
  3. from datetime import datetime
  4. from typing import Any, Dict, Iterable, List, Optional
  5. from app.services.sample_info_progress import apply_handle_payload
  6. def unique_nonempty_ids(ids: Iterable[Optional[str]]) -> List[str]:
  7. seen = set()
  8. out: List[str] = []
  9. for raw in ids:
  10. s = (raw or "").strip()
  11. if not s or s in seen:
  12. continue
  13. seen.add(s)
  14. out.append(s)
  15. return out
  16. def unique_sample_items(
  17. items: Optional[Iterable[Dict[str, str]]],
  18. ) -> List[tuple]:
  19. """按 sampleCode 去重,保留首次出现的 (sampleCode, protocolId)。"""
  20. seen = set()
  21. out: List[tuple] = []
  22. for it in items or []:
  23. code = (it.get("sampleCode") or "").strip()
  24. pid = (it.get("protocolId") or "").strip()
  25. if not code or code in seen:
  26. continue
  27. seen.add(code)
  28. out.append((code, pid))
  29. return out
  30. def apply_quick_storage_payload(
  31. *,
  32. handle_time: Optional[datetime],
  33. handler_user_id: Optional[str],
  34. attachments: str = "",
  35. remark: str = "",
  36. ) -> Dict[str, Any]:
  37. """快捷登记入库必须填写办理时间;不走生产/质检双门禁。"""
  38. if handle_time is None:
  39. raise ValueError("请填写办理时间")
  40. payload = apply_handle_payload(
  41. handle_time=handle_time,
  42. handler_user_id=handler_user_id,
  43. attachments=attachments,
  44. remark=remark,
  45. )
  46. return {
  47. "storage_status": "yrk",
  48. "storage_time": payload["handle_time"],
  49. "storage_by": payload["handler_user_id"],
  50. "storage_in_date": payload["legacy_date"],
  51. "attachments": payload["attachments"],
  52. "remark": payload["remark"],
  53. }