学员批量导入

This commit is contained in:
none 2023-02-23 18:08:14 +08:00
parent aa5d3a21d8
commit c7e0c8d466
9 changed files with 195 additions and 12 deletions

View File

@ -9,15 +9,8 @@ public class PlayEduThreadLocal {
private static final java.lang.ThreadLocal<LinkedHashMap<String, Object>> THREAD_LOCAL = new java.lang.ThreadLocal<>();
public PlayEduThreadLocal() {
}
/**
* 写入变量
*
* @param key
* @param val
*/
public static void put(String key, Object val) {
LinkedHashMap<String, Object> hashMap = THREAD_LOCAL.get();
if (hashMap == null) {

View File

@ -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<String[]> 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<Integer> depIds = departmentService.allIds();
// 邮箱输入重复检测 || 部门存在检测
HashMap<String, Integer> emailMap = new HashMap<>();
HashMap<String, String[]> depMap = new HashMap<>();
List<String> emails = new ArrayList<>();
List<User> 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<String> 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<UserDepartment> 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();
}
}

View File

@ -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;
}

View File

@ -23,4 +23,6 @@ public interface DepartmentService extends IService<Department> {
void update(Department department, String name, Integer parentId, Integer sort) throws NotFoundException;
List<Integer> allIds();
}

View File

@ -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<User> {
boolean emailIsExists(String email);
PaginationResult<User> paginate(int page, int size, UserPaginateFilter filter);
List<String> existsEmailsByEmails(List<String> emails);
}

View File

@ -115,6 +115,16 @@ public class DepartmentServiceImpl extends ServiceImpl<DepartmentMapper, Departm
}
updateBatchById(updateRows);
}
@Override
public List<Integer> allIds() {
List<Department> departments = list(query().getWrapper().eq("1", "1").select("id"));
List<Integer> ids = new ArrayList<>();
for (Department department : departments) {
ids.add(department.getId());
}
return ids;
}
}

View File

@ -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<UserMapper, User> implements Us
return pageResult;
}
@Override
public List<String> existsEmailsByEmails(List<String> emails) {
List<User> users = list(query().getWrapper().in("email", emails).select("id", "email"));
List<String> existsEmails = new ArrayList<>();
for (User user : users) {
existsEmails.add(user.getEmail());
}
return existsEmails;
}
}

View File

@ -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
*/

View File

@ -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);
}
}