Commit 7519c2ef authored by 施翔轲's avatar 施翔轲

更新用户管理导入模板、修复批量导入用户bug

parent 53cb5e9b
......@@ -5,11 +5,11 @@ import cn.hutool.core.io.FileUtil;
import com.dsk.common.annotation.Log;
import com.dsk.common.core.controller.BaseController;
import com.dsk.common.core.domain.R;
import com.dsk.system.domain.SysUser;
import com.dsk.common.enums.BusinessType;
import com.dsk.common.helper.LoginHelper;
import com.dsk.common.utils.StringUtils;
import com.dsk.common.utils.file.MimeTypeUtils;
import com.dsk.system.domain.SysUser;
import com.dsk.system.domain.vo.SysOssVo;
import com.dsk.system.service.ISysOssService;
import com.dsk.system.service.ISysUserService;
......
......@@ -7,6 +7,7 @@ import cn.hutool.core.lang.tree.Tree;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ObjectUtil;
import com.dsk.common.annotation.Log;
import com.dsk.common.constant.GlobalConstants;
import com.dsk.common.core.controller.BaseController;
import com.dsk.common.core.domain.PageQuery;
import com.dsk.common.core.domain.R;
......@@ -17,6 +18,7 @@ import com.dsk.common.helper.LoginHelper;
import com.dsk.common.utils.StreamUtils;
import com.dsk.common.utils.StringUtils;
import com.dsk.common.utils.poi.ExcelUtil;
import com.dsk.common.utils.redis.RedisUtils;
import com.dsk.system.domain.SysDept;
import com.dsk.system.domain.SysRole;
import com.dsk.system.domain.SysUser;
......@@ -84,6 +86,18 @@ public class SysUserController extends BaseController {
ExcelUtil.exportExcel(listVo, "用户数据", SysUserExportVo.class, response);
}
/**
* 获取批量导入用户失败列表
*/
@Log(title = "用户管理", businessType = BusinessType.EXPORT)
@SaCheckPermission("system:user:export")
@PostMapping("/exportFailUsers")
public void exportFailUsers(HttpServletResponse response) {
String key = GlobalConstants.BATCH_IMPORT_FAIL_USERS + LoginHelper.getUserId();
ExcelUtil.exportExcel(RedisUtils.getCacheList(key), "用户数据", SysUserImportVo.class, response);
RedisUtils.deleteObject(key);
}
/**
* 导入数据
*
......@@ -93,8 +107,14 @@ public class SysUserController extends BaseController {
@Log(title = "用户管理", businessType = BusinessType.IMPORT)
@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 {
public R<List<SysUserImportVo>> importData(@RequestPart("file") MultipartFile file, boolean updateSupport) throws Exception {
ExcelResult<SysUserImportVo> result = ExcelUtil.importExcel(file.getInputStream(), SysUserImportVo.class, new SysUserImportListener(updateSupport));
List<SysUserImportVo> resultList = result.getList();
if (ObjectUtil.isNotNull(resultList)) {
String key = GlobalConstants.BATCH_IMPORT_FAIL_USERS + LoginHelper.getUserId();
RedisUtils.setCacheList(key, resultList);
return R.fail(resultList);
}
return R.ok(result.getAnalysis());
}
......@@ -103,7 +123,9 @@ public class SysUserController extends BaseController {
*/
@PostMapping("/importTemplate")
public void importTemplate(HttpServletResponse response) {
ExcelUtil.exportExcel(new ArrayList<>(), "用户数据", SysUserImportVo.class, response);
List<Object> list = new ArrayList<>();
list.add(new SysUserImportVo("测试部门", "测试用户昵称", "18888888888", "测试角色"));
ExcelUtil.exportTemplate(list, "用户数据", "excel/userImportTemplate.xlsx", response);
}
/**
......@@ -135,9 +157,7 @@ public class SysUserController extends BaseController {
@Log(title = "用户管理", businessType = BusinessType.INSERT)
@PostMapping
public R<Void> add(@Validated @RequestBody SysUser user) {
if (!userService.checkUserNameUnique(user)) {
return R.fail("新增用户'" + user.getUserName() + "'失败,登录账号已存在");
} else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) {
if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) {
return R.fail("新增用户'" + user.getUserName() + "'失败,手机号码已存在");
} else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user)) {
return R.fail("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在");
......
......@@ -43,4 +43,9 @@ public interface GlobalConstants {
*/
String PHONE_DEFAULT_TENANT = GLOBAL_REDIS_KEY + "phone_default_tenant:";
/**
* 批量导入用户失败集合
*/
String BATCH_IMPORT_FAIL_USERS = GLOBAL_REDIS_KEY + "batch_import_fail_users";
}
......@@ -2,25 +2,14 @@ package com.dsk.system.domain.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import com.dsk.common.annotation.ExcelDictFormat;
import com.dsk.common.convert.ExcelDictConvert;
import com.dsk.common.tenant.core.TenantEntity;
import com.dsk.system.domain.SysDept;
import com.dsk.system.domain.SysTenantPackage;
import com.sun.org.apache.xpath.internal.operations.Bool;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import java.io.Serializable;
import java.util.Date;
/**
* 部门表 sys_dept
......@@ -105,4 +94,10 @@ public class SysDeptVo implements Serializable {
@ExcelProperty(value = "该部门是否存在用户", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "true=存在,false=删除")
private Boolean existUsers;
/**
* 创建时间
*/
@ExcelProperty(value = "创建时间")
private Date createTime;
}
......@@ -9,7 +9,6 @@ import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
* @author sxk
......@@ -35,4 +34,10 @@ public class SysTenantPackageSelectVo implements Serializable {
@ExcelProperty(value = "套餐名称")
private String packageName;
/**
* 状态(0正常 1停用)
*/
@ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "0=正常,1=停用")
private String status;
}
package com.dsk.system.domain.vo;
import com.alibaba.excel.annotation.ExcelProperty;
import com.dsk.common.annotation.ExcelDictFormat;
import com.dsk.common.convert.ExcelDictConvert;
import lombok.Data;
import lombok.NoArgsConstructor;
......@@ -18,38 +16,21 @@ import java.io.Serializable;
@NoArgsConstructor
// @Accessors(chain = true) // 导入不允许使用 会找不到set方法
public class SysUserImportVo implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 用户ID
*/
@ExcelProperty(value = "用户序号")
private Long userId;
/**
* 部门ID
*/
@ExcelProperty(value = "部门编号")
private Long deptId;
//如需修改以下字段,需同步修改
private static final long serialVersionUID = 1L;
/**
* 用户账号
* 所属部门
*/
@ExcelProperty(value = "登录名称")
private String userName;
private String deptName;
/**
* 用户昵称
*/
@ExcelProperty(value = "用户称")
@ExcelProperty(value = "用户称")
private String nickName;
/**
* 用户邮箱
*/
@ExcelProperty(value = "用户邮箱")
private String email;
/**
* 手机号码
*/
......@@ -57,17 +38,21 @@ public class SysUserImportVo implements Serializable {
private String phonenumber;
/**
* 用户性别
* 用户角色
*/
@ExcelProperty(value = "用户性别", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "sys_user_sex")
private String sex;
@ExcelProperty(value = "用户角色")
private String roleName;
/**
* 帐号状态(0正常 1停用)
* 失败原因
* 该字段无需同步到模板中
*/
@ExcelProperty(value = "帐号状态", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "sys_normal_disable")
private String status;
private String failReason;
public SysUserImportVo(String deptName, String nickName, String phonenumber, String roleName) {
this.deptName = deptName.replace(" ", "");
this.nickName = nickName.replace(" ", "");
this.phonenumber = phonenumber;
this.roleName = roleName.replace(" ", "");
}
}
......@@ -5,18 +5,23 @@ import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.dsk.system.domain.vo.SysUserImportVo;
import com.dsk.system.domain.SysUser;
import com.dsk.common.excel.ExcelListener;
import com.dsk.common.excel.ExcelResult;
import com.dsk.common.exception.ServiceException;
import com.dsk.common.helper.LoginHelper;
import com.dsk.common.utils.ValidatorUtils;
import com.dsk.common.utils.spring.SpringUtils;
import com.dsk.system.domain.SysDept;
import com.dsk.system.domain.SysRole;
import com.dsk.system.domain.SysUser;
import com.dsk.system.domain.vo.SysUserImportVo;
import com.dsk.system.service.ISysConfigService;
import com.dsk.system.service.ISysDeptService;
import com.dsk.system.service.ISysRoleService;
import com.dsk.system.service.ISysUserService;
import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList;
import java.util.List;
/**
......@@ -28,13 +33,15 @@ import java.util.List;
public class SysUserImportListener extends AnalysisEventListener<SysUserImportVo> implements ExcelListener<SysUserImportVo> {
private final ISysUserService userService;
private final ISysDeptService deptService;
private final ISysRoleService roleService;
private final String password;
private final Boolean isUpdateSupport;
private final String operName;
private ArrayList<SysUserImportVo> resultList = new ArrayList<>();
private int successNum = 0;
private int failureNum = 0;
private final StringBuilder successMsg = new StringBuilder();
......@@ -43,6 +50,8 @@ 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.deptService = SpringUtils.getBean(ISysDeptService.class);
this.roleService = SpringUtils.getBean(ISysRoleService.class);
this.password = BCrypt.hashpw(initPassword);
this.isUpdateSupport = isUpdateSupport;
this.operName = LoginHelper.getUsername();
......@@ -50,13 +59,25 @@ public class SysUserImportListener extends AnalysisEventListener<SysUserImportVo
@Override
public void invoke(SysUserImportVo userVo, AnalysisContext context) {
SysUser user = this.userService.selectUserByUserName(userVo.getUserName());
SysUser user = this.userService.selectUserByPhonenumber(userVo.getPhonenumber());
SysDept dept = this.deptService.selectDeptByDeptName(userVo.getDeptName());
SysRole role = this.roleService.selectRoleByRoleName(userVo.getRoleName());
try {
if (ObjectUtil.isNull(dept)) {
throw new ServiceException("部门不存在");
}
if (ObjectUtil.isNull(role)) {
throw new ServiceException("角色不存在");
}
// 验证是否存在这个用户
if (ObjectUtil.isNull(user)) {
user = BeanUtil.toBean(userVo, SysUser.class);
user.setUserName(userVo.getPhonenumber());
user.setDeptId(dept.getDeptId());
user.setDept(dept);
user.setRoleId(role.getRoleId());
user.setRoleIds(new Long[]{role.getRoleId()});
ValidatorUtils.validate(user);
user.setPassword(password);
user.setCreateBy(operName);
userService.insertUser(user);
successNum++;
......@@ -75,11 +96,15 @@ public class SysUserImportListener extends AnalysisEventListener<SysUserImportVo
} else {
failureNum++;
failureMsg.append("<br/>").append(failureNum).append("、账号 ").append(user.getUserName()).append(" 已存在");
userVo.setFailReason("手机号已存在");
resultList.add(userVo);
}
} catch (Exception e) {
failureNum++;
String msg = "<br/>" + failureNum + "、账号 " + user.getUserName() + " 导入失败:";
String msg = "<br/>" + failureNum + "、账号 " + userVo.getPhonenumber() + " 导入失败:";
failureMsg.append(msg).append(e.getMessage());
userVo.setFailReason(e.getMessage());
resultList.add(userVo);
log.error(msg, e);
}
}
......@@ -106,7 +131,7 @@ public class SysUserImportListener extends AnalysisEventListener<SysUserImportVo
@Override
public List<SysUserImportVo> getList() {
return null;
return resultList;
}
@Override
......
......@@ -51,6 +51,14 @@ public interface ISysDeptService {
*/
SysDept selectDeptById(Long deptId);
/**
* 根据部门名称查询部门
*
* @param deptName 部门名称
* @return 部门
*/
SysDept selectDeptByDeptName(String deptName);
/**
* 根据ID查询所有子部门数(正常状态)
*
......@@ -113,4 +121,5 @@ public interface ISysDeptService {
* @return 结果
*/
int deleteDeptById(Long deptId);
}
......@@ -42,6 +42,14 @@ public interface ISysRoleService {
*/
Set<String> selectRolePermissionByUserId(Long userId);
/**
* 根据角色名称查询角色
*
* @param roleName 角色名称
* @return 角色
*/
SysRole selectRoleByRoleName(String roleName);
/**
* 查询所有角色
*
......@@ -178,4 +186,5 @@ public interface ISysRoleService {
int insertAuthUsers(Long roleId, Long[] userIds);
void cleanOnlineUserByRole(Long roleId);
}
......@@ -5,7 +5,6 @@ import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.dsk.common.constant.TenantConstants;
import com.dsk.common.core.domain.PageQuery;
import com.dsk.common.core.page.TableDataInfo;
import com.dsk.common.exception.ServiceException;
......@@ -57,8 +56,7 @@ public class ISysTenantPackageServiceImpl implements ISysTenantPackageService {
*/
@Override
public List<SysTenantPackageSelectVo> selectList() {
List<SysTenantPackageVo> tenantPackageVo = baseMapper.selectVoList(new LambdaQueryWrapper<SysTenantPackage>()
.eq(SysTenantPackage::getStatus, TenantConstants.NORMAL));
List<SysTenantPackageVo> tenantPackageVo = baseMapper.selectVoList(null);
return BeanUtil.copyToList(tenantPackageVo, SysTenantPackageSelectVo.class);
}
......
......@@ -126,6 +126,19 @@ public class SysDeptServiceImpl implements ISysDeptService, DeptService {
return dept;
}
/**
* 根据部门名称查询部门
*
* @param deptName 部门名称
* @return 部门
*/
@Override
public SysDept selectDeptByDeptName(String deptName) {
LambdaQueryWrapper<SysDept> wrapper = new LambdaQueryWrapper<SysDept>()
.eq(SysDept::getDeptName, deptName);
return baseMapper.selectOne(wrapper);
}
/**
* 通过部门ID查询部门名称
*
......
......@@ -68,13 +68,13 @@ public class SysRoleServiceImpl implements ISysRoleService {
Map<String, Object> params = role.getParams();
QueryWrapper<SysRole> wrapper = Wrappers.query();
wrapper.eq("r.del_flag", UserConstants.ROLE_NORMAL)
.eq(ObjectUtil.isNotNull(role.getRoleId()), "r.role_id", role.getRoleId())
.like(StringUtils.isNotBlank(role.getRoleName()), "r.role_name", role.getRoleName())
.eq(StringUtils.isNotBlank(role.getStatus()), "r.status", role.getStatus())
.like(StringUtils.isNotBlank(role.getRoleKey()), "r.role_key", role.getRoleKey())
.between(params.get("beginTime") != null && params.get("endTime") != null,
"r.create_time", params.get("beginTime"), params.get("endTime"))
.orderByAsc("r.role_sort").orderByAsc("r.create_time");
.eq(ObjectUtil.isNotNull(role.getRoleId()), "r.role_id", role.getRoleId())
.like(StringUtils.isNotBlank(role.getRoleName()), "r.role_name", role.getRoleName())
.eq(StringUtils.isNotBlank(role.getStatus()), "r.status", role.getStatus())
.like(StringUtils.isNotBlank(role.getRoleKey()), "r.role_key", role.getRoleKey())
.between(params.get("beginTime") != null && params.get("endTime") != null,
"r.create_time", params.get("beginTime"), params.get("endTime"))
.orderByAsc("r.role_sort").orderByAsc("r.create_time");
return wrapper;
}
......@@ -117,6 +117,19 @@ public class SysRoleServiceImpl implements ISysRoleService {
return permsSet;
}
/**
* 根据角色名称查询角色
*
* @param roleName 角色名称
* @return 角色
*/
@Override
public SysRole selectRoleByRoleName(String roleName) {
LambdaQueryWrapper<SysRole> wrapper = new LambdaQueryWrapper<SysRole>()
.eq(SysRole::getRoleName, roleName);
return baseMapper.selectOne(wrapper);
}
/**
* 查询所有角色
*
......@@ -158,8 +171,8 @@ public class SysRoleServiceImpl implements ISysRoleService {
@Override
public boolean checkRoleNameUnique(SysRole role) {
boolean exist = baseMapper.exists(new LambdaQueryWrapper<SysRole>()
.eq(SysRole::getRoleName, role.getRoleName())
.ne(ObjectUtil.isNotNull(role.getRoleId()), SysRole::getRoleId, role.getRoleId()));
.eq(SysRole::getRoleName, role.getRoleName())
.ne(ObjectUtil.isNotNull(role.getRoleId()), SysRole::getRoleId, role.getRoleId()));
return !exist;
}
......@@ -172,8 +185,8 @@ public class SysRoleServiceImpl implements ISysRoleService {
@Override
public boolean checkRoleKeyUnique(SysRole role) {
boolean exist = baseMapper.exists(new LambdaQueryWrapper<SysRole>()
.eq(SysRole::getRoleKey, role.getRoleKey())
.ne(ObjectUtil.isNotNull(role.getRoleId()), SysRole::getRoleId, role.getRoleId()));
.eq(SysRole::getRoleKey, role.getRoleKey())
.ne(ObjectUtil.isNotNull(role.getRoleId()), SysRole::getRoleId, role.getRoleId()));
return !exist;
}
......@@ -189,8 +202,8 @@ public class SysRoleServiceImpl implements ISysRoleService {
}
// 新增不允许使用 管理员标识符
if (ObjectUtil.isNull(role.getRoleId())
&& StringUtils.equalsAny(role.getRoleKey(),
TenantConstants.SUPER_ADMIN_ROLE_KEY, TenantConstants.TENANT_ADMIN_ROLE_KEY)) {
&& StringUtils.equalsAny(role.getRoleKey(),
TenantConstants.SUPER_ADMIN_ROLE_KEY, TenantConstants.TENANT_ADMIN_ROLE_KEY)) {
throw new ServiceException("不允许使用系统内置管理员角色标识符!");
}
// 修改不允许修改 管理员标识符
......@@ -198,8 +211,8 @@ public class SysRoleServiceImpl implements ISysRoleService {
SysRole sysRole = baseMapper.selectById(role.getRoleId());
// 如果标识符不相等 判断为修改了管理员标识符
if (!StringUtils.equals(sysRole.getRoleKey(), role.getRoleKey())
&& StringUtils.equalsAny(sysRole.getRoleKey(),
TenantConstants.SUPER_ADMIN_ROLE_KEY, TenantConstants.TENANT_ADMIN_ROLE_KEY)) {
&& StringUtils.equalsAny(sysRole.getRoleKey(),
TenantConstants.SUPER_ADMIN_ROLE_KEY, TenantConstants.TENANT_ADMIN_ROLE_KEY)) {
throw new ServiceException("不允许修改系统内置管理员角色标识符!");
}
}
......@@ -395,8 +408,8 @@ public class SysRoleServiceImpl implements ISysRoleService {
@Override
public int deleteAuthUser(SysUserRole userRole) {
int rows = userRoleMapper.delete(new LambdaQueryWrapper<SysUserRole>()
.eq(SysUserRole::getRoleId, userRole.getRoleId())
.eq(SysUserRole::getUserId, userRole.getUserId()));
.eq(SysUserRole::getRoleId, userRole.getRoleId())
.eq(SysUserRole::getUserId, userRole.getUserId()));
if (rows > 0) {
cleanOnlineUserByRole(userRole.getRoleId());
}
......@@ -413,8 +426,8 @@ public class SysRoleServiceImpl implements ISysRoleService {
@Override
public int deleteAuthUsers(Long roleId, Long[] userIds) {
int rows = userRoleMapper.delete(new LambdaQueryWrapper<SysUserRole>()
.eq(SysUserRole::getRoleId, roleId)
.in(SysUserRole::getUserId, Arrays.asList(userIds)));
.eq(SysUserRole::getRoleId, roleId)
.in(SysUserRole::getUserId, Arrays.asList(userIds)));
if (rows > 0) {
cleanOnlineUserByRole(roleId);
}
......
......@@ -10,26 +10,20 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.dsk.common.utils.DingTalkUtil;
import com.dsk.common.utils.PasswordUtils;
import com.dsk.system.mapper.*;
import com.dsk.system.service.ISysUserService;
import com.dsk.common.constant.CacheNames;
import com.dsk.common.constant.UserConstants;
import com.dsk.common.core.domain.PageQuery;
import com.dsk.system.domain.SysDept;
import com.dsk.system.domain.SysRole;
import com.dsk.system.domain.SysUser;
import com.dsk.common.core.page.TableDataInfo;
import com.dsk.common.core.service.UserService;
import com.dsk.common.exception.ServiceException;
import com.dsk.common.helper.DataBaseHelper;
import com.dsk.common.helper.LoginHelper;
import com.dsk.common.utils.PasswordUtils;
import com.dsk.common.utils.StreamUtils;
import com.dsk.common.utils.StringUtils;
import com.dsk.system.domain.SysPost;
import com.dsk.system.domain.SysUserPost;
import com.dsk.system.domain.SysUserRole;
import com.dsk.system.domain.*;
import com.dsk.system.mapper.*;
import com.dsk.system.service.ISysUserService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cache.annotation.Cacheable;
......@@ -285,8 +279,7 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
+ "您好,您已经成功注册央企数字经营管理系统,请使用手机号码登录,初始密码为"
+ password
+ "。友情提示:为了您的账号安全,请立即前往【个人中心】修改密码。";
DingTalkUtil.sendDingTalkMsg(content);
System.out.println("👉🏻:" + content);
// DingTalkUtil.sendDingTalkMsg(content);
}
// 新增用户岗位关联
insertUserPost(user);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment