- create_user 现在返回 (user, status) 元组,区分 created/existing/restored/skipped - sync_employees 正确统计新增、已存在、恢复、跳过的用户数 - 前端显示更准确的同步结果信息
This commit is contained in:
@@ -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')
|
||||
|
||||
@@ -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 || '同步失败')
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user