compliance/docs/Multi_Key_Delete_Enhancement.md
2025-08-07 22:44:57 +08:00

5.4 KiB
Raw Blame History

多主键删除功能增强总结

🎯 问题背景

原有的删除接口只支持单个主键的简单数组格式:

{"data": ["siteId1", "siteId2"]}

但实际的DMS业务场景中很多删除操作需要支持多主键组合的对象列表格式

{
  "version": "1.0.0",
  "data": [
    {"projectId": "项目1 ID", "surveyId": "工区1 ID"},
    {"projectId": "项目2 ID", "surveyId": "工区2 ID"}
  ]
}

🔧 解决方案

核心改进

  1. 智能Schema检测自动分析删除操作的请求体schema
  2. 多格式支持根据schema自动选择合适的删除格式
  3. 主键提取:从创建负载中自动提取相关主键字段
  4. 默认值生成:为缺失的必需字段生成合理的默认值
  5. 批量删除:支持生成多个删除对象用于批量操作
  6. 优雅回退当无法解析schema时回退到简单格式

实现逻辑

1. 删除请求体构建流程

def _build_delete_request_body(self, scenario, pk_name, pk_value, create_payload):
    # 1. 获取删除操作的schema
    # 2. 分析data字段的结构
    # 3. 判断是简单数组还是对象数组
    # 4. 根据类型构建相应的删除请求体

2. 多主键对象构建

def _build_multi_key_delete_body(self, items_schema, primary_pk_name, primary_pk_value, create_payload):
    # 1. 设置主要主键
    # 2. 从创建负载中提取其他主键
    # 3. 为缺失的必需字段生成默认值
    # 4. 支持批量删除(生成多个对象)

3. 默认值生成策略

def _generate_default_key_value(self, field_name, field_schema):
    # 根据字段名和类型生成语义化的默认值
    # 例如projectId -> "项目xxxx"
    #      surveyId -> "工区xxxx"

📊 支持的删除格式

格式1简单主键数组

适用场景:单主键删除

{
  "data": ["siteId1", "siteId2", "siteId3"]
}

Schema特征

{
  "type": "object",
  "properties": {
    "data": {
      "type": "array",
      "items": {"type": "string"}
    }
  }
}

格式2多主键对象数组

适用场景:复合主键删除

{
  "version": "1.0.0",
  "data": [
    {
      "projectId": "项目1_ID",
      "surveyId": "工区1_ID"
    },
    {
      "projectId": "项目2_ID", 
      "surveyId": "工区2_ID"
    }
  ]
}

Schema特征

{
  "type": "object",
  "properties": {
    "version": {"type": "string"},
    "data": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "projectId": {"type": "string"},
          "surveyId": {"type": "string"}
        },
        "required": ["projectId", "surveyId"]
      }
    }
  }
}

🎯 功能特性

自动检测

  • 根据删除操作的schema自动判断使用哪种格式
  • 无需手动配置,完全自动化

主键提取

  • 自动从创建负载中提取相关的主键字段
  • 支持复杂的主键组合

智能生成

  • 为缺失的必需字段生成语义化的默认值
  • 根据字段名生成合适的值如projectId -> "项目xxxx"

批量支持

  • 自动生成多个删除对象
  • 支持批量删除测试场景

优雅回退

  • 当schema解析失败时自动回退到简单格式
  • 确保删除操作始终可以执行

🔄 工作流程

  1. Schema分析

    删除操作 → 获取请求体schema → 分析data字段类型
    
  2. 格式判断

    items.type == "string" → 简单数组格式
    items.type == "object" → 对象数组格式
    
  3. 数据构建

    对象格式 → 提取主键 → 生成默认值 → 构建删除对象
    
  4. 批量生成

    单个对象 → 复制并修改 → 生成多个对象 → 支持批量删除
    

📝 使用示例

代码中的使用

# 在CRUD Stage的before_stage方法中
delete_request_body = self._build_delete_request_body(
    current_scenario, 
    pk_name, 
    pk_value, 
    create_payload
)
stage_context["delete_request_body"] = delete_request_body

生成的删除请求体示例

单主键场景

{"data": ["site_001"]}

多主键场景

{
  "version": "1.0.0",
  "data": [
    {"projectId": "项目1_ID", "surveyId": "工区1_ID"},
    {"projectId": "项目1_ID", "surveyId": "工区1_ID_2"}
  ]
}

🎉 测试验证

所有测试场景均通过:

  • 单主键删除格式
  • 多主键删除格式
  • 缺失字段的默认值生成
  • 各种回退场景处理

💡 扩展性

添加新的字段类型支持

def _generate_default_key_value(self, field_name, field_schema):
    # 可以轻松添加新的字段类型处理逻辑
    if 'well' in field_name.lower():
        return f"井{uuid.uuid4().hex[:4]}"
    # ... 更多字段类型

自定义删除格式

def _build_multi_key_delete_body(self, items_schema, ...):
    # 可以根据具体业务需求调整删除对象的结构
    # 例如添加时间戳、操作人等字段

🚀 总结

通过这次增强DMS CRUD Stage现在能够

  1. 智能适应不同的删除接口格式
  2. 自动构建符合业务规则的删除请求体
  3. 支持复杂的多主键删除场景
  4. 提供批量删除测试能力
  5. 确保兼容性,不破坏现有功能

这使得DMS合规性测试能够覆盖更多真实的业务场景提高测试的准确性和有效性