# Generated by Django 5.0.4 on 2026-08-30 23:53 import django.db.models.deletion from django.db import migrations, models class Migration(migrations.Migration): initial = True dependencies = [ ] operations = [ migrations.CreateModel( name='AlgorithmModel', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=100, verbose_name='算法名称')), ('algorithm_type', models.CharField(choices=[('yolo5', 'YOLOv5'), ('yolo8', 'YOLOv8'), ('yolo11', 'YOLOv11'), ('yolo26', 'YOLO26'), ('osnet', 'OSNet ReID')], default='yolo8', max_length=30, verbose_name='算法类型')), ('task_type', models.CharField(choices=[('detect', 'Detect'), ('segment', 'Segment'), ('classify', 'Classify'), ('pose', 'Pose'), ('obb', 'OBB'), ('reid', 'ReID')], default='detect', max_length=20, verbose_name='任务类型')), ('inference_engine', models.CharField(choices=[('yolo_pytorch', 'Yolo-PyTorch'), ('onnxruntime', 'OnnxRuntime'), ('openvino', 'OpenVINO')], default='yolo_pytorch', max_length=20, verbose_name='推理引擎')), ('device', models.CharField(choices=[('cpu', 'CPU'), ('cuda', 'CUDA'), ('gpu', 'GPU')], default='cpu', max_length=20, verbose_name='推理设备')), ('model_file', models.CharField(default='', max_length=300, verbose_name='模型文件相对路径')), ('model_file_size', models.IntegerField(default=0, verbose_name='模型文件大小(字节)')), ('input_width', models.IntegerField(default=640, verbose_name='输入宽度')), ('input_height', models.IntegerField(default=640, verbose_name='输入高度')), ('conf_threshold', models.FloatField(default=0.4, verbose_name='置信度阈值')), ('iou_threshold', models.FloatField(default=0.5, verbose_name='NMS IoU 阈值')), ('labels', models.TextField(default='[]', verbose_name='支持类别JSON数组')), ('is_default', models.IntegerField(default=0, verbose_name='是否默认算法')), ('state', models.IntegerField(default=1, verbose_name='状态')), ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), ('last_update_time', models.DateTimeField(auto_now_add=True, verbose_name='更新时间')), ], options={ 'verbose_name': '小模型', 'verbose_name_plural': '小模型', 'db_table': 'av_algorithm', }, ), migrations.CreateModel( name='LLMModel', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('user_id', models.IntegerField(verbose_name='用户')), ('sort', models.IntegerField(default=0, verbose_name='排序')), ('code', models.CharField(max_length=50, verbose_name='编号')), ('name', models.CharField(default='', max_length=50, verbose_name='名称')), ('model_name', models.CharField(max_length=200, verbose_name='模型名称')), ('api_url', models.CharField(max_length=500, verbose_name='API地址')), ('api_key', models.CharField(default='', max_length=512, verbose_name='API密钥')), ('timeout', models.IntegerField(default=30, verbose_name='超时时间(秒)')), ('inference_tool', models.CharField(default='OpenAI', max_length=100, verbose_name='推理工具')), ('remark', models.TextField(default='', verbose_name='备注')), ('state', models.IntegerField(default=1, verbose_name='状态')), ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), ('last_update_time', models.DateTimeField(auto_now_add=True, verbose_name='更新时间')), ], options={ 'verbose_name': '大模型', 'verbose_name_plural': '大模型', 'db_table': 'av_llm', }, ), migrations.CreateModel( name='LogModel', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('user_id', models.IntegerField(verbose_name='用户ID')), ('log_type', models.IntegerField(verbose_name='日志类型')), ('content', models.CharField(max_length=200, verbose_name='日志内容')), ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), ('state', models.IntegerField(verbose_name='状态')), ], options={ 'verbose_name': '管理员日志', 'verbose_name_plural': '管理员日志', 'db_table': 'av_log', }, ), migrations.CreateModel( name='BizAlgorithmModel', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=100, verbose_name='算法名称')), ('flow_type', models.IntegerField(choices=[(1, '小模型+后处理'), (2, '大模型+后处理'), (3, '小模型+大模型+后处理'), (4, '检测+ReID+后处理')], default=1, verbose_name='流程类型')), ('target_labels', models.TextField(default='[]', verbose_name='目标类别JSON')), ('llm_prompt', models.TextField(default='', verbose_name='大模型提示词')), ('llm_validate', models.TextField(default='', verbose_name='提示词校验值')), ('post_process', models.CharField(choices=[('AREA', '区域入侵'), ('LINE_CROSS', '越线检测'), ('LINE_COUNT', '越线计数'), ('DIRECTION', '方向入侵'), ('DENSITY', '密度报警'), ('DWELL', '滞留报警')], default='AREA', max_length=30, verbose_name='后处理逻辑')), ('ref_angle', models.FloatField(default=90.0, verbose_name='方向参考角度')), ('angle_tolerance', models.FloatField(default=45.0, verbose_name='方向容差(度)')), ('forward_count_threshold', models.IntegerField(default=0, verbose_name='正向计数报警阈值')), ('reverse_count_threshold', models.IntegerField(default=0, verbose_name='逆向计数报警阈值')), ('state', models.IntegerField(default=1, verbose_name='状态')), ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), ('last_update_time', models.DateTimeField(auto_now_add=True, verbose_name='更新时间')), ('detector_model', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='biz_algorithms_as_detector', to='app.algorithmmodel', verbose_name='检测小模型(YOLO)')), ('small_model', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='biz_algorithms', to='app.algorithmmodel', verbose_name='小模型')), ('llm', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='biz_algorithms', to='app.llmmodel', verbose_name='大模型')), ], options={ 'verbose_name': '业务算法', 'verbose_name_plural': '业务算法', 'db_table': 'av_biz_algorithm', }, ), migrations.CreateModel( name='StreamModel', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('user_id', models.IntegerField(verbose_name='用户')), ('sort', models.IntegerField(verbose_name='排序')), ('code', models.CharField(max_length=50, verbose_name='编号')), ('app', models.CharField(max_length=50, verbose_name='流分组')), ('name', models.CharField(max_length=50, verbose_name='流名称')), ('pull_stream_url', models.CharField(max_length=300, verbose_name='视频流源地址')), ('pull_stream_type', models.IntegerField(verbose_name='视频流来源类型')), ('pull_stream_transfer_mode', models.IntegerField(verbose_name='视频流传输模式')), ('pull_stream_ip', models.CharField(max_length=50, verbose_name='拉流IP')), ('pull_stream_port', models.IntegerField(verbose_name='拉流端口')), ('pull_stream_username', models.CharField(max_length=512, verbose_name='拉流用户名')), ('pull_stream_password', models.CharField(max_length=512, verbose_name='拉流密码')), ('nickname', models.CharField(max_length=200, verbose_name='视频流昵称')), ('remark', models.CharField(max_length=200, verbose_name='备注')), ('forward_state', models.IntegerField(verbose_name='转发状态')), ('is_audio', models.IntegerField(default=0, verbose_name='音频传输类型')), ('snap_filepath', models.CharField(max_length=200, verbose_name='快照文件路径')), ('snap_time', models.DateTimeField(auto_now_add=True, verbose_name='快照时间')), ('camera_sum_num', models.IntegerField(default=0, verbose_name='通道总数')), ('camera_name', models.CharField(max_length=100, verbose_name='摄像头名称')), ('camera_manufacturer', models.CharField(max_length=100, verbose_name='摄像头厂商')), ('camera_owner', models.CharField(max_length=50, verbose_name='摄像头所属者')), ('camera_model', models.CharField(max_length=50, verbose_name='摄像头型号')), ('camera_device_id', models.CharField(max_length=50, verbose_name='GB28181设备ID')), ('camera_parent_id', models.CharField(max_length=50, verbose_name='GB28181父设备ID')), ('camera_civilcode', models.CharField(max_length=50, verbose_name='行政区划码')), ('camera_last_keepalive_time', models.DateTimeField(auto_now_add=True, verbose_name='最近一次心跳时间')), ('camera_last_register_time', models.DateTimeField(auto_now_add=True, verbose_name='最近一次注册时间')), ('cascade_device_id', models.CharField(default='', max_length=50, verbose_name='向上级联国标编号')), ('cascade_enable', models.IntegerField(default=0, verbose_name='是否启用向上级联')), ('record_enable', models.IntegerField(default=0, verbose_name='启用24/7录像')), ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), ('last_update_time', models.DateTimeField(auto_now_add=True, verbose_name='更新时间')), ('add_type', models.IntegerField(default=0, verbose_name='添加类型')), ('state', models.IntegerField(default=0, verbose_name='状态')), ('algorithm', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='streams', to='app.algorithmmodel', verbose_name='分析算法')), ], options={ 'verbose_name': '视频流', 'verbose_name_plural': '视频流', 'db_table': 'av_stream', }, ), migrations.CreateModel( name='ZoneModel', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=100, verbose_name='区域名称')), ('coordinates', models.TextField(verbose_name='多边形坐标')), ('is_required', models.IntegerField(default=1, verbose_name='是否必需区域')), ('loiter_threshold', models.IntegerField(default=0, verbose_name='滞留阈值(秒)')), ('detect_interval_sec', models.FloatField(default=1.0, verbose_name='检测间隔(秒)')), ('detect_frames', models.IntegerField(default=1, verbose_name='检测帧数')), ('color', models.CharField(default='#169F85', max_length=20, verbose_name='显示颜色')), ('line_a', models.TextField(default='', verbose_name='警戒线端点A')), ('line_b', models.TextField(default='', verbose_name='警戒线端点B')), ('density_threshold', models.IntegerField(default=0, verbose_name='密度阈值')), ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')), ('last_update_time', models.DateTimeField(auto_now_add=True, verbose_name='更新时间')), ('state', models.IntegerField(default=1, verbose_name='状态')), ('algorithms', models.ManyToManyField(blank=True, related_name='zones', to='app.bizalgorithmmodel', verbose_name='分析算法')), ('stream', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='app.streammodel', verbose_name='所属摄像头')), ], options={ 'verbose_name': '区域', 'verbose_name_plural': '区域', 'db_table': 'av_zone', }, ), migrations.CreateModel( name='RecordingModel', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('file_path', models.CharField(max_length=500, verbose_name='文件路径')), ('start_time', models.DateTimeField(verbose_name='开始时间')), ('end_time', models.DateTimeField(verbose_name='结束时间')), ('duration', models.FloatField(default=0, verbose_name='时长(秒)')), ('file_size', models.BigIntegerField(default=0, verbose_name='文件大小(字节)')), ('has_motion', models.IntegerField(default=0, verbose_name='含运动')), ('has_object', models.IntegerField(default=0, verbose_name='含目标')), ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='入库时间')), ('stream', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='app.streammodel', verbose_name='摄像头')), ], options={ 'verbose_name': '录像分段', 'verbose_name_plural': '录像分段', 'db_table': 'av_recording', 'indexes': [models.Index(fields=['stream', 'start_time'], name='av_recording_st_idx')], }, ), migrations.CreateModel( name='AlarmModel', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('event_type', models.CharField(default='entered_zone', max_length=32, verbose_name='报警类型')), ('description', models.CharField(default='', max_length=300, verbose_name='描述')), ('timestamp', models.DateTimeField(verbose_name='发生时间')), ('metadata', models.TextField(default='{}', verbose_name='元数据JSON')), ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='入库时间')), ('stream', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='app.streammodel', verbose_name='摄像头')), ], options={ 'verbose_name': '报警', 'verbose_name_plural': '报警', 'db_table': 'av_alarm', 'indexes': [models.Index(fields=['-timestamp'], name='av_alarm_ts_idx'), models.Index(fields=['stream', 'timestamp'], name='av_alarm_st_idx')], }, ), ]