1
0
forked from erp-dev/erp
Files
erpnew/api_v1/views/stock_change_views/finish.py

85 lines
2.9 KiB
Python
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.
"""
标记库存变动记录完成的视图
"""
from rest_framework import status, views
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated
import logging
from drf_spectacular.utils import extend_schema
from stock import models as stock_models, services as stock_services
from .mixins import StockChangeViewMixin
logger = logging.getLogger(__name__)
class FinishStockChangeView(StockChangeViewMixin, views.APIView):
"""标记库存变动记录为完成"""
permission_classes = [IsAuthenticated]
@extend_schema(
tags=['完成出入库'],
responses={200: dict},
summary='手动完成库存变动记录',
description='根据出入库单ID手动触发库存扣减、快照写入并标记为完成'
)
def post(self, request, record_id: int):
if not self.check_employee_permission(request):
return self.permission_error_response('无权限操作')
merchant_id = self.get_merchant_id(request)
if merchant_id is None:
return self.permission_error_response('无权限操作')
try:
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 record.merchant_id != merchant_id:
return self.permission_error_response('无权操作该库存变动记录')
if not self.validate_warehouse_visibility(record.warehouse_id, request):
return self.permission_error_response('该库存变动记录的仓库对当前用户不可见')
try:
stock_services.make_stock_change_completed(record)
record.refresh_from_db()
message = (
'库存变动记录已标记为完成'
if record.is_finished else
'库存变动记录仍未完成,请检查明细'
)
status_flag = 'success' if record.is_finished else 'pending'
logger.info(
'用户 %s 手动完成库存变动记录 %s(状态:%s',
request.user.username,
record.id,
status_flag,
)
return Response({
'status': status_flag,
'message': message,
'stock_change_record': self.build_record_data(record),
}, status=status.HTTP_200_OK)
except Exception as exc:
logger.error(
'手动完成库存变动记录 %s 失败: %s',
record_id,
str(exc),
exc_info=True,
)
return Response({
'error': '标记库存变动记录失败',
'message': str(exc),
}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)