From f5ea97c8b95d7cec60ff371350e9dc064a9e09bf Mon Sep 17 00:00:00 2001 From: aeizzz Date: Mon, 12 Dec 2022 13:43:02 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20Introducing=20new=20features.=20?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=83=A8=E9=97=A8=E5=AF=BC=E5=85=A5,?= =?UTF-8?q?=E4=BC=81=E4=B8=9A=E5=BE=AE=E4=BF=A1=E7=94=A8=E6=88=B7=E5=AF=BC?= =?UTF-8?q?=E5=85=A5=EF=BC=8C=E9=92=89=E9=92=89=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 --- .../pigx/admin/api/vo/CpUserExcelVo.java | 72 +++++++++++ .../pigx/admin/api/vo/DeptExcelVo.java | 45 +++++++ .../pigx/admin/api/vo/DingUserExcelVo.java | 59 +++++++++ .../admin/controller/SysDeptController.java | 30 +++++ .../admin/controller/SysUserController.java | 20 +++ .../pigx/admin/service/SysDeptService.java | 6 + .../pigx/admin/service/SysUserService.java | 5 + .../service/impl/SysDeptServiceImpl.java | 69 ++++++++++- .../service/impl/SysUserServiceImpl.java | 117 ++++++++++++++++++ pom.xml | 2 +- 10 files changed, 420 insertions(+), 5 deletions(-) create mode 100644 pigx-upms/pigx-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/vo/CpUserExcelVo.java create mode 100644 pigx-upms/pigx-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/vo/DeptExcelVo.java create mode 100644 pigx-upms/pigx-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/vo/DingUserExcelVo.java diff --git a/pigx-upms/pigx-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/vo/CpUserExcelVo.java b/pigx-upms/pigx-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/vo/CpUserExcelVo.java new file mode 100644 index 000000000..27bb8dae9 --- /dev/null +++ b/pigx-upms/pigx-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/vo/CpUserExcelVo.java @@ -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; + +} diff --git a/pigx-upms/pigx-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/vo/DeptExcelVo.java b/pigx-upms/pigx-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/vo/DeptExcelVo.java new file mode 100644 index 000000000..dc11ff62c --- /dev/null +++ b/pigx-upms/pigx-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/vo/DeptExcelVo.java @@ -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; + +} diff --git a/pigx-upms/pigx-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/vo/DingUserExcelVo.java b/pigx-upms/pigx-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/vo/DingUserExcelVo.java new file mode 100644 index 000000000..2e2852808 --- /dev/null +++ b/pigx-upms/pigx-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/vo/DingUserExcelVo.java @@ -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; + +} diff --git a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysDeptController.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysDeptController.java index 0a6551a34..9c9abd45f 100644 --- a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysDeptController.java +++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysDeptController.java @@ -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; /** *

@@ -127,4 +134,27 @@ public class SysDeptController { relationService.list(Wrappers.lambdaQuery().eq(SysDeptRelation::getAncestor, deptId))); } + + /** + * 导出部门 + * @return + */ + @ResponseExcel + @GetMapping("/export") + public List export(){ + return sysDeptService.listExcelVo(); + } + + + /** + * 导入部门 + * @param excelVOList + * @param bindingResult + * @return + */ + @PostMapping("import") + public R importDept(@RequestExcel List excelVOList, BindingResult bindingResult){ + + return sysDeptService.importDept(excelVOList,bindingResult); + } } diff --git a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysUserController.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysUserController.java index 5fea5ed15..6fc2c1891 100644 --- a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysUserController.java +++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysUserController.java @@ -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 excelVOList, BindingResult bindingResult){ + return userService.importDingUser(excelVOList,bindingResult); + } + + + @PostMapping("/importCpUser") + public R importCpUser(@RequestExcel List excelVOList, BindingResult bindingResult){ + return userService.importCpUser(excelVOList,bindingResult); + } + /** * 锁定指定用户 * @param username 用户名 diff --git a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysDeptService.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysDeptService.java index a10f225f2..4ff719379 100644 --- a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysDeptService.java +++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysDeptService.java @@ -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 { */ Boolean updateDeptById(SysDept sysDept); + List listExcelVo(); + + R importDept(List excelVOList, BindingResult bindingResult); } diff --git a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysUserService.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysUserService.java index 25aa52c26..55cfdf642 100644 --- a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysUserService.java +++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/SysUserService.java @@ -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 { */ R lockUser(String username); + R importDingUser(List excelVOList, BindingResult bindingResult); + + R importCpUser(List excelVOList, BindingResult bindingResult); } diff --git a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysDeptServiceImpl.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysDeptServiceImpl.java index 506766ac8..934f21fd7 100644 --- a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysDeptServiceImpl.java +++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysDeptServiceImpl.java @@ -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; /** *

@@ -114,6 +119,62 @@ public class SysDeptServiceImpl extends ServiceImpl impl return Boolean.TRUE; } + /** + * 导出部门 + * @return + */ + @Override + public List listExcelVo() { + List list = this.list(); + List deptExcelVos = list.stream().map(item -> { + DeptExcelVo deptExcelVo = new DeptExcelVo(); + deptExcelVo.setName(item.getName()); + Optional 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 excelVOList, BindingResult bindingResult) { + List errorMessageList = (List) bindingResult.getTarget(); + + List deptList = this.list(); + for (DeptExcelVo item: excelVOList){ + Set errorMsg = new HashSet<>(); + boolean exsitUsername = deptList.stream() + .anyMatch(sysDept -> item.getName().equals(sysDept.getName())); + if (exsitUsername) { + errorMsg.add("部门名称已经存在"); + } + SysDept one = this.getOne(Wrappers.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 树 部门名称 diff --git a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysUserServiceImpl.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysUserServiceImpl.java index 7a61c3f7c..d8f41a115 100644 --- a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysUserServiceImpl.java +++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysUserServiceImpl.java @@ -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 impl return R.ok(); } + + @Override + public R importDingUser(List excelVOList, BindingResult bindingResult) { + List errorMessageList = (List) bindingResult.getTarget(); + // 个性化校验逻辑 + List userList = this.list(); + List deptList = sysDeptService.list(); + + for (DingUserExcelVo item: excelVOList){ + Set 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 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 excelVOList, BindingResult bindingResult) { + List errorMessageList = (List) bindingResult.getTarget(); + + // 个性化校验逻辑 + List userList = this.list(); + List deptList = sysDeptService.list(); + + for (CpUserExcelVo item: excelVOList){ + Set 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 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)); + } + } diff --git a/pom.xml b/pom.xml index 41c26b9bb..b337666d1 100644 --- a/pom.xml +++ b/pom.xml @@ -40,7 +40,7 @@ 0.0.34 0.4.0 2.2.5 - 2.7.7 + 2.7.9 1.2.7 3.6.4 2.0.0