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

4.2 KiB
Raw Blame History

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 中导出函数式接口:

# 这些接口保持不变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 配置中(无需修改)

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),
]

也可以直接使用类视图

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 文件

测试验证

# 测试导入
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 文件。