From 30a9545e0efd213e032aa71eec25d5aa462aeb2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=A3=B7=E5=8F=B6?= <14103883+leaf-phos@user.noreply.gitee.com> Date: Wed, 12 Mar 2025 14:32:43 +0800 Subject: [PATCH] =?UTF-8?q?debug=EF=BC=8C=E7=94=A8=E6=88=B7=E5=AF=BC?= =?UTF-8?q?=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/impl/SysUserServiceImpl.java | 174 ++++++++++-------- 1 file changed, 98 insertions(+), 76 deletions(-) diff --git a/ruoyi-service/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java b/ruoyi-service/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java index 1884c54..96579fc 100644 --- a/ruoyi-service/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java +++ b/ruoyi-service/src/main/java/com/ruoyi/system/service/impl/SysUserServiceImpl.java @@ -1,5 +1,25 @@ package com.ruoyi.system.service.impl; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Objects; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +import javax.validation.Validator; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.core.Authentication; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.support.TransactionTemplate; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + import com.github.pagehelper.PageHelper; import com.ruoyi.common.annotation.DataScope; import com.ruoyi.common.auth.wx.WxAuthService; @@ -38,22 +58,6 @@ import com.ruoyi.yh.logImport.domain.enums.LogImportType; import com.ruoyi.yh.logImport.service.LogImportService; import com.ruoyi.yh.logImportDetail.domain.enums.LogImportDetailType; import com.ruoyi.yh.logImportDetail.service.ILogImportDetailService; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.core.Authentication; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.transaction.support.TransactionTemplate; - -import javax.validation.Validator; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Objects; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; -import java.util.stream.Collectors; /** * 用户 业务层处理 @@ -562,73 +566,91 @@ public class SysUserServiceImpl implements ISysUserService // 获取Security上下文 Authentication auth = SecurityUtils.getAuthentication(); + + // 保存当前请求上下文(如果存在) + ServletRequestAttributes requestAttributes = null; + try { + requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + } catch (Exception e) { + log.debug("无法获取当前请求上下文", e); + } + final ServletRequestAttributes finalRequestAttributes = requestAttributes; // 开始异步导入 scheduledExecutorService.schedule(() -> { - // 设置当前Security上下文 - SecurityUtils.setAuthentication(auth); - - // 查询部门列表 - List deptList = deptService.selectDeptListByNames(CollectionUtils.map(userList, SysUserVO::getDeptName)); - SysDept defaultDept = new SysDept(); - // 查询角色列表 - List roleList = roleService.selectListByNames(CollectionUtils.map(userList, SysUserVO::getRoleName)); - SysRoleVO defaultRole = new SysRoleVO(); - - for (SysUserVO user : userList) { - try { - // 通过手机号验证是否存在这个用户 - SysUser old = this.selectUserByUserNo(user.getUserNo()); - transactionTemplate.execute(status -> { - - // 关联部门 - user.setDeptId(deptList.stream().filter(d -> Objects.equals(d.getDeptName(), user.getDeptName())).findFirst().orElse(defaultDept).getDeptId()); - // 关联角色 - Long roleId = roleList.stream().filter(r -> Objects.equals(r.getRoleName(), user.getRoleName())).findFirst().orElse(defaultRole).getRoleId(); - if (roleId != null) { - user.setRoleIds(new Long[]{roleId}); - } - - if (StringUtils.isNull(old)) { - BeanValidators.validateWithException(validator, ValidGroup.Create.class); - deptService.checkDeptDataScope(user.getDeptId()); - String password = configService.selectConfigByKey("sys.user.initPassword"); - user.setPassword(SecurityUtils.encryptPassword(password)); - user.setCreateBy(operator.getNickName()); - int insert = this.insertUser(user); - ServiceUtil.assertion(insert != 1, "新增用户失败"); - logImportDetailService.addResult(importLog.getLogId(), LogImportDetailType.ADD, user, null, user.getUserId()); - return insert; - } - else if (isUpdateSupport) { - BeanValidators.validateWithException(validator, ValidGroup.Update.class); - checkUserAllowed(old); - user.setUserId(old.getUserId()); - user.setUpdateBy(operator.getNickName()); - int update = this.updateUser(user); - ServiceUtil.assertion(update != 1, "修改用户失败"); - logImportDetailService.addResult(importLog.getLogId(), LogImportDetailType.UPDATE, user, null, user.getUserId()); - return update; - } - else { - String msg = "用户工号为 " + user.getUserNo() + " 的数据已存在"; - logImportDetailService.addResult(importLog.getLogId(), LogImportDetailType.FAIL, user, msg, old.getUserId()); - return 0; - } - }); - } catch (Exception e) { - String msg = "用户工号为 " + user.getUserNo() + " 的数据导入失败:" + e.getMessage(); - log.error(msg, e); - logImportDetailService.addResult(importLog.getLogId(), LogImportDetailType.FAIL, user, msg, null); + try { + // 设置当前Security上下文 + SecurityUtils.setAuthentication(auth); + + // 恢复请求上下文(如果之前保存了) + if (finalRequestAttributes != null) { + RequestContextHolder.setRequestAttributes(finalRequestAttributes, true); } + + // 查询部门列表 + List deptList = deptService.selectDeptListByNames(CollectionUtils.map(userList, SysUserVO::getDeptName)); + SysDept defaultDept = new SysDept(); + // 查询角色列表 + List roleList = roleService.selectListByNames(CollectionUtils.map(userList, SysUserVO::getRoleName)); + SysRoleVO defaultRole = new SysRoleVO(); + + for (SysUserVO user : userList) { + try { + // 通过手机号验证是否存在这个用户 + SysUser old = this.selectUserByUserNo(user.getUserNo()); + transactionTemplate.execute(status -> { + + // 关联部门 + user.setDeptId(deptList.stream().filter(d -> Objects.equals(d.getDeptName(), user.getDeptName())).findFirst().orElse(defaultDept).getDeptId()); + // 关联角色 + Long roleId = roleList.stream().filter(r -> Objects.equals(r.getRoleName(), user.getRoleName())).findFirst().orElse(defaultRole).getRoleId(); + if (roleId != null) { + user.setRoleIds(new Long[]{roleId}); + } + + if (StringUtils.isNull(old)) { + BeanValidators.validateWithException(validator, ValidGroup.Create.class); + deptService.checkDeptDataScope(user.getDeptId()); + String password = configService.selectConfigByKey("sys.user.initPassword"); + user.setPassword(SecurityUtils.encryptPassword(password)); + user.setCreateBy(operator.getNickName()); + int insert = this.insertUser(user); + ServiceUtil.assertion(insert != 1, "新增用户失败"); + logImportDetailService.addResult(importLog.getLogId(), LogImportDetailType.ADD, user, null, user.getUserId()); + return insert; + } + else if (isUpdateSupport) { + BeanValidators.validateWithException(validator, ValidGroup.Update.class); + checkUserAllowed(old); + user.setUserId(old.getUserId()); + user.setUpdateBy(operator.getNickName()); + int update = this.updateUser(user); + ServiceUtil.assertion(update != 1, "修改用户失败"); + logImportDetailService.addResult(importLog.getLogId(), LogImportDetailType.UPDATE, user, null, user.getUserId()); + return update; + } + else { + String msg = "用户工号为 " + user.getUserNo() + " 的数据已存在"; + logImportDetailService.addResult(importLog.getLogId(), LogImportDetailType.FAIL, user, msg, old.getUserId()); + return 0; + } + }); + } catch (Exception e) { + String msg = "用户工号为 " + user.getUserNo() + " 的数据导入失败:" + e.getMessage(); + log.error(msg, e); + logImportDetailService.addResult(importLog.getLogId(), LogImportDetailType.FAIL, user, msg, null); + } + } + + // 修改导入状态为处理完成 + logImportService.updateLogToFinished(importLog.getLogId()); + + } finally { + // 清理请求上下文,避免内存泄漏 + RequestContextHolder.resetRequestAttributes(); } - - // 修改导入状态为处理完成 - logImportService.updateLogToFinished(importLog.getLogId()); - }, 0, TimeUnit.SECONDS); - return userList.size(); }