import datetime import json import modulefinder from rest_framework import serializers class QxzTypeConfigAddSerializer(serializers.Serializer): eNum = serializers.CharField(help_text="要素编号", required=True, max_length=10) cName = serializers.CharField(help_text="中文名称", required=True, max_length=64) units = serializers.CharField(help_text="要素单位", required=True, max_length=64) def validate_eNum(self, value): try: eNum = int(value) if eNum < 0: raise Exception() except Exception as e: raise serializers.ValidationError("编号必须是大于0的有效整数") return str(value) def validate_cName(self, value): try: value = value.strip() if len(value) > 10: raise Exception() except Exception as e: raise serializers.ValidationError("要素类型名称必须在10个字符以内") return value class QxzTypeConfigDeleteSerializer(serializers.Serializer): qsc_id = serializers.IntegerField(help_text="要素类型配置id", required=True) def validate_qsc_id(self, value): try: value = int(value) if value < 0: raise Exception() except Exception as e: raise serializers.ValidationError("要素类型配置id必须是大于0的有效整数") return value class QxzTypeConfigModifySerializer(serializers.Serializer): cName = serializers.CharField(help_text="中文名称", required=True, max_length=64) units = serializers.CharField(help_text="要素单位", required=True, max_length=64) qsc_id = serializers.IntegerField(help_text="要素类型配置id", required=True) def validate_qsc_id(self, value): try: value = int(value) if value < 0: raise Exception() except Exception as e: raise serializers.ValidationError("要素类型配置id必须是大于0的有效整数") return value def validate_cName(self, value): try: value = value.strip() if len(value) > 10: raise Exception() except Exception as e: raise serializers.ValidationError("要素类型名称必须在10个字符以内") return value class QxzTypeConfigListSerializer(serializers.Serializer): cName = serializers.CharField(help_text="中文名称", required=False, max_length=64, allow_null=True, allow_blank=True) is_default = serializers.BooleanField(help_text="是否默认要素类型", required=False, allow_null=True, default=None) def to_representation(self, instance): return { 'qsc_id': instance.id, 'cName': instance.cName, 'units': instance.units, 'eNum': instance.eNum, 'is_default': instance.is_default } class QxzElementAddSerializer(serializers.Serializer): cName = serializers.CharField(help_text="中文名称", required=False, max_length=64) eName = serializers.CharField(help_text="英文名称", required=False, max_length=64) eNum = serializers.CharField(help_text="要素编号", required=True, max_length=10) units = serializers.CharField(help_text="要素单位", required=True, max_length=64) is_standard = serializers.BooleanField(help_text="是否标配", required=True) sensor_addr = serializers.IntegerField(help_text="从机地址", required=True) start_reg = serializers.IntegerField(help_text="起始寄存器", required=True) count = serializers.IntegerField(help_text="读取数量", required=True) d_pos = serializers.IntegerField(help_text="有效数据位置", required=True) d_length = serializers.IntegerField(help_text="位宽", required=True) factor = serializers.IntegerField(help_text="系数", required=True) dotled_s = serializers.CharField(help_text="LED屏幕内容", required=True, max_length=256) def validate_cName(self, value): try: value = value.strip() if len(value) > 4: raise Exception() except Exception as e: raise serializers.ValidationError("中文名称必须在4个字符以内") return value def validate_eName(self, value): try: value = value.strip() if len(value) > 30: raise Exception() except Exception as e: raise serializers.ValidationError("英文名称必须在30个字符以内") return value def validate_eNum(self, value): try: eNum = int(value) if eNum < 0: raise Exception() except Exception as e: raise serializers.ValidationError("编号必须是大于0的有效整数") return str(value) def validate_sensor_addr(self, value): try: value = int(value) if not (1 <= value <= 254): raise Exception() except Exception as e: raise serializers.ValidationError("从机地址必须是1-254之间的有效整数") return value def validate_start_reg(self, value): try: value = int(value) if not (0 <= value <= 254): raise Exception() except Exception as e: raise serializers.ValidationError("起始寄存器必须是0-254之间的有效整数") return value def validate_count(self, value): try: value = int(value) if not (1 <= value <= 10): raise Exception() except Exception as e: raise serializers.ValidationError("读取数量必须是1-10之间的有效整数") return value def validate_d_pos(self, value): try: value = int(value) if not (0 <= value <= 10): raise Exception() except Exception as e: raise serializers.ValidationError("有效数据位置必须是0-10之间的有效整数") return value def validate_d_length(self, value): try: value = int(value) if not (1 <= value <= 2): raise Exception() except Exception as e: raise serializers.ValidationError("d_length必须是1-2之间的有效整数") return value def validate_factor(self, value): try: value = int(value) if value not in [1, 10, -10, -100]: raise Exception() except Exception as e: raise serializers.ValidationError("系数不符合要求") return value def validate_dotled_s(self, value): if len(value) > 256: raise serializers.ValidationError("LED屏幕内容过长") return value class QxzElementModifySerializer(serializers.Serializer): qec_id = serializers.IntegerField(help_text="要素信息id", required=True) cName = serializers.CharField(help_text="中文名称", required=False, max_length=64) eName = serializers.CharField(help_text="英文名称", required=False, max_length=64) is_standard = serializers.BooleanField(help_text="是否标配", required=True) sensor_addr = serializers.IntegerField(help_text="从机地址", required=True) start_reg = serializers.IntegerField(help_text="起始寄存器", required=True) count = serializers.IntegerField(help_text="读取数量", required=True) d_pos = serializers.IntegerField(help_text="有效数据位置", required=True) d_length = serializers.IntegerField(help_text="位宽", required=True) factor = serializers.IntegerField(help_text="系数", required=True) dotled_s = serializers.CharField(help_text="LED屏幕内容", required=True, max_length=256) def validate_qec_id(self, value): try: value = int(value) if value < 0: raise Exception() except Exception as e: raise serializers.ValidationError("要素信息id必须大于0的整数") return value def validate_cName(self, value): try: value = value.strip() if len(value) > 4: raise Exception() except Exception as e: raise serializers.ValidationError("中文名称必须在4个字符以内") return value def validate_eName(self, value): try: value = value.strip() if len(value) > 30: raise Exception() except Exception as e: raise serializers.ValidationError("英文名称必须在30个字符以内") return value def validate_sensor_addr(self, value): try: value = int(value) if not (1 <= value <= 254): raise Exception() except Exception as e: raise serializers.ValidationError("从机地址必须是1-254之间的有效整数") return value def validate_start_reg(self, value): try: value = int(value) if not (0 <= value <= 254): raise Exception() except Exception as e: raise serializers.ValidationError("起始寄存器必须是0-254之间的有效整数") return value def validate_count(self, value): try: value = int(value) if not (1 <= value <= 10): raise Exception() except Exception as e: raise serializers.ValidationError("读取数量必须是1-10之间的有效整数") return value def validate_d_pos(self, value): try: value = int(value) if not (0 <= value <= 10): raise Exception() except Exception as e: raise serializers.ValidationError("有效数据位置必须是0-10之间的有效整数") return value def validate_d_length(self, value): try: value = int(value) if not (1 <= value <= 2): raise Exception() except Exception as e: raise serializers.ValidationError("d_length必须是1-2之间的有效整数") return value def validate_factor(self, value): try: value = int(value) if value not in [1, 10, -10, -100]: raise Exception() except Exception as e: raise serializers.ValidationError("系数不符合要求") return value def validate_dotled_s(self, value): if len(value) > 256: raise serializers.ValidationError("LED屏幕内容过长") return value class QxzElementDeleteSerializer(serializers.Serializer): qec_id = serializers.IntegerField(help_text="要素信息id", required=True) def validate_qec_id(self, value): try: value = int(value) if value < 0: raise Exception() except Exception as e: raise serializers.ValidationError("要素信息id必须大于0的整数") return value class QxzElementListSerializer(serializers.Serializer): ele_name = serializers.CharField(help_text="要素名称", required=False, max_length=64, allow_blank=True, allow_null=True) is_standard = serializers.BooleanField(help_text="是否标配", required=False, allow_null=True, default=None) def to_representation(self, instance): return { 'qec_id': instance.id, 'cName': instance.cName, 'eName': instance.eName, 'units': instance.units, 'eNum': instance.eNum, 'is_standard': instance.is_standard, 'sensor_addr': instance.sensor_addr, 'start_reg': instance.start_reg, 'count': instance.count, 'd_pos': instance.d_pos, 'd_length': instance.d_length, 'factor': instance.factor, 'dotled_s': instance.dotled_s } class QxzDeviceAddSerializer(serializers.Serializer): device_id = serializers.CharField(help_text="设备编号", max_length=20, required=True) order_num = serializers.CharField(help_text="任务单号", max_length=20, required=True) device_type = serializers.CharField(help_text="设备类型", max_length=4, required=True) is_standard = serializers.BooleanField(help_text="是否标配", required=True) ele_cnf = serializers.JSONField(help_text="要素配置", required=True) led_cnf = serializers.JSONField(help_text="led配置", required=False, default=None, allow_null=True) def validate_device_type(self, value): try: value = value.strip() if value not in ['0', '1', '2']: raise Exception() except Exception as e: raise serializers.ValidationError('设备类型参数异常') return value def validate_ele_cnf(self, value): v = list(value.values()) if len(v) != len(set(v)): raise serializers.ValidationError('英文名称不能重复') try: key_list = sorted(value.keys(), key=lambda x: int(x.replace('c', ''))) for i, k in enumerate(key_list): t = int(k.replace('c', '')) if not (0 <= t <= 29): raise serializers.ValidationError('要素序号必须在0-29之间') if i != t: raise serializers.ValidationError('要素序号顺序必须连续') except Exception as e: raise serializers.ValidationError('要素序号参数异常') return value def validate_led_conf(self, value): if value: try: if value['Control_card'] not in [1, 2, 3]: raise Exception() if value['front'] not in [12, 16]: raise Exception() if not (1 <= value['keep_time'] <= 72): raise Exception() if 0 <= value['Start_x'] <= 1024: raise Exception() if 0 <= value['Start_y'] <= 1024: raise Exception() if 1 <= value['Width'] <= 1024: raise Exception() if 1 <= value['Height'] <= 1024: raise Exception() except Exception as e: raise serializers.ValidationError('led参数异常') return value class QxzDeviceListSerializer(serializers.Serializer): device_id = serializers.CharField(help_text="设备编号", max_length=20, required=False, allow_null=True, allow_blank=True) def to_representation(self, instance): return { 'device_id': instance.device_id, 'order_num': instance.order_num, 'device_type': instance.device_type, 'is_standard': instance.is_standard, 'create_time': instance.create_time.strftime("%Y-%m-%d %H:%S:%M"), 'ele_cnf': json.loads(instance.ele_cnf), 'led_cnf': json.loads(instance.led_cnf), 'ele_name': json.loads(instance.ele_name) }