# 任务 1: 入口流程分析 ## CleanTask.doTask() 方法执行流程分析 ### 核心步骤 1. **工作表筛选与分类** - 创建 `extractSheetList` 存储无模板ID的工作表 - 创建 `sheetMap` 映射有模板ID的工作表(键为sheetName) - 筛选逻辑:只处理有模板ID的工作表 2. **文件类型处理** - 通过 `fileInfo.getFileType()` 获取文件类型并转换为 `ExcelTypeEnum` - 支持多种文件类型(Excel、CSV等) 3. **ETL监听器创建** - 创建 `StreamingEtlListener` 实例 - 传入 `LogDirtyDataHandler` 处理脏数据 - 传入工作表信息列表和提取列表 4. **文件读取配置** - 获取文件编码 `Charset` - 使用 try-with-resources 创建 `ExcelReader` - 配置参数:密码、表头行号、文件类型、自动修剪、编码、转换器 5. **CSV特殊处理** - 对于CSV文件,设置分隔符配置 - 直接调用 `reader.readAll()` 读取所有数据 6. **Excel工作表排序** - 获取所有工作表 `readSheets` - 按优先级排序: - 优先处理 `OPEN_ACCOUNT_ID` 中的模板ID(1、2) - 然后处理其他模板ID - 按排序后的顺序读取工作表 7. **异常处理** - 捕获通用异常,记录错误日志 - 处理特定异常: - `UnsupportedFileFormatException` 或 `POIXMLException`:标记文件为不支持 - `EncryptedDocumentException`:标记文件为加密 8. **结果处理** - 将主文件信息添加到 `sheetList` - 通过 `FileInfoMapper` 批量插入文件信息到数据库 - 使用 `DynamicDsKey.with("case", ...)` 切换数据源 ### 关键设计特点 1. **流式处理**:使用 `StreamingEtlListener` 实现逐行处理,支持大数据量文件 2. **优先级处理**:开户信息优先处理,确保依赖关系正确 3. **异常容错**:完善的异常处理机制,确保任务不会因单个文件失败而中断 4. **资源管理**:使用 try-with-resources 确保资源正确释放 5. **数据源隔离**:使用动态数据源切换,确保数据存储到正确的数据库 ### 代码优化建议 1. **错误处理增强**:可以考虑添加更细粒度的错误分类和处理 2. **日志增强**:添加更多关键步骤的日志记录,便于问题排查 3. **参数验证**:增加对输入参数的验证,提高代码健壮性 4. **性能优化**:对于大量工作表的情况,可以考虑并行处理 ### 数据流图 ``` [文件] → [CleanTask.doTask()] → [工作表筛选] → [创建ETL监听器] → [文件读取] ↓ [按优先级排序工作表] ↓ [逐行处理数据] ↓ [异常处理] ↓ [批量存储结果] ```