From 420335bce1deb15bce918262d491e9900325f5c5 Mon Sep 17 00:00:00 2001 From: wanghu Date: Thu, 15 Oct 2026 12:21:26 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E5=91=A8=E4=B8=8B=E5=91=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../oapi/OapiWorkPlanController.java | 11 +++++--- .../model/workplan/OapiWeekPlanVo.java | 6 +++++ .../service/IWorkPlanService.java | 7 ++--- .../service/impl/WorkPlanService.java | 27 ++++++++++++++++--- 4 files changed, 40 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/yunhai/workweekplan/controller/oapi/OapiWorkPlanController.java b/src/main/java/com/yunhai/workweekplan/controller/oapi/OapiWorkPlanController.java index 4b60940..e7142b3 100644 --- a/src/main/java/com/yunhai/workweekplan/controller/oapi/OapiWorkPlanController.java +++ b/src/main/java/com/yunhai/workweekplan/controller/oapi/OapiWorkPlanController.java @@ -26,12 +26,15 @@ public class OapiWorkPlanController { private IWorkPlanService workPlanService; /** - * 获取本周安排(当前学年学期当前周,全校数据)。 - * 返回结构:标题 + 周一~周日 7 天安排 + 周备注 + hasData。 + * 获取一周安排(当前学年学期,全校数据)。 + * week 为相对本周偏移:0=本周(默认)、-1=上一周、+1=下周, + * 负向至学期第 1 周、正向至学期最后一周,越界报错并提示范围(响应亦带 minWeek/maxWeek)。 + * 返回结构:标题 + 周一~周日 7 天安排 + 周备注 + hasData + 范围提示。 */ @GetMapping("/Get") public OapiWeekPlanVo get(@RequestParam("userid") Integer userId, - @RequestParam("schId") Integer schId) { - return workPlanService.oapiOneWeekPlan(userId, schId); + @RequestParam("schId") Integer schId, + @RequestParam(value = "week", required = false) Integer week) { + return workPlanService.oapiOneWeekPlan(userId, schId, week); } } diff --git a/src/main/java/com/yunhai/workweekplan/model/workplan/OapiWeekPlanVo.java b/src/main/java/com/yunhai/workweekplan/model/workplan/OapiWeekPlanVo.java index e8712fd..488e18d 100644 --- a/src/main/java/com/yunhai/workweekplan/model/workplan/OapiWeekPlanVo.java +++ b/src/main/java/com/yunhai/workweekplan/model/workplan/OapiWeekPlanVo.java @@ -34,4 +34,10 @@ public class OapiWeekPlanVo { /** 本周是否已有安排数据 */ private boolean hasData; + + /** week 参数允许的最小偏移(指向学期第 1 周):0=本周,负=往前 */ + private Integer minWeek; + + /** week 参数允许的最大偏移(指向学期最后一周):正=往后 */ + private Integer maxWeek; } diff --git a/src/main/java/com/yunhai/workweekplan/service/IWorkPlanService.java b/src/main/java/com/yunhai/workweekplan/service/IWorkPlanService.java index 8b4a948..c459df1 100644 --- a/src/main/java/com/yunhai/workweekplan/service/IWorkPlanService.java +++ b/src/main/java/com/yunhai/workweekplan/service/IWorkPlanService.java @@ -34,11 +34,12 @@ public interface IWorkPlanService { OneWeekPlanVo getOneWeekPlan(Integer year, Integer term, Integer week); /** - * 开放接口:获取本周安排(当前学年学期当前周,服务端推算周次)。 + * 开放接口:获取一周安排(当前学年学期;week 为相对本周偏移,0=本周默认、-1=上一周、+1=下周)。 *

身份由调用方显式传入(不依赖登录态);周安排为全校共享数据,无角色概念, - * 返回内容不因调用方不同(见 {@link OapiWeekPlanVo},不含权限标记)。

+ * 返回内容不因调用方不同(见 {@link OapiWeekPlanVo},不含权限标记, + * minWeek/maxWeek 提示 week 合法范围)。

*/ - OapiWeekPlanVo oapiOneWeekPlan(Integer userId, Integer schId); + OapiWeekPlanVo oapiOneWeekPlan(Integer userId, Integer schId, Integer week); /** 编辑视图(本周安排行列表,含 editable 标记) */ List getEditList(Integer year, Integer term, Integer week); diff --git a/src/main/java/com/yunhai/workweekplan/service/impl/WorkPlanService.java b/src/main/java/com/yunhai/workweekplan/service/impl/WorkPlanService.java index bf3c7f7..87ba9f3 100644 --- a/src/main/java/com/yunhai/workweekplan/service/impl/WorkPlanService.java +++ b/src/main/java/com/yunhai/workweekplan/service/impl/WorkPlanService.java @@ -141,18 +141,26 @@ public class WorkPlanService implements IWorkPlanService { } @Override - public OapiWeekPlanVo oapiOneWeekPlan(Integer userId, Integer schId) { + public OapiWeekPlanVo oapiOneWeekPlan(Integer userId, Integer schId, Integer week) { if (schId == null) { throw new BizException(ErrorCode.PARAM_ERROR, "schId 不能为空"); } int year = nowSchoolYear(); int term = nowSchoolTerm(); - // 当前周次:与站内周次下拉的 current 口径一致(包含今天的那一周,周一为一周之始); + // 本周:与站内周次下拉的 current 口径一致(包含今天的那一周,周一为一周之始); // 早于首周(如假期)按第 1 周 LocalDate firstDay = resolveFirstDay(schId, year, term); - int week = (int) (ChronoUnit.DAYS.between(firstDay, LocalDate.now()) / 7) + 1; + int currentWeek = Math.max((int) (ChronoUnit.DAYS.between(firstDay, LocalDate.now()) / 7) + 1, 1); + // week 为相对本周的偏移:0=本周(默认)、-1=上一周、+1=下周, + // 负向到学期第 1 周、正向到学期最后一周(边界同周次下拉 getWeektime) + int minWeek = 1 - currentWeek; + int maxWeek = lastWeekOf(year, term, firstDay) - currentWeek; + if (week != null && week != 0 && (week < minWeek || week > maxWeek)) { + throw new BizException(ErrorCode.PARAM_ERROR, + "week 超出范围:最小 " + minWeek + "(学期第1周),最大 " + maxWeek + "(学期第" + (currentWeek + maxWeek) + "周)"); + } // 全校共享数据,开放接口无角色概念:managerView 恒 false(权限标记不外发) - OneWeekPlanVo view = buildWeekView(schId, false, year, term, Math.max(week, 1)); + OneWeekPlanVo view = buildWeekView(schId, false, year, term, currentWeek + (week == null ? 0 : week)); OapiWeekPlanVo vo = new OapiWeekPlanVo(); vo.setTitle(view.getTitle()); @@ -163,9 +171,20 @@ public class WorkPlanService implements IWorkPlanService { vo.setDays(view.getDays()); vo.setRemark(view.getRemark()); vo.setHasData(view.isHasData()); + vo.setMinWeek(minWeek); + vo.setMaxWeek(maxWeek); return vo; } + /** 学期最后一周周次:首周周一起、不超过学期结束日的周数(边界同 getWeektime) */ + private int lastWeekOf(Integer year, Integer term, LocalDate firstDay) { + int week = 0; + while (!firstDay.plusDays(week * 7L).isAfter(termEndDate(year, term))) { + week++; + } + return week; + } + /** 周视图构建(站内 OneWeekPlan 与 oapi 本周安排共用;managerView 对应站内 canEditAll 口径) */ private OneWeekPlanVo buildWeekView(Integer schId, boolean managerView, Integer year, Integer term, Integer week) { checkYearTerm(year, term);