1
0
forked from erp-dev/erp
Files

114 lines
4.2 KiB
Python
Raw Permalink 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.
"""
库存变动记录详情查询视图
"""
from rest_framework import status, views
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated
import logging
from stock import models as stock_models
from drf_spectacular.utils import extend_schema
from .mixins import StockChangeViewMixin
logger = logging.getLogger(__name__)
class GetStockChangeView(StockChangeViewMixin, views.APIView):
"""获取单个库存变动记录"""
permission_classes = [IsAuthenticated]
@extend_schema(
tags=['读取出入库'],
responses={200: dict},
summary="获取单个库存变动记录",
description="根据ID获取库存变动记录详情包含明细"
)
def get(self, request, record_id):
"""
获取库存变动记录详情(包含所有明细)
GET /api/v1/stock-change/<record_id>/
返回:
{
"stock_change_record": {
"id": 1,
"type": 1,
"warehouse": 1,
"warehouse_name": "主仓库",
"source_type": 1,
"source_id": 1,
"is_finished": true,
"finished_at": "2024-01-01T12:00:00Z",
"created_at": "2024-01-01T12:00:00Z",
"created_by": "admin"
},
"details": [
{
"id": 1,
"product": 1,
"product_name": "产品名称",
"quantity": 85.00,
"unit": 1,
"unit_display": ""
}
],
"total_details": 3
}
"""
# 检查员工权限
if not self.check_employee_permission(request):
return self.permission_error_response('无权限访问')
merchant_id = self.get_merchant_id(request)
try:
# 获取库存变动记录
try:
stock_change_record = stock_models.StockChangeRecord.objects.select_related(
'warehouse', 'created_by'
).get(id=record_id)
except stock_models.StockChangeRecord.DoesNotExist:
return self.not_found_response(f'库存变动记录ID {record_id} 不存在')
# 验证权限:检查记录是否属于当前用户的商户
if stock_change_record.merchant_id != merchant_id:
return self.permission_error_response('无权访问该库存变动记录')
# 验证仓库是否对当前用户可见
if not self.validate_warehouse_visibility(stock_change_record.warehouse_id, request):
return self.permission_error_response('该库存变动记录的仓库对当前用户不可见')
# 获取所有明细记录
details = stock_models.StockChangeDetail.objects.filter(
stock_change_record=stock_change_record
).select_related('product').order_by('id')
# 过滤掉用户不可见的产品明细
visible_details = self.filter_visible_details(details, request)
# 构建响应数据
response_data = {
'stock_change_record': self.build_record_data(stock_change_record),
'details': [self.build_detail_data(detail) for detail in visible_details],
'total_details': len(visible_details)
}
logger.info(f"用户 {request.user.username} 读取库存变动记录 ID: {record_id}")
return Response(response_data, status=status.HTTP_200_OK)
except AttributeError as e:
logger.error(f"用户 {request.user.username} 无员工信息: {str(e)}", exc_info=True)
return self.permission_error_response('用户无员工信息,无权访问')
except Exception as e:
logger.error(f"读取库存变动记录失败: {str(e)}", exc_info=True)
return Response({
'error': '读取库存变动记录失败',
'message': str(e)
}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)