This commit is contained in:
zlwu committed 2025-11-13 23:30:05 +08:00
1 parent f4a1eac9ed
commit 4d48300a1d
67 files changed
+1211 -614

No files matched your search

@@ -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;
}
}
@@ -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>
@@ -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>
@@ -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>
<!-- 批量插入指标 -->
@@ -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、年度和月份查询月度监控 -->
@@ -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>
<!-- 统计自评数量 -->
@@ -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查询条件
@@ -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();
@@ -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>
@@ -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);
@@ -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>
@@ -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">
@@ -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>
<!-- 查询附件详情 -->
@@ -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>
@@ -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>
<!-- 查询带详细信息的审批记录数量(关联申请人和课程信息)- 🆕 支持多级审批过滤 -->
@@ -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>
@@ -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">
@@ -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>
@@ -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>
@@ -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);
}
}
@@ -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);
@@ -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);
}
@@ -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);
}
@@ -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>
@@ -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">
@@ -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">
@@ -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">
@@ -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">
@@ -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);
}
@@ -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;
}
@@ -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>
@@ -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);
@@ -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);
@@ -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();
}
@@ -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);
@@ -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()) {
@@ -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"));
@@ -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);
// 构建部门树
@@ -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());
@@ -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;
}
}
@@ -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>
@@ -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获取学生详细信息 -->
@@ -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>
@@ -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>
@@ -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>
<!-- 驳回学生信息提交 -->
@@ -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>
@@ -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>
@@ -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);
@@ -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;
}
}
}
}
@@ -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>
@@ -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}
@@ -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>
@@ -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,
@@ -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);
/**
@@ -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>
<!-- 查询实习状态统计数据 -->
@@ -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>
<!-- 查询审核统计信息 -->
@@ -1447,6 +1447,8 @@ admin 用户具有系统最高权限 `*:*:*`,可以访问所有功能模块和
**权限要求**: `pm:repairOrder:assign`
**排序规则**: 返回的维修人员选项按用户名(`user_name`)升序排列,便于快速定位目标用户
**请求参数**: 无
**响应示例**:
@@ -198,6 +198,8 @@
4. **单条数据接口必须使用 R 类型包装返回结果**
5. **操作类接口必须使用 R 类型包装返回结果**
6. **必须包含 clientid、Content-Type 等必要请求头**
7. **查询类接口默认按创建时间倒序排列,若已有排序字段则在末尾追加 `create_time DESC` 保证新增数据优先展示**
7. **所有列表查询接口默认按 `create_time` 倒序排列;如接口自定义其他排序字段,必须在末尾追加 `create_time desc` 作为稳定排序项**
---
+9 -1
View File
@@ -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页形式
- **功能增强**: 新增照片上传功能,支持完整的学生信息录入
@@ -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模式**,用户拥有以上任一权限即可调用接口
@@ -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 |
## 附录
@@ -187,6 +187,8 @@
}
```
> 📌 **排序说明**:分页列表默认按照学号 `studentNo` 降序排序;若学号相同,则继续按照 `createTime` 降序排列,确保最新学号优先展示。
### 2. 导出学生信息批次收集列表
- **接口路径**: POST `/studentMsgBatch/studentMsgBatch/export`
@@ -489,6 +489,7 @@
- **接口URL**:/xljk/evaluation/detail/students/{classId}
- **请求方式**:GET
- **接口权限**:xljk:evaluation:query
- **排序方式**:按学号 `studentNo` 降序返回,确保默认展示最新学号
- **请求参数**:
| 参数名 | 类型 | 是否必须 | 描述 |
+64 -1
View File
@@ -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`)升序排序,保持前端下拉展示一致性
@@ -57,6 +57,8 @@
}
```
> 📌 **排序说明**:列表结果默认按照学号 `studentNo` 降序排列;当学号相同或为空时,继续按照未到访日期、创建时间倒序展示。
### 3.2 获取未到访记录详情
#### 接口信息
+292 -6
View File
@@ -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; /* 减少与搜索框的间距 */
}