1
0
forked from erp-dev/erp
Files
erpnew/api_v1/views/stock_change_views/README.md
2025-11-24 15:57:19 +08:00

142 lines
4.2 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.
# Stock Change Views 重构说明
## 重构概览
将原来的 `stock_change.py` 单文件546行重构为模块化的类视图结构。
## 文件结构
```
stock_change_views/
├── __init__.py # 模块导出,提供向后兼容的函数式接口
├── mixins.py # 公共 Mixin 类,提供可复用方法
├── create.py # 创建库存变动视图
├── list.py # 列表查询视图
├── detail.py # 详情查询视图
└── settings.py # 商户设置视图
```
## 重构收益
### 1. 代码复用(减少 ~60% 重复代码)
**重复逻辑提取到 `StockChangeViewMixin`**
-`check_employee_permission()` - 员工权限检查
-`validate_warehouse_visibility()` - 仓库可见性验证
-`validate_product_visibility()` - 产品可见性验证
-`filter_visible_details()` - 过滤可见明细
-`build_record_data()` - 构建记录数据
-`build_detail_data()` - 构建明细数据
-`error_response()` - 统一错误响应
-`permission_error_response()` - 权限错误响应
-`not_found_response()` - 未找到响应
### 2. 代码组织清晰
| 文件 | 行数 | 职责 |
|------|------|------|
| `mixins.py` | ~100 | 公共方法 |
| `create.py` | ~190 | 创建逻辑 |
| `list.py` | ~230 | 列表查询 |
| `detail.py` | ~120 | 详情查询 |
| `settings.py` | ~70 | 设置接口 |
**对比原文件 546 行单文件,每个类职责更清晰。**
### 3. 更好的可维护性
- 每个视图类独立文件,修改不影响其他视图
- Mixin 统一管理公共逻辑,修改一处即可
- 更容易编写单元测试
### 4. 符合 DRF 规范
- 使用 `APIView` 类视图
- 明确的 `permission_classes`
- 完整的 `@extend_schema` 文档注释
## 向后兼容
`__init__.py` 中导出函数式接口:
```python
# 这些接口保持不变URL 配置无需修改
create_full_stock_change = CreateStockChangeView.as_view()
create_relaxed_stock_change = CreateStockChangeRelaxedView.as_view()
list_stock_changes = ListStockChangesView.as_view()
get_stock_change = GetStockChangeView.as_view()
set_merchant_auto_complete_stock_change = SetMerchantAutoCompleteView.as_view()
```
## 逻辑一致性保证
**所有业务逻辑完全保持不变:**
- 权限检查逻辑相同
- 数据验证逻辑相同
- 数据库操作逻辑相同
- 响应格式相同
- 错误处理相同
## 使用方式
### 在 URL 配置中(无需修改)
```python
from api_v1.views import stock_change_views
urlpatterns = [
path('stock-change/', stock_change_views.create_full_stock_change),
path('stock-change/relaxed/', stock_change_views.create_relaxed_stock_change),
path('stock-changes/', stock_change_views.list_stock_changes),
path('stock-change/<int:record_id>/', stock_change_views.get_stock_change),
path('set-merchant-auto-complete-stock-change/', stock_change_views.set_merchant_auto_complete_stock_change),
]
```
### 也可以直接使用类视图
```python
from api_v1.views.stock_change_views import (
CreateStockChangeView,
CreateStockChangeRelaxedView,
ListStockChangesView,
GetStockChangeView,
SetMerchantAutoCompleteView,
)
urlpatterns = [
path('stock-change/', CreateStockChangeView.as_view()),
path('stock-change/relaxed/', CreateStockChangeRelaxedView.as_view()),
path('stock-changes/', ListStockChangesView.as_view()),
path('stock-change/<int:record_id>/', GetStockChangeView.as_view()),
path('set-merchant-auto-complete-stock-change/', SetMerchantAutoCompleteView.as_view()),
]
```
## 迁移步骤
1. ✅ 创建新的 `stock_change_views/` 模块
2. ✅ 实现所有类视图,保持逻辑一致
3. ✅ 在 `views/__init__.py` 中添加兼容导入
4. ⏳ 测试所有接口功能正常
5. ⏳ 删除旧的 `stock_change.py` 文件
## 测试验证
```bash
# 测试导入
python manage.py shell -c "from api_v1.views.stock_change_views import create_full_stock_change; print('✓ 导入成功')"
# 测试服务器启动
python manage.py runserver
# 测试 API 接口
curl -X POST http://localhost:8000/api/v1/stock-change/ -H "Authorization: Bearer <token>" -d '{"type": 1, ...}'
```
## 下一步
如果测试通过,可以安全删除 `api_v1/views/stock_change.py` 文件。