@@ -26,12 +26,15 @@ public class OapiWorkPlanController {
|
|||||||
private IWorkPlanService workPlanService;
|
private IWorkPlanService workPlanService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取本周安排(当前学年学期当前周,全校数据)。
|
* 获取一周安排(当前学年学期,全校数据)。
|
||||||
* 返回结构:标题 + 周一~周日 7 天安排 + 周备注 + hasData。
|
* week 为相对本周偏移:0=本周(默认)、-1=上一周、+1=下周,
|
||||||
|
* 负向至学期第 1 周、正向至学期最后一周,越界报错并提示范围(响应亦带 minWeek/maxWeek)。
|
||||||
|
* 返回结构:标题 + 周一~周日 7 天安排 + 周备注 + hasData + 范围提示。
|
||||||
*/
|
*/
|
||||||
@GetMapping("/Get")
|
@GetMapping("/Get")
|
||||||
public OapiWeekPlanVo get(@RequestParam("userid") Integer userId,
|
public OapiWeekPlanVo get(@RequestParam("userid") Integer userId,
|
||||||
@RequestParam("schId") Integer schId) {
|
@RequestParam("schId") Integer schId,
|
||||||
return workPlanService.oapiOneWeekPlan(userId, schId);
|
@RequestParam(value = "week", required = false) Integer week) {
|
||||||
|
return workPlanService.oapiOneWeekPlan(userId, schId, week);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,4 +34,10 @@ public class OapiWeekPlanVo {
|
|||||||
|
|
||||||
/** 本周是否已有安排数据 */
|
/** 本周是否已有安排数据 */
|
||||||
private boolean hasData;
|
private boolean hasData;
|
||||||
|
|
||||||
|
/** week 参数允许的最小偏移(指向学期第 1 周):0=本周,负=往前 */
|
||||||
|
private Integer minWeek;
|
||||||
|
|
||||||
|
/** week 参数允许的最大偏移(指向学期最后一周):正=往后 */
|
||||||
|
private Integer maxWeek;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -34,11 +34,12 @@ public interface IWorkPlanService {
|
|||||||
OneWeekPlanVo getOneWeekPlan(Integer year, Integer term, Integer week);
|
OneWeekPlanVo getOneWeekPlan(Integer year, Integer term, Integer week);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 开放接口:获取本周安排(当前学年学期当前周,服务端推算周次)。
|
* 开放接口:获取一周安排(当前学年学期;week 为相对本周偏移,0=本周默认、-1=上一周、+1=下周)。
|
||||||
* <p>身份由调用方显式传入(不依赖登录态);周安排为全校共享数据,无角色概念,
|
* <p>身份由调用方显式传入(不依赖登录态);周安排为全校共享数据,无角色概念,
|
||||||
* 返回内容不因调用方不同(见 {@link OapiWeekPlanVo},不含权限标记)。</p>
|
* 返回内容不因调用方不同(见 {@link OapiWeekPlanVo},不含权限标记,
|
||||||
|
* minWeek/maxWeek 提示 week 合法范围)。</p>
|
||||||
*/
|
*/
|
||||||
OapiWeekPlanVo oapiOneWeekPlan(Integer userId, Integer schId);
|
OapiWeekPlanVo oapiOneWeekPlan(Integer userId, Integer schId, Integer week);
|
||||||
|
|
||||||
/** 编辑视图(本周安排行列表,含 editable 标记) */
|
/** 编辑视图(本周安排行列表,含 editable 标记) */
|
||||||
List<WorkPlanItemVo> getEditList(Integer year, Integer term, Integer week);
|
List<WorkPlanItemVo> getEditList(Integer year, Integer term, Integer week);
|
||||||
|
|||||||
@@ -141,18 +141,26 @@ public class WorkPlanService implements IWorkPlanService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public OapiWeekPlanVo oapiOneWeekPlan(Integer userId, Integer schId) {
|
public OapiWeekPlanVo oapiOneWeekPlan(Integer userId, Integer schId, Integer week) {
|
||||||
if (schId == null) {
|
if (schId == null) {
|
||||||
throw new BizException(ErrorCode.PARAM_ERROR, "schId 不能为空");
|
throw new BizException(ErrorCode.PARAM_ERROR, "schId 不能为空");
|
||||||
}
|
}
|
||||||
int year = nowSchoolYear();
|
int year = nowSchoolYear();
|
||||||
int term = nowSchoolTerm();
|
int term = nowSchoolTerm();
|
||||||
// 当前周次:与站内周次下拉的 current 口径一致(包含今天的那一周,周一为一周之始);
|
// 本周:与站内周次下拉的 current 口径一致(包含今天的那一周,周一为一周之始);
|
||||||
// 早于首周(如假期)按第 1 周
|
// 早于首周(如假期)按第 1 周
|
||||||
LocalDate firstDay = resolveFirstDay(schId, year, term);
|
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(权限标记不外发)
|
// 全校共享数据,开放接口无角色概念: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();
|
OapiWeekPlanVo vo = new OapiWeekPlanVo();
|
||||||
vo.setTitle(view.getTitle());
|
vo.setTitle(view.getTitle());
|
||||||
@@ -163,9 +171,20 @@ public class WorkPlanService implements IWorkPlanService {
|
|||||||
vo.setDays(view.getDays());
|
vo.setDays(view.getDays());
|
||||||
vo.setRemark(view.getRemark());
|
vo.setRemark(view.getRemark());
|
||||||
vo.setHasData(view.isHasData());
|
vo.setHasData(view.isHasData());
|
||||||
|
vo.setMinWeek(minWeek);
|
||||||
|
vo.setMaxWeek(maxWeek);
|
||||||
return vo;
|
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 口径) */
|
/** 周视图构建(站内 OneWeekPlan 与 oapi 本周安排共用;managerView 对应站内 canEditAll 口径) */
|
||||||
private OneWeekPlanVo buildWeekView(Integer schId, boolean managerView, Integer year, Integer term, Integer week) {
|
private OneWeekPlanVo buildWeekView(Integer schId, boolean managerView, Integer year, Integer term, Integer week) {
|
||||||
checkYearTerm(year, term);
|
checkYearTerm(year, term);
|
||||||
|
|||||||
Reference in New Issue
Block a user