diff --git a/extensions/sync_ehr_to_oa/job.py b/extensions/sync_ehr_to_oa/job.py index 2a334da..2fc13fd 100644 --- a/extensions/sync_ehr_to_oa/job.py +++ b/extensions/sync_ehr_to_oa/job.py @@ -146,14 +146,25 @@ def _extract_reporting_user_id(staff_profile: dict[str, Any]) -> int: def _extract_staff_code(staff_profile: dict[str, Any]) -> str: if not isinstance(staff_profile, dict): return "" - return str( - staff_profile.get("staffCode") - or staff_profile.get("StaffCode") - or staff_profile.get("code") - or staff_profile.get("Code") - or staff_profile.get("employeeNo") - or "" - ).strip() + for key in ( + "staffCode", + "StaffCode", + "code", + "Code", + "jobNumber", + "JobNumber", + "employeeNo", + "EmployeeNo", + ): + val = str(staff_profile.get(key) or "").strip() + if val: + return val + lower_map = {str(k).lower(): v for k, v in staff_profile.items()} + for key in ("staffcode", "code", "jobnumber", "employeeno"): + val = str(lower_map.get(key) or "").strip() + if val: + return val + return "" def _pick_best_member_by_code(members: list[dict[str, Any]]) -> dict[str, Any] | None: @@ -470,6 +481,8 @@ class SyncEhrToOaFormJob(BaseJob): hrbp = str(hrbp_member.get("id") or "") hrbp_show = str(hrbp_member.get("name") or hrbp_code) manager_uid = _extract_reporting_user_id(staff_profile_by_user_id.get(user_id, {})) + if manager_uid <= 0: + manager_uid = _to_int_safe(rec.get("pOIdEmpAdmin")) manager_code = str(user_id_to_staff_code.get(manager_uid) or "") manager_member = code_to_member.get(manager_code, {}) manager = str(manager_member.get("id") or "") @@ -703,6 +716,8 @@ class SyncEhrToOaFormJob(BaseJob): hrbp = str(hrbp_member.get("id") or "") hrbp_show = str(hrbp_member.get("name") or hrbp_code) manager_uid = _extract_reporting_user_id(staff_profile_by_user_id.get(user_id, {})) + if manager_uid <= 0: + manager_uid = _to_int_safe(rec.get("pOIdEmpAdmin")) manager_code = str(user_id_to_staff_code.get(manager_uid) or "") manager_member = code_to_member.get(manager_code, {}) manager = str(manager_member.get("id") or "") @@ -722,17 +737,18 @@ class SyncEhrToOaFormJob(BaseJob): manager = _prefer_non_empty(manager, _cell_value(existing_field_map.get(display_to_code["汇报人"]))) hrbp_show = _prefer_non_empty(hrbp_show, _cell_show_value(existing_field_map.get(display_to_code["HRBP"]))) manager_show = _prefer_non_empty(manager_show, _cell_show_value(existing_field_map.get(display_to_code["汇报人"]))) - # HRBP/汇报人强制走“EHR userId -> 工号 -> OA memberId”链路; - # 不再回退旧值,避免把历史错误的 EHR userId 继续写回 OA 成员字段。 + # HRBP/汇报人优先走“EHR userId -> 工号 -> OA memberId”; + # 若无法映射,保留 OA 现有值,避免写空。 if not hrbp and verbose_trace: logger.warning("HRBP 映射为空:job_no=%s hrbp_uid=%s hrbp_code=%s", job_no, hrbp_uid, hrbp_code) if not manager and verbose_trace: logger.warning("汇报人映射为空:job_no=%s manager_uid=%s manager_code=%s", job_no, manager_uid, manager_code) - # 重新覆盖,取消上面的旧值回退效果 - hrbp = str(hrbp_member.get("id") or "") - manager = str(manager_member.get("id") or "") - hrbp_show = str(hrbp_member.get("name") or hrbp_code) - manager_show = str(manager_member.get("name") or manager_code) + if str(hrbp_member.get("id") or "").strip(): + hrbp = str(hrbp_member.get("id") or "") + hrbp_show = str(hrbp_member.get("name") or hrbp_code) + if str(manager_member.get("id") or "").strip(): + manager = str(manager_member.get("id") or "") + manager_show = str(manager_member.get("name") or manager_code) is_leaving = _prefer_non_empty(is_leaving, _cell_value(existing_field_map.get(display_to_code["在离职"]))) domain_account = _prefer_non_empty(domain_account, _cell_value(existing_field_map.get(display_to_code["域账号"])))