From cbc3891d3b741b99c5faf2a41b5164a36b53b335 Mon Sep 17 00:00:00 2001 From: huangxiang <155373492@qq.com> Date: Fri, 25 Apr 2025 15:10:11 +0800 Subject: [PATCH 1/2] =?UTF-8?q?doc:=E6=A2=B3=E7=90=86=E6=89=AB=E6=8F=8F?= =?UTF-8?q?=E8=AF=95=E7=AE=A1=E6=9E=B6=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/检测流程.md | 6 +- doc/耗材管理.md | 267 ++++++++++++++++++++- src/main/java/a8k/app/hardware/type/LldType.java | 8 + .../analyzer/ConsumableStateAnalyzerService.java | 7 +- .../mainctrl/TubeHolderSettingMgrService.java | 5 + .../service/statemgr/ConsumablesMgrService.java | 5 + .../PipetteGunPerformanceValidator.java | 6 + 7 files changed, 296 insertions(+), 8 deletions(-) diff --git a/doc/检测流程.md b/doc/检测流程.md index a18270f..e885d19 100644 --- a/doc/检测流程.md +++ b/doc/检测流程.md @@ -251,7 +251,11 @@ flowchart S14 --> S15[滴液] %% 孵育处理 - S15 --> S16[] + S15 --> S16[查询项目的孵育时间] + S16 --> S17[设置孵育开始时间和孵育时长开始孵育] + + S17 --> S18[设置样本处理完成] + ``` diff --git a/doc/耗材管理.md b/doc/耗材管理.md index 4eae9af..fad8cfb 100644 --- a/doc/耗材管理.md +++ b/doc/耗材管理.md @@ -1,9 +1,23 @@ ```mermaid classDiagram - class A8kConsumableContainer - class TipContainer - class ReactionPlateContainer - class LittBottleContainer + %% 全局耗材容器 + class A8kConsumableContainer + class TipContainer { + + } + class ReactionPlateContainer { + } + class LittBottleContainer { + public Integer projId; //项目ID + public String projName; //项目名称 + public String projShortName;//项目缩写名称 + public LittleBottleConsumableType type; + public String lotId = ""; //批次号 + public String color = ""; //颜色 + public Integer num = 0; + public Integer reserveNum = 0; + public Boolean isInstall = false; + } class LarBottleContainer A8kConsumableContainer "1" --> "3" TipContainer @@ -12,7 +26,11 @@ classDiagram A8kConsumableContainer "1" --> "6" LarBottleContainer - class ConsumablesMgrService + class ConsumablesMgrService { + + unInstallConsumable() // 卸载耗材 + + useReserveConsumable() // 使用耗材 + + reserveConsumable() // 预留耗材 + } ConsumablesMgrService --> A8kConsumableContainer class ConsumableInfo { @@ -21,12 +39,249 @@ classDiagram public Integer pos; // 当前耗材信息属于哪个耗材组 } + +``` +```mermaid +classDiagram + %% 试管状态管理器 + class TubeStateMgrService { + + } + + %% 试管设置 + class TubeSetting { + public int tubeIndex; // 试管位置索引 + + public String userid = ""; //用户输入的样本ID,不做逻辑,只做展示 + public String sampleBarcode = ""; //用于请求用户信息的条码ID + public List projId = new ArrayList<>(); //项目编码,标明需要做的项目 + public BloodType bloodType = BloodType.WHOLE_BLOOD; + } + + %% 试管架设置管理器 + class TubeHolderSettingMgrService { + + } + + %% 试管架设置 + class TubeHolderSetting { + public String uuid = UUID.randomUUID().toString(); //唯一标识 + public Boolean active = false;//是否激活对应前端页面的☑️ + public TubeSetting[] tubeSettings = new TubeSetting[10]; // 试管设置 + public Boolean lock = false;//如果后台已经使用,前端不允许修改 + } + + TubeHolderSettingMgrService --> TubeHolderSetting + TubeHolderSetting "1" --> "10" TubeSetting + + %% 试管架设置状态 + class TubeHolderSettingState { + INACTIVE, + ACTIVE, + LOCKED + } + <> TubeHolderSettingState + + %% 试管架 + class TubeHolder { + + } + + %% 试管架状态 + class TubeHolderState { + IDLE, //没有试管架 + PROCESSING, //正在处理试管架 + } + <> TubeHolderState + + %% 试管架类型 + class A8kTubeHolderType { + BloodTube("0000"), //全血试管 + // MiniTube("1111"), //迷你试管 + MiniBlood("2222"), //阳普管 + BulletTube1P5("5555"),//子弹头试管1.5mL + BulletTube0P5("4444"), //子弹头试管0.5mL + StoolTestTube("8888"); //粪便试管 + } + <> A8kTubeHolderType + + TubeHolder --> TubeHolderState + TubeHolder "1" --> "10" Tube + TubeHolder --> A8kTubeHolderType +``` + + +```mermaid +--- +title: 新增试管架配置时序图 +--- +sequenceDiagram + actor user + participant TubeHolderSettingMgrControler + participant TubeHolderSettingMgrService + participant AppEventBusService + + user->>+TubeHolderSettingMgrControler: 添加试管架 + TubeHolderSettingMgrControler->>+TubeHolderSettingMgrService: newTubeHolderSetting() + TubeHolderSettingMgrService ->>-TubeHolderSettingMgrControler: 试管架配置 + TubeHolderSettingMgrService -->> AppEventBusService: 发送试管架配置更新消息 + TubeHolderSettingMgrControler ->>-user: 操作成功 +``` + +```mermaid +--- +title: 激活试管架时序图 +--- +sequenceDiagram + actor user + participant TubeHolderSettingMgrControler + participant TubeHolderSettingMgrService + + user ->>+ TubeHolderSettingMgrControler: 激活试管架 + TubeHolderSettingMgrControler ->>+ TubeHolderSettingMgrService: updateActiveState(String uuid, Boolean active) + TubeHolderSettingMgrService ->>- TubeHolderSettingMgrControler: void + TubeHolderSettingMgrControler ->>- user: 操作成功 + +``` + +```mermaid +--- +tilte: 扫描试管架任务时序图 +--- +sequenceDiagram + actor a8k + participant AC30ScanTubeHolderTask + participant TubeHolderSettingMgrService + participant AppEventBusService + + a8k->>+AC30ScanTubeHolderTask:doAction + AC30ScanTubeHolderTask->>+TubeHolderSettingMgrService:getThelastActiveTubeHolderSetting + TubeHolderSettingMgrService->>-AC30ScanTubeHolderTask:TubeHolderSetting + AC30ScanTubeHolderTask->>+AC30ScanTubeHolderTask:priDoAction(tubeSetting) + AC30ScanTubeHolderTask->>+AC30ScanTubeHolderTask:doEnterTubeHolder推入试管架 + AC30ScanTubeHolderTask->>-AC30ScanTubeHolderTask:推入结果 + alt 推入失败 + AC30ScanTubeHolderTask-->>AppEventBusService:发送推入试管架失败消息 + else 推入成功 + AC30ScanTubeHolderTask->>+AC30ScanTubeHolderTask:doScanHolder + AC30ScanTubeHolderTask->>-AC30ScanTubeHolderTask:TubeHolderScanResult + end + + alt 扫描结果为空 + AC30ScanTubeHolderTask->>+AC30ScanTubeHolderTask:doEjectHodler + AC30ScanTubeHolderTask->>-AC30ScanTubeHolderTask:void + else 扫描结果不为空 + AC30ScanTubeHolderTask->>+AC30ScanTubeHolderTask:parseScanResult(scanResult, tubeHolderSetting) + AC30ScanTubeHolderTask->>-AC30ScanTubeHolderTask:TubeHolder + end + + alt 试管扫描结果解析失败 + AC30ScanTubeHolderTask->>+AC30ScanTubeHolderTask:doEjectHodler + AC30ScanTubeHolderTask->>-AC30ScanTubeHolderTask:void + else 扫描结果解析成功 + AC30ScanTubeHolderTask->>+AC30ScanTubeHolderTask:newTubeHolder(tubeholder) + AC30ScanTubeHolderTask->>+ConsumableStateAnalyzerService: analyze + ConsumableStateAnalyzerService->>-AC30ScanTubeHolderTask: 耗材状态信息(项目还有多少耗材,当前试管架需要多少项目多少耗材) + AC30ScanTubeHolderTask->>+ConsumableStateAnalyzerService: isEnough + alt 耗材不够 + ConsumableStateAnalyzerService->>-AC30ScanTubeHolderTask: 耗材不足错误 + end + AC30ScanTubeHolderTask->>+ConsumableStateAnalyzerService: isHasEnoughTip + alt Tip不足 + ConsumableStateAnalyzerService->>-AC30ScanTubeHolderTask: Tip头不足错误 + end + + + loop 试管个数 + AC30ScanTubeHolderTask->>+AC30ScanTubeHolderTask: newSample(生成一条检验记录) + AC30ScanTubeHolderTask->>-AC30ScanTubeHolderTask: 检验记录id + loop 项目个数 + AC30ScanTubeHolderTask->>+ProjectContextMgrService: newCxt(生产项目上下文) + ProjectContextMgrService->>-AC30ScanTubeHolderTask: void + end + end + + AC30ScanTubeHolderTask->>+TubeHolder: setState(TubeHolderState.PROCESSING) + TubeHolder->>-AC30ScanTubeHolderTask: void + AC30ScanTubeHolderTask->>-AC30ScanTubeHolderTask:AppError + end + + alt 存在系统错误 + AC30ScanTubeHolderTask->>+AC30ScanTubeHolderTask:doEjectHodler + AC30ScanTubeHolderTask->>-AC30ScanTubeHolderTask:void + end + AC30ScanTubeHolderTask->>-AC30ScanTubeHolderTask:void + AC30ScanTubeHolderTask->>-a8k: void +``` + +```mermaid +classDiagram + + %% 孵育盘状态管理器 + class IncubationPlateStateMgrService { + + IncubationSubTank getOneExpiredPlate() // 获取一个孵育完成的插槽 + + IncubatorPos takeOneIncubationIDLEPos() // 获取空闲的插槽位置 + } + + %% 孵育盘 + class IncubationPlate { + + } + + %% 孵育盘反应板插槽 + class IncubationSubTank { + + } + + %% 插槽位置 + class IncubatorPos { + + } + + %% 插槽状态 + class IncubationSubTankState { + EMPTY,//空 + RESERVED,//预定 + WAITING_FOR_DROP,//等待滴液 + INCUBATING, //孵育中 + INCUBATION_COMPLETE, //孵育完成 + ERROR,//错误 + } + <> IncubationSubTankState + + IncubationSubTank "1" --> "1" IncubatorPos + IncubationSubTank "1" --> "1" IncubationSubTankState + IncubationPlate "1" --> "20" IncubationSubTank + IncubationPlateStateMgrService --> IncubationPlate ``` +```mermaid +--- +title: 孵育盘槽位状态变更图 +--- +stateDiagram-v2 + [*] --> EMPTY + RESERVED --> INCUBATING: startIncubating + INCUBATING --> INCUBATION_COMPLETE: scheduled_timeout[remainTimeSec < 0] + %% 当找到一个空闲的槽位时将其状态置为预留 + EMPTY --> RESERVED: takeOneIncubationIDLEPos + INCUBATION_COMPLETE --> EMPTY: reset + RESERVED --> EMPTY: reset + INCUBATING --> EMPTY: reset +``` + +```mermaid +classDiagram + + %% 项目上下文管理器 + class ProjectContextMgrService { + + } +``` ```mermaid --- -title: 耗材状态更新机制 +title: 一次检测时序图 --- sequenceDiagram diff --git a/src/main/java/a8k/app/hardware/type/LldType.java b/src/main/java/a8k/app/hardware/type/LldType.java index 32b8e06..d62ced9 100644 --- a/src/main/java/a8k/app/hardware/type/LldType.java +++ b/src/main/java/a8k/app/hardware/type/LldType.java @@ -1,8 +1,16 @@ package a8k.app.hardware.type; +/** + * 液位探测方式 + */ public enum LldType { + // 电容式 kclld(0), + + // 电压式 kplld(1), + + // 混合式 kmixlld(2); diff --git a/src/main/java/a8k/app/service/analyzer/ConsumableStateAnalyzerService.java b/src/main/java/a8k/app/service/analyzer/ConsumableStateAnalyzerService.java index 674e9f1..208ca54 100644 --- a/src/main/java/a8k/app/service/analyzer/ConsumableStateAnalyzerService.java +++ b/src/main/java/a8k/app/service/analyzer/ConsumableStateAnalyzerService.java @@ -47,9 +47,11 @@ public class ConsumableStateAnalyzerService { } public List analyze(TubeHolder tubeHolder) { - //统计所有项目 + //统计一个试管架中包含的所有项目 List projs = new ArrayList<>(); for (Tube tube : tubeHolder.getTubes()) { + + // 一个试管可以有多个项目 for (Integer projId : tube.getProjIds()) { if (!projs.contains(projId)) { projs.add(projId); @@ -62,6 +64,7 @@ public class ConsumableStateAnalyzerService { for (Integer projId : projs) { ConsumableStatInfo consumableStatInfo = new ConsumableStatInfo(); consumableStatInfo.projId = projId; + // 当前项目可用的耗材总量 consumableStatInfo.totalCnt = consumablesMgrService.statisticsConsumableNum(projId); assginProjInfo(consumableStatInfo); consumableStatInfoList.add(consumableStatInfo); @@ -72,6 +75,8 @@ public class ConsumableStateAnalyzerService { for (Integer projId : tube.getProjIds()) { for (ConsumableStatInfo consumableStatInfo : consumableStatInfoList) { if (consumableStatInfo.projId.equals(projId)) { + + // 当前这个试管架需要项目多少耗材 consumableStatInfo.requireCnt++; } } diff --git a/src/main/java/a8k/app/service/mainctrl/TubeHolderSettingMgrService.java b/src/main/java/a8k/app/service/mainctrl/TubeHolderSettingMgrService.java index f0f1629..8eb0213 100644 --- a/src/main/java/a8k/app/service/mainctrl/TubeHolderSettingMgrService.java +++ b/src/main/java/a8k/app/service/mainctrl/TubeHolderSettingMgrService.java @@ -77,6 +77,11 @@ public class TubeHolderSettingMgrService { } + /** + * 删除试管架配置,发出试管架配置更新事件 + * @param uuid + * @throws AppException + */ synchronized public void removeTubeHolderSetting(String uuid) throws AppException { logger.info("removeTubeHolderSetting {}", uuid); var setting = getTubeHolderSettingAndCheckIsEditable(uuid); diff --git a/src/main/java/a8k/app/service/statemgr/ConsumablesMgrService.java b/src/main/java/a8k/app/service/statemgr/ConsumablesMgrService.java index 32dc588..728df49 100644 --- a/src/main/java/a8k/app/service/statemgr/ConsumablesMgrService.java +++ b/src/main/java/a8k/app/service/statemgr/ConsumablesMgrService.java @@ -261,6 +261,11 @@ public class ConsumablesMgrService { } + /** + * 获取当前项目可用的耗材的总量(不包含已经预留的) + * @param projId 项目id + * @return 可用耗材数量 + */ synchronized public Integer statisticsConsumableNum(Integer projId) { int total = 0; for (int i = 0; i < cState.reactionPlateGroup.length; i++) { diff --git a/src/main/java/a8k/app/service/verification/PipetteGunPerformanceValidator.java b/src/main/java/a8k/app/service/verification/PipetteGunPerformanceValidator.java index c41e4b3..929b1aa 100644 --- a/src/main/java/a8k/app/service/verification/PipetteGunPerformanceValidator.java +++ b/src/main/java/a8k/app/service/verification/PipetteGunPerformanceValidator.java @@ -87,6 +87,12 @@ public class PipetteGunPerformanceValidator { } + /** + * 移液枪页面探测 + * 液面探测方式 clld电容,plld压力,mixlld混合 + * @return + * @throws AppException + */ public Integer lld() throws AppException { Integer liquidPos = 0; hbotMoveExCtrlService.moveToLargeBSSamplePosXY(ConsumableGroup.CG1); From fac7b461a479b22192ca318a69b436fad99b5633 Mon Sep 17 00:00:00 2001 From: huangxiang <155373492@qq.com> Date: Fri, 25 Apr 2025 15:56:49 +0800 Subject: [PATCH 2/2] =?UTF-8?q?doc:=E5=A2=9E=E5=8A=A0=E8=80=97=E6=9D=90?= =?UTF-8?q?=E6=89=AB=E6=8F=8F=E6=B5=81=E7=A8=8B=E6=A2=B3=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/孵育盘管理.md | 64 ++++++++++ doc/耗材管理.md | 257 ++++------------------------------------ doc/试管及试管架管理.md | 183 ++++++++++++++++++++++++++++ doc/项目上下文管理.md | 0 4 files changed, 270 insertions(+), 234 deletions(-) create mode 100644 doc/孵育盘管理.md create mode 100644 doc/试管及试管架管理.md create mode 100644 doc/项目上下文管理.md diff --git a/doc/孵育盘管理.md b/doc/孵育盘管理.md new file mode 100644 index 0000000..9b36cd6 --- /dev/null +++ b/doc/孵育盘管理.md @@ -0,0 +1,64 @@ +```mermaid +classDiagram + + %% 孵育盘状态管理器 + class IncubationPlateStateMgrService { + + IncubationSubTank getOneExpiredPlate() // 获取一个孵育完成的插槽 + + IncubatorPos takeOneIncubationIDLEPos() // 获取空闲的插槽位置 + } + + %% 孵育盘 + class IncubationPlate { + + } + + %% 孵育盘反应板插槽 + class IncubationSubTank { + + } + + %% 插槽位置 + class IncubatorPos { + + } + + %% 插槽状态 + class IncubationSubTankState { + EMPTY,//空 + RESERVED,//预定 + WAITING_FOR_DROP,//等待滴液 + INCUBATING, //孵育中 + INCUBATION_COMPLETE, //孵育完成 + ERROR,//错误 + } + <> IncubationSubTankState + + IncubationSubTank "1" --> "1" IncubatorPos + IncubationSubTank "1" --> "1" IncubationSubTankState + IncubationPlate "1" --> "20" IncubationSubTank + IncubationPlateStateMgrService --> IncubationPlate +``` + +```mermaid +--- +title: 孵育盘槽位状态变更图 +--- +stateDiagram-v2 + [*] --> EMPTY + RESERVED --> INCUBATING: startIncubating + INCUBATING --> INCUBATION_COMPLETE: scheduled_timeout[remainTimeSec < 0] + %% 当找到一个空闲的槽位时将其状态置为预留 + EMPTY --> RESERVED: takeOneIncubationIDLEPos + INCUBATION_COMPLETE --> EMPTY: reset + RESERVED --> EMPTY: reset + INCUBATING --> EMPTY: reset +``` + +```mermaid +classDiagram + + %% 项目上下文管理器 + class ProjectContextMgrService { + + } +``` \ No newline at end of file diff --git a/doc/耗材管理.md b/doc/耗材管理.md index fad8cfb..45c4476 100644 --- a/doc/耗材管理.md +++ b/doc/耗材管理.md @@ -41,250 +41,39 @@ classDiagram ``` -```mermaid -classDiagram - %% 试管状态管理器 - class TubeStateMgrService { - - } - - %% 试管设置 - class TubeSetting { - public int tubeIndex; // 试管位置索引 - - public String userid = ""; //用户输入的样本ID,不做逻辑,只做展示 - public String sampleBarcode = ""; //用于请求用户信息的条码ID - public List projId = new ArrayList<>(); //项目编码,标明需要做的项目 - public BloodType bloodType = BloodType.WHOLE_BLOOD; - } - - %% 试管架设置管理器 - class TubeHolderSettingMgrService { - - } - - %% 试管架设置 - class TubeHolderSetting { - public String uuid = UUID.randomUUID().toString(); //唯一标识 - public Boolean active = false;//是否激活对应前端页面的☑️ - public TubeSetting[] tubeSettings = new TubeSetting[10]; // 试管设置 - public Boolean lock = false;//如果后台已经使用,前端不允许修改 - } - - TubeHolderSettingMgrService --> TubeHolderSetting - TubeHolderSetting "1" --> "10" TubeSetting - - %% 试管架设置状态 - class TubeHolderSettingState { - INACTIVE, - ACTIVE, - LOCKED - } - <> TubeHolderSettingState - - %% 试管架 - class TubeHolder { - - } - - %% 试管架状态 - class TubeHolderState { - IDLE, //没有试管架 - PROCESSING, //正在处理试管架 - } - <> TubeHolderState - - %% 试管架类型 - class A8kTubeHolderType { - BloodTube("0000"), //全血试管 - // MiniTube("1111"), //迷你试管 - MiniBlood("2222"), //阳普管 - BulletTube1P5("5555"),//子弹头试管1.5mL - BulletTube0P5("4444"), //子弹头试管0.5mL - StoolTestTube("8888"); //粪便试管 - } - <> A8kTubeHolderType - - TubeHolder --> TubeHolderState - TubeHolder "1" --> "10" Tube - TubeHolder --> A8kTubeHolderType -``` ```mermaid --- -title: 新增试管架配置时序图 +title: 耗材扫描时序图 --- sequenceDiagram actor user - participant TubeHolderSettingMgrControler - participant TubeHolderSettingMgrService - participant AppEventBusService - - user->>+TubeHolderSettingMgrControler: 添加试管架 - TubeHolderSettingMgrControler->>+TubeHolderSettingMgrService: newTubeHolderSetting() - TubeHolderSettingMgrService ->>-TubeHolderSettingMgrControler: 试管架配置 - TubeHolderSettingMgrService -->> AppEventBusService: 发送试管架配置更新消息 - TubeHolderSettingMgrControler ->>-user: 操作成功 -``` - -```mermaid ---- -title: 激活试管架时序图 ---- -sequenceDiagram - actor user - participant TubeHolderSettingMgrControler - participant TubeHolderSettingMgrService - - user ->>+ TubeHolderSettingMgrControler: 激活试管架 - TubeHolderSettingMgrControler ->>+ TubeHolderSettingMgrService: updateActiveState(String uuid, Boolean active) - TubeHolderSettingMgrService ->>- TubeHolderSettingMgrControler: void - TubeHolderSettingMgrControler ->>- user: 操作成功 - -``` - -```mermaid ---- -tilte: 扫描试管架任务时序图 ---- -sequenceDiagram - actor a8k - participant AC30ScanTubeHolderTask - participant TubeHolderSettingMgrService - participant AppEventBusService - - a8k->>+AC30ScanTubeHolderTask:doAction - AC30ScanTubeHolderTask->>+TubeHolderSettingMgrService:getThelastActiveTubeHolderSetting - TubeHolderSettingMgrService->>-AC30ScanTubeHolderTask:TubeHolderSetting - AC30ScanTubeHolderTask->>+AC30ScanTubeHolderTask:priDoAction(tubeSetting) - AC30ScanTubeHolderTask->>+AC30ScanTubeHolderTask:doEnterTubeHolder推入试管架 - AC30ScanTubeHolderTask->>-AC30ScanTubeHolderTask:推入结果 - alt 推入失败 - AC30ScanTubeHolderTask-->>AppEventBusService:发送推入试管架失败消息 - else 推入成功 - AC30ScanTubeHolderTask->>+AC30ScanTubeHolderTask:doScanHolder - AC30ScanTubeHolderTask->>-AC30ScanTubeHolderTask:TubeHolderScanResult - end - - alt 扫描结果为空 - AC30ScanTubeHolderTask->>+AC30ScanTubeHolderTask:doEjectHodler - AC30ScanTubeHolderTask->>-AC30ScanTubeHolderTask:void - else 扫描结果不为空 - AC30ScanTubeHolderTask->>+AC30ScanTubeHolderTask:parseScanResult(scanResult, tubeHolderSetting) - AC30ScanTubeHolderTask->>-AC30ScanTubeHolderTask:TubeHolder - end - - alt 试管扫描结果解析失败 - AC30ScanTubeHolderTask->>+AC30ScanTubeHolderTask:doEjectHodler - AC30ScanTubeHolderTask->>-AC30ScanTubeHolderTask:void - else 扫描结果解析成功 - AC30ScanTubeHolderTask->>+AC30ScanTubeHolderTask:newTubeHolder(tubeholder) - AC30ScanTubeHolderTask->>+ConsumableStateAnalyzerService: analyze - ConsumableStateAnalyzerService->>-AC30ScanTubeHolderTask: 耗材状态信息(项目还有多少耗材,当前试管架需要多少项目多少耗材) - AC30ScanTubeHolderTask->>+ConsumableStateAnalyzerService: isEnough - alt 耗材不够 - ConsumableStateAnalyzerService->>-AC30ScanTubeHolderTask: 耗材不足错误 - end - AC30ScanTubeHolderTask->>+ConsumableStateAnalyzerService: isHasEnoughTip - alt Tip不足 - ConsumableStateAnalyzerService->>-AC30ScanTubeHolderTask: Tip头不足错误 + participant ConsumableScanControler + participant AppConsumablesScanService + participant GStateMgrService + participant ConsumablesScanCtrlService + + user->>+ConsumableScanControler: 开始扫描 + ConsumableScanControler->>+AppConsumablesScanService: scanConsumables + AppConsumablesScanService->>+GStateMgrService: isDeviceInited + GStateMgrService->>-AppConsumablesScanService: 设备初始化结果 + alt 未初始化 + AppConsumablesScanService->>-ConsumableScanControler: 抛出系统未初始化异常 + else + AppConsumablesScanService->>+ConsumablesScanCtrlService: doScanConsumablesAction + ConsumablesScanCtrlService->>-AppConsumablesScanService: scanRawResults原始扫描结果 + loop 遍历扫描结果 + AppConsumablesScanService->>+AppConsumablesScanService: parseScanResult + AppConsumablesScanService->>-AppConsumablesScanService: 解析后的结果 end - - loop 试管个数 - AC30ScanTubeHolderTask->>+AC30ScanTubeHolderTask: newSample(生成一条检验记录) - AC30ScanTubeHolderTask->>-AC30ScanTubeHolderTask: 检验记录id - loop 项目个数 - AC30ScanTubeHolderTask->>+ProjectContextMgrService: newCxt(生产项目上下文) - ProjectContextMgrService->>-AC30ScanTubeHolderTask: void - end + loop 遍历解析后的扫描结果 + AppConsumablesScanService->>+AppConsumablesScanService: loadingConsumables + AppConsumablesScanService->>-AppConsumablesScanService: 解析后的结果 end - - AC30ScanTubeHolderTask->>+TubeHolder: setState(TubeHolderState.PROCESSING) - TubeHolder->>-AC30ScanTubeHolderTask: void - AC30ScanTubeHolderTask->>-AC30ScanTubeHolderTask:AppError - end - - alt 存在系统错误 - AC30ScanTubeHolderTask->>+AC30ScanTubeHolderTask:doEjectHodler - AC30ScanTubeHolderTask->>-AC30ScanTubeHolderTask:void + AppConsumablesScanService->>-ConsumableScanControler:ConsumablesScanResultPacket end - AC30ScanTubeHolderTask->>-AC30ScanTubeHolderTask:void - AC30ScanTubeHolderTask->>-a8k: void -``` - -```mermaid -classDiagram - - %% 孵育盘状态管理器 - class IncubationPlateStateMgrService { - + IncubationSubTank getOneExpiredPlate() // 获取一个孵育完成的插槽 - + IncubatorPos takeOneIncubationIDLEPos() // 获取空闲的插槽位置 - } - - %% 孵育盘 - class IncubationPlate { - - } - - %% 孵育盘反应板插槽 - class IncubationSubTank { - - } - - %% 插槽位置 - class IncubatorPos { - - } - - %% 插槽状态 - class IncubationSubTankState { - EMPTY,//空 - RESERVED,//预定 - WAITING_FOR_DROP,//等待滴液 - INCUBATING, //孵育中 - INCUBATION_COMPLETE, //孵育完成 - ERROR,//错误 - } - <> IncubationSubTankState - - IncubationSubTank "1" --> "1" IncubatorPos - IncubationSubTank "1" --> "1" IncubationSubTankState - IncubationPlate "1" --> "20" IncubationSubTank - IncubationPlateStateMgrService --> IncubationPlate -``` - -```mermaid ---- -title: 孵育盘槽位状态变更图 ---- -stateDiagram-v2 - [*] --> EMPTY - RESERVED --> INCUBATING: startIncubating - INCUBATING --> INCUBATION_COMPLETE: scheduled_timeout[remainTimeSec < 0] - %% 当找到一个空闲的槽位时将其状态置为预留 - EMPTY --> RESERVED: takeOneIncubationIDLEPos - INCUBATION_COMPLETE --> EMPTY: reset - RESERVED --> EMPTY: reset - INCUBATING --> EMPTY: reset -``` - -```mermaid -classDiagram - - %% 项目上下文管理器 - class ProjectContextMgrService { - - } -``` - -```mermaid ---- -title: 一次检测时序图 ---- - -sequenceDiagram - + ConsumableScanControler->>-user:ConsumablesScanResultPacket ``` \ No newline at end of file diff --git a/doc/试管及试管架管理.md b/doc/试管及试管架管理.md new file mode 100644 index 0000000..1d1fe28 --- /dev/null +++ b/doc/试管及试管架管理.md @@ -0,0 +1,183 @@ + +```mermaid +classDiagram + %% 试管状态管理器 + class TubeStateMgrService { + + } + + %% 试管设置 + class TubeSetting { + public int tubeIndex; // 试管位置索引 + + public String userid = ""; //用户输入的样本ID,不做逻辑,只做展示 + public String sampleBarcode = ""; //用于请求用户信息的条码ID + public List projId = new ArrayList<>(); //项目编码,标明需要做的项目 + public BloodType bloodType = BloodType.WHOLE_BLOOD; + } + + %% 试管架设置管理器 + class TubeHolderSettingMgrService { + + } + + %% 试管架设置 + class TubeHolderSetting { + public String uuid = UUID.randomUUID().toString(); //唯一标识 + public Boolean active = false;//是否激活对应前端页面的☑️ + public TubeSetting[] tubeSettings = new TubeSetting[10]; // 试管设置 + public Boolean lock = false;//如果后台已经使用,前端不允许修改 + } + + TubeHolderSettingMgrService --> TubeHolderSetting + TubeHolderSetting "1" --> "10" TubeSetting + + %% 试管架设置状态 + class TubeHolderSettingState { + INACTIVE, + ACTIVE, + LOCKED + } + <> TubeHolderSettingState + + %% 试管架 + class TubeHolder { + + } + + %% 试管架状态 + class TubeHolderState { + IDLE, //没有试管架 + PROCESSING, //正在处理试管架 + } + <> TubeHolderState + + %% 试管架类型 + class A8kTubeHolderType { + BloodTube("0000"), //全血试管 + // MiniTube("1111"), //迷你试管 + MiniBlood("2222"), //阳普管 + BulletTube1P5("5555"),//子弹头试管1.5mL + BulletTube0P5("4444"), //子弹头试管0.5mL + StoolTestTube("8888"); //粪便试管 + } + <> A8kTubeHolderType + + TubeHolder --> TubeHolderState + TubeHolder "1" --> "10" Tube + TubeHolder --> A8kTubeHolderType +``` + + +```mermaid +--- +title: 新增试管架配置时序图 +--- +sequenceDiagram + actor user + participant TubeHolderSettingMgrControler + participant TubeHolderSettingMgrService + participant AppEventBusService + + user->>+TubeHolderSettingMgrControler: 添加试管架 + TubeHolderSettingMgrControler->>+TubeHolderSettingMgrService: newTubeHolderSetting() + TubeHolderSettingMgrService ->>-TubeHolderSettingMgrControler: 试管架配置 + TubeHolderSettingMgrService -->> AppEventBusService: 发送试管架配置更新消息 + TubeHolderSettingMgrControler ->>-user: 操作成功 +``` + +```mermaid +--- +title: 激活试管架时序图 +--- +sequenceDiagram + actor user + participant TubeHolderSettingMgrControler + participant TubeHolderSettingMgrService + + user ->>+ TubeHolderSettingMgrControler: 激活试管架 + TubeHolderSettingMgrControler ->>+ TubeHolderSettingMgrService: updateActiveState(String uuid, Boolean active) + TubeHolderSettingMgrService ->>- TubeHolderSettingMgrControler: void + TubeHolderSettingMgrControler ->>- user: 操作成功 + +``` + +```mermaid +--- +tilte: 扫描试管架任务时序图 +--- +sequenceDiagram + actor a8k + participant AC30ScanTubeHolderTask + participant TubeHolderSettingMgrService + participant AppEventBusService + + a8k->>+AC30ScanTubeHolderTask:doAction + AC30ScanTubeHolderTask->>+TubeHolderSettingMgrService:getThelastActiveTubeHolderSetting + TubeHolderSettingMgrService->>-AC30ScanTubeHolderTask:TubeHolderSetting + AC30ScanTubeHolderTask->>+AC30ScanTubeHolderTask:priDoAction(tubeSetting) + AC30ScanTubeHolderTask->>+AC30ScanTubeHolderTask:doEnterTubeHolder推入试管架 + AC30ScanTubeHolderTask->>-AC30ScanTubeHolderTask:推入结果 + alt 推入失败 + AC30ScanTubeHolderTask-->>AppEventBusService:发送推入试管架失败消息 + else 推入成功 + AC30ScanTubeHolderTask->>+AC30ScanTubeHolderTask:doScanHolder + AC30ScanTubeHolderTask->>-AC30ScanTubeHolderTask:TubeHolderScanResult + end + + alt 扫描结果为空 + AC30ScanTubeHolderTask->>+AC30ScanTubeHolderTask:doEjectHodler + AC30ScanTubeHolderTask->>-AC30ScanTubeHolderTask:void + else 扫描结果不为空 + AC30ScanTubeHolderTask->>+AC30ScanTubeHolderTask:parseScanResult(scanResult, tubeHolderSetting) + AC30ScanTubeHolderTask->>-AC30ScanTubeHolderTask:TubeHolder + end + + alt 试管扫描结果解析失败 + AC30ScanTubeHolderTask->>+AC30ScanTubeHolderTask:doEjectHodler + AC30ScanTubeHolderTask->>-AC30ScanTubeHolderTask:void + else 扫描结果解析成功 + AC30ScanTubeHolderTask->>+AC30ScanTubeHolderTask:newTubeHolder(tubeholder) + AC30ScanTubeHolderTask->>+ConsumableStateAnalyzerService: analyze + ConsumableStateAnalyzerService->>-AC30ScanTubeHolderTask: 耗材状态信息(项目还有多少耗材,当前试管架需要多少项目多少耗材) + AC30ScanTubeHolderTask->>+ConsumableStateAnalyzerService: isEnough + alt 耗材不够 + ConsumableStateAnalyzerService->>-AC30ScanTubeHolderTask: 耗材不足错误 + end + AC30ScanTubeHolderTask->>+ConsumableStateAnalyzerService: isHasEnoughTip + alt Tip不足 + ConsumableStateAnalyzerService->>-AC30ScanTubeHolderTask: Tip头不足错误 + end + + + loop 试管个数 + AC30ScanTubeHolderTask->>+AC30ScanTubeHolderTask: newSample(生成一条检验记录) + AC30ScanTubeHolderTask->>-AC30ScanTubeHolderTask: 检验记录id + loop 项目个数 + AC30ScanTubeHolderTask->>+ProjectContextMgrService: newCxt(生产项目上下文) + ProjectContextMgrService->>-AC30ScanTubeHolderTask: void + end + end + + AC30ScanTubeHolderTask->>+TubeHolder: setState(TubeHolderState.PROCESSING) + TubeHolder->>-AC30ScanTubeHolderTask: void + AC30ScanTubeHolderTask->>-AC30ScanTubeHolderTask:AppError + end + + alt 存在系统错误 + AC30ScanTubeHolderTask->>+AC30ScanTubeHolderTask:doEjectHodler + AC30ScanTubeHolderTask->>-AC30ScanTubeHolderTask:void + end + AC30ScanTubeHolderTask->>-AC30ScanTubeHolderTask:void + AC30ScanTubeHolderTask->>-a8k: void +``` + +```mermaid +--- +title: 一次检测时序图 +--- + +sequenceDiagram + + +``` \ No newline at end of file diff --git a/doc/项目上下文管理.md b/doc/项目上下文管理.md new file mode 100644 index 0000000..e69de29