From c7e0c8d4666536da4716f2e95939ba845eebe9e9 Mon Sep 17 00:00:00 2001 From: none Date: Thu, 23 Feb 2023 18:08:14 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AD=A6=E5=91=98=E6=89=B9=E9=87=8F=E5=AF=BC?= =?UTF-8?q?=E5=85=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xyz/playedu/api/PlayEduThreadLocal.java | 7 - .../controller/backend/UserController.java | 144 +++++++++++++++++- .../request/backend/UserImportRequest.java | 21 +++ .../api/service/DepartmentService.java | 2 + .../xyz/playedu/api/service/UserService.java | 4 + .../service/impl/DepartmentServiceImpl.java | 10 ++ .../api/service/impl/UserServiceImpl.java | 13 ++ .../xyz/playedu/api/types/JWTPayload.java | 2 - .../xyz/playedu/api/types/JsonResponse.java | 4 + 9 files changed, 195 insertions(+), 12 deletions(-) create mode 100644 src/main/java/xyz/playedu/api/request/backend/UserImportRequest.java diff --git a/src/main/java/xyz/playedu/api/PlayEduThreadLocal.java b/src/main/java/xyz/playedu/api/PlayEduThreadLocal.java index fead5dc..5408542 100644 --- a/src/main/java/xyz/playedu/api/PlayEduThreadLocal.java +++ b/src/main/java/xyz/playedu/api/PlayEduThreadLocal.java @@ -9,15 +9,8 @@ public class PlayEduThreadLocal { private static final java.lang.ThreadLocal> THREAD_LOCAL = new java.lang.ThreadLocal<>(); public PlayEduThreadLocal() { - } - /** - * 写入变量 - * - * @param key - * @param val - */ public static void put(String key, Object val) { LinkedHashMap hashMap = THREAD_LOCAL.get(); if (hashMap == null) { diff --git a/src/main/java/xyz/playedu/api/controller/backend/UserController.java b/src/main/java/xyz/playedu/api/controller/backend/UserController.java index 9ba48ea..d02bf46 100644 --- a/src/main/java/xyz/playedu/api/controller/backend/UserController.java +++ b/src/main/java/xyz/playedu/api/controller/backend/UserController.java @@ -11,7 +11,9 @@ import xyz.playedu.api.domain.User; import xyz.playedu.api.domain.UserDepartment; import xyz.playedu.api.event.UserDestroyEvent; import xyz.playedu.api.middleware.BackendPermissionMiddleware; +import xyz.playedu.api.request.backend.UserImportRequest; import xyz.playedu.api.request.backend.UserRequest; +import xyz.playedu.api.service.DepartmentService; import xyz.playedu.api.service.UserDepartmentService; import xyz.playedu.api.service.UserService; import xyz.playedu.api.types.JsonResponse; @@ -39,12 +41,27 @@ public class UserController { @Autowired private UserDepartmentService userDepartmentService; + @Autowired + private DepartmentService departmentService; + @Autowired private ApplicationContext context; @BackendPermissionMiddleware(slug = BPermissionConstant.USER_INDEX) @GetMapping("/index") - public JsonResponse index(@RequestParam(name = "page", defaultValue = "1") Integer page, @RequestParam(name = "size", defaultValue = "10") Integer size, @RequestParam(name = "name", required = false) String name, @RequestParam(name = "email", required = false) String email, @RequestParam(name = "nickname", required = false) String nickname, @RequestParam(name = "id_card", required = false) String idCard, @RequestParam(name = "is_active", required = false) Integer isActive, @RequestParam(name = "is_lock", required = false) Integer isLock, @RequestParam(name = "is_verify", required = false) Integer isVerify, @RequestParam(name = "is_set_password", required = false) Integer isSetPassword, @RequestParam(name = "created_at", required = false) Date[] createdAt) { + public JsonResponse index( + @RequestParam(name = "page", defaultValue = "1") Integer page, + @RequestParam(name = "size", defaultValue = "10") Integer size, + @RequestParam(name = "name", required = false) String name, + @RequestParam(name = "email", required = false) String email, + @RequestParam(name = "nickname", required = false) String nickname, + @RequestParam(name = "id_card", required = false) String idCard, + @RequestParam(name = "is_active", required = false) Integer isActive, + @RequestParam(name = "is_lock", required = false) Integer isLock, + @RequestParam(name = "is_verify", required = false) Integer isVerify, + @RequestParam(name = "is_set_password", required = false) Integer isSetPassword, + @RequestParam(name = "created_at", required = false) Date[] createdAt + ) { UserPaginateFilter filter = new UserPaginateFilter(); if (name != null && name.length() > 0) { filter.setName(name); @@ -214,8 +231,129 @@ public class UserController { } @PostMapping("/store-batch") - public JsonResponse batchStore() { - return null; + @Transactional + public JsonResponse batchStore(@RequestBody @Validated UserImportRequest request) { + String[][] users = request.getUsers(); + if (users.length == 0) { + return JsonResponse.error("数据为空"); + } + if (users.length > 1000) { + return JsonResponse.error("一次最多导入1000条数据"); + } + + Integer startLine = request.getStartLine(); + + List errorLines = new ArrayList<>(); + errorLines.add(new String[]{"错误行", "错误信息"});//表头 + + // 参数长度校验 + for (int i = 0; i < users.length; i++) { + if (users[i].length != 6) { + errorLines.add(new String[]{"第" + (i + startLine) + "行", "参数错误"}); + } + } + if (errorLines.size() > 1) { + return JsonResponse.error("导入数据有误", errorLines); + } + + // 读取存在的部门 + List depIds = departmentService.allIds(); + + // 邮箱输入重复检测 || 部门存在检测 + HashMap emailMap = new HashMap<>(); + HashMap depMap = new HashMap<>(); + List emails = new ArrayList<>(); + List insertUsers = new ArrayList<>(); + for (int i = 0; i < users.length; i++) { + //c0: 部门ids数组 + //c1: 邮箱 + //c2: 昵称 + //c3: 密码 + //c4: 姓名 + //c5: 身份证号 + + String tmpEmail = users[i][1]; + if (emailMap.get(tmpEmail) != null) {//存在重复 + errorLines.add(new String[]{"第" + (i + startLine) + "行", "邮箱重复"}); + } else { + emailMap.put(tmpEmail, i + startLine); + } + + emails.add(tmpEmail); + + // 部门存在检测 + if (users[i][0] != null && users[i][0].length() > 0) { + String[] tmpDepIds = users[i][0].split(","); + for (int j = 0; j < tmpDepIds.length; j++) { + if (!depIds.contains(Integer.valueOf(tmpDepIds[j]))) { + errorLines.add(new String[]{"第" + (i + startLine) + "行", "部门id[" + tmpDepIds[j] + "]不存在"}); + } + } + depMap.put(users[i][1], tmpDepIds); + } + + // 昵称为空检测 + if (users[i][2] == null || users[i][2].length() == 0) { + errorLines.add(new String[]{"第" + (i + startLine) + "行", "昵称为空"}); + } + + // 密码为空检测 + if (users[i][3] == null || users[i][3].length() == 0) { + errorLines.add(new String[]{"第" + (i + startLine) + "行", "密码为空"}); + } + + // 带插入数据 + User tmpInsertUser = new User(); + String tmpSalt = HelperUtil.randomString(6); + String tmpPassword = HelperUtil.MD5(users[i][3] + tmpSalt); + tmpInsertUser.setEmail(users[i][1]); + tmpInsertUser.setNickname(users[i][2]); + tmpInsertUser.setPassword(tmpPassword); + tmpInsertUser.setSalt(tmpSalt); + tmpInsertUser.setName(users[i][4]); + tmpInsertUser.setIdCard(users[i][5]); + tmpInsertUser.setCreateIp("127.0.0.1"); + tmpInsertUser.setCreateCity("内网"); + tmpInsertUser.setCreatedAt(new Date()); + tmpInsertUser.setUpdatedAt(new Date()); + + insertUsers.add(tmpInsertUser); + } + + if (errorLines.size() > 1) { + return JsonResponse.error("导入数据有误", errorLines); + } + + // 邮箱是否注册检测 + List existsEmails = userService.existsEmailsByEmails(emails); + if (existsEmails.size() > 0) { + for (String tmpEmail : existsEmails) { + errorLines.add(new String[]{"第" + emailMap.get(tmpEmail) + "行", "邮箱已注册"}); + } + } + if (errorLines.size() > 1) { + return JsonResponse.error("导入数据有误", errorLines); + } + + userService.saveBatch(insertUsers); + + // 部门关联 + List userDepartments = new ArrayList<>(); + for (User tmpUser : insertUsers) { + String[] tmpDepIds = depMap.get(tmpUser.getEmail()); + if (tmpDepIds != null) { + for (int i = 0; i < tmpDepIds.length; i++) { + UserDepartment tmpUserDep = new UserDepartment(); + tmpUserDep.setUserId(tmpUser.getId()); + tmpUserDep.setDepId(Integer.valueOf(tmpDepIds[i])); + + userDepartments.add(tmpUserDep); + } + } + } + userDepartmentService.saveBatch(userDepartments); + + return JsonResponse.success(); } } diff --git a/src/main/java/xyz/playedu/api/request/backend/UserImportRequest.java b/src/main/java/xyz/playedu/api/request/backend/UserImportRequest.java new file mode 100644 index 0000000..a9e5adf --- /dev/null +++ b/src/main/java/xyz/playedu/api/request/backend/UserImportRequest.java @@ -0,0 +1,21 @@ +package xyz.playedu.api.request.backend; + +import com.fasterxml.jackson.annotation.JsonProperty; +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +/** + * @Author 杭州白书科技有限公司 + * @create 2023/2/23 16:12 + */ +@Data +public class UserImportRequest { + + @NotNull(message = "请导入数据") + private String[][] users; + + @NotNull(message = "起始行") + @JsonProperty("start_line") + private Integer startLine; + +} diff --git a/src/main/java/xyz/playedu/api/service/DepartmentService.java b/src/main/java/xyz/playedu/api/service/DepartmentService.java index 88d45a5..2f3f34d 100644 --- a/src/main/java/xyz/playedu/api/service/DepartmentService.java +++ b/src/main/java/xyz/playedu/api/service/DepartmentService.java @@ -23,4 +23,6 @@ public interface DepartmentService extends IService { void update(Department department, String name, Integer parentId, Integer sort) throws NotFoundException; + List allIds(); + } diff --git a/src/main/java/xyz/playedu/api/service/UserService.java b/src/main/java/xyz/playedu/api/service/UserService.java index d991b74..3983c5c 100644 --- a/src/main/java/xyz/playedu/api/service/UserService.java +++ b/src/main/java/xyz/playedu/api/service/UserService.java @@ -5,6 +5,8 @@ import com.baomidou.mybatisplus.extension.service.IService; import xyz.playedu.api.types.paginate.PaginationResult; import xyz.playedu.api.types.paginate.UserPaginateFilter; +import java.util.List; + /** * @author tengteng * @description 针对表【users】的数据库操作Service @@ -14,4 +16,6 @@ public interface UserService extends IService { boolean emailIsExists(String email); PaginationResult paginate(int page, int size, UserPaginateFilter filter); + + List existsEmailsByEmails(List emails); } diff --git a/src/main/java/xyz/playedu/api/service/impl/DepartmentServiceImpl.java b/src/main/java/xyz/playedu/api/service/impl/DepartmentServiceImpl.java index 0ef35d5..9bc281b 100644 --- a/src/main/java/xyz/playedu/api/service/impl/DepartmentServiceImpl.java +++ b/src/main/java/xyz/playedu/api/service/impl/DepartmentServiceImpl.java @@ -115,6 +115,16 @@ public class DepartmentServiceImpl extends ServiceImpl allIds() { + List departments = list(query().getWrapper().eq("1", "1").select("id")); + List ids = new ArrayList<>(); + for (Department department : departments) { + ids.add(department.getId()); + } + return ids; + } } diff --git a/src/main/java/xyz/playedu/api/service/impl/UserServiceImpl.java b/src/main/java/xyz/playedu/api/service/impl/UserServiceImpl.java index 0c19916..d049d99 100644 --- a/src/main/java/xyz/playedu/api/service/impl/UserServiceImpl.java +++ b/src/main/java/xyz/playedu/api/service/impl/UserServiceImpl.java @@ -13,6 +13,9 @@ import org.springframework.stereotype.Service; import xyz.playedu.api.types.paginate.PaginationResult; import xyz.playedu.api.types.paginate.UserPaginateFilter; +import java.util.ArrayList; +import java.util.List; + /** * @author tengteng * @description 针对表【users】的数据库操作Service实现 @@ -72,6 +75,16 @@ public class UserServiceImpl extends ServiceImpl implements Us return pageResult; } + + @Override + public List existsEmailsByEmails(List emails) { + List users = list(query().getWrapper().in("email", emails).select("id", "email")); + List existsEmails = new ArrayList<>(); + for (User user : users) { + existsEmails.add(user.getEmail()); + } + return existsEmails; + } } diff --git a/src/main/java/xyz/playedu/api/types/JWTPayload.java b/src/main/java/xyz/playedu/api/types/JWTPayload.java index 22d7c47..251baf2 100644 --- a/src/main/java/xyz/playedu/api/types/JWTPayload.java +++ b/src/main/java/xyz/playedu/api/types/JWTPayload.java @@ -2,8 +2,6 @@ package xyz.playedu.api.types; import lombok.Data; -import java.util.HashMap; - /** * @see https://www.rfc-editor.org/rfc/rfc7519#section-4.1 */ diff --git a/src/main/java/xyz/playedu/api/types/JsonResponse.java b/src/main/java/xyz/playedu/api/types/JsonResponse.java index 768d4d5..4d635dd 100644 --- a/src/main/java/xyz/playedu/api/types/JsonResponse.java +++ b/src/main/java/xyz/playedu/api/types/JsonResponse.java @@ -34,4 +34,8 @@ public class JsonResponse { public static JsonResponse error(String msg) { return new JsonResponse(-1, msg, null); } + + public static JsonResponse error(String msg, Object data) { + return new JsonResponse(-1, msg, data); + } }