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;
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;
/**
@@ -15,18 +21,32 @@ public class DateUtils {
/**
* 格式化日期范围
* 将日期格式化为数据库日期格式 (yyyy-MM-dd HH:mm:ss) 并更新对象中指定的起始时间字段和结束时间字段。
*
* @param createTimeRange
* @return
* @param obj 要处理的对象
* @param startTimeFieldName 起始时间字段名
* @param endTimeFieldName 结束时间字段名
*/
public static List<String> formatDateRange(List<String> createTimeRange) {
if (CollectionUtil.isNotEmpty(createTimeRange) && createTimeRange.size() == 2) {
createTimeRange.set(0, createTimeRange.get(0) + " 00:00:00");
createTimeRange.set(1, createTimeRange.get(1) + " 23:59:59");
return createTimeRange;
} else {
return null;
public static void formatDateTimeForDatabase(Object obj, String startTimeFieldName, String endTimeFieldName) {
Field startTimeField = ReflectUtil.getField(obj.getClass(), startTimeFieldName);
Field endTimeField = ReflectUtil.getField(obj.getClass(), endTimeFieldName);
if (startTimeField != null) {
processDateTimeField(obj, startTimeField, startTimeFieldName, "yyyy-MM-dd 00:00:00");
}
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 io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
import java.util.List;
/**
@@ -25,7 +27,11 @@ public class UserPageQuery extends BasePageQuery {
@Schema(description="部门ID")
private Long deptId;
@Schema(description="创建时间范围")
private List<String> createTimeRange;
@Schema(description="创建时间-开始时间")
@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();
Page<UserBO> page = new Page<>(pageNum, pageSize);
// 时间范围参数处理
List<String> createTimeRange = DateUtils.formatDateRange(queryParams.getCreateTimeRange());
queryParams.setCreateTimeRange(createTimeRange);
// 日期格式化为数据库日期格式,避免日期比较使用函数导致索引失效
DateUtils.formatDateTimeForDatabase(queryParams, "startTime", "endTime");
// 查询数据
Page<UserBO> userPage = this.baseMapper.getUserPage(page, queryParams);