先看上篇获取oauth2 文章:
获取会议室日程-判断是否闲忙:
public List<OutlookGetScheduleRespBO> getOutlookSchedule(
String userEmail, List<String> roomEmails, LocalDateTime startAt, LocalDateTime endAt) {
String token = getOutlookToken();
HttpRequest request =
HttpUtil.createPost(
xxx.getOutlook().getHost()
+ "/v1.0/users/"
+ userEmail
+ "/calendar/getschedule")
.setConnectionTimeout(10000)
.setConnectionTimeout(20000)
.header(Header.AUTHORIZATION, "Bearer " + token)
.header("Prefer", xxx.getOutlook().getRespPreferText());
OutlookGetScheduleReqBO reqBO =
new OutlookGetScheduleReqBO()
.setSchedules(roomEmails)
.setStartTime(
new Time()
.setDateTime(
LocalDateTimeUtils.localDateTimeToUtc(
startAt, DatePattern.UTC_SIMPLE_PATTERN))
.setTimeZone("UTC"))
.setEndTime(
new Time()
.setDateTime(
LocalDateTimeUtils.localDateTimeToUtc(
endAt, DatePattern.UTC_SIMPLE_PATTERN))
.setTimeZone("UTC"))
.setAvailabilityViewInterval(15);
request.body(JSONUtil.toJsonStr(reqBO));
return JSONUtil.parseObj(outlookResponseFun("outlook获取会议室日程(是否繁忙)", "", request))
.getJSONArray("value")
.toList(OutlookGetScheduleRespBO.class);
}
获取用户日程
public List<OutlookCalendarViewRespBO> getOutlookUserCalendarView(
String empName, String email, LocalDateTime startAt, LocalDateTime endAt) {
HttpRequest request =
HttpUtil.createGet(
xxx.getOutlook().getHost() + "/v1.0/users/" + email + "/calendarview")
.setConnectionTimeout(10000)
.setConnectionTimeout(20000)
.header(Header.AUTHORIZATION, "Bearer " + getOutlookToken())
.header("Prefer", xxx.getOutlook().getRespPreferText());
Map<String, Object> map = Maps.newHashMapWithExpectedSize(2);
map.put(
"startDateTime",
LocalDateTimeUtils.localDateTimeToUtc(startAt, DatePattern.UTC_SIMPLE_PATTERN));
map.put(
"endDateTime",
LocalDateTimeUtils.localDateTimeToUtc(endAt, DatePattern.UTC_SIMPLE_PATTERN));
request.form(map);
List<OutlookCalendarViewRespBO> list =
JSONUtil.parseObj(
outlookResponseFun("outlook获取用户会议室日程视图", JSONUtil.toJsonStr(map), request))
.getJSONArray("value")
.toList(OutlookCalendarViewRespBO.class);
list.forEach(
l -> {
l.getStart()
.setAt(
LocalDateTimeUtils.utcToLocalDateTime(
l.getStart().getDateTime(), "yyyy-MM-dd'T'HH:mm:ss.SSSSSSS"));
l.getEnd()
.setAt(
LocalDateTimeUtils.utcToLocalDateTime(
l.getEnd().getDateTime(), "yyyy-MM-dd'T'HH:mm:ss.SSSSSSS"));
});
// 按开始时间顺序排序
list = CollUtil.sort(list, Comparator.comparing(o -> o.getStart().getAt()));
log.info(
"outlook获取用户指定时间段内日程-{}-{},全部的议程事件主题有:{}",
empName,
email,
list.stream().map(OutlookCalendarViewRespBO::getSubject).collect(Collectors.toList()));
return list;
}
创建会议室议程:
public ShiseidoOutlookCreateEventsVO createOutlookEvents(
Long employeeId,
String userEmail,
String jobNumber,
String subject,
String roomEmail,
String displayName,
LocalDateTime startAt,
LocalDateTime endAt) {
String token = getOutlookToken();
HttpRequest request =
HttpUtil.createPost(
shiseidoConfig.getOutlook().getHost() + "/v1.0/users/" + userEmail + "/events")
.setConnectionTimeout(10000)
.setConnectionTimeout(20000)
.header(Header.AUTHORIZATION, "Bearer " + token)
.header("Prefer", shiseidoConfig.getOutlook().getRespPreferText());
ShiseidoOutlookCreateEventsDTO dto = new ShiseidoOutlookCreateEventsDTO();
dto.setSubject(subject)
.setBody(new BodyDTO().setContentType("TEXT").setContent(""))
.setStart(
new TimeDTO()
.setTimeZone("UTC")
.setDateTime(
LocalDateTimeUtils.localDateTimeToUtc(startAt, DatePattern.UTC_SIMPLE_PATTERN)))
.setEnd(
new TimeDTO()
.setTimeZone("UTC")
.setDateTime(
LocalDateTimeUtils.localDateTimeToUtc(endAt, DatePattern.UTC_SIMPLE_PATTERN)))
.setLocation(new LocationDTO().setDisplayName(displayName))
.setAttendees(
ListUtil.of(
new AttendeesDTO()
.setEmailAddress(
new EmailAddressDTO().setAddress(roomEmail).setName(displayName))
.setType("resource")));
ShiseidoOutlookCreateEventsVO vo =
JSONUtil.toBean(
outlookResponseFun("outlook创建会议室", "", request.body(JSONUtil.toJsonStr(dto))),
ShiseidoOutlookCreateEventsVO.class);
shiseidoOutlookCalendarEventsMapper.insert(
new ShiseidoOutlookCalendarEvents()
.setEmployeeId(employeeId)
.setJobNumber(jobNumber)
.setUserEmail(userEmail)
.setEmail(roomEmail)
.setEventsId(vo.getId())
.setSubject(subject)
.setLocationDisplayName(vo.getLocation().getDisplayName())
.setStartAt(startAt)
.setEndAt(endAt)
.setHasPushed(Boolean.FALSE)
.setHasCreated(Boolean.FALSE));
return vo;
}
相关工具类几方法
public static String localDateTimeToUtc(LocalDateTime asiaTime, String utcFormat){
// 将本地时间转换为UTC时间
ZonedDateTime zonedDateTime = asiaTime.atZone(ZoneId.systemDefault());
ZonedDateTime utcDateTime = zonedDateTime.withZoneSameInstant(ZoneId.of("UTC"));
return utcDateTime.format(DateTimeFormatter.ofPattern(utcFormat));
}
private static String outlookResponseFun(
String requestDesc, String paramStr, HttpRequest request) {
try (HttpResponse response = request.execute()) {
String body = response.body();
if (HttpStatus.HTTP_OK != response.getStatus()
&& HttpStatus.HTTP_CREATED != response.getStatus()) {
log.error(
"{}响应异常:\n请求:{}\n响应:{}",
requestDesc,
(StrUtil.isBlank(paramStr)
? StrUtil.format("{}", request.toString())
: StrUtil.format("{}\nRequest Body:{}", request.toString(), paramStr)),
body);
if (HttpStatus.HTTP_NOT_FOUND == response.getStatus()) {
throw new BusinessException(ErrorCodeMsgEnums.PARAM_LOSE_ERROR, "用户邮箱无效,请检查后再试");
} else if (HttpStatus.HTTP_UNAUTHORIZED == response.getStatus()) {
throw new BusinessException(ErrorCodeMsgEnums.SYSTEM_ERROR, "Outlook Token校验失败,请稍后再试");
} else {
throw new BusinessException(ErrorCodeMsgEnums.SYSTEM_ERROR);
}
} else {
return body;
}
}
}