package com.ruoyi.system.service.impl; import java.util.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.entity.SysDept; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.system.domain.UserSyncDTO; import com.ruoyi.system.mapper.SysDeptMapper; import com.ruoyi.system.mapper.SysUserMapper; import com.ruoyi.system.service.IUserSyncService; import com.ruoyi.system.service.IUserSyncDataService; /** * 用户同步Service业务层处理 * * 职责:接收用户数据,写入 MySQL 数据库 * 数据来源: * 1. 内部查询:调用 IUserSyncDataService 从 SQL Server 查询 * 2. 外部传入:接收已查询好的数据 * * @author ruoyi * @date 2025-10-18 */ @Service public class UserSyncServiceImpl implements IUserSyncService { private static final Logger log = LoggerFactory.getLogger(UserSyncServiceImpl.class); @Autowired private SysUserMapper sysUserMapper; @Autowired private SysDeptMapper sysDeptMapper; /** * 同步OA用户数据(使用外部传入的数据源) * * 执行流程: * 1. 接收外部传入的 UserSyncDTO 列表 * 2. 查询 MySQL 中的部门信息(sysDeptMapper 使用默认 MySQL 数据源) * 3. 写入 MySQL 数据库(sysUserMapper 使用默认 MySQL 数据源) * * @param oaUsers 外部传入的OA用户数据列表 * @return 同步结果 */ @Override @Transactional public AjaxResult syncOaUsers(List oaUsers) { try { if (oaUsers == null || oaUsers.isEmpty()) { return AjaxResult.warn("传入的用户数据为空"); } log.info("开始同步 {} 条OA用户数据到 MySQL 数据库...", oaUsers.size()); int createdCount = 0; int updatedCount = 0; int skippedCount = 0; int errorCount = 0; // 处理每一条用户数据 for (UserSyncDTO dto : oaUsers) { try { // 验证必填字段 if (StringUtils.isEmpty(dto.getUserName()) || StringUtils.isEmpty(dto.getNickName())) { log.warn("用户数据不完整,跳过: oaUserId={}", dto.getOaUserId()); skippedCount++; continue; } // 3. 根据 department_id 查找对应的 dept_id(从 MySQL 中查询) Long deptId = null; if (dto.getDepartmentId() != null) { SysDept dept = sysDeptMapper.selectDeptByDepartmentId(dto.getDepartmentId()); if (dept != null) { deptId = dept.getDeptId(); } else { log.warn("未找到对应的部门: departmentId={}, 用户: {}", dto.getDepartmentId(), dto.getUserName()); } } // 4. 检查用户是否已存在(根据oa_user_id) SysUser existingUser = sysUserMapper.selectUserByOaUserId(dto.getOaUserId()); if (existingUser != null) { // 用户已存在,更新信息 updateExistingUser(existingUser, dto, deptId); updatedCount++; log.info("更新用户: {} ({}), oaUserId: {}", dto.getNickName(), dto.getUserName(), dto.getOaUserId()); } else { // 检查用户名是否已被占用 SysUser userByName = sysUserMapper.checkUserNameUnique(dto.getUserName()); if (userByName != null) { // 用户名已存在,更新其oa_user_id userByName.setOaUserId(dto.getOaUserId()); userByName.setNickName(dto.getNickName()); if (deptId != null) { userByName.setDeptId(deptId); } if (StringUtils.isNotEmpty(dto.getEmail())) { userByName.setEmail(dto.getEmail()); } if (StringUtils.isNotEmpty(dto.getPhonenumber())) { userByName.setPhonenumber(dto.getPhonenumber()); } if (StringUtils.isNotEmpty(dto.getSex())) { userByName.setSex(dto.getSex()); } userByName.setUpdateBy("sync"); sysUserMapper.updateUser(userByName); updatedCount++; log.info("更新已存在用户名的用户: {} ({}), 设置oaUserId: {}", dto.getNickName(), dto.getUserName(), dto.getOaUserId()); } else { // 创建新用户 createNewUser(dto, deptId); createdCount++; log.info("创建新用户: {} ({}), oaUserId: {}, deptId: {}", dto.getNickName(), dto.getUserName(), dto.getOaUserId(), deptId); } } } catch (Exception e) { errorCount++; log.error("同步用户失败: oaUserId={}, userName={}, error: {}", dto.getOaUserId(), dto.getUserName(), e.getMessage(), e); } } String message = String.format("同步完成!创建用户: %d, 更新用户: %d, 跳过: %d, 失败: %d", createdCount, updatedCount, skippedCount, errorCount); log.info(message); Map result = new HashMap<>(); result.put("created", createdCount); result.put("updated", updatedCount); result.put("skipped", skippedCount); result.put("error", errorCount); result.put("totalProcessed", oaUsers.size()); return AjaxResult.success(message, result); } catch (Exception e) { log.error("同步用户数据失败", e); return AjaxResult.error("同步失败: " + e.getMessage()); } } /** * 更新已存在的用户 */ private void updateExistingUser(SysUser existingUser, UserSyncDTO dto, Long deptId) { existingUser.setNickName(dto.getNickName()); if (deptId != null) { existingUser.setDeptId(deptId); } if (StringUtils.isNotEmpty(dto.getEmail())) { existingUser.setEmail(dto.getEmail()); } if (StringUtils.isNotEmpty(dto.getPhonenumber())) { existingUser.setPhonenumber(dto.getPhonenumber()); } if (StringUtils.isNotEmpty(dto.getSex())) { existingUser.setSex(dto.getSex()); } existingUser.setUpdateBy("sync"); sysUserMapper.updateUser(existingUser); } /** * 创建新用户 */ private void createNewUser(UserSyncDTO dto, Long deptId) { SysUser newUser = new SysUser(); newUser.setUserName(dto.getUserName()); newUser.setNickName(dto.getNickName()); newUser.setOaUserId(dto.getOaUserId()); if (deptId != null) { newUser.setDeptId(deptId); } else { // 如果没有部门,默认设置为顶级部门(若依科技) newUser.setDeptId(100L); } if (StringUtils.isNotEmpty(dto.getEmail())) { newUser.setEmail(dto.getEmail()); } if (StringUtils.isNotEmpty(dto.getPhonenumber())) { newUser.setPhonenumber(dto.getPhonenumber()); } if (StringUtils.isNotEmpty(dto.getSex())) { newUser.setSex(dto.getSex()); } else { newUser.setSex("2"); // 默认未知 } // 设置默认密码(123456) newUser.setPassword(SecurityUtils.encryptPassword("123456")); // 设置默认状态为正常 newUser.setStatus("0"); newUser.setCreateBy("sync"); sysUserMapper.insertUser(newUser); } }