ERP/shipments_merge_cells_guide.md

140 lines
3.5 KiB
Markdown
Raw Normal View History

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