This commit is contained in:
Marsway 2026-03-25 11:43:24 +08:00
parent 64a9f582cc
commit 4a91cd9520
1 changed files with 29 additions and 6 deletions

View File

@ -103,6 +103,23 @@ def _prefer_non_empty(new_val: Any, old_val: Any) -> str:
return str(old_val or "").strip() return str(old_val or "").strip()
def _resolve_org_for_company(record_info: dict[str, Any], org_by_oid: dict[str, dict[str, Any]]) -> tuple[dict[str, Any], str, str]:
"""
解析所属公司使用的组织对象
经验上 oIdOrganization 可能是公司根导致全员同值优先尝试 oIdDepartment
返回(org_obj, source_field, source_oid)
"""
dept_oid = str(record_info.get("oIdDepartment") or "").strip()
org_oid = str(record_info.get("oIdOrganization") or "").strip()
for source, oid in (("oIdDepartment", dept_oid), ("oIdOrganization", org_oid)):
if not oid:
continue
org = org_by_oid.get(oid) or {}
if isinstance(org, dict) and str(org.get("name") or "").strip():
return org, source, oid
return {}, "", ""
def _extract_oa_row_id_and_fields(row: dict[str, Any]) -> tuple[int | None, dict[str, Any]]: def _extract_oa_row_id_and_fields(row: dict[str, Any]) -> tuple[int | None, dict[str, Any]]:
""" """
兼容不同 OA export 返回结构提取 兼容不同 OA export 返回结构提取
@ -314,8 +331,7 @@ class SyncEhrToOaFormJob(BaseJob):
if not isinstance(rec, dict): if not isinstance(rec, dict):
rec = {} rec = {}
org_oid = str(rec.get("oIdOrganization") or rec.get("oIdDepartment") or "").strip() org, company_source, company_source_oid = _resolve_org_for_company(rec, org_by_oid)
org = org_by_oid.get(org_oid, {})
company = str((org or {}).get("name") or "") company = str((org or {}).get("name") or "")
name = str(emp.get("name") or "") name = str(emp.get("name") or "")
rd_attr = _custom_prop_value(rec.get("customProperties"), rd_attr_custom_key) or _custom_prop_value( rd_attr = _custom_prop_value(rec.get("customProperties"), rd_attr_custom_key) or _custom_prop_value(
@ -330,9 +346,11 @@ class SyncEhrToOaFormJob(BaseJob):
is_leaving = "" if _date_only(rec.get("lastWorkDate")) else "" is_leaving = "" if _date_only(rec.get("lastWorkDate")) else ""
domain_account = _custom_prop_value(emp.get("customProperties"), domain_custom_key) or str(emp.get("_Name") or "") domain_account = _custom_prop_value(emp.get("customProperties"), domain_custom_key) or str(emp.get("_Name") or "")
logger.info( logger.info(
"EHR 字段预览job_no=%s company=%s name=%s rd_attr=%s place=%s entry_date=%s leave_date=%s id_number=%s hrbp=%s manager=%s is_leaving=%s domain_account=%s", "EHR 字段预览job_no=%s company=%s company_source=%s company_source_oid=%s name=%s rd_attr=%s place=%s entry_date=%s leave_date=%s id_number=%s hrbp=%s manager=%s is_leaving=%s domain_account=%s",
job_no, job_no,
company, company,
company_source,
company_source_oid,
name, name,
rd_attr, rd_attr,
place, place,
@ -532,8 +550,7 @@ class SyncEhrToOaFormJob(BaseJob):
if not isinstance(rec, dict): if not isinstance(rec, dict):
rec = {} rec = {}
org_oid = str(rec.get("oIdOrganization") or rec.get("oIdDepartment") or "").strip() org, company_source, company_source_oid = _resolve_org_for_company(rec, org_by_oid)
org = org_by_oid.get(org_oid, {})
existing_field_map = oa_fields_by_job_no_norm.get(_normalize_job_no(job_no), {}) existing_field_map = oa_fields_by_job_no_norm.get(_normalize_job_no(job_no), {})
company = str((org or {}).get("name") or "") company = str((org or {}).get("name") or "")
@ -577,7 +594,13 @@ class SyncEhrToOaFormJob(BaseJob):
{"name": display_to_code["域账号"], "value": domain_account, "showValue": domain_account}, {"name": display_to_code["域账号"], "value": domain_account, "showValue": domain_account},
] ]
if verbose_trace: if verbose_trace:
logger.info("字段映射job_no=%s row_id=%s", job_no, oa_record_id) logger.info(
"字段映射job_no=%s row_id=%s company_source=%s company_source_oid=%s",
job_no,
oa_record_id,
company_source,
company_source_oid,
)
for fld in fields_payload: for fld in fields_payload:
logger.info("字段映射明细job_no=%s field=%s value=%s", job_no, fld["name"], fld["value"]) logger.info("字段映射明细job_no=%s field=%s value=%s", job_no, fld["name"], fld["value"])