zlwu 11 月之前
父节点
当前提交
4d48300a1d
共有 67 个文件被更改,包括 1023 次插入 和 433 次删除
  1. 66 6
      backend/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/PageQuery.java
  2. 1 1
      backend/ruoyi-modules/ruoyi-cw/src/main/resources/mapper/CwApprovalRecordMapper.xml
  3. 1 1
      backend/ruoyi-modules/ruoyi-cw/src/main/resources/mapper/CwProjectAuditorMapper.xml
  4. 2 2
      backend/ruoyi-modules/ruoyi-cw/src/main/resources/mapper/cw/CwProjectEvaluationIndicatorMapper.xml
  5. 2 2
      backend/ruoyi-modules/ruoyi-cw/src/main/resources/mapper/cw/CwProjectMonthlyMonitoringMapper.xml
  6. 1 1
      backend/ruoyi-modules/ruoyi-cw/src/main/resources/mapper/cw/CwProjectPerformanceSelfEvaluationMapper.xml
  7. 7 0
      backend/ruoyi-modules/ruoyi-hq/src/main/java/org/dromara/hq/service/impl/HqSatQuestionServiceImpl.java
  8. 1 1
      backend/ruoyi-modules/ruoyi-hq/src/main/java/org/dromara/hq/service/impl/HqSatSurveyServiceImpl.java
  9. 1 1
      backend/ruoyi-modules/ruoyi-hq/src/main/resources/mapper/HqPmRepairOrderMapper.xml
  10. 2 2
      backend/ruoyi-modules/ruoyi-jcbt/src/main/java/org/dromara/jcbt/service/impl/JcbtScholarshipApplicationServiceImpl.java
  11. 1 1
      backend/ruoyi-modules/ruoyi-jcbt/src/main/resources/mapper/jcbt/JcbtPovertyApplicationMapper.xml
  12. 3 0
      backend/ruoyi-modules/ruoyi-rs/src/main/resources/mapper/rs/RsApplicationMapper.xml
  13. 1 1
      backend/ruoyi-modules/ruoyi-rs/src/main/resources/mapper/rs/RsOverseasApplicationAttachmentMapper.xml
  14. 3 3
      backend/ruoyi-modules/ruoyi-rs/src/main/resources/mapper/rs/RsOverseasApplicationMapper.xml
  15. 1 1
      backend/ruoyi-modules/ruoyi-rs/src/main/resources/mapper/rs/RsTrainingApprovalMapper.xml
  16. 5 5
      backend/ruoyi-modules/ruoyi-stgl/src/main/resources/mapper/StglMyMapper.xml
  17. 2 2
      backend/ruoyi-modules/ruoyi-stgl/src/main/resources/mapper/stgl/StglActivityMapper.xml
  18. 1 1
      backend/ruoyi-modules/ruoyi-stgl/src/main/resources/mapper/stgl/StglAuditorMapper.xml
  19. 3 3
      backend/ruoyi-modules/ruoyi-stgl/src/main/resources/mapper/stgl/StglClassMapper.xml
  20. 9 9
      backend/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysTeacherMapper.java
  21. 2 1
      backend/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java
  22. 1 0
      backend/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java
  23. 11 6
      backend/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java
  24. 19 3
      backend/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml
  25. 10 2
      backend/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml
  26. 8 0
      backend/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysPostMapper.xml
  27. 16 0
      backend/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml
  28. 40 0
      backend/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml
  29. 3 1
      backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java
  30. 5 2
      backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java
  31. 1 1
      backend/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwHisTaskExtMapper.xml
  32. 4 4
      backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgDormBedMapper.java
  33. 6 3
      backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgDormBedStudentMapper.java
  34. 34 11
      backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgStudentMapper.java
  35. 1 1
      backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgDormBedStudentServiceImpl.java
  36. 1 1
      backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgDormManagerServiceImpl.java
  37. 1 1
      backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgStudentManagerServiceImpl.java
  38. 2 2
      backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgStudentManagerSourceServiceImpl.java
  39. 1 1
      backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgStudentMsgServiceImpl.java
  40. 3 1
      backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgStudentServiceImpl.java
  41. 1 1
      backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/dormHygieneCheck/XgDormHygieneCheckMapper.xml
  42. 1 1
      backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/dormViolation/XgDormViolationMapper.xml
  43. 1 1
      backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/holidayStay/XgHolidayStayMapper.xml
  44. 6 6
      backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/studentMsg/XgStudentMsgMapper.xml
  45. 3 3
      backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/studentMsgBatch/XgStudentMsgBatchMapper.xml
  46. 9 9
      backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/xg/XgStudentStatisticsMapper.xml
  47. 2 2
      backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/xg/XgSysUserMapper.xml
  48. 1 1
      backend/ruoyi-modules/ruoyi-xljk/src/main/java/org/dromara/xljk/controller/XljkConsultationScheduleController.java
  49. 224 214
      backend/ruoyi-modules/ruoyi-xljk/src/main/java/org/dromara/xljk/service/impl/XljkConsultationAppointmentServiceImpl.java
  50. 61 58
      backend/ruoyi-modules/ruoyi-xljk/src/main/java/org/dromara/xljk/service/impl/XljkConsultationNoShowServiceImpl.java
  51. 30 27
      backend/ruoyi-modules/ruoyi-xljk/src/main/resources/mapper/xljk/XljkSystemQueryMapper.xml
  52. 1 1
      backend/ruoyi-modules/ruoyi-xskh/src/main/resources/mapper/XskhDisciplineRecordMapper.xml
  53. 1 1
      backend/ruoyi-modules/ruoyi-xskh/src/main/resources/mapper/xskh/XskhRewardRecordMapper.xml
  54. 17 11
      backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/mapper/ZsjyEnrollmentInfoMapper.java
  55. 3 2
      backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/mapper/ZsjyEnrollmentProcessMapper.java
  56. 2 2
      backend/ruoyi-modules/ruoyi-zsjy/src/main/resources/mapper/InternshipInfoMapper.xml
  57. 1 1
      backend/ruoyi-modules/ruoyi-zsjy/src/main/resources/mapper/ZsjyInternshipMonthlyMapper.xml
  58. 2 0
      docs/开发文档/API/API.md.backup-20250701-163220
  59. 2 0
      docs/开发文档/API/API文档基础规范.md
  60. 9 1
      docs/开发文档/API/API文档总览.md
  61. 1 0
      docs/开发文档/API/出国申请管理API.md
  62. 2 0
      docs/开发文档/API/后勤满意度调查API.md
  63. 2 0
      docs/开发文档/API/学生信息批次收集API.md
  64. 1 0
      docs/开发文档/API/心理健康测评API.md
  65. 64 1
      docs/开发文档/API/用户认证登录API.md
  66. 2 0
      docs/开发文档/API/预约限制功能API.md
  67. 292 6
      web/src/views/xg/xsjcxx/stuRoster/index.vue

+ 66 - 6
backend/ruoyi-common/ruoyi-common-mybatis/src/main/java/org/dromara/common/mybatis/core/page/PageQuery.java

@@ -13,7 +13,11 @@ import org.dromara.common.core.utils.sql.SqlUtil;
 import java.io.Serial;
 import java.io.Serializable;
 import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
 
 /**
  * 分页查询实体类
@@ -46,6 +50,16 @@ public class PageQuery implements Serializable {
      */
     private String isAsc;
 
+    /**
+     * 默认排序列
+     */
+    private String defaultOrderByColumn = "create_time";
+
+    /**
+     * 默认排序方向
+     */
+    private String defaultIsAsc = "desc";
+
     /**
      * 当前记录起始索引 默认值
      */
@@ -66,10 +80,14 @@ public class PageQuery implements Serializable {
             pageNum = DEFAULT_PAGE_NUM;
         }
         Page<T> page = new Page<>(pageNum, pageSize);
-        List<OrderItem> orderItems = buildOrderItem();
+        List<OrderItem> orderItems = buildOrderItem(orderByColumn, isAsc);
         if (CollUtil.isNotEmpty(orderItems)) {
             page.addOrder(orderItems);
         }
+        List<OrderItem> defaultOrderItems = buildDefaultOrderItem(orderItems);
+        if (CollUtil.isNotEmpty(defaultOrderItems)) {
+            page.addOrder(defaultOrderItems);
+        }
         return page;
     }
 
@@ -79,18 +97,21 @@ public class PageQuery implements Serializable {
      * 支持的用法如下:
      * {isAsc:"asc",orderByColumn:"id"} order by id asc
      * {isAsc:"asc",orderByColumn:"id,createTime"} order by id asc,create_time asc
-     * {isAsc:"desc",orderByColumn:"id,createTime"} order by id desc,create_time desc
-     * {isAsc:"asc,desc",orderByColumn:"id,createTime"} order by id asc,create_time desc
+     * {isAsc:"desc",orderByColumn:"id,createTime"} order by id desc,create_time
+     * desc
+     * {isAsc:"asc,desc",orderByColumn:"id,createTime"} order by id asc,create_time
+     * desc
      */
-    private List<OrderItem> buildOrderItem() {
+    private List<OrderItem> buildOrderItem(String orderByColumn, String isAsc) {
         if (StringUtils.isBlank(orderByColumn) || StringUtils.isBlank(isAsc)) {
-            return null;
+            return Collections.emptyList();
         }
         String orderBy = SqlUtil.escapeOrderBySql(orderByColumn);
         orderBy = StringUtils.toUnderScoreCase(orderBy);
 
         // 兼容前端排序类型
-        isAsc = StringUtils.replaceEach(isAsc, new String[]{"ascending", "descending"}, new String[]{"asc", "desc"});
+        isAsc = StringUtils.replaceEach(isAsc, new String[] { "ascending", "descending" },
+                new String[] { "asc", "desc" });
 
         String[] orderByArr = orderBy.split(StringUtils.SEPARATOR);
         String[] isAscArr = isAsc.split(StringUtils.SEPARATOR);
@@ -114,6 +135,29 @@ public class PageQuery implements Serializable {
         return list;
     }
 
+    private List<OrderItem> buildDefaultOrderItem(List<OrderItem> existingOrders) {
+        if (StringUtils.isBlank(defaultOrderByColumn) || StringUtils.isBlank(defaultIsAsc)) {
+            return Collections.emptyList();
+        }
+        List<OrderItem> defaultItems = buildOrderItem(defaultOrderByColumn, defaultIsAsc);
+        if (CollUtil.isEmpty(defaultItems)) {
+            return defaultItems;
+        }
+        Set<String> existing = CollUtil.isNotEmpty(existingOrders)
+                ? existingOrders.stream()
+                        .map(item -> StringUtils.blankToDefault(item.getColumn(), StringUtils.EMPTY).trim()
+                                .toLowerCase())
+                        .collect(Collectors.toCollection(HashSet::new))
+                : Collections.emptySet();
+        return defaultItems.stream()
+                .filter(item -> {
+                    String column = StringUtils.blankToDefault(item.getColumn(), StringUtils.EMPTY).trim()
+                            .toLowerCase();
+                    return !existing.contains(column);
+                })
+                .collect(Collectors.toList());
+    }
+
     @JsonIgnore
     public Integer getFirstNum() {
         return (pageNum - 1) * pageSize;
@@ -130,4 +174,20 @@ public class PageQuery implements Serializable {
         this.pageNum = pageNum;
     }
 
+    public PageQuery withDefaultOrder(String column, String asc) {
+        this.defaultOrderByColumn = column;
+        this.defaultIsAsc = asc;
+        return this;
+    }
+
+    public PageQuery withDefaultOrder(String column) {
+        return withDefaultOrder(column, "desc");
+    }
+
+    public PageQuery disableDefaultOrder() {
+        this.defaultOrderByColumn = null;
+        this.defaultIsAsc = null;
+        return this;
+    }
+
 }

+ 1 - 1
backend/ruoyi-modules/ruoyi-cw/src/main/resources/mapper/CwApprovalRecordMapper.xml

@@ -275,7 +275,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
           AND u.status = '0'
           AND u.del_flag = '0'
           AND r.status = '0'
-        ORDER BY u.user_name
+        ORDER BY u.user_name ASC, u.create_time DESC
     </select>
 
 </mapper>

+ 1 - 1
backend/ruoyi-modules/ruoyi-cw/src/main/resources/mapper/CwProjectAuditorMapper.xml

@@ -129,7 +129,7 @@
         <foreach item="userId" collection="userIds" open="(" separator="," close=")">
             #{userId}
         </foreach>
-        order by u.dept_id, u.user_name
+        order by u.user_name asc, u.dept_id
     </select>
 
 </mapper>

+ 2 - 2
backend/ruoyi-modules/ruoyi-cw/src/main/resources/mapper/cw/CwProjectEvaluationIndicatorMapper.xml

@@ -32,7 +32,7 @@
         FROM cw_project_evaluation_indicator
         WHERE evaluation_id = #{evaluationId}
           AND deleted = 0
-        ORDER BY indicator_category, sort_order
+        ORDER BY indicator_category, sort_order, create_time DESC
     </select>
 
     <!-- 根据自评ID和指标类别查询指标列表 -->
@@ -42,7 +42,7 @@
         WHERE evaluation_id = #{evaluationId}
           AND indicator_category = #{indicatorCategory}
           AND deleted = 0
-        ORDER BY sort_order
+        ORDER BY sort_order, create_time DESC
     </select>
 
     <!-- 批量插入指标 -->

+ 2 - 2
backend/ruoyi-modules/ruoyi-cw/src/main/resources/mapper/cw/CwProjectMonthlyMonitoringMapper.xml

@@ -43,7 +43,7 @@
         FROM cw_project_monthly_monitoring
         WHERE evaluation_id = #{evaluationId}
           AND deleted = 0
-        ORDER BY monitoring_year, monitoring_month
+        ORDER BY monitoring_year, monitoring_month, create_time DESC
     </select>
 
     <!-- 根据自评ID和年度查询月度监控列表 -->
@@ -53,7 +53,7 @@
         WHERE evaluation_id = #{evaluationId}
           AND monitoring_year = #{monitoringYear}
           AND deleted = 0
-        ORDER BY monitoring_month
+        ORDER BY monitoring_month, create_time DESC
     </select>
 
     <!-- 根据自评ID、年度和月份查询月度监控 -->

+ 1 - 1
backend/ruoyi-modules/ruoyi-cw/src/main/resources/mapper/cw/CwProjectPerformanceSelfEvaluationMapper.xml

@@ -147,7 +147,7 @@
         FROM cw_project_performance_self_evaluation
         WHERE evaluation_status = 'submitted'
           AND deleted = 0
-        ORDER BY submit_time ASC
+        ORDER BY submit_time ASC, create_time DESC
     </select>
 
     <!-- 统计自评数量 -->

+ 7 - 0
backend/ruoyi-modules/ruoyi-hq/src/main/java/org/dromara/hq/service/impl/HqSatQuestionServiceImpl.java

@@ -75,6 +75,7 @@ public class HqSatQuestionServiceImpl implements IHqSatQuestionService {
         LambdaQueryWrapper<HqSatQuestion> lqw = Wrappers.lambdaQuery();
 
         // 处理排序参数
+        boolean sortedByCreateTime = false;
         if (params != null && params.containsKey("orderByColumn") && params.containsKey("isAsc")) {
             String orderByColumn = (String) params.get("orderByColumn");
             String isAsc = (String) params.get("isAsc");
@@ -85,6 +86,7 @@ public class HqSatQuestionServiceImpl implements IHqSatQuestionService {
                 } else {
                     lqw.orderByAsc(HqSatQuestion::getCreateTime);
                 }
+                sortedByCreateTime = true;
             } else if ("updateTime".equals(orderByColumn)) {
                 if ("desc".equals(isAsc)) {
                     lqw.orderByDesc(HqSatQuestion::getUpdateTime);
@@ -100,10 +102,15 @@ public class HqSatQuestionServiceImpl implements IHqSatQuestionService {
             } else {
                 // 默认按创建时间倒序
                 lqw.orderByDesc(HqSatQuestion::getCreateTime);
+                sortedByCreateTime = true;
             }
         } else {
             // 默认按创建时间倒序
             lqw.orderByDesc(HqSatQuestion::getCreateTime);
+            sortedByCreateTime = true;
+        }
+        if (!sortedByCreateTime) {
+            lqw.orderByDesc(HqSatQuestion::getCreateTime);
         }
 
         // 添加ID查询条件

+ 1 - 1
backend/ruoyi-modules/ruoyi-hq/src/main/java/org/dromara/hq/service/impl/HqSatSurveyServiceImpl.java

@@ -1097,7 +1097,7 @@ public class HqSatSurveyServiceImpl implements IHqSatSurveyService {
             }
 
             sql.append("GROUP BY u.user_id, rec.id ");
-            sql.append("ORDER BY CASE WHEN rec.submit_time IS NOT NULL THEN 0 ELSE 1 END, rec.submit_time DESC, u.user_id ");
+            sql.append("ORDER BY CASE WHEN rec.submit_time IS NOT NULL THEN 0 ELSE 1 END, rec.submit_time DESC, u.user_name ASC, u.user_id ");
 
             // 查询总数
             StringBuilder countSql = new StringBuilder();

+ 1 - 1
backend/ruoyi-modules/ruoyi-hq/src/main/resources/mapper/HqPmRepairOrderMapper.xml

@@ -18,7 +18,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         WHERE r.role_key = 'maintenance_worker'
         AND u.status = '0'
         AND u.del_flag = '0'
-        ORDER BY u.user_id
+        ORDER BY u.user_name ASC, u.create_time DESC
     </select>
 
 </mapper>

+ 2 - 2
backend/ruoyi-modules/ruoyi-jcbt/src/main/java/org/dromara/jcbt/service/impl/JcbtScholarshipApplicationServiceImpl.java

@@ -527,7 +527,7 @@ public class JcbtScholarshipApplicationServiceImpl implements IJcbtScholarshipAp
                     WHERE cm.class_teacher_id = ?
                       AND cm.deleted = 0
                       AND cm.class_status = '1'
-                    ORDER BY cm.grade DESC, cm.class_name ASC
+                    ORDER BY cm.grade DESC, cm.class_name ASC, cm.create_time DESC
                     """;
 
             // 执行查询
@@ -713,7 +713,7 @@ public class JcbtScholarshipApplicationServiceImpl implements IJcbtScholarshipAp
                       AND sm.deleted = 0
                       AND sm.student_status = '1'
                       AND (cm.deleted IS NULL OR cm.deleted = 0)
-                    ORDER BY sm.student_no ASC
+                    ORDER BY sm.student_no DESC, sm.create_time DESC
                     """;
 
             List<Map<String, Object>> studentList = jdbcTemplate.queryForList(sql, classId);

+ 1 - 1
backend/ruoyi-modules/ruoyi-jcbt/src/main/resources/mapper/jcbt/JcbtPovertyApplicationMapper.xml

@@ -246,7 +246,7 @@
         and s.deleted = 0
         and s.student_status = '1'
         and (c.deleted is null or c.deleted = 0)
-        order by s.student_no asc
+        order by s.student_no desc
     </select>
 
 </mapper>

+ 3 - 0
backend/ruoyi-modules/ruoyi-rs/src/main/resources/mapper/rs/RsApplicationMapper.xml

@@ -47,6 +47,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="contactPhone != null  and contactPhone != ''">and a.contact_phone like concat('%', #{contactPhone}, '%')</if>
             <if test="contactEmail != null  and contactEmail != ''">and a.contact_email like concat('%', #{contactEmail}, '%')</if>
         </where>
+        order by a.create_time desc
     </select>
     
     <select id="selectRsApplicationById" parameterType="Long" resultMap="RsApplicationResult">
@@ -61,11 +62,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     <select id="selectByJobIdAndApplicantId" resultMap="RsApplicationResult">
         <include refid="selectRsApplicationVo"/>
         where a.job_id = #{jobId} and a.applicant_id = #{applicantId}
+        order by a.create_time desc
     </select>
     
     <select id="selectByApplicantId" resultMap="RsApplicationResult">
         <include refid="selectRsApplicationVo"/>
         where a.applicant_id = #{applicantId}
+        order by a.create_time desc
     </select>
     
     <insert id="insertRsApplication" parameterType="org.dromara.rs.domain.RsApplication" useGeneratedKeys="true" keyProperty="applicationId">

+ 1 - 1
backend/ruoyi-modules/ruoyi-rs/src/main/resources/mapper/rs/RsOverseasApplicationAttachmentMapper.xml

@@ -37,7 +37,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <include refid="selectAttachmentVo"/>
         where application_id = #{applicationId}
           and deleted = '0'
-        order by upload_time desc
+        order by upload_time desc, create_time desc
     </select>
 
     <!-- 查询附件详情 -->

+ 3 - 3
backend/ruoyi-modules/ruoyi-rs/src/main/resources/mapper/rs/RsOverseasApplicationMapper.xml

@@ -582,7 +582,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
           AND r.status = '0'
           AND u.deleted = '0'
           AND u.status = '0'
-        ORDER BY u.user_id
+        ORDER BY u.user_name ASC, u.create_time DESC
     </select>
     
     <!-- 🔧 新增:根据用户ID查询其拥有的出国审批权限列表 -->
@@ -597,7 +597,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
           AND m.status = '0'
           AND r.del_flag = '0'
           AND r.status = '0'
-        ORDER BY m.perms
+        ORDER BY m.perms, m.create_time DESC
     </select>
 
     <!-- 🔴 新增:查询待审批申请列表(支持部门过滤) -->
@@ -615,7 +615,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <if test="deptId != null">
             AND u.dept_id = #{deptId}
         </if>
-        ORDER BY a.apply_time DESC
+        ORDER BY a.apply_time DESC, a.create_time DESC
     </select>
     
 </mapper> 

+ 1 - 1
backend/ruoyi-modules/ruoyi-rs/src/main/resources/mapper/rs/RsTrainingApprovalMapper.xml

@@ -197,7 +197,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                 AND app.user_id = #{applicantId}
             </if>
         </where>
-        ORDER BY a.approval_time DESC
+        ORDER BY a.approval_time DESC, a.create_time DESC
     </select>
 
     <!-- 查询带详细信息的审批记录数量(关联申请人和课程信息)- 🆕 支持多级审批过滤 -->

+ 5 - 5
backend/ruoyi-modules/ruoyi-stgl/src/main/resources/mapper/StglMyMapper.xml

@@ -38,7 +38,7 @@
             AND m.deleted = 0
             AND c.deleted = 0
         </where>
-        ORDER BY m.join_time DESC
+        ORDER BY m.join_time DESC, c.create_time DESC
     </select>
 
     <!-- 我的志愿团队查询 -->
@@ -77,7 +77,7 @@
             AND vt.tenant_id = #{tenantId}
             AND m.tenant_id = #{tenantId}
         </where>
-        ORDER BY m.join_time DESC
+        ORDER BY m.join_time DESC, vt.create_time DESC
     </select>
 
     <!-- 我的活动查询(带评分状态) -->
@@ -252,7 +252,7 @@
                 </if>
             </if>
         </where>
-        ORDER BY COALESCE(direct_ar.registration_time, team_ar.registration_time) DESC
+        ORDER BY COALESCE(direct_ar.registration_time, team_ar.registration_time) DESC, a.create_time DESC
     </select>
 
     <!-- 我的报名记录查询(统一查询社团+志愿团队+活动) -->
@@ -351,7 +351,7 @@
                 AND target_name LIKE CONCAT('%', #{name}, '%')
             </if>
         </where>
-        ORDER BY registration_time DESC
+        ORDER BY registration_time DESC, create_time DESC
     </select>
 
     <!-- 统计我的报名记录总数 -->
@@ -478,7 +478,7 @@
                 AND target_name LIKE CONCAT('%', #{name}, '%')
             </if>
         </where>
-        ORDER BY registration_time DESC
+        ORDER BY registration_time DESC, create_time DESC
     </select>
 
 </mapper> 

+ 2 - 2
backend/ruoyi-modules/ruoyi-stgl/src/main/resources/mapper/stgl/StglActivityMapper.xml

@@ -388,7 +388,7 @@
             1 AS relatedType
         FROM stgl_club 
         WHERE deleted = 0 AND status = 0
-        ORDER BY club_name
+        ORDER BY club_name, create_time DESC
     </select>
 
     <select id="selectVolunteerTeamOptions" resultType="org.dromara.stgl.domain.vo.StglActivityVo">
@@ -398,7 +398,7 @@
             2 AS relatedType
         FROM stgl_volunteer_team 
         WHERE deleted = 0 AND status = 0
-        ORDER BY team_name
+        ORDER BY team_name, create_time DESC
     </select>
 
     <insert id="copyActivity">

+ 1 - 1
backend/ruoyi-modules/ruoyi-stgl/src/main/resources/mapper/stgl/StglAuditorMapper.xml

@@ -126,7 +126,7 @@
         <foreach item="userId" collection="userIds" open="(" separator="," close=")">
             #{userId}
         </foreach>
-        order by u.dept_id, u.user_name
+        order by u.user_name asc, u.dept_id
     </select>
 
 </mapper> 

+ 3 - 3
backend/ruoyi-modules/ruoyi-stgl/src/main/resources/mapper/stgl/StglClassMapper.xml

@@ -40,7 +40,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         AND tcr.deleted = 0
         AND tcr.teacher_type = 'class_teacher'
         AND (tcr.end_date IS NULL OR tcr.end_date > NOW())
-        ORDER BY c.grade DESC, c.class_name ASC
+        ORDER BY c.grade DESC, c.class_name ASC, c.create_time DESC
     </select>
 
     <!-- 查询班级学生列表(包含社团、志愿者队伍、活动统计) -->
@@ -270,7 +270,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                 AND s.student_no LIKE CONCAT('%', #{studentNo}, '%')
             </if>
         </where>
-        ORDER BY s.student_no ASC
+        ORDER BY s.student_no DESC, s.create_time DESC
         <if test="offset != null and pageSize != null">
             LIMIT #{pageSize} OFFSET #{offset}
         </if>
@@ -442,7 +442,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             )
         )
         AND a.tenant_id = '000000'
-        ORDER BY a.start_time DESC
+        ORDER BY a.start_time DESC, a.create_time DESC
     </select>
 
 </mapper> 

+ 9 - 9
backend/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysTeacherMapper.java

@@ -46,7 +46,7 @@ public interface SysTeacherMapper extends BaseMapperPlus<SysUser, SysTeacherVo>
             WHERE u.del_flag = '0'
             AND u.account_type = '1'
             ${ew.customSqlSegment}
-            ORDER BY u.create_time DESC
+            ORDER BY u.user_name ASC, u.create_time DESC
             """)
     Page<SysTeacherVo> selectPageTeacherList(@Param("page") Page<SysTeacherVo> page,
             @Param(Constants.WRAPPER) Wrapper<SysUser> wrapper);
@@ -74,7 +74,7 @@ public interface SysTeacherMapper extends BaseMapperPlus<SysUser, SysTeacherVo>
             WHERE u.del_flag = '0'
             AND u.account_type = '1'
             ${ew.customSqlSegment}
-            ORDER BY u.create_time DESC
+            ORDER BY u.user_name ASC, u.create_time DESC
             """)
     List<SysTeacherVo> selectTeacherList(@Param(Constants.WRAPPER) Wrapper<SysUser> wrapper);
 
@@ -105,14 +105,14 @@ public interface SysTeacherMapper extends BaseMapperPlus<SysUser, SysTeacherVo>
                  OR u.user_name LIKE CONCAT('%', #{name}, '%')
                  OR u.phonenumber LIKE CONCAT('%', #{name}, '%'))
             AND u.status = '0'
-            ORDER BY u.create_time DESC
+            ORDER BY u.user_name ASC, u.create_time DESC
             LIMIT #{limit}
             """)
     List<SysTeacherVo> searchTeachersByName(@Param("name") String name, @Param("limit") Integer limit);
 
     /**
      * 根据部门ID获取教师列表(带数据权限控制)
-     * 
+     *
      * 说明:添加数据权限注解后,只会返回用户有权限访问的部门的教师
      *
      * @param deptId 部门ID
@@ -139,13 +139,13 @@ public interface SysTeacherMapper extends BaseMapperPlus<SysUser, SysTeacherVo>
             AND u.account_type = '1'
             AND u.dept_id = #{deptId}
             AND u.status = '0'
-            ORDER BY u.create_time DESC
+            ORDER BY u.user_name ASC, u.create_time DESC
             """)
     List<SysTeacherVo> selectTeachersByDeptId(@Param("deptId") Long deptId);
 
     /**
      * 获取部门树形结构(只包含有教师且用户有权限访问的部门)
-     * 
+     *
      * 说明:添加数据权限注解后,只会返回用户有权限访问的部门
      * 这样可以避免在同行人选择器中显示用户无权访问的部门
      *
@@ -167,7 +167,7 @@ public interface SysTeacherMapper extends BaseMapperPlus<SysUser, SysTeacherVo>
             AND u.del_flag = '0'
             AND u.account_type = '1'
             AND u.status = '0'
-            ORDER BY d.order_num
+            ORDER BY d.order_num, d.create_time DESC
             """)
     List<SysDeptTreeVo> selectDeptTreeWithTeachers();
 
@@ -191,8 +191,8 @@ public interface SysTeacherMapper extends BaseMapperPlus<SysUser, SysTeacherVo>
             <foreach collection="deptIds" item="deptId" open="(" separator="," close=")">
                 #{deptId}
             </foreach>
-            ORDER BY order_num
+            ORDER BY order_num, create_time DESC
             </script>
             """)
     List<SysDeptTreeVo> selectDeptsByIds(@Param("deptIds") List<Long> deptIds);
-}
+}

+ 2 - 1
backend/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/mapper/SysUserMapper.java

@@ -121,7 +121,8 @@ public interface SysUserMapper extends BaseMapperPlus<SysUser, SysUserVo> {
                     AND sm.perms = #{permission}
                     AND (#{tenantId} IS NULL OR #{tenantId} = '' OR su.tenant_id = #{tenantId})
                 ORDER BY
-                    su.user_id
+                    su.user_name ASC,
+                    su.create_time DESC
             """)
     List<SysUser> selectUserListByPermission(@Param("permission") String permission,
             @Param("tenantId") String tenantId);

+ 1 - 0
backend/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysRoleServiceImpl.java

@@ -57,6 +57,7 @@ public class SysRoleServiceImpl implements ISysRoleService, RoleService {
 
     @Override
     public TableDataInfo<SysRoleVo> selectPageRoleList(SysRoleBo role, PageQuery pageQuery) {
+        pageQuery.withDefaultOrder("r.create_time");
         Page<SysRoleVo> page = baseMapper.selectPageRoleList(pageQuery.build(), this.buildQueryWrapper(role));
         return TableDataInfo.build(page);
     }

+ 11 - 6
backend/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysUserServiceImpl.java

@@ -64,12 +64,14 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
 
     @Override
     public TableDataInfo<SysUserVo> selectPageUserList(SysUserBo user, PageQuery pageQuery) {
+        pageQuery.withDefaultOrder("u.user_name");
         Page<SysUserVo> page = baseMapper.selectPageUserList(pageQuery.build(), this.buildQueryWrapper(user));
         return TableDataInfo.build(page);
     }
 
     @Override
     public TableDataInfo<SysUserVo> selectPageUserListByOr(SysUserBo user, PageQuery pageQuery) {
+        pageQuery.withDefaultOrder("u.user_name");
         Page<SysUserVo> page = baseMapper.selectPageUserList(pageQuery.build(), this.buildQueryWrapperByOr(user));
         return TableDataInfo.build(page);
     }
@@ -169,7 +171,7 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
         }
 
         // 排序
-        wrapper.orderByAsc("u.user_id");
+        wrapper.orderByAsc("u.user_name");
 
         return wrapper;
     }
@@ -203,7 +205,7 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
                     List<Long> ids = StreamUtils.toList(deptList, SysDept::getDeptId);
                     ids.add(user.getDeptId());
                     w.in("u.dept_id", ids);
-                }).orderByAsc("u.user_id");
+                }).orderByAsc("u.user_name");
         if (StringUtils.isNotBlank(user.getExcludeUserIds())) {
             wrapper.notIn("u.user_id", StringUtils.splitTo(user.getExcludeUserIds(), Convert::toLong));
         }
@@ -224,7 +226,8 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
                 .like(StringUtils.isNotBlank(user.getUserName()), "u.user_name", user.getUserName())
                 .eq(StringUtils.isNotBlank(user.getStatus()), "u.status", user.getStatus())
                 .like(StringUtils.isNotBlank(user.getPhonenumber()), "u.phonenumber", user.getPhonenumber())
-                .orderByAsc("u.user_id");
+                .orderByAsc("u.user_name");
+        pageQuery.withDefaultOrder("u.user_name");
         Page<SysUserVo> page = baseMapper.selectAllocatedList(pageQuery.build(), wrapper);
         return TableDataInfo.build(page);
     }
@@ -244,7 +247,8 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
                 .notIn(CollUtil.isNotEmpty(userIds), "u.user_id", userIds)
                 .like(StringUtils.isNotBlank(user.getUserName()), "u.user_name", user.getUserName())
                 .like(StringUtils.isNotBlank(user.getPhonenumber()), "u.phonenumber", user.getPhonenumber())
-                .orderByAsc("u.user_id");
+                .orderByAsc("u.user_name");
+        pageQuery.withDefaultOrder("u.user_name");
         Page<SysUserVo> page = baseMapper.selectUnallocatedList(pageQuery.build(), wrapper);
         return TableDataInfo.build(page);
     }
@@ -300,7 +304,8 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
                 .select(SysUser::getUserId, SysUser::getUserName, SysUser::getNickName, SysUser::getPhonenumber)
                 .eq(SysUser::getStatus, SystemConstants.NORMAL)
                 .eq(ObjectUtil.isNotNull(deptId), SysUser::getDeptId, deptId)
-                .in(CollUtil.isNotEmpty(userIds), SysUser::getUserId, userIds));
+                .in(CollUtil.isNotEmpty(userIds), SysUser::getUserId, userIds)
+                .orderByAsc(SysUser::getUserName));
     }
 
     /**
@@ -719,7 +724,7 @@ public class SysUserServiceImpl implements ISysUserService, UserService {
     public List<SysUserVo> selectUserListByDept(Long deptId) {
         LambdaQueryWrapper<SysUser> lqw = Wrappers.lambdaQuery();
         lqw.eq(SysUser::getDeptId, deptId);
-        lqw.orderByAsc(SysUser::getUserId);
+        lqw.orderByAsc(SysUser::getUserName);
         return baseMapper.selectVoList(lqw);
     }
 

+ 19 - 3
backend/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysDeptMapper.xml

@@ -16,6 +16,14 @@
             *
         </if>
         from sys_dept ${ew.getCustomSqlSegment}
+        <choose>
+            <when test="ew != null and @org.dromara.common.core.utils.StringUtils@containsAnyIgnoreCase(ew.getCustomSqlSegment, 'order by')">
+                , create_time desc
+            </when>
+            <otherwise>
+                order by create_time desc
+            </otherwise>
+        </choose>
     </select>
 
     <select id="selectPageDeptList" resultMap="SysDeptResult">
@@ -27,6 +35,14 @@
             *
         </if>
         from sys_dept ${ew.getCustomSqlSegment}
+        <choose>
+            <when test="ew != null and @org.dromara.common.core.utils.StringUtils@containsAnyIgnoreCase(ew.getCustomSqlSegment, 'order by')">
+                , create_time desc
+            </when>
+            <otherwise>
+                order by create_time desc
+            </otherwise>
+        </choose>
     </select>
 
     <select id="countDeptById" resultType="Long">
@@ -38,10 +54,10 @@
         from sys_dept d
             left join sys_role_dept rd on d.dept_id = rd.dept_id
         where rd.role_id = #{roleId}
-            <if test="deptCheckStrictly">
+        <if test="deptCheckStrictly">
                 and d.dept_id not in (select d.parent_id from sys_dept d inner join sys_role_dept rd on d.dept_id = rd.dept_id and rd.role_id = #{roleId})
-            </if>
-        order by d.parent_id, d.order_num
+        </if>
+        order by d.parent_id, d.order_num, d.create_time desc
     </select>
 
 </mapper>

+ 10 - 2
backend/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysMenuMapper.xml

@@ -14,6 +14,14 @@
             left join sys_role_menu rm on m.menu_id = rm.menu_id
             left join sys_role r on rm.role_id = r.role_id
         ${ew.getCustomSqlSegment}
+        <choose>
+            <when test="ew != null and @org.dromara.common.core.utils.StringUtils@containsAnyIgnoreCase(ew.getCustomSqlSegment, 'order by')">
+                , m.create_time desc
+            </when>
+            <otherwise>
+                order by m.create_time desc
+            </otherwise>
+        </choose>
     </select>
 
     <select id="selectMenuTreeByUserId" parameterType="Long" resultMap="SysMenuResult">
@@ -37,7 +45,7 @@
                  left join sys_role r on rm.role_id = r.role_id and r.status = '0'
         where m.menu_type in ('M', 'C')
           and r.role_id in (select role_id from sys_user_role where user_id = #{userId})
-        order by m.parent_id, m.order_num
+        order by m.parent_id, m.order_num, m.create_time desc
     </select>
 
     <select id="selectMenuListByRoleId" resultType="Long">
@@ -49,7 +57,7 @@
             and m.menu_id not in (select m.parent_id from sys_menu m inner join sys_role_menu rm on m.menu_id =
             rm.menu_id and rm.role_id = #{roleId})
         </if>
-        order by m.parent_id, m.order_num
+        order by m.parent_id, m.order_num, m.create_time desc
     </select>
 
     <select id="selectMenuPermsByUserId" parameterType="Long" resultType="String">

+ 8 - 0
backend/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysPostMapper.xml

@@ -16,6 +16,14 @@
             *
         </if>
         from sys_post ${ew.getCustomSqlSegment}
+        <choose>
+            <when test="ew != null and @org.dromara.common.core.utils.StringUtils@containsAnyIgnoreCase(ew.getCustomSqlSegment, 'order by')">
+                , create_time desc
+            </when>
+            <otherwise>
+                order by create_time desc
+            </otherwise>
+        </choose>
     </select>
 
     <select id="selectPostsByUserId" parameterType="Long" resultMap="SysPostResult">

+ 16 - 0
backend/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysRoleMapper.xml

@@ -28,11 +28,27 @@
     <select id="selectPageRoleList" resultMap="SysRoleResult">
         <include refid="selectRoleVo"/>
         ${ew.getCustomSqlSegment}
+        <choose>
+            <when test="ew != null and @org.dromara.common.core.utils.StringUtils@containsAnyIgnoreCase(ew.getCustomSqlSegment, 'order by')">
+                , r.create_time desc
+            </when>
+            <otherwise>
+                order by r.create_time desc
+            </otherwise>
+        </choose>
     </select>
 
     <select id="selectRoleList" resultMap="SysRoleResult">
         <include refid="selectRoleVo"/>
         ${ew.getCustomSqlSegment}
+        <choose>
+            <when test="ew != null and @org.dromara.common.core.utils.StringUtils@containsAnyIgnoreCase(ew.getCustomSqlSegment, 'order by')">
+                , r.create_time desc
+            </when>
+            <otherwise>
+                order by r.create_time desc
+            </otherwise>
+        </choose>
     </select>
 
     <select id="selectRolePermissionByUserId" parameterType="Long" resultMap="SysRoleResult">

+ 40 - 0
backend/ruoyi-modules/ruoyi-system/src/main/resources/mapper/system/SysUserMapper.xml

@@ -22,6 +22,14 @@
         </if>
         from sys_user u
         ${ew.getCustomSqlSegment}
+        <choose>
+            <when test="ew != null and @org.dromara.common.core.utils.StringUtils@containsAnyIgnoreCase(ew.getCustomSqlSegment, 'order by')">
+                , u.user_name asc, u.create_time desc
+            </when>
+            <otherwise>
+                order by u.user_name asc, u.create_time desc
+            </otherwise>
+        </choose>
     </select>
 
     <select id="selectUserList" resultMap="SysUserResult">
@@ -35,6 +43,14 @@
         </if>
         from sys_user u
         ${ew.getCustomSqlSegment}
+        <choose>
+            <when test="ew != null and @org.dromara.common.core.utils.StringUtils@containsAnyIgnoreCase(ew.getCustomSqlSegment, 'order by')">
+                , u.user_name asc, u.create_time desc
+            </when>
+            <otherwise>
+                order by u.user_name asc, u.create_time desc
+            </otherwise>
+        </choose>
     </select>
 
     <select id="selectUserExportList" resultMap="SysUserExportResult">
@@ -45,6 +61,14 @@
             left join sys_dept d on u.dept_id = d.dept_id
             left join sys_user u1 on u1.user_id = d.leader
         ${ew.getCustomSqlSegment}
+        <choose>
+            <when test="ew != null and @org.dromara.common.core.utils.StringUtils@containsAnyIgnoreCase(ew.getCustomSqlSegment, 'order by')">
+                , u.user_name asc, u.create_time desc
+            </when>
+            <otherwise>
+                order by u.user_name asc, u.create_time desc
+            </otherwise>
+        </choose>
     </select>
 
     <select id="selectAllocatedList" resultMap="SysUserResult">
@@ -54,6 +78,14 @@
              left join sys_user_role sur on u.user_id = sur.user_id
              left join sys_role r on r.role_id = sur.role_id
         ${ew.getCustomSqlSegment}
+        <choose>
+            <when test="ew != null and @org.dromara.common.core.utils.StringUtils@containsAnyIgnoreCase(ew.getCustomSqlSegment, 'order by')">
+                , u.user_name asc, u.create_time desc
+            </when>
+            <otherwise>
+                order by u.user_name asc, u.create_time desc
+            </otherwise>
+        </choose>
     </select>
 
     <select id="selectUnallocatedList" resultMap="SysUserResult">
@@ -63,6 +95,14 @@
              left join sys_user_role sur on u.user_id = sur.user_id
              left join sys_role r on r.role_id = sur.role_id
         ${ew.getCustomSqlSegment}
+        <choose>
+            <when test="ew != null and @org.dromara.common.core.utils.StringUtils@containsAnyIgnoreCase(ew.getCustomSqlSegment, 'order by')">
+                , u.user_name asc, u.create_time desc
+            </when>
+            <otherwise>
+                order by u.user_name asc, u.create_time desc
+            </otherwise>
+        </choose>
     </select>
 
     <select id="countUserById" resultType="Long">

+ 3 - 1
backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwInstanceServiceImpl.java

@@ -84,6 +84,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService {
     public TableDataInfo<FlowInstanceVo> selectRunningInstanceList(FlowInstanceBo flowInstanceBo, PageQuery pageQuery) {
         QueryWrapper<FlowInstanceBo> queryWrapper = buildQueryWrapper(flowInstanceBo);
         queryWrapper.in("fi.flow_status", BusinessStatusEnum.runningStatus());
+        pageQuery.withDefaultOrder("fi.create_time");
         Page<FlowInstanceVo> page = flwInstanceMapper.selectInstanceList(pageQuery.build(), queryWrapper);
         return TableDataInfo.build(page);
     }
@@ -98,6 +99,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService {
     public TableDataInfo<FlowInstanceVo> selectFinishInstanceList(FlowInstanceBo flowInstanceBo, PageQuery pageQuery) {
         QueryWrapper<FlowInstanceBo> queryWrapper = buildQueryWrapper(flowInstanceBo);
         queryWrapper.in("fi.flow_status", BusinessStatusEnum.finishStatus());
+        pageQuery.withDefaultOrder("fi.create_time");
         Page<FlowInstanceVo> page = flwInstanceMapper.selectInstanceList(pageQuery.build(), queryWrapper);
         return TableDataInfo.build(page);
     }
@@ -146,7 +148,6 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService {
         queryWrapper.in(CollUtil.isNotEmpty(flowInstanceBo.getCreateByIds()), "fi.create_by",
                 flowInstanceBo.getCreateByIds());
         queryWrapper.eq("fi.del_flag", "0");
-        queryWrapper.orderByDesc("fi.create_time");
         return queryWrapper;
     }
 
@@ -275,6 +276,7 @@ public class FlwInstanceServiceImpl implements IFlwInstanceService {
     public TableDataInfo<FlowInstanceVo> selectCurrentInstanceList(FlowInstanceBo instanceBo, PageQuery pageQuery) {
         QueryWrapper<FlowInstanceBo> queryWrapper = buildQueryWrapper(instanceBo);
         queryWrapper.eq("fi.create_by", LoginHelper.getUserIdStr());
+        pageQuery.withDefaultOrder("fi.create_time");
         Page<FlowInstanceVo> page = flwInstanceMapper.selectInstanceList(pageQuery.build(), queryWrapper);
         return TableDataInfo.build(page);
     }

+ 5 - 2
backend/ruoyi-modules/ruoyi-workflow/src/main/java/org/dromara/workflow/service/impl/FlwTaskServiceImpl.java

@@ -301,7 +301,8 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
         QueryWrapper<FlowTaskBo> queryWrapper = buildQueryWrapper(flowTaskBo);
         queryWrapper.eq("t.node_type", NodeType.BETWEEN.getKey());
         queryWrapper.in("t.approver", LoginHelper.getUserIdStr());
-        queryWrapper.orderByDesc("t.create_time").orderByDesc("t.update_time");
+        queryWrapper.orderByDesc("t.update_time");
+        pageQuery.withDefaultOrder("t.create_time");
         Page<FlowHisTaskVo> page = flwTaskMapper.getListFinishTask(pageQuery.build(), queryWrapper);
         return TableDataInfo.build(page);
     }
@@ -321,6 +322,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
     }
 
     private Page<FlowTaskVo> getFlowTaskVoPage(PageQuery pageQuery, QueryWrapper<FlowTaskBo> queryWrapper) {
+        pageQuery.withDefaultOrder("t.create_time");
         Page<FlowTaskVo> page = flwTaskMapper.getListRunTask(pageQuery.build(), queryWrapper);
         List<FlowTaskVo> records = page.getRecords();
         if (CollUtil.isNotEmpty(records)) {
@@ -346,6 +348,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
     @Override
     public TableDataInfo<FlowHisTaskVo> pageByAllTaskFinish(FlowTaskBo flowTaskBo, PageQuery pageQuery) {
         QueryWrapper<FlowTaskBo> queryWrapper = buildQueryWrapper(flowTaskBo);
+        pageQuery.withDefaultOrder("t.create_time");
         Page<FlowHisTaskVo> page = flwTaskMapper.getListFinishTask(pageQuery.build(), queryWrapper);
         return TableDataInfo.build(page);
     }
@@ -360,6 +363,7 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
     public TableDataInfo<FlowTaskVo> pageByTaskCopy(FlowTaskBo flowTaskBo, PageQuery pageQuery) {
         QueryWrapper<FlowTaskBo> queryWrapper = buildQueryWrapper(flowTaskBo);
         queryWrapper.in("t.processed_by", LoginHelper.getUserIdStr());
+        pageQuery.withDefaultOrder("t.create_time");
         Page<FlowTaskVo> page = flwTaskMapper.getTaskCopyByPage(pageQuery.build(), queryWrapper);
         return TableDataInfo.build(page);
     }
@@ -375,7 +379,6 @@ public class FlwTaskServiceImpl implements IFlwTaskService {
                     .selectCategoryIdsByParentId(Convert.toLong(flowTaskBo.getCategory()));
             wrapper.in("t.category", StreamUtils.toList(categoryIds, Convert::toStr));
         }
-        wrapper.orderByDesc("t.create_time");
         return wrapper;
     }
 

+ 1 - 1
backend/ruoyi-modules/ruoyi-workflow/src/main/resources/mapper/workflow/FlwHisTaskExtMapper.xml

@@ -59,7 +59,7 @@
         WHERE instance_id = #{instanceId}
           AND node_type = #{nodeType}
           AND del_flag = '0'
-        ORDER BY create_time DESC, update_time DESC
+        ORDER BY update_time DESC, create_time DESC
     </select>
 
 </mapper>

+ 4 - 4
backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgDormBedMapper.java

@@ -69,7 +69,7 @@ public interface XgDormBedMapper extends BaseMapperPlus<XgDormBed, XgDormBedVo>
             LEFT JOIN xg_student_msg s ON bs.student_id = s.id AND s.deleted = 0
             WHERE b.room_id = #{roomId}
             AND b.deleted = '0'
-            ORDER BY b.bed_code
+            ORDER BY s.student_no DESC, b.bed_code, b.create_time DESC
             """)
     List<XgDormBedDetailVo> selectBedDetailsByRoomId(@Param("roomId") Long roomId);
 
@@ -125,7 +125,7 @@ public interface XgDormBedMapper extends BaseMapperPlus<XgDormBed, XgDormBedVo>
             LEFT JOIN xg_student_msg s ON bs.student_id = s.id AND s.deleted = 0
             WHERE r.building_id = #{buildingId}
             AND b.deleted = '0'
-            ORDER BY r.room_name, b.bed_code
+            ORDER BY s.student_no DESC, r.room_name, b.bed_code, b.create_time DESC
             """)
     List<XgDormBedDetailVo> selectBedDetailsByBuildingId(@Param("buildingId") Long buildingId);
 
@@ -183,7 +183,7 @@ public interface XgDormBedMapper extends BaseMapperPlus<XgDormBed, XgDormBedVo>
             WHERE b.room_id = #{roomId}
             AND bs.college_id = #{collegeId}
             AND b.deleted = '0'
-            ORDER BY b.bed_code
+            ORDER BY s.student_no DESC, b.bed_code, b.create_time DESC
             """)
     List<XgDormBedDetailVo> selectBedDetailsByRoomIdAndCollegeId(@Param("roomId") Long roomId,
             @Param("collegeId") Long collegeId);
@@ -242,7 +242,7 @@ public interface XgDormBedMapper extends BaseMapperPlus<XgDormBed, XgDormBedVo>
             WHERE b.room_id = #{roomId}
             AND bs.class_id = #{classId}
             AND b.deleted = '0'
-            ORDER BY b.bed_code
+            ORDER BY s.student_no DESC, b.bed_code, b.create_time DESC
             """)
     List<XgDormBedDetailVo> selectBedDetailsByRoomIdAndClassId(@Param("roomId") Long roomId,
             @Param("classId") Long classId);

+ 6 - 3
backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgDormBedStudentMapper.java

@@ -76,11 +76,13 @@ public interface XgDormBedStudentMapper extends BaseMapperPlus<XgDormBedStudent,
             AND s.student_status = '1'
 
             ORDER BY
+                s.student_no DESC,
                 campus.campus_name,
                 area.area_name,
                 building.building_code,
                 r.room_code,
-                b.bed_code
+                b.bed_code,
+                bs.create_time DESC
             """)
     List<Map<String, Object>> selectClassOccupiedBedDetails(@Param("classId") Long classId);
 
@@ -137,7 +139,8 @@ public interface XgDormBedStudentMapper extends BaseMapperPlus<XgDormBedStudent,
                 area.area_name,
                 building.building_code,
                 r.room_code,
-                b.bed_code
+                b.bed_code,
+                bs.create_time DESC
             """)
     List<Map<String, Object>> selectClassUnoccupiedBedDetails(@Param("classId") Long classId);
 
@@ -184,7 +187,7 @@ public interface XgDormBedStudentMapper extends BaseMapperPlus<XgDormBedStudent,
             AND bs.deleted = '0'
             AND s.student_status = '1'
 
-            ORDER BY b.bed_code, s.student_no
+            ORDER BY s.student_no DESC, b.bed_code, bs.create_time DESC
             """)
     List<Map<String, Object>> selectRoomStudents(@Param("roomId") Long roomId);
 

+ 34 - 11
backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/mapper/XgStudentMapper.java

@@ -20,17 +20,40 @@ public interface XgStudentMapper extends BaseMapperPlus<XgStudentMsg, XgStudentV
      * 查询树形结构所需的最少数据
      * 只查询构建树形结构必需的字段,避免全表查询,提升性能
      */
-    @Select("SELECT DISTINCT " +
-            "college_id, college_name, " +
-            "major_id, major_name, " +
-            "class_id, class_name " +
-            "FROM xg_student_msg " +
-            "WHERE deleted = 0 " +
-            "AND student_status = '1' " +
-            "AND college_id IS NOT NULL " +
-            "AND major_id IS NOT NULL " +
-            "AND class_id IS NOT NULL " +
-            "ORDER BY college_name, major_name, class_name")
+    @Select("""
+            SELECT
+                t.college_id,
+                t.college_name,
+                t.major_id,
+                t.major_name,
+                t.class_id,
+                t.class_name
+            FROM (
+                SELECT
+                    college_id,
+                    college_name,
+                    major_id,
+                    major_name,
+                    class_id,
+                    class_name,
+                    MAX(create_time) AS latest_create_time
+                FROM xg_student_msg
+                WHERE deleted = 0
+                  AND student_status = '1'
+                  AND college_id IS NOT NULL
+                  AND major_id IS NOT NULL
+                  AND class_id IS NOT NULL
+                GROUP BY
+                    college_id,
+                    college_name,
+                    major_id,
+                    major_name,
+                    class_id,
+                    class_name
+            ) t
+            ORDER BY
+                t.latest_create_time DESC
+            """)
     List<Map<String, Object>> selectTreeNodes();
 
 } 

+ 1 - 1
backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgDormBedStudentServiceImpl.java

@@ -1473,7 +1473,7 @@ public class XgDormBedStudentServiceImpl implements IXgDormBedStudentService {
                     .eq(XgStudentMsg::getDeleted, 0L) // 未删除
                     .eq(XgStudentMsg::getIsBoarder, "1") // 需要住校
                     .eq(XgStudentMsg::getClassId, targetClassId) // 指定班级
-                    .orderByAsc(XgStudentMsg::getStudentNo); // 按学号排序
+                    .orderByDesc(XgStudentMsg::getStudentNo); // 按学号倒序排序
 
             List<XgStudentMsg> boardingStudents = xgStudentMsgMapper.selectList(studentQuery);
 

+ 1 - 1
backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgDormManagerServiceImpl.java

@@ -99,7 +99,7 @@ public class XgDormManagerServiceImpl implements IXgDormManagerService {
             params.add("%" + name + "%");
         }
 
-        sql.append("ORDER BY u.nick_name");
+        sql.append("ORDER BY u.user_name ASC, u.nick_name");
 
         try {
             if (params.isEmpty()) {

+ 1 - 1
backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgStudentManagerServiceImpl.java

@@ -203,7 +203,7 @@ public class XgStudentManagerServiceImpl implements IXgStudentManagerService {
             sql.append(" AND s.phonenumber LIKE ?");
             params.add("%" + phone + "%");
         }
-        sql.append(" ORDER BY c.class_status ASC, c.class_name ASC");
+        sql.append(" ORDER BY c.class_status ASC, c.class_name ASC, c.create_time DESC");
         return jdbcTemplate.query(sql.toString(), params.toArray(), (rs, rowNum) -> {
             ClassTeacherInfoVo vo = new ClassTeacherInfoVo();
             vo.setName(rs.getString("name"));

+ 2 - 2
backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgStudentManagerSourceServiceImpl.java

@@ -204,7 +204,7 @@ public class XgStudentManagerSourceServiceImpl implements IXgStudentManagerSourc
         if (isSchoolManager) {
             // 全校学生管理员:查询id=101下所有部门数据,所有节点都可点击
             String sql = "SELECT dept_id, dept_name, parent_id, dept_category, order_num FROM sys_dept " +
-                    "WHERE (dept_id = 101  OR ancestors LIKE '%,101' OR ancestors LIKE '%,101,%') AND status = '0' AND del_flag = '0' ORDER BY order_num";
+                    "WHERE (dept_id = 101  OR ancestors LIKE '%,101' OR ancestors LIKE '%,101,%') AND status = '0' AND del_flag = '0' ORDER BY order_num, create_time DESC";
             List<Map<String, Object>> deptMaps = jdbcTemplate.queryForList(sql);
 
             // 构建部门树
@@ -310,7 +310,7 @@ public class XgStudentManagerSourceServiceImpl implements IXgStudentManagerSourc
         // 查询所有部门信息
         String inSql = finalDeptIds.stream().map(String::valueOf).collect(Collectors.joining(","));
         String sql = "SELECT dept_id, dept_name, parent_id, dept_category, order_num FROM sys_dept " +
-                "WHERE dept_id IN (" + inSql + ") AND status = '0' AND del_flag = '0' ORDER BY order_num";
+                "WHERE dept_id IN (" + inSql + ") AND status = '0' AND del_flag = '0' ORDER BY order_num, create_time DESC";
         List<Map<String, Object>> deptMaps = jdbcTemplate.queryForList(sql);
 
         // 构建部门树

+ 1 - 1
backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgStudentMsgServiceImpl.java

@@ -366,7 +366,7 @@ public class XgStudentMsgServiceImpl implements IXgStudentMsgService {
     private LambdaQueryWrapper<XgStudentMsg> buildQueryWrapper(XgStudentMsgBo bo) {
         Map<String, Object> params = bo.getParams();
         LambdaQueryWrapper<XgStudentMsg> lqw = Wrappers.lambdaQuery();
-        lqw.orderByAsc(XgStudentMsg::getId);
+        lqw.orderByDesc(XgStudentMsg::getStudentNo).orderByDesc(XgStudentMsg::getId);
         lqw.eq(bo.getDeleted() != null, XgStudentMsg::getDeleted, bo.getDeleted());
         lqw.eq(StringUtils.isNotBlank(bo.getStudentNo()), XgStudentMsg::getStudentNo, bo.getStudentNo());
         lqw.eq(StringUtils.isNotBlank(bo.getIdCard()), XgStudentMsg::getIdCard, bo.getIdCard());

+ 3 - 1
backend/ruoyi-modules/ruoyi-xg/src/main/java/org/dromara/xg/service/impl/XgStudentServiceImpl.java

@@ -67,6 +67,7 @@ public class XgStudentServiceImpl implements IXgStudentService {
         LambdaQueryWrapper<XgStudentMsg> lqw = Wrappers.lambdaQuery();
         lqw.like(StringUtils.isNotBlank(name), XgStudentMsg::getName, name);
         lqw.eq(XgStudentMsg::getStudentStatus, "1"); // 只查询在籍学生
+        lqw.orderByDesc(XgStudentMsg::getStudentNo);
         lqw.last("LIMIT " + (limit != null ? limit : 10));
         return baseMapper.selectVoList(lqw);
     }
@@ -149,7 +150,7 @@ public class XgStudentServiceImpl implements IXgStudentService {
         LambdaQueryWrapper<XgStudentMsg> lqw = Wrappers.lambdaQuery();
         lqw.eq(XgStudentMsg::getClassId, classId);
         lqw.eq(XgStudentMsg::getStudentStatus, "1"); // 只查询在籍学生
-        lqw.orderByAsc(XgStudentMsg::getStudentNo); // 按学号排序
+        lqw.orderByDesc(XgStudentMsg::getStudentNo); // 按学号倒序排序
         return baseMapper.selectVoList(lqw);
     }
 
@@ -209,6 +210,7 @@ public class XgStudentServiceImpl implements IXgStudentService {
         lqw.eq(StringUtils.isNotBlank(bo.getStudentStatus()), XgStudentMsg::getStudentStatus, bo.getStudentStatus());
         lqw.eq(bo.getEnrollmentYear() != null, XgStudentMsg::getEnrollmentYear, bo.getEnrollmentYear());
         lqw.eq(bo.getEnrollmentDate() != null, XgStudentMsg::getEnrollmentDate, bo.getEnrollmentDate());
+        lqw.orderByDesc(XgStudentMsg::getStudentNo).orderByDesc(XgStudentMsg::getId);
         return lqw;
     }
 } 

+ 1 - 1
backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/dormHygieneCheck/XgDormHygieneCheckMapper.xml

@@ -115,7 +115,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                 AND dhc.check_date &lt;= #{params.endTime}
             </if>
         </where>
-        ORDER BY dhc.check_date DESC, dhc.id ASC, dhss.student_no ASC
+        ORDER BY dhss.student_no DESC, dhc.check_date DESC, dhc.id ASC, dhc.create_time DESC
     </select>
 
 </mapper>

+ 1 - 1
backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/dormViolation/XgDormViolationMapper.xml

@@ -76,7 +76,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             AND (s.student_no LIKE CONCAT('%', #{bo.keyword}, '%')
             OR s.name LIKE CONCAT('%', #{bo.keyword}, '%'))
         </if>
-        ORDER BY s.student_no ASC
+        ORDER BY s.student_no DESC, s.create_time DESC
     </select>
 
     <!-- 根据学生ID获取学生详细信息 -->

+ 1 - 1
backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/holidayStay/XgHolidayStayMapper.xml

@@ -76,7 +76,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             AND (s.student_no LIKE CONCAT('%', #{bo.keyword}, '%')
             OR s.name LIKE CONCAT('%', #{bo.keyword}, '%'))
         </if>
-        ORDER BY s.student_no ASC
+        ORDER BY s.student_no DESC, s.create_time DESC
     </select>
 
 </mapper>

+ 6 - 6
backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/studentMsg/XgStudentMsgMapper.xml

@@ -66,7 +66,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                 </foreach>
             </if>
         </where>
-        ORDER BY create_time DESC
+        ORDER BY student_no DESC, create_time DESC
     </select>
 
 
@@ -100,7 +100,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                 </foreach>
             </if>
         </where>
-        ORDER BY create_time DESC
+        ORDER BY student_no DESC, create_time DESC
     </select>
 
     <!-- 根据班级ID和姓名查询学生信息列表 -->
@@ -134,7 +134,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                 AND name LIKE CONCAT('%', #{name}, '%')
             </if>
         </where>
-        ORDER BY create_time DESC
+        ORDER BY student_no DESC, create_time DESC
     </select>
 
     <!-- 根据学生ID查询班主任ID -->
@@ -205,7 +205,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
           AND sm.major_id IS NOT NULL
           AND sm.class_id IS NOT NULL
         GROUP BY c.grade, sm.college_id, sm.college_name, sm.major_id, sm.major_name, sm.class_id, sm.class_name
-        ORDER BY c.grade DESC, sm.college_name, sm.major_name, sm.class_name
+        ORDER BY c.grade DESC, sm.college_name, sm.major_name, sm.class_name, sm.create_time DESC
     </select>
 
     <!-- 查询二级学院下的学院、专业、班级学生统计信息(按床位分配统计) -->
@@ -255,7 +255,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
           AND sm.major_id IS NOT NULL
           AND sm.class_id IS NOT NULL
         GROUP BY c.grade, sm.college_id, sm.college_name, sm.major_id, sm.major_name, sm.class_id, sm.class_name
-        ORDER BY c.grade DESC, sm.college_name, sm.major_name, sm.class_name
+        ORDER BY c.grade DESC, sm.college_name, sm.major_name, sm.class_name, sm.create_time DESC
     </select>
 
     <!-- 查询二级学院下的学院床位分配统计信息(基于学生表统计需求,基于床位分配表统计已分配) -->
@@ -301,7 +301,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
           AND (d.parent_id = #{secondaryCollegeId} OR d.dept_id = #{secondaryCollegeId} OR FIND_IN_SET(#{secondaryCollegeId}, d.ancestors))
           AND sm.college_id IS NOT NULL
         GROUP BY sm.college_id, sm.college_name
-        ORDER BY sm.college_name
+        ORDER BY sm.college_name, sm.create_time DESC
     </select>
 
 </mapper>

+ 3 - 3
backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/studentMsgBatch/XgStudentMsgBatchMapper.xml

@@ -24,14 +24,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         inner join sys_user s2 on xsmb.update_by = s2.user_id
         WHERE batch_id = #{batchId}
         and xsmb.id = #{userId}
-        ORDER BY xsmb.create_time asc
+        ORDER BY xsmb.create_time DESC
     </select>
 
     <!-- 查询最后一次提交的信息(delete = 0的数据) -->
     <select id="selectCurrentByBatchId" parameterType="java.lang.Long" resultType="org.dromara.xg.domain.vo.XgStudentMsgBatchVo">
         SELECT * FROM xg_student_msg_batch
         WHERE batch_id = #{batchId} AND deleted = 0 and id = #{userId}
-        ORDER BY create_time asc
+        ORDER BY create_time DESC
     </select>
 
     <!-- 逻辑删除当前登录人的历史数据(不更新update_by和update_time) -->
@@ -183,7 +183,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <if test="infoStatus != null and infoStatus != ''">
             AND xsmb.info_status = #{infoStatus}
         </if>
-        ORDER BY xsmb.create_time DESC
+        ORDER BY xsmb.student_no DESC, xsmb.create_time DESC
     </select>
 
     <!-- 驳回学生信息提交 -->

+ 9 - 9
backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/xg/XgStudentStatisticsMapper.xml

@@ -58,7 +58,7 @@
             GROUP BY dr.college_id
         ) teaching_violation_stats ON d.dept_id = teaching_violation_stats.college_id
         WHERE d.parent_id = 101 AND d.del_flag = '0'
-        ORDER BY d.order_num ASC, d.dept_name ASC
+        ORDER BY d.order_num ASC, d.dept_name ASC, d.create_time DESC
     </select>
 
     <!-- 按学院维度统计明细数据 -->
@@ -118,7 +118,7 @@
             GROUP BY dr.college_id
         ) teaching_violation_stats ON d.dept_id = teaching_violation_stats.college_id
         WHERE d.parent_id = 101 AND d.del_flag = '0'
-        ORDER BY d.order_num ASC, d.dept_name ASC
+        ORDER BY d.order_num ASC, d.dept_name ASC, d.create_time DESC
     </select>
 
     <!-- 按专业维度统计图表数据 -->
@@ -178,7 +178,7 @@
             GROUP BY dr.major_id
         ) teaching_violation_stats ON d.dept_id = teaching_violation_stats.major_id
         WHERE d.parent_id = #{bo.collegeId} AND d.dept_category LIKE 'zy-%' AND d.del_flag = '0'
-        ORDER BY d.order_num ASC, d.dept_name ASC
+        ORDER BY d.order_num ASC, d.dept_name ASC, d.create_time DESC
     </select>
 
     <!-- 按专业维度统计明细数据 -->
@@ -242,7 +242,7 @@
             GROUP BY dr.major_id
         ) teaching_violation_stats ON d.dept_id = teaching_violation_stats.major_id
         WHERE d.parent_id = #{bo.collegeId} AND d.dept_category LIKE 'zy-%' AND d.del_flag = '0'
-        ORDER BY d.order_num ASC, d.dept_name ASC
+        ORDER BY d.order_num ASC, d.dept_name ASC, d.create_time DESC
     </select>
 
     <!-- 按班级维度统计图表数据 -->
@@ -303,7 +303,7 @@
             ) as teachingViolationDeduction
         FROM xg_class_msg c
         WHERE c.college_id = #{bo.collegeId} AND c.major_id = #{bo.majorId} AND c.deleted = 0
-        ORDER BY c.class_name ASC
+        ORDER BY c.class_name ASC, c.create_time DESC
     </select>
 
     <!-- 按班级维度统计明细数据 -->
@@ -458,7 +458,7 @@
                      )) as totalDeduction
                 FROM xg_class_msg c
                 WHERE c.college_id = #{bo.collegeId} AND c.major_id = #{bo.majorId} AND c.deleted = 0
-                ORDER BY c.class_name ASC
+                ORDER BY c.class_name ASC, c.create_time DESC
             </otherwise>
         </choose>
     </select>
@@ -472,7 +472,7 @@
             order_num as sort
         FROM sys_dept
         WHERE parent_id = 101 AND del_flag = '0'
-        ORDER BY order_num ASC, dept_name ASC
+        ORDER BY order_num ASC, dept_name ASC, create_time DESC
     </select>
 
     <!-- 根据学院ID获取专业列表 -->
@@ -486,7 +486,7 @@
         WHERE parent_id = #{collegeId}
           AND dept_category LIKE 'zy-%'
           AND del_flag = '0'
-        ORDER BY order_num ASC, dept_name ASC
+        ORDER BY order_num ASC, dept_name ASC, create_time DESC
     </select>
 
     <!-- 根据专业ID获取班级列表 -->
@@ -498,7 +498,7 @@
             0 as sort
         FROM xg_class_msg
         WHERE major_id = #{majorId} AND deleted = 0
-        ORDER BY class_name ASC
+        ORDER BY class_name ASC, create_time DESC
     </select>
 
 </mapper>

+ 2 - 2
backend/ruoyi-modules/ruoyi-xg/src/main/resources/mapper/xg/XgSysUserMapper.xml

@@ -23,7 +23,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         select user_id, user_name, nick_name, phonenumber, account_type
         from sys_user
         where status = '0' and del_flag = '0'
-        order by create_time desc
+        order by user_name asc, create_time desc
     </select>
 
     <!-- 根据账户类型查询有效用户列表 -->
@@ -31,7 +31,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         select user_id, user_name, nick_name, phonenumber, account_type
         from sys_user
         where status = '0' and del_flag = '0' and account_type = #{accountType}
-        order by create_time desc
+        order by user_name asc, create_time desc
     </select>
 
 </mapper>

+ 1 - 1
backend/ruoyi-modules/ruoyi-xljk/src/main/java/org/dromara/xljk/controller/XljkConsultationScheduleController.java

@@ -212,7 +212,7 @@ public class XljkConsultationScheduleController {
                      "JOIN sys_role r ON ur.role_id = r.role_id " +
                      "LEFT JOIN xljk_consulter c ON u.user_id = c.user_id AND c.deleted = 0 " +
                      "WHERE r.role_key = 'xljk_consultant' AND u.del_flag = '0' " +
-                     "ORDER BY u.nick_name";
+                     "ORDER BY u.user_name ASC, u.nick_name, u.create_time DESC";
         
         List<Map<String, Object>> counselorOptions = jdbcTemplate.queryForList(sql);
         return R.ok(counselorOptions);

文件差异内容过多而无法显示
+ 224 - 214
backend/ruoyi-modules/ruoyi-xljk/src/main/java/org/dromara/xljk/service/impl/XljkConsultationAppointmentServiceImpl.java


+ 61 - 58
backend/ruoyi-modules/ruoyi-xljk/src/main/java/org/dromara/xljk/service/impl/XljkConsultationNoShowServiceImpl.java

@@ -48,37 +48,39 @@ public class XljkConsultationNoShowServiceImpl implements IXljkConsultationNoSho
         sqlBuilder.append("LEFT JOIN xljk_consultation_appointment a ON ns.appointment_id = a.id ");
         sqlBuilder.append("LEFT JOIN sys_user u ON a.counselor_id = u.user_id ");
         sqlBuilder.append("WHERE ns.id = ? AND ns.deleted = 0");
-        
+
         List<Map<String, Object>> resultList = jdbcTemplate.queryForList(sqlBuilder.toString(), id);
-        
-        if (resultList.isEmpty()) return null;
-        
+
+        if (resultList.isEmpty())
+            return null;
+
         Map<String, Object> row = resultList.get(0);
         XljkConsultationNoShowVo vo = new XljkConsultationNoShowVo();
-        
+
         // 设置基本字段
         vo.setId(((Number) row.get("id")).longValue());
         vo.setStudentId(row.get("student_id") != null ? ((Number) row.get("student_id")).longValue() : null);
-        vo.setAppointmentId(row.get("appointment_id") != null ? ((Number) row.get("appointment_id")).longValue() : null);
+        vo.setAppointmentId(
+                row.get("appointment_id") != null ? ((Number) row.get("appointment_id")).longValue() : null);
         vo.setNoShowDate(convertToDate(row.get("no_show_date")));
         vo.setExpireDate(convertToDate(row.get("expire_date")));
         vo.setStatus((String) row.get("status"));
         vo.setCreateTime(convertToDate(row.get("create_time")));
         vo.setUpdateTime(convertToDate(row.get("update_time")));
-        
+
         // 设置学生相关信息
         vo.setStudentName((String) row.get("student_name"));
         vo.setStudentNo((String) row.get("student_no"));
         vo.setClassName((String) row.get("class_name"));
         vo.setCollegeName((String) row.get("college_name"));
         vo.setMajorName((String) row.get("major_name"));
-        
+
         // 设置预约相关信息
-        vo.setCounselorName((String) row.get("counselor_name"));  // 从counselor表获取咨询师姓名
+        vo.setCounselorName((String) row.get("counselor_name")); // 从counselor表获取咨询师姓名
         vo.setAppointmentDate(convertToDate(row.get("appointment_date")));
         vo.setAppointmentDetailTime((String) row.get("appointment_detail_time"));
         vo.setReason((String) row.get("reason"));
-        
+
         return vo;
     }
 
@@ -91,30 +93,30 @@ public class XljkConsultationNoShowServiceImpl implements IXljkConsultationNoSho
         sqlBuilder.append("FROM xljk_consultation_no_show ns ");
         sqlBuilder.append("LEFT JOIN xg_student_msg s ON ns.student_id = s.id ");
         sqlBuilder.append("WHERE ns.deleted = 0 ");
-        
+
         List<Object> params = new ArrayList<>();
-        
+
         // 添加查询条件
         if (bo.getStudentId() != null) {
             sqlBuilder.append("AND ns.student_id = ? ");
             params.add(bo.getStudentId());
         }
-        
+
         if (StringUtils.isNotBlank(bo.getStudentName())) {
             sqlBuilder.append("AND s.name LIKE ? ");
             params.add("%" + bo.getStudentName() + "%");
         }
-        
+
         if (StringUtils.isNotBlank(bo.getStudentNo())) {
             sqlBuilder.append("AND s.student_no LIKE ? ");
             params.add("%" + bo.getStudentNo() + "%");
         }
-        
+
         if (StringUtils.isNotBlank(bo.getStatus())) {
             sqlBuilder.append("AND ns.status = ? ");
             params.add(bo.getStatus());
         }
-        
+
         // 处理日期范围
         if (bo.getParams() != null) {
             Object startDateObj = bo.getParams().get("startDate");
@@ -123,7 +125,7 @@ public class XljkConsultationNoShowServiceImpl implements IXljkConsultationNoSho
                 params.add(startDateObj.toString());
                 log.info("添加开始日期查询条件: {}", startDateObj);
             }
-            
+
             Object endDateObj = bo.getParams().get("endDate");
             if (endDateObj != null && StringUtils.isNotBlank(endDateObj.toString())) {
                 sqlBuilder.append("AND DATE(ns.no_show_date) <= DATE(?) ");
@@ -131,34 +133,35 @@ public class XljkConsultationNoShowServiceImpl implements IXljkConsultationNoSho
                 log.info("添加结束日期查询条件: {}", endDateObj);
             }
         }
-        
-        // 添加排序,首先按未到访日期倒序,其次按创建时间倒序
-        sqlBuilder.append("ORDER BY ns.no_show_date DESC, ns.create_time DESC");
-        
+
+        // 添加排序,首先按学号降序,其次按未到访日期和创建时间倒序
+        sqlBuilder.append("ORDER BY s.student_no DESC, ns.no_show_date DESC, ns.create_time DESC");
+
         // 执行查询
         List<Map<String, Object>> resultList = jdbcTemplate.queryForList(sqlBuilder.toString(), params.toArray());
-        
+
         // 转换为VO对象
         return resultList.stream().map(row -> {
             XljkConsultationNoShowVo vo = new XljkConsultationNoShowVo();
-            
+
             // 设置基本字段
             vo.setId(((Number) row.get("id")).longValue());
             vo.setStudentId(row.get("student_id") != null ? ((Number) row.get("student_id")).longValue() : null);
-            vo.setAppointmentId(row.get("appointment_id") != null ? ((Number) row.get("appointment_id")).longValue() : null);
+            vo.setAppointmentId(
+                    row.get("appointment_id") != null ? ((Number) row.get("appointment_id")).longValue() : null);
             vo.setNoShowDate(convertToDate(row.get("no_show_date")));
             vo.setExpireDate(convertToDate(row.get("expire_date")));
             vo.setStatus((String) row.get("status"));
             vo.setCreateTime(convertToDate(row.get("create_time")));
             vo.setUpdateTime(convertToDate(row.get("update_time")));
-            
+
             // 设置关联信息
             vo.setStudentName((String) row.get("student_name"));
             vo.setStudentNo((String) row.get("student_no"));
             vo.setClassName((String) row.get("class_name"));
             vo.setCollegeName((String) row.get("college_name"));
             vo.setMajorName((String) row.get("major_name"));
-            
+
             return vo;
         }).collect(Collectors.toList());
     }
@@ -181,26 +184,26 @@ public class XljkConsultationNoShowServiceImpl implements IXljkConsultationNoSho
     public boolean deleteById(Long id) {
         return mapper.deleteById(id) > 0;
     }
-    
+
     @Override
     public Map<String, Object> checkLimitation(Long studentId) {
         Map<String, Object> result = new HashMap<>();
         result.put("limited", false);
-        
+
         try {
             // 查询是否有生效中的限制
             LambdaQueryWrapper<XljkConsultationNoShow> queryWrapper = new LambdaQueryWrapper<>();
             queryWrapper.eq(XljkConsultationNoShow::getStudentId, studentId)
-                       .eq(XljkConsultationNoShow::getStatus, "0") // 0-生效中
-                       .eq(XljkConsultationNoShow::getDeleted, 0)
-                       .orderByDesc(XljkConsultationNoShow::getCreateTime);
-            
+                    .eq(XljkConsultationNoShow::getStatus, "0") // 0-生效中
+                    .eq(XljkConsultationNoShow::getDeleted, 0)
+                    .orderByDesc(XljkConsultationNoShow::getCreateTime);
+
             XljkConsultationNoShow noShow = mapper.selectOne(queryWrapper);
-            
+
             if (noShow != null) {
                 Date now = new Date();
                 Date expireDate = noShow.getExpireDate();
-                
+
                 // 如果限制已过期,更新状态
                 if (expireDate != null && now.after(expireDate)) {
                     log.info("学生{}的预约限制已过期,自动更新状态", studentId);
@@ -210,7 +213,7 @@ public class XljkConsultationNoShowServiceImpl implements IXljkConsultationNoSho
                     // 限制仍在生效期内
                     result.put("limited", true);
                     result.put("expireDate", expireDate);
-                    
+
                     // 格式化日期为字符串
                     SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                     result.put("expireDateStr", sdf.format(expireDate));
@@ -219,10 +222,10 @@ public class XljkConsultationNoShowServiceImpl implements IXljkConsultationNoSho
         } catch (Exception e) {
             log.error("检查预约限制失败", e);
         }
-        
+
         return result;
     }
-    
+
     @Override
     @Transactional
     public boolean releaseLimitation(Long id) {
@@ -232,7 +235,7 @@ public class XljkConsultationNoShowServiceImpl implements IXljkConsultationNoSho
                 log.warn("未找到ID为{}的未到访记录", id);
                 return false;
             }
-            
+
             // 只有生效中的限制才能解除
             if ("0".equals(noShow.getStatus())) {
                 noShow.setStatus("2"); // 2-已解除
@@ -248,7 +251,7 @@ public class XljkConsultationNoShowServiceImpl implements IXljkConsultationNoSho
             return false;
         }
     }
-    
+
     @Override
     @Transactional
     public boolean createNoShowRecord(Long studentId, Long appointmentId, Date noShowDate) {
@@ -258,20 +261,20 @@ public class XljkConsultationNoShowServiceImpl implements IXljkConsultationNoSho
             noShow.setStudentId(studentId);
             noShow.setAppointmentId(appointmentId);
             noShow.setNoShowDate(noShowDate);
-            
+
             // 检查30天内未到访次数
             Calendar calendar = Calendar.getInstance();
             calendar.add(Calendar.DAY_OF_MONTH, -30);
             Date thirtyDaysAgo = calendar.getTime();
-            
+
             LambdaQueryWrapper<XljkConsultationNoShow> queryWrapper = new LambdaQueryWrapper<>();
             queryWrapper.eq(XljkConsultationNoShow::getStudentId, studentId)
-                       .ge(XljkConsultationNoShow::getNoShowDate, thirtyDaysAgo)
-                       .eq(XljkConsultationNoShow::getDeleted, 0);
-            
+                    .ge(XljkConsultationNoShow::getNoShowDate, thirtyDaysAgo)
+                    .eq(XljkConsultationNoShow::getDeleted, 0);
+
             long count = mapper.selectCount(queryWrapper);
             log.info("学生{}在30天内未到访次数: {}", studentId, count);
-            
+
             // 如果达到3次,设置限制(包括本次)
             if (count >= 2) { // 已有2次,加上本次就是3次
                 log.info("学生{}达到3次未到访,设置预约限制", studentId);
@@ -280,11 +283,11 @@ public class XljkConsultationNoShowServiceImpl implements IXljkConsultationNoSho
                 calendar.setTime(noShowDate);
                 calendar.add(Calendar.DAY_OF_MONTH, 7);
                 Date expireDate = calendar.getTime();
-                
+
                 noShow.setExpireDate(expireDate);
                 noShow.setStatus("0"); // 0-生效中
             }
-            
+
             // 保存未到访记录
             mapper.insert(noShow);
             log.info("创建未到访记录成功: {}", noShow);
@@ -294,25 +297,25 @@ public class XljkConsultationNoShowServiceImpl implements IXljkConsultationNoSho
             return false;
         }
     }
-    
+
     @Override
     @Transactional
     public int updateExpiredLimitations() {
         log.info("开始检查过期的预约限制");
         int count = 0;
-        
+
         try {
             Date now = new Date();
-            
+
             // 查询所有生效中但已过期的限制
             LambdaQueryWrapper<XljkConsultationNoShow> queryWrapper = new LambdaQueryWrapper<>();
             queryWrapper.eq(XljkConsultationNoShow::getStatus, "0") // 0-生效中
-                       .lt(XljkConsultationNoShow::getExpireDate, now) // 过期日期早于当前日期
-                       .eq(XljkConsultationNoShow::getDeleted, 0);
-            
+                    .lt(XljkConsultationNoShow::getExpireDate, now) // 过期日期早于当前日期
+                    .eq(XljkConsultationNoShow::getDeleted, 0);
+
             List<XljkConsultationNoShow> expiredList = mapper.selectList(queryWrapper);
             log.info("找到{}条已过期的预约限制", expiredList.size());
-            
+
             // 批量更新状态为已过期
             for (XljkConsultationNoShow noShow : expiredList) {
                 noShow.setStatus("1"); // 1-已过期
@@ -323,13 +326,13 @@ public class XljkConsultationNoShowServiceImpl implements IXljkConsultationNoSho
         } catch (Exception e) {
             log.error("更新过期预约限制失败", e);
         }
-        
+
         return count;
     }
 
     /**
      * 将各种日期类型转换为java.util.Date
-     * 
+     *
      * @param dateObj 日期对象,可能是LocalDateTime、LocalDate、Date或其他类型
      * @return java.util.Date对象,如果转换失败则返回null
      */
@@ -337,7 +340,7 @@ public class XljkConsultationNoShowServiceImpl implements IXljkConsultationNoSho
         if (dateObj == null) {
             return null;
         }
-        
+
         try {
             if (dateObj instanceof Date) {
                 return (Date) dateObj;
@@ -360,4 +363,4 @@ public class XljkConsultationNoShowServiceImpl implements IXljkConsultationNoSho
             return null;
         }
     }
-} 
+}

+ 30 - 27
backend/ruoyi-modules/ruoyi-xljk/src/main/resources/mapper/xljk/XljkSystemQueryMapper.xml

@@ -6,38 +6,38 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 
     <!-- 根据部门名称查询部门ID -->
     <select id="selectDeptIdByName" resultType="Long">
-        SELECT dept_id 
-        FROM sys_dept 
-        WHERE dept_name = #{deptName} AND status = '0' 
+        SELECT dept_id
+        FROM sys_dept
+        WHERE dept_name = #{deptName} AND status = '0'
         LIMIT 1
     </select>
 
     <!-- 根据部门ID查询部门名称 -->
     <select id="selectDeptNameById" resultType="String">
-        SELECT dept_name 
-        FROM sys_dept 
-        WHERE dept_id = #{deptId} AND status = '0' 
+        SELECT dept_name
+        FROM sys_dept
+        WHERE dept_id = #{deptId} AND status = '0'
         LIMIT 1
     </select>
 
     <!-- 获取院系选项(普通用户-根据辅导员负责的班级) -->
     <select id="selectCollegeOptionsByUser" resultType="Map">
-        SELECT DISTINCT college_id as id, college_name as name 
-        FROM xg_class_msg 
+        SELECT DISTINCT college_id as id, college_name as name
+        FROM xg_class_msg
         WHERE counselor_id = #{userId} AND college_name IS NOT NULL
     </select>
 
     <!-- 获取院系选项(管理员-所有院系) -->
     <select id="selectAllCollegeOptions" resultType="Map">
-        SELECT DISTINCT college_id as id, college_name as name 
-        FROM xg_class_msg 
+        SELECT DISTINCT college_id as id, college_name as name
+        FROM xg_class_msg
         WHERE college_name IS NOT NULL
     </select>
 
     <!-- 获取专业选项(普通用户-根据辅导员负责的班级) -->
     <select id="selectMajorOptionsByUser" resultType="Map">
-        SELECT DISTINCT major_id as id, major_name as name 
-        FROM xg_class_msg 
+        SELECT DISTINCT major_id as id, major_name as name
+        FROM xg_class_msg
         WHERE counselor_id = #{userId} AND major_name IS NOT NULL
         <if test="collegeName != null and collegeName != ''">
             AND college_name = #{collegeName}
@@ -46,8 +46,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 
     <!-- 获取专业选项(管理员-所有专业) -->
     <select id="selectAllMajorOptions" resultType="Map">
-        SELECT DISTINCT major_id as id, major_name as name 
-        FROM xg_class_msg 
+        SELECT DISTINCT major_id as id, major_name as name
+        FROM xg_class_msg
         WHERE major_name IS NOT NULL
         <if test="collegeName != null and collegeName != ''">
             AND college_name = #{collegeName}
@@ -56,8 +56,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 
     <!-- 获取班级选项(普通用户-根据辅导员负责的班级) -->
     <select id="selectClassOptionsByUser" resultType="Map">
-        SELECT id, class_name as name 
-        FROM xg_class_msg 
+        SELECT id, class_name as name
+        FROM xg_class_msg
         WHERE counselor_id = #{userId} AND class_name IS NOT NULL
         <if test="collegeName != null and collegeName != ''">
             AND college_name = #{collegeName}
@@ -69,8 +69,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 
     <!-- 获取班级选项(管理员-所有班级) -->
     <select id="selectAllClassOptions" resultType="Map">
-        SELECT id, class_name as name 
-        FROM xg_class_msg 
+        SELECT id, class_name as name
+        FROM xg_class_msg
         WHERE class_name IS NOT NULL
         <if test="collegeName != null and collegeName != ''">
             AND college_name = #{collegeName}
@@ -78,14 +78,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <if test="majorName != null and majorName != ''">
             AND major_name = #{majorName}
         </if>
+        ORDER BY class_name, create_time DESC
     </select>
 
     <!-- 获取班级学生列表(普通用户-根据辅导员负责的班级) -->
     <select id="selectStudentsByClassAndUser" resultType="Map">
-        SELECT s.id as studentId, s.student_no as studentNo, s.name as studentName, 
-               s.gender, s.birth_date as birthDate, s.phone 
-        FROM xg_student_msg s 
-        JOIN xg_class_msg c ON s.class_id = c.id 
+        SELECT s.id as studentId, s.student_no as studentNo, s.name as studentName,
+               s.gender, s.birth_date as birthDate, s.phone
+        FROM xg_student_msg s
+        JOIN xg_class_msg c ON s.class_id = c.id
         WHERE c.counselor_id = #{userId} AND s.deleted = '0'
         <if test="collegeName != null and collegeName != ''">
             AND c.college_name = #{collegeName}
@@ -96,14 +97,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <if test="className != null and className != ''">
             AND c.class_name = #{className}
         </if>
+        ORDER BY s.student_no DESC, s.create_time DESC
     </select>
 
     <!-- 获取班级学生列表(管理员-所有学生) -->
     <select id="selectAllStudentsByClass" resultType="Map">
-        SELECT s.id as studentId, s.student_no as studentNo, s.name as studentName, 
-               s.gender, s.birth_date as birthDate, s.phone 
-        FROM xg_student_msg s 
-        JOIN xg_class_msg c ON s.class_id = c.id 
+        SELECT s.id as studentId, s.student_no as studentNo, s.name as studentName,
+               s.gender, s.birth_date as birthDate, s.phone
+        FROM xg_student_msg s
+        JOIN xg_class_msg c ON s.class_id = c.id
         WHERE s.deleted = '0'
         <if test="collegeName != null and collegeName != ''">
             AND c.college_name = #{collegeName}
@@ -114,6 +116,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <if test="className != null and className != ''">
             AND c.class_name = #{className}
         </if>
+        ORDER BY s.student_no DESC, s.create_time DESC
     </select>
 
-</mapper> 
+</mapper>

+ 1 - 1
backend/ruoyi-modules/ruoyi-xskh/src/main/resources/mapper/XskhDisciplineRecordMapper.xml

@@ -60,7 +60,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             and (student_no like concat('%', #{keyword}, '%')
                 or name like concat('%', #{keyword}, '%'))
         </if>
-        order by student_no
+        order by student_no desc
         <choose>
             <when test="pageNum != null and pageSize != null">
                 limit ${(pageNum - 1) * pageSize}, #{pageSize, jdbcType=INTEGER}

+ 1 - 1
backend/ruoyi-modules/ruoyi-xskh/src/main/resources/mapper/xskh/XskhRewardRecordMapper.xml

@@ -97,7 +97,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <if test="keyword != null and keyword != ''">
             and (student_no like concat('%', #{keyword}, '%') or name like concat('%', #{keyword}, '%'))
         </if>
-        order by name asc
+        order by student_no desc
         limit 50
     </select>
 

+ 17 - 11
backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/mapper/ZsjyEnrollmentInfoMapper.java

@@ -39,7 +39,7 @@ public interface ZsjyEnrollmentInfoMapper extends BaseMapperPlus<ZsjyEnrollmentI
      *
      * @return 专业分布
      */
-    @Select("SELECT applied_major as name, COUNT(id) as value FROM zsjy_enrollment_info WHERE deleted = 0 GROUP BY applied_major ORDER BY value DESC")
+    @Select("SELECT applied_major as name, COUNT(id) as value FROM zsjy_enrollment_info WHERE deleted = 0 GROUP BY applied_major ORDER BY value DESC, MAX(create_time) DESC")
     List<Map<String, Object>> groupByMajor();
 
     /**
@@ -47,7 +47,7 @@ public interface ZsjyEnrollmentInfoMapper extends BaseMapperPlus<ZsjyEnrollmentI
      *
      * @return 地区分布
      */
-    @Select("SELECT province_name as name, COUNT(id) as value FROM zsjy_enrollment_info WHERE deleted = 0 GROUP BY province_name ORDER BY value DESC")
+    @Select("SELECT province_name as name, COUNT(id) as value FROM zsjy_enrollment_info WHERE deleted = 0 GROUP BY province_name ORDER BY value DESC, MAX(create_time) DESC")
     List<Map<String, Object>> groupByRegion();
 
     /**
@@ -55,7 +55,7 @@ public interface ZsjyEnrollmentInfoMapper extends BaseMapperPlus<ZsjyEnrollmentI
      *
      * @return 性别分布
      */
-    @Select("SELECT gender, COUNT(id) as count FROM zsjy_enrollment_info WHERE deleted = 0 GROUP BY gender")
+    @Select("SELECT gender, COUNT(id) as count FROM zsjy_enrollment_info WHERE deleted = 0 GROUP BY gender ORDER BY MAX(create_time) DESC")
     List<Map<String, Object>> countByGenderList();
 
     /**
@@ -82,7 +82,7 @@ public interface ZsjyEnrollmentInfoMapper extends BaseMapperPlus<ZsjyEnrollmentI
      * @param days 天数
      * @return 每日报名人数
      */
-    @Select("SELECT DATE_FORMAT(create_time, '%Y-%m-%d') as date, COUNT(id) as count FROM zsjy_enrollment_info WHERE create_time >= DATE_SUB(CURDATE(), INTERVAL #{days} DAY) AND deleted = 0 GROUP BY DATE_FORMAT(create_time, '%Y-%m-%d') ORDER BY date")
+    @Select("SELECT DATE_FORMAT(create_time, '%Y-%m-%d') as date, COUNT(id) as count FROM zsjy_enrollment_info WHERE create_time >= DATE_SUB(CURDATE(), INTERVAL #{days} DAY) AND deleted = 0 GROUP BY DATE_FORMAT(create_time, '%Y-%m-%d') ORDER BY date DESC, MAX(create_time) DESC")
     List<Map<String, Object>> countByDateRange(@Param("days") Integer days);
 
     /**
@@ -110,7 +110,8 @@ public interface ZsjyEnrollmentInfoMapper extends BaseMapperPlus<ZsjyEnrollmentI
         "GROUP BY",
         "    YEAR(ei.create_time)",
         "ORDER BY",
-        "    dimensionValue DESC"
+        "    dimensionValue DESC,",
+        "    MAX(ei.create_time) DESC"
     })
     List<ZsjyEnrollmentStatisticsResultVo> statisticsByYear(
         @Param("startDate") Date startDate,
@@ -142,7 +143,7 @@ public interface ZsjyEnrollmentInfoMapper extends BaseMapperPlus<ZsjyEnrollmentI
         "GROUP BY",
         "    YEAR(ei.create_time), MONTH(ei.create_time)",
         "ORDER BY",
-        "    YEAR(ei.create_time) DESC, MONTH(ei.create_time) DESC"
+        "    YEAR(ei.create_time) DESC, MONTH(ei.create_time) DESC, MAX(ei.create_time) DESC"
     })
     List<ZsjyEnrollmentStatisticsResultVo> statisticsByMonth(
         @Param("startDate") Date startDate,
@@ -174,7 +175,8 @@ public interface ZsjyEnrollmentInfoMapper extends BaseMapperPlus<ZsjyEnrollmentI
         "GROUP BY",
         "    DATE_FORMAT(ei.create_time, '%Y-%m-%d')",
         "ORDER BY",
-        "    dimensionValue DESC"
+        "    dimensionValue DESC,",
+        "    MAX(ei.create_time) DESC"
     })
     List<ZsjyEnrollmentStatisticsResultVo> statisticsByDay(
         @Param("startDate") Date startDate,
@@ -207,7 +209,8 @@ public interface ZsjyEnrollmentInfoMapper extends BaseMapperPlus<ZsjyEnrollmentI
         "GROUP BY",
         "    ei.major_code, ei.applied_major",
         "ORDER BY",
-        "    enrollmentCount DESC"
+        "    enrollmentCount DESC,",
+        "    MAX(ei.create_time) DESC"
     })
     List<ZsjyEnrollmentStatisticsResultVo> statisticsByMajor(
         @Param("startDate") Date startDate,
@@ -241,7 +244,8 @@ public interface ZsjyEnrollmentInfoMapper extends BaseMapperPlus<ZsjyEnrollmentI
         "GROUP BY",
         "    ei.province_code, ei.province_name",
         "ORDER BY",
-        "    enrollmentCount DESC"
+        "    enrollmentCount DESC,",
+        "    MAX(ei.create_time) DESC"
     })
     List<ZsjyEnrollmentStatisticsResultVo> statisticsByRegion(
         @Param("startDate") Date startDate,
@@ -273,7 +277,8 @@ public interface ZsjyEnrollmentInfoMapper extends BaseMapperPlus<ZsjyEnrollmentI
         "GROUP BY",
         "    ei.gender",
         "ORDER BY",
-        "    enrollmentCount DESC"
+        "    enrollmentCount DESC,",
+        "    MAX(ei.create_time) DESC"
     })
     List<ZsjyEnrollmentStatisticsResultVo> statisticsByGender(
         @Param("startDate") Date startDate,
@@ -315,7 +320,8 @@ public interface ZsjyEnrollmentInfoMapper extends BaseMapperPlus<ZsjyEnrollmentI
         "GROUP BY",
         "    ep.current_status",
         "ORDER BY",
-        "    CAST(ep.current_status AS SIGNED)"
+        "    CAST(ep.current_status AS SIGNED),",
+        "    MAX(ei.create_time) DESC"
     })
     List<ZsjyEnrollmentStatisticsResultVo> statisticsByStatus(
         @Param("startDate") Date startDate,

+ 3 - 2
backend/ruoyi-modules/ruoyi-zsjy/src/main/java/org/dromara/zsjy/mapper/ZsjyEnrollmentProcessMapper.java

@@ -54,7 +54,8 @@ public interface ZsjyEnrollmentProcessMapper extends BaseMapperPlus<ZsjyEnrollme
         "SELECT current_status as status, COUNT(id) as count",
         "FROM zsjy_enrollment_process",
         "WHERE deleted = 0",
-        "GROUP BY current_status"
+        "GROUP BY current_status",
+        "ORDER BY MAX(create_time) DESC"
     })
     List<Map<String, Object>> countByStatusList();
 
@@ -82,7 +83,7 @@ public interface ZsjyEnrollmentProcessMapper extends BaseMapperPlus<ZsjyEnrollme
      * @param userId 用户ID
      * @return 待审核流程列表
      */
-    @Select("SELECT * FROM zsjy_enrollment_process WHERE current_handler = #{userId} AND current_status < 4 AND deleted = 0")
+    @Select("SELECT * FROM zsjy_enrollment_process WHERE current_handler = #{userId} AND current_status < 4 AND deleted = 0 ORDER BY create_time DESC")
     List<ZsjyEnrollmentProcessVo> selectMyAuditList(@Param("userId") Long userId);
 
     /**

+ 2 - 2
backend/ruoyi-modules/ruoyi-zsjy/src/main/resources/mapper/InternshipInfoMapper.xml

@@ -153,7 +153,7 @@
             resultMap="InternshipInfoVOResult">
         <include refid="selectInternshipInfoVo"/>
         <include refid="selectInternshipInfoWhere"/>
-        ORDER BY s.class_name, s.student_no
+        ORDER BY s.student_no DESC, s.class_name, s.create_time DESC
     </select>
 
     <!-- 根据学生ID查询实习信息详情 -->
@@ -176,7 +176,7 @@
         AND c.class_status = '1'
         AND c.class_teacher_id = #{teacherId}
         AND c.tenant_id = '000000'
-        ORDER BY c.grade DESC, c.class_name
+        ORDER BY c.grade DESC, c.class_name, c.create_time DESC
     </select>
 
     <!-- 查询实习状态统计数据 -->

+ 1 - 1
backend/ruoyi-modules/ruoyi-zsjy/src/main/resources/mapper/ZsjyInternshipMonthlyMapper.xml

@@ -335,7 +335,7 @@
         <if test="bo.submitTimeEnd != null and bo.submitTimeEnd != ''">
             AND m.submit_time &lt;= #{bo.submitTimeEnd}
         </if>
-        ORDER BY m.review_time DESC, m.submit_time DESC
+        ORDER BY m.review_time DESC, m.submit_time DESC, m.create_time DESC
     </select>
 
     <!-- 查询审核统计信息 -->

+ 2 - 0
docs/开发文档/API/API.md.backup-20250701-163220

@@ -1447,6 +1447,8 @@ admin 用户具有系统最高权限 `*:*:*`,可以访问所有功能模块和
 
 **权限要求**: `pm:repairOrder:assign`
 
+**排序规则**: 返回的维修人员选项按用户名(`user_name`)升序排列,便于快速定位目标用户
+
 **请求参数**: 无
 
 **响应示例**:

+ 2 - 0
docs/开发文档/API/API文档基础规范.md

@@ -198,6 +198,8 @@
 4. **单条数据接口必须使用 R 类型包装返回结果**
 5. **操作类接口必须使用 R 类型包装返回结果**
 6. **必须包含 clientid、Content-Type 等必要请求头**
+7. **查询类接口默认按创建时间倒序排列,若已有排序字段则在末尾追加 `create_time DESC` 保证新增数据优先展示**
+7. **所有列表查询接口默认按 `create_time` 倒序排列;如接口自定义其他排序字段,必须在末尾追加 `create_time desc` 作为稳定排序项**
 
 ---
 

+ 9 - 1
docs/开发文档/API/API文档总览.md

@@ -121,9 +121,17 @@
   - `student_status = '1'` (在籍状态)
   - `class_id = 入参的classId` (班级ID)
   - `name LIKE '%入参的name%'` (姓名模糊查询,可选)
-- **排序方式**: 按创建时间倒序排列
+- **排序方式**: 按学号降序排列
+- **最新变更**(2025-11-13): 所有学生信息列表接口默认按学号降序排序,便于优先查看学号靠后的学生
 - **权限要求**: `studentMsg:studentMsg:query`
 
+### 2025-11-13 - 学生列表排序策略统一
+- **心理健康测评**: `GET /xljk/evaluation/detail/students/{classId}` 现在按学号降序返回班级学生,满足最新业务要求
+- **学生考核奖励**: 学生候选下拉接口默认按学号降序排列,保持后台与移动端行为一致
+- **心理咨询预约**: 预约记录列表接口默认按学号降序,随后按ID降序排序,并以创建时间倒序兜底保证顺序稳定
+- **预约限制功能**: 未到访记录分页默认先按学号降序,再按未到访日期、创建时间倒序
+- **学生信息批次收集**: 批次学生列表默认按学号降序,当学号一致时以创建时间倒序作为补充
+
 ### 2025-07-24 - 学生信息管理界面重构
 - **界面重构**: 学生信息管理新增弹窗调整为多tab页形式
 - **功能增强**: 新增照片上传功能,支持完整的学生信息录入

+ 1 - 0
docs/开发文档/API/出国申请管理API.md

@@ -90,6 +90,7 @@
   - `rs:overseas:approve3` - 第3级:纪委审批权限
   - `rs:overseas:approve4` - 第4级:学院分管领导审批权限
   - `rs:overseas:approve5` - 第5级:学院党委书记审批权限
+- **数据返回顺序**:审批人下拉接口(`/system/user/list-by-permission`)默认按用户名(`user_name`)升序排序,确保审批人选择器顺序一致(2025-11-13)
 
 - **权限使用说明**:
   - 审批接口采用 **OR模式**,用户拥有以上任一权限即可调用接口

+ 2 - 0
docs/开发文档/API/后勤满意度调查API.md

@@ -63,6 +63,7 @@ Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
 | `/hq/satSurvey/{ids}` | DELETE | 删除问卷 | hq:satSurvey:remove |
 | `/hq/satSurvey/publish/{id}` | PUT | 发布问卷 | hq:satSurvey:publish |
 | `/hq/satQuestion/list` | GET | 查询题目列表 | hq:satQuestion:list |
+> 📌 **排序策略更新(2025-11-13)**:题目列表在按指定字段排序时,会额外追加 `createTime DESC` 作为最后一位兜底排序,确保返回结果顺序稳定。
 | `/hq/satQuestion/{id}` | GET | 获取题目详情 | hq:satQuestion:query |
 | `/hq/satQuestion` | POST | 新增题目 | hq:satQuestion:add |
 | `/hq/satQuestion` | PUT | 修改题目 | hq:satQuestion:edit |
@@ -452,6 +453,7 @@ await Promise.all(promises);
 | 1.0.3 | 2025-07-17 | 添加选项保存防重复提交机制,解决幂等性控制冲突 | wuzilong |
 | 1.0.4 | 2025-07-18 | 优化问答题文本回答展示功能,提高Vue渲染稳定性 | wuzilong |
 | 1.0.5 | 2025-07-18 | 增强问卷答题记录接口功能,返回答题详情数据 | wuzilong |
+| 1.0.6 | 2025-11-13 | 调整题目列表排序策略,追加创建时间倒序兜底,避免排序不稳定 | Cursor |
 
 ## 附录
 

+ 2 - 0
docs/开发文档/API/学生信息批次收集API.md

@@ -187,6 +187,8 @@
 }
 ```
 
+> 📌 **排序说明**:分页列表默认按照学号 `studentNo` 降序排序;若学号相同,则继续按照 `createTime` 降序排列,确保最新学号优先展示。
+
 ### 2. 导出学生信息批次收集列表
 
 - **接口路径**: POST `/studentMsgBatch/studentMsgBatch/export`

+ 1 - 0
docs/开发文档/API/心理健康测评API.md

@@ -489,6 +489,7 @@
 - **接口URL**:/xljk/evaluation/detail/students/{classId}
 - **请求方式**:GET
 - **接口权限**:xljk:evaluation:query
+- **排序方式**:按学号 `studentNo` 降序返回,确保默认展示最新学号
 - **请求参数**:
 
 | 参数名 | 类型 | 是否必须 | 描述 |

+ 64 - 1
docs/开发文档/API/用户认证登录API.md

@@ -731,7 +731,7 @@ methods: {
 1. 该接口需要用户登录后才能访问
 2. 返回的用户信息已过滤敏感字段
 3. 建议前端对结果进行缓存,避免频繁请求
-4. 返回结果按照用户ID升序排序
+4. 返回结果按照用户名(`user_name`)升序排序
 
 ### 使用示例
 ```typescript
@@ -750,3 +750,66 @@ async function getAuditors() {
   }
 }
 ```
+
+## 根据部门获取用户列表
+
+### 基本信息
+- **接口URL**: `/system/user/list/dept/{deptId}`
+- **请求方式**: GET
+- **接口描述**: 根据部门ID获取该部门下所有启用状态的用户,用于部门人员选择器
+- **权限标识**: `system:user:list`
+
+### 路径参数
+| 参数名 | 类型 | 是否必须 | 说明 | 示例值 |
+|--------|------|----------|------|--------|
+| deptId | number | 是 | 部门ID | 1001 |
+
+### 响应参数
+```typescript
+{
+  code: number;
+  msg: string;
+  data: {
+    userId: number;
+    userName: string;
+    nickName: string;
+    phonenumber: string;
+  }[];
+}
+```
+
+### 注意事项
+1. 只返回未删除且状态为正常的用户
+2. 返回结果按照用户名(`user_name`)升序排序,便于快速定位
+
+## 批量获取用户基础信息
+
+### 基本信息
+- **接口URL**: `/system/user/optionselect`
+- **请求方式**: GET
+- **接口描述**: 根据用户ID集合(可选)和部门ID(可选)批量获取基础用户信息
+- **权限标识**: `system:user:query`
+
+### Query参数
+| 参数名 | 类型 | 是否必须 | 说明 | 示例值 |
+|--------|------|----------|------|--------|
+| userIds | string | 否 | 逗号分隔的用户ID集合 | 1,2,3 |
+| deptId | number | 否 | 指定部门ID时仅返回该部门用户 | 1001 |
+
+### 响应参数
+```typescript
+{
+  code: number;
+  msg: string;
+  data: {
+    userId: number;
+    userName: string;
+    nickName: string;
+    phonenumber: string;
+  }[];
+}
+```
+
+### 注意事项
+1. 用户ID集合为空时返回有权限范围内的全部用户
+2. 返回结果默认按照用户名(`user_name`)升序排序,保持前端下拉展示一致性

+ 2 - 0
docs/开发文档/API/预约限制功能API.md

@@ -57,6 +57,8 @@
 }
 ```
 
+> 📌 **排序说明**:列表结果默认按照学号 `studentNo` 降序排列;当学号相同或为空时,继续按照未到访日期、创建时间倒序展示。
+
 ### 3.2 获取未到访记录详情
 
 #### 接口信息

+ 292 - 6
web/src/views/xg/xsjcxx/stuRoster/index.vue

@@ -11,6 +11,13 @@
             </div>
           </template>
           <el-input v-model="deptName" placeholder="请输入院系名称" prefix-icon="Search" clearable />
+          <div class="class-status-filter mt-2">
+            <span class="class-status-filter__label">班级状态:</span>
+            <el-radio-group v-model="classStatusFilter" size="small" @change="handleClassStatusFilterChange">
+              <el-radio-button label="all">全部班级</el-radio-button>
+              <el-radio-button label="normal">{{ normalClassStatusLabel }}</el-radio-button>
+            </el-radio-group>
+          </div>
           <el-tree
             ref="deptTreeRef"
             class="mt-2 dept-tree"
@@ -23,7 +30,22 @@
             highlight-current
             default-expand-all
             @check="handleDeptCheck"
-          />
+          >
+            <template #default="{ data }">
+              <div class="dept-tree-node-label">
+                <span class="dept-tree-node-text">{{ data.label }}</span>
+                <el-tag
+                  v-if="isClassNode(data) && data.classStatus"
+                  size="small"
+                  effect="light"
+                  :type="getClassStatusTagType(data.classStatus)"
+                  class="dept-tree-node-tag"
+                >
+                  {{ getClassStatusLabel(data.classStatus) }}
+                </el-tag>
+              </div>
+            </template>
+          </el-tree>
         </el-card>
       </div>
 
@@ -295,16 +317,19 @@
 </template>
 
 <script setup lang="ts">
-import { ref, reactive, toRefs, watchEffect, onMounted, computed, getCurrentInstance } from 'vue';
+import { ref, reactive, toRefs, watch, watchEffect, onMounted, computed, getCurrentInstance, nextTick } from 'vue';
 import ElMessage from 'element-plus/es/components/message/index';
 import ElMessageBox from 'element-plus/es/components/message-box/index';
 import { Search, Refresh, Setting, Download, List, Grid, View, Picture, Male, Female, Loading } from '@element-plus/icons-vue';
 import AdvancedSearchDialog from './components/AdvancedSearchDialog.vue';
 import StudentDetailDialog from './components/StudentDetailDialog.vue';
 import api from '@/api/xg/xsjcxx/stuRoster/index';
+import { listClassMsg } from '@/api/xg/xsjcxx/classMsg/classMsg/index';
+import type { ClassMsgVO } from '@/api/xg/xsjcxx/classMsg/types';
 import request from '@/utils/request';
 
 const { proxy } = getCurrentInstance() as any;
+const { xg_class_status } = toRefs<any>(proxy?.useDict('xg_class_status') || {});
 
 // 响应式数据
 const loading = ref(false);
@@ -314,6 +339,7 @@ const showAdvancedSearch = ref(false);
 const deptName = ref('');
 const deptTreeRef = ref();
 const selectedDepts = ref<number[]>([]);
+const classStatusFilter = ref<'all' | 'normal'>('all');
 
 // 学生照片缓存
 const studentPhotoCache = ref<Map<string, string>>(new Map());
@@ -333,6 +359,11 @@ const tableMaxHeight = computed(() => {
   return baseHeight - headerHeight - searchHeight - toolbarHeight - paginationHeight - padding - cardPadding;
 });
 
+const normalClassStatusLabel = computed(() => {
+  const label = getClassStatusLabel('1');
+  return label || '正常';
+});
+
 // 查询参数
 const queryParams = reactive({
   pageNum: 1,
@@ -449,8 +480,14 @@ const student_status = ref([
 ]);
 
 // 部门树数据
+const rawDeptOptions = ref<any[]>([]);
 const deptOptions = ref([]);
 
+// 班级状态缓存
+const classStatusMap = new Map<string, string>();
+let classStatusLoaded = false;
+let classStatusLoading = false;
+
 // 表格列配置
 const columns = ref([
   { key: 0, label: '学号', visible: true },
@@ -949,6 +986,204 @@ const isPhotoLoading = (student: any): boolean => {
   return photoLoadingCache.value.get(photoPath) || false;
 };
 
+const getClassStatusLabel = (status: string): string => {
+  if (!status) {
+    return '';
+  }
+  const options = (xg_class_status?.value as any[]) || [];
+  const found = options.find((item) => item?.value === status);
+  return (found && found.label) || status;
+};
+
+const getClassStatusTagType = (status: string): 'success' | 'warning' | 'info' | 'primary' | 'danger' => {
+  const statusTypeMap: Record<string, 'success' | 'warning' | 'info' | 'primary' | 'danger'> = {
+    '1': 'success',
+    '2': 'warning',
+    '3': 'primary',
+    '4': 'danger',
+    '5': 'info'
+  };
+  return statusTypeMap[status] || 'info';
+};
+
+const getDeptCategory = (node: any) => {
+  if (!node) {
+    return undefined;
+  }
+  const category = node.deptCategory ?? node.dept_category ?? node.params?.deptCategory;
+  if (category && !node.deptCategory) {
+    node.deptCategory = category;
+  }
+  return category;
+};
+
+const isClassNode = (node: any) => {
+  const category = getDeptCategory(node);
+  return typeof category === 'string' && category.toLowerCase().startsWith('bj-');
+};
+
+const ensureClassStatusMap = async () => {
+  if (classStatusLoaded || classStatusLoading) {
+    return;
+  }
+  classStatusLoading = true;
+  try {
+    const params = {
+      pageNum: 1,
+      pageSize: 9999,
+      params: {}
+    };
+    const res = await listClassMsg(params);
+    const rows: ClassMsgVO[] = (res && ((res as any).rows || (res as any).data?.rows)) || [];
+    classStatusMap.clear();
+    rows.forEach((item) => {
+      if (item?.id === undefined || item?.id === null) {
+        return;
+      }
+      const statusValue = item.classStatus;
+      if (statusValue === undefined || statusValue === null || statusValue === '') {
+        return;
+      }
+      classStatusMap.set(String(item.id), String(statusValue));
+    });
+    classStatusLoaded = true;
+  } catch (error) {
+    console.error('加载班级状态失败:', error);
+  } finally {
+    classStatusLoading = false;
+  }
+};
+
+const resolveClassStatus = (node: any): string | undefined => {
+  const existing = node?.classStatus ?? node?.class_status;
+  if (existing !== undefined && existing !== null && existing !== '') {
+    return String(existing);
+  }
+  const deptId = node?.id ?? node?.deptId;
+  if (deptId === undefined || deptId === null) {
+    return undefined;
+  }
+  return classStatusMap.get(String(deptId));
+};
+
+const buildDeptTreeWithStatus = (nodes: any[]): any[] => {
+  return (nodes || []).map((node) => {
+    const enhanced: any = { ...node };
+    if (Array.isArray(node?.children) && node.children.length > 0) {
+      enhanced.children = buildDeptTreeWithStatus(node.children);
+    } else {
+      enhanced.children = [];
+    }
+    const baseLabel = enhanced.originalLabel ?? enhanced.label ?? '';
+    enhanced.originalLabel = baseLabel;
+
+    if (isClassNode(enhanced)) {
+      const status = resolveClassStatus(enhanced);
+      if (status) {
+        const statusLabel = getClassStatusLabel(status);
+        enhanced.classStatus = status;
+        enhanced.classStatusLabel = statusLabel;
+      }
+    }
+    enhanced.label = baseLabel;
+    return enhanced;
+  });
+};
+
+const collectNodeIds = (nodes: any[]): Set<string> => {
+  const ids = new Set<string>();
+  const traverse = (list: any[]) => {
+    (list || []).forEach((item) => {
+      if (item?.id !== undefined && item?.id !== null) {
+        ids.add(String(item.id));
+      }
+      if (Array.isArray(item?.children) && item.children.length > 0) {
+        traverse(item.children);
+      }
+    });
+  };
+  traverse(nodes);
+  return ids;
+};
+
+const filterDeptTreeByStatus = (nodes: any[], status?: string): any[] => {
+  const targetStatus = status?.trim();
+  return (nodes || [])
+    .map((node) => {
+      const filtered: any = { ...node };
+      if (Array.isArray(node?.children) && node.children.length > 0) {
+        filtered.children = filterDeptTreeByStatus(node.children, status);
+      } else {
+        filtered.children = [];
+      }
+
+      if (targetStatus && isClassNode(filtered)) {
+        return filtered.classStatus === targetStatus ? filtered : null;
+      }
+
+      if (targetStatus && filtered.children.length === 0 && !isClassNode(filtered)) {
+        return null;
+      }
+
+      return filtered;
+    })
+    .filter((item) => item !== null);
+};
+
+const findFirstSelectableNode = (nodes: any[]): any | null => {
+  for (const node of nodes || []) {
+    if (!node?.disabled) {
+      return node;
+    }
+    if (Array.isArray(node?.children) && node.children.length > 0) {
+      const child = findFirstSelectableNode(node.children);
+      if (child) {
+        return child;
+      }
+    }
+  }
+  return null;
+};
+
+const updateDeptOptionsWithStatus = () => {
+  const checkedKeys = Array.isArray(selectedDepts.value) ? [...selectedDepts.value] : [];
+  const currentKey = deptTreeRef.value?.getCurrentKey?.();
+
+  let processedTree = buildDeptTreeWithStatus(rawDeptOptions.value);
+
+  if (classStatusFilter.value === 'normal') {
+    processedTree = filterDeptTreeByStatus(processedTree, '1');
+  }
+
+  const visibleIds = collectNodeIds(processedTree);
+  const validCheckedKeys = checkedKeys.filter((key) => visibleIds.has(String(key)));
+  const selectionChanged = validCheckedKeys.length !== checkedKeys.length;
+
+  selectedDepts.value = validCheckedKeys;
+  queryParams.deptIds = validCheckedKeys;
+
+  deptOptions.value = processedTree;
+
+  nextTick(() => {
+    deptTreeRef.value?.setCheckedKeys(validCheckedKeys);
+    if (currentKey && visibleIds.has(String(currentKey))) {
+      deptTreeRef.value?.setCurrentKey(currentKey);
+    } else if (!currentKey) {
+      const fallbackNode = findFirstSelectableNode(processedTree);
+      if (fallbackNode?.id !== undefined) {
+        deptTreeRef.value?.setCurrentKey(fallbackNode.id);
+      }
+    }
+    if (selectionChanged) {
+      getList();
+    }
+  });
+};
+
+const handleClassStatusFilterChange = () => {
+  updateDeptOptionsWithStatus();
+};
+
 // 监听部门名称变化
 watchEffect(() => {
   if (deptTreeRef.value) {
@@ -956,37 +1191,56 @@ watchEffect(() => {
   }
 });
 
+watch(
+  () => xg_class_status?.value,
+  () => {
+    if (rawDeptOptions.value.length > 0) {
+      updateDeptOptionsWithStatus();
+    }
+  },
+  { deep: true }
+);
+
 // 递归处理树数据,将所有节点的disabled属性设置为false
 const processTreeData = (data: any[]): any[] => {
   return data.map((node) => ({
     ...node,
     disabled: false, // 强制设置为false,允许所有节点勾选
+    originalLabel: node.originalLabel ?? node.label,
     children: node.children ? processTreeData(node.children) : undefined
   }));
 };
 
+const handleDeptTreeData = async (data: any[]) => {
+  rawDeptOptions.value = processTreeData(data);
+  await ensureClassStatusMap();
+  updateDeptOptionsWithStatus();
+};
+
 /** 查询部门下拉树结构 */
 const getDeptTree = async () => {
   try {
     const res = await api.XgDeptTreeSelect(101);
     // XgDeptTreeSelect返回的数据结构与deptTreeSelect不同,需要进行适当处理
     if (res.data && Array.isArray(res.data)) {
-      deptOptions.value = processTreeData(res.data);
+      await handleDeptTreeData(res.data);
     } else {
       console.warn('部门树数据格式不符合预期');
       // 回退到默认处理
       const backup = await api.deptTreeSelect();
-      deptOptions.value = processTreeData(backup.data.data);
+      await handleDeptTreeData(backup.data.data);
     }
   } catch (error) {
     console.error('获取部门树失败:', error);
     // 如果API调用失败,可以使用默认的deptTreeSelect作为备选
     try {
       const backup = await api.deptTreeSelect();
-      deptOptions.value = processTreeData(backup.data.data);
+      await handleDeptTreeData(backup.data.data);
     } catch (backupError) {
       console.error('备选API也失败:', backupError);
       ElMessage.error('获取部门树失败,请重试');
+      rawDeptOptions.value = [];
+      deptOptions.value = [];
     }
   }
 };
@@ -1028,6 +1282,10 @@ onMounted(() => {
   padding-bottom: 20px; /* 增加底部内边距,为按钮留出空间 */
 }
 
+.left-panel :deep(.el-card__header) {
+  padding: 9px 21px !important;
+}
+
 .right-panel {
   flex: 1;
   overflow: hidden;
@@ -1035,6 +1293,18 @@ onMounted(() => {
   flex-direction: column;
 }
 
+.class-status-filter {
+  display: flex;
+  align-items: center;
+  gap: 8px;
+}
+
+.class-status-filter__label {
+  color: #606266;
+  font-size: 13px;
+  flex-shrink: 0;
+}
+
 .dept-tree {
   height: calc(100vh - 280px); /* 距离视窗底部100px,进一步减少高度 */
   overflow-y: auto;
@@ -1079,6 +1349,22 @@ onMounted(() => {
   min-height: 32px;
 }
 
+.dept-tree-node-label {
+  display: inline-flex;
+  align-items: center;
+  gap: 6px;
+}
+
+.dept-tree-node-text {
+  display: inline-flex;
+  align-items: center;
+  line-height: 1.4;
+}
+
+.dept-tree-node-tag {
+  flex-shrink: 0;
+}
+
 /* 确保展开图标有足够空间 */
 .dept-tree :deep(.el-tree-node__expand-icon) {
   margin-right: 4px;
@@ -1095,7 +1381,7 @@ onMounted(() => {
   display: flex;
   justify-content: space-between;
   align-items: center;
-  padding: 8px 0 !important; /* 减少头部内边距 */
+  padding: 0 !important;
   margin-bottom: 6px; /* 减少与搜索框的间距 */
 }
 

部分文件因为文件数量过多而无法显示