This commit is contained in:
Marsway 2026-03-26 13:40:41 +08:00
parent e3dfec1b4b
commit 2e55fd43ca
1 changed files with 31 additions and 15 deletions

View File

@ -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: def _extract_staff_code(staff_profile: dict[str, Any]) -> str:
if not isinstance(staff_profile, dict): if not isinstance(staff_profile, dict):
return "" return ""
return str( for key in (
staff_profile.get("staffCode") "staffCode",
or staff_profile.get("StaffCode") "StaffCode",
or staff_profile.get("code") "code",
or staff_profile.get("Code") "Code",
or staff_profile.get("employeeNo") "jobNumber",
or "" "JobNumber",
).strip() "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: 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 = str(hrbp_member.get("id") or "")
hrbp_show = str(hrbp_member.get("name") or hrbp_code) hrbp_show = str(hrbp_member.get("name") or hrbp_code)
manager_uid = _extract_reporting_user_id(staff_profile_by_user_id.get(user_id, {})) 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_code = str(user_id_to_staff_code.get(manager_uid) or "")
manager_member = code_to_member.get(manager_code, {}) manager_member = code_to_member.get(manager_code, {})
manager = str(manager_member.get("id") or "") manager = str(manager_member.get("id") or "")
@ -703,6 +716,8 @@ class SyncEhrToOaFormJob(BaseJob):
hrbp = str(hrbp_member.get("id") or "") hrbp = str(hrbp_member.get("id") or "")
hrbp_show = str(hrbp_member.get("name") or hrbp_code) hrbp_show = str(hrbp_member.get("name") or hrbp_code)
manager_uid = _extract_reporting_user_id(staff_profile_by_user_id.get(user_id, {})) 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_code = str(user_id_to_staff_code.get(manager_uid) or "")
manager_member = code_to_member.get(manager_code, {}) manager_member = code_to_member.get(manager_code, {})
manager = str(manager_member.get("id") or "") 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["汇报人"]))) 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"]))) 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["汇报人"]))) manager_show = _prefer_non_empty(manager_show, _cell_show_value(existing_field_map.get(display_to_code["汇报人"])))
# HRBP/汇报人强制走“EHR userId -> 工号 -> OA memberId”链路 # HRBP/汇报人优先走“EHR userId -> 工号 -> OA memberId”
# 不再回退旧值,避免把历史错误的 EHR userId 继续写回 OA 成员字段 # 若无法映射,保留 OA 现有值,避免写空
if not hrbp and verbose_trace: if not hrbp and verbose_trace:
logger.warning("HRBP 映射为空job_no=%s hrbp_uid=%s hrbp_code=%s", job_no, hrbp_uid, hrbp_code) logger.warning("HRBP 映射为空job_no=%s hrbp_uid=%s hrbp_code=%s", job_no, hrbp_uid, hrbp_code)
if not manager and verbose_trace: if not manager and verbose_trace:
logger.warning("汇报人映射为空job_no=%s manager_uid=%s manager_code=%s", job_no, manager_uid, manager_code) logger.warning("汇报人映射为空job_no=%s manager_uid=%s manager_code=%s", job_no, manager_uid, manager_code)
# 重新覆盖,取消上面的旧值回退效果 if str(hrbp_member.get("id") or "").strip():
hrbp = str(hrbp_member.get("id") or "") hrbp = str(hrbp_member.get("id") or "")
manager = str(manager_member.get("id") or "") hrbp_show = str(hrbp_member.get("name") or hrbp_code)
hrbp_show = str(hrbp_member.get("name") or hrbp_code) if str(manager_member.get("id") or "").strip():
manager_show = str(manager_member.get("name") or manager_code) 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["在离职"]))) 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["域账号"]))) domain_account = _prefer_non_empty(domain_account, _cell_value(existing_field_map.get(display_to_code["域账号"])))