fix(public-todo): dueDate 改 String 映射,修复截止日期差一天
CI/CD Deploy (Admin) / 构建后端镜像并部署 (push) Successful in 23s
CI/CD Deploy (Admin) / 构建后端镜像并部署 (push) Successful in 23s
- 根因:Date 类型经 @DateTimeFormat 按本地时区解析为当日 00:00, 再经 JDBC(serverTimezone=UTC)与 MySQL 时区换算后漂移一天 - dueDate 改为 String(yyyy-MM-dd),字符串往返不参与任何时区换算 - add/update 对空串统一转 null(DATE 列不接受空串) - stats 逾期判断改字符串比较,与前端口径一致 - 实测:提交 2026-10-27 → 库存 2026-10-27 → 返回 2026-10-27,完全一致
This commit is contained in:
@@ -93,6 +93,10 @@ public class PublicTodoController {
|
|||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
publicTodo.setId(null);
|
publicTodo.setId(null);
|
||||||
|
// DATE 列不接受空串,空值统一转 null
|
||||||
|
if (StringUtils.isBlank(publicTodo.getDueDate())) {
|
||||||
|
publicTodo.setDueDate(null);
|
||||||
|
}
|
||||||
if (publicTodo.getStatus() == null) {
|
if (publicTodo.getStatus() == null) {
|
||||||
publicTodo.setStatus(0);
|
publicTodo.setStatus(0);
|
||||||
}
|
}
|
||||||
@@ -123,6 +127,10 @@ public class PublicTodoController {
|
|||||||
return Result.error().message("标题不能为空");
|
return Result.error().message("标题不能为空");
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
|
// DATE 列不接受空串,空值统一转 null
|
||||||
|
if (StringUtils.isBlank(publicTodo.getDueDate())) {
|
||||||
|
publicTodo.setDueDate(null);
|
||||||
|
}
|
||||||
publicTodo.setUpdateBy(OPERATOR);
|
publicTodo.setUpdateBy(OPERATOR);
|
||||||
publicTodo.setUpdateDate(new Date());
|
publicTodo.setUpdateDate(new Date());
|
||||||
publicTodo.setCreateBy(null);
|
publicTodo.setCreateBy(null);
|
||||||
@@ -210,11 +218,12 @@ public class PublicTodoController {
|
|||||||
int done = 0;
|
int done = 0;
|
||||||
int overdue = 0;
|
int overdue = 0;
|
||||||
Map<String, Integer> byCategory = new HashMap<>();
|
Map<String, Integer> byCategory = new HashMap<>();
|
||||||
Date today = new Date();
|
// 逾期按 yyyy-MM-dd 字符串比较,与前端口径一致,不经时区换算
|
||||||
|
String today = new java.text.SimpleDateFormat("yyyy-MM-dd").format(new Date());
|
||||||
for (PublicTodo item : list) {
|
for (PublicTodo item : list) {
|
||||||
if (item.getStatus() != null && item.getStatus() == 1) {
|
if (item.getStatus() != null && item.getStatus() == 1) {
|
||||||
done++;
|
done++;
|
||||||
} else if (item.getDueDate() != null && item.getDueDate().before(today)) {
|
} else if (item.getDueDate() != null && item.getDueDate().compareTo(today) < 0) {
|
||||||
overdue++;
|
overdue++;
|
||||||
}
|
}
|
||||||
String cat = StringUtils.isBlank(item.getCategory()) ? "未分类" : item.getCategory();
|
String cat = StringUtils.isBlank(item.getCategory()) ? "未分类" : item.getCategory();
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ import com.baomidou.mybatisplus.annotation.TableId;
|
|||||||
import com.baomidou.mybatisplus.annotation.TableName;
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
import com.fasterxml.jackson.annotation.JsonFormat;
|
import com.fasterxml.jackson.annotation.JsonFormat;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import org.springframework.format.annotation.DateTimeFormat;
|
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
@@ -49,11 +48,10 @@ public class PublicTodo implements Serializable {
|
|||||||
private String category;
|
private String category;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 截止日期
|
* 截止日期(yyyy-MM-dd)
|
||||||
|
* 用 String 映射 DATE 列:字符串往返不经 JDBC 时区换算,避免差一天
|
||||||
*/
|
*/
|
||||||
@DateTimeFormat(pattern = "yyyy-MM-dd")
|
private String dueDate;
|
||||||
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
|
|
||||||
private Date dueDate;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 状态:0未完成 1已完成
|
* 状态:0未完成 1已完成
|
||||||
|
|||||||
Reference in New Issue
Block a user