From 109577a578a2ef7f5a58e57071d2f19a49d3d325 Mon Sep 17 00:00:00 2001 From: zlwu <704541015@qq.com> Date: Tue, 5 Aug 2025 13:21:49 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/mybatis/core/page/PageQuery.java | 6 ++ .../listener/WorkflowGlobalListener.java | 14 +-- .../xg/controller/XgStudentMsgController.java | 34 ++++++++ .../dromara/xg/mapper/XgStudentMsgMapper.java | 86 ++++++++++++------- .../xg/service/IXgStudentMsgService.java | 16 ++++ .../service/impl/XgStudentMsgServiceImpl.java | 38 ++++++++ .../mapper/studentMsg/XgStudentMsgMapper.xml | 34 ++++++++ .../xg/xsjcxx/studentMsg/studentMsg/index.ts | 22 +++++ web/src/layout/components/Navbar.vue | 4 +- web/src/views/xg/xsjcxx/xsqj/dialog.vue | 50 +++++++++-- 10 files changed, 261 insertions(+), 43 deletions(-) diff --git a/backend/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/PageQuery.java b/backend/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/PageQuery.java index 1d5c3c9d..8c690e34 100644 --- a/backend/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/PageQuery.java +++ b/backend/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/PageQuery.java @@ -119,6 +119,12 @@ public class PageQuery implements Serializable { return (pageNum - 1) * pageSize; } + /** + * 无参构造器 + */ + public PageQuery() { + } + public PageQuery(Integer pageSize, Integer pageNum) { this.pageSize = pageSize; this.pageNum = pageNum; diff --git a/backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java b/backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java index 454b08f4..d39ab924 100644 --- a/backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java +++ b/backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/listener/WorkflowGlobalListener.java @@ -81,8 +81,9 @@ public class WorkflowGlobalListener implements GlobalListener { String applyNodeCode = flwCommonService.applyNodeCode(definition.getId()); for (Task flowTask : nextTasks) { // 如果办理或者退回并行存在需要指定办理人,则直接覆盖办理人 - if (variable.containsKey(flowTask.getNodeCode()) && (TaskStatusEnum.PASS.getStatus().equals(flowParams.getHisStatus()) - || TaskStatusEnum.BACK.getStatus().equals(flowParams.getHisStatus()))) { + if (variable.containsKey(flowTask.getNodeCode()) + && (TaskStatusEnum.PASS.getStatus().equals(flowParams.getHisStatus()) + || TaskStatusEnum.BACK.getStatus().equals(flowParams.getHisStatus()))) { String userIds = variable.get(flowTask.getNodeCode()).toString(); flowTask.setPermissionList(List.of(userIds.split(StringUtils.SEPARATOR))); variable.remove(flowTask.getNodeCode()); @@ -116,10 +117,11 @@ public class WorkflowGlobalListener implements GlobalListener { params.put("message", flowParams.getMessage()); variable = flowParams.getVariable(); } - //申请人提交事件 + // 申请人提交事件 Boolean submit = MapUtil.getBool(variable, FlowConstant.SUBMIT); if (submit != null && submit) { - flowProcessEventHandler.processHandler(definition.getFlowCode(), instance, instance.getFlowStatus(), variable, true); + flowProcessEventHandler.processHandler(definition.getFlowCode(), instance, instance.getFlowStatus(), + variable, true); } else { // 判断流程状态(发布:撤销,退回,作废,终止,已完成事件) String status = determineFlowStatus(instance); @@ -127,7 +129,7 @@ public class WorkflowGlobalListener implements GlobalListener { flowProcessEventHandler.processHandler(definition.getFlowCode(), instance, status, params, false); } } - //发布任务事件 + // 发布任务事件 if (task != null) { flowProcessEventHandler.processTaskHandler(definition.getFlowCode(), instance, task.getId()); } @@ -136,7 +138,7 @@ public class WorkflowGlobalListener implements GlobalListener { } // 只有办理或者退回的时候才执行消息通知和抄送 if (TaskStatusEnum.PASS.getStatus().equals(flowParams.getHisStatus()) - || TaskStatusEnum.BACK.getStatus().equals(flowParams.getHisStatus())) { + || TaskStatusEnum.BACK.getStatus().equals(flowParams.getHisStatus())) { if (variable != null) { if (variable.containsKey(FlowConstant.FLOW_COPY_LIST)) { List flowCopyList = (List) variable.get(FlowConstant.FLOW_COPY_LIST); diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgStudentMsgController.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgStudentMsgController.java index b27b4f33..f15473bf 100644 --- a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgStudentMsgController.java +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/controller/XgStudentMsgController.java @@ -788,6 +788,40 @@ public class XgStudentMsgController extends BaseController { return xgStudentMsgService.advancedSearch(bo); } + /** + * 根据学生ID获取班主任ID + * + * @param studentId 学生ID + * @return 班主任ID + */ + @SaCheckPermission("studentMsg:studentMsg:query") + @GetMapping("/getClassTeacherId/{studentId}") + public R getClassTeacherId(@NotNull(message = "学生ID不能为空") @PathVariable Long studentId) { + log.info("根据学生ID获取班主任ID - 学生ID: {}", studentId); + Long classTeacherId = xgStudentMsgService.getClassTeacherIdByStudentId(studentId); + if (classTeacherId == null) { + return R.fail("未找到该学生对应的班主任信息"); + } + return R.ok(classTeacherId); + } + + /** + * 根据学生ID获取学院请假审批人列表 + * + * @param studentId 学生ID + * @return 请假审批人用户ID列表 + */ + @SaCheckPermission("studentMsg:studentMsg:query") + @GetMapping("/getCollegeLeaveApprovers/{studentId}") + public R> getCollegeLeaveApprovers(@NotNull(message = "学生ID不能为空") @PathVariable Long studentId) { + log.info("根据学生ID获取学院请假审批人列表 - 学生ID: {}", studentId); + List approverUserIds = xgStudentMsgService.getCollegeLeaveApproversByStudentId(studentId); + if (approverUserIds.isEmpty()) { + return R.fail("未找到该学生所在学院的请假审批人"); + } + return R.ok(approverUserIds); + } + /** * 导入数据 * diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgStudentMsgMapper.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgStudentMsgMapper.java index e8222b40..b8490b09 100644 --- a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgStudentMsgMapper.java +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgStudentMsgMapper.java @@ -18,37 +18,63 @@ import java.util.List; */ public interface XgStudentMsgMapper extends BaseMapperPlus { - /** - * 根据组织ID列表分页查询学生信息 用于导出 - * - * @param page 分页参数 - * @param queryWrapper 查询条件 - * @param deptIds 组织ID列表 - * @return 学生信息分页结果 - */ - List queryPageListExportByDeptId( - @Param("ew") LambdaQueryWrapper queryWrapper, - @Param("deptIds") List deptIds); + /** + * 根据组织ID列表分页查询学生信息 用于导出 + * + * @param page 分页参数 + * @param queryWrapper 查询条件 + * @param deptIds 组织ID列表 + * @return 学生信息分页结果 + */ + List queryPageListExportByDeptId( + @Param("ew") LambdaQueryWrapper queryWrapper, + @Param("deptIds") List deptIds); - /** - * 根据组织ID列表分页查询学生信息 - * - * @param page 分页参数 - * @param queryWrapper 查询条件 - * @param deptIds 组织ID列表 - * @return 学生信息分页结果 - */ - Page selectPageByDeptIds(@Param("page") Page page, - @Param("ew") LambdaQueryWrapper queryWrapper, - @Param("deptIds") List deptIds); + /** + * 根据组织ID列表分页查询学生信息 + * + * @param page 分页参数 + * @param queryWrapper 查询条件 + * @param deptIds 组织ID列表 + * @return 学生信息分页结果 + */ + Page selectPageByDeptIds(@Param("page") Page page, + @Param("ew") LambdaQueryWrapper queryWrapper, + @Param("deptIds") List deptIds); - /** - * 根据班级ID和姓名查询学生信息列表 - * - * @param classId 班级ID - * @param name 学生姓名(模糊查询) - * @return 学生信息列表 - */ - List selectStudentsByClassId(@Param("classId") String classId, @Param("name") String name); + /** + * 根据班级ID和姓名查询学生信息列表 + * + * @param classId 班级ID + * @param name 学生姓名(模糊查询) + * @return 学生信息列表 + */ + List selectStudentsByClassId(@Param("classId") String classId, @Param("name") String name); + + /** + * 根据学生ID查询班主任ID + * + * @param studentId 学生ID + * @return 班主任ID + */ + Long selectClassTeacherIdByStudentId(@Param("studentId") Long studentId); + + /** + * 根据学生ID查询学院ID + * + * @param studentId 学生ID + * @return 学院ID + */ + Long selectCollegeIdByStudentId(@Param("studentId") Long studentId); + + /** + * 根据学院ID和角色Key查询具备该角色的用户列表 + * + * @param collegeId 学院ID + * @param roleKey 角色Key + * @return 用户ID列表 + */ + List selectUserIdsByCollegeIdAndRoleKey(@Param("collegeId") Long collegeId, + @Param("roleKey") String roleKey); } diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgStudentMsgService.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgStudentMsgService.java index fa2c5cf6..0ba9ac67 100644 --- a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgStudentMsgService.java +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/IXgStudentMsgService.java @@ -122,4 +122,20 @@ public interface IXgStudentMsgService { * @return 学生信息分页列表 */ TableDataInfo advancedSearch(XgStudentMsgAdvancedSearchBo bo); + + /** + * 根据学生ID查询班主任ID + * + * @param studentId 学生ID + * @return 班主任ID + */ + Long getClassTeacherIdByStudentId(Long studentId); + + /** + * 根据学生ID获取学院请假审批人列表 + * + * @param studentId 学生ID + * @return 请假审批人用户ID列表 + */ + List getCollegeLeaveApproversByStudentId(Long studentId); } diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgStudentMsgServiceImpl.java b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgStudentMsgServiceImpl.java index f962cdbc..57d1dbd3 100644 --- a/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgStudentMsgServiceImpl.java +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgStudentMsgServiceImpl.java @@ -1049,4 +1049,42 @@ public class XgStudentMsgServiceImpl implements IXgStudentMsgService { return lqw; } + + /** + * 根据学生ID查询班主任ID + * + * @param studentId 学生ID + * @return 班主任ID + */ + @Override + public Long getClassTeacherIdByStudentId(Long studentId) { + log.info("根据学生ID查询班主任ID - 学生ID: {}", studentId); + return baseMapper.selectClassTeacherIdByStudentId(studentId); + } + + /** + * 根据学生ID获取学院请假审批人列表 + * + * @param studentId 学生ID + * @return 请假审批人用户ID列表 + */ + @Override + public List getCollegeLeaveApproversByStudentId(Long studentId) { + log.info("根据学生ID获取学院请假审批人列表 - 学生ID: {}", studentId); + + // 1. 根据学生ID查询学院ID + Long collegeId = baseMapper.selectCollegeIdByStudentId(studentId); + if (collegeId == null) { + log.warn("未找到学生对应的学院信息 - 学生ID: {}", studentId); + return new ArrayList<>(); + } + + log.info("学生所在学院ID: {}", collegeId); + + // 2. 根据学院ID和角色Key查询具备请假审批角色的用户列表 + List approverUserIds = baseMapper.selectUserIdsByCollegeIdAndRoleKey(collegeId, "xsqj-ejxyspr"); + + log.info("找到的请假审批人数量: {}", approverUserIds.size()); + return approverUserIds; + } } diff --git a/backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/studentMsg/XgStudentMsgMapper.xml b/backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/studentMsg/XgStudentMsgMapper.xml index 840bdba3..914223a4 100644 --- a/backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/studentMsg/XgStudentMsgMapper.xml +++ b/backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/studentMsg/XgStudentMsgMapper.xml @@ -137,4 +137,38 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" ORDER BY create_time DESC + + + + + + + + + diff --git a/web/src/api/xg/xsjcxx/studentMsg/studentMsg/index.ts b/web/src/api/xg/xsjcxx/studentMsg/studentMsg/index.ts index 0ee52541..13c1e95e 100644 --- a/web/src/api/xg/xsjcxx/studentMsg/studentMsg/index.ts +++ b/web/src/api/xg/xsjcxx/studentMsg/studentMsg/index.ts @@ -84,3 +84,25 @@ export const downloadImportTemplate = () => { responseType: 'blob' }); }; + +/** + * 根据学生ID获取班主任ID + * @param studentId 学生ID + */ +export const getClassTeacherId = (studentId: string | number): AxiosPromise<{ data: number }> => { + return request({ + url: `/studentMsg/studentMsg/getClassTeacherId/${studentId}`, + method: 'get' + }); +}; + +/** + * 根据学生ID获取学院请假审批人列表 + * @param studentId 学生ID + */ +export const getCollegeLeaveApprovers = (studentId: string | number): AxiosPromise<{ data: number[] }> => { + return request({ + url: `/studentMsg/studentMsg/getCollegeLeaveApprovers/${studentId}`, + method: 'get' + }); +}; diff --git a/web/src/layout/components/Navbar.vue b/web/src/layout/components/Navbar.vue index 852a9315..63442c68 100644 --- a/web/src/layout/components/Navbar.vue +++ b/web/src/layout/components/Navbar.vue @@ -28,7 +28,7 @@ - + diff --git a/web/src/views/xg/xsjcxx/xsqj/dialog.vue b/web/src/views/xg/xsjcxx/xsqj/dialog.vue index cc6f76ab..b7609b9f 100644 --- a/web/src/views/xg/xsjcxx/xsqj/dialog.vue +++ b/web/src/views/xg/xsjcxx/xsqj/dialog.vue @@ -243,7 +243,7 @@ import ApprovalButton from '@/components/Process/approvalButton.vue'; import { AxiosResponse } from 'axios'; import { StartProcessBo } from '@/api/workflow/workflowCommon/types'; import { addStudentLeave, getStudentLeave, updateStudentLeave } from '@/api/workflow/studentLeave/studentLeave'; -import { getStudentMsg } from '@/api/xg/xsjcxx/studentMsg/studentMsg'; +import { getStudentMsg, getClassTeacherId, getCollegeLeaveApprovers } from '@/api/xg/xsjcxx/studentMsg/studentMsg'; import { startWorkFlow } from '@/api/workflow/task'; import { StudentLeaveForm, StudentLeaveVO } from '@/api/workflow/studentLeave/studentLeave/types'; import { StudentMsgVO } from '@/api/xg/xsjcxx/studentMsg/studentMsg/types'; @@ -686,8 +686,9 @@ const disabledEndDate = (time: Date) => { // 但需要确保结束时间不能早于开始时间 if (form.startTime) { const startDate = new Date(form.startTime); - if (time.getTime() <= startDate.getTime()) { - return true; // 禁用早于或等于开始时间的日期 + // 修改逻辑:允许选择与开始时间同一天及之后的日期 + if (time.getTime() < startDate.getTime()) { + return true; // 只禁用早于开始时间的日期,允许同一天 } } @@ -766,6 +767,42 @@ const submitFlow = async () => { // 启动工作流 const handleStartWorkFlow = async (data: StudentLeaveForm) => { try { + // 1. 调用接口获取班主任ID + let classTeacherId: number | null = null; + try { + const classTeacherResponse = await getClassTeacherId(data.studentId); + if (classTeacherResponse && classTeacherResponse.data) { + classTeacherId = classTeacherResponse.data; + console.log('获取到班主任ID:', classTeacherId); + } else { + console.warn('获取班主任ID失败'); + ElMessage.error('获取班主任信息失败,请稍后重试'); + return; // 停止后续操作 + } + } catch (error) { + console.error('调用获取班主任ID接口失败:', error); + ElMessage.error('获取班主任信息失败,请稍后重试'); + return; // 停止后续操作 + } + + // 2. 调用接口获取学院请假审批人列表 + let collegeApprovers: number[] = []; + try { + const collegeApproversResponse = await getCollegeLeaveApprovers(data.studentId); + if (collegeApproversResponse && collegeApproversResponse.data) { + collegeApprovers = collegeApproversResponse.data; + console.log('获取到学院请假审批人列表:', collegeApprovers); + } else { + console.warn('获取学院请假审批人列表失败'); + ElMessage.error('获取学院审批人信息失败,请稍后重试'); + return; // 停止后续操作 + } + } catch (error) { + console.error('调用获取学院请假审批人接口失败:', error); + ElMessage.error('获取学院审批人信息失败,请稍后重试'); + return; // 停止后续操作 + } + submitFormData.value.flowCode = flowCode.value; submitFormData.value.businessId = data.id; // 流程变量 @@ -773,9 +810,12 @@ const handleStartWorkFlow = async (data: StudentLeaveForm) => { // hzdyjs-qj 使用的流程变量 qjts: data.leaveDuration, // leave2/6 使用的流程变量 - leaveDays: data.leaveDuration, + // leaveDays: data.leaveDuration, // leave4/5 使用的流程变量 - userList: ['1', '3', '4'] + // userList: ['1', '3', '4'], + // 新增的流程变量 + bzrspr: classTeacherId, + ejxyspr: collegeApprovers }; submitFormData.value.variables = taskVariables.value; const resp = await startWorkFlow(submitFormData.value);