From 4a91cd95204277039f47315cb6137e2791da366b Mon Sep 17 00:00:00 2001 From: Marsway Date: Wed, 25 Mar 2026 11:43:24 +0800 Subject: [PATCH] update --- extensions/sync_ehr_to_oa/job.py | 35 ++++++++++++++++++++++++++------ 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/extensions/sync_ehr_to_oa/job.py b/extensions/sync_ehr_to_oa/job.py index 796d0f8..73417b4 100644 --- a/extensions/sync_ehr_to_oa/job.py +++ b/extensions/sync_ehr_to_oa/job.py @@ -103,6 +103,23 @@ def _prefer_non_empty(new_val: Any, old_val: Any) -> str: 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]]: """ 兼容不同 OA export 返回结构,提取: @@ -314,8 +331,7 @@ class SyncEhrToOaFormJob(BaseJob): if not isinstance(rec, dict): rec = {} - org_oid = str(rec.get("oIdOrganization") or rec.get("oIdDepartment") or "").strip() - org = org_by_oid.get(org_oid, {}) + org, company_source, company_source_oid = _resolve_org_for_company(rec, org_by_oid) company = str((org or {}).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( @@ -330,9 +346,11 @@ class SyncEhrToOaFormJob(BaseJob): 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 "") 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, company, + company_source, + company_source_oid, name, rd_attr, place, @@ -532,8 +550,7 @@ class SyncEhrToOaFormJob(BaseJob): if not isinstance(rec, dict): rec = {} - org_oid = str(rec.get("oIdOrganization") or rec.get("oIdDepartment") or "").strip() - org = org_by_oid.get(org_oid, {}) + org, company_source, company_source_oid = _resolve_org_for_company(rec, org_by_oid) existing_field_map = oa_fields_by_job_no_norm.get(_normalize_job_no(job_no), {}) company = str((org or {}).get("name") or "") @@ -577,7 +594,13 @@ class SyncEhrToOaFormJob(BaseJob): {"name": display_to_code["域账号"], "value": domain_account, "showValue": domain_account}, ] 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: logger.info("字段映射明细:job_no=%s field=%s value=%s", job_no, fld["name"], fld["value"])