孟苏慧

Merge branch 'feat/nongxin-notifications' into 'master'

fix: 订餐提醒日期fix



See merge request !16
......@@ -12,6 +12,10 @@ import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
......@@ -76,7 +80,7 @@ public class OrderReminderTask {
/**
* 每周一 9:00 执行订餐提醒推送
*/
@Scheduled(cron = "${task.orderReminder.cron:0 0 9 * * MON}")
@Scheduled(cron = "${task.orderReminder.cron:0 0 9 * * MON}", zone = "Asia/Shanghai")
public void executeTask() {
log.info("OrderReminderTask started");
......@@ -178,7 +182,9 @@ public class OrderReminderTask {
/**
* 从配送规则配置中获取订餐时间配置
* 返回订餐时间,格式:yyyy年MM月dd日 HH:mm~HH:mm
* 根据配送规则中的星期开关(monday~sunday)计算本周对应的具体日期,
* 第一个启用的星期作为开始日期,最后一个启用的星期作为结束日期。
* 返回订餐时间,格式:yyyy年MM月dd日 HH:mm~yyyy年MM月dd日 HH:mm
*/
private OrderTimeConfig getOrderTimeConfigFromRule() {
try {
......@@ -197,18 +203,42 @@ public class OrderReminderTask {
return null;
}
// 根据配置中的星期开关,收集所有启用的星期
final List<DayOfWeek> enabledDays = new ArrayList<>();
if (cfg.getMonday()) enabledDays.add(DayOfWeek.MONDAY);
if (cfg.getTuesday()) enabledDays.add(DayOfWeek.TUESDAY);
if (cfg.getWednesday()) enabledDays.add(DayOfWeek.WEDNESDAY);
if (cfg.getThursday()) enabledDays.add(DayOfWeek.THURSDAY);
if (cfg.getFriday()) enabledDays.add(DayOfWeek.FRIDAY);
if (cfg.getSaturday()) enabledDays.add(DayOfWeek.SATURDAY);
if (cfg.getSunday()) enabledDays.add(DayOfWeek.SUNDAY);
if (enabledDays.isEmpty()) {
log.warn("Delivery rule has no enabled days");
return null;
}
// 格式化时间(去掉秒)
String startTime = formatTime(startTimeStr);
String endTime = formatTime(endTimeStr);
// 获取当前日期,格式化为 yyyy年MM月dd日 HH:mm
java.time.LocalDate today = java.time.LocalDate.now();
java.time.format.DateTimeFormatter dateFormatter = java.time.format.DateTimeFormatter.ofPattern("yyyy年MM月dd日");
String dateStr = today.format(dateFormatter);
// 根据脚本执行日期计算本周对应星期的具体日期
final ZoneId zone = ZoneId.of("Asia/Shanghai");
final LocalDate today = LocalDate.now(zone);
final DayOfWeek firstEnabledDay = Collections.min(enabledDays);
final DayOfWeek lastEnabledDay = Collections.max(enabledDays);
// 返回订餐时间,格式:yyyy年MM月dd日 HH:mm~yyyy年MM月dd日 HH:mm
String orderTime = dateStr + " " + startTime + "~" + dateStr + " " + endTime;
// 计算本周对应星期的日期(以本周一为基准)
final LocalDate mondayOfThisWeek = today.with(DayOfWeek.MONDAY);
final LocalDate startDate = mondayOfThisWeek.plusDays(firstEnabledDay.getValue() - 1L);
final LocalDate endDate = mondayOfThisWeek.plusDays(lastEnabledDay.getValue() - 1L);
final DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
String startDateStr = startDate.format(dateFormatter);
String endDateStr = endDate.format(dateFormatter);
// 返回订餐时间,格式:yyyy年MM月dd日 HH:mm~yyyy年MM月dd日 HH:mm
String orderTime = startDateStr + " " + startTime + "~" + endDateStr + " " + endTime;
return new OrderTimeConfig(orderTime);
} catch (Exception e) {
......