longz
2026-07-29 607e4ab169b003991ed4788c9dbe0bd1fefc69f3
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/SysUserController.java
@@ -1,6 +1,7 @@
package com.ruoyi.system.controller;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
import javax.annotation.Resource;
@@ -8,8 +9,14 @@
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.chargingPile.api.feignClient.SiteClient;
import com.ruoyi.chargingPile.api.model.Site;
import com.ruoyi.common.core.constant.MsgConstants;
import com.ruoyi.common.core.utils.HttpUtils;
import com.ruoyi.common.core.utils.MsgUtil;
import com.ruoyi.common.core.utils.StringUtils;
import com.ruoyi.common.core.web.page.PageInfo;
import com.ruoyi.common.redis.service.RedisService;
import com.ruoyi.common.security.service.TokenService;
import com.ruoyi.common.security.annotation.Logical;
import com.ruoyi.other.api.domain.TUserSite;
import com.ruoyi.other.api.feignClient.RoleSiteClient;
import com.ruoyi.other.api.feignClient.UserSiteClient;
@@ -19,8 +26,6 @@
import com.ruoyi.system.query.GetSysUserList;
import com.ruoyi.system.query.ShopUserStart;
import com.ruoyi.system.service.*;
import io.seata.core.context.RootContext;
import io.seata.spring.annotation.GlobalTransactional;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.ArrayUtils;
@@ -48,6 +53,9 @@
@RequestMapping("/user")
@Api(tags = "用户信息")
public class SysUserController extends BaseController {
    private static final String RESET_PWD_CODE_KEY = "system:user:resetPwd:code:";
    private static final String RESET_PWD_LIMIT_KEY = "system:user:resetPwd:limit:";
    @Resource
    private ISysUserService userService;
@@ -62,6 +70,9 @@
    @Resource
    private ISysPermissionService permissionService;
    @Resource
    private PartnerTypeRoleService partnerTypeRoleService;
    @Resource
    private ISysConfigService configService;
@@ -80,6 +91,9 @@
    
    @Resource
    private SiteClient siteClient;
    @Resource
    private RedisService redisService;
    
    
    
@@ -88,6 +102,7 @@
    /**
     * 获取用户列表
     */
    @RequiresPermissions(value = {"/systemUserManagement", "/roleManagement/info"}, logical = Logical.OR)
    @GetMapping("/list")
    @ApiOperation(value = "获取系统用户列表", tags = {"管理后台-系统用户管理", "管理后台-角色管理"})
    public AjaxResult list(GetSysUserList getSysUserList) {
@@ -108,10 +123,10 @@
    /**
     * 新增用户
     */
    @RequiresPermissions(value = {"/systemUserManagement/add"}, logical = Logical.OR)
    @Log(title = "用户管理", businessType = BusinessType.INSERT)
    @PostMapping("/add")
    @ApiOperation(value = "添加系统用户", tags = {"管理后台-系统用户管理"})
    @GlobalTransactional(rollbackFor = Exception.class)//分布式事务
    public AjaxResult add(@RequestBody SysUser user) {
        user.setUserName(user.getPhonenumber());
        if(!org.springframework.util.StringUtils.hasLength(user.getNickName())){
@@ -126,6 +141,7 @@
        user.setCreateBy(SecurityUtils.getUsername());
        user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
        user.setRoleType(1);
        user.setPassWordUpdate(new Date());
        userService.insertUser(user);
        SysUserRole sysUserRole = new SysUserRole();
        sysUserRole.setRoleId(user.getRoleId());
@@ -144,6 +160,7 @@
    }
    
    
    @RequiresPermissions(value = {"/systemUserManagement/add", "/systemUserManagement/update"}, logical = Logical.OR)
    @GetMapping("/verifyUserNameRepeat/{username}")
    @ApiOperation(value = "校验账号是否重复", tags = {"管理后台-系统用户管理"})
    public AjaxResult verifyUserNameRepeat(@PathVariable String username){
@@ -155,6 +172,9 @@
        return success();
    }
    
    @RequiresPermissions(value = {"/systemUserManagement/update"}, logical = Logical.OR)
    @GetMapping("/getRoleSiteName/{roleId}")
    @ApiOperation(value = "获取角色对应的站点名称", tags = {"管理后台-系统用户管理"})
    public AjaxResult<List<String>> getRoleSiteName(@PathVariable Integer roleId){
@@ -199,10 +219,10 @@
    /**
     * 修改用户
     */
    @RequiresPermissions(value = {"/systemUserManagement/update"}, logical = Logical.OR)
    @Log(title = "用户管理", businessType = BusinessType.UPDATE)
    @PutMapping("/update")
    @ApiOperation(value = "编辑系统用户", tags = {"管理后台-系统用户管理"})
    @GlobalTransactional(rollbackFor = Exception.class)//分布式事务
    public AjaxResult edit(@Validated @RequestBody SysUser user) {
        user.setUserName(user.getPhonenumber());
        if(!org.springframework.util.StringUtils.hasLength(user.getNickName())){
@@ -243,7 +263,15 @@
        user.setUpdateBy(SecurityUtils.getUsername());
        user.setUpdateTime(new Date());
        userService.updateUser(user);
        //删除旧的角色数据,添加新的角色
        userRoleService.remove(new LambdaQueryWrapper<SysUserRole>().eq(SysUserRole::getUserId, user.getUserId()));
        //添加新的角色数据
        SysUserRole userRole = new SysUserRole();
        userRole.setUserId(user.getUserId());
        userRole.setRoleId(user.getRoleId());
        userRoleService.save(userRole);
        //删除旧的站点数据后添加新的
        userSiteClient.delUserSite(user.getUserId());
        List<Integer> siteIds = user.getSiteIds();
@@ -258,15 +286,17 @@
        return success();
    }
    @Resource
    private TokenService tokenService;
    /**
     * 删除用户
     */
    @RequiresPermissions(value = {"/systemUserManagement/del"}, logical = Logical.OR)
    @Log(title = "用户管理", businessType = BusinessType.DELETE)
    @DeleteMapping("/{userIds}")
    @ApiOperation(value = "删除系统用户", tags = {"管理后台-系统用户管理"})
    public AjaxResult remove(@PathVariable Long[] userIds) {
        if (ArrayUtils.contains(userIds, SecurityUtils.getUserId())) {
        if (ArrayUtils.contains(userIds, tokenService.getLoginUser().getUserid())) {
            return error("当前用户不能删除");
        }
        return toAjax(userService.deleteUserByIds(userIds));
@@ -275,6 +305,7 @@
    
    @RequiresPermissions(value = {"/systemUserManagement/forbidden"}, logical = Logical.OR)
    @PostMapping("/shopUserStart")
    @ApiOperation(value = "账号管理--禁用/启用", tags = {"管理后台-系统用户管理"})
    public AjaxResult shopUserStart(@RequestBody ShopUserStart shopUserStart) {
@@ -354,7 +385,7 @@
    }
    @PostMapping("/getSysUser")
    public R<SysUser> getSysUser(@RequestBody Long userId) {
    public R<SysUser> getSysUser(@RequestParam("userId") Long userId) {
        try {
            SysUser sysUser = userService.selectUserById(userId);
            return R.ok(sysUser);
@@ -418,6 +449,7 @@
                        sysUser.setNickName(companyUserListVo.getNickName());
                        sysUser.setCreateBy(SecurityUtils.getUsername());
                        sysUser.setCreateTime(new Date());
                        sysUser.setPassWordUpdate(new Date());
                        userService.insertUser(sysUser);
                        SysUserRole sysUserRole = new SysUserRole();
                        sysUserRole.setRoleId(20l);
@@ -453,6 +485,7 @@
                    sysUser.setObjectId(dto.getRepairId());
                    sysUser.setUserName(add.getPhonenumber());
                    sysUser.setNickName(add.getPhonenumber());
                    sysUser.setPassWordUpdate(new Date());
                    userService.insertUser(sysUser);
                    userIds.add(sysUser.getUserId().intValue());
                }
@@ -473,8 +506,9 @@
    public R<LoginUser> info(@PathVariable("username") String username) {
        SysUser sysUser = userService.selectUserByUserName(username);
        if (StringUtils.isNull(sysUser)) {
            return R.fail("用户名或密码错误");
            return R.fail("用户名/密码错误");
        }
        sysUser = synchronizePartnerTypeRole(sysUser);
        // 角色集合
        Set<String> roles = permissionService.getRolePermission(sysUser);
        // 权限集合
@@ -483,7 +517,6 @@
        sysUserVo.setSysUser(sysUser);
        sysUserVo.setRoles(roles);
        sysUserVo.setPermissions(permissions);
        return R.ok(sysUserVo);
    }
@@ -509,7 +542,8 @@
     */
    @GetMapping("/getInfo")
    public AjaxResult getInfo() {
        SysUser user = userService.selectUserById(SecurityUtils.getUserId());
        SysUser user = userService.selectUserById(tokenService.getLoginUser().getUserid());
        user = synchronizePartnerTypeRole(user);
        // 角色集合
        Set<String> roles = permissionService.getRolePermission(user);
        // 权限集合
@@ -521,19 +555,144 @@
        return ajax;
    }
    private SysUser synchronizePartnerTypeRole(SysUser user) {
        partnerTypeRoleService.synchronize(user);
        if (user != null && Integer.valueOf(2).equals(user.getRoleType()) && user.getObjectId() != null) {
            return userService.selectUserById(user.getUserId());
        }
        return user;
    }
    /**
     * 发送重置密码验证码
     */
    @RequiresPermissions(value = {"/systemUserManagement/reset_passwords"}, logical = Logical.OR)
    @PostMapping("/resetPwd/sendCode")
    @ApiOperation(value = "发送重置密码验证码", tags = {"管理后台-系统用户管理"})
    public AjaxResult sendResetPwdCode(@RequestBody Map<String, Object> params) {
        Long userId = parseLong(params.get("userId"));
        if (userId == null) {
            return AjaxResult.error("用户不存在");
        }
        SysUser user = userService.selectUserById(userId);
        if (user == null) {
            return AjaxResult.error("用户不存在");
        }
        userService.checkUserAllowed(user);
        userService.checkUserDataScope(userId);
        if (StringUtils.isEmpty(user.getPhonenumber())) {
            return AjaxResult.error("当前用户未维护手机号");
        }
        String limitKey = RESET_PWD_LIMIT_KEY + userId;
        if (Boolean.TRUE.equals(redisService.hasKey(limitKey))) {
            return AjaxResult.error("验证码发送过于频繁,请30秒后再试");
        }
        String code = MsgUtil.createCode();
        String reqStr = MsgUtil.codeMsg(user.getPhonenumber(), code);
        HttpUtils.post(MsgConstants.SEND_URL, reqStr);
        redisService.setCacheObject(RESET_PWD_CODE_KEY + userId, code, 5L, TimeUnit.MINUTES);
        redisService.setCacheObject(limitKey, "1", 30L, TimeUnit.SECONDS);
        return AjaxResult.success("验证码已发送");
    }
    /**
     * 重置密码
     */
    @RequiresPermissions(value = {"/systemUserManagement/reset_passwords"}, logical = Logical.OR)
    @Log(title = "用户管理", businessType = BusinessType.UPDATE)
    @PutMapping("/resetPwd")
    @ApiOperation(value = "重置密码", tags = {"管理后台-系统用户管理"})
    public AjaxResult resetPwd(@RequestBody SysUser user) {
    public AjaxResult resetPwd(@RequestBody Map<String, Object> params) {
        Long userId = parseLong(params.get("userId"));
        String password = parseString(params.get("password"));
        String code = parseString(params.get("code"));
        if (userId == null) {
            return AjaxResult.error("用户不存在");
        }
        if (StringUtils.isEmpty(password)) {
            return AjaxResult.error("请输入新密码");
        }
        if (StringUtils.isEmpty(code)) {
            return AjaxResult.error("请输入验证码");
        }
        SysUser user = userService.selectUserById(userId);
        if (user == null) {
            return AjaxResult.error("用户不存在");
        }
        userService.checkUserAllowed(user);
        userService.checkUserDataScope(user.getUserId());
        user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
        userService.checkUserDataScope(userId);
        String cacheCode = redisService.getCacheObject(RESET_PWD_CODE_KEY + userId);
        if (StringUtils.isEmpty(cacheCode)) {
            return AjaxResult.error("验证码已过期,请重新获取验证码");
        }
        if (!code.equals(cacheCode)) {
            return AjaxResult.error("验证码错误");
        }
        user.setPassword(SecurityUtils.encryptPassword(password));
        user.setUpdateBy(SecurityUtils.getUsername());
        return toAjax(userService.resetPwd(user));
        int result = userService.resetPwd(user);
        redisService.deleteObject(RESET_PWD_CODE_KEY + userId);
        return toAjax(result);
    }
    /**
     * 重置操作密码
     */
    @RequiresPermissions(value = {"/systemUserManagement/reset_passwords"}, logical = Logical.OR)
    @Log(title = "用户管理", businessType = BusinessType.UPDATE)
    @PutMapping("/resetOperationPwd")
    @ApiOperation(value = "重置操作密码", tags = {"管理后台-系统用户管理"})
    public AjaxResult resetOperationPwd(@RequestBody Map<String, Object> params) {
        Long userId = parseLong(params.get("userId"));
        String operationPassword = parseString(params.get("operationPassword"));
        String code = parseString(params.get("code"));
        if (userId == null) {
            return AjaxResult.error("用户不存在");
        }
        if (StringUtils.isEmpty(operationPassword)) {
            return AjaxResult.error("请输入新操作密码");
        }
        if (StringUtils.isEmpty(code)) {
            return AjaxResult.error("请输入验证码");
        }
        SysUser user = userService.selectUserById(userId);
        if (user == null) {
            return AjaxResult.error("用户不存在");
        }
        userService.checkUserAllowed(user);
        userService.checkUserDataScope(userId);
        String cacheCode = redisService.getCacheObject(RESET_PWD_CODE_KEY + userId);
        if (StringUtils.isEmpty(cacheCode)) {
            return AjaxResult.error("验证码已过期,请重新获取验证码");
        }
        if (!code.equals(cacheCode)) {
            return AjaxResult.error("验证码错误");
        }
        user.setOperationPassword(SecurityUtils.encryptPassword(operationPassword));
        user.setUpdateBy(SecurityUtils.getUsername());
        int result = userService.updateUser(user);
        redisService.deleteObject(RESET_PWD_CODE_KEY + userId);
        return toAjax(result);
    }
    private Long parseLong(Object value) {
        if (value == null || StringUtils.isEmpty(String.valueOf(value))) {
            return null;
        }
        return Long.valueOf(String.valueOf(value));
    }
    private String parseString(Object value) {
        return value == null ? null : String.valueOf(value);
    }
    /**
@@ -697,6 +856,7 @@
        if(null == user.getRoleType()){
            user.setRoleType(1);
        }
        user.setPassWordUpdate(new Date());
        userService.insertUser(user);
        SysUserRole sysUserRole = new SysUserRole();
        sysUserRole.setRoleId(user.getRoleId());