diff --git a/backend/app/services/employee_sync_service.py b/backend/app/services/employee_sync_service.py index 8d6109a..0c04336 100644 --- a/backend/app/services/employee_sync_service.py +++ b/backend/app/services/employee_sync_service.py @@ -238,7 +238,7 @@ class EmployeeSyncService: logger.info(f"创建岗位: {position_name} (ID: {position.id})") return position - async def create_user(self, employee_data: Dict[str, Any]) -> Optional[User]: + async def create_user(self, employee_data: Dict[str, Any]) -> Tuple[Optional[User], str]: """ 创建用户 @@ -246,14 +246,14 @@ class EmployeeSyncService: employee_data: 员工数据 Returns: - 用户对象或None(如果创建失败) + (用户对象, 状态): 状态为 'created'/'existing'/'restored'/'skipped' """ phone = employee_data.get('phone') full_name = employee_data.get('full_name') if not phone: logger.warning(f"员工 {full_name} 没有手机号,跳过") - return None + return None, 'skipped' # 检查用户是否已存在(通过手机号,包括已软删除的) stmt = select(User).where(User.phone == phone) @@ -270,15 +270,15 @@ class EmployeeSyncService: if dingtalk_id: existing_user.dingtalk_id = dingtalk_id logger.info(f"恢复软删除用户: {phone} ({full_name})") - return existing_user + return existing_user, 'restored' # 如果用户已存在但没有dingtalk_id,则更新 dingtalk_id = employee_data.get('dingtalk_id') if dingtalk_id and not existing_user.dingtalk_id: existing_user.dingtalk_id = dingtalk_id logger.info(f"更新用户 {phone} 的钉钉ID: {dingtalk_id}") - logger.info(f"用户已存在: {phone} ({full_name})") - return existing_user + logger.debug(f"用户已存在: {phone} ({full_name})") + return existing_user, 'existing' # 生成邮箱 email = self.generate_email(phone, employee_data.get('email')) @@ -315,7 +315,7 @@ class EmployeeSyncService: await self.db.flush() logger.info(f"创建用户: {phone} ({full_name}) - 角色: {role}") - return user + return user, 'created' async def sync_employees(self) -> Dict[str, Any]: """ @@ -331,6 +331,8 @@ class EmployeeSyncService: stats = { 'total_employees': 0, 'users_created': 0, + 'users_existing': 0, + 'users_restored': 0, 'users_skipped': 0, 'teams_created': 0, 'positions_created': 0, @@ -351,12 +353,18 @@ class EmployeeSyncService: for employee in employees: try: # 创建用户 - user = await self.create_user(employee) + user, status = await self.create_user(employee) if not user: stats['users_skipped'] += 1 continue - stats['users_created'] += 1 + # 根据状态统计 + if status == 'created': + stats['users_created'] += 1 + elif status == 'existing': + stats['users_existing'] += 1 + elif status == 'restored': + stats['users_restored'] += 1 # 创建部门团队 department = employee.get('department') @@ -419,7 +427,9 @@ class EmployeeSyncService: logger.info("同步完成统计") logger.info("=" * 60) logger.info(f"总员工数: {stats['total_employees']}") - logger.info(f"创建用户: {stats['users_created']}") + logger.info(f"新增用户: {stats['users_created']}") + logger.info(f"已存在用户: {stats['users_existing']}") + logger.info(f"恢复用户: {stats['users_restored']}") logger.info(f"跳过用户: {stats['users_skipped']}") logger.info(f"耗时: {stats['duration']:.2f}秒") @@ -630,16 +640,18 @@ class EmployeeSyncService: try: # 创建用户 - user = await self.create_user(employee) + user, status = await self.create_user(employee) if not user: continue - stats['added_count'] += 1 - stats['added_users'].append({ - 'full_name': user.full_name, - 'phone': user.phone, - 'role': user.role - }) + # 只有真正创建的才计入新增 + if status == 'created': + stats['added_count'] += 1 + stats['added_users'].append({ + 'full_name': user.full_name, + 'phone': user.phone, + 'role': user.role + }) # 创建部门团队 department = employee.get('department') diff --git a/frontend/src/views/admin/system-settings.vue b/frontend/src/views/admin/system-settings.vue index 04d7976..d01795a 100644 --- a/frontend/src/views/admin/system-settings.vue +++ b/frontend/src/views/admin/system-settings.vue @@ -345,11 +345,18 @@ const triggerSync = async () => { const response = await request.post('/api/v1/employee-sync/sync') if (response.success) { const data = response.data - ElMessage.success( - `同步完成!共处理 ${data.total_employees || 0} 名员工,` + - `创建 ${data.users_created || 0} 个账号,` + - `跳过 ${data.users_skipped || 0} 个` - ) + const created = data.users_created || 0 + const existing = data.users_existing || 0 + const restored = data.users_restored || 0 + const skipped = data.users_skipped || 0 + + let msg = `同步完成!共处理 ${data.total_employees || 0} 名员工` + if (created > 0) msg += `,新增 ${created} 人` + if (existing > 0) msg += `,已存在 ${existing} 人` + if (restored > 0) msg += `,恢复 ${restored} 人` + if (skipped > 0) msg += `,跳过 ${skipped} 人` + + ElMessage.success(msg) } else { ElMessage.error(response.message || '同步失败') }