业务流程
试剂主流程
说明:
frontend的ReagentOrders页面通过reagentOrderAPI.list/create/approve/confirmArrival/stockIn访问后端。- app/api/reagent_orders.py 提供试剂订单基础 CRUD,app/api/reagent_orders_workflow.py 提供审批、到货和入库。
confirm-arrival会根据订单原因和存储信息决定直接入库、进入常用货架或暂存。stock-in会把试剂订单复制为Inventory记录,并同步库存状态、常用货架标记、剩余量和拼音字段。- 借用与归还会写入 app/models/inventory.py 中的
BorrowLog,并通过 app/api/inventory.py 更新库存状态。
耗材主流程
说明:
- 耗材从
frontend的ConsumableOrders页面进入 app/api/consumable_orders.py。 - 该接口负责创建、更新、审批、拒绝、完成、查询与导出。
complete仅允许申请人或管理员调用,并要求订单处于已审批状态。- 耗材不生成库存记录,数据保留在
consumable_order表中。
浏览器插件导入流程
说明:
- 浏览器插件通过 browser-extension/content/script.js 抓取购物车数据,并写入
chrome.storage.local.import_batch_latest。 /cart-import页面再通过 browser-extension/content/import-bridge.js 读取页面缓存。- 前端导入页逐条调用标准的
reagentOrderAPI.create或consumableOrderAPI.create,由试剂订单与耗材订单路由完成落库。 - app/api/cart_sync.py 提供
/api/cart-sync,用于匹配分析场景。 - 导入前会做基础校验和标准化,减少重复和脏数据进入数据库。
库存借用与常用货架
说明:
inventory.py提供借用、归还、手动添加、导入和导出等接口。- 常用货架由
register_common_shelf提供,前端CommonShelf页面只订阅相关 SSE 房间。 - app/services/sse_manager.py 负责广播
inventory和common_shelf相关事件,前端通过useSSE和sseStore处理重复、缺失和 stale 状态。
单个库存操作记录
说明:
- 所有已登录账号都能查看;路由以内部码定位库存,库存不存在时返回
404。 - 服务只投影入库、编辑和借用三类记录。归还更新原
BorrowLog,所以同一次借还只显示一行。 - 编辑摘要列出发生变化的字段,展开详情复用操作日志组件展示修改前后的值。
- 搜索在操作人、详情摘要和借用状态中匹配,分页结果按时间和时间线 ID 倒序。
- 查询只访问主数据库,不读取归档库;主库实际保留范围决定页面可见记录范围。
实验步骤查库存流程
说明:
- 库存页通过
/api/procedure-inventory-search/extract提取化学品,再通过/resolve解析 CAS 候选。 - 解析结果会带入库存页,用户结合实验原文、CAS 候选和库存命中情况进行核对。
- 单次实验步骤最多 5000 个字符,解析列表最多 50 项,每项最多保留 5 个 CAS 候选。
- 前端临时结果按用户保存在
sessionStorage中,10 分钟后失效,退出登录时清除。 - 后端仅记录模型、提供方、尝试次数和 token 用量,不保存实验步骤原文与模型响应。
双轨状态机对照
| 维度 | 试剂订单 | 耗材订单 |
|---|---|---|
| 状态枚举 | pending/approved/rejected/arrived/stocked | pending/approved/rejected/completed |
| 是否进入库存 | 是(stock-in 后复制为 Inventory) | 否 |
| 核心校验字段 | cas_number、规格解析、拼音字段 | product_number、规格文本、拼音字段 |
| 角色敏感动作 | 审批/驳回通常由管理员执行 | 审批/驳回/完成受角色控制 |
| 实时事件 | reagent_orders + inventory + common_shelf | consumable_orders |
流程一致性校验点
- 订单转库存必须保留订单审计记录。
confirm-arrival的不同分支需要保持互斥且可追溯。common-shelf更新要关注分组字段和并发修改。- 借还与消耗要写
BorrowLog,不能只改库存数量。 - 前端局部 patch 失败时要标记 stale,并允许用户刷新。
- 实验步骤查库存需要同时验证字符上限、解析条目上限、调用频率和 LLM 配置状态。
参考代码
- app/api/cart_sync.py
- app/api/consumable_orders.py
- app/api/inventory.py
- app/api/inventory_timeline.py
- app/api/procedure_inventory_search.py
- app/api/reagent_orders_workflow.py
- app/api/reagent_orders.py
- app/models/inventory.py
- app/services/inventory_timeline.py
- app/services/sse_manager.py
- browser-extension/content/import-bridge.js
- browser-extension/content/script.js