Jiaqi Xia

fix: 订餐提醒日期fix

...@@ -12,6 +12,10 @@ import org.springframework.beans.factory.annotation.Qualifier; ...@@ -12,6 +12,10 @@ import org.springframework.beans.factory.annotation.Qualifier;
12 import org.springframework.scheduling.annotation.Scheduled; 12 import org.springframework.scheduling.annotation.Scheduled;
13 import org.springframework.stereotype.Component; 13 import org.springframework.stereotype.Component;
14 14
15 +import java.time.DayOfWeek;
16 +import java.time.LocalDate;
17 +import java.time.ZoneId;
18 +import java.time.format.DateTimeFormatter;
15 import java.util.ArrayList; 19 import java.util.ArrayList;
16 import java.util.Collections; 20 import java.util.Collections;
17 import java.util.List; 21 import java.util.List;
...@@ -76,7 +80,7 @@ public class OrderReminderTask { ...@@ -76,7 +80,7 @@ public class OrderReminderTask {
76 /** 80 /**
77 * 每周一 9:00 执行订餐提醒推送 81 * 每周一 9:00 执行订餐提醒推送
78 */ 82 */
79 - @Scheduled(cron = "${task.orderReminder.cron:0 0 9 * * MON}") 83 + @Scheduled(cron = "${task.orderReminder.cron:0 0 9 * * MON}", zone = "Asia/Shanghai")
80 public void executeTask() { 84 public void executeTask() {
81 log.info("OrderReminderTask started"); 85 log.info("OrderReminderTask started");
82 86
...@@ -178,7 +182,9 @@ public class OrderReminderTask { ...@@ -178,7 +182,9 @@ public class OrderReminderTask {
178 182
179 /** 183 /**
180 * 从配送规则配置中获取订餐时间配置 184 * 从配送规则配置中获取订餐时间配置
181 - * 返回订餐时间,格式:yyyy年MM月dd日 HH:mm~HH:mm 185 + * 根据配送规则中的星期开关(monday~sunday)计算本周对应的具体日期,
186 + * 第一个启用的星期作为开始日期,最后一个启用的星期作为结束日期。
187 + * 返回订餐时间,格式:yyyy年MM月dd日 HH:mm~yyyy年MM月dd日 HH:mm
182 */ 188 */
183 private OrderTimeConfig getOrderTimeConfigFromRule() { 189 private OrderTimeConfig getOrderTimeConfigFromRule() {
184 try { 190 try {
...@@ -197,18 +203,42 @@ public class OrderReminderTask { ...@@ -197,18 +203,42 @@ public class OrderReminderTask {
197 return null; 203 return null;
198 } 204 }
199 205
206 + // 根据配置中的星期开关,收集所有启用的星期
207 + final List<DayOfWeek> enabledDays = new ArrayList<>();
208 + if (cfg.getMonday()) enabledDays.add(DayOfWeek.MONDAY);
209 + if (cfg.getTuesday()) enabledDays.add(DayOfWeek.TUESDAY);
210 + if (cfg.getWednesday()) enabledDays.add(DayOfWeek.WEDNESDAY);
211 + if (cfg.getThursday()) enabledDays.add(DayOfWeek.THURSDAY);
212 + if (cfg.getFriday()) enabledDays.add(DayOfWeek.FRIDAY);
213 + if (cfg.getSaturday()) enabledDays.add(DayOfWeek.SATURDAY);
214 + if (cfg.getSunday()) enabledDays.add(DayOfWeek.SUNDAY);
215 +
216 + if (enabledDays.isEmpty()) {
217 + log.warn("Delivery rule has no enabled days");
218 + return null;
219 + }
220 +
200 // 格式化时间(去掉秒) 221 // 格式化时间(去掉秒)
201 String startTime = formatTime(startTimeStr); 222 String startTime = formatTime(startTimeStr);
202 String endTime = formatTime(endTimeStr); 223 String endTime = formatTime(endTimeStr);
203 224
204 - // 获取当前日期,格式化为 yyyy年MM月dd日 HH:mm 225 + // 根据脚本执行日期计算本周对应星期的具体日期
205 - java.time.LocalDate today = java.time.LocalDate.now(); 226 + final ZoneId zone = ZoneId.of("Asia/Shanghai");
206 - java.time.format.DateTimeFormatter dateFormatter = java.time.format.DateTimeFormatter.ofPattern("yyyy年MM月dd日"); 227 + final LocalDate today = LocalDate.now(zone);
207 - String dateStr = today.format(dateFormatter); 228 + final DayOfWeek firstEnabledDay = Collections.min(enabledDays);
229 + final DayOfWeek lastEnabledDay = Collections.max(enabledDays);
230 +
231 + // 计算本周对应星期的日期(以本周一为基准)
232 + final LocalDate mondayOfThisWeek = today.with(DayOfWeek.MONDAY);
233 + final LocalDate startDate = mondayOfThisWeek.plusDays(firstEnabledDay.getValue() - 1L);
234 + final LocalDate endDate = mondayOfThisWeek.plusDays(lastEnabledDay.getValue() - 1L);
235 +
236 + final DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
237 + String startDateStr = startDate.format(dateFormatter);
238 + String endDateStr = endDate.format(dateFormatter);
208 239
209 // 返回订餐时间,格式:yyyy年MM月dd日 HH:mm~yyyy年MM月dd日 HH:mm 240 // 返回订餐时间,格式:yyyy年MM月dd日 HH:mm~yyyy年MM月dd日 HH:mm
210 - String orderTime = dateStr + " " + startTime + "~" + dateStr + " " + endTime; 241 + String orderTime = startDateStr + " " + startTime + "~" + endDateStr + " " + endTime;
211 -
212 return new OrderTimeConfig(orderTime); 242 return new OrderTimeConfig(orderTime);
213 243
214 } catch (Exception e) { 244 } catch (Exception e) {
......