提交 6cc3bb40 authored 作者: hzh's avatar hzh

Merge branch 'dev'

# Conflicts: # ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysUserImportVo.java
......@@ -109,6 +109,12 @@
<artifactId>ruoyi-api-server</artifactId>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.35</version>
</dependency>
</dependencies>
<build>
......
......@@ -91,7 +91,7 @@ public class SysUserController extends BaseController {
@SaCheckPermission("system:user:import")
@PostMapping(value = "/importData", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public R<Void> importData(@RequestPart("file") MultipartFile file, boolean updateSupport) throws Exception {
ExcelResult<SysUserImportVo> result = ExcelUtil.importExcel(file.getInputStream(), SysUserImportVo.class, new SysUserImportListener(updateSupport));
ExcelResult<SysUserImportVo> result = ExcelUtil.importExcel(file.getInputStream(), SysUserImportVo.class, new SysUserImportListener(false));
return R.ok(result.getAnalysis());
}
......
package org.dromara.system.domain.vo;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
......@@ -8,7 +9,6 @@ import org.dromara.common.excel.convert.ExcelDictConvert;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* 用户对象导出VO
......@@ -26,7 +26,7 @@ public class SysUserExportVo implements Serializable {
/**
* 用户ID
*/
@ExcelProperty(value = "用户序号")
@ExcelIgnore
private Long userId;
/**
......@@ -42,10 +42,16 @@ public class SysUserExportVo implements Serializable {
private String nickName;
/**
* 用户邮箱
* 部门id
*/
@ExcelProperty(value = "用户邮箱")
private String email;
@ExcelIgnore
private Long deptId;
/**
* 归属部门
*/
@ExcelProperty(value = "归属部门")
private String deptName;
/**
* 手机号码
......@@ -53,6 +59,18 @@ public class SysUserExportVo implements Serializable {
@ExcelProperty(value = "手机号码")
private String phonenumber;
/**
* 用户邮箱
*/
@ExcelProperty(value = "用户邮箱")
private String email;
/**
* 身份证号码
*/
@ExcelProperty(value = "身份证")
private String idCard;
/**
* 用户性别
*/
......@@ -67,28 +85,27 @@ public class SysUserExportVo implements Serializable {
@ExcelDictFormat(dictType = "sys_normal_disable")
private String status;
/**
* 最后登录IP
*/
@ExcelProperty(value = "最后登录IP")
private String loginIp;
@ExcelProperty("岗位")
private String postName;
@ExcelProperty("角色")
private String roleName;
/**
* 最后登录时间
* 微信号
*/
@ExcelProperty(value = "最后登录时间")
private Date loginDate;
@ExcelProperty("微信号")
private String wechatId;
/**
* 部门名称
* 微信二维码
*/
@ExcelProperty(value = "部门名称")
private String deptName;
@ExcelProperty("微信二维码")
private Long wechatQrCode;
/**
* 负责人
* 备注
*/
@ExcelProperty(value = "部门负责人")
private String leaderName;
@ExcelProperty("备注")
private String remark;
}
package org.dromara.system.domain.vo;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
......@@ -49,34 +50,34 @@ public class SysUserImportVo implements Serializable {
private String nickName;
/**
* 用户邮箱
* 部门id
*/
@ExcelProperty(value = "用户邮箱")
private String email;
@ExcelIgnore
private Long deptId;
/**
* 手机号码
* 归属部门
*/
@ExcelProperty(value = "手机号码")
private String phonenumber;
@ExcelProperty(value = "归属部门")
private String deptName;
/**
* 身份证号码
* 手机号码
*/
@ExcelProperty(value = "身份证")
private String idCard;
@ExcelProperty(value = "手机号码")
private String phonenumber;
/**
* 微信号
* 用户邮箱
*/
@ExcelProperty(value = "微信号")
private String wechatId;
@ExcelProperty(value = "用户邮箱")
private String email;
/**
* 微信二维
* 身份证号
*/
@ExcelProperty(value = "微信二维码")
private Long wechatQrCode;
@ExcelProperty(value = "身份证")
private String idCard;
/**
* 用户性别
......@@ -92,4 +93,40 @@ public class SysUserImportVo implements Serializable {
@ExcelDictFormat(dictType = "sys_normal_disable")
private String status;
@ExcelProperty("岗位")
private String postName;
/**
* 岗位组
*/
@ExcelIgnore
private Long[] postIds;
@ExcelProperty("角色")
private String roleName;
/**
* 角色组
*/
@ExcelIgnore
private Long[] roleIds;
/**
* 微信号
*/
@ExcelProperty("微信号")
private String wechatId;
/**
* 微信二维码
*/
@ExcelProperty("微信二维码")
private Long wechatQrCode;
/**
* 备注
*/
@ExcelProperty("备注")
private String remark;
}
......@@ -2,6 +2,7 @@ package org.dromara.system.listener;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.digest.BCrypt;
import cn.hutool.http.HtmlUtil;
import com.alibaba.excel.context.AnalysisContext;
......@@ -12,17 +13,19 @@ import lombok.extern.slf4j.Slf4j;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.SpringUtils;
import org.dromara.common.core.utils.StreamUtils;
import org.dromara.common.core.utils.StringUtils;
import org.dromara.common.core.utils.ValidatorUtils;
import org.dromara.common.excel.core.ExcelListener;
import org.dromara.common.excel.core.ExcelResult;
import org.dromara.common.satoken.utils.LoginHelper;
import org.dromara.system.controller.system.SysUserController;
import org.dromara.system.domain.bo.SysUserBo;
import org.dromara.system.domain.vo.SysUserImportVo;
import org.dromara.system.domain.vo.SysUserVo;
import org.dromara.system.service.ISysConfigService;
import org.dromara.system.service.ISysUserService;
import org.dromara.system.service.*;
import java.util.List;
import java.util.Objects;
/**
* 系统用户自定义导入
......@@ -33,6 +36,10 @@ import java.util.List;
public class SysUserImportListener extends AnalysisEventListener<SysUserImportVo> implements ExcelListener<SysUserImportVo> {
private final ISysUserService userService;
private final SysUserController sysUserController;
private final ISysDeptService sysDeptService;
private final ISysPostService sysPostService;
private final ISysRoleService sysRoleService;
private final String password;
......@@ -48,6 +55,10 @@ public class SysUserImportListener extends AnalysisEventListener<SysUserImportVo
public SysUserImportListener(Boolean isUpdateSupport) {
String initPassword = SpringUtils.getBean(ISysConfigService.class).selectConfigByKey("sys.user.initPassword");
this.userService = SpringUtils.getBean(ISysUserService.class);
this.sysUserController = SpringUtils.getBean(SysUserController.class);
this.sysDeptService = SpringUtils.getBean(ISysDeptService.class);
this.sysPostService = SpringUtils.getBean(ISysPostService.class);
this.sysRoleService = SpringUtils.getBean(ISysRoleService.class);
this.password = BCrypt.hashpw(initPassword);
this.isUpdateSupport = isUpdateSupport;
this.operUserId = LoginHelper.getUserId();
......@@ -63,7 +74,20 @@ public class SysUserImportListener extends AnalysisEventListener<SysUserImportVo
ValidatorUtils.validate(user);
user.setPassword(password);
user.setCreateBy(operUserId);
userService.insertUser(user);
//设置部门
if (StringUtils.isNotEmpty(userVo.getDeptName())) {
Long deptId = sysDeptService.selectDeptIdByName(StrUtil.split(userVo.getDeptName(), "/"));
user.setDeptId(deptId);
}
//设置岗位
if (Objects.nonNull(user.getDeptId()) && StringUtils.isNotEmpty(userVo.getPostName())) {
user.setPostIds(sysPostService.selectPostIdsByDeptIdAndName(user.getDeptId(), StrUtil.split(userVo.getPostName(), "/")).toArray(Long[]::new));
}
//设置角色
if (StringUtils.isNotEmpty(userVo.getRoleName())) {
user.setRoleIds(sysRoleService.selectRoleIdsByNameList(StrUtil.split(userVo.getRoleName(), "/")).toArray(Long[]::new));
}
sysUserController.add(user);
successNum++;
successMsg.append("<br/>").append(successNum).append("、账号 ").append(user.getUserName()).append(" 导入成功");
} else if (isUpdateSupport) {
......
......@@ -143,8 +143,17 @@ public interface ISysDeptService {
/**
* 首页部门详情
*
* @param deptId 部门id
* @return
*/
SysDeptDetailVo deptDetailIndex(Long deptId);
/**
* 根据部门名称获取部门id
*
* @param deptNameList 部门名称
* @return 部门id
*/
Long selectDeptIdByName(List<String> deptNameList);
}
......@@ -119,4 +119,13 @@ public interface ISysPostService {
* @return 结果
*/
int updatePost(SysPostBo bo);
/**
* 获取岗位id集合
*
* @param deptId 部门id
* @param postNameList 岗位名称集合
* @return 岗位id集合
*/
List<Long> selectPostIdsByDeptIdAndName(Long deptId, List<String> postNameList);
}
......@@ -195,6 +195,18 @@ public interface ISysRoleService {
*/
int insertAuthUsers(Long roleId, Long[] userIds);
/**
* 根据角色清理在线用户
*
* @param roleId 角色id
*/
void cleanOnlineUserByRole(Long roleId);
/**
* 获取角色Ids
*
* @param roleNameList 角色名称
* @return 角色ids
*/
List<Long> selectRoleIdsByNameList(List<String> roleNameList);
}
......@@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.dromara.common.core.constant.CacheNames;
import org.dromara.common.core.constant.UserConstants;
......@@ -41,6 +42,7 @@ import java.util.stream.Collectors;
*/
@RequiredArgsConstructor
@Service
@Slf4j
public class SysDeptServiceImpl implements ISysDeptService {
private final SysDeptMapper baseMapper;
......@@ -381,4 +383,36 @@ public class SysDeptServiceImpl implements ISysDeptService {
detail.setUserList(users);
return detail;
}
@Override
public Long selectDeptIdByName(List<String> deptNameList) {
if (CollectionUtils.isEmpty(deptNameList)) {
return null;
}
Long parentId = 0L;
Long deptId = null;
SysDeptBo bo = new SysDeptBo();
bo.setStatus(UserConstants.DEPT_NORMAL);
LambdaQueryWrapper<SysDept> lqw = buildQueryWrapper(bo);
lqw.select(SysDept::getDeptId, SysDept::getParentId, SysDept::getDeptName);
List<SysDeptVo> depts = baseMapper.selectDeptList(lqw);
// 逐级查询部门ID
for (String deptName : deptNameList) {
// 根据当前父ID和部门名称查询部门
Long finalDeptId = parentId;
SysDeptVo dept = StreamUtils.findFirst(depts, d -> Objects.equals(finalDeptId, d.getParentId()) && StringUtils.equals(deptName, d.getDeptName()));
if (dept == null) {
// 部门不存在,返回null或抛出异常
log.warn("部门不存在: parentId={}, deptName={}", parentId, deptName);
return null;
}
// 更新父ID为当前部门ID,继续查询下一级
parentId = dept.getDeptId();
deptId = dept.getDeptId();
}
return deptId;
}
}
......@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import lombok.RequiredArgsConstructor;
import org.apache.commons.collections4.CollectionUtils;
import org.dromara.common.core.constant.UserConstants;
import org.dromara.common.core.exception.ServiceException;
import org.dromara.common.core.utils.MapstructUtils;
......@@ -27,6 +28,8 @@ import org.springframework.stereotype.Service;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;
/**
......@@ -241,4 +244,16 @@ public class SysPostServiceImpl implements ISysPostService {
SysPost post = MapstructUtils.convert(bo, SysPost.class);
return baseMapper.updateById(post);
}
@Override
public List<Long> selectPostIdsByDeptIdAndName(Long deptId, List<String> postNameList) {
if (Objects.isNull(deptId) || CollectionUtils.isEmpty(postNameList)) {
return List.of();
}
List<SysPost> postList = baseMapper.selectList(new LambdaQueryWrapper<SysPost>().eq(SysPost::getDeptId, deptId));
return postNameList.stream().map(
pn -> Optional.ofNullable(StreamUtils.findFirst(postList, p -> StringUtils.equals(p.getPostName(), pn))).map(SysPost::getPostId).orElse(null))
.filter(Objects::nonNull).collect(Collectors.toList());
}
}
......@@ -39,6 +39,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import java.util.stream.Collectors;
/**
* 角色 业务层处理
......@@ -517,4 +518,14 @@ public class SysRoleServiceImpl implements ISysRoleService {
}
});
}
@Override
public List<Long> selectRoleIdsByNameList(List<String> roleNameList) {
if (org.apache.commons.collections4.CollectionUtils.isEmpty(roleNameList)) {
return List.of();
}
List<SysRole> roleList = baseMapper.selectList(new LambdaQueryWrapper<SysRole>().select(SysRole::getRoleId, SysRole::getRoleName));
return roleNameList.stream().map(rn -> Optional.ofNullable(StreamUtils.findFirst(roleList, r -> Objects.equals(r.getRoleName(), rn))).map(SysRole::getRoleId).orElse(null))
.filter(Objects::nonNull).collect(Collectors.toList());
}
}
......@@ -4,6 +4,7 @@ import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
......@@ -42,9 +43,8 @@ import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.stream.Collectors;
/**
* 用户 业务层处理
......@@ -86,7 +86,72 @@ public class SysUserServiceImpl implements ISysUserService {
*/
@Override
public List<SysUserExportVo> selectUserExportList(SysUserBo user) {
return baseMapper.selectUserExportList(this.buildQueryWrapper(user));
List<SysUserExportVo> list = baseMapper.selectUserExportList(this.buildQueryWrapper(user));
if (CollectionUtils.isNotEmpty(list)) {
List<Long> userIds = StreamUtils.toList(list, SysUserExportVo::getUserId);
//获取部门信息
List<Long> deptIdList = list.stream().map(SysUserExportVo::getDeptId).filter(Objects::nonNull).distinct().collect(Collectors.toList());
List<SysDept> deptList = new ArrayList<>();
if (CollectionUtils.isNotEmpty(deptIdList)) {
List<SysDept> sysDeptList = deptMapper.selectByIds(deptIdList);
deptIdList = sysDeptList.stream().flatMap(s -> {
List<Long> deptIds = StrUtil.split(s.getAncestors(), ',', -1, true, Convert::toLong);
deptIds.add(s.getDeptId());
return deptIds.stream();
}).distinct().collect(Collectors.toList());
deptList = deptMapper.selectByIds(deptIdList);
}
//获取岗位信息
List<SysUserPost> supList = userPostMapper.selectList(new LambdaQueryWrapper<SysUserPost>().in(SysUserPost::getUserId, userIds));
List<SysPost> postList = new ArrayList<>();
if (CollectionUtils.isNotEmpty(supList)) {
List<Long> postIds = StreamUtils.toList(supList, SysUserPost::getPostId);
postList = postMapper.selectByIds(postIds);
}
//获取角色信息
List<SysUserRole> surList = userRoleMapper.selectList(new LambdaQueryWrapper<SysUserRole>().in(SysUserRole::getUserId, userIds));
List<SysRole> roleList = new ArrayList<>();
if (CollectionUtils.isNotEmpty(supList)) {
List<Long> roleIds = StreamUtils.toList(surList, SysUserRole::getRoleId);
roleList = roleMapper.selectByIds(roleIds);
}
List<SysDept> finalDeptList = deptList;
List<SysPost> finalPostList = postList;
List<SysRole> finalRoleList = roleList;
for (SysUserExportVo export : list) {
//设置部门信息
if (ObjectUtil.isNotNull(export.getDeptId())) {
SysDept sd = StreamUtils.findFirst(deptList, d -> Objects.equals(d.getDeptId(), export.getDeptId()));
if (ObjectUtil.isNotNull(sd)) {
List<Long> deptIds = StrUtil.split(sd.getAncestors(), ',', -1, true, Convert::toLong);
deptIds.add(sd.getDeptId());
export.setDeptName(deptIds.stream().map(deptId -> {
if (Objects.equals(deptId, 0L)) {
return null;
}
return Optional.ofNullable(StreamUtils.findFirst(finalDeptList, d -> Objects.equals(d.getDeptId(), deptId))).map(SysDept::getDeptName).orElse(null);
}).filter(Objects::nonNull).collect(Collectors.joining("/")));
}
}
//设置岗位信息
List<SysUserPost> posts = StreamUtils.filter(supList, sup -> Objects.equals(sup.getUserId(), export.getUserId()));
if (CollectionUtils.isNotEmpty(posts)) {
List<Long> pIds = StreamUtils.toList(posts, SysUserPost::getPostId);
export.setPostName(pIds.stream().map(pid -> {
return Optional.ofNullable(StreamUtils.findFirst(finalPostList, p -> Objects.equals(p.getPostId(), pid))).map(SysPost::getPostName).orElse(null);
}).filter(Objects::nonNull).collect(Collectors.joining("/")));
}
//设置角色信息
List<SysUserRole> roles = StreamUtils.filter(surList, sur -> Objects.equals(sur.getUserId(), export.getUserId()));
if (CollectionUtils.isNotEmpty(roles)) {
List<Long> rIds = StreamUtils.toList(roles, SysUserRole::getRoleId);
export.setRoleName(rIds.stream().map(rid -> {
return Optional.ofNullable(StreamUtils.findFirst(finalRoleList, p -> Objects.equals(p.getRoleId(), rid))).map(SysRole::getRoleName).orElse(null);
}).filter(Objects::nonNull).collect(Collectors.joining("/")));
}
}
}
return list;
}
private Wrapper<SysUser> buildQueryWrapper(SysUserBo user) {
......@@ -162,7 +227,8 @@ public class SysUserServiceImpl implements ISysUserService {
*/
@Override
public SysUserVo selectUserByUserName(String userName) {
return baseMapper.selectVoOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getUserName, userName));
return baseMapper.selectVoOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getUserName, userName)
.eq(SysUser::getUserType, UserType.SYS_USER.getUserType()));
}
/**
......
......@@ -52,8 +52,8 @@
<select id="selectUserExportList" resultMap="SysUserExportResult">
select u.user_id, u.dept_id, u.nick_name, u.user_name, u.email, u.avatar, u.id_card, u.phonenumber, u.sex,
u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark,
d.dept_name, d.leader, u1.user_name as leaderName
u.wechat_id, u.wechat_qr_code, u.dept_id,
u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark
from sys_user u
left join sys_dept d on u.dept_id = d.dept_id
left join sys_user u1 on u1.user_id = d.leader
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论