62 lines
1.8 KiB
Python
62 lines
1.8 KiB
Python
"""样本信息列表快捷登记:去重与入库字段规范化。"""
|
|
from __future__ import annotations
|
|
|
|
from datetime import datetime
|
|
from typing import Any, Dict, Iterable, List, Optional
|
|
|
|
from app.services.sample_info_progress import apply_handle_payload
|
|
|
|
|
|
def unique_nonempty_ids(ids: Iterable[Optional[str]]) -> List[str]:
|
|
seen = set()
|
|
out: List[str] = []
|
|
for raw in ids:
|
|
s = (raw or "").strip()
|
|
if not s or s in seen:
|
|
continue
|
|
seen.add(s)
|
|
out.append(s)
|
|
return out
|
|
|
|
|
|
def unique_sample_items(
|
|
items: Optional[Iterable[Dict[str, str]]],
|
|
) -> List[tuple]:
|
|
"""按 sampleCode 去重,保留首次出现的 (sampleCode, protocolId)。"""
|
|
seen = set()
|
|
out: List[tuple] = []
|
|
for it in items or []:
|
|
code = (it.get("sampleCode") or "").strip()
|
|
pid = (it.get("protocolId") or "").strip()
|
|
if not code or code in seen:
|
|
continue
|
|
seen.add(code)
|
|
out.append((code, pid))
|
|
return out
|
|
|
|
|
|
def apply_quick_storage_payload(
|
|
*,
|
|
handle_time: Optional[datetime],
|
|
handler_user_id: Optional[str],
|
|
attachments: str = "",
|
|
remark: str = "",
|
|
) -> Dict[str, Any]:
|
|
"""快捷登记入库必须填写办理时间;不走生产/质检双门禁。"""
|
|
if handle_time is None:
|
|
raise ValueError("请填写办理时间")
|
|
payload = apply_handle_payload(
|
|
handle_time=handle_time,
|
|
handler_user_id=handler_user_id,
|
|
attachments=attachments,
|
|
remark=remark,
|
|
)
|
|
return {
|
|
"storage_status": "yrk",
|
|
"storage_time": payload["handle_time"],
|
|
"storage_by": payload["handler_user_id"],
|
|
"storage_in_date": payload["legacy_date"],
|
|
"attachments": payload["attachments"],
|
|
"remark": payload["remark"],
|
|
}
|