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