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();
// }
}