From 9498ec93084eb887b6b077a4c1dbdfa16c9ea881 Mon Sep 17 00:00:00 2001 From: MDSMO Date: Tue, 26 Aug 2025 10:04:27 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=88=9D=E5=A7=8B=E5=8C=96?= =?UTF-8?q?=E6=97=B6=E5=AD=A6=E7=94=9F=E4=BD=8F=E5=AE=BF=E8=B4=B9=E7=94=A8?= =?UTF-8?q?=E6=97=B6=E5=8F=91=E9=80=81=E7=B3=BB=E7=BB=9F=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E5=92=8C=E4=BC=81=E4=B8=9A=E5=BE=AE=E4=BF=A1=E6=B6=88=E6=81=AF?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=EF=BC=8C=E5=AD=A6=E5=B7=A5=E5=A4=84=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E4=B8=80=E9=94=AE=E7=A1=AE=E8=AE=A4=E5=BE=85=E7=A1=AE?= =?UTF-8?q?=E8=AE=A4=E7=9A=84=E5=AD=A6=E7=94=9F=E4=BD=8F=E5=AE=BF=E8=B4=B9?= =?UTF-8?q?=E7=94=A8=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dormitory/mapper/DmsNewRecordMapper.java | 30 ++++- .../service/IDmsNewRecordService.java | 19 +++ .../service/impl/DmsNewRecordServiceImpl.java | 116 +++++++++++++++++- .../mapper/dormitory/DmsNewRecordMapper.xml | 90 ++++++++++++-- .../dormitory/DmsNewRecordController.java | 11 ++ .../dormitory/DmsStuDailyController.java | 50 ++++++-- 6 files changed, 295 insertions(+), 21 deletions(-) diff --git a/dms-dormitory/src/main/java/com/srs/dormitory/mapper/DmsNewRecordMapper.java b/dms-dormitory/src/main/java/com/srs/dormitory/mapper/DmsNewRecordMapper.java index 98195ed..260aab2 100644 --- a/dms-dormitory/src/main/java/com/srs/dormitory/mapper/DmsNewRecordMapper.java +++ b/dms-dormitory/src/main/java/com/srs/dormitory/mapper/DmsNewRecordMapper.java @@ -6,6 +6,8 @@ import com.srs.dormitory.domain.DmsNewRecord; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.srs.dormitory.domain.Dto.DmsSearch; import com.srs.dormitory.domain.Vo.DomInfo; +import com.srs.comprehensive.domain.CphMsg; +import org.apache.ibatis.annotations.Param; /** * 住宿记录Mapper接口 @@ -16,6 +18,7 @@ import com.srs.dormitory.domain.Vo.DomInfo; public interface DmsNewRecordMapper extends BaseMapper { int fastConfirm(); + int confirmUnconfirmedStudents(); List findByParam(DmsSearch param); @@ -65,8 +68,33 @@ public interface DmsNewRecordMapper extends BaseMapper { /** * 批量删除住宿记录 * - * @param ids 需要删除的数据主键集合 + * @param ids 需要删除的住宿记录主键集合 * @return 结果 */ int deleteDmsNewRecordByIds(Long[] ids); + + /** + * 批量插入消息 + * + * @param messages 消息列表 + * @return 结果 + */ + int batchInsertCphMsg(List messages); + + + /** + * 根据年级ID列表查询学生用户ID + * + * @param gradeIds 年级ID列表 + * @return 学生用户ID列表 + */ + List selectStudentIdsByGrades(@Param("gradeIds") List gradeIds); + + /** + * 根据年级ID列表查询学生学号列表 + * + * @param gradeIds 年级ID列表 + * @return 学生学号列表 + */ + List selectStudentNosByGrades(@Param("gradeIds") List gradeIds); } diff --git a/dms-dormitory/src/main/java/com/srs/dormitory/service/IDmsNewRecordService.java b/dms-dormitory/src/main/java/com/srs/dormitory/service/IDmsNewRecordService.java index 15a7313..f8d2bc7 100644 --- a/dms-dormitory/src/main/java/com/srs/dormitory/service/IDmsNewRecordService.java +++ b/dms-dormitory/src/main/java/com/srs/dormitory/service/IDmsNewRecordService.java @@ -1,5 +1,8 @@ package com.srs.dormitory.service; +import java.util.List; +import com.srs.comprehensive.domain.CphMsg; + import java.util.List; import com.baomidou.mybatisplus.extension.service.IService; @@ -18,6 +21,7 @@ import org.springframework.web.bind.annotation.RequestBody; public interface IDmsNewRecordService extends IService { public AjaxResult fdyManyConfirm(List ids); + public AjaxResult confirmUnconfirmedStudents(); public AjaxResult fullInfo(Long id); public AjaxResult fastConfirm(); public AjaxResult initRecord(DmsSearch param); @@ -32,6 +36,21 @@ public interface IDmsNewRecordService extends IService { public AjaxResult exportJwc(DmsSearch param); + /** + * 发送企业微信消息 + * + * @param stuNoList 学生学号列表 + * @param content 消息内容 + */ + void sendWechatMessage(List stuNoList, String content); + + /** + * 发送系统消息 + * + * @param userIdList 用户ID列表 + * @param content 消息内容 + */ + void sendSystemMessage(List userIdList, String content); /** * 查询住宿记录 diff --git a/dms-dormitory/src/main/java/com/srs/dormitory/service/impl/DmsNewRecordServiceImpl.java b/dms-dormitory/src/main/java/com/srs/dormitory/service/impl/DmsNewRecordServiceImpl.java index 6259a69..f8aa58b 100644 --- a/dms-dormitory/src/main/java/com/srs/dormitory/service/impl/DmsNewRecordServiceImpl.java +++ b/dms-dormitory/src/main/java/com/srs/dormitory/service/impl/DmsNewRecordServiceImpl.java @@ -9,10 +9,13 @@ import com.baomidou.mybatisplus.core.conditions.query.Query; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.srs.common.core.domain.AjaxResult; +import com.srs.common.utils.WeChatUtil; import com.srs.comprehensive.domain.SrsStuYear; import com.srs.comprehensive.domain.SrsStudent; +import com.srs.comprehensive.domain.CphMsg; import com.srs.comprehensive.mapper.SrsStuYearMapper; import com.srs.comprehensive.mapper.SrsStudentMapper; +import com.srs.comprehensive.mapper.CphMsgMapper; import com.srs.dormitory.domain.DmsNewRange; import com.srs.dormitory.domain.Dto.DmsSearch; import com.srs.dormitory.domain.Vo.DomInfo; @@ -52,6 +55,12 @@ public class DmsNewRecordServiceImpl extends ServiceImpl gradeIds = new ArrayList<>(); + gradeIds.add(String.valueOf(param.gradeId)); + + // 发送企业微信消息 + List studentNos = dmsNewRecordMapper.selectStudentNosByGrades(gradeIds); + if (studentNos != null && !studentNos.isEmpty()) { + sendWechatMessage(studentNos, messageContent); + } + + // 发送系统消息 + List studentIds = dmsNewRecordMapper.selectStudentIdsByGrades(gradeIds); + if (studentIds != null && !studentIds.isEmpty()) { + sendSystemMessage(studentIds, messageContent); + } + } catch (Exception e) { + // 消息发送失败不影响主流程,只记录日志 + System.err.println("发送住宿费用确认消息失败: " + e.getMessage()); + } + transactionManager.commit(status); return AjaxResult.success(); }catch(Exception ex){ @@ -252,6 +285,20 @@ public class DmsNewRecordServiceImpl extends ServiceImpl userIdList, String content) { + if (userIdList == null || userIdList.isEmpty()) { + return; + } + + try { + List messages = new ArrayList<>(); + Date now = new Date(); + String currentUser = getUsername(); + + for (Long userId : userIdList) { + CphMsg msg = new CphMsg(); + msg.setSender(1L); // 系统发送者ID + msg.setReceiver(userId); + msg.setContent(content); + msg.setCreateBy(currentUser); + msg.setCreateTime(now); + msg.setUpdateBy(currentUser); + msg.setUpdateTime(now); + messages.add(msg); + } + + // 使用批量插入提高性能 + dmsNewRecordMapper.batchInsertCphMsg(messages); + } catch (Exception e) { + // 记录日志但不影响主流程 + System.err.println("发送系统消息失败: " + e.getMessage()); + } + } + + /** + * 发送企业微信消息 + * + * @param stuNoList 学生学号列表 + * @param content 消息内容 + */ + @Override + public void sendWechatMessage(List stuNoList, String content) { + if (stuNoList == null || stuNoList.isEmpty()) { + return; + } + + try { + // 企业微信批量发送限制,每次最多发送1000个用户 + int batchSize = 1000; + + for (int i = 0; i < stuNoList.size(); i += batchSize) { + List batch = stuNoList.subList(i, Math.min(i + batchSize, stuNoList.size())); + // 拼接成"2023001|2023002|2023003"格式 + String toUser = String.join("|", batch); + // 调用企业微信发送消息方法 + // TODO: 发送消息 + //weChatUtil.sendTextMessage(toUser, content); + // System.out.println("企业微信消息发送到: " + toUser + ", 内容: " + content); + } + } catch (Exception e) { + System.err.println("发送企业微信消息失败: " + e.getMessage()); + } + } } diff --git a/dms-dormitory/src/main/resources/mapper/dormitory/DmsNewRecordMapper.xml b/dms-dormitory/src/main/resources/mapper/dormitory/DmsNewRecordMapper.xml index 206174b..6e44767 100644 --- a/dms-dormitory/src/main/resources/mapper/dormitory/DmsNewRecordMapper.xml +++ b/dms-dormitory/src/main/resources/mapper/dormitory/DmsNewRecordMapper.xml @@ -50,7 +50,7 @@ and t1.apply_status = #{applyStatus} and t1.employee_id = #{tNo} - order by t1.apply_status asc,t1.id asc + order by t1.id desc select t1.* from @@ -77,6 +77,7 @@ and t1.apply_status = #{applyStatus} and t1.employee_id = #{tNo} + order by t1.id desc select t1.* @@ -95,7 +96,7 @@ and t1.apply_status = #{applyStatus} and t1.employee_id = #{tNo} - order by t1.id + order by t1.id desc @@ -172,13 +173,38 @@ + + + + + + - update dms_new_record as a set a.apply_status = '3' where a.apply_status = '2' + UPDATE dms_new_record + SET apply_status = ( + SELECT dict_value + FROM sys_dict_data + WHERE dict_type = 'dms_record_status' + AND dict_label = '学工已确认' + LIMIT 1 + ) + WHERE apply_status = ( + SELECT dict_value + FROM sys_dict_data + WHERE dict_type = 'dms_record_status' + AND dict_label = '辅导员已确认' + LIMIT 1 + ) + + UPDATE dms_new_record + SET apply_status = ( + SELECT dict_value + FROM sys_dict_data + WHERE dict_type = 'dms_record_status' + AND dict_label = '学工已确认' + LIMIT 1 + ) + WHERE apply_status = ( + SELECT dict_value + FROM sys_dict_data + WHERE dict_type = 'dms_record_status' + AND dict_label = '待确认' + LIMIT 1 + ) + - \ No newline at end of file + + + insert into cph_msg (sender, receiver, content, create_by, create_time, update_by, update_time) + values + + ( + #{item.sender}, + #{item.receiver}, + #{item.content}, + #{item.createBy}, + #{item.createTime}, + #{item.updateBy}, + #{item.updateTime} + ) + + + + diff --git a/srs-admin/src/main/java/com/srs/web/controller/dormitory/DmsNewRecordController.java b/srs-admin/src/main/java/com/srs/web/controller/dormitory/DmsNewRecordController.java index ba29479..2fdd127 100644 --- a/srs-admin/src/main/java/com/srs/web/controller/dormitory/DmsNewRecordController.java +++ b/srs-admin/src/main/java/com/srs/web/controller/dormitory/DmsNewRecordController.java @@ -55,6 +55,17 @@ public class DmsNewRecordController extends BaseController { } } + @ApiOperation("学工一键确认未进行住宿费用确认的学生") + @PostMapping("/confirmUnconfirmedStudents") + public AjaxResult confirmUnconfirmedStudents() { + boolean hasRole = RoleBool.isHigh(getUserId(), _postService); + if (hasRole) { + return dmsNewRecordService.confirmUnconfirmedStudents(); + } else { + return AjaxResult.error(401, "你无权做这些"); + } + } + @ApiOperation("学生填充信息") @PostMapping("/fullInfo/{id}") diff --git a/srs-admin/src/main/java/com/srs/web/controller/dormitory/DmsStuDailyController.java b/srs-admin/src/main/java/com/srs/web/controller/dormitory/DmsStuDailyController.java index a12b389..90af71b 100644 --- a/srs-admin/src/main/java/com/srs/web/controller/dormitory/DmsStuDailyController.java +++ b/srs-admin/src/main/java/com/srs/web/controller/dormitory/DmsStuDailyController.java @@ -92,22 +92,27 @@ public class DmsStuDailyController extends BaseController { // 获取用户角色组 String roleGroup = userService.selectUserRoleGroup(username); - // 检查是否同时拥有学务干事和辅导员角色 + // 检查用户拥有的角色 + boolean isXuegongRole = roleGroup.contains("学工"); boolean isDeptRole = roleGroup.contains("学务干事") || roleGroup.contains("学务办初审"); boolean isTeacherRole = roleGroup.contains("辅导员"); - // 根据前端传递的roleType参数进行过滤 - if (isDeptRole && isTeacherRole) { - // 同时拥有两个角色,根据roleType参数决定查看哪种数据 + // 根据角色组合和前端传递的roleType参数进行过滤 + if ((isXuegongRole && isTeacherRole) || (isDeptRole && isTeacherRole)) { + // 多角色用户,根据roleType参数决定查看哪种数据 if ("teacher".equals(param.getRoleType())) { - // 查看个人班级数据 + // 辅导员权限:查看个人班级数据 param.setTeacherNo(username); - } else { - // 默认查看学院数据 + } else if ("dept".equals(param.getRoleType())) { + // 学务干事权限:查看学院数据 if (currentUser.getDept() != null) { param.setDeptName(currentUser.getDept().getDeptName()); } + } else if ("xuegong".equals(param.getRoleType()) || param.getRoleType() == null) { + // 学工权限:查看所有数据,不设置过滤条件 } + } else if (isXuegongRole) { + // 只有学工角色,查看所有数据,不设置过滤条件 } else if (isDeptRole) { // 只有学务干事角色,查看学院数据 if (currentUser.getDept() != null) { @@ -135,16 +140,39 @@ public class DmsStuDailyController extends BaseController { String roleGroup = userService.selectUserRoleGroup(username); SysUser currentUser = userService.selectUserByUserName(username); + boolean isXuegongRole = roleGroup.contains("学工"); boolean isDeptRole = roleGroup.contains("学务干事"); boolean isTeacherRole = roleGroup.contains("辅导员"); - boolean hasMultipleRoles = isDeptRole && isTeacherRole; + + // 判断多角色情况 + boolean hasMultipleRoles = (isXuegongRole && isTeacherRole) || (isDeptRole && isTeacherRole); Map roleInfo = new HashMap<>(); roleInfo.put("hasMultipleRoles", hasMultipleRoles); - roleInfo.put("defaultRole", "dept"); // 默认显示学院数据 roleInfo.put("isAdmin", SecurityUtils.isAdmin(SecurityUtils.getUserId())); - roleInfo.put("isXuewu", roleGroup.contains("学务干事")); - roleInfo.put("isFudaoyuan", roleGroup.contains("辅导员")); + roleInfo.put("isXuegong", isXuegongRole); + roleInfo.put("isXuewu", isDeptRole); + roleInfo.put("isFudaoyuan", isTeacherRole); + + // 设置默认角色和可用角色选项 + if (isXuegongRole && isTeacherRole) { + // 学工+辅导员组合 + roleInfo.put("defaultRole", "xuegong"); + roleInfo.put("availableRoles", new String[]{"xuegong", "teacher"}); + } else if (isDeptRole && isTeacherRole) { + // 学务干事+辅导员组合 + roleInfo.put("defaultRole", "dept"); + roleInfo.put("availableRoles", new String[]{"dept", "teacher"}); + } else if (isXuegongRole) { + // 只有学工角色 + roleInfo.put("defaultRole", "xuegong"); + } else if (isDeptRole) { + // 只有学务干事角色 + roleInfo.put("defaultRole", "dept"); + } else if (isTeacherRole) { + // 只有辅导员角色 + roleInfo.put("defaultRole", "teacher"); + } // 添加用户部门信息 if (currentUser != null && currentUser.getDept() != null) {