| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373 | from rest_framework import serializersfrom .models import BoundListModel, BoundDetailModel, BoundBatchModel,OutBatchModel,BatchOperateLogModel,OutBoundDetailModel,MaterialStatistics,OutBoundDemandModelfrom utils import datasolveclass OutBoundDemandModelSerializer(serializers.ModelSerializer):    class Meta:        model = OutBoundDemandModel        fields = '__all__'        read_only_fields = ['id', 'create_time', 'update_time']                class BoundListGetSerializer(serializers.ModelSerializer):    # 定义主单列表的序列化器,用于获取操作,字段只读    bound_month = serializers.CharField(read_only=True, required=False)    bound_date = serializers.DateField(read_only=True, format='%Y-%m-%d')    bound_code = serializers.CharField(read_only=True, required=False)    bound_code_type = serializers.CharField(read_only=True, required=False)    bound_bs_type = serializers.CharField(read_only=True, required=False)    bound_type = serializers.CharField(read_only=True, required=False)    bound_desc = serializers.CharField(read_only=True, required=False)    bound_department = serializers.CharField(read_only=True, required=False)    bound_status = serializers.CharField(read_only=True, required=False)    creater = serializers.CharField(read_only=True, required=False)    create_time = serializers.DateTimeField(read_only=True, format='%Y-%m-%d %H:%M:%S')    update_time = serializers.DateTimeField(read_only=True, format='%Y-%m-%d %H:%M:%S')    class Meta:        # 指定模型和排除字段        model = BoundListModel        exclude = ['openid', 'is_delete']        read_only_fields = ['id', 'openid']class BoundListPostSerializer(serializers.ModelSerializer):    # 定义主单列表的序列化器,用于创建操作,允许部分字段写入    bound_month = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])    bound_date = serializers.DateField(read_only=False, required=False, validators=[datasolve.data_validate])    bound_code = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])    bound_code_type = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])    bound_bs_type = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])    bound_type = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])    bound_desc = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])    bound_department = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])    bound_status = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])    openid = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])    creater = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])    is_delete = serializers.BooleanField(read_only=False, required=False)    class Meta:        # 指定模型和排除字段        model = BoundListModel        fields= '__all__'        read_only_fields = ['id', 'create_time', 'update_time']class BoundBatchGetSerializer(serializers.ModelSerializer):    # 定义批次列表的序列化器,用于获取操作,字段只读    bound_number = serializers.CharField(read_only=True, required=False)    bound_month = serializers.CharField(read_only=True, required=False)        warehouse_code = serializers.CharField(read_only=True, required=False)    warehouse_name = serializers.CharField(read_only=True, required=False)    goods_code = serializers.CharField(read_only=True, required=False)    goods_desc = serializers.CharField(read_only=True, required=False)    goods_std =  serializers.CharField(read_only=True, required=False)    goods_qty = serializers.DecimalField(read_only=False, required=False, max_digits=10, decimal_places=3)    goods_in_qty = serializers.DecimalField(read_only=False, required=False, max_digits=10, decimal_places=3)    goods_out_qty = serializers.DecimalField(read_only=False, required=False, max_digits=10, decimal_places=3)    status = serializers.IntegerField(read_only=True, required=False)    goods_weight = serializers.FloatField(read_only=True, required=False)    goods_total_weight = serializers.FloatField(read_only=True, required=False)    creater = serializers.CharField(read_only=True, required=False)    create_time = serializers.DateTimeField(read_only=True, format='%Y-%m-%d %H:%M:%S')    update_time = serializers.DateTimeField(read_only=True, format='%Y-%m-%d %H:%M:%S')    class Meta:        # 指定模型和排除字段        model = BoundBatchModel        exclude = ['openid', 'is_delete']        read_only_fields = ['id', 'openid']class BoundBatchPostSerializer(serializers.ModelSerializer):    # 定义批次列表的序列化器,用于创建操作,允许部分字段写入    bound_number = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])    bound_month = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])    bound_batch_order = serializers.IntegerField(read_only=False, required=False, validators=[datasolve.data_validate])    warehouse_code = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])    warehouse_name = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])    goods_code = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])    goods_desc = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])    goods_std =  serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])    goods_qty = serializers.DecimalField(read_only=False, required=True, max_digits=10, decimal_places=3, validators=[datasolve.data_validate])    goods_in_qty = serializers.DecimalField(read_only=False, required=False, max_digits=10, decimal_places=3,validators=[datasolve.data_validate])    goods_out_qty = serializers.DecimalField(read_only=False, required=False, max_digits=10, decimal_places=3, validators=[datasolve.data_validate])    status = serializers.IntegerField(read_only=False, required=False, validators=[datasolve.data_validate])    goods_weight = serializers.FloatField(read_only=False, required=True, validators=[datasolve.data_validate])    goods_total_weight = serializers.FloatField(read_only=False, required=False, validators=[datasolve.data_validate])    openid = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])    creater = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])    is_delete = serializers.BooleanField(read_only=False, required=False)    class Meta:        # 指定模型和排除字段        model = BoundBatchModel        fields= '__all__'        read_only_fields = ['id', 'create_time', 'update_time']        extra_kwargs = {            'is_delete': {                'default': False,                'help_text': "逻辑删除标记(默认False)"            }        }class BoundDetailGetSerializer(serializers.ModelSerializer):    # 嵌套展示关联的主单和批次信息    bound_list = serializers.SerializerMethodField()    bound_batch = serializers.SerializerMethodField()    detail_code = serializers.CharField(read_only=True, required=False)    status = serializers.IntegerField(read_only=False, required=False)    # 定义其他字段,只读    creater = serializers.CharField(source='creater.username', read_only=True)    create_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S')    update_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S')    class Meta:        # 指定模型和字段,所有字段只读        model = BoundDetailModel        fields = [            'id',            'bound_list',            'bound_batch',            'detail_code',            'creater',            'create_time',            'update_time',            'is_delete',            'status'        ]        read_only_fields = ['__all__']    def get_bound_list(self, obj):        """ 动态序列化关联的主单数据 """        from .serializers import BoundListGetSerializer  # 延迟导入避免循环引用        return BoundListGetSerializer(obj.bound_list).data    def get_bound_batch(self, obj):        """ 动态序列化关联的批次数据 """        from .serializers import BoundBatchGetSerializer        return BoundBatchGetSerializer(obj.bound_batch).dataclass BoundDetailPostSerializer(serializers.ModelSerializer):    # 使用主键ID关联主单和批次    bound_list = serializers.PrimaryKeyRelatedField(        queryset=BoundListModel.objects.all(),        help_text="关联主单ID(必须已存在)",        error_messages={            'does_not_exist': "指定主单不存在",            'incorrect_type': "主单ID格式错误"        }    )    bound_batch = serializers.PrimaryKeyRelatedField(        queryset=BoundBatchModel.objects.all(),        help_text="关联批次ID(必须已存在)",        error_messages={            'does_not_exist': "指定批次不存在",            'incorrect_type': "批次ID格式错误"        }    )    # 创建人字段,必须填写    creater = serializers.CharField(        required=True,        max_length=255,        help_text="创建人标识(建议从用户系统获取)",        error_messages={            'blank': "创建人不能为空",            'max_length': "最长255个字符"        }    )    detail_code = serializers.CharField(read_only=False, required=False)    status = serializers.IntegerField(read_only=False, required=False)    class Meta:        # 指定模型和字段,部分字段只读        model = BoundDetailModel        fields='__all__'        read_only_fields = [            'id',            'create_time',            'update_time',            'is_delete'        ]        extra_kwargs = {            'is_delete': {                'default': False,                'help_text': "逻辑删除标记(默认False)"            }        }class OutBatchGetSerializer(serializers.ModelSerializer):    batch_number = serializers.SerializerMethodField()    class Meta:        model = OutBatchModel        fields = '__all__'        read_only_fields = ['id', 'openid']    def get_batch_number(self, obj):        from .serializers import BoundBatchGetSerializer        return BoundBatchGetSerializer(obj.batch_number).data    class OutBatchPostSerializer(serializers.ModelSerializer):    out_number = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])     out_type = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])     out_note = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])     out_date = serializers.DateTimeField(read_only=False, required=False, validators=[datasolve.data_validate])    warehouse_code = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])    warehouse_name = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])        goods_code = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])    goods_desc = serializers.CharField(read_only=False, required=False, validators=[datasolve.data_validate])    goods_qty = serializers.DecimalField(read_only=False, required=False, max_digits=10, decimal_places=3, validators=[datasolve.data_validate])    goods_out_qty = serializers.DecimalField(read_only=False, required=False, max_digits=10, decimal_places=3, validators=[datasolve.data_validate])    creater = serializers.CharField(read_only=False, required=True, validators=[datasolve.data_validate])    class Meta:        model = OutBatchModel        fields = '__all__'        read_only_fields = ['id', 'openid']class BatchLogGetSerializer(serializers.ModelSerializer):    class Meta:        model = BatchOperateLogModel        fields = '__all__'        read_only_fields = ['id', 'openid']class OutBoundDetailGetSerializer(serializers.ModelSerializer): # 嵌套展示关联的主单和批次信息    bound_list = serializers.SerializerMethodField()    bound_batch = serializers.SerializerMethodField()    bound_batch_number = serializers.SerializerMethodField()    detail_code = serializers.CharField(read_only=True, required=False)    status = serializers.IntegerField(read_only=False, required=False)    # 定义其他字段,只读    creater = serializers.CharField(source='creater.username', read_only=True)    create_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S')    update_time = serializers.DateTimeField(format='%Y-%m-%d %H:%M:%S')    class Meta:        # 指定模型和字段,所有字段只读        model = OutBoundDetailModel        fields = [            'id',            'bound_list',            'bound_batch',            'bound_batch_number',            'detail_code',            'creater',            'create_time',            'update_time',            'is_delete',            'status'        ]        read_only_fields = ['__all__']    def get_bound_list(self, obj):        """ 动态序列化关联的主单数据 """        from .serializers import BoundListGetSerializer  # 延迟导入避免循环引用        return BoundListGetSerializer(obj.bound_list).data    def get_bound_batch(self, obj):        from .serializers import OutBatchGetSerializer              return OutBatchGetSerializer(obj.bound_batch).data    def get_bound_batch_number(self, obj):               from .serializers import BoundBatchGetSerializer        return BoundBatchGetSerializer(obj.bound_batch_number).data        class OutBoundDetailPostSerializer(serializers.ModelSerializer):   # 使用主键ID关联主单和批次    bound_list = serializers.PrimaryKeyRelatedField(        queryset=BoundListModel.objects.all(),        help_text="关联主单ID(必须已存在)",        error_messages={            'does_not_exist': "指定主单不存在",            'incorrect_type': "主单ID格式错误"        }    )    bound_batch = serializers.PrimaryKeyRelatedField(        queryset=OutBatchModel.objects.all(),        help_text="关联批次ID(必须已存在)",        error_messages={            'does_not_exist': "指定批次不存在",            'incorrect_type': "批次ID格式错误"        }    )    # 创建人字段,必须填写    creater = serializers.CharField(        required=True,        max_length=255,        help_text="创建人标识(建议从用户系统获取)",        error_messages={            'blank': "创建人不能为空",            'max_length': "最长255个字符"        }    )    detail_code = serializers.CharField(read_only=False, required=False)    status = serializers.IntegerField(read_only=False, required=False)    class Meta:        # 指定模型和字段,部分字段只读        model = OutBoundDetailModel         fields='__all__'        read_only_fields = [            'id',            'create_time',            'update_time',            'is_delete'        ]        extra_kwargs = {            'is_delete': {                'default': False,                'help_text': "逻辑删除标记(默认False)"            }        }class MaterialStatisticsSerializer(serializers.ModelSerializer):    # 定义物料统计的序列化器,用于获取操作,字段只读    class Meta:        # 指定模型和排除字段        model = MaterialStatistics        fields = '__all__'        read_only_fields = ['id']        class MaterialStatisticsSerializer_items(serializers.ModelSerializer):    # 定义物料统计的序列化器,用于获取操作,字段只读    batch_items = serializers.SerializerMethodField()    class Meta:        # 指定模型和排除字段        model = MaterialStatistics        exclude = ['id', 'goods_code', 'goods_desc', 'goods_std', 'goods_unit','total_quantity']        read_only_fields = ['id']        def get_batch_items(self, obj):        batches = obj.bound_batches        return BoundBatchGetSerializer(batches, many=True).data
 |