forked from erp-dev/erp
feat: pick up logic of api - stock_record_change.post to stock - services module
This commit is contained in:
@@ -5,11 +5,9 @@
|
||||
from rest_framework import status, views
|
||||
from rest_framework.response import Response
|
||||
from rest_framework.permissions import IsAuthenticated
|
||||
from django.db import transaction
|
||||
import logging
|
||||
|
||||
from stock import models as stock_models
|
||||
from basic_info import models as basic_info_models
|
||||
from stock import services as stock_services
|
||||
from drf_spectacular.utils import extend_schema
|
||||
from api_v1 import serializers
|
||||
|
||||
@@ -99,68 +97,24 @@ class CreateStockChangeView(StockChangeViewMixin, views.APIView):
|
||||
}, status=status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
try:
|
||||
with transaction.atomic():
|
||||
# 1. 创建库存变动记录
|
||||
try:
|
||||
warehouse = basic_info_models.WareHouse.objects.get(id=record_data['warehouse'])
|
||||
except basic_info_models.WareHouse.DoesNotExist:
|
||||
return Response({
|
||||
'error': f'仓库ID {record_data["warehouse"]} 不存在'
|
||||
}, status=status.HTTP_400_BAD_REQUEST)
|
||||
|
||||
stock_change_record = stock_models.StockChangeRecord.objects.create(
|
||||
type=record_data['type'],
|
||||
warehouse=warehouse,
|
||||
source_type=record_data['source_type'],
|
||||
source_id=record_data['source_id'],
|
||||
merchant=request.user.employee.merchant,
|
||||
created_by=request.user
|
||||
)
|
||||
|
||||
logger.info(f"创建新库存变动记录 ID: {stock_change_record.id}")
|
||||
|
||||
# 2. 创建库存变动明细
|
||||
created_details = []
|
||||
created_count = 0
|
||||
|
||||
for product_data in products_data:
|
||||
product_id = product_data['product']
|
||||
quantities = product_data['quantity']
|
||||
|
||||
# 获取产品信息
|
||||
try:
|
||||
product = basic_info_models.Product.objects.get(id=product_id)
|
||||
except basic_info_models.Product.DoesNotExist:
|
||||
raise ValueError(f'产品ID {product_id} 不存在')
|
||||
|
||||
# 为每个数量创建明细记录
|
||||
for quantity in quantities:
|
||||
detail = stock_models.StockChangeDetail.objects.create(
|
||||
stock_change_record=stock_change_record,
|
||||
product=product,
|
||||
quantity=quantity,
|
||||
merchant=request.user.employee.merchant,
|
||||
unit=product.unit
|
||||
)
|
||||
created_details.append(detail)
|
||||
created_count += 1
|
||||
stock_change_record, created_details, created_count = stock_services.create_stock_change_record_with_details(
|
||||
merchant=request.user.employee.merchant,
|
||||
created_by=request.user,
|
||||
type=record_data['type'],
|
||||
warehouse_id=record_data['warehouse'],
|
||||
source_type=record_data['source_type'],
|
||||
source_id=record_data['source_id'],
|
||||
products=products_data,
|
||||
)
|
||||
response_serializer = serializers.CreateStockChangeResponseSerializer({
|
||||
'stock_change_record': stock_change_record,
|
||||
'details': created_details,
|
||||
'message': f'成功创建库存变动记录及 {created_count} 条明细',
|
||||
'created_details_count': created_count
|
||||
})
|
||||
|
||||
return Response(response_serializer.data, status=status.HTTP_201_CREATED)
|
||||
|
||||
if warehouse.merchant.auto_complete_stock_change:
|
||||
# 自动确认库存变动
|
||||
from stock import services as stock_services
|
||||
stock_services.make_stock_change_completed(stock_change_record)
|
||||
logger.info(f"自动确认库存变动记录 ID: {stock_change_record.id}")
|
||||
|
||||
# 3. 构建响应
|
||||
response_serializer = serializers.CreateStockChangeResponseSerializer({
|
||||
'stock_change_record': stock_change_record,
|
||||
'details': created_details,
|
||||
'message': f'成功创建库存变动记录及 {created_count} 条明细',
|
||||
'created_details_count': created_count
|
||||
})
|
||||
|
||||
return Response(response_serializer.data, status=status.HTTP_201_CREATED)
|
||||
|
||||
except ValueError as e:
|
||||
return Response({
|
||||
'error': str(e)
|
||||
|
||||
Reference in New Issue
Block a user