fix(public-todo): dueDate 改 String 映射,修复截止日期差一天
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:
张家训
2026-10-20 15:09:31 +08:00
parent 6076895959
commit 8d97510bc9
2 changed files with 14 additions and 7 deletions
@@ -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已完成