1
0
forked from erp-dev/erp

feat: stateflow v2 (params required)

This commit is contained in:
2025-11-15 19:39:15 +08:00
parent 9ad404a365
commit 9c38e2ac09
24 changed files with 3670 additions and 547 deletions

View File

@@ -13,7 +13,7 @@ class StateParameterSerializer(serializers.ModelSerializer):
class Meta:
model = models.StateParameter
fields = ['id', 'key', 'value', 'attachment', 'attachment_url', 'description']
fields = ['id', 'key', 'value', 'attachment', 'attachment_url', 'description', 'is_required', 'is_image_path']
read_only_fields = ['id', 'attachment_url']
def get_attachment_url(self, obj):
@@ -47,39 +47,50 @@ class StateDetailSerializer(serializers.ModelSerializer):
class StateCreateUpdateSerializer(serializers.ModelSerializer):
"""状态创建/更新序列化器"""
parameters = StateParameterSerializer(many=True, required=False)
parameter_ids = serializers.ListField(
child=serializers.IntegerField(),
required=False,
write_only=True,
help_text="参数ID列表"
)
parameters = StateParameterSerializer(many=True, read_only=True)
class Meta:
model = models.State
fields = ['name', 'description', 'parameters']
fields = ['name', 'description', 'parameter_ids', 'parameters']
def validate_parameter_ids(self, value):
"""验证参数ID是否存在"""
if value:
existing_ids = set(models.StateParameter.objects.filter(id__in=value).values_list('id', flat=True))
invalid_ids = set(value) - existing_ids
if invalid_ids:
raise serializers.ValidationError(f"参数ID不存在: {invalid_ids}")
return value
@transaction.atomic
def create(self, validated_data):
parameters_data = validated_data.pop('parameters', [])
parameter_ids = validated_data.pop('parameter_ids', [])
state = models.State.objects.create(**validated_data)
# 创建参数
for param_data in parameters_data:
models.StateParameter.objects.create(state=state, **param_data)
# 关联参数(多对多)
if parameter_ids:
state.parameters.set(parameter_ids)
return state
@transaction.atomic
def update(self, instance, validated_data):
parameters_data = validated_data.pop('parameters', None)
parameter_ids = validated_data.pop('parameter_ids', None)
# 更新基本字段
instance.name = validated_data.get('name', instance.name)
instance.description = validated_data.get('description', instance.description)
instance.save()
# 如果提供了参数数据,更新参数
if parameters_data is not None:
# 删除旧参数
instance.parameters.all().delete()
# 创建新参数
for param_data in parameters_data:
models.StateParameter.objects.create(state=instance, **param_data)
# 如果提供了参数ID列表,更新关联
if parameter_ids is not None:
instance.parameters.set(parameter_ids)
return instance
@@ -180,6 +191,15 @@ class ProcessCreateUpdateSerializer(serializers.ModelSerializer):
# BusinessObject 序列化器
class StateLogParameterRecordSerializer(serializers.ModelSerializer):
"""状态流转参数记录序列化器"""
class Meta:
model = models.StateLogParameterRecord
fields = ['id', 'state_log', 'parameters', 'created_at', 'remark']
read_only_fields = ['id', 'created_at']
class StateFlowRecordSerializer(serializers.ModelSerializer):
"""状态流转记录序列化器(只读)"""
state_name = serializers.CharField(source='state.name', read_only=True)
@@ -195,6 +215,27 @@ class StateFlowRecordSerializer(serializers.ModelSerializer):
read_only_fields = ['id', 'completed_at', 'is_cancelled', 'cancelled_at']
class StateFlowRecordWithParametersSerializer(serializers.ModelSerializer):
"""状态流转记录序列化器(包含参数摘要)"""
state_name = serializers.CharField(source='state.name', read_only=True)
completed_by_username = serializers.CharField(source='completed_by.username', read_only=True)
parameters_summary = serializers.SerializerMethodField(read_only=True)
class Meta:
model = models.StateFlowRecord
fields = [
'id', 'state', 'state_name', 'completed_at',
'completed_by', 'completed_by_username',
'is_cancelled', 'cancelled_at',
'parameters_summary'
]
read_only_fields = ['id', 'completed_at', 'is_cancelled', 'cancelled_at']
def get_parameters_summary(self, obj):
"""获取参数摘要"""
return obj.get_all_parameters_summary()
class BusinessObjectListSerializer(serializers.ModelSerializer):
"""业务对象列表序列化器"""
process_name = serializers.CharField(source='process.name', read_only=True)