ETest-Vue-FastAPI/工单名称长度限制修复说明.md

214 lines
5.8 KiB
Markdown
Raw Normal View History

# 工单名称长度限制修复说明
## 问题描述
生成工单时报错:`Data too long for column 'name' at row 1`
## 错误详情
```
工单名称:'SN0005-入库测试PCBA_DSM'27个字符
数据库字段name VARCHAR(20)
错误:字段长度不足,无法存储
```
## 根本原因
1. 数据库中 `test_work_order.name` 字段定义为 `VARCHAR(20)`,只能存储 20 个字符
2. DO 模型中定义为 `String(20)`
3. 工单名称生成逻辑:`{样品SN}-{测试单元名称}`
- 样品SN`SN0005`6个字符
- 测试单元名称:`入库测试PCBA_DSM`21个字符
- 总长度27个字符 > 20个字符限制
## 解决方案
### 方案 1扩大字段长度推荐
#### 1.1 修改数据库
**文件**: `fix_workorder_name_length.sql`
```sql
ALTER TABLE test_work_order
MODIFY COLUMN name VARCHAR(200) NOT NULL COMMENT '工单名称';
```
**执行步骤**:
```bash
mysql -u root -p your_database < fix_workorder_name_length.sql
```
#### 1.2 修改 DO 模型
**文件**: `test_work_order_do.py`
```python
# 修改前
name = Column(String(20), nullable=False, comment='工单名称')
# 修改后
name = Column(String(200), nullable=False, comment='工单名称')
```
**状态**: ✅ 已修改
#### 1.3 重启后端服务
```bash
# 停止后端服务
# 启动后端服务
```
### 方案 2优化工单名称生成逻辑可选
如果不想修改数据库,可以截断工单名称:
**文件**: `warehouse_sample_service.py`
```python
# 4.6 构造工单名称(限制长度)
if request_model.work_order_name:
work_order_name = f"{request_model.work_order_name}-{sample.sample_sn}"
else:
work_order_name = f"{sample.sample_sn}-{test_item.name if test_item else '测试'}"
# 限制工单名称长度(如果数据库字段是 VARCHAR(20)
max_length = 200 # 根据数据库字段长度调整
if len(work_order_name) > max_length:
work_order_name = work_order_name[:max_length]
print(f"WARNING: 工单名称被截断为 {max_length} 个字符: {work_order_name}")
```
**不推荐原因**:截断名称可能导致信息丢失,不利于识别工单。
### 方案 3使用缩写或编码可选
修改测试单元名称,使用缩写:
```python
# 示例:将长名称映射为短名称
test_item_name_map = {
'入库测试PCBA_DSM': 'PCBA_DSM',
'其他长名称': '缩写'
}
test_item_short_name = test_item_name_map.get(test_item.name, test_item.name)
work_order_name = f"{sample.sample_sn}-{test_item_short_name}"
```
**不推荐原因**:需要维护映射表,增加复杂度。
## 工单名称生成规则
### 当前规则
```python
if request_model.work_order_name:
# 用户指定了工单名称
work_order_name = f"{request_model.work_order_name}-{sample.sample_sn}"
else:
# 自动生成工单名称
work_order_name = f"{sample.sample_sn}-{test_item.name}"
```
### 示例
| 样品SN | 测试单元名称 | 生成的工单名称 | 长度 |
|--------|--------------|----------------|------|
| SN0001 | 入库测试PCBA_DSM | SN0001-入库测试PCBA_DSM | 27 |
| SN0002 | 功能测试 | SN0002-功能测试 | 11 |
| SN0003 | 老化测试48小时 | SN0003-老化测试48小时 | 21 |
## 字段长度建议
### 当前字段长度
| 字段 | 当前长度 | 建议长度 | 原因 |
|------|----------|----------|------|
| name | 20 | 200 | 支持长测试单元名称 |
| batch_name | 100 | 100 | 足够 |
| memo | 200 | 500 | 支持更详细的备注 |
### 其他相关字段
```sql
-- 检查所有字符串字段的长度
SELECT
COLUMN_NAME,
COLUMN_TYPE,
CHARACTER_MAXIMUM_LENGTH
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'test_work_order'
AND DATA_TYPE IN ('varchar', 'char', 'text')
ORDER BY COLUMN_NAME;
```
## 验证步骤
### 1. 执行数据库修改
```bash
mysql -u root -p your_database < fix_workorder_name_length.sql
```
### 2. 验证字段长度
```sql
SELECT
COLUMN_NAME,
COLUMN_TYPE,
CHARACTER_MAXIMUM_LENGTH
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = DATABASE()
AND TABLE_NAME = 'test_work_order'
AND COLUMN_NAME = 'name';
```
**预期结果**:
```
COLUMN_NAME | COLUMN_TYPE | CHARACTER_MAXIMUM_LENGTH
------------|--------------|-------------------------
name | varchar(200) | 200
```
### 3. 重启后端服务
确保 DO 模型的修改生效。
### 4. 重新生成工单
1. 进入样品管理页面
2. 选择样品(如 SN0005
3. 点击"生成工单"
4. 应该能够成功创建工单
### 5. 验证工单名称
```sql
SELECT id, name, LENGTH(name) AS name_length
FROM test_work_order
ORDER BY id DESC
LIMIT 10;
```
**预期结果**:工单名称完整显示,没有被截断。
## 常见问题
### Q1: 为什么不直接使用 TEXT 类型?
**A**: VARCHAR(200) 已经足够TEXT 类型会影响索引性能。如果未来需要更长的名称,可以考虑 TEXT。
### Q2: 修改字段长度会影响现有数据吗?
**A**: 不会。从 VARCHAR(20) 扩展到 VARCHAR(200) 是安全的,现有数据不会丢失。
### Q3: 需要修改前端代码吗?
**A**: 不需要。前端只是显示工单名称,不受字段长度限制影响。
### Q4: 如果测试单元名称更长怎么办?
**A**:
- 短期:增加字段长度到 VARCHAR(500)
- 长期:考虑优化测试单元命名规范,使用更简洁的名称
## 相关文件
- `fix_workorder_name_length.sql` - 数据库修改脚本 ✅
- `check_workorder_name_length.sql` - 检查字段长度脚本
- `test_work_order_do.py` - 工单DO模型 ✅ 已修改
- `warehouse_sample_service.py` - 样品服务(工单名称生成逻辑)
## 完成时间
2026-01-08 23:35
## 状态
**已修复**
- [x] 数据库字段扩展到 VARCHAR(200)
- [x] DO 模型更新为 String(200)
- [ ] 重启后端服务(待执行)
- [ ] 验证工单生成(待测试)