# 场景示例

飞书开放平台基于 SDK，封装了常用的 API 组合调用及业务场景示例供你参考。在 [oapi-sdk-java-demo](https://github.com/larksuite/oapi-sdk-java-demo) 中包含了以下多种场景示例代码。

###  [发送文件消息](https://github.com/larksuite/oapi-sdk-java-demo/blob/main/src/main/java/com/larksuite/oapi/composite_api/im/Im.java)

```java 
package com.larksuite.oapi.composite_api.im;

import com.lark.oapi.Client;
import com.lark.oapi.core.response.BaseResponse;
import com.lark.oapi.core.utils.Jsons;
import com.lark.oapi.service.im.v1.model.*;

public class Im {

/**
     * 发送文件消息，使用到两个OpenAPI：
     * 1. [上传文件]([...](https://open.feishu.cn/document/server-docs/im-v1/file/create))
     * 2. [发送消息]([...](https://open.feishu.cn/document/server-docs/im-v1/message/create))
     */
    public static BaseResponse<?> sendFile(Client client, SendFileRequest request) throws Exception {
        // 上传文件
        CreateFileReq createFileReq = CreateFileReq.newBuilder()
                .createFileReqBody(CreateFileReqBody.newBuilder()
                        .fileType(request.getFileType())
                        .fileName(request.getFileName())
                        .duration(request.getDuration())
                        .file(request.getFile())
                        .build())
                .build();

CreateFileResp createFileResp = client.im().file().create(createFileReq);
        if (!createFileResp.success()) {
            System.out.printf("client.im.file.create failed, code: %d, msg: %s, logId: %s%n",
                    createFileResp.getCode(), createFileResp.getMsg(), createFileResp.getRequestId());
            return createFileResp;
        }

// 发送消息
        CreateMessageReq createMessageReq = CreateMessageReq.newBuilder()
                .receiveIdType(request.getReceiveIdType())
                .createMessageReqBody(CreateMessageReqBody.newBuilder()
                        .receiveId(request.getReceiveId())
                        .msgType("file")
                        .content(Jsons.DEFAULT.toJson(createFileResp.getData()))
                        .uuid(request.getUuid())
                        .build())
                .build();

CreateMessageResp createMessageResp = client.im().message().create(createMessageReq);
        if (!createMessageResp.success()) {
            System.out.printf("client.im.message.create failed, code: %d, msg: %s, logId: %s%n",
                    createMessageResp.getCode(), createMessageResp.getMsg(), createMessageResp.getRequestId());
            return createMessageResp;
        }

// 返回结果
        SendFileResponse response = new SendFileResponse();
        response.setCode(0);
        response.setMsg("success");
        response.setCreateFileResponse(createFileResp.getData());
        response.setCreateMessageResponse(createMessageResp.getData());

return response;
    }

/**
     * 发送图片消息，使用到两个OpenAPI：
     * 1. [上传图片]([...](https://open.feishu.cn/document/server-docs/im-v1/image/create))
     * 2. [发送消息]([...](https://open.feishu.cn/document/server-docs/im-v1/message/create))
     */
    public static BaseResponse<?> sendImage(Client client, SendImageRequest request) throws Exception {
        // 上传图片
        CreateImageReq req = CreateImageReq.newBuilder()
                .createImageReqBody(CreateImageReqBody.newBuilder()
                        .imageType("message")
                        .image(request.getImage())
                        .build())
                .build();

CreateImageResp createImageResp = client.im().image().create(req);
        if (!createImageResp.success()) {
            System.out.printf("client.im.image.create failed, code: %d, msg: %s, logId: %s%n",
                    createImageResp.getCode(), createImageResp.getMsg(), createImageResp.getRequestId());
            return createImageResp;
        }

// 发送消息
        CreateMessageReq createMessageReq = CreateMessageReq.newBuilder()
                .receiveIdType(request.getReceiveIdType())
                .createMessageReqBody(CreateMessageReqBody.newBuilder()
                        .receiveId(request.getReceiveId())
                        .msgType("image")
                        .content(Jsons.DEFAULT.toJson(createImageResp.getData()))
                        .uuid(request.getUuid())
                        .build())
                .build();

CreateMessageResp createMessageResp = client.im().message().create(createMessageReq);
        if (!createMessageResp.success()) {
            System.out.printf("client.im.message.create failed, code: %d, msg: %s, logId: %s%n",
                    createMessageResp.getCode(), createMessageResp.getMsg(), createMessageResp.getRequestId());
            return createMessageResp;
        }

// 返回结果
        SendImageResponse response = new SendImageResponse();
        response.setCode(0);
        response.setMsg("success");
        response.setCreateImageResponse(createImageResp.getData());
        response.setCreateMessageResponse(createMessageResp.getData());

return response;
    }
}
```

### [发送图片消息](https://github.com/larksuite/oapi-sdk-java-demo/blob/main/src/main/java/com/larksuite/oapi/composite_api/im/Im.java)

```java
package com.larksuite.oapi.composite_api.im;

import com.lark.oapi.Client;
import com.lark.oapi.core.response.BaseResponse;
import com.lark.oapi.core.utils.Jsons;
import com.lark.oapi.service.im.v1.model.*;

public class Im {

/**
     * 发送文件消息，使用到两个OpenAPI：
     * 1. [上传文件]([...](https://open.feishu.cn/document/server-docs/im-v1/file/create))
     * 2. [发送消息]([...](https://open.feishu.cn/document/server-docs/im-v1/message/create))
     */
    public static BaseResponse<?> sendFile(Client client, SendFileRequest request) throws Exception {
        // 上传文件
        CreateFileReq createFileReq = CreateFileReq.newBuilder()
                .createFileReqBody(CreateFileReqBody.newBuilder()
                        .fileType(request.getFileType())
                        .fileName(request.getFileName())
                        .duration(request.getDuration())
                        .file(request.getFile())
                        .build())
                .build();

CreateFileResp createFileResp = client.im().file().create(createFileReq);
        if (!createFileResp.success()) {
            System.out.printf("client.im.file.create failed, code: %d, msg: %s, logId: %s%n",
                    createFileResp.getCode(), createFileResp.getMsg(), createFileResp.getRequestId());
            return createFileResp;
        }

// 发送消息
        CreateMessageReq createMessageReq = CreateMessageReq.newBuilder()
                .receiveIdType(request.getReceiveIdType())
                .createMessageReqBody(CreateMessageReqBody.newBuilder()
                        .receiveId(request.getReceiveId())
                        .msgType("file")
                        .content(Jsons.DEFAULT.toJson(createFileResp.getData()))
                        .uuid(request.getUuid())
                        .build())
                .build();

CreateMessageResp createMessageResp = client.im().message().create(createMessageReq);
        if (!createMessageResp.success()) {
            System.out.printf("client.im.message.create failed, code: %d, msg: %s, logId: %s%n",
                    createMessageResp.getCode(), createMessageResp.getMsg(), createMessageResp.getRequestId());
            return createMessageResp;
        }

// 返回结果
        SendFileResponse response = new SendFileResponse();
        response.setCode(0);
        response.setMsg("success");
        response.setCreateFileResponse(createFileResp.getData());
        response.setCreateMessageResponse(createMessageResp.getData());

return response;
    }

/**
     * 发送图片消息，使用到两个OpenAPI：
     * 1. [上传图片]([...](https://open.feishu.cn/document/server-docs/im-v1/image/create))
     * 2. [发送消息]([...](https://open.feishu.cn/document/server-docs/im-v1/message/create))
     */
    public static BaseResponse<?> sendImage(Client client, SendImageRequest request) throws Exception {
        // 上传图片
        CreateImageReq req = CreateImageReq.newBuilder()
                .createImageReqBody(CreateImageReqBody.newBuilder()
                        .imageType("message")
                        .image(request.getImage())
                        .build())
                .build();

CreateImageResp createImageResp = client.im().image().create(req);
        if (!createImageResp.success()) {
            System.out.printf("client.im.image.create failed, code: %d, msg: %s, logId: %s%n",
                    createImageResp.getCode(), createImageResp.getMsg(), createImageResp.getRequestId());
            return createImageResp;
        }

// 发送消息
        CreateMessageReq createMessageReq = CreateMessageReq.newBuilder()
                .receiveIdType(request.getReceiveIdType())
                .createMessageReqBody(CreateMessageReqBody.newBuilder()
                        .receiveId(request.getReceiveId())
                        .msgType("image")
                        .content(Jsons.DEFAULT.toJson(createImageResp.getData()))
                        .uuid(request.getUuid())
                        .build())
                .build();

CreateMessageResp createMessageResp = client.im().message().create(createMessageReq);
        if (!createMessageResp.success()) {
            System.out.printf("client.im.message.create failed, code: %d, msg: %s, logId: %s%n",
                    createMessageResp.getCode(), createMessageResp.getMsg(), createMessageResp.getRequestId());
            return createMessageResp;
        }

// 返回结果
        SendImageResponse response = new SendImageResponse();
        response.setCode(0);
        response.setMsg("success");
        response.setCreateImageResponse(createImageResp.getData());
        response.setCreateMessageResponse(createMessageResp.getData());

return response;
    }
}
```

### [获取部门下所有用户列表](https://github.com/larksuite/oapi-sdk-java-demo/blob/main/src/main/java/com/larksuite/oapi/composite_api/contact/Contact.java)

```java
package com.larksuite.oapi.composite_api.contact;

import com.lark.oapi.Client;
import com.lark.oapi.core.response.BaseResponse;
import com.lark.oapi.core.utils.Lists;
import com.lark.oapi.service.contact.v3.model.*;

import java.util.Arrays;
import java.util.List;

public class Contact {

/**
     * 获取部门下所有用户列表，使用到两个OpenAPI：
     * 1. [获取子部门列表]([...](https://open.feishu.cn/document/server-docs/contact-v3/department/children))
     * 2. [获取部门直属用户列表]([...](https://open.feishu.cn/document/server-docs/contact-v3/user/find_by_department))
     */
    public static BaseResponse<?> ListUserByDepartment(Client client, ListUserByDepartmentRequest request) throws Exception {
        // 获取子部门列表
        ChildrenDepartmentReq childrenDepartmentReq = ChildrenDepartmentReq.newBuilder()
                .departmentIdType("open_department_id")
                .departmentId(request.getDepartmentId())
                .build();

ChildrenDepartmentResp childrenDepartmentResp = client.contact().department().children(childrenDepartmentReq);

if (!childrenDepartmentResp.success()) {
            System.out.printf("client.contact.department.children failed, code: %d, msg: %s, logId: %s%n",
                    childrenDepartmentResp.getCode(), childrenDepartmentResp.getMsg(), childrenDepartmentResp.getRequestId());
            return childrenDepartmentResp;
        }

// 获取部门直属用户列表
        List<User> users = Lists.newArrayList();
        List<String> departments = Lists.newArrayList(request.getDepartmentId());
        Department[] items = childrenDepartmentResp.getData().getItems();
        for (Department item : items) {
            departments.add(item.getOpenDepartmentId());
        }
        for (String department : departments) {
            FindByDepartmentUserReq findByDepartmentUserReq = FindByDepartmentUserReq.newBuilder()
                    .departmentId(department)
                    .build();

FindByDepartmentUserResp findByDepartmentUserResp = client.contact().user().findByDepartment(findByDepartmentUserReq);

if (!findByDepartmentUserResp.success()) {
                System.out.printf("client.contact.user.findByDepartment failed, code: %d, msg: %s, logId: %s%n",
                        findByDepartmentUserResp.getCode(), findByDepartmentUserResp.getMsg(), findByDepartmentUserResp.getRequestId());
                return findByDepartmentUserResp;
            }

users.addAll(Arrays.asList(findByDepartmentUserResp.getData().getItems()));
        }

// 返回结果
        ListUserByDepartmentResponse response = new ListUserByDepartmentResponse();
        response.setCode(0);
        response.setMsg("success");
        response.setChildrenDepartmentResponse(childrenDepartmentResp.getData());
        response.setFindByDepartmentUserResponse(users);

return response;
    }
}
```

### [创建多维表格同时添加数据表](https://github.com/larksuite/oapi-sdk-java-demo/blob/main/src/main/java/com/larksuite/oapi/composite_api/base/Base.java)

```java
package com.larksuite.oapi.composite_api.base;

import com.lark.oapi.Client;
import com.lark.oapi.core.response.BaseResponse;
import com.lark.oapi.service.bitable.v1.model.*;

import java.util.ArrayList;
import java.util.List;

public class Base {

/**
     * 创建多维表格同时添加数据表，使用到两个OpenAPI：
     * 1. [创建多维表格]([...](https://open.feishu.cn/document/server-docs/docs/bitable-v1/app/create))
     * 2. [新增一个数据表]([...](https://open.feishu.cn/document/server-docs/docs/bitable-v1/app-table/create))
     */
    public static BaseResponse<?> CreateAppAndTables(Client client, CreateAppAndTablesRequest request) throws Exception {
        // 创建多维表格
        CreateAppReq createAppReq = CreateAppReq.newBuilder()
                .reqApp(ReqApp.newBuilder()
                        .name(request.getName())
                        .folderToken(request.getFolderToken())
                        .build())
                .build();

CreateAppResp createAppResp = client.bitable().app().create(createAppReq);

if (!createAppResp.success()) {
            System.out.printf("client.bitable.app.create failed, code: %d, msg: %s, logId: %s%n",
                    createAppResp.getCode(), createAppResp.getMsg(), createAppResp.getRequestId());
            return createAppResp;
        }

// 添加数据表
        List<CreateAppTableRespBody> tables = new ArrayList<>();
        for (ReqTable table : request.getTables()) {
            CreateAppTableReq createAppTableReq = CreateAppTableReq.newBuilder()
                    .appToken(createAppResp.getData().getApp().getAppToken())
                    .createAppTableReqBody(CreateAppTableReqBody.newBuilder()
                            .table(table)
                            .build())
                    .build();

CreateAppTableResp createAppTableResp = client.bitable().appTable().create(createAppTableReq);

if (!createAppTableResp.success()) {
                System.out.printf("client.bitable.appTable.create failed, code: %d, msg: %s, logId: %s%n",
                        createAppTableResp.getCode(), createAppTableResp.getMsg(), createAppTableResp.getRequestId());
                return createAppTableResp;
            }

tables.add(createAppTableResp.getData());
        }

// 返回结果
        CreateAppAndTablesResponse response = new CreateAppAndTablesResponse();
        response.setCode(0);
        response.setMsg("success");
        response.setCreateAppResponse(createAppResp.getData());
        response.setCreateAppTableResponse(tables);

return response;
    }
}
```

### [复制粘贴某个范围的单元格数据](https://github.com/larksuite/oapi-sdk-java-demo/blob/main/src/main/java/com/larksuite/oapi/composite_api/sheets/Sheets.java)
```java   
package com.larksuite.oapi.composite_api.sheets;

import com.lark.oapi.Client;
import com.lark.oapi.core.response.BaseResponse;
import com.lark.oapi.core.response.RawResponse;
import com.lark.oapi.core.token.AccessTokenType;
import com.lark.oapi.core.utils.Jsons;

import java.util.HashMap;
import java.util.Map;

public class Sheets {

public static BaseResponse<?> CopyAndPasteByRange(Client client, CopyAndPasteByRangeRequest request) throws Exception {
        // 读取单个范围
        RawResponse readResp = client.get(
                String.format("/open-apis/sheets/v2/spreadsheets/%s/values/%s", request.getSpreadsheetToken(), request.getSrcRange()),
                null,
                AccessTokenType.Tenant);

SpreadsheetResp readSpreadsheetResp = Jsons.DEFAULT.fromJson(new String(readResp.getBody()), SpreadsheetResp.class);
        if (!readSpreadsheetResp.success()) {
            System.out.printf("read spreadsheet failed, code: %d, msg: %s, logId: %s%n",
                    readSpreadsheetResp.getCode(), readSpreadsheetResp.getMsg(), readSpreadsheetResp.getRequestId());
            return readSpreadsheetResp;
        }

// 向单个范围写入数据
        Map<String, Object> valueRange = new HashMap<>();
        valueRange.put("range", request.getDstRange());
        valueRange.put("values", readSpreadsheetResp.getData().getValueRange().getValues());
        Map<String, Object> body = new HashMap<>();
        body.put("valueRange", valueRange);

RawResponse writeResp = client.put(
                String.format("/open-apis/sheets/v2/spreadsheets/%s/values", request.getSpreadsheetToken()),
                body,
                AccessTokenType.Tenant);

SpreadsheetResp writeSpreadsheetResp = Jsons.DEFAULT.fromJson(new String(writeResp.getBody()), SpreadsheetResp.class);
        if (!writeSpreadsheetResp.success()) {
            System.out.printf("write spreadsheet failed, code: %d, msg: %s, logId: %s%n",
                    writeSpreadsheetResp.getCode(), writeSpreadsheetResp.getMsg(), writeSpreadsheetResp.getRequestId());
            return writeSpreadsheetResp;
        }

// 返回结果
        CopyAndPasteRangeResponse response = new CopyAndPasteRangeResponse();
        response.setCode(0);
        response.setMsg("success");
        response.setReadResponse(readSpreadsheetResp.getData());
        response.setWriteResponse(writeSpreadsheetResp.getData());

return response;
    }
}
```

### [下载指定范围单元格的所有素材列表](https://github.com/larksuite/oapi-sdk-java-demo/blob/main/src/main/java/com/larksuite/oapi/composite_api/sheets/Sheets.java)
```java
package com.larksuite.oapi.composite_api.sheets;

import com.lark.oapi.Client;
import com.lark.oapi.core.response.BaseResponse;
import com.lark.oapi.core.response.RawResponse;
import com.lark.oapi.core.token.AccessTokenType;
import com.lark.oapi.core.utils.Jsons;

import java.util.HashMap;
import java.util.Map;

public class Sheets {

public static BaseResponse<?> CopyAndPasteByRange(Client client, CopyAndPasteByRangeRequest request) throws Exception {
        // 读取单个范围
        RawResponse readResp = client.get(
                String.format("/open-apis/sheets/v2/spreadsheets/%s/values/%s", request.getSpreadsheetToken(), request.getSrcRange()),
                null,
                AccessTokenType.Tenant);

SpreadsheetResp readSpreadsheetResp = Jsons.DEFAULT.fromJson(new String(readResp.getBody()), SpreadsheetResp.class);
        if (!readSpreadsheetResp.success()) {
            System.out.printf("read spreadsheet failed, code: %d, msg: %s, logId: %s%n",
                    readSpreadsheetResp.getCode(), readSpreadsheetResp.getMsg(), readSpreadsheetResp.getRequestId());
            return readSpreadsheetResp;
        }

// 向单个范围写入数据
        Map<String, Object> valueRange = new HashMap<>();
        valueRange.put("range", request.getDstRange());
        valueRange.put("values", readSpreadsheetResp.getData().getValueRange().getValues());
        Map<String, Object> body = new HashMap<>();
        body.put("valueRange", valueRange);

RawResponse writeResp = client.put(
                String.format("/open-apis/sheets/v2/spreadsheets/%s/values", request.getSpreadsheetToken()),
                body,
                AccessTokenType.Tenant);

SpreadsheetResp writeSpreadsheetResp = Jsons.DEFAULT.fromJson(new String(writeResp.getBody()), SpreadsheetResp.class);
        if (!writeSpreadsheetResp.success()) {
            System.out.printf("write spreadsheet failed, code: %d, msg: %s, logId: %s%n",
                    writeSpreadsheetResp.getCode(), writeSpreadsheetResp.getMsg(), writeSpreadsheetResp.getRequestId());
            return writeSpreadsheetResp;
        }

// 返回结果
        CopyAndPasteRangeResponse response = new CopyAndPasteRangeResponse();
        response.setCode(0);
        response.setMsg("success");
        response.setReadResponse(readSpreadsheetResp.getData());
        response.setWriteResponse(writeSpreadsheetResp.getData());

return response;
    }
}
```