# PDF面单条码提取功能规划 ## 一、需求分析 ### 背景 物流面单PDF中通常包含一维码或二维码,存储了运单号、跟踪号等核心信息,在定时任务预解析PDF缓存时同步提取条码信息,可以避免后续业务流程重复解析PDF,提升处理效率。 ### 目标 1. 在定时任务解析PDF面单时,自动识别并提取其中的一维码和二维码内容 2. 存储提取到的条码信息,供后续业务场景直接使用 3. 不影响现有PDF缓存主流程,识别失败时自动降级 ## 二、现有资源评估 1. **已有依赖**:项目已集成`ZXing.Net`条码识别库、`PdfSharp`PDF处理库,无需新增第三方依赖 2. **现有流程**:定时任务已有完整的PDF下载、解析、页数校验流程,可直接嵌入条码识别步骤 3. **存储基础**:已有`label_pdf_cache`表,可扩展字段存储条码信息 ## 三、方案设计 ### 1. 数据库扩展 #### 1.1 新增基础关联字段(参考LabelReplaceEntity命名规范) | 字段名 | 类型 | 说明 | | --- | --- | --- | | FinalMileTrackingNumber | varchar(100) | 尾程跟踪单号(与订单表字段一致) | | CustomerId | int | 客户ID(与订单表字段一致,关联customers表) | #### 1.2 新增条码识别字段 | 字段名 | 类型 | 说明 | | --- | --- | --- | | BarcodeNumber | varchar(100) | 提取到的条码单号 | | BarcodeType | tinyint | 条码类型:0=未识别到,1=一维码,2=二维码 | | BarcodeConfidence | int | 识别置信度(0-100,数值越高识别结果越可靠) | | BarcodeExtractTime | datetime | 条码提取完成时间 | ### 字段注释规范 - 所有实体类字段都添加XML注释,明确字段含义 - 数据库表字段添加COMMENT注释,便于维护和理解 - 命名完全参考订单表`LabelReplaceEntity`的命名风格,保持项目一致性 ### 2. 条码识别逻辑设计 #### 识别流程: ```mermaid graph LR A[获取PDF字节流] --> B[渲染PDF第一页为图片] B --> C[优先识别二维码] C --> D{识别成功?} D -->|是| E[存储二维码内容] D -->|否| F[识别一维码] F --> G{识别成功?} G -->|是| H[存储一维码内容] G -->|否| I[标记为未识别] E & H & I --> J[继续后续缓存流程] ``` #### 识别策略: - 优先识别二维码,其次识别一维码,符合物流面单常用设计 - 仅识别PDF第一页(面单通常只有一页) - 支持常见条码格式:CODE128、CODE39、QR Code、PDF417等物流行业常用格式 - 识别失败不影响主缓存流程,仅记录日志 ### 3. 性能保障 - 条码识别作为异步流程的一部分,不影响接口响应速度 - 单次识别时间控制在500ms以内,避免影响定时任务处理效率 - 识别异常时添加熔断机制,避免重复识别无效PDF ## 四、实施步骤 ### 步骤1:数据结构扩展 1. 扩展`LabelPdfCache`实体类,新增条码相关字段 2. 生成数据库ALTER TABLE更新脚本,添加新字段 ### 步骤2:条码识别功能实现 1. 实现条码识别工具方法,输入PDF字节流,输出识别到的条码信息 2. 集成ZXing.Net库,配置物流常用条码格式 3. 实现PDF页面转图片功能,用于条码识别 ### 步骤3:定时任务集成 1. 在`LabelPdfCacheService.ProcessSingleCacheTask`方法中,PDF页数校验通过后加入条码识别步骤 2. 将识别结果保存到缓存表对应字段 3. 添加识别日志和异常处理 ### 步骤4:测试验证 1. 用实际物流面单测试条码识别准确率 2. 测试识别失败场景的降级处理逻辑 3. 验证定时任务整体性能不受影响 ## 五、后续扩展 1. 可根据业务需求,支持多条码识别和存储 2. 可针对不同客户的面单格式优化识别参数 3. 可将条码识别结果用于面单校验,提高数据准确性