feat: 手术视频消耗、待确认与持久化改造

- 新增 Alembic 初始迁移、领域明细模型及归档持久化与重试链路\n- 拆分视频会话注册表、分类处理、推理时间窗聚合与流处理\n- 消耗日志:TSV/Markdown 含 top2/top3;item_id 优先产品编码;待确认记「待确认」行,语音确认后落正式行并更新汇总\n- 待确认时内存/DB 明细为占位行,确认后替换;拒绝时移除占位\n- 分类 probs 先 detach/cpu 再转 NumPy,修复 MPS/CUDA 上推理被静默跳过\n- 补充集成测试、归档与设备张量等单测

Made-with: Cursor
This commit is contained in:
Kevin
2026-04-23 20:42:21 +08:00
parent 69980d8073
commit 3d7bd70355
55 changed files with 4544 additions and 2050 deletions

View File

@@ -235,7 +235,7 @@ async def end_surgery(
responses={
status.HTTP_503_SERVICE_UNAVAILABLE: {
"description": (
"结果尚不可查询:未同时满足「已开录」且「算法已产生可返回的实时计算结果」"
"结果尚不可查询:无至少一条消耗明细,或手术未开始、未开录成功、尚无可查归档等"
),
"model": SurgeryClientErrorResponse,
},
@@ -245,7 +245,7 @@ async def end_surgery(
description=(
"根据手术 6 位号查询该台手术的耗材消耗明细(多行)及按物品汇总。"
"手术进行中返回当前内存已记账结果;结束后返回数据库持久化结果。"
"若手术从未开始或尚无可查的最终归档,返回 503。"
"无至少一条消耗明细(含已归档但明细为空)、手术从未开始或尚无可查归档,返回 503。"
"使用 GET只读、幂等。\n\n"
"响应体 `details` 与 `summary` 的字段定义见模式 SurgeryConsumptionDetail / SurgeryConsumptionSummary"
"若服务端启用耗材 TSV 文本日志,文件明细列为 tab 分隔的 "
@@ -267,13 +267,14 @@ async def get_surgery_result(
) -> SurgeryResultResponse:
logger.info("Query surgery result: surgery_id={}", surgery_id)
details = await pipeline.get_consumption_details_for_client(surgery_id)
if details is None:
if not details:
raise HTTPException(
status_code=status.HTTP_503_SERVICE_UNAVAILABLE,
detail={
"code": "RESULT_NOT_READY",
"message": (
"当前无该手术的可查询结果:手术未开始、未成功开录或尚未产生可返回的数据。"
"当前无该手术的可查询结果:手术未开始、未成功开录、尚无至少一条消耗明细,"
"或尚无可返回的数据。"
),
"surgery_id": surgery_id,
},