1
0
forked from erp-dev/erp

feat: added plate order clone

This commit is contained in:
2025-12-16 08:42:53 +08:00
parent 4c9b8e6a42
commit 0638dd1ad3
25 changed files with 46174 additions and 8 deletions

62
api_v2/views/stateflow.py Normal file
View File

@@ -0,0 +1,62 @@
from rest_framework import serializers, status, permissions
from rest_framework.response import Response
from rest_framework.views import APIView
from stateflow import models as stateflow_models
from stateflow import services as stateflow_services
class BusinessObjectCloneRequestSerializer(serializers.Serializer):
business_object_id = serializers.IntegerField(min_value=1)
# 调用方必须显式传入 content_type 与 object_id
# - content_type仅用于校验与源对象一致不做额外校验
# - object_id克隆后的新业务对象 ID必须与源对象不同
content_type = serializers.IntegerField(min_value=1, allow_null=True)
object_id = serializers.IntegerField(min_value=1, allow_null=True)
class BusinessObjectCloneView(APIView):
"""
克隆 BusinessObject含所有状态流转记录与工艺参数记录
POST /api/v2/stateflow/business-objects/clone/
请求体:
{
"business_object_id": 123,
"content_type": 9,
"object_id": 456
}
返回:
{
"business_object_id": 456
}
"""
permission_classes = [permissions.IsAuthenticated]
def post(self, request):
srz = BusinessObjectCloneRequestSerializer(data=request.data)
srz.is_valid(raise_exception=True)
bo_id = srz.validated_data['business_object_id']
expected_content_type_id = srz.validated_data.get('content_type')
new_object_id = srz.validated_data.get('object_id')
try:
bo = stateflow_models.BusinessObject.objects.get(id=bo_id)
except stateflow_models.BusinessObject.DoesNotExist:
return Response({'detail': 'business_object 不存在'}, status=status.HTTP_404_NOT_FOUND)
try:
cloned = stateflow_services.clone_business_object(
bo,
new_object_id=new_object_id,
expected_content_type_id=expected_content_type_id,
)
except ValueError as e:
return Response({'detail': str(e)}, status=status.HTTP_400_BAD_REQUEST)
return Response({'business_object_id': cloned.id})