from app.utils.scheme import CardDetailResponse, ImageType from app.core.logger import get_logger from typing import List logger = get_logger(__name__) def card_score_calculate(card_data: dict, images: List) -> CardDetailResponse: card_data["detection_score"] = None card_data["modified_score"] = None card_data["detection_score_detail"] = {} card_data["modified_score_detail"] = {} if len(images) == 4: try: # ---------- detection_score ---------- detection_score = 10.0 detection_center_score = 10.0 detection_corner_score = 10.0 detection_edge_score = 10.0 detection_face_score = 10.0 for img in images: try: # 总分的计算 add_val = img.detection_json.get("result", {}).get("_used_compute_deduct_score", 0) detection_score += float(add_val or 0) # 累加不同类型的扣分项 if img.image_type == ImageType.front_edge: center_reduct_val = img.detection_json.get("result", {}).get("center_result", {}).get( "deduct_score", 0) corner_reduct_val = img.detection_json.get("result", {}).get("defect_result", {}).get( "front_corner_deduct_score", 0) edge_reduct_val = img.detection_json.get("result", {}).get("defect_result", {}).get( "front_edge_deduct_score", 0) detection_center_score += float(center_reduct_val or 0) detection_corner_score += float(corner_reduct_val or 0) detection_edge_score += float(edge_reduct_val or 0) elif img.image_type == ImageType.back_edge: center_reduct_val = img.detection_json.get("result", {}).get("center_result", {}).get( "deduct_score", 0 ) corner_reduct_val = img.detection_json.get("result", {}).get("defect_result", {}).get( "back_corner_deduct_score", 0) edge_reduct_val = img.detection_json.get("result", {}).get("defect_result", {}).get( "back_edge_deduct_score", 0) detection_center_score += float(center_reduct_val or 0) detection_corner_score += float(corner_reduct_val or 0) detection_edge_score += float(edge_reduct_val or 0) elif img.image_type == ImageType.front_face: face_reduct_val = img.detection_json.get("result", {}).get("defect_result", {}).get( "front_face_deduct_score", 0) detection_face_score += float(face_reduct_val or 0) elif img.image_type == ImageType.back_face: face_reduct_val = img.detection_json.get("result", {}).get("defect_result", {}).get( "back_face_deduct_score", 0) detection_face_score += float(face_reduct_val or 0) except Exception as e: logger.warning(f"解析 detection_json 分数失败 (image_id={img.id}): {e}") card_data["detection_score"] = detection_score card_data["detection_score_detail"]["detection_center_score"] = detection_center_score card_data["detection_score_detail"]["detection_corner_score"] = detection_corner_score card_data["detection_score_detail"]["detection_edge_score"] = detection_edge_score card_data["detection_score_detail"]["detection_face_score"] = detection_face_score # ---------- modified_score ---------- modified_score = 10.0 modified_center_score = 10.0 modified_corner_score = 10.0 modified_edge_score = 10.0 modified_face_score = 10.0 all_modified_none = all(img.modified_json is None for img in images) if not all_modified_none: for img in images: src = img.modified_json if img.modified_json is not None else img.detection_json try: # 总分的计算 add_val = src.get("result", {}).get("_used_compute_deduct_score", 0) modified_score += float(add_val or 0) # 累加不同修改后数据类型的扣分项 if img.image_type == ImageType.front_edge: center_reduct_val = src.get("result", {}).get("center_result", {}).get( "deduct_score", 0) corner_reduct_val = src.get("result", {}).get("defect_result", {}).get( "front_corner_deduct_score", 0) edge_reduct_val = src.get("result", {}).get("defect_result", {}).get( "front_edge_deduct_score", 0) modified_center_score += float(center_reduct_val or 0) modified_corner_score += float(corner_reduct_val or 0) modified_edge_score += float(edge_reduct_val or 0) elif img.image_type == ImageType.back_edge: center_reduct_val = src.get("result", {}).get("center_result", {}).get( "deduct_score", 0 ) corner_reduct_val = src.get("result", {}).get("defect_result", {}).get( "back_corner_deduct_score", 0) edge_reduct_val = src.get("result", {}).get("defect_result", {}).get( "back_edge_deduct_score", 0) modified_center_score += float(center_reduct_val or 0) modified_corner_score += float(corner_reduct_val or 0) modified_edge_score += float(edge_reduct_val or 0) elif img.image_type == ImageType.front_face: face_reduct_val = src.get("result", {}).get("defect_result", {}).get( "front_face_deduct_score", 0) modified_face_score += float(face_reduct_val or 0) elif img.image_type == ImageType.back_face: face_reduct_val = src.get("result", {}).get("defect_result", {}).get( "back_face_deduct_score", 0) modified_face_score += float(face_reduct_val or 0) except Exception as e: logger.warning(f"解析 modified_json 分数失败 (image_id={img.id}): {e}") card_data["modified_score"] = modified_score card_data["modified_score_detail"]["modified_center_score"] = modified_center_score card_data["modified_score_detail"]["modified_corner_score"] = modified_corner_score card_data["modified_score_detail"]["modified_edge_score"] = modified_edge_score card_data["modified_score_detail"]["modified_face_score"] = modified_face_score else: card_data["modified_score"] = None card_data["modified_score_detail"]["modified_center_score"] = None card_data["modified_score_detail"]["modified_corner_score"] = None card_data["modified_score_detail"]["modified_edge_score"] = None card_data["modified_score_detail"]["modified_face_score"] = None except Exception as e: logger.error(f"计算分数过程异常: {e}") # 组合成最终响应 card_response = CardDetailResponse.model_validate(card_data) card_response.images = images return card_response