package com.iplatform.base.controller; import com.iplatform.base.ArgumentsConstants; import com.iplatform.base.Constants; import com.iplatform.base.DefaultUserPrincipal; import com.iplatform.base.PlatformUserCallback; import com.iplatform.base.SystemController; import com.iplatform.base.excel.UserDataImportor; import com.iplatform.base.pojo.UserParam; import com.iplatform.base.service.LoginServiceImpl; import com.iplatform.base.service.RoleServiceImpl; import com.iplatform.base.service.UserServiceImpl; import com.iplatform.base.util.UserUtils; import com.iplatform.base.util.role.SystemRole; import com.iplatform.base.util.user.SystemUser; import com.iplatform.model.po.S_role; import com.iplatform.model.po.S_user_core; import com.walker.db.page.GenericPager; import com.walker.di.DataImportException; import com.walker.file.FileInfo; import com.walker.infrastructure.utils.DateUtils; import com.walker.infrastructure.utils.NumberGenerator; import com.walker.infrastructure.utils.StringUtils; import com.walker.web.ResponseValue; import com.walker.web.UserOnlineProvider; import com.walker.web.log.BusinessType; import com.walker.web.log.Log; import com.walker.web.log.OperateUser; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; //@Api(tags = "用户管理模块") @RestController @RequestMapping("/system/user") public class UserController extends SystemController { // private DeptCacheProvider deptCacheProvider; private UserServiceImpl userService; private RoleServiceImpl roleService; // 2023-03-22 private LoginServiceImpl loginService; private UserOnlineProvider userOnlineProvider; @Autowired public UserController(UserServiceImpl userService, RoleServiceImpl roleService // , UserCacheProvider userCacheProvider, DeptCacheProvider deptCacheProvider , LoginServiceImpl loginService, UserOnlineProvider userOnlineProvider){ // this.setDeptCacheProvider(deptCacheProvider); // this.setUserCacheProvider(userCacheProvider); this.userService = userService; this.roleService = roleService; this.loginService = loginService; this.userOnlineProvider = userOnlineProvider; } @PostMapping("/import") public ResponseValue importExcel(MultipartFile file, boolean updateSupport){ try { UserDataImportor dataImportor = new UserDataImportor(file.getInputStream()); dataImportor.setId("user_import"); this.getDataImportEngine().executeImport(dataImportor, this.getCurrentUserPrincipal().getUserName()); logger.info("成功导入记录:{}", dataImportor.getSuccessSize()); logger.info("错误结果文件:{}", dataImportor.getErrorFile()); // FileInfo errorFileInfo = this.uploadFileToRemote(dataImportor.getErrorFile()); FileInfo errorFileInfo = this.uploadFileToRemote(dataImportor.getErrorFile(), null, String.valueOf(this.getOwner())); if(errorFileInfo != null){ logger.debug("用户导入存在'不符合数据': ,", errorFileInfo.toString()); logger.debug("这里可以返回给前端,让前端点击链接下载!"); } return ResponseValue.success(); } catch (Exception e) { if(e instanceof DataImportException){ return ResponseValue.error("导入出现异常:" + e.getMessage()); } logger.error("io异常:" + e.getMessage(), e); return ResponseValue.error("上传文件异常:" + e.getMessage()); } } /** * 下载导入模板,该方法可做成统一接口,适合动态生成的模板。

* 对于特定自定义的模板,业务自己提供下载地址。 * @author 时克英 * @date 2023-02-08 */ @PostMapping("/select/downloadTemplate") public void downloadTemplate(){ // 要保存的模板临时路径,仅仅提供一个本地路径地址,供导入引擎自动生成并保存! // String templatePath = "d:/tmp/template_user.xlsx"; // TemplateInfo templateInfo = new TemplateInfo(); // templateInfo.setTemplatePath(templatePath); // templateInfo.setTableName("s_user_core"); // // File templateFile = this.getDataImportEngine().generateTemplate(templateInfo); // // try { // this.downloadSimpleFile(FileCopyUtils.copyToByteArray(templateFile), "系统用户导入"); // } catch (IOException e) { // logger.error("下载'导出用户'模板错误:" + e.getMessage(), e); // ServletUtils.renderString(getResponse(), "下载'导出用户'模板错误:" + e.getMessage()); // } this.downloadLocalImportTemplate("s_user_core"); } /** * 更新用户归属角色,用户管理 --> 设置角色 * @param userId * @param roleIds * @return * @date 2022-12-15 */ @PostMapping("/select/saveAuthRole") public ResponseValue updateAuthRole(Long userId, Long[] roleIds){ if(userId == null || userId.longValue() <= 0){ return ResponseValue.error("参数错误"); } this.userService.execUpdateAuthRole(userId, roleIds); logger.error("更新用户归属角色后,需要更新用户登录缓存中角色列表,记住修改代码!"); // 处理缓存的登录信息中角色更新,2023-03-22 String uuid = this.loginService.queryLoginUUID(userId); if(StringUtils.isNotEmpty(uuid)){ List roleIdList = new ArrayList<>(4); for(long roleId : roleIds){ roleIdList.add(String.valueOf(roleId)); } DefaultUserPrincipal userPrincipal = new DefaultUserPrincipal(this.getUser(userId)); userPrincipal.setRoleIdList(roleIdList); // 缓存登录信息 this.userOnlineProvider.cacheUserPrincipal(uuid, userPrincipal); } else { logger.debug("用户从未登录过,不更新登录uuid信息,userId={}", userId); } return ResponseValue.success(); } /** * 前端,选定用户后,获取授权角色信息。 * @param userId * @return * @date 2022-12-13 */ @GetMapping("/select/authRole/{userId}") public ResponseValue authRole(@PathVariable Long userId){ // List roleList = this.userService.queryUserRoleList(userId); List userAuthRoleList = this.userService.queryAuthRoleList(this.getUserRootOrgId(userId), userId); Map data = new HashMap<>(4); // 本单位所有角色 data.put("roles", userAuthRoleList); // 用户信息 data.put("user", this.getUserCacheProvider().getUser(userId)); return ResponseValue.success(data); } // @ApiOperation(value = "重置用户密码") @PostMapping("/resetPwd") public ResponseValue resetPassword(@RequestBody SystemUser systemUser){ if(systemUser == null || systemUser.getId() == null){ return ResponseValue.error("参数错误"); } String initPassword = this.getArgumentVariable(ArgumentsConstants.KEY_SECURITY_PASSWORD_INIT).getStringValue(); this.userService.execResetPassword(systemUser.getId(), initPassword); S_user_core user_core = this.userService.get(new S_user_core(systemUser.getId())); this.getUserCacheProvider().updateUser(user_core); return ResponseValue.success(); } @GetMapping("/remove/{userId}") @Log(title = "用户管理", businessType = BusinessType.Delete, isSaveRequestData = true, isSaveResponseData = true) public ResponseValue deleteUser(@PathVariable Long userId){ if(userId == null || userId.longValue() <= 0){ return ResponseValue.error("参数错误"); } this.userService.execDeleteUser(userId, this.getPlatformCallback(PlatformUserCallback.class)); this.getUserCacheProvider().removeUser(userId); logger.info("删除一个用户,缓存已更新:" + userId); return ResponseValue.success(); } @PostMapping("/edit") public ResponseValue editUser(@RequestBody SystemUser user_core){ if(user_core == null){ return ResponseValue.error("参数不存在"); } if(StringUtils.isEmpty(user_core.getUser_name()) || StringUtils.isEmpty(user_core.getNick_name())){ return ResponseValue.error("缺少: 登录ID或用户昵称"); } if(user_core.getUser_name().equals(Constants.SUPERVISOR_NAME_DEFAULT)){ return ResponseValue.error("无法使用该用户名"); } S_user_core existUser = null; String phoneNumber = user_core.getPhonenumber(); if(StringUtils.isNotEmpty(phoneNumber)){ existUser = this.userService.queryUserByPhone(phoneNumber); if(existUser != null && existUser.getId().longValue() != user_core.getId().longValue()){ return ResponseValue.error("该手机号已被现有用户使用"); } } String email = user_core.getEmail(); if(StringUtils.isNotEmpty(email)){ existUser = this.userService.queryUserByEmail(email); if(existUser != null && existUser.getId().longValue() != user_core.getId().longValue()){ return ResponseValue.error("该邮箱地址已被现有用户使用"); } } this.userService.execUpdateUser(user_core.$clone(), user_core.getRoleIds(), this.getPlatformCallback(PlatformUserCallback.class)); this.getUserCacheProvider().updateUser(user_core); logger.info("编辑用户成功,并更新缓存: " + user_core.getUser_name()); return ResponseValue.success(); } @PostMapping("/select/changeStatus") public ResponseValue changeStatus(@RequestBody SystemUser systemUser){ if(systemUser == null || systemUser.getId() == null || systemUser.getStatus() == null){ return ResponseValue.error("缺少参数"); } this.userService.execUpdateUserStatus(systemUser.getId(), systemUser.getStatus()); S_user_core user_core = this.userService.get(new S_user_core(systemUser.getId())); this.getUserCacheProvider().updateUser(user_core); return ResponseValue.success(); } @PostMapping("/add") @Log(title = "用户管理", businessType = BusinessType.Insert, operatorType = OperateUser.Manage) public ResponseValue saveUser(@RequestBody SystemUser user_core){ if(user_core == null){ return ResponseValue.error("参数不存在"); } if(StringUtils.isEmpty(user_core.getUser_name()) || StringUtils.isEmpty(user_core.getNick_name())){ return ResponseValue.error("缺少: 登录ID或用户昵称"); } if(user_core.getUser_name().equals(Constants.SUPERVISOR_NAME_DEFAULT)){ return ResponseValue.error("无法使用该用户名"); } S_user_core existUser = this.userService.queryUserByLoginId(user_core.getUser_name()); if(existUser != null){ return ResponseValue.error("登录名已存在"); } // 检查并设置密码 String encryptInitPass = null; if(StringUtils.isEmpty(user_core.getPassword())){ // 用户没有录入特定密码,用平台配置的默认密码 encryptInitPass = this.getArgumentVariable(ArgumentsConstants.KEY_SECURITY_PASSWORD_INIT).getStringValue(); } else { // 用户输入了明文密码 encryptInitPass = this.encryptPassword(user_core.getPassword()); } user_core.setPassword(encryptInitPass); String phoneNumber = user_core.getPhonenumber(); if(StringUtils.isNotEmpty(phoneNumber)){ if(this.userService.queryUserByPhone(phoneNumber) != null){ return ResponseValue.error("该手机号已被现有用户使用"); } } String email = user_core.getEmail(); if(StringUtils.isNotEmpty(email)){ if(this.userService.queryUserByEmail(email) != null){ return ResponseValue.error("该邮箱地址已被现有用户使用"); } } user_core.setCreate_time(DateUtils.getDateTimeNumber(System.currentTimeMillis())); user_core.setCreate_by(this.getCurrentUser().getUser_name()); user_core.setOrg_id(this.getRootOrgIdByDept(user_core.getDept_id())); user_core.setId(NumberGenerator.getLongSequenceNumber()); // 注意:这里保存必须用生成的 S_user_core 对象,所以通过 SystemUser克隆一个即可。 // 否则报错, 2022-12-13 this.userService.execSaveUser(user_core.$clone(), user_core.getRoleIds(), this.getPlatformCallback(PlatformUserCallback.class)); // 更新缓存 this.getUserCacheProvider().putUser(user_core); logger.info("添加一个用户成功,缓存已加入: " + user_core.getUser_name()); return ResponseValue.success(); } /** * 创建新用户时,选择角色列表。 * @param deptId * @return * @date 2022-12-12 */ @GetMapping("/select/role/{deptId}") public ResponseValue getNewUserRoles(@PathVariable Long deptId){ long orgId = 0; if(deptId == null || deptId.longValue() == 0){ //普通用户 orgId = this.getCurrentUser().getOrg_id(); } else { // 超级管理员选了特定机构 orgId = this.getRootOrgIdByDept(deptId); } List roleList = this.roleService.queryRoleList(orgId); Map data = new HashMap<>(4); data.put("roles", roleList); // data.put("init_password", this.getArgumentVariable(ArgumentsConstants.KEY_SECURITY_PASSWORD_INIT).getStringValue()); return ResponseValue.success(data); } /** * 编辑用户时,获得用户信息。 * @param userId * @return * @date 2022-12-13 */ // @GetMapping(value = { "/view", "/view/{userId}" }) @GetMapping("/view/{userId}") public ResponseValue getUserInfo(@PathVariable Long userId){ if(userId == null || userId <= 0){ return ResponseValue.error("参数错误"); } long orgId = this.getUserCacheProvider().getUser(userId).getOrg_id(); List roleList = this.roleService.queryRoleList(orgId); List roleIds = this.userService.queryUserRoleIdList(userId); Map data = new HashMap<>(4); // 本单位所有角色 data.put("roles", roleList); // 用户所属角色 data.put("roleIds", UserUtils.toRoleIdLongList(roleIds)); // 用户信息 data.put("data", this.getUserCacheProvider().getUser(userId)); return ResponseValue.success(data); } @GetMapping("/list") public ResponseValue list(UserParam userParam){ if(userParam == null){ return ResponseValue.error("无法查询用户:没有条件"); } // this.preparePageSearch(); long orgId = 0; long deptId = userParam.getDeptId(); if(!this.isSupervisor()){ // 普通用户,只能看到自己顶级机构用户 orgId = this.getCurrentUser().getOrg_id(); } else { // 超级管理员 if(deptId <= 0){ // 没有选择机构树,无法查询用户 return ResponseValue.error("请选择一个机构查询"); } orgId = this.getRootOrgIdByDept(deptId); } if(orgId == deptId){ // 点击的顶级机构 deptId = 0; } GenericPager pager = this.userService.queryPageUserList(orgId , deptId, userParam.getUserName(), userParam.getPhonenumber(), userParam.getStatus()); // 补充所在'部门名字'属性,2023-03-23 List data = pager.getDatas(); if(!StringUtils.isEmptyList(data)){ data.stream().forEach(p -> { p.setParameterString("dept_name", this.getDeptName(p.getDept_id())); }); } // return this.acquireTablePage(pager.getDatas(), pager.getTotalRows()); return ResponseValue.success(pager); } // private long getRootOrgIdByDept(long deptId){ // S_dept dept = this.deptCacheProvider.getDept(deptId); // if(dept == null){ // throw new IllegalStateException("缓存中未找到机构: " + dept); // } // return dept.getOrg_id(); // } }