|
@@ -87,29 +87,40 @@ public class RsOverseasApplicationServiceImpl extends ServiceImpl<RsOverseasAppl
|
|
|
*/
|
|
*/
|
|
|
@Override
|
|
@Override
|
|
|
public TableDataInfo<RsOverseasApplicationVo> queryPageList(RsOverseasApplicationQuery query) {
|
|
public TableDataInfo<RsOverseasApplicationVo> queryPageList(RsOverseasApplicationQuery query) {
|
|
|
- // 🔴 新增:部门负责人权限过滤逻辑
|
|
|
|
|
|
|
+ // 🔴 新增:多级审批权限过滤逻辑
|
|
|
Long currentUserId = LoginHelper.getUserId();
|
|
Long currentUserId = LoginHelper.getUserId();
|
|
|
|
|
|
|
|
// 1. 判断是否是rs-admin管理员(管理员可以看所有数据)
|
|
// 1. 判断是否是rs-admin管理员(管理员可以看所有数据)
|
|
|
boolean isAdmin = cn.dev33.satoken.stp.StpUtil.hasRole("rs-admin");
|
|
boolean isAdmin = cn.dev33.satoken.stp.StpUtil.hasRole("rs-admin");
|
|
|
|
|
|
|
|
if (!isAdmin) {
|
|
if (!isAdmin) {
|
|
|
- // 2. 判断是否是部门负责人(拥有rs:overseas:approve1权限)
|
|
|
|
|
- boolean isDeptHead = cn.dev33.satoken.stp.StpUtil.hasPermission("rs:overseas:approve1");
|
|
|
|
|
-
|
|
|
|
|
- if (isDeptHead) {
|
|
|
|
|
- // 🔴 部门负责人:只能看到本部门员工提交的申请
|
|
|
|
|
- SysUserVo currentUser = userService.selectUserById(currentUserId);
|
|
|
|
|
- if (currentUser != null && currentUser.getDeptId() != null) {
|
|
|
|
|
- query.setApplicantDeptId(currentUser.getDeptId());
|
|
|
|
|
- log.info("🔒 [部门权限过滤] 用户: {}, 部门ID: {}, 只能查看本部门申请",
|
|
|
|
|
- currentUser.getUserName(), currentUser.getDeptId());
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ // 2. 判断是否有高级别审批权限(人事处及以上:approve2/3/4/5)
|
|
|
|
|
+ boolean hasHigherApprovalPermission = cn.dev33.satoken.stp.StpUtil.hasPermission("rs:overseas:approve2") || // 人事处
|
|
|
|
|
+ cn.dev33.satoken.stp.StpUtil.hasPermission("rs:overseas:approve3") || // 纪委
|
|
|
|
|
+ cn.dev33.satoken.stp.StpUtil.hasPermission("rs:overseas:approve4") || // 学院分管领导
|
|
|
|
|
+ cn.dev33.satoken.stp.StpUtil.hasPermission("rs:overseas:approve5"); // 学院党委书记
|
|
|
|
|
+
|
|
|
|
|
+ if (hasHigherApprovalPermission) {
|
|
|
|
|
+ // 🔴 人事处及以上:可以看到所有申请(不按部门过滤)
|
|
|
|
|
+ log.info("✅ [高级审批权限] 用户ID: {}, 可以查看所有申请", currentUserId);
|
|
|
} else {
|
|
} else {
|
|
|
- // 3. 普通用户:只能看到自己提交的申请
|
|
|
|
|
- if (query.getApplicantId() == null) {
|
|
|
|
|
- query.setApplicantId(currentUserId);
|
|
|
|
|
- log.info("🔒 [个人权限过滤] 用户ID: {}, 只能查看自己的申请", currentUserId);
|
|
|
|
|
|
|
+ // 3. 判断是否是部门负责人(只有 rs:overseas:approve1 权限)
|
|
|
|
|
+ boolean isDeptHead = cn.dev33.satoken.stp.StpUtil.hasPermission("rs:overseas:approve1");
|
|
|
|
|
+
|
|
|
|
|
+ if (isDeptHead) {
|
|
|
|
|
+ // 🔴 纯部门负责人:只能看到本部门员工提交的申请
|
|
|
|
|
+ SysUserVo currentUser = userService.selectUserById(currentUserId);
|
|
|
|
|
+ if (currentUser != null && currentUser.getDeptId() != null) {
|
|
|
|
|
+ query.setApplicantDeptId(currentUser.getDeptId());
|
|
|
|
|
+ log.info("🔒 [部门权限过滤] 用户: {}, 部门ID: {}, 只能查看本部门申请",
|
|
|
|
|
+ currentUser.getUserName(), currentUser.getDeptId());
|
|
|
|
|
+ }
|
|
|
|
|
+ } else {
|
|
|
|
|
+ // 4. 普通用户:只能看到自己提交的申请
|
|
|
|
|
+ if (query.getApplicantId() == null) {
|
|
|
|
|
+ query.setApplicantId(currentUserId);
|
|
|
|
|
+ log.info("🔒 [个人权限过滤] 用户ID: {}, 只能查看自己的申请", currentUserId);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
} else {
|
|
} else {
|
|
@@ -220,46 +231,92 @@ public class RsOverseasApplicationServiceImpl extends ServiceImpl<RsOverseasAppl
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
- * 查询当前用户的待审批申请列表
|
|
|
|
|
|
|
+ * 查询当前用户的待审批申请列表(动态权限方案 + 部门过滤)
|
|
|
|
|
+ *
|
|
|
|
|
+ * 🆕 核心改进:
|
|
|
|
|
+ * 1. 不再依赖 current_approver_id 字段(该字段仅作为冗余展示用)
|
|
|
|
|
+ * 2. 动态查询用户的审批权限,转换为审批级别
|
|
|
|
|
+ * 3. 根据审批级别和状态查询待审批申请
|
|
|
|
|
+ * 4. 🔴 部门负责人只能看到本部门的申请
|
|
|
|
|
+ * 5. 支持人员岗位变动:权限调整后立即生效
|
|
|
|
|
+ *
|
|
|
|
|
+ * 查询逻辑:
|
|
|
|
|
+ * - 用户有 rs:overseas:approve1 权限(部门负责人)→ 查询本部门员工的、approval_level='1' 且
|
|
|
|
|
+ * status='0' 的申请
|
|
|
|
|
+ * - 用户有 rs:overseas:approve2 权限(人事处)→ 查询全校的、approval_level='2' 且 status='0' 的申请
|
|
|
|
|
+ * - 用户有多个审批权限 → 返回所有对应级别的待审批申请(无部门限制)
|
|
|
*/
|
|
*/
|
|
|
@Override
|
|
@Override
|
|
|
public List<RsOverseasApplicationVo> queryPendingByCurrentUser() {
|
|
public List<RsOverseasApplicationVo> queryPendingByCurrentUser() {
|
|
|
Long currentUserId = LoginHelper.getUserId();
|
|
Long currentUserId = LoginHelper.getUserId();
|
|
|
- log.info("查询当前用户待审批申请,用户ID: {}", currentUserId);
|
|
|
|
|
-
|
|
|
|
|
- // 获取当前用户信息
|
|
|
|
|
String currentUserName = LoginHelper.getUsername();
|
|
String currentUserName = LoginHelper.getUsername();
|
|
|
- log.info("当前用户名: {}", currentUserName);
|
|
|
|
|
|
|
|
|
|
- List<RsOverseasApplication> applications = baseMapper.selectList(
|
|
|
|
|
- new LambdaQueryWrapper<RsOverseasApplication>()
|
|
|
|
|
- .eq(RsOverseasApplication::getStatus, "0") // 待审核状态
|
|
|
|
|
- .eq(RsOverseasApplication::getCurrentApprover, currentUserName) // 使用当前审批人姓名
|
|
|
|
|
- .orderByDesc(RsOverseasApplication::getApplyTime));
|
|
|
|
|
-
|
|
|
|
|
- // 转换为VO对象
|
|
|
|
|
- return applications.stream()
|
|
|
|
|
- .map(this::convertToVo)
|
|
|
|
|
- .collect(Collectors.toList());
|
|
|
|
|
|
|
+ log.info("🔍 查询用户待审批申请 - 用户ID: {}, 用户名: {}", currentUserId, currentUserName);
|
|
|
|
|
+
|
|
|
|
|
+ // 1. 获取当前用户的审批级别列表(基于权限动态查询)
|
|
|
|
|
+ List<String> approvalLevels = getApprovalLevelsByUser(currentUserId);
|
|
|
|
|
+
|
|
|
|
|
+ if (approvalLevels == null || approvalLevels.isEmpty()) {
|
|
|
|
|
+ log.warn("❌ 用户 {} 没有任何出国审批权限,返回空列表", currentUserName);
|
|
|
|
|
+ return new ArrayList<>();
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ log.info("✅ 用户 {} 拥有审批级别: {}", currentUserName, approvalLevels);
|
|
|
|
|
+
|
|
|
|
|
+ // 2. 🔴 新逻辑:对每个级别单独查询并合并(方案1)
|
|
|
|
|
+ List<RsOverseasApplicationVo> result = new ArrayList<>();
|
|
|
|
|
+
|
|
|
|
|
+ // 遍历每个审批级别
|
|
|
|
|
+ for (String level : approvalLevels) {
|
|
|
|
|
+ Long deptIdForFilter = null;
|
|
|
|
|
+
|
|
|
|
|
+ // 🔴 关键:只对 level=1 进行部门过滤
|
|
|
|
|
+ if ("1".equals(level)) {
|
|
|
|
|
+ // 获取当前用户的部门ID
|
|
|
|
|
+ SysUserVo currentUser = userService.selectUserById(currentUserId);
|
|
|
|
|
+ if (currentUser != null && currentUser.getDeptId() != null) {
|
|
|
|
|
+ deptIdForFilter = currentUser.getDeptId();
|
|
|
|
|
+ log.info("🔒 [部门权限过滤] 级别1,用户: {}, 部门ID: {}, 只查看本部门待审批",
|
|
|
|
|
+ currentUserName, deptIdForFilter);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ log.warn("⚠️ 用户 {} 是部门负责人但没有部门信息,无法过滤", currentUserName);
|
|
|
|
|
+ }
|
|
|
|
|
+ } else {
|
|
|
|
|
+ // level=2, 3, 4, 5 不进行部门过滤
|
|
|
|
|
+ log.info("✅ [全校权限] 级别{}, 用户 {}, 查看全校待审批",
|
|
|
|
|
+ level, currentUserName);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 3. 查询该级别的待审批申请(单个级别)
|
|
|
|
|
+ List<RsOverseasApplication> levelApplications = baseMapper.selectPendingApplications(
|
|
|
|
|
+ Arrays.asList(level), // 🔴 关键:只查询单个级别
|
|
|
|
|
+ deptIdForFilter // level=1时有值,其他为null
|
|
|
|
|
+ );
|
|
|
|
|
+
|
|
|
|
|
+ log.info("📋 级别{} 查询到 {} 条待审批申请", level, levelApplications.size());
|
|
|
|
|
+
|
|
|
|
|
+ // 4. 转换为VO对象并添加到结果列表
|
|
|
|
|
+ result.addAll(levelApplications.stream()
|
|
|
|
|
+ .map(this::convertToVo)
|
|
|
|
|
+ .collect(Collectors.toList()));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ log.info("📋 用户 {} 总共查询到 {} 条待审批申请", currentUserName, result.size());
|
|
|
|
|
+
|
|
|
|
|
+ // 5. 返回合并后的结果
|
|
|
|
|
+ return result;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* 转换实体为VO对象
|
|
* 转换实体为VO对象
|
|
|
|
|
+ * 🔴 修复:使用Mapper查询完整的VO对象,包含字典翻译等扩展信息
|
|
|
*/
|
|
*/
|
|
|
private RsOverseasApplicationVo convertToVo(RsOverseasApplication entity) {
|
|
private RsOverseasApplicationVo convertToVo(RsOverseasApplication entity) {
|
|
|
if (entity == null) {
|
|
if (entity == null) {
|
|
|
return null;
|
|
return null;
|
|
|
}
|
|
}
|
|
|
- RsOverseasApplicationVo vo = new RsOverseasApplicationVo();
|
|
|
|
|
- // 使用BeanUtils复制属性(如果有的话)或者手动复制关键属性
|
|
|
|
|
- vo.setApplicationId(entity.getApplicationId());
|
|
|
|
|
- vo.setSerialNumber(entity.getSerialNumber());
|
|
|
|
|
- vo.setApplicantId(entity.getApplicantId());
|
|
|
|
|
- vo.setApplicantName(entity.getApplicantName());
|
|
|
|
|
- vo.setStatus(entity.getStatus());
|
|
|
|
|
- vo.setApplyTime(entity.getApplyTime());
|
|
|
|
|
- // 复制其他必要的字段...
|
|
|
|
|
- return vo;
|
|
|
|
|
|
|
+ // 🔴 使用Mapper的详细查询方法,获取完整的VO对象(包含字典翻译)
|
|
|
|
|
+ return baseMapper.selectOverseasApplicationById(entity.getApplicationId());
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -437,7 +494,13 @@ public class RsOverseasApplicationServiceImpl extends ServiceImpl<RsOverseasAppl
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
- * 提交出国申请(传统审批模式)
|
|
|
|
|
|
|
+ * 提交出国申请(动态审批人方案)
|
|
|
|
|
+ *
|
|
|
|
|
+ * 🆕 核心改进:
|
|
|
|
|
+ * 1. 不再设置固定的 current_approver_id(该字段改为冗余展示字段)
|
|
|
|
|
+ * 2. 仅设置 approval_level='1',审批人根据权限动态查询
|
|
|
|
|
+ * 3. current_approver 设置为提示文本(如"待一级审批")
|
|
|
|
|
+ * 4. 支持人员岗位变动:权限调整后立即生效
|
|
|
*/
|
|
*/
|
|
|
@Override
|
|
@Override
|
|
|
@Transactional
|
|
@Transactional
|
|
@@ -452,15 +515,18 @@ public class RsOverseasApplicationServiceImpl extends ServiceImpl<RsOverseasAppl
|
|
|
throw new RuntimeException("已通过或已完成的申请不能重新提交");
|
|
throw new RuntimeException("已通过或已完成的申请不能重新提交");
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- // 设置状态为待审核
|
|
|
|
|
|
|
+ // 🆕 设置状态为待审核
|
|
|
application.setStatus("0");
|
|
application.setStatus("0");
|
|
|
application.setApplyTime(new Date());
|
|
application.setApplyTime(new Date());
|
|
|
|
|
+
|
|
|
|
|
+ // 🆕 设置初始审批级别为1(不再设置固定审批人ID)
|
|
|
application.setApprovalLevel("1");
|
|
application.setApprovalLevel("1");
|
|
|
- application.setCurrentApprover("待审批");
|
|
|
|
|
|
|
+ application.setCurrentApproverId(null); // 清空固定审批人ID
|
|
|
|
|
+ application.setCurrentApprover("待一级审批"); // 提示文本
|
|
|
|
|
|
|
|
boolean updated = baseMapper.updateById(application) > 0;
|
|
boolean updated = baseMapper.updateById(application) > 0;
|
|
|
|
|
|
|
|
- log.info("✅ [出国申请提交] 提交成功, applicationId: {}, 申请人: {}",
|
|
|
|
|
|
|
+ log.info("✅ [出国申请提交] 提交成功 - applicationId: {}, 申请人: {}, 审批级别: 1",
|
|
|
applicationId, application.getApplicantName());
|
|
applicationId, application.getApplicantName());
|
|
|
|
|
|
|
|
return updated;
|
|
return updated;
|
|
@@ -530,19 +596,18 @@ public class RsOverseasApplicationServiceImpl extends ServiceImpl<RsOverseasAppl
|
|
|
|
|
|
|
|
approvalMapper.insert(approval);
|
|
approvalMapper.insert(approval);
|
|
|
|
|
|
|
|
- // 更新申请状态
|
|
|
|
|
|
|
+ // 🆕 更新申请状态(动态审批人方案)
|
|
|
if ("1".equals(approvalStatus)) {
|
|
if ("1".equals(approvalStatus)) {
|
|
|
// 审批通过
|
|
// 审批通过
|
|
|
String nextLevel = getNextApprovalLevel(application.getApprovalLevel());
|
|
String nextLevel = getNextApprovalLevel(application.getApprovalLevel());
|
|
|
if (nextLevel != null) {
|
|
if (nextLevel != null) {
|
|
|
- // 进入下一级审批
|
|
|
|
|
- Long nextApproverId = getNextApprover(nextLevel);
|
|
|
|
|
|
|
+ // 🆕 进入下一级审批(不再设置固定审批人ID)
|
|
|
application.setApprovalLevel(nextLevel);
|
|
application.setApprovalLevel(nextLevel);
|
|
|
- application.setCurrentApproverId(nextApproverId);
|
|
|
|
|
- application.setCurrentApprover(getApprovalLevelDescription(nextLevel));
|
|
|
|
|
|
|
+ application.setCurrentApproverId(null); // 不再设置固定审批人ID
|
|
|
|
|
+ application.setCurrentApprover(getApprovalLevelDescription(nextLevel)); // 如"待二级审批"
|
|
|
|
|
|
|
|
- log.info("审批流转到第{}级,申请ID: {}, 下一级审批人ID: {}",
|
|
|
|
|
- nextLevel, applicationId, nextApproverId);
|
|
|
|
|
|
|
+ log.info("✅ 审批流转到第{}级,申请ID: {}, 审批人根据权限动态查询",
|
|
|
|
|
+ nextLevel, applicationId);
|
|
|
} else {
|
|
} else {
|
|
|
// 所有级别审批完成 - 先尝试创建出国记录,再更新申请状态
|
|
// 所有级别审批完成 - 先尝试创建出国记录,再更新申请状态
|
|
|
log.info("开始最终审批处理,申请ID: {}, 当前状态: {}, 申请人: {}",
|
|
log.info("开始最终审批处理,申请ID: {}, 当前状态: {}, 申请人: {}",
|
|
@@ -731,15 +796,16 @@ public class RsOverseasApplicationServiceImpl extends ServiceImpl<RsOverseasAppl
|
|
|
existingApp.setDuration(days);
|
|
existingApp.setDuration(days);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- // 重置为待审核状态
|
|
|
|
|
|
|
+ // 🆕 重置为待审核状态(动态审批人方案)
|
|
|
existingApp.setStatus("0");
|
|
existingApp.setStatus("0");
|
|
|
existingApp.setApplyTime(new Date()); // 更新申请时间
|
|
existingApp.setApplyTime(new Date()); // 更新申请时间
|
|
|
|
|
|
|
|
- // 设置初始审批级别为1(单级审批制度)
|
|
|
|
|
|
|
+ // 🆕 设置初始审批级别为1(不再设置固定审批人ID)
|
|
|
existingApp.setApprovalLevel("1");
|
|
existingApp.setApprovalLevel("1");
|
|
|
- existingApp.setCurrentApprover("待审批");
|
|
|
|
|
|
|
+ existingApp.setCurrentApproverId(null); // 清空固定审批人ID
|
|
|
|
|
+ existingApp.setCurrentApprover("待一级审批"); // 提示文本
|
|
|
|
|
|
|
|
- log.info("【重新提交申请】更新为待审核状态,申请ID: {}", applicationId);
|
|
|
|
|
|
|
+ log.info("【重新提交申请】更新为待审核状态,申请ID: {}, 审批级别: 1", applicationId);
|
|
|
|
|
|
|
|
return baseMapper.updateById(existingApp) > 0;
|
|
return baseMapper.updateById(existingApp) > 0;
|
|
|
}
|
|
}
|
|
@@ -1181,58 +1247,9 @@ public class RsOverseasApplicationServiceImpl extends ServiceImpl<RsOverseasAppl
|
|
|
* @param approvalLevel 审批级别
|
|
* @param approvalLevel 审批级别
|
|
|
* @return 下一级审批人ID
|
|
* @return 下一级审批人ID
|
|
|
*/
|
|
*/
|
|
|
- private Long getNextApprover(String approvalLevel) {
|
|
|
|
|
- try {
|
|
|
|
|
- String roleKey = null;
|
|
|
|
|
- switch (approvalLevel) {
|
|
|
|
|
- case "2": // 人事处审批
|
|
|
|
|
- roleKey = "hr_dept_overseas_approver";
|
|
|
|
|
- break;
|
|
|
|
|
- case "3": // 纪委审批
|
|
|
|
|
- roleKey = "discipline_overseas_approver";
|
|
|
|
|
- break;
|
|
|
|
|
- case "4": // 学院分管领导审批
|
|
|
|
|
- roleKey = "college_leader_overseas_approver";
|
|
|
|
|
- break;
|
|
|
|
|
- case "5": // 学院党委书记审批
|
|
|
|
|
- roleKey = "party_secretary_overseas_approver";
|
|
|
|
|
- break;
|
|
|
|
|
- default:
|
|
|
|
|
- log.warn("未知的审批级别: {}", approvalLevel);
|
|
|
|
|
- return null;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- // 获取对应角色
|
|
|
|
|
- SysRoleBo roleQuery = new SysRoleBo();
|
|
|
|
|
- roleQuery.setRoleKey(roleKey);
|
|
|
|
|
- List<SysRoleVo> roles = roleService.selectRoleList(roleQuery);
|
|
|
|
|
- if (roles.isEmpty()) {
|
|
|
|
|
- log.error("未找到审批角色: {}", roleKey);
|
|
|
|
|
- return null;
|
|
|
|
|
- }
|
|
|
|
|
- SysRoleVo role = roles.get(0);
|
|
|
|
|
-
|
|
|
|
|
- // 获取角色下的用户(取第一个作为审批人)
|
|
|
|
|
- SysUserBo userQuery = new SysUserBo();
|
|
|
|
|
- userQuery.setRoleId(role.getRoleId());
|
|
|
|
|
- PageQuery pageQuery2 = new PageQuery();
|
|
|
|
|
- pageQuery2.setPageSize(1000); // 设置较大的页面大小以获取所有用户
|
|
|
|
|
- List<SysUserVo> users = userService.selectAllocatedList(userQuery, pageQuery2).getRows();
|
|
|
|
|
- if (users.isEmpty()) {
|
|
|
|
|
- log.warn("审批角色 {} 下没有用户", roleKey);
|
|
|
|
|
- return null;
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- // 返回第一个用户作为审批人
|
|
|
|
|
- SysUserVo approver = users.get(0);
|
|
|
|
|
- log.info("获取到第{}级审批人: {} ({})", approvalLevel, approver.getUserName(), approver.getNickName());
|
|
|
|
|
- return approver.getUserId();
|
|
|
|
|
-
|
|
|
|
|
- } catch (Exception e) {
|
|
|
|
|
- log.error("获取第{}级审批人失败", approvalLevel, e);
|
|
|
|
|
- return null;
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ // 🗑️ getNextApprover() 方法已删除
|
|
|
|
|
+ // 原因:采用动态审批人方案后,不再需要预先指定固定的审批人ID
|
|
|
|
|
+ // 新方案:待审批列表通过 getApprovalLevelsByUser() 动态查询
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* 根据审批级别获取审批环节描述
|
|
* 根据审批级别获取审批环节描述
|
|
@@ -1257,6 +1274,69 @@ public class RsOverseasApplicationServiceImpl extends ServiceImpl<RsOverseasAppl
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 🆕 根据当前登录用户的审批权限,获取其可审批的级别列表
|
|
|
|
|
+ *
|
|
|
|
|
+ * 权限到级别的映射:
|
|
|
|
|
+ * - rs:overseas:approve1 → 审批级别 "1" (部门负责人)
|
|
|
|
|
+ * - rs:overseas:approve2 → 审批级别 "2" (人事处)
|
|
|
|
|
+ * - rs:overseas:approve3 → 审批级别 "3" (纪委)
|
|
|
|
|
+ * - rs:overseas:approve4 → 审批级别 "4" (学院分管领导)
|
|
|
|
|
+ * - rs:overseas:approve5 → 审批级别 "5" (学院党委书记)
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param userId 用户ID
|
|
|
|
|
+ * @return 可审批的级别列表,例如:["2", "3"]
|
|
|
|
|
+ */
|
|
|
|
|
+ private List<String> getApprovalLevelsByUser(Long userId) {
|
|
|
|
|
+ try {
|
|
|
|
|
+ List<String> approvalLevels = new ArrayList<>();
|
|
|
|
|
+
|
|
|
|
|
+ // 🔴 修复:直接使用Sa-Token API检查权限,避免数据库查询问题
|
|
|
|
|
+ // 检查5个审批级别的权限(1-5级)
|
|
|
|
|
+ String[] levels = { "1", "2", "3", "4", "5" };
|
|
|
|
|
+ for (String level : levels) {
|
|
|
|
|
+ String permission = "rs:overseas:approve" + level;
|
|
|
|
|
+ if (StpUtil.hasPermission(permission)) {
|
|
|
|
|
+ approvalLevels.add(level);
|
|
|
|
|
+ log.info("✅ 用户 {} 拥有第{}级审批权限: {}", userId, level, permission);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 检查通用审批权限(超级管理员)
|
|
|
|
|
+ if (StpUtil.hasPermission("rs:overseas:approve")) {
|
|
|
|
|
+ // 通用审批权限可以审批所有级别
|
|
|
|
|
+ log.info("✅ 用户 {} 拥有通用审批权限,可审批所有级别", userId);
|
|
|
|
|
+ approvalLevels.clear();
|
|
|
|
|
+ approvalLevels.addAll(Arrays.asList(levels));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if (approvalLevels.isEmpty()) {
|
|
|
|
|
+ log.warn("❌ 用户 {} 没有任何出国审批权限", userId);
|
|
|
|
|
+ } else {
|
|
|
|
|
+ log.info("📋 用户 {} 可审批的级别: {}", userId, approvalLevels);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return approvalLevels;
|
|
|
|
|
+
|
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
|
+ log.error("❌ 获取用户 {} 的审批级别失败", userId, e);
|
|
|
|
|
+ return new ArrayList<>();
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 🆕 根据审批级别获取对应的权限标识
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param approvalLevel 审批级别(2-5)
|
|
|
|
|
+ * @return 权限标识,例如:"rs:overseas:approve2"
|
|
|
|
|
+ */
|
|
|
|
|
+ private String getPermissionByLevel(String approvalLevel) {
|
|
|
|
|
+ if (approvalLevel == null || approvalLevel.isEmpty()) {
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+ return "rs:overseas:approve" + approvalLevel;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
// 工作流监听器已移至独立的 OverseasApplicationWorkflowListener 类中
|
|
// 工作流监听器已移至独立的 OverseasApplicationWorkflowListener 类中
|
|
|
|
|
|
|
|
// 状态更新方法已移至独立的 OverseasApplicationWorkflowListener 类中
|
|
// 状态更新方法已移至独立的 OverseasApplicationWorkflowListener 类中
|