wangxy il y a 1 mois
Parent
commit
dec04de4ca

+ 49 - 0
fs-company/src/main/java/com/fs/company/controller/company/CompanyUserController.java

@@ -848,4 +848,53 @@ public class CompanyUserController extends BaseController {
         List<CompanyUserBindUserVO> list = companyUserService.getFsUserByCompanyUserId(fsUser);
         return getDataTable(list);
     }
+
+    @PreAuthorize("@ss.hasPermi('company:user:edit')")
+    @Log(title = "设置用户上级", businessType = BusinessType.UPDATE)
+    @PostMapping("/setParentId")
+    public AjaxResult setParentId(@RequestBody Map<String, Long> params) {
+        Long userId = params.get("userId");
+        Long parentId = params.get("parentId");
+        if (userId == null) {
+            return AjaxResult.error("用户ID不能为空");
+        }
+        return toAjax(companyUserService.updateUserParentId(userId, parentId));
+    }
+
+    @PreAuthorize("@ss.hasPermi('company:user:edit')")
+    @Log(title = "批量设置用户上级", businessType = BusinessType.UPDATE)
+    @PostMapping("/batchSetParentId")
+    public AjaxResult batchSetParentId(@RequestBody Map<String, Object> params) {
+        List<Long> userIds = (List<Long>) params.get("userIds");
+        Long parentId = Long.valueOf(params.get("parentId").toString());
+        if (userIds == null || userIds.isEmpty()) {
+            return AjaxResult.error("用户ID列表不能为空");
+        }
+        return toAjax(companyUserService.batchUpdateUserParentId(userIds, parentId));
+    }
+
+    @PreAuthorize("@ss.hasPermi('company:user:edit')")
+    @Log(title = "初始化用户层级关系", businessType = BusinessType.UPDATE)
+    @PostMapping("/initUserHierarchy")
+    public R initUserHierarchy(@RequestBody Map<String, Long> params) {
+        Long companyId = params.get("companyId");
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        if (companyId == null) {
+            companyId = loginUser.getCompany().getCompanyId();
+        }
+        return companyUserService.initUserHierarchy(companyId);
+    }
+
+    @PreAuthorize("@ss.hasPermi('company:user:edit')")
+    @Log(title = "批量初始化所有公司用户层级关系", businessType = BusinessType.UPDATE)
+    @PostMapping("/initAllCompanyUserHierarchy")
+    public R initAllCompanyUserHierarchy() {
+        return companyUserService.initAllCompanyUserHierarchy();
+    }
+
+    @GetMapping("/getSubordinateList/{userId}")
+    public R getSubordinateList(@PathVariable("userId") Long userId) {
+        List<CompanyUser> list = companyUserService.selectSubordinateList(userId);
+        return R.ok().put("data", list);
+    }
 }

+ 33 - 0
fs-company/src/main/java/com/fs/framework/aspectj/DataScopeAspect.java

@@ -53,6 +53,16 @@ public class DataScopeAspect
      */
     public static final String DATA_SCOPE_SELF = "5";
 
+    /**
+     * 组长级数据权限(查看自己和下属的数据)
+     */
+    public static final String DATA_SCOPE_LEADER = "6";
+
+    /**
+     * 销售经理级数据权限(查看自己和所有下属及下属的下属的数据)
+     */
+    public static final String DATA_SCOPE_MANAGER = "7";
+
     /**
      * 数据权限过滤关键字
      */
@@ -140,6 +150,29 @@ public class DataScopeAspect
                         sqlString.append(StringUtils.format(" OR {}.dept_id = {} ", deptAlias, user.getDeptId()));
                 }
             }
+            else if (DATA_SCOPE_LEADER.equals(dataScope))
+            {
+                if (StringUtils.isNotBlank(userAlias))
+                {
+                    sqlString.append(StringUtils.format(
+                            " OR {}.user_id = {} OR {}.parent_id = {} ",
+                            userAlias, user.getUserId(), userAlias, user.getUserId()));
+                }
+            }
+            else if (DATA_SCOPE_MANAGER.equals(dataScope))
+            {
+                if (StringUtils.isNotBlank(userAlias))
+                {
+                    sqlString.append(StringUtils.format(
+                            " OR {}.user_id = {} " +
+                            " OR {}.parent_id = {} " +
+                            " OR {}.user_id IN (SELECT u.user_id FROM company_user u WHERE u.parent_id IN " +
+                            "(SELECT cu.user_id FROM company_user cu WHERE cu.parent_id = {})) ",
+                            userAlias, user.getUserId(),
+                            userAlias, user.getUserId(),
+                            userAlias, user.getUserId()));
+                }
+            }
         }
 
         if (StringUtils.isNotBlank(sqlString.toString()))

+ 2 - 0
fs-service/src/main/java/com/fs/company/mapper/CompanyRoleMapper.java

@@ -85,4 +85,6 @@ public interface CompanyRoleMapper
      * **/
     CompanyRole selectCompanyRoleByRoleKey(@Param("roleKey") String roleKey);
     Long selectRolesByUserNameAndCompanyId(@Param("roleName") String roleName,@Param("companyId") Long companyId);
+
+    List<CompanyRole> selectRoleListByCompanyId(@Param("companyId") Long companyId);
 }

+ 12 - 0
fs-service/src/main/java/com/fs/company/mapper/CompanyUserMapper.java

@@ -347,4 +347,16 @@ public interface CompanyUserMapper
 
     String selectMpOpenIdByCompanyUserId(@Param("companyUserId") Long companyUserId);
 
+    @Update("${sql}")
+    int updateBySql(@Param("sql") String sql);
+
+    @Select("SELECT * FROM company_user WHERE parent_id = #{userId} AND del_flag = '0'")
+    List<CompanyUser> selectSubordinateList(@Param("userId") Long userId);
+
+    int initMemberParentId(@Param("companyId") Long companyId, @Param("leaderRoleId") Long leaderRoleId, @Param("memberRoleId") Long memberRoleId);
+
+    int initLeaderParentId(@Param("companyId") Long companyId, @Param("managerRoleId") Long managerRoleId, @Param("leaderRoleId") Long leaderRoleId);
+
+    int initManagerParentId(@Param("companyId") Long companyId, @Param("adminRoleId") Long adminRoleId, @Param("managerRoleId") Long managerRoleId);
+
 }

+ 25 - 0
fs-service/src/main/java/com/fs/company/service/ICompanyUserService.java

@@ -299,4 +299,29 @@ public interface ICompanyUserService {
      * 获取销售绑定的fs_user
      */
     int countCompanyUserByUserId(Long userId);
+
+    /**
+     * 更新用户上级
+     */
+    int updateUserParentId(Long userId, Long parentId);
+
+    /**
+     * 批量更新用户上级
+     */
+    int batchUpdateUserParentId(List<Long> userIds, Long parentId);
+
+    /**
+     * 初始化用户层级关系
+     */
+    R initUserHierarchy(Long companyId);
+
+    /**
+     * 批量初始化所有公司的用户层级关系
+     */
+    R initAllCompanyUserHierarchy();
+
+    /**
+     * 查询下属用户列表
+     */
+    List<CompanyUser> selectSubordinateList(Long userId);
 }

+ 111 - 3
fs-service/src/main/java/com/fs/company/service/impl/CompanyUserServiceImpl.java

@@ -1396,9 +1396,117 @@ public class CompanyUserServiceImpl implements ICompanyUserService
         return 0;
     }
 
-    /**
-     * 生成基础邀请码
-     */
+    @Override
+    public int updateUserParentId(Long userId, Long parentId) {
+        CompanyUser user = new CompanyUser();
+        user.setUserId(userId);
+        user.setParentId(parentId);
+        return companyUserMapper.updateCompanyUser(user);
+    }
+
+    @Override
+    public int batchUpdateUserParentId(List<Long> userIds, Long parentId) {
+        int count = 0;
+        for (Long userId : userIds) {
+            count += updateUserParentId(userId, parentId);
+        }
+        return count;
+    }
+
+    @Override
+    public R initUserHierarchy(Long companyId) {
+        try {
+            List<CompanyRole> roles = roleMapper.selectRoleListByCompanyId(companyId);
+            Long adminRoleId = null;
+            Long leaderRoleId = null;
+            Long managerRoleId = null;
+            Long memberRoleId = null;
+
+            for (CompanyRole role : roles) {
+                String roleKey = role.getRoleKey();
+                String roleName = role.getRoleName();
+                if ("admin".equals(roleKey) || "general_manager".equals(roleKey) || "logistics_manager".equals(roleKey) ||
+                    (roleName != null && (roleName.contains("管理员") || roleName.contains("总经理") || roleName.contains("物流经理")))) {
+                    adminRoleId = role.getRoleId();
+                } else if ("leader".equals(roleKey) || "zuzhang".equals(roleKey) || 
+                    (roleName != null && roleName.contains("组长"))) {
+                    leaderRoleId = role.getRoleId();
+                } else if ("sales_manager".equals(roleKey) || "xiaoshoujingli".equals(roleKey) || 
+                           (roleName != null && roleName.contains("销售经理"))) {
+                    managerRoleId = role.getRoleId();
+                } else if ("member".equals(roleKey) || "zuyuan".equals(roleKey) || 
+                           (roleName != null && roleName.contains("组员"))) {
+                    memberRoleId = role.getRoleId();
+                }
+            }
+
+            int initCount = 0;
+            StringBuilder msg = new StringBuilder();
+
+            if (leaderRoleId != null && memberRoleId != null) {
+                int count = companyUserMapper.initMemberParentId(companyId, leaderRoleId, memberRoleId);
+                initCount += count;
+                msg.append("组员→组长:").append(count).append("条; ");
+            }
+
+            if (managerRoleId != null && leaderRoleId != null) {
+                int count = companyUserMapper.initLeaderParentId(companyId, managerRoleId, leaderRoleId);
+                initCount += count;
+                msg.append("组长→销售经理:").append(count).append("条; ");
+            }
+
+            if (adminRoleId != null && managerRoleId != null) {
+                int count = companyUserMapper.initManagerParentId(companyId, adminRoleId, managerRoleId);
+                initCount += count;
+                msg.append("销售经理→管理员:").append(count).append("条; ");
+            }
+
+            return R.ok("初始化完成,共更新 " + initCount + " 条记录。" + msg.toString());
+        } catch (Exception e) {
+            return R.error("初始化失败:" + e.getMessage());
+        }
+    }
+
+    @Override
+    public R initAllCompanyUserHierarchy() {
+        try {
+            List<Long> companyIds = companyService.selectCompanyIds();
+            if (companyIds == null || companyIds.isEmpty()) {
+                return R.ok("没有需要初始化的公司");
+            }
+
+            int totalCount = 0;
+            int successCount = 0;
+            int failCount = 0;
+            StringBuilder failMsg = new StringBuilder();
+
+            for (Long companyId : companyIds) {
+                totalCount++;
+                try {
+                    R result = initUserHierarchy(companyId);
+                    if (result.get("code") != null && (int) result.get("code") == 200) {
+                        successCount++;
+                    } else {
+                        failCount++;
+                        failMsg.append("公司ID:").append(companyId).append(" 初始化失败; ");
+                    }
+                } catch (Exception e) {
+                    failCount++;
+                    failMsg.append("公司ID:").append(companyId).append(" 异常:").append(e.getMessage()).append("; ");
+                }
+            }
+
+            return R.ok("批量初始化完成,共处理 " + totalCount + " 个公司,成功 " + successCount + " 个,失败 " + failCount + " 个。" + failMsg.toString());
+        } catch (Exception e) {
+            return R.error("批量初始化失败:" + e.getMessage());
+        }
+    }
+
+    @Override
+    public List<CompanyUser> selectSubordinateList(Long userId) {
+        return companyUserMapper.selectSubordinateList(userId);
+    }
+
     private static String generateBaseCode(Long salesId) {
         // 简单的算法:销售ID经过简单变换
         long transformed = (salesId * 31L + 12345L) % 1000000L;

+ 5 - 0
fs-service/src/main/resources/mapper/company/CompanyRoleMapper.xml

@@ -186,4 +186,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         select role_id from company_role where  del_flag = '0' and status = '0' and  role_name= #{roleName}  and company_id = #{companyId}
     </select>
 
+    <select id="selectRoleListByCompanyId" resultMap="CompanyRoleResult">
+        <include refid="selectCompanyRoleVo"/>
+        where del_flag = '0' and status = '0' and company_id = #{companyId}
+    </select>
+
 </mapper>

+ 72 - 0
fs-service/src/main/resources/mapper/company/CompanyUserMapper.xml

@@ -725,4 +725,76 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         SELECT mp_open_id FROM company_user WHERE user_id = #{companyUserId}
     </select>
 
+    <select id="selectSubordinateList" resultMap="CompanyUserResult">
+        SELECT * FROM company_user WHERE parent_id = #{userId} AND del_flag = '0'
+    </select>
+
+    <update id="initMemberParentId">
+        UPDATE company_user cu
+            INNER JOIN (
+            SELECT
+            m.user_id AS member_user_id,
+            l.user_id AS leader_user_id
+            FROM company_user m
+            INNER JOIN company_user_role mur ON m.user_id = mur.user_id AND mur.role_id = #{memberRoleId}
+            LEFT JOIN company_user l ON l.dept_id = m.dept_id
+            AND l.del_flag = '0'
+            AND l.company_id = m.company_id
+            LEFT JOIN company_user_role lur ON l.user_id = lur.user_id AND lur.role_id = #{leaderRoleId}
+            WHERE m.company_id = #{companyId}
+            AND m.del_flag = '0'
+            AND m.parent_id IS NULL
+            AND lur.user_id IS NOT NULL  -- 确保找到了组长
+            ) tmp ON cu.user_id = tmp.member_user_id
+            SET cu.parent_id = tmp.leader_user_id
+        WHERE tmp.leader_user_id IS NOT NULL
+    </update>
+
+    <update id="initLeaderParentId">
+        UPDATE company_user cu
+            INNER JOIN (
+            SELECT
+            l.user_id AS leader_user_id,
+            m.user_id AS manager_user_id
+            FROM company_user l
+            INNER JOIN company_user_role lur ON l.user_id = lur.user_id AND lur.role_id = #{leaderRoleId}
+            LEFT JOIN company_user m ON m.del_flag = '0'
+            AND m.company_id = l.company_id
+            LEFT JOIN company_user_role mur ON m.user_id = mur.user_id AND mur.role_id = #{managerRoleId}
+            LEFT JOIN company_dept ld ON l.dept_id = ld.dept_id
+            LEFT JOIN company_dept md ON m.dept_id = md.dept_id
+            WHERE l.company_id = #{companyId}
+            AND l.del_flag = '0'
+            AND l.parent_id IS NULL
+            AND mur.user_id IS NOT NULL  -- 确保找到了销售经理
+            AND (
+            m.dept_id = ld.parent_id
+            OR FIND_IN_SET(md.dept_id, ld.ancestors)
+            OR m.dept_id = l.dept_id
+            )
+            ) tmp ON cu.user_id = tmp.leader_user_id
+            SET cu.parent_id = tmp.manager_user_id
+        WHERE tmp.manager_user_id IS NOT NULL
+    </update>
+
+    <update id="initManagerParentId">
+        UPDATE company_user cu
+            INNER JOIN (
+            SELECT
+            m.user_id AS manager_user_id,
+            a.user_id AS admin_user_id
+            FROM company_user m
+            INNER JOIN company_user_role mur ON m.user_id = mur.user_id AND mur.role_id = #{managerRoleId}
+            LEFT JOIN company_user a ON a.del_flag = '0'
+            AND a.company_id = m.company_id
+            LEFT JOIN company_user_role aur ON a.user_id = aur.user_id AND aur.role_id = #{adminRoleId}
+            WHERE m.company_id = #{companyId}
+            AND m.del_flag = '0'
+            AND m.parent_id IS NULL
+            AND aur.user_id IS NOT NULL  -- 确保找到了管理员
+            ) tmp ON cu.user_id = tmp.manager_user_id
+            SET cu.parent_id = tmp.admin_user_id
+        WHERE tmp.admin_user_id IS NOT NULL
+    </update>
+
 </mapper>