init medical training project

This commit is contained in:
2026-05-29 15:58:00 +08:00
commit b4bb38b7be
91 changed files with 6765 additions and 0 deletions
+71
View File
@@ -0,0 +1,71 @@
# Generated by Django 6.0.5 on 2026-05-26 07:02
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
('case', '0001_initial'),
]
operations = [
migrations.CreateModel(
name='TrainingScoreDetail',
fields=[
('created_at', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
('updated_at', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
('id', models.BigAutoField(primary_key=True, serialize=False)),
('dimension', models.CharField(max_length=50, verbose_name='评分维度')),
('score', models.DecimalField(decimal_places=2, max_digits=5, verbose_name='分数')),
('deducted_reason', models.TextField(blank=True, verbose_name='扣分原因')),
('evidence_message_ids', models.JSONField(blank=True, default=list, verbose_name='对应对话证据')),
('ai_confidence', models.DecimalField(blank=True, decimal_places=2, max_digits=5, null=True, verbose_name='AI评分置信度')),
('comment', models.TextField(blank=True, verbose_name='评语')),
],
options={
'verbose_name': '评分明细',
'verbose_name_plural': '评分明细',
'db_table': 'training_score_detail',
},
),
migrations.CreateModel(
name='TrainingRecord',
fields=[
('created_at', models.DateTimeField(auto_now_add=True, verbose_name='创建时间')),
('updated_at', models.DateTimeField(auto_now=True, verbose_name='更新时间')),
('id', models.BigAutoField(primary_key=True, serialize=False)),
('training_mode', models.CharField(choices=[('novice', '新手'), ('practice', '练习'), ('exam', '考试')], max_length=50, verbose_name='训练模式')),
('case_type', models.CharField(blank=True, max_length=30, verbose_name='病例类型')),
('start_time', models.DateTimeField(auto_now_add=True, verbose_name='开始时间')),
('end_time', models.DateTimeField(blank=True, null=True, verbose_name='结束时间')),
('duration_seconds', models.IntegerField(blank=True, null=True, verbose_name='训练时长')),
('total_score', models.DecimalField(blank=True, decimal_places=2, max_digits=5, null=True, verbose_name='总分')),
('ai_score', models.DecimalField(blank=True, decimal_places=2, max_digits=5, null=True, verbose_name='AI评分')),
('teacher_score', models.DecimalField(blank=True, decimal_places=2, max_digits=5, null=True, verbose_name='教师评分')),
('evaluation_level', models.CharField(blank=True, choices=[('excellent', '优秀'), ('good', '良好'), ('average', '一般'), ('poor', '较差')], max_length=20, verbose_name='评价等级')),
('status', models.CharField(choices=[('in_progress', '进行中'), ('completed', '已完成'), ('aborted', '已中断')], default='in_progress', max_length=30, verbose_name='状态')),
('feedback', models.TextField(blank=True, verbose_name='总评')),
('thinking_chain', models.TextField(blank=True, verbose_name='临床推理链')),
('diagnosis_path', models.TextField(blank=True, verbose_name='诊断路径')),
('wrong_points', models.JSONField(blank=True, default=list, verbose_name='错误知识点')),
('missed_questions', models.JSONField(blank=True, default=list, verbose_name='漏问项')),
('recommendation_result', models.JSONField(blank=True, default=dict, verbose_name='AI推荐')),
('ai_feedback_structured', models.JSONField(blank=True, default=dict, verbose_name='AI结构化反馈')),
('osce_station_score', models.JSONField(blank=True, default=dict, verbose_name='OSCE各站点成绩')),
('interruption_count', models.IntegerField(default=0, verbose_name='中断次数')),
('emotion_analysis', models.JSONField(blank=True, default=dict, verbose_name='情绪分析')),
('prompt_version', models.CharField(blank=True, max_length=50, verbose_name='Prompt版本')),
('rag_context_version', models.CharField(blank=True, max_length=50, verbose_name='知识上下文版本')),
('case', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='training_records', to='case.casebase', verbose_name='病例')),
],
options={
'verbose_name': '训练记录',
'verbose_name_plural': '训练记录',
'db_table': 'training_record',
},
),
]
+39
View File
@@ -0,0 +1,39 @@
# Generated by Django 6.0.5 on 2026-05-26 07:02
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
('case', '0002_initial'),
('training', '0001_initial'),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.AddField(
model_name='trainingrecord',
name='teacher',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='supervised_records', to=settings.AUTH_USER_MODEL, verbose_name='带教老师'),
),
migrations.AddField(
model_name='trainingrecord',
name='user',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='training_records', to=settings.AUTH_USER_MODEL, verbose_name='用户'),
),
migrations.AddField(
model_name='trainingscoredetail',
name='record',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='score_details', to='training.trainingrecord', verbose_name='训练记录'),
),
migrations.AddField(
model_name='trainingscoredetail',
name='rule',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='case.scoringrule', verbose_name='评分规则'),
),
]
+2
View File
@@ -0,0 +1,2 @@