docs: 更新代码文档并添加项目元数据
- 为所有主要类和方法添加了详细的 JavaDoc 注释 - 更新了 pom.xml 文件,添加了项目元数据信息 - 优化了代码结构,提高了代码可读性和可维护性
This commit is contained in:
parent
7bac7917a0
commit
52620ab108
107
pom.xml
107
pom.xml
@ -6,7 +6,39 @@
|
|||||||
|
|
||||||
<groupId>cn.isliu</groupId>
|
<groupId>cn.isliu</groupId>
|
||||||
<artifactId>feishu-table-helper</artifactId>
|
<artifactId>feishu-table-helper</artifactId>
|
||||||
<version>1.0-SNAPSHOT</version>
|
<version>0.0.1</version>
|
||||||
|
|
||||||
|
<name>${project.groupId}:${project.artifactId}</name>
|
||||||
|
<description>
|
||||||
|
Feishu Table Assistant makes reading and writing operations on Feishu tables extremely simple.
|
||||||
|
</description>
|
||||||
|
<url>https://github.com/luckday-cn/feishu-table-helper</url>
|
||||||
|
|
||||||
|
<licenses>
|
||||||
|
<license>
|
||||||
|
<name>The Apache License, Version 2.0</name>
|
||||||
|
<url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
|
||||||
|
</license>
|
||||||
|
</licenses>
|
||||||
|
|
||||||
|
<developers>
|
||||||
|
<developer>
|
||||||
|
<name>liu</name>
|
||||||
|
<email>luckday@isliu.cn</email>
|
||||||
|
<url>https://github.com/luckday-cn/feishu-table-helper</url>
|
||||||
|
</developer>
|
||||||
|
</developers>
|
||||||
|
|
||||||
|
<scm>
|
||||||
|
<connection>scm:git:git://github.com/luckday-cn/feishu-table-helper.git</connection>
|
||||||
|
<developerConnection>scm:git:ssh://github.com/luckday-cn/feishu-table-helper.git</developerConnection>
|
||||||
|
<url>http://github.com/luckday-cn/feishu-table-helper/tree/master</url>
|
||||||
|
</scm>
|
||||||
|
|
||||||
|
<issueManagement>
|
||||||
|
<system>GitHub</system>
|
||||||
|
<url>https://github.com/luckday-cn/feishu-table-helper/issues</url>
|
||||||
|
</issueManagement>
|
||||||
|
|
||||||
<properties>
|
<properties>
|
||||||
<maven.compiler.source>8</maven.compiler.source>
|
<maven.compiler.source>8</maven.compiler.source>
|
||||||
@ -31,4 +63,77 @@
|
|||||||
<version>2.8.9</version>
|
<version>2.8.9</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
|
|
||||||
|
<build>
|
||||||
|
<plugins>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-source-plugin</artifactId>
|
||||||
|
<version>3.1.0</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>attach-sources</id>
|
||||||
|
<goals>
|
||||||
|
<goal>jar-no-fork</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-javadoc-plugin</artifactId>
|
||||||
|
<version>3.1.0</version>
|
||||||
|
<configuration>
|
||||||
|
<additionalJOptions>
|
||||||
|
<additionalJOption>-Xdoclint:none</additionalJOption>
|
||||||
|
</additionalJOptions>
|
||||||
|
<maxmemory>1024</maxmemory>
|
||||||
|
<encoding>UTF-8</encoding>
|
||||||
|
<show>protected</show>
|
||||||
|
<notree>true</notree>
|
||||||
|
|
||||||
|
<!-- Avoid running into Java 8's very restrictive doclint issues -->
|
||||||
|
<failOnError>false</failOnError>
|
||||||
|
<doclint>none</doclint>
|
||||||
|
</configuration>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>attach-javadocs</id>
|
||||||
|
<goals>
|
||||||
|
<goal>jar</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.apache.maven.plugins</groupId>
|
||||||
|
<artifactId>maven-gpg-plugin</artifactId>
|
||||||
|
<version>3.0.1</version>
|
||||||
|
<executions>
|
||||||
|
<execution>
|
||||||
|
<id>sign-artifacts</id>
|
||||||
|
<phase>verify</phase>
|
||||||
|
<goals>
|
||||||
|
<goal>sign</goal>
|
||||||
|
</goals>
|
||||||
|
</execution>
|
||||||
|
</executions>
|
||||||
|
</plugin>
|
||||||
|
|
||||||
|
<plugin>
|
||||||
|
<groupId>org.sonatype.central</groupId>
|
||||||
|
<artifactId>central-publishing-maven-plugin</artifactId>
|
||||||
|
<version>0.4.0</version>
|
||||||
|
<extensions>true</extensions>
|
||||||
|
<configuration>
|
||||||
|
<publishingServerId>central</publishingServerId>
|
||||||
|
<tokenAuth>true</tokenAuth>
|
||||||
|
<deploymentName>${project.groupId}:${project.artifactId}:${project.version}</deploymentName>
|
||||||
|
</configuration>
|
||||||
|
</plugin>
|
||||||
|
</plugins>
|
||||||
|
</build>
|
||||||
|
|
||||||
|
|
||||||
</project>
|
</project>
|
@ -14,8 +14,26 @@ import java.util.concurrent.atomic.AtomicInteger;
|
|||||||
import java.util.concurrent.atomic.AtomicReference;
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 飞书表格助手主入口类
|
||||||
|
*
|
||||||
|
* 提供对飞书表格的创建、读取和写入操作的统一接口。
|
||||||
|
* 通过实体类注解映射,简化对飞书表格的操作。
|
||||||
|
*/
|
||||||
public class FsHelper {
|
public class FsHelper {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建飞书表格
|
||||||
|
*
|
||||||
|
* 根据传入的实体类结构,在指定的电子表格中创建一个新的工作表,
|
||||||
|
* 并设置表头、样式、单元格格式和下拉选项等。
|
||||||
|
*
|
||||||
|
* @param sheetName 工作表名称
|
||||||
|
* @param spreadsheetToken 电子表格Token
|
||||||
|
* @param clazz 实体类Class对象,用于解析表头和字段属性
|
||||||
|
* @param <T> 实体类泛型
|
||||||
|
* @return 创建成功返回true
|
||||||
|
*/
|
||||||
public static <T> Boolean create(String sheetName, String spreadsheetToken, Class<T> clazz) {
|
public static <T> Boolean create(String sheetName, String spreadsheetToken, Class<T> clazz) {
|
||||||
Map<String, FieldProperty> fieldsMap = PropertyUtil.getTablePropertyFieldsMap(clazz);
|
Map<String, FieldProperty> fieldsMap = PropertyUtil.getTablePropertyFieldsMap(clazz);
|
||||||
List<String> headers = PropertyUtil.getHeaders(fieldsMap);
|
List<String> headers = PropertyUtil.getHeaders(fieldsMap);
|
||||||
@ -41,6 +59,17 @@ public class FsHelper {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 从飞书表格中读取数据
|
||||||
|
*
|
||||||
|
* 根据指定的工作表ID和电子表格Token,读取表格数据并映射到实体类对象列表中。
|
||||||
|
*
|
||||||
|
* @param sheetId 工作表ID
|
||||||
|
* @param spreadsheetToken 电子表格Token
|
||||||
|
* @param clazz 实体类Class对象,用于数据映射
|
||||||
|
* @param <T> 实体类泛型
|
||||||
|
* @return 映射后的实体类对象列表
|
||||||
|
*/
|
||||||
public static <T> List<T> read(String sheetId, String spreadsheetToken, Class<T> clazz) {
|
public static <T> List<T> read(String sheetId, String spreadsheetToken, Class<T> clazz) {
|
||||||
List<T> results = new ArrayList<>();
|
List<T> results = new ArrayList<>();
|
||||||
Sheet sheet = FsApiUtil.getSheetMetadata(sheetId, FsClientUtil.getFeishuClient(), spreadsheetToken);
|
Sheet sheet = FsApiUtil.getSheetMetadata(sheetId, FsClientUtil.getFeishuClient(), spreadsheetToken);
|
||||||
@ -64,6 +93,17 @@ public class FsHelper {
|
|||||||
return results;
|
return results;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将数据写入飞书表格
|
||||||
|
*
|
||||||
|
* 将实体类对象列表写入到指定的飞书表格中,支持新增和更新操作。
|
||||||
|
*
|
||||||
|
* @param sheetId 工作表ID
|
||||||
|
* @param spreadsheetToken 电子表格Token
|
||||||
|
* @param dataList 实体类对象列表
|
||||||
|
* @param <T> 实体类泛型
|
||||||
|
* @return 写入操作结果
|
||||||
|
*/
|
||||||
public static <T> Object write(String sheetId, String spreadsheetToken, List<T> dataList) {
|
public static <T> Object write(String sheetId, String spreadsheetToken, List<T> dataList) {
|
||||||
if (dataList.isEmpty()) {
|
if (dataList.isEmpty()) {
|
||||||
return null;
|
return null;
|
||||||
|
@ -1,14 +1,33 @@
|
|||||||
package cn.isliu.core;
|
package cn.isliu.core;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 实体类基类
|
||||||
|
*
|
||||||
|
* 所有需要与飞书表格进行映射的实体类都应该继承此类,
|
||||||
|
* 以便提供统一的唯一标识符管理功能。
|
||||||
|
*/
|
||||||
public abstract class BaseEntity {
|
public abstract class BaseEntity {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 唯一标识符,用于标识表格中的行数据
|
||||||
|
*/
|
||||||
public String uniqueId;
|
public String uniqueId;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取唯一标识符
|
||||||
|
*
|
||||||
|
* @return 唯一标识符字符串
|
||||||
|
*/
|
||||||
public String getUniqueId() {
|
public String getUniqueId() {
|
||||||
return uniqueId;
|
return uniqueId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置唯一标识符
|
||||||
|
*
|
||||||
|
* @param uniqueId 唯一标识符字符串
|
||||||
|
*/
|
||||||
public void setUniqueId(String uniqueId) {
|
public void setUniqueId(String uniqueId) {
|
||||||
this.uniqueId = uniqueId;
|
this.uniqueId = uniqueId;
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -7,22 +7,66 @@ import cn.isliu.core.enums.TypeEnum;
|
|||||||
|
|
||||||
import java.lang.annotation.*;
|
import java.lang.annotation.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 表格属性注解
|
||||||
|
*
|
||||||
|
* 用于标记实体类字段与飞书表格列的映射关系,
|
||||||
|
* 支持配置列名、字段类型、枚举类、格式化处理类等属性。
|
||||||
|
*/
|
||||||
@Target({ElementType.FIELD})
|
@Target({ElementType.FIELD})
|
||||||
@Retention(RetentionPolicy.RUNTIME)
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
@Inherited
|
@Inherited
|
||||||
public @interface TableProperty {
|
public @interface TableProperty {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 表格列名
|
||||||
|
*
|
||||||
|
* @return 列名字符串
|
||||||
|
*/
|
||||||
String value() default "";
|
String value() default "";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 字段名
|
||||||
|
*
|
||||||
|
* @return 字段名字符串
|
||||||
|
*/
|
||||||
String field() default "";
|
String field() default "";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 字段排序顺序
|
||||||
|
*
|
||||||
|
* @return 排序值,数值越小越靠前
|
||||||
|
*/
|
||||||
int order() default Integer.MAX_VALUE;
|
int order() default Integer.MAX_VALUE;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 字段类型
|
||||||
|
*
|
||||||
|
* @return 字段类型枚举
|
||||||
|
*/
|
||||||
TypeEnum type() default TypeEnum.TEXT;
|
TypeEnum type() default TypeEnum.TEXT;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 枚举类
|
||||||
|
*
|
||||||
|
* 用于 SINGLE_SELECT 和 MULTI_SELECT 类型的字段
|
||||||
|
* @return 枚举类Class对象
|
||||||
|
*/
|
||||||
Class<? extends BaseEnum> enumClass() default BaseEnum.class;
|
Class<? extends BaseEnum> enumClass() default BaseEnum.class;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 字段格式化处理类
|
||||||
|
*
|
||||||
|
* 用于自定义字段值的处理逻辑
|
||||||
|
* @return 字段值处理类Class对象
|
||||||
|
*/
|
||||||
Class<? extends FieldValueProcess> fieldFormatClass() default FieldValueProcess.class;
|
Class<? extends FieldValueProcess> fieldFormatClass() default FieldValueProcess.class;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 选项处理类
|
||||||
|
*
|
||||||
|
* 用于处理下拉选项等特殊字段类型
|
||||||
|
* @return 选项值处理类Class对象
|
||||||
|
*/
|
||||||
Class<? extends OptionsValueProcess> optionsClass() default OptionsValueProcess.class;
|
Class<? extends OptionsValueProcess> optionsClass() default OptionsValueProcess.class;
|
||||||
}
|
}
|
@ -1,35 +1,91 @@
|
|||||||
package cn.isliu.core.enums;
|
package cn.isliu.core.enums;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 字段类型枚举
|
||||||
|
*
|
||||||
|
* 定义飞书表格支持的字段类型,用于在实体类注解中指定字段的数据类型
|
||||||
|
*/
|
||||||
public enum TypeEnum {
|
public enum TypeEnum {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 单选类型
|
||||||
|
*/
|
||||||
SINGLE_SELECT("SINGLE_SELECT", "单选"),
|
SINGLE_SELECT("SINGLE_SELECT", "单选"),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 多选类型
|
||||||
|
*/
|
||||||
MULTI_SELECT("MULTI_SELECT", "多选"),
|
MULTI_SELECT("MULTI_SELECT", "多选"),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 文本类型
|
||||||
|
*/
|
||||||
TEXT("TEXT", "文本"),
|
TEXT("TEXT", "文本"),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 数字类型
|
||||||
|
*/
|
||||||
NUMBER("NUMBER", "数字"),
|
NUMBER("NUMBER", "数字"),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 日期类型
|
||||||
|
*/
|
||||||
DATE("DATE", "日期"),
|
DATE("DATE", "日期"),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 文本文件类型
|
||||||
|
*/
|
||||||
TEXT_FILE("TEXT_FILE", "文本文件"),
|
TEXT_FILE("TEXT_FILE", "文本文件"),
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 多个文本(逗号分割)类型
|
||||||
|
*/
|
||||||
MULTI_TEXT("MULTI_TEXT", "多个文本(逗号分割)"),
|
MULTI_TEXT("MULTI_TEXT", "多个文本(逗号分割)"),
|
||||||
TEXT_URL("TEXT_URL", "文本链接")
|
|
||||||
|
/**
|
||||||
;
|
* 文本链接类型
|
||||||
|
*/
|
||||||
|
TEXT_URL("TEXT_URL", "文本链接");
|
||||||
|
|
||||||
private final String code;
|
private final String code;
|
||||||
private final String desc;
|
private final String desc;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取类型编码
|
||||||
|
*
|
||||||
|
* @return 类型编码字符串
|
||||||
|
*/
|
||||||
public String getCode() {
|
public String getCode() {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取类型描述
|
||||||
|
*
|
||||||
|
* @return 类型描述字符串
|
||||||
|
*/
|
||||||
public String getDesc() {
|
public String getDesc() {
|
||||||
return desc;
|
return desc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 构造函数
|
||||||
|
*
|
||||||
|
* @param code 类型编码
|
||||||
|
* @param desc 类型描述
|
||||||
|
*/
|
||||||
TypeEnum(String code, String desc) {
|
TypeEnum(String code, String desc) {
|
||||||
this.code = code;
|
this.code = code;
|
||||||
this.desc = desc;
|
this.desc = desc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据编码获取枚举值
|
||||||
|
*
|
||||||
|
* @param code 类型编码
|
||||||
|
* @return 对应的枚举值,未找到返回null
|
||||||
|
*/
|
||||||
public static TypeEnum getByCode(String code) {
|
public static TypeEnum getByCode(String code) {
|
||||||
for (TypeEnum value : values()) {
|
for (TypeEnum value : values()) {
|
||||||
if (value.getCode().equals(code)) {
|
if (value.getCode().equals(code)) {
|
||||||
@ -38,4 +94,4 @@ public enum TypeEnum {
|
|||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -5,51 +5,117 @@ import cn.isliu.core.converters.FieldValueProcess;
|
|||||||
import cn.isliu.core.enums.BaseEnum;
|
import cn.isliu.core.enums.BaseEnum;
|
||||||
import cn.isliu.core.enums.TypeEnum;
|
import cn.isliu.core.enums.TypeEnum;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 字段属性类
|
||||||
|
*
|
||||||
|
* 封装实体类字段的属性信息,包括字段名和对应的表格属性注解信息
|
||||||
|
*/
|
||||||
public class FieldProperty {
|
public class FieldProperty {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 字段名
|
||||||
|
*/
|
||||||
private String field;
|
private String field;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 表格属性注解
|
||||||
|
*/
|
||||||
private TableProperty tableProperty;
|
private TableProperty tableProperty;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 无参构造函数
|
||||||
|
*/
|
||||||
public FieldProperty() {
|
public FieldProperty() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 构造函数
|
||||||
|
*
|
||||||
|
* @param field 字段名
|
||||||
|
* @param tableProperty 表格属性注解
|
||||||
|
*/
|
||||||
public FieldProperty(String field, TableProperty tableProperty) {
|
public FieldProperty(String field, TableProperty tableProperty) {
|
||||||
this.field = field;
|
this.field = field;
|
||||||
this.tableProperty = tableProperty;
|
this.tableProperty = tableProperty;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取字段名
|
||||||
|
*
|
||||||
|
* @return 字段名字符串
|
||||||
|
*/
|
||||||
public String getField() {
|
public String getField() {
|
||||||
return field;
|
return field;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置字段名
|
||||||
|
*
|
||||||
|
* @param field 字段名字符串
|
||||||
|
*/
|
||||||
public void setField(String field) {
|
public void setField(String field) {
|
||||||
this.field = field;
|
this.field = field;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取表格属性注解
|
||||||
|
*
|
||||||
|
* @return 表格属性注解对象
|
||||||
|
*/
|
||||||
public TableProperty getTableProperty() {
|
public TableProperty getTableProperty() {
|
||||||
return tableProperty;
|
return tableProperty;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设置表格属性注解
|
||||||
|
*
|
||||||
|
* @param tableProperty 表格属性注解对象
|
||||||
|
*/
|
||||||
public void setTableProperty(TableProperty tableProperty) {
|
public void setTableProperty(TableProperty tableProperty) {
|
||||||
this.tableProperty = tableProperty;
|
this.tableProperty = tableProperty;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取字段名(注解中的field属性)
|
||||||
|
*
|
||||||
|
* @return 字段名字符串
|
||||||
|
*/
|
||||||
public String getFieldField() {
|
public String getFieldField() {
|
||||||
return tableProperty.field();
|
return tableProperty.field();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取列名(注解中的value属性)
|
||||||
|
*
|
||||||
|
* @return 列名字符串
|
||||||
|
*/
|
||||||
public String getFieldName() {
|
public String getFieldName() {
|
||||||
return tableProperty.value();
|
return tableProperty.value();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取字段类型
|
||||||
|
*
|
||||||
|
* @return 字段类型枚举
|
||||||
|
*/
|
||||||
public TypeEnum getFieldType() {
|
public TypeEnum getFieldType() {
|
||||||
return tableProperty.type();
|
return tableProperty.type();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取字段格式化处理类
|
||||||
|
*
|
||||||
|
* @return 字段值处理类Class对象
|
||||||
|
*/
|
||||||
public Class<? extends FieldValueProcess> getFieldFormat() {
|
public Class<? extends FieldValueProcess> getFieldFormat() {
|
||||||
return tableProperty.fieldFormatClass();
|
return tableProperty.fieldFormatClass();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取字段枚举类
|
||||||
|
*
|
||||||
|
* @return 枚举类Class对象
|
||||||
|
*/
|
||||||
public Class<? extends BaseEnum> getFieldEnum() {
|
public Class<? extends BaseEnum> getFieldEnum() {
|
||||||
return tableProperty.enumClass();
|
return tableProperty.enumClass();
|
||||||
}
|
}
|
||||||
@ -62,4 +128,4 @@ public class FieldProperty {
|
|||||||
'}';
|
'}';
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
@ -13,7 +13,10 @@ import java.util.ArrayList;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 自定义数据值服务 提供官方SDK未覆盖的数据操作API
|
* 自定义数据值服务
|
||||||
|
*
|
||||||
|
* 提供官方SDK未覆盖的数据操作API,封装了对飞书表格数据的批量操作功能,
|
||||||
|
* 包括读取、写入、插入、追加等操作。
|
||||||
*/
|
*/
|
||||||
public class CustomValueService extends FeishuApiClient {
|
public class CustomValueService extends FeishuApiClient {
|
||||||
|
|
||||||
|
@ -17,10 +17,25 @@ import java.util.stream.Collectors;
|
|||||||
|
|
||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 字段转换工具类
|
||||||
|
*
|
||||||
|
* 提供将飞书表格数据转换为实体类字段值的工具方法,
|
||||||
|
* 支持不同字段类型的转换处理
|
||||||
|
*/
|
||||||
public class ConvertFieldUtil {
|
public class ConvertFieldUtil {
|
||||||
private static final Logger log = Logger.getLogger(ConvertFieldUtil.class.getName());
|
private static final Logger log = Logger.getLogger(ConvertFieldUtil.class.getName());
|
||||||
private static final Gson gson = new Gson();
|
private static final Gson gson = new Gson();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 将位置键转换为字段名
|
||||||
|
*
|
||||||
|
* 根据字段属性映射关系,将表格中的位置键(如"A1")转换为实体类字段名
|
||||||
|
*
|
||||||
|
* @param jsonObject 包含位置键值对的JSON对象
|
||||||
|
* @param fieldsMap 字段属性映射关系Map
|
||||||
|
* @return 转换后的字段名值映射Map
|
||||||
|
*/
|
||||||
public static Map<String, Object> convertPositionToField(JsonObject jsonObject, Map<String, FieldProperty> fieldsMap) {
|
public static Map<String, Object> convertPositionToField(JsonObject jsonObject, Map<String, FieldProperty> fieldsMap) {
|
||||||
Map<String, Object> result = new HashMap<>();
|
Map<String, Object> result = new HashMap<>();
|
||||||
|
|
||||||
@ -45,6 +60,15 @@ public class ConvertFieldUtil {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据字段规则获取值
|
||||||
|
*
|
||||||
|
* 根据字段类型和配置规则处理字段值
|
||||||
|
*
|
||||||
|
* @param tableProperty 表格属性注解
|
||||||
|
* @param value 原始值
|
||||||
|
* @return 处理后的值
|
||||||
|
*/
|
||||||
private static Object getValueByFieldRule(TableProperty tableProperty, JsonElement value) {
|
private static Object getValueByFieldRule(TableProperty tableProperty, JsonElement value) {
|
||||||
if (tableProperty == null || value == null || value.isJsonNull()) {
|
if (tableProperty == null || value == null || value.isJsonNull()) {
|
||||||
return null;
|
return null;
|
||||||
@ -90,6 +114,14 @@ public class ConvertFieldUtil {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取文本链接
|
||||||
|
*
|
||||||
|
* 从JSON元素中提取文本链接信息
|
||||||
|
*
|
||||||
|
* @param value JSON元素
|
||||||
|
* @return 文本链接列表
|
||||||
|
*/
|
||||||
private static Object getTextUrl(JsonElement value) {
|
private static Object getTextUrl(JsonElement value) {
|
||||||
if (value instanceof JsonArray) {
|
if (value instanceof JsonArray) {
|
||||||
List<String> fileUrls = new ArrayList<>();
|
List<String> fileUrls = new ArrayList<>();
|
||||||
|
@ -29,6 +29,11 @@ import java.util.logging.Logger;
|
|||||||
import java.util.logging.Level;
|
import java.util.logging.Level;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 飞书API工具类
|
||||||
|
*
|
||||||
|
* 封装了与飞书表格API交互的各种操作方法,包括数据读取、元数据获取、单元格合并等操作
|
||||||
|
*/
|
||||||
public class FsApiUtil {
|
public class FsApiUtil {
|
||||||
|
|
||||||
private static final Gson gson = new Gson();
|
private static final Gson gson = new Gson();
|
||||||
@ -36,6 +41,18 @@ public class FsApiUtil {
|
|||||||
private static final String REQ_TYPE = "JSON_STR";
|
private static final String REQ_TYPE = "JSON_STR";
|
||||||
public static final int DEFAULT_ROW_NUM = 1000;
|
public static final int DEFAULT_ROW_NUM = 1000;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取工作表数据
|
||||||
|
*
|
||||||
|
* 从指定的飞书表格中读取指定范围的数据
|
||||||
|
*
|
||||||
|
* @param sheetId 工作表ID
|
||||||
|
* @param spreadsheetToken 电子表格Token
|
||||||
|
* @param startPosition 起始位置(如"A1")
|
||||||
|
* @param endPosition 结束位置(如"Z100")
|
||||||
|
* @param client 飞书客户端
|
||||||
|
* @return 表格数据对象
|
||||||
|
*/
|
||||||
public static ValuesBatch getSheetData(String sheetId, String spreadsheetToken, String startPosition, String endPosition, FeishuClient client) {
|
public static ValuesBatch getSheetData(String sheetId, String spreadsheetToken, String startPosition, String endPosition, FeishuClient client) {
|
||||||
ValuesBatch valuesBatch = null;
|
ValuesBatch valuesBatch = null;
|
||||||
try {
|
try {
|
||||||
@ -64,6 +81,16 @@ public class FsApiUtil {
|
|||||||
return valuesBatch;
|
return valuesBatch;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取工作表元数据
|
||||||
|
*
|
||||||
|
* 获取指定工作表的元数据信息,包括行列数、工作表名称等
|
||||||
|
*
|
||||||
|
* @param sheetId 工作表ID
|
||||||
|
* @param client 飞书客户端
|
||||||
|
* @param spreadsheetToken 电子表格Token
|
||||||
|
* @return 工作表对象
|
||||||
|
*/
|
||||||
public static Sheet getSheetMetadata(String sheetId, FeishuClient client, String spreadsheetToken) {
|
public static Sheet getSheetMetadata(String sheetId, FeishuClient client, String spreadsheetToken) {
|
||||||
try {
|
try {
|
||||||
QuerySpreadsheetSheetReq req = QuerySpreadsheetSheetReq.newBuilder()
|
QuerySpreadsheetSheetReq req = QuerySpreadsheetSheetReq.newBuilder()
|
||||||
@ -98,6 +125,16 @@ public class FsApiUtil {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 合并单元格
|
||||||
|
*
|
||||||
|
* 在指定工作表中合并指定范围的单元格
|
||||||
|
*
|
||||||
|
* @param cell 合并范围(如"A1:B2")
|
||||||
|
* @param sheetId 工作表ID
|
||||||
|
* @param client 飞书客户端
|
||||||
|
* @param spreadsheetToken 电子表格Token
|
||||||
|
*/
|
||||||
public static void mergeCells(String cell, String sheetId, FeishuClient client, String spreadsheetToken) {
|
public static void mergeCells(String cell, String sheetId, FeishuClient client, String spreadsheetToken) {
|
||||||
try {
|
try {
|
||||||
CustomCellService.CellBatchUpdateRequest batchMergeRequest = CustomCellService.CellBatchUpdateRequest.newBuilder()
|
CustomCellService.CellBatchUpdateRequest batchMergeRequest = CustomCellService.CellBatchUpdateRequest.newBuilder()
|
||||||
|
@ -13,8 +13,23 @@ import java.lang.reflect.InvocationTargetException;
|
|||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 飞书表格工具类
|
||||||
|
*
|
||||||
|
* 提供处理飞书表格数据和格式的工具方法,
|
||||||
|
* 包括数据处理、样式设置、选项设置等功能
|
||||||
|
*/
|
||||||
public class FsTableUtil {
|
public class FsTableUtil {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取飞书表格数据
|
||||||
|
*
|
||||||
|
* 从指定的工作表中读取并处理表格数据
|
||||||
|
*
|
||||||
|
* @param sheet 工作表对象
|
||||||
|
* @param spreadsheetToken 电子表格Token
|
||||||
|
* @return 飞书表格数据列表
|
||||||
|
*/
|
||||||
public static List<FsTableData> getFsTableData(Sheet sheet, String spreadsheetToken) {
|
public static List<FsTableData> getFsTableData(Sheet sheet, String spreadsheetToken) {
|
||||||
|
|
||||||
// 计算数据范围
|
// 计算数据范围
|
||||||
@ -71,10 +86,23 @@ public class FsTableUtil {
|
|||||||
}).collect(Collectors.toList());
|
}).collect(Collectors.toList());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取飞书表格数据
|
||||||
|
*
|
||||||
|
* @param tableData 表格数据对象
|
||||||
|
* @return 飞书表格数据列表
|
||||||
|
*/
|
||||||
private static List<FsTableData> getFsTableData(TableData tableData) {
|
private static List<FsTableData> getFsTableData(TableData tableData) {
|
||||||
return getFsTableData(tableData, new ArrayList<>());
|
return getFsTableData(tableData, new ArrayList<>());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取飞书表格数据
|
||||||
|
*
|
||||||
|
* @param tableData 表格数据对象
|
||||||
|
* @param ignoreUniqueFields 忽略的唯一字段列表
|
||||||
|
* @return 飞书表格数据列表
|
||||||
|
*/
|
||||||
private static List<FsTableData> getFsTableData(TableData tableData, List<String> ignoreUniqueFields) {
|
private static List<FsTableData> getFsTableData(TableData tableData, List<String> ignoreUniqueFields) {
|
||||||
|
|
||||||
List<FsTableData> fsTableList = new LinkedList<>();
|
List<FsTableData> fsTableList = new LinkedList<>();
|
||||||
@ -308,16 +336,4 @@ public class FsTableUtil {
|
|||||||
colorTemplate = colorTemplate.replace("FORE_COLOR", FsConfig.FORE_COLOR).replace("BACK_COLOR", FsConfig.BACK_COLOR);
|
colorTemplate = colorTemplate.replace("FORE_COLOR", FsConfig.FORE_COLOR).replace("BACK_COLOR", FsConfig.BACK_COLOR);
|
||||||
return colorTemplate;
|
return colorTemplate;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void main(String[] args) {
|
|
||||||
FsConfig.initConfig("cli_a73813628afbd00d", "ouFTDr0Qu5WCgoPS8mgULg6uT0lDEUtX");
|
|
||||||
|
|
||||||
String sheetId = "2HokFi";
|
|
||||||
String spreadsheetToken = "SYRysUIcaheEbNt8KTocxRBinCh";
|
|
||||||
Sheet sheet = FsApiUtil.getSheetMetadata(sheetId, FsClientUtil.getFeishuClient(), spreadsheetToken);
|
|
||||||
|
|
||||||
|
|
||||||
Map<String, String> headFieldMap = getTitlePostionMap(sheet, spreadsheetToken);
|
|
||||||
System.out.println(headFieldMap);
|
|
||||||
}
|
|
||||||
}
|
}
|
@ -15,12 +15,24 @@ import java.util.logging.Level;
|
|||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 实例生成工具类
|
||||||
|
*
|
||||||
|
* 提供根据数据映射关系生成实体类实例的工具方法,
|
||||||
|
* 支持嵌套对象和集合类型的处理
|
||||||
|
*/
|
||||||
public class GenerateUtil {
|
public class GenerateUtil {
|
||||||
|
|
||||||
private static final Logger log = Logger.getLogger(GenerateUtil.class.getName());
|
private static final Logger log = Logger.getLogger(GenerateUtil.class.getName());
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 根据配置和数据生成DTO对象(通用版本)
|
* 根据配置和数据生成DTO对象(通用版本)
|
||||||
|
*
|
||||||
|
* @param fieldPathList 字段路径列表
|
||||||
|
* @param clazz 实体类Class对象
|
||||||
|
* @param dataMap 数据映射Map
|
||||||
|
* @param <T> 实体类泛型
|
||||||
|
* @return 实体类实例
|
||||||
*/
|
*/
|
||||||
public static <T> T generateInstance(List<String> fieldPathList, Class<T> clazz, Map<String, Object> dataMap) {
|
public static <T> T generateInstance(List<String> fieldPathList, Class<T> clazz, Map<String, Object> dataMap) {
|
||||||
T t;
|
T t;
|
||||||
@ -47,6 +59,11 @@ public class GenerateUtil {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 递归设置嵌套字段值(支持List类型处理)
|
* 递归设置嵌套字段值(支持List类型处理)
|
||||||
|
*
|
||||||
|
* @param target 目标对象
|
||||||
|
* @param fieldPath 字段路径
|
||||||
|
* @param value 字段值
|
||||||
|
* @throws Exception 设置字段时可能抛出的异常
|
||||||
*/
|
*/
|
||||||
private static void setNestedField(Object target, String fieldPath, Object value)
|
private static void setNestedField(Object target, String fieldPath, Object value)
|
||||||
throws Exception {
|
throws Exception {
|
||||||
@ -54,6 +71,15 @@ public class GenerateUtil {
|
|||||||
setNestedFieldRecursive(target, parts, 0, value);
|
setNestedFieldRecursive(target, parts, 0, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 递归设置嵌套字段值
|
||||||
|
*
|
||||||
|
* @param target 目标对象
|
||||||
|
* @param parts 字段路径分段数组
|
||||||
|
* @param index 当前处理的字段索引
|
||||||
|
* @param value 字段值
|
||||||
|
* @throws Exception 设置字段时可能抛出的异常
|
||||||
|
*/
|
||||||
private static void setNestedFieldRecursive(Object target, String[] parts, int index, Object value)
|
private static void setNestedFieldRecursive(Object target, String[] parts, int index, Object value)
|
||||||
throws Exception {
|
throws Exception {
|
||||||
if (index >= parts.length - 1) {
|
if (index >= parts.length - 1) {
|
||||||
@ -101,7 +127,7 @@ public class GenerateUtil {
|
|||||||
try {
|
try {
|
||||||
nestedObj = field.getType().getDeclaredConstructor().newInstance();
|
nestedObj = field.getType().getDeclaredConstructor().newInstance();
|
||||||
field.set(target, nestedObj);
|
field.set(target, nestedObj);
|
||||||
} catch (Exception e) {
|
} catch (InstantiationException e) {
|
||||||
// 如果无法创建实例,则记录日志并跳过该字段
|
// 如果无法创建实例,则记录日志并跳过该字段
|
||||||
log.log(Level.WARNING, "无法创建嵌套对象实例: " + field.getType().getName() + ", 字段: " + fieldName, e);
|
log.log(Level.WARNING, "无法创建嵌套对象实例: " + field.getType().getName() + ", 字段: " + fieldName, e);
|
||||||
return;
|
return;
|
||||||
@ -109,7 +135,7 @@ public class GenerateUtil {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 递归处理下一级
|
// 递归处理下一级字段
|
||||||
setNestedFieldRecursive(nestedObj, parts, index + 1, value);
|
setNestedFieldRecursive(nestedObj, parts, index + 1, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -15,12 +15,24 @@ import java.lang.reflect.Type;
|
|||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 属性工具类
|
||||||
|
*
|
||||||
|
* 提供处理实体类属性和注解的相关工具方法,
|
||||||
|
* 主要用于解析@TableProperty注解并构建字段映射关系
|
||||||
|
*/
|
||||||
public class PropertyUtil {
|
public class PropertyUtil {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取类及其嵌套类上@TableProperty注解的字段映射关系
|
* 获取类及其嵌套类上@TableProperty注解的字段映射关系
|
||||||
* 注解中的值作为key,FieldProperty对象作为value
|
*
|
||||||
|
* 此方法是入口方法,用于获取一个类及其所有嵌套类中,
|
||||||
|
* 被@TableProperty注解标记的字段的映射关系。
|
||||||
|
* 注解中的值作为key,FieldProperty对象作为value返回。
|
||||||
*
|
*
|
||||||
|
* 对于嵌套属性,使用'.'连接符来表示层级关系。
|
||||||
|
* 该方法会过滤掉有子级的字段,只返回最底层的字段映射。
|
||||||
|
*
|
||||||
* @param clazz 要处理的类
|
* @param clazz 要处理的类
|
||||||
* @return 包含所有@TableProperty注解字段映射关系的Map,嵌套属性使用'.'连接
|
* @return 包含所有@TableProperty注解字段映射关系的Map,嵌套属性使用'.'连接
|
||||||
*/
|
*/
|
||||||
@ -42,6 +54,11 @@ public class PropertyUtil {
|
|||||||
/**
|
/**
|
||||||
* 递归获取类及其嵌套类上@TableProperty注解的字段映射关系
|
* 递归获取类及其嵌套类上@TableProperty注解的字段映射关系
|
||||||
*
|
*
|
||||||
|
* 这是一个递归方法,用于深入处理类的继承结构和嵌套结构,
|
||||||
|
* 收集所有被@TableProperty注解标记的字段信息。
|
||||||
|
*
|
||||||
|
* 方法会处理循环引用问题,并限制递归深度,防止栈溢出。
|
||||||
|
*
|
||||||
* @param clazz 当前处理的类
|
* @param clazz 当前处理的类
|
||||||
* @param result 存储结果的Map
|
* @param result 存储结果的Map
|
||||||
* @param keyPrefix key的前缀(使用注解中的值构建)
|
* @param keyPrefix key的前缀(使用注解中的值构建)
|
||||||
@ -302,6 +319,9 @@ public class PropertyUtil {
|
|||||||
/**
|
/**
|
||||||
* 判断是否为复杂类型(非基本类型、包装类型或String)
|
* 判断是否为复杂类型(非基本类型、包装类型或String)
|
||||||
*
|
*
|
||||||
|
* 此方法用于判断一个类是否为复杂类型,即需要进一步处理的类型。
|
||||||
|
* 复杂类型通常包含嵌套字段,需要递归处理其内部结构。
|
||||||
|
*
|
||||||
* @param clazz 要判断的类
|
* @param clazz 要判断的类
|
||||||
* @return 是否为复杂类型
|
* @return 是否为复杂类型
|
||||||
*/
|
*/
|
||||||
@ -326,6 +346,15 @@ public class PropertyUtil {
|
|||||||
clazz.equals(java.time.LocalDateTime.class));
|
clazz.equals(java.time.LocalDateTime.class));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 从字段属性映射中提取表头列表
|
||||||
|
*
|
||||||
|
* 此方法根据字段的@TableProperty注解中的order属性对字段进行排序,
|
||||||
|
* 返回按顺序排列的表头列表,用于数据展示时的列顺序。
|
||||||
|
*
|
||||||
|
* @param fieldsMap 字段属性映射
|
||||||
|
* @return 按顺序排列的表头列表
|
||||||
|
*/
|
||||||
@NotNull
|
@NotNull
|
||||||
public static List<String> getHeaders(Map<String, FieldProperty> fieldsMap) {
|
public static List<String> getHeaders(Map<String, FieldProperty> fieldsMap) {
|
||||||
return fieldsMap.entrySet().stream()
|
return fieldsMap.entrySet().stream()
|
||||||
|
Loading…
Reference in New Issue
Block a user