From 2c86a8bd60deed0dd0e044bad6fb83f75d19a332 Mon Sep 17 00:00:00 2001
From: wlzboy <66905212@qq.com>
Date: 星期日, 26 十月 2025 15:05:50 +0800
Subject: [PATCH] Merge branch 'feature-task'

---
 ruoyi-system/src/main/java/com/ruoyi/system/service/impl/UserSyncServiceImpl.java |  282 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 282 insertions(+), 0 deletions(-)

diff --git a/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/UserSyncServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/UserSyncServiceImpl.java
new file mode 100644
index 0000000..c82a875
--- /dev/null
+++ b/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/UserSyncServiceImpl.java
@@ -0,0 +1,282 @@
+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 涓殑閮ㄩ棬淇℃伅锛坰ysDeptMapper 浣跨敤榛樿 MySQL 鏁版嵁婧愶級
+     * 3. 鍐欏叆 MySQL 鏁版嵁搴擄紙sysUserMapper 浣跨敤榛樿 MySQL 鏁版嵁婧愶級
+     * 
+     * @param oaUsers 澶栭儴浼犲叆鐨凮A鐢ㄦ埛鏁版嵁鍒楄〃
+     * @return 鍚屾缁撴灉
+     */
+    @Override
+    @Transactional
+    public AjaxResult syncOaUsers(List<UserSyncDTO> oaUsers)
+    {
+        try
+        {
+            if (oaUsers == null || oaUsers.isEmpty())
+            {
+                return AjaxResult.warn("浼犲叆鐨勭敤鎴锋暟鎹负绌�");
+            }
+            
+            log.info("寮�濮嬪悓姝� {} 鏉A鐢ㄦ埛鏁版嵁鍒� 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. 妫�鏌ョ敤鎴锋槸鍚﹀凡瀛樺湪锛堟牴鎹畂a_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<String, Object> 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()))
+        {
+            // 鏍¢獙鎵嬫満鍙锋槸鍚﹀凡琚叾浠栫敤鎴蜂娇鐢紙鎺掗櫎鑷繁锛�
+            SysUser phoneCheck = sysUserMapper.checkPhoneUnique(dto.getPhonenumber());
+            if (StringUtils.isNotNull(phoneCheck) && !phoneCheck.getUserId().equals(existingUser.getUserId()))
+            {
+                log.warn("鏇存柊鐢ㄦ埛 {} 澶辫触锛屾墜鏈哄彿 {} 宸茶鐢ㄦ埛 {} 浣跨敤锛岃烦杩囨墜鏈哄彿鏇存柊", 
+                    existingUser.getUserName(), dto.getPhonenumber(), phoneCheck.getUserName());
+            }
+            else
+            {
+                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()))
+        {
+            // 鏍¢獙鎵嬫満鍙锋槸鍚﹀凡琚叾浠栫敤鎴蜂娇鐢�
+            SysUser phoneCheck = sysUserMapper.checkPhoneUnique(dto.getPhonenumber());
+            if (StringUtils.isNotNull(phoneCheck))
+            {
+                log.warn("鍒涘缓鐢ㄦ埛澶辫触锛屾墜鏈哄彿 {} 宸茶鐢ㄦ埛 {} 浣跨敤锛岃烦杩囩敤鎴� {}", 
+                    dto.getPhonenumber(), phoneCheck.getUserName(), dto.getUserName());
+                return; // 璺宠繃鍒涘缓
+            }
+            newUser.setPhonenumber(dto.getPhonenumber());
+        }
+        
+        if (StringUtils.isNotEmpty(dto.getSex()))
+        {
+            newUser.setSex(dto.getSex());
+        }
+        else
+        {
+            newUser.setSex("2"); // 榛樿鏈煡
+        }
+        
+        // 璁剧疆榛樿瀵嗙爜锛�123456锛�
+        newUser.setPassword(SecurityUtils.encryptPassword("123456"));
+        
+        // 璁剧疆榛樿鐘舵�佷负姝e父
+        newUser.setStatus("0");
+        
+        newUser.setCreateBy("sync");
+        
+        sysUserMapper.insertUser(newUser);
+    }
+}

--
Gitblit v1.9.1