forked from erp-dev/erp
91 lines
3.3 KiB
Python
91 lines
3.3 KiB
Python
"""
|
|
库存变动视图的公共 Mixin
|
|
|
|
提供通用的权限检查、数据构建、错误响应等方法
|
|
"""
|
|
|
|
from rest_framework import status
|
|
from rest_framework.response import Response
|
|
from basic_info.services import DataVisibilityService
|
|
import logging
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
class StockChangeViewMixin:
|
|
"""库存变动视图基类,提供公共方法"""
|
|
|
|
def get_merchant_id(self, request):
|
|
"""获取当前用户的商户ID"""
|
|
try:
|
|
return request.user.employee.merchant_id
|
|
except AttributeError:
|
|
return None
|
|
|
|
def check_employee_permission(self, request):
|
|
"""检查用户是否有员工信息"""
|
|
if not hasattr(request.user, 'employee'):
|
|
logger.error(f"用户 {request.user.username} 无员工信息")
|
|
return False
|
|
return True
|
|
|
|
def validate_warehouse_visibility(self, warehouse_id, request):
|
|
"""验证仓库对当前用户是否可见"""
|
|
return DataVisibilityService.is_warehouse_visible_to_employee(warehouse_id, request.user)
|
|
|
|
def validate_product_visibility(self, product_id, request):
|
|
"""验证产品对当前用户是否可见"""
|
|
return DataVisibilityService.is_product_visible_to_employee(product_id, request.user)
|
|
|
|
def filter_visible_details(self, details, request):
|
|
"""过滤出用户可见的产品明细"""
|
|
visible_details = []
|
|
for detail in details:
|
|
if self.validate_product_visibility(detail.product_id, request):
|
|
visible_details.append(detail)
|
|
return visible_details
|
|
|
|
def build_record_data(self, record):
|
|
"""构建库存变动记录数据"""
|
|
return {
|
|
'id': record.id,
|
|
'type': record.type,
|
|
'type_display': record.get_type_display(),
|
|
'warehouse': record.warehouse_id,
|
|
'warehouse_name': record.warehouse.name,
|
|
'source_type': record.source_type,
|
|
'source_type_display': record.get_source_type_display(),
|
|
'source_id': record.source_id,
|
|
'is_finished': record.is_finished,
|
|
'finished_at': record.finished_at,
|
|
'created_at': record.created_at,
|
|
'created_by': record.created_by.username if record.created_by else None,
|
|
'remarks': record.remarks,
|
|
}
|
|
|
|
def build_detail_data(self, detail):
|
|
"""构建明细数据"""
|
|
return {
|
|
'id': detail.id,
|
|
'product': detail.product_id,
|
|
'product_name': detail.product.name,
|
|
'quantity': float(detail.quantity),
|
|
'unit': detail.unit,
|
|
'unit_display': detail.get_unit_display(),
|
|
}
|
|
|
|
def error_response(self, error_msg, details=None, status_code=status.HTTP_400_BAD_REQUEST):
|
|
"""统一的错误响应"""
|
|
response_data = {'error': error_msg}
|
|
if details:
|
|
response_data['details'] = details
|
|
return Response(response_data, status=status_code)
|
|
|
|
def permission_error_response(self, message='无权限访问'):
|
|
"""权限错误响应"""
|
|
return Response({'error': message}, status=status.HTTP_403_FORBIDDEN)
|
|
|
|
def not_found_response(self, message):
|
|
"""未找到资源响应"""
|
|
return Response({'error': message}, status=status.HTTP_404_NOT_FOUND)
|