# 发货记录合并单元格处理说明 ## 功能特点 系统现在完全支持 Excel 中出货日期列的合并单元格,这是实际业务中常见的格式。 ## Excel 文件结构 ### 典型格式 ``` | 出货日期 | 箱号 | SN1 | SN2 | ... | SN20 | |------------|--------|--------|--------|-----|--------| | 2025-11-20 | BOX001 | SN0001 | SN0002 | ... | SN0020 | | ↓ | BOX002 | SN0021 | SN0022 | ... | SN0040 | | ↓ | BOX003 | SN0041 | SN0042 | ... | SN0060 | | 2025-11-21 | BOX004 | SN0061 | SN0062 | ... | SN0080 | | ↓ | BOX005 | SN0081 | SN0082 | ... | SN0100 | ``` **说明**: - 出货日期列可以合并单元格 - 同一天的多个箱号共用一个日期单元格 - 每行代表一个箱号 - 横向包含该箱的 20 个 SN ## 解析逻辑 ### 1. 合并单元格处理 ```python # 记录上一个有效的日期 last_valid_date = None for row in rows: # 如果当前行日期为空(合并单元格的后续行) if current_date: last_valid_date = current_date date = current_date else: # 使用上一个有效日期 date = last_valid_date ``` ### 2. 数据结构 每行解析后的数据: ```python { 'date': '2025-11-20', # 出货日期 'box': 'BOX001', # 箱号 'sns': ['SN0001', 'SN0002', ...], # SN 列表 'qty': 20 # SN 数量 } ``` ### 3. Redis 存储 每个 SN 单独存储: ``` HSET shipment_sn_mapping "SN0001" '{"date":"2025-11-20","box":"BOX001","ts":"..."}' HSET shipment_sn_mapping "SN0002" '{"date":"2025-11-20","box":"BOX001","ts":"..."}' ... ``` ## 创建测试模板 运行以下命令创建带合并单元格的测试模板: ```bash python create_shipments_template.py ``` 这将生成: - `shipments_template.xlsx` - 带示例数据和合并单元格 - `shipments_template_empty.xlsx` - 空白模板 ## 导入流程 1. **准备 Excel 文件** - 第一列:出货日期(可合并单元格) - 第二列:箱号 - 第3-22列:SN1-SN20 2. **上传文件** - 访问"发货记录"页面 - 选择 Excel 文件 - 点击"验证文件" 3. **验证通过后导入** - 点击"导入数据" - 系统自动解析合并单元格 - 数据存入 SQLite 和 Redis 4. **查询验证** - 访问"SN出货查询"页面 - 输入任意 SN 号 - 查看出货日期和箱号 ## 支持的格式 ### Excel (.xlsx, .xls) - ✅ 支持合并单元格 - ✅ 自动识别空单元格 - ✅ 按 SN 编号排序(SN1, SN2, ..., SN20) ### CSV (.csv) - ✅ 支持空值(相当于合并单元格) - ✅ 自动使用上一行的日期 - ⚠️ CSV 不支持真正的合并单元格,但空值会被正确处理 ## 常见问题 ### Q: 如果日期列第一行就是空的怎么办? A: 系统会跳过该行,直到遇到第一个有效日期。 ### Q: 如果某个箱子的 SN 不足 20 个? A: 没问题,后面的 SN 列可以留空,系统只记录有值的 SN。 ### Q: 可以一天有多少个箱子? A: 没有限制,同一天可以有任意多个箱子,都会使用同一个日期。 ### Q: 箱号可以重复吗? A: 技术上可以,但建议保持唯一,便于追溯。 ## 数据验证 导入后可以通过以下方式验证: ### 1. 查看 Redis 记录数 ```bash redis-cli HLEN shipment_sn_mapping ``` ### 2. 查询特定 SN ```bash redis-cli HGET shipment_sn_mapping "SN0001" ``` ### 3. 通过 Web 界面 - 访问"SN出货查询"页面 - 页面顶部显示总记录数 - 输入 SN 查询详细信息