feat: wire party customer sync into storage and donation saves
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
1 parent
910f61ed33
commit
f005370a1e
3 files changed
+22
-48
No files matched your search
@@ -13,15 +13,14 @@ from app.core.menu_guard import require_admin_or_super_admin
|
|||||||
from app.core.response import error_response, success_response
|
from app.core.response import error_response, success_response
|
||||||
from app.core.utils import parse_datetime
|
from app.core.utils import parse_datetime
|
||||||
from app.crud import collection_protocol as cp_svc
|
from app.crud import collection_protocol as cp_svc
|
||||||
from app.crud import customer as customer_crud
|
|
||||||
from app.models.models import (
|
from app.models.models import (
|
||||||
BizCollectionProtocol,
|
BizCollectionProtocol,
|
||||||
BizCustomer,
|
|
||||||
BizProtocolPartyCustomer,
|
BizProtocolPartyCustomer,
|
||||||
BizProtocolSample,
|
BizProtocolSample,
|
||||||
BizProtocolStorageCert,
|
BizProtocolStorageCert,
|
||||||
SysUser,
|
SysUser,
|
||||||
)
|
)
|
||||||
|
from app.services.party_customer_sync import sync_party_customers
|
||||||
|
|
||||||
router = APIRouter(prefix="/web/admin", tags=["细胞存储"])
|
router = APIRouter(prefix="/web/admin", tags=["细胞存储"])
|
||||||
|
|
||||||
@@ -79,49 +78,6 @@ def _parse_datetime_fields(d: dict, camel_keys: list) -> None:
|
|||||||
d[snake] = None
|
d[snake] = None
|
||||||
|
|
||||||
|
|
||||||
def _ensure_customer_for_mother(db: Session, party_customer: dict, tenant_no: str, user_id: str) -> dict:
|
|
||||||
"""If mother info exists but no customerId, create a customer record and link it."""
|
|
||||||
if not party_customer:
|
|
||||||
return party_customer
|
|
||||||
customer_id = party_customer.get("customer_id") or party_customer.get("customerId")
|
|
||||||
mother_name = (party_customer.get("mother_name") or party_customer.get("motherName") or "").strip()
|
|
||||||
if customer_id or not mother_name:
|
|
||||||
return party_customer
|
|
||||||
# Build customer fields from mother info
|
|
||||||
mother_phone = (party_customer.get("mother_phone") or party_customer.get("motherPhone") or "").strip() or None
|
|
||||||
mother_id_card = (party_customer.get("mother_id_card") or party_customer.get("motherIdCard") or "").strip() or None
|
|
||||||
|
|
||||||
# Check if customer with this id_card already exists
|
|
||||||
if mother_id_card and customer_crud.id_card_taken(db, mother_id_card, tenant_no):
|
|
||||||
existing = db.query(BizCustomer).filter(
|
|
||||||
sa_and(
|
|
||||||
BizCustomer.id_card_no == mother_id_card,
|
|
||||||
BizCustomer.tenant_no == tenant_no,
|
|
||||||
BizCustomer.del_flag == 0,
|
|
||||||
)
|
|
||||||
).first()
|
|
||||||
if existing:
|
|
||||||
party_customer["customer_id"] = existing.id
|
|
||||||
return party_customer
|
|
||||||
|
|
||||||
# Create new customer
|
|
||||||
try:
|
|
||||||
obj = customer_crud.create_customer(
|
|
||||||
db,
|
|
||||||
customer_name=mother_name,
|
|
||||||
sex="1", # female (mother)
|
|
||||||
id_card_no=mother_id_card,
|
|
||||||
phone_no=mother_phone,
|
|
||||||
tenant_no=tenant_no,
|
|
||||||
user_id=user_id,
|
|
||||||
)
|
|
||||||
party_customer["customer_id"] = obj.id
|
|
||||||
except ValueError:
|
|
||||||
# If creation fails (e.g. duplicate), try to find existing
|
|
||||||
pass
|
|
||||||
return party_customer
|
|
||||||
|
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
# 采集协议单
|
# 采集协议单
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
@@ -286,7 +242,9 @@ def _persist_protocol_sub_resources(
|
|||||||
"""
|
"""
|
||||||
if party_customer:
|
if party_customer:
|
||||||
_parse_datetime_fields(party_customer, ["newbornDeliveryTime"])
|
_parse_datetime_fields(party_customer, ["newbornDeliveryTime"])
|
||||||
party_customer = _ensure_customer_for_mother(db, party_customer, tenant_no, user_id)
|
party_customer = sync_party_customers(
|
||||||
|
db, party_customer, tenant_no=tenant_no, user_id=user_id
|
||||||
|
)
|
||||||
cp_svc.upsert_party_customer(db, protocol_id, tenant_no, user_id, **party_customer)
|
cp_svc.upsert_party_customer(db, protocol_id, tenant_no, user_id, **party_customer)
|
||||||
if collection_info:
|
if collection_info:
|
||||||
_parse_datetime_fields(collection_info, ["sampleCollectTime", "maternalBloodCollectTime"])
|
_parse_datetime_fields(collection_info, ["sampleCollectTime", "maternalBloodCollectTime"])
|
||||||
|
|||||||
@@ -511,6 +511,8 @@ def _party_customer_to_dict(p: BizProtocolPartyCustomer) -> Dict[str, Any]:
|
|||||||
"id": p.id,
|
"id": p.id,
|
||||||
"collectionProtocolId": p.collection_protocol_id,
|
"collectionProtocolId": p.collection_protocol_id,
|
||||||
"customerId": p.customer_id or "",
|
"customerId": p.customer_id or "",
|
||||||
|
"fatherCustomerId": p.father_customer_id or "",
|
||||||
|
"newbornCustomerId": p.newborn_customer_id or "",
|
||||||
"motherName": p.mother_name or "",
|
"motherName": p.mother_name or "",
|
||||||
"motherPhone": p.mother_phone or "",
|
"motherPhone": p.mother_phone or "",
|
||||||
"motherIdCard": p.mother_id_card or "",
|
"motherIdCard": p.mother_id_card or "",
|
||||||
@@ -2526,7 +2528,8 @@ def upsert_party_customer(
|
|||||||
fields = _normalize_fields(fields)
|
fields = _normalize_fields(fields)
|
||||||
obj = get_party_customer(db, collection_protocol_id, tenant_no)
|
obj = get_party_customer(db, collection_protocol_id, tenant_no)
|
||||||
_STR_FIELDS = [
|
_STR_FIELDS = [
|
||||||
"customer_id", "mother_name", "mother_phone", "mother_id_card",
|
"customer_id", "father_customer_id", "newborn_customer_id",
|
||||||
|
"mother_name", "mother_phone", "mother_id_card",
|
||||||
"mother_birth_ym", "mother_ethnic", "mother_email", "mother_address",
|
"mother_birth_ym", "mother_ethnic", "mother_email", "mother_address",
|
||||||
"father_name", "father_phone", "father_id_card",
|
"father_name", "father_phone", "father_id_card",
|
||||||
"newborn_name", "newborn_id_card",
|
"newborn_name", "newborn_id_card",
|
||||||
|
|||||||
@@ -321,6 +321,8 @@ def _party_to_dict(p: BizResearchDonationParty) -> Dict[str, Any]:
|
|||||||
"id": p.id,
|
"id": p.id,
|
||||||
"researchDonationId": p.research_donation_id,
|
"researchDonationId": p.research_donation_id,
|
||||||
"customerId": p.customer_id or "",
|
"customerId": p.customer_id or "",
|
||||||
|
"fatherCustomerId": p.father_customer_id or "",
|
||||||
|
"newbornCustomerId": p.newborn_customer_id or "",
|
||||||
"motherName": p.mother_name or "",
|
"motherName": p.mother_name or "",
|
||||||
"motherPhone": p.mother_phone or "",
|
"motherPhone": p.mother_phone or "",
|
||||||
"motherIdCard": p.mother_id_card or "",
|
"motherIdCard": p.mother_id_card or "",
|
||||||
@@ -955,7 +957,10 @@ def create_donation(
|
|||||||
donation_id = obj.id
|
donation_id = obj.id
|
||||||
|
|
||||||
# party
|
# party
|
||||||
|
from app.services.party_customer_sync import sync_party_customers
|
||||||
|
|
||||||
party_raw = _normalize_fields(raw.get("party") or {})
|
party_raw = _normalize_fields(raw.get("party") or {})
|
||||||
|
party_raw = sync_party_customers(db, party_raw, tenant_no=tenant_no, user_id=user_id or "")
|
||||||
_create_party(db, donation_id, tenant_no, user_id, party_raw, now)
|
_create_party(db, donation_id, tenant_no, user_id, party_raw, now)
|
||||||
|
|
||||||
# collection
|
# collection
|
||||||
@@ -1039,8 +1044,11 @@ def update_donation(
|
|||||||
|
|
||||||
# party upsert: 软删旧 → 创建新
|
# party upsert: 软删旧 → 创建新
|
||||||
if "party" in raw:
|
if "party" in raw:
|
||||||
|
from app.services.party_customer_sync import sync_party_customers
|
||||||
|
|
||||||
_soft_delete_party(db, donation_id, tenant_no, user_id)
|
_soft_delete_party(db, donation_id, tenant_no, user_id)
|
||||||
party_raw = _normalize_fields(raw["party"] or {})
|
party_raw = _normalize_fields(raw["party"] or {})
|
||||||
|
party_raw = sync_party_customers(db, party_raw, tenant_no=tenant_no, user_id=user_id or "")
|
||||||
_create_party(db, donation_id, tenant_no, user_id, party_raw, now)
|
_create_party(db, donation_id, tenant_no, user_id, party_raw, now)
|
||||||
|
|
||||||
# collection upsert
|
# collection upsert
|
||||||
@@ -1480,6 +1488,8 @@ def convert_from_storage(
|
|||||||
id=generate_uuid(),
|
id=generate_uuid(),
|
||||||
research_donation_id=did,
|
research_donation_id=did,
|
||||||
customer_id=src_party.customer_id,
|
customer_id=src_party.customer_id,
|
||||||
|
father_customer_id=getattr(src_party, "father_customer_id", None),
|
||||||
|
newborn_customer_id=getattr(src_party, "newborn_customer_id", None),
|
||||||
mother_name=src_party.mother_name,
|
mother_name=src_party.mother_name,
|
||||||
mother_phone=src_party.mother_phone,
|
mother_phone=src_party.mother_phone,
|
||||||
mother_id_card=src_party.mother_id_card,
|
mother_id_card=src_party.mother_id_card,
|
||||||
@@ -1724,6 +1734,8 @@ def convert_to_storage(
|
|||||||
id=generate_uuid(),
|
id=generate_uuid(),
|
||||||
collection_protocol_id=pid,
|
collection_protocol_id=pid,
|
||||||
customer_id=src_party.customer_id,
|
customer_id=src_party.customer_id,
|
||||||
|
father_customer_id=getattr(src_party, "father_customer_id", None),
|
||||||
|
newborn_customer_id=getattr(src_party, "newborn_customer_id", None),
|
||||||
mother_name=src_party.mother_name,
|
mother_name=src_party.mother_name,
|
||||||
mother_phone=src_party.mother_phone,
|
mother_phone=src_party.mother_phone,
|
||||||
mother_id_card=src_party.mother_id_card,
|
mother_id_card=src_party.mother_id_card,
|
||||||
@@ -1863,7 +1875,8 @@ def convert_to_storage(
|
|||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
|
|
||||||
_PARTY_STR_FIELDS = [
|
_PARTY_STR_FIELDS = [
|
||||||
"customer_id", "mother_name", "mother_phone", "mother_id_card",
|
"customer_id", "father_customer_id", "newborn_customer_id",
|
||||||
|
"mother_name", "mother_phone", "mother_id_card",
|
||||||
"mother_birth_ym", "mother_ethnic", "mother_email", "mother_address",
|
"mother_birth_ym", "mother_ethnic", "mother_email", "mother_address",
|
||||||
"father_name", "father_phone", "father_id_card",
|
"father_name", "father_phone", "father_id_card",
|
||||||
"newborn_name", "newborn_id_card", "newborn_sex",
|
"newborn_name", "newborn_id_card", "newborn_sex",
|
||||||
|
|||||||
Reference in new issue
Block a user