# Generated by Django 5.2.14 on 2026-05-18 09:21 import device_management.models import django.db.models.deletion from django.db import migrations, models class Migration(migrations.Migration): initial = True dependencies = [ ] operations = [ migrations.CreateModel( name='Device', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('location', models.CharField(max_length=100, verbose_name='地点')), ('building', models.CharField(blank=True, max_length=50, null=True, verbose_name='楼栋')), ('floor', models.CharField(blank=True, max_length=20, null=True, verbose_name='楼层')), ('cabinet', models.CharField(blank=True, max_length=50, null=True, verbose_name='机柜')), ('device_name', models.CharField(max_length=100, verbose_name='设备名称')), ('model', models.CharField(blank=True, max_length=100, null=True, verbose_name='型号')), ('brand', models.CharField(blank=True, max_length=100, null=True, verbose_name='品牌')), ('mac_address', models.CharField(blank=True, max_length=17, null=True, verbose_name='MAC地址')), ('enable_date', models.DateField(blank=True, null=True, verbose_name='启用日期')), ('last_inspection_date', models.DateField(blank=True, null=True, verbose_name='最后巡检日期')), ('thumbnail', models.ImageField(blank=True, null=True, upload_to=device_management.models.device_thumbnail_path, verbose_name='缩略图')), ('status', models.CharField(choices=[('normal', '正常'), ('warning', '告警'), ('offline', '离线'), ('repair', '维修中'), ('scrap', '已报废')], default='normal', max_length=20, verbose_name='状态')), ('responsible_person', models.CharField(blank=True, max_length=50, null=True, verbose_name='负责人')), ('warranty_expire', models.DateField(blank=True, null=True, verbose_name='保修到期日期')), ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), ('updated_at', models.DateTimeField(auto_now=True, verbose_name='更新时间')), ], options={ 'verbose_name': '设备', 'verbose_name_plural': '设备', 'db_table': 'device', 'indexes': [models.Index(fields=['location', 'building'], name='device_locatio_6a4f0a_idx'), models.Index(fields=['status'], name='device_status_6321a6_idx')], }, ), migrations.CreateModel( name='DeviceAttachment', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('file', models.FileField(upload_to=device_management.models.device_attachment_path, verbose_name='文件')), ('file_name', models.CharField(max_length=255, verbose_name='文件名')), ('file_type', models.CharField(blank=True, max_length=50, null=True, verbose_name='文件类型')), ('uploaded_at', models.DateTimeField(auto_now_add=True, verbose_name='上传时间')), ('device', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='attachments', to='device_management.device', verbose_name='设备')), ], options={ 'verbose_name': '设备附件', 'verbose_name_plural': '设备附件', 'db_table': 'device_attachment', }, ), migrations.CreateModel( name='DeviceIP', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('ip_address', models.CharField(max_length=45, unique=True, verbose_name='IP地址')), ('ip_type', models.CharField(default='management', max_length=20, verbose_name='IP类型')), ('is_primary', models.BooleanField(default=False, verbose_name='是否主IP')), ('subnet_mask', models.CharField(blank=True, max_length=15, null=True, verbose_name='子网掩码')), ('gateway', models.CharField(blank=True, max_length=45, null=True, verbose_name='网关')), ('vlan_id', models.CharField(blank=True, max_length=10, null=True, verbose_name='VLAN ID')), ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), ('updated_at', models.DateTimeField(auto_now=True, verbose_name='更新时间')), ('device', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='ips', to='device_management.device', verbose_name='设备')), ], options={ 'verbose_name': '设备IP地址', 'verbose_name_plural': '设备IP地址', 'db_table': 'device_ip', }, ), migrations.CreateModel( name='DeviceSerial', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('serial_number', models.CharField(max_length=100, unique=True, verbose_name='序列号')), ('serial_type', models.CharField(default='main', max_length=50, verbose_name='序列号类型')), ('is_primary', models.BooleanField(default=False, verbose_name='是否主序列号')), ('remark', models.CharField(blank=True, max_length=255, null=True, verbose_name='备注')), ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), ('updated_at', models.DateTimeField(auto_now=True, verbose_name='更新时间')), ('device', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='serials', to='device_management.device', verbose_name='设备')), ], options={ 'verbose_name': '设备序列号', 'verbose_name_plural': '设备序列号', 'db_table': 'device_serial', }, ), migrations.CreateModel( name='MaintenanceRecord', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('maintenance_date', models.DateField(verbose_name='维修日期')), ('fault_description', models.TextField(blank=True, null=True, verbose_name='故障描述')), ('repair_content', models.TextField(blank=True, null=True, verbose_name='维修内容')), ('replaced_parts', models.CharField(blank=True, max_length=255, null=True, verbose_name='更换配件')), ('maintenance_by', models.CharField(blank=True, max_length=50, null=True, verbose_name='维修人')), ('cost', models.DecimalField(blank=True, decimal_places=2, max_digits=10, null=True, verbose_name='费用')), ('remark', models.TextField(blank=True, null=True, verbose_name='备注')), ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), ('updated_at', models.DateTimeField(auto_now=True, verbose_name='更新时间')), ('device', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='maintenance_records', to='device_management.device', verbose_name='设备')), ], options={ 'verbose_name': '维修记录', 'verbose_name_plural': '维修记录', 'db_table': 'maintenance_record', 'ordering': ['-maintenance_date'], }, ), ]