fix: 修复员工同步统计错误
Some checks failed
continuous-integration/drone/push Build is failing

- create_user 现在返回 (user, status) 元组,区分 created/existing/restored/skipped
- sync_employees 正确统计新增、已存在、恢复、跳过的用户数
- 前端显示更准确的同步结果信息
This commit is contained in:
yuliang_guo
2026-01-31 18:04:27 +08:00
parent 6b7b828854
commit e5dd6f3acb
2 changed files with 41 additions and 22 deletions

View File

@@ -238,7 +238,7 @@ class EmployeeSyncService:
logger.info(f"创建岗位: {position_name} (ID: {position.id})") logger.info(f"创建岗位: {position_name} (ID: {position.id})")
return position 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: 员工数据 employee_data: 员工数据
Returns: Returns:
用户对象或None如果创建失败 (用户对象, 状态): 状态为 'created'/'existing'/'restored'/'skipped'
""" """
phone = employee_data.get('phone') phone = employee_data.get('phone')
full_name = employee_data.get('full_name') full_name = employee_data.get('full_name')
if not phone: if not phone:
logger.warning(f"员工 {full_name} 没有手机号,跳过") logger.warning(f"员工 {full_name} 没有手机号,跳过")
return None return None, 'skipped'
# 检查用户是否已存在(通过手机号,包括已软删除的) # 检查用户是否已存在(通过手机号,包括已软删除的)
stmt = select(User).where(User.phone == phone) stmt = select(User).where(User.phone == phone)
@@ -270,15 +270,15 @@ class EmployeeSyncService:
if dingtalk_id: if dingtalk_id:
existing_user.dingtalk_id = dingtalk_id existing_user.dingtalk_id = dingtalk_id
logger.info(f"恢复软删除用户: {phone} ({full_name})") logger.info(f"恢复软删除用户: {phone} ({full_name})")
return existing_user return existing_user, 'restored'
# 如果用户已存在但没有dingtalk_id则更新 # 如果用户已存在但没有dingtalk_id则更新
dingtalk_id = employee_data.get('dingtalk_id') dingtalk_id = employee_data.get('dingtalk_id')
if dingtalk_id and not existing_user.dingtalk_id: if dingtalk_id and not existing_user.dingtalk_id:
existing_user.dingtalk_id = dingtalk_id existing_user.dingtalk_id = dingtalk_id
logger.info(f"更新用户 {phone} 的钉钉ID: {dingtalk_id}") logger.info(f"更新用户 {phone} 的钉钉ID: {dingtalk_id}")
logger.info(f"用户已存在: {phone} ({full_name})") logger.debug(f"用户已存在: {phone} ({full_name})")
return existing_user return existing_user, 'existing'
# 生成邮箱 # 生成邮箱
email = self.generate_email(phone, employee_data.get('email')) email = self.generate_email(phone, employee_data.get('email'))
@@ -315,7 +315,7 @@ class EmployeeSyncService:
await self.db.flush() await self.db.flush()
logger.info(f"创建用户: {phone} ({full_name}) - 角色: {role}") logger.info(f"创建用户: {phone} ({full_name}) - 角色: {role}")
return user return user, 'created'
async def sync_employees(self) -> Dict[str, Any]: async def sync_employees(self) -> Dict[str, Any]:
""" """
@@ -331,6 +331,8 @@ class EmployeeSyncService:
stats = { stats = {
'total_employees': 0, 'total_employees': 0,
'users_created': 0, 'users_created': 0,
'users_existing': 0,
'users_restored': 0,
'users_skipped': 0, 'users_skipped': 0,
'teams_created': 0, 'teams_created': 0,
'positions_created': 0, 'positions_created': 0,
@@ -351,12 +353,18 @@ class EmployeeSyncService:
for employee in employees: for employee in employees:
try: try:
# 创建用户 # 创建用户
user = await self.create_user(employee) user, status = await self.create_user(employee)
if not user: if not user:
stats['users_skipped'] += 1 stats['users_skipped'] += 1
continue continue
# 根据状态统计
if status == 'created':
stats['users_created'] += 1 stats['users_created'] += 1
elif status == 'existing':
stats['users_existing'] += 1
elif status == 'restored':
stats['users_restored'] += 1
# 创建部门团队 # 创建部门团队
department = employee.get('department') department = employee.get('department')
@@ -419,7 +427,9 @@ class EmployeeSyncService:
logger.info("同步完成统计") logger.info("同步完成统计")
logger.info("=" * 60) logger.info("=" * 60)
logger.info(f"总员工数: {stats['total_employees']}") 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['users_skipped']}")
logger.info(f"耗时: {stats['duration']:.2f}") logger.info(f"耗时: {stats['duration']:.2f}")
@@ -630,10 +640,12 @@ class EmployeeSyncService:
try: try:
# 创建用户 # 创建用户
user = await self.create_user(employee) user, status = await self.create_user(employee)
if not user: if not user:
continue continue
# 只有真正创建的才计入新增
if status == 'created':
stats['added_count'] += 1 stats['added_count'] += 1
stats['added_users'].append({ stats['added_users'].append({
'full_name': user.full_name, 'full_name': user.full_name,

View File

@@ -345,11 +345,18 @@ const triggerSync = async () => {
const response = await request.post('/api/v1/employee-sync/sync') const response = await request.post('/api/v1/employee-sync/sync')
if (response.success) { if (response.success) {
const data = response.data const data = response.data
ElMessage.success( const created = data.users_created || 0
`同步完成!共处理 ${data.total_employees || 0} 名员工,` + const existing = data.users_existing || 0
`创建 ${data.users_created || 0} 个账号,` + const restored = data.users_restored || 0
`跳过 ${data.users_skipped || 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 { } else {
ElMessage.error(response.message || '同步失败') ElMessage.error(response.message || '同步失败')
} }