# 多主键删除功能增强总结 ## 🎯 问题背景 原有的删除接口只支持单个主键的简单数组格式: ```json {"data": ["siteId1", "siteId2"]} ``` 但实际的DMS业务场景中,很多删除操作需要支持多主键组合的对象列表格式: ```json { "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. 删除请求体构建流程 ```python def _build_delete_request_body(self, scenario, pk_name, pk_value, create_payload): # 1. 获取删除操作的schema # 2. 分析data字段的结构 # 3. 判断是简单数组还是对象数组 # 4. 根据类型构建相应的删除请求体 ``` #### 2. 多主键对象构建 ```python def _build_multi_key_delete_body(self, items_schema, primary_pk_name, primary_pk_value, create_payload): # 1. 设置主要主键 # 2. 从创建负载中提取其他主键 # 3. 为缺失的必需字段生成默认值 # 4. 支持批量删除(生成多个对象) ``` #### 3. 默认值生成策略 ```python def _generate_default_key_value(self, field_name, field_schema): # 根据字段名和类型生成语义化的默认值 # 例如:projectId -> "项目xxxx" # surveyId -> "工区xxxx" ``` ## 📊 支持的删除格式 ### 格式1:简单主键数组 **适用场景**:单主键删除 ```json { "data": ["siteId1", "siteId2", "siteId3"] } ``` **Schema特征**: ```json { "type": "object", "properties": { "data": { "type": "array", "items": {"type": "string"} } } } ``` ### 格式2:多主键对象数组 **适用场景**:复合主键删除 ```json { "version": "1.0.0", "data": [ { "projectId": "项目1_ID", "surveyId": "工区1_ID" }, { "projectId": "项目2_ID", "surveyId": "工区2_ID" } ] } ``` **Schema特征**: ```json { "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. **批量生成** ``` 单个对象 → 复制并修改 → 生成多个对象 → 支持批量删除 ``` ## 📝 使用示例 ### 代码中的使用 ```python # 在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 ``` ### 生成的删除请求体示例 **单主键场景**: ```json {"data": ["site_001"]} ``` **多主键场景**: ```json { "version": "1.0.0", "data": [ {"projectId": "项目1_ID", "surveyId": "工区1_ID"}, {"projectId": "项目1_ID", "surveyId": "工区1_ID_2"} ] } ``` ## 🎉 测试验证 所有测试场景均通过: - ✅ 单主键删除格式 - ✅ 多主键删除格式 - ✅ 缺失字段的默认值生成 - ✅ 各种回退场景处理 ## 💡 扩展性 ### 添加新的字段类型支持 ```python def _generate_default_key_value(self, field_name, field_schema): # 可以轻松添加新的字段类型处理逻辑 if 'well' in field_name.lower(): return f"井{uuid.uuid4().hex[:4]}" # ... 更多字段类型 ``` ### 自定义删除格式 ```python def _build_multi_key_delete_body(self, items_schema, ...): # 可以根据具体业务需求调整删除对象的结构 # 例如添加时间戳、操作人等字段 ``` ## 🚀 总结 通过这次增强,DMS CRUD Stage现在能够: 1. **智能适应**不同的删除接口格式 2. **自动构建**符合业务规则的删除请求体 3. **支持复杂**的多主键删除场景 4. **提供批量**删除测试能力 5. **确保兼容性**,不破坏现有功能 这使得DMS合规性测试能够覆盖更多真实的业务场景,提高测试的准确性和有效性!