✨ Introducing new features. 增加部门导入,企业微信用户导入,钉钉用户导入

This commit is contained in:
aeizzz committed 2022-12-12 13:43:02 +08:00
1 parent 0513be8644
commit f5ea97c8b9
10 files changed
+420 -5

No files matched your search

@@ -0,0 +1,72 @@
package com.pig4cloud.pigx.admin.api.vo;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.pig4cloud.pigx.common.excel.annotation.ExcelLine;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;
/**
* 企业微信用户导入
*/
@Data
public class CpUserExcelVo implements Serializable {
/**
* 导入时候回显行号
*/
@ExcelLine
@ExcelIgnore
private Long lineNum;
@NotBlank(message = "帐号不能为空")
@ExcelProperty("帐号")
private String username;
/**
* 手机号
*/
@NotBlank(message = "手机号不能为空")
@ExcelProperty("手机")
private String phone;
/**
* 姓名
*/
@NotBlank(message = "姓名不能为空")
@ExcelProperty("姓名")
private String name;
/**
* 别名
*/
@ExcelProperty("别名")
private String nickname;
/**
* 部门名称
*/
@NotBlank(message = "部门不能为空")
@ExcelProperty("部门")
private String deptName;
@ExcelProperty("企业邮箱")
private String email;
/**
* 锁定标记
*/
@ExcelProperty("激活状态,0:已激活,9:未激活")
private String lockFlag;
}
@@ -0,0 +1,45 @@
package com.pig4cloud.pigx.admin.api.vo;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.pig4cloud.pigx.common.excel.annotation.ExcelLine;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
/**
* 部门导入导出
*/
@Data
public class DeptExcelVo implements Serializable {
/**
* 导入时候回显行号
*/
@ExcelLine
@ExcelIgnore
private Long lineNum;
/**
* 上级部门
*/
@NotBlank(message = "上级部门不能为空")
@ExcelProperty("上级部门")
private String parentName;
/**
* 部门名称
*/
@NotBlank(message = "部门名称不能为空")
@ExcelProperty("部门名称")
private String name;
/**
* 排序
*/
@ExcelProperty(value = "排序值")
private Integer sortOrder;
}
@@ -0,0 +1,59 @@
package com.pig4cloud.pigx.admin.api.vo;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.pig4cloud.pigx.common.excel.annotation.ExcelLine;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;
@Data
public class DingUserExcelVo implements Serializable {
/**
* 导入时候回显行号
*/
@ExcelLine
@ExcelIgnore
private Long lineNum;
/**
* 手机号
*/
@NotBlank(message = "手机号不能为空")
@ExcelProperty("手机号")
private String phone;
/**
* 姓名
*/
@NotBlank(message = "姓名不能为空")
@ExcelProperty("姓名")
private String name;
/**
* 部门名称
*/
@NotBlank(message = "部门不能为空")
@ExcelProperty("部门")
private String deptName;
@ExcelProperty("邮箱")
private String email;
/**
* 锁定标记
*/
@ExcelProperty("激活状态,0:是,9:否")
private String lockFlag;
}
@@ -22,17 +22,24 @@ package com.pig4cloud.pigx.admin.controller;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.pig4cloud.pigx.admin.api.entity.SysDept;
import com.pig4cloud.pigx.admin.api.entity.SysDeptRelation;
import com.pig4cloud.pigx.admin.api.vo.CpUserExcelVo;
import com.pig4cloud.pigx.admin.api.vo.DeptExcelVo;
import com.pig4cloud.pigx.admin.service.SysDeptRelationService;
import com.pig4cloud.pigx.admin.service.SysDeptService;
import com.pig4cloud.pigx.common.core.util.R;
import com.pig4cloud.pigx.common.excel.annotation.RequestExcel;
import com.pig4cloud.pigx.common.excel.annotation.ResponseExcel;
import com.pig4cloud.pigx.common.log.annotation.SysLog;
import io.swagger.annotations.Api;
import lombok.AllArgsConstructor;
import oracle.jdbc.proxy.annotation.Post;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.time.LocalDateTime;
import java.util.List;
/**
* <p>
@@ -127,4 +134,27 @@ public class SysDeptController {
relationService.list(Wrappers.<SysDeptRelation>lambdaQuery().eq(SysDeptRelation::getAncestor, deptId)));
}
/**
* 导出部门
* @return
*/
@ResponseExcel
@GetMapping("/export")
public List<DeptExcelVo> export(){
return sysDeptService.listExcelVo();
}
/**
* 导入部门
* @param excelVOList
* @param bindingResult
* @return
*/
@PostMapping("import")
public R importDept(@RequestExcel List<DeptExcelVo> excelVOList, BindingResult bindingResult){
return sysDeptService.importDept(excelVOList,bindingResult);
}
}
@@ -24,6 +24,8 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.pig4cloud.pigx.admin.api.dto.UserDTO;
import com.pig4cloud.pigx.admin.api.entity.SysUser;
import com.pig4cloud.pigx.admin.api.vo.CpUserExcelVo;
import com.pig4cloud.pigx.admin.api.vo.DingUserExcelVo;
import com.pig4cloud.pigx.admin.api.vo.UserExcelVO;
import com.pig4cloud.pigx.admin.service.SysUserService;
import com.pig4cloud.pigx.common.core.exception.ErrorCodes;
@@ -213,6 +215,24 @@ public class SysUserController {
return userService.importUser(excelVOList, bindingResult);
}
/**
* 导入钉钉用户
* @param excelVOList
* @param bindingResult
* @return
*/
@PostMapping("/importDingUser")
public R importDingUser(@RequestExcel List<DingUserExcelVo> excelVOList, BindingResult bindingResult){
return userService.importDingUser(excelVOList,bindingResult);
}
@PostMapping("/importCpUser")
public R importCpUser(@RequestExcel List<CpUserExcelVo> excelVOList, BindingResult bindingResult){
return userService.importCpUser(excelVOList,bindingResult);
}
/**
* 锁定指定用户
* @param username 用户名
@@ -22,6 +22,9 @@ package com.pig4cloud.pigx.admin.service;
import cn.hutool.core.lang.tree.Tree;
import com.baomidou.mybatisplus.extension.service.IService;
import com.pig4cloud.pigx.admin.api.entity.SysDept;
import com.pig4cloud.pigx.admin.api.vo.DeptExcelVo;
import com.pig4cloud.pigx.common.core.util.R;
import org.springframework.validation.BindingResult;
import java.util.List;
@@ -63,4 +66,7 @@ public interface SysDeptService extends IService<SysDept> {
*/
Boolean updateDeptById(SysDept sysDept);
List<DeptExcelVo> listExcelVo();
R importDept(List<DeptExcelVo> excelVOList, BindingResult bindingResult);
}
@@ -25,6 +25,8 @@ import com.baomidou.mybatisplus.extension.service.IService;
import com.pig4cloud.pigx.admin.api.dto.UserDTO;
import com.pig4cloud.pigx.admin.api.dto.UserInfo;
import com.pig4cloud.pigx.admin.api.entity.SysUser;
import com.pig4cloud.pigx.admin.api.vo.CpUserExcelVo;
import com.pig4cloud.pigx.admin.api.vo.DingUserExcelVo;
import com.pig4cloud.pigx.admin.api.vo.UserExcelVO;
import com.pig4cloud.pigx.admin.api.vo.UserVO;
import com.pig4cloud.pigx.common.core.util.R;
@@ -124,4 +126,7 @@ public interface SysUserService extends IService<SysUser> {
*/
R<Boolean> lockUser(String username);
R importDingUser(List<DingUserExcelVo> excelVOList, BindingResult bindingResult);
R importCpUser(List<CpUserExcelVo> excelVOList, BindingResult bindingResult);
}
@@ -28,20 +28,25 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.pig4cloud.pigx.admin.api.entity.SysDept;
import com.pig4cloud.pigx.admin.api.entity.SysDeptRelation;
import com.pig4cloud.pigx.admin.api.vo.CpUserExcelVo;
import com.pig4cloud.pigx.admin.api.vo.DeptExcelVo;
import com.pig4cloud.pigx.admin.mapper.SysDeptMapper;
import com.pig4cloud.pigx.admin.service.SysDeptRelationService;
import com.pig4cloud.pigx.admin.service.SysDeptService;
import com.pig4cloud.pigx.common.core.exception.ErrorCodes;
import com.pig4cloud.pigx.common.core.util.MsgUtils;
import com.pig4cloud.pigx.common.core.util.R;
import com.pig4cloud.pigx.common.data.datascope.DataScope;
import com.pig4cloud.pigx.common.excel.vo.ErrorMessage;
import lombok.AllArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.BindingResult;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* <p>
@@ -114,6 +119,62 @@ public class SysDeptServiceImpl extends ServiceImpl<SysDeptMapper, SysDept> impl
return Boolean.TRUE;
}
/**
* 导出部门
* @return
*/
@Override
public List<DeptExcelVo> listExcelVo() {
List<SysDept> list = this.list();
List<DeptExcelVo> deptExcelVos = list.stream().map(item -> {
DeptExcelVo deptExcelVo = new DeptExcelVo();
deptExcelVo.setName(item.getName());
Optional<String> first = this.list().stream().filter(it -> item.getParentId().equals(it.getDeptId()))
.map(SysDept::getName).findFirst();
deptExcelVo.setParentName(first.orElse("跟部门"));
deptExcelVo.setSortOrder(item.getSortOrder());
return deptExcelVo;
}).collect(Collectors.toList());
return deptExcelVos;
}
@Override
public R importDept(List<DeptExcelVo> excelVOList, BindingResult bindingResult) {
List<ErrorMessage> errorMessageList = (List<ErrorMessage>) bindingResult.getTarget();
List<SysDept> deptList = this.list();
for (DeptExcelVo item: excelVOList){
Set<String> errorMsg = new HashSet<>();
boolean exsitUsername = deptList.stream()
.anyMatch(sysDept -> item.getName().equals(sysDept.getName()));
if (exsitUsername) {
errorMsg.add("部门名称已经存在");
}
SysDept one = this.getOne(Wrappers.<SysDept>lambdaQuery().eq(SysDept::getName, item.getParentName()));
if(item.getParentName().equals("跟部门")){
one = new SysDept();
one.setDeptId(0L);
}
if (one == null) {
errorMsg.add("上级部门不存在");
}
if (CollUtil.isEmpty(errorMsg)) {
SysDept sysDept = new SysDept();
sysDept.setName(item.getName());
sysDept.setParentId(one.getDeptId());
sysDept.setSortOrder(item.getSortOrder());
this.saveDept(sysDept);
}else{
// 数据不合法情况
errorMessageList.add(new ErrorMessage(item.getLineNum(), errorMsg));
}
}
if (CollUtil.isNotEmpty(errorMessageList)) {
return R.failed(errorMessageList);
}
return R.ok(null, "部门导入成功");
}
/**
* 查询全部部门树
* @return 树 部门名称
@@ -29,6 +29,8 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.pig4cloud.pigx.admin.api.dto.UserDTO;
import com.pig4cloud.pigx.admin.api.dto.UserInfo;
import com.pig4cloud.pigx.admin.api.entity.*;
import com.pig4cloud.pigx.admin.api.vo.CpUserExcelVo;
import com.pig4cloud.pigx.admin.api.vo.DingUserExcelVo;
import com.pig4cloud.pigx.admin.api.vo.UserExcelVO;
import com.pig4cloud.pigx.admin.api.vo.UserVO;
import com.pig4cloud.pigx.admin.mapper.SysUserMapper;
@@ -396,4 +398,119 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
return R.ok();
}
@Override
public R importDingUser(List<DingUserExcelVo> excelVOList, BindingResult bindingResult) {
List<ErrorMessage> errorMessageList = (List<ErrorMessage>) bindingResult.getTarget();
// 个性化校验逻辑
List<SysUser> userList = this.list();
List<SysDept> deptList = sysDeptService.list();
for (DingUserExcelVo item: excelVOList){
Set<String> errorMsg = new HashSet<>();
boolean exsitUser = userList.stream()
.anyMatch(sysUser -> item.getName().equals(sysUser.getName()));
if (exsitUser) {
errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_USER_USERNAME_EXISTING, item.getName()));
}
// 删除手机号中的 +86 前缀
String phone = item.getPhone().split("-")[1];
boolean exsitPhone = userList.stream()
.anyMatch(sysUser -> phone.equals(sysUser.getPhone()));
if (exsitPhone) {
errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_USER_PHONE_EXISTING, item.getPhone()));
}
String deptName = item.getDeptName().split(",")[0];
// 判断输入的部门名称列表是否合法
Optional<SysDept> deptOptional = deptList.stream()
.filter(dept -> deptName.equals(dept.getName())).findFirst();
if (!deptOptional.isPresent()) {
errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_DEPT_DEPTNAME_INEXISTENCE, item.getDeptName()));
}
// 数据合法情况
if (CollUtil.isEmpty(errorMsg)) {
UserDTO userDTO = new UserDTO();
userDTO.setName(item.getName());
// 批量导入初始密码为手机号
userDTO.setPassword(phone);
userDTO.setUsername(phone);
userDTO.setPhone(phone);
userDTO.setDeptId(deptOptional.get().getDeptId());
userDTO.setDelFlag(item.getLockFlag());
userDTO.setEmail(item.getEmail());
this.saveUser(userDTO);
}
else {
// 数据不合法情况
errorMessageList.add(new ErrorMessage(item.getLineNum(), errorMsg));
}
}
if (CollUtil.isNotEmpty(errorMessageList)) {
return R.failed(errorMessageList);
}
return R.ok(null, MsgUtils.getMessage(ErrorCodes.SYS_USER_IMPORT_SUCCEED));
}
/**
* 企业微信用户导入
* @param excelVOList
* @param bindingResult
* @return
*/
@Override
public R importCpUser(List<CpUserExcelVo> excelVOList, BindingResult bindingResult) {
List<ErrorMessage> errorMessageList = (List<ErrorMessage>) bindingResult.getTarget();
// 个性化校验逻辑
List<SysUser> userList = this.list();
List<SysDept> deptList = sysDeptService.list();
for (CpUserExcelVo item: excelVOList){
Set<String> errorMsg = new HashSet<>();
boolean exsitUsername = userList.stream()
.anyMatch(sysUser -> item.getUsername().equals(sysUser.getUsername()));
if (exsitUsername) {
errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_USER_USERNAME_EXISTING, item.getUsername()));
}
boolean exsitPhone = userList.stream()
.anyMatch(sysUser -> item.getPhone().equals(sysUser.getPhone()));
if (exsitPhone) {
errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_USER_PHONE_EXISTING, item.getPhone()));
}
// 多部门获取第一个 到部门获取自己点
String[] deptNameList = item.getDeptName().split(";")[0].split("/");
String deptName = deptNameList[deptNameList.length-1];
// 判断输入的部门名称列表是否合法
Optional<SysDept> deptOptional = deptList.stream()
.filter(dept -> deptName.equals(dept.getName())).findFirst();
if (!deptOptional.isPresent()) {
errorMsg.add(MsgUtils.getMessage(ErrorCodes.SYS_DEPT_DEPTNAME_INEXISTENCE, deptName));
}
// 数据合法情况
if (CollUtil.isEmpty(errorMsg)) {
UserDTO userDTO = new UserDTO();
userDTO.setName(item.getName());
// 批量导入初始密码为手机号
userDTO.setPassword(item.getPhone());
userDTO.setUsername(item.getUsername());
userDTO.setPhone(item.getPhone());
userDTO.setDeptId(deptOptional.get().getDeptId());
userDTO.setDelFlag(item.getLockFlag());
userDTO.setEmail(item.getEmail());
userDTO.setNickname(item.getNickname());
this.saveUser(userDTO);
}
else {
// 数据不合法情况
errorMessageList.add(new ErrorMessage(item.getLineNum(), errorMsg));
}
}
if (CollUtil.isNotEmpty(errorMessageList)) {
return R.failed(errorMessageList);
}
return R.ok(null, MsgUtils.getMessage(ErrorCodes.SYS_USER_IMPORT_SUCCEED));
}
}
+1 -1
View File
@@ -40,7 +40,7 @@
<spring.checkstyle.version>0.0.34</spring.checkstyle.version>
<spring.authorization.version>0.4.0</spring.authorization.version>
<git.commit.version>2.2.5</git.commit.version>
<spring-boot-admin.version>2.7.7</spring-boot-admin.version>
<spring-boot-admin.version>2.7.9</spring-boot-admin.version>
<captcha.version>1.2.7</captcha.version>
<cas.sdk.version>3.6.4</cas.sdk.version>
<dingtalk.old.version>2.0.0</dingtalk.old.version>