TopicSource.java
4.0 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
// keyword/entity/TopicSource.java
package com.aigeo.keyword.entity;
import jakarta.persistence.*;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;
import java.time.LocalDateTime;
/**
* 主题来源实体类
* 对应数据库表:ai_topic_sources
*
* 存储主题内容的来源配置信息,包括:
* - 搜索引擎配置和查询模式
* - 结果字段映射和最大结果数
* - 激活状态和时间管理
*
* @author AIGEO Team
* @since 1.0.0
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "ai_topic_sources", indexes = {
@Index(name = "idx_topic_sources_active", columnList = "is_active"),
@Index(name = "idx_topic_sources_engine", columnList = "engine")
})
public class TopicSource {
/**
* 主键ID
*/
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", nullable = false, updatable = false)
private Integer id;
/**
* 来源名称
*/
@NotBlank(message = "来源名称不能为空")
@Column(name = "name", nullable = false, length = 100)
private String name;
/**
* 搜索引擎类型(如:baidu, google等)
*/
@NotBlank(message = "搜索引擎不能为空")
@Column(name = "engine", nullable = false, length = 50)
private String engine;
/**
* 查询模式/模板
*/
@NotBlank(message = "查询模式不能为空")
@Column(name = "query_pattern", nullable = false, length = 500)
private String queryPattern;
/**
* 结果字段映射
*/
@NotBlank(message = "结果字段不能为空")
@Column(name = "result_field", nullable = false, length = 200)
private String resultField;
/**
* 最大结果数量
*/
@Column(name = "max_results")
@Builder.Default
private Integer maxResults = 100;
/**
* 是否激活
*/
@Column(name = "is_active")
@Builder.Default
private Boolean isActive = true;
/**
* 创建时间
*/
@CreationTimestamp
@Column(name = "created_at", updatable = false)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime createdAt;
/**
* 更新时间
*/
@UpdateTimestamp
@Column(name = "updated_at")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime updatedAt;
/**
* 实体创建前的处理
*/
@PrePersist
protected void onCreate() {
if (isActive == null) isActive = true;
if (maxResults == null) maxResults = 100;
}
/**
* 检查是否为激活状态
*/
public boolean isActive() {
return Boolean.TRUE.equals(isActive);
}
/**
* 激活来源
*/
public void activate() {
this.isActive = true;
}
/**
* 停用来源
*/
public void deactivate() {
this.isActive = false;
}
/**
* 检查是否为百度搜索引擎
*/
public boolean isBaiduEngine() {
return "baidu".equalsIgnoreCase(engine);
}
/**
* 检查是否为谷歌搜索引擎
*/
public boolean isGoogleEngine() {
return "google".equalsIgnoreCase(engine);
}
/**
* 检查是否配置了最大结果数限制
*/
public boolean hasMaxResultsLimit() {
return maxResults != null && maxResults > 0;
}
/**
* 获取有效的最大结果数(如果未设置则返回默认值)
*/
public int getEffectiveMaxResults() {
return maxResults != null && maxResults > 0 ? maxResults : 100;
}
/**
* 获取来源的描述信息
*/
public String getSourceDescription() {
return String.format("%s (%s引擎)", name, engine);
}
}