Conan
Conan
发布于 2024-01-30 / 73 阅读
0
0

Microsoft Graph API请求 outlook相关操作-世纪互联

先看上篇获取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;
      }
    }
  }


评论