【更新】完善导入功能

pull/87/head
xuyuxiang 2023-03-07 17:08:06 +08:00
parent 20c238f9cd
commit 2056089ed9
8 changed files with 195 additions and 17 deletions

View File

@ -93,6 +93,14 @@ public interface SysOrgService extends IService<SysOrg> {
**/
List<SysOrg> getCachedAllOrgList();
/**
* id
*
* @author xuyuxiang
* @date 2023/3/7 15:44
**/
String getOrgIdByOrgFullNameWithCreate(String orgFullName);
/**
* id
*
@ -123,7 +131,7 @@ public interface SysOrgService extends IService<SysOrg> {
* @author xuyuxiang
* @date 2022/8/15 14:55
**/
SysOrg getById(List<SysOrg> originDataList, String id) ;
SysOrg getById(List<SysOrg> originDataList, String id);
/**
* id
@ -131,7 +139,7 @@ public interface SysOrgService extends IService<SysOrg> {
* @author xuyuxiang
* @date 2022/8/15 14:55
**/
SysOrg getParentById(List<SysOrg> originDataList, String id) ;
SysOrg getParentById(List<SysOrg> originDataList, String id);
/**
* id
@ -139,7 +147,7 @@ public interface SysOrgService extends IService<SysOrg> {
* @author xuyuxiang
* @date 2022/8/15 14:55
**/
SysOrg getChildById(List<SysOrg> originDataList, String id) ;
SysOrg getChildById(List<SysOrg> originDataList, String id);
/**
*

View File

@ -48,6 +48,7 @@ import vip.xiaonuo.sys.modular.user.entity.SysUser;
import vip.xiaonuo.sys.modular.user.service.SysUserService;
import javax.annotation.Resource;
import java.util.Iterator;
import java.util.List;
import java.util.stream.Collectors;
@ -222,6 +223,50 @@ public class SysOrgServiceImpl extends ServiceImpl<SysOrgMapper, SysOrg> impleme
return orgList;
}
@Override
public String getOrgIdByOrgFullNameWithCreate(String orgFullName) {
List<SysOrg> cachedAllOrgList = this.getCachedAllOrgList();
List<Tree<String>> treeList = TreeUtil.build(cachedAllOrgList.stream().map(sysOrg ->
new TreeNode<>(sysOrg.getId(), sysOrg.getParentId(), sysOrg.getName(), sysOrg.getSortCode()))
.collect(Collectors.toList()), "0");
return findOrgIdByOrgName("0", StrUtil.split(orgFullName, StrUtil.DASHED).iterator(), cachedAllOrgList, treeList);
}
public String findOrgIdByOrgName(String parentId, Iterator<String> iterator, List<SysOrg> cachedAllOrgList, List<Tree<String>> treeList) {
String next = iterator.next();
List<Tree<String>> findList = treeList.stream().filter(tree -> tree.getName().equals(next)).collect(Collectors.toList());
if(ObjectUtil.isNotEmpty(findList)) {
if(iterator.hasNext()) {
return findOrgIdByOrgName(findList.get(0).getId(), iterator, cachedAllOrgList, findList.get(0).getChildren());
} else {
return findList.get(0).getId();
}
} else {
//创建该机构
SysOrg sysOrg = new SysOrg();
sysOrg.setName(next);
sysOrg.setCode(RandomUtil.randomString(10));
sysOrg.setParentId(parentId);
sysOrg.setCategory(parentId.equals("0")?SysOrgCategoryEnum.COMPANY.getValue():SysOrgCategoryEnum.DEPT.getValue());
sysOrg.setSortCode(99);
this.save(sysOrg);
// 发布增加事件
CommonDataChangeEventCenter.doAddWithData(SysDataTypeEnum.ORG.getValue(), JSONUtil.createArray().put(sysOrg));
// 将该机构加入缓存
cachedAllOrgList.add(sysOrg);
// 更新缓存
commonCacheOperator.put(ORG_CACHE_ALL_KEY, cachedAllOrgList);
// 继续查找
if(iterator.hasNext()) {
return findOrgIdByOrgName(sysOrg.getId(), iterator, cachedAllOrgList, CollectionUtil.newArrayList());
} else {
return sysOrg.getId();
}
}
}
/* ====组织部分所需要用到的选择器==== */
@Override

View File

@ -82,7 +82,15 @@ public interface SysPositionService extends IService<SysPosition> {
* @author xuyuxiang
* @date 2022/8/15 14:55
**/
SysPosition getById(List<SysPosition> originDataList, String id) ;
SysPosition getById(List<SysPosition> originDataList, String id);
/**
* idid
*
* @author xuyuxiang
* @date 2022/8/15 14:55
**/
String getPositionIdByPositionNameWithCreate(String orgId, String positionName);
/* ====职位部分所需要用到的选择器==== */

View File

@ -171,7 +171,26 @@ public class SysPositionServiceImpl extends ServiceImpl<SysPositionMapper, SysPo
int index = CollStreamUtil.toList(originDataList, SysPosition::getId).indexOf(id);
return index == -1?null:originDataList.get(index);
}
@Override
public String getPositionIdByPositionNameWithCreate(String orgId, String positionName) {
SysPosition sysPosition = this.getOne(new LambdaQueryWrapper<SysPosition>().eq(SysPosition::getOrgId, orgId).eq(SysPosition::getName, positionName));
if(ObjectUtil.isNotEmpty(sysPosition)) {
return sysPosition.getId();
} else {
sysPosition = new SysPosition();
sysPosition.setOrgId(orgId);
sysPosition.setName(positionName);
sysPosition.setCode(RandomUtil.randomString(10));
sysPosition.setCategory(SysPositionCategoryEnum.LOW.getValue());
sysPosition.setSortCode(99);
this.save(sysPosition);
// 发布增加事件
CommonDataChangeEventCenter.doAddWithData(SysDataTypeEnum.POSITION.getValue(), JSONUtil.createArray().put(sysPosition));
return sysPosition.getId();
}
}
/* ====职位部分所需要用到的选择器==== */
@Override

View File

@ -13,6 +13,7 @@
package vip.xiaonuo.sys.modular.user.controller;
import cn.hutool.core.lang.tree.Tree;
import cn.hutool.json.JSONObject;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
@ -283,9 +284,8 @@ public class SysUserController {
@ApiOperation("用户导入")
@CommonLog("用户导入")
@PostMapping("/sys/user/import")
public CommonResult<String> importUser(@RequestPart("file") @ApiParam(value="文件", required = true) MultipartFile file) {
sysUserService.importUser(file);
return CommonResult.ok();
public CommonResult<JSONObject> importUser(@RequestPart("file") @ApiParam(value="文件", required = true) MultipartFile file) {
return CommonResult.data(sysUserService.importUser(file));
}
/**

View File

@ -354,7 +354,7 @@ public interface SysUserService extends IService<SysUser> {
* @author xuyuxiang
* @date 2022/8/8 13:16
**/
void importUser(MultipartFile file);
JSONObject importUser(MultipartFile file);
/**
*

View File

@ -42,7 +42,6 @@ import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.read.listener.PageReadListener;
import com.alibaba.excel.write.handler.CellWriteHandler;
import com.alibaba.excel.write.handler.context.CellWriteHandlerContext;
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
@ -980,21 +979,120 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
}
}
@Transactional(rollbackFor = Exception.class)
@Override
public void importUser(MultipartFile file) {
public JSONObject importUser(MultipartFile file) {
try {
// TODO 导入
EasyExcel.read("D://import.xlsx", SysUserImportParam.class, new PageReadListener<SysUserImportParam>(dataList -> {
for (SysUserImportParam sysUserImportParam : dataList) {
System.out.println(sysUserImportParam);
int successCount = 0;
int errorCount = 0;
JSONArray errorDetail = JSONUtil.createArray();
List<SysUserImportParam> sysUserImportParamList = EasyExcel.read("D://import.xlsx")
.head(SysUserImportParam.class).sheet().headRowNumber(2).doReadSync();
for (int i = 0; i < sysUserImportParamList.size(); i++) {
JSONObject jsonObject = this.doImport(sysUserImportParamList.get(i), i);
if(jsonObject.getBool("success")) {
successCount += 1;
} else{
errorCount += 1;
errorDetail.add(jsonObject);
}
})).sheet().headRowNumber(2).doRead();
}
return JSONUtil.createObj()
.set("totalCount", sysUserImportParamList.size())
.set("successCount", successCount)
.set("errorCount", errorCount)
.set("errorDetail", errorDetail);
} catch (Exception e) {
e.printStackTrace();
throw new CommonException("文件导入失败");
}
}
/**
*
*
* @author xuyuxiang
* @date 2023/3/7 13:22
**/
public JSONObject doImport(SysUserImportParam sysUserImportParam, int i) {
String account = sysUserImportParam.getAccount();
String name = sysUserImportParam.getName();
String orgName = sysUserImportParam.getOrgName();
String positionName = sysUserImportParam.getPositionName();
if(ObjectUtil.hasEmpty(account, name, orgName, positionName)) {
return JSONUtil.createObj().set("index", i + 1).set("success", false).set("msg", "必填字段存在空值");
} else {
try {
List<SysUser> cachedAllUserList = this.getCachedAllUserList();
String orgId = sysOrgService.getOrgIdByOrgFullNameWithCreate(sysUserImportParam.getOrgName());
String positionId = sysPositionService.getPositionIdByPositionNameWithCreate(orgId, sysUserImportParam.getPositionName());
SysUser sysUser = this.getOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getAccount, account));
boolean isAdd = false;
String existUserId = null;
if(ObjectUtil.isEmpty(sysUser)) {
sysUser = new SysUser();
isAdd = true;
} else {
existUserId = sysUser.getId();
}
String phone = sysUser.getPhone();
String email = sysUser.getEmail();
// 拷贝属性
BeanUtil.copyProperties(sysUserImportParam, sysUser);
sysUser.setOrgId(orgId);
sysUser.setPositionId(positionId);
// 判断手机号是否跟系统现有的重复
if(ObjectUtil.isNotEmpty(phone)) {
if(isAdd) {
boolean repeatPhone = cachedAllUserList.stream().anyMatch(tempSysUser -> ObjectUtil
.isNotEmpty(tempSysUser.getPhone()) && tempSysUser.getPhone().equals(phone));
if(repeatPhone) {
sysUser.setPhone(null);
}
} else {
String finalExistUserId = existUserId;
boolean repeatPhone = cachedAllUserList.stream().anyMatch(tempSysUser -> ObjectUtil
.isNotEmpty(tempSysUser.getPhone()) && tempSysUser.getPhone()
.equals(phone) && !tempSysUser.getId().equals(finalExistUserId));
if(repeatPhone) {
sysUser.setPhone(phone);
}
}
}
// 判断邮箱是否跟系统现有的重复
if(ObjectUtil.isNotEmpty(email)) {
if(isAdd) {
boolean repeatPhone = cachedAllUserList.stream().anyMatch(tempSysUser -> ObjectUtil
.isNotEmpty(tempSysUser.getEmail()) && tempSysUser.getEmail().equals(email));
if(repeatPhone) {
sysUser.setPhone(null);
}
} else {
String finalExistUserId = existUserId;
boolean repeatPhone = cachedAllUserList.stream().anyMatch(tempSysUser -> ObjectUtil
.isNotEmpty(tempSysUser.getEmail()) && tempSysUser.getEmail()
.equals(email) && !tempSysUser.getId().equals(finalExistUserId));
if(repeatPhone) {
sysUser.setPhone(email);
}
}
}
this.saveOrUpdate(sysUser);
// 发布增加事件
CommonDataChangeEventCenter.doAddWithData(SysDataTypeEnum.ORG.getValue(), JSONUtil.createArray().put(sysUser));
// 将该用户加入缓存
cachedAllUserList.add(sysUser);
// 更新缓存
commonCacheOperator.put(USER_CACHE_ALL_KEY, cachedAllUserList);
// 返回成功
return JSONUtil.createObj().set("success", true);
} catch (Exception e) {
e.printStackTrace();
return JSONUtil.createObj().set("index", i + 1).set("success", false).set("msg", "数据导入异常");
}
}
}
@Override
public void exportUser(SysUserExportParam sysUserExportParam, HttpServletResponse response) throws IOException {
File tempFile = null;
@ -1143,7 +1241,7 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
if(ObjectUtil.isNotEmpty(sysUser.getAvatar())) {
avatarBase64 = sysUser.getAvatar();
} else {
avatarBase64 = CommonAvatarUtil.generateImg(sysUser.getAvatar());
avatarBase64 = CommonAvatarUtil.generateImg(sysUser.getName());
}
// 头像
ImageEntity imageEntity = new ImageEntity(ImgUtil.toBytes(ImgUtil.toImage(StrUtil