From a9114c6a45105132356def0c54636030251ebb72 Mon Sep 17 00:00:00 2001 From: Marsway Date: Fri, 27 Mar 2026 14:57:15 +0800 Subject: [PATCH] update --- extensions/sync_ehr_to_oa/job.py | 55 ++++++++++++++++++++++++++++++-- 1 file changed, 53 insertions(+), 2 deletions(-) diff --git a/extensions/sync_ehr_to_oa/job.py b/extensions/sync_ehr_to_oa/job.py index 6449b43..fa26b96 100644 --- a/extensions/sync_ehr_to_oa/job.py +++ b/extensions/sync_ehr_to_oa/job.py @@ -167,6 +167,46 @@ def _extract_staff_code(staff_profile: dict[str, Any]) -> str: return "" +def _extract_mobile_phone(emp_info: dict[str, Any]) -> str: + if not isinstance(emp_info, dict): + return "" + candidate_keys = ( + "mobile", + "mobilePhone", + "phone", + "phoneNumber", + "tel", + "telephone", + "cellphone", + "cellPhone", + "Mobile", + "MobilePhone", + "Phone", + "PhoneNumber", + "Tel", + "Telephone", + "Cellphone", + "CellPhone", + ) + for key in candidate_keys: + raw = emp_info.get(key) + if isinstance(raw, dict): + val = raw.get("value") + if val is None or str(val).strip() == "": + val = raw.get("showValue") + raw = val + s = str(raw or "").strip() + if s: + return s + translate = emp_info.get("translateProperties") + if isinstance(translate, dict): + for key in candidate_keys: + s = str(translate.get(key) or "").strip() + if s: + return s + return "" + + def _pick_best_member_by_code(members: list[dict[str, Any]]) -> dict[str, Any] | None: if not members: return None @@ -262,7 +302,7 @@ class SyncEhrToOaFormJob(BaseJob): 同步字段: - 工号(作为唯一对应关系,不写入) - - 所属公司、姓名、研发属性、工作地点、入职日期、离职日期、身份证号、HRBP、汇报人、在离职、域账号 + - 所属公司、姓名、研发属性、工作地点、入职日期、离职日期、身份证号、手机号、HRBP、汇报人、在离职、域账号 """ job_id = "sync_ehr_to_oa.sync_form" @@ -306,6 +346,7 @@ class SyncEhrToOaFormJob(BaseJob): raise ValueError("secret_cfg.app_key and secret_cfg.app_secret are required") domain_custom_key = str(params.get("domain_account_custom_key") or "").strip() or None + mobile_custom_key = str(params.get("mobile_phone_custom_key") or "").strip() or None verbose_trace = _to_bool_or_none(params.get("verbose_trace")) if verbose_trace is None: verbose_trace = True @@ -506,6 +547,9 @@ class SyncEhrToOaFormJob(BaseJob): entry_date = _date_only(rec.get("entryDate")) leave_date = _date_only(rec.get("lastWorkDate")) id_number = str(emp.get("iDNumber") or "") + mobile_phone = _extract_mobile_phone(emp) + if not mobile_phone and mobile_custom_key: + mobile_phone = _custom_prop_value(emp.get("customProperties"), mobile_custom_key) hrbp_uid = _to_int_safe(rec.get(_EHR_HRBP_ID_KEY) or _custom_prop_value(rec.get("customProperties"), _EHR_HRBP_ID_KEY)) hrbp_code = str(user_id_to_staff_code.get(hrbp_uid) or "") hrbp_member = code_to_member.get(hrbp_code, {}) @@ -521,7 +565,7 @@ 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_id=%s hrbp_show=%s manager_id=%s manager_show=%s is_leaving=%s domain_account=%s", + "EHR 字段预览:job_no=%s company=%s name=%s rd_attr=%s place=%s entry_date=%s leave_date=%s id_number=%s mobile_phone=%s hrbp_id=%s hrbp_show=%s manager_id=%s manager_show=%s is_leaving=%s domain_account=%s", job_no, company, name, @@ -530,6 +574,7 @@ class SyncEhrToOaFormJob(BaseJob): entry_date, leave_date, id_number, + mobile_phone, hrbp, hrbp_show, manager, @@ -596,6 +641,7 @@ class SyncEhrToOaFormJob(BaseJob): "入职日期", "离职日期", "身份证号", + "手机号", "HRBP", "汇报人", "在离职", @@ -746,6 +792,9 @@ class SyncEhrToOaFormJob(BaseJob): entry_date = _date_only(rec.get("entryDate")) leave_date = _date_only(rec.get("lastWorkDate")) id_number = str(emp.get("iDNumber") or "") + mobile_phone = _extract_mobile_phone(emp) + if not mobile_phone and mobile_custom_key: + mobile_phone = _custom_prop_value(emp.get("customProperties"), mobile_custom_key) hrbp_uid = _to_int_safe(rec.get(_EHR_HRBP_ID_KEY) or _custom_prop_value(rec.get("customProperties"), _EHR_HRBP_ID_KEY)) hrbp_code = str(user_id_to_staff_code.get(hrbp_uid) or "") hrbp_member = code_to_member.get(hrbp_code, {}) @@ -803,6 +852,7 @@ class SyncEhrToOaFormJob(BaseJob): # 未离职不填离职日期(保持空),不再回填旧值。 leave_date = str(leave_date or "").strip() id_number = _prefer_non_empty(id_number, _cell_value(existing_field_map.get(display_to_code["身份证号"]))) + mobile_phone = _prefer_non_empty(mobile_phone, _cell_value(existing_field_map.get(display_to_code["手机号"]))) hrbp = _prefer_non_empty(hrbp, _cell_value(existing_field_map.get(display_to_code["HRBP"]))) 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"]))) @@ -830,6 +880,7 @@ class SyncEhrToOaFormJob(BaseJob): {"name": display_to_code["入职日期"], "value": entry_date, "showValue": entry_date}, {"name": display_to_code["离职日期"], "value": leave_date, "showValue": leave_date}, {"name": display_to_code["身份证号"], "value": id_number, "showValue": id_number}, + {"name": display_to_code["手机号"], "value": mobile_phone, "showValue": mobile_phone}, {"name": display_to_code["HRBP"], "value": hrbp, "showValue": hrbp_show}, {"name": display_to_code["汇报人"], "value": manager, "showValue": manager_show}, {"name": display_to_code["在离职"], "value": is_leaving, "showValue": is_leaving},