diff --git a/app/integrations/didi.py b/app/integrations/didi.py index 4ebef44..8313008 100644 --- a/app/integrations/didi.py +++ b/app/integrations/didi.py @@ -246,9 +246,10 @@ class DidiClient(BaseClient): member_id: str | None, employee_number: str | None, legal_entity_id: str, + nickname: str | None = None, ) -> None: """ - 员工修改:更新员工所在公司主体(legal_entity_id) + 员工修改:更新员工所在公司主体(legal_entity_id)/昵称(nickname) POST /river/Member/edit """ if not member_id and not employee_number: @@ -258,7 +259,11 @@ class DidiClient(BaseClient): token = self._get_access_token() ts = int(time.time()) - data_str = self.dumps_data_for_sign({"legal_entity_id": legal_entity_id}) + data_obj: dict[str, Any] = {"legal_entity_id": legal_entity_id} + nickname_v = str(nickname or "").strip() + if nickname_v: + data_obj["nickname"] = nickname_v + data_str = self.dumps_data_for_sign(data_obj) body: dict[str, Any] = { "client_id": self.client_id, "access_token": token, diff --git a/extensions/sync_oa_to_didi/job.py b/extensions/sync_oa_to_didi/job.py index aa71ca3..c290e00 100644 --- a/extensions/sync_oa_to_didi/job.py +++ b/extensions/sync_oa_to_didi/job.py @@ -175,10 +175,10 @@ class SyncOAToDidiExportFormJob(BaseJob): class SyncOAToDidiLegalEntitySyncJob(BaseJob): """ - 从 OA 无流程表单导出中读取“工号/所属公司”,并同步到滴滴: + 从 OA 无流程表单导出中读取“工号/所属公司/受益部门名称”,并同步到滴滴: - 公司主体:GET /river/LegalEntity/get(keyword=name),name 完全相等优先 - 员工查询:GET /river/Member/detail(employee_number=工号) - - 员工更新:POST /river/Member/edit(更新 legal_entity_id) + - 员工更新:POST /river/Member/edit(更新 legal_entity_id + nickname) public_cfg: - oa_base_url: "https://oa.example.com:8090" @@ -260,6 +260,7 @@ class SyncOAToDidiLegalEntitySyncJob(BaseJob): emp_field: str | None = None company_field: str | None = None + benefit_dept_field: str | None = None sync_field: str | None = None for f in fields: if not isinstance(f, dict): @@ -270,10 +271,12 @@ class SyncOAToDidiLegalEntitySyncJob(BaseJob): emp_field = name if display == "所属公司" and name: company_field = name + if display == "受益部门名称" and name: + benefit_dept_field = name if display == "是否同步滴滴" and name: sync_field = name - if not emp_field or not company_field: - raise RuntimeError("OA export invalid: cannot locate fields for 工号/所属公司 in definition.fields") + if not emp_field or not company_field or not benefit_dept_field: + raise RuntimeError("OA export invalid: cannot locate fields for 工号/所属公司/受益部门名称 in definition.fields") rows = form.get("data") or [] if not isinstance(rows, list): @@ -311,12 +314,16 @@ class SyncOAToDidiLegalEntitySyncJob(BaseJob): emp_obj = master.get(emp_field) or {} comp_obj = master.get(company_field) or {} + benefit_dept_obj = master.get(benefit_dept_field) or {} emp_no = "" comp_name = "" + benefit_dept_name = "" if isinstance(emp_obj, dict): emp_no = str(emp_obj.get("value") or emp_obj.get("showValue") or "").strip() if isinstance(comp_obj, dict): comp_name = str(comp_obj.get("value") or comp_obj.get("showValue") or "").strip() + if isinstance(benefit_dept_obj, dict): + benefit_dept_name = str(benefit_dept_obj.get("value") or benefit_dept_obj.get("showValue") or "").strip() if not emp_no or not comp_name: skipped += 1 @@ -336,7 +343,7 @@ class SyncOAToDidiLegalEntitySyncJob(BaseJob): logger.warning("跳过:是否同步滴滴=N employee_number=%s company_name=%s", emp_no, comp_name) continue - logger.info("正在处理:工号=%s 所属公司=%s", emp_no, comp_name) + logger.info("正在处理:工号=%s 所属公司=%s 受益部门名称=%s", emp_no, comp_name, benefit_dept_name) # 公司主体匹配(进程内缓存) legal_entity_id = cache_legal_entity.get(comp_name) @@ -398,11 +405,27 @@ class SyncOAToDidiLegalEntitySyncJob(BaseJob): # 员工更新(按文档要求:连续修改间隔 >=150ms) try: - logger.info("正在更新员工公司主体:member_id=%s legal_entity_id=%s", member_id, legal_entity_id) - didi.edit_member_legal_entity(company_id=company_id, member_id=member_id, employee_number=None, legal_entity_id=legal_entity_id) + logger.info( + "正在更新员工公司主体与昵称:member_id=%s legal_entity_id=%s nickname=%s", + member_id, + legal_entity_id, + benefit_dept_name, + ) + didi.edit_member_legal_entity( + company_id=company_id, + member_id=member_id, + employee_number=None, + legal_entity_id=legal_entity_id, + nickname=benefit_dept_name or None, + ) updated += 1 time.sleep(0.15) - logger.info("同步成功:employee_number=%s legal_entity_id=%s", emp_no, legal_entity_id) + logger.info( + "同步成功:employee_number=%s legal_entity_id=%s nickname=%s", + emp_no, + legal_entity_id, + benefit_dept_name, + ) except Exception as e: # noqa: BLE001 skipped += 1 msg = f"Member.edit failed employee_number={emp_no!r} member_id={member_id!r} err={e!r}"