140 lines
3.5 KiB
Markdown
140 lines
3.5 KiB
Markdown
# 发货记录合并单元格处理说明
|
||
|
||
## 功能特点
|
||
|
||
系统现在完全支持 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 查询详细信息
|