Selaa lähdekoodia

cardNo批量查询

AnlaAnla 1 kuukausi sitten
vanhempi
commit
548243c87d
2 muutettua tiedostoa jossa 57 lisäystä ja 1 poistoa
  1. 51 1
      app/api/cards.py
  2. 6 0
      app/utils/scheme.py

+ 51 - 1
app/api/cards.py

@@ -9,7 +9,7 @@ from app.core.config import settings
 from app.core.logger import get_logger
 from app.core.database_loader import get_db_connection
 from app.utils.scheme import (
-    CardDetailResponse, CardListDetailResponse, CardType, SortBy,
+    CardDetailResponse, CardListDetailResponse, CardType, SortBy, CardNoList,
     SortOrder, CardListResponseWrapper, CardListWithTotal, ReviewUpdate
 )
 from app.crud import crud_card
@@ -265,3 +265,53 @@ def update_review_state(
         if isinstance(e, HTTPException):
             raise e
         raise HTTPException(status_code=500, detail="修改审核状态失败,数据库操作错误。")
+
+
+@router.post("/batch_query/id_score", status_code=200, summary="批量查询id和分数")
+def batch_query_id_score(
+        data: CardNoList,
+        db_conn: PooledMySQLConnection = db_dependency
+):
+    """
+        根据给定的 cardNo 列表批量查询卡牌对应的卡牌ID (id) 和最终分数 (score)。
+        分数返回逻辑:优先返回 modified_score,如果没有 modified_score 则返回 detection_score。
+        """
+    card_nos = data.cardNoList
+
+    # 如果输入的列表为空,直接返回空结果
+    if not card_nos:
+        return {"cardNoList": []}
+
+    try:
+        with db_conn.cursor(dictionary=True) as cursor:
+            # 构造 SQL 的 IN 子句
+            format_strings = ','.join(['%s'] * len(card_nos))
+            query = f"""
+                    SELECT id, cardNo, detection_score, modified_score 
+                    FROM {settings.DB_CARD_TABLE_NAME} 
+                    WHERE cardNo IN ({format_strings})
+                """
+
+            # 执行查询
+            cursor.execute(query, tuple(card_nos))
+            results = cursor.fetchall()
+
+            # 组装返回数据
+            response_list = []
+            for row in results:
+                # 判断分数:优先取 modified_score,如果为 None 则取 detection_score
+                score = row.get('modified_score')
+                if score is None:
+                    score = row.get('detection_score')
+
+                response_list.append({
+                    "cardNo": row['cardNo'],
+                    "evaluateNo": row['id'],
+                    "score": score
+                })
+
+            return {"cardNoList": response_list}
+
+    except Exception as e:
+        logger.error(f"批量查询卡牌ID和分数失败: {e}")
+        raise HTTPException(status_code=500, detail="批量查询失败,数据库操作错误。")

+ 6 - 0
app/utils/scheme.py

@@ -41,6 +41,10 @@ class SortOrder(str, Enum):
     desc = "DESC"
 
 
+class CardNoList(BaseModel):
+    cardNoList: List[str]
+
+
 # "图片类型和计算分数分数类型映射表"
 # [CHANGED] 更新映射关系以匹配 score_service.py
 IMAGE_TYPE_TO_SCORE_TYPE = {
@@ -87,6 +91,7 @@ class CardImageResponse(BaseModel):
         return v
 
         # 拦截序列化,格式化掉中间的 "T"
+
     @field_serializer('created_at', 'updated_at', check_fields=False)
     def serialize_datetime(self, dt: datetime, _info):
         if dt is not None:
@@ -174,6 +179,7 @@ class CardListDetailResponse(BaseModel):
         from_attributes = True
 
         # 拦截序列化,格式化掉中间的 "T"
+
     @field_serializer('created_at', 'updated_at', check_fields=False)
     def serialize_datetime(self, dt: datetime, _info):
         if dt is not None: