1
0
forked from erp-dev/erp

feat: auto complete stock change

This commit is contained in:
2025-11-10 09:01:25 +08:00
parent 37c2e7d723
commit b2078dfa46
82 changed files with 1071 additions and 1336 deletions

View File

@@ -83,4 +83,11 @@ class CreateStockChangeResponseSerializer(serializers.Serializer):
stock_change_record = StockChangeRecordResponseSerializer()
details = StockChangeDetailResponseSerializer(many=True)
message = serializers.CharField()
created_details_count = serializers.IntegerField()
created_details_count = serializers.IntegerField()
class SetMerchantAutoCompleteStockChangeSerializer(serializers.Serializer):
"""设置商户自动确认库存变动序列化器"""
auto_complete = serializers.BooleanField(
help_text="是否自动确认库存变动"
)

View File

@@ -4,4 +4,9 @@ from . import views
urlpatterns = [
# 库存变动相关API
path('stock-change/', views.create_full_stock_change, name='create_full_stock_change'),
path(
'set-merchant-auto-complete-stock-change/',
views.set_merchant_auto_complete_stock_change,
name='set_merchant_auto_complete_stock_change',
),
]

View File

@@ -1,9 +1,8 @@
from rest_framework import status
from rest_framework.decorators import api_view, permission_classes
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from basic_info.services import DataVisibilityService
from django.db import transaction
from typing import List, Dict, Any
import logging
from stock import models as stock_models
@@ -57,6 +56,20 @@ def create_full_stock_change(request):
return Response({
'error': '产品列表不能为空'
}, status=status.HTTP_400_BAD_REQUEST)
# 验证仓库是否本员工可见
if not DataVisibilityService.is_warehouse_visible_to_employee(record_data['warehouse'], request.user):
return Response({
'error': f'仓库ID {record_data["warehouse"]} 对当前用户不可见'
}, status=status.HTTP_403_FORBIDDEN)
# 验证产品是否本员工可见
for p in products_data:
product_id = p.get('product')
if not DataVisibilityService.is_product_visible_to_employee(product_id, request.user):
return Response({
'error': f'产品ID {product_id} 对当前用户不可见'
}, status=status.HTTP_403_FORBIDDEN)
# 验证产品数据
product_serializer = serializers.CreateStockChangeSerializer(data={
@@ -83,7 +96,8 @@ def create_full_stock_change(request):
warehouse=warehouse,
source_type=record_data['source_type'],
source_id=record_data['source_id'],
# created_by=request.user
merchant=request.user.employee.merchant,
created_by=request.user
)
logger.info(f"创建新库存变动记录 ID: {stock_change_record.id}")
@@ -108,10 +122,18 @@ def create_full_stock_change(request):
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
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({
@@ -134,3 +156,30 @@ def create_full_stock_change(request):
'error': '创建库存变动记录失败',
'message': str(e)
}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
@extend_schema(tags=['修改商户自动确认出入库设定'])
@api_view(['POST'])
def set_merchant_auto_complete_stock_change(request):
"""
设置商户自动确认库存变动设定
POST /api/v1/merchant/set-auto-complete-stock-change/
请求参数:
{
"auto_complete_stock_change": true // 是否自动确认库存变动
}
"""
try:
emp = request.user.employee
merchant = emp.merchant
serializer = serializers.SetMerchantAutoCompleteStockChangeSerializer(data=request.data)
if serializer.is_valid():
auto_complete = serializer.validated_data['auto_complete']
merchant.auto_complete_stock_change = auto_complete
merchant.save()
logger.info(f"用户 {request.user.username} 设置商户 {merchant.name} 自动确认库存变动为 {auto_complete}")
return Response({'status': 'success'})
return Response({'error': serializer.errors}, status=status.HTTP_400_BAD_REQUEST)
except AttributeError:
logger.error(f"用户 {request.user.username} 无权限设置商户自动确认库存变动", exc_info=True)
return Response({'error': '无权限操作'}, status=status.HTTP_403_FORBIDDEN)