feat: recommend case list

This commit is contained in:
2026-06-13 14:17:54 +08:00
parent 46761906fe
commit 7dee5a075d
2 changed files with 22 additions and 46 deletions
+11 -39
View File
@@ -1,15 +1,14 @@
"""移动端病例列表(首页 / 病例页 5 个入口)。
均读 `case_base`,只取**已发布**病例(publish_status=2 & status=1 & is_deleted=0):
- 5.1 推荐病例(个性化) GET /api/case/mobile/recommended/
- 5.1 推荐病例 GET /api/case/mobile/recommended/ ← **返回病例库全部已发布病例**(不做个性化)
- 5.2 科室专项 GET /api/case/mobile/specialty/
- 5.3 薄弱环节 GET /api/case/mobile/weak/
- 5.4 教学互动 GET /api/case/mobile/teaching/
- 5.5 教师任务 GET /api/case/mobile/teacher-task/CMS 暂无指派,先同教学互动)
个性化/薄弱口径读只读表 training_recorduser_id=当前用户、status='completed'),
分数按 score_type 归一百分制后比较,与《个人中心》一致
五个入口均只取**已发布**病例(publish_status=2 & status=1 & is_deleted=0);
5.1 推荐返回全部已发布病例、按创建时间倒序(不再做个性化推荐排序)
薄弱口径读只读表 training_recorduser_id=当前用户、status='completed'),分数按 score_type 归一百分制后比较,与《个人中心》一致。
"""
from django.db.models import Q
from rest_framework import serializers
@@ -123,44 +122,17 @@ def _paginate(qs, request, *, case_stats=None):
return paginator.get_paginated_response(data)
# ── 5.1 推荐病例(个性化)────────────────────────────────────────────────────
# ── 5.1 推荐病例(返回病例库全部已发布病例)────────────────────────────────────
def _recommend_score(case, *, dept_id, trained_ids, weak_dims):
"""个性化推荐分:未训练 > 同科室 > 命中薄弱能力标签。"""
score = 0
if case.id not in trained_ids:
score += 2
if dept_id and case.department_id == dept_id:
score += 1
if weak_dims and case.competency_tags:
tags = ' '.join(str(t) for t in case.competency_tags)
if any(w and w in tags for w in weak_dims):
score += 1
return score
@extend_schema(summary='推荐病例(个性化)', tags=['病例列表'])
@extend_schema(summary='推荐病例(返回病例库全部已发布病例)', tags=['病例列表'])
@api_view(['GET'])
@permission_classes([IsAuthenticated])
def recommended(request):
user = request.user
qs = _apply_common_filters(_published(), request)
cases = list(qs.select_related('department'))
trained_ids = set(
_completed_records(user).values_list('case_id', flat=True)
)
weak_dims = [str(w) for w in (user.weak_dimensions or [])]
dept_id = user.department_id
cases.sort(
key=lambda c: (
_recommend_score(c, dept_id=dept_id, trained_ids=trained_ids, weak_dims=weak_dims),
c.created_at or c.id,
),
reverse=True,
)
return _paginate(cases, request)
"""返回病例库**全部已发布病例**publish_status=2 & status=1 & is_deleted=0),
支持通用筛选(search / case_type / difficulty / department),按创建时间倒序。"""
qs = _apply_common_filters(_published(), request) \
.select_related('department').order_by('-created_at', '-id')
return _paginate(qs, request)
# ── 5.2 科室专项 ────────────────────────────────────────────────────────────