forked from erp-dev/erp
feat: stateflow v2 (params required)
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user