|
@@ -0,0 +1,479 @@
|
|
|
|
|
+# ExtendPropertyValues 迁移到 AdvancedQuery 说明
|
|
|
|
|
+
|
|
|
|
|
+## 变更时间
|
|
|
|
|
+2026-05-21
|
|
|
|
|
+
|
|
|
|
|
+## 变更原因
|
|
|
|
|
+为了提供更强大、更易用的查询功能,将原有的 `ExtendPropertyValues` 参数替换为 `AdvancedQuery` 参数。底层服务会将 `AdvancedQueryParams` 解析为 `ExtendPropertyValues`。
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+## 变更内容
|
|
|
|
|
+
|
|
|
|
|
+### 1. QueryActivitiesParams 变更
|
|
|
|
|
+
|
|
|
|
|
+#### 修改前
|
|
|
|
|
+```go
|
|
|
|
|
+type QueryActivitiesParams struct {
|
|
|
|
|
+ Name string `json:"name,omitempty"`
|
|
|
|
|
+ ActorID string `json:"actorId,omitempty"`
|
|
|
|
|
+ BusinessType []string `json:"businessType,omitempty"`
|
|
|
|
|
+ ExtendPropertyValues map[string][]any `json:"extendPropertyValues,omitempty"` // 旧参数
|
|
|
|
|
+ CreateUserID string `json:"createUserId,omitempty"`
|
|
|
|
|
+ TenantID string `json:"tenantId"`
|
|
|
|
|
+ PageNo int `json:"pageNo"`
|
|
|
|
|
+ PageSize int `json:"pageSize"`
|
|
|
|
|
+}
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+#### 修改后
|
|
|
|
|
+```go
|
|
|
|
|
+type QueryActivitiesParams struct {
|
|
|
|
|
+ Name string `json:"name,omitempty"`
|
|
|
|
|
+ ActorID string `json:"actorId,omitempty"`
|
|
|
|
|
+ BusinessType []string `json:"businessType,omitempty"`
|
|
|
|
|
+ AdvancedQuery *AdvancedQueryParams `json:"advancedQuery,omitempty"` // 新参数
|
|
|
|
|
+ CreateUserID string `json:"createUserId,omitempty"`
|
|
|
|
|
+ TenantID string `json:"tenantId"`
|
|
|
|
|
+ PageNo int `json:"pageNo"`
|
|
|
|
|
+ PageSize int `json:"pageSize"`
|
|
|
|
|
+}
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+### 2. QueryPlansParams 变更
|
|
|
|
|
+
|
|
|
|
|
+#### 修改前
|
|
|
|
|
+```go
|
|
|
|
|
+type QueryPlansParams struct {
|
|
|
|
|
+ PlanType string `json:"planType,omitempty"`
|
|
|
|
|
+ Name string `json:"name,omitempty"`
|
|
|
|
|
+ ActorID string `json:"actorId,omitempty"`
|
|
|
|
|
+ State string `json:"state,omitempty"`
|
|
|
|
|
+ BusinessType []string `json:"businessType,omitempty"`
|
|
|
|
|
+ ExtendPropertyValues map[string][]any `json:"extendPropertyValues,omitempty"` // 旧参数
|
|
|
|
|
+ CreateUserID string `json:"createUserId,omitempty"`
|
|
|
|
|
+ TenantID string `json:"tenantId"`
|
|
|
|
|
+ PageNo int `json:"pageNo"`
|
|
|
|
|
+ PageSize int `json:"pageSize"`
|
|
|
|
|
+}
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+#### 修改后
|
|
|
|
|
+```go
|
|
|
|
|
+type QueryPlansParams struct {
|
|
|
|
|
+ PlanType string `json:"planType,omitempty"`
|
|
|
|
|
+ Name string `json:"name,omitempty"`
|
|
|
|
|
+ ActorID string `json:"actorId,omitempty"`
|
|
|
|
|
+ State string `json:"state,omitempty"`
|
|
|
|
|
+ BusinessType []string `json:"businessType,omitempty"`
|
|
|
|
|
+ AdvancedQuery *AdvancedQueryParams `json:"advancedQuery,omitempty"` // 新参数
|
|
|
|
|
+ CreateUserID string `json:"createUserId,omitempty"`
|
|
|
|
|
+ TenantID string `json:"tenantId"`
|
|
|
|
|
+ PageNo int `json:"pageNo"`
|
|
|
|
|
+ PageSize int `json:"pageSize"`
|
|
|
|
|
+}
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+## AdvancedQueryParams 结构
|
|
|
|
|
+
|
|
|
|
|
+```go
|
|
|
|
|
+type AdvancedQueryParams struct {
|
|
|
|
|
+ ConditionGroups []ConditionGroup `json:"conditionGroups"`
|
|
|
|
|
+ GroupLogic LogicOperator `json:"groupLogic"`
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+type ConditionGroup struct {
|
|
|
|
|
+ Conditions []ConditionItem `json:"conditions"`
|
|
|
|
|
+ Logic LogicOperator `json:"logic"`
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+type ConditionItem struct {
|
|
|
|
|
+ Condition *ConditionGroup `json:"condition,omitempty"`
|
|
|
|
|
+ SingleCondition *QueryCondition `json:"singleCondition,omitempty"`
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+type QueryCondition struct {
|
|
|
|
|
+ Field string `json:"field"`
|
|
|
|
|
+ Operator QueryOperator `json:"operator"`
|
|
|
|
|
+ Value any `json:"value,omitempty"`
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+type QueryOperator string
|
|
|
|
|
+type LogicOperator string
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+## 迁移指南
|
|
|
|
|
+
|
|
|
|
|
+### 旧方式(ExtendPropertyValues)
|
|
|
|
|
+
|
|
|
|
|
+```go
|
|
|
|
|
+// 旧的查询方式
|
|
|
|
|
+params := managesdk.QueryActivitiesParams{
|
|
|
|
|
+ TenantID: "tenant-001",
|
|
|
|
|
+ ExtendPropertyValues: map[string][]any{
|
|
|
|
|
+ "(extend_properties->>'priority')::numeric = ?": {1},
|
|
|
|
|
+ "(extend_properties->>'progress')::numeric > ?": {50},
|
|
|
|
|
+ "extend_properties->>'deptName' = ?": {"技术部"},
|
|
|
|
|
+ },
|
|
|
|
|
+ PageNo: 1,
|
|
|
|
|
+ PageSize: 10,
|
|
|
|
|
+}
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+**缺点**:
|
|
|
|
|
+- 需要手动编写 SQL 片段
|
|
|
|
|
+- 容易出错(SQL 语法、类型转换)
|
|
|
|
|
+- 不够直观
|
|
|
|
|
+- 难以构建复杂的逻辑组合
|
|
|
|
|
+
|
|
|
|
|
+### 新方式(AdvancedQuery)
|
|
|
|
|
+
|
|
|
|
|
+```go
|
|
|
|
|
+// 新的查询方式
|
|
|
|
|
+params := managesdk.QueryActivitiesParams{
|
|
|
|
|
+ TenantID: "tenant-001",
|
|
|
|
|
+ AdvancedQuery: managesdk.AndQuery(
|
|
|
|
|
+ managesdk.AndGroup(
|
|
|
|
|
+ managesdk.Equal("priority", 1),
|
|
|
|
|
+ managesdk.GreaterThan("progress", 50),
|
|
|
|
|
+ managesdk.Equal("deptName", "技术部"),
|
|
|
|
|
+ ),
|
|
|
|
|
+ ),
|
|
|
|
|
+ PageNo: 1,
|
|
|
|
|
+ PageSize: 10,
|
|
|
|
|
+}
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+**优点**:
|
|
|
|
|
+- 类型安全
|
|
|
|
|
+- 语义清晰
|
|
|
|
|
+- 易于构建复杂查询
|
|
|
|
|
+- 支持嵌套条件
|
|
|
|
|
+- 自动处理类型转换
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+## 查询操作符对照表
|
|
|
|
|
+
|
|
|
|
|
+| 旧方式(SQL) | 新方式(AdvancedQuery) | 说明 |
|
|
|
|
|
+|--------------|------------------------|------|
|
|
|
|
|
+| `field = ?` | `Equal("field", value)` | 等于 |
|
|
|
|
|
+| `field != ?` | `NotEqual("field", value)` | 不等于 |
|
|
|
|
|
+| `field > ?` | `GreaterThan("field", value)` | 大于 |
|
|
|
|
|
+| `field >= ?` | `GreaterEqual("field", value)` | 大于等于 |
|
|
|
|
|
+| `field < ?` | `LessThan("field", value)` | 小于 |
|
|
|
|
|
+| `field <= ?` | `LessEqual("field", value)` | 小于等于 |
|
|
|
|
|
+| `field LIKE ?` | `Like("field", value)` | 模糊查询 |
|
|
|
|
|
+| `field NOT LIKE ?` | `NotLike("field", value)` | 不包含 |
|
|
|
|
|
+| `field LIKE 'prefix%'` | `StartsWith("field", "prefix")` | 以...开头 |
|
|
|
|
|
+| `field LIKE '%suffix'` | `EndsWith("field", "suffix")` | 以...结尾 |
|
|
|
|
|
+| `field IS NULL` | `IsNull("field")` | 为空 |
|
|
|
|
|
+| `field IS NOT NULL` | `IsNotNull("field")` | 不为空 |
|
|
|
|
|
+| `field IN (?, ?)` | `In("field", []any{v1, v2})` | IN 查询 |
|
|
|
|
|
+| `field NOT IN (?, ?)` | `NotIn("field", []any{v1, v2})` | NOT IN 查询 |
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+## 迁移示例
|
|
|
|
|
+
|
|
|
|
|
+### 示例 1:简单等值查询
|
|
|
|
|
+
|
|
|
|
|
+#### 旧方式
|
|
|
|
|
+```go
|
|
|
|
|
+ExtendPropertyValues: map[string][]any{
|
|
|
|
|
+ "(extend_properties->>'priority')::numeric = ?": {1},
|
|
|
|
|
+}
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+#### 新方式
|
|
|
|
|
+```go
|
|
|
|
|
+AdvancedQuery: managesdk.AndQuery(
|
|
|
|
|
+ managesdk.AndGroup(
|
|
|
|
|
+ managesdk.Equal("priority", 1),
|
|
|
|
|
+ ),
|
|
|
|
|
+)
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+### 示例 2:多条件 AND 查询
|
|
|
|
|
+
|
|
|
|
|
+#### 旧方式
|
|
|
|
|
+```go
|
|
|
|
|
+ExtendPropertyValues: map[string][]any{
|
|
|
|
|
+ "(extend_properties->>'priority')::numeric = ?": {1},
|
|
|
|
|
+ "(extend_properties->>'progress')::numeric > ?": {50},
|
|
|
|
|
+ "extend_properties->>'deptName' = ?": {"技术部"},
|
|
|
|
|
+}
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+#### 新方式
|
|
|
|
|
+```go
|
|
|
|
|
+AdvancedQuery: managesdk.AndQuery(
|
|
|
|
|
+ managesdk.AndGroup(
|
|
|
|
|
+ managesdk.Equal("priority", 1),
|
|
|
|
|
+ managesdk.GreaterThan("progress", 50),
|
|
|
|
|
+ managesdk.Equal("deptName", "技术部"),
|
|
|
|
|
+ ),
|
|
|
|
|
+)
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+### 示例 3:范围查询
|
|
|
|
|
+
|
|
|
|
|
+#### 旧方式
|
|
|
|
|
+```go
|
|
|
|
|
+ExtendPropertyValues: map[string][]any{
|
|
|
|
|
+ "(extend_properties->>'duration')::numeric BETWEEN ? AND ?": {2.0, 8.0},
|
|
|
|
|
+}
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+#### 新方式
|
|
|
|
|
+```go
|
|
|
|
|
+AdvancedQuery: managesdk.AndQuery(
|
|
|
|
|
+ managesdk.AndGroup(
|
|
|
|
|
+ managesdk.GreaterEqual("duration", 2.0),
|
|
|
|
|
+ managesdk.LessEqual("duration", 8.0),
|
|
|
|
|
+ ),
|
|
|
|
|
+)
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+### 示例 4:IN 查询
|
|
|
|
|
+
|
|
|
|
|
+#### 旧方式
|
|
|
|
|
+```go
|
|
|
|
|
+ExtendPropertyValues: map[string][]any{
|
|
|
|
|
+ "(extend_properties->>'complex')::numeric IN (?, ?)": {2, 3},
|
|
|
|
|
+}
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+#### 新方式
|
|
|
|
|
+```go
|
|
|
|
|
+AdvancedQuery: managesdk.AndQuery(
|
|
|
|
|
+ managesdk.AndGroup(
|
|
|
|
|
+ managesdk.In("complex", []int{2, 3}),
|
|
|
|
|
+ ),
|
|
|
|
|
+)
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+### 示例 5:模糊查询
|
|
|
|
|
+
|
|
|
|
|
+#### 旧方式
|
|
|
|
|
+```go
|
|
|
|
|
+ExtendPropertyValues: map[string][]any{
|
|
|
|
|
+ "extend_properties->>'memberName' LIKE ?": {"%张%"},
|
|
|
|
|
+}
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+#### 新方式
|
|
|
|
|
+```go
|
|
|
|
|
+AdvancedQuery: managesdk.AndQuery(
|
|
|
|
|
+ managesdk.AndGroup(
|
|
|
|
|
+ managesdk.Like("memberName", "%张%"),
|
|
|
|
|
+ ),
|
|
|
|
|
+)
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+### 示例 6:OR 查询
|
|
|
|
|
+
|
|
|
|
|
+#### 旧方式
|
|
|
|
|
+```go
|
|
|
|
|
+// 旧方式不支持 OR 查询,需要多次调用
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+#### 新方式
|
|
|
|
|
+```go
|
|
|
|
|
+AdvancedQuery: managesdk.OrQuery(
|
|
|
|
|
+ managesdk.OrGroup(
|
|
|
|
|
+ managesdk.Equal("priority", 1),
|
|
|
|
|
+ managesdk.Equal("priority", 2),
|
|
|
|
|
+ ),
|
|
|
|
|
+)
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+### 示例 7:复杂组合查询
|
|
|
|
|
+
|
|
|
|
|
+#### 旧方式
|
|
|
|
|
+```go
|
|
|
|
|
+// 旧方式难以表达:(priority = 1 AND progress > 50) OR (priority = 2 AND progress > 80)
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+#### 新方式
|
|
|
|
|
+```go
|
|
|
|
|
+AdvancedQuery: managesdk.OrQuery(
|
|
|
|
|
+ managesdk.AndGroup(
|
|
|
|
|
+ managesdk.Equal("priority", 1),
|
|
|
|
|
+ managesdk.GreaterThan("progress", 50),
|
|
|
|
|
+ ),
|
|
|
|
|
+ managesdk.AndGroup(
|
|
|
|
|
+ managesdk.Equal("priority", 2),
|
|
|
|
|
+ managesdk.GreaterThan("progress", 80),
|
|
|
|
|
+ ),
|
|
|
|
|
+)
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+## 新增功能
|
|
|
|
|
+
|
|
|
|
|
+### 1. 嵌套条件组
|
|
|
|
|
+
|
|
|
|
|
+```go
|
|
|
|
|
+// (priority = 1 AND (progress > 50 OR duration > 4))
|
|
|
|
|
+AdvancedQuery: managesdk.AndQuery(
|
|
|
|
|
+ managesdk.AndGroup(
|
|
|
|
|
+ managesdk.Equal("priority", 1),
|
|
|
|
|
+ managesdk.NewNestedConditionGroup(
|
|
|
|
|
+ managesdk.OrGroup(
|
|
|
|
|
+ managesdk.GreaterThan("progress", 50),
|
|
|
|
|
+ managesdk.GreaterThan("duration", 4),
|
|
|
|
|
+ ),
|
|
|
|
|
+ ),
|
|
|
|
|
+ ),
|
|
|
|
|
+)
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+### 2. 便捷的辅助函数
|
|
|
|
|
+
|
|
|
|
|
+```go
|
|
|
|
|
+// 快速构建 AND 查询
|
|
|
|
|
+managesdk.AndQuery(groups...)
|
|
|
|
|
+
|
|
|
|
|
+// 快速构建 OR 查询
|
|
|
|
|
+managesdk.OrQuery(groups...)
|
|
|
|
|
+
|
|
|
|
|
+// 快速构建 AND 条件组
|
|
|
|
|
+managesdk.AndGroup(conditions...)
|
|
|
|
|
+
|
|
|
|
|
+// 快速构建 OR 条件组
|
|
|
|
|
+managesdk.OrGroup(conditions...)
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+### 3. 丰富的操作符
|
|
|
|
|
+
|
|
|
|
|
+- 基础比较:`Equal`, `NotEqual`, `GreaterThan`, `GreaterEqual`, `LessThan`, `LessEqual`
|
|
|
|
|
+- 字符串匹配:`Like`, `NotLike`, `StartsWith`, `EndsWith`
|
|
|
|
|
+- 空值判断:`IsNull`, `IsNotNull`
|
|
|
|
|
+- 集合操作:`In`, `NotIn`
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+## 向后兼容性
|
|
|
|
|
+
|
|
|
|
|
+⚠️ **这是一个破坏性变更**
|
|
|
|
|
+
|
|
|
|
|
+- `ExtendPropertyValues` 参数已被移除
|
|
|
|
|
+- 所有使用 `ExtendPropertyValues` 的代码需要迁移到 `AdvancedQuery`
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+## 迁移步骤
|
|
|
|
|
+
|
|
|
|
|
+### 1. 更新 SDK 版本
|
|
|
|
|
+
|
|
|
|
|
+确保使用最新版本的 bdata SDK。
|
|
|
|
|
+
|
|
|
|
|
+### 2. 替换查询参数
|
|
|
|
|
+
|
|
|
|
|
+将所有 `ExtendPropertyValues` 替换为 `AdvancedQuery`。
|
|
|
|
|
+
|
|
|
|
|
+### 3. 重写查询逻辑
|
|
|
|
|
+
|
|
|
|
|
+使用新的查询构建器 API 重写查询条件。
|
|
|
|
|
+
|
|
|
|
|
+### 4. 测试验证
|
|
|
|
|
+
|
|
|
|
|
+充分测试所有查询功能,确保结果正确。
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+## 常见问题
|
|
|
|
|
+
|
|
|
|
|
+### Q1: 如何表达复杂的 SQL 条件?
|
|
|
|
|
+
|
|
|
|
|
+**A**: 使用嵌套条件组和多个条件组合:
|
|
|
|
|
+
|
|
|
|
|
+```go
|
|
|
|
|
+// (A AND B) OR (C AND D)
|
|
|
|
|
+managesdk.OrQuery(
|
|
|
|
|
+ managesdk.AndGroup(A, B),
|
|
|
|
|
+ managesdk.AndGroup(C, D),
|
|
|
|
|
+)
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+### Q2: 如何进行 BETWEEN 查询?
|
|
|
|
|
+
|
|
|
|
|
+**A**: 使用 `GreaterEqual` 和 `LessEqual` 组合:
|
|
|
|
|
+
|
|
|
|
|
+```go
|
|
|
|
|
+managesdk.AndGroup(
|
|
|
|
|
+ managesdk.GreaterEqual("field", min),
|
|
|
|
|
+ managesdk.LessEqual("field", max),
|
|
|
|
|
+)
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+### Q3: 如何进行 NOT IN 查询?
|
|
|
|
|
+
|
|
|
|
|
+**A**: 使用 `NotIn` 操作符:
|
|
|
|
|
+
|
|
|
|
|
+```go
|
|
|
|
|
+managesdk.NotIn("field", []any{v1, v2, v3})
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+### Q4: 字段名需要加前缀吗?
|
|
|
|
|
+
|
|
|
|
|
+**A**: 不需要,直接使用字段名即可,底层服务会自动处理:
|
|
|
|
|
+
|
|
|
|
|
+```go
|
|
|
|
|
+// 正确
|
|
|
|
|
+managesdk.Equal("priority", 1)
|
|
|
|
|
+
|
|
|
|
|
+// 错误(不需要加前缀)
|
|
|
|
|
+managesdk.Equal("extend_properties->>'priority'", 1)
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+### Q5: 数值类型需要转换吗?
|
|
|
|
|
+
|
|
|
|
|
+**A**: 不需要,底层服务会自动处理类型转换:
|
|
|
|
|
+
|
|
|
|
|
+```go
|
|
|
|
|
+// 正确
|
|
|
|
|
+managesdk.Equal("priority", 1)
|
|
|
|
|
+
|
|
|
|
|
+// 不需要手动转换
|
|
|
|
|
+managesdk.Equal("(extend_properties->>'priority')::numeric", 1)
|
|
|
|
|
+```
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+## 相关文档
|
|
|
|
|
+
|
|
|
|
|
+- **ACTIVITY_PLAN_USAGE.md** - 完整的使用文档
|
|
|
|
|
+- **advanced_query.go** - AdvancedQuery 实现源码
|
|
|
|
|
+- **model.go** - 数据模型定义
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+## 总结
|
|
|
|
|
+
|
|
|
|
|
+### 优势
|
|
|
|
|
+
|
|
|
|
|
+✅ **类型安全**:编译时检查,减少运行时错误
|
|
|
|
|
+✅ **易于使用**:语义清晰,无需编写 SQL
|
|
|
|
|
+✅ **功能强大**:支持复杂的逻辑组合和嵌套
|
|
|
|
|
+✅ **可维护性**:代码更清晰,易于理解和修改
|
|
|
|
|
+✅ **扩展性**:易于添加新的操作符和功能
|
|
|
|
|
+
|
|
|
|
|
+### 迁移建议
|
|
|
|
|
+
|
|
|
|
|
+1. 优先迁移简单查询
|
|
|
|
|
+2. 逐步迁移复杂查询
|
|
|
|
|
+3. 充分测试每个迁移点
|
|
|
|
|
+4. 保留旧代码作为参考
|
|
|
|
|
+
|
|
|
|
|
+---
|
|
|
|
|
+
|
|
|
|
|
+**变更完成时间**:2026-05-21
|
|
|
|
|
+**变更人员**:Kiro AI
|
|
|
|
|
+**状态**:✅ 已完成
|