Commit 31a61011 authored by tianhongyang's avatar tianhongyang

Merge branch 'V20230915' of http://192.168.60.201/root/dsk-operate-sys into V20230915

parents 0fa8ec63 1e24d93b
...@@ -6,6 +6,7 @@ import cn.hutool.core.bean.BeanUtil; ...@@ -6,6 +6,7 @@ import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.lang.tree.Tree; import cn.hutool.core.lang.tree.Tree;
import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.dsk.biz.utils.ExcelUtils;
import com.dsk.common.annotation.Log; import com.dsk.common.annotation.Log;
import com.dsk.common.constant.GlobalConstants; import com.dsk.common.constant.GlobalConstants;
import com.dsk.common.core.controller.BaseController; import com.dsk.common.core.controller.BaseController;
...@@ -13,7 +14,7 @@ import com.dsk.common.core.domain.PageQuery; ...@@ -13,7 +14,7 @@ import com.dsk.common.core.domain.PageQuery;
import com.dsk.common.core.domain.R; import com.dsk.common.core.domain.R;
import com.dsk.common.core.page.TableDataInfo; import com.dsk.common.core.page.TableDataInfo;
import com.dsk.common.enums.BusinessType; import com.dsk.common.enums.BusinessType;
import com.dsk.common.excel.ExcelResult; import com.dsk.common.exception.ServiceException;
import com.dsk.common.helper.LoginHelper; import com.dsk.common.helper.LoginHelper;
import com.dsk.common.utils.StreamUtils; import com.dsk.common.utils.StreamUtils;
import com.dsk.common.utils.StringUtils; import com.dsk.common.utils.StringUtils;
...@@ -25,7 +26,6 @@ import com.dsk.system.domain.SysUser; ...@@ -25,7 +26,6 @@ import com.dsk.system.domain.SysUser;
import com.dsk.system.domain.vo.SysUserExportVo; import com.dsk.system.domain.vo.SysUserExportVo;
import com.dsk.system.domain.vo.SysUserImportVo; import com.dsk.system.domain.vo.SysUserImportVo;
import com.dsk.system.domain.vo.SysUserVo; import com.dsk.system.domain.vo.SysUserVo;
import com.dsk.system.listener.SysUserImportListener;
import com.dsk.system.service.ISysDeptService; import com.dsk.system.service.ISysDeptService;
import com.dsk.system.service.ISysPostService; import com.dsk.system.service.ISysPostService;
import com.dsk.system.service.ISysRoleService; import com.dsk.system.service.ISysRoleService;
...@@ -106,14 +106,39 @@ public class SysUserController extends BaseController { ...@@ -106,14 +106,39 @@ public class SysUserController extends BaseController {
@SaCheckPermission("system:user:import") @SaCheckPermission("system:user:import")
@PostMapping(value = "/importData", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) @PostMapping(value = "/importData", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public R<List<SysUserImportVo>> importData(@RequestPart("file") MultipartFile file, boolean updateSupport) throws Exception { public R<List<SysUserImportVo>> importData(@RequestPart("file") MultipartFile file, boolean updateSupport) throws Exception {
ExcelResult<SysUserImportVo> result = ExcelUtil.importExcel(file.getInputStream(), SysUserImportVo.class, new SysUserImportListener(updateSupport)); //ExcelResult<SysUserImportVo> result = ExcelUtil.importExcel(file.getInputStream(), SysUserImportVo.class, new SysUserImportListener(updateSupport));
List<SysUserImportVo> resultList = result.getList(); //List<SysUserImportVo> resultList = result.getList();
if (!resultList.isEmpty()) { //if (!resultList.isEmpty()) {
// String key = GlobalConstants.BATCH_IMPORT_FAIL_USERS + LoginHelper.getUserId();
// RedisUtils.setCacheList(key, resultList);
// return R.fail(resultList);
//}
//return R.ok(result.getAnalysis());
//识别Excel内容
List<SysUserImportVo> userImportList = new ExcelUtils<>(SysUserImportVo.class).importExcel(file.getInputStream(), 2);
if (userImportList.isEmpty()) {
throw new ServiceException("表格中不存在待导入数据!");
}
for (SysUserImportVo userImportVo : userImportList) {
System.out.println("👉🏻:"+userImportVo);
}
//开始导入业务
List<SysUserImportVo> failImportUsers = userService.batchImportUser(userImportList, updateSupport);
//将导入失败用户存入Redis并返回给前端
if (!failImportUsers.isEmpty()) {
String key = GlobalConstants.BATCH_IMPORT_FAIL_USERS + LoginHelper.getUserId(); String key = GlobalConstants.BATCH_IMPORT_FAIL_USERS + LoginHelper.getUserId();
RedisUtils.setCacheList(key, resultList); //删除旧的
return R.fail(resultList); RedisUtils.deleteObject(key);
//写入新的
RedisUtils.setCacheList(key, failImportUsers);
return R.fail(failImportUsers);
} }
return R.ok(result.getAnalysis());
return R.ok();
} }
/** /**
...@@ -122,7 +147,7 @@ public class SysUserController extends BaseController { ...@@ -122,7 +147,7 @@ public class SysUserController extends BaseController {
@PostMapping("/importTemplate") @PostMapping("/importTemplate")
public void importTemplate(HttpServletResponse response) { public void importTemplate(HttpServletResponse response) {
List<Object> list = new ArrayList<>(); List<Object> list = new ArrayList<>();
list.add(new SysUserImportVo("测试组织", "测试用户昵称", "18888888888", "测试角色")); list.add(new SysUserImportVo("重庆市轨道交通(集团)有限公司", "刘国海", "18888888888", "运营部部长"));
ExcelUtil.exportTemplate(list, "用户数据", "excel/userImportTemplate.xlsx", response); ExcelUtil.exportTemplate(list, "用户数据", "excel/userImportTemplate.xlsx", response);
} }
......
...@@ -5,7 +5,7 @@ VUE_APP_TITLE = 数字化经营履约全生命链路管理系统 ...@@ -5,7 +5,7 @@ VUE_APP_TITLE = 数字化经营履约全生命链路管理系统
ENV = 'production' ENV = 'production'
# 数字化经营履约全生命链路管理系统/生产环境 # 数字化经营履约全生命链路管理系统/生产环境
VUE_APP_BASE_API = 'https://szhapi.jiansheku.com/' VUE_APP_BASE_API = 'https://szhapi.jiansheku.com'
# 子系统地址 # 子系统地址
VUE_APP_SUB_SYSTEM_ADDRESS = "https://plug.jiansheku.com" VUE_APP_SUB_SYSTEM_ADDRESS = "https://plug.jiansheku.com"
\ No newline at end of file
...@@ -358,6 +358,9 @@ export default { ...@@ -358,6 +358,9 @@ export default {
width: 100%; width: 100%;
background: #fff; background: #fff;
position: relative; position: relative;
::v-deep .el-scrollbar__wrap{
margin-left: 64px;
}
.tags-view-wrapper { .tags-view-wrapper {
.tags-view-item { .tags-view-item {
display: inline-block; display: inline-block;
...@@ -393,9 +396,9 @@ export default { ...@@ -393,9 +396,9 @@ export default {
background: #FFFFFF; background: #FFFFFF;
} }
} }
&:first-of-type { /*&:first-of-type {*/
margin-left: 64px; /*margin-left: 64px;*/
} /*}*/
&:hover { &:hover {
.el-icon-close{ .el-icon-close{
background-color: rgba(153,153,153,0.3); background-color: rgba(153,153,153,0.3);
......
package com.dsk.system.domain.vo; package com.dsk.system.domain.vo;
import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.ExcelProperty;
import com.dsk.common.annotation.Excel;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
...@@ -23,38 +24,38 @@ public class SysUserImportVo implements Serializable { ...@@ -23,38 +24,38 @@ public class SysUserImportVo implements Serializable {
/** /**
* 所属组织 * 所属组织
*/ */
@ExcelProperty(value = "*所属组织") @Excel(name = "所属组织(必填)")
private String deptName; private String deptName;
/** /**
* 用户昵称 * 用户昵称
*/ */
@ExcelProperty(value = "*用户昵称") @Excel(name = "用户名称(必填)")
private String nickName; private String nickName;
/** /**
* 手机号码 * 手机号码
*/ */
@ExcelProperty(value = "*手机号码") @Excel(name = "手机号码(必填)")
private String phonenumber; private String phonenumber;
/** /**
* 用户角色 * 用户角色
*/ */
@ExcelProperty(value = "*用户角色") @Excel(name = "用户角色")
private String roleName; private String roleName;
/** /**
* 失败原因 * 失败原因
* 该字段无需同步到模板中 * 该字段无需同步到模板中
*/ */
@ExcelProperty(value = "失败原因") @Excel(name = "失败原因")
private String failReason; private String failReason;
public SysUserImportVo(String deptName, String nickName, String phonenumber, String roleName) { public SysUserImportVo(String deptName, String nickName, String phonenumber, String roleName) {
this.deptName = deptName.replace(" ", ""); this.deptName = deptName.replace(" ", "");
this.nickName = nickName.replace(" ", ""); this.nickName = nickName.replace(" ", "");
this.phonenumber = phonenumber; this.phonenumber = phonenumber.replace(" ", "");
this.roleName = roleName.replace(" ", ""); this.roleName = roleName.replace(" ", "");
} }
} }
...@@ -3,6 +3,7 @@ package com.dsk.system.service; ...@@ -3,6 +3,7 @@ package com.dsk.system.service;
import com.dsk.common.core.domain.PageQuery; import com.dsk.common.core.domain.PageQuery;
import com.dsk.system.domain.SysUser; import com.dsk.system.domain.SysUser;
import com.dsk.common.core.page.TableDataInfo; import com.dsk.common.core.page.TableDataInfo;
import com.dsk.system.domain.vo.SysUserImportVo;
import java.util.List; import java.util.List;
...@@ -111,6 +112,15 @@ public interface ISysUserService { ...@@ -111,6 +112,15 @@ public interface ISysUserService {
*/ */
void checkUserAllowed(SysUser user); void checkUserAllowed(SysUser user);
/**
* 批量导入(更新)用户
*
* @param userImportList Excel中识别出的用户集合
* @param updateSupport 是否更新标识符
* @return 导入失败用户集合
*/
List<SysUserImportVo> batchImportUser(List<SysUserImportVo> userImportList, boolean updateSupport);
/** /**
* 校验用户是否有数据权限 * 校验用户是否有数据权限
* *
......
package com.dsk.system.service.impl; package com.dsk.system.service.impl;
import cn.dev33.satoken.secure.BCrypt; import cn.dev33.satoken.secure.BCrypt;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateTime;
import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ArrayUtil;
...@@ -22,7 +23,9 @@ import com.dsk.common.helper.LoginHelper; ...@@ -22,7 +23,9 @@ import com.dsk.common.helper.LoginHelper;
import com.dsk.common.utils.PasswordUtils; import com.dsk.common.utils.PasswordUtils;
import com.dsk.common.utils.StreamUtils; import com.dsk.common.utils.StreamUtils;
import com.dsk.common.utils.StringUtils; import com.dsk.common.utils.StringUtils;
import com.dsk.common.utils.ValidatorUtils;
import com.dsk.system.domain.*; import com.dsk.system.domain.*;
import com.dsk.system.domain.vo.SysUserImportVo;
import com.dsk.system.mapper.*; import com.dsk.system.mapper.*;
import com.dsk.system.service.ISysUserService; import com.dsk.system.service.ISysUserService;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
...@@ -35,10 +38,7 @@ import org.springframework.cache.annotation.Cacheable; ...@@ -35,10 +38,7 @@ import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.util.Arrays; import java.util.*;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
/** /**
* 用户 业务层处理 * 用户 业务层处理
...@@ -250,6 +250,73 @@ public class SysUserServiceImpl implements ISysUserService, UserService { ...@@ -250,6 +250,73 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
} }
} }
@Override
@Transactional(rollbackFor = Exception.class)
public List<SysUserImportVo> batchImportUser(List<SysUserImportVo> userImportList, boolean updateSupport) {
//导入失败用户集合
ArrayList<SysUserImportVo> failImportUsers = new ArrayList<>();
//导入成功用户数量
int successNum = 0;
//导入失败用户数量
int failureNum = 0;
for (SysUserImportVo userVo : userImportList) {
//无需判断字段是否为空,若查不到,直接存入导入失败的用户集合
SysUser user = this.baseMapper.selectUserByPhonenumber(userVo.getPhonenumber());
SysDept dept = this.deptMapper.selectOne(new LambdaQueryWrapper<SysDept>().eq(SysDept::getDeptName, userVo.getDeptName()));
SysRole role = this.roleMapper.selectOne(new LambdaQueryWrapper<SysRole>().eq(SysRole::getRoleName, userVo.getRoleName()));
try {
if (ObjectUtil.isNull(dept)) {
throw new ServiceException("部门不存在");
}
if (ObjectUtil.isNull(role)) {
throw new ServiceException("角色不存在");
}
// 验证是否存在这个用户
if (ObjectUtil.isNull(user)) {
user = BeanUtil.toBean(userVo, SysUser.class);
user.setUserName(userVo.getPhonenumber());
user.setDeptId(dept.getDeptId());
user.setDept(dept);
user.setRoleId(role.getRoleId());
user.setRoleIds(new Long[]{role.getRoleId()});
ValidatorUtils.validate(user);
user.setCreateBy(LoginHelper.getUsername());
this.insertUser(user);
} else if (updateSupport) {
Long userId = user.getUserId();
user = BeanUtil.toBean(userVo, SysUser.class);
user.setUserId(userId);
user.setUserName(userVo.getPhonenumber());
user.setDeptId(dept.getDeptId());
user.setDept(dept);
user.setRoleId(role.getRoleId());
user.setRoleIds(new Long[]{role.getRoleId()});
ValidatorUtils.validate(user);
this.checkUserAllowed(user);
this.checkUserDataScope(user.getUserId());
user.setUpdateBy(LoginHelper.getUsername());
this.updateUser(user);
log.info(++successNum + "、账号 " + user.getUserName() + " 更新成功");
} else {
userVo.setFailReason("手机号已存在");
log.error(++failureNum + "、账号 " + user.getUserName() + " 已存在");
failImportUsers.add(userVo);
}
} catch (Exception e) {
userVo.setFailReason(e.getMessage());
failImportUsers.add(userVo);
log.error(++failureNum + "、账号 " + userVo.getPhonenumber() + " 导入失败:", e);
}
}
return failImportUsers;
}
/** /**
* 校验用户是否有数据权限 * 校验用户是否有数据权限
* *
......
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