Commit d13ec403 authored by 王琮's avatar 王琮

添加模板导出和用户导入

parent 965b9ab9
......@@ -5,6 +5,7 @@ package org.rcisoft.sys.sysuser.controller;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.rcisoft.core.anno.CyEptSm4EnableAnno;
import org.rcisoft.core.anno.CyOpeLogAnno;
import org.rcisoft.core.operlog.enums.CyLogTypeEnum;
import org.rcisoft.core.util.CyEpExcelUtil;
......@@ -21,8 +22,8 @@ import org.rcisoft.core.controller.CyPaginationController;
import org.rcisoft.core.model.CyGridModel;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import org.rcisoft.sys.sysuser.service.SysUserService;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
......@@ -158,4 +159,26 @@ public class SysUserController extends CyPaginationController<SysUser> {
CyMessCons.MESSAGE_ALERT_ERROR,
sysUserList);
}
@CyOpeLogAnno(title = "system-用户管理-导出用户", businessType = CyLogTypeEnum.EXPORT)
@ApiOperation(value = "导出用户信息空模板", notes = "导出用户信息空模板")
@GetMapping(value = "/importTemplate")
@CyEptSm4EnableAnno
public CyResult outSysUserEmpty(HttpServletResponse response) {
return CyResultGenUtil.builder(new CyPersistModel(1),
CyMessCons.MESSAGE_ALERT_SUCCESS,
CyMessCons.MESSAGE_ALERT_ERROR,
sysUserServiceImpl.exportEmptyTemplate(response));
}
@CyOpeLogAnno(title = "system-用户管理-导入用户", businessType = CyLogTypeEnum.IMPORT)
@ApiOperation(value = "导入用户信息", notes = "导入用户信息")
@PostMapping("/importExcel")
@CyEptSm4EnableAnno
public CyResult importSysUser(MultipartFile file) {
return CyResultGenUtil.builder(new CyPersistModel(1),
CyMessCons.MESSAGE_ALERT_SUCCESS,
CyMessCons.MESSAGE_ALERT_ERROR,
sysUserServiceImpl.importUserExcel(file));
}
}
package org.rcisoft.sys.sysuser.dto;
import cn.afterturn.easypoi.excel.annotation.Excel;
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
@Data
public class ExportUserDTO {
@ApiModelProperty(name = "username", value = "登录名", required = true, dataType = "varchar")
@Excel(name = "登录名", orderNum = "0", width = 15.0)
private String username;
@ApiModelProperty(name = "nickName", value = "昵称", required = true, dataType = "varchar")
@Excel(name = "昵称", orderNum = "1", width = 15.0)
private String nickName;
@ApiModelProperty(name = "name", value = "姓名", required = true, dataType = "varchar")
@Excel(name = "姓名", orderNum = "2", width = 15.0)
private String name;
@ApiModelProperty(name = "email", value = "邮箱", required = true, dataType = "varchar")
@Excel(name = "邮箱", orderNum = "3", width = 15.0)
private String email;
@ApiModelProperty(name = "phone", value = "手机号", required = true, dataType = "varchar")
@Excel(name = "手机号", orderNum = "4", width = 15.0)
private String phone;
@ApiModelProperty(name = "idNumber", value = "身份证号", required = true, dataType = "varchar")
@Excel(name = "身份证号", orderNum = "5", width = 15.0)
private String idNumber;
@ApiModelProperty(name = "sex", value = "性别(0:男,1:女)", required = true, dataType = "varchar")
@Excel(name = "性别", orderNum = "6", width = 15.0)
private String sex;
@TableField(exist = false)
@Excel(name = "岗位", orderNum = "7", width = 15.0)
private String postIds;
@ApiModelProperty(name = "password", value = "密码", required = true, dataType = "varchar")
private String password;
@ApiModelProperty(name = "userType", value = "用户类型", required = true, dataType = "varchar")
private String userType;
@ApiModelProperty(name = "avatar", value = "头像地址", required = true, dataType = "varchar")
private String avatar;
@ApiModelProperty(name = "loginIp", value = "最后登录IP", required = true, dataType = "varchar")
private String loginIp;
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ApiModelProperty(name = "loginDate", value = "最后登录时间", required = true, dataType = "date")
private Date loginDate;
}
......@@ -115,7 +115,7 @@ public class SysUser extends CyIdIncreEntity<SysUser> {
* @default
*/
@Excel(name = "用户性别(0男 1女 2未知)", orderNum = "6", width = 20)
private Long sex;
private String sex;
/**
* @desc 密码
......
......@@ -3,9 +3,12 @@ package org.rcisoft.sys.sysuser.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.rcisoft.core.model.CyPersistModel;
import org.rcisoft.core.model.CyPageInfo;
import org.rcisoft.sys.rbac.user.dto.ImportUserDTO;
import org.rcisoft.sys.sysuser.entity.SysUser;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
......@@ -77,4 +80,7 @@ public interface SysUserService {
*/
List<SysUser> export(SysUser sysUser);
int exportEmptyTemplate(HttpServletResponse response);
ImportUserDTO importUserExcel(MultipartFile file);
}
package org.rcisoft.sys.sysuser.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.rcisoft.common.component.CyGlobal;
import org.rcisoft.core.component.CyDownErrorTxtComp;
import org.rcisoft.core.exception.CyServiceException;
import org.rcisoft.core.result.enums.CyResSvcExcEnum;
import org.rcisoft.core.util.CyCompareToolUtils;
import org.rcisoft.core.util.CyEpExcelUtil;
import org.rcisoft.core.util.CyUserUtil;
import org.rcisoft.core.model.CyPersistModel;
import org.rcisoft.sys.constant.CyDictCons;
import org.rcisoft.sys.dictionary.entity.DictData;
import org.rcisoft.sys.dictionary.service.DictionaryService;
import org.rcisoft.sys.rbac.user.dto.ImportUserDTO;
import org.rcisoft.sys.sysuser.dao.SysDeptRepositorys;
import org.rcisoft.sys.sysuser.dao.SysDictDataRepositorys;
import org.rcisoft.sys.sysuser.dao.SysUserRepositorys;
import org.rcisoft.sys.sysuser.dto.ExportUserDTO;
import org.rcisoft.sys.sysuser.entity.SysDept;
import org.rcisoft.sys.sysuser.entity.SysDictData;
import org.rcisoft.sys.sysuser.entity.SysUser;
import org.rcisoft.sys.sysuser.service.SysUserService;
import org.rcisoft.sys.sysuser.util.CheckUtil;
import org.rcisoft.sys.wbac.user.dto.ErrorDTO;
import org.rcisoft.sys.wbac.user.dto.ExcelDTO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.rcisoft.core.model.CyPageInfo;
import java.lang.reflect.Field;
import java.math.BigInteger;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
/**
* Created by cy on 2022年11月16日 下午3:19:19.
......@@ -37,6 +62,15 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserRepositorys, SysUser>
private SysDeptRepositorys sysDeptRepositorys;
@Autowired
private SysDictDataRepositorys sysDictDataRepositorys;
@Autowired
private DictionaryService dictionaryService;
@Autowired
private CyDownErrorTxtComp errorTxt;
@Autowired
private CyGlobal global;
@Autowired
private PasswordEncoder passwordEncoder;
/**
* 保存 用户表
......@@ -186,4 +220,215 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserRepositorys, SysUser>
return sysUserList;
}
@Override
public int exportEmptyTemplate(HttpServletResponse response) {
List<ExportUserDTO> imOutSysUsers = new ArrayList<>();
ExportUserDTO exportUserDTO = new ExportUserDTO();
for (int i = 0; i < 500; i++) {
imOutSysUsers.add(exportUserDTO);
}
//1.用户性别
/* List<DictData> userSex = dictionaryService.selectByTypes(CyDictCons.USER_SEX);
String[] userSexs = new String[userSex.size()];
for (int i = 0; i <= userSex.size() - 1; i++) {
userSexs[i] = (String) userSex.get(i).getDictLabel();
}*/
//2.岗位
/* SysPostDTO sysPostDTO = new SysPostDTO();
List<SysPost> posts = sysPostService.findAll(sysPostDTO);
String[] postss = new String[posts.size() - 1];
for (int i = 1; i <= posts.size() - 1; i++) {
postss[i - 1] = (String) posts.get(i).getPostName() + "/" + posts.get(i).getDeptId();
}
*/
ExcelDTO excelDto = new ExcelDTO();
// excelDto.setSex(userSexs);
// excelDto.setPost(postss);
CyEpExcelUtil.exportExcelSelect(imOutSysUsers, "用户信息", "用户",
ExportUserDTO.class, "模板.xlsx", response, excelDto);
return 1;
}
void errorText(String error, ImportUserDTO importUserDTO, List<Map<Integer, List<String>>> maps, String fileName) {
List<String> strings = new ArrayList<String>();
strings.add(error);
Map<Integer, List<String>> map = new HashMap<>();
map.put(-1, strings);
maps.add(map);
importUserDTO.setFilename(fileName);
}
@Override
@Transactional
public ImportUserDTO importUserExcel(MultipartFile file) {
ImportUserDTO importUserDTO = new ImportUserDTO();
Calendar calendar = Calendar.getInstance();
String nowTime = new SimpleDateFormat("yyyyMMddHHmmss").format(calendar.getTime());
String fileName = "用户错误信息" + nowTime + ".txt";
List<Map<Integer, List<String>>> maps = new ArrayList<>();
ExportUserDTO exportUserDTO = new ExportUserDTO();
boolean flag = false;
try {
flag = CyEpExcelUtil.isFileInUser(file, exportUserDTO, 2);
} catch (Exception e) {
throw new CyServiceException(CyResSvcExcEnum.ERROR_NETWORK);
}
if (!flag || !CyCompareToolUtils.compareFileName(file, "用户信息", 0, 0)) {
String errorBefore = "上传模板错误请重新下载!";
errorText(errorBefore, importUserDTO, maps, fileName);
try {
errorTxt.exportTxtPaper(maps, fileName);
} catch (Exception e) {
throw new CyServiceException(CyResSvcExcEnum.ERROR_NETWORK);
}
return importUserDTO;
}
/** 从excel表中读到数据,有一部分为空值 */
List<ExportUserDTO> sysUserList = CyEpExcelUtil.importExcel(file, 2, 1, ExportUserDTO.class);
/** 创建用户的集合对象 */
List<SysUser> sysUserInsert = new ArrayList<>();
/** 遍历 从Excel表中读到的数据 抛出不合适的数据 */
//判断整个Excel是不是为空 计算非空数据有多少条
int information = CyCompareToolUtils.cmpareInformation(sysUserList);
if (information == 0) {
String errorBefore = "Excel文件不可为空,请检查Excel文件是否填写!";
errorText(errorBefore, importUserDTO, maps, fileName);
try {
errorTxt.exportTxtPaper(maps, fileName);
} catch (Exception e) {
throw new CyServiceException(CyResSvcExcEnum.ERROR_NETWORK);
}
return importUserDTO;
} else if (information > 500) {
String errorMore = "单次导入数据不可超过500,请检查!";
errorText(errorMore, importUserDTO, maps, fileName);
try {
errorTxt.exportTxtPaper(maps, fileName);
} catch (Exception e) {
throw new CyServiceException(CyResSvcExcEnum.ERROR_NETWORK);
}
return importUserDTO;
} else {
//去除空数据
try {
sysUserList = ThrowNull(sysUserList);
} catch (Exception e) {
throw new CyServiceException(CyResSvcExcEnum.ERROR_NETWORK);
}
//校验 将错误信息放入maps
int index = 3; //从第3行开始
SysUser sysUserDTO = new SysUser();
sysUserDTO.setDeleted();
List<SysUser> sysUsers = sysUserRepositorys.querySysUsers(sysUserDTO);
for (ExportUserDTO sysUser : sysUserList) {
//判断 是否为空
ErrorDTO userNull = CheckUtil.userNotNull(sysUser, index);
if (userNull.getSuccess() == 1) {
maps.add(userNull.getMap());
}
//判断 信息是否重复
ErrorDTO userRepeat = CheckUtil.userRepeat(sysUser, index, sysUsers);
if (userRepeat.getSuccess() == 1) {
maps.add(userRepeat.getMap());
}
index++;
}
}
if (null != maps && maps.size() > 0) {
importUserDTO.setFilename(fileName);
try {
errorTxt.exportTxtPaper(maps, fileName);
} catch (Exception e) {
throw new CyServiceException(CyResSvcExcEnum.ERROR_NETWORK);
}
return importUserDTO;
}
/** 将 信息插入sys_user */
if (sysUserList.size() > 0) {
//用户性别数据字典
List<DictData> userSex = dictionaryService.selectByTypes(CyDictCons.USER_SEX);
for (ExportUserDTO sysUser : sysUserList) {
//数据库需要插入的用户信息
SysUser userInsert = new SysUser();
BeanUtil.copyProperties(sysUser, userInsert);
userInsert.setPassword(passwordEncoder.encode(global.getResetPassword()));
userInsert.setUserType("1");
for (DictData dictData : userSex) {
if (dictData.getDictLabel().equals(userInsert.getSex())) {
userInsert.setSex(dictData.getDictValue());
}
}
sysUserInsert.add(userInsert);
}
//插入 用户信息
saveBatch(sysUserInsert);
/* //查询岗位信息
List<SysPost> sysPosts = sysPostRepository.querySysPosts(new SysPostDTO());
//插入 用户-岗位信息
for (ExportUserDTO sysUser : sysUserList) {
List<org.rcisoft.sys.wbac.user.entity.SysUser> userId = sysUserRepository.queryUserByUserName(sysUser.getUsername());
//获取岗位
String postNames = sysUser.getPostIds();
String[] postName = postNames.split(",");
List<SysUserPost> sysUserPosts = new ArrayList<>();
SysUserPost addUserPost;
for (SysPost sysPost : sysPosts) {
for (String post : postName) {
String postNam = post.split("/")[0];//获取岗位名称
String postDeptId = post.split("/")[1];//获取岗位所属部门ID
if (sysPost.getPostName().equals(postNam)) {
if (String.valueOf(sysPost.getDeptId()).equals(postDeptId)) {
addUserPost = new SysUserPost();
addUserPost.setPostId(sysPost.getBusinessId());
addUserPost.setUserId(userId.get(0).getBusinessId());
sysUserPosts.add(addUserPost);
}
}
}
}
//插入人对应的岗位
if (!CollectionUtils.isEmpty(sysUserPosts)) {
sysUserPostRepository.insertUserPost(sysUserPosts);
}
}*/
}
return importUserDTO;
}
/**
* 去除List中空数据
*
* @param list
* @param <T>
* @return
* @throws Exception
*/
public <T> List<T> ThrowNull(List<T> list) throws Exception {
List<T> list2 = new ArrayList<>();
if (list != null) {
for (T t : list) {
if (outNull(t) == true) {
list2.add(t);
}
}
}
return list2;
}
//只要有一个不为null则添加进去
public boolean outNull(Object o) throws Exception {
if (o != null) {
Class aa = o.getClass();
Field[] fields = aa.getDeclaredFields();
for (Field field : fields) {//id
field.setAccessible(true);
if (field.get(o) != null && !field.getName().equals("rowNum")) {
return true;
}
}
}
return false;
}
}
package org.rcisoft.sys.sysuser.util;
import org.apache.commons.lang3.StringUtils;
import org.rcisoft.core.constant.CySysCons;
import org.rcisoft.sys.sysuser.dto.ExportUserDTO;
import org.rcisoft.sys.sysuser.entity.SysUser;
import org.rcisoft.sys.wbac.user.dto.ErrorDTO;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@ConditionalOnProperty(prefix = "cy.model", name = "permission", havingValue = CySysCons.WORK_BASE)
public class CheckUtil {
/**
* 对导入的用户信息进行非空校验
*
* @param sysUser 用户信息
* @param row 行数
* @return
*/
public static ErrorDTO userNotNull(ExportUserDTO sysUser, int row) {
ErrorDTO errorDTO = new ErrorDTO();
Map<Integer, List<String>> notTrues = new HashMap<>();
List<String> notTrue = new ArrayList<>();
errorDTO.setSuccess(0);
if (StringUtils.isEmpty(sysUser.getUsername())) {
notTrue.add("用户名不能为空");
}
if (StringUtils.isEmpty(sysUser.getName())) {
notTrue.add("姓名不能为空");
}
if (StringUtils.isEmpty(sysUser.getEmail())) {
notTrue.add("邮箱不能为空");
}
if (StringUtils.isEmpty(sysUser.getPhone())) {
notTrue.add("手机号不能为空");
}
if (StringUtils.isEmpty(sysUser.getIdNumber())) {
notTrue.add("身份证号不能为空");
}
if (StringUtils.isEmpty(sysUser.getSex())) {
notTrue.add("性别不能为空");
}
if (StringUtils.isEmpty(sysUser.getPostIds())) {
notTrue.add("岗位不能为空");
}
if (notTrue.size() > 0) {
errorDTO.setSuccess(1);
notTrues.put(row, notTrue);
errorDTO.setMap(notTrues);
}
return errorDTO;
}
/**
* 对导入信息进行查重校验
*
* @param sysUser 导入用户信息
* @param row 行数
* @param sysUsers 已有用户信息
* @return
*/
public static ErrorDTO userRepeat(ExportUserDTO sysUser, int row, List<SysUser> sysUsers) {
ErrorDTO errorDTO = new ErrorDTO();
Map<Integer, List<String>> notTrues = new HashMap<>();
List<String> notTrue = new ArrayList<>();
errorDTO.setSuccess(0);
for (SysUser existenceUser : sysUsers) {
if (existenceUser.getUsername().equals(sysUser.getUsername())) {
notTrue.add("登录名不能重复");
}
if (existenceUser.getIdNumber().equals(sysUser.getIdNumber())) {
notTrue.add("身份证号不能重复");
}
}
if (notTrue.size() > 0) {
errorDTO.setSuccess(1);
notTrues.put(row, notTrue);
errorDTO.setMap(notTrues);
}
return errorDTO;
}
}
server:
port: 8082
port: 8088
tomcat:
max-threads: 300
servlet:
......
# redis
cy_redis:
ip: xdzy_redis
port: 6379
# rabbitMq
cy_mq:
ip: 106.2.17.236
port: 5677
username: mq
password: mq
# db
cy_db:
ip: 192.168.18.191
port: 13306
username: root
password: oohrenwrl232
db: xdzy
#cy_db:
# ip: 127.0.0.1
# port: 3306
# username: root
# password: 111111
# mongodb
cy_mongodb:
ip: 127.0.0.1
port: 27017
username: fox
password: fox
db: cy
authDb: cy
#cy_mongodb:
# ip: 124.71.16.228
# port: 27017
# username: admin
# password: 123456
# db: springboot
# authDb: springboot
cy:
model:
swagger2Config: true
security:
enable: true
permission: false
defaultFilter: true
gateway: false
acAllowOrigin: '*'
acAllowMethods: 'POST, GET, OPTIONS, DELETE,PUT'
acAllowHeaders: '*'
permit-all:
permitUnStatic:
- "/static/**"
- "/webjars/**"
- "/v2/**"
- "/swagger-resources/**"
- "/api-docs/**"
- "/auth/**"
- "/code/**/**"
- "/excelUtil/**"
#- "/cros/**"
- "/nlttest/add/**"
- "/**/**"
permitStatic: [ "/", "/*.html", "/favicon.ico", "/**/*.html", "/**/*.js", "/**/*.css" ]
logoutSuccessUrl: "/login"
loginPage: "/login"
loginfailureUrl: "/login-error.html"
logging:
level:
root: info
com.alibaba.nacos: info
# root: debug
# com.alibaba.nacos: debug
......@@ -3,3 +3,4 @@ spring:
active: dev
group:
dev: dev-conf,common
prod: prod-conf,common
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