longz
2026-06-10 1f4fd950f6aa0dd8f865f63daeb2303efb3f8d76
新增用户公司权限范围管理功能
5个文件已添加
284 ■■■■■ 已修改文件
ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/SysUserCompanyScopeMapper.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/SysUserCompanyScopeMapper.xml 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/SysUserCompanyScope.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ISysUserCompanyScopeService.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/SysUserCompanyScopeServiceImpl.java 150 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/SysUserCompanyScopeMapper.java
New file
@@ -0,0 +1,21 @@
package com.stylefeng.guns.modular.system.dao;
import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.stylefeng.guns.modular.system.model.SysUserCompanyScope;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
public interface SysUserCompanyScopeMapper extends BaseMapper<SysUserCompanyScope> {
    List<Map<String, Object>> selectScopesByUserId(@Param("userId") Integer userId);
    SysUserCompanyScope selectActiveScope(@Param("userId") Integer userId, @Param("companyId") Integer companyId);
    Integer countScopesByUserId(@Param("userId") Integer userId);
    int clearDefault(@Param("userId") Integer userId);
    int deleteByUserId(@Param("userId") Integer userId);
}
ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/dao/mapping/SysUserCompanyScopeMapper.xml
New file
@@ -0,0 +1,45 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.stylefeng.guns.modular.system.dao.SysUserCompanyScopeMapper">
    <select id="selectScopesByUserId" resultType="map">
        SELECT s.*, c.name AS companyName, d.simplename AS deptName,
        (SELECT GROUP_CONCAT(r.name) FROM sys_role r WHERE FIND_IN_SET(r.id, s.roleid)) AS roleName
        FROM sys_user_company_scope s
        LEFT JOIN t_company c ON c.id = s.companyId
        LEFT JOIN sys_dept d ON d.id = s.deptid
        WHERE s.userId = #{userId}
          AND s.status = 1
        ORDER BY s.isDefault ASC, s.id ASC
    </select>
    <select id="selectActiveScope" resultType="com.stylefeng.guns.modular.system.model.SysUserCompanyScope">
        SELECT *
        FROM sys_user_company_scope
        WHERE userId = #{userId}
          AND status = 1
        <if test="companyId != null">
          AND companyId = #{companyId}
        </if>
        ORDER BY isDefault ASC, id ASC
        LIMIT 1
    </select>
    <select id="countScopesByUserId" resultType="java.lang.Integer">
        SELECT COUNT(1)
        FROM sys_user_company_scope
        WHERE userId = #{userId}
          AND status = 1
    </select>
    <update id="clearDefault">
        UPDATE sys_user_company_scope
        SET isDefault = 2, updateTime = NOW()
        WHERE userId = #{userId}
          AND status = 1
    </update>
    <delete id="deleteByUserId">
        DELETE FROM sys_user_company_scope WHERE userId = #{userId}
    </delete>
</mapper>
ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/model/SysUserCompanyScope.java
New file
@@ -0,0 +1,44 @@
package com.stylefeng.guns.modular.system.model;
import com.baomidou.mybatisplus.activerecord.Model;
import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;
import com.baomidou.mybatisplus.enums.IdType;
import lombok.Data;
import java.io.Serializable;
import java.util.Date;
/**
 * 管理账号可管理分公司及该分公司下的角色、部门配置。
 */
@Data
@TableName("sys_user_company_scope")
public class SysUserCompanyScope extends Model<SysUserCompanyScope> {
    private static final long serialVersionUID = 1L;
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    private Integer userId;
    private Integer companyId;
    private String roleid;
    private Integer deptid;
    private Integer isDefault;
    private Integer status;
    private Date createTime;
    private Date updateTime;
    @Override
    protected Serializable pkVal() {
        return this.id;
    }
}
ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/ISysUserCompanyScopeService.java
New file
@@ -0,0 +1,24 @@
package com.stylefeng.guns.modular.system.service;
import com.baomidou.mybatisplus.service.IService;
import com.stylefeng.guns.core.shiro.ShiroUser;
import com.stylefeng.guns.modular.system.model.SysUserCompanyScope;
import com.stylefeng.guns.modular.system.model.User;
import java.util.List;
import java.util.Map;
public interface ISysUserCompanyScopeService extends IService<SysUserCompanyScope> {
    void ensureDefaultScope(User user);
    List<Map<String, Object>> selectScopesByUserId(Integer userId);
    SysUserCompanyScope selectActiveScope(Integer userId, Integer companyId);
    void applyScopeToShiroUser(ShiroUser shiroUser, SysUserCompanyScope scope);
    void saveScopes(Integer userId, String scopesJson, Integer fallbackCompanyId, String fallbackRoleid, Integer fallbackDeptid);
    void deleteByUserId(Integer userId);
}
ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/service/impl/SysUserCompanyScopeServiceImpl.java
New file
@@ -0,0 +1,150 @@
package com.stylefeng.guns.modular.system.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.stylefeng.guns.core.common.constant.factory.ConstantFactory;
import com.stylefeng.guns.core.shiro.ShiroUser;
import com.stylefeng.guns.core.util.Convert;
import com.stylefeng.guns.core.util.SinataUtil;
import com.stylefeng.guns.modular.system.dao.RoleMapper;
import com.stylefeng.guns.modular.system.dao.SysUserCompanyScopeMapper;
import com.stylefeng.guns.modular.system.model.Role;
import com.stylefeng.guns.modular.system.model.SysUserCompanyScope;
import com.stylefeng.guns.modular.system.model.User;
import com.stylefeng.guns.modular.system.service.ISysUserCompanyScopeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
@Service
public class SysUserCompanyScopeServiceImpl extends ServiceImpl<SysUserCompanyScopeMapper, SysUserCompanyScope>
        implements ISysUserCompanyScopeService {
    @Autowired
    private RoleMapper roleMapper;
    @Override
    public void ensureDefaultScope(User user) {
        if (user == null || user.getId() == null || user.getRoleType() == null || user.getRoleType() != 2
                || user.getObjectId() == null) {
            return;
        }
        Integer count = this.baseMapper.countScopesByUserId(user.getId());
        if (count != null && count > 0) {
            return;
        }
        SysUserCompanyScope scope = buildScope(user.getId(), user.getObjectId(), user.getRoleid(), user.getDeptid(), 1);
        this.baseMapper.insert(scope);
    }
    @Override
    public List<Map<String, Object>> selectScopesByUserId(Integer userId) {
        return this.baseMapper.selectScopesByUserId(userId);
    }
    @Override
    public SysUserCompanyScope selectActiveScope(Integer userId, Integer companyId) {
        return this.baseMapper.selectActiveScope(userId, companyId);
    }
    @Override
    public void applyScopeToShiroUser(ShiroUser shiroUser, SysUserCompanyScope scope) {
        if (shiroUser == null || scope == null) {
            return;
        }
        shiroUser.setObjectId(scope.getCompanyId());
        shiroUser.setActiveCompanyId(scope.getCompanyId());
        shiroUser.setDeptId(scope.getDeptid());
        if (SinataUtil.isEmpty(scope.getRoleid())) {
            shiroUser.setRoleList(new ArrayList<Integer>());
            shiroUser.setRoleNames(new ArrayList<String>());
            shiroUser.setAdmin(false);
            return;
        }
        Integer[] roleArray = Convert.toIntArray(scope.getRoleid());
        List<Integer> roleList = new ArrayList<Integer>();
        List<String> roleNameList = new ArrayList<String>();
        for (int roleId : roleArray) {
            roleList.add(roleId);
            roleNameList.add(ConstantFactory.me().getSingleRoleName(roleId));
        }
        shiroUser.setRoleList(roleList);
        shiroUser.setRoleNames(roleNameList);
        List<Role> roles = roleMapper.selectBatchIds(roleList);
        shiroUser.setAdmin(roles.stream().anyMatch(s -> "administrator".equals(s.getTips())));
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void saveScopes(Integer userId, String scopesJson, Integer fallbackCompanyId, String fallbackRoleid, Integer fallbackDeptid) {
        this.baseMapper.deleteByUserId(userId);
        JSONArray array = parseScopes(scopesJson);
        if (array == null || array.isEmpty()) {
            if (fallbackCompanyId != null) {
                this.baseMapper.insert(buildScope(userId, fallbackCompanyId, fallbackRoleid, fallbackDeptid, 1));
            }
            return;
        }
        boolean hasDefault = false;
        for (int i = 0; i < array.size(); i++) {
            JSONObject item = array.getJSONObject(i);
            Integer companyId = item.getInteger("companyId");
            String roleid = item.getString("roleid");
            Integer deptid = item.getInteger("deptid");
            if (companyId == null || deptid == null) {
                continue;
            }
            Integer isDefault = item.getInteger("isDefault");
            if (isDefault != null && isDefault == 1 && !hasDefault) {
                hasDefault = true;
            } else {
                isDefault = 2;
            }
            this.baseMapper.insert(buildScope(userId, companyId, roleid, deptid, isDefault));
        }
        if (!hasDefault) {
            SysUserCompanyScope first = this.selectOne(new EntityWrapper<SysUserCompanyScope>()
                    .eq("userId", userId)
                    .eq("status", 1)
                    .orderBy("id", true));
            if (first != null) {
                first.setIsDefault(1);
                first.setUpdateTime(new Date());
                this.updateById(first);
            }
        }
    }
    @Override
    public void deleteByUserId(Integer userId) {
        this.baseMapper.deleteByUserId(userId);
    }
    private JSONArray parseScopes(String scopesJson) {
        if (SinataUtil.isEmpty(scopesJson)) {
            return null;
        }
        return JSON.parseArray(scopesJson);
    }
    private SysUserCompanyScope buildScope(Integer userId, Integer companyId, String roleid, Integer deptid, Integer isDefault) {
        SysUserCompanyScope scope = new SysUserCompanyScope();
        scope.setUserId(userId);
        scope.setCompanyId(companyId);
        scope.setRoleid(roleid);
        scope.setDeptid(deptid);
        scope.setIsDefault(isDefault);
        scope.setStatus(1);
        scope.setCreateTime(new Date());
        scope.setUpdateTime(new Date());
        return scope;
    }
}