refactor: 日期格式化为数据库日期格式,避免日期比较使用函数导致索引失效

This commit is contained in:
hxr
2023-10-19 00:00:02 +08:00
parent dfd233739b
commit ee438b5370
4 changed files with 45 additions and 24 deletions

View File

@@ -2,7 +2,13 @@
package com.youlai.system.common.util; package com.youlai.system.common.util;
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ReflectUtil;
import cn.hutool.core.util.StrUtil;
import org.springframework.format.annotation.DateTimeFormat;
import java.lang.reflect.Field;
import java.util.List; import java.util.List;
/** /**
@@ -15,18 +21,32 @@ public class DateUtils {
/** /**
* 格式化日期范围 * 将日期格式化为数据库日期格式 (yyyy-MM-dd HH:mm:ss) 并更新对象中指定的起始时间字段和结束时间字段。
* *
* @param createTimeRange * @param obj 要处理的对象
* @return * @param startTimeFieldName 起始时间字段名
* @param endTimeFieldName 结束时间字段名
*/ */
public static List<String> formatDateRange(List<String> createTimeRange) { public static void formatDateTimeForDatabase(Object obj, String startTimeFieldName, String endTimeFieldName) {
if (CollectionUtil.isNotEmpty(createTimeRange) && createTimeRange.size() == 2) { Field startTimeField = ReflectUtil.getField(obj.getClass(), startTimeFieldName);
createTimeRange.set(0, createTimeRange.get(0) + " 00:00:00"); Field endTimeField = ReflectUtil.getField(obj.getClass(), endTimeFieldName);
createTimeRange.set(1, createTimeRange.get(1) + " 23:59:59");
return createTimeRange; if (startTimeField != null) {
} else { processDateTimeField(obj, startTimeField, startTimeFieldName, "yyyy-MM-dd 00:00:00");
return null; }
if (endTimeField != null) {
processDateTimeField(obj, endTimeField, endTimeFieldName, "yyyy-MM-dd 23:59:59");
}
}
private static void processDateTimeField(Object obj, Field field, String fieldName, String targetPattern) {
Object fieldValue = ReflectUtil.getFieldValue(obj, fieldName);
if (fieldValue != null) {
String pattern = field.isAnnotationPresent(DateTimeFormat.class) ?
field.getAnnotation(DateTimeFormat.class).pattern() : "yyyy-MM-dd";
DateTime dateTime = DateUtil.parse(StrUtil.toString(fieldValue), pattern);
ReflectUtil.setFieldValue(obj, fieldName, dateTime.toString(targetPattern));
} }
} }
} }

View File

@@ -3,7 +3,9 @@ package com.youlai.system.model.query;
import com.youlai.system.common.base.BasePageQuery; import com.youlai.system.common.base.BasePageQuery;
import io.swagger.v3.oas.annotations.media.Schema; import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data; import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
import java.util.List; import java.util.List;
/** /**
@@ -25,7 +27,11 @@ public class UserPageQuery extends BasePageQuery {
@Schema(description="部门ID") @Schema(description="部门ID")
private Long deptId; private Long deptId;
@Schema(description="创建时间范围") @Schema(description="创建时间-开始时间")
private List<String> createTimeRange; @DateTimeFormat(pattern = "yyyy-MM-dd")
private String startTime;
@Schema(description="创建时间-结束时间")
@DateTimeFormat(pattern = "yyyy-MM-dd")
private String endTime;
} }

View File

@@ -74,9 +74,8 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
int pageSize = queryParams.getPageSize(); int pageSize = queryParams.getPageSize();
Page<UserBO> page = new Page<>(pageNum, pageSize); Page<UserBO> page = new Page<>(pageNum, pageSize);
// 时间范围参数处理 // 日期格式化为数据库日期格式,避免日期比较使用函数导致索引失效
List<String> createTimeRange = DateUtils.formatDateRange(queryParams.getCreateTimeRange()); DateUtils.formatDateTimeForDatabase(queryParams, "startTime", "endTime");
queryParams.setCreateTimeRange(createTimeRange);
// 查询数据 // 查询数据
Page<UserBO> userPage = this.baseMapper.getUserPage(page, queryParams); Page<UserBO> userPage = this.baseMapper.getUserPage(page, queryParams);

View File

@@ -37,16 +37,12 @@
<if test='queryParams.deptId!=null'> <if test='queryParams.deptId!=null'>
AND concat(',',concat(d.tree_path,',',d.id),',') like concat('%,',#{queryParams.deptId},',%') AND concat(',',concat(d.tree_path,',',d.id),',') like concat('%,',#{queryParams.deptId},',%')
</if> </if>
<if test="queryParams.startTime != null">
<if test="queryParams.createTimeRange != null and queryParams.createTimeRange.size() == 2 "> AND u.create_time &gt;= #{queryParams.startTime}
<if test="queryParams.createTimeRange[0] != null and queryParams.createTimeRange[0].trim() neq ''">
AND u.create_time &gt;= #{queryParams.createTimeRange[0]}
</if> </if>
<if test="queryParams.createTimeRange[1] != null and queryParams.createTimeRange[1].trim() neq ''"> <if test="queryParams.endTime != null">
AND u.create_time &lt;= #{queryParams.createTimeRange[1]} AND u.create_time &lt;= #{queryParams.endTime}
</if> </if>
</if>
</where> </where>
GROUP BY u.id GROUP BY u.id