from rest_framework import serializers from .models import CountReason, CountTask, CountTaskDetail class CountReasonSerializer(serializers.ModelSerializer): class Meta: model = CountReason fields = "__all__" read_only_fields = ("id", "create_time", "update_time") class CountTaskDetailSerializer(serializers.ModelSerializer): reason = CountReasonSerializer(read_only=True) reason_id = serializers.PrimaryKeyRelatedField( queryset=CountReason.objects.all(), source="reason", required=False, allow_null=True, write_only=True, ) class Meta: model = CountTaskDetail fields = ( "id", "task", "container", "container_code", "location_code", "goods_code", "goods_desc", "goods_std", "goods_unit", "batch_number", "book_qty", "initial_count_qty", "recount_qty", "final_qty", "variance_qty", "reason", "reason_id", "counter_name", "recount_counter", "note", "status", "create_time", "update_time", ) read_only_fields = ( "id", "final_qty", "variance_qty", "status", "create_time", "update_time", ) class CountTaskSerializer(serializers.ModelSerializer): details = CountTaskDetailSerializer(many=True, read_only=True) class Meta: model = CountTask fields = ( "id", "doc_no", "task_type", "status", "source_batch", "remark", "scheduled_at", "created_by", "total_details", "counted_details", "variance_details", "create_time", "update_time", "details", ) read_only_fields = ( "id", "doc_no", "status", "total_details", "counted_details", "variance_details", "create_time", "update_time", ) class TaskGenerateDetailSerializer(serializers.Serializer): container_ids = serializers.ListField( child=serializers.IntegerField(min_value=1), allow_empty=False, required=False ) batch_ids = serializers.ListField( child=serializers.IntegerField(min_value=1), allow_empty=False, required=False ) override = serializers.BooleanField(default=False) def validate(self, attrs): container_ids = attrs.get("container_ids") or [] batch_ids = attrs.get("batch_ids") or [] if not container_ids and not batch_ids: raise serializers.ValidationError("请至少选择托盘或批次") return attrs class CountDetailSubmitSerializer(serializers.Serializer): ROUND_INITIAL = "initial" ROUND_RECOUNT = "recount" round_type = serializers.ChoiceField( choices=((ROUND_INITIAL, "初盘"), (ROUND_RECOUNT, "复盘")), default=ROUND_INITIAL ) qty = serializers.DecimalField(max_digits=14, decimal_places=3) reason_id = serializers.PrimaryKeyRelatedField( queryset=CountReason.objects.all(), allow_null=True, required=False ) counter_name = serializers.CharField(required=False, allow_blank=True) note = serializers.CharField(required=False, allow_blank=True)