from redis.asyncio import Redis from app.api.v1.module_system.auth.schema import AuthSchema from app.core.logger import log from app.plugin.module_payment.employee.schema import EmployeeCreateOrUpdateSchema from app.plugin.module_payment.employee.service import EmployeeService from ..schemas import EmployeeChangeContent from ..enums import EmployeeActionEnum from .base_handler import BaseHandler class EmployeeHandler(BaseHandler[dict]): """员工变更通知处理器""" async def update_employee(self, data: EmployeeChangeContent, auth: AuthSchema): """更新员工信息""" update_data = EmployeeCreateOrUpdateSchema( enterprise_id=data.enterprise_id, employee_id=data.employee_id, employee_name=data.employee_name, employee_mobile=data.mobile, status=data.activate, employee_email=data.email, identity_open_id=data.open_id, department_list=data.department_list, role_list=data.role_list, ) await EmployeeService.update_employee_from_alipay(auth, update_data) async def handle(self, method: str, content: dict, auth: AuthSchema, redis: Redis) -> bool: """ 处理员工变更通知 动作类型: - EMPLOYEE_ADD: 员工新增 - EMPLOYEE_ACTIVATE: 员工激活 - EMPLOYEE_UPDATE: 员工信息修改 - EMPLOYEE_DEPARTMENT_CHANGE: 部门修改 - EMPLOYEE_ROLE_CHANGE: 角色修改 - EMPLOYEE_DELETE: 员工删除 """ try: notify_data = EmployeeChangeContent(**content) except Exception as e: log.error(f"解析员工通知内容失败: {e}") return False action = notify_data.action employee_id = notify_data.employee_id log.info(f"处理员工变更通知: action={action}, employee_id={employee_id}") try: if action == EmployeeActionEnum.EMPLOYEE_ADD.value: return await self._handle_add(notify_data, auth) elif action == EmployeeActionEnum.EMPLOYEE_ACTIVATE.value: return await self._handle_activate(notify_data, auth) elif action == EmployeeActionEnum.EMPLOYEE_UPDATE.value: return await self._handle_update(notify_data, auth) elif action == EmployeeActionEnum.EMPLOYEE_DEPARTMENT_CHANGE.value: return await self._handle_department_change(notify_data, auth) elif action == EmployeeActionEnum.EMPLOYEE_ROLE_CHANGE.value: return await self._handle_role_change(notify_data, auth) elif action == EmployeeActionEnum.EMPLOYEE_DELETE.value: return await self._handle_delete(notify_data, auth) else: log.warning(f"未知的员工变更动作: {action}") return True except Exception as e: log.error(f"支付宝通知消息 - 处理员工变更通知消息异常: {e}") return False async def _get_department_ids(self, data: EmployeeChangeContent) -> list[str]: """从通知数据中提取部门ID列表""" dept_list = data.department_list or [] return [ (d.get("department_id") or "") for d in dept_list if isinstance(d, dict) and d.get("department_id") ] async def _handle_add(self, data: EmployeeChangeContent, auth: AuthSchema) -> bool: """处理员工新增(未激活,不触发额度联动)""" log.info(f"员工新增: employee_id={data.employee_id}, enterprise_id={data.enterprise_id}") await self.update_employee(data, auth) return True async def _handle_activate(self, data: EmployeeChangeContent, auth: AuthSchema) -> bool: """处理员工激活""" log.info(f"员工激活: employee_id={data.employee_id}") await self.update_employee(data, auth) # 联动:员工激活时,同步到部门制度额度 dept_ids = await self._get_department_ids(data) if dept_ids: from app.plugin.module_payment.expense.institution.scope_sync import sync_employee_add_to_department_institutions await sync_employee_add_to_department_institutions( auth=auth, enterprise_id=data.enterprise_id, employee_id=data.employee_id, department_ids=dept_ids, ) return True async def _handle_update(self, data: EmployeeChangeContent, auth: AuthSchema) -> bool: """处理员工信息修改""" log.info(f"员工信息修改: employee_id={data.employee_id}") await self.update_employee(data, auth) return True async def _handle_department_change(self, data: EmployeeChangeContent, auth: AuthSchema) -> bool: """处理部门修改""" log.info(f"部门修改: employee_id={data.employee_id}") await self.update_employee(data, auth) # 联动:员工调部门时,重新同步额度 dept_ids = await self._get_department_ids(data) if dept_ids: from app.plugin.module_payment.expense.institution.scope_sync import sync_employee_add_to_department_institutions await sync_employee_add_to_department_institutions( auth=auth, enterprise_id=data.enterprise_id, employee_id=data.employee_id, department_ids=dept_ids, ) return True async def _handle_role_change(self, data: EmployeeChangeContent, auth: AuthSchema) -> bool: """处理角色修改""" log.info(f"角色修改: employee_id={data.employee_id}") await self.update_employee(data, auth) return True async def _handle_delete(self, data: EmployeeChangeContent, auth: AuthSchema) -> bool: """处理员工删除""" log.info(f"员工删除: employee_id={data.employee_id}") # await self.update_employee(data, auth) return True