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})")
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
# 根据状态统计
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,10 +640,12 @@ class EmployeeSyncService:
try:
# 创建用户
user = await self.create_user(employee)
user, status = await self.create_user(employee)
if not user:
continue
# 只有真正创建的才计入新增
if status == 'created':
stats['added_count'] += 1
stats['added_users'].append({
'full_name': user.full_name,

View File

@@ -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 || '同步失败')
}