ERP/shipments_merge_cells_guide.md

140 lines
3.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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